1.Paketler

library(tidyverse)
library(forcats)
library(tmap)
library(sp)
library(leaflet)

2.Veriyi düzenleyelim

#veriler hali hazırda r'ın veri formatında
secim <- readRDS("secim.rds")
katilim <- readRDS("katilim.rds")

#grafiklerde kullanacağımız fontu belirledik
windowsFonts("Proxima Nova" = windowsFont("Proxima Nova"))

#verilerde yer alan türkçe karakterler için
Sys.setlocale("LC_CTYPE", "turkish")
[1] "Turkish_Turkey.1254"

3. Görselleştirelim

secim %>% ggplot() + geom_line(aes(chp, ilçe),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "last"))
secim %>% ggplot() + geom_line(aes(chp, ilçe),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "last"))

*Biraz daha düzenleyelim ve cilalayalım

secim %>% ggplot() + 
  geom_line(aes(chp, fct_reorder(ilçe, chp)),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "last"))+
  geom_text(aes(x = chp, y = ilçe,label = round(chp, 1), hjust = ifelse(secim_tarih == "2019-06-23",-0.3,1.2)),size = 3,color= "gray25")
secim %>% ggplot() + 
  geom_line(aes(chp, fct_reorder(ilçe, chp)),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "last"))+
  geom_text(aes(x = chp, y = ilçe,label = round(chp, 1), hjust = ifelse(secim_tarih == "2019-06-23",-0.3,1.2)),size = 3,color= "gray25")

Özel tema oluşturalım ve uygulayalım

Temayı grafige uygulayalım

secim %>% ggplot() + 
  geom_line(aes(chp, fct_reorder(ilçe, chp)),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "last"))+
  geom_text(aes(x = chp, y = ilçe,label = round(chp, 1), hjust = ifelse(secim_tarih == "2019-06-23",-0.3,1.2)),size = 3,color= "gray25")+
  theme_custom1()

Başlık ve gerekli bazı detayları ekleyelim Görülüyor ki Ekrem İmamoğlu tüm ilçelerde oyunu arttırmış

secim %>% ggplot() + 
  geom_line(aes(chp, fct_reorder(ilçe, chp)),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "last"))+
  geom_text(aes(x = chp, y = ilçe,label = round(chp, 1), hjust = ifelse(secim_tarih == "2019-06-23",-0.3,1.2)),size = 3.8,color= "gray25")+
  labs(x = "alınan oy (%)",y ="", 
       title = "Ekrem İmamoglu  23 Haziran'da tüm ilçelerde oyunu arttırdı", 
       subtitle = "31 Mart ---> 23 Haziran", 
       caption = "@demirelsadettin")+
  theme_custom1()+
  coord_cartesian(xlim= c(27, 85))
secim %>% ggplot() + 
  geom_line(aes(chp, fct_reorder(ilçe, chp)),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "last"))+
  geom_text(aes(x = chp, y = ilçe,label = round(chp, 1), hjust = ifelse(secim_tarih == "2019-06-23",-0.3,1.2)),size = 3.8,color= "gray25")+
  labs(x = "alınan oy (%)",y ="", 
       title = "Ekrem İmamoglu  23 Haziran'da tüm ilçelerde oyunu arttırdı", 
       subtitle = "31 Mart ---> 23 Haziran", 
       caption = "@demirelsadettin")+
  theme_custom1()+
  coord_cartesian(xlim= c(27, 85))

Görülüyor ki Binali Yıldırım tüm ilçelerde oy kaybı yaşamış

secim %>% ggplot() + 
  geom_line(aes(akp, fct_reorder(ilçe, akp)),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "first"))+
  geom_text(aes(x = akp, y = ilçe,label = round(akp, 1), hjust = ifelse(secim_tarih == "2019-03-31",-0.5,1.5)),size = 3.8,color= "gray25")+
  labs(x = "alınan oy (%)",y ="", 
       title = "Binali Yıldırım  23 Haziran'da tüm ilçelerde oy kaybı yaşadı", 
       subtitle = "31 Mart ---> 23 Haziran", 
       caption = "@demirelsadettin")+ theme_custom1() + coord_cartesian(xlim= c(13, 70))
secim %>% ggplot() + 
  geom_line(aes(akp, fct_reorder(ilçe, akp)),arrow = arrow(length = unit(1.5, "mm"), type = "closed", ends = "first"))+
  geom_text(aes(x = akp, y = ilçe,label = round(akp, 1), hjust = ifelse(secim_tarih == "2019-03-31",-0.5,1.5)),size = 3.8,color= "gray25")+
  labs(x = "alınan oy (%)",y ="", 
       title = "Binali Yıldırım  23 Haziran'da tüm ilçelerde oy kaybı yaşadı", 
       subtitle = "31 Mart ---> 23 Haziran", 
       caption = "@demirelsadettin")+ theme_custom1() + coord_cartesian(xlim= c(13, 70))

4. Veriyi biraz yoğuralım

secim_tidy <- secim %>% select(1,2,3,5) %>% gather(parti, oy_yüzde, - ilçe, -secim_tarih)
View(secim_tidy)
secim_tidy2<- secim_tidy %>% spread(secim_tarih,oy_yüzde) %>% mutate(fark = `2019-06-23` - `2019-03-31`)
View(secim_tidy2)
saveRDS(secim_tidy2,"secim_tidy.rds")

Görselleştirelim

secim_tidy2%>% ggplot(aes(ilçe, fark, fill = parti))+
  geom_col()+coord_flip()+theme_custom1()+
  labs(x = "", y ="", title = "31 Mart'a göre tüm ilçelerde İmamoğlu oyunu arttırıken, Yıldırım ise oy kaybı yaşadı", subtitle = "Oy farkı yüzdelik (%) olarak gösterilmektedir", caption = "@demirelsadettim")+
  scale_fill_manual(values = c("akp" = "#fab005","chp"="#fa5252"))+
  geom_text(aes(x = ilçe, y = fark ,label = round(fark, 1),hjust = ifelse(fark >0 ,-0.2,1.2)),size = 4,color= "gray25")
secim_tidy2%>% ggplot(aes(ilçe, fark, fill = parti))+
  geom_col()+coord_flip()+theme_custom1()+
  labs(x = "", y ="", title = "31 Mart'a göre tüm ilçelerde İmamoğlu oyunu arttırıken, Yıldırım ise oy kaybı yaşadı", subtitle = "Oy farkı yüzdelik (%) olarak gösterilmektedir", caption = "@demirelsadettim")+
  scale_fill_manual(values = c("akp" = "#fab005","chp"="#fa5252"))+
  geom_text(aes(x = ilçe, y = fark ,label = round(fark, 1),hjust = ifelse(fark >0 ,-0.2,1.2)),size = 4,color= "gray25")

secim_tidy2%>% ggplot(aes(fct_reorder(ilçe, fark, max),fark, fill = parti))+
  geom_col()+coord_flip()+theme_custom1()+labs(x = "", y ="", title = "31 Mart'a göre tüm ilçelerde İmamoğlu oyunu arttırıken, Yıldırım ise oy kaybı yaşadı", subtitle = "Oy farkı yüzdelik (%) olarak gösterilmektedir", caption = "@demirelsadettim")+
  scale_fill_manual(values = c("akp" = "#fab005","chp"="#fa5252"))+
  geom_text(aes(x = ilçe, y = fark ,label = round(fark, 1),hjust = ifelse(fark >0 ,-0.2,1.2)),size = 3.8,color= "gray25")
secim_tidy2%>% ggplot(aes(fct_reorder(ilçe, fark, max),fark, fill = parti))+
  geom_col()+coord_flip()+theme_custom1()+labs(x = "", y ="", title = "31 Mart'a göre tüm ilçelerde İmamoğlu oyunu arttırıken, Yıldırım ise oy kaybı yaşadı", subtitle = "Oy farkı yüzdelik (%) olarak gösterilmektedir", caption = "@demirelsadettim")+
  scale_fill_manual(values = c("akp" = "#fab005","chp"="#fa5252"))+
  geom_text(aes(x = ilçe, y = fark ,label = round(fark, 1),hjust = ifelse(fark >0 ,-0.2,1.2)),size = 3.8,color= "gray25")

5. Katılım oranları nasıl değişmiş bakalım

katilim %>% ggplot(aes(fct_reorder(ilçe, degisim, max),degisim, fill = durum))+
  geom_col()+coord_flip()+theme_custom1()+labs(x = "", y ="", title = "31 Marta göre tüm ilçelerde katılım oranı nasıl değişti?", subtitle = "Katılım oranı için 31 Mart kayıtlı seçmen sayısı kullanıldı.", caption = "@demirelsadettim - analizde geçersiz oy sayısı katılım oranına yansıtılmamıştır")+
  geom_text(aes(x = ilçe, y = degisim ,label = round(degisim, 2),hjust = ifelse(degisim >0 ,-0.2,1.2)),size = 4,color= "gray25")+
  scale_fill_manual(values = c("artti" ="#12b886", "azaldi" ="#fa5252"))
katilim %>% ggplot(aes(fct_reorder(ilçe, degisim, max),degisim, fill = durum))+
  geom_col()+coord_flip()+theme_custom1()+labs(x = "", y ="", title = "31 Marta göre tüm ilçelerde katılım oranı nasıl değişti?", subtitle = "Katılım oranı için 31 Mart kayıtlı seçmen sayısı kullanıldı.", caption = "@demirelsadettim - analizde geçersiz oy sayısı katılım oranına yansıtılmamıştır")+
  geom_text(aes(x = ilçe, y = degisim ,label = round(degisim, 2),hjust = ifelse(degisim >0 ,-0.2,1.2)),size = 4,color= "gray25")+
  scale_fill_manual(values = c("artti" ="#12b886", "azaldi" ="#fa5252"))

LS0tDQp0aXRsZTogIjIzIEhhemlyYW4gdmUgMzEgTWFydCBJQkIgU2XDp2ltbGVyaSBBbmFsaXoiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMjIDEuUGFrZXRsZXINCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeSh0bWFwKQ0KbGlicmFyeShzcCkNCmxpYnJhcnkobGVhZmxldCkNCmBgYA0KDQojIyMjIDIuVmVyaXlpIGTDvHplbmxleWVsaW0NCg0KYGBge3J9DQojdmVyaWxlciBoYWxpIGhhesSxcmRhIHInxLFuIHZlcmkgZm9ybWF0xLFuZGENCnNlY2ltIDwtIHJlYWRSRFMoInNlY2ltLnJkcyIpDQprYXRpbGltIDwtIHJlYWRSRFMoImthdGlsaW0ucmRzIikNCg0KI2dyYWZpa2xlcmRlIGt1bGxhbmFjYcSfxLFtxLF6IGZvbnR1IGJlbGlybGVkaWsNCndpbmRvd3NGb250cygiUHJveGltYSBOb3ZhIiA9IHdpbmRvd3NGb250KCJQcm94aW1hIE5vdmEiKSkNCg0KI3ZlcmlsZXJkZSB5ZXIgYWxhbiB0w7xya8OnZSBrYXJha3RlcmxlciBpw6dpbg0KU3lzLnNldGxvY2FsZSgiTENfQ1RZUEUiLCAidHVya2lzaCIpDQpgYGANCg0KDQojIyMjIDMuIEfDtnJzZWxsZcWfdGlyZWxpbQ0KDQpgYGB7cn0NCnNlY2ltICU+JSBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoY2hwLCBpbMOnZSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJsYXN0IikpDQpgYGANCg0KDQpgYGB7cn0NCnNlY2ltICU+JSBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoY2hwLCBpbMOnZSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJsYXN0IikpDQpgYGANCg0KKioqQmlyYXogZGFoYSBkw7x6ZW5sZXllbGltIHZlIGNpbGFsYXlhbMSxbSoqDQoNCmBgYHtyfQ0Kc2VjaW0gJT4lIGdncGxvdCgpICsgDQogIGdlb21fbGluZShhZXMoY2hwLCBmY3RfcmVvcmRlcihpbMOnZSwgY2hwKSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJsYXN0IikpKw0KICBnZW9tX3RleHQoYWVzKHggPSBjaHAsIHkgPSBpbMOnZSxsYWJlbCA9IHJvdW5kKGNocCwgMSksIGhqdXN0ID0gaWZlbHNlKHNlY2ltX3RhcmloID09ICIyMDE5LTA2LTIzIiwtMC4zLDEuMikpLHNpemUgPSAzLGNvbG9yPSAiZ3JheTI1IikNCmBgYA0KDQoNCmBgYHtyfQ0Kc2VjaW0gJT4lIGdncGxvdCgpICsgDQogIGdlb21fbGluZShhZXMoY2hwLCBmY3RfcmVvcmRlcihpbMOnZSwgY2hwKSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJsYXN0IikpKw0KICBnZW9tX3RleHQoYWVzKHggPSBjaHAsIHkgPSBpbMOnZSxsYWJlbCA9IHJvdW5kKGNocCwgMSksIGhqdXN0ID0gaWZlbHNlKHNlY2ltX3RhcmloID09ICIyMDE5LTA2LTIzIiwtMC4zLDEuMikpLHNpemUgPSAzLGNvbG9yPSAiZ3JheTI1IikNCmBgYA0KDQoqKsOWemVsIHRlbWEgb2x1xZ90dXJhbMSxbSB2ZSB1eWd1bGF5YWzEsW0qKg0KDQpgYGB7cn0NCnRoZW1lX2N1c3RvbTEgPC0gZnVuY3Rpb24oKSB7DQogIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJQcm94aW1hIE5vdmEiLCBjb2xvciA9ICJncmF5MjUiKSwNCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIixzaXplID0gMTQpLA0KICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLA0KICAgICAgYXhpcy50ZXh0Lng9IGVsZW1lbnRfdGV4dChzaXplPTExKSwNCiAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTEpLA0KICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiZ3JheTMwIiksDQogICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjZmNWY1IiksDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICIjZDlkOWQ5IiwgZmlsbCA9ICIjZDlkOWQ5IiksDQogICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBjb2xvdXIgPSAiZ3JheTI1IiwgZmFjZSA9ICJib2xkIikpDQogIA0KfQ0KYGBgDQoNCioqVGVtYXnEsSBncmFmaWdlIHV5Z3VsYXlhbMSxbSoqDQoNCmBgYHtyfQ0Kc2VjaW0gJT4lIGdncGxvdCgpICsgDQogIGdlb21fbGluZShhZXMoY2hwLCBmY3RfcmVvcmRlcihpbMOnZSwgY2hwKSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJsYXN0IikpKw0KICBnZW9tX3RleHQoYWVzKHggPSBjaHAsIHkgPSBpbMOnZSxsYWJlbCA9IHJvdW5kKGNocCwgMSksIGhqdXN0ID0gaWZlbHNlKHNlY2ltX3RhcmloID09ICIyMDE5LTA2LTIzIiwtMC4zLDEuMikpLHNpemUgPSAzLGNvbG9yPSAiZ3JheTI1IikrDQogIHRoZW1lX2N1c3RvbTEoKQ0KYGBgDQoNCmBgYHtyfQ0Kc2VjaW0gJT4lIGdncGxvdCgpICsgDQogIGdlb21fbGluZShhZXMoY2hwLCBmY3RfcmVvcmRlcihpbMOnZSwgY2hwKSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJsYXN0IikpKw0KICBnZW9tX3RleHQoYWVzKHggPSBjaHAsIHkgPSBpbMOnZSxsYWJlbCA9IHJvdW5kKGNocCwgMSksIGhqdXN0ID0gaWZlbHNlKHNlY2ltX3RhcmloID09ICIyMDE5LTA2LTIzIiwtMC4zLDEuMikpLHNpemUgPSAzLGNvbG9yPSAiZ3JheTI1IikrDQogIHRoZW1lX2N1c3RvbTEoKQ0KYGBgDQoNCioqQmHFn2zEsWsgdmUgZ2VyZWtsaSBiYXrEsSBkZXRheWxhcsSxIGVrbGV5ZWxpbSoqDQpHw7Zyw7xsw7x5b3Iga2kgRWtyZW0gxLBtYW1vxJ9sdSB0w7xtIGlsw6dlbGVyZGUgb3l1bnUgYXJ0dMSxcm3EscWfDQpgYGB7cn0NCnNlY2ltICU+JSBnZ3Bsb3QoKSArIA0KICBnZW9tX2xpbmUoYWVzKGNocCwgZmN0X3Jlb3JkZXIoaWzDp2UsIGNocCkpLGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgxLjUsICJtbSIpLCB0eXBlID0gImNsb3NlZCIsIGVuZHMgPSAibGFzdCIpKSsNCiAgZ2VvbV90ZXh0KGFlcyh4ID0gY2hwLCB5ID0gaWzDp2UsbGFiZWwgPSByb3VuZChjaHAsIDEpLCBoanVzdCA9IGlmZWxzZShzZWNpbV90YXJpaCA9PSAiMjAxOS0wNi0yMyIsLTAuMywxLjIpKSxzaXplID0gMy44LGNvbG9yPSAiZ3JheTI1IikrDQogIGxhYnMoeCA9ICJhbMSxbmFuIG95ICglKSIseSA9IiIsIA0KICAgICAgIHRpdGxlID0gIkVrcmVtIMSwbWFtb2dsdSAgMjMgSGF6aXJhbidkYSB0w7xtIGlsw6dlbGVyZGUgb3l1bnUgYXJ0dMSxcmTEsSIsIA0KICAgICAgIHN1YnRpdGxlID0gIjMxIE1hcnQgLS0tPiAyMyBIYXppcmFuIiwgDQogICAgICAgY2FwdGlvbiA9ICJAZGVtaXJlbHNhZGV0dGluIikrDQogIHRoZW1lX2N1c3RvbTEoKSsNCiAgY29vcmRfY2FydGVzaWFuKHhsaW09IGMoMjcsIDg1KSkNCmBgYA0KDQoNCmBgYHtyfQ0Kc2VjaW0gJT4lIGdncGxvdCgpICsgDQogIGdlb21fbGluZShhZXMoY2hwLCBmY3RfcmVvcmRlcihpbMOnZSwgY2hwKSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJsYXN0IikpKw0KICBnZW9tX3RleHQoYWVzKHggPSBjaHAsIHkgPSBpbMOnZSxsYWJlbCA9IHJvdW5kKGNocCwgMSksIGhqdXN0ID0gaWZlbHNlKHNlY2ltX3RhcmloID09ICIyMDE5LTA2LTIzIiwtMC4zLDEuMikpLHNpemUgPSAzLjgsY29sb3I9ICJncmF5MjUiKSsNCiAgbGFicyh4ID0gImFsxLFuYW4gb3kgKCUpIix5ID0iIiwgDQogICAgICAgdGl0bGUgPSAiRWtyZW0gxLBtYW1vZ2x1ICAyMyBIYXppcmFuJ2RhIHTDvG0gaWzDp2VsZXJkZSBveXVudSBhcnR0xLFyZMSxIiwgDQogICAgICAgc3VidGl0bGUgPSAiMzEgTWFydCAtLS0+IDIzIEhhemlyYW4iLCANCiAgICAgICBjYXB0aW9uID0gIkBkZW1pcmVsc2FkZXR0aW4iKSsNCiAgdGhlbWVfY3VzdG9tMSgpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeGxpbT0gYygyNywgODUpKQ0KYGBgDQoNCg0KR8O2csO8bMO8eW9yIGtpIEJpbmFsaSBZxLFsZMSxcsSxbSB0w7xtIGlsw6dlbGVyZGUgb3kga2F5YsSxIHlhxZ9hbcSxxZ8NCmBgYHtyfQ0Kc2VjaW0gJT4lIGdncGxvdCgpICsgDQogIGdlb21fbGluZShhZXMoYWtwLCBmY3RfcmVvcmRlcihpbMOnZSwgYWtwKSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJmaXJzdCIpKSsNCiAgZ2VvbV90ZXh0KGFlcyh4ID0gYWtwLCB5ID0gaWzDp2UsbGFiZWwgPSByb3VuZChha3AsIDEpLCBoanVzdCA9IGlmZWxzZShzZWNpbV90YXJpaCA9PSAiMjAxOS0wMy0zMSIsLTAuNSwxLjUpKSxzaXplID0gMy44LGNvbG9yPSAiZ3JheTI1IikrDQogIGxhYnMoeCA9ICJhbMSxbmFuIG95ICglKSIseSA9IiIsIA0KICAgICAgIHRpdGxlID0gIkJpbmFsaSBZxLFsZMSxcsSxbSAgMjMgSGF6aXJhbidkYSB0w7xtIGlsw6dlbGVyZGUgb3kga2F5YsSxIHlhxZ9hZMSxIiwgDQogICAgICAgc3VidGl0bGUgPSAiMzEgTWFydCAtLS0+IDIzIEhhemlyYW4iLCANCiAgICAgICBjYXB0aW9uID0gIkBkZW1pcmVsc2FkZXR0aW4iKSsgdGhlbWVfY3VzdG9tMSgpICsgY29vcmRfY2FydGVzaWFuKHhsaW09IGMoMTMsIDcwKSkNCmBgYA0KDQoNCmBgYHtyfQ0Kc2VjaW0gJT4lIGdncGxvdCgpICsgDQogIGdlb21fbGluZShhZXMoYWtwLCBmY3RfcmVvcmRlcihpbMOnZSwgYWtwKSksYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDEuNSwgIm1tIiksIHR5cGUgPSAiY2xvc2VkIiwgZW5kcyA9ICJmaXJzdCIpKSsNCiAgZ2VvbV90ZXh0KGFlcyh4ID0gYWtwLCB5ID0gaWzDp2UsbGFiZWwgPSByb3VuZChha3AsIDEpLCBoanVzdCA9IGlmZWxzZShzZWNpbV90YXJpaCA9PSAiMjAxOS0wMy0zMSIsLTAuNSwxLjUpKSxzaXplID0gMy44LGNvbG9yPSAiZ3JheTI1IikrDQogIGxhYnMoeCA9ICJhbMSxbmFuIG95ICglKSIseSA9IiIsIA0KICAgICAgIHRpdGxlID0gIkJpbmFsaSBZxLFsZMSxcsSxbSAgMjMgSGF6aXJhbidkYSB0w7xtIGlsw6dlbGVyZGUgb3kga2F5YsSxIHlhxZ9hZMSxIiwgDQogICAgICAgc3VidGl0bGUgPSAiMzEgTWFydCAtLS0+IDIzIEhhemlyYW4iLCANCiAgICAgICBjYXB0aW9uID0gIkBkZW1pcmVsc2FkZXR0aW4iKSsgdGhlbWVfY3VzdG9tMSgpICsgY29vcmRfY2FydGVzaWFuKHhsaW09IGMoMTMsIDcwKSkNCmBgYA0KDQojIyMjIDQuIFZlcml5aSBiaXJheiB5b8SfdXJhbMSxbQ0KDQpgYGB7cn0NCnNlY2ltX3RpZHkgPC0gc2VjaW0gJT4lIHNlbGVjdCgxLDIsMyw1KSAlPiUgZ2F0aGVyKHBhcnRpLCBveV95w7x6ZGUsIC0gaWzDp2UsIC1zZWNpbV90YXJpaCkNCg0KYGBgDQoNCmBgYHtyfQ0Kc2VjaW1fdGlkeQ0KYGBgDQoNCg0KYGBge3J9DQpzZWNpbV90aWR5MjwtIHNlY2ltX3RpZHkgJT4lIHNwcmVhZChzZWNpbV90YXJpaCxveV95w7x6ZGUpICU+JSBtdXRhdGUoZmFyayA9IGAyMDE5LTA2LTIzYCAtIGAyMDE5LTAzLTMxYCkNCnNhdmVSRFMoc2VjaW1fdGlkeTIsInNlY2ltX3RpZHkucmRzIikNCg0KYGBgDQoNCmBgYHtyfQ0Kc2VjaW1fdGlkeTINCmBgYA0KDQoNCkfDtnJzZWxsZcWfdGlyZWxpbQ0KYGBge3J9DQpzZWNpbV90aWR5MiU+JSBnZ3Bsb3QoYWVzKGlsw6dlLCBmYXJrLCBmaWxsID0gcGFydGkpKSsNCiAgZ2VvbV9jb2woKStjb29yZF9mbGlwKCkrdGhlbWVfY3VzdG9tMSgpKw0KICBsYWJzKHggPSAiIiwgeSA9IiIsIHRpdGxlID0gIjMxIE1hcnQnYSBnw7ZyZSB0w7xtIGlsw6dlbGVyZGUgxLBtYW1vxJ9sdSBveXVudSBhcnR0xLFyxLFrZW4sIFnEsWxkxLFyxLFtIGlzZSBveSBrYXlixLEgeWHFn2FkxLEiLCBzdWJ0aXRsZSA9ICJPeSBmYXJrxLEgecO8emRlbGlrICglKSBvbGFyYWsgZ8O2c3RlcmlsbWVrdGVkaXIiLCBjYXB0aW9uID0gIkBkZW1pcmVsc2FkZXR0aW0iKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYWtwIiA9ICIjZmFiMDA1IiwiY2hwIj0iI2ZhNTI1MiIpKSsNCiAgZ2VvbV90ZXh0KGFlcyh4ID0gaWzDp2UsIHkgPSBmYXJrICxsYWJlbCA9IHJvdW5kKGZhcmssIDEpLGhqdXN0ID0gaWZlbHNlKGZhcmsgPjAgLC0wLjIsMS4yKSksc2l6ZSA9IDQsY29sb3I9ICJncmF5MjUiKQ0KYGBgDQoNCg0KYGBge3J9DQpzZWNpbV90aWR5MiU+JSBnZ3Bsb3QoYWVzKGlsw6dlLCBmYXJrLCBmaWxsID0gcGFydGkpKSsNCiAgZ2VvbV9jb2woKStjb29yZF9mbGlwKCkrdGhlbWVfY3VzdG9tMSgpKw0KICBsYWJzKHggPSAiIiwgeSA9IiIsIHRpdGxlID0gIjMxIE1hcnQnYSBnw7ZyZSB0w7xtIGlsw6dlbGVyZGUgxLBtYW1vxJ9sdSBveXVudSBhcnR0xLFyxLFrZW4sIFnEsWxkxLFyxLFtIGlzZSBveSBrYXlixLEgeWHFn2FkxLEiLCBzdWJ0aXRsZSA9ICJPeSBmYXJrxLEgecO8emRlbGlrICglKSBvbGFyYWsgZ8O2c3RlcmlsbWVrdGVkaXIiLCBjYXB0aW9uID0gIkBkZW1pcmVsc2FkZXR0aW0iKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYWtwIiA9ICIjZmFiMDA1IiwiY2hwIj0iI2ZhNTI1MiIpKSsNCiAgZ2VvbV90ZXh0KGFlcyh4ID0gaWzDp2UsIHkgPSBmYXJrICxsYWJlbCA9IHJvdW5kKGZhcmssIDEpLGhqdXN0ID0gaWZlbHNlKGZhcmsgPjAgLC0wLjIsMS4yKSksc2l6ZSA9IDQsY29sb3I9ICJncmF5MjUiKQ0KYGBgDQoNCmBgYHtyfQ0Kc2VjaW1fdGlkeTIlPiUgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihpbMOnZSwgZmFyaywgbWF4KSxmYXJrLCBmaWxsID0gcGFydGkpKSsNCiAgZ2VvbV9jb2woKStjb29yZF9mbGlwKCkrdGhlbWVfY3VzdG9tMSgpK2xhYnMoeCA9ICIiLCB5ID0iIiwgdGl0bGUgPSAiMzEgTWFydCdhIGfDtnJlIHTDvG0gaWzDp2VsZXJkZSDEsG1hbW/En2x1IG95dW51IGFydHTEsXLEsWtlbiwgWcSxbGTEsXLEsW0gaXNlIG95IGtheWLEsSB5YcWfYWTEsSIsIHN1YnRpdGxlID0gIk95IGZhcmvEsSB5w7x6ZGVsaWsgKCUpIG9sYXJhayBnw7ZzdGVyaWxtZWt0ZWRpciIsIGNhcHRpb24gPSAiQGRlbWlyZWxzYWRldHRpbSIpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJha3AiID0gIiNmYWIwMDUiLCJjaHAiPSIjZmE1MjUyIikpKw0KICBnZW9tX3RleHQoYWVzKHggPSBpbMOnZSwgeSA9IGZhcmsgLGxhYmVsID0gcm91bmQoZmFyaywgMSksaGp1c3QgPSBpZmVsc2UoZmFyayA+MCAsLTAuMiwxLjIpKSxzaXplID0gMy44LGNvbG9yPSAiZ3JheTI1IikNCmBgYA0KDQoNCmBgYHtyfQ0Kc2VjaW1fdGlkeTIlPiUgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihpbMOnZSwgZmFyaywgbWF4KSxmYXJrLCBmaWxsID0gcGFydGkpKSsNCiAgZ2VvbV9jb2woKStjb29yZF9mbGlwKCkrdGhlbWVfY3VzdG9tMSgpK2xhYnMoeCA9ICIiLCB5ID0iIiwgdGl0bGUgPSAiMzEgTWFydCdhIGfDtnJlIHTDvG0gaWzDp2VsZXJkZSDEsG1hbW/En2x1IG95dW51IGFydHTEsXLEsWtlbiwgWcSxbGTEsXLEsW0gaXNlIG95IGtheWLEsSB5YcWfYWTEsSIsIHN1YnRpdGxlID0gIk95IGZhcmvEsSB5w7x6ZGVsaWsgKCUpIG9sYXJhayBnw7ZzdGVyaWxtZWt0ZWRpciIsIGNhcHRpb24gPSAiQGRlbWlyZWxzYWRldHRpbSIpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJha3AiID0gIiNmYWIwMDUiLCJjaHAiPSIjZmE1MjUyIikpKw0KICBnZW9tX3RleHQoYWVzKHggPSBpbMOnZSwgeSA9IGZhcmsgLGxhYmVsID0gcm91bmQoZmFyaywgMSksaGp1c3QgPSBpZmVsc2UoZmFyayA+MCAsLTAuMiwxLjIpKSxzaXplID0gMy44LGNvbG9yPSAiZ3JheTI1IikNCmBgYA0KDQojIyMjIDUuIEthdMSxbMSxbSBvcmFubGFyxLEgbmFzxLFsIGRlxJ9pxZ9tacWfIGJha2FsxLFtDQoNCmBgYHtyfQ0Ka2F0aWxpbQ0KYGBgDQoNCmBgYHtyfQ0Ka2F0aWxpbSAlPiUgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihpbMOnZSwgZGVnaXNpbSwgbWF4KSxkZWdpc2ltLCBmaWxsID0gZHVydW0pKSsNCiAgZ2VvbV9jb2woKStjb29yZF9mbGlwKCkrdGhlbWVfY3VzdG9tMSgpK2xhYnMoeCA9ICIiLCB5ID0iIiwgdGl0bGUgPSAiMzEgTWFydGEgZ8O2cmUgdMO8bSBpbMOnZWxlcmRlIGthdMSxbMSxbSBvcmFuxLEgbmFzxLFsIGRlxJ9pxZ90aT8iLCBzdWJ0aXRsZSA9ICJLYXTEsWzEsW0gb3JhbsSxIGnDp2luIDMxIE1hcnQga2F5xLF0bMSxIHNlw6dtZW4gc2F5xLFzxLEga3VsbGFuxLFsZMSxLiIsIGNhcHRpb24gPSAiQGRlbWlyZWxzYWRldHRpbSAtIGFuYWxpemRlIGdlw6dlcnNpeiBveSBzYXnEsXPEsSBrYXTEsWzEsW0gb3JhbsSxbmEgeWFuc8SxdMSxbG1hbcSxxZ90xLFyIikrDQogIGdlb21fdGV4dChhZXMoeCA9IGlsw6dlLCB5ID0gZGVnaXNpbSAsbGFiZWwgPSByb3VuZChkZWdpc2ltLCAyKSxoanVzdCA9IGlmZWxzZShkZWdpc2ltID4wICwtMC4yLDEuMikpLHNpemUgPSA0LGNvbG9yPSAiZ3JheTI1IikrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFydHRpIiA9IiMxMmI4ODYiLCAiYXphbGRpIiA9IiNmYTUyNTIiKSkNCmBgYA0KDQoNCmBgYHtyfQ0Ka2F0aWxpbSAlPiUgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihpbMOnZSwgZGVnaXNpbSwgbWF4KSxkZWdpc2ltLCBmaWxsID0gZHVydW0pKSsNCiAgZ2VvbV9jb2woKStjb29yZF9mbGlwKCkrdGhlbWVfY3VzdG9tMSgpK2xhYnMoeCA9ICIiLCB5ID0iIiwgdGl0bGUgPSAiMzEgTWFydGEgZ8O2cmUgdMO8bSBpbMOnZWxlcmRlIGthdMSxbMSxbSBvcmFuxLEgbmFzxLFsIGRlxJ9pxZ90aT8iLCBzdWJ0aXRsZSA9ICJLYXTEsWzEsW0gb3JhbsSxIGnDp2luIDMxIE1hcnQga2F5xLF0bMSxIHNlw6dtZW4gc2F5xLFzxLEga3VsbGFuxLFsZMSxLiIsIGNhcHRpb24gPSAiQGRlbWlyZWxzYWRldHRpbSAtIGFuYWxpemRlIGdlw6dlcnNpeiBveSBzYXnEsXPEsSBrYXTEsWzEsW0gb3JhbsSxbmEgeWFuc8SxdMSxbG1hbcSxxZ90xLFyIikrDQogIGdlb21fdGV4dChhZXMoeCA9IGlsw6dlLCB5ID0gZGVnaXNpbSAsbGFiZWwgPSByb3VuZChkZWdpc2ltLCAyKSxoanVzdCA9IGlmZWxzZShkZWdpc2ltID4wICwtMC4yLDEuMikpLHNpemUgPSA0LGNvbG9yPSAiZ3JheTI1IikrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFydHRpIiA9IiMxMmI4ODYiLCAiYXphbGRpIiA9IiNmYTUyNTIiKSkNCmBgYA0K