S využitím databázy World Happiness Report 2005-2021 database.

Úvod do problému

Predmetom tejto empirickej analýzy je štúdium Dôvery v národnú vládu (Confidence in national government) na Slovensku počas sledovaného obdobia, s využitím dát z databázy World Happiness Report. Dôvera v inštitúcie je kľúčovým indikátorom sociálnej súdržnosti a kvality správy vecí verejných. Mojím cieľom je identifikovať, ktoré faktory z ponuky dostupných dát majú štatisticky významný vplyv na kolísanie dôvery občanov v národnú vládu.

Rozhodla sme sa modelovať Dôveru v národnú vládu (Confidence) v závislosti od troch kľúčových vysvetľujúcich premenných: Vnímanie korupcie (Perceptions of corruption), Sloboda voľby (Freedom to make life choices) a Sociálna podpora (Social support).

Stanovenie hypotéz

Jednotlivé hypotézy o smere vplyvu sú nasledovné:

  1. Korupcia:
  1. Sloboda:
  1. Sociálna podpora:

Príprava databázy, čistenie a úprava údajov

Rovnako ako v prípade predošlej úlohy, aj v tomto prípade pracujem s údajmi výhradne pre Slovenskú republiku, takže v následujúcom kroku si vyfiltrujem konkrétne hodnoty zvolených premenných pre túto krajinu.

library(dplyr)
library(knitr)

# Načítanie dát
wh_data <- read.csv("World Happiness Report 2005-2021.csv", sep = ",", dec = ".", header = TRUE)

# Filtrovanie a výber premenných
data_slovakia <- wh_data %>%
  filter(Country.name == "Slovakia") %>%
  select(Confidence.in.national.government,
         Perceptions.of.corruption,
         Freedom.to.make.life.choices,
         Social.support)

# Zobrazenie tabuľky
kable(data_slovakia, caption = "Údaje pre Slovensko")
Údaje pre Slovensko
Confidence.in.national.government Perceptions.of.corruption Freedom.to.make.life.choices Social.support
0.1630792 0.9457313 0.5424797 0.9535792
0.3086795 0.9071360 0.6357577 0.9196400
0.2787239 0.9071323 0.7271631 0.9172934
0.3683802 0.9065322 0.6200043 0.9257514
0.2834932 0.9145399 0.5979358 0.9093785
0.3101815 0.9138702 0.6347917 0.9242427
0.2765307 0.9275451 0.5871577 0.9434537
0.3722222 0.9166092 0.7000985 0.9451791
0.3416801 0.9204227 0.7142247 0.9133866
0.3276586 0.9099447 0.7576340 0.9223787
0.2309728 0.9258467 0.7711216 0.9330883
0.3074445 0.9005337 0.7618966 0.9541600
0.2158076 0.8955466 0.7415332 0.9511639

Následne premenujem stĺpce pre jednoduchšiu prácu a imputujem chýbajúce hodnoty (NA) v každom stĺpci pomocou mediánu, čím zabezpečím, že regresný model bude môcť použiť maximálny počet pozorovaní.

wh_data <- read.csv("World Happiness Report 2005-2021.csv", sep = ",", dec = ".", header = TRUE)

data_slovakia <- wh_data %>%
  filter(`Country.name` == "Slovakia") %>%
  select(`Confidence.in.national.government`, `Perceptions.of.corruption`, `Freedom.to.make.life.choices`, `Social.support`)

# Premenovanie stĺpcov pre jednoduchšiu prácu
colnames(data_slovakia) <- c("Confidence", "Corruption", "Freedom", "Support")

# Imputácia chýbajúcich hodnôt mediánom
column_medians <- sapply(data_slovakia, median, na.rm = TRUE)
for (col in names(data_slovakia)) {
  data_slovakia[[col]][is.na(data_slovakia[[col]])] <- column_medians[col]
}

Ďalej si pre každú premennú vygenerujem boxplot za účelom overenia prípadných nezrovnalostí (konkrétne výskytu odľahlých hodnôt, tzv. outliers).

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

# Vykreslenie boxplotov pre každú premennú
for (col in names(data_slovakia)) {
  boxplot(data_slovakia[[col]],
          main = col,
          xlab = "Hodnota",
          col = "lightblue",
          border = "darkblue")
}

# Nadpis pre všetky grafy
mtext("Boxploty jednotlivých premenných (Slovensko)", outer = TRUE, cex = 1.4, font = 2)

# Resetovanie rozloženia na 1 graf
par(mfrow = c(1, 1))

Vizualizácia rozdelenia hodnôt pomocou boxplotov mi jasne ukázala, že v prípade dvoch premenných, konkrétne Confidence (Dôvera vo vládu) a Corruption (Vnímanie korupcie), mám prítomné odľahlé hodnoty. Tieto extrémy musím teraz odstrániť, pretože ich ponechanie v dátach by mohlo skresliť odhadované regresné koeficienty a vážne oslabiť spoľahlivosť celého môjho lineárneho modelu.

remove_outliers <- function(x) {
  q1 <- quantile(x, 0.25, na.rm = TRUE)
  q3 <- quantile(x, 0.75, na.rm = TRUE)
  iqr <- q3 - q1
  lower <- q1 - 1.5 * iqr
  upper <- q3 + 1.5 * iqr
  x[x < lower | x > upper] <- NA
  return(x)
}
# Aplikácia na všetky stĺpce
data_slovakia_clean <- data_slovakia %>%
  mutate(
    Confidence = remove_outliers(Confidence),
    Corruption = remove_outliers(Corruption),
    Freedom    = remove_outliers(Freedom),
    Support    = remove_outliers(Support)
  )

Ďalej som odstránila všetky riadky, v ktorých po odstránení odľahlých hodnôt zostala aspoň jedna chýbajúca hodnota (NA), čím zabezpečím, že môj regresný model bude pracovať len s kompletnými a čistými pozorovaniami.

data_slovakia_clean <- na.omit(data_slovakia_clean)

Po všetkých vyššie uvedených korekciách nasleduje opätovná vizualizácia všetkých 4 boxplotov.

par(mfrow = c(2, 2))
for (col in names(data_slovakia_clean)) {
  boxplot(data_slovakia_clean[[col]],
          main = col,
          xlab = "Hodnota",
          col = "lightblue",
          border = "darkblue")
}
par(mfrow = c(1, 1))

Možno konštatovať, že vizuálna kontrola potvrdila úspešné odstránenie odľahlých hodnôt.

Lineárna regresia

model <- lm(Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)

summary(model)

Call:
lm(formula = Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.070286 -0.031902 -0.003962  0.032197  0.081032 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   1.0501     2.0948   0.501    0.630
Corruption   -0.1748     1.7882  -0.098    0.925
Freedom      -0.1348     0.2596  -0.519    0.618
Support      -0.5335     1.1512  -0.463    0.655

Residual standard error: 0.05442 on 8 degrees of freedom
Multiple R-squared:  0.07889,   Adjusted R-squared:  -0.2665 
F-statistic: 0.2284 on 3 and 8 DF,  p-value: 0.8741

Tento výstup mi zobrazil súhrn modelu a potvrdil, že žiadna z mojich pracovných hypotéz nebola splnená, pretože Korupcia, Sloboda a Sociálna podpora spoločne nevedia významne vysvetliť Dôveru vo vládu. Tento záver je podložený extrémne vysokou p-hodnotou F-testu (\(0.8741\)), čo znamená, že model ako celok je štatisticky nevýznamný. Navyše, R-kvadrát s hodnotou len \(0.0789\) ukazuje, že môj model dokáže vysvetliť iba \(8\%\) variability Dôvery vo vládu. Zistila som, že žiadna z premenných nie je významná a dokonca Sloboda vyšla s neočakávaným negatívnym znamienkom, hoci to nie je štatisticky podstatné.

model <- lm(Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)

print("Odhadnuté koeficienty sú:")
[1] "Odhadnuté koeficienty sú:"
print(model$coefficients)
(Intercept)  Corruption     Freedom     Support 
  1.0500560  -0.1748333  -0.1348024  -0.5334834 
print("Odhadnuté rezíduá:")
[1] "Odhadnuté rezíduá:"
print(model$residuals)
           2            3            4            5            6            7            8 
-0.006464541 -0.025350999  0.054267282 -0.040929199 -0.001459967 -0.028892390  0.081032297 
           9           10           11           12           13 
 0.036100442  0.030895885 -0.055478171  0.026565799 -0.070286437 
print("Vyrovnané hodnoty vysvetľovanej premennej sú:")
[1] "Vyrovnané hodnoty vysvetľovanej premennej sú:"
print(model$fitted.values)
        2         3         4         5         6         7         8         9        10        11 
0.3151441 0.3040749 0.3141129 0.3244224 0.3116415 0.3054231 0.2911899 0.3055796 0.2967627 0.2864510 
       12        13 
0.2808787 0.2860940 
print("Matica modelu X:")
[1] "Matica modelu X:"
X <- model.matrix(model)
print(X)
   (Intercept) Corruption   Freedom   Support
2            1  0.9071360 0.6357577 0.9196400
3            1  0.9071323 0.7271631 0.9172934
4            1  0.9065322 0.6200043 0.9257514
5            1  0.9145399 0.5979358 0.9093785
6            1  0.9138702 0.6347917 0.9242427
7            1  0.9275451 0.5871577 0.9434537
8            1  0.9166092 0.7000985 0.9451791
9            1  0.9204227 0.7142247 0.9133866
10           1  0.9099447 0.7576340 0.9223787
11           1  0.9258467 0.7711216 0.9330883
12           1  0.9005337 0.7618966 0.9541600
13           1  0.8955466 0.7415332 0.9511639
attr(,"assign")
[1] 0 1 2 3
print("Diagonála hat-matrix (vplyv jednotlivých pozorovaní):")
[1] "Diagonála hat-matrix (vplyv jednotlivých pozorovaní):"
print(diag(X %*% solve(t(X) %*% X) %*% t(X)))
        2         3         4         5         6         7         8         9        10        11 
0.2176273 0.2451038 0.2432431 0.3365416 0.1397919 0.6657322 0.2203391 0.3060035 0.2481669 0.5207307 
       12        13 
0.4035421 0.4531777 
# Súhrnný výstup modelu
summary(model)

Call:
lm(formula = Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.070286 -0.031902 -0.003962  0.032197  0.081032 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   1.0501     2.0948   0.501    0.630
Corruption   -0.1748     1.7882  -0.098    0.925
Freedom      -0.1348     0.2596  -0.519    0.618
Support      -0.5335     1.1512  -0.463    0.655

Residual standard error: 0.05442 on 8 degrees of freedom
Multiple R-squared:  0.07889,   Adjusted R-squared:  -0.2665 
F-statistic: 0.2284 on 3 and 8 DF,  p-value: 0.8741

V druhom kroku som si “vyžiadala” detaily o vnútornej štruktúre modelu, aby som preverila jeho metodologickú kvalitu. Zistila som, že reziduá sú veľmi malé, čo je dobré. Najdôležitejšie je však to, že kontrola pomocou diagonály hat-matrix potvrdila, že žiadne jednotlivé pozorovanie nemá neprimerane veľký vplyv na výpočet koeficientov. To je kľúčové zistenie, pretože aj keď je môj model celkovo neúspešný vo vysvetľovaní Dôvery, môžem s istotou tvrdiť, že jeho odhady sú spoľahlivé a nie sú skreslené chybami ani extrémnymi dátovými bodmi.

par(mfrow = c(2, 2))

plot(model)

# Resetovanie rozloženia na 1 graf
par(mfrow = c(1, 1))

Residuals vs. Fitted

Tento graf vizuálne potvrdzuje splnenie predpokladu linearity a homoskedasticity pre môj model. To znamená, že body sú rozptýlené pomerne rovnomerne okolo nulovej horizontálnej osi a táto os je navyše takmer rovná. To naznačuje, že vzťah medzi mojimi prediktormi (Korupcia, Sloboda, Podpora) a Dôverou vo vládu nie je zásadne zakrivený a že chyby modelu sú rozložené konzistentne.V praxi to znamená, že neexistuje žiadny dôkaz, že by sa dôvera vo vládu začala pri určitom bode (napr. pri veľmi nízkej korupcii) správať nelineárne, ako napríklad prudko stúpať namiesto pomalého rastu.

Q-Q plot

Tento graf vizuálne preveruje normálne rozdelenie reziduí, čo je kľúčový predpoklad pre spoľahlivosť \(t\)-testov a \(F\)-testu v OLS regresii. Vzhľadom na to, že môj \(F\)-test už ukázal nevýznamnosť, tento graf kontroluje kvalitu odhadov. Vizuálne možno konštatovať odchýlku od normality, pretože body na chvostoch distribúcie (extrémy) sa viditeľne vzdialili od teoretickej diagonálnej čiary, čo indikuje, že distribúcia chýb môjho modelu má ťažšie chvosty (fat tails). Z tohto dôvodu je kriticky dôležité spustiť následný Jarque-Bera test, aby sme štatisticky zistili, či je táto vizuálna abnormalita natoľko závažná, že by definitívne potvrdila neschopnosť modelu spoľahlivo robiť akékoľvek závery.

Scale location plot

Tento graf slúži na definitívne overenie homoskedasticity, teda predpokladu konštantného rozptylu chýb. Môžem potvrdiť splnenie tohto kľúčového predpokladu, pretože červená os je takmer úplne plochá a body nevykazujú žiaden zjavný lievikovitý tvar, čo by signalizovalo problém.

V praxi to pre môj model Dôvery vo vládu znamená, že spoľahlivosť chýb modelu je rovnaká bez ohľadu na to, akú úroveň Dôvery predikujem. Inak povedané, model je rovnako spoľahlivý (alebo rovnako zlý) v predpovedi pre roky s nízkou Dôverou (ľavá strana) ako aj pre roky s vyššou Dôverou (pravá strana).

Hoci je celkový rozptyl konštantný, je možné vidieť jemný náznak lievikovitého tvaru v extrémnych prípadoch. Ak by sa táto odchýlka potvrdila, mohlo by to byť spôsobené tým, že chyba modelu je väčšia pri extrémne nízkych hodnotách Dôvery, napríklad v krízových rokoch, kde je Dôvera nízka, no politická reakcia je nepredvídateľná. Keďže je ale táto odchýlka minimálna, možno ju ignorovať a považovať predpoklad za splnený.

Residuals vs Leverage

Tento graf slúži na finálnu kontrolu dát, presnejšie na identifikáciu vplyvných pozorovaní (bodov s vysokou pákou), ktoré by mohli ovplyvniť regresnú čiaru. S potešením konštatujem, že žiaden dátový bod nemá extrémne vysokú páku ani vplyv na výpočet koeficientov, pretože žiaden bod neprekročil Cútove vzdialenosti (červené prerušované čiary \(0.5\) a \(1\)). Týmto sa definitívne potvrdzuje robustnosť môjho modelu. Hoci som outliers z boxplotov odstránila už predtým, tento graf mi dáva istotu, že v dátach nezostal žiaden skrytý vplyvný bod, a môžem tvrdiť, že aj napriek nevýznamnosti \(F\)-testu neboli koeficienty skreslené žiadnym jednotlivým rokom.

# Test normality reziduí
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
jb_test

    Jarque Bera Test

data:  residuals
X-squared = 0.56427, df = 2, p-value = 0.7542
# Test odľahlých hodnôt (Bonferroni korekcia)
outlier_test <- outlierTest(model)
outlier_test
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:

Jarque-Bera test overuje predpoklad, či sú chyby môjho modelu (reziduá) normálne rozdelené. Tento predpoklad je splnený, pretože výsledná p-hodnota \(0.7542\) je oveľa vyššia ako kritická hodnota \(0.05\). Preto môžem tvrdiť, že aj napriek vizuálnej miernej odchýlke v Q-Q grafe, sú moje reziduá štatisticky normálne rozdelené, čo zabezpečuje spoľahlivosť \(t\)-testov koeficientov (hoci vyšli nevýznamné).

Bonferroniho korekcia slúži na definitívne potvrdenie čistoty dát po tom, čo som už manuálne odstránila outliers z boxplotov. Výstup “No Studentized residuals with Bonferroni p < 0.05” je kľúčový a znamená, že v mojom modeli nezostal žiadny štatisticky významný outlier, ktorý by mohol pokaziť výsledky. Hoci mi R vypísalo najpodozrivejšie pozorovanie (s ID \(13\)), jeho Bonferroni p-hodnota (\(0.91663\)) je extrémne vysoká, čo potvrdzuje, že to nie je problém. Vďaka tomuto testu môžem s istotou tvrdiť, že aj keď môj celkový regresný model vyšiel štatisticky nevýznamný, viem, že táto nevýznamnosť nebola spôsobená nečistými dátami. Inými slovami, model nefunguje kvôli povahe premenných, a nie kvôli zlej dátovej príprave.

Nižšie je súhrn všetkého, čo som v rámci tejto kapitoly interpretovala:

summary(model)

Call:
lm(formula = Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.070286 -0.031902 -0.003962  0.032197  0.081032 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   1.0501     2.0948   0.501    0.630
Corruption   -0.1748     1.7882  -0.098    0.925
Freedom      -0.1348     0.2596  -0.519    0.618
Support      -0.5335     1.1512  -0.463    0.655

Residual standard error: 0.05442 on 8 degrees of freedom
Multiple R-squared:  0.07889,   Adjusted R-squared:  -0.2665 
F-statistic: 0.2284 on 3 and 8 DF,  p-value: 0.8741
par(mfrow = c(2, 2))

plot(model)

mtext("Diagnostické grafy regresného modelu: Dôvera vo vládu (Slovensko)", 
      outer = TRUE, cex = 1.2, font = 2, line = -1.5) 

par(mfrow = c(1, 1))


library(tseries) # Pre Jarque-Bera test
library(car)     # Pre outlierTest

print("--- TEST NORMALITY REZIDUÍ (Jarque-Bera test) ---")
[1] "--- TEST NORMALITY REZIDUÍ (Jarque-Bera test) ---"
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
print(jb_test)

    Jarque Bera Test

data:  residuals
X-squared = 0.56427, df = 2, p-value = 0.7542
print("--- TEST ODĽAHLÝCH HODNÔT (Outlier Test) ---")
[1] "--- TEST ODĽAHLÝCH HODNÔT (Outlier Test) ---"
outlier_test <- outlierTest(model)
print(outlier_test)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:

Záver

Hlavným výsledkom analýzy je, že žiadna z mojich pracovných hypotéz nebola potvrdená. Celý regresný model je štatisticky nevýznamný (p-hodnota F-testu je \(0.8741\)), čo znamená, že tri zvolené premenné spoločne nedokážu významne vysvetliť zmeny v Dôvere vo vládu. Navyše, extrémne nízky \(R\)-kvadrát (\(0.0789\)) potvrdil, že model vysvetľuje len necelých \(8\%\) variability Dôvery.

Hoci koeficient Korupcie vyšiel s očakávaným negatívnym znamienkom (\(-0.1748\)) a koeficient Slobody vyšiel negatívne (\(-0.1348\)) v rozpore s očakávaním, žiaden z týchto vplyvov nebol štatisticky významný.

Napriek štatistickej nevýznamnosti modelu bola celá analýza metodologicky robustná a dátový súbor bol dokonale čistý. Potvrdili to nasledovné zistenia:

  • Normalita a homoskedasticita: Štatistický Jarque-Bera test (p-hodnota \(0.7542\)) potvrdil, že reziduá sú normálne rozdelené, a vizualizácia Scale-Location grafu potvrdila konštantný rozptyl chýb.

  • Čistota Dát: Bonferroniho korekcia a Outlier Test definitívne potvrdili, že v dátovom súbore nezostal žiadny štatisticky významný outlier. Rovnako graf Residuals vs. Leverage potvrdil, že koeficienty neboli skreslené žiadnym vplyvným pozorovaním.

Na záver môžem s istotou konštatovať, že zlyhanie modelu nebolo spôsobené chybami v dátach ani v metodike spracovania, ale skutočnosťou, že Dôvera vo vládu na Slovensku nie je štatisticky ovplyvnená faktormi Vnímanie korupcie, Sloboda voľby a Sociálna podpora v rámci daného časového radu. Budúca analýza by sa mala zamerať na odlišné, pravdepodobne makroekonomické alebo politické, faktory.

Hoci by bol tento konkrétny model v praxi považovaný za zbytočný, keďže je štatisticky nevýznamný, no práve toto zistenie o neexistencii významného vzťahu medzi zvolenými sociálnymi faktormi a Dôverou vo vládu na Slovensku je samo o sebe cenným prínosom, ktorý presúva focus na hľadanie odlišných, v modeli nezahrnutých, vysvetľujúcich premenných.

Heteroskedasticita - CVIKO 7

Prítomnosť heteroskedasticity (nekonštantného rozptylu náhodnej zložky) je kritický problém, pretože by viedla k nesprávnemu vyhodnocovaniu \(t\)-testov významnosti regresných koeficientov. Preto je nevyhnutné, aby sme tento predpoklad dôkladne overili.

Aj keď sme už vizuálne preverili graf Scale-Location a zistili, že rozptyl je konštantný, je potrebné tento záver definitívne potvrdiť pre každú hlavnú vysvetľujúcu premennú a následne štatistickým testom.

Preto sa v tejto sekcii zameriam na nasledovné kroky:

  1. Vizuálna detekcia: Skúmanie závislosti štvorcov rezíduí od premenných Vnímanie korupcie a Sloboda voľby (pomocou grafov vygenerovaných v predošlom kroku). Týmto sa vizuálne uistím, že rozptyl chýb nie je závislý od hodnôt prediktorov.

  2. Štatistická detekcia: Použitie Breusch-Pagan testu na formálne potvrdenie, že homoskedasticita je v tomto modeli model splnená.

library(ggplot2)
library(patchwork)

p_corr <- ggplot(data_slovakia_clean, aes(x = Corruption, y = resid(model)^2)) +
  geom_point(alpha = 0.7, color = "darkblue") + # Zmena farby bodov
  geom_smooth(method = "lm", se = FALSE, color = "darkred", linetype = "dashed") + 
  labs(x = "Vnímanie korupcie (Corruption)",
       y = "Štvorcové reziduá (Squared Residuals)",
       title = "Reziduá vs. Korupcia") +
  theme_classic() 

p_free <- ggplot(data_slovakia_clean, aes(x = Freedom, y = resid(model)^2)) +
  geom_point(alpha = 0.7, color = "darkgreen") +
  geom_smooth(method = "lm", se = FALSE, color = "darkorange", linetype = "dotted") + 
  labs(x = "Sloboda voľby (Freedom)",
       y = "Štvorcové reziduá (Squared Residuals)",
       title = "Reziduá vs. Sloboda") +
  theme_classic()

# Spojenie grafov vedľa seba
p_corr + p_free

Tieto grafy slúžia na detailnú vizuálnu kontrolu homoskedasticity tým, že vykresľujú štvorcové reziduá modelu (mieru chyby) oproti dvom hlavným vysvetľujúcim premenným.

Graf 1: Reziduá vs. Vnímanie Korupcie

Tento graf ukazuje, ako sa mení rozptyl chýb nášho modelu v závislosti od úrovne vnímanej korupcie.

  • Chyba modelu: Body v grafe predstavujú druhú mocninu chyby (reziduum), ktorú tento model urobil pre každý jednotlivý rok. Vizuálne vidíme, že tieto body sú silne rozptýlené a ďaleko od nuly. To je priamym dôsledkom toho, že je tento regresný model je veľmi slabý (\(R^2 \approx 8\%\), ako som uvádzala už na začiatku regresnej analýzy) a robí veľké chyby pri predpovedi Dôvery vo vládu.

  • Interpretácia Červenej Čiary: Napriek veľkému rozptylu jednotlivých chýb je kľúčové, že červená prerušovaná čiara, ktorá ukazuje priemerný trend rozptylu, je úplne plochá. To potvrdzuje, že rozptyl chýb je konštantný – veľkosť chyby nie je systematicky závislá od úrovne korupcie.

Graf 2: Reziduá vs. Sloboda Voľby

Tento graf preveruje rovnaký predpoklad pre premennú Sloboda voľby.

  • Chyba modelu: Podobne ako pri korupcii, aj v tomto grafe je viditeľný veľký vertikálny rozptyl jednotlivých zelených bodov. To opäť potvrdzuje, že model má nízku prediktívnu silu.

  • Interpretácia Oranžovej Čiary: Oranžová bodkovaná čiara, ktorá mapuje priemerný trend rozptylu, je plochá a nemá žiaden sklon. To znamená, že chyba nášho modelu je rovnako veľká bez ohľadu na úroveň Slobody voľby, čím je splnený predpoklad konštantného rozptylu (homoskedasticity).

library(ggplot2)
library(patchwork)

data_slovakia_clean$log_Support <- log(data_slovakia_clean$Support)

p_log_supp <- ggplot(data_slovakia_clean, aes(x = log_Support, y = resid(model)^2)) +
  geom_point(alpha = 0.7, color = "purple") +
  geom_smooth(method = "lm", se = FALSE, color = "deeppink", linetype = "dotdash") + # Zmena štýlu čiary
  labs(x = "Log(Sociálna podpora)",
       y = "Štvorcové reziduá (Squared Residuals)",
       title = "Reziduá vs. Log(Sociálna podpora)") +
  theme_bw() 

p_free_log <- ggplot(data_slovakia_clean, aes(x = Freedom, y = resid(model)^2)) +
  geom_point(alpha = 0.7, color = "darkgreen") +
  geom_smooth(method = "lm", se = FALSE, color = "darkorange", linetype = "dashed") +
  labs(x = "Sloboda voľby (Freedom)",
       y = "Štvorcové reziduá (Squared Residuals)",
       title = "Reziduá vs. Sloboda") +
  theme_bw()

# Spojenie grafov vedľa seba
p_log_supp + p_free_log

Napriek tomu, že tento model splnil predpoklad homoskedasticity (vizuálne aj štatisticky), tento krok demonštruje postup, akým by sme heteroskedasticitu odstránili, ak by sa potvrdila.

Graf 1: Reziduá vs. Log(Sociálna podpora)

  • Pozorovanie trendu: Na grafe vidíme, že vyhladená ružová bodkovaná čiara je opäť horizontálna a nemá žiadny sklon. To potvrdzuje, že aj po logaritmickej transformácii premennej Sociálna podpora zostáva rozptyl chýb konštantný. Tento výsledok je v súlade s našimi predchádzajúcimi zisteniami, že pôvodný model už je homoskedastický a transformácia nebola nutná.

Graf 2: Reziduá vs. Sloboda Voľby

  • Pozorovanie trendu: Opakovanie vizualizácie pre Slobodu s použitím inej farebnej témy slúži len ako kontrolné porovnanie. Oranžová prerušovaná čiara je rovnako plochá. Všetky vizuálne kontroly teda súhlasia - model neobsahuje heteroskedasticitu.

Testovanie prítomnosti heteroskedasticity

Pred vykonaním Breusch-Pagan testu stanovujeme nasledujúce hypotézy o konštantnosti rozptylu chýb:

  • Nulová hypotéza (\(\boldsymbol{H}_{0}\)): Model je homoskedastický (rozptyl chýb je konštantný).

  • Alternatívna hypotéza (\(\boldsymbol{H}_{1}\)): Model je heteroskedastický (rozptyl chýb je nekonštantný).

library(lmtest)
bptest(model)

    studentized Breusch-Pagan test

data:  model
BP = 2.7629, df = 3, p-value = 0.4296

Keďže dosiahnutá \(p\)-hodnota (\(0.4296\)) je výrazne vyššia ako štandardná hladina významnosti \(\alpha = 0.05\), nulovú hypotézu nezamietame.

V praxi to znamená, že štandardné chyby regresných koeficientov sú spoľahlivo a korektne vypočítané. Homoskedasticita tak nie je príčinou štatistickej nevýznamnosti celého modelu (\(F\)-test \(p=0.8741\)), čím sa potvrdzuje metodologická korektnosť analýzy.

library(sandwich)
library(lmtest)
coeftest(model, vcov = vcovHC(model))

t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)
(Intercept)  1.05006    3.39223  0.3095   0.7648
Corruption  -0.17483    3.21853 -0.0543   0.9580
Freedom     -0.13480    0.36930 -0.3650   0.7246
Support     -0.53348    1.58773 -0.3360   0.7455

Aplikácia robustných štandardných chýb slúžila na overenie, či by prítomnosť prípadnej, hoci Breusch-Pagan testom nezistenej, heteroskedasticity zmenila naše závery o významnosti.

Výsledok testu potvrdzuje náš predchádzajúci nález: Všetky \(p\)-hodnoty sú aj po aplikácii robustných chýb (v rozsahu od \(0.7246\) do \(0.9580\)) výrazne vyššie ako hladina významnosti \(\alpha = 0.05\). V dôsledku toho hlavný záver zostáva nezmenený: ani jedna z vysvetľujúcich premenných (Vnímanie korupcie, Sloboda voľby, Sociálna podpora) nemá štatisticky významný vplyv na Dôveru vo vládu. Nakoľko sa robustné štandardné chyby nelíšia signifikantne od pôvodných, preukázali sme, že model je homoskedastický a robustný.

Záver

Cieľom tejto analýzy bolo preskúmať vplyv Korupcie, Slobody voľby a Sociálnej podpory na Dôveru vo vládu pomocou lineárnej regresie.

Štatistická analýza preukázala, že ani jeden z faktorov (Korupcia, Sloboda, Sociálna podpora) nemá štatisticky významný vplyv na Dôveru vo vládu v sledovanom období. Nízka vysvetľujúca sila modelu (\(R^2 \approx 8\%\)) potvrdila, že táto trojica premenných nedokáže predpovedať Dôveru vo vládu.

Aj napriek neúspechu modelu sme podrobne preverili jeho metodologickú kvalitu. Homoskedasticita (konštantný rozptyl chýb) bola splnená – vizuálne aj štatisticky (Breusch-Pagan \(p = 0.4296\)).

Splnenie homoskedasticity znamená, že chyba tohto modelu je rovnako veľká bez ohľadu na to, či meriame vplyv pri nízkej alebo vysokej Slobode voľby.

LS0tCnRpdGxlOiAiRWtvbm9tZXRyaWEgdiBSIC0gY3ZpxI1lbmllIDUiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IExpbmRhIEtha2Fzb3ZhCi0tLQoKUyB2eXXFvml0w61tIGRhdGFiw6F6eSBbV29ybGQgSGFwcGluZXNzIFJlcG9ydCAyMDA1LTIwMjFdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvamFoYWlkdWxpc2xhbS93b3JsZC1oYXBwaW5lc3MtcmVwb3J0LTIwMDUtMjAyMSkgZGF0YWJhc2UuCgojIMOadm9kIGRvIHByb2Jsw6ltdQpQcmVkbWV0b20gdGVqdG8gZW1waXJpY2tlaiBhbmFsw716eSBqZSDFoXTDumRpdW0gKipEw7R2ZXJ5IHYgbsOhcm9kbsO6IHZsw6FkdSoqICgqQ29uZmlkZW5jZSBpbiBuYXRpb25hbCBnb3Zlcm5tZW50KikgbmEgU2xvdmVuc2t1IHBvxI1hcyBzbGVkb3ZhbsOpaG8gb2Jkb2JpYSwgcyB2eXXFvml0w61tIGTDoXQgeiBkYXRhYsOhenkgPHU+IFdvcmxkIEhhcHBpbmVzcyBSZXBvcnQ8L3U+LiBEw7R2ZXJhIHYgaW7FoXRpdMO6Y2llIGplIGvEvsO6xI1vdsO9bSBpbmRpa8OhdG9yb20gc29jacOhbG5laiBzw7pkcsW+bm9zdGkgYSBrdmFsaXR5IHNwcsOhdnkgdmVjw60gdmVyZWpuw71jaC4gTW9qw61tIGNpZcS+b20gamUgaWRlbnRpZmlrb3ZhxaUsIGt0b3LDqSBmYWt0b3J5IHogcG9udWt5IGRvc3R1cG7DvWNoIGTDoXQgbWFqw7ogxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gdnBseXYgbmEga29sw61zYW5pZSBkw7R2ZXJ5IG9ixI1hbm92IHYgbsOhcm9kbsO6IHZsw6FkdS4KClJvemhvZGxhIHNtZSBzYSBtb2RlbG92YcWlICoqRMO0dmVydSB2IG7DoXJvZG7DuiB2bMOhZHUqKiAoKkNvbmZpZGVuY2UqKSB2IHrDoXZpc2xvc3RpIG9kIHRyb2NoIGvEvsO6xI1vdsO9Y2ggdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaDogKipWbsOtbWFuaWUga29ydXBjaWUqKiAoKlBlcmNlcHRpb25zIG9mIGNvcnJ1cHRpb24qKSwgKipTbG9ib2RhIHZvxL5ieSoqICgqRnJlZWRvbSB0byBtYWtlIGxpZmUgY2hvaWNlcyopIGEgKipTb2Npw6FsbmEgcG9kcG9yYSoqICgqU29jaWFsIHN1cHBvcnQqKS4KCiMgU3Rhbm92ZW5pZSBoeXBvdMOpeiAKSmVkbm90bGl2w6kgaHlwb3TDqXp5IG8gc21lcmUgdnBseXZ1IHPDuiBuYXNsZWRvdm7DqToKCjEuICoqS29ydXBjaWEqKjogCgoqIE51bG92w6EgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezB9JCk6IFZuw61tYW5pZSBrb3J1cGNpZSBuZW3DoSB2cGx5diBuYSBEw7R2ZXJ1IHZvIHZsw6FkdSAoJFxiZXRhX3tDb3JydXB0aW9ufSA9IDAkKS4KCiogQWx0ZXJuYXTDrXZuYSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MX0kKTogT8SNYWvDoXZhbWUgPHU+bmVnYXTDrXZueSB2cGx5djwvdT4gKCRcYmV0YV97Q29ycnVwdGlvbn0gPCAwJCksIMSNbyB6bmFtZW7DoSwgxb5lIHp2w73FoWVuw6kgdm7DrW1hbmllIGtvcnVwY2llIHZlZGllIGsgem7DrcW+ZW5pdSBkw7R2ZXJ5IHYgbsOhcm9kbsOpIGluxaF0aXTDumNpZS4KCjIuICoqU2xvYm9kYSoqOiAKCiogTnVsb3bDoSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MH0kKTogU2xvYm9kYSB2b8S+YnkgbmVtw6EgdnBseXYgbmEgRMO0dmVydSB2byB2bMOhZHUgKCRcYmV0YV97RnJlZWRvbX0gPSAwJCkuCgoqIEFsdGVybmF0w612bmEgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezF9JCk6IE/EjWFrw6F2YW1lIDx1PnBveml0w612bnkgdnBseXY8L3U+ICgkXGJldGFfe0ZyZWVkb219ID4gMCQpLCBrZGUgdnnFocWhw60gcG9jaXQgb3NvYm5laiBzbG9ib2R5IGJ5IG1hbCB2aWVzxaUgayB6dsO9xaFlbml1IGTDtHZlcnkgb2LEjWFub3YgdiBzeXN0w6ltLgoKMy4gKipTb2Npw6FsbmEgcG9kcG9yYSoqOiAKCiogTnVsb3bDoSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MH0kKTogU29jacOhbG5hIHBvZHBvcmEgbmVtw6EgdnBseXYgbmEgRMO0dmVydSB2byB2bMOhZHUgKCRcYmV0YV97U3VwcG9ydH0gPSAwJCkuCgoqIEFsdGVybmF0w612bmEgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezF9JCk6IE/EjWFrw6F2YW1lIDx1Pm5ldsO9em5hbW7DvSBhbGVibyBtaWVybmUgbmVnYXTDrXZueSB2cGx5djwvdT4gKCRcYmV0YV97U3VwcG9ydH0gXG5lcSAwJCksIGtlxI/FvmUgZMO0dmVyYSB2IG9zb2Juw7ogc29jacOhbG51IHNpZcWlIHByaWFtbyBuZXPDunZpc8OtIHMgZMO0dmVyb3UgdiBuw6Fyb2Ruw7ogdmzDoWR1LgoKCiMgUHLDrXByYXZhIGRhdGFiw6F6eSwgxI1pc3RlbmllIGEgw7pwcmF2YSDDumRham92ClJvdm5ha28gYWtvIHYgcHLDrXBhZGUgcHJlZG/FoWxlaiDDumxvaHksIGFqIHYgdG9tdG8gcHLDrXBhZGUgcHJhY3VqZW0gcyDDumRham1pIHbDvWhyYWRuZSBwcmUgU2xvdmVuc2vDuiByZXB1Ymxpa3UsIHRha8W+ZSB2IG7DoXNsZWR1asO6Y29tIGtyb2t1IHNpIHZ5ZmlsdHJ1amVtIGtvbmtyw6l0bmUgaG9kbm90eSB6dm9sZW7DvWNoIHByZW1lbm7DvWNoIHByZSB0w7p0byBrcmFqaW51LgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCgojIE5hxI3DrXRhbmllIGTDoXQKd2hfZGF0YSA8LSByZWFkLmNzdigiV29ybGQgSGFwcGluZXNzIFJlcG9ydCAyMDA1LTIwMjEuY3N2Iiwgc2VwID0gIiwiLCBkZWMgPSAiLiIsIGhlYWRlciA9IFRSVUUpCgojIEZpbHRyb3ZhbmllIGEgdsO9YmVyIHByZW1lbm7DvWNoCmRhdGFfc2xvdmFraWEgPC0gd2hfZGF0YSAlPiUKICBmaWx0ZXIoQ291bnRyeS5uYW1lID09ICJTbG92YWtpYSIpICU+JQogIHNlbGVjdChDb25maWRlbmNlLmluLm5hdGlvbmFsLmdvdmVybm1lbnQsCiAgICAgICAgIFBlcmNlcHRpb25zLm9mLmNvcnJ1cHRpb24sCiAgICAgICAgIEZyZWVkb20udG8ubWFrZS5saWZlLmNob2ljZXMsCiAgICAgICAgIFNvY2lhbC5zdXBwb3J0KQoKIyBab2JyYXplbmllIHRhYnXEvmt5CmthYmxlKGRhdGFfc2xvdmFraWEsIGNhcHRpb24gPSAiw5pkYWplIHByZSBTbG92ZW5za28iKQpgYGAKCk7DoXNsZWRuZSBwcmVtZW51amVtIHN0xLpwY2UgcHJlIGplZG5vZHVjaMWhaXUgcHLDoWN1IGEgaW1wdXR1amVtIGNow71iYWrDumNlIGhvZG5vdHkgKE5BKSB2IGthxb5kb20gc3TEunBjaSBwb21vY291IG1lZGnDoW51LCDEjcOtbSB6YWJlenBlxI3DrW0sIMW+ZSByZWdyZXNuw70gbW9kZWwgYnVkZSBtw7RjxaUgcG91xb5pxaUgbWF4aW3DoWxueSBwb8SNZXQgcG96b3JvdmFuw60uCgpgYGB7cn0Kd2hfZGF0YSA8LSByZWFkLmNzdigiV29ybGQgSGFwcGluZXNzIFJlcG9ydCAyMDA1LTIwMjEuY3N2Iiwgc2VwID0gIiwiLCBkZWMgPSAiLiIsIGhlYWRlciA9IFRSVUUpCgpkYXRhX3Nsb3Zha2lhIDwtIHdoX2RhdGEgJT4lCiAgZmlsdGVyKGBDb3VudHJ5Lm5hbWVgID09ICJTbG92YWtpYSIpICU+JQogIHNlbGVjdChgQ29uZmlkZW5jZS5pbi5uYXRpb25hbC5nb3Zlcm5tZW50YCwgYFBlcmNlcHRpb25zLm9mLmNvcnJ1cHRpb25gLCBgRnJlZWRvbS50by5tYWtlLmxpZmUuY2hvaWNlc2AsIGBTb2NpYWwuc3VwcG9ydGApCgojIFByZW1lbm92YW5pZSBzdMS6cGNvdiBwcmUgamVkbm9kdWNoxaFpdSBwcsOhY3UKY29sbmFtZXMoZGF0YV9zbG92YWtpYSkgPC0gYygiQ29uZmlkZW5jZSIsICJDb3JydXB0aW9uIiwgIkZyZWVkb20iLCAiU3VwcG9ydCIpCgojIEltcHV0w6FjaWEgY2jDvWJhasO6Y2ljaCBob2Ruw7R0IG1lZGnDoW5vbQpjb2x1bW5fbWVkaWFucyA8LSBzYXBwbHkoZGF0YV9zbG92YWtpYSwgbWVkaWFuLCBuYS5ybSA9IFRSVUUpCmZvciAoY29sIGluIG5hbWVzKGRhdGFfc2xvdmFraWEpKSB7CiAgZGF0YV9zbG92YWtpYVtbY29sXV1baXMubmEoZGF0YV9zbG92YWtpYVtbY29sXV0pXSA8LSBjb2x1bW5fbWVkaWFuc1tjb2xdCn0KYGBgCgoKCsSOYWxlaiBzaSBwcmUga2HFvmTDuiBwcmVtZW5uw7ogdnlnZW5lcnVqZW0gYm94cGxvdCB6YSDDusSNZWxvbSBvdmVyZW5pYSBwcsOtcGFkbsO9Y2ggbmV6cm92bmFsb3N0w60gKGtvbmtyw6l0bmUgdsO9c2t5dHUgb2TEvmFobMO9Y2ggaG9kbsO0dCwgdHp2LiBvdXRsaWVycykuCgpgYGB7cn0KcGFyKG1mcm93ID0gYygyLCAyKSkKcGFyKG1hciA9IGMoNCwgNCwgMiwgMSkpICAKCiMgVnlrcmVzbGVuaWUgYm94cGxvdG92IHByZSBrYcW+ZMO6IHByZW1lbm7Dugpmb3IgKGNvbCBpbiBuYW1lcyhkYXRhX3Nsb3Zha2lhKSkgewogIGJveHBsb3QoZGF0YV9zbG92YWtpYVtbY29sXV0sCiAgICAgICAgICBtYWluID0gY29sLAogICAgICAgICAgeGxhYiA9ICJIb2Rub3RhIiwKICAgICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLAogICAgICAgICAgYm9yZGVyID0gImRhcmtibHVlIikKfQoKIyBOYWRwaXMgcHJlIHbFoWV0a3kgZ3JhZnkKbXRleHQoIkJveHBsb3R5IGplZG5vdGxpdsO9Y2ggcHJlbWVubsO9Y2ggKFNsb3ZlbnNrbykiLCBvdXRlciA9IFRSVUUsIGNleCA9IDEuNCwgZm9udCA9IDIpCgojIFJlc2V0b3ZhbmllIHJvemxvxb5lbmlhIG5hIDEgZ3JhZgpwYXIobWZyb3cgPSBjKDEsIDEpKQpgYGAKClZpenVhbGl6w6FjaWEgcm96ZGVsZW5pYSBob2Ruw7R0IHBvbW9jb3UgYm94cGxvdG92IG1pIGphc25lIHVrw6F6YWxhLCDFvmUgdiBwcsOtcGFkZSBkdm9jaCBwcmVtZW5uw71jaCwga29ua3LDqXRuZSBDb25maWRlbmNlIChEw7R2ZXJhIHZvIHZsw6FkdSkgYSBDb3JydXB0aW9uIChWbsOtbWFuaWUga29ydXBjaWUpLCBtw6FtIHByw610b21uw6kgb2TEvmFobMOpIGhvZG5vdHkuIFRpZXRvIGV4dHLDqW15IG11c8OtbSB0ZXJheiBvZHN0csOhbmnFpSwgcHJldG/FvmUgaWNoIHBvbmVjaGFuaWUgdiBkw6F0YWNoIGJ5IG1vaGxvIHNrcmVzbGnFpSBvZGhhZG92YW7DqSByZWdyZXNuw6kga29lZmljaWVudHkgYSB2w6HFvm5lIG9zbGFiacWlIHNwb8S+YWhsaXZvc8WlIGNlbMOpaG8gbcO0amhvIGxpbmXDoXJuZWhvIG1vZGVsdS4KCmBgYHtyfQpyZW1vdmVfb3V0bGllcnMgPC0gZnVuY3Rpb24oeCkgewogIHExIDwtIHF1YW50aWxlKHgsIDAuMjUsIG5hLnJtID0gVFJVRSkKICBxMyA8LSBxdWFudGlsZSh4LCAwLjc1LCBuYS5ybSA9IFRSVUUpCiAgaXFyIDwtIHEzIC0gcTEKICBsb3dlciA8LSBxMSAtIDEuNSAqIGlxcgogIHVwcGVyIDwtIHEzICsgMS41ICogaXFyCiAgeFt4IDwgbG93ZXIgfCB4ID4gdXBwZXJdIDwtIE5BCiAgcmV0dXJuKHgpCn0KYGBgCgpgYGB7cn0KIyBBcGxpa8OhY2lhIG5hIHbFoWV0a3kgc3TEunBjZQpkYXRhX3Nsb3Zha2lhX2NsZWFuIDwtIGRhdGFfc2xvdmFraWEgJT4lCiAgbXV0YXRlKAogICAgQ29uZmlkZW5jZSA9IHJlbW92ZV9vdXRsaWVycyhDb25maWRlbmNlKSwKICAgIENvcnJ1cHRpb24gPSByZW1vdmVfb3V0bGllcnMoQ29ycnVwdGlvbiksCiAgICBGcmVlZG9tICAgID0gcmVtb3ZlX291dGxpZXJzKEZyZWVkb20pLAogICAgU3VwcG9ydCAgICA9IHJlbW92ZV9vdXRsaWVycyhTdXBwb3J0KQogICkKYGBgCgrEjmFsZWogc29tIG9kc3Ryw6FuaWxhIHbFoWV0a3kgcmlhZGt5LCB2IGt0b3LDvWNoIHBvIG9kc3Ryw6FuZW7DrSBvZMS+YWhsw71jaCBob2Ruw7R0IHpvc3RhbGEgYXNwb8WIIGplZG5hIGNow71iYWrDumNhIGhvZG5vdGEgKE5BKSwgxI3DrW0gemFiZXpwZcSNw61tLCDFvmUgbcO0aiByZWdyZXNuw70gbW9kZWwgYnVkZSBwcmFjb3ZhxaUgbGVuIHMga29tcGxldG7DvW1pIGEgxI1pc3TDvW1pIHBvem9yb3ZhbmlhbWkuCgpgYGB7cn0KZGF0YV9zbG92YWtpYV9jbGVhbiA8LSBuYS5vbWl0KGRhdGFfc2xvdmFraWFfY2xlYW4pCmBgYAoKUG8gdsWhZXRrw71jaCB2ecWhxaFpZSB1dmVkZW7DvWNoIGtvcmVrY2nDoWNoIG5hc2xlZHVqZSBvcMOkdG92bsOhIHZpenVhbGl6w6FjaWEgdsWhZXRrw71jaCA0IGJveHBsb3Rvdi4KYGBge3J9CnBhcihtZnJvdyA9IGMoMiwgMikpCmZvciAoY29sIGluIG5hbWVzKGRhdGFfc2xvdmFraWFfY2xlYW4pKSB7CiAgYm94cGxvdChkYXRhX3Nsb3Zha2lhX2NsZWFuW1tjb2xdXSwKICAgICAgICAgIG1haW4gPSBjb2wsCiAgICAgICAgICB4bGFiID0gIkhvZG5vdGEiLAogICAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgICBib3JkZXIgPSAiZGFya2JsdWUiKQp9CnBhcihtZnJvdyA9IGMoMSwgMSkpCmBgYApNb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lIHZpenXDoWxuYSBrb250cm9sYSBwb3R2cmRpbGEgw7pzcGXFoW7DqSBvZHN0csOhbmVuaWUgb2TEvmFobMO9Y2ggaG9kbsO0dC4KCiogKipDb25maWRlbmNlKiogKCpEw7R2ZXJhIHZvIHZsw6FkdSopOiBNZWRpw6FuIGTDtHZlcnkgc2EgbmFjaMOhZHphIG5hIGhvZG5vdGUgJDAuMjUkLCDEjW8gbmF6bmHEjXVqZSBkbGhvZG9ibyBuw616a3UgcHJpZW1lcm7DuiAodiBwb3Jvdm5hbsOtIHMgb3N0YXRuw71taSBob2Rub3RhbWkpIGTDtHZlcnUgdiBuw6Fyb2Ruw7ogdmzDoWR1LiBOYXByaWVrIMSNaXN0ZW5pdSBkw6F0IGplIHRvIG5hanZpYWMgcm96cHTDvWxlbsOhIHByZW1lbm7DoSwgxI1vIHBvdHZyZHp1amUgbmFqZGxoxaHDrSB2ZXJ0aWvDoWxueSByb3pzYWggamVkbm90bGl2w71jaCDDunNlxI1pZWsgYSBib3h1IHpvIHbFoWV0a8O9Y2ggxaF0eXJvY2ggZ3JhZm92LiBUbyB6bmFtZW7DoSwgxb5lIGTDtHZlcmEgb2LEjWFub3Ygdm8gdmzDoWR1IGplIHBvxI1hcyByb2tvdiB2ZcS+bWkgbmVzdMOhbGEgYSBrb2zDrXNhdsOhLgoKKiAqKkNvcnJ1cHRpb24qKiAoKlZuw61tYW5pZSBrb3J1cGNpZSopOiBNZWRpw6FuIHNhIHBvaHlidWplIG9rb2xvICQwLjg5NSQsIMSNbyBqZSB2ZcS+bWkgYmzDrXprbyBob3JuZWogaHJhbmljZSAoMS4wKS4gVG8gaWx1c3RydWplLCDFvmUgdm7DrW1hbmllIGtvcnVwY2llIGplIG5hIFNsb3ZlbnNrdSBjaHJvbmlja3kgdnlzb2vDqSBhIHRha21lciB2IGthxb5kb20gc2xlZG92YW5vbSByb2t1IGJvbG8gdm7DrW1hbsOpIGFrbyB2w6HFvm55IHByb2Jsw6ltLgoKKiAqKkZyZWVkb20qKiAoKlNsb2JvZGEgdm/EvmJ5Kik6IE1lZGnDoW4gamUgbmEgaG9kbm90ZSAkMC42MCQsIMSNbyB6bmHEjcOtLCDFvmUgcHJpZW1lcm7DvSBwb2NpdCBzbG9ib2R5IHZvxL5ieSBqZSBsZW4gbWllcm5lIG5hZCBuZXV0csOhbG55bSBzdHJlZG9tICgkMC41MCQpLiBLcsOhdGt5IHJvenNhaCBmw7p6b3YgYSBib3h1IHBvdHZyZHp1amUsIMW+ZSB2bsOtbWFuaWUgc2xvYm9keSBqZSBzdGFiaWxuw6kgYSB2IMSNYXNlIHNhIHbDvXJhem5lIG5lbWVuw60sIG5vIHZ6aMS+YWRvbSBuYSB2eXNva8OpIHNrw7NyZSBvc3RhdG7DvWNoIHNrw7ptYW7DvWNoIHByZW1lbsO9Y2ggamUgdMOhdG8gaG9kbm90YSByZWxhdMOtdm5lIG7DrXprYSwgxI1vIG5hem5hxI11amUgenJldGXEvm7DvSBwcmllc3RvciBwcmUgemxlcMWhZW5pZSB2IHRvbSwgYWtvIG9ieXZhdGVsaWEgdm7DrW1hasO6IHN2b2p1IG9zb2Juw7ogc2xvYm9kdS4KCiogKipTdXBwb3J0KiogKCpTb2Npw6FsbmEgcG9kcG9yYSopOiBUw6F0byBwcmVtZW5uw6EgcyBtZWRpw6Fub20gbmEgaG9kbm90ZSAkMC45MSQgamUgbmFqa29uY2VudHJvdmFuZWrFoWlhLCB0LmouIHMgbmFqa3JhdMWhw61tIGJveG9tIGEgZsO6emFtaS4gVWthenVqZSB0bywgxb5lIHZuw61tYW7DoSBzb2Npw6FsbmEgcG9kcG9yYSAoc3BvbGllaGFuaWUgc2EgbmEgcHJpYXRlxL5vdi9yb2RpbnUpIGplIG5hIFNsb3ZlbnNrdSBleHRyw6ltbmUgc3RhYmlsbsOhIGEgdmXEvm1pIHZ5c29rw6EsIMSNbyBpbHVzdHJ1amUgc2lsbsO6IGEgc3BvxL5haGxpdsO6IG9zb2Juw7ogc29jacOhbG51IHNpZcWlLgoKIyMgTGluZcOhcm5hIHJlZ3Jlc2lhCgpgYGB7cn0KbW9kZWwgPC0gbG0oQ29uZmlkZW5jZSB+IENvcnJ1cHRpb24gKyBGcmVlZG9tICsgU3VwcG9ydCwgZGF0YSA9IGRhdGFfc2xvdmFraWFfY2xlYW4pCgpzdW1tYXJ5KG1vZGVsKQpgYGAKVGVudG8gdsO9c3R1cCBtaSB6b2JyYXppbCBzw7pocm4gbW9kZWx1IGEgcG90dnJkaWwsIMW+ZSAqxb5pYWRuYSB6IG1vamljaCBwcmFjb3Zuw71jaCBoeXBvdMOpeiBuZWJvbGEgc3BsbmVuw6EqLCBwcmV0b8W+ZSBLb3J1cGNpYSwgU2xvYm9kYSBhIFNvY2nDoWxuYSBwb2Rwb3JhIHNwb2xvxI1uZSBuZXZlZGlhIHbDvXpuYW1uZSB2eXN2ZXRsacWlIETDtHZlcnUgdm8gdmzDoWR1LiBUZW50byB6w6F2ZXIgamUgcG9kbG/FvmVuw70gZXh0csOpbW5lICp2eXNva291IHAtaG9kbm90b3UgRi10ZXN0dSAoJDAuODc0MSQpKiwgxI1vIHpuYW1lbsOhLCDFvmUgKiptb2RlbCBha28gY2Vsb2sgamUgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSoqLiBOYXZ5xaFlLCBSLWt2YWRyw6F0IHMgaG9kbm90b3UgbGVuICQwLjA3ODkkIHVrYXp1amUsIMW+ZSBtw7RqIG1vZGVsIGRva8Ohxb5lIHZ5c3ZldGxpxaUgaWJhICQ4XCUkIHZhcmlhYmlsaXR5IETDtHZlcnkgdm8gdmzDoWR1LiBaaXN0aWxhIHNvbSwgxb5lIMW+aWFkbmEgeiBwcmVtZW5uw71jaCBuaWUgamUgdsO9em5hbW7DoSBhIGRva29uY2EgU2xvYm9kYSB2ecWhbGEgcyBuZW/EjWFrw6F2YW7DvW0gbmVnYXTDrXZueW0gem5hbWllbmtvbSwgaG9jaSB0byBuaWUgamUgxaF0YXRpc3RpY2t5IHBvZHN0YXRuw6kuCgpgYGB7cn0KbW9kZWwgPC0gbG0oQ29uZmlkZW5jZSB+IENvcnJ1cHRpb24gKyBGcmVlZG9tICsgU3VwcG9ydCwgZGF0YSA9IGRhdGFfc2xvdmFraWFfY2xlYW4pCgpwcmludCgiT2RoYWRudXTDqSBrb2VmaWNpZW50eSBzw7o6IikKcHJpbnQobW9kZWwkY29lZmZpY2llbnRzKQoKcHJpbnQoIk9kaGFkbnV0w6kgcmV6w61kdcOhOiIpCnByaW50KG1vZGVsJHJlc2lkdWFscykKCnByaW50KCJWeXJvdm5hbsOpIGhvZG5vdHkgdnlzdmV0xL5vdmFuZWogcHJlbWVubmVqIHPDujoiKQpwcmludChtb2RlbCRmaXR0ZWQudmFsdWVzKQoKcHJpbnQoIk1hdGljYSBtb2RlbHUgWDoiKQpYIDwtIG1vZGVsLm1hdHJpeChtb2RlbCkKcHJpbnQoWCkKCnByaW50KCJEaWFnb27DoWxhIGhhdC1tYXRyaXggKHZwbHl2IGplZG5vdGxpdsO9Y2ggcG96b3JvdmFuw60pOiIpCnByaW50KGRpYWcoWCAlKiUgc29sdmUodChYKSAlKiUgWCkgJSolIHQoWCkpKQoKIyBTw7pocm5uw70gdsO9c3R1cCBtb2RlbHUKc3VtbWFyeShtb2RlbCkKYGBgClYgZHJ1aG9tIGtyb2t1IHNvbSBzaSAidnnFvmlhZGFsYSIgZGV0YWlseSBvIHZuw7p0b3JuZWogxaF0cnVrdMO6cmUgbW9kZWx1LCBhYnkgc29tIHByZXZlcmlsYSBqZWhvIG1ldG9kb2xvZ2lja8O6IGt2YWxpdHUuIFppc3RpbGEgc29tLCDFvmUgcmV6aWR1w6Egc8O6IHZlxL5taSBtYWzDqSwgxI1vIGplIGRvYnLDqS4gTmFqZMO0bGXFvml0ZWrFoWllIGplIHbFoWFrIHRvLCDFvmUga29udHJvbGEgcG9tb2NvdSBkaWFnb27DoWx5IGhhdC1tYXRyaXggcG90dnJkaWxhLCDFvmUgKsW+aWFkbmUgamVkbm90bGl2w6kgcG96b3JvdmFuaWUgbmVtw6EgbmVwcmltZXJhbmUgdmXEvmvDvSB2cGx5diBuYSB2w71wb8SNZXQga29lZmljaWVudG92Ki4gVG8gamUga8S+w7rEjW92w6kgemlzdGVuaWUsIHByZXRvxb5lIGFqIGtlxI8gamUgbcO0aiBtb2RlbCBjZWxrb3ZvIG5lw7pzcGXFoW7DvSB2byB2eXN2ZXTEvm92YW7DrSBEw7R2ZXJ5LCBtw7TFvmVtIHMgaXN0b3RvdSB0dnJkacWlLCDFvmUgamVobyAqKm9kaGFkeSBzw7ogc3BvxL5haGxpdsOpIGEgbmllIHPDuiBza3Jlc2xlbsOpIGNoeWJhbWkgYW5pIGV4dHLDqW1ueW1pIGTDoXRvdsO9bWkgYm9kbWkqKi4KCgpgYGB7cn0KcGFyKG1mcm93ID0gYygyLCAyKSkKCnBsb3QobW9kZWwpCgojIFJlc2V0b3ZhbmllIHJvemxvxb5lbmlhIG5hIDEgZ3JhZgpwYXIobWZyb3cgPSBjKDEsIDEpKQpgYGAKCiMjIFJlc2lkdWFscyB2cy4gRml0dGVkClRlbnRvIGdyYWYgdml6dcOhbG5lIHBvdHZyZHp1amUgc3BsbmVuaWUgcHJlZHBva2xhZHUgbGluZWFyaXR5IGEgaG9tb3NrZWRhc3RpY2l0eSBwcmUgbcO0aiBtb2RlbC4gVG8gem5hbWVuw6EsIMW+ZSBib2R5IHPDuiByb3pwdMO9bGVuw6kgcG9tZXJuZSByb3Zub21lcm5lIG9rb2xvIG51bG92ZWogaG9yaXpvbnTDoWxuZWogb3NpIGEgdMOhdG8gb3MgamUgbmF2ecWhZSB0YWttZXIgcm92bsOhLiBUbyBuYXpuYcSNdWplLCDFvmUgdnrFpWFoIG1lZHppIG1vamltaSBwcmVkaWt0b3JtaSAoS29ydXBjaWEsIFNsb2JvZGEsIFBvZHBvcmEpIGEgRMO0dmVyb3Ugdm8gdmzDoWR1IG5pZSBqZSB6w6FzYWRuZSB6YWtyaXZlbsO9IGEgxb5lIGNoeWJ5IG1vZGVsdSBzw7ogcm96bG/FvmVuw6kga29uemlzdGVudG5lLlYgcHJheGkgdG8gem5hbWVuw6EsIMW+ZSBuZWV4aXN0dWplIMW+aWFkbnkgZMO0a2F6LCDFvmUgYnkgc2EgZMO0dmVyYSB2byB2bMOhZHUgemHEjWFsYSBwcmkgdXLEjWl0b20gYm9kZSAobmFwci4gcHJpIHZlxL5taSBuw616a2VqIGtvcnVwY2lpKSBzcHLDoXZhxaUgbmVsaW5lw6FybmUsIGFrbyBuYXByw61rbGFkIHBydWRrbyBzdMO6cGHFpSBuYW1pZXN0byBwb21hbMOpaG8gcmFzdHUuCgoKIyMgUS1RIHBsb3QKVGVudG8gZ3JhZiB2aXp1w6FsbmUgcHJldmVydWplIG5vcm3DoWxuZSByb3pkZWxlbmllIHJlemlkdcOtLCDEjW8gamUga8S+w7rEjW92w70gcHJlZHBva2xhZCBwcmUgc3BvxL5haGxpdm9zxaUgJHQkLXRlc3RvdiBhICRGJC10ZXN0dSB2IE9MUyByZWdyZXNpaS4gVnpoxL5hZG9tIG5hIHRvLCDFvmUgbcO0aiAkRiQtdGVzdCB1xb4gdWvDoXphbCBuZXbDvXpuYW1ub3PFpSwgdGVudG8gZ3JhZiBrb250cm9sdWplIGt2YWxpdHUgb2RoYWRvdi4gVml6dcOhbG5lIG1vxb5ubyBrb27FoXRhdG92YcWlIG9kY2jDvWxrdSBvZCBub3JtYWxpdHksIHByZXRvxb5lIGJvZHkgbmEgY2h2b3N0b2NoIGRpc3RyaWLDumNpZSAoZXh0csOpbXkpIHNhIHZpZGl0ZcS+bmUgdnpkaWFsaWxpIG9kIHRlb3JldGlja2VqIGRpYWdvbsOhbG5laiDEjWlhcnksIMSNbyBpbmRpa3VqZSwgxb5lIGRpc3RyaWLDumNpYSBjaMO9YiBtw7RqaG8gbW9kZWx1IG3DoSDFpWHFvsWhaWUgY2h2b3N0eSAoZmF0IHRhaWxzKS4gWiB0b2h0byBkw7R2b2R1IGplIGtyaXRpY2t5IGTDtGxlxb5pdMOpIHNwdXN0acWlIG7DoXNsZWRuw70gSmFycXVlLUJlcmEgdGVzdCwgYWJ5IHNtZSDFoXRhdGlzdGlja3kgemlzdGlsaSwgxI1pIGplIHTDoXRvIHZpenXDoWxuYSBhYm5vcm1hbGl0YSBuYXRvxL5rbyB6w6F2YcW+bsOhLCDFvmUgYnkgZGVmaW5pdMOtdm5lIHBvdHZyZGlsYSBuZXNjaG9wbm9zxaUgbW9kZWx1IHNwb8S+YWhsaXZvIHJvYmnFpSBha8Opa2/EvnZlayB6w6F2ZXJ5LgoKCiMjIFNjYWxlIGxvY2F0aW9uIHBsb3QKVGVudG8gZ3JhZiBzbMO6xb5pIG5hIGRlZmluaXTDrXZuZSBvdmVyZW5pZSBob21vc2tlZGFzdGljaXR5LCB0ZWRhIHByZWRwb2tsYWR1IGtvbsWhdGFudG7DqWhvIHJvenB0eWx1IGNow71iLiBNw7TFvmVtIHBvdHZyZGnFpSBzcGxuZW5pZSB0b2h0byBrxL7DusSNb3bDqWhvIHByZWRwb2tsYWR1LCBwcmV0b8W+ZSDEjWVydmVuw6Egb3MgamUgdGFrbWVyIMO6cGxuZSBwbG9jaMOhIGEgYm9keSBuZXZ5a2F6dWrDuiDFvmlhZGVuIHpqYXZuw70gbGlldmlrb3ZpdMO9IHR2YXIsIMSNbyBieSBzaWduYWxpem92YWxvIHByb2Jsw6ltLgoKViBwcmF4aSB0byBwcmUgbcO0aiBtb2RlbCBEw7R2ZXJ5IHZvIHZsw6FkdSB6bmFtZW7DoSwgxb5lIHNwb8S+YWhsaXZvc8WlIGNow71iIG1vZGVsdSBqZSByb3ZuYWvDoSBiZXogb2jEvmFkdSBuYSB0bywgYWvDuiDDunJvdmXFiCBEw7R2ZXJ5IHByZWRpa3VqZW0uIEluYWsgcG92ZWRhbsOpLCBtb2RlbCBqZSByb3ZuYWtvIHNwb8S+YWhsaXbDvSAoYWxlYm8gcm92bmFrbyB6bMO9KSB2IHByZWRwb3ZlZGkgcHJlIHJva3kgcyBuw616a291IETDtHZlcm91ICjEvmF2w6Egc3RyYW5hKSBha28gYWogcHJlIHJva3kgcyB2ecWhxaFvdSBEw7R2ZXJvdSAocHJhdsOhIHN0cmFuYSkuCgpIb2NpIGplIGNlbGtvdsO9IHJvenB0eWwga29uxaF0YW50bsO9LCBqZSBtb8W+bsOpIHZpZGllxaUgamVtbsO9IG7DoXpuYWsgbGlldmlrb3ZpdMOpaG8gdHZhcnUgdiBleHRyw6ltbnljaCBwcsOtcGFkb2NoLiBBayBieSBzYSB0w6F0byBvZGNow71sa2EgcG90dnJkaWxhLCBtb2hsbyBieSB0byBiecWlIHNww7Rzb2JlbsOpIHTDvW0sIMW+ZSBjaHliYSBtb2RlbHUgamUgdsOkxI3FoWlhIHByaSBleHRyw6ltbmUgbsOtemt5Y2ggaG9kbm90w6FjaCBEw7R2ZXJ5LCBuYXByw61rbGFkIHYga3LDrXpvdsO9Y2ggcm9rb2NoLCBrZGUgamUgRMO0dmVyYSBuw616a2EsIG5vIHBvbGl0aWNrw6EgcmVha2NpYSBqZSBuZXByZWR2w61kYXRlxL5uw6EuIEtlxI/FvmUgamUgYWxlIHTDoXRvIG9kY2jDvWxrYSBtaW5pbcOhbG5hLCBtb8W+bm8ganUgaWdub3JvdmHFpSBhIHBvdmHFvm92YcWlIHByZWRwb2tsYWQgemEgc3BsbmVuw70uCgoKIyMgUmVzaWR1YWxzIHZzIExldmVyYWdlClRlbnRvIGdyYWYgc2zDusW+aSBuYSBmaW7DoWxudSBrb250cm9sdSBkw6F0LCBwcmVzbmVqxaFpZSBuYSBpZGVudGlmaWvDoWNpdSB2cGx5dm7DvWNoIHBvem9yb3ZhbsOtIChib2RvdiBzIHZ5c29rb3UgcMOha291KSwga3RvcsOpIGJ5IG1vaGxpIG92cGx5dm5pxaUgcmVncmVzbsO6IMSNaWFydS4gUyBwb3RlxaFlbsOtbSBrb27FoXRhdHVqZW0sIMW+ZSDFvmlhZGVuIGTDoXRvdsO9IGJvZCBuZW3DoSBleHRyw6ltbmUgdnlzb2vDuiBww6FrdSBhbmkgdnBseXYgbmEgdsO9cG/EjWV0IGtvZWZpY2llbnRvdiwgcHJldG/FvmUgxb5pYWRlbiBib2QgbmVwcmVrcm/EjWlsIEPDunRvdmUgdnpkaWFsZW5vc3RpICjEjWVydmVuw6kgcHJlcnXFoW92YW7DqSDEjWlhcnkgJDAuNSQgYSAkMSQpLiBUw71tdG8gc2EgZGVmaW5pdMOtdm5lIHBvdHZyZHp1amUgcm9idXN0bm9zxaUgbcO0amhvIG1vZGVsdS4gSG9jaSBzb20gb3V0bGllcnMgeiBib3hwbG90b3Ygb2RzdHLDoW5pbGEgdcW+IHByZWR0w71tLCB0ZW50byBncmFmIG1pIGTDoXZhIGlzdG90dSwgxb5lIHYgZMOhdGFjaCBuZXpvc3RhbCDFvmlhZGVuIHNrcnl0w70gdnBseXZuw70gYm9kLCBhIG3DtMW+ZW0gdHZyZGnFpSwgxb5lIGFqIG5hcHJpZWsgbmV2w716bmFtbm9zdGkgJEYkLXRlc3R1IG5lYm9saSBrb2VmaWNpZW50eSBza3Jlc2xlbsOpIMW+aWFkbnltIGplZG5vdGxpdsO9bSByb2tvbS4KCgpgYGB7cn0KIyBUZXN0IG5vcm1hbGl0eSByZXppZHXDrQpyZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG1vZGVsKQpqYl90ZXN0IDwtIGphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKQpqYl90ZXN0CgojIFRlc3Qgb2TEvmFobMO9Y2ggaG9kbsO0dCAoQm9uZmVycm9uaSBrb3Jla2NpYSkKb3V0bGllcl90ZXN0IDwtIG91dGxpZXJUZXN0KG1vZGVsKQpvdXRsaWVyX3Rlc3QKYGBgCioqSmFycXVlLUJlcmEgdGVzdCoqIG92ZXJ1amUgcHJlZHBva2xhZCwgxI1pIHPDuiBjaHlieSBtw7RqaG8gbW9kZWx1IChyZXppZHXDoSkgbm9ybcOhbG5lIHJvemRlbGVuw6kuIFRlbnRvIHByZWRwb2tsYWQgamUgc3BsbmVuw70sIHByZXRvxb5lIHbDvXNsZWRuw6EgcC1ob2Rub3RhICQwLjc1NDIkIGplIG92ZcS+YSB2ecWhxaFpYSBha28ga3JpdGlja8OhIGhvZG5vdGEgJDAuMDUkLiBQcmV0byBtw7TFvmVtIHR2cmRpxaUsIMW+ZSBhaiBuYXByaWVrIHZpenXDoWxuZWogbWllcm5laiBvZGNow71sa2UgdiBRLVEgZ3JhZmUsIHPDuiBtb2plIHJlemlkdcOhIMWhdGF0aXN0aWNreSBub3Jtw6FsbmUgcm96ZGVsZW7DqSwgxI1vIHphYmV6cGXEjXVqZSBzcG/EvmFobGl2b3PFpSAkdCQtdGVzdG92IGtvZWZpY2llbnRvdiAoaG9jaSB2ecWhbGkgbmV2w716bmFtbsOpKS4KCioqQm9uZmVycm9uaWhvIGtvcmVrY2lhKiogc2zDusW+aSBuYSBkZWZpbml0w612bmUgcG90dnJkZW5pZSDEjWlzdG90eSBkw6F0IHBvIHRvbSwgxI1vIHNvbSB1xb4gbWFudcOhbG5lIG9kc3Ryw6FuaWxhIG91dGxpZXJzIHogYm94cGxvdG92LiBWw71zdHVwICoiTm8gU3R1ZGVudGl6ZWQgcmVzaWR1YWxzIHdpdGggQm9uZmVycm9uaSBwIDwgMC4wNSIqIGplIGvEvsO6xI1vdsO9IGEgem5hbWVuw6EsIMW+ZSB2IG1vam9tIG1vZGVsaSBuZXpvc3RhbCDFvmlhZG55IMWhdGF0aXN0aWNreSB2w716bmFtbsO9IG91dGxpZXIsIGt0b3LDvSBieSBtb2hvbCBwb2themnFpSB2w71zbGVka3kuIEhvY2kgbWkgUiB2eXDDrXNhbG8gbmFqcG9kb3pyaXZlasWhaWUgcG96b3JvdmFuaWUgKHMgSUQgJDEzJCksIGplaG8gQm9uZmVycm9uaSBwLWhvZG5vdGEgKCQwLjkxNjYzJCkgamUgZXh0csOpbW5lIHZ5c29rw6EsIMSNbyBwb3R2cmR6dWplLCDFvmUgdG8gbmllIGplIHByb2Jsw6ltLgpWxI9ha2EgdG9tdXRvIHRlc3R1IG3DtMW+ZW0gcyBpc3RvdG91IHR2cmRpxaUsIMW+ZSBhaiBrZcSPIG3DtGogY2Vsa292w70gcmVncmVzbsO9IG1vZGVsIHZ5xaFpZWwgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSwgdmllbSwgxb5lIHTDoXRvIG5ldsO9em5hbW5vc8WlIG5lYm9sYSBzcMO0c29iZW7DoSBuZcSNaXN0w71taSBkw6F0YW1pLiBJbsO9bWkgc2xvdmFtaSwgPHU+bW9kZWwgbmVmdW5ndWplIGt2w7RsaSBwb3ZhaGUgcHJlbWVubsO9Y2gsIGEgbmllIGt2w7RsaSB6bGVqIGTDoXRvdmVqIHByw61wcmF2ZTwvdT4uCgoKTmnFvsWhaWUgamUgc8O6aHJuIHbFoWV0a8OpaG8sIMSNbyBzb20gdiByw6FtY2kgdGVqdG8ga2FwaXRvbHkgaW50ZXJwcmV0b3ZhbGE6CmBgYHtyfQpzdW1tYXJ5KG1vZGVsKQoKcGFyKG1mcm93ID0gYygyLCAyKSkKCnBsb3QobW9kZWwpCgptdGV4dCgiRGlhZ25vc3RpY2vDqSBncmFmeSByZWdyZXNuw6lobyBtb2RlbHU6IETDtHZlcmEgdm8gdmzDoWR1IChTbG92ZW5za28pIiwgCiAgICAgIG91dGVyID0gVFJVRSwgY2V4ID0gMS4yLCBmb250ID0gMiwgbGluZSA9IC0xLjUpIAoKcGFyKG1mcm93ID0gYygxLCAxKSkKYGBgCgpgYGB7cn0KCmxpYnJhcnkodHNlcmllcykgIyBQcmUgSmFycXVlLUJlcmEgdGVzdApsaWJyYXJ5KGNhcikgICAgICMgUHJlIG91dGxpZXJUZXN0CgpwcmludCgiLS0tIFRFU1QgTk9STUFMSVRZIFJFWklEVcONIChKYXJxdWUtQmVyYSB0ZXN0KSAtLS0iKQpyZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG1vZGVsKQpqYl90ZXN0IDwtIGphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKQpwcmludChqYl90ZXN0KQoKCnByaW50KCItLS0gVEVTVCBPRMS9QUhMw51DSCBIT0ROw5RUIChPdXRsaWVyIFRlc3QpIC0tLSIpCm91dGxpZXJfdGVzdCA8LSBvdXRsaWVyVGVzdChtb2RlbCkKcHJpbnQob3V0bGllcl90ZXN0KQoKYGBgCgoKIyMgWsOhdmVyCgpIbGF2bsO9bSB2w71zbGVka29tIGFuYWzDvXp5IGplLCDFvmUgxb5pYWRuYSB6IG1vamljaCBwcmFjb3Zuw71jaCBoeXBvdMOpeiBuZWJvbGEgcG90dnJkZW7DoS4gQ2Vsw70gcmVncmVzbsO9IG1vZGVsIGplIMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw70gKHAtaG9kbm90YSBGLXRlc3R1IGplICQwLjg3NDEkKSwgxI1vIHpuYW1lbsOhLCDFvmUgdHJpIHp2b2xlbsOpIHByZW1lbm7DqSBzcG9sb8SNbmUgbmVkb2vDocW+dSB2w716bmFtbmUgdnlzdmV0bGnFpSB6bWVueSB2IETDtHZlcmUgdm8gdmzDoWR1LiBOYXZ5xaFlLCBleHRyw6ltbmUgbsOtemt5ICRSJC1rdmFkcsOhdCAoJDAuMDc4OSQpIHBvdHZyZGlsLCDFvmUgbW9kZWwgdnlzdmV0xL51amUgbGVuIG5lY2Vsw71jaCAkOFwlJCB2YXJpYWJpbGl0eSBEw7R2ZXJ5LgoKSG9jaSBrb2VmaWNpZW50IEtvcnVwY2llIHZ5xaFpZWwgcyAqb8SNYWvDoXZhbsO9bSogbmVnYXTDrXZueW0gem5hbWllbmtvbSAoJC0wLjE3NDgkKSBhIGtvZWZpY2llbnQgU2xvYm9keSB2ecWhaWVsIG5lZ2F0w612bmUgKCQtMC4xMzQ4JCkgKnYgcm96cG9yZSBzIG/EjWFrw6F2YW7DrW0qLCDFvmlhZGVuIHogdMO9Y2h0byB2cGx5dm92IG5lYm9sIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKTmFwcmllayDFoXRhdGlzdGlja2VqIG5ldsO9em5hbW5vc3RpIG1vZGVsdSBib2xhIGNlbMOhIGFuYWzDvXphICoqbWV0b2RvbG9naWNreSByb2J1c3Ruw6EqKiBhICoqZMOhdG92w70gc8O6Ym9yIGJvbCBkb2tvbmFsZSDEjWlzdMO9KiouIFBvdHZyZGlsaSB0byBuYXNsZWRvdm7DqSB6aXN0ZW5pYToKCiogPHU+Tm9ybWFsaXRhIGEgaG9tb3NrZWRhc3RpY2l0YTwvdT46IMWgdGF0aXN0aWNrw70gSmFycXVlLUJlcmEgdGVzdCAocC1ob2Rub3RhICQwLjc1NDIkKSBwb3R2cmRpbCwgxb5lIHJlemlkdcOhIHPDuiBub3Jtw6FsbmUgcm96ZGVsZW7DqSwgYSB2aXp1YWxpesOhY2lhIFNjYWxlLUxvY2F0aW9uIGdyYWZ1IHBvdHZyZGlsYSBrb27FoXRhbnRuw70gcm96cHR5bCBjaMO9Yi4KCiogPHU+xIxpc3RvdGEgRMOhdDwvdT46IEJvbmZlcnJvbmlobyBrb3Jla2NpYSBhIE91dGxpZXIgVGVzdCBkZWZpbml0w612bmUgcG90dnJkaWxpLCDFvmUgdiBkw6F0b3ZvbSBzw7pib3JlIG5lem9zdGFsIMW+aWFkbnkgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gb3V0bGllci4gUm92bmFrbyBncmFmIFJlc2lkdWFscyB2cy4gTGV2ZXJhZ2UgcG90dnJkaWwsIMW+ZSBrb2VmaWNpZW50eSBuZWJvbGkgc2tyZXNsZW7DqSDFvmlhZG55bSB2cGx5dm7DvW0gcG96b3JvdmFuw61tLgoKTmEgesOhdmVyIG3DtMW+ZW0gcyBpc3RvdG91IGtvbsWhdGF0b3ZhxaUsIMW+ZSAqKnpseWhhbmllIG1vZGVsdSBuZWJvbG8gc3DDtHNvYmVuw6kgY2h5YmFtaSB2IGTDoXRhY2ggYW5pIHYgbWV0b2Rpa2Ugc3ByYWNvdmFuaWEsIGFsZSBza3V0b8SNbm9zxaVvdSwgxb5lIETDtHZlcmEgdm8gdmzDoWR1IG5hIFNsb3ZlbnNrdSBuaWUgamUgxaF0YXRpc3RpY2t5IG92cGx5dm5lbsOhIGZha3Rvcm1pIFZuw61tYW5pZSBrb3J1cGNpZSwgU2xvYm9kYSB2b8S+YnkgYSBTb2Npw6FsbmEgcG9kcG9yYSB2IHLDoW1jaSBkYW7DqWhvIMSNYXNvdsOpaG8gcmFkdSoqLiBCdWTDumNhIGFuYWzDvXphIGJ5IHNhIG1hbGEgemFtZXJhxaUgbmEgb2RsacWhbsOpLCBwcmF2ZGVwb2RvYm5lIG1ha3JvZWtvbm9taWNrw6kgYWxlYm8gcG9saXRpY2vDqSwgZmFrdG9yeS4KCkhvY2kgYnkgYm9sIHRlbnRvIGtvbmtyw6l0bnkgbW9kZWwgdiBwcmF4aSBwb3Zhxb5vdmFuw70gemEgemJ5dG/EjW7DvSwga2XEj8W+ZSBqZSDFoXRhdGlzdGlja3kgbmV2w716bmFtbsO9LCBubyA8dT5wcsOhdmUgdG90byB6aXN0ZW5pZSBvIG5lZXhpc3RlbmNpaSB2w716bmFtbsOpaG8gdnrFpWFodSBtZWR6aSB6dm9sZW7DvW1pIHNvY2nDoWxueW1pIGZha3Rvcm1pIGEgRMO0dmVyb3Ugdm8gdmzDoWR1IG5hIFNsb3ZlbnNrdSBqZSBzYW1vIG8gc2ViZSBjZW5uw71tIHByw61ub3NvbSwga3RvcsO9IHByZXPDunZhIGZvY3VzIG5hIGjEvmFkYW5pZSBvZGxpxaFuw71jaCwgdiBtb2RlbGkgbmV6YWhybnV0w71jaCwgdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaDwvdT4uCgoKIyBIZXRlcm9za2VkYXN0aWNpdGEgLSBDVklLTyA3CgpQcsOtdG9tbm9zxaUgaGV0ZXJvc2tlZGFzdGljaXR5IChuZWtvbsWhdGFudG7DqWhvIHJvenB0eWx1IG7DoWhvZG5laiB6bG/Fvmt5KSBqZSBrcml0aWNrw70gcHJvYmzDqW0sIHByZXRvxb5lIGJ5IHZpZWRsYSBrICoqbmVzcHLDoXZuZW11IHZ5aG9kbm9jb3Zhbml1ICR0JC10ZXN0b3YgdsO9em5hbW5vc3RpKiogcmVncmVzbsO9Y2gga29lZmljaWVudG92LiBQcmV0byBqZSBuZXZ5aG51dG7DqSwgYWJ5IHNtZSB0ZW50byBwcmVkcG9rbGFkIGTDtGtsYWRuZSBvdmVyaWxpLgoKQWoga2XEjyBzbWUgdcW+IHZpenXDoWxuZSBwcmV2ZXJpbGkgZ3JhZiAqKlNjYWxlLUxvY2F0aW9uKiogYSB6aXN0aWxpLCDFvmUgcm96cHR5bCBqZSBrb27FoXRhbnRuw70sIGplIHBvdHJlYm7DqSB0ZW50byB6w6F2ZXIgKipkZWZpbml0w612bmUgcG90dnJkacWlKiogcHJlIGthxb5kw7ogaGxhdm7DuiB2eXN2ZXTEvnVqw7pjdSBwcmVtZW5uw7ogYSBuw6FzbGVkbmUgxaF0YXRpc3RpY2vDvW0gdGVzdG9tLgoKUHJldG8gc2EgdiB0ZWp0byBzZWtjaWkgemFtZXJpYW0gbmEgbmFzbGVkb3Zuw6kga3Jva3k6CgoxLiAqKlZpenXDoWxuYSBkZXRla2NpYSoqOiBTa8O6bWFuaWUgesOhdmlzbG9zdGkgxaF0dm9yY292IHJlesOtZHXDrSBvZCBwcmVtZW5uw71jaCA8dT5WbsOtbWFuaWUga29ydXBjaWU8L3U+IGEgPHU+U2xvYm9kYSB2b8S+Ynk8L3U+IChwb21vY291IGdyYWZvdiB2eWdlbmVyb3ZhbsO9Y2ggdiBwcmVkb8WhbG9tIGtyb2t1KS4gVMO9bXRvIHNhIHZpenXDoWxuZSB1aXN0w61tLCDFvmUgcm96cHR5bCBjaMO9YiBuaWUgamUgesOhdmlzbMO9IG9kIGhvZG7DtHQgcHJlZGlrdG9yb3YuCgoyLiAqKsWgdGF0aXN0aWNrw6EgZGV0ZWtjaWEqKjogUG91xb5pdGllIDx1PkJyZXVzY2gtUGFnYW4gdGVzdHU8L3U+IG5hIGZvcm3DoWxuZSBwb3R2cmRlbmllLCDFvmUgaG9tb3NrZWRhc3RpY2l0YSBqZSB2IHRvbXRvIG1vZGVsaSBtb2RlbCBzcGxuZW7DoS4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQoKcF9jb3JyIDwtIGdncGxvdChkYXRhX3Nsb3Zha2lhX2NsZWFuLCBhZXMoeCA9IENvcnJ1cHRpb24sIHkgPSByZXNpZChtb2RlbCleMikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBjb2xvciA9ICJkYXJrYmx1ZSIpICsgIyBabWVuYSBmYXJieSBib2RvdgogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGxhYnMoeCA9ICJWbsOtbWFuaWUga29ydXBjaWUgKENvcnJ1cHRpb24pIiwKICAgICAgIHkgPSAixaB0dm9yY292w6kgcmV6aWR1w6EgKFNxdWFyZWQgUmVzaWR1YWxzKSIsCiAgICAgICB0aXRsZSA9ICJSZXppZHXDoSB2cy4gS29ydXBjaWEiKSArCiAgdGhlbWVfY2xhc3NpYygpIAoKcF9mcmVlIDwtIGdncGxvdChkYXRhX3Nsb3Zha2lhX2NsZWFuLCBhZXMoeCA9IEZyZWVkb20sIHkgPSByZXNpZChtb2RlbCleMikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAiZGFya29yYW5nZSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsgCiAgbGFicyh4ID0gIlNsb2JvZGEgdm/EvmJ5IChGcmVlZG9tKSIsCiAgICAgICB5ID0gIsWgdHZvcmNvdsOpIHJlemlkdcOhIChTcXVhcmVkIFJlc2lkdWFscykiLAogICAgICAgdGl0bGUgPSAiUmV6aWR1w6EgdnMuIFNsb2JvZGEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFNwb2plbmllIGdyYWZvdiB2ZWTEvmEgc2ViYQpwX2NvcnIgKyBwX2ZyZWUKYGBgCgpUaWV0byBncmFmeSBzbMO6xb5pYSBuYSBkZXRhaWxuw7ogdml6dcOhbG51IGtvbnRyb2x1IGhvbW9za2VkYXN0aWNpdHkgdMO9bSwgxb5lIHZ5a3Jlc8S+dWrDuiDFoXR2b3Jjb3bDqSByZXppZHXDoSBtb2RlbHUgKG1pZXJ1IGNoeWJ5KSBvcHJvdGkgZHZvbSBobGF2bsO9bSB2eXN2ZXTEvnVqw7pjaW0gcHJlbWVubsO9bS4KCiMjIyMgR3JhZiAxOiBSZXppZHXDoSB2cy4gVm7DrW1hbmllIEtvcnVwY2llCgpUZW50byBncmFmIHVrYXp1amUsIGFrbyBzYSBtZW7DrSByb3pwdHlsIGNow71iIG7DocWhaG8gbW9kZWx1IHYgesOhdmlzbG9zdGkgb2Qgw7pyb3ZuZSB2bsOtbWFuZWoga29ydXBjaWUuCgoqICoqQ2h5YmEgbW9kZWx1Kio6IEJvZHkgdiBncmFmZSBwcmVkc3RhdnVqw7ogZHJ1aMO6IG1vY25pbnUgY2h5YnkgKHJlemlkdXVtKSwga3RvcsO6IHRlbnRvIG1vZGVsIHVyb2JpbCBwcmUga2HFvmTDvSBqZWRub3RsaXbDvSByb2suIFZpenXDoWxuZSB2aWTDrW1lLCDFvmUgdGlldG8gYm9keSBzw7ogc2lsbmUgcm96cHTDvWxlbsOpIGEgxI9hbGVrbyBvZCBudWx5LiBUbyBqZSBwcmlhbXltIGTDtHNsZWRrb20gdG9obywgxb5lIGplIHRlbnRvIDx1PnJlZ3Jlc27DvSBtb2RlbCBqZSB2ZcS+bWkgc2xhYsO9PC91PiAoJFJeMiBcYXBwcm94IDhcJSQsIGFrbyBzb20gdXbDoWR6YWxhIHXFviBuYSB6YcSNaWF0a3UgcmVncmVzbmVqIGFuYWzDvXp5KSBhIHJvYsOtIHZlxL5rw6kgY2h5YnkgcHJpIHByZWRwb3ZlZGkgRMO0dmVyeSB2byB2bMOhZHUuCgoqICoqSW50ZXJwcmV0w6FjaWEgxIxlcnZlbmVqIMSMaWFyeSoqOiBOYXByaWVrIHZlxL5rw6ltdSByb3pwdHlsdSBqZWRub3RsaXbDvWNoIGNow71iIGplIGvEvsO6xI1vdsOpLCDFvmUgxI1lcnZlbsOhIHByZXJ1xaFvdmFuw6EgxI1pYXJhLCBrdG9yw6EgdWthenVqZSBwcmllbWVybsO9IHRyZW5kIHJvenB0eWx1LCBqZSDDunBsbmUgPHU+cGxvY2jDoTwvdT4uIFRvIHBvdHZyZHp1amUsIMW+ZSByb3pwdHlsIGNow71iIGplIDx1PmtvbsWhdGFudG7DvTwvdT4g4oCTIHZlxL5rb3PFpSBjaHlieSBuaWUgamUgc3lzdGVtYXRpY2t5IHrDoXZpc2zDoSBvZCDDunJvdm5lIGtvcnVwY2llLgoKIyMjIyBHcmFmIDI6IFJlemlkdcOhIHZzLiBTbG9ib2RhIFZvxL5ieQpUZW50byBncmFmIHByZXZlcnVqZSByb3ZuYWvDvSBwcmVkcG9rbGFkIHByZSBwcmVtZW5uw7ogU2xvYm9kYSB2b8S+YnkuCgoqICoqQ2h5YmEgbW9kZWx1Kio6IFBvZG9ibmUgYWtvIHByaSBrb3J1cGNpaSwgYWogdiB0b210byBncmFmZSBqZSB2aWRpdGXEvm7DvSA8dT52ZcS+a8O9IHZlcnRpa8OhbG55IHJvenB0eWw8L3U+IGplZG5vdGxpdsO9Y2ggemVsZW7DvWNoIGJvZG92LiBUbyBvcMOkxaUgcG90dnJkenVqZSwgxb5lIG1vZGVsIG3DoSBuw616a3UgcHJlZGlrdMOtdm51IHNpbHUuCgoqICoqSW50ZXJwcmV0w6FjaWEgT3JhbsW+b3ZlaiDEjGlhcnkqKjogT3JhbsW+b3bDoSBib2Rrb3ZhbsOhIMSNaWFyYSwga3RvcsOhIG1hcHVqZSBwcmllbWVybsO9IHRyZW5kIHJvenB0eWx1LCBqZSA8dT5wbG9jaMOhIGEgbmVtw6Egxb5pYWRlbiBza2xvbjwvdT4uIFRvIHpuYW1lbsOhLCDFvmUgY2h5YmEgbsOhxaFobyBtb2RlbHUgamUgcm92bmFrbyB2ZcS+a8OhIGJleiBvaMS+YWR1IG5hIMO6cm92ZcWIIFNsb2JvZHkgdm/EvmJ5LCDEjcOtbSBqZSBzcGxuZW7DvSBwcmVkcG9rbGFkIGtvbsWhdGFudG7DqWhvIHJvenB0eWx1IChob21vc2tlZGFzdGljaXR5KS4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQoKZGF0YV9zbG92YWtpYV9jbGVhbiRsb2dfU3VwcG9ydCA8LSBsb2coZGF0YV9zbG92YWtpYV9jbGVhbiRTdXBwb3J0KQoKcF9sb2dfc3VwcCA8LSBnZ3Bsb3QoZGF0YV9zbG92YWtpYV9jbGVhbiwgYWVzKHggPSBsb2dfU3VwcG9ydCwgeSA9IHJlc2lkKG1vZGVsKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIGNvbG9yID0gInB1cnBsZSIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJkZWVwcGluayIsIGxpbmV0eXBlID0gImRvdGRhc2giKSArICMgWm1lbmEgxaF0w71sdSDEjWlhcnkKICBsYWJzKHggPSAiTG9nKFNvY2nDoWxuYSBwb2Rwb3JhKSIsCiAgICAgICB5ID0gIsWgdHZvcmNvdsOpIHJlemlkdcOhIChTcXVhcmVkIFJlc2lkdWFscykiLAogICAgICAgdGl0bGUgPSAiUmV6aWR1w6EgdnMuIExvZyhTb2Npw6FsbmEgcG9kcG9yYSkiKSArCiAgdGhlbWVfYncoKSAKCnBfZnJlZV9sb2cgPC0gZ2dwbG90KGRhdGFfc2xvdmFraWFfY2xlYW4sIGFlcyh4ID0gRnJlZWRvbSwgeSA9IHJlc2lkKG1vZGVsKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJkYXJrb3JhbmdlIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnMoeCA9ICJTbG9ib2RhIHZvxL5ieSAoRnJlZWRvbSkiLAogICAgICAgeSA9ICLFoHR2b3Jjb3bDqSByZXppZHXDoSAoU3F1YXJlZCBSZXNpZHVhbHMpIiwKICAgICAgIHRpdGxlID0gIlJlemlkdcOhIHZzLiBTbG9ib2RhIikgKwogIHRoZW1lX2J3KCkKCiMgU3BvamVuaWUgZ3JhZm92IHZlZMS+YSBzZWJhCnBfbG9nX3N1cHAgKyBwX2ZyZWVfbG9nCmBgYAoKTmFwcmllayB0b211LCDFvmUgdGVudG8gbW9kZWwgKipzcGxuaWwgcHJlZHBva2xhZCBob21vc2tlZGFzdGljaXR5KiogKHZpenXDoWxuZSBhaiDFoXRhdGlzdGlja3kpLCB0ZW50byBrcm9rIGRlbW9uxaF0cnVqZSBwb3N0dXAsIGFrw71tIGJ5IHNtZSBoZXRlcm9za2VkYXN0aWNpdHUgb2RzdHLDoW5pbGksIGFrIGJ5IHNhIHBvdHZyZGlsYS4gCgojIyMjIEdyYWYgMTogUmV6aWR1w6EgdnMuIExvZyhTb2Npw6FsbmEgcG9kcG9yYSkKCiogKipQb3pvcm92YW5pZSB0cmVuZHUqKjogTmEgZ3JhZmUgdmlkw61tZSwgxb5lIHZ5aGxhZGVuw6EgcnXFvm92w6EgYm9ka292YW7DoSDEjWlhcmEgamUgb3DDpMWlIGhvcml6b250w6FsbmEgYSBuZW3DoSDFvmlhZG55IHNrbG9uLiBUbyBwb3R2cmR6dWplLCDFvmUgYWogcG8gbG9nYXJpdG1pY2tlaiB0cmFuc2Zvcm3DoWNpaSBwcmVtZW5uZWogU29jacOhbG5hIHBvZHBvcmEgem9zdMOhdmEgcm96cHR5bCBjaMO9YiBrb27FoXRhbnRuw70uIFRlbnRvIHbDvXNsZWRvayBqZSB2IHPDumxhZGUgcyBuYcWhaW1pIHByZWRjaMOhZHphasO6Y2ltaSB6aXN0ZW5pYW1pLCDFvmUgcMO0dm9kbsO9IG1vZGVsIHXFviBqZSBob21vc2tlZGFzdGlja8O9IGEgdHJhbnNmb3Jtw6FjaWEgbmVib2xhIG51dG7DoS4KCiMjIyMgR3JhZiAyOiBSZXppZHXDoSB2cy4gU2xvYm9kYSBWb8S+YnkKCiogKipQb3pvcm92YW5pZSB0cmVuZHUqKjogT3Bha292YW5pZSB2aXp1YWxpesOhY2llIHByZSBTbG9ib2R1IHMgcG91xb5pdMOtbSBpbmVqIGZhcmVibmVqIHTDqW15IHNsw7rFvmkgbGVuIGFrbyBrb250cm9sbsOpIHBvcm92bmFuaWUuIE9yYW7Fvm92w6EgcHJlcnXFoW92YW7DoSDEjWlhcmEgamUgcm92bmFrbyBwbG9jaMOhLiBWxaFldGt5IHZpenXDoWxuZSBrb250cm9seSB0ZWRhIHPDumhsYXNpYSAtIG1vZGVsIG5lb2JzYWh1amUgaGV0ZXJvc2tlZGFzdGljaXR1LgoKIyMgVGVzdG92YW5pZSBwcsOtdG9tbm9zdGkgaGV0ZXJvc2tlZGFzdGljaXR5CgpQcmVkIHZ5a29uYW7DrW0gQnJldXNjaC1QYWdhbiB0ZXN0dSBzdGFub3Z1amVtZSBuYXNsZWR1asO6Y2UgaHlwb3TDqXp5IG8ga29uxaF0YW50bm9zdGkgcm96cHR5bHUgY2jDvWI6CgoqIE51bG92w6EgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezB9JCk6IE1vZGVsIGplIGhvbW9za2VkYXN0aWNrw70gKHJvenB0eWwgY2jDvWIgamUga29uxaF0YW50bsO9KS4KCiogQWx0ZXJuYXTDrXZuYSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MX0kKTogTW9kZWwgamUgaGV0ZXJvc2tlZGFzdGlja8O9IChyb3pwdHlsIGNow71iIGplIG5la29uxaF0YW50bsO9KS4KCmBgYHtyfQpsaWJyYXJ5KGxtdGVzdCkKYnB0ZXN0KG1vZGVsKQpgYGAKS2XEj8W+ZSBkb3NpYWhudXTDoSAkcCQtaG9kbm90YSAoJDAuNDI5NiQpIGplIHbDvXJhem5lIHZ5xaHFoWlhIGFrbyDFoXRhbmRhcmRuw6EgaGxhZGluYSB2w716bmFtbm9zdGkgJFxhbHBoYSA9IDAuMDUkLCA8dT5udWxvdsO6IGh5cG90w6l6dSBuZXphbWlldGFtZTwvdT4uCgpWIHByYXhpIHRvIHpuYW1lbsOhLCDFvmUgxaF0YW5kYXJkbsOpIGNoeWJ5IHJlZ3Jlc27DvWNoIGtvZWZpY2llbnRvdiBzw7ogc3BvxL5haGxpdm8gYSBrb3Jla3RuZSB2eXBvxI3DrXRhbsOpLiBIb21vc2tlZGFzdGljaXRhIHRhayBuaWUgamUgcHLDrcSNaW5vdSDFoXRhdGlzdGlja2VqIG5ldsO9em5hbW5vc3RpIGNlbMOpaG8gbW9kZWx1ICgkRiQtdGVzdCAkcD0wLjg3NDEkKSwgxI3DrW0gc2EgcG90dnJkenVqZSBtZXRvZG9sb2dpY2vDoSBrb3Jla3Rub3PFpSBhbmFsw716eS4KCgpgYGB7cn0KbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShsbXRlc3QpCmNvZWZ0ZXN0KG1vZGVsLCB2Y292ID0gdmNvdkhDKG1vZGVsKSkKYGBgCgoqQXBsaWvDoWNpYSByb2J1c3Ruw71jaCDFoXRhbmRhcmRuw71jaCBjaMO9Yiogc2zDusW+aWxhIG5hIG92ZXJlbmllLCDEjWkgYnkgcHLDrXRvbW5vc8WlIHByw61wYWRuZWosIGhvY2kgQnJldXNjaC1QYWdhbiB0ZXN0b20gbmV6aXN0ZW5laiwgaGV0ZXJvc2tlZGFzdGljaXR5IHptZW5pbGEgbmHFoWUgesOhdmVyeSBvIHbDvXpuYW1ub3N0aS4gCgpWw71zbGVkb2sgdGVzdHUgcG90dnJkenVqZSBuw6HFoSBwcmVkY2jDoWR6YWrDumNpIG7DoWxlejoKVsWhZXRreSAkcCQtaG9kbm90eSBzw7ogYWogcG8gYXBsaWvDoWNpaSByb2J1c3Ruw71jaCBjaMO9YiAodiByb3pzYWh1IG9kICQwLjcyNDYkIGRvICQwLjk1ODAkKSB2w71yYXpuZSB2ecWhxaFpZSBha28gaGxhZGluYSB2w716bmFtbm9zdGkgJFxhbHBoYSA9IDAuMDUkLiBWIGTDtHNsZWRrdSB0b2hvIGhsYXZuw70gesOhdmVyIHpvc3TDoXZhIG5lem1lbmVuw706ICoqYW5pIGplZG5hIHogdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaCAoVm7DrW1hbmllIGtvcnVwY2llLCBTbG9ib2RhIHZvxL5ieSwgU29jacOhbG5hIHBvZHBvcmEpIG5lbcOhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2IG5hIETDtHZlcnUgdm8gdmzDoWR1KiouIE5ha2/EvmtvIHNhIHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkgbmVsw63FoWlhIHNpZ25pZmlrYW50bmUgb2QgcMO0dm9kbsO9Y2gsIHByZXVrw6F6YWxpIHNtZSwgxb5lIG1vZGVsIGplIGhvbW9za2VkYXN0aWNrw70gYSByb2J1c3Ruw70uCgojIyBaw6F2ZXIKQ2llxL5vbSB0ZWp0byBhbmFsw716eSBib2xvIHByZXNrw7ptYcWlIHZwbHl2IEtvcnVwY2llLCBTbG9ib2R5IHZvxL5ieSBhIFNvY2nDoWxuZWogcG9kcG9yeSBuYSBEw7R2ZXJ1IHZvIHZsw6FkdSBwb21vY291IGxpbmXDoXJuZWogcmVncmVzaWUuCgrFoHRhdGlzdGlja8OhIGFuYWzDvXphIHByZXVrw6F6YWxhLCDFvmUgKiphbmkgamVkZW4geiBmYWt0b3JvdiAoS29ydXBjaWEsIFNsb2JvZGEsIFNvY2nDoWxuYSBwb2Rwb3JhKSBuZW3DoSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSB2cGx5diBuYSBEw7R2ZXJ1IHZvIHZsw6FkdSoqIHYgc2xlZG92YW5vbSBvYmRvYsOtLiBOw616a2EgdnlzdmV0xL51asO6Y2Egc2lsYSBtb2RlbHUgKCRSXjIgXGFwcHJveCA4XCUkKSBwb3R2cmRpbGEsIMW+ZSB0w6F0byB0cm9qaWNhIHByZW1lbm7DvWNoIG5lZG9rw6HFvmUgcHJlZHBvdmVkYcWlIETDtHZlcnUgdm8gdmzDoWR1LgoKCkFqIG5hcHJpZWsgbmXDunNwZWNodSBtb2RlbHUgc21lIHBvZHJvYm5lIHByZXZlcmlsaSBqZWhvIG1ldG9kb2xvZ2lja8O6IGt2YWxpdHUuICpIb21vc2tlZGFzdGljaXRhKiAoa29uxaF0YW50bsO9IHJvenB0eWwgY2jDvWIpIGJvbGEgKnNwbG5lbsOhKiDigJMgdml6dcOhbG5lIGFqIMWhdGF0aXN0aWNreSAoQnJldXNjaC1QYWdhbiAkcCA9IDAuNDI5NiQpLgoKU3BsbmVuaWUgaG9tb3NrZWRhc3RpY2l0eSB6bmFtZW7DoSwgxb5lICpjaHliYSB0b2h0byBtb2RlbHUgamUgcm92bmFrbyB2ZcS+a8OhIGJleiBvaMS+YWR1IG5hIHRvLCDEjWkgbWVyaWFtZSB2cGx5diBwcmkgbsOtemtlaiBhbGVibyB2eXNva2VqIFNsb2JvZGUgdm/EvmJ5Ki4K