knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)
head(World_Happiness_Report_2005_2021)                                            # niekolko prvych riadkov
colnames(World_Happiness_Report_2005_2021)                                        # nazvy premennych
 [1] "Country name"                     
 [2] "Year"                             
 [3] "Life Ladder"                      
 [4] "Log GDP per capita"               
 [5] "Social support"                   
 [6] "Healthy life expectancy at birth" 
 [7] "Freedom to make life choices"     
 [8] "Generosity"                       
 [9] "Perceptions of corruption"        
[10] "Positive affect"                  
[11] "Negative affect"                  
[12] "Confidence in national government"

V rámci svojej práce som sa rozhodla pracovať s údajmi výhradne pre Slovenskú republiku - preto si ich v nasledujúcom kroku vyfiltrujem.

library(knitr)
library(dplyr)
 
data_slovakia <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Slovakia") %>%
  select(`Country name`, Year, `Life Ladder`, `Log GDP per capita`, `Generosity`)
 
# Zobrazenie celej tabuľky:
knitr::kable(data_slovakia, caption = "Udaje pre Slovensko")
Udaje pre Slovensko
Country name Year Life Ladder Log GDP per capita Generosity
Slovakia 2006 5.264677 9.988946 -0.0496322
Slovakia 2010 6.052223 10.147560 -0.1016217
Slovakia 2011 5.945048 10.172303 0.0097462
Slovakia 2012 5.911059 10.184093 -0.0280085
Slovakia 2013 5.936527 10.189544 -0.0508598
Slovakia 2014 6.138873 10.215453 -0.1255932
Slovakia 2015 6.162005 10.265345 -0.1281214
Slovakia 2016 5.993163 10.283188 -0.0607835
Slovakia 2017 6.365509 10.311002 -0.0546400
Slovakia 2018 6.235111 10.346859 -0.1674935
Slovakia 2019 6.243429 10.371226 -0.1292767
Slovakia 2020 6.519098 10.325802 -0.0765924
Slovakia 2021 6.418504 10.356864 0.0486340

Grafy

Bodový graf

library(ggplot2)
ggplot(data_slovakia, aes(x = `Generosity`, y = `Life Ladder`)) +
  geom_point(color = "blue", size = 4) +
  theme_minimal() +
  labs(title = "Ako sa mení index šťastia v závislosti od štedrosti na Slovensku?",
    x = "Štedrosť",
    y = "Index šťastia")

Na základe tohto grafu jasne vidno, že sa Index šťastia nezdá byť silne ovplyvnený štedrosťou. Body sú značne rozptýlené, čo naznačuje slabú koreláciu medzi týmito dvoma premennými. Štedrosť, ako kľúčový prediktor, nemá zjavný lineárny vplyv na pocit šťastia, čo naznačuje, že iné faktory (ako HDP alebo sociálna podpora) sú pre šťastie Slovákov dôležitejšie.

Boxplot

library(dplyr)
library(ggplot2)
 
data_slovakia <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Slovakia")
 
ggplot(data_slovakia, aes(x = factor(Year), y = `Life Ladder`)) +
  geom_boxplot(fill = "green", color = "brown") +
  labs(
    title = "Vývoj Indexu šťastia pre Slovensko",
    x = "Rok",
    y = "Index šťastia"
  ) +
  theme_minimal()

Graf jasne zobrazuje silný, stabilný a rastúci trend Indexu šťastia na Slovensku v čase. Hodnoty stúpajú takmer v priamej línii (v súlade s neskôr vykonanou lineárnou regresiou), čo znamená, že priemerný pocit šťastia sa v sledovanom období konštantne zvyšoval.

Čiarový graf

library(ggplot2)
library(dplyr)

ggplot(data = data_slovakia, aes(x = Year, y = `Log GDP per capita`)) +
  
  geom_line(
    color = "#007BFF", # Modrá farba čiary (HEX kód)
    size = 1.2         # Hrúbka čiary
  ) +
  
  geom_point(
    color = "#FFC107", # Žltá/Oranžová farba bodov
    size = 3.5,
    shape = 19         # Plný kruh
  ) +
  
  labs(
    title = "Vývoj Log GDP per capita na Slovensku (2006-2021)",
    x = "Rok",
    y = "Log GDP per capita (Log HDP na obyvateľa)",
    caption = "Zdroj: World Happiness Report"
  ) +
  
  theme_minimal() + 

  theme(
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold", color = "#343A40"),
    axis.title = element_text(size = 12, face = "bold"),
    axis.text = element_text(size = 10),
    panel.grid.minor = element_blank(), # Odstránenie menších čiar mriežky
    panel.grid.major.x = element_line(linetype = "dotted", color = "grey80"), # Bodkované čiary len pre os X
    panel.grid.major.y = element_line(linetype = "solid", color = "grey80") # Plné čiary pre os Y
  )

Graf vizuálne potvrdzuje mimoriadne silný, lineárny a rastúci trend premennej Log HDP per capita na Slovensku v čase. Hodnoty stúpajú takmer bez odchýlok a s veľmi vysokou presnosťou, čo naznačuje, že ekonomická úroveň Slovenska v sledovanom období konštantne a stabilne rástla. Tento vizuálny dôkaz perfektne korešponduje s neskoršími výsledkami lineárnej regresie, kde bol zistený najsilnejší trend zo všetkých testovaných premenných.

Stĺpcový graf

library(ggplot2)
library(dplyr)

data_slovakia <- data_slovakia %>%
  mutate(Year_Factor = as.factor(Year))

ggplot(data = data_slovakia, aes(x = Year_Factor, y = Generosity)) +
  
  geom_col(
    fill = "#007BFF", # Modrá farba stĺpcov
    color = "black",  # Čierny okraj okolo stĺpcov
    width = 0.7       # Šírka stĺpcov
  ) +

  geom_text(
    aes(label = round(Generosity, 3)), 
    vjust = -0.5,                       
    color = "#343A40",                  # Tmavosivá farba textu
    size = 3.5
  ) +
  

  labs(
    title = "Vývoj Štedrosti na Slovensku",
    x = "Rok",
    y = "Generosity",
    caption = "Zdroj: World Happiness Report"
  ) +
  
  theme_classic() +
  
  theme(
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold", color = "#343A40"),
    axis.title = element_text(size = 12, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1) 
    )

Graf vizuálne potvrdzuje, že štatisticky nevýznamný trend štedrosti v čase (zistený aj neskôr regresnou analýzou) je spôsobený tým, že hodnoty sa takmer nemenia. Vo väčšine rokov dochádza k výskytu negatívnych hodnôt, čo naznačuje mieru štedrosti nižšiu, než je typické pre krajinu s danými charakteristikami. Posledná kladná hodnota v roku 2021 (počas pandémie) pravdepodobne odráža dočasný nárast altruizmu a solidarity v reakcii na krízu, ktorý krátkodobo prevýšil očakávania. Celkovo je možné konštatovať, že štedrosť na Slovensku je dlhodobo stabilne nízka.

Základné štatistiky

knitr - tabuľka

library(dplyr)
library(knitr)

# Zhrnutie základných štatistík indexu šťastia pre Slovensko v rokoch 2005–2021
happiness.stats.slovakia <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Slovakia", Year %in% 2005:2021) %>%
  group_by(Year) %>%
  summarise(
    `Počet pozorovaní`        = n(),
    `Priemer`                 = mean(`Life Ladder`, na.rm = TRUE),
    `Štandardná odchýlka`     = sd(`Life Ladder`, na.rm = TRUE),
    `Minimum`                 = min(`Life Ladder`, na.rm = TRUE),
    `25. percentil`           = quantile(`Life Ladder`, 0.25, na.rm = TRUE),
    `Medián`                  = median(`Life Ladder`, na.rm = TRUE),
    `75. percentil`           = quantile(`Life Ladder`, 0.75, na.rm = TRUE),
    `Maximum`                 = max(`Life Ladder`, na.rm = TRUE),
    .groups = "drop"
  )

# Vytvorenie tabuľky pomocou knitr
kable(happiness.stats.slovakia, digits = 2, caption = "Základné štatistiky Indexu šťastia pre Slovensko (2005–2021)")
Základné štatistiky Indexu šťastia pre Slovensko (2005–2021)
Year Počet pozorovaní Priemer Štandardná odchýlka Minimum 25. percentil Medián 75. percentil Maximum
2006 1 5.26 NA 5.26 5.26 5.26 5.26 5.26
2010 1 6.05 NA 6.05 6.05 6.05 6.05 6.05
2011 1 5.95 NA 5.95 5.95 5.95 5.95 5.95
2012 1 5.91 NA 5.91 5.91 5.91 5.91 5.91
2013 1 5.94 NA 5.94 5.94 5.94 5.94 5.94
2014 1 6.14 NA 6.14 6.14 6.14 6.14 6.14
2015 1 6.16 NA 6.16 6.16 6.16 6.16 6.16
2016 1 5.99 NA 5.99 5.99 5.99 5.99 5.99
2017 1 6.37 NA 6.37 6.37 6.37 6.37 6.37
2018 1 6.24 NA 6.24 6.24 6.24 6.24 6.24
2019 1 6.24 NA 6.24 6.24 6.24 6.24 6.24
2020 1 6.52 NA 6.52 6.52 6.52 6.52 6.52
2021 1 6.42 NA 6.42 6.42 6.42 6.42 6.42

alebo krajšie tabuľky s pomocou .kableExtra.:

library(dplyr)
library(knitr)
library(kableExtra)
 
# Dáta Slovenskej republiky z rokov 2005:2021
happiness.stats.slovakia <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Slovakia", Year %in% 2005:2021) %>%
  group_by(Year) %>%
  summarise(
    n      = n(),
    mean   = mean(`Life Ladder`, na.rm = TRUE),
    sd     = sd(`Life Ladder`, na.rm = TRUE),
    min    = min(`Life Ladder`, na.rm = TRUE),
    q25    = quantile(`Life Ladder`, 0.25, na.rm = TRUE),
    median = median(`Life Ladder`, na.rm = TRUE),
    q75    = quantile(`Life Ladder`, 0.75, na.rm = TRUE),
    max    = max(`Life Ladder`, na.rm = TRUE),
    .groups = "drop"
  )
 
# Vytvorenie tabuľky pomocou kableExtra
happiness.stats.slovakia %>%
  kable(digits = 2, caption = "Štatistiky Indexu šťastia na Slovensku (2005-2021)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  add_header_above(c(" " = 2, "Štatistiky Indexu šťastia" = 7))
Štatistiky Indexu šťastia na Slovensku (2005-2021)
Štatistiky Indexu šťastia
Year n mean sd min q25 median q75 max
2006 1 5.26 NA 5.26 5.26 5.26 5.26 5.26
2010 1 6.05 NA 6.05 6.05 6.05 6.05 6.05
2011 1 5.95 NA 5.95 5.95 5.95 5.95 5.95
2012 1 5.91 NA 5.91 5.91 5.91 5.91 5.91
2013 1 5.94 NA 5.94 5.94 5.94 5.94 5.94
2014 1 6.14 NA 6.14 6.14 6.14 6.14 6.14
2015 1 6.16 NA 6.16 6.16 6.16 6.16 6.16
2016 1 5.99 NA 5.99 5.99 5.99 5.99 5.99
2017 1 6.37 NA 6.37 6.37 6.37 6.37 6.37
2018 1 6.24 NA 6.24 6.24 6.24 6.24 6.24
2019 1 6.24 NA 6.24 6.24 6.24 6.24 6.24
2020 1 6.52 NA 6.52 6.52 6.52 6.52 6.52
2021 1 6.42 NA 6.42 6.42 6.42 6.42 6.42

Testovanie hypotéz

print(data_slovakia[c("Year", "Life Ladder")])

t-test: Porovnanie priemeru Indexu šťastia v 2 kategóriách

Pre tento typ dát (v pôvodnej forme) som nemohla spraviť t-test, preto som sa rozhodla ho spraviť tak, že som si celé obdobie od 2006 do 2021 rozdelila na 2 kategórie - takým spôsobom som splnila základné kritéria t-testu a bolo možné ho vykonať. V prvej kategórii sú údaje za obdobie od 2006 do 2013 a v druhej sú od 2014 do 2021.

skorsie_roky <- 2006:2013

neskorsie_roky <- 2014:2021

skorsie_obdobie <- data_slovakia$`Life Ladder`[data_slovakia$Year %in% skorsie_roky]
neskorsie_obdobie <- data_slovakia$`Life Ladder`[data_slovakia$Year %in% neskorsie_roky]

t.test.result <- t.test(
  skorsie_obdobie,
  neskorsie_obdobie
)

print("T-test porovnávajúci Life Ladder: Skoršie obdobie (2006-2013) vs. Neskoršie obdobie (2014-2021)")
[1] "T-test porovnávajúci Life Ladder: Skoršie obdobie (2006-2013) vs. Neskoršie obdobie (2014-2021)"
print(t.test.result)

    Welch Two Sample t-test

data:  skorsie_obdobie and neskorsie_obdobie
t = -2.8508, df = 5.4556, p-value = 0.03242
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.82238797 -0.05272094
sample estimates:
mean of x mean of y 
 5.821907  6.259461 

Výsledky t-testu ukazujú, že medzi skorším (2006–2013) a neskorším obdobím (2014–2021) existuje štatisticky významný rozdiel v priemernej hodnote ukazovateľa Life Ladder (p = 0.032 < 0.05). Priemer v neskoršom období (6.26) je vyšší ako v skoršom (5.82), čo naznačuje, že subjektívna spokojnosť so životom sa v čase zlepšila.

Kód pre porovnanie dvoch hodnôt

LL_2006 <- data_slovakia$`Life Ladder`[data_slovakia$Year == 2006]
LL_2021 <- data_slovakia$`Life Ladder`[data_slovakia$Year == 2021]

if (length(LL_2006) > 0 && length(LL_2021) > 0) {
    rozdiel <- LL_2021 - LL_2006
    
    cat("Life Ladder (Index šťastia) pre Slovensko:\n")
    cat("  Rok 2006:", LL_2006, "\n")
    cat("  Rok 2021:", LL_2021, "\n")
    cat("  Zmena (2021 - 2006):", rozdiel, "\n")
    
    if (rozdiel > 0.05) {
        print("Zistený je výrazný nárast Indexu šťastia (Life Ladder) medzi rokmi 2006 a 2021.")
    } else if (rozdiel < -0.05) {
        print("Zistený je výrazný pokles Indexu šťastia (Life Ladder) medzi rokmi 2006 a 2021.")
    } else {
        print("Index šťastia (Life Ladder) sa medzi rokmi 2006 a 2021 zmenil len mierne.")
    }

} else {
    print("Pre požadované roky (2006 alebo 2021) stále chýbajú dáta pre Slovensko.")
}
Life Ladder (Index šťastia) pre Slovensko:
  Rok 2006: 5.264677 
  Rok 2021: 6.418504 
  Zmena (2021 - 2006): 1.153827 
[1] "Zistený je výrazný nárast Indexu šťastia (Life Ladder) medzi rokmi 2006 a 2021."

Tento test sa zameriava na porovnanie hodnôt Indexu šťastia pre Slovensko v dvoch časových bodoch – v najskoršom dostupnom roku (2006) a v najnovšom roku (2021).Výsledky odhalili nárast z 5.26 na 6.42 (rozdiel +1.15), čo potvrdzuje výrazné zlepšenie životnej spokojnosti. Tento záver korešponduje s výsledkami t-testu, ktorý tiež preukázal štatisticky významný nárast Indexu šťastia v neskoršom období.

ANOVA

library(dplyr)
library(broom)
library(knitr)
library(kableExtra)
library(scales) 

data_slovakia <- data_slovakia %>%
  mutate(
    Obdobie_Factor = as.factor(
      case_when(
        Year >= 2006 & Year <= 2013 ~ "Skoršie Obdobie (2006-2013)",
        Year >= 2014 & Year <= 2021 ~ "Neskoršie Obdobie (2014-2021)",
        TRUE ~ NA_character_
      )
    )
  )

anova.result <- aov(
  `Life Ladder` ~ Obdobie_Factor, 
  data = data_slovakia
)

print("--- ŠTANDARDNÝ TEXTOVÝ VÝSTUP ANOVY ---")
[1] "--- ŠTANDARDNÝ TEXTOVÝ VÝSTUP ANOVY ---"
print(summary(anova.result))
               Df Sum Sq Mean Sq F value  Pr(>F)   
Obdobie_Factor  1 0.5891  0.5891   10.81 0.00724 **
Residuals      11 0.5996  0.0545                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
print("---------------------------------------")
[1] "---------------------------------------"
tidy_anova <- broom::tidy(anova.result)

p_values <- tidy_anova$p.value
background_colors <- ifelse(is.na(p_values) | p_values >= 0.05, "#DC3545", "#007BFF") 

tidy_anova %>%
  select(term, df, sumsq, meansq, statistic, p.value) %>% # Pridané Sum Sq a Mean Sq
  mutate(p.value = scales::pvalue(p.value, accuracy = 0.001)) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4))) %>%
  rename(
    Zdroj_variability = term,
    `Stupne voľnosti (df)` = df,
    `Sumy štvorcov (Sum Sq)` = sumsq,
    `Priemerné štvorce (Mean Sq)` = meansq,
    `F-hodnota` = statistic,
    `p-hodnota` = p.value
  ) %>%
  kable(caption = "ANOVA: Porovnanie Indexu Šťastia medzi dvoma obdobiami", 
        format = "html") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = F,
    font_size = 14
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#4CAF50") %>% 
  column_spec(6, # Stĺpec s p-hodnotou
              color = "white",
              background = background_colors)
ANOVA: Porovnanie Indexu Šťastia medzi dvoma obdobiami
Zdroj_variability Stupne voľnosti (df) Sumy štvorcov (Sum Sq) Priemerné štvorce (Mean Sq) F-hodnota p-hodnota
Obdobie_Factor 1 0.5891 0.5891 10.8079 0.007
Residuals 11 0.5996 0.0545 NA NA

Analýza rozptylu (ANOVA) bola použitá na testovanie, či existuje štatisticky významný rozdiel v priemernom Indexe šťastia medzi skorším (2006–2013) a neskorším obdobím (2014–2021) na Slovensku. Pozorovaná F-hodnota 10.8079 s prislúchajúcou p-hodnotou 0.007 je výrazne menšia ako 0,05, čo potvrdzuje existenciu štatisticky významného rozdielu. Môžeme konštatovať, že Index šťastia na Slovensku bol v neskoršom období signifikantne vyšší ako v skoršom období, čo naznačuje reálnu pozitívnu zmenu. Riadok Residuals má v stĺpci F-hodnota a p-hodnota hodnotu NA, čo je správne, pretože reziduá predstavujú nevysvetlenú chybu modelu a nie sú predmetom F-testu

Lineárna regresia

Lineárna regresia - Index šťastia

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

lm.result <- lm(
  `Life Ladder` ~ Year, 
  data = data_slovakia
)

tidy_output <- broom::tidy(lm.result)

glance_output <- broom::glance(lm.result)

cat("### Výsledky Lineárnej Regresie (Koeficienty)\n")
### Výsledky Lineárnej Regresie (Koeficienty)
tidy_output %>%
  select(term, estimate, std.error, statistic, p.value) %>%
  mutate(p.value = scales::pvalue(p.value, accuracy = 0.001)) %>%  
  mutate(across(where(is.numeric), ~ round(.x, 4))) %>%             
  rename(
    Termín = term,
    Odhad = estimate,
    `Štandardná chyba` = std.error,
    `t-hodnota` = statistic,
    `p-hodnota` = p.value
  ) %>%
  kable(caption = "Detailné Koeficienty Regresie (Life Ladder ~ Year)", 
        format = "html") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = F
  ) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  # Farebné zvýraznenie významnosti (Intervencia nad 95%)
  column_spec(5, 
              color = ifelse(tidy_output$p.value < 0.05, "white", "black"),
              background = ifelse(tidy_output$p.value < 0.05, "#3d85c6", "#e06666"))
Detailné Koeficienty Regresie (Life Ladder ~ Year)
Termín Odhad Štandardná chyba t-hodnota p-hodnota
(Intercept) -124.0209 19.9811 -6.2069 <0.001
Year 0.0646 0.0099 6.5118 <0.001

cat("\n\n### Celkové Štatistiky Modelu\n")


### Celkové Štatistiky Modelu
glance_output %>%
  select(r.squared, adj.r.squared, statistic, p.value, df) %>%
  mutate(p.value = scales::pvalue(p.value, accuracy = 0.0001)) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4))) %>%
  rename(
    `R-kvadrát` = r.squared,
    `Adj. R-kvadrát` = adj.r.squared,
    `F-hodnota` = statistic,
    `p-hodnota F-testu` = p.value,
    `Stupne voľnosti` = df
  ) %>%
  kable(caption = "Celkové Štatistiky Fit Modelu", format = "html") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = F
  ) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Celkové Štatistiky Fit Modelu
R-kvadrát Adj. R-kvadrát F-hodnota p-hodnota F-testu Stupne voľnosti
0.794 0.7753 42.403 <0.0001 1

Za účelom merania časového trendu Indexu šťastia na Slovensku som použila lineárnu regresiu. S extrémne vysokou F-hodnotou 42.403 a p-hodnotou <0.0001 potvrdzuje model silnú a štatisticky významnú závislosť od času. Koeficient 0.0646 znamená, že s každým pribúdajúcim rokom sa Index šťastia zvyšuje v priemere približne o 0.065 bodu. Model je veľmi silný, keďže až 79.4% celkovej variability šťastia je úspešne vysvetlených plynutím času.

Lineárna regresia - Štedrosť

library(broom)
library(dplyr)
library(kableExtra)
library(stringr)
library(scales) 

model_generosity <- lm(
  Generosity ~ Year, 
  data = data_slovakia
)

coef.tbl <- tidy(model_generosity, conf.int = TRUE) %>%
  mutate(
    term = recode(term,
      "(Intercept)" = "Intercepcie",
      "Year" = "Rok"
    ),
    stars = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      p.value < 0.1 ~ "·",
      TRUE ~ ""
    )
  ) %>%
  transmute(
    Term = term,
    Estimate = estimate,
    `Std. Error` = std.error,
    `t value` = statistic,
    `p value` = p.value,
    # Formátovanie 95% konfidenčného intervalu
    `95% CI` = str_c("[", round(conf.low, 3), ", ", round(conf.high, 3), "]"),
    Sig = stars
  )

coef.tbl %>%
  kable(
    digits = 3,
    caption = "Regresné koeficienty (Generosity ~ Rok)"
  ) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed")
  ) %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  footnote(
    general = "Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.",
    threeparttable = TRUE
  )
Regresné koeficienty (Generosity ~ Rok)
Term Estimate Std. Error t value p value 95% CI Sig
Intercepcie 2.286 8.424 0.271 0.791 [-16.255, 20.827]
Rok -0.001 0.004 -0.280 0.785 [-0.01, 0.008]
Note:
Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.

fit.tbl <- glance(model_generosity) %>%
  transmute(
    `R-squared` = r.squared,
    `Adj. R-squared` = adj.r.squared,
    `F-statistic` = statistic,
    `F p-value` = p.value,
    `AIC` = AIC,
    `BIC` = BIC,
    `Num. obs.` = nobs
  )

fit.tbl %>%
  kable(digits = 4, caption = "Štatistiky fitu Lineárneho Regresného Modelu") %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("condensed", "hover")
  ) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Štatistiky fitu Lineárneho Regresného Modelu
R-squared Adj. R-squared F-statistic F p-value AIC BIC Num. obs.
0.0071 -0.0832 0.0782 0.7849 -31.2013 -29.5064 13

Tentokrát som v rámci lineárnej regresie analyzovala, či sa úroveň štedrosti na Slovensku menila v čase. Model je štatisticky nevýznamný, čo vyplýva z veľmi vysokej p-hodnoty F-testu (0.7849). Koeficient pre premennú Rok je -0.001, s vysokou p-hodnotou 0.785, ktorá presahuje prah 0,05, čo znamená, že nebol zistený žiadny štatisticky významný trend zmeny štedrosti. R-kvadrát s hodnotou 0.0071 (menej ako 1%) potvrdzuje, že čas, ako taký, takmer vôbec nevysvetľuje variabilitu v štedrosti. Na základe týchto výsledkov je záver, že úroveň štedrosti na Slovensku v sledovanom období zostala v priemere stabilná a nezmenila sa.

Lineárna regresia - Log HDP na obyvateľa

library(broom)
library(dplyr)
library(kableExtra)
library(stringr)
library(scales) 

model_gdp <- lm(
  `Log GDP per capita` ~ Year, 
  data = data_slovakia
)

coef.tbl <- tidy(model_gdp, conf.int = TRUE) %>%
  mutate(
    term = recode(term,
      "(Intercept)" = "Intercepcie",
      "Year" = "Rok"
    ),
    stars = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      p.value < 0.1 ~ "·",
      TRUE ~ ""
    )
  ) %>%
  transmute(
    Term = term,
    Estimate = estimate,
    `Std. Error` = std.error,
    `t value` = statistic,
    `p value` = p.value,
    # Formátovanie 95% konfidenčného intervalu
    `95% CI` = str_c("[", round(conf.low, 3), ", ", round(conf.high, 3), "]"),
    Sig = stars
  )

coef.tbl %>%
  kable(
    digits = 3,
    caption = "Regresné koeficienty (Log GDP per capita ~ Rok)"
  ) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed")
  ) %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  footnote(
    general = "Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.",
    threeparttable = TRUE
  )
Regresné koeficienty (Log GDP per capita ~ Rok)
Term Estimate Std. Error t value p value 95% CI Sig
Intercepcie -38.325 3.616 -10.598 0 [-46.284, -30.365] ***
Rok 0.024 0.002 13.430 0 [0.02, 0.028] ***
Note:
Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.

fit.tbl <- glance(model_gdp) %>%
  transmute(
    `R-squared` = r.squared,
    `Adj. R-squared` = adj.r.squared,
    `F-statistic` = statistic,
    `F p-value` = p.value,
    `AIC` = AIC,
    `BIC` = BIC,
    `Num. obs.` = nobs
  )

fit.tbl %>%
  kable(digits = 4, caption = "Štatistiky fitu Lineárneho Regresného Modelu") %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("condensed", "hover")
  ) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Štatistiky fitu Lineárneho Regresného Modelu
R-squared Adj. R-squared F-statistic F p-value AIC BIC Num. obs.
0.9425 0.9373 180.3729 0 -53.1878 -51.493 13

Log GDP per capita je logaritmus hrubého domáceho produktu na obyvateľa, čo je štandardný ekonomický ukazovateľ upravený pre účely štatistickej analýzy. V tomto prípade som analyzovala časový trend ekonomickej úrovne na Slovensku, s R-kvadrátom 0.9425, čo naznačuje, že až 94.25% zmeny Log HDP je vysvetlených samotným časom. Extrémne vysoká F-hodnota 180.37 s p-hodnotou blízko nule potvrdzuje existenciu silného a vysoko štatisticky významného rastúceho trendu v ekonomike. Konkrétne, koeficient 0.024 udáva, že Log HDP na obyvateľa sa v priemere zvyšoval o 0.024 bodu za každý rok sledovaného obdobia. Tieto výsledky jasne svedčia o stabilnom a dynamickom ekonomickom raste Slovenska.

Heatmap korelačnej matice

library(dplyr)
library(corrplot)
library(RColorBrewer)

data_corr <- data_slovakia %>%
  select(
    `Life Ladder`,
    `Log GDP per capita`,
    Generosity,
    Year
  ) %>%
  na.omit() 

M <- cor(data_corr, method = "pearson")

par(mfrow = c(1, 1), mar = c(1, 1, 1, 1)) 

corrplot(M, 
         method = "color",                 
         type = "upper",                   
         order = "original",               
         addCoef.col = "black",            
         tl.col = "black",                 # Farba popisiek (názvov premenných)
         tl.srt = 45,                      # Otočenie popisiek pre lepšiu čitateľnosť
         diag = FALSE,                    
         col = brewer.pal(n = 8, name = "RdYlBu") # Farebná schéma (červená-žltá-modrá)
         )

# Pridanie titulku k grafu
title("Heatmap korelačnej matice pre kľúčové premenné (Slovensko)", line = 3, cex.main = 1.2)

Heatmap korelačnej matice zahŕňa premenné Life Ladder, Log GDP per capita, Generosity a Year, aby vizuálne zhrnula ich vzájomné vzťahy. Najvyššia korelácia (0.97) medzi Log GDP per capita a Year demonštruje extrémne silný, takmer perfektný lineárny rast ekonomickej úrovne. Najnižšia korelácia (-0.18), medzi Log GDP per capita a Generosity, v praxi znamená veľmi slabý negatívny vzťah. Celkovo analýza potvrdzuje, že hlavným motorom rastu šťastia je práve silný ekonomický rozvoj (vysoká pozitívna korelácia).

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIkxpbmRhIEtha2Fzb3bDoSAgPGJyPgoocyB2eXXFvml0w61tIHZlcmVqbmUgZG9zdHVwbsO9Y2gga8OzZG92IGEgQ2hhdEdQVCkiCmRhdGU6ICJPa3RvYmVyIDIwMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlY2hvID0gVFJVRSwKICAgIG1lc3NhZ2UgPSBGQUxTRSwKICAgIHdhcm5pbmcgPSBGQUxTRQopCmBgYAoKYGBge3J9CmhlYWQoV29ybGRfSGFwcGluZXNzX1JlcG9ydF8yMDA1XzIwMjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5pZWtvbGtvIHBydnljaCByaWFka292CmNvbG5hbWVzKFdvcmxkX0hhcHBpbmVzc19SZXBvcnRfMjAwNV8yMDIxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5henZ5IHByZW1lbm55Y2gKYGBgCgoKViByw6FtY2kgc3ZvamVqIHByw6FjZSBzb20gc2Egcm96aG9kbGEgcHJhY292YcWlIHMgw7pkYWptaSB2w71ocmFkbmUgcHJlIFNsb3ZlbnNrw7ogcmVwdWJsaWt1IC0gcHJldG8gc2kgaWNoIHYgbmFzbGVkdWrDumNvbSBrcm9rdSB2eWZpbHRydWplbS4KCmBgYHtyfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGRwbHlyKQogCmRhdGFfc2xvdmFraWEgPC0gV29ybGRfSGFwcGluZXNzX1JlcG9ydF8yMDA1XzIwMjEgJT4lCiAgZmlsdGVyKGBDb3VudHJ5IG5hbWVgID09ICJTbG92YWtpYSIpICU+JQogIHNlbGVjdChgQ291bnRyeSBuYW1lYCwgWWVhciwgYExpZmUgTGFkZGVyYCwgYExvZyBHRFAgcGVyIGNhcGl0YWAsIGBHZW5lcm9zaXR5YCkKIAojIFpvYnJhemVuaWUgY2VsZWogdGFidcS+a3k6CmtuaXRyOjprYWJsZShkYXRhX3Nsb3Zha2lhLCBjYXB0aW9uID0gIlVkYWplIHByZSBTbG92ZW5za28iKQpgYGAKCiMgR3JhZnkKCiMjIyBCb2RvdsO9IGdyYWYKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChkYXRhX3Nsb3Zha2lhLCBhZXMoeCA9IGBHZW5lcm9zaXR5YCwgeSA9IGBMaWZlIExhZGRlcmApKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDQpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiQWtvIHNhIG1lbsOtIGluZGV4IMWhxaVhc3RpYSB2IHrDoXZpc2xvc3RpIG9kIMWhdGVkcm9zdGkgbmEgU2xvdmVuc2t1PyIsCiAgICB4ID0gIsWgdGVkcm9zxaUiLAogICAgeSA9ICJJbmRleCDFocWlYXN0aWEiKQpgYGAKCk5hIHrDoWtsYWRlIHRvaHRvIGdyYWZ1IGphc25lIHZpZG5vLCDFvmUgc2EgSW5kZXggxaHFpWFzdGlhIG5lemTDoSBiecWlIHNpbG5lIG92cGx5dm5lbsO9IMWhdGVkcm9zxaVvdS4gQm9keSBzw7ogem5hxI1uZSByb3pwdMO9bGVuw6ksIMSNbyBuYXpuYcSNdWplIHNsYWLDuiBrb3JlbMOhY2l1IG1lZHppIHTDvW1pdG8gZHZvbWEgcHJlbWVubsO9bWkuIMWgdGVkcm9zxaUsIGFrbyBrxL7DusSNb3bDvSBwcmVkaWt0b3IsIG5lbcOhIHpqYXZuw70gbGluZcOhcm55IHZwbHl2IG5hIHBvY2l0IMWhxaVhc3RpYSwgxI1vIG5hem5hxI11amUsIMW+ZSBpbsOpIGZha3RvcnkgKGFrbyBIRFAgYWxlYm8gc29jacOhbG5hIHBvZHBvcmEpIHPDuiBwcmUgxaHFpWFzdGllIFNsb3bDoWtvdiBkw7RsZcW+aXRlasWhaWUuCgoKCiMjIyBCb3hwbG90CgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQogCmRhdGFfc2xvdmFraWEgPC0gV29ybGRfSGFwcGluZXNzX1JlcG9ydF8yMDA1XzIwMjEgJT4lCiAgZmlsdGVyKGBDb3VudHJ5IG5hbWVgID09ICJTbG92YWtpYSIpCiAKZ2dwbG90KGRhdGFfc2xvdmFraWEsIGFlcyh4ID0gZmFjdG9yKFllYXIpLCB5ID0gYExpZmUgTGFkZGVyYCkpICsKICBnZW9tX2JveHBsb3QoZmlsbCA9ICJncmVlbiIsIGNvbG9yID0gImJyb3duIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJWw712b2ogSW5kZXh1IMWhxaVhc3RpYSBwcmUgU2xvdmVuc2tvIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiSW5kZXggxaHFpWFzdGlhIgogICkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCkdyYWYgamFzbmUgem9icmF6dWplIHNpbG7DvSwgc3RhYmlsbsO9IGEgcmFzdMO6Y2kgdHJlbmQgSW5kZXh1IMWhxaVhc3RpYSBuYSBTbG92ZW5za3UgdiDEjWFzZS4gSG9kbm90eSBzdMO6cGFqw7ogdGFrbWVyIHYgcHJpYW1laiBsw61uaWkgKHYgc8O6bGFkZSBzIG5lc2vDtHIgdnlrb25hbm91IGxpbmXDoXJub3UgcmVncmVzaW91KSwgxI1vIHpuYW1lbsOhLCDFvmUgcHJpZW1lcm7DvSBwb2NpdCDFocWlYXN0aWEgc2EgdiBzbGVkb3Zhbm9tIG9iZG9iw60ga29uxaF0YW50bmUgenZ5xaFvdmFsLgoKCgojIyMgxIxpYXJvdsO9IGdyYWYKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCgpnZ3Bsb3QoZGF0YSA9IGRhdGFfc2xvdmFraWEsIGFlcyh4ID0gWWVhciwgeSA9IGBMb2cgR0RQIHBlciBjYXBpdGFgKSkgKwogIAogIGdlb21fbGluZSgKICAgIGNvbG9yID0gIiMwMDdCRkYiLCAjIE1vZHLDoSBmYXJiYSDEjWlhcnkgKEhFWCBrw7NkKQogICAgc2l6ZSA9IDEuMiAgICAgICAgICMgSHLDumJrYSDEjWlhcnkKICApICsKICAKICBnZW9tX3BvaW50KAogICAgY29sb3IgPSAiI0ZGQzEwNyIsICMgxb1sdMOhL09yYW7Fvm92w6EgZmFyYmEgYm9kb3YKICAgIHNpemUgPSAzLjUsCiAgICBzaGFwZSA9IDE5ICAgICAgICAgIyBQbG7DvSBrcnVoCiAgKSArCiAgCiAgbGFicygKICAgIHRpdGxlID0gIlbDvXZvaiBMb2cgR0RQIHBlciBjYXBpdGEgbmEgU2xvdmVuc2t1ICgyMDA2LTIwMjEpIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiTG9nIEdEUCBwZXIgY2FwaXRhIChMb2cgSERQIG5hIG9ieXZhdGXEvmEpIiwKICAgIGNhcHRpb24gPSAiWmRyb2o6IFdvcmxkIEhhcHBpbmVzcyBSZXBvcnQiCiAgKSArCiAgCiAgdGhlbWVfbWluaW1hbCgpICsgCgogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMzQzQTQwIiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksICMgT2RzdHLDoW5lbmllIG1lbsWhw61jaCDEjWlhciBtcmllxb5reQogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImdyZXk4MCIpLCAjIEJvZGtvdmFuw6kgxI1pYXJ5IGxlbiBwcmUgb3MgWAogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiZ3JleTgwIikgIyBQbG7DqSDEjWlhcnkgcHJlIG9zIFkKICApCmBgYAoKR3JhZiB2aXp1w6FsbmUgcG90dnJkenVqZSBtaW1vcmlhZG5lIHNpbG7DvSwgbGluZcOhcm55IGEgcmFzdMO6Y2kgdHJlbmQgcHJlbWVubmVqIExvZyBIRFAgcGVyIGNhcGl0YSBuYSBTbG92ZW5za3UgdiDEjWFzZS4gSG9kbm90eSBzdMO6cGFqw7ogdGFrbWVyIGJleiBvZGNow71sb2sgYSBzIHZlxL5taSB2eXNva291IHByZXNub3PFpW91LCDEjW8gbmF6bmHEjXVqZSwgxb5lIGVrb25vbWlja8OhIMO6cm92ZcWIIFNsb3ZlbnNrYSB2IHNsZWRvdmFub20gb2Jkb2LDrSBrb27FoXRhbnRuZSBhIHN0YWJpbG5lIHLDoXN0bGEuIFRlbnRvIHZpenXDoWxueSBkw7RrYXogcGVyZmVrdG5lIGtvcmXFoXBvbmR1amUgcyBuZXNrb3LFocOtbWkgdsO9c2xlZGthbWkgbGluZcOhcm5laiByZWdyZXNpZSwga2RlIGJvbCB6aXN0ZW7DvSBuYWpzaWxuZWrFocOtIHRyZW5kIHpvIHbFoWV0a8O9Y2ggdGVzdG92YW7DvWNoIHByZW1lbm7DvWNoLgoKCgoKIyMjIFN0xLpwY292w70gZ3JhZgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKCmRhdGFfc2xvdmFraWEgPC0gZGF0YV9zbG92YWtpYSAlPiUKICBtdXRhdGUoWWVhcl9GYWN0b3IgPSBhcy5mYWN0b3IoWWVhcikpCgpnZ3Bsb3QoZGF0YSA9IGRhdGFfc2xvdmFraWEsIGFlcyh4ID0gWWVhcl9GYWN0b3IsIHkgPSBHZW5lcm9zaXR5KSkgKwogIAogIGdlb21fY29sKAogICAgZmlsbCA9ICIjMDA3QkZGIiwgIyBNb2Ryw6EgZmFyYmEgc3TEunBjb3YKICAgIGNvbG9yID0gImJsYWNrIiwgICMgxIxpZXJueSBva3JhaiBva29sbyBzdMS6cGNvdgogICAgd2lkdGggPSAwLjcgICAgICAgIyDFoMOtcmthIHN0xLpwY292CiAgKSArCgogIGdlb21fdGV4dCgKICAgIGFlcyhsYWJlbCA9IHJvdW5kKEdlbmVyb3NpdHksIDMpKSwgCiAgICB2anVzdCA9IC0wLjUsICAgICAgICAgICAgICAgICAgICAgICAKICAgIGNvbG9yID0gIiMzNDNBNDAiLCAgICAgICAgICAgICAgICAgICMgVG1hdm9zaXbDoSBmYXJiYSB0ZXh0dQogICAgc2l6ZSA9IDMuNQogICkgKwogIAoKICBsYWJzKAogICAgdGl0bGUgPSAiVsO9dm9qIMWgdGVkcm9zdGkgbmEgU2xvdmVuc2t1IiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiR2VuZXJvc2l0eSIsCiAgICBjYXB0aW9uID0gIlpkcm9qOiBXb3JsZCBIYXBwaW5lc3MgUmVwb3J0IgogICkgKwogIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gIiMzNDNBNDAiKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkgCiAgICApCmBgYApHcmFmIHZpenXDoWxuZSBwb3R2cmR6dWplLCDFvmUgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSB0cmVuZCDFoXRlZHJvc3RpIHYgxI1hc2UgKHppc3RlbsO9IGFqIG5lc2vDtHIgcmVncmVzbm91IGFuYWzDvXpvdSkgamUgc3DDtHNvYmVuw70gdMO9bSwgxb5lIGhvZG5vdHkgc2EgdGFrbWVyIG5lbWVuaWEuIFZvIHbDpMSNxaFpbmUgcm9rb3YgZG9jaMOhZHphIGsgdsO9c2t5dHUgbmVnYXTDrXZueWNoIGhvZG7DtHQsIMSNbyBuYXpuYcSNdWplIG1pZXJ1IMWhdGVkcm9zdGkgbmnFvsWhaXUsIG5lxb4gamUgdHlwaWNrw6kgcHJlIGtyYWppbnUgcyBkYW7DvW1pIGNoYXJha3RlcmlzdGlrYW1pLiBQb3NsZWRuw6Ega2xhZG7DoSBob2Rub3RhIHYgcm9rdSAyMDIxIChwb8SNYXMgcGFuZMOpbWllKSBwcmF2ZGVwb2RvYm5lIG9kcsOhxb5hIGRvxI1hc27DvSBuw6FyYXN0IGFsdHJ1aXptdSBhIHNvbGlkYXJpdHkgdiByZWFrY2lpIG5hIGtyw616dSwga3RvcsO9IGtyw6F0a29kb2JvIHByZXbDvcWhaWwgb8SNYWvDoXZhbmlhLiBDZWxrb3ZvIGplIG1vxb5uw6kga29uxaF0YXRvdmHFpSwgxb5lIMWhdGVkcm9zxaUgbmEgU2xvdmVuc2t1IGplIGRsaG9kb2JvIHN0YWJpbG5lIG7DrXprYS4KCgoKIyBaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IAoKIyMga25pdHIgLSB0YWJ1xL5rYQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCgojIFpocm51dGllIHrDoWtsYWRuw71jaCDFoXRhdGlzdMOtayBpbmRleHUgxaHFpWFzdGlhIHByZSBTbG92ZW5za28gdiByb2tvY2ggMjAwNeKAkzIwMjEKaGFwcGluZXNzLnN0YXRzLnNsb3Zha2lhIDwtIFdvcmxkX0hhcHBpbmVzc19SZXBvcnRfMjAwNV8yMDIxICU+JQogIGZpbHRlcihgQ291bnRyeSBuYW1lYCA9PSAiU2xvdmFraWEiLCBZZWFyICVpbiUgMjAwNToyMDIxKSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UoCiAgICBgUG/EjWV0IHBvem9yb3ZhbsOtYCAgICAgICAgPSBuKCksCiAgICBgUHJpZW1lcmAgICAgICAgICAgICAgICAgID0gbWVhbihgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgYMWgdGFuZGFyZG7DoSBvZGNow71sa2FgICAgICA9IHNkKGBMaWZlIExhZGRlcmAsIG5hLnJtID0gVFJVRSksCiAgICBgTWluaW11bWAgICAgICAgICAgICAgICAgID0gbWluKGBMaWZlIExhZGRlcmAsIG5hLnJtID0gVFJVRSksCiAgICBgMjUuIHBlcmNlbnRpbGAgICAgICAgICAgID0gcXVhbnRpbGUoYExpZmUgTGFkZGVyYCwgMC4yNSwgbmEucm0gPSBUUlVFKSwKICAgIGBNZWRpw6FuYCAgICAgICAgICAgICAgICAgID0gbWVkaWFuKGBMaWZlIExhZGRlcmAsIG5hLnJtID0gVFJVRSksCiAgICBgNzUuIHBlcmNlbnRpbGAgICAgICAgICAgID0gcXVhbnRpbGUoYExpZmUgTGFkZGVyYCwgMC43NSwgbmEucm0gPSBUUlVFKSwKICAgIGBNYXhpbXVtYCAgICAgICAgICAgICAgICAgPSBtYXgoYExpZmUgTGFkZGVyYCwgbmEucm0gPSBUUlVFKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApCgojIFZ5dHZvcmVuaWUgdGFidcS+a3kgcG9tb2NvdSBrbml0cgprYWJsZShoYXBwaW5lc3Muc3RhdHMuc2xvdmFraWEsIGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiWsOha2xhZG7DqSDFoXRhdGlzdGlreSBJbmRleHUgxaHFpWFzdGlhIHByZSBTbG92ZW5za28gKDIwMDXigJMyMDIxKSIpCmBgYAoKCgphbGVibyBrcmFqxaFpZSB0YWJ1xL5reSBzIHBvbW9jb3UgLmthYmxlRXh0cmEuOgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKIAojIETDoXRhIFNsb3ZlbnNrZWogcmVwdWJsaWt5IHogcm9rb3YgMjAwNToyMDIxCmhhcHBpbmVzcy5zdGF0cy5zbG92YWtpYSA8LSBXb3JsZF9IYXBwaW5lc3NfUmVwb3J0XzIwMDVfMjAyMSAlPiUKICBmaWx0ZXIoYENvdW50cnkgbmFtZWAgPT0gIlNsb3Zha2lhIiwgWWVhciAlaW4lIDIwMDU6MjAyMSkgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlKAogICAgbiAgICAgID0gbigpLAogICAgbWVhbiAgID0gbWVhbihgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgc2QgICAgID0gc2QoYExpZmUgTGFkZGVyYCwgbmEucm0gPSBUUlVFKSwKICAgIG1pbiAgICA9IG1pbihgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgcTI1ICAgID0gcXVhbnRpbGUoYExpZmUgTGFkZGVyYCwgMC4yNSwgbmEucm0gPSBUUlVFKSwKICAgIG1lZGlhbiA9IG1lZGlhbihgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgcTc1ICAgID0gcXVhbnRpbGUoYExpZmUgTGFkZGVyYCwgMC43NSwgbmEucm0gPSBUUlVFKSwKICAgIG1heCAgICA9IG1heChgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkKIAojIFZ5dHZvcmVuaWUgdGFidcS+a3kgcG9tb2NvdSBrYWJsZUV4dHJhCmhhcHBpbmVzcy5zdGF0cy5zbG92YWtpYSAlPiUKICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIsWgdGF0aXN0aWt5IEluZGV4dSDFocWlYXN0aWEgbmEgU2xvdmVuc2t1ICgyMDA1LTIwMjEpIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIsWgdGF0aXN0aWt5IEluZGV4dSDFocWlYXN0aWEiID0gNykpCmBgYAoKCiMgVGVzdG92YW5pZSBoeXBvdMOpegoKYGBge3J9CnByaW50KGRhdGFfc2xvdmFraWFbYygiWWVhciIsICJMaWZlIExhZGRlciIpXSkKYGBgCiMjIyMgdC10ZXN0OiBQb3Jvdm5hbmllIHByaWVtZXJ1IEluZGV4dSDFocWlYXN0aWEgdiAyIGthdGVnw7NyacOhY2gKUHJlIHRlbnRvIHR5cCBkw6F0ICh2IHDDtHZvZG5laiBmb3JtZSkgc29tIG5lbW9obGEgc3ByYXZpxaUgdC10ZXN0LCBwcmV0byBzb20gc2Egcm96aG9kbGEgaG8gc3ByYXZpxaUgdGFrLCDFvmUgc29tIHNpIGNlbMOpIG9iZG9iaWUgb2QgMjAwNiBkbyAyMDIxIHJvemRlbGlsYSBuYSAyIGthdGVnw7NyaWUgLSB0YWvDvW0gc3DDtHNvYm9tIHNvbSBzcGxuaWxhIHrDoWtsYWRuw6kga3JpdMOpcmlhIHQtdGVzdHUgYSBib2xvIG1vxb5uw6kgaG8gdnlrb25hxaUuIFYgcHJ2ZWoga2F0ZWfDs3JpaSBzw7ogw7pkYWplIHphIG9iZG9iaWUgb2QgMjAwNiBkbyAyMDEzIGEgdiBkcnVoZWogc8O6IG9kIDIwMTQgZG8gMjAyMS4KCgpgYGB7cn0Kc2tvcnNpZV9yb2t5IDwtIDIwMDY6MjAxMwoKbmVza29yc2llX3Jva3kgPC0gMjAxNDoyMDIxCgpza29yc2llX29iZG9iaWUgPC0gZGF0YV9zbG92YWtpYSRgTGlmZSBMYWRkZXJgW2RhdGFfc2xvdmFraWEkWWVhciAlaW4lIHNrb3JzaWVfcm9reV0KbmVza29yc2llX29iZG9iaWUgPC0gZGF0YV9zbG92YWtpYSRgTGlmZSBMYWRkZXJgW2RhdGFfc2xvdmFraWEkWWVhciAlaW4lIG5lc2tvcnNpZV9yb2t5XQoKdC50ZXN0LnJlc3VsdCA8LSB0LnRlc3QoCiAgc2tvcnNpZV9vYmRvYmllLAogIG5lc2tvcnNpZV9vYmRvYmllCikKCnByaW50KCJULXRlc3QgcG9yb3Zuw6F2YWrDumNpIExpZmUgTGFkZGVyOiBTa29yxaFpZSBvYmRvYmllICgyMDA2LTIwMTMpIHZzLiBOZXNrb3LFoWllIG9iZG9iaWUgKDIwMTQtMjAyMSkiKQpwcmludCh0LnRlc3QucmVzdWx0KQpgYGAKVsO9c2xlZGt5IHQtdGVzdHUgdWthenVqw7osIMW+ZSBtZWR6aSBza29yxaHDrW0gKDIwMDbigJMyMDEzKSBhIG5lc2tvcsWhw61tIG9iZG9iw61tICgyMDE04oCTMjAyMSkgZXhpc3R1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gcm96ZGllbCB2IHByaWVtZXJuZWogaG9kbm90ZSB1a2F6b3ZhdGXEvmEgTGlmZSBMYWRkZXIgKHAgPSAwLjAzMiA8IDAuMDUpLiBQcmllbWVyIHYgbmVza29yxaFvbSBvYmRvYsOtICg2LjI2KSBqZSB2ecWhxaHDrSBha28gdiBza29yxaFvbSAoNS44MiksIMSNbyBuYXpuYcSNdWplLCDFvmUgc3ViamVrdMOtdm5hIHNwb2tvam5vc8WlIHNvIMW+aXZvdG9tIHNhIHYgxI1hc2UgemxlcMWhaWxhLgoKCgojIyMjIEvDs2QgcHJlIHBvcm92bmFuaWUgZHZvY2ggaG9kbsO0dAoKYGBge3J9CkxMXzIwMDYgPC0gZGF0YV9zbG92YWtpYSRgTGlmZSBMYWRkZXJgW2RhdGFfc2xvdmFraWEkWWVhciA9PSAyMDA2XQpMTF8yMDIxIDwtIGRhdGFfc2xvdmFraWEkYExpZmUgTGFkZGVyYFtkYXRhX3Nsb3Zha2lhJFllYXIgPT0gMjAyMV0KCmlmIChsZW5ndGgoTExfMjAwNikgPiAwICYmIGxlbmd0aChMTF8yMDIxKSA+IDApIHsKICAgIHJvemRpZWwgPC0gTExfMjAyMSAtIExMXzIwMDYKICAgIAogICAgY2F0KCJMaWZlIExhZGRlciAoSW5kZXggxaHFpWFzdGlhKSBwcmUgU2xvdmVuc2tvOlxuIikKICAgIGNhdCgiICBSb2sgMjAwNjoiLCBMTF8yMDA2LCAiXG4iKQogICAgY2F0KCIgIFJvayAyMDIxOiIsIExMXzIwMjEsICJcbiIpCiAgICBjYXQoIiAgWm1lbmEgKDIwMjEgLSAyMDA2KToiLCByb3pkaWVsLCAiXG4iKQogICAgCiAgICBpZiAocm96ZGllbCA+IDAuMDUpIHsKICAgICAgICBwcmludCgiWmlzdGVuw70gamUgdsO9cmF6bsO9IG7DoXJhc3QgSW5kZXh1IMWhxaVhc3RpYSAoTGlmZSBMYWRkZXIpIG1lZHppIHJva21pIDIwMDYgYSAyMDIxLiIpCiAgICB9IGVsc2UgaWYgKHJvemRpZWwgPCAtMC4wNSkgewogICAgICAgIHByaW50KCJaaXN0ZW7DvSBqZSB2w71yYXpuw70gcG9rbGVzIEluZGV4dSDFocWlYXN0aWEgKExpZmUgTGFkZGVyKSBtZWR6aSByb2ttaSAyMDA2IGEgMjAyMS4iKQogICAgfSBlbHNlIHsKICAgICAgICBwcmludCgiSW5kZXggxaHFpWFzdGlhIChMaWZlIExhZGRlcikgc2EgbWVkemkgcm9rbWkgMjAwNiBhIDIwMjEgem1lbmlsIGxlbiBtaWVybmUuIikKICAgIH0KCn0gZWxzZSB7CiAgICBwcmludCgiUHJlIHBvxb5hZG92YW7DqSByb2t5ICgyMDA2IGFsZWJvIDIwMjEpIHN0w6FsZSBjaMO9YmFqw7ogZMOhdGEgcHJlIFNsb3ZlbnNrby4iKQp9CmBgYApUZW50byB0ZXN0IHNhIHphbWVyaWF2YSBuYSBwb3Jvdm5hbmllIGhvZG7DtHQgSW5kZXh1IMWhxaVhc3RpYSBwcmUgU2xvdmVuc2tvIHYgZHZvY2ggxI1hc292w71jaCBib2RvY2gg4oCTIHYgbmFqc2tvcsWhb20gZG9zdHVwbm9tIHJva3UgKDIwMDYpIGEgdiBuYWpub3bFoW9tIHJva3UgKDIwMjEpLlbDvXNsZWRreSBvZGhhbGlsaSBuw6FyYXN0IHogNS4yNiBuYSA2LjQyIChyb3pkaWVsICsxLjE1KSwgxI1vIHBvdHZyZHp1amUgdsO9cmF6bsOpIHpsZXDFoWVuaWUgxb5pdm90bmVqIHNwb2tvam5vc3RpLiBUZW50byB6w6F2ZXIga29yZcWhcG9uZHVqZSBzIHbDvXNsZWRrYW1pIHQtdGVzdHUsIGt0b3LDvSB0aWXFviBwcmV1a8OhemFsIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IG7DoXJhc3QgSW5kZXh1IMWhxaVhc3RpYSB2IG5lc2tvcsWhb20gb2Jkb2LDrS4KCgoKIyMgQU5PVkEKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoc2NhbGVzKSAKCmRhdGFfc2xvdmFraWEgPC0gZGF0YV9zbG92YWtpYSAlPiUKICBtdXRhdGUoCiAgICBPYmRvYmllX0ZhY3RvciA9IGFzLmZhY3RvcigKICAgICAgY2FzZV93aGVuKAogICAgICAgIFllYXIgPj0gMjAwNiAmIFllYXIgPD0gMjAxMyB+ICJTa29yxaFpZSBPYmRvYmllICgyMDA2LTIwMTMpIiwKICAgICAgICBZZWFyID49IDIwMTQgJiBZZWFyIDw9IDIwMjEgfiAiTmVza29yxaFpZSBPYmRvYmllICgyMDE0LTIwMjEpIiwKICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXwogICAgICApCiAgICApCiAgKQoKYW5vdmEucmVzdWx0IDwtIGFvdigKICBgTGlmZSBMYWRkZXJgIH4gT2Jkb2JpZV9GYWN0b3IsIAogIGRhdGEgPSBkYXRhX3Nsb3Zha2lhCikKCnByaW50KCItLS0gxaBUQU5EQVJETsOdIFRFWFRPVsOdIFbDnVNUVVAgQU5PVlkgLS0tIikKcHJpbnQoc3VtbWFyeShhbm92YS5yZXN1bHQpKQpwcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKCgp0aWR5X2Fub3ZhIDwtIGJyb29tOjp0aWR5KGFub3ZhLnJlc3VsdCkKCnBfdmFsdWVzIDwtIHRpZHlfYW5vdmEkcC52YWx1ZQpiYWNrZ3JvdW5kX2NvbG9ycyA8LSBpZmVsc2UoaXMubmEocF92YWx1ZXMpIHwgcF92YWx1ZXMgPj0gMC4wNSwgIiNEQzM1NDUiLCAiIzAwN0JGRiIpIAoKdGlkeV9hbm92YSAlPiUKICBzZWxlY3QodGVybSwgZGYsIHN1bXNxLCBtZWFuc3EsIHN0YXRpc3RpYywgcC52YWx1ZSkgJT4lICMgUHJpZGFuw6kgU3VtIFNxIGEgTWVhbiBTcQogIG11dGF0ZShwLnZhbHVlID0gc2NhbGVzOjpwdmFsdWUocC52YWx1ZSwgYWNjdXJhY3kgPSAwLjAwMSkpICU+JQogIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gcm91bmQoLngsIDQpKSkgJT4lCiAgcmVuYW1lKAogICAgWmRyb2pfdmFyaWFiaWxpdHkgPSB0ZXJtLAogICAgYFN0dXBuZSB2b8S+bm9zdGkgKGRmKWAgPSBkZiwKICAgIGBTdW15IMWhdHZvcmNvdiAoU3VtIFNxKWAgPSBzdW1zcSwKICAgIGBQcmllbWVybsOpIMWhdHZvcmNlIChNZWFuIFNxKWAgPSBtZWFuc3EsCiAgICBgRi1ob2Rub3RhYCA9IHN0YXRpc3RpYywKICAgIGBwLWhvZG5vdGFgID0gcC52YWx1ZQogICkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJBTk9WQTogUG9yb3ZuYW5pZSBJbmRleHUgxaDFpWFzdGlhIG1lZHppIGR2b21hIG9iZG9iaWFtaSIsIAogICAgICAgIGZvcm1hdCA9ICJodG1sIikgJT4lCiAga2FibGVfc3R5bGluZygKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgZnVsbF93aWR0aCA9IEYsCiAgICBmb250X3NpemUgPSAxNAogICkgJT4lCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjNENBRjUwIikgJT4lIAogIGNvbHVtbl9zcGVjKDYsICMgU3TEunBlYyBzIHAtaG9kbm90b3UKICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGJhY2tncm91bmRfY29sb3JzKQpgYGAKQW5hbMO9emEgcm96cHR5bHUgKEFOT1ZBKSBib2xhIHBvdcW+aXTDoSBuYSB0ZXN0b3ZhbmllLCDEjWkgZXhpc3R1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gcm96ZGllbCB2IHByaWVtZXJub20gSW5kZXhlIMWhxaVhc3RpYSBtZWR6aSBza29yxaHDrW0gKDIwMDbigJMyMDEzKSBhIG5lc2tvcsWhw61tIG9iZG9iw61tICgyMDE04oCTMjAyMSkgbmEgU2xvdmVuc2t1LiBQb3pvcm92YW7DoSBGLWhvZG5vdGEgMTAuODA3OSBzIHByaXNsw7pjaGFqw7pjb3UgcC1ob2Rub3RvdSAwLjAwNyBqZSB2w71yYXpuZSBtZW7FoWlhIGFrbyAwLDA1LCDEjW8gcG90dnJkenVqZSBleGlzdGVuY2l1IMWhdGF0aXN0aWNreSB2w716bmFtbsOpaG8gcm96ZGllbHUuIE3DtMW+ZW1lIGtvbsWhdGF0b3ZhxaUsIMW+ZSBJbmRleCDFocWlYXN0aWEgbmEgU2xvdmVuc2t1IGJvbCB2IG5lc2tvcsWhb20gb2Jkb2LDrSBzaWduaWZpa2FudG5lIHZ5xaHFocOtIGFrbyB2IHNrb3LFoW9tIG9iZG9iw60sIMSNbyBuYXpuYcSNdWplIHJlw6FsbnUgcG96aXTDrXZudSB6bWVudS4gUmlhZG9rIFJlc2lkdWFscyBtw6EgdiBzdMS6cGNpIEYtaG9kbm90YSBhIHAtaG9kbm90YSBob2Rub3R1IE5BLCDEjW8gamUgc3Byw6F2bmUsIHByZXRvxb5lIHJlemlkdcOhIHByZWRzdGF2dWrDuiBuZXZ5c3ZldGxlbsO6IGNoeWJ1IG1vZGVsdSBhIG5pZSBzw7ogcHJlZG1ldG9tIEYtdGVzdHUKCgoKCiMjIExpbmXDoXJuYSByZWdyZXNpYQoKIyMjIExpbmXDoXJuYSByZWdyZXNpYSAtIEluZGV4IMWhxaVhc3RpYQoKYGBge3J9CmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCmxtLnJlc3VsdCA8LSBsbSgKICBgTGlmZSBMYWRkZXJgIH4gWWVhciwgCiAgZGF0YSA9IGRhdGFfc2xvdmFraWEKKQoKdGlkeV9vdXRwdXQgPC0gYnJvb206OnRpZHkobG0ucmVzdWx0KQoKZ2xhbmNlX291dHB1dCA8LSBicm9vbTo6Z2xhbmNlKGxtLnJlc3VsdCkKCmNhdCgiIyMjIFbDvXNsZWRreSBMaW5lw6FybmVqIFJlZ3Jlc2llIChLb2VmaWNpZW50eSlcbiIpCgp0aWR5X291dHB1dCAlPiUKICBzZWxlY3QodGVybSwgZXN0aW1hdGUsIHN0ZC5lcnJvciwgc3RhdGlzdGljLCBwLnZhbHVlKSAlPiUKICBtdXRhdGUocC52YWx1ZSA9IHNjYWxlczo6cHZhbHVlKHAudmFsdWUsIGFjY3VyYWN5ID0gMC4wMDEpKSAlPiUgIAogIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gcm91bmQoLngsIDQpKSkgJT4lICAgICAgICAgICAgIAogIHJlbmFtZSgKICAgIFRlcm3DrW4gPSB0ZXJtLAogICAgT2RoYWQgPSBlc3RpbWF0ZSwKICAgIGDFoHRhbmRhcmRuw6EgY2h5YmFgID0gc3RkLmVycm9yLAogICAgYHQtaG9kbm90YWAgPSBzdGF0aXN0aWMsCiAgICBgcC1ob2Rub3RhYCA9IHAudmFsdWUKICApICU+JQogIGthYmxlKGNhcHRpb24gPSAiRGV0YWlsbsOpIEtvZWZpY2llbnR5IFJlZ3Jlc2llIChMaWZlIExhZGRlciB+IFllYXIpIiwgCiAgICAgICAgZm9ybWF0ID0gImh0bWwiKSAlPiUKICBrYWJsZV9zdHlsaW5nKAogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICBmdWxsX3dpZHRoID0gRgogICkgJT4lCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiI2YyZjJmMiIpICU+JQogICMgRmFyZWJuw6kgenbDvXJhem5lbmllIHbDvXpuYW1ub3N0aSAoSW50ZXJ2ZW5jaWEgbmFkIDk1JSkKICBjb2x1bW5fc3BlYyg1LCAKICAgICAgICAgICAgICBjb2xvciA9IGlmZWxzZSh0aWR5X291dHB1dCRwLnZhbHVlIDwgMC4wNSwgIndoaXRlIiwgImJsYWNrIiksCiAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZSh0aWR5X291dHB1dCRwLnZhbHVlIDwgMC4wNSwgIiMzZDg1YzYiLCAiI2UwNjY2NiIpKQoKY2F0KCJcblxuIyMjIENlbGtvdsOpIMWgdGF0aXN0aWt5IE1vZGVsdVxuIikKCmdsYW5jZV9vdXRwdXQgJT4lCiAgc2VsZWN0KHIuc3F1YXJlZCwgYWRqLnIuc3F1YXJlZCwgc3RhdGlzdGljLCBwLnZhbHVlLCBkZikgJT4lCiAgbXV0YXRlKHAudmFsdWUgPSBzY2FsZXM6OnB2YWx1ZShwLnZhbHVlLCBhY2N1cmFjeSA9IDAuMDAwMSkpICU+JQogIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gcm91bmQoLngsIDQpKSkgJT4lCiAgcmVuYW1lKAogICAgYFIta3ZhZHLDoXRgID0gci5zcXVhcmVkLAogICAgYEFkai4gUi1rdmFkcsOhdGAgPSBhZGouci5zcXVhcmVkLAogICAgYEYtaG9kbm90YWAgPSBzdGF0aXN0aWMsCiAgICBgcC1ob2Rub3RhIEYtdGVzdHVgID0gcC52YWx1ZSwKICAgIGBTdHVwbmUgdm/Evm5vc3RpYCA9IGRmCiAgKSAlPiUKICBrYWJsZShjYXB0aW9uID0gIkNlbGtvdsOpIMWgdGF0aXN0aWt5IEZpdCBNb2RlbHUiLCBmb3JtYXQgPSAiaHRtbCIpICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgIGZ1bGxfd2lkdGggPSBGCiAgKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikKYGBgCgpaYSDDusSNZWxvbSBtZXJhbmlhIMSNYXNvdsOpaG8gdHJlbmR1IEluZGV4dSDFocWlYXN0aWEgbmEgU2xvdmVuc2t1IHNvbSBwb3XFvmlsYSBsaW5lw6FybnUgcmVncmVzaXUuIFMgZXh0csOpbW5lIHZ5c29rb3UgRi1ob2Rub3RvdSA0Mi40MDMgYSBwLWhvZG5vdG91IDwwLjAwMDEgcG90dnJkenVqZSBtb2RlbCBzaWxuw7ogYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DuiB6w6F2aXNsb3PFpSBvZCDEjWFzdS4gS29lZmljaWVudCAwLjA2NDYgem5hbWVuw6EsIMW+ZSBzIGthxb5kw71tIHByaWLDumRhasO6Y2ltIHJva29tIHNhIEluZGV4IMWhxaVhc3RpYSB6dnnFoXVqZSB2IHByaWVtZXJlIHByaWJsacW+bmUgbyAwLjA2NSBib2R1LiBNb2RlbCBqZSB2ZcS+bWkgc2lsbsO9LCBrZcSPxb5lIGHFviA3OS40JSBjZWxrb3ZlaiB2YXJpYWJpbGl0eSDFocWlYXN0aWEgamUgw7pzcGXFoW5lIHZ5c3ZldGxlbsO9Y2ggcGx5bnV0w61tIMSNYXN1LgoKCgoKIyMjIExpbmXDoXJuYSByZWdyZXNpYSAtIMWgdGVkcm9zxaUKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShzY2FsZXMpIAoKbW9kZWxfZ2VuZXJvc2l0eSA8LSBsbSgKICBHZW5lcm9zaXR5IH4gWWVhciwgCiAgZGF0YSA9IGRhdGFfc2xvdmFraWEKKQoKY29lZi50YmwgPC0gdGlkeShtb2RlbF9nZW5lcm9zaXR5LCBjb25mLmludCA9IFRSVUUpICU+JQogIG11dGF0ZSgKICAgIHRlcm0gPSByZWNvZGUodGVybSwKICAgICAgIihJbnRlcmNlcHQpIiA9ICJJbnRlcmNlcGNpZSIsCiAgICAgICJZZWFyIiA9ICJSb2siCiAgICApLAogICAgc3RhcnMgPSBjYXNlX3doZW4oCiAgICAgIHAudmFsdWUgPCAwLjAwMSB+ICIqKioiLAogICAgICBwLnZhbHVlIDwgMC4wMSB+ICIqKiIsCiAgICAgIHAudmFsdWUgPCAwLjA1IH4gIioiLAogICAgICBwLnZhbHVlIDwgMC4xIH4gIsK3IiwKICAgICAgVFJVRSB+ICIiCiAgICApCiAgKSAlPiUKICB0cmFuc211dGUoCiAgICBUZXJtID0gdGVybSwKICAgIEVzdGltYXRlID0gZXN0aW1hdGUsCiAgICBgU3RkLiBFcnJvcmAgPSBzdGQuZXJyb3IsCiAgICBgdCB2YWx1ZWAgPSBzdGF0aXN0aWMsCiAgICBgcCB2YWx1ZWAgPSBwLnZhbHVlLAogICAgIyBGb3Jtw6F0b3ZhbmllIDk1JSBrb25maWRlbsSNbsOpaG8gaW50ZXJ2YWx1CiAgICBgOTUlIENJYCA9IHN0cl9jKCJbIiwgcm91bmQoY29uZi5sb3csIDMpLCAiLCAiLCByb3VuZChjb25mLmhpZ2gsIDMpLCAiXSIpLAogICAgU2lnID0gc3RhcnMKICApCgpjb2VmLnRibCAlPiUKICBrYWJsZSgKICAgIGRpZ2l0cyA9IDMsCiAgICBjYXB0aW9uID0gIlJlZ3Jlc27DqSBrb2VmaWNpZW50eSAoR2VuZXJvc2l0eSB+IFJvaykiCiAgKSAlPiUKICBrYWJsZV9zdHlsaW5nKAogICAgZnVsbF93aWR0aCA9IEZBTFNFLAogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpCiAgKSAlPiUKICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkgJT4lCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiI2YyZjJmMiIpICU+JQogIGZvb3Rub3RlKAogICAgZ2VuZXJhbCA9ICJTaWduaWYuIGNvZGVzOiAqKiogcDwwLjAwMSwgKiogcDwwLjAxLCAqIHA8MC4wNSwgwrcgcDwwLjEuIiwKICAgIHRocmVlcGFydHRhYmxlID0gVFJVRQogICkKCmZpdC50YmwgPC0gZ2xhbmNlKG1vZGVsX2dlbmVyb3NpdHkpICU+JQogIHRyYW5zbXV0ZSgKICAgIGBSLXNxdWFyZWRgID0gci5zcXVhcmVkLAogICAgYEFkai4gUi1zcXVhcmVkYCA9IGFkai5yLnNxdWFyZWQsCiAgICBgRi1zdGF0aXN0aWNgID0gc3RhdGlzdGljLAogICAgYEYgcC12YWx1ZWAgPSBwLnZhbHVlLAogICAgYEFJQ2AgPSBBSUMsCiAgICBgQklDYCA9IEJJQywKICAgIGBOdW0uIG9icy5gID0gbm9icwogICkKCmZpdC50YmwgJT4lCiAga2FibGUoZGlnaXRzID0gNCwgY2FwdGlvbiA9ICLFoHRhdGlzdGlreSBmaXR1IExpbmXDoXJuZWhvIFJlZ3Jlc27DqWhvIE1vZGVsdSIpICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoImNvbmRlbnNlZCIsICJob3ZlciIpCiAgKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikKYGBgClRlbnRva3LDoXQgc29tIHYgcsOhbWNpIGxpbmXDoXJuZWogcmVncmVzaWUgYW5hbHl6b3ZhbGEsIMSNaSBzYSDDunJvdmXFiCDFoXRlZHJvc3RpIG5hIFNsb3ZlbnNrdSBtZW5pbGEgdiDEjWFzZS4gTW9kZWwgamUgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSwgxI1vIHZ5cGzDvXZhIHogdmXEvm1pIHZ5c29rZWogcC1ob2Rub3R5IEYtdGVzdHUgKDAuNzg0OSkuIEtvZWZpY2llbnQgcHJlIHByZW1lbm7DuiBSb2sgamUgLTAuMDAxLCBzIHZ5c29rb3UgcC1ob2Rub3RvdSAwLjc4NSwga3RvcsOhIHByZXNhaHVqZSBwcmFoIDAsMDUsIMSNbyB6bmFtZW7DoSwgxb5lIG5lYm9sIHppc3RlbsO9IMW+aWFkbnkgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gdHJlbmQgem1lbnkgxaF0ZWRyb3N0aS4gUi1rdmFkcsOhdCBzIGhvZG5vdG91IDAuMDA3MSAobWVuZWogYWtvIDElKSBwb3R2cmR6dWplLCDFvmUgxI1hcywgYWtvIHRha8O9LCB0YWttZXIgdsO0YmVjIG5ldnlzdmV0xL51amUgdmFyaWFiaWxpdHUgdiDFoXRlZHJvc3RpLiBOYSB6w6FrbGFkZSB0w71jaHRvIHbDvXNsZWRrb3YgamUgesOhdmVyLCDFvmUgw7pyb3ZlxYggxaF0ZWRyb3N0aSBuYSBTbG92ZW5za3UgdiBzbGVkb3Zhbm9tIG9iZG9iw60gem9zdGFsYSB2IHByaWVtZXJlIHN0YWJpbG7DoSBhIG5lem1lbmlsYSBzYS4KCgoKCiMjIyBMaW5lw6FybmEgcmVncmVzaWEgLSBMb2cgSERQIG5hIG9ieXZhdGXEvmEKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShzY2FsZXMpIAoKbW9kZWxfZ2RwIDwtIGxtKAogIGBMb2cgR0RQIHBlciBjYXBpdGFgIH4gWWVhciwgCiAgZGF0YSA9IGRhdGFfc2xvdmFraWEKKQoKY29lZi50YmwgPC0gdGlkeShtb2RlbF9nZHAsIGNvbmYuaW50ID0gVFJVRSkgJT4lCiAgbXV0YXRlKAogICAgdGVybSA9IHJlY29kZSh0ZXJtLAogICAgICAiKEludGVyY2VwdCkiID0gIkludGVyY2VwY2llIiwKICAgICAgIlllYXIiID0gIlJvayIKICAgICksCiAgICBzdGFycyA9IGNhc2Vfd2hlbigKICAgICAgcC52YWx1ZSA8IDAuMDAxIH4gIioqKiIsCiAgICAgIHAudmFsdWUgPCAwLjAxIH4gIioqIiwKICAgICAgcC52YWx1ZSA8IDAuMDUgfiAiKiIsCiAgICAgIHAudmFsdWUgPCAwLjEgfiAiwrciLAogICAgICBUUlVFIH4gIiIKICAgICkKICApICU+JQogIHRyYW5zbXV0ZSgKICAgIFRlcm0gPSB0ZXJtLAogICAgRXN0aW1hdGUgPSBlc3RpbWF0ZSwKICAgIGBTdGQuIEVycm9yYCA9IHN0ZC5lcnJvciwKICAgIGB0IHZhbHVlYCA9IHN0YXRpc3RpYywKICAgIGBwIHZhbHVlYCA9IHAudmFsdWUsCiAgICAjIEZvcm3DoXRvdmFuaWUgOTUlIGtvbmZpZGVuxI1uw6lobyBpbnRlcnZhbHUKICAgIGA5NSUgQ0lgID0gc3RyX2MoIlsiLCByb3VuZChjb25mLmxvdywgMyksICIsICIsIHJvdW5kKGNvbmYuaGlnaCwgMyksICJdIiksCiAgICBTaWcgPSBzdGFycwogICkKCmNvZWYudGJsICU+JQogIGthYmxlKAogICAgZGlnaXRzID0gMywKICAgIGNhcHRpb24gPSAiUmVncmVzbsOpIGtvZWZpY2llbnR5IChMb2cgR0RQIHBlciBjYXBpdGEgfiBSb2spIgogICkgJT4lCiAga2FibGVfc3R5bGluZygKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKQogICkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKICBmb290bm90ZSgKICAgIGdlbmVyYWwgPSAiU2lnbmlmLiBjb2RlczogKioqIHA8MC4wMDEsICoqIHA8MC4wMSwgKiBwPDAuMDUsIMK3IHA8MC4xLiIsCiAgICB0aHJlZXBhcnR0YWJsZSA9IFRSVUUKICApCgpmaXQudGJsIDwtIGdsYW5jZShtb2RlbF9nZHApICU+JQogIHRyYW5zbXV0ZSgKICAgIGBSLXNxdWFyZWRgID0gci5zcXVhcmVkLAogICAgYEFkai4gUi1zcXVhcmVkYCA9IGFkai5yLnNxdWFyZWQsCiAgICBgRi1zdGF0aXN0aWNgID0gc3RhdGlzdGljLAogICAgYEYgcC12YWx1ZWAgPSBwLnZhbHVlLAogICAgYEFJQ2AgPSBBSUMsCiAgICBgQklDYCA9IEJJQywKICAgIGBOdW0uIG9icy5gID0gbm9icwogICkKCmZpdC50YmwgJT4lCiAga2FibGUoZGlnaXRzID0gNCwgY2FwdGlvbiA9ICLFoHRhdGlzdGlreSBmaXR1IExpbmXDoXJuZWhvIFJlZ3Jlc27DqWhvIE1vZGVsdSIpICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoImNvbmRlbnNlZCIsICJob3ZlciIpCiAgKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikKYGBgCkxvZyBHRFAgcGVyIGNhcGl0YSBqZSBsb2dhcml0bXVzIGhydWLDqWhvIGRvbcOhY2VobyBwcm9kdWt0dSBuYSBvYnl2YXRlxL5hLCDEjW8gamUgxaF0YW5kYXJkbsO9IGVrb25vbWlja8O9IHVrYXpvdmF0ZcS+IHVwcmF2ZW7DvSBwcmUgw7rEjWVseSDFoXRhdGlzdGlja2VqIGFuYWzDvXp5LiBWIHRvbXRvIHByw61wYWRlIHNvbSBhbmFseXpvdmFsYSDEjWFzb3bDvSB0cmVuZCBla29ub21pY2tlaiDDunJvdm5lIG5hIFNsb3ZlbnNrdSwgcyBSLWt2YWRyw6F0b20gMC45NDI1LCDEjW8gbmF6bmHEjXVqZSwgxb5lIGHFviA5NC4yNSUgem1lbnkgTG9nIEhEUCBqZSB2eXN2ZXRsZW7DvWNoIHNhbW90bsO9bSDEjWFzb20uIEV4dHLDqW1uZSB2eXNva8OhIEYtaG9kbm90YSAxODAuMzcgcyBwLWhvZG5vdG91IGJsw616a28gbnVsZSBwb3R2cmR6dWplIGV4aXN0ZW5jaXUgc2lsbsOpaG8gYSB2eXNva28gxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6lobyByYXN0w7pjZWhvIHRyZW5kdSB2IGVrb25vbWlrZS4gS29ua3LDqXRuZSwga29lZmljaWVudCAwLjAyNCB1ZMOhdmEsIMW+ZSBMb2cgSERQIG5hIG9ieXZhdGXEvmEgc2EgdiBwcmllbWVyZSB6dnnFoW92YWwgbyAwLjAyNCBib2R1IHphIGthxb5kw70gcm9rIHNsZWRvdmFuw6lobyBvYmRvYmlhLiBUaWV0byB2w71zbGVka3kgamFzbmUgc3ZlZMSNaWEgbyBzdGFiaWxub20gYSBkeW5hbWlja29tIGVrb25vbWlja29tIHJhc3RlIFNsb3ZlbnNrYS4KCgojIEhlYXRtYXAga29yZWxhxI1uZWogbWF0aWNlCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCgpkYXRhX2NvcnIgPC0gZGF0YV9zbG92YWtpYSAlPiUKICBzZWxlY3QoCiAgICBgTGlmZSBMYWRkZXJgLAogICAgYExvZyBHRFAgcGVyIGNhcGl0YWAsCiAgICBHZW5lcm9zaXR5LAogICAgWWVhcgogICkgJT4lCiAgbmEub21pdCgpIAoKTSA8LSBjb3IoZGF0YV9jb3JyLCBtZXRob2QgPSAicGVhcnNvbiIpCgpwYXIobWZyb3cgPSBjKDEsIDEpLCBtYXIgPSBjKDEsIDEsIDEsIDEpKSAKCmNvcnJwbG90KE0sIAogICAgICAgICBtZXRob2QgPSAiY29sb3IiLCAgICAgICAgICAgICAgICAgCiAgICAgICAgIHR5cGUgPSAidXBwZXIiLCAgICAgICAgICAgICAgICAgICAKICAgICAgICAgb3JkZXIgPSAib3JpZ2luYWwiLCAgICAgICAgICAgICAgIAogICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsICAgICAgICAgICAgCiAgICAgICAgIHRsLmNvbCA9ICJibGFjayIsICAgICAgICAgICAgICAgICAjIEZhcmJhIHBvcGlzaWVrIChuw6F6dm92IHByZW1lbm7DvWNoKQogICAgICAgICB0bC5zcnQgPSA0NSwgICAgICAgICAgICAgICAgICAgICAgIyBPdG/EjWVuaWUgcG9waXNpZWsgcHJlIGxlcMWhaXUgxI1pdGF0ZcS+bm9zxaUKICAgICAgICAgZGlhZyA9IEZBTFNFLCAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIGNvbCA9IGJyZXdlci5wYWwobiA9IDgsIG5hbWUgPSAiUmRZbEJ1IikgIyBGYXJlYm7DoSBzY2jDqW1hICjEjWVydmVuw6Etxb5sdMOhLW1vZHLDoSkKICAgICAgICAgKQoKIyBQcmlkYW5pZSB0aXR1bGt1IGsgZ3JhZnUKdGl0bGUoIkhlYXRtYXAga29yZWxhxI1uZWogbWF0aWNlIHByZSBrxL7DusSNb3bDqSBwcmVtZW5uw6kgKFNsb3ZlbnNrbykiLCBsaW5lID0gMywgY2V4Lm1haW4gPSAxLjIpCmBgYAoKSGVhdG1hcCBrb3JlbGHEjW5laiBtYXRpY2UgemFoxZXFiGEgcHJlbWVubsOpIExpZmUgTGFkZGVyLCBMb2cgR0RQIHBlciBjYXBpdGEsIEdlbmVyb3NpdHkgYSBZZWFyLCBhYnkgdml6dcOhbG5lIHpocm51bGEgaWNoIHZ6w6Fqb21uw6kgdnrFpWFoeS4gTmFqdnnFocWhaWEga29yZWzDoWNpYSAoMC45NykgbWVkemkgTG9nIEdEUCBwZXIgY2FwaXRhIGEgWWVhciBkZW1vbsWhdHJ1amUgZXh0csOpbW5lIHNpbG7DvSwgdGFrbWVyIHBlcmZla3Ruw70gbGluZcOhcm55IHJhc3QgZWtvbm9taWNrZWogw7pyb3ZuZS4gTmFqbmnFvsWhaWEga29yZWzDoWNpYSAoLTAuMTgpLCBtZWR6aSBMb2cgR0RQIHBlciBjYXBpdGEgYSBHZW5lcm9zaXR5LCB2IHByYXhpIHpuYW1lbsOhIHZlxL5taSBzbGFiw70gbmVnYXTDrXZueSB2esWlYWguIENlbGtvdm8gYW5hbMO9emEgcG90dnJkenVqZSwgxb5lIGhsYXZuw71tIG1vdG9yb20gcmFzdHUgxaHFpWFzdGlhIGplIHByw6F2ZSBzaWxuw70gZWtvbm9taWNrw70gcm96dm9qICh2eXNva8OhIHBveml0w612bmEga29yZWzDoWNpYSkuCg==