knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
Import a náhľad údaje
Dataset barc_data.csv z roku 2017 obsahuje informácie o dopravných
nehodách v Barcelone.
udaje <- read.csv2("barc_data.csv",header=TRUE,sep=";",dec=".")
head(udaje)
[1] "Id" "District.Name_prek." "District.Name"
[4] "Neighborhood.Name" "Street" "Weekday_prek."
[7] "Weekday" "Date" "Mesiace"
[10] "Part.of.the.day_prek." "Part.of.the.day" "Hour"
[13] "Mild.injuries" "Serious.injuries" "Victims"
[16] "Vehicles.involved" "Longitude" "Latitude"
[19] "Hour.1"
Grafy
library(dplyr)
barc_data <- udaje %>%
filter(Date == 2017-04-19) %>%
select(Weekday, Mild.injuries, Vehicles.involved, Longitude, Latitude)
Scatter plot
Graf znázorňuje vzťah medzi počtom vozidiel zapojených do nehôd a ich
zemepisnou dĺžkou. Údaje sú rozdelené podľa časti dňa (ráno, popoludnie,
noc), takže vidíme, kedy sa nehody s viacerými vozidlami vyskytujú
častejšie. Farby bodov označujú dni v týždni, čo umožňuje porovnať, v
ktoré dni a kde sa nehody najčastejšie stávajú.
Z grafu môžeme vidieť, že ráno a popoludní dochádza k viac nehodám s
viacerými vozidlami, v noci je ich menej. Nehody sa vyskytujú v rôznych
častiach mesta, pričom okolie zemepisnej dĺžky cca 2,15–2,18 má viac
nehôd. V utorok a štvrtok vidíme v popoludňajších hodinách viac nehôd s
viacerými vozidlami, čo môže súvisieť s hustou premávkou počas
pracovného týždňa. Naopak, cez víkend je týchto prípadov menej, čo
naznačuje pokojnejšiu dopravnú situáciu.
barc_data <- read.csv("barc_data.csv", sep = ";", stringsAsFactors = FALSE)
# Premenila som stĺpce na číselné hodnoty
barc_data$Vehicles.involved <- as.numeric(barc_data$Vehicles.involved)
barc_data$Longitude <- as.numeric(gsub(",", ".", barc_data$Longitude))
barc_data$Part.of.the.day <- factor(barc_data$Part.of.the.day)
library(ggplot2)
ggplot(barc_data, aes(x = Vehicles.involved, y = Longitude, color = Weekday)) +
geom_point(size = 4, alpha = 0.8) +
facet_wrap(~ Part.of.the.day) +
theme_minimal() +
labs(title = "Vzťah medzi počtom vozidiel a zemepisnou dĺžkou",
subtitle = "Rozdelené podľa časti dňa",
x = "Počet zapojených vozidiel",
y = "Zemepisná dĺžka",
color = "Deň v týždni")

Stĺpcový graf
Na grafe môžeme vidieť priemerný počet obetí dopravných nehôd za
každý deň. Najvyššie hodnoty sú zaznamenané v sobotu, nasleduje streda a
nedeľa. V pondelok, utorok, štvrtok a piatok je priemerný počet obetí
nižší, pričom piatok vykazuje najnižšiu hodnotu zo všetkých dní.
library(ggplot2)
library(dplyr)
# Výpočet priemerného počtu obetí podľa dňa v týždni
obete_dni <- barc_data %>%
group_by(Weekday) %>%
summarise(mean_victims = mean(as.numeric(Victims), na.rm = TRUE))
obete_dni$Weekday <- factor(obete_dni$Weekday,
levels = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
)
# Vykreslenie stĺpcového diagramu s farebným rozlíšením
ggplot(obete_dni, aes(x = Weekday, y = mean_victims, fill = Weekday)) +
geom_col() +
labs(
title = "Priemerný počet obetí podľa dňa v týždni",
x = "Deň v týždni",
y = "Priemerný počet obetí"
) +
theme_minimal() +
theme(legend.position = "none")

Základné štatistiky.
knitr - tabuľka
Tabuľka naznačuje, že v januári bol počet obetí najnižší, často sa
objavila žiadna alebo iba jedna obeť. Vo februári a marci sa počet
pohyboval medzi jednou a dvoma obetami. V apríli môžeme vidieť
“najväčšiu” rozmanitosť – zaznamenali sa aj prípady s dvoma alebo tromi
obeťami.
library(dplyr)
library(knitr)
library(kableExtra)
# Súhrnné štatistiky podľa mesiaca
nehody_stats <- barc_data %>%
filter(Mesiace %in% c("Januar", "Februar", "Marec", "April")) %>%
group_by(Mesiace) %>%
summarise(
n = n(),
mean = mean(Victims, na.rm = TRUE),
sd = sd(Victims, na.rm = TRUE),
min = min(Victims, na.rm = TRUE),
q25 = quantile(Victims, 0.25, na.rm = TRUE),
median = median(Victims, na.rm = TRUE),
q75 = quantile(Victims, 0.75, na.rm = TRUE),
max = max(Victims, na.rm = TRUE),
.groups = "drop"
)
# Štýlová tabuľka s oddelenými údajmi
nehody_stats %>%
kable(digits = 2, caption = "Základné štatistiky počtu obetí (Január–Apríl)") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(1, bold = TRUE) %>%
row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
add_header_above(c(" " = 2, "Štatistiky obetí" = 7))
Základné štatistiky počtu obetí (Január–Apríl)
|
Štatistiky obetí |
| Mesiace |
n |
mean |
sd |
min |
q25 |
median |
q75 |
max |
| April |
5 |
1.6 |
0.89 |
1 |
1 |
1 |
2 |
3 |
| Februar |
5 |
1.4 |
0.55 |
1 |
1 |
1 |
2 |
2 |
| Januar |
5 |
0.8 |
0.45 |
0 |
1 |
1 |
1 |
1 |
| Marec |
5 |
1.2 |
0.45 |
1 |
1 |
1 |
1 |
2 |
Testovanie hypotéz
t-test: Rozdiel v počte obetí medzi januárom a májom
Výsledok t-testu naznačuje, že v máji bol priemerný počet obetí
výrazne vyšší než v januári (1,6 oproti 0,8). Výsledok t-testu
naznačuje, že tento rozdiel je štatisticky významný (p-hodnota ≈ 0,036).
Interval spoľahlivosti neobsahuje nulu, čo potvrdzuje, že rozdiel medzi
mesiacmi je reálny.
t.test.result <- t.test(
barc_data$Victims[barc_data$Mesiace == "Januar"],
barc_data$Victims[barc_data$Mesiace == "Maj"]
)
# Výsledok testu
print(t.test.result)
Welch Two Sample t-test
data: barc_data$Victims[barc_data$Mesiace == "Januar"] and barc_data$Victims[barc_data$Mesiace == "Maj"]
t = -2.5298, df = 7.6923, p-value = 0.03637
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1.53433111 -0.06566889
sample estimates:
mean of x mean of y
0.8 1.6
ANOVA: Porovnanie ľahkých zranení podľa mesiacov
Test ANOVA skúmal, či sa počet ľahkých zranení výrazne líši medzi
jednotlivými mesiacmi. Výsledok ukazuje, že rozdiely nie sú štatisticky
významné (p-hodnota = 0.809). To znamená, že počet ľahko zranených sa
počas roka nemení výrazne a kolísanie medzi mesiacmi môže byť
náhodné.
anova.result <- aov(Mild.injuries ~ Mesiace, data = barc_data)
summary(anova.result)
Df Sum Sq Mean Sq F value Pr(>F)
Mesiace 11 5.78 0.5258 0.613 0.809
Residuals 48 41.20 0.8583
Linear Regression: Vzťah medzi počtom vozidiel a počtom obetí
Analýza skúmala, či počet zúčastnených vozidiel ovplyvňuje počet
obetí pri dopravných nehodách. Výsledky ukazujú, že medzi týmito
premennými existuje mierne pozitívny vzťah (čím viac vozidiel, tým viac
obetí), ale tento vzťah nie je štatisticky významný (p-hodnota ≈
0.113).
model <- lm(Victims ~ Vehicles.involved, data = barc_data)
summary(model)
Call:
lm(formula = Victims ~ Vehicles.involved, data = barc_data)
Residuals:
Min 1Q Median 3Q Max
-1.5080 -0.5080 -0.3147 0.4920 4.4920
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.7348 0.4616 1.592 0.117
Vehicles.involved 0.3866 0.2405 1.607 0.113
Residual standard error: 0.9515 on 58 degrees of freedom
Multiple R-squared: 0.04264, Adjusted R-squared: 0.02613
F-statistic: 2.583 on 1 and 58 DF, p-value: 0.1134
LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIk1vbmlrYSBTesWxY3NvdsOhICA8YnI+CihzIHZ5dcW+aXTDrW0gdmVyZWpuZSBkb3N0dXBuw71jaCBrw7Nkb3YgYSBDaGF0R1BUKSIKZGF0ZTogIk9rdMOzYmVyIDIwMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogbHVtZW4KICAgIGhpZ2hsaWdodDogdGFuZ28KZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAgIGVjaG8gPSBUUlVFLAogICAgbWVzc2FnZSA9IEZBTFNFLAogICAgd2FybmluZyA9IEZBTFNFCikKYGBgCgojIEltcG9ydCBhIG7DoWjEvmFkIMO6ZGFqZSAKCkRhdGFzZXQgYmFyY19kYXRhLmNzdiB6IHJva3UgMjAxNyBvYnNhaHVqZSBpbmZvcm3DoWNpZSBvIGRvcHJhdm7DvWNoIG5laG9kw6FjaCB2IEJhcmNlbG9uZS4KCmBgYHtyfQp1ZGFqZSA8LSByZWFkLmNzdjIoImJhcmNfZGF0YS5jc3YiLGhlYWRlcj1UUlVFLHNlcD0iOyIsZGVjPSIuIikKaGVhZCh1ZGFqZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApjb2xuYW1lcyh1ZGFqZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKIyBHcmFmeQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCgpiYXJjX2RhdGEgPC0gdWRhamUgJT4lCiAgZmlsdGVyKERhdGUgPT0gMjAxNy0wNC0xOSkgJT4lCiAgc2VsZWN0KFdlZWtkYXksIE1pbGQuaW5qdXJpZXMsIFZlaGljbGVzLmludm9sdmVkLCBMb25naXR1ZGUsIExhdGl0dWRlKQpgYGAKCiMjIFNjYXR0ZXIgcGxvdCAKCkdyYWYgem7DoXpvcsWIdWplIHZ6xaVhaCBtZWR6aSBwb8SNdG9tIHZvemlkaWVsIHphcG9qZW7DvWNoIGRvIG5laMO0ZCBhIGljaCB6ZW1lcGlzbm91IGTEusW+a291LiDDmmRhamUgc8O6IHJvemRlbGVuw6kgcG9kxL5hIMSNYXN0aSBkxYhhIChyw6FubywgcG9wb2x1ZG5pZSwgbm9jKSwgdGFrxb5lIHZpZMOtbWUsIGtlZHkgc2EgbmVob2R5IHMgdmlhY2Vyw71taSB2b3ppZGxhbWkgdnlza3l0dWrDuiDEjWFzdGVqxaFpZS4KRmFyYnkgYm9kb3Ygb3puYcSNdWrDuiBkbmkgdiB0w73FvmRuaSwgxI1vIHVtb8W+xYh1amUgcG9yb3ZuYcWlLCB2IGt0b3LDqSBkbmkgYSBrZGUgc2EgbmVob2R5IG5hasSNYXN0ZWrFoWllIHN0w6F2YWrDui4KClogZ3JhZnUgbcO0xb5lbWUgdmlkaWXFpSwgxb5lIHLDoW5vIGEgcG9wb2x1ZG7DrSBkb2Now6FkemEgayB2aWFjIG5laG9kw6FtIHMgdmlhY2Vyw71taSB2b3ppZGxhbWksIHYgbm9jaSBqZSBpY2ggbWVuZWouIE5laG9keSBzYSB2eXNreXR1asO6IHYgcsO0em55Y2ggxI1hc3RpYWNoIG1lc3RhLCBwcmnEjW9tIG9rb2xpZSB6ZW1lcGlzbmVqIGTEusW+a3kgY2NhIDIsMTXigJMyLDE4IG3DoSB2aWFjIG5laMO0ZC4gViB1dG9yb2sgYSDFoXR2cnRvayB2aWTDrW1lIHYgcG9wb2x1ZMWIYWrFocOtY2ggaG9kaW7DoWNoIHZpYWMgbmVow7RkIHMgdmlhY2Vyw71taSB2b3ppZGxhbWksIMSNbyBtw7TFvmUgc8O6dmlzaWXFpSBzIGh1c3RvdSBwcmVtw6F2a291IHBvxI1hcyBwcmFjb3Zuw6lobyB0w73FvmTFiGEuIE5hb3BhaywgY2V6IHbDrWtlbmQgamUgdMO9Y2h0byBwcsOtcGFkb3YgbWVuZWosIMSNbyBuYXpuYcSNdWplIHBva29qbmVqxaFpdSBkb3ByYXZuw7ogc2l0dcOhY2l1LgoKYGBge3J9CmJhcmNfZGF0YSA8LSByZWFkLmNzdigiYmFyY19kYXRhLmNzdiIsIHNlcCA9ICI7Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCmBgYHtyfQojIFByZW1lbmlsYSBzb20gc3TEunBjZSBuYSDEjcOtc2VsbsOpIGhvZG5vdHkKYmFyY19kYXRhJFZlaGljbGVzLmludm9sdmVkIDwtIGFzLm51bWVyaWMoYmFyY19kYXRhJFZlaGljbGVzLmludm9sdmVkKQpiYXJjX2RhdGEkTG9uZ2l0dWRlIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsICIuIiwgYmFyY19kYXRhJExvbmdpdHVkZSkpCmJhcmNfZGF0YSRQYXJ0Lm9mLnRoZS5kYXkgPC0gZmFjdG9yKGJhcmNfZGF0YSRQYXJ0Lm9mLnRoZS5kYXkpCgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChiYXJjX2RhdGEsIGFlcyh4ID0gVmVoaWNsZXMuaW52b2x2ZWQsIHkgPSBMb25naXR1ZGUsIGNvbG9yID0gV2Vla2RheSkpICsKICBnZW9tX3BvaW50KHNpemUgPSA0LCBhbHBoYSA9IDAuOCkgKwogIGZhY2V0X3dyYXAofiBQYXJ0Lm9mLnRoZS5kYXkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiVnrFpWFoIG1lZHppIHBvxI10b20gdm96aWRpZWwgYSB6ZW1lcGlzbm91IGTEusW+a291IiwKICAgICAgIHN1YnRpdGxlID0gIlJvemRlbGVuw6kgcG9kxL5hIMSNYXN0aSBkxYhhIiwKICAgICAgIHggPSAiUG/EjWV0IHphcG9qZW7DvWNoIHZvemlkaWVsIiwKICAgICAgIHkgPSAiWmVtZXBpc27DoSBkxLrFvmthIiwKICAgICAgIGNvbG9yID0gIkRlxYggdiB0w73FvmRuaSIpCmBgYAoKIyMgU3TEunBjb3bDvSBncmFmCgpOYSBncmFmZSBtw7TFvmVtZSB2aWRpZcWlIHByaWVtZXJuw70gcG/EjWV0IG9iZXTDrSBkb3ByYXZuw71jaCBuZWjDtGQgemEga2HFvmTDvSBkZcWILiBOYWp2ecWhxaFpZSBob2Rub3R5IHPDuiB6YXpuYW1lbmFuw6kgdiBzb2JvdHUsIG5hc2xlZHVqZSBzdHJlZGEgYSBuZWRlxL5hLiBWIHBvbmRlbG9rLCB1dG9yb2ssIMWhdHZydG9rIGEgcGlhdG9rIGplIHByaWVtZXJuw70gcG/EjWV0IG9iZXTDrSBuacW+xaHDrSwgcHJpxI1vbSBwaWF0b2sgdnlrYXp1amUgbmFqbmnFvsWhaXUgaG9kbm90dSB6byB2xaFldGvDvWNoIGRuw60uCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQoKIyBWw71wb8SNZXQgcHJpZW1lcm7DqWhvIHBvxI10dSBvYmV0w60gcG9kxL5hIGTFiGEgdiB0w73FvmRuaQpvYmV0ZV9kbmkgPC0gYmFyY19kYXRhICU+JQogIGdyb3VwX2J5KFdlZWtkYXkpICU+JQogIHN1bW1hcmlzZShtZWFuX3ZpY3RpbXMgPSBtZWFuKGFzLm51bWVyaWMoVmljdGltcyksIG5hLnJtID0gVFJVRSkpCgpvYmV0ZV9kbmkkV2Vla2RheSA8LSBmYWN0b3Iob2JldGVfZG5pJFdlZWtkYXksCiAgbGV2ZWxzID0gYygiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSIsICJTdW5kYXkiKQopCgojIFZ5a3Jlc2xlbmllIHN0xLpwY292w6lobyBkaWFncmFtdSBzIGZhcmVibsO9bSByb3psw63FoWVuw61tCmdncGxvdChvYmV0ZV9kbmksIGFlcyh4ID0gV2Vla2RheSwgeSA9IG1lYW5fdmljdGltcywgZmlsbCA9IFdlZWtkYXkpKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicygKICAgIHRpdGxlID0gIlByaWVtZXJuw70gcG/EjWV0IG9iZXTDrSBwb2TEvmEgZMWIYSB2IHTDvcW+ZG5pIiwKICAgIHggPSAiRGXFiCB2IHTDvcW+ZG5pIiwKICAgIHkgPSAiUHJpZW1lcm7DvSBwb8SNZXQgb2JldMOtIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAKYGBgCgojIFrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kuIAoKCiMjIGtuaXRyIC0gdGFidcS+a2EKClRhYnXEvmthIG5hem5hxI11amUsIMW+ZSB2IGphbnXDoXJpIGJvbCBwb8SNZXQgb2JldMOtIG5ham5pxb7FocOtLCDEjWFzdG8gc2Egb2JqYXZpbGEgxb5pYWRuYSBhbGVibyBpYmEgamVkbmEgb2JlxaUuIFZvIGZlYnJ1w6FyaSBhIG1hcmNpIHNhIHBvxI1ldCBwb2h5Ym92YWwgbWVkemkgamVkbm91IGEgZHZvbWEgb2JldGFtaS4gViBhcHLDrWxpIG3DtMW+ZW1lIHZpZGllxaUgIm5hanbDpMSNxaFpdSIgcm96bWFuaXRvc8WlIOKAkyB6YXpuYW1lbmFsaSBzYSBhaiBwcsOtcGFkeSBzIGR2b21hIGFsZWJvIHRyb21pIG9iZcWlYW1pLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgU8O6aHJubsOpIMWhdGF0aXN0aWt5IHBvZMS+YSBtZXNpYWNhCm5laG9keV9zdGF0cyA8LSBiYXJjX2RhdGEgJT4lCiAgZmlsdGVyKE1lc2lhY2UgJWluJSBjKCJKYW51YXIiLCAiRmVicnVhciIsICJNYXJlYyIsICJBcHJpbCIpKSAlPiUKICBncm91cF9ieShNZXNpYWNlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuICAgICAgPSBuKCksCiAgICBtZWFuICAgPSBtZWFuKFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICBzZCAgICAgPSBzZChWaWN0aW1zLCBuYS5ybSA9IFRSVUUpLAogICAgbWluICAgID0gbWluKFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICBxMjUgICAgPSBxdWFudGlsZShWaWN0aW1zLCAwLjI1LCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuID0gbWVkaWFuKFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICBxNzUgICAgPSBxdWFudGlsZShWaWN0aW1zLCAwLjc1LCBuYS5ybSA9IFRSVUUpLAogICAgbWF4ICAgID0gbWF4KFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKIyDFoHTDvWxvdsOhIHRhYnXEvmthIHMgb2RkZWxlbsO9bWkgw7pkYWptaQpuZWhvZHlfc3RhdHMgJT4lCiAga2FibGUoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHBvxI10dSBvYmV0w60gKEphbnXDoXLigJNBcHLDrWwpIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIsWgdGF0aXN0aWt5IG9iZXTDrSIgPSA3KSkKYGBgCgojIFRlc3RvdmFuaWUgaHlwb3TDqXoKCiMjIyB0LXRlc3Q6IFJvemRpZWwgdiBwb8SNdGUgb2JldMOtIG1lZHppIGphbnXDoXJvbSBhIG3DoWpvbSAKClbDvXNsZWRvayB0LXRlc3R1IG5hem5hxI11amUsIMW+ZSB2IG3DoWppIGJvbCBwcmllbWVybsO9IHBvxI1ldCBvYmV0w60gdsO9cmF6bmUgdnnFocWhw60gbmXFviB2IGphbnXDoXJpICgxLDYgb3Byb3RpIDAsOCkuIFbDvXNsZWRvayB0LXRlc3R1IG5hem5hxI11amUsIMW+ZSB0ZW50byByb3pkaWVsIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChwLWhvZG5vdGEg4omIIDAsMDM2KS4gSW50ZXJ2YWwgc3BvxL5haGxpdm9zdGkgbmVvYnNhaHVqZSBudWx1LCDEjW8gcG90dnJkenVqZSwgxb5lIHJvemRpZWwgbWVkemkgbWVzaWFjbWkgamUgcmXDoWxueS4KCmBgYHtyfQp0LnRlc3QucmVzdWx0IDwtIHQudGVzdCgKICBiYXJjX2RhdGEkVmljdGltc1tiYXJjX2RhdGEkTWVzaWFjZSA9PSAiSmFudWFyIl0sCiAgYmFyY19kYXRhJFZpY3RpbXNbYmFyY19kYXRhJE1lc2lhY2UgPT0gIk1haiJdCikKCiMgVsO9c2xlZG9rIHRlc3R1CnByaW50KHQudGVzdC5yZXN1bHQpCmBgYAoKCiMjIyMgQU5PVkE6IFBvcm92bmFuaWUgxL5haGvDvWNoIHpyYW5lbsOtIHBvZMS+YSBtZXNpYWNvdgoKVGVzdCBBTk9WQSBza8O6bWFsLCDEjWkgc2EgcG/EjWV0IMS+YWhrw71jaCB6cmFuZW7DrSB2w71yYXpuZSBsw63FoWkgbWVkemkgamVkbm90bGl2w71taSBtZXNpYWNtaS4gVsO9c2xlZG9rIHVrYXp1amUsIMW+ZSByb3pkaWVseSBuaWUgc8O6IMWhdGF0aXN0aWNreSB2w716bmFtbsOpIChwLWhvZG5vdGEgPSAwLjgwOSkuIFRvIHpuYW1lbsOhLCDFvmUgcG/EjWV0IMS+YWhrbyB6cmFuZW7DvWNoIHNhIHBvxI1hcyByb2thIG5lbWVuw60gdsO9cmF6bmUgYSBrb2zDrXNhbmllIG1lZHppIG1lc2lhY21pIG3DtMW+ZSBiecWlIG7DoWhvZG7DqS4KCmBgYHtyfQphbm92YS5yZXN1bHQgPC0gYW92KE1pbGQuaW5qdXJpZXMgfiBNZXNpYWNlLCBkYXRhID0gYmFyY19kYXRhKQpzdW1tYXJ5KGFub3ZhLnJlc3VsdCkKYGBgCgoKIyMjIyBMaW5lYXIgUmVncmVzc2lvbjogVnrFpWFoIG1lZHppIHBvxI10b20gdm96aWRpZWwgYSBwb8SNdG9tIG9iZXTDrQoKQW5hbMO9emEgc2vDum1hbGEsIMSNaSBwb8SNZXQgesO6xI1hc3RuZW7DvWNoIHZvemlkaWVsIG92cGx5dsWIdWplIHBvxI1ldCBvYmV0w60gcHJpIGRvcHJhdm7DvWNoIG5laG9kw6FjaC4gVsO9c2xlZGt5IHVrYXp1asO6LCDFvmUgbWVkemkgdMO9bWl0byBwcmVtZW5uw71taSBleGlzdHVqZSBtaWVybmUgcG96aXTDrXZueSB2esWlYWggKMSNw61tIHZpYWMgdm96aWRpZWwsIHTDvW0gdmlhYyBvYmV0w60pLCBhbGUgdGVudG8gdnrFpWFoIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAocC1ob2Rub3RhIOKJiCAwLjExMykuCgpgYGB7cn0KbW9kZWwgPC0gbG0oVmljdGltcyB+IFZlaGljbGVzLmludm9sdmVkLCBkYXRhID0gYmFyY19kYXRhKQpzdW1tYXJ5KG1vZGVsKQpgYGAKCgoKCgoKCg==