Úvod a popis databázy
V tejto časti sa testujú štatistické hypotézy pomocou údajov z
databázy, ktorá obsahuje ekonomické ukazovatele krajín v rokoch 1991 –
2022. Použité premenné zahŕňajú hrubý domáci produkt (HDP) v USD, mieru
nezamestnanosti (%) a štruktúru zamestnanosti v troch sektoroch –
poľnohospodárstve, priemysle a službách.
install.packages("zoo")
install.packages("tseries")
install.packages("lmtest")
install.packages("sandwich")
install.packages("car")
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
rm(list=ls())
install.packages("knitr")
install.packages("dplyr")
install.packages("ggplot2")
# Import vlastného CSV súboru
udaje <- read.csv("Employment_Unemployment_GDP_data.csv",
header = TRUE,
sep = ",",
dec = " ",
stringsAsFactors = FALSE)
# Zobrazenie prvých riadkov a názvov stĺpcov
head(udaje)
[1] "Country.Name" "Year"
[3] "Employment.Sector..Agriculture" "Employment.Sector..Industry"
[5] "Employment.Sector..Services" "Unemployment.Rate"
[7] "GDP..in.USD."
Úvod do problému, stanovenie hypotéz
Rozhodla som sa modelovať mieru nezamestnanosti
(Unemployment.Rate) v závislosti od troch vysvetľujúcich
premenných, a to podielu zamestnanosti v
poľnohospodárstve (Employment.Sector..Agriculture),
podielu zamestnanosti v priemysle
(Employment.Sector..Industry) a hrubého domáceho
produktu na obyvateľa (GDP..in.USD.).
Naša pracovná hypotéza hovorí o štatisticky významnom
vplyve všetkých troch vysvetľujúcich premenných, pričom:
- u premennej Industry predpokladáme
negatívny vplyv, to znamená čím väčší podiel
pracujúcich v priemysle, tým nižšia nezamestnanosť,
- u premennej GDP očakávame negatívny
vplyv, vyšší HDP na obyvateľa je spojený s lepšou ekonomickou
výkonnosťou a teda nižšou nezamestnanosťou,
- u premennej Agriculture predpokladáme
pozitívny alebo nejednoznačný vplyv, vo vyspelých
ekonomikách nižší podiel poľnohospodárstva súvisí s nižšou
nezamestnanosťou, zatiaľ čo vo vyvíjajúcich sa krajinách môže byť efekt
opačný.
Príprava databázy, čistenie a úprava údajov
Budeme pracovať s vlastným súborom
Employment_Unemployment_GDP_data.csv. Keďže niektoré
hodnoty môžu chýbať alebo byť v inom formáte, najprv ich očistíme
(pretypujeme číselné stĺpce) a chýbajúce hodnoty doplníme
mediánom danej premennej. Preferenčne použijeme rok
2015; ak v dátach 2015 nie je, automaticky zoberieme
posledný dostupný rok. Na ďalšie kroky si ponecháme
kľúčové premenné: Unemployment.Rate,
Employment.Sector..Agriculture,
Employment.Sector..Industry,
Employment.Sector..Services a GDP..in.USD..
# Robustná príprava: automatické namapovanie názvov stĺpcov + imputácia mediánom
# 0) Načítanie (ponechaj check.names = FALSE, aby sa nemenili mená)
udaje <- read.csv(
"Employment_Unemployment_GDP_data.csv",
header = TRUE, sep = ",", dec = ".",
stringsAsFactors = FALSE, check.names = FALSE
)
# 1) Pomocné funkcie
find_col <- function(candidates, cols) {
# skúsi presnú zhodu (case-insensitive), potom 'obsahuje'
lc <- tolower(cols)
# presná zhoda
for (p in candidates) {
idx <- which(lc == tolower(p))
if (length(idx) == 1) return(cols[idx])
}
# obsahuje (regex/substring, case-insensitive)
for (p in candidates) {
idx <- grep(tolower(p), lc, fixed = TRUE)
if (length(idx) >= 1) return(cols[idx][1])
}
return(NA_character_)
}
num_clean <- function(x) {
if (is.numeric(x)) return(x)
x <- gsub("\\s", "", x) # odstráni medzery
x <- gsub(",", "", x) # odstráni tisícové oddeľ.
suppressWarnings(as.numeric(x))
}
# 2) Nájdeme požadované stĺpce (tolerantne na názvy)
cols <- colnames(udaje)
col_year <- find_col(c("Year","Rok"), cols)
col_unemp <- find_col(c("Unemployment.Rate","Unemployment", "Unemployment Rate"), cols)
col_agri <- find_col(c("Employment.Sector..Agriculture","Agriculture","Employment Agriculture"), cols)
col_ind <- find_col(c("Employment.Sector..Industry","Industry","Employment Industry"), cols)
col_serv <- find_col(c("Employment.Sector..Services","Services","Employment Services"), cols)
col_gdp <- find_col(c("GDP..in.USD.","GDP..in.USD","GDP per capita","GDP","gdp"), cols)
mapping <- c(
Year = col_year,
Unemployment.Rate = col_unemp,
Agriculture = col_agri,
Industry = col_ind,
Services = col_serv,
GDP_in_USD = col_gdp
)
cat("Mapovanie stĺpcov:\n")
Mapovanie stĺpcov:
Year Unemployment.Rate
"Year" "Unemployment Rate"
Agriculture Industry
"Employment Sector: Agriculture" "Employment Sector: Industry"
Services GDP_in_USD
"Employment Sector: Services" "GDP (in USD)"
# 3) Ošetri, ak sa niečo nenašlo
if (any(is.na(mapping))) {
stop("Niektoré stĺpce sa nenašli. Skontroluj mapovanie vyššie a prípadne uprav kandidátov.")
}
# 4) Pretypuj na numerické (kde treba)
for (cn in unique(c(col_year,col_unemp,col_agri,col_ind,col_serv,col_gdp))) {
if (cn %in% c(col_year,col_unemp,col_agri,col_ind,col_serv,col_gdp)) {
udaje[[cn]] <- num_clean(udaje[[cn]])
}
}
# 5) Vyber rok: 2015, inak posledný dostupný
target_year <- if (any(udaje[[col_year]] == 2015, na.rm = TRUE)) 2015 else max(udaje[[col_year]], na.rm = TRUE)
cat("Použitý rok:", target_year, "\n")
Použitý rok: 2015
# 6) Vyber kľúčové premenné pre daný rok
udaje.y <- udaje[udaje[[col_year]] == target_year, c(col_unemp,col_agri,col_ind,col_serv,col_gdp)]
names(udaje.y) <- c("Unemployment.Rate","Agriculture","Industry","Services","GDP_USD")
# 7) Imputácia mediánom
column_medians <- sapply(udaje.y, median, na.rm = TRUE)
for (col in names(udaje.y)) {
idx <- is.na(udaje.y[[col]])
if (any(idx)) udaje.y[[col]][idx] <- column_medians[col]
}
# 8) Hotovo – dataset pripravený na modelovanie
str(udaje.y)
'data.frame': 181 obs. of 5 variables:
$ Unemployment.Rate: num 9.05 17.19 11.21 16.49 7.58 ...
$ Agriculture : num 44.59 41.28 8.83 56.85 7.84 ...
$ Industry : num 20.7 18.7 31.2 7.8 22.3 ...
$ Services : num 34.7 40 59.9 35.4 69.8 ...
$ GDP_USD : num 1.91e+10 1.15e+10 1.87e+11 9.05e+10 5.95e+11 ...
Unemployment.Rate Agriculture Industry Services
Min. : 0.170 Min. : 0.2338 Min. : 3.465 Min. :10.22
1st Qu.: 3.678 1st Qu.: 5.3210 1st Qu.:14.514 1st Qu.:42.40
Median : 6.313 Median :18.1105 Median :19.555 Median :58.51
Mean : 8.127 Mean :25.0850 Mean :19.612 Mean :55.30
3rd Qu.:10.842 3rd Qu.:40.3543 3rd Qu.:24.458 3rd Qu.:69.15
Max. :27.695 Max. :86.3175 Max. :54.141 Max. :93.17
GDP_USD
Min. :2.600e+08
1st Qu.:1.139e+10
Median :4.130e+10
Mean :4.128e+11
3rd Qu.:1.951e+11
Max. :1.830e+13
Vizualizácia dát – kontrola nezrovnalostí
V tejto časti sa pozrieme na rozloženie jednotlivých premenných
pomocou boxplotov.
Cieľom je zistiť, či sa v dátach nenachádzajú nezrovnalosti, extrémne
hodnoty alebo nulové pozorovania.
Použijeme štyri hlavné premenné: mieru nezamestnanosti, podiel
poľnohospodárstva, podiel priemyslu a HDP na obyvateľa.
# Boxploty premenných – kontrola rozloženia a odľahlých hodnôt
# Zvolíme len relevantné premenné
vars_to_plot <- c("Unemployment.Rate","Agriculture","Industry","GDP_USD")
# Nastavenie grafického layoutu: 2 × 2
par(mfrow = c(2, 2))
par(mar = c(4, 4, 2, 1))
# Pre každý vybraný stĺpec nakreslíme boxplot
for (col in vars_to_plot) {
boxplot(
udaje.y[[col]],
main = col,
xlab = "Hodnota",
col = "lightblue",
border = "darkblue"
)
}
# Nadpis pre celú sadu grafov
mtext("Boxploty jednotlivých premenných (rok vybraný pre analýzu)",
outer = TRUE, cex = 1.2, font = 2)
# Reset layoutu na 1 graf
par(mfrow = c(1, 1))
Na základe boxplotov môžeme pozorovať nasledovné skutočnosti:
- Unemployment.Rate – väčšina pozorovaní sa
sústreďuje v stredných hodnotách, avšak v niektorých krajinách sa
vyskytujú aj extrémne vyššie miery nezamestnanosti. To naznačuje, že
medzi krajinami existujú výrazné rozdiely v trhu práce.
- Agriculture – hodnoty sa pohybujú v širokom
intervale. Krajiny s vyšším podielom poľnohospodárstva môžu mať nižšiu
úroveň industrializácie, čo sa často spája s vyššou
nezamestnanosťou.
- Industry – väčšina krajín má stredné až vyššie
hodnoty, pričom extrémne hodnoty sú menej časté. Vyšší podiel priemyslu
naznačuje rozvinutejšiu ekonomiku.
- GDP_USD – rozloženie ukazuje výrazné rozdiely v
ekonomickej úrovni medzi krajinami. Niektoré hodnoty GDP sú veľmi vysoké
– ide o bohatšie krajiny s vyspelou ekonomikou, zatiaľ čo iné majú nižší
HDP, čo poukazuje na ekonomickú nerovnováhu.
Celkovo boxploty naznačujú, že údaje obsahujú niekoľko
odľahlých hodnôt (najmä v premenných Unemployment.Rate
a GDP_USD), čo je však pri medzinárodných dátach prirodzené.
Väčšina hodnôt sa nachádza v realistickom rozsahu a nepozorujeme žiadne
zjavné nezrovnalosti ako systematické nulové hodnoty.
Tieto výsledky potvrdzujú, že údaje sú vhodné na ďalšie modelovanie.
Lineárna regresia
Model odhadujeme príkazom lm().
V našom prípade modelujeme mieru nezamestnanosti
(Unemployment.Rate) v závislosti od troch vysvetľujúcich
premenných: - podielu zamestnanosti v poľnohospodárstve
(Agriculture),
- podielu zamestnanosti v priemysle (Industry),
- a logaritmu hrubého domáceho produktu na obyvateľa
(log(GDP_USD)).
Cieľom je zistiť, ktoré z týchto faktorov štatisticky významne
ovplyvňujú mieru nezamestnanosti.
# Pridáme logaritmickú transformáciu HDP
udaje.y$logGDP <- ifelse(udaje.y$GDP_USD > 0, log(udaje.y$GDP_USD), NA_real_)
# Základný lineárny model
model <- lm(Unemployment.Rate ~ Agriculture + Industry + logGDP, data = udaje.y)
# Súhrn výsledkov
summary(model)
Diagnostické grafy regresného modelu
Súhrn odhadovaného modelu nám poskytuje súbor odhadnutých regresných
koeficientov, ktorých znamienka budú rozoberané neskôr.
Ak hovoríme o vlastnostiach modelu ako celku, pozrime sa najskôr na
nasledujúce diagnostické grafy.
Pomocou nich vieme overiť, či sú splnené základné predpoklady lineárnej
regresie – predovšetkým normalita rezíduí,
homoskedasticita a absencia odľahlých
hodnôt.
# Diagnostické grafy regresného modelu
par(mfrow = c(2, 2)) # rozloženie 2 x 2
plot(model) # štyri základné grafy: residuals vs fitted, Q-Q, scale-location, residuals vs leverage
par(mfrow = c(1, 1)) # reset na 1 graf

Interpretácia diagnostických grafov
1. Residuals vs Fitted (Rezíduá oproti vyrovnaným
hodnotám)
Rezíduá sa rozkladajú približne symetricky okolo nulovej osi, čo je
priaznivé.
Červená LOESS čiara je relatívne rovná, iba mierne zakrivená smerom hore
na konci, čo naznačuje slabý náznak nelinearity, ale
nie závažný problém.
Rozptyl bodov zostáva približne rovnaký pre všetky hodnoty fitted – teda
nepozorujeme výraznú heteroskedasticitu.
2. Q–Q (rozptyl) plot rezíduí
Body sa vo väčšine rozsahu držia blízko 45° priamky, no na koncoch sa od
nej mierne odchyľujú.
To znamená, že rozloženie rezíduí sa len mierne odlišuje od
normálneho rozdelenia, pričom odchýlky sú spôsobené
pravdepodobne niekoľkými extrémnymi pozorovaniami.
Celkovo však predpoklad normality nie je vážne porušený.
3. Scale–Location plot
Červená hladká čiara je takmer vodorovná a rozptyl bodov po osi X je
približne konštantný.
To potvrdzuje, že rezíduá majú približne rovnakú
varianciu naprieč celým rozsahom hodnôt (predpoklad
homoskedasticity je splnený).
4. Residuals vs Leverage (vplyvné pozorovania)
Väčšina pozorovaní má nízky pákový efekt (leverage < 0.05), čo
znamená, že jednotlivé krajiny nemajú nadmerný vplyv na odhadnuté
koeficienty.
Niekoľko bodov (napr. s označením 4438, 4363, 4449) sa nachádza bližšie
k okraju Cookovej vzdialenosti, čo naznačuje, že ide o mierne
vplyvné pozorovania, ale žiadne z nich nepresahuje hranicu 0.5
či 1.0, teda žiadne extrémne odľahlé hodnoty sa
neobjavili.
# Testy normality a odľahlých hodnôt
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
jb_test # Jarque–Bera test normality
Jarque Bera Test
data: residuals
X-squared = 42.52, df = 2, p-value = 5.847e-10
# Outlier test (Bonferroni correction)
outlier_test <- car::outlierTest(model)
outlier_test
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
Výsledky testu odľahlých hodnôt
Výstup funkcie outlierTest(model) identifikoval
pozorovanie s indexom 4337,
ktoré má najvyššiu študentizovanú hodnotu rezídua
rstudent = 3.27.
Jeho neopravená p-hodnota je 0.00127, avšak po
aplikácii Bonferroniho korekcie
je výsledná hodnota 0.23064, teda nie
štatisticky významná na 5 % hladine.
To znamená, že hoci toto pozorovanie má pomerne vysoké
rezíduum,
nie je natoľko extrémne, aby sme ho považovali za štatisticky
významný odľahlý bod.
V kontexte ekonomických dát ide pravdepodobne o krajinu s netypickou
kombináciou
vysokého HDP a špecifickej štruktúry zamestnanosti, no jej vplyv na
celkový model
nie je dostatočne silný, aby skreslil odhady koeficientov.
Záverom možno konštatovať, že model neobsahuje žiadne
významné odľahlé pozorovania,
ktoré by ovplyvňovali výsledky regresie.
Alternatívny model
Ak sa vyskytujú mierne odľahlé hodnoty alebo nenormalita v GDP,
môžeme upraviť model tak,
že použijeme logaritmus HDP a zmeníme štruktúru sektorov.
Nový model bude mať tvar:
\[
Unemployment.Rate_i = \beta_0 + \beta_1 \, Industry_i + \beta_2 \,
Services_i + \beta_3 \, \log(GDP_i) + \varepsilon_i
\]
# Alternatívny model s log(GDP) a Services namiesto Agriculture
model2 <- lm(Unemployment.Rate ~ Industry + Services + log(GDP_USD), data = udaje.y)
summary(model2)
# Diagnostické grafy alternatívneho modelu
par(mfrow = c(2, 2))
plot(model2)
par(mfrow = c(1, 1))
# Normality a outlier test pre nový model
residuals2 <- residuals(model2)
jarque.bera.test(residuals2)
car::outlierTest(model2)
Záver
Nový model po logaritmickej transformácii HDP potvrdzuje, že:
- premenné priemysel (Industry) a HDP
(GDP) majú negatívny vplyv na mieru
nezamestnanosti – teda čím je podiel priemyslu a úroveň HDP
vyššia, tým je nezamestnanosť nižšia,
- premenná služby (Services) má slabší alebo
štatisticky nevýznamný vplyv,
- rezíduá majú po transformácii lepšie rozdelenie a model nevykazuje
závažné porušenia predpokladov lineárnej regresie.
Na základe týchto výsledkov môžeme konštatovať, že upravený
model je štatisticky spoľahlivý, stabilný a dobre
interpretovateľný.
Potvrdzuje predpoklad, že vyššia ekonomická úroveň a
rozvinutejší priemyselný sektor prispievajú k nižšej miere
nezamestnanosti.
Heteroskedasticita
Prítomnosť heteroskedasticity (nekonštantného rozptylu náhodnej
zložky) spôsobuje nepresné odhady smerodajných chýb a tým aj
nespoľahlivé t-testy významnosti jednotlivých regresných
koeficientov.
Preto je dôležité, aby sme heteroskedasticitu najprv
detegovali (pomocou grafov alebo testov) a v prípade
jej výskytu sa ju pokúsili odstrániť.
V našom prípade sa pokúsime vizuálne vyhodnotiť, či variabilita
rezíduí (štvorcov rezíduí) závisí od niektorej z vysvetľujúcich
premenných – konkrétne od HDP na obyvateľa (GDP_USD) a
od podielu zamestnanosti v poľnohospodárstve
(Agriculture).
Budeme porovnávať dva modely:
- model – pôvodný lineárny model s premennou
GDP_USD
- model2 – model so zlogaritmovaným HDP
(
log(GDP_USD)), ktorý môže odstrániť vplyv odľahlých hodnôt
a stabilizovať varianciu
library(ggplot2)
library(patchwork)
# Štvorce rezíduí z pôvodného modelu
p1 <- ggplot(udaje.y, aes(x = GDP_USD, y = resid(model)^2)) +
geom_point(alpha = 0.8, color = "darkred") +
geom_smooth(method = "loess", se = FALSE, color = "pink", linewidth = 1.5) +
labs(x = "HDP na obyvateľa (GDP_USD)",
y = "Štvorce rezíduí",
title = "Squared Residuals vs GDP_USD (model)") +
theme_minimal()
# Druhý graf: poľnohospodárstvo
p2 <- ggplot(udaje.y, aes(x = Agriculture, y = resid(model)^2)) +
geom_point(alpha = 0.8, color = "darkblue") +
geom_smooth(method = "loess", se = FALSE, color = "skyblue", linewidth = 1.5) +
labs(x = "Podiel zamestnanosti v poľnohospodárstve (%)",
y = "Štvorce rezíduí",
title = "Squared Residuals vs Agriculture (model)") +
theme_minimal()
# Zobrazenie vedľa seba
p1 + p2

Interpretácia výsledkov
V grafe „Štvorce rezíduí vs GDP_USD“ možno vidieť,
že pri nižších hodnotách HDP je rozptyl rezíduí väčší a s rastúcim HDP
sa znižuje.
To naznačuje, že v ekonomicky slabších krajinách je
nezamestnanosť menej stabilná, zatiaľ čo vo vyspelých
ekonomikách sú odchýlky od modelu menšie.
Rozptyl teda nie je úplne konštantný, čo poukazuje na
miernu heteroskedasticitu vo vzťahu k HDP.
V druhom grafe „Štvorce rezíduí vs Agriculture“ sa
body rozkladajú pomerne rovnomerne bez viditeľného trendu.
To znamená, že podiel zamestnanosti v poľnohospodárstve
pravdepodobne nespôsobuje heteroskedasticitu a jeho vplyv na
rozptyl chýb je minimálny.
Celkovo možno povedať, že rozptyl rezíduí sa mení
predovšetkým s HDP, nie s ostatnými premennými.
V ďalšom kroku preto použijeme logaritmickú transformáciu
HDP, ktorá by mala túto nerovnomernosť zmierniť a model
spresniť.
model2 <- lm(Unemployment.Rate ~ Agriculture + Industry + Services + log(GDP_USD), data = udaje.y)
# Model s logaritmom HDP
model2 <- lm(Unemployment.Rate ~ Agriculture + Industry + Services + log(GDP_USD), data = udaje.y)
# Skúmanie heteroskedasticity – vizuálne pre model2
library(ggplot2)
library(patchwork)
# Štvorce rezíduí vs log(GDP)
p1 <- ggplot(udaje.y, aes(x = log(GDP_USD), y = resid(model2)^2)) +
geom_point(alpha = 0.6, color = "darkgreen") +
geom_smooth(method = "loess", se = FALSE, color = "green", linewidth = 1) +
labs(x = "log(HDP na obyvateľa)",
y = "Štvorce rezíduí",
title = "Squared Residuals vs log(GDP_USD) (model2)") +
theme_minimal()
# Štvorce rezíduí vs poľnohospodárstvo
p2 <- ggplot(udaje.y, aes(x = Agriculture, y = resid(model2)^2)) +
geom_point(alpha = 0.6, color = "purple4") +
geom_smooth(method = "loess", se = FALSE, color = "orchid", linewidth = 1) +
labs(x = "Agriculture",
y = "Štvorce rezíduí",
title = "Squared Residuals vs Agriculture (model2)") +
theme_minimal()
# Zobrazenie grafov vedľa seba
p1 + p2

Testovanie prítomnosti heteroskedasticity
# Install (if not yet installed)
# install.packages("lmtest")
# Load the package
library(lmtest)
# Run the Breusch–Pagan test
bptest(model)
studentized Breusch-Pagan test
data: model
BP = 7.167, df = 3, p-value = 0.06676
# Install (if not yet installed)
# install.packages("lmtest")
# Load the package
library(lmtest)
# Run the Breusch–Pagan test
bptest(model2)
studentized Breusch-Pagan test
data: model2
BP = 8.1376, df = 4, p-value = 0.08667
Interpretácia výsledkov testu heteroskedasticity
Podľa výsledkov Breusch–Pagan testu:
pre pôvodný model (model) platí:
BP = 7.167, df = 3, p-value =
0.06676
pre model so zlogaritmovaným HDP (model2) platí:
BP = 8.1376, df = 4, p-value =
0.08667
V oboch prípadoch je hodnota p-value väčšia ako 0.05, takže
nezamietame nulovú hypotézu.
To znamená, že v modeloch nie je prítomná významná
heteroskedasticita – teda rozptyl chýb je približne
rovnaký.
Hodnota p-value v pôvodnom modeli (model) je však
trochu nižšia (asi 0.07), čo môže naznačovať mierny náznak
nerovnakého rozptylu.
V modeli s logaritmom HDP (model2) sa tento problém ešte viac
zmiernil, takže môžeme povedať,
že logaritmická úprava HDP pomohla zlepšiť vlastnosti
modelu.
Celkovo teda model2 spĺňa predpoklady lineárnej
regresie lepšie a je spoľahlivejší na
interpretáciu.
#install.packages("sandwich")
#install.packages("lmtest")
library(sandwich)
library(lmtest)
coeftest(model, vcov = vcovHC(model))
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 30.084154 5.730333 5.2500 4.323e-07 ***
Agriculture -0.095462 0.026310 -3.6284 0.0003730 ***
Industry -0.011641 0.095880 -0.1214 0.9034993
logGDP -0.789032 0.227598 -3.4668 0.0006611 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Interpretácia výsledkov po White korekcii
Po aplikovaní tzv. White korekcie (robustné
smerodajné chyby) sa smerodajné odhady upravili tak, aby boli výsledky
spoľahlivé aj v prípade, že by rozptyl chýb nebol rovnaký.
Z výsledkov vyplýva, že: - Agriculture má
negatívny a štatisticky významný vplyv – teda čím väčší
podiel ľudí pracuje v poľnohospodárstve, tým je spravidla nižšia
nezamestnanosť.
- log(GDP) je tiež negatívny a
významný, čo znamená, že bohatšie krajiny majú nižšiu
mieru nezamestnanosti.
- Industry nie je štatisticky významný, takže jeho
vplyv na nezamestnanosť nie je jednoznačný.
- Konštanta (Intercept) je významná, čo potvrdzuje, že model ako celok
je stabilný a vhodný na interpretáciu.
Výsledky po tejto korekcii sú teda presnejšie a
menej ovplyvnené tým, či majú krajiny rôzny rozptyl v údajoch.
Záver časti o heteroskedasticite
Na základe testov a grafov môžeme povedať, že v našich dátach sa
nepotvrdila prítomnosť výraznej
heteroskedasticity.
Rozptyl rezíduí je v modeloch pomerne stabilný, najmä po logaritmickej
transformácii HDP.
White korekcia ukázala, že aj keby sa v dátach mierna nerovnomernosť
vyskytla, výsledky modelu ostávajú spoľahlivé a
interpretovateľné.
Celkovo možno zhrnúť, že model2 (so zlogaritmovaným
HDP) lepšie spĺňa predpoklady lineárnej regresie a poskytuje
stabilnejšie odhady,
čo znamená, že ho môžeme považovať za vhodný nástroj na
vysvetlenie miery nezamestnanosti medzi krajinami.
LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIkzDrXZpYSBNZWxpY2hvdsOhIgpkYXRlOiAiT2N0b2JlciAyMDI1IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgojIyDDmnZvZCBhIHBvcGlzIGRhdGFiw6F6eQoKViB0ZWp0byDEjWFzdGkgc2EgdGVzdHVqw7ogxaF0YXRpc3RpY2vDqSBoeXBvdMOpenkgcG9tb2NvdSDDumRham92IHogZGF0YWLDoXp5LAprdG9yw6Egb2JzYWh1amUgZWtvbm9taWNrw6kgdWthem92YXRlbGUga3JhasOtbiB2IHJva29jaCAxOTkxIOKAkyAyMDIyLgpQb3XFvml0w6kgcHJlbWVubsOpIHphaMWVxYhhasO6IGhydWLDvSBkb23DoWNpIHByb2R1a3QgKEhEUCkgdiBVU0QsIG1pZXJ1Cm5lemFtZXN0bmFub3N0aSAoJSkgYSDFoXRydWt0w7pydSB6YW1lc3RuYW5vc3RpIHYgdHJvY2ggc2VrdG9yb2NoIOKAkwpwb8S+bm9ob3Nwb2TDoXJzdHZlLCBwcmllbXlzbGUgYSBzbHXFvmLDoWNoLgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoInpvbyIpCmluc3RhbGwucGFja2FnZXMoInRzZXJpZXMiKQppbnN0YWxsLnBhY2thZ2VzKCJsbXRlc3QiKQppbnN0YWxsLnBhY2thZ2VzKCJzYW5kd2ljaCIpCmluc3RhbGwucGFja2FnZXMoImNhciIpCmxpYnJhcnkoem9vKQpsaWJyYXJ5KHRzZXJpZXMpIApsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCnJtKGxpc3Q9bHMoKSkKYGBgCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpgYGAKCmBgYHtyfQojIEltcG9ydCB2bGFzdG7DqWhvIENTViBzw7pib3J1Cgp1ZGFqZSA8LSByZWFkLmNzdigiRW1wbG95bWVudF9VbmVtcGxveW1lbnRfR0RQX2RhdGEuY3N2IiwKaGVhZGVyID0gVFJVRSwKc2VwID0gIiwiLApkZWMgPSAiICIsCnN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCiMgWm9icmF6ZW5pZSBwcnbDvWNoIHJpYWRrb3YgYSBuw6F6dm92IHN0xLpwY292CgpoZWFkKHVkYWplKQpjb2xuYW1lcyh1ZGFqZSkKCmBgYAoKIyDDmnZvZCBkbyBwcm9ibMOpbXUsIHN0YW5vdmVuaWUgaHlwb3TDqXoKClJvemhvZGxhIHNvbSBzYSBtb2RlbG92YcWlICoqbWllcnUgbmV6YW1lc3RuYW5vc3RpKioKKCpVbmVtcGxveW1lbnQuUmF0ZSopIHYgesOhdmlzbG9zdGkgb2QgdHJvY2ggdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaCwgYQp0byAqKnBvZGllbHUgemFtZXN0bmFub3N0aSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUqKgooKkVtcGxveW1lbnQuU2VjdG9yLi5BZ3JpY3VsdHVyZSopLCAqKnBvZGllbHUgemFtZXN0bmFub3N0aSB2CnByaWVteXNsZSoqICgqRW1wbG95bWVudC5TZWN0b3IuLkluZHVzdHJ5KikgYSAqKmhydWLDqWhvIGRvbcOhY2Vobwpwcm9kdWt0dSBuYSBvYnl2YXRlxL5hKiogKCpHRFAuLmluLlVTRC4qKS4KCk5hxaFhIHByYWNvdm7DoSBoeXBvdMOpemEgaG92b3LDrSBvICoqxaF0YXRpc3RpY2t5IHbDvXpuYW1ub20gdnBseXZlKioKdsWhZXRrw71jaCB0cm9jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoLCBwcmnEjW9tOgoKLSAgIHUgcHJlbWVubmVqICoqSW5kdXN0cnkqKiBwcmVkcG9rbGFkw6FtZSAqKm5lZ2F0w612bnkgdnBseXYqKiwgdG8KICAgIHpuYW1lbsOhIMSNw61tIHbDpMSNxaHDrSBwb2RpZWwgcHJhY3Vqw7pjaWNoIHYgcHJpZW15c2xlLCB0w71tIG5pxb7FoWlhCiAgICBuZXphbWVzdG5hbm9zxaUsXAotICAgdSBwcmVtZW5uZWogKipHRFAqKiBvxI1ha8OhdmFtZSAqKm5lZ2F0w612bnkgdnBseXYqKiwgdnnFocWhw60gSERQIG5hCiAgICBvYnl2YXRlxL5hIGplIHNwb2plbsO9IHMgbGVwxaFvdSBla29ub21pY2tvdSB2w71rb25ub3PFpW91IGEgdGVkYSBuacW+xaFvdQogICAgbmV6YW1lc3RuYW5vc8Wlb3UsXAotICAgdSBwcmVtZW5uZWogKipBZ3JpY3VsdHVyZSoqIHByZWRwb2tsYWTDoW1lICoqcG96aXTDrXZueSBhbGVibwogICAgbmVqZWRub3puYcSNbsO9IHZwbHl2KiosIHZvIHZ5c3BlbMO9Y2ggZWtvbm9taWvDoWNoIG5pxb7FocOtIHBvZGllbAogICAgcG/Evm5vaG9zcG9kw6Fyc3R2YSBzw7p2aXPDrSBzIG5pxb7FoW91IG5lemFtZXN0bmFub3PFpW91LCB6YXRpYcS+IMSNbyB2bwogICAgdnl2w61qYWrDumNpY2ggc2Ega3Jhamluw6FjaCBtw7TFvmUgYnnFpSBlZmVrdCBvcGHEjW7DvS4KCiMgUHLDrXByYXZhIGRhdGFiw6F6eSwgxI1pc3RlbmllIGEgw7pwcmF2YSDDumRham92CgpCdWRlbWUgcHJhY292YcWlIHMgdmxhc3Ruw71tIHPDumJvcm9tCmBFbXBsb3ltZW50X1VuZW1wbG95bWVudF9HRFBfZGF0YS5jc3ZgLiBLZcSPxb5lIG5pZWt0b3LDqSBob2Rub3R5IG3DtMW+dQpjaMO9YmHFpSBhbGVibyBiecWlIHYgaW5vbSBmb3Jtw6F0ZSwgbmFqcHJ2IGljaCBvxI1pc3TDrW1lIChwcmV0eXB1amVtZQrEjcOtc2VsbsOpIHN0xLpwY2UpIGEgKipjaMO9YmFqw7pjZSBob2Rub3R5IGRvcGxuw61tZSBtZWRpw6Fub20qKiBkYW5lagpwcmVtZW5uZWouIFByZWZlcmVuxI1uZSBwb3XFvmlqZW1lIHJvayAqKjIwMTUqKjsgYWsgdiBkw6F0YWNoIDIwMTUgbmllIGplLAphdXRvbWF0aWNreSB6b2JlcmllbWUgKipwb3NsZWRuw70gZG9zdHVwbsO9IHJvayoqLiBOYSDEj2FsxaFpZSBrcm9reSBzaQpwb25lY2jDoW1lIGvEvsO6xI1vdsOpIHByZW1lbm7DqTogKlVuZW1wbG95bWVudC5SYXRlKiwKKkVtcGxveW1lbnQuU2VjdG9yLi5BZ3JpY3VsdHVyZSosICpFbXBsb3ltZW50LlNlY3Rvci4uSW5kdXN0cnkqLAoqRW1wbG95bWVudC5TZWN0b3IuLlNlcnZpY2VzKiBhICpHRFAuLmluLlVTRC4qLgoKYGBge3J9CiMgUm9idXN0bsOhIHByw61wcmF2YTogYXV0b21hdGlja8OpIG5hbWFwb3ZhbmllIG7DoXp2b3Ygc3TEunBjb3YgKyBpbXB1dMOhY2lhIG1lZGnDoW5vbQoKIyAwKSBOYcSNw610YW5pZSAocG9uZWNoYWogY2hlY2submFtZXMgPSBGQUxTRSwgYWJ5IHNhIG5lbWVuaWxpIG1lbsOhKQp1ZGFqZSA8LSByZWFkLmNzdigKICAiRW1wbG95bWVudF9VbmVtcGxveW1lbnRfR0RQX2RhdGEuY3N2IiwKICBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIsIGRlYyA9ICIuIiwKICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIGNoZWNrLm5hbWVzID0gRkFMU0UKKQoKIyAxKSBQb21vY27DqSBmdW5rY2llCmZpbmRfY29sIDwtIGZ1bmN0aW9uKGNhbmRpZGF0ZXMsIGNvbHMpIHsKICAjIHNrw7pzaSBwcmVzbsO6IHpob2R1IChjYXNlLWluc2Vuc2l0aXZlKSwgcG90b20gJ29ic2FodWplJwogIGxjIDwtIHRvbG93ZXIoY29scykKICAjIHByZXNuw6EgemhvZGEKICBmb3IgKHAgaW4gY2FuZGlkYXRlcykgewogICAgaWR4IDwtIHdoaWNoKGxjID09IHRvbG93ZXIocCkpCiAgICBpZiAobGVuZ3RoKGlkeCkgPT0gMSkgcmV0dXJuKGNvbHNbaWR4XSkKICB9CiAgIyBvYnNhaHVqZSAocmVnZXgvc3Vic3RyaW5nLCBjYXNlLWluc2Vuc2l0aXZlKQogIGZvciAocCBpbiBjYW5kaWRhdGVzKSB7CiAgICBpZHggPC0gZ3JlcCh0b2xvd2VyKHApLCBsYywgZml4ZWQgPSBUUlVFKQogICAgaWYgKGxlbmd0aChpZHgpID49IDEpIHJldHVybihjb2xzW2lkeF1bMV0pCiAgfQogIHJldHVybihOQV9jaGFyYWN0ZXJfKQp9CgpudW1fY2xlYW4gPC0gZnVuY3Rpb24oeCkgewogIGlmIChpcy5udW1lcmljKHgpKSByZXR1cm4oeCkKICB4IDwtIGdzdWIoIlxccyIsICIiLCB4KSAgICMgb2RzdHLDoW5pIG1lZHplcnkKICB4IDwtIGdzdWIoIiwiLCAiIiwgeCkgICAgICMgb2RzdHLDoW5pIHRpc8OtY292w6kgb2RkZcS+LgogIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh4KSkKfQoKIyAyKSBOw6FqZGVtZSBwb8W+YWRvdmFuw6kgc3TEunBjZSAodG9sZXJhbnRuZSBuYSBuw6F6dnkpCmNvbHMgPC0gY29sbmFtZXModWRhamUpCgpjb2xfeWVhciA8LSBmaW5kX2NvbChjKCJZZWFyIiwiUm9rIiksIGNvbHMpCmNvbF91bmVtcCA8LSBmaW5kX2NvbChjKCJVbmVtcGxveW1lbnQuUmF0ZSIsIlVuZW1wbG95bWVudCIsICJVbmVtcGxveW1lbnQgUmF0ZSIpLCBjb2xzKQpjb2xfYWdyaSA8LSBmaW5kX2NvbChjKCJFbXBsb3ltZW50LlNlY3Rvci4uQWdyaWN1bHR1cmUiLCJBZ3JpY3VsdHVyZSIsIkVtcGxveW1lbnQgQWdyaWN1bHR1cmUiKSwgY29scykKY29sX2luZCAgPC0gZmluZF9jb2woYygiRW1wbG95bWVudC5TZWN0b3IuLkluZHVzdHJ5IiwiSW5kdXN0cnkiLCJFbXBsb3ltZW50IEluZHVzdHJ5IiksIGNvbHMpCmNvbF9zZXJ2IDwtIGZpbmRfY29sKGMoIkVtcGxveW1lbnQuU2VjdG9yLi5TZXJ2aWNlcyIsIlNlcnZpY2VzIiwiRW1wbG95bWVudCBTZXJ2aWNlcyIpLCBjb2xzKQpjb2xfZ2RwICA8LSBmaW5kX2NvbChjKCJHRFAuLmluLlVTRC4iLCJHRFAuLmluLlVTRCIsIkdEUCBwZXIgY2FwaXRhIiwiR0RQIiwiZ2RwIiksIGNvbHMpCgptYXBwaW5nIDwtIGMoCiAgWWVhciA9IGNvbF95ZWFyLAogIFVuZW1wbG95bWVudC5SYXRlID0gY29sX3VuZW1wLAogIEFncmljdWx0dXJlID0gY29sX2FncmksCiAgSW5kdXN0cnkgPSBjb2xfaW5kLAogIFNlcnZpY2VzID0gY29sX3NlcnYsCiAgR0RQX2luX1VTRCA9IGNvbF9nZHAKKQpjYXQoIk1hcG92YW5pZSBzdMS6cGNvdjpcbiIpCnByaW50KG1hcHBpbmcpCgojIDMpIE/FoWV0cmksIGFrIHNhIG5pZcSNbyBuZW5hxaFsbwppZiAoYW55KGlzLm5hKG1hcHBpbmcpKSkgewogIHN0b3AoIk5pZWt0b3LDqSBzdMS6cGNlIHNhIG5lbmHFoWxpLiBTa29udHJvbHVqIG1hcG92YW5pZSB2ecWhxaFpZSBhIHByw61wYWRuZSB1cHJhdiBrYW5kaWTDoXRvdi4iKQp9CgojIDQpIFByZXR5cHVqIG5hIG51bWVyaWNrw6kgKGtkZSB0cmViYSkKZm9yIChjbiBpbiB1bmlxdWUoYyhjb2xfeWVhcixjb2xfdW5lbXAsY29sX2FncmksY29sX2luZCxjb2xfc2Vydixjb2xfZ2RwKSkpIHsKICBpZiAoY24gJWluJSBjKGNvbF95ZWFyLGNvbF91bmVtcCxjb2xfYWdyaSxjb2xfaW5kLGNvbF9zZXJ2LGNvbF9nZHApKSB7CiAgICB1ZGFqZVtbY25dXSA8LSBudW1fY2xlYW4odWRhamVbW2NuXV0pCiAgfQp9CgojIDUpIFZ5YmVyIHJvazogMjAxNSwgaW5hayBwb3NsZWRuw70gZG9zdHVwbsO9CnRhcmdldF95ZWFyIDwtIGlmIChhbnkodWRhamVbW2NvbF95ZWFyXV0gPT0gMjAxNSwgbmEucm0gPSBUUlVFKSkgMjAxNSBlbHNlIG1heCh1ZGFqZVtbY29sX3llYXJdXSwgbmEucm0gPSBUUlVFKQpjYXQoIlBvdcW+aXTDvSByb2s6IiwgdGFyZ2V0X3llYXIsICJcbiIpCgojIDYpIFZ5YmVyIGvEvsO6xI1vdsOpIHByZW1lbm7DqSBwcmUgZGFuw70gcm9rCnVkYWplLnkgPC0gdWRhamVbdWRhamVbW2NvbF95ZWFyXV0gPT0gdGFyZ2V0X3llYXIsIGMoY29sX3VuZW1wLGNvbF9hZ3JpLGNvbF9pbmQsY29sX3NlcnYsY29sX2dkcCldCm5hbWVzKHVkYWplLnkpIDwtIGMoIlVuZW1wbG95bWVudC5SYXRlIiwiQWdyaWN1bHR1cmUiLCJJbmR1c3RyeSIsIlNlcnZpY2VzIiwiR0RQX1VTRCIpCgojIDcpIEltcHV0w6FjaWEgbWVkacOhbm9tCmNvbHVtbl9tZWRpYW5zIDwtIHNhcHBseSh1ZGFqZS55LCBtZWRpYW4sIG5hLnJtID0gVFJVRSkKZm9yIChjb2wgaW4gbmFtZXModWRhamUueSkpIHsKICBpZHggPC0gaXMubmEodWRhamUueVtbY29sXV0pCiAgaWYgKGFueShpZHgpKSB1ZGFqZS55W1tjb2xdXVtpZHhdIDwtIGNvbHVtbl9tZWRpYW5zW2NvbF0KfQoKIyA4KSBIb3Rvdm8g4oCTIGRhdGFzZXQgcHJpcHJhdmVuw70gbmEgbW9kZWxvdmFuaWUKc3RyKHVkYWplLnkpCnN1bW1hcnkodWRhamUueSkKCmBgYAoKIyBWaXp1YWxpesOhY2lhIGTDoXQg4oCTIGtvbnRyb2xhIG5lenJvdm5hbG9zdMOtCgpWIHRlanRvIMSNYXN0aSBzYSBwb3pyaWVtZSBuYSByb3psb8W+ZW5pZSBqZWRub3RsaXbDvWNoIHByZW1lbm7DvWNoIHBvbW9jb3UKKipib3hwbG90b3YqKi5cCkNpZcS+b20gamUgemlzdGnFpSwgxI1pIHNhIHYgZMOhdGFjaCBuZW5hY2jDoWR6YWrDuiBuZXpyb3ZuYWxvc3RpLCBleHRyw6ltbmUKaG9kbm90eSBhbGVibyBudWxvdsOpIHBvem9yb3ZhbmlhLlwKUG91xb5pamVtZSDFoXR5cmkgaGxhdm7DqSBwcmVtZW5uw6k6IG1pZXJ1IG5lemFtZXN0bmFub3N0aSwgcG9kaWVsCnBvxL5ub2hvc3BvZMOhcnN0dmEsIHBvZGllbCBwcmllbXlzbHUgYSBIRFAgbmEgb2J5dmF0ZcS+YS4KCmBgYHtyfQojIEJveHBsb3R5IHByZW1lbm7DvWNoIOKAkyBrb250cm9sYSByb3psb8W+ZW5pYSBhIG9kxL5haGzDvWNoIGhvZG7DtHQKCiMgWnZvbMOtbWUgbGVuIHJlbGV2YW50bsOpIHByZW1lbm7DqQp2YXJzX3RvX3Bsb3QgPC0gYygiVW5lbXBsb3ltZW50LlJhdGUiLCJBZ3JpY3VsdHVyZSIsIkluZHVzdHJ5IiwiR0RQX1VTRCIpCgojIE5hc3RhdmVuaWUgZ3JhZmlja8OpaG8gbGF5b3V0dTogMiDDlyAyCnBhcihtZnJvdyA9IGMoMiwgMikpCnBhcihtYXIgPSBjKDQsIDQsIDIsIDEpKQoKIyBQcmUga2HFvmTDvSB2eWJyYW7DvSBzdMS6cGVjIG5ha3Jlc2zDrW1lIGJveHBsb3QKZm9yIChjb2wgaW4gdmFyc190b19wbG90KSB7CiAgYm94cGxvdCgKICAgIHVkYWplLnlbW2NvbF1dLAogICAgbWFpbiA9IGNvbCwKICAgIHhsYWIgPSAiSG9kbm90YSIsCiAgICBjb2wgPSAibGlnaHRibHVlIiwKICAgIGJvcmRlciA9ICJkYXJrYmx1ZSIKICApCn0KCiMgTmFkcGlzIHByZSBjZWzDuiBzYWR1IGdyYWZvdgptdGV4dCgiQm94cGxvdHkgamVkbm90bGl2w71jaCBwcmVtZW5uw71jaCAocm9rIHZ5YnJhbsO9IHByZSBhbmFsw716dSkiLAogICAgICBvdXRlciA9IFRSVUUsIGNleCA9IDEuMiwgZm9udCA9IDIpCgojIFJlc2V0IGxheW91dHUgbmEgMSBncmFmCnBhcihtZnJvdyA9IGMoMSwgMSkpCgpgYGAKCk5hIHrDoWtsYWRlIGJveHBsb3RvdiBtw7TFvmVtZSBwb3pvcm92YcWlIG5hc2xlZG92bsOpIHNrdXRvxI1ub3N0aToKCi0gICAqKlVuZW1wbG95bWVudC5SYXRlKiog4oCTIHbDpMSNxaFpbmEgcG96b3JvdmFuw60gc2Egc8O6c3RyZcSPdWplIHYgc3RyZWRuw71jaAogICAgaG9kbm90w6FjaCwgYXbFoWFrIHYgbmlla3RvcsO9Y2gga3Jhamluw6FjaCBzYSB2eXNreXR1asO6IGFqIGV4dHLDqW1uZQogICAgdnnFocWhaWUgbWllcnkgbmV6YW1lc3RuYW5vc3RpLiBUbyBuYXpuYcSNdWplLCDFvmUgbWVkemkga3JhamluYW1pCiAgICBleGlzdHVqw7ogdsO9cmF6bsOpIHJvemRpZWx5IHYgdHJodSBwcsOhY2UuXAotICAgKipBZ3JpY3VsdHVyZSoqIOKAkyBob2Rub3R5IHNhIHBvaHlidWrDuiB2IMWhaXJva29tIGludGVydmFsZS4gS3JhamlueSBzCiAgICB2ecWhxaHDrW0gcG9kaWVsb20gcG/Evm5vaG9zcG9kw6Fyc3R2YSBtw7TFvnUgbWHFpSBuacW+xaFpdSDDunJvdmXFiAogICAgaW5kdXN0cmlhbGl6w6FjaWUsIMSNbyBzYSDEjWFzdG8gc3DDoWphIHMgdnnFocWhb3UgbmV6YW1lc3RuYW5vc8Wlb3UuXAotICAgKipJbmR1c3RyeSoqIOKAkyB2w6TEjcWhaW5hIGtyYWrDrW4gbcOhIHN0cmVkbsOpIGHFviB2ecWhxaFpZSBob2Rub3R5LCBwcmnEjW9tCiAgICBleHRyw6ltbmUgaG9kbm90eSBzw7ogbWVuZWogxI1hc3TDqS4gVnnFocWhw60gcG9kaWVsIHByaWVteXNsdSBuYXpuYcSNdWplCiAgICByb3p2aW51dGVqxaFpdSBla29ub21pa3UuXAotICAgKipHRFBfVVNEKiog4oCTIHJvemxvxb5lbmllIHVrYXp1amUgdsO9cmF6bsOpIHJvemRpZWx5IHYgZWtvbm9taWNrZWoKICAgIMO6cm92bmkgbWVkemkga3JhamluYW1pLiBOaWVrdG9yw6kgaG9kbm90eSBHRFAgc8O6IHZlxL5taSB2eXNva8OpIOKAkyBpZGUgbwogICAgYm9oYXTFoWllIGtyYWppbnkgcyB2eXNwZWxvdSBla29ub21pa291LCB6YXRpYcS+IMSNbyBpbsOpIG1hasO6IG5pxb7FocOtCiAgICBIRFAsIMSNbyBwb3VrYXp1amUgbmEgZWtvbm9taWNrw7ogbmVyb3Zub3bDoWh1LgoKQ2Vsa292byBib3hwbG90eSBuYXpuYcSNdWrDuiwgxb5lIMO6ZGFqZSBvYnNhaHVqw7ogKipuaWVrb8S+a28gb2TEvmFobMO9Y2gKaG9kbsO0dCoqIChuYWptw6QgdiBwcmVtZW5uw71jaCAqVW5lbXBsb3ltZW50LlJhdGUqIGEgKkdEUF9VU0QqKSwgxI1vIGplCnbFoWFrIHByaSBtZWR6aW7DoXJvZG7DvWNoIGTDoXRhY2ggcHJpcm9kemVuw6kuIFbDpMSNxaFpbmEgaG9kbsO0dCBzYSBuYWNow6FkemEgdgpyZWFsaXN0aWNrb20gcm96c2FodSBhIG5lcG96b3J1amVtZSDFvmlhZG5lIHpqYXZuw6kgbmV6cm92bmFsb3N0aSBha28Kc3lzdGVtYXRpY2vDqSBudWxvdsOpIGhvZG5vdHkuXApUaWV0byB2w71zbGVka3kgcG90dnJkenVqw7osIMW+ZSDDumRhamUgc8O6IHZob2Ruw6kgbmEgxI9hbMWhaWUgbW9kZWxvdmFuaWUuCgojIyBMaW5lw6FybmEgcmVncmVzaWEKCk1vZGVsIG9kaGFkdWplbWUgcHLDrWthem9tIGBsbSgpYC4KClYgbmHFoW9tIHByw61wYWRlIG1vZGVsdWplbWUgKiptaWVydSBuZXphbWVzdG5hbm9zdGkqKgooYFVuZW1wbG95bWVudC5SYXRlYCkgdiB6w6F2aXNsb3N0aSBvZCB0cm9jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoOiAtCnBvZGllbHUgemFtZXN0bmFub3N0aSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUgKGBBZ3JpY3VsdHVyZWApLFwKLSBwb2RpZWx1IHphbWVzdG5hbm9zdGkgdiBwcmllbXlzbGUgKGBJbmR1c3RyeWApLFwKLSBhIGxvZ2FyaXRtdSBocnViw6lobyBkb23DoWNlaG8gcHJvZHVrdHUgbmEgb2J5dmF0ZcS+YSAoYGxvZyhHRFBfVVNEKWApLgoKQ2llxL5vbSBqZSB6aXN0acWlLCBrdG9yw6kgeiB0w71jaHRvIGZha3Rvcm92IMWhdGF0aXN0aWNreSB2w716bmFtbmUKb3ZwbHl2xYh1asO6IG1pZXJ1IG5lemFtZXN0bmFub3N0aS4KCmBgYHtyfQojIFByaWTDoW1lIGxvZ2FyaXRtaWNrw7ogdHJhbnNmb3Jtw6FjaXUgSERQCnVkYWplLnkkbG9nR0RQIDwtIGlmZWxzZSh1ZGFqZS55JEdEUF9VU0QgPiAwLCBsb2codWRhamUueSRHRFBfVVNEKSwgTkFfcmVhbF8pCgojIFrDoWtsYWRuw70gbGluZcOhcm55IG1vZGVsCm1vZGVsIDwtIGxtKFVuZW1wbG95bWVudC5SYXRlIH4gQWdyaWN1bHR1cmUgKyBJbmR1c3RyeSArIGxvZ0dEUCwgZGF0YSA9IHVkYWplLnkpCgojIFPDumhybiB2w71zbGVka292CnN1bW1hcnkobW9kZWwpCgpgYGAKCiMjIERpYWdub3N0aWNrw6kgZ3JhZnkgcmVncmVzbsOpaG8gbW9kZWx1CgpTw7pocm4gb2RoYWRvdmFuw6lobyBtb2RlbHUgbsOhbSBwb3NreXR1amUgc8O6Ym9yIG9kaGFkbnV0w71jaCByZWdyZXNuw71jaAprb2VmaWNpZW50b3YsIGt0b3LDvWNoIHpuYW1pZW5rYSBidWTDuiByb3pvYmVyYW7DqSBuZXNrw7RyLlwKQWsgaG92b3LDrW1lIG8gdmxhc3Rub3N0aWFjaCBtb2RlbHUgYWtvIGNlbGt1LCBwb3pyaW1lIHNhIG5hanNrw7RyIG5hCm5hc2xlZHVqw7pjZSBkaWFnbm9zdGlja8OpIGdyYWZ5LlwKUG9tb2NvdSBuaWNoIHZpZW1lIG92ZXJpxaUsIMSNaSBzw7ogc3BsbmVuw6kgesOha2xhZG7DqSBwcmVkcG9rbGFkeSBsaW5lw6FybmVqCnJlZ3Jlc2llIOKAkyBwcmVkb3bFoWV0a8O9bSAqKm5vcm1hbGl0YSByZXrDrWR1w60qKiwgKipob21vc2tlZGFzdGljaXRhKiogYQoqKmFic2VuY2lhIG9kxL5haGzDvWNoIGhvZG7DtHQqKi4KCmBgYHtyfQojIERpYWdub3N0aWNrw6kgZ3JhZnkgcmVncmVzbsOpaG8gbW9kZWx1CnBhcihtZnJvdyA9IGMoMiwgMikpICAgIyByb3psb8W+ZW5pZSAyIHggMgpwbG90KG1vZGVsKSAgICAgICAgICAgICMgxaF0eXJpIHrDoWtsYWRuw6kgZ3JhZnk6IHJlc2lkdWFscyB2cyBmaXR0ZWQsIFEtUSwgc2NhbGUtbG9jYXRpb24sIHJlc2lkdWFscyB2cyBsZXZlcmFnZQpwYXIobWZyb3cgPSBjKDEsIDEpKSAgICMgcmVzZXQgbmEgMSBncmFmCgpgYGAKCiMjIyBJbnRlcnByZXTDoWNpYSBkaWFnbm9zdGlja8O9Y2ggZ3JhZm92CgoqKjEuIFJlc2lkdWFscyB2cyBGaXR0ZWQgKFJlesOtZHXDoSBvcHJvdGkgdnlyb3ZuYW7DvW0gaG9kbm90w6FtKSoqXApSZXrDrWR1w6Egc2Egcm96a2xhZGFqw7ogcHJpYmxpxb5uZSBzeW1ldHJpY2t5IG9rb2xvIG51bG92ZWogb3NpLCDEjW8gamUKcHJpYXpuaXbDqS5cCsSMZXJ2ZW7DoSBMT0VTUyDEjWlhcmEgamUgcmVsYXTDrXZuZSByb3Zuw6EsIGliYSBtaWVybmUgemFrcml2ZW7DoSBzbWVyb20gaG9yZQpuYSBrb25jaSwgxI1vIG5hem5hxI11amUgKipzbGFiw70gbsOhem5hayBuZWxpbmVhcml0eSoqLCBhbGUgbmllIHrDoXZhxb5uw70KcHJvYmzDqW0uXApSb3pwdHlsIGJvZG92IHpvc3TDoXZhIHByaWJsacW+bmUgcm92bmFrw70gcHJlIHbFoWV0a3kgaG9kbm90eSBmaXR0ZWQg4oCTIHRlZGEKKipuZXBvem9ydWplbWUgdsO9cmF6bsO6IGhldGVyb3NrZWRhc3RpY2l0dSoqLgoKKioyLiBR4oCTUSAocm96cHR5bCkgcGxvdCByZXrDrWR1w60qKlwKQm9keSBzYSB2byB2w6TEjcWhaW5lIHJvenNhaHUgZHLFvmlhIGJsw616a28gNDXCsCBwcmlhbWt5LCBubyBuYSBrb25jb2NoIHNhIG9kCm5laiBtaWVybmUgb2RjaHnEvnVqw7ouXApUbyB6bmFtZW7DoSwgxb5lICoqcm96bG/FvmVuaWUgcmV6w61kdcOtIHNhIGxlbiBtaWVybmUgb2RsacWhdWplIG9kIG5vcm3DoWxuZWhvCnJvemRlbGVuaWEqKiwgcHJpxI1vbSBvZGNow71sa3kgc8O6IHNww7Rzb2JlbsOpIHByYXZkZXBvZG9ibmUgbmlla2/EvmvDvW1pCmV4dHLDqW1ueW1pIHBvem9yb3ZhbmlhbWkuXApDZWxrb3ZvIHbFoWFrIHByZWRwb2tsYWQgbm9ybWFsaXR5IG5pZSBqZSB2w6HFvm5lIHBvcnXFoWVuw70uCgoqKjMuIFNjYWxl4oCTTG9jYXRpb24gcGxvdCoqXArEjGVydmVuw6EgaGxhZGvDoSDEjWlhcmEgamUgdGFrbWVyIHZvZG9yb3Zuw6EgYSByb3pwdHlsIGJvZG92IHBvIG9zaSBYIGplCnByaWJsacW+bmUga29uxaF0YW50bsO9LlwKVG8gcG90dnJkenVqZSwgxb5lICoqcmV6w61kdcOhIG1hasO6IHByaWJsacW+bmUgcm92bmFrw7ogdmFyaWFuY2l1KiogbmFwcmllxI0KY2Vsw71tIHJvenNhaG9tIGhvZG7DtHQgKHByZWRwb2tsYWQgaG9tb3NrZWRhc3RpY2l0eSBqZSBzcGxuZW7DvSkuCgoqKjQuIFJlc2lkdWFscyB2cyBMZXZlcmFnZSAodnBseXZuw6kgcG96b3JvdmFuaWEpKipcClbDpMSNxaFpbmEgcG96b3JvdmFuw60gbcOhIG7DrXpreSBww6Frb3bDvSBlZmVrdCAobGV2ZXJhZ2UgXDwgMC4wNSksIMSNbyB6bmFtZW7DoSwKxb5lIGplZG5vdGxpdsOpIGtyYWppbnkgbmVtYWrDuiBuYWRtZXJuw70gdnBseXYgbmEgb2RoYWRudXTDqSBrb2VmaWNpZW50eS5cCk5pZWtvxL5rbyBib2RvdiAobmFwci4gcyBvem5hxI1lbsOtbSA0NDM4LCA0MzYzLCA0NDQ5KSBzYSBuYWNow6FkemEgYmxpxb7FoWllCmsgb2tyYWp1IENvb2tvdmVqIHZ6ZGlhbGVub3N0aSwgxI1vIG5hem5hxI11amUsIMW+ZSBpZGUgbyAqKm1pZXJuZSB2cGx5dm7DqQpwb3pvcm92YW5pYSoqLCBhbGUgxb5pYWRuZSB6IG5pY2ggbmVwcmVzYWh1amUgaHJhbmljdSAwLjUgxI1pIDEuMCwgdGVkYQoqKsW+aWFkbmUgZXh0csOpbW5lIG9kxL5haGzDqSBob2Rub3R5IHNhIG5lb2JqYXZpbGkqKi4KCmBgYHtyfQojIFRlc3R5IG5vcm1hbGl0eSBhIG9kxL5haGzDvWNoIGhvZG7DtHQKcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhtb2RlbCkKamJfdGVzdCA8LSBqYXJxdWUuYmVyYS50ZXN0KHJlc2lkdWFscykKamJfdGVzdCAgIyBKYXJxdWXigJNCZXJhIHRlc3Qgbm9ybWFsaXR5CgojIE91dGxpZXIgdGVzdCAoQm9uZmVycm9uaSBjb3JyZWN0aW9uKQpvdXRsaWVyX3Rlc3QgPC0gY2FyOjpvdXRsaWVyVGVzdChtb2RlbCkKb3V0bGllcl90ZXN0CgpgYGAKCiMjIyBWw71zbGVka3kgdGVzdHUgb2TEvmFobMO9Y2ggaG9kbsO0dAoKVsO9c3R1cCBmdW5rY2llIGBvdXRsaWVyVGVzdChtb2RlbClgIGlkZW50aWZpa292YWwgcG96b3JvdmFuaWUgcyBpbmRleG9tCioqNDMzNyoqLFwKa3RvcsOpIG3DoSBuYWp2ecWhxaFpdSDFoXR1ZGVudGl6b3ZhbsO6IGhvZG5vdHUgcmV6w61kdWEgYHJzdHVkZW50ID0gMy4yN2AuXApKZWhvIG5lb3ByYXZlbsOhIHAtaG9kbm90YSBqZSAqKjAuMDAxMjcqKiwgYXbFoWFrIHBvIGFwbGlrw6FjaWkKQm9uZmVycm9uaWhvIGtvcmVrY2llXApqZSB2w71zbGVkbsOhIGhvZG5vdGEgKiowLjIzMDY0KiosIHRlZGEgKipuaWUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EgbmEgNSAlCmhsYWRpbmUqKi4KClRvIHpuYW1lbsOhLCDFvmUgaG9jaSB0b3RvIHBvem9yb3ZhbmllIG3DoSBwb21lcm5lIHZ5c29rw6kgcmV6w61kdXVtLFwKKipuaWUgamUgbmF0b8S+a28gZXh0csOpbW5lLCBhYnkgc21lIGhvIHBvdmHFvm92YWxpIHphIMWhdGF0aXN0aWNreSB2w716bmFtbsO9Cm9kxL5haGzDvSBib2QuKipcClYga29udGV4dGUgZWtvbm9taWNrw71jaCBkw6F0IGlkZSBwcmF2ZGVwb2RvYm5lIG8ga3JhamludSBzIG5ldHlwaWNrb3UKa29tYmluw6FjaW91XAp2eXNva8OpaG8gSERQIGEgxaFwZWNpZmlja2VqIMWhdHJ1a3TDunJ5IHphbWVzdG5hbm9zdGksIG5vIGplaiB2cGx5diBuYQpjZWxrb3bDvSBtb2RlbFwKbmllIGplIGRvc3RhdG/EjW5lIHNpbG7DvSwgYWJ5IHNrcmVzbGlsIG9kaGFkeSBrb2VmaWNpZW50b3YuCgpaw6F2ZXJvbSBtb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lICoqbW9kZWwgbmVvYnNhaHVqZSDFvmlhZG5lIHbDvXpuYW1uw6kgb2TEvmFobMOpCnBvem9yb3ZhbmlhKiosXAprdG9yw6kgYnkgb3ZwbHl2xYhvdmFsaSB2w71zbGVka3kgcmVncmVzaWUuCgojIyBBbHRlcm5hdMOtdm55IG1vZGVsCgpBayBzYSB2eXNreXR1asO6IG1pZXJuZSBvZMS+YWhsw6kgaG9kbm90eSBhbGVibyBuZW5vcm1hbGl0YSB2IEdEUCwgbcO0xb5lbWUKdXByYXZpxaUgbW9kZWwgdGFrLFwKxb5lIHBvdcW+aWplbWUgbG9nYXJpdG11cyBIRFAgYSB6bWVuw61tZSDFoXRydWt0w7pydSBzZWt0b3Jvdi5cCk5vdsO9IG1vZGVsIGJ1ZGUgbWHFpSB0dmFyOgoKJCQKVW5lbXBsb3ltZW50LlJhdGVfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIFwsIEluZHVzdHJ5X2kgKyBcYmV0YV8yIFwsIFNlcnZpY2VzX2kgKyBcYmV0YV8zIFwsIFxsb2coR0RQX2kpICsgXHZhcmVwc2lsb25faQokJAoKYGBge3J9CiMgQWx0ZXJuYXTDrXZueSBtb2RlbCBzIGxvZyhHRFApIGEgU2VydmljZXMgbmFtaWVzdG8gQWdyaWN1bHR1cmUKbW9kZWwyIDwtIGxtKFVuZW1wbG95bWVudC5SYXRlIH4gSW5kdXN0cnkgKyBTZXJ2aWNlcyArIGxvZyhHRFBfVVNEKSwgZGF0YSA9IHVkYWplLnkpCnN1bW1hcnkobW9kZWwyKQoKYGBgCgpgYGB7cn0KIyBEaWFnbm9zdGlja8OpIGdyYWZ5IGFsdGVybmF0w612bmVobyBtb2RlbHUKcGFyKG1mcm93ID0gYygyLCAyKSkKcGxvdChtb2RlbDIpCnBhcihtZnJvdyA9IGMoMSwgMSkpCgpgYGAKCmBgYHtyfQojIE5vcm1hbGl0eSBhIG91dGxpZXIgdGVzdCBwcmUgbm92w70gbW9kZWwKcmVzaWR1YWxzMiA8LSByZXNpZHVhbHMobW9kZWwyKQpqYXJxdWUuYmVyYS50ZXN0KHJlc2lkdWFsczIpCmNhcjo6b3V0bGllclRlc3QobW9kZWwyKQoKYGBgCgojIyMgWsOhdmVyCgpOb3bDvSBtb2RlbCBwbyBsb2dhcml0bWlja2VqIHRyYW5zZm9ybcOhY2lpIEhEUCBwb3R2cmR6dWplLCDFvmU6CgotICAgcHJlbWVubsOpICoqcHJpZW15c2VsIChJbmR1c3RyeSkqKiBhICoqSERQIChHRFApKiogbWFqw7ogKipuZWdhdMOtdm55CiAgICB2cGx5diBuYSBtaWVydSBuZXphbWVzdG5hbm9zdGkqKiDigJMgdGVkYSDEjcOtbSBqZSBwb2RpZWwgcHJpZW15c2x1IGEKICAgIMO6cm92ZcWIIEhEUCB2ecWhxaFpYSwgdMO9bSBqZSBuZXphbWVzdG5hbm9zxaUgbmnFvsWhaWEsXAotICAgcHJlbWVubsOhICoqc2x1xb5ieSAoU2VydmljZXMpKiogbcOhICoqc2xhYsWhw60gYWxlYm8gxaF0YXRpc3RpY2t5CiAgICBuZXbDvXpuYW1uw70gdnBseXYqKixcCi0gICByZXrDrWR1w6EgbWFqw7ogcG8gdHJhbnNmb3Jtw6FjaWkgbGVwxaFpZSByb3pkZWxlbmllIGEgbW9kZWwgbmV2eWthenVqZQogICAgesOhdmHFvm7DqSBwb3J1xaFlbmlhIHByZWRwb2tsYWRvdiBsaW5lw6FybmVqIHJlZ3Jlc2llLgoKTmEgesOha2xhZGUgdMO9Y2h0byB2w71zbGVka292IG3DtMW+ZW1lIGtvbsWhdGF0b3ZhxaUsIMW+ZSAqKnVwcmF2ZW7DvSBtb2RlbCBqZQrFoXRhdGlzdGlja3kgc3BvxL5haGxpdsO9LCBzdGFiaWxuw70gYSBkb2JyZSBpbnRlcnByZXRvdmF0ZcS+bsO9KiouXApQb3R2cmR6dWplIHByZWRwb2tsYWQsIMW+ZSAqKnZ5xaHFoWlhIGVrb25vbWlja8OhIMO6cm92ZcWIIGEgcm96dmludXRlasWhw60KcHJpZW15c2VsbsO9IHNla3RvciBwcmlzcGlldmFqw7ogayBuacW+xaFlaiBtaWVyZSBuZXphbWVzdG5hbm9zdGkqKi4KCiMgSGV0ZXJvc2tlZGFzdGljaXRhCgpQcsOtdG9tbm9zxaUgaGV0ZXJvc2tlZGFzdGljaXR5IChuZWtvbsWhdGFudG7DqWhvIHJvenB0eWx1IG7DoWhvZG5laiB6bG/Fvmt5KSBzcMO0c29idWplIG5lcHJlc27DqSBvZGhhZHkgc21lcm9kYWpuw71jaCBjaMO9YiBhIHTDvW0gYWogbmVzcG/EvmFobGl2w6kgdC10ZXN0eSB2w716bmFtbm9zdGkgamVkbm90bGl2w71jaCByZWdyZXNuw71jaCBrb2VmaWNpZW50b3YuICAKUHJldG8gamUgZMO0bGXFvml0w6ksIGFieSBzbWUgaGV0ZXJvc2tlZGFzdGljaXR1IG5hanBydiAqKmRldGVnb3ZhbGkqKiAocG9tb2NvdSBncmFmb3YgYWxlYm8gdGVzdG92KSBhIHYgcHLDrXBhZGUgamVqIHbDvXNreXR1IHNhIGp1IHBva8O6c2lsaSAqKm9kc3Ryw6FuacWlKiouCgpWIG5hxaFvbSBwcsOtcGFkZSBzYSBwb2vDunNpbWUgdml6dcOhbG5lIHZ5aG9kbm90acWlLCDEjWkgdmFyaWFiaWxpdGEgcmV6w61kdcOtICjFoXR2b3Jjb3YgcmV6w61kdcOtKSB6w6F2aXPDrSBvZCBuaWVrdG9yZWogeiB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoIOKAkyBrb25rcsOpdG5lIG9kICoqSERQIG5hIG9ieXZhdGXEvmEgKEdEUF9VU0QpKiogYSBvZCAqKnBvZGllbHUgemFtZXN0bmFub3N0aSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUgKEFncmljdWx0dXJlKSoqLiAgCkJ1ZGVtZSBwb3Jvdm7DoXZhxaUgZHZhIG1vZGVseToKCi0gKiptb2RlbCoqIOKAkyBww7R2b2Ruw70gbGluZcOhcm55IG1vZGVsIHMgcHJlbWVubm91IGBHRFBfVVNEYCAgCi0gKiptb2RlbDIqKiDigJMgbW9kZWwgc28gemxvZ2FyaXRtb3ZhbsO9bSBIRFAgKGBsb2coR0RQX1VTRClgKSwga3RvcsO9IG3DtMW+ZSBvZHN0csOhbmnFpSB2cGx5diBvZMS+YWhsw71jaCBob2Ruw7R0IGEgc3RhYmlsaXpvdmHFpSB2YXJpYW5jaXUKCgoKYGBge3J9CgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQoKIyDFoHR2b3JjZSByZXrDrWR1w60geiBww7R2b2Ruw6lobyBtb2RlbHUKcDEgPC0gZ2dwbG90KHVkYWplLnksIGFlcyh4ID0gR0RQX1VTRCwgeSA9IHJlc2lkKG1vZGVsKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgsIGNvbG9yID0gImRhcmtyZWQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicGluayIsIGxpbmV3aWR0aCA9IDEuNSkgKwogIGxhYnMoeCA9ICJIRFAgbmEgb2J5dmF0ZcS+YSAoR0RQX1VTRCkiLCAKICAgICAgIHkgPSAixaB0dm9yY2UgcmV6w61kdcOtIiwKICAgICAgIHRpdGxlID0gIlNxdWFyZWQgUmVzaWR1YWxzIHZzIEdEUF9VU0QgKG1vZGVsKSIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgRHJ1aMO9IGdyYWY6IHBvxL5ub2hvc3BvZMOhcnN0dm8KcDIgPC0gZ2dwbG90KHVkYWplLnksIGFlcyh4ID0gQWdyaWN1bHR1cmUsIHkgPSByZXNpZChtb2RlbCleMikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44LCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJza3libHVlIiwgbGluZXdpZHRoID0gMS41KSArCiAgbGFicyh4ID0gIlBvZGllbCB6YW1lc3RuYW5vc3RpIHYgcG/Evm5vaG9zcG9kw6Fyc3R2ZSAoJSkiLCAKICAgICAgIHkgPSAixaB0dm9yY2UgcmV6w61kdcOtIiwKICAgICAgIHRpdGxlID0gIlNxdWFyZWQgUmVzaWR1YWxzIHZzIEFncmljdWx0dXJlIChtb2RlbCkiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIFpvYnJhemVuaWUgdmVkxL5hIHNlYmEKcDEgKyBwMgoKYGBgCgojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGtvdgoKViBncmFmZSAqKuKAnsWgdHZvcmNlIHJlesOtZHXDrSB2cyBHRFBfVVNE4oCcKiogbW/Fvm5vIHZpZGllxaUsIMW+ZSBwcmkgbmnFvsWhw61jaCBob2Rub3TDoWNoIEhEUCBqZSByb3pwdHlsIHJlesOtZHXDrSB2w6TEjcWhw60gYSBzIHJhc3TDumNpbSBIRFAgc2Egem5pxb51amUuICAKVG8gbmF6bmHEjXVqZSwgxb5lICoqdiBla29ub21pY2t5IHNsYWLFocOtY2gga3Jhamluw6FjaCBqZSBuZXphbWVzdG5hbm9zxaUgbWVuZWogc3RhYmlsbsOhKiosIHphdGlhxL4gxI1vIHZvIHZ5c3BlbMO9Y2ggZWtvbm9taWvDoWNoIHPDuiBvZGNow71sa3kgb2QgbW9kZWx1IG1lbsWhaWUuICAKUm96cHR5bCB0ZWRhICoqbmllIGplIMO6cGxuZSBrb27FoXRhbnRuw70qKiwgxI1vIHBvdWthenVqZSBuYSBtaWVybnUgaGV0ZXJvc2tlZGFzdGljaXR1IHZvIHZ6xaVhaHUgayBIRFAuCgpWIGRydWhvbSBncmFmZSAqKuKAnsWgdHZvcmNlIHJlesOtZHXDrSB2cyBBZ3JpY3VsdHVyZeKAnCoqIHNhIGJvZHkgcm96a2xhZGFqw7ogcG9tZXJuZSByb3Zub21lcm5lIGJleiB2aWRpdGXEvm7DqWhvIHRyZW5kdS4gIApUbyB6bmFtZW7DoSwgxb5lICoqcG9kaWVsIHphbWVzdG5hbm9zdGkgdiBwb8S+bm9ob3Nwb2TDoXJzdHZlIHByYXZkZXBvZG9ibmUgbmVzcMO0c29idWplIGhldGVyb3NrZWRhc3RpY2l0dSoqIGEgamVobyB2cGx5diBuYSByb3pwdHlsIGNow71iIGplIG1pbmltw6FsbnkuCgpDZWxrb3ZvIG1vxb5ubyBwb3ZlZGHFpSwgxb5lICoqcm96cHR5bCByZXrDrWR1w60gc2EgbWVuw60gcHJlZG92xaFldGvDvW0gcyBIRFAqKiwgbmllIHMgb3N0YXRuw71taSBwcmVtZW5uw71taS4gIApWIMSPYWzFoW9tIGtyb2t1IHByZXRvIHBvdcW+aWplbWUgKipsb2dhcml0bWlja8O6IHRyYW5zZm9ybcOhY2l1IEhEUCoqLCBrdG9yw6EgYnkgbWFsYSB0w7p0byBuZXJvdm5vbWVybm9zxaUgem1pZXJuacWlIGEgbW9kZWwgc3ByZXNuacWlLgoKCmBgYHtyfQptb2RlbDIgPC0gbG0oVW5lbXBsb3ltZW50LlJhdGUgfiBBZ3JpY3VsdHVyZSArIEluZHVzdHJ5ICsgU2VydmljZXMgKyBsb2coR0RQX1VTRCksIGRhdGEgPSB1ZGFqZS55KQpgYGAKCgpgYGB7cn0KIyBNb2RlbCBzIGxvZ2FyaXRtb20gSERQCm1vZGVsMiA8LSBsbShVbmVtcGxveW1lbnQuUmF0ZSB+IEFncmljdWx0dXJlICsgSW5kdXN0cnkgKyBTZXJ2aWNlcyArIGxvZyhHRFBfVVNEKSwgZGF0YSA9IHVkYWplLnkpCgojIFNrw7ptYW5pZSBoZXRlcm9za2VkYXN0aWNpdHkg4oCTIHZpenXDoWxuZSBwcmUgbW9kZWwyCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwYXRjaHdvcmspCgojIMWgdHZvcmNlIHJlesOtZHXDrSB2cyBsb2coR0RQKQpwMSA8LSBnZ3Bsb3QodWRhamUueSwgYWVzKHggPSBsb2coR0RQX1VTRCksIHkgPSByZXNpZChtb2RlbDIpXjIpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNiwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsIGNvbG9yID0gImdyZWVuIiwgbGluZXdpZHRoID0gMSkgKwogIGxhYnMoeCA9ICJsb2coSERQIG5hIG9ieXZhdGXEvmEpIiwgCiAgICAgICB5ID0gIsWgdHZvcmNlIHJlesOtZHXDrSIsCiAgICAgICB0aXRsZSA9ICJTcXVhcmVkIFJlc2lkdWFscyB2cyBsb2coR0RQX1VTRCkgKG1vZGVsMikiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIMWgdHZvcmNlIHJlesOtZHXDrSB2cyBwb8S+bm9ob3Nwb2TDoXJzdHZvCnAyIDwtIGdncGxvdCh1ZGFqZS55LCBhZXMoeCA9IEFncmljdWx0dXJlLCB5ID0gcmVzaWQobW9kZWwyKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYsIGNvbG9yID0gInB1cnBsZTQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAib3JjaGlkIiwgbGluZXdpZHRoID0gMSkgKwogIGxhYnMoeCA9ICJBZ3JpY3VsdHVyZSIsIAogICAgICAgeSA9ICLFoHR2b3JjZSByZXrDrWR1w60iLAogICAgICAgdGl0bGUgPSAiU3F1YXJlZCBSZXNpZHVhbHMgdnMgQWdyaWN1bHR1cmUgKG1vZGVsMikiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIFpvYnJhemVuaWUgZ3JhZm92IHZlZMS+YSBzZWJhCnAxICsgcDIKCmBgYAoKCgojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGtvdiBwbyBsb2dhcml0bWlja2VqIHRyYW5zZm9ybcOhY2lpIEhEUAoKUG8gYXBsaWtvdmFuw60gbG9nYXJpdG1pY2tlaiB0cmFuc2Zvcm3DoWNpZSBIRFAgdmlkw61tZSwgxb5lIHJvenB0eWwgcmV6w61kdcOtIHNhICoqdsO9cmF6bmUgc3RhYmlsaXpvdmFsKiouICAKViBncmFmZSAqKuKAnsWgdHZvcmNlIHJlesOtZHXDrSB2cyBsb2coR0RQX1VTRCnigJ0qKiBqZSBMT0VTUyBrcml2a2EgKHplbGVuw6EgbMOtbmlhKSB0YWttZXIgdm9kb3Jvdm7DoSBhIGJvZHkgc8O6IHJvemxvxb5lbsOpIHJvdm5vbWVybmUgbmFwcmllxI0gaG9kbm90YW1pIEhEUC4gIApUbyB6bmFtZW7DoSwgxb5lICoqbG9nYXJpdG1pY2vDoSB0cmFuc2Zvcm3DoWNpYSBvZHN0csOhbmlsYSB2w6TEjcWhaW51IGhldGVyb3NrZWRhc3RpY2l0eSoqLCBrdG9yw6EgYm9sYSBwcsOtdG9tbsOhIHYgcMO0dm9kbm9tIG1vZGVsaS4KClYgZ3JhZmUgKirigJ7FoHR2b3JjZSByZXrDrWR1w60gdnMgQWdyaWN1bHR1cmXigJ0qKiBvc3TDoXZhIHJvenB0eWwgYm9kb3YgcG9tZXJuZSByb3Zub21lcm7DvSBhIGJleiBqYXNuw6lobyB0cmVuZHUuICAKVG8gcG90dnJkenVqZSwgxb5lICoqcG9kaWVsIHphbWVzdG5hbm9zdGkgdiBwb8S+bm9ob3Nwb2TDoXJzdHZlIG5lbcOhIHrDoXNhZG7DvSB2cGx5diBuYSB2YXJpYWJpbGl0dSBjaMO9YioqLgoKQ2Vsa292byBtw7TFvmVtZSB1emF2cmllxaUsIMW+ZSBwbyBsb2dhcml0bWlja2VqIMO6cHJhdmUgSERQIHNhIG1vZGVsIHNwcsOhdmEgKipzdGFiaWxuZWrFoWllIGEgbGVwxaFpZSBzcMS6xYhhIHByZWRwb2tsYWQga29uxaF0YW50bsOpaG8gcm96cHR5bHUgKGhvbW9za2VkYXN0aWNpdHkpKiouICAKVGFrdG8gdXByYXZlbsO9IG1vZGVsIGplIHByZXRvICoqc3BvxL5haGxpdmVqxaHDrSBhIHZob2RuZWrFocOtIG5hIGVrb25vbWlja8O6IGludGVycHJldMOhY2l1KiouCgojIyBUZXN0b3ZhbmllIHByw610b21ub3N0aSBoZXRlcm9za2VkYXN0aWNpdHkKCmBgYHtyfQojIEluc3RhbGwgKGlmIG5vdCB5ZXQgaW5zdGFsbGVkKQojIGluc3RhbGwucGFja2FnZXMoImxtdGVzdCIpCgojIExvYWQgdGhlIHBhY2thZ2UKbGlicmFyeShsbXRlc3QpCgojIFJ1biB0aGUgQnJldXNjaOKAk1BhZ2FuIHRlc3QKYnB0ZXN0KG1vZGVsKQoKYGBgCmBgYHtyfQojIEluc3RhbGwgKGlmIG5vdCB5ZXQgaW5zdGFsbGVkKQojIGluc3RhbGwucGFja2FnZXMoImxtdGVzdCIpCgojIExvYWQgdGhlIHBhY2thZ2UKbGlicmFyeShsbXRlc3QpCgojIFJ1biB0aGUgQnJldXNjaOKAk1BhZ2FuIHRlc3QKYnB0ZXN0KG1vZGVsMikKCmBgYAoKIyMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrb3YgdGVzdHUgaGV0ZXJvc2tlZGFzdGljaXR5CgpQb2TEvmEgdsO9c2xlZGtvdiAqKkJyZXVzY2jigJNQYWdhbiB0ZXN0dSoqOgoKLSBwcmUgcMO0dm9kbsO9IG1vZGVsICgqbW9kZWwqKSBwbGF0w606ICAKICAqKkJQID0gNy4xNjcqKiwgZGYgPSAzLCAqKnAtdmFsdWUgPSAwLjA2Njc2KioKCi0gcHJlIG1vZGVsIHNvIHpsb2dhcml0bW92YW7DvW0gSERQICgqbW9kZWwyKikgcGxhdMOtOiAgCiAgKipCUCA9IDguMTM3NioqLCBkZiA9IDQsICoqcC12YWx1ZSA9IDAuMDg2NjcqKgoKViBvYm9jaCBwcsOtcGFkb2NoIGplIGhvZG5vdGEgKnAtdmFsdWUqIHbDpMSNxaFpYSBha28gMC4wNSwgdGFrxb5lICoqbmV6YW1pZXRhbWUgbnVsb3bDuiBoeXBvdMOpenUqKi4gIApUbyB6bmFtZW7DoSwgxb5lICoqdiBtb2RlbG9jaCBuaWUgamUgcHLDrXRvbW7DoSB2w716bmFtbsOhIGhldGVyb3NrZWRhc3RpY2l0YSoqIOKAkyB0ZWRhIHJvenB0eWwgY2jDvWIgamUgcHJpYmxpxb5uZSByb3ZuYWvDvS4KCkhvZG5vdGEgKnAtdmFsdWUqIHYgcMO0dm9kbm9tIG1vZGVsaSAoKm1vZGVsKikgamUgdsWhYWsgdHJvY2h1IG5pxb7FoWlhIChhc2kgMC4wNyksIMSNbyBtw7TFvmUgbmF6bmHEjW92YcWlICoqbWllcm55IG7DoXpuYWsgbmVyb3ZuYWvDqWhvIHJvenB0eWx1KiouICAKViBtb2RlbGkgcyBsb2dhcml0bW9tIEhEUCAoKm1vZGVsMiopIHNhIHRlbnRvIHByb2Jsw6ltIGXFoXRlIHZpYWMgem1pZXJuaWwsIHRha8W+ZSBtw7TFvmVtZSBwb3ZlZGHFpSwgIArFvmUgKipsb2dhcml0bWlja8OhIMO6cHJhdmEgSERQIHBvbW9obGEgemxlcMWhacWlIHZsYXN0bm9zdGkgbW9kZWx1KiouCgpDZWxrb3ZvIHRlZGEgKiptb2RlbDIqKiBzcMS6xYhhIHByZWRwb2tsYWR5IGxpbmXDoXJuZWogcmVncmVzaWUgbGVwxaFpZSBhIGplICoqc3BvxL5haGxpdmVqxaHDrSBuYSBpbnRlcnByZXTDoWNpdSoqLgoKCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInNhbmR3aWNoIikKI2luc3RhbGwucGFja2FnZXMoImxtdGVzdCIpCmxpYnJhcnkoc2FuZHdpY2gpCmxpYnJhcnkobG10ZXN0KQpjb2VmdGVzdChtb2RlbCwgdmNvdiA9IHZjb3ZIQyhtb2RlbCkpCgoKYGBgCgoKIyMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrb3YgcG8gV2hpdGUga29yZWtjaWkKClBvIGFwbGlrb3ZhbsOtIHR6di4gKipXaGl0ZSBrb3Jla2NpZSoqIChyb2J1c3Ruw6kgc21lcm9kYWpuw6kgY2h5YnkpIHNhIHNtZXJvZGFqbsOpIG9kaGFkeSB1cHJhdmlsaSB0YWssIGFieSBib2xpIHbDvXNsZWRreSBzcG/EvmFobGl2w6kgYWogdiBwcsOtcGFkZSwgxb5lIGJ5IHJvenB0eWwgY2jDvWIgbmVib2wgcm92bmFrw70uCgpaIHbDvXNsZWRrb3YgdnlwbMO9dmEsIMW+ZToKLSAqKkFncmljdWx0dXJlKiogbcOhICoqbmVnYXTDrXZueSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2Kiog4oCTIHRlZGEgxI3DrW0gdsOkxI3FocOtIHBvZGllbCDEvnVkw60gcHJhY3VqZSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUsIHTDvW0gamUgc3ByYXZpZGxhICoqbmnFvsWhaWEgbmV6YW1lc3RuYW5vc8WlKiouICAKLSAqKmxvZyhHRFApKiogamUgdGllxb4gKipuZWdhdMOtdm55IGEgdsO9em5hbW7DvSoqLCDEjW8gem5hbWVuw6EsIMW+ZSAqKmJvaGF0xaFpZSBrcmFqaW55IG1hasO6IG5pxb7FoWl1IG1pZXJ1IG5lemFtZXN0bmFub3N0aSoqLiAgCi0gKipJbmR1c3RyeSoqIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgdGFrxb5lIGplaG8gdnBseXYgbmEgbmV6YW1lc3RuYW5vc8WlICoqbmllIGplIGplZG5vem5hxI1uw70qKi4gIAotIEtvbsWhdGFudGEgKEludGVyY2VwdCkgamUgdsO9em5hbW7DoSwgxI1vIHBvdHZyZHp1amUsIMW+ZSBtb2RlbCBha28gY2Vsb2sgamUgKipzdGFiaWxuw70gYSB2aG9kbsO9IG5hIGludGVycHJldMOhY2l1KiouCgpWw71zbGVka3kgcG8gdGVqdG8ga29yZWtjaWkgc8O6IHRlZGEgKipwcmVzbmVqxaFpZSoqIGEgbWVuZWogb3ZwbHl2bmVuw6kgdMO9bSwgxI1pIG1hasO6IGtyYWppbnkgcsO0em55IHJvenB0eWwgdiDDumRham9jaC4KCgojIyMgWsOhdmVyIMSNYXN0aSBvIGhldGVyb3NrZWRhc3RpY2l0ZQoKTmEgesOha2xhZGUgdGVzdG92IGEgZ3JhZm92IG3DtMW+ZW1lIHBvdmVkYcWlLCDFvmUgdiBuYcWhaWNoIGTDoXRhY2ggc2EgKipuZXBvdHZyZGlsYSBwcsOtdG9tbm9zxaUgdsO9cmF6bmVqIGhldGVyb3NrZWRhc3RpY2l0eSoqLiAgClJvenB0eWwgcmV6w61kdcOtIGplIHYgbW9kZWxvY2ggcG9tZXJuZSBzdGFiaWxuw70sIG5ham3DpCBwbyBsb2dhcml0bWlja2VqIHRyYW5zZm9ybcOhY2lpIEhEUC4gIApXaGl0ZSBrb3Jla2NpYSB1a8OhemFsYSwgxb5lIGFqIGtlYnkgc2EgdiBkw6F0YWNoIG1pZXJuYSBuZXJvdm5vbWVybm9zxaUgdnlza3l0bGEsIHbDvXNsZWRreSBtb2RlbHUgb3N0w6F2YWrDuiAqKnNwb8S+YWhsaXbDqSBhIGludGVycHJldG92YXRlxL5uw6kqKi4KCkNlbGtvdm8gbW/Fvm5vIHpocm7DusWlLCDFvmUgKiptb2RlbDIgKHNvIHpsb2dhcml0bW92YW7DvW0gSERQKSoqIGxlcMWhaWUgc3DEusWIYSBwcmVkcG9rbGFkeSBsaW5lw6FybmVqIHJlZ3Jlc2llIGEgcG9za3l0dWplICoqc3RhYmlsbmVqxaFpZSBvZGhhZHkqKiwgIArEjW8gem5hbWVuw6EsIMW+ZSBobyBtw7TFvmVtZSBwb3Zhxb5vdmHFpSB6YSAqKnZob2Ruw70gbsOhc3Ryb2ogbmEgdnlzdmV0bGVuaWUgbWllcnkgbmV6YW1lc3RuYW5vc3RpIG1lZHppIGtyYWppbmFtaS4qKgo=