cat(’

’)

Import údajov z mojej bakalárskej práce

Načítam si csv súbor s dátami o elektromobilite vo V4. Sú to dáta, ktoré som používala na bakalársku prácu, je tam počet batériových elektrických vozidiel, hybridných vozidiel, EPI index, ktorý rozpráva o ekologickej vyspelosti krajín, emisie CO2 atď.Dáta už boli prečistené, tak v tomto zadaní nebolo treba ďalšie dočisťovanie.

data<-read.csv("data_r_comma_utf8.csv")

Úvod do problému, stanovenie hypotéz

Rozhodla som sa skúmať, či rozšírenie elektromobility súvisí s kvalitou životného prostredia meranou indexom environmentálnej výkonnosti (EPI). Budem pracovať s panelom krajín a rokov v mojom datasete (elektromobilita a súvisiace ukazovatele). Zaujíma ma, či vyšší počet registrovaných batériových elektromobilov (BEV) a BEV_PHEV (súčet BEV a plug-in hybridov) prispieva k lepšiemu skóre EPI, po zohľadnení hospodárskej úrovne a ďalších faktorov.Sledujeme krajiny V4. Teoreticky očakávame, že prechod na vozidlá s nižšími emisiami výfukových plynov, spolu s investíciami do infraštruktúry a zdrojov, zlepší kvalitu ovzdušia a environmentálne výsledky – čo by sa malo prejaviť vyšším EPI. Uvedomujeme si však, že EPI je zložený index (klíma, ovzdušie, voda, biodiverzita, odpadová politika…), preto do modelu zaradíme aj kontrolné premenné.

Závislá premenná:

EPI – index environmentálnej výkonnosti.

Kľúčové vysvetľujúce premenné:

BEV – počet batériových elektromobilov.

BEV_PHEV – počet BEV + plug-in hybridov.

Kontrolné premenné (podľa dostupnosti v dátach):

HDP (HDP na obyvateľa),

co2 (emise CO₂),

investičné/rozvojové ukazovatele: res_develop, r_sources, unvest_man, invest_sources, invest_transport

Hypotézy

Nulová hypotéza (H0): Počet BEV ani BEV_PHEV nemá štatisticky významný vplyv na EPI. Hlavná hypotéza (H1): Vyšší počet BEV aj BEV_PHEV je spojený s vyšším EPI (pozitívny vplyv).

if (!exists("udaje")) {
udaje <- read.csv("data_r_comma_utf8.csv", header = TRUE, check.names = FALSE)
}
par(mfrow = c(2, 2))

boxplot(udaje$EPI,                main = "EPI (bez log)",     col = "darkgreen", horizontal = TRUE)
boxplot(log1p(udaje$BEV),         main = "log1p(BEV)",        col = "lightblue", horizontal = TRUE)
boxplot(log1p(udaje$BEV_PHEV),    main = "log1p(BEV_PHEV)",   col = "darkgreen", horizontal = TRUE)
boxplot(log1p(udaje$HDP),         main = "log1p(HDP)",        col = "lightblue", horizontal = TRUE)

par(mfrow = c(1, 1))

Boxploty ukazujú, že hodnota indexu EPI je v mojom súbore sústredená okolo 70 bodov a celkový rozptyl je skôr menší; objavuje sa však jeden nižší odľahlý prípad (≈50), na ktorý ďalej upozorňujem v diagnostike modelu. Po log-transformácii počtových premenných BEV a BEV_PHEV (log1p) sa rozdelenia výrazne stabilizovali – boxy sú symetrickejšie, bez extrémnych chvostov a s menšou vzdialenosťou od kvartilov, čo je priaznivé pre lineárne modelovanie. Premenná HDP má po logu veľmi úzky rozsah, takže v modeli bude pôsobiť najmä ako kontrola úrovne rozvoja, bez výraznych odľahlostí.

Lineárna regresia

# (1) Načítam data
udaje <- read.csv("data_r_comma_utf8.csv", header = TRUE, check.names = FALSE)

# (2) Lineárna regresia – dve alternatívy bez kolinearity (log1p)
# Model A: EPI ~ log1p(BEV) + log1p(HDP)
m_bev  <- lm(EPI ~ log1p(BEV) + log1p(HDP), data = udaje)

# Model B: EPI ~ log1p(BEV_PHEV) + log1p(HDP)
m_phev <- lm(EPI ~ log1p(BEV_PHEV) + log1p(HDP), data = udaje)

# (3) Súhrn výsledkov (obe)
summary(m_bev)

Call:
lm(formula = EPI ~ log1p(BEV) + log1p(HDP), data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.1351  -4.4467  -0.8368   4.9316  15.2734 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -16.7362    36.6646  -0.456  0.65016    
log1p(BEV)   -3.6278     0.6707  -5.409 2.09e-06 ***
log1p(HDP)   11.6591     4.0185   2.901  0.00564 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.358 on 47 degrees of freedom
Multiple R-squared:  0.3839,    Adjusted R-squared:  0.3577 
F-statistic: 14.64 on 2 and 47 DF,  p-value: 1.14e-05
summary(m_phev)

Call:
lm(formula = EPI ~ log1p(BEV_PHEV) + log1p(HDP), data = udaje)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.005  -4.389  -1.012   4.244  14.395 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)     -24.7863    35.9496  -0.689  0.49392    
log1p(BEV_PHEV)  -3.8147     0.6564  -5.811 5.19e-07 ***
log1p(HDP)       12.8282     3.9667   3.234  0.00224 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.149 on 47 degrees of freedom
Multiple R-squared:  0.4184,    Adjusted R-squared:  0.3936 
F-statistic:  16.9 on 2 and 47 DF,  p-value: 2.947e-06
# Voliteľne: robustné SE (HC1) pre oba modely
library(lmtest); library(sandwich)
coeftest(m_bev,  vcov = vcovHC(m_bev,  type = "HC1"))

t test of coefficients:

             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -16.73620   37.34531 -0.4481 0.656106    
log1p(BEV)   -3.62776    0.76151 -4.7639 1.86e-05 ***
log1p(HDP)   11.65906    4.11228  2.8352 0.006733 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
coeftest(m_phev, vcov = vcovHC(m_phev, type = "HC1"))

t test of coefficients:

                 Estimate Std. Error t value  Pr(>|t|)    
(Intercept)     -24.78627   37.46093 -0.6617  0.511422    
log1p(BEV_PHEV)  -3.81473    0.77914 -4.8961 1.194e-05 ***
log1p(HDP)       12.82820    4.15931  3.0842  0.003413 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# (4) Model pre diagnostické grafy 
# napr. ak chceš diagnostikovať PHEV model:
model <- m_phev

# (5) Diagnostické grafy pre vybraný model
par(mfrow = c(2, 2))
plot(model)
par(mfrow = c(1, 1))

NA
NA

Residuals vs Fitted (reziduá vs. predikované): body sú okolo nuly, ale krivka je jemne zakrivená. → Model nie je úplne priamka; môže mu chýbať nejaká premena alebo jej log/štvorec. Rozptyl sa mierne mení pri vyšších hodnotách, čiže môže ísť o slabú neustálu varianciu (heteroskedasticitu).

Q–Q plot: väčšina bodov sedí na priamke, konce sa však odchyľujú. → Reziduá nie sú dokonale normálne — v „chvostoch“ je viac extrémov, než by ideálne bolo. To väčšinou nevadí dramaticky, ale je dobré o tom vedieť.

Scale–Location: čiara nie je úplne vodorovná. → Potvrdzuje to, že rozptyl chýb nie je úplne rovnaký pre všetky predikované hodnoty (slabá heteroskedasticita).

Residuals vs Leverage: je tam jeden bod s veľkým vplyvom (označený napr. 41). → Tento záznam môže ťahať výsledky modelu. Oplatí sa skontrolovať, či je to chyba v dátach alebo legitímne extrémny prípad.

Krajšie typy grafov pre lineárnu regresiu s použitím farby

library(broom)
library(dplyr)
library(ggplot2)
library(patchwork)

clr <- "#0E6B4D"

# diagnostický dataframe + vlastné ID
diag <- augment(model) %>%
  mutate(id = dplyr::row_number())   # naše popisky

# prah pre Cookovu vzdialenosť
cook_cut <- 4 / nrow(diag)
lab_df <- filter(diag, .cooksd > cook_cut)

# 1) Residuals vs Fitted
p1 <- ggplot(diag, aes(.fitted, .resid)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey60") +
  geom_point(alpha = .75, color = clr) +
  geom_smooth(method = "loess", se = FALSE, color = clr) +
  labs(title = "Residuals vs Fitted", x = "Fitted values", y = "Residuals") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))

# 2) Normal Q–Q
p2 <- ggplot(diag, aes(sample = .std.resid)) +
  stat_qq(color = clr, alpha = .9) +
  stat_qq_line(color = "grey45") +
  labs(title = "Normal Q–Q", x = "Theoretical Quantiles", y = "Standardized residuals") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))

# 3) Scale–Location
p3 <- ggplot(diag, aes(.fitted, sqrt(abs(.std.resid)))) +
  geom_point(alpha = .75, color = clr) +
  geom_smooth(method = "loess", se = FALSE, color = clr) +
  labs(title = "Scale–Location", x = "Fitted values",
       y = expression(sqrt("|Standardized residuals|"))) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))

# 4) Residuals vs Leverage + popisky vplyvných bodov
p4 <- ggplot(diag, aes(.hat, .std.resid)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey60") +
  geom_point(alpha = .75, color = clr) +
  geom_smooth(method = "loess", se = FALSE, color = clr) +
  geom_text(data = lab_df, aes(label = id), vjust = -0.5, size = 3) +
  labs(title = "Residuals vs Leverage", x = "Hat values", y = "Standardized residuals") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))

# 2×2 panel
(p1 + p2) / (p3 + p4)

Inferenciu uvádzam s robustnými štandardnými chybami (HC1).

library(lmtest); library(sandwich)
coeftest(model, vcov = vcovHC(model, type = "HC1"))

t test of coefficients:

                 Estimate Std. Error t value  Pr(>|t|)    
(Intercept)     -24.78627   37.46093 -0.6617  0.511422    
log1p(BEV_PHEV)  -3.81473    0.77914 -4.8961 1.194e-05 ***
log1p(HDP)       12.82820    4.15931  3.0842  0.003413 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
cat("\nPozn.: V zátvorkách sú robustné štandardné chyby (HC1). * p<0,10; ** p<0,05; *** p<0,01.\n")

Pozn.: V zátvorkách sú robustné štandardné chyby (HC1). * p<0,10; ** p<0,05; *** p<0,01.

Použila som robustné štandardné chyby (HC1), lebo grafy ukázali, že chyby nemajú všade rovnaký rozptyl a pár bodov má väčší vplyv. Bežné chyby by v takom prípade podhodnotili neistotu a p-hodnoty by boli príliš optimistické. Robustné chyby preto dávajú spoľahlivejšie p-hodnoty a intervaly pri tých istých koeficientoch.

Q-Q plot

Q–Q plot porovnáva kvantily štandardizovaných rezíduí s teoretickými normálnymi kvantilmi. Väčšina bodov leží pri priamke, no na koncoch sú mierne odchýlky, čo naznačuje ľahkú odchýlku od normality v chvostoch. Predpoklad normality je približne splnený; pre istotu uvádzam aj robustné smerodajné chyby.

# Q–Q plot rezíduí (samostatne)

qqnorm(rstandard(model)); qqline(rstandard(model))

NA
NA

Na Q–Q grafe vidno, že väčšina bodov leží blízko referenčnej priamky, takže rozdelenie rezíduí je približne normálne v strede. Na oboch koncoch sa body od priamky odchýlia – vľavo dole sú o niečo nižšie a vpravo hore vyššie než by boli pri dokonalej normalite. To znamená, že v chvostoch je pár extrémnejších hodnôt (mierne ťažšie chvosty), ale celkový tvar je inak veľmi blízky normalite.

plot(model, which = 2)  # which=2 = Q–Q plot

Na Q–Q grafe vidno, že väčšina boodov leží blízko priamky, takže moje reziduá sa správajú približne normálne .Menšie odchýlky sú na oboch koncoch grafu – vľavo dole a vpravo hore – čo znamená, že v chvostoch mám pár extrémnejších hodnôt.

Scale-Location plot

Body sú rozmiestnené pomerne rovnomerne naprieč osou X, bez výrazneho lievika.Červená LOESS krivka je len jemne naklonená – variancia rezíduí sa mierne mení, preto reportujem robustné štandardné chyby

Beriem to tak, že predpoklad konštantnej variability je približne splnený; pre istotu však uvádzam aj výsledky s robustnými smerodajnými chybami. Niekoľko bodov je mierne nad hodnotou 1,5 na osi Y, ale nejde o extrémne anomálie.


if (!exists("model")) {
if (!exists("udaje")) {
udaje <- read.csv("data_r_comma_utf8.csv", header = TRUE, check.names = FALSE)
}
model <- lm(EPI ~ log1p(BEV) + log1p(BEV_PHEV) + HDP, data = udaje)
}

# Scale–Location plot (which = 3)

plot(model, which = 3)

Graf Residuals vs Leverage ukazuje, aký veľký vplyv môžu mať jednotlivé pozorovania na priamku. Väčšina bodov je pri nízkom leverage a má malé reziduá, takže väčšina záznamov model neťahá.Vidieť však 1–2 body bližšie k bodkovaným krivkám Cookovej vzdialenosti – to sú potenciálne vplyvné pozorovania. Tie si kontrolujem testami a porovnám výsledky modelu s/bez nich.Záver: dáta sú vo všeobecnosti v poriadku; kvôli týmto bodom uvádzam aj robustné smerodajné chyby a robím doplnkovú kontrolu vplyvných bodov

# Residuals vs Leverage (s Cookovou vzdialenosťou)

plot(model, which = 5)

äčšina bodov má nízky leverage; zopár pozorovaní (20, 31, 41, 48) má vyšší leverage a/vyššie Cookovo D, teda môžu mať väčší vplyv na odhady. Hodnoty Cookovej vzdialenosti sú zvýšené, no nie extrémne.

library(car)
library(lmtest); library(sandwich)

# Kombinácia leverage × rezíduum × Cook’s D (označí najpodozrivejšie body)

influencePlot(model, main = "Influence plot")


# Najsilnejší outlier (Bonferroni p-value)

outlierTest(model)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
# Robustné smerodajné chyby pre istotu

coeftest(model, vcov = vcovHC(model, type = "HC1"))

t test of coefficients:

                 Estimate Std. Error t value  Pr(>|t|)    
(Intercept)     -24.78627   37.46093 -0.6617  0.511422    
log1p(BEV_PHEV)  -3.81473    0.77914 -4.8961 1.194e-05 ***
log1p(HDP)       12.82820    4.15931  3.0842  0.003413 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Bonferroni test neidentifikoval žiadny štatisticky významný outlier (p ≥ 0,05), takže problémom nie je jeden „chybný“ bod s extrémnym reziduom, skôr kombinácia leverage a rezíduí pri pár pozorovaniach. Pri log-špecifikácii vychádza HDP pozitívny a štatisticky významný, čo je v súlade s očakávaním (vyššia ekonomická úroveň súvisí s lepším EPI). Premenná log1p(BEV) nie je štatisticky významná – nulovú hypotézu o nulovom efekte nedokážeme zamietnuť. V tomto modeli teda nemáme dôkaz, že počet BEV súvisí s EPI.

# Model A: EPI ~ log(BEV) + HDP
m_bev  <- lm(EPI ~ log1p(BEV) + HDP, data = udaje)
summary(m_bev); coeftest(m_bev, vcov = vcovHC(m_bev, type = "HC1"))

Call:
lm(formula = EPI ~ log1p(BEV) + HDP, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.0909  -4.1711  -0.7445   5.2535  14.7114 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) 86.8956784  4.7398188  18.333  < 2e-16 ***
log1p(BEV)  -3.5939951  0.6665698  -5.392 2.21e-06 ***
HDP          0.0005466  0.0001900   2.877  0.00603 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.367 on 47 degrees of freedom
Multiple R-squared:  0.3823,    Adjusted R-squared:  0.356 
F-statistic: 14.54 on 2 and 47 DF,  p-value: 1.211e-05


t test of coefficients:

               Estimate  Std. Error t value  Pr(>|t|)    
(Intercept) 86.89567837  5.43343513 15.9928 < 2.2e-16 ***
log1p(BEV)  -3.59399513  0.75667089 -4.7497  1.95e-05 ***
HDP          0.00054656  0.00019420  2.8144  0.007115 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Model B: EPI ~ log(BEV_PHEV) + HDP
m_phev <- lm(EPI ~ log1p(BEV_PHEV) + HDP, data = udaje)
summary(m_phev); coeftest(m_phev, vcov = vcovHC(m_phev, type = "HC1"))

Call:
lm(formula = EPI ~ log1p(BEV_PHEV) + HDP, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.8667  -4.2839  -0.6805   4.3720  13.7936 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)     89.2739287  4.7887883  18.642  < 2e-16 ***
log1p(BEV_PHEV) -3.8005552  0.6530506  -5.820 5.04e-07 ***
HDP              0.0006089  0.0001877   3.243  0.00218 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.145 on 47 degrees of freedom
Multiple R-squared:  0.419, Adjusted R-squared:  0.3942 
F-statistic: 16.94 on 2 and 47 DF,  p-value: 2.877e-06


t test of coefficients:

                   Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)     89.27392868  5.80102043 15.3893 < 2.2e-16 ***
log1p(BEV_PHEV) -3.80055516  0.78549751 -4.8384  1.45e-05 ***
HDP              0.00060888  0.00019776  3.0789  0.003464 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# porovnanie kvality
AIC(m_bev, m_phev)
NA

Vysvetlenie kontroly: Aby som sa vyhla kolinearite, odhadla som samostatne model s BEV a model s BEV_PHEV. Porovnanie AIC ukázalo, že lepšie sedí model s BEV_PHEV. V ňom je HDP pozitívne a významné, kým BEV_PHEV vychádza negatívne a vysoko významne. To je v rozpore s pôvodným očakávaním pozitívneho efektu elektromobility na EPI, a v diskusii uvádzam možné dôvody (napr. načasovanie – rýchly nárast PHEV bez okamžitého zlepšenia EPI, reálne emisie PHEV, iné environmentálne domény v EPI)

Načasovanie: oneskorený vplyv elektromobility (lag o 1 rok)

library(dplyr)

udaje_lag <- udaje %>%
arrange(Krajina, Rok) %>%
group_by(Krajina) %>%
mutate(lag_BEV_PHEV = dplyr::lag(BEV_PHEV, 1)) %>%
ungroup()

m_lag <- lm(EPI ~ log1p(lag_BEV_PHEV) + HDP + factor(Krajina) + factor(Rok), data = udaje_lag)
coeftest(m_lag, vcov = vcovCL(m_lag, cluster = ~ Krajina, type = "HC1"))

t test of coefficients:

                          Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)             50.8959137  65.0340670  0.7826 0.4399939    
log1p(lag_BEV_PHEV)     -2.0425584   1.5285689 -1.3363 0.1915136    
HDP                      0.0020646   0.0038335  0.5386 0.5941504    
factor(Krajina)EU-avrg -20.6979705  37.5633150 -0.5510 0.5857037    
factor(Krajina)MR        9.5261676  25.1708980  0.3785 0.7077543    
factor(Krajina)PL        7.3166762  26.7654445  0.2734 0.7864475    
factor(Krajina)SK        4.1908401  12.0927337  0.3466 0.7313421    
factor(Rok)2016          9.5399727   2.4016859  3.9722 0.0004121 ***
factor(Rok)2017         -1.4413973   3.0279243 -0.4760 0.6374981    
factor(Rok)2018         -8.1105733   5.3325433 -1.5210 0.1387416    
factor(Rok)2019        -10.1512429   6.6783228 -1.5200 0.1389742    
factor(Rok)2020         -7.7457174   3.0950422 -2.5026 0.0180056 *  
factor(Rok)2021        -15.1063011   6.3794152 -2.3680 0.0245284 *  
factor(Rok)2022        -18.9950331   7.2001178 -2.6382 0.0130861 *  
factor(Rok)2023         -6.9375471   8.2719932 -0.8387 0.4082826    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Štandardizované koeficienty = porovnateľná sila efektov

Uvidíme, ktorý prediktor má najväčší „zásah“ do EPI.

m_std <- lm(scale(EPI) ~ scale(log1p(BEV_PHEV)) + scale(HDP), data = udaje)
summary(m_std)

Call:
lm(formula = scale(EPI) ~ scale(log1p(BEV_PHEV)) + scale(HDP), 
    data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.61936 -0.46663 -0.07412  0.47622  1.50247 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)             4.914e-16  1.101e-01   0.000  1.00000    
scale(log1p(BEV_PHEV)) -7.921e-01  1.361e-01  -5.820 5.04e-07 ***
scale(HDP)              4.414e-01  1.361e-01   3.243  0.00218 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7783 on 47 degrees of freedom
Multiple R-squared:  0.419, Adjusted R-squared:  0.3942 
F-statistic: 16.94 on 2 and 47 DF,  p-value: 2.877e-06

Najväčší „zásah“ má v tomto štandardizovanom modeli log1p(BEV_PHEV).

Po štandardizácii vychádza, že 1 SD nárast log(BEV_PHEV) súvisí s poklesom EPI o ~0.79 SD (p < 0.001), zatiaľ čo 1 SD nárast HDP súvisí s nárastom EPI o ~0.44 SD (p = 0.002); model vysvetľuje ~42 % variability EPI

library(dplyr)
library(kableExtra)

## 1) Slovné zhrnutie diagnostiky a výsledkov

t1 <- tibble(
`Q–Q plot` = "Väčšina bodov pri priamke; mierne odchýlky v chvostoch → normalita približne OK (reportujem robustné SE).",
`Scale-Location` = "LOESS jemne naklonený → slabá heteroskedasticita (riešená robustnými SE).",
`Residuals vs Leverage` = "Vplyvné body (20, 31, 35, 48); Bonferroni neoznačil extrémny outlier.",
`Výsledky regresie` = "Lepší je model s log1p(BEV_PHEV)+HDP (AIC ≈ 343 < 346). HDP: pozitívny a významný; log1p(BEV_PHEV): negatívny a vysoko významný; BEV nevýznamné."
)

emerald_light <- "#ECFDF5"  # pozadie buniek
emerald_head  <- "#D1FAE5"  # hlavička
emerald_text  <- "#065F46"  # tmavozelený text

kbl(t1, caption = "Diagnostika a výsledky – stručné zhrnutie", booktabs = TRUE) %>%
kable_classic(full_width = TRUE, html_font = "Helvetica") %>%
row_spec(0, background = emerald_head, color = emerald_text, bold = TRUE) %>%
column_spec(1:4, background = emerald_light, color = emerald_text, border_left = TRUE, border_right = TRUE)
Diagnostika a výsledky – stručné zhrnutie
Q–Q plot Scale-Location Residuals vs Leverage Výsledky regresie
Väčšina bodov pri priamke; mierne odchýlky v chvostoch → normalita približne OK (reportujem robustné SE). LOESS jemne naklonený → slabá heteroskedasticita (riešená robustnými SE). Vplyvné body (20, 31, 35, 48); Bonferroni neoznačil extrémny outlier. Lepší je model s log1p(BEV_PHEV)+HDP (AIC ≈ 343 < 346). HDP: pozitívny a významný; log1p(BEV_PHEV): negatívny a vysoko významný; BEV nevýznamné.

## 2) Rozhodnutia o hypotézach

t2 <- tibble::tribble(
  ~Premenná,  ~`H1 (očakávanie)`,            ~`Rozhodnutie o H0`,            ~`Rozhodnutie o H1`,                  ~Poznámka,
  "BEV",      "β_BE V > 0 (pozitívny)",       "ZAMIETAM (významné)",          "ZAMIETAM (efekt je záporný)",       "V modeli EPI ~ log1p(BEV)+log1p(HDP) je log1p(BEV) významne negatívny.",
  "BEV_PHEV", "β_PHEV > 0 (pozitívny)",       "ZAMIETAM (významné)",          "ZAMIETAM (efekt je záporný)",       "log1p(BEV_PHEV) významne negatívny; model s PHEV má nižší AIC."
)

kbl(t2, caption = "Hypotézy a rozhodnutia (robustné SE, log-špecifikácie)", booktabs = TRUE) %>%
kable_classic(full_width = FALSE, html_font = "Helvetica") %>%
row_spec(0, background = emerald_head, color = emerald_text, bold = TRUE) %>%
column_spec(1:ncol(t2), background = emerald_light, color = emerald_text)
Hypotézy a rozhodnutia (robustné SE, log-špecifikácie)
Premenná H1 (očakávanie) Rozhodnutie o H0 Rozhodnutie o H1 Poznámka
BEV β_BE V > 0 (pozitívny) ZAMIETAM (významné) ZAMIETAM (efekt je záporný) V modeli EPI ~ log1p(BEV)+log1p(HDP) je log1p(BEV) významne negatívny.
BEV_PHEV β_PHEV > 0 (pozitívny) ZAMIETAM (významné) ZAMIETAM (efekt je záporný) log1p(BEV_PHEV) významne negatívny; model s PHEV má nižší AIC.
NA

Záver

Výsledky naznačujú, že HDP má na EPI pozitívny a štatisticky významný vplyv. V modeli s BEV (log-transformácia) je koeficient log1p(BEV) záporný a významný; v alternatívnom modeli s BEV_PHEV vychádza koeficient takisto záporný a významný. Podľa AIC dátam lepšie sedí verzia s BEV_PHEV. Štandardizované koeficienty ukazujú, že +1 SD log(BEV_PHEV) súvisí s ≈ −0,79 SD EPI (p < 0,001), zatiaľ čo +1 SD HDP s ≈ +0,44 SD EPI (p ≈ 0,002). Model vysvetľuje približne 40–42 % variability EPI. Diagnostika rezíduí ukázala len mierne odchýlky v chvostoch a slabú heteroskedasticitu; preto uvádzam robustné štandardné chyby (HC1). Niekoľko vplyvných bodov kvalitatívne závery nemení. Celkovo výsledky podporujú význam ekonomickej úrovne pre environmentálnu výkonnosť, no priame priaznivé prepojenie elektromobility s EPI sa v tomto súbore nepreukázalo; skôr vychádza negatívna asociácia. Možné dôvody: načasovanie efektov (prejav neskôr), reálne emisie PHEV a fakt, že EPI zachytáva viac domén než len dopravu.

LS0tCnRpdGxlOiAiQW5hbMO9emEgZMOhdCBvIGVsZWt0cm9tb2JpbGl0ZSIKYXV0aG9yOiBTaW1vbmEgVmFuxI1vdsOhCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY3NzOiBzdHlsZXNncmVlbi5jc3MKLS0tCgpjYXQoJwoKYGBgez1odG1sfQo8c3R5bGU+Ci8qIHNtYXJhZ2Rvdm8gemVsZW7DoSAqLwpoMSwgaDEudGl0bGUsIC50aXRsZSB7IGNvbG9yOiAjMDc1RTU0ICFpbXBvcnRhbnQ7IH0KZW0sIGkgeyBjb2xvcjogIzA3NUU1NCAhaW1wb3J0YW50OyB9Cjwvc3R5bGU+CmBgYAoKJykKCiMgWyoqSW1wb3J0IMO6ZGFqb3YgeiBtb2plaiBiYWthbMOhcnNrZWogcHLDoWNlKipde3N0eWxlPSJjb2xvcjojMDc1RTU0OyBmb250LXdlaWdodDo3MDA7In0KCk5hxI3DrXRhbSBzaSBjc3Ygc8O6Ym9yIHMgKmTDoXRhbWkgbyBlbGVrdHJvbW9iaWxpdGUgdm8gVjQqLiBTw7ogdG8gZMOhdGEsIGt0b3LDqSBzb20gcG91xb7DrXZhbGEgbmEgYmFrYWzDoXJza3UgcHLDoWN1LCBqZSB0YW0gcG/EjWV0IGJhdMOpcmlvdsO9Y2ggZWxla3RyaWNrw71jaCB2b3ppZGllbCwgaHlicmlkbsO9Y2ggdm96aWRpZWwsIEVQSSBpbmRleCwga3RvcsO9IHJvenByw6F2YSBvIGVrb2xvZ2lja2VqIHZ5c3BlbG9zdGkga3JhasOtbiwgZW1pc2llIENPMiBhdMSPLkTDoXRhIHXFviBib2xpIHByZcSNaXN0ZW7DqSwgdGFrIHYgdG9tdG8gemFkYW7DrSBuZWJvbG8gdHJlYmEgxI9hbMWhaWUgZG/EjWlzxaVvdmFuaWUuCgpgYGB7cn0KZGF0YTwtcmVhZC5jc3YoImRhdGFfcl9jb21tYV91dGY4LmNzdiIpCmBgYAoKIyDDmnZvZCBkbyBwcm9ibMOpbXUsIHN0YW5vdmVuaWUgaHlwb3TDqXoKClJvemhvZGxhIHNvbSBzYSAqKnNrw7ptYcWlLCDEjWkgcm96xaHDrXJlbmllIGVsZWt0cm9tb2JpbGl0eSBzw7p2aXPDrSBzIGt2YWxpdG91IMW+aXZvdG7DqWhvIHByb3N0cmVkaWEgbWVyYW5vdSBpbmRleG9tIGVudmlyb25tZW50w6FsbmVqIHbDvWtvbm5vc3RpIChFUEkpLioqIEJ1ZGVtIHByYWNvdmHFpSBzIHBhbmVsb20ga3JhasOtbiBhIHJva292IHYgbW9qb20gZGF0YXNldGUgKGVsZWt0cm9tb2JpbGl0YSBhIHPDunZpc2lhY2UgdWthem92YXRlbGUpLiBaYXVqw61tYSBtYSwgxI1pIHZ5xaHFocOtIHBvxI1ldCByZWdpc3Ryb3ZhbsO9Y2ggYmF0w6lyaW92w71jaCBlbGVrdHJvbW9iaWxvdiAoQkVWKSBhIEJFVl9QSEVWIChzw7rEjWV0IEJFViBhIHBsdWctaW4gaHlicmlkb3YpIHByaXNwaWV2YSBrIGxlcMWhaWVtdSBza8OzcmUgRVBJLCBwbyB6b2jEvmFkbmVuw60gaG9zcG9kw6Fyc2tlaiDDunJvdm5lIGEgxI9hbMWhw61jaCBmYWt0b3Jvdi5TbGVkdWplbWUga3JhamlueSBWNC4gVGVvcmV0aWNreSBvxI1ha8OhdmFtZSwgxb5lIHByZWNob2QgbmEgdm96aWRsw6EgcyBuacW+xaHDrW1pIGVtaXNpYW1pIHbDvWZ1a292w71jaCBwbHlub3YsIHNwb2x1IHMgaW52ZXN0w61jaWFtaSBkbyBpbmZyYcWhdHJ1a3TDunJ5IGEgemRyb2pvdiwgemxlcMWhw60ga3ZhbGl0dSBvdnpkdcWhaWEgYSBlbnZpcm9ubWVudMOhbG5lIHbDvXNsZWRreSDigJMgxI1vIGJ5IHNhIG1hbG8gcHJlamF2acWlIHZ5xaHFocOtbSBFUEkuIFV2ZWRvbXVqZW1lIHNpIHbFoWFrLCDFvmUgRVBJIGplIHpsb8W+ZW7DvSBpbmRleCAoa2zDrW1hLCBvdnpkdcWhaWUsIHZvZGEsIGJpb2RpdmVyeml0YSwgb2RwYWRvdsOhIHBvbGl0aWth4oCmKSwgcHJldG8gZG8gbW9kZWx1IHphcmFkw61tZSBhaiBrb250cm9sbsOpIHByZW1lbm7DqS4KCiMjIFrDoXZpc2zDoSBwcmVtZW5uw6E6CgpFUEkg4oCTIGluZGV4IGVudmlyb25tZW50w6FsbmVqIHbDvWtvbm5vc3RpLgoKIyMgS8S+w7rEjW92w6kgdnlzdmV0xL51asO6Y2UgcHJlbWVubsOpOgoKQkVWIOKAkyBwb8SNZXQgYmF0w6lyaW92w71jaCBlbGVrdHJvbW9iaWxvdi4KCkJFVl9QSEVWIOKAkyBwb8SNZXQgQkVWICsgcGx1Zy1pbiBoeWJyaWRvdi4KCiMjIEtvbnRyb2xuw6kgcHJlbWVubsOpIChwb2TEvmEgZG9zdHVwbm9zdGkgdiBkw6F0YWNoKToKCkhEUCAoSERQIG5hIG9ieXZhdGXEvmEpLAoKY28yIChlbWlzZSBDT+KCgiksCgppbnZlc3RpxI1uw6kvcm96dm9qb3bDqSB1a2F6b3ZhdGVsZTogcmVzX2RldmVsb3AsIHJfc291cmNlcywgdW52ZXN0X21hbiwgaW52ZXN0X3NvdXJjZXMsIGludmVzdF90cmFuc3BvcnQKCiMgSHlwb3TDqXp5CgoqTnVsb3bDoSBoeXBvdMOpemEgKEgwKToqIFBvxI1ldCBCRVYgYW5pIEJFVl9QSEVWIG5lbcOhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2IG5hIEVQSS4gKkhsYXZuw6EgaHlwb3TDqXphIChIMSk6KiBWecWhxaHDrSBwb8SNZXQgQkVWIGFqIEJFVl9QSEVWIGplIHNwb2plbsO9IHMgdnnFocWhw61tIEVQSSAocG96aXTDrXZueSB2cGx5dikuCgpgYGB7cn0KaWYgKCFleGlzdHMoInVkYWplIikpIHsKdWRhamUgPC0gcmVhZC5jc3YoImRhdGFfcl9jb21tYV91dGY4LmNzdiIsIGhlYWRlciA9IFRSVUUsIGNoZWNrLm5hbWVzID0gRkFMU0UpCn0KcGFyKG1mcm93ID0gYygyLCAyKSkKCmJveHBsb3QodWRhamUkRVBJLCAgICAgICAgICAgICAgICBtYWluID0gIkVQSSAoYmV6IGxvZykiLCAgICAgY29sID0gImRhcmtncmVlbiIsIGhvcml6b250YWwgPSBUUlVFKQpib3hwbG90KGxvZzFwKHVkYWplJEJFViksICAgICAgICAgbWFpbiA9ICJsb2cxcChCRVYpIiwgICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLCBob3Jpem9udGFsID0gVFJVRSkKYm94cGxvdChsb2cxcCh1ZGFqZSRCRVZfUEhFViksICAgIG1haW4gPSAibG9nMXAoQkVWX1BIRVYpIiwgICBjb2wgPSAiZGFya2dyZWVuIiwgaG9yaXpvbnRhbCA9IFRSVUUpCmJveHBsb3QobG9nMXAodWRhamUkSERQKSwgICAgICAgICBtYWluID0gImxvZzFwKEhEUCkiLCAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsIGhvcml6b250YWwgPSBUUlVFKQoKcGFyKG1mcm93ID0gYygxLCAxKSkKCmBgYAoKQm94cGxvdHkgdWthenVqw7osIMW+ZSBob2Rub3RhIGluZGV4dSBFUEkgamUgdiBtb2pvbSBzw7pib3JlIHPDunN0cmVkZW7DoSBva29sbyA3MCBib2RvdiBhIGNlbGtvdsO9IHJvenB0eWwgamUgc2vDtHIgbWVuxaHDrTsgb2JqYXZ1amUgc2EgdsWhYWsgamVkZW4gbmnFvsWhw60gb2TEvmFobMO9IHByw61wYWQgKOKJiDUwKSwgbmEga3RvcsO9IMSPYWxlaiB1cG96b3LFiHVqZW0gdiBkaWFnbm9zdGlrZSBtb2RlbHUuIFBvIGxvZy10cmFuc2Zvcm3DoWNpaSBwb8SNdG92w71jaCBwcmVtZW5uw71jaCBCRVYgYSBCRVZfUEhFViAobG9nMXApIHNhIHJvemRlbGVuaWEgdsO9cmF6bmUgc3RhYmlsaXpvdmFsaSDigJMgYm94eSBzw7ogc3ltZXRyaWNrZWrFoWllLCBiZXogZXh0csOpbW55Y2ggY2h2b3N0b3YgYSBzIG1lbsWhb3UgdnpkaWFsZW5vc8Wlb3Ugb2Qga3ZhcnRpbG92LCDEjW8gamUgcHJpYXpuaXbDqSBwcmUgbGluZcOhcm5lIG1vZGVsb3ZhbmllLiBQcmVtZW5uw6EgSERQIG3DoSBwbyBsb2d1IHZlxL5taSDDunpreSByb3pzYWgsIHRha8W+ZSB2IG1vZGVsaSBidWRlIHDDtHNvYmnFpSBuYWptw6QgYWtvIGtvbnRyb2xhIMO6cm92bmUgcm96dm9qYSwgYmV6IHbDvXJhem55Y2ggb2TEvmFobG9zdMOtLgoKIyBMaW5lw6FybmEgcmVncmVzaWEKCmBgYHtyfQojICgxKSBOYcSNw610YW0gZGF0YQp1ZGFqZSA8LSByZWFkLmNzdigiZGF0YV9yX2NvbW1hX3V0ZjguY3N2IiwgaGVhZGVyID0gVFJVRSwgY2hlY2submFtZXMgPSBGQUxTRSkKCiMgKDIpIExpbmXDoXJuYSByZWdyZXNpYSDigJMgZHZlIGFsdGVybmF0w612eSBiZXoga29saW5lYXJpdHkgKGxvZzFwKQojIE1vZGVsIEE6IEVQSSB+IGxvZzFwKEJFVikgKyBsb2cxcChIRFApCm1fYmV2ICA8LSBsbShFUEkgfiBsb2cxcChCRVYpICsgbG9nMXAoSERQKSwgZGF0YSA9IHVkYWplKQoKIyBNb2RlbCBCOiBFUEkgfiBsb2cxcChCRVZfUEhFVikgKyBsb2cxcChIRFApCm1fcGhldiA8LSBsbShFUEkgfiBsb2cxcChCRVZfUEhFVikgKyBsb2cxcChIRFApLCBkYXRhID0gdWRhamUpCgojICgzKSBTw7pocm4gdsO9c2xlZGtvdiAob2JlKQpzdW1tYXJ5KG1fYmV2KQpzdW1tYXJ5KG1fcGhldikKCiMgVm9saXRlxL5uZTogcm9idXN0bsOpIFNFIChIQzEpIHByZSBvYmEgbW9kZWx5CmxpYnJhcnkobG10ZXN0KTsgbGlicmFyeShzYW5kd2ljaCkKY29lZnRlc3QobV9iZXYsICB2Y292ID0gdmNvdkhDKG1fYmV2LCAgdHlwZSA9ICJIQzEiKSkKY29lZnRlc3QobV9waGV2LCB2Y292ID0gdmNvdkhDKG1fcGhldiwgdHlwZSA9ICJIQzEiKSkKCiMgKDQpIE1vZGVsIHByZSBkaWFnbm9zdGlja8OpIGdyYWZ5IAojIG5hcHIuIGFrIGNoY2XFoSBkaWFnbm9zdGlrb3ZhxaUgUEhFViBtb2RlbDoKbW9kZWwgPC0gbV9waGV2CgojICg1KSBEaWFnbm9zdGlja8OpIGdyYWZ5IHByZSB2eWJyYW7DvSBtb2RlbApwYXIobWZyb3cgPSBjKDIsIDIpKQpwbG90KG1vZGVsKQpwYXIobWZyb3cgPSBjKDEsIDEpKQoKCmBgYAoKKlJlc2lkdWFscyB2cyBGaXR0ZWQgKHJlemlkdcOhIHZzLiBwcmVkaWtvdmFuw6kpOiogYm9keSBzw7ogb2tvbG8gbnVseSwgYWxlIGtyaXZrYSBqZSBqZW1uZSB6YWtyaXZlbsOhLiDihpIgTW9kZWwgbmllIGplIMO6cGxuZSBwcmlhbWthOyBtw7TFvmUgbXUgY2jDvWJhxaUgbmVqYWvDoSBwcmVtZW5hIGFsZWJvIGplaiBsb2cvxaF0dm9yZWMuIFJvenB0eWwgc2EgbWllcm5lIG1lbsOtIHByaSB2ecWhxaHDrWNoIGhvZG5vdMOhY2gsIMSNacW+ZSBtw7TFvmUgw61zxaUgbyBzbGFiw7ogbmV1c3TDoWx1IHZhcmlhbmNpdSAoaGV0ZXJvc2tlZGFzdGljaXR1KS4KCipR4oCTUSBwbG90KjogdsOkxI3FoWluYSBib2RvdiBzZWTDrSBuYSBwcmlhbWtlLCBrb25jZSBzYSB2xaFhayBvZGNoecS+dWrDui4g4oaSIFJlemlkdcOhIG5pZSBzw7ogZG9rb25hbGUgbm9ybcOhbG5lIOKAlCB2IOKAnmNodm9zdG9jaOKAnCBqZSB2aWFjIGV4dHLDqW1vdiwgbmXFviBieSBpZGXDoWxuZSBib2xvLiBUbyB2w6TEjcWhaW5vdSBuZXZhZMOtIGRyYW1hdGlja3ksIGFsZSBqZSBkb2Jyw6kgbyB0b20gdmVkaWXFpS4KCipTY2FsZeKAk0xvY2F0aW9uOiogxI1pYXJhIG5pZSBqZSDDunBsbmUgdm9kb3Jvdm7DoS4g4oaSIFBvdHZyZHp1amUgdG8sIMW+ZSByb3pwdHlsIGNow71iIG5pZSBqZSDDunBsbmUgcm92bmFrw70gcHJlIHbFoWV0a3kgcHJlZGlrb3ZhbsOpIGhvZG5vdHkgKHNsYWLDoSBoZXRlcm9za2VkYXN0aWNpdGEpLgoKKlJlc2lkdWFscyB2cyBMZXZlcmFnZToqIGplIHRhbSBqZWRlbiBib2QgcyB2ZcS+a8O9bSB2cGx5dm9tIChvem5hxI1lbsO9IG5hcHIuIDQxKS4g4oaSIFRlbnRvIHrDoXpuYW0gbcO0xb5lIMWlYWhhxaUgdsO9c2xlZGt5IG1vZGVsdS4gT3BsYXTDrSBzYSBza29udHJvbG92YcWlLCDEjWkgamUgdG8gY2h5YmEgdiBkw6F0YWNoIGFsZWJvIGxlZ2l0w61tbmUgZXh0csOpbW55IHByw61wYWQuCgojIyBLcmFqxaFpZSB0eXB5IGdyYWZvdiBwcmUgbGluZcOhcm51IHJlZ3Jlc2l1IHMgcG91xb5pdMOtbSBmYXJieQpgYGB7cn0KbGlicmFyeShicm9vbSkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBhdGNod29yaykKCmNsciA8LSAiIzBFNkI0RCIKCiMgZGlhZ25vc3RpY2vDvSBkYXRhZnJhbWUgKyB2bGFzdG7DqSBJRApkaWFnIDwtIGF1Z21lbnQobW9kZWwpICU+JQogIG11dGF0ZShpZCA9IGRwbHlyOjpyb3dfbnVtYmVyKCkpICAgIyBuYcWhZSBwb3Bpc2t5CgojIHByYWggcHJlIENvb2tvdnUgdnpkaWFsZW5vc8WlCmNvb2tfY3V0IDwtIDQgLyBucm93KGRpYWcpCmxhYl9kZiA8LSBmaWx0ZXIoZGlhZywgLmNvb2tzZCA+IGNvb2tfY3V0KQoKIyAxKSBSZXNpZHVhbHMgdnMgRml0dGVkCnAxIDwtIGdncGxvdChkaWFnLCBhZXMoLmZpdHRlZCwgLnJlc2lkKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImdyZXk2MCIpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjc1LCBjb2xvciA9IGNscikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsIGNvbG9yID0gY2xyKSArCiAgbGFicyh0aXRsZSA9ICJSZXNpZHVhbHMgdnMgRml0dGVkIiwgeCA9ICJGaXR0ZWQgdmFsdWVzIiwgeSA9ICJSZXNpZHVhbHMiKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpCgojIDIpIE5vcm1hbCBR4oCTUQpwMiA8LSBnZ3Bsb3QoZGlhZywgYWVzKHNhbXBsZSA9IC5zdGQucmVzaWQpKSArCiAgc3RhdF9xcShjb2xvciA9IGNsciwgYWxwaGEgPSAuOSkgKwogIHN0YXRfcXFfbGluZShjb2xvciA9ICJncmV5NDUiKSArCiAgbGFicyh0aXRsZSA9ICJOb3JtYWwgUeKAk1EiLCB4ID0gIlRoZW9yZXRpY2FsIFF1YW50aWxlcyIsIHkgPSAiU3RhbmRhcmRpemVkIHJlc2lkdWFscyIpICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkKCiMgMykgU2NhbGXigJNMb2NhdGlvbgpwMyA8LSBnZ3Bsb3QoZGlhZywgYWVzKC5maXR0ZWQsIHNxcnQoYWJzKC5zdGQucmVzaWQpKSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjc1LCBjb2xvciA9IGNscikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsIGNvbG9yID0gY2xyKSArCiAgbGFicyh0aXRsZSA9ICJTY2FsZeKAk0xvY2F0aW9uIiwgeCA9ICJGaXR0ZWQgdmFsdWVzIiwKICAgICAgIHkgPSBleHByZXNzaW9uKHNxcnQoInxTdGFuZGFyZGl6ZWQgcmVzaWR1YWxzfCIpKSkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKQoKIyA0KSBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgKyBwb3Bpc2t5IHZwbHl2bsO9Y2ggYm9kb3YKcDQgPC0gZ2dwbG90KGRpYWcsIGFlcyguaGF0LCAuc3RkLnJlc2lkKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImdyZXk2MCIpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjc1LCBjb2xvciA9IGNscikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsIGNvbG9yID0gY2xyKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBsYWJfZGYsIGFlcyhsYWJlbCA9IGlkKSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKwogIGxhYnModGl0bGUgPSAiUmVzaWR1YWxzIHZzIExldmVyYWdlIiwgeCA9ICJIYXQgdmFsdWVzIiwgeSA9ICJTdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIikgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKQoKIyAyw5cyIHBhbmVsCihwMSArIHAyKSAvIChwMyArIHA0KQoKYGBgCkluZmVyZW5jaXUgdXbDoWR6YW0gcyByb2J1c3Ruw71taSDFoXRhbmRhcmRuw71taSBjaHliYW1pIChIQzEpLgpgYGB7cn0KbGlicmFyeShsbXRlc3QpOyBsaWJyYXJ5KHNhbmR3aWNoKQpjb2VmdGVzdChtb2RlbCwgdmNvdiA9IHZjb3ZIQyhtb2RlbCwgdHlwZSA9ICJIQzEiKSkKY2F0KCJcblBvem4uOiBWIHrDoXR2b3Jrw6FjaCBzw7ogcm9idXN0bsOpIMWhdGFuZGFyZG7DqSBjaHlieSAoSEMxKS4gKiBwPDAsMTA7ICoqIHA8MCwwNTsgKioqIHA8MCwwMS5cbiIpCgpgYGAKUG91xb5pbGEgc29tIHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkgKEhDMSksIGxlYm8gZ3JhZnkgdWvDoXphbGksIMW+ZSBjaHlieSBuZW1hasO6IHbFoWFkZSByb3ZuYWvDvSByb3pwdHlsIGEgcMOhciBib2RvdiBtw6EgdsOkxI3FocOtIHZwbHl2LiBCZcW+bsOpIGNoeWJ5IGJ5IHYgdGFrb20gcHLDrXBhZGUgcG9kaG9kbm90aWxpIG5laXN0b3R1IGEgcC1ob2Rub3R5IGJ5IGJvbGkgcHLDrWxpxaEgb3B0aW1pc3RpY2vDqS4gUm9idXN0bsOpIGNoeWJ5IHByZXRvIGTDoXZhasO6IHNwb8S+YWhsaXZlasWhaWUgcC1ob2Rub3R5IGEgaW50ZXJ2YWx5IHByaSB0w71jaCBpc3TDvWNoIGtvZWZpY2llbnRvY2guCgojIFEtUSBwbG90CgpR4oCTUSBwbG90IHBvcm92bsOhdmEga3ZhbnRpbHkgxaF0YW5kYXJkaXpvdmFuw71jaCByZXrDrWR1w60gcyB0ZW9yZXRpY2vDvW1pIG5vcm3DoWxueW1pIGt2YW50aWxtaS4gVsOkxI3FoWluYSBib2RvdiBsZcW+w60gcHJpIHByaWFta2UsIG5vIG5hIGtvbmNvY2ggc8O6IG1pZXJuZSBvZGNow71sa3ksIMSNbyBuYXpuYcSNdWplIMS+YWhrw7ogb2RjaMO9bGt1IG9kIG5vcm1hbGl0eSB2IGNodm9zdG9jaC4gUHJlZHBva2xhZCBub3JtYWxpdHkgamUgcHJpYmxpxb5uZSBzcGxuZW7DvTsgcHJlIGlzdG90dSB1dsOhZHphbSBhaiByb2J1c3Ruw6kgc21lcm9kYWpuw6kgY2h5YnkuCgpgYGB7cn0KIyBR4oCTUSBwbG90IHJlesOtZHXDrSAoc2Ftb3N0YXRuZSkKCnFxbm9ybShyc3RhbmRhcmQobW9kZWwpKTsgcXFsaW5lKHJzdGFuZGFyZChtb2RlbCkpCgoKYGBgCgpOYSBR4oCTUSBncmFmZSB2aWRubywgxb5lICp2w6TEjcWhaW5hIGJvZG92IGxlxb7DrSBibMOtemtvIHJlZmVyZW7EjW5laiBwcmlhbWt5KiwgdGFrxb5lIHJvemRlbGVuaWUgcmV6w61kdcOtIGplIHByaWJsacW+bmUgbm9ybcOhbG5lIHYgc3RyZWRlLiBOYSBvYm9jaCBrb25jb2NoIHNhIGJvZHkgb2QgcHJpYW1reSBvZGNow71saWEg4oCTIHbEvmF2byBkb2xlIHPDuiBvIG5pZcSNbyBuacW+xaFpZSBhIHZwcmF2byBob3JlIHZ5xaHFoWllIG5lxb4gYnkgYm9saSBwcmkgZG9rb25hbGVqIG5vcm1hbGl0ZS4gVG8gem5hbWVuw6EsIMW+ZSB2IGNodm9zdG9jaCBqZSBww6FyIGV4dHLDqW1uZWrFocOtY2ggaG9kbsO0dCAobWllcm5lIMWlYcW+xaFpZSBjaHZvc3R5KSwgYWxlIGNlbGtvdsO9IHR2YXIgamUgaW5hayB2ZcS+bWkgYmzDrXpreSBub3JtYWxpdGUuCgpgYGB7cn0KcGxvdChtb2RlbCwgd2hpY2ggPSAyKSAgIyB3aGljaD0yID0gUeKAk1EgcGxvdAoKYGBgCgoqTmEgUeKAk1EgZ3JhZmUgdmlkbm8sIMW+ZSB2w6TEjcWhaW5hIGJvb2RvdiBsZcW+w60gYmzDrXprbyBwcmlhbWt5KiwgdGFrxb5lIG1vamUgcmV6aWR1w6Egc2Egc3Byw6F2YWrDuiBwcmlibGnFvm5lIG5vcm3DoWxuZSAuTWVuxaFpZSBvZGNow71sa3kgc8O6IG5hIG9ib2NoIGtvbmNvY2ggZ3JhZnUg4oCTIHbEvmF2byBkb2xlIGEgdnByYXZvIGhvcmUg4oCTIMSNbyB6bmFtZW7DoSwgxb5lIHYgY2h2b3N0b2NoIG3DoW0gcMOhciBleHRyw6ltbmVqxaHDrWNoIGhvZG7DtHQuCgojIFNjYWxlLUxvY2F0aW9uIHBsb3QKCkJvZHkgc8O6IHJvem1pZXN0bmVuw6kgcG9tZXJuZSByb3Zub21lcm5lIG5hcHJpZcSNIG9zb3UgWCwgYmV6IHbDvXJhem5laG8gbGlldmlrYS7EjGVydmVuw6EgTE9FU1Mga3JpdmthIGplIGxlbiBqZW1uZSBuYWtsb25lbsOhIOKAkyB2YXJpYW5jaWEgcmV6w61kdcOtIHNhIG1pZXJuZSBtZW7DrSwgcHJldG8gcmVwb3J0dWplbSByb2J1c3Ruw6kgxaF0YW5kYXJkbsOpIGNoeWJ5CgpCZXJpZW0gdG8gdGFrLCDFvmUgcHJlZHBva2xhZCBrb27FoXRhbnRuZWogdmFyaWFiaWxpdHkgamUgcHJpYmxpxb5uZSBzcGxuZW7DvTsgcHJlIGlzdG90dSB2xaFhayB1dsOhZHphbSBhaiB2w71zbGVka3kgcyByb2J1c3Ruw71taSBzbWVyb2Rham7DvW1pIGNoeWJhbWkuIE5pZWtvxL5rbyBib2RvdiBqZSBtaWVybmUgbmFkIGhvZG5vdG91IDEsNSBuYSBvc2kgWSwgYWxlIG5lamRlIG8gZXh0csOpbW5lIGFub23DoWxpZS4KCmBgYHtyfQoKaWYgKCFleGlzdHMoIm1vZGVsIikpIHsKaWYgKCFleGlzdHMoInVkYWplIikpIHsKdWRhamUgPC0gcmVhZC5jc3YoImRhdGFfcl9jb21tYV91dGY4LmNzdiIsIGhlYWRlciA9IFRSVUUsIGNoZWNrLm5hbWVzID0gRkFMU0UpCn0KbW9kZWwgPC0gbG0oRVBJIH4gbG9nMXAoQkVWKSArIGxvZzFwKEJFVl9QSEVWKSArIEhEUCwgZGF0YSA9IHVkYWplKQp9CgojIFNjYWxl4oCTTG9jYXRpb24gcGxvdCAod2hpY2ggPSAzKQoKcGxvdChtb2RlbCwgd2hpY2ggPSAzKQoKYGBgCgpHcmFmIFJlc2lkdWFscyB2cyBMZXZlcmFnZSB1a2F6dWplLCBha8O9IHZlxL5rw70gdnBseXYgbcO0xb51IG1hxaUgamVkbm90bGl2w6kgcG96b3JvdmFuaWEgbmEgcHJpYW1rdS4gVsOkxI3FoWluYSBib2RvdiBqZSBwcmkgbsOtemtvbSBsZXZlcmFnZSBhIG3DoSBtYWzDqSByZXppZHXDoSwgdGFrxb5lIHbDpMSNxaFpbmEgesOhem5hbW92IG1vZGVsIG5lxaVhaMOhLlZpZGllxaUgdsWhYWsgMeKAkzIgYm9keSBibGnFvsWhaWUgayBib2Rrb3ZhbsO9bSBrcml2a8OhbSBDb29rb3ZlaiB2emRpYWxlbm9zdGkg4oCTIHRvIHPDuiBwb3RlbmNpw6FsbmUgdnBseXZuw6kgcG96b3JvdmFuaWEuIFRpZSBzaSBrb250cm9sdWplbSB0ZXN0YW1pIGEgcG9yb3Zuw6FtIHbDvXNsZWRreSBtb2RlbHUgcy9iZXogbmljaC5aw6F2ZXI6IGTDoXRhIHPDuiB2byB2xaFlb2JlY25vc3RpIHYgcG9yaWFka3U7IGt2w7RsaSB0w71tdG8gYm9kb20gdXbDoWR6YW0gYWogcm9idXN0bsOpIHNtZXJvZGFqbsOpIGNoeWJ5IGEgcm9iw61tIGRvcGxua292w7oga29udHJvbHUgdnBseXZuw71jaCBib2RvdgoKYGBge3J9CiMgUmVzaWR1YWxzIHZzIExldmVyYWdlIChzIENvb2tvdm91IHZ6ZGlhbGVub3PFpW91KQoKcGxvdChtb2RlbCwgd2hpY2ggPSA1KQoKYGBgCsOkxI3FoWluYSBib2RvdiBtw6EgbsOtemt5IGxldmVyYWdlOyB6b3DDoXIgcG96b3JvdmFuw60gKDIwLCAzMSwgNDEsIDQ4KSBtw6EgdnnFocWhw60gbGV2ZXJhZ2UgYS92ecWhxaFpZSBDb29rb3ZvIEQsIHRlZGEgbcO0xb51IG1hxaUgdsOkxI3FocOtIHZwbHl2IG5hIG9kaGFkeS4gSG9kbm90eSBDb29rb3ZlaiB2emRpYWxlbm9zdGkgc8O6IHp2w73FoWVuw6ksIG5vIG5pZSBleHRyw6ltbmUuCmBgYHtyfQpsaWJyYXJ5KGNhcikKbGlicmFyeShsbXRlc3QpOyBsaWJyYXJ5KHNhbmR3aWNoKQoKIyBLb21iaW7DoWNpYSBsZXZlcmFnZSDDlyByZXrDrWR1dW0gw5cgQ29va+KAmXMgRCAob3puYcSNw60gbmFqcG9kb3pyaXZlasWhaWUgYm9keSkKCmluZmx1ZW5jZVBsb3QobW9kZWwsIG1haW4gPSAiSW5mbHVlbmNlIHBsb3QiKQoKIyBOYWpzaWxuZWrFocOtIG91dGxpZXIgKEJvbmZlcnJvbmkgcC12YWx1ZSkKCm91dGxpZXJUZXN0KG1vZGVsKQoKIyBSb2J1c3Ruw6kgc21lcm9kYWpuw6kgY2h5YnkgcHJlIGlzdG90dQoKY29lZnRlc3QobW9kZWwsIHZjb3YgPSB2Y292SEMobW9kZWwsIHR5cGUgPSAiSEMxIikpCgpgYGAKQm9uZmVycm9uaSB0ZXN0IG5laWRlbnRpZmlrb3ZhbCDFvmlhZG55IMWhdGF0aXN0aWNreSB2w716bmFtbsO9IG91dGxpZXIgKHAg4omlIDAsMDUpLCB0YWvFvmUgcHJvYmzDqW1vbSBuaWUgamUgamVkZW4g4oCeY2h5Ym7DveKAnCBib2QgcyBleHRyw6ltbnltIHJlemlkdW9tLCBza8O0ciBrb21iaW7DoWNpYSBsZXZlcmFnZSBhIHJlesOtZHXDrSBwcmkgcMOhciBwb3pvcm92YW5pYWNoLgpQcmkgbG9nLcWhcGVjaWZpa8OhY2lpIHZ5Y2jDoWR6YSBIRFAgcG96aXTDrXZueSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCDEjW8gamUgdiBzw7psYWRlIHMgb8SNYWvDoXZhbsOtbSAodnnFocWhaWEgZWtvbm9taWNrw6Egw7pyb3ZlxYggc8O6dmlzw60gcyBsZXDFocOtbSBFUEkpLiBQcmVtZW5uw6EgbG9nMXAoQkVWKSBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6Eg4oCTIG51bG92w7ogaHlwb3TDqXp1IG8gbnVsb3ZvbSBlZmVrdGUgbmVkb2vDocW+ZW1lIHphbWlldG51xaUuIFYgdG9tdG8gbW9kZWxpIHRlZGEgbmVtw6FtZSBkw7RrYXosIMW+ZSBwb8SNZXQgQkVWIHPDunZpc8OtIHMgRVBJLgoKYGBge3J9CiMgTW9kZWwgQTogRVBJIH4gbG9nKEJFVikgKyBIRFAKbV9iZXYgIDwtIGxtKEVQSSB+IGxvZzFwKEJFVikgKyBIRFAsIGRhdGEgPSB1ZGFqZSkKc3VtbWFyeShtX2Jldik7IGNvZWZ0ZXN0KG1fYmV2LCB2Y292ID0gdmNvdkhDKG1fYmV2LCB0eXBlID0gIkhDMSIpKQoKIyBNb2RlbCBCOiBFUEkgfiBsb2coQkVWX1BIRVYpICsgSERQCm1fcGhldiA8LSBsbShFUEkgfiBsb2cxcChCRVZfUEhFVikgKyBIRFAsIGRhdGEgPSB1ZGFqZSkKc3VtbWFyeShtX3BoZXYpOyBjb2VmdGVzdChtX3BoZXYsIHZjb3YgPSB2Y292SEMobV9waGV2LCB0eXBlID0gIkhDMSIpKQoKIyBwb3Jvdm5hbmllIGt2YWxpdHkKQUlDKG1fYmV2LCBtX3BoZXYpCgpgYGAKCipWeXN2ZXRsZW5pZSBrb250cm9seToqIEFieSBzb20gc2EgdnlobGEga29saW5lYXJpdGUsIG9kaGFkbGEgc29tIHNhbW9zdGF0bmUgbW9kZWwgcyBCRVYgYSBtb2RlbCBzIEJFVl9QSEVWLiBQb3Jvdm5hbmllIEFJQyB1a8OhemFsbywgxb5lIGxlcMWhaWUgc2Vkw60gbW9kZWwgcyBCRVZfUEhFVi4gViDFiG9tIGplIEhEUCBwb3ppdMOtdm5lIGEgdsO9em5hbW7DqSwga8O9bSBCRVZfUEhFViB2eWNow6FkemEgbmVnYXTDrXZuZSBhIHZ5c29rbyB2w716bmFtbmUuIFRvIGplIHYgcm96cG9yZSBzIHDDtHZvZG7DvW0gb8SNYWvDoXZhbsOtbSBwb3ppdMOtdm5laG8gZWZla3R1IGVsZWt0cm9tb2JpbGl0eSBuYSBFUEksIGEgdiBkaXNrdXNpaSB1dsOhZHphbSBtb8W+bsOpIGTDtHZvZHkgKG5hcHIuIG5hxI1hc292YW5pZSDigJMgcsO9Y2hseSBuw6FyYXN0IFBIRVYgYmV6IG9rYW3Fvml0w6lobyB6bGVwxaFlbmlhIEVQSSwgcmXDoWxuZSBlbWlzaWUgUEhFViwgaW7DqSBlbnZpcm9ubWVudMOhbG5lIGRvbcOpbnkgdiBFUEkpCgojIE5hxI1hc292YW5pZTogb25lc2tvcmVuw70gdnBseXYgZWxla3Ryb21vYmlsaXR5IChsYWcgbyAxIHJvaykKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKdWRhamVfbGFnIDwtIHVkYWplICU+JQphcnJhbmdlKEtyYWppbmEsIFJvaykgJT4lCmdyb3VwX2J5KEtyYWppbmEpICU+JQptdXRhdGUobGFnX0JFVl9QSEVWID0gZHBseXI6OmxhZyhCRVZfUEhFViwgMSkpICU+JQp1bmdyb3VwKCkKCm1fbGFnIDwtIGxtKEVQSSB+IGxvZzFwKGxhZ19CRVZfUEhFVikgKyBIRFAgKyBmYWN0b3IoS3JhamluYSkgKyBmYWN0b3IoUm9rKSwgZGF0YSA9IHVkYWplX2xhZykKY29lZnRlc3QobV9sYWcsIHZjb3YgPSB2Y292Q0wobV9sYWcsIGNsdXN0ZXIgPSB+IEtyYWppbmEsIHR5cGUgPSAiSEMxIikpCgpgYGAKCiMgxaB0YW5kYXJkaXpvdmFuw6kga29lZmljaWVudHkgPSBwb3Jvdm5hdGXEvm7DoSBzaWxhIGVmZWt0b3YKClV2aWTDrW1lLCBrdG9yw70gcHJlZGlrdG9yIG3DoSBuYWp2w6TEjcWhw60g4oCeesOhc2Fo4oCcIGRvIEVQSS4KCmBgYHtyfQptX3N0ZCA8LSBsbShzY2FsZShFUEkpIH4gc2NhbGUobG9nMXAoQkVWX1BIRVYpKSArIHNjYWxlKEhEUCksIGRhdGEgPSB1ZGFqZSkKc3VtbWFyeShtX3N0ZCkKYGBgCgoqTmFqdsOkxI3FocOtIOKAnnrDoXNhaOKAnCBtw6EgdiB0b210byDFoXRhbmRhcmRpem92YW5vbSBtb2RlbGkgbG9nMXAoQkVWX1BIRVYpLioKClBvIMWhdGFuZGFyZGl6w6FjaWkgdnljaMOhZHphLCDFvmUgMSBTRCBuw6FyYXN0IGxvZyhCRVZfUEhFVikgc8O6dmlzw60gcyBwb2tsZXNvbSBFUEkgbyBcfjAuNzkgU0QgKHAgXDwgMC4wMDEpLCB6YXRpYcS+IMSNbyAxIFNEIG7DoXJhc3QgSERQIHPDunZpc8OtIHMgbsOhcmFzdG9tIEVQSSBvIFx+MC40NCBTRCAocCA9IDAuMDAyKTsgbW9kZWwgdnlzdmV0xL51amUgXH40MiAlIHZhcmlhYmlsaXR5IEVQSQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMjIDEpIFNsb3Zuw6kgemhybnV0aWUgZGlhZ25vc3Rpa3kgYSB2w71zbGVka292Cgp0MSA8LSB0aWJibGUoCmBR4oCTUSBwbG90YCA9ICJWw6TEjcWhaW5hIGJvZG92IHByaSBwcmlhbWtlOyBtaWVybmUgb2RjaMO9bGt5IHYgY2h2b3N0b2NoIOKGkiBub3JtYWxpdGEgcHJpYmxpxb5uZSBPSyAocmVwb3J0dWplbSByb2J1c3Ruw6kgU0UpLiIsCmBTY2FsZS1Mb2NhdGlvbmAgPSAiTE9FU1MgamVtbmUgbmFrbG9uZW7DvSDihpIgc2xhYsOhIGhldGVyb3NrZWRhc3RpY2l0YSAocmllxaFlbsOhIHJvYnVzdG7DvW1pIFNFKS4iLApgUmVzaWR1YWxzIHZzIExldmVyYWdlYCA9ICJWcGx5dm7DqSBib2R5ICgyMCwgMzEsIDM1LCA0OCk7IEJvbmZlcnJvbmkgbmVvem5hxI1pbCBleHRyw6ltbnkgb3V0bGllci4iLApgVsO9c2xlZGt5IHJlZ3Jlc2llYCA9ICJMZXDFocOtIGplIG1vZGVsIHMgbG9nMXAoQkVWX1BIRVYpK0hEUCAoQUlDIOKJiCAzNDMgPCAzNDYpLiBIRFA6IHBveml0w612bnkgYSB2w716bmFtbsO9OyBsb2cxcChCRVZfUEhFVik6IG5lZ2F0w612bnkgYSB2eXNva28gdsO9em5hbW7DvTsgQkVWIG5ldsO9em5hbW7DqS4iCikKCmVtZXJhbGRfbGlnaHQgPC0gIiNFQ0ZERjUiICAjIHBvemFkaWUgYnVuaWVrCmVtZXJhbGRfaGVhZCAgPC0gIiNEMUZBRTUiICAjIGhsYXZpxI1rYQplbWVyYWxkX3RleHQgIDwtICIjMDY1RjQ2IiAgIyB0bWF2b3plbGVuw70gdGV4dAoKa2JsKHQxLCBjYXB0aW9uID0gIkRpYWdub3N0aWthIGEgdsO9c2xlZGt5IOKAkyBzdHJ1xI1uw6kgemhybnV0aWUiLCBib29rdGFicyA9IFRSVUUpICU+JQprYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBUUlVFLCBodG1sX2ZvbnQgPSAiSGVsdmV0aWNhIikgJT4lCnJvd19zcGVjKDAsIGJhY2tncm91bmQgPSBlbWVyYWxkX2hlYWQsIGNvbG9yID0gZW1lcmFsZF90ZXh0LCBib2xkID0gVFJVRSkgJT4lCmNvbHVtbl9zcGVjKDE6NCwgYmFja2dyb3VuZCA9IGVtZXJhbGRfbGlnaHQsIGNvbG9yID0gZW1lcmFsZF90ZXh0LCBib3JkZXJfbGVmdCA9IFRSVUUsIGJvcmRlcl9yaWdodCA9IFRSVUUpCgojIyAyKSBSb3pob2RudXRpYSBvIGh5cG90w6l6YWNoCgp0MiA8LSB0aWJibGU6OnRyaWJibGUoCiAgflByZW1lbm7DoSwgIH5gSDEgKG/EjWFrw6F2YW5pZSlgLCAgICAgICAgICAgIH5gUm96aG9kbnV0aWUgbyBIMGAsICAgICAgICAgICAgfmBSb3pob2RudXRpZSBvIEgxYCwgICAgICAgICAgICAgICAgICB+UG96bsOhbWthLAogICJCRVYiLCAgICAgICLOsl9CRSBWID4gMCAocG96aXTDrXZueSkiLCAgICAgICAiWkFNSUVUQU0gKHbDvXpuYW1uw6kpIiwgICAgICAgICAgIlpBTUlFVEFNIChlZmVrdCBqZSB6w6Fwb3Juw70pIiwgICAgICAgIlYgbW9kZWxpIEVQSSB+IGxvZzFwKEJFVikrbG9nMXAoSERQKSBqZSBsb2cxcChCRVYpIHbDvXpuYW1uZSBuZWdhdMOtdm55LiIsCiAgIkJFVl9QSEVWIiwgIs6yX1BIRVYgPiAwIChwb3ppdMOtdm55KSIsICAgICAgICJaQU1JRVRBTSAodsO9em5hbW7DqSkiLCAgICAgICAgICAiWkFNSUVUQU0gKGVmZWt0IGplIHrDoXBvcm7DvSkiLCAgICAgICAibG9nMXAoQkVWX1BIRVYpIHbDvXpuYW1uZSBuZWdhdMOtdm55OyBtb2RlbCBzIFBIRVYgbcOhIG5pxb7FocOtIEFJQy4iCikKCmtibCh0MiwgY2FwdGlvbiA9ICJIeXBvdMOpenkgYSByb3pob2RudXRpYSAocm9idXN0bsOpIFNFLCBsb2ctxaFwZWNpZmlrw6FjaWUpIiwgYm9va3RhYnMgPSBUUlVFKSAlPiUKa2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRkFMU0UsIGh0bWxfZm9udCA9ICJIZWx2ZXRpY2EiKSAlPiUKcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9IGVtZXJhbGRfaGVhZCwgY29sb3IgPSBlbWVyYWxkX3RleHQsIGJvbGQgPSBUUlVFKSAlPiUKY29sdW1uX3NwZWMoMTpuY29sKHQyKSwgYmFja2dyb3VuZCA9IGVtZXJhbGRfbGlnaHQsIGNvbG9yID0gZW1lcmFsZF90ZXh0KQoKYGBgCgojIFrDoXZlcgoKVsO9c2xlZGt5IG5hem5hxI11asO6LCDFvmUgSERQIG3DoSBuYSBFUEkgcG96aXTDrXZueSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2LiBWIG1vZGVsaSBzIEJFViAobG9nLXRyYW5zZm9ybcOhY2lhKSBqZSBrb2VmaWNpZW50IGxvZzFwKEJFVikgesOhcG9ybsO9IGEgdsO9em5hbW7DvTsgdiBhbHRlcm5hdMOtdm5vbSBtb2RlbGkgcyBCRVZfUEhFViB2eWNow6FkemEga29lZmljaWVudCB0YWtpc3RvIHrDoXBvcm7DvSBhIHbDvXpuYW1uw70uIFBvZMS+YSBBSUMgZMOhdGFtIGxlcMWhaWUgc2Vkw60gdmVyemlhIHMgQkVWX1BIRVYuCsWgdGFuZGFyZGl6b3ZhbsOpIGtvZWZpY2llbnR5IHVrYXp1asO6LCDFvmUgKzEgU0QgbG9nKEJFVl9QSEVWKSBzw7p2aXPDrSBzIOKJiCDiiJIwLDc5IFNEIEVQSSAocCA8IDAsMDAxKSwgemF0aWHEviDEjW8gKzEgU0QgSERQIHMg4omIICswLDQ0IFNEIEVQSSAocCDiiYggMCwwMDIpLiBNb2RlbCB2eXN2ZXTEvnVqZSBwcmlibGnFvm5lIDQw4oCTNDIgJSB2YXJpYWJpbGl0eSBFUEkuCkRpYWdub3N0aWthIHJlesOtZHXDrSB1a8OhemFsYSBsZW4gbWllcm5lIG9kY2jDvWxreSB2IGNodm9zdG9jaCBhIHNsYWLDuiBoZXRlcm9za2VkYXN0aWNpdHU7IHByZXRvIHV2w6FkemFtIHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkgKEhDMSkuIE5pZWtvxL5rbyB2cGx5dm7DvWNoIGJvZG92IGt2YWxpdGF0w612bmUgesOhdmVyeSBuZW1lbsOtLgpDZWxrb3ZvIHbDvXNsZWRreSBwb2Rwb3J1asO6IHbDvXpuYW0gZWtvbm9taWNrZWogw7pyb3ZuZSBwcmUgZW52aXJvbm1lbnTDoWxudSB2w71rb25ub3PFpSwgbm8gcHJpYW1lIHByaWF6bml2w6kgcHJlcG9qZW5pZSBlbGVrdHJvbW9iaWxpdHkgcyBFUEkgc2EgdiB0b210byBzw7pib3JlIG5lcHJldWvDoXphbG87IHNrw7RyIHZ5Y2jDoWR6YSBuZWdhdMOtdm5hIGFzb2Npw6FjaWEuIE1vxb5uw6kgZMO0dm9keTogbmHEjWFzb3ZhbmllIGVmZWt0b3YgKHByZWphdiBuZXNrw7RyKSwgcmXDoWxuZSBlbWlzaWUgUEhFViBhIGZha3QsIMW+ZSBFUEkgemFjaHl0w6F2YSB2aWFjIGRvbcOpbiBuZcW+IGxlbiBkb3ByYXZ1Lg==