udaje <- read.csv2("dataEKONOMETRIA.csv",header=TRUE,sep=",",dec=".")
head(udaje)
colnames(udaje)
[1] "Nazov" "Kategoria" "Forma" "ROE" "ROA" "EBIT" "EBITDAmarza" "M" "Z"
library(ggplot2)
# Scatter plot: vzťah medzi ROA a ROE
ggplot(udaje, aes(x = ROA, y = ROE)) +
geom_point(color = "steelblue", size = 2) + # typ grafu – bodový
theme_minimal() +
labs(
title = "Vzťah medzi ROA a ROE",
x = "Návratnosť aktív (ROA)",
y = "Návratnosť vlastného kapitálu (ROE)"
)

library(ggplot2)
ggplot(udaje, aes(x = factor(Kategoria), y = ROE)) + # Kategoria namiesto YEARS
geom_boxplot(fill = "lightblue", color = "darkblue") + # typ grafu - boxplot
labs(
title = "ROE podľa kategórie firmy",
x = "Kategória",
y = "ROE (návratnosť vlastného kapitálu)"
) +
theme_minimal()

library(dplyr)
library(knitr)
# Základné štatistiky ROE podľa kategórie
roe.stats <- udaje %>%
group_by(Kategoria) %>%
summarise(
n = n(),
mean = mean(ROE, na.rm = TRUE),
sd = sd(ROE, na.rm = TRUE),
min = min(ROE, na.rm = TRUE),
q25 = quantile(ROE, 0.25, na.rm = TRUE),
median = median(ROE, na.rm = TRUE),
q75 = quantile(ROE, 0.75, na.rm = TRUE),
max = max(ROE, na.rm = TRUE),
.groups = "drop"
)
# Vygenerovanie tabuľky
kable(roe.stats, digits = 2, caption = "Základné štatistiky ukazovateľa ROE podľa kategórie firmy")
Základné štatistiky ukazovateľa ROE podľa kategórie
firmy
Kategoria |
n |
mean |
sd |
min |
q25 |
median |
q75 |
max |
1 |
4 |
0.10 |
0.79 |
-0.95 |
-0.16 |
0.20 |
0.46 |
0.94 |
2 |
12 |
0.12 |
0.78 |
-1.84 |
0.03 |
0.08 |
0.78 |
1.00 |
3 |
16 |
0.28 |
0.26 |
0.08 |
0.12 |
0.18 |
0.30 |
0.99 |
4 |
19 |
0.22 |
0.27 |
-0.11 |
0.08 |
0.13 |
0.26 |
1.00 |
5 |
2 |
0.11 |
0.03 |
0.10 |
0.10 |
0.11 |
0.12 |
0.13 |
NA
# ================== Balíčky ==================
library(dplyr)
library(knitr)
library(kableExtra)
# (ak ešte nemáš načítané dáta, odkomentuj)
# udaje <- read.csv("dataEKONOMETRIA.csv", header = TRUE, sep = ";", dec = ",",
# check.names = TRUE, stringsAsFactors = FALSE)
# Pomocná funkcia na výpočet štatistík
calc_stats <- function(df, group_var, value_var) {
df %>%
group_by({{ group_var }}) %>%
summarise(
n = n(),
mean = mean({{ value_var }}, na.rm = TRUE),
sd = sd({{ value_var }}, na.rm = TRUE),
min = min({{ value_var }}, na.rm = TRUE),
q25 = quantile({{ value_var }}, 0.25, na.rm = TRUE),
median = median({{ value_var }}, na.rm = TRUE),
q75 = quantile({{ value_var }}, 0.75, na.rm = TRUE),
max = max({{ value_var }}, na.rm = TRUE),
.groups = "drop"
)
}
# ================== 1) ROE podľa Kategoria ==================
roe_stats <- calc_stats(udaje, Kategoria, ROE)
roe_stats %>%
kable(digits = 2, caption = "Základné štatistiky ROE podľa kategórie") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(1, bold = TRUE) %>%
row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
add_header_above(c(" " = 2, "ROE – Štatistiky" = 7))
Základné štatistiky ROE podľa kategórie
|
ROE – Štatistiky |
Kategoria |
n |
mean |
sd |
min |
q25 |
median |
q75 |
max |
1 |
4 |
0.10 |
0.79 |
-0.95 |
-0.16 |
0.20 |
0.46 |
0.94 |
2 |
12 |
0.12 |
0.78 |
-1.84 |
0.03 |
0.08 |
0.78 |
1.00 |
3 |
16 |
0.28 |
0.26 |
0.08 |
0.12 |
0.18 |
0.30 |
0.99 |
4 |
19 |
0.22 |
0.27 |
-0.11 |
0.08 |
0.13 |
0.26 |
1.00 |
5 |
2 |
0.11 |
0.03 |
0.10 |
0.10 |
0.11 |
0.12 |
0.13 |
# ================== 2) ROA podľa Forma ==================
roa_stats <- calc_stats(udaje, Forma, ROA)
roa_stats %>%
kable(digits = 2, caption = "Základné štatistiky ROA podľa formy firmy") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(1, bold = TRUE) %>%
row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
add_header_above(c(" " = 2, "ROA – Štatistiky" = 7))
Základné štatistiky ROA podľa formy firmy
|
ROA – Štatistiky |
Forma |
n |
mean |
sd |
min |
q25 |
median |
q75 |
max |
as |
17 |
0.07 |
0.08 |
0.00 |
0.01 |
0.04 |
0.09 |
0.26 |
sro |
36 |
0.10 |
0.15 |
-0.17 |
0.04 |
0.06 |
0.13 |
0.70 |
# t-test: porovnanie priemerov ROE medzi dvoma formami firiem
t.test.result <- t.test(
ROE ~ Forma, # porovnávame ROE podľa dvoch skupín v stĺpci Forma
data = udaje,
var.equal = FALSE
)
t.test.result
Welch Two Sample t-test
data: ROE by Forma
t = -0.0073638, df = 50.356, p-value = 0.9942
alternative hypothesis: true difference in means between group as and group sro is not equal to 0
95 percent confidence interval:
-0.2115588 0.2100130
sample estimates:
mean in group as mean in group sro
0.2027450 0.2035179
anova.result <- aov(ROA ~ Forma, data = udaje)
summary(anova.result)
Df Sum Sq Mean Sq F value Pr(>F)
Forma 1 0.0105 0.01047 0.594 0.444
Residuals 51 0.8985 0.01762
# Lineárna regresia: predikcia ROE na základe ďalších ukazovateľov
model <- lm(ROE ~ ROA + EBITDAmarza + M + Z, data = udaje)
summary(model)
Call:
lm(formula = ROE ~ ROA + EBITDAmarza + M + Z, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-2.26230 -0.07712 -0.01667 0.13934 0.79777
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.001288 0.104697 -0.012 0.990238
ROA 1.820819 0.486836 3.740 0.000491 ***
EBITDAmarza -0.485064 0.416720 -1.164 0.250176
M 0.020364 0.014911 1.366 0.178417
Z -0.016741 0.039112 -0.428 0.670545
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4191 on 48 degrees of freedom
Multiple R-squared: 0.2362, Adjusted R-squared: 0.1725
F-statistic: 3.71 on 4 and 48 DF, p-value: 0.01037
# --- HEATMAP (base R) ---
# vyber numerické stĺpce
num_cols <- c("ROE","ROA","EBIT","EBITDAmarza","M","Z")
stopifnot(all(num_cols %in% names(udaje)))
# ak je EBIT ako text s čiarkou/%, očisti a skonvertuj
if (!is.numeric(udaje$EBIT)) {
ebit_clean <- gsub("[^0-9,.-]", "", udaje$EBIT)
ebit_clean <- chartr(",", ".", ebit_clean)
udaje$EBIT <- suppressWarnings(as.numeric(ebit_clean))
}
# korelačná matica
cm <- cor(udaje[, num_cols], use = "pairwise.complete.obs")
# heatmap bez dodatočných balíkov
pal <- colorRampPalette(c("red","white","blue"))(100)
op <- par(mar = c(8,8,2,2)) # väčšie okraje na popisky
heatmap(cm, Rowv = NA, Colv = NA, scale = "none",
col = pal, margins = c(8,8))
par(op)

# --- stručná interpretácia priamo v R ---
upper <- which(upper.tri(cm), arr.ind = TRUE)
vals <- cm[upper]
ord <- order(abs(vals), decreasing = TRUE)
top_n <- min(3, length(vals))
cat("Interpretácia heatmapy korelačnej matice:\n")
Interpretácia heatmapy korelačnej matice:
for (i in seq_len(top_n)) {
r <- upper[ord[i], ]
cat(sprintf("• %s vs %s: korelácia = %.2f (%s)\n",
rownames(cm)[r[1]], colnames(cm)[r[2]],
vals[ord[i]], ifelse(vals[ord[i]]>0,"pozitívny vzťah","negatívny vzťah")))
}
• M vs Z: korelácia = 0.58 (pozitívny vzťah)
• ROE vs ROA: korelácia = 0.44 (pozitívny vzťah)
• ROA vs EBITDAmarza: korelácia = 0.37 (pozitívny vzťah)
cat("Hodnoty blízke +1 = silná pozitívna závislosť, blízke -1 = silná negatívna,\n",
"blízko 0 = slabý/žiadny lineárny vzťah. Silné korelácie sleduj pre možnú multikolinearitu v regresii.\n")
Hodnoty blízke +1 = silná pozitívna závislosť, blízke -1 = silná negatívna,
blízko 0 = slabý/žiadny lineárny vzťah. Silné korelácie sleduj pre možnú multikolinearitu v regresii.
library(ggplot2)
library(dplyr)
# (jemné čistenie EBIT, ak by bol text s čiarkou)
if (!is.numeric(udaje$EBIT)) {
ebit_clean <- gsub("[^0-9,.-]", "", udaje$EBIT)
ebit_clean <- chartr(",", ".", ebit_clean)
udaje$EBIT <- suppressWarnings(as.numeric(ebit_clean))
}
# TOP 5 firiem podľa ROE na popisky
top5 <- udaje %>% arrange(desc(ROE)) %>% slice_head(n = 5)
ggplot(udaje, aes(x = ROA, y = ROE)) +
# hustotné kontúry (kde je najviac bodov)
stat_density_2d(aes(z = ..level..), geom = "polygon", alpha = 0.15) +
# bubliny – veľkosť podľa EBITDA marže, farba podľa formy
geom_point(aes(size = EBITDAmarza, color = Forma), alpha = 0.7) +
# regresná čiara
geom_smooth(method = "lm", se = FALSE, linewidth = 0.9) +
# popisky pre top 5 podľa ROE
geom_text(data = top5, aes(label = Nazov), vjust = -0.7, size = 3) +
scale_size_continuous(name = "EBITDA marža") +
theme_minimal() +
labs(
title = "ROA vs ROE – bubliny (EBITDA marža), farba podľa formy, hustotné kontúry",
x = "ROA",
y = "ROE",
color = "Forma"
)

cor_roa_roe <- cor(udaje$ROA, udaje$ROE, use = "pairwise.complete.obs")
cat(sprintf("Korelácia ROA–ROE = %.2f. Väčšie bubliny = vyššia EBITDA marža.
Kontúry ukazujú oblasti s najväčšou koncentráciou firiem.\n", cor_roa_roe))
Korelácia ROA–ROE = 0.44. Väčšie bubliny = vyššia EBITDA marža.
Kontúry ukazujú oblasti s najväčšou koncentráciou firiem.
library(ggplot2)
library(dplyr)
library(tidyr)
# Prepočítame priemerný počet mužov a žien vo vedení podľa formy
gender_stats <- udaje %>%
group_by(Forma) %>%
summarise(
Priemerny_pocet_muzov = mean(M, na.rm = TRUE),
Priemerny_pocet_zien = mean(Z, na.rm = TRUE)
) %>%
pivot_longer(cols = c(Priemerny_pocet_muzov, Priemerny_pocet_zien),
names_to = "Pohlavie",
values_to = "Priemerny_pocet")
# Prehľadný grouped barplot
ggplot(gender_stats, aes(x = Forma, y = Priemerny_pocet, fill = Pohlavie)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = round(Priemerny_pocet, 1)),
position = position_dodge(0.9), vjust = -0.3, size = 3) +
scale_fill_manual(values = c("#4575b4", "#d73027"),
labels = c("Muži", "Ženy")) +
theme_minimal() +
labs(
title = "Priemerný počet mužov a žien vo vedení podľa formy firmy",
x = "Forma firmy",
y = "Priemerný počet osôb",
fill = "Pohlavie"
)

ggplot(udaje, aes(x = M, y = Z, color = Forma)) +
geom_point(size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, linewidth = 0.8) +
theme_minimal() +
labs(
title = "Vzťah medzi počtom mužov a žien vo vedení",
x = "Počet mužov vo vedení (M)",
y = "Počet žien vo vedení (Z)",
color = "Forma firmy"
)

gender_summary <- udaje %>%
group_by(Forma) %>%
summarise(
muzi = mean(M, na.rm = TRUE),
zeny = mean(Z, na.rm = TRUE)
)
cat("Interpretácia:\n")
Interpretácia:
apply(gender_summary, 1, function(r) {
cat(sprintf("• Forma %s: priemerný počet mužov vo vedení = %.1f, žien = %.1f\n",
r["Forma"], as.numeric(r["muzi"]), as.numeric(r["zeny"])))
})
• Forma as: priemerný počet mužov vo vedení = 11.2, žien = 2.9
• Forma sro: priemerný počet mužov vo vedení = 3.5, žien = 1.1
NULL
cat("Z grafov vidno, že formy s.r.o. majú spravidla viac mužov ako žien vo vedení,
kým pri a.s. je podiel žien o niečo vyšší, ale stále v menšine.
Scatter graf ukazuje, že s rastúcim počtom mužov sa obvykle zvyšuje aj počet žien vo vedení,
čo naznačuje, že väčšie firmy majú celkovo väčšie manažérske tímy a väčšiu diverzitu.\n")
Z grafov vidno, že formy s.r.o. majú spravidla viac mužov ako žien vo vedení,
kým pri a.s. je podiel žien o niečo vyšší, ale stále v menšine.
Scatter graf ukazuje, že s rastúcim počtom mužov sa obvykle zvyšuje aj počet žien vo vedení,
čo naznačuje, že väčšie firmy majú celkovo väčšie manažérske tímy a väčšiu diverzitu.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KdWRhamUgPC0gcmVhZC5jc3YyKCJkYXRhRUtPTk9NRVRSSUEuY3N2IixoZWFkZXI9VFJVRSxzZXA9IiwiLGRlYz0iLiIpCmhlYWQodWRhamUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKY29sbmFtZXModWRhamUpCmBgYApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKIyBTY2F0dGVyIHBsb3Q6IHZ6xaVhaCBtZWR6aSBST0EgYSBST0UKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFJPQSwgeSA9IFJPRSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAyKSArICAgICAjIHR5cCBncmFmdSDigJMgYm9kb3bDvQogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZ6xaVhaCBtZWR6aSBST0EgYSBST0UiLAogICAgeCA9ICJOw6F2cmF0bm9zxaUgYWt0w612IChST0EpIiwKICAgIHkgPSAiTsOhdnJhdG5vc8WlIHZsYXN0bsOpaG8ga2FwaXTDoWx1IChST0UpIgogICkKYGBgCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgpnZ3Bsb3QodWRhamUsIGFlcyh4ID0gZmFjdG9yKEthdGVnb3JpYSksIHkgPSBST0UpKSArICAgICAgICAjIEthdGVnb3JpYSBuYW1pZXN0byBZRUFSUwogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImRhcmtibHVlIikgKyAgICAjIHR5cCBncmFmdSAtIGJveHBsb3QKICBsYWJzKAogICAgdGl0bGUgPSAiUk9FIHBvZMS+YSBrYXRlZ8OzcmllIGZpcm15IiwKICAgIHggPSAiS2F0ZWfDs3JpYSIsCiAgICB5ID0gIlJPRSAobsOhdnJhdG5vc8WlIHZsYXN0bsOpaG8ga2FwaXTDoWx1KSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKCiMgWsOha2xhZG7DqSDFoXRhdGlzdGlreSBST0UgcG9kxL5hIGthdGVnw7NyaWUKcm9lLnN0YXRzIDwtIHVkYWplICU+JQogIGdyb3VwX2J5KEthdGVnb3JpYSkgJT4lCiAgc3VtbWFyaXNlKAogICAgbiAgICAgID0gbigpLAogICAgbWVhbiAgID0gbWVhbihST0UsIG5hLnJtID0gVFJVRSksCiAgICBzZCAgICAgPSBzZChST0UsIG5hLnJtID0gVFJVRSksCiAgICBtaW4gICAgPSBtaW4oUk9FLCBuYS5ybSA9IFRSVUUpLAogICAgcTI1ICAgID0gcXVhbnRpbGUoUk9FLCAwLjI1LCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuID0gbWVkaWFuKFJPRSwgbmEucm0gPSBUUlVFKSwKICAgIHE3NSAgICA9IHF1YW50aWxlKFJPRSwgMC43NSwgbmEucm0gPSBUUlVFKSwKICAgIG1heCAgICA9IG1heChST0UsIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKIyBWeWdlbmVyb3ZhbmllIHRhYnXEvmt5CmthYmxlKHJvZS5zdGF0cywgZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHVrYXpvdmF0ZcS+YSBST0UgcG9kxL5hIGthdGVnw7NyaWUgZmlybXkiKQoKYGBgCmBgYHtyfQojID09PT09PT09PT09PT09PT09PSBCYWzDrcSNa3kgPT09PT09PT09PT09PT09PT09CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgKGFrIGXFoXRlIG5lbcOhxaEgbmHEjcOtdGFuw6kgZMOhdGEsIG9ka29tZW50dWopCiMgdWRhamUgPC0gcmVhZC5jc3YoImRhdGFFS09OT01FVFJJQS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiOyIsIGRlYyA9ICIsIiwKIyAgICAgICAgICAgICAgICAgICBjaGVjay5uYW1lcyA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCiMgUG9tb2Nuw6EgZnVua2NpYSBuYSB2w71wb8SNZXQgxaF0YXRpc3TDrWsKY2FsY19zdGF0cyA8LSBmdW5jdGlvbihkZiwgZ3JvdXBfdmFyLCB2YWx1ZV92YXIpIHsKICBkZiAlPiUKICAgIGdyb3VwX2J5KHt7IGdyb3VwX3ZhciB9fSkgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgIG4gICAgICA9IG4oKSwKICAgICAgbWVhbiAgID0gbWVhbih7eyB2YWx1ZV92YXIgfX0sIG5hLnJtID0gVFJVRSksCiAgICAgIHNkICAgICA9IHNkKHt7IHZhbHVlX3ZhciB9fSwgbmEucm0gPSBUUlVFKSwKICAgICAgbWluICAgID0gbWluKHt7IHZhbHVlX3ZhciB9fSwgbmEucm0gPSBUUlVFKSwKICAgICAgcTI1ICAgID0gcXVhbnRpbGUoe3sgdmFsdWVfdmFyIH19LCAwLjI1LCBuYS5ybSA9IFRSVUUpLAogICAgICBtZWRpYW4gPSBtZWRpYW4oe3sgdmFsdWVfdmFyIH19LCBuYS5ybSA9IFRSVUUpLAogICAgICBxNzUgICAgPSBxdWFudGlsZSh7eyB2YWx1ZV92YXIgfX0sIDAuNzUsIG5hLnJtID0gVFJVRSksCiAgICAgIG1heCAgICA9IG1heCh7eyB2YWx1ZV92YXIgfX0sIG5hLnJtID0gVFJVRSksCiAgICAgIC5ncm91cHMgPSAiZHJvcCIKICAgICkKfQoKIyA9PT09PT09PT09PT09PT09PT0gMSkgUk9FIHBvZMS+YSBLYXRlZ29yaWEgPT09PT09PT09PT09PT09PT09CnJvZV9zdGF0cyA8LSBjYWxjX3N0YXRzKHVkYWplLCBLYXRlZ29yaWEsIFJPRSkKCnJvZV9zdGF0cyAlPiUKICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIlrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgUk9FIHBvZMS+YSBrYXRlZ8OzcmllIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsCiAgICAgICAgICAgICAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJST0Ug4oCTIMWgdGF0aXN0aWt5IiA9IDcpKQoKIyA9PT09PT09PT09PT09PT09PT0gMikgUk9BIHBvZMS+YSBGb3JtYSA9PT09PT09PT09PT09PT09PT0Kcm9hX3N0YXRzIDwtIGNhbGNfc3RhdHModWRhamUsIEZvcm1hLCBST0EpCgpyb2Ffc3RhdHMgJT4lCiAga2FibGUoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IFJPQSBwb2TEvmEgZm9ybXkgZmlybXkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIlJPQSDigJMgxaB0YXRpc3Rpa3kiID0gNykpCmBgYApgYGB7cn0KIyB0LXRlc3Q6IHBvcm92bmFuaWUgcHJpZW1lcm92IFJPRSBtZWR6aSBkdm9tYSBmb3JtYW1pIGZpcmllbQp0LnRlc3QucmVzdWx0IDwtIHQudGVzdCgKICBST0UgfiBGb3JtYSwgICAgICAgIyBwb3Jvdm7DoXZhbWUgUk9FIHBvZMS+YSBkdm9jaCBza3Vww61uIHYgc3TEunBjaSBGb3JtYQogIGRhdGEgPSB1ZGFqZSwKICB2YXIuZXF1YWwgPSBGQUxTRSAKKQoKdC50ZXN0LnJlc3VsdApgYGAKYGBge3J9CmFub3ZhLnJlc3VsdCA8LSBhb3YoUk9BIH4gRm9ybWEsIGRhdGEgPSB1ZGFqZSkKc3VtbWFyeShhbm92YS5yZXN1bHQpCgpgYGAKYGBge3J9CiMgTGluZcOhcm5hIHJlZ3Jlc2lhOiBwcmVkaWtjaWEgUk9FIG5hIHrDoWtsYWRlIMSPYWzFocOtY2ggdWthem92YXRlxL5vdgptb2RlbCA8LSBsbShST0UgfiBST0EgKyBFQklUREFtYXJ6YSArIE0gKyBaLCBkYXRhID0gdWRhamUpCnN1bW1hcnkobW9kZWwpCmBgYApgYGB7cn0KIyAtLS0gSEVBVE1BUCAoYmFzZSBSKSAtLS0KCiMgdnliZXIgbnVtZXJpY2vDqSBzdMS6cGNlCgpudW1fY29scyA8LSBjKCJST0UiLCJST0EiLCJFQklUIiwiRUJJVERBbWFyemEiLCJNIiwiWiIpCnN0b3BpZm5vdChhbGwobnVtX2NvbHMgJWluJSBuYW1lcyh1ZGFqZSkpKQoKIyBhayBqZSBFQklUIGFrbyB0ZXh0IHMgxI1pYXJrb3UvJSwgb8SNaXN0aSBhIHNrb252ZXJ0dWoKCmlmICghaXMubnVtZXJpYyh1ZGFqZSRFQklUKSkgewplYml0X2NsZWFuIDwtIGdzdWIoIlteMC05LC4tXSIsICIiLCB1ZGFqZSRFQklUKQplYml0X2NsZWFuIDwtIGNoYXJ0cigiLCIsICIuIiwgZWJpdF9jbGVhbikKdWRhamUkRUJJVCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZWJpdF9jbGVhbikpCn0KCiMga29yZWxhxI1uw6EgbWF0aWNhCgpjbSA8LSBjb3IodWRhamVbLCBudW1fY29sc10sIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQoKIyBoZWF0bWFwIGJleiBkb2RhdG/EjW7DvWNoIGJhbMOta292CgpwYWwgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJyZWQiLCJ3aGl0ZSIsImJsdWUiKSkoMTAwKQpvcCA8LSBwYXIobWFyID0gYyg4LDgsMiwyKSkgICMgdsOkxI3FoWllIG9rcmFqZSBuYSBwb3Bpc2t5CmhlYXRtYXAoY20sIFJvd3YgPSBOQSwgQ29sdiA9IE5BLCBzY2FsZSA9ICJub25lIiwKY29sID0gcGFsLCBtYXJnaW5zID0gYyg4LDgpKQpwYXIob3ApCgojIC0tLSBzdHJ1xI1uw6EgaW50ZXJwcmV0w6FjaWEgcHJpYW1vIHYgUiAtLS0KCnVwcGVyIDwtIHdoaWNoKHVwcGVyLnRyaShjbSksIGFyci5pbmQgPSBUUlVFKQp2YWxzICA8LSBjbVt1cHBlcl0Kb3JkICAgPC0gb3JkZXIoYWJzKHZhbHMpLCBkZWNyZWFzaW5nID0gVFJVRSkKdG9wX24gPC0gbWluKDMsIGxlbmd0aCh2YWxzKSkKCmNhdCgiSW50ZXJwcmV0w6FjaWEgaGVhdG1hcHkga29yZWxhxI1uZWogbWF0aWNlOlxuIikKZm9yIChpIGluIHNlcV9sZW4odG9wX24pKSB7CnIgPC0gdXBwZXJbb3JkW2ldLCBdCmNhdChzcHJpbnRmKCLigKIgJXMgdnMgJXM6IGtvcmVsw6FjaWEgPSAlLjJmICglcylcbiIsCnJvd25hbWVzKGNtKVtyWzFdXSwgY29sbmFtZXMoY20pW3JbMl1dLAp2YWxzW29yZFtpXV0sIGlmZWxzZSh2YWxzW29yZFtpXV0+MCwicG96aXTDrXZueSB2esWlYWgiLCJuZWdhdMOtdm55IHZ6xaVhaCIpKSkKfQpjYXQoIkhvZG5vdHkgYmzDrXprZSArMSA9IHNpbG7DoSBwb3ppdMOtdm5hIHrDoXZpc2xvc8WlLCBibMOtemtlIC0xID0gc2lsbsOhIG5lZ2F0w612bmEsXG4iLAoiYmzDrXprbyAwID0gc2xhYsO9L8W+aWFkbnkgbGluZcOhcm55IHZ6xaVhaC4gU2lsbsOpIGtvcmVsw6FjaWUgc2xlZHVqIHByZSBtb8W+bsO6IG11bHRpa29saW5lYXJpdHUgdiByZWdyZXNpaS5cbiIpCgpgYGAKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKCiMgKGplbW7DqSDEjWlzdGVuaWUgRUJJVCwgYWsgYnkgYm9sIHRleHQgcyDEjWlhcmtvdSkKaWYgKCFpcy5udW1lcmljKHVkYWplJEVCSVQpKSB7CiAgZWJpdF9jbGVhbiA8LSBnc3ViKCJbXjAtOSwuLV0iLCAiIiwgdWRhamUkRUJJVCkKICBlYml0X2NsZWFuIDwtIGNoYXJ0cigiLCIsICIuIiwgZWJpdF9jbGVhbikKICB1ZGFqZSRFQklUIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhlYml0X2NsZWFuKSkKfQoKIyBUT1AgNSBmaXJpZW0gcG9kxL5hIFJPRSBuYSBwb3Bpc2t5CnRvcDUgPC0gdWRhamUgJT4lIGFycmFuZ2UoZGVzYyhST0UpKSAlPiUgc2xpY2VfaGVhZChuID0gNSkKCmdncGxvdCh1ZGFqZSwgYWVzKHggPSBST0EsIHkgPSBST0UpKSArCiAgIyBodXN0b3Ruw6kga29udMO6cnkgKGtkZSBqZSBuYWp2aWFjIGJvZG92KQogIHN0YXRfZGVuc2l0eV8yZChhZXMoeiA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGFscGhhID0gMC4xNSkgKwogICMgYnVibGlueSDigJMgdmXEvmtvc8WlIHBvZMS+YSBFQklUREEgbWFyxb5lLCBmYXJiYSBwb2TEvmEgZm9ybXkKICBnZW9tX3BvaW50KGFlcyhzaXplID0gRUJJVERBbWFyemEsIGNvbG9yID0gRm9ybWEpLCBhbHBoYSA9IDAuNykgKwogICMgcmVncmVzbsOhIMSNaWFyYQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV3aWR0aCA9IDAuOSkgKwogICMgcG9waXNreSBwcmUgdG9wIDUgcG9kxL5hIFJPRQogIGdlb21fdGV4dChkYXRhID0gdG9wNSwgYWVzKGxhYmVsID0gTmF6b3YpLCB2anVzdCA9IC0wLjcsIHNpemUgPSAzKSArCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKG5hbWUgPSAiRUJJVERBIG1hcsW+YSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJST0EgdnMgUk9FIOKAkyBidWJsaW55IChFQklUREEgbWFyxb5hKSwgZmFyYmEgcG9kxL5hIGZvcm15LCBodXN0b3Ruw6kga29udMO6cnkiLAogICAgeCA9ICJST0EiLAogICAgeSA9ICJST0UiLAogICAgY29sb3IgPSAiRm9ybWEiCiAgKQpgYGAKYGBge3J9CmNvcl9yb2Ffcm9lIDwtIGNvcih1ZGFqZSRST0EsIHVkYWplJFJPRSwgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpCmNhdChzcHJpbnRmKCJLb3JlbMOhY2lhIFJPQeKAk1JPRSA9ICUuMmYuIFbDpMSNxaFpZSBidWJsaW55ID0gdnnFocWhaWEgRUJJVERBIG1hcsW+YS4gCktvbnTDunJ5IHVrYXp1asO6IG9ibGFzdGkgcyBuYWp2w6TEjcWhb3Uga29uY2VudHLDoWNpb3UgZmlyaWVtLlxuIiwgY29yX3JvYV9yb2UpKQoKYGBgCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCgojIFByZXBvxI3DrXRhbWUgcHJpZW1lcm7DvSBwb8SNZXQgbXXFvm92IGEgxb5pZW4gdm8gdmVkZW7DrSBwb2TEvmEgZm9ybXkKZ2VuZGVyX3N0YXRzIDwtIHVkYWplICU+JQogIGdyb3VwX2J5KEZvcm1hKSAlPiUKICBzdW1tYXJpc2UoCiAgICBQcmllbWVybnlfcG9jZXRfbXV6b3YgPSBtZWFuKE0sIG5hLnJtID0gVFJVRSksCiAgICBQcmllbWVybnlfcG9jZXRfemllbiA9IG1lYW4oWiwgbmEucm0gPSBUUlVFKQogICkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKFByaWVtZXJueV9wb2NldF9tdXpvdiwgUHJpZW1lcm55X3BvY2V0X3ppZW4pLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJQb2hsYXZpZSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJQcmllbWVybnlfcG9jZXQiKQoKIyBQcmVoxL5hZG7DvSBncm91cGVkIGJhcnBsb3QKZ2dwbG90KGdlbmRlcl9zdGF0cywgYWVzKHggPSBGb3JtYSwgeSA9IFByaWVtZXJueV9wb2NldCwgZmlsbCA9IFBvaGxhdmllKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoUHJpZW1lcm55X3BvY2V0LCAxKSksCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMC4zLCBzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM0NTc1YjQiLCAiI2Q3MzAyNyIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk11xb5pIiwgIsW9ZW55IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJQcmllbWVybsO9IHBvxI1ldCBtdcW+b3YgYSDFvmllbiB2byB2ZWRlbsOtIHBvZMS+YSBmb3JteSBmaXJteSIsCiAgICB4ID0gIkZvcm1hIGZpcm15IiwKICAgIHkgPSAiUHJpZW1lcm7DvSBwb8SNZXQgb3PDtGIiLAogICAgZmlsbCA9ICJQb2hsYXZpZSIKICApCgpgYGAKYGBge3J9CmdncGxvdCh1ZGFqZSwgYWVzKHggPSBNLCB5ID0gWiwgY29sb3IgPSBGb3JtYSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV3aWR0aCA9IDAuOCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZ6xaVhaCBtZWR6aSBwb8SNdG9tIG11xb5vdiBhIMW+aWVuIHZvIHZlZGVuw60iLAogICAgeCA9ICJQb8SNZXQgbXXFvm92IHZvIHZlZGVuw60gKE0pIiwKICAgIHkgPSAiUG/EjWV0IMW+aWVuIHZvIHZlZGVuw60gKFopIiwKICAgIGNvbG9yID0gIkZvcm1hIGZpcm15IgogICkKCmBgYApgYGB7cn0KZ2VuZGVyX3N1bW1hcnkgPC0gdWRhamUgJT4lCiAgZ3JvdXBfYnkoRm9ybWEpICU+JQogIHN1bW1hcmlzZSgKICAgIG11emkgPSBtZWFuKE0sIG5hLnJtID0gVFJVRSksCiAgICB6ZW55ID0gbWVhbihaLCBuYS5ybSA9IFRSVUUpCiAgKQoKY2F0KCJJbnRlcnByZXTDoWNpYTpcbiIpCmFwcGx5KGdlbmRlcl9zdW1tYXJ5LCAxLCBmdW5jdGlvbihyKSB7CiAgY2F0KHNwcmludGYoIuKAoiBGb3JtYSAlczogcHJpZW1lcm7DvSBwb8SNZXQgbXXFvm92IHZvIHZlZGVuw60gPSAlLjFmLCDFvmllbiA9ICUuMWZcbiIsCiAgICAgICAgICAgICAgclsiRm9ybWEiXSwgYXMubnVtZXJpYyhyWyJtdXppIl0pLCBhcy5udW1lcmljKHJbInplbnkiXSkpKQp9KQpjYXQoIlogZ3JhZm92IHZpZG5vLCDFvmUgZm9ybXkgcy5yLm8uIG1hasO6IHNwcmF2aWRsYSB2aWFjIG11xb5vdiBha28gxb5pZW4gdm8gdmVkZW7DrSwKa8O9bSBwcmkgYS5zLiBqZSBwb2RpZWwgxb5pZW4gbyBuaWXEjW8gdnnFocWhw60sIGFsZSBzdMOhbGUgdiBtZW7FoWluZS4KU2NhdHRlciBncmFmIHVrYXp1amUsIMW+ZSBzIHJhc3TDumNpbSBwb8SNdG9tIG11xb5vdiBzYSBvYnZ5a2xlIHp2ecWhdWplIGFqIHBvxI1ldCDFvmllbiB2byB2ZWRlbsOtLArEjW8gbmF6bmHEjXVqZSwgxb5lIHbDpMSNxaFpZSBmaXJteSBtYWrDuiBjZWxrb3ZvIHbDpMSNxaFpZSBtYW5hxb7DqXJza2UgdMOtbXkgYSB2w6TEjcWhaXUgZGl2ZXJ6aXR1LlxuIikKCmBgYAoK