knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE
)

Úvod k zadaniu

Úlohou je:

  • navrhnúť vlastný cvičebný dokument k práci s databázou,
  • zvoliť databázu s údajmi zoradenými v čase, ktorú bude možné neskôr použiť na ďalšie ekonometrické analýzy,
  • ukázať základnú prácu s údajmi (import, úprava, grafy, jednoduché modely)

V ďalšej časti preto podrobnejšie popisujem voľbu databázy a následne demonštrujem prácu s ňou v prostredí R.


Voľba databázy – World Development Indicators (WDI)

Ako databázu som si zvolila World Development Indicators (WDI) zo Svetovej banky. Ide o verejne dostupnú databázu, ktorá obsahuje dlhé časové rady makroekonomických ukazovateľov pre množstvo krajín sveta.

V rámci tohto zadania budem pracovať s týmito údajmi:

  • krajiny: Slovensko, Česko, Poľsko,
  • obdobie: roky 2000–2023 (ročné údaje),
  • premenné:
    • HDP na obyvateľa (konštantné ceny),
    • miera nezamestnanosti,
    • medziročná inflácia (CPI).

Tieto údaje sú zoradené v čase, takže sú vhodné na ďalšiu analýzu (časové rady, porovnanie krajín, jednoduché regresné modely a pod.).

Na sťahovanie dát použijem balík WDI a na následnú prácu s údajmi balíky tidyverse, knitr a kableExtra.


Načítanie knižníc

# inštalácia (iba raz, ak ešte nie sú nainštalované)
# install.packages("WDI")
# install.packages("tidyverse")
# install.packages("kableExtra")

library(WDI)
library(tidyverse)
library(knitr)
library(kableExtra)

Stiahnutie a príprava údajov z WDI

Voľba krajín a indikátorov

# ISO kódy krajín (3-písmenové kódy)
krajiny <- c("SVK", "CZE", "POL")

# Zvolené indikátory WDI (s vlastnými názvami stĺpcov)
indikatory <- c(
  gdp_pc      = "NY.GDP.PCAP.KD",   # HDP na obyvateľa, konštantné ceny
  unemployment = "SL.UEM.TOTL.ZS",  # miera nezamestnanosti v %
  inflation    = "FP.CPI.TOTL.ZG"   # medziročná inflácia CPI v %
)

# Stiahnutie údajov za roky 2000–2023
wdi_raw <- WDI(
  country   = krajiny,
  indicator = indikatory,
  start     = 2000,
  end       = 2023
)

# Úprava a zoradenie údajov
wdi_data <- wdi_raw %>%
  rename(
    krajina = country,
    rok     = year
  ) %>%
  arrange(krajina, rok)

head(wdi_data)

Základný popis zvolenej databázy

V tejto podsekcii krátko popíšem, aké údaje chcem do budúcna spracovávať:

  • HDP na obyvateľa (gdp_pc) – ukazovateľ ekonomickej úrovne krajiny,
  • nezamestnanosť (unemployment) – situácia na trhu práce,
  • inflácia (inflation) – stabilita cien.

V ďalších zadaniach by sa dali napríklad skúmať:

  • rozdiely v úrovni HDP na obyvateľa medzi krajinami,
  • vzťah medzi HDP a nezamestnanosťou (napr. Okunov zákon),
  • vzťah medzi infláciou a nezamestnanosťou (Phillipsova krivka),
  • jednoduché predikcie na základe trendu.

Prvé prehliadnutie dát

Základná štruktúra

glimpse(wdi_data)

Ukážka prvých riadkov

kable(
  head(wdi_data, 10),
  caption = "Prvých 10 riadkov stiahnutých údajov z WDI"
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed", "responsive")
  )

Deskriptívna analýza

Základné štatistiky podľa krajín

summary_tbl <- wdi_data %>%
  group_by(krajina) %>%
  summarise(
    pocet_rokov   = n_distinct(rok),
    priemer_gdp   = mean(gdp_pc, na.rm = TRUE),
    priemer_unemp = mean(unemployment, na.rm = TRUE),
    priemer_infl  = mean(inflation, na.rm = TRUE),
    .groups = "drop"
  )

summary_tbl %>%
  kable(
    digits = 2,
    caption = "Základné štatistiky ukazovateľov podľa krajín (2000–2023)"
  ) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed")
  )

Korelačná matica

cor_tbl <- wdi_data %>%
  select(gdp_pc, unemployment, inflation) %>%
  cor(use = "complete.obs")

kable(
  cor_tbl,
  digits = 2,
  caption = "Korelačná matica ukazovateľov"
) %>%
  kable_styling(full_width = FALSE)

Grafické znázornenie vývoja v čase

V tejto časti vykreslím časové rady všetkých troch ukazovateľov pre zvolené krajiny. Grafy sa automaticky vykreslia pri Knit → HTML.

HDP na obyvateľa

ggplot(wdi_data, aes(x = rok, y = gdp_pc, color = krajina)) +
  geom_line(size = 1) +
  labs(
    title = "HDP na obyvateľa – Slovensko, Česko, Poľsko",
    x = "Rok",
    y = "HDP na obyvateľa (konštantné ceny, USD)",
    color = "Krajina"
  ) +
  theme_minimal()

Miera nezamestnanosti

ggplot(wdi_data, aes(x = rok, y = unemployment, color = krajina)) +
  geom_line(size = 1) +
  labs(
    title = "Miera nezamestnanosti – Slovensko, Česko, Poľsko",
    x = "Rok",
    y = "Nezamestnanosť (%)",
    color = "Krajina"
  ) +
  theme_minimal()

Inflácia

ggplot(wdi_data, aes(x = rok, y = inflation, color = krajina)) +
  geom_line(size = 1) +
  labs(
    title = "Inflácia (CPI) – Slovensko, Česko, Poľsko",
    x = "Rok",
    y = "Medziročná zmena CPI (%)",
    color = "Krajina"
  ) +
  theme_minimal()

Jednoduchý model – vzťah HDP a nezamestnanosti

Ako ilustráciu jednoduchého ekonometrického modelu odhadnem lineárny vzťah medzi HDP na obyvateľa a mierou nezamestnanosti:

\[ \text{unemployment}_{it} = \beta_0 + \beta_1 \cdot \text{gdp\_pc}_{it} + u_{it}, \]

kde \(i\) reprezentuje krajinu a \(t\) rok.

model_unemp <- lm(unemployment ~ gdp_pc, data = wdi_data)
summary(model_unemp)

Grafická ilustrácia modelu

Pre jednoduchosť zobrazím vzťah pre všetky krajiny spolu:

ggplot(wdi_data, aes(x = gdp_pc, y = unemployment, color = krajina)) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  labs(
    title = "HDP na obyvateľa vs. miera nezamestnanosti",
    x = "HDP na obyvateľa (konštantné ceny, USD)",
    y = "Nezamestnanosť (%)",
    color = "Krajina"
  ) +
  theme_minimal()

Zhrnutie a plán na ďalšie hodiny

V tomto RMarkdown dokumente som:

  1. Zvolila databázu World Development Indicators (WDI), ktorá obsahuje časovo zoradené makroekonomické údaje.
  2. Stiahla údaje pre Slovensko, Česko a Poľsko za roky 2000–2023:
    • HDP na obyvateľa,
    • mieru nezamestnanosti,
    • infláciu.
  3. Ukázala:
    • základné tabuľkové prehliadnutie dát,
    • deskriptívne štatistiky,
    • korelačnú maticu,
    • viacero grafov (časové rady, scatter plot s regresnou čiarou),
    • jednoduchý lineárny model.

Čo plánujem robiť na budúcich hodinách

Na nasledujúcich cvičeniach by som chcela s týmito dátami ďalej pracovať:

  • skúmať trendy a cykly v jednotlivých ukazovateľoch,
  • porovnať dynamiku medzi krajinami,
  • vytvoriť panelový dataset a odhadovať jednoduché panelové modely,
  • otestovať vzťah medzi nezamestnanosťou a rastom HDP (napr. jednoduchá verzia Okunovho zákona),
  • pokúsiť sa o krátkodobú predikciu jednotlivých ukazovateľov.
LS0tCnRpdGxlOiAiWkFEQU5JRSAzIgphdXRob3I6ICJOYXTDoWxpYSBTb2xpZ292w6EiCmRhdGU6ICJOT1ZFTUJFUiAyMDI1IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsCiAgbWVzc2FnZSA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRQopCmBgYAoKIyDDmnZvZCBrIHphZGFuaXUKCiDDmmxvaG91IGplOgoKLSBuYXZyaG7DusWlIHZsYXN0bsO9IGN2acSNZWJuw70gZG9rdW1lbnQgayBwcsOhY2kgcyBkYXRhYsOhem91LAotIHp2b2xpxaUgZGF0YWLDoXp1IHMgw7pkYWptaSB6b3JhZGVuw71taSB2IMSNYXNlLCBrdG9yw7ogYnVkZSBtb8W+bsOpIG5lc2vDtHIKICBwb3XFvmnFpSBuYSDEj2FsxaFpZSBla29ub21ldHJpY2vDqSBhbmFsw716eSwKLSB1a8OhemHFpSB6w6FrbGFkbsO6IHByw6FjdSBzIMO6ZGFqbWkgKGltcG9ydCwgw7pwcmF2YSwgZ3JhZnksIGplZG5vZHVjaMOpIG1vZGVseSkKClYgxI9hbMWhZWogxI1hc3RpIHByZXRvIHBvZHJvYm5lasWhaWUgcG9waXN1amVtICoqdm/EvmJ1IGRhdGFiw6F6eSoqIGEgbsOhc2xlZG5lCmRlbW9uxaF0cnVqZW0gcHLDoWN1IHMgxYhvdSB2IHByb3N0cmVkw60gUi4KCi0tLQoKIyBWb8S+YmEgZGF0YWLDoXp5IOKAkyBXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzIChXREkpCgpBa28gZGF0YWLDoXp1IHNvbSBzaSB6dm9saWxhICoqV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycyAoV0RJKSoqIHpvClN2ZXRvdmVqIGJhbmt5LiBJZGUgbyB2ZXJlam5lIGRvc3R1cG7DuiBkYXRhYsOhenUsIGt0b3LDoSBvYnNhaHVqZSBkbGjDqQrEjWFzb3bDqSByYWR5IG1ha3JvZWtvbm9taWNrw71jaCB1a2F6b3ZhdGXEvm92IHByZSBtbm/FvnN0dm8ga3JhasOtbiBzdmV0YS4KClYgcsOhbWNpIHRvaHRvIHphZGFuaWEgYnVkZW0gcHJhY292YcWlIHMgdMO9bWl0byDDumRham1pOgoKLSBrcmFqaW55OiAqKlNsb3ZlbnNrbywgxIxlc2tvLCBQb8S+c2tvKiosCi0gb2Jkb2JpZTogKipyb2t5IDIwMDDigJMyMDIzKiogKHJvxI1uw6kgw7pkYWplKSwKLSBwcmVtZW5uw6k6CiAgLSAqKkhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgY2VueSkqKiwKICAtICoqbWllcmEgbmV6YW1lc3RuYW5vc3RpKiosCiAgLSAqKm1lZHppcm/EjW7DoSBpbmZsw6FjaWEgKENQSSkqKi4KClRpZXRvIMO6ZGFqZSBzw7ogKip6b3JhZGVuw6kgdiDEjWFzZSoqLCB0YWvFvmUgc8O6IHZob2Ruw6kgbmEgxI9hbMWhaXUgYW5hbMO9enUKKMSNYXNvdsOpIHJhZHksIHBvcm92bmFuaWUga3JhasOtbiwgamVkbm9kdWNow6kgcmVncmVzbsOpIG1vZGVseSBhIHBvZC4pLgoKTmEgc8WlYWhvdmFuaWUgZMOhdCBwb3XFvmlqZW0gYmFsw61rICoqV0RJKiogYSBuYSBuw6FzbGVkbsO6IHByw6FjdSBzIMO6ZGFqbWkKYmFsw61reSAqKnRpZHl2ZXJzZSoqLCAqKmtuaXRyKiogYSAqKmthYmxlRXh0cmEqKi4KCi0tLQoKIyBOYcSNw610YW5pZSBrbmnFvm7DrWMKCmBgYHtyIGxpYnJhcmllc30KIyBpbsWhdGFsw6FjaWEgKGliYSByYXosIGFrIGXFoXRlIG5pZSBzw7ogbmFpbsWhdGFsb3ZhbsOpKQojIGluc3RhbGwucGFja2FnZXMoIldESSIpCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikKCmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpgYGAKCi0tLQoKIyBTdGlhaG51dGllIGEgcHLDrXByYXZhIMO6ZGFqb3YgeiBXREkKCiMjIFZvxL5iYSBrcmFqw61uIGEgaW5kaWvDoXRvcm92CgpgYGB7ciB3ZGlfZG93bmxvYWR9CiMgSVNPIGvDs2R5IGtyYWrDrW4gKDMtcMOtc21lbm92w6kga8OzZHkpCmtyYWppbnkgPC0gYygiU1ZLIiwgIkNaRSIsICJQT0wiKQoKIyBadm9sZW7DqSBpbmRpa8OhdG9yeSBXREkgKHMgdmxhc3Ruw71taSBuw6F6dmFtaSBzdMS6cGNvdikKaW5kaWthdG9yeSA8LSBjKAogIGdkcF9wYyAgICAgID0gIk5ZLkdEUC5QQ0FQLktEIiwgICAjIEhEUCBuYSBvYnl2YXRlxL5hLCBrb27FoXRhbnRuw6kgY2VueQogIHVuZW1wbG95bWVudCA9ICJTTC5VRU0uVE9UTC5aUyIsICAjIG1pZXJhIG5lemFtZXN0bmFub3N0aSB2ICUKICBpbmZsYXRpb24gICAgPSAiRlAuQ1BJLlRPVEwuWkciICAgIyBtZWR6aXJvxI1uw6EgaW5mbMOhY2lhIENQSSB2ICUKKQoKIyBTdGlhaG51dGllIMO6ZGFqb3YgemEgcm9reSAyMDAw4oCTMjAyMwp3ZGlfcmF3IDwtIFdESSgKICBjb3VudHJ5ICAgPSBrcmFqaW55LAogIGluZGljYXRvciA9IGluZGlrYXRvcnksCiAgc3RhcnQgICAgID0gMjAwMCwKICBlbmQgICAgICAgPSAyMDIzCikKCiMgw5pwcmF2YSBhIHpvcmFkZW5pZSDDumRham92CndkaV9kYXRhIDwtIHdkaV9yYXcgJT4lCiAgcmVuYW1lKAogICAga3JhamluYSA9IGNvdW50cnksCiAgICByb2sgICAgID0geWVhcgogICkgJT4lCiAgYXJyYW5nZShrcmFqaW5hLCByb2spCgpoZWFkKHdkaV9kYXRhKQpgYGAKCi0tLQoKIyBaw6FrbGFkbsO9IHBvcGlzIHp2b2xlbmVqIGRhdGFiw6F6eQoKViB0ZWp0byBwb2RzZWtjaWkga3LDoXRrbyBwb3DDrcWhZW0sIGFrw6kgw7pkYWplIGNoY2VtIGRvIGJ1ZMO6Y25hIHNwcmFjb3bDoXZhxaU6CgotICoqSERQIG5hIG9ieXZhdGXEvmEgKGdkcF9wYykqKiDigJMgdWthem92YXRlxL4gZWtvbm9taWNrZWogw7pyb3ZuZSBrcmFqaW55LAotICoqbmV6YW1lc3RuYW5vc8WlICh1bmVtcGxveW1lbnQpKiog4oCTIHNpdHXDoWNpYSBuYSB0cmh1IHByw6FjZSwKLSAqKmluZmzDoWNpYSAoaW5mbGF0aW9uKSoqIOKAkyBzdGFiaWxpdGEgY2llbi4KClYgxI9hbMWhw61jaCB6YWRhbmlhY2ggYnkgc2EgZGFsaSBuYXByw61rbGFkIHNrw7ptYcWlOgoKLSByb3pkaWVseSB2IMO6cm92bmkgSERQIG5hIG9ieXZhdGXEvmEgbWVkemkga3JhamluYW1pLAotIHZ6xaVhaCBtZWR6aSBIRFAgYSBuZXphbWVzdG5hbm9zxaVvdSAobmFwci4gT2t1bm92IHrDoWtvbiksCi0gdnrFpWFoIG1lZHppIGluZmzDoWNpb3UgYSBuZXphbWVzdG5hbm9zxaVvdSAoUGhpbGxpcHNvdmEga3JpdmthKSwKLSBqZWRub2R1Y2jDqSBwcmVkaWtjaWUgbmEgesOha2xhZGUgdHJlbmR1LgoKLS0tCgojIFBydsOpIHByZWhsaWFkbnV0aWUgZMOhdAoKIyMgWsOha2xhZG7DoSDFoXRydWt0w7pyYQoKYGBge3IgZ2xpbXBzZV9kYXRhfQpnbGltcHNlKHdkaV9kYXRhKQpgYGAKCiMjIFVrw6HFvmthIHBydsO9Y2ggcmlhZGtvdgoKYGBge3IgaGVhZF9kYXRhfQprYWJsZSgKICBoZWFkKHdkaV9kYXRhLCAxMCksCiAgY2FwdGlvbiA9ICJQcnbDvWNoIDEwIHJpYWRrb3Ygc3RpYWhudXTDvWNoIMO6ZGFqb3YgeiBXREkiCikgJT4lCiAga2FibGVfc3R5bGluZygKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpCiAgKQpgYGAKCi0tLQoKIyBEZXNrcmlwdMOtdm5hIGFuYWzDvXphCgojIyBaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHBvZMS+YSBrcmFqw61uCgpgYGB7ciBzdW1tYXJ5X2J5X2NvdW50cnl9CnN1bW1hcnlfdGJsIDwtIHdkaV9kYXRhICU+JQogIGdyb3VwX2J5KGtyYWppbmEpICU+JQogIHN1bW1hcmlzZSgKICAgIHBvY2V0X3Jva292ICAgPSBuX2Rpc3RpbmN0KHJvayksCiAgICBwcmllbWVyX2dkcCAgID0gbWVhbihnZHBfcGMsIG5hLnJtID0gVFJVRSksCiAgICBwcmllbWVyX3VuZW1wID0gbWVhbih1bmVtcGxveW1lbnQsIG5hLnJtID0gVFJVRSksCiAgICBwcmllbWVyX2luZmwgID0gbWVhbihpbmZsYXRpb24sIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKc3VtbWFyeV90YmwgJT4lCiAga2FibGUoCiAgICBkaWdpdHMgPSAyLAogICAgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHVrYXpvdmF0ZcS+b3YgcG9kxL5hIGtyYWrDrW4gKDIwMDDigJMyMDIzKSIKICApICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikKICApCmBgYAoKIyMgS29yZWxhxI1uw6EgbWF0aWNhCgpgYGB7ciBjb3JyZWxhdGlvbl9tYXRyaXh9CmNvcl90YmwgPC0gd2RpX2RhdGEgJT4lCiAgc2VsZWN0KGdkcF9wYywgdW5lbXBsb3ltZW50LCBpbmZsYXRpb24pICU+JQogIGNvcih1c2UgPSAiY29tcGxldGUub2JzIikKCmthYmxlKAogIGNvcl90YmwsCiAgZGlnaXRzID0gMiwKICBjYXB0aW9uID0gIktvcmVsYcSNbsOhIG1hdGljYSB1a2F6b3ZhdGXEvm92IgopICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKCi0tLQoKIyBHcmFmaWNrw6kgem7DoXpvcm5lbmllIHbDvXZvamEgdiDEjWFzZQoKViB0ZWp0byDEjWFzdGkgdnlrcmVzbMOtbSAqKsSNYXNvdsOpIHJhZHkqKiB2xaFldGvDvWNoIHRyb2NoIHVrYXpvdmF0ZcS+b3YKcHJlIHp2b2xlbsOpIGtyYWppbnkuIEdyYWZ5IHNhIGF1dG9tYXRpY2t5IHZ5a3Jlc2xpYSBwcmkgS25pdCDihpIgSFRNTC4KCiMjIEhEUCBuYSBvYnl2YXRlxL5hCgpgYGB7ciBwbG90X2dkcCwgZmlnLmNhcD0iVsO9dm9qIEhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgY2VueSkgdiDEjWFzZSJ9CmdncGxvdCh3ZGlfZGF0YSwgYWVzKHggPSByb2ssIHkgPSBnZHBfcGMsIGNvbG9yID0ga3JhamluYSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSERQIG5hIG9ieXZhdGXEvmEg4oCTIFNsb3ZlbnNrbywgxIxlc2tvLCBQb8S+c2tvIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiSERQIG5hIG9ieXZhdGXEvmEgKGtvbsWhdGFudG7DqSBjZW55LCBVU0QpIiwKICAgIGNvbG9yID0gIktyYWppbmEiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgTWllcmEgbmV6YW1lc3RuYW5vc3RpCgpgYGB7ciBwbG90X3VuZW1wLCBmaWcuY2FwPSJWw712b2ogbWllcnkgbmV6YW1lc3RuYW5vc3RpIHYgxI1hc2UifQpnZ3Bsb3Qod2RpX2RhdGEsIGFlcyh4ID0gcm9rLCB5ID0gdW5lbXBsb3ltZW50LCBjb2xvciA9IGtyYWppbmEpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgbGFicygKICAgIHRpdGxlID0gIk1pZXJhIG5lemFtZXN0bmFub3N0aSDigJMgU2xvdmVuc2tvLCDEjGVza28sIFBvxL5za28iLAogICAgeCA9ICJSb2siLAogICAgeSA9ICJOZXphbWVzdG5hbm9zxaUgKCUpIiwKICAgIGNvbG9yID0gIktyYWppbmEiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgSW5mbMOhY2lhCgpgYGB7ciBwbG90X2luZmxhdGlvbiwgZmlnLmNhcD0iVsO9dm9qIGluZmzDoWNpZSB2IMSNYXNlIn0KZ2dwbG90KHdkaV9kYXRhLCBhZXMoeCA9IHJvaywgeSA9IGluZmxhdGlvbiwgY29sb3IgPSBrcmFqaW5hKSkgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJJbmZsw6FjaWEgKENQSSkg4oCTIFNsb3ZlbnNrbywgxIxlc2tvLCBQb8S+c2tvIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiTWVkemlyb8SNbsOhIHptZW5hIENQSSAoJSkiLAogICAgY29sb3IgPSAiS3JhamluYSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgotLS0KCiMgSmVkbm9kdWNow70gbW9kZWwg4oCTIHZ6xaVhaCBIRFAgYSBuZXphbWVzdG5hbm9zdGkKCkFrbyBpbHVzdHLDoWNpdSBqZWRub2R1Y2jDqWhvIGVrb25vbWV0cmlja8OpaG8gbW9kZWx1IG9kaGFkbmVtIGxpbmXDoXJueQp2esWlYWggbWVkemkgSERQIG5hIG9ieXZhdGXEvmEgYSBtaWVyb3UgbmV6YW1lc3RuYW5vc3RpOgoKXFsKXHRleHR7dW5lbXBsb3ltZW50fV97aXR9ID0gXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgXHRleHR7Z2RwXF9wY31fe2l0fSArIHVfe2l0fSwKXF0KCmtkZSBcKGlcKSByZXByZXplbnR1amUga3JhamludSBhIFwodFwpIHJvay4KCmBgYHtyIHNpbXBsZV9yZWdyZXNzaW9ufQptb2RlbF91bmVtcCA8LSBsbSh1bmVtcGxveW1lbnQgfiBnZHBfcGMsIGRhdGEgPSB3ZGlfZGF0YSkKc3VtbWFyeShtb2RlbF91bmVtcCkKYGBgCgojIyBHcmFmaWNrw6EgaWx1c3Ryw6FjaWEgbW9kZWx1CgpQcmUgamVkbm9kdWNob3PFpSB6b2JyYXrDrW0gdnrFpWFoIHByZSB2xaFldGt5IGtyYWppbnkgc3BvbHU6CgpgYGB7ciBzY2F0dGVyX3JlZ3Jlc3Npb24sIGZpZy5jYXA9IlZ6xaVhaCBtZWR6aSBIRFAgbmEgb2J5dmF0ZcS+YSBhIG5lemFtZXN0bmFub3PFpW91In0KZ2dwbG90KHdkaV9kYXRhLCBhZXMoeCA9IGdkcF9wYywgeSA9IHVuZW1wbG95bWVudCwgY29sb3IgPSBrcmFqaW5hKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSERQIG5hIG9ieXZhdGXEvmEgdnMuIG1pZXJhIG5lemFtZXN0bmFub3N0aSIsCiAgICB4ID0gIkhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgY2VueSwgVVNEKSIsCiAgICB5ID0gIk5lemFtZXN0bmFub3PFpSAoJSkiLAogICAgY29sb3IgPSAiS3JhamluYSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgotLS0KCiMgWmhybnV0aWUgYSBwbMOhbiBuYSDEj2FsxaFpZSBob2RpbnkKClYgdG9tdG8gUk1hcmtkb3duIGRva3VtZW50ZSBzb206CgoxLiBadm9saWxhIGRhdGFiw6F6dSAqKldvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnMgKFdESSkqKiwga3RvcsOhIG9ic2FodWplCiAgIMSNYXNvdm8gem9yYWRlbsOpIG1ha3JvZWtvbm9taWNrw6kgw7pkYWplLgoyLiBTdGlhaGxhIMO6ZGFqZSBwcmUgKipTbG92ZW5za28sIMSMZXNrbyBhIFBvxL5za28qKiB6YSByb2t5ICoqMjAwMOKAkzIwMjMqKjoKICAgLSBIRFAgbmEgb2J5dmF0ZcS+YSwKICAgLSBtaWVydSBuZXphbWVzdG5hbm9zdGksCiAgIC0gaW5mbMOhY2l1LgozLiBVa8OhemFsYToKICAgLSB6w6FrbGFkbsOpIHRhYnXEvmtvdsOpIHByZWhsaWFkbnV0aWUgZMOhdCwKICAgLSBkZXNrcmlwdMOtdm5lIMWhdGF0aXN0aWt5LAogICAtIGtvcmVsYcSNbsO6IG1hdGljdSwKICAgLSB2aWFjZXJvIGdyYWZvdiAoxI1hc292w6kgcmFkeSwgc2NhdHRlciBwbG90IHMgcmVncmVzbm91IMSNaWFyb3UpLAogICAtIGplZG5vZHVjaMO9IGxpbmXDoXJueSBtb2RlbC4KCiMjIMSMbyBwbMOhbnVqZW0gcm9iacWlIG5hIGJ1ZMO6Y2ljaCBob2RpbsOhY2gKCk5hIG5hc2xlZHVqw7pjaWNoIGN2acSNZW5pYWNoIGJ5IHNvbSBjaGNlbGEgcyB0w71taXRvIGTDoXRhbWkgxI9hbGVqIHByYWNvdmHFpToKCi0gc2vDum1hxaUgKip0cmVuZHkgYSBjeWtseSoqIHYgamVkbm90bGl2w71jaCB1a2F6b3ZhdGXEvm9jaCwKLSBwb3Jvdm5hxaUgZHluYW1pa3UgbWVkemkga3JhamluYW1pLAotIHZ5dHZvcmnFpSAqKnBhbmVsb3bDvSBkYXRhc2V0KiogYSBvZGhhZG92YcWlIGplZG5vZHVjaMOpIHBhbmVsb3bDqSBtb2RlbHksCi0gb3Rlc3RvdmHFpSB2esWlYWggbWVkemkgbmV6YW1lc3RuYW5vc8Wlb3UgYSByYXN0b20gSERQCiAgKG5hcHIuIGplZG5vZHVjaMOhIHZlcnppYSBPa3Vub3ZobyB6w6Frb25hKSwKLSBwb2vDunNpxaUgc2EgbyAqKmtyw6F0a29kb2LDuiBwcmVkaWtjaXUqKiBqZWRub3RsaXbDvWNoIHVrYXpvdmF0ZcS+b3YuCgoK