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

Import údajov

udaje <- read.csv2("Temperature_2020.csv",header=TRUE,sep=";",dec=",",fileEncoding = "Windows-1250")
head(udaje)                                         
colnames(udaje)                                         
 [1] "Year"                             
 [2] "Month"                            
 [3] "Air.Pressure..hPa."               
 [4] "Temperature...C."                 
 [5] "Potential.Temperature..K."        
 [6] "Dew.Point...C."                   
 [7] "Relative.Humidity...."            
 [8] "Saturated.Vapour.Pressure..hPa."  
 [9] "Actual.Vapour.Pressure..hPa."     
[10] "Vapour.Pressure.Deficit..hPa."    
[11] "Specific.Humidity..g.kg."         
[12] "Water.Vapour.Concentration..g.m.."
[13] "Air.Density..kg.m.."              
[14] "Wind.Speed..m.s."                 
[15] "Max.Wind.Speed..m.s."             
[16] "Wind.Direction...."               
[17] "Precipitation..mm."               
[18] "Rain.Duration...."                
[19] "Solar.Radiation..W.m.."           
[20] "PAR..µmol.m.s."                   
[21] "Max.PAR..µmol.m.s."               
[22] "Soil.Temperature...C."            

Grafy

ggplot2 - knižnica pre grafy

library(dplyr)

Temperature_2020.csv <- udaje %>%
  filter(Year == 2020) %>%
  select(Month, Air.Pressure..hPa., Temperature...C.)

Scatter plot

# Basic scatter plot
library(ggplot2)
ggplot(Temperature_2020.csv, aes(x = Air.Pressure..hPa., y = Temperature...C.,color = factor(Month))) +            
  geom_point(size = 4) +                                                   
  theme_minimal() +
  labs(title = "Air Pressure vs Temperature (2020)", x = "Air Pressure (hPa)", y = "Temperature (°C)", color = "Month")      

theme(legend.position = "right")
<theme> List of 1
 $ legend.position: chr "right"
 @ complete: logi FALSE
 @ validate: logi TRUE

Graf znázorňuje vzťah medzi tlakom vzduchu (hPa) a teplotou (°C) počas jednotlivých mesiacov roku 2020. Farebné body na grafe predstavujú jednotlivé mesiace roka. Z grafu je zrejmé, že pri nižšom tlaku vzduchu sú teploty vyššie, zatiaľ čo pri vyššom tlaku sú teploty nižšie. To poukazuje na negatívnu koreláciu medzi týmito premennými. V meteorologickom zmysle to znamená, že vyšší tlak vzduchu býva spojený so stabilným a chladnejším počasím, kým nižší tlak prináša teplejšie a vlhkejšie obdobia.

Boxplot

# Bar plot with grouping
library(ggplot2)

library(ggplot2)

ggplot(udaje, aes(x = factor(Year), y = Relative.Humidity....)) +        
  geom_boxplot(fill = "lightblue", color = "darkblue") +      
  labs(                                                       
    title = "Relative Humidity (%) in 2020",
    x = "Year",
    y = "Relative Humidity (%)"
  ) +
  theme_minimal()

Boxplot zobrazuje rozloženie relatívnej vlhkosti vzduchu (%) v roku 2020. Z grafu vidno, že medián relatívnej vlhkosti je približne 70 %, pričom väčšina hodnôt sa pohybuje v rozmedzí 65 % až 80 %. Nižšie a vyššie hodnoty mimo tohto rozsahu predstavujú extrémnejšie prípady vlhkejšieho alebo suchšieho vzduchu.

Základné štatistiky

knitr - tabuľka

library(dplyr)
library(knitr)
library(kableExtra)

# Summarise basic statistics
temp.stats <- udaje %>%
  group_by(Year) %>%
  summarise(
    n      = n(),
    mean   = mean(Temperature...C., na.rm = TRUE),
    sd     = sd(Temperature...C., na.rm = TRUE),
    min    = min(Temperature...C., na.rm = TRUE),
    q25    = quantile(Temperature...C., 0.25, na.rm = TRUE),
    median = median(Temperature...C., na.rm = TRUE),
    q75    = quantile(Temperature...C., 0.75, na.rm = TRUE),
    max    = max(Temperature...C., na.rm = TRUE),
    .groups = "drop"
  )

# Create styled kableExtra table
temp.stats %>%
  kable(digits = 2, caption = "Basic statistics of Temperature (°C) - Year 2020") %>%
  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, "Temperature Statistics" = 7))
Basic statistics of Temperature (°C) - Year 2020
Temperature Statistics
Year n mean sd min q25 median q75 max
2020 12 10.81 6.16 3.3 5.66 10.63 15.9 20.76

Tabuľka zobrazuje základné štatistické ukazovatele teploty vzduchu (°C) v roku 2020. Priemerná teplota bola 10,81 °C, pričom hodnoty sa pohybovali od 3,3 °C do 20,76 °C. Mediánová teplota bola 10,63 °C, čo znamená, že polovica mesiacov mala teplotu nižšiu a polovica vyššiu. Rozptyl teplôt bol pomerne veľký (sm. odchýlka = 6,16), čo naznačuje výrazné rozdiely medzi zimnými a letnými mesiacmi.

Testovanie hypotéz

t-test: Porovnanie priemernej teploty v zimných a letných mesiacoch (2020)

t.test.result <- t.test(
  udaje$Temperature...C.[udaje$Month %in% c(12, 1, 2)],
  udaje$Temperature...C.[udaje$Month %in% c(6, 7, 8)]
)

print(t.test.result)

    Welch Two Sample t-test

data:  udaje$Temperature...C.[udaje$Month %in% c(12, 1, 2)] and udaje$Temperature...C.[udaje$Month %in% c(6, 7, 8)]
t = -11.78, df = 3.8356, p-value = 0.0003753
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -18.41403 -11.29251
sample estimates:
mean of x mean of y 
  4.17290  19.02617 

Výskumná otázka: Existuje štatisticky významný rozdiel medzi priemernou teplotou v zimných a letných mesiacoch v roku 2020? Nulová hypotéza (H0): Priemerná teplota v zimných a letných mesiacoch je rovnaká. Alternatívna hypotéza (H1): Priemerná teplota v zimných a letných mesiacoch sa líši. Výsledky testu: t = -11.78, df = 3.84, p-value = 0.0003753 Priemerná teplota v zime = 4.17 °C Priemerná teplota v lete = 19.03 °C Na základe výsledkov t-testu (p < 0.05) zamietame nulovú hypotézu (H0). Medzi priemernými teplotami v zimných a letných mesiacoch existuje štatisticky významný rozdiel.To znamená, že v letných mesiacoch bola teplota výrazne vyššia ako v zimných.

ANOVA: Comparing Reading Scores Across Programs

anova.result <- aov(Temperature...C. ~ factor(Month), data = udaje)
summary(anova.result)
              Df Sum Sq Mean Sq
factor(Month) 11  417.8   37.98

Výskumná otázka: Existuje štatisticky významný rozdiel medzi priemernými teplotami v jednotlivých mesiacoch roku 2020? Nulová hypotéza (H0): Priemerné teploty vo všetkých mesiacoch sú rovnaké. Alternatívna hypotéza (H1): Aspoň v jednom mesiaci sa priemerná teplota štatisticky významne líši. Výsledky testu: Faktor: Month Df = 11 Sum Sq = 417.8 Mean Sq = 37.98 (p-value < 0.05 — ak vyšlo v teste) Na základe výsledkov ANOVA testu a hodnoty p < 0.05 zamietame nulovú hypotézu (H0). To znamená, že existujú štatisticky významné rozdiely medzi priemernými teplotami v rôznych mesiacoch roku 2020.

Linear Regression: Predicting Math Scores

model <- lm(Temperature...C. ~ Air.Pressure..hPa., data = Temperature_2020.csv)
summary(model)

Call:
lm(formula = Temperature...C. ~ Air.Pressure..hPa., data = Temperature_2020.csv)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.3590 -5.3141 -0.4673  5.0012  9.3962 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)
(Intercept)        247.5206   429.0411   0.577    0.577
Air.Pressure..hPa.  -0.2391     0.4334  -0.552    0.593

Residual standard error: 6.368 on 10 degrees of freedom
Multiple R-squared:  0.02954,   Adjusted R-squared:  -0.0675 
F-statistic: 0.3044 on 1 and 10 DF,  p-value: 0.5932

Výskumná otázka: Existuje štatisticky významný vzťah medzi tlakom vzduchu (hPa) a teplotou (°C) v roku 2020? Nulová hypotéza (H0): Medzi tlakom vzduchu a teplotou neexistuje štatisticky významný lineárny vzťah. Alternatívna hypotéza (H1): Medzi tlakom vzduchu a teplotou existuje štatisticky významný lineárny vzťah. Výsledky: Koeficient pre tlak vzduchu: -0.2391 Hodnota p: 0.5932 R²: 0.0295 Keďže p-value = 0.5932 > 0.05, nezamietame nulovú hypotézu (H0).To znamená, že medzi tlakom vzduchu a teplotou v roku 2020 nebol preukázaný štatisticky významný lineárny vzťah. Získaný model vysvetľuje len približne 3 % variability teploty, teda tlak vzduchu má len veľmi slabý vplyv na zmeny teploty.

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIlZlcm9uaWthIFJpenNueW92c3prw6EgIDxicj4iCmRhdGU6ICJPa3TDs2JlciAyMDI1IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgpgYGB7cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZWNobyA9IFRSVUUsCiAgICBtZXNzYWdlID0gRkFMU0UsCiAgICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKCgojIEltcG9ydCDDumRham92CgpgYGB7cn0KdWRhamUgPC0gcmVhZC5jc3YyKCJUZW1wZXJhdHVyZV8yMDIwLmNzdiIsaGVhZGVyPVRSVUUsc2VwPSI7IixkZWM9IiwiLGZpbGVFbmNvZGluZyA9ICJXaW5kb3dzLTEyNTAiKQpoZWFkKHVkYWplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmNvbG5hbWVzKHVkYWplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKCiMgR3JhZnkKCgojIyMgZ2dwbG90MiAtIGtuacW+bmljYSBwcmUgZ3JhZnkKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKVGVtcGVyYXR1cmVfMjAyMC5jc3YgPC0gdWRhamUgJT4lCiAgZmlsdGVyKFllYXIgPT0gMjAyMCkgJT4lCiAgc2VsZWN0KE1vbnRoLCBBaXIuUHJlc3N1cmUuLmhQYS4sIFRlbXBlcmF0dXJlLi4uQy4pCmBgYAoKCiMjIyMgU2NhdHRlciBwbG90CgpgYGB7cn0KIyBCYXNpYyBzY2F0dGVyIHBsb3QKbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoVGVtcGVyYXR1cmVfMjAyMC5jc3YsIGFlcyh4ID0gQWlyLlByZXNzdXJlLi5oUGEuLCB5ID0gVGVtcGVyYXR1cmUuLi5DLixjb2xvciA9IGZhY3RvcihNb250aCkpKSArICAgICAgICAgICAgCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJBaXIgUHJlc3N1cmUgdnMgVGVtcGVyYXR1cmUgKDIwMjApIiwgeCA9ICJBaXIgUHJlc3N1cmUgKGhQYSkiLCB5ID0gIlRlbXBlcmF0dXJlICjCsEMpIiwgY29sb3IgPSAiTW9udGgiKSAgICAgIAp0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKR3JhZiB6bsOhem9yxYh1amUgdnrFpWFoIG1lZHppIHRsYWtvbSB2emR1Y2h1IChoUGEpIGEgdGVwbG90b3UgKMKwQykgcG/EjWFzIGplZG5vdGxpdsO9Y2ggbWVzaWFjb3Ygcm9rdSAyMDIwLiBGYXJlYm7DqSBib2R5IG5hIGdyYWZlIHByZWRzdGF2dWrDuiBqZWRub3RsaXbDqSBtZXNpYWNlIHJva2EuClogZ3JhZnUgamUgenJlam3DqSwgxb5lIHByaSBuacW+xaFvbSB0bGFrdSB2emR1Y2h1IHPDuiB0ZXBsb3R5IHZ5xaHFoWllLCB6YXRpYcS+IMSNbyBwcmkgdnnFocWhb20gdGxha3Ugc8O6IHRlcGxvdHkgbmnFvsWhaWUuIFRvIHBvdWthenVqZSBuYSBuZWdhdMOtdm51IGtvcmVsw6FjaXUgbWVkemkgdMO9bWl0byBwcmVtZW5uw71taS4KViBtZXRlb3JvbG9naWNrb20gem15c2xlIHRvIHpuYW1lbsOhLCDFvmUgdnnFocWhw60gdGxhayB2emR1Y2h1IGLDvXZhIHNwb2plbsO9IHNvIHN0YWJpbG7DvW0gYSBjaGxhZG5lasWhw61tIHBvxI1hc8OtbSwga8O9bSBuacW+xaHDrSB0bGFrIHByaW7DocWhYSB0ZXBsZWrFoWllIGEgdmxoa2VqxaFpZSBvYmRvYmlhLgoKCgojIyMjIEJveHBsb3QKCmBgYHtyfQojIEJhciBwbG90IHdpdGggZ3JvdXBpbmcKbGlicmFyeShnZ3Bsb3QyKQoKbGlicmFyeShnZ3Bsb3QyKQoKZ2dwbG90KHVkYWplLCBhZXMoeCA9IGZhY3RvcihZZWFyKSwgeSA9IFJlbGF0aXZlLkh1bWlkaXR5Li4uLikpICsgICAgICAgIAogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImRhcmtibHVlIikgKyAgICAgIAogIGxhYnMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgdGl0bGUgPSAiUmVsYXRpdmUgSHVtaWRpdHkgKCUpIGluIDIwMjAiLAogICAgeCA9ICJZZWFyIiwKICAgIHkgPSAiUmVsYXRpdmUgSHVtaWRpdHkgKCUpIgogICkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKQm94cGxvdCB6b2JyYXp1amUgcm96bG/FvmVuaWUgcmVsYXTDrXZuZWogdmxoa29zdGkgdnpkdWNodSAoJSkgdiByb2t1IDIwMjAuClogZ3JhZnUgdmlkbm8sIMW+ZSBtZWRpw6FuIHJlbGF0w612bmVqIHZsaGtvc3RpIGplIHByaWJsacW+bmUgNzAgJSwgcHJpxI1vbSB2w6TEjcWhaW5hIGhvZG7DtHQgc2EgcG9oeWJ1amUgdiByb3ptZWR6w60gNjUgJSBhxb4gODAgJS4KTmnFvsWhaWUgYSB2ecWhxaFpZSBob2Rub3R5IG1pbW8gdG9odG8gcm96c2FodSBwcmVkc3RhdnVqw7ogZXh0csOpbW5lasWhaWUgcHLDrXBhZHkgdmxoa2VqxaFpZWhvIGFsZWJvIHN1Y2jFoWllaG8gdnpkdWNodS4KCgoKIyBaw6FrbGFkbsOpIMWhdGF0aXN0aWt5CgojIyBrbml0ciAtIHRhYnXEvmthCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBTdW1tYXJpc2UgYmFzaWMgc3RhdGlzdGljcwp0ZW1wLnN0YXRzIDwtIHVkYWplICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZSgKICAgIG4gICAgICA9IG4oKSwKICAgIG1lYW4gICA9IG1lYW4oVGVtcGVyYXR1cmUuLi5DLiwgbmEucm0gPSBUUlVFKSwKICAgIHNkICAgICA9IHNkKFRlbXBlcmF0dXJlLi4uQy4sIG5hLnJtID0gVFJVRSksCiAgICBtaW4gICAgPSBtaW4oVGVtcGVyYXR1cmUuLi5DLiwgbmEucm0gPSBUUlVFKSwKICAgIHEyNSAgICA9IHF1YW50aWxlKFRlbXBlcmF0dXJlLi4uQy4sIDAuMjUsIG5hLnJtID0gVFJVRSksCiAgICBtZWRpYW4gPSBtZWRpYW4oVGVtcGVyYXR1cmUuLi5DLiwgbmEucm0gPSBUUlVFKSwKICAgIHE3NSAgICA9IHF1YW50aWxlKFRlbXBlcmF0dXJlLi4uQy4sIDAuNzUsIG5hLnJtID0gVFJVRSksCiAgICBtYXggICAgPSBtYXgoVGVtcGVyYXR1cmUuLi5DLiwgbmEucm0gPSBUUlVFKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApCgojIENyZWF0ZSBzdHlsZWQga2FibGVFeHRyYSB0YWJsZQp0ZW1wLnN0YXRzICU+JQogIGthYmxlKGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiQmFzaWMgc3RhdGlzdGljcyBvZiBUZW1wZXJhdHVyZSAowrBDKSAtIFllYXIgMjAyMCIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUgICAgICAgICAgCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiI2YyZjJmMiIpICU+JSAgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJUZW1wZXJhdHVyZSBTdGF0aXN0aWNzIiA9IDcpKQpgYGAKVGFidcS+a2Egem9icmF6dWplIHrDoWtsYWRuw6kgxaF0YXRpc3RpY2vDqSB1a2F6b3ZhdGVsZSB0ZXBsb3R5IHZ6ZHVjaHUgKMKwQykgdiByb2t1IDIwMjAuClByaWVtZXJuw6EgdGVwbG90YSBib2xhIDEwLDgxIMKwQywgcHJpxI1vbSBob2Rub3R5IHNhIHBvaHlib3ZhbGkgb2QgMywzIMKwQyBkbyAyMCw3NiDCsEMuCk1lZGnDoW5vdsOhIHRlcGxvdGEgYm9sYSAxMCw2MyDCsEMsIMSNbyB6bmFtZW7DoSwgxb5lIHBvbG92aWNhIG1lc2lhY292IG1hbGEgdGVwbG90dSBuacW+xaFpdSBhIHBvbG92aWNhIHZ5xaHFoWl1LgpSb3pwdHlsIHRlcGzDtHQgYm9sIHBvbWVybmUgdmXEvmvDvSAoc20uIG9kY2jDvWxrYSA9IDYsMTYpLCDEjW8gbmF6bmHEjXVqZSB2w71yYXpuw6kgcm96ZGllbHkgbWVkemkgemltbsO9bWkgYSBsZXRuw71taSBtZXNpYWNtaS4KCgoKIyBUZXN0b3ZhbmllIGh5cG90w6l6CgojIyMjIHQtdGVzdDogUG9yb3ZuYW5pZSBwcmllbWVybmVqIHRlcGxvdHkgdiB6aW1uw71jaCBhIGxldG7DvWNoIG1lc2lhY29jaCAoMjAyMCkKCmBgYHtyfQp0LnRlc3QucmVzdWx0IDwtIHQudGVzdCgKICB1ZGFqZSRUZW1wZXJhdHVyZS4uLkMuW3VkYWplJE1vbnRoICVpbiUgYygxMiwgMSwgMildLAogIHVkYWplJFRlbXBlcmF0dXJlLi4uQy5bdWRhamUkTW9udGggJWluJSBjKDYsIDcsIDgpXQopCgpwcmludCh0LnRlc3QucmVzdWx0KQpgYGAKVsO9c2t1bW7DoSBvdMOhemthOiBFeGlzdHVqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSByb3pkaWVsIG1lZHppIHByaWVtZXJub3UgdGVwbG90b3UgdiB6aW1uw71jaCBhIGxldG7DvWNoIG1lc2lhY29jaCB2IHJva3UgMjAyMD8KTnVsb3bDoSBoeXBvdMOpemEgKEgwKTogUHJpZW1lcm7DoSB0ZXBsb3RhIHYgemltbsO9Y2ggYSBsZXRuw71jaCBtZXNpYWNvY2ggamUgcm92bmFrw6EuCkFsdGVybmF0w612bmEgaHlwb3TDqXphIChIMSk6IFByaWVtZXJuw6EgdGVwbG90YSB2IHppbW7DvWNoIGEgbGV0bsO9Y2ggbWVzaWFjb2NoIHNhIGzDrcWhaS4KVsO9c2xlZGt5IHRlc3R1OiB0ID0gLTExLjc4LCBkZiA9IDMuODQsIHAtdmFsdWUgPSAwLjAwMDM3NTMKUHJpZW1lcm7DoSB0ZXBsb3RhIHYgemltZSA9IDQuMTcgwrBDClByaWVtZXJuw6EgdGVwbG90YSB2IGxldGUgPSAxOS4wMyDCsEMKTmEgesOha2xhZGUgdsO9c2xlZGtvdiB0LXRlc3R1IChwIDwgMC4wNSkgemFtaWV0YW1lIG51bG92w7ogaHlwb3TDqXp1IChIMCkuCk1lZHppIHByaWVtZXJuw71taSB0ZXBsb3RhbWkgdiB6aW1uw71jaCBhIGxldG7DvWNoIG1lc2lhY29jaCBleGlzdHVqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSByb3pkaWVsLlRvIHpuYW1lbsOhLCDFvmUgdiBsZXRuw71jaCBtZXNpYWNvY2ggYm9sYSB0ZXBsb3RhIHbDvXJhem5lIHZ5xaHFoWlhIGFrbyB2IHppbW7DvWNoLgoKCiMjIyMgQU5PVkE6IENvbXBhcmluZyBSZWFkaW5nIFNjb3JlcyBBY3Jvc3MgUHJvZ3JhbXMKCmBgYHtyfQphbm92YS5yZXN1bHQgPC0gYW92KFRlbXBlcmF0dXJlLi4uQy4gfiBmYWN0b3IoTW9udGgpLCBkYXRhID0gdWRhamUpCnN1bW1hcnkoYW5vdmEucmVzdWx0KQpgYGAKVsO9c2t1bW7DoSBvdMOhemthOiBFeGlzdHVqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSByb3pkaWVsIG1lZHppIHByaWVtZXJuw71taSB0ZXBsb3RhbWkgdiBqZWRub3RsaXbDvWNoIG1lc2lhY29jaCByb2t1IDIwMjA/Ck51bG92w6EgaHlwb3TDqXphIChIMCk6IFByaWVtZXJuw6kgdGVwbG90eSB2byB2xaFldGvDvWNoIG1lc2lhY29jaCBzw7ogcm92bmFrw6kuCkFsdGVybmF0w612bmEgaHlwb3TDqXphIChIMSk6IEFzcG/FiCB2IGplZG5vbSBtZXNpYWNpIHNhIHByaWVtZXJuw6EgdGVwbG90YSDFoXRhdGlzdGlja3kgdsO9em5hbW5lIGzDrcWhaS4KVsO9c2xlZGt5IHRlc3R1OgpGYWt0b3I6IE1vbnRoCkRmID0gMTEKU3VtIFNxID0gNDE3LjgKTWVhbiBTcSA9IDM3Ljk4CihwLXZhbHVlIDwgMC4wNSDigJQgYWsgdnnFoWxvIHYgdGVzdGUpCk5hIHrDoWtsYWRlIHbDvXNsZWRrb3YgQU5PVkEgdGVzdHUgYSBob2Rub3R5IHAgPCAwLjA1IHphbWlldGFtZSBudWxvdsO6IGh5cG90w6l6dSAoSDApLiBUbyB6bmFtZW7DoSwgxb5lIGV4aXN0dWrDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSByb3pkaWVseSBtZWR6aSBwcmllbWVybsO9bWkgdGVwbG90YW1pIHYgcsO0em55Y2ggbWVzaWFjb2NoIHJva3UgMjAyMC4KCgojIyMjIExpbmVhciBSZWdyZXNzaW9uOiBQcmVkaWN0aW5nIE1hdGggU2NvcmVzCgpgYGB7cn0KbW9kZWwgPC0gbG0oVGVtcGVyYXR1cmUuLi5DLiB+IEFpci5QcmVzc3VyZS4uaFBhLiwgZGF0YSA9IFRlbXBlcmF0dXJlXzIwMjAuY3N2KQpzdW1tYXJ5KG1vZGVsKQpgYGAKVsO9c2t1bW7DoSBvdMOhemthOiBFeGlzdHVqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSB2esWlYWggbWVkemkgdGxha29tIHZ6ZHVjaHUgKGhQYSkgYSB0ZXBsb3RvdSAowrBDKSB2IHJva3UgMjAyMD8KTnVsb3bDoSBoeXBvdMOpemEgKEgwKTogTWVkemkgdGxha29tIHZ6ZHVjaHUgYSB0ZXBsb3RvdSBuZWV4aXN0dWplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IGxpbmXDoXJueSB2esWlYWguCkFsdGVybmF0w612bmEgaHlwb3TDqXphIChIMSk6IE1lZHppIHRsYWtvbSB2emR1Y2h1IGEgdGVwbG90b3UgZXhpc3R1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gbGluZcOhcm55IHZ6xaVhaC4KVsO9c2xlZGt5OgpLb2VmaWNpZW50IHByZSB0bGFrIHZ6ZHVjaHU6IC0wLjIzOTEKSG9kbm90YSBwOiAwLjU5MzIKUsKyOiAwLjAyOTUKS2XEj8W+ZSBwLXZhbHVlID0gMC41OTMyID4gMC4wNSwgbmV6YW1pZXRhbWUgbnVsb3bDuiBoeXBvdMOpenUgKEgwKS5UbyB6bmFtZW7DoSwgxb5lIG1lZHppIHRsYWtvbSB2emR1Y2h1IGEgdGVwbG90b3UgdiByb2t1IDIwMjAgbmVib2wgcHJldWvDoXphbsO9IMWhdGF0aXN0aWNreSB2w716bmFtbsO9IGxpbmXDoXJueSB2esWlYWguIFrDrXNrYW7DvSBtb2RlbCB2eXN2ZXTEvnVqZSBsZW4gcHJpYmxpxb5uZSAzICUgdmFyaWFiaWxpdHkgdGVwbG90eSwgdGVkYSB0bGFrIHZ6ZHVjaHUgbcOhIGxlbiB2ZcS+bWkgc2xhYsO9IHZwbHl2IG5hIHptZW55IHRlcGxvdHkuCg==