V tejto práci sa budeme zaoberať prvými krokmi v odhade regresnej funkcie. Budeme využívať databázu Life Expectancy (WHO) Fixed dataset, ktorá obsahuje ukazovatele na úrovni krajín, ako je priemerná dĺžka života, HDP, školské vzdelávanie a výdavky na zdravotníctvo.

Využívanie niektorých knižníc

rm(list=ls())
library(lmtest)   #  podpora regresie
library(outliers) # analyza odlahlych hodnot (outliers)
library(gptstudio)
library(kableExtra)
library(knitr)
library(dplyr)
library(broom)
library(corrplot)

Príprava údajov - import z csv súboru

Súbor Life_Expectancy_Data obsahuje databázu determinantov očakávanej dĺžky života. Import údajov urobíme nasledovne

# import the dataset and create a data.frame udaje
#
udaje_svet <- read.csv("udaje/Life-Expectancy-Data-Updated.csv",header=TRUE,sep=",",dec=".",check.names = TRUE)
head(udaje_svet)
#

Databáza obsahuje údaje o 2938 pozorovaniach a 22 premenných. V tejto práci sa budeme zaoberať len časťou z nich, konkrétne tými, ktoré súvisia s dĺžkou dožitia. Na začiatku si vyberieme krajinu, ktorej zdravotný stav chceme analyzovať. V tomto prípade ide o Portugalsko (Slovensko v databáze nemá zastúpenie):

# z databázy udaje_svet si vyberieme len tie pozorovania, ktoré sa týkaj Portugalska 
udaje <- subset(udaje_svet, Country == "Portugal")

Tabuľka uvedená nižšie nám poskuytuje základné popisné štatistiky vybraných kvantitatívnych premenných.

# niektoré štatistiky a ich prehľad v tabuľke KableExtra
library(kableExtra)
udaje %>%
  select(Adult_mortality,Alcohol_consumption, Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling) %>%
  summary() %>%
  kable() %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Adult_mortality Alcohol_consumption Hepatitis_B Measles BMI Polio Diphtheria GDP_per_capita Population_mln Life_expectancy Schooling
Min. : 73.28 Min. : 9.52 Min. :58.00 Min. :48.00 Min. :25.50 Min. :93.00 Min. :93.00 Min. :18585 Min. :10.29 Min. :76.30 Min. :6.800
1st Qu.: 83.07 1st Qu.:10.73 1st Qu.:94.00 1st Qu.:77.25 1st Qu.:25.70 1st Qu.:96.00 1st Qu.:96.75 1st Qu.:18830 1st Qu.:10.41 1st Qu.:77.58 1st Qu.:7.350
Median : 90.46 Median :11.52 Median :97.00 Median :95.00 Median :25.75 Median :96.50 Median :97.00 Median :19167 Median :10.49 Median :78.45 Median :7.750
Mean : 91.73 Mean :11.41 Mean :91.56 Mean :85.00 Mean :25.73 Mean :96.50 Mean :97.00 Mean :19199 Mean :10.47 Mean :78.74 Mean :7.831
3rd Qu.:100.28 3rd Qu.:12.23 3rd Qu.:97.25 3rd Qu.:95.25 3rd Qu.:25.80 3rd Qu.:97.25 3rd Qu.:98.00 3rd Qu.:19399 3rd Qu.:10.54 3rd Qu.:80.42 3rd Qu.:8.350
Max. :109.63 Max. :12.77 Max. :98.00 Max. :96.00 Max. :25.80 Max. :98.00 Max. :99.00 Max. :19986 Max. :10.57 Max. :81.10 Max. :9.100

Vyššie uvedená tabuľka nám poskytuje prehľad o základných štatistických charakteristikách vybraných premenných, ako sú priemerné hodnoty, rozptyl, minimum a maximum. Tieto informácie nám pomáhajú lepšie pochopiť rozdelenie a rozsah hodnôt v našich dátach. Na druhej strane je zaujímavá aj informácia o vzájomných vzťahoch medzi týmito premennými, čo môžeme merať pomocou korelačnej matice.

# grafický prehľad o korelačných vzťahoch vyjadruje nasledovný obrázok

cor_matrix <- cor(udaje %>% select(Adult_mortality,Alcohol_consumption
,Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling), use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper", tl.col =
"black", tl.srt = 45, title = "Korelačná matica vybraných premenných", mar = c(0,0,1,0))

Uvedený graf nám poskytuje vizuálny prehľad o korelačných vzťahoch medzi vybranými premennými. Farby a intenzita farieb nám umožňujú rýchlo identifikovať silné pozitívne alebo negatívne korelácie. Upozorňujeme, že korelácia neznamená kauzalitu.

V nasledovnom je uvedený graf vývoja očakávanej dĺžky dožitia v Portugalsku v rokoch 2000-2015. Vidíme, že očakávaná dĺžka života sa zvyšovala, čo je pozitívny trend.

#  graf vývoja očakávanej dĺžky dožitia v Portugalsku v rokoch 2000-2015.
library(ggplot2)
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
  geom_line() +
  geom_point() +
  labs(title = "Vývoj očakávanej dĺžky dožitia v Portugalsku (2000-2015)",
       x = "Rok",
       y = "Očakávaná dĺžka dožitia") +
  theme_minimal()

Na začiatku sa pokúsme o vyrovnanie priebehu tejto premennej v čase pomocou lineárnej regresie, kde nezávislou premennou bude rok a závislou premennou bude očakávaná dĺžka dožitia. Odhadneme koeficienty tejto regresie a posúdime kvalitu vyrovnania pomocou ukazovateľov, ako je R-squared a p-value.

# vyrovnanie priebehu očakávanej dĺžky dožitia v čase
model <- lm(Life_expectancy ~ Year, data = udaje)

library(broom)
library(knitr)
library(kableExtra)

# koeficienty regresie
tidy(model) %>%
  kable(digits = 3, caption = "Odhadnuté koeficienty regresie") %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie
term estimate std.error statistic p.value
(Intercept) -575.170 35.209 -16.336 0
Year 0.326 0.018 18.572 0

# kvalita vyrovnania
glance(model) %>%
  kable(digits = 3, caption = "Ukazovatele kvality vyrovnania") %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Ukazovatele kvality vyrovnania
r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs
0.961 0.958 0.323 344.936 0 1 -3.573 13.145 15.463 1.464 14 16
NA

Výsledky regresie nám ukazujú, že koeficient pre rok je pozitívny a štatisticky významný, čo naznačuje, že očakávaná dĺžka dožitia v Portugalsku sa zvyšovala v priebehu rokov 2000-2015. Jej priemerný ročný nárast dosahoval až štyri roky. Hodnota R-squared hodnota nám hovorí, že model vysvetľuje 96,1 % variability modelu. Podľa hodnoty p-value ( ktorý nám vyšiel 0) môžeme povedať, že model ako celok je štatisticky významný.

# teraz vyššie uvedený obrázok doplníme o regresnú priamku
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
  geom_line() +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Vývoj očakávanej dĺžky dožitia v Portugalsku (2000-2015) s regresnou priamkou",
       x = "Rok",
       y = "Očakávaná dĺžka dožitia") +
  theme_minimal()

Vyvoj spotreby alkoholu

Alkohol je predpokladaný negatívny faktor, ktorý vplýva na celkové zdravie a tým aj na dĺžku života.Zvyšuje krvný tlak, má negatívny vplyv na pružnosť ciev.P- value nám vyšla 0, ciže nižšia ako 0,1 a hodnota r-squared vyšla zhruba 0,88 - to znamemná,že v 88% prípadoch mala naozaj konzumácia aloholu veľký vplyv na dĺžku dožitia.

model_alkohol <-lm(Alcohol_consumption ~ Year, data = udaje)
tidy(model_alkohol) %>%
  kable(digits = 3, caption = "Odhadnuté koeficienty regresie pre spotrebu alkoholu") %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie pre spotrebu alkoholu
term estimate std.error statistic p.value
(Intercept) 416.781 38.734 10.760 0
Year -0.202 0.019 -10.465 0
# and now the model quality statistics - just R sqared
r2 <- summary(model_alkohol)$r.squared
adj_r2 <- summary(model_alkohol)$adj.r.squared
r2
[1] 0.8866618
adj_r2
[1] 0.8785662

Obrázok o skutočných vyrovnaných hodnotách spotreby alkoholu

fitted_vals <- fitted(model_alkohol)
# vykreslenie skutočných a vyrovnaných hodnôt - Alcohol_consumption a fitted_values
ggplot(udaje, aes(x = Year)) +
  geom_line(aes(y = Alcohol_consumption), color = "blue", size = 1) +
  geom_line(aes(y = fitted_vals), color = "red", size = 1, linetype = "dashed") +
  labs(title = "Skutočné vs. Vyrovnané hodnoty spotreby alkoholu v Rakúsku (2000-2015)",
       x = "Rok",
       y = "Spotreba alkoholu") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, max(udaje$Alcohol_consumption, fitted_vals) * 1.1)) +
  theme(legend.position = "none")

LS0tCnRpdGxlOiAiUHLDoWNhIHMgcmVncmVzaW91IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBWbGFkaW3DrXIgR2F6ZGEgKHMgcG9tb2NvdSB2eWJyYW7DvWNoIHpkcm9qb3YpCi0tLQoKViB0ZWp0byBwcsOhY2kgc2EgYnVkZW1lIHphb2JlcmHFpSBwcnbDvW1pIGtyb2ttaSB2IG9kaGFkZSByZWdyZXNuZWogZnVua2NpZS4gQnVkZW1lIHZ5dcW+w612YcWlIGRhdGFiw6F6dSBbTGlmZSBFeHBlY3RhbmN5IChXSE8pIEZpeGVkIGRhdGFzZXRdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvbGFzaGFnb2NoL2xpZmUtZXhwZWN0YW5jeS13aG8tdXBkYXRlZCksIGt0b3LDoSBvYnNhaHVqZSB1a2F6b3ZhdGVsZSBuYSDDunJvdm5pIGtyYWrDrW4sIGFrbyBqZSBwcmllbWVybsOhIGTEusW+a2Egxb5pdm90YSwgSERQLCDFoWtvbHNrw6kgdnpkZWzDoXZhbmllIGEgdsO9ZGF2a3kgbmEgemRyYXZvdG7DrWN0dm8uCgojIyBWeXXFvsOtdmFuaWUgbmlla3RvcsO9Y2gga25pxb5uw61jCgpgYGB7cn0Kcm0obGlzdD1scygpKQpsaWJyYXJ5KGxtdGVzdCkgICAjICBwb2Rwb3JhIHJlZ3Jlc2llCmxpYnJhcnkob3V0bGllcnMpICMgYW5hbHl6YSBvZGxhaGx5Y2ggaG9kbm90IChvdXRsaWVycykKbGlicmFyeShncHRzdHVkaW8pCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShrbml0cikKbGlicmFyeShkcGx5cikKbGlicmFyeShicm9vbSkKbGlicmFyeShjb3JycGxvdCkKYGBgCgojIyBQcsOtcHJhdmEgw7pkYWpvdiAtIGltcG9ydCB6IGNzdiBzw7pib3J1CgpTw7pib3IgTGlmZV9FeHBlY3RhbmN5X0RhdGEgb2JzYWh1amUgZGF0YWLDoXp1IGRldGVybWluYW50b3Ygb8SNYWvDoXZhbmVqIGTEusW+a3kgxb5pdm90YS4gSW1wb3J0IMO6ZGFqb3YgdXJvYsOtbWUgbmFzbGVkb3ZuZQoKYGBge3J9CiMgaW1wb3J0IHRoZSBkYXRhc2V0IGFuZCBjcmVhdGUgYSBkYXRhLmZyYW1lIHVkYWplCiMKdWRhamVfc3ZldCA8LSByZWFkLmNzdigidWRhamUvTGlmZS1FeHBlY3RhbmN5LURhdGEtVXBkYXRlZC5jc3YiLGhlYWRlcj1UUlVFLHNlcD0iLCIsZGVjPSIuIixjaGVjay5uYW1lcyA9IFRSVUUpCmhlYWQodWRhamVfc3ZldCkKIwpgYGAKCkRhdGFiw6F6YSBvYnNhaHVqZSDDumRhamUgbyAyOTM4IHBvem9yb3ZhbmlhY2ggYSAyMiBwcmVtZW5uw71jaC4gViB0ZWp0byBwcsOhY2kgc2EgYnVkZW1lIHphb2JlcmHFpSBsZW4gxI1hc8Wlb3UgeiBuaWNoLCBrb25rcsOpdG5lIHTDvW1pLCBrdG9yw6kgc8O6dmlzaWEgcyBkxLrFvmtvdSBkb8W+aXRpYS4gTmEgemHEjWlhdGt1IHNpIHZ5YmVyaWVtZSBrcmFqaW51LCBrdG9yZWogemRyYXZvdG7DvSBzdGF2IGNoY2VtZSBhbmFseXpvdmHFpS4gViB0b210byBwcsOtcGFkZSBpZGUgbyBQb3J0dWdhbHNrbyAoU2xvdmVuc2tvIHYgZGF0YWLDoXplIG5lbcOhIHphc3TDunBlbmllKToKCmBgYHtyfQojIHogZGF0YWLDoXp5IHVkYWplX3N2ZXQgc2kgdnliZXJpZW1lIGxlbiB0aWUgcG96b3JvdmFuaWEsIGt0b3LDqSBzYSB0w71rYWogUG9ydHVnYWxza2EgCnVkYWplIDwtIHN1YnNldCh1ZGFqZV9zdmV0LCBDb3VudHJ5ID09ICJQb3J0dWdhbCIpCmBgYAoKVGFidcS+a2EgdXZlZGVuw6EgbmnFvsWhaWUgbsOhbSBwb3NrdXl0dWplIHrDoWtsYWRuw6kgcG9waXNuw6kgxaF0YXRpc3Rpa3kgdnlicmFuw71jaCBrdmFudGl0YXTDrXZueWNoIHByZW1lbm7DvWNoLgoKYGBge3J9CiMgbmlla3RvcsOpIMWhdGF0aXN0aWt5IGEgaWNoIHByZWjEvmFkIHYgdGFidcS+a2UgS2FibGVFeHRyYQpsaWJyYXJ5KGthYmxlRXh0cmEpCnVkYWplICU+JQogIHNlbGVjdChBZHVsdF9tb3J0YWxpdHksQWxjb2hvbF9jb25zdW1wdGlvbiwgSGVwYXRpdGlzX0IsIE1lYXNsZXMsIEJNSSxQb2xpbyxEaXBodGhlcmlhLEdEUF9wZXJfY2FwaXRhLFBvcHVsYXRpb25fbWxuLExpZmVfZXhwZWN0YW5jeSxTY2hvb2xpbmcpICU+JQogIHN1bW1hcnkoKSAlPiUKICBrYWJsZSgpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgpWecWhxaFpZSB1dmVkZW7DoSB0YWJ1xL5rYSBuw6FtIHBvc2t5dHVqZSBwcmVoxL5hZCBvIHrDoWtsYWRuw71jaCDFoXRhdGlzdGlja8O9Y2ggY2hhcmFrdGVyaXN0aWvDoWNoIHZ5YnJhbsO9Y2ggcHJlbWVubsO9Y2gsIGFrbyBzw7ogcHJpZW1lcm7DqSBob2Rub3R5LCByb3pwdHlsLCBtaW5pbXVtIGEgbWF4aW11bS4gVGlldG8gaW5mb3Jtw6FjaWUgbsOhbSBwb23DoWhhasO6IGxlcMWhaWUgcG9jaG9wacWlIHJvemRlbGVuaWUgYSByb3pzYWggaG9kbsO0dCB2IG5hxaFpY2ggZMOhdGFjaC4gTmEgZHJ1aGVqIHN0cmFuZSBqZSB6YXVqw61tYXbDoSBhaiBpbmZvcm3DoWNpYSBvIHZ6w6Fqb21uw71jaCB2esWlYWhvY2ggbWVkemkgdMO9bWl0byBwcmVtZW5uw71taSwgxI1vIG3DtMW+ZW1lIG1lcmHFpSBwb21vY291IGtvcmVsYcSNbmVqIG1hdGljZS4KCmBgYHtyfQojIGdyYWZpY2vDvSBwcmVoxL5hZCBvIGtvcmVsYcSNbsO9Y2ggdnrFpWFob2NoIHZ5amFkcnVqZSBuYXNsZWRvdm7DvSBvYnLDoXpvawoKY29yX21hdHJpeCA8LSBjb3IodWRhamUgJT4lIHNlbGVjdChBZHVsdF9tb3J0YWxpdHksQWxjb2hvbF9jb25zdW1wdGlvbgosSGVwYXRpdGlzX0IsIE1lYXNsZXMsIEJNSSxQb2xpbyxEaXBodGhlcmlhLEdEUF9wZXJfY2FwaXRhLFBvcHVsYXRpb25fbWxuLExpZmVfZXhwZWN0YW5jeSxTY2hvb2xpbmcpLCB1c2UgPSAiY29tcGxldGUub2JzIikKY29ycnBsb3QoY29yX21hdHJpeCwgbWV0aG9kID0gImNvbG9yIiwgdHlwZSA9ICJ1cHBlciIsIHRsLmNvbCA9CiJibGFjayIsIHRsLnNydCA9IDQ1LCB0aXRsZSA9ICJLb3JlbGHEjW7DoSBtYXRpY2EgdnlicmFuw71jaCBwcmVtZW5uw71jaCIsIG1hciA9IGMoMCwwLDEsMCkpCgpgYGAKClV2ZWRlbsO9IGdyYWYgbsOhbSBwb3NreXR1amUgdml6dcOhbG55IHByZWjEvmFkIG8ga29yZWxhxI1uw71jaCB2esWlYWhvY2ggbWVkemkgdnlicmFuw71taSBwcmVtZW5uw71taS4gRmFyYnkgYSBpbnRlbnppdGEgZmFyaWViIG7DoW0gdW1vxb7FiHVqw7ogcsO9Y2hsbyBpZGVudGlmaWtvdmHFpSBzaWxuw6kgcG96aXTDrXZuZSBhbGVibyBuZWdhdMOtdm5lIGtvcmVsw6FjaWUuIFVwb3pvcsWIdWplbWUsIMW+ZSBrb3JlbMOhY2lhIG5lem5hbWVuw6Ega2F1emFsaXR1LgoKViBuYXNsZWRvdm5vbSBqZSB1dmVkZW7DvSBncmFmIHbDvXZvamEgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiBQb3J0dWdhbHNrdSB2IHJva29jaCAyMDAwLTIwMTUuIFZpZMOtbWUsIMW+ZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSDFvml2b3RhIHNhIHp2ecWhb3ZhbGEsIMSNbyBqZSBwb3ppdMOtdm55IHRyZW5kLgoKYGBge3J9CiMgIGdyYWYgdsO9dm9qYSBvxI1ha8OhdmFuZWogZMS6xb5reSBkb8W+aXRpYSB2IFBvcnR1Z2Fsc2t1IHYgcm9rb2NoIDIwMDAtMjAxNS4KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QodWRhamUsIGFlcyh4ID0gWWVhciwgeSA9IExpZmVfZXhwZWN0YW5jeSkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKHRpdGxlID0gIlbDvXZvaiBvxI1ha8OhdmFuZWogZMS6xb5reSBkb8W+aXRpYSB2IFBvcnR1Z2Fsc2t1ICgyMDAwLTIwMTUpIiwKICAgICAgIHggPSAiUm9rIiwKICAgICAgIHkgPSAiT8SNYWvDoXZhbsOhIGTEusW+a2EgZG/Fvml0aWEiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKTmEgemHEjWlhdGt1IHNhIHBva8O6c21lIG8gdnlyb3ZuYW5pZSBwcmllYmVodSB0ZWp0byBwcmVtZW5uZWogdiDEjWFzZSBwb21vY291IGxpbmXDoXJuZWogcmVncmVzaWUsIGtkZSBuZXrDoXZpc2xvdSBwcmVtZW5ub3UgYnVkZSByb2sgYSB6w6F2aXNsb3UgcHJlbWVubm91IGJ1ZGUgb8SNYWvDoXZhbsOhIGTEusW+a2EgZG/Fvml0aWEuIE9kaGFkbmVtZSBrb2VmaWNpZW50eSB0ZWp0byByZWdyZXNpZSBhIHBvc8O6ZGltZSBrdmFsaXR1IHZ5cm92bmFuaWEgcG9tb2NvdSB1a2F6b3ZhdGXEvm92LCBha28gamUgUi1zcXVhcmVkIGEgcC12YWx1ZS4KCmBgYHtyfQojIHZ5cm92bmFuaWUgcHJpZWJlaHUgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiDEjWFzZQptb2RlbCA8LSBsbShMaWZlX2V4cGVjdGFuY3kgfiBZZWFyLCBkYXRhID0gdWRhamUpCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIGtvZWZpY2llbnR5IHJlZ3Jlc2llCnRpZHkobW9kZWwpICU+JQogIGthYmxlKGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiT2RoYWRudXTDqSBrb2VmaWNpZW50eSByZWdyZXNpZSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKCiMga3ZhbGl0YSB2eXJvdm5hbmlhCmdsYW5jZShtb2RlbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJVa2F6b3ZhdGVsZSBrdmFsaXR5IHZ5cm92bmFuaWEiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpCgpgYGAKClbDvXNsZWRreSByZWdyZXNpZSBuw6FtIHVrYXp1asO6LCDFvmUga29lZmljaWVudCBwcmUgcm9rIGplIHBveml0w612bnkgYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgxI1vIG5hem5hxI11amUsIMW+ZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSB2IFBvcnR1Z2Fsc2t1IHNhIHp2ecWhb3ZhbGEgdiBwcmllYmVodSByb2tvdiAyMDAwLTIwMTUuIEplaiBwcmllbWVybsO9IHJvxI1uw70gbsOhcmFzdCBkb3NhaG92YWwgYcW+IMWhdHlyaSByb2t5LiBIb2Rub3RhIFItc3F1YXJlZCBob2Rub3RhIG7DoW0gaG92b3LDrSwgxb5lIG1vZGVsIHZ5c3ZldMS+dWplIDk2LDEgJSB2YXJpYWJpbGl0eSBtb2RlbHUuIFBvZMS+YSBob2Rub3R5IHAtdmFsdWUgKCBrdG9yw70gbsOhbSB2ecWhaWVsIDApIG3DtMW+ZW1lIHBvdmVkYcWlLCDFvmUgbW9kZWwgYWtvIGNlbG9rIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKYGBge3J9CiMgdGVyYXogdnnFocWhaWUgdXZlZGVuw70gb2Jyw6F6b2sgZG9wbG7DrW1lIG8gcmVncmVzbsO6IHByaWFta3UKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFllYXIsIHkgPSBMaWZlX2V4cGVjdGFuY3kpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSAiVsO9dm9qIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUG9ydHVnYWxza3UgKDIwMDAtMjAxNSkgcyByZWdyZXNub3UgcHJpYW1rb3UiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJPxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCiMjIyBWeXZvaiBzcG90cmVieSBhbGtvaG9sdQpBbGtvaG9sIGplIHByZWRwb2tsYWRhbsO9IG5lZ2F0w612bnkgZmFrdG9yLCBrdG9yw70gdnBsw712YSBuYSBjZWxrb3bDqSB6ZHJhdmllIGEgdMO9bSBhaiBuYSBkxLrFvmt1IMW+aXZvdGEuWnZ5xaF1amUga3J2bsO9IHRsYWssIG3DoSBuZWdhdMOtdm55IHZwbHl2IG5hIHBydcW+bm9zxaUgY2lldi5QLSB2YWx1ZSBuw6FtIHZ5xaFsYSAwLCBjacW+ZSBuacW+xaFpYSBha28gMCwxIGEgaG9kbm90YSByLXNxdWFyZWQgdnnFoWxhIHpocnViYSAwLDg4IC0gdG8gem5hbWVtbsOhLMW+ZSB2IDg4JSBwcsOtcGFkb2NoIG1hbGEgbmFvemFqIGtvbnp1bcOhY2lhIGFsb2hvbHUgdmXEvmvDvSB2cGx5diBuYSBkxLrFvmt1IGRvxb5pdGlhLgpgYGB7cn0KbW9kZWxfYWxrb2hvbCA8LWxtKEFsY29ob2xfY29uc3VtcHRpb24gfiBZZWFyLCBkYXRhID0gdWRhamUpCnRpZHkobW9kZWxfYWxrb2hvbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJPZGhhZG51dMOpIGtvZWZpY2llbnR5IHJlZ3Jlc2llIHByZSBzcG90cmVidSBhbGtvaG9sdSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKIyBhbmQgbm93IHRoZSBtb2RlbCBxdWFsaXR5IHN0YXRpc3RpY3MgLSBqdXN0IFIgc3FhcmVkCnIyIDwtIHN1bW1hcnkobW9kZWxfYWxrb2hvbCkkci5zcXVhcmVkCmFkal9yMiA8LSBzdW1tYXJ5KG1vZGVsX2Fsa29ob2wpJGFkai5yLnNxdWFyZWQKcjIKYWRqX3IyCmBgYAoKIyBPYnLDoXpvayBvIHNrdXRvxI1uw71jaCB2eXJvdm5hbsO9Y2ggaG9kbm90w6FjaCBzcG90cmVieSBhbGtvaG9sdSAgICAgCmBgYHtyfQpmaXR0ZWRfdmFscyA8LSBmaXR0ZWQobW9kZWxfYWxrb2hvbCkKIyB2eWtyZXNsZW5pZSBza3V0b8SNbsO9Y2ggYSB2eXJvdm5hbsO9Y2ggaG9kbsO0dCAtIEFsY29ob2xfY29uc3VtcHRpb24gYSBmaXR0ZWRfdmFsdWVzCmdncGxvdCh1ZGFqZSwgYWVzKHggPSBZZWFyKSkgKwogIGdlb21fbGluZShhZXMoeSA9IEFsY29ob2xfY29uc3VtcHRpb24pLCBjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBmaXR0ZWRfdmFscyksIGNvbG9yID0gInJlZCIsIHNpemUgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJTa3V0b8SNbsOpIHZzLiBWeXJvdm5hbsOpIGhvZG5vdHkgc3BvdHJlYnkgYWxrb2hvbHUgdiBSYWvDunNrdSAoMjAwMC0yMDE1KSIsCiAgICAgICB4ID0gIlJvayIsCiAgICAgICB5ID0gIlNwb3RyZWJhIGFsa29ob2x1IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbWF4KHVkYWplJEFsY29ob2xfY29uc3VtcHRpb24sIGZpdHRlZF92YWxzKSAqIDEuMSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAo=