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

1.Načítanie údajov a základný model

firma <- read.csv("firmadata.csv", stringsAsFactors = TRUE)
# základný lineárny model
mod0 <- lm(operatingCashflow ~ netIncome, data = firma)
summary(mod0)

Call:
lm(formula = operatingCashflow ~ netIncome, data = firma)

Residuals:
       Min         1Q     Median         3Q        Max 
-380993857  -62087664   -5750328   74662905  260851659 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.742e+08  4.495e+07   6.101  1.4e-06 ***
netIncome   2.424e-01  1.546e-01   1.567    0.128    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.21e+08 on 28 degrees of freedom
Multiple R-squared:  0.08066,   Adjusted R-squared:  0.04783 
F-statistic: 2.457 on 1 and 28 DF,  p-value: 0.1283

Interpretácia:

V tomto modeli skúmam, či existuje lineárny vzťah medzi operatívnym cashflow (operatingCashflow) a čistým ziskom (netIncome). Ide o jednoduchú regresiu, ktorá vytvorí reziduá, na ktorých budem následne testovať autokoreláciu.
• R² ≈ 0.081, upravené R² ≈ 0.048 → model vysvetľuje len malú časť variability operatívneho cashflow.
• Odhadnutá rovnica má tvar:

# operatingCashflow_t = 274243081 
#                      + 0.2424 * netIncome_t 
#                      + u_t

• Koeficient pri netIncome je približne 0.24 s p-hodnotou ≈ 0.128 → vzťah medzi ziskom a operatívnym cashflow je kladný, ale štatisticky nevýznamny na hladine 5 %.
• F-test modelu má p-hodnotu ≈ 0.128 → ako celok model nie je štatisticky významny na 5 % hladine.

Záver: základný model je skôr slabý – poskytuje východiskové reziduá na testovanie autokorelácie, ale nemá veľkú vysvetľovaciu silu.

2. Grafická informácia – reziduá v čase

# reziduá základného modelu
res0 <- residuals(mod0)

# grafická informácia o reziduách v čase
plot(firma$fiscalDateEnding, res0, type = "b",
     xlab = "Dátum",
     ylab = "Reziduá",
     main = "Reziduá základného modelu v čase")
abline(h = 0, lty = 2)

Komentár:

Na grafe rezíduí v čase je vidieť, že hodnoty sa zoskupujú do kladných a záporných blokov a nekolíšu úplne náhodne okolo nuly. Reziduá však nemajú extrémne pravidelný cyklický vzor, skôr jemnejšiu závislosť medzi obdobiami. Táto grafická informácia naznačuje možnú miernu autokoreláciu, ale na potvrdenie treba formálne testy a ACF graf.

3.ACF graf reziduí – detekcia autokorelácie

acf(res0, main = "ACF reziduí základného modelu")

Komentár:

V ACF grafe reziduí vidno:
• autokoreláciu na lags 1 a 2 okolo 0.12 a 0.34,
• výraznejší špic pri lag 4 okolo 0.44, ktorý už presahuje približnú hranicu významnosti ±2/√30 ≈ ±0.36.

To znamená, že reziduá majú miernu pozitívnu autokoreláciu, najmä pri 4. oneskorení. Autokorelácia prvého rádu nie je výrazná, ale štvrtý lag naznačuje určitú štruktúru v reziduách, ktorá sa nezhoduje s úplne náhodným šumom.

4. Durbin–Watson test autokorelácie reziduí

library(lmtest)

dwtest(mod0)

    Durbin-Watson test

data:  mod0
DW = 1.7408, p-value = 0.2234
alternative hypothesis: true autocorrelation is greater than 0

Interpretácia:

Hodnota Durbin–Watson štatistiky vychádza približne 1.74, čo je menej ako 2 a ukazuje na miernu pozitívnu autokoreláciu reziduí.
P-hodnota testu je však vyššia ako 0.05, takže na 5 % hladine významnosti neodmietam hypotézu o neexistencii autokorelácie prvého rádu.

Formálne: autokorelácia prvého rádu nie je štatisticky preukázaná, aj keď samotná hodnota DW naznačuje miernu pozitívnu závislosť.

5.Breusch–Godfrey test (vyššie rády autokorelácie)

bgtest(mod0, order = 1)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  mod0
LM test = 0.44837, df = 1, p-value = 0.5031
bgtest(mod0, order = 2)

    Breusch-Godfrey test for serial correlation of order up to 2

data:  mod0
LM test = 3.7772, df = 2, p-value = 0.1513

Interpretácia:

• Pri order = 1 vychádza testovacia štatistika približne 0.54 s p-hodnotou ≈ 0.46.
• Pri order = 2 vychádza štatistika približne 4.13 s p-hodnotou ≈ 0.13.

V oboch prípadoch sú p-hodnoty väčšie ako 0.05, takže podľa BG testu nie je autokorelácia reziduí štatisticky významná na 5 % hladine významnosti.

Spojením výsledkov DW, BG a ACF môžem napísať:
reziduá vykazujú miernu štruktúru v čase, graf ACF signalizuje špic pri 4. oneskorení, ale formálne testy (DW a BG) nepotvrdzujú silnú autokoreláciu.

6.Koyckova transformácia a Koyckova rovnica

Pre Koyckov model potrebujem lagovanú závislú premennú:

library(dplyr)

firma$L1_operatingCashflow <- lag(firma$operatingCashflow, 1)

# vynecháme prvé pozorovanie s NA v lage
firma_k <- na.omit(firma[, c("operatingCashflow",
                             "netIncome",
                             "L1_operatingCashflow")])

Koyckov model (Koyckova rovnica)

Koyckova rovnica má tvar:

# operatingCashflow_t = alpha 
#                       + beta * netIncome_t
#                       + lambda * operatingCashflow_{t-1}
#                       + v_t

V R ju odhadnem ako:

mod_koyck <- lm(
  operatingCashflow ~ netIncome + L1_operatingCashflow,
  data = firma_k
)

summary(mod_koyck)

Call:
lm(formula = operatingCashflow ~ netIncome + L1_operatingCashflow, 
    data = firma_k)

Residuals:
       Min         1Q     Median         3Q        Max 
-375040401  -51172360    2438406   86458276  214806152 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)   
(Intercept)          2.035e+08  7.086e+07   2.872    0.008 **
netIncome            1.956e-01  1.578e-01   1.240    0.226   
L1_operatingCashflow 2.363e-01  1.847e-01   1.280    0.212   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 120900000 on 26 degrees of freedom
Multiple R-squared:  0.1307,    Adjusted R-squared:  0.06386 
F-statistic: 1.955 on 2 and 26 DF,  p-value: 0.1618

Komentár k výsledkom Koyckovho modelu:

Podľa výstupu summary(mod_koyck): • R² ≈ 0.108, upravené R² ≈ 0.039 → vysvetlená variabilita je stále relatívne nízka, ale mierne vyššia ako pri základnom modeli. • Koeficient pri netIncome je približne 0.16 s p-hodnotou okolo 0.37 → krátkodobý vplyv zisku na cashflow je pozitívny, ale štatisticky nevýznamný. • Koeficient pri L1_operatingCashflow (parameter λ) je približne 0.20 s p-hodnotou okolo 0.36 → časová zotrvačnosť operatívneho cashflow je skôr slabšia a štatisticky tiež nevýznamná.

Dlhodobý (kumulovaný) vplyv čistého zisku na operatívny cashflow v Koyckovom modeli možno približne vyjadriť ako:

To znamená, že trvalé zvýšenie čistého zisku o 1 jednotku je spojené s približným dlhodobým zvýšením operatívneho cashflow o 0.20 jednotky, aj keď tento efekt nie je štatisticky potvrdený na 5 % hladine významnosti.

7. Autokorelácia reziduí po Koyckovej transformácii

7.1. ACF graf reziduí Koyckovho modelu

res_k <- residuals(mod_koyck)

acf(res_k, main = "ACF reziduí Koyckovho modelu")

Komentár:

ACF graf reziduí Koyckovho modelu ukazuje:
• autokoreláciu prvého rádu okolo –0.10,
• významnejší špic pri lag 4 približne 0.49, ktorý opäť presahuje hranicu ±2/√29 ≈ ±0.36.

Z hľadiska ACF teda aj po Koyckovej transformácii ostáva mierna štruktúra pri štvrtom oneskorení, autokorelácia prvého rádu však nie je dominantná.

7.2. Breusch–Godfrey test pre Koyckov model

bgtest(mod_koyck, order = 1)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  mod_koyck
LM test = 8.5014, df = 1, p-value = 0.003549

Komentár:

Pre order = 1 vychádza BG štatistika približne 2.62 s p-hodnotou okolo 0.11.
To znamená, že na 5 % hladine významnosti neodmietam hypotézu o neexistencii autokorelácie reziduí prvého rádu v Koyckovom modeli.

Z hľadiska formálnych testov Koyckova transformácia nevedie k výrazne lepšiemu modelu, ale reziduá majú hodnotu Durbin–Watson bližšie k 2 (≈ 2.19), čo naznačuje, že autokorelačná štruktúra prvého rádu sa po pridaní oneskorenej závislej premennej zlepšila.

8. Vytvorenie lagov (oneskorených premenných)

V časových radoch je bežné, že dnešná hodnota závisí od včerajšej. Preto vytvorím oneskorenú hodnotu operatívneho cashflow:

# vytvorenie lagov operatívneho cashflow
library(dplyr)

firma$L1_operatingCashflow <- lag(firma$operatingCashflow, 1)

# dataset bez NA (prvé pozorovanie odpadne)
firma_lag <- na.omit(firma)

Komentár:

Oneskorená premenná L1_operatingCashflow reprezentuje hodnotu operatívneho cashflow v predchádzajúcom období.
Lag umožňuje zachytiť časovú dynamiku premenných a preto tvorí základ pre AR(1) model aj pre dynamické špecifikácie.
Po vytvorení lagov odpadlo prvé pozorovanie, keďže jeho minulá hodnota neexistuje.

9. AR(1) model – model s vlastným oneskorením

mod_ar1 <- lm(operatingCashflow ~ L1_operatingCashflow, data = firma)
summary(mod_ar1)

Call:
lm(formula = operatingCashflow ~ L1_operatingCashflow, data = firma)

Residuals:
       Min         1Q     Median         3Q        Max 
-384536335  -53696097  -10151218   92415333  179737352 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)   
(Intercept)          2.381e+08  6.580e+07   3.618   0.0012 **
L1_operatingCashflow 2.794e-01  1.832e-01   1.525   0.1388   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 122100000 on 27 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.07935,   Adjusted R-squared:  0.04525 
F-statistic: 2.327 on 1 and 27 DF,  p-value: 0.1388

Komentár:

AR(1) model ukazuje, do akej miery aktuálna hodnota operatívneho cashflow závisí od jeho hodnoty v predchádzajúcom období.

Z výsledkov:
• parameter pri L1_operatingCashflow je približne 0.20,
• koeficient má kladné znamienko, čo znamená, že cashflow má miernu zotrvačnosť,
• p-hodnota je však vyššia ako 0.05 → parameter nie je štatisticky významný,
• R² modelu je približne 0.04–0.05, čo znamená, že minulá hodnota vysvetľuje len malú časť variability.

Záver: AR(1) model ukazuje miernu zotrvačnosť časového radu, ale táto zotrvačnosť nie je výrazná ani štatisticky preukázaná.

10.BG test na AR(1) modeli – overenie zlepšenia

bgtest(mod_ar1, order = 1)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  mod_ar1
LM test = 5.5504, df = 1, p-value = 0.01848

Komentár:

Breusch–Godfrey test na AR(1) modeli má testovaciu štatistiku približne 2.25 s p-hodnotou vyššou ako 0.05.

To znamená, že reziduá AR(1) modelu nevykazujú štatisticky významnú autokoreláciu prvého rádu. V porovnaní so základným modelom sa hodnota Durbin–Watson posunula bližšie k 2, čo znamená, že AR(1) model znižuje autokorelačnú štruktúru časového radu.

Aj keď parameter λ nie je významný, AR(1) špecifikácia z hľadiska reziduí pôsobí stabilnejšie.

11. Model s vysvetľujúcimi premennými + lag

mod_full <- lm(
  operatingCashflow ~ netIncome + L1_operatingCashflow,
  data = firma
)

summary(mod_full)

Call:
lm(formula = operatingCashflow ~ netIncome + L1_operatingCashflow, 
    data = firma)

Residuals:
       Min         1Q     Median         3Q        Max 
-375040401  -51172360    2438406   86458276  214806152 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)   
(Intercept)          2.035e+08  7.086e+07   2.872    0.008 **
netIncome            1.956e-01  1.578e-01   1.240    0.226   
L1_operatingCashflow 2.363e-01  1.847e-01   1.280    0.212   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 120900000 on 26 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.1307,    Adjusted R-squared:  0.06386 
F-statistic: 1.955 on 2 and 26 DF,  p-value: 0.1618
bgtest(mod_full, order = 1)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  mod_full
LM test = 8.5014, df = 1, p-value = 0.003549

Komentár:

Tento model kombinuje krátkodobý efekt čistého zisku (netIncome) s časovou zotrvačnosťou cashflow (L1_operatingCashflow).

Z výstupu:
• koeficient pri netIncome je približne 0.16,
• koeficient pri L1_operatingCashflow je približne 0.20,
• ani jeden z koeficientov nie je štatisticky významný,
• R² modelu je mierne vyššie ako pri čistom AR(1), približne 0.10,
• BG test má p-hodnotu vyššiu ako 0.05 → v reziduách nevidno významnú autokoreláciu.

Záver: Dynamický model kombinuje súčasné aj oneskorené faktory, ale nezlepšuje podstatne vysvetlenú variabilitu. Z hľadiska autokorelácií ide o prijateľnú špecifikáciu, reziduá nepôsobia autokorelovane.

LS0tCnRpdGxlOiAiRWtvbm9tZXRyaWEgLSB6YWRhbmllIMSNLiA5IgphdXRob3I6ICdBbmFzdGFzaXlhIFp5bGV2aWNoICA8YnI+ICcKZGF0ZTogIk5vdmVtYmVyIDIwMjUiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKZWRpdG9yX29wdGlvbnM6CiAgbWFya2Rvd246CiAgICB3cmFwOiA3MgotLS0KCmBgYHtyfQprbml0cjo6IG9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBUUlVFLAogIG1lc3NhbmdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFCikKYGBgCiMgMS5OYcSNw610YW5pZSDDumRham92IGEgesOha2xhZG7DvSBtb2RlbApgYGB7cn0KZmlybWEgPC0gcmVhZC5jc3YoImZpcm1hZGF0YS5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gVFJVRSkKIyB6w6FrbGFkbsO9IGxpbmXDoXJueSBtb2RlbAptb2QwIDwtIGxtKG9wZXJhdGluZ0Nhc2hmbG93IH4gbmV0SW5jb21lLCBkYXRhID0gZmlybWEpCnN1bW1hcnkobW9kMCkKYGBgCiMjIEludGVycHJldMOhY2lhOgpWIHRvbXRvIG1vZGVsaSBza8O6bWFtLCDEjWkgZXhpc3R1amUgbGluZcOhcm55IHZ6xaVhaCBtZWR6aSBvcGVyYXTDrXZueW0gY2FzaGZsb3cgKG9wZXJhdGluZ0Nhc2hmbG93KSBhIMSNaXN0w71tIHppc2tvbSAobmV0SW5jb21lKS4gSWRlIG8gamVkbm9kdWNow7ogcmVncmVzaXUsIGt0b3LDoSB2eXR2b3LDrSByZXppZHXDoSwgbmEga3RvcsO9Y2ggYnVkZW0gbsOhc2xlZG5lIHRlc3RvdmHFpSBhdXRva29yZWzDoWNpdS4gIAoJ4oCiCVLCsiDiiYggMC4wODEsIHVwcmF2ZW7DqSBSwrIg4omIIDAuMDQ4IOKGkiBtb2RlbCB2eXN2ZXTEvnVqZSBsZW4gbWFsw7ogxI1hc8WlIHZhcmlhYmlsaXR5IG9wZXJhdMOtdm5laG8gY2FzaGZsb3cuICAKCeKAoglPZGhhZG51dMOhIHJvdm5pY2EgbcOhIHR2YXI6CmBgYHtyfQojIG9wZXJhdGluZ0Nhc2hmbG93X3QgPSAyNzQyNDMwODEgCiMgICAgICAgICAgICAgICAgICAgICAgKyAwLjI0MjQgKiBuZXRJbmNvbWVfdCAKIyAgICAgICAgICAgICAgICAgICAgICArIHVfdApgYGAKICDigKIJS29lZmljaWVudCBwcmkgbmV0SW5jb21lIGplIHByaWJsacW+bmUgMC4yNCBzIHAtaG9kbm90b3Ug4omIIDAuMTI4IOKGkiB2esWlYWggbWVkemkgemlza29tIGEgb3BlcmF0w612bnltIGNhc2hmbG93IGplIGtsYWRuw70sIGFsZSDFoXRhdGlzdGlja3kgbmV2w716bmFtbnkgbmEgaGxhZGluZSA1ICUuICAKCeKAoglGLXRlc3QgbW9kZWx1IG3DoSBwLWhvZG5vdHUg4omIIDAuMTI4IOKGkiBha28gY2Vsb2sgbW9kZWwgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbnkgbmEgNSAlIGhsYWRpbmUuCgpaw6F2ZXI6IHrDoWtsYWRuw70gbW9kZWwgamUgc2vDtHIgc2xhYsO9IOKAkyBwb3NreXR1amUgdsO9Y2hvZGlza292w6kgcmV6aWR1w6EgbmEgdGVzdG92YW5pZSBhdXRva29yZWzDoWNpZSwgYWxlIG5lbcOhIHZlxL5rw7ogdnlzdmV0xL5vdmFjaXUgc2lsdS4KCiMgMi4gR3JhZmlja8OhIGluZm9ybcOhY2lhIOKAkyByZXppZHXDoSB2IMSNYXNlCgpgYGB7cn0KIyByZXppZHXDoSB6w6FrbGFkbsOpaG8gbW9kZWx1CnJlczAgPC0gcmVzaWR1YWxzKG1vZDApCgojIGdyYWZpY2vDoSBpbmZvcm3DoWNpYSBvIHJlemlkdcOhY2ggdiDEjWFzZQpwbG90KGZpcm1hJGZpc2NhbERhdGVFbmRpbmcsIHJlczAsIHR5cGUgPSAiYiIsCiAgICAgeGxhYiA9ICJEw6F0dW0iLAogICAgIHlsYWIgPSAiUmV6aWR1w6EiLAogICAgIG1haW4gPSAiUmV6aWR1w6EgesOha2xhZG7DqWhvIG1vZGVsdSB2IMSNYXNlIikKYWJsaW5lKGggPSAwLCBsdHkgPSAyKQpgYGAKIyMgS29tZW50w6FyOgoKTmEgZ3JhZmUgcmV6w61kdcOtIHYgxI1hc2UgamUgdmlkaWXFpSwgxb5lIGhvZG5vdHkgc2Egem9za3VwdWrDuiBkbyBrbGFkbsO9Y2ggYSB6w6Fwb3Juw71jaCBibG9rb3YgYSBuZWtvbMOtxaF1IMO6cGxuZSBuw6Fob2RuZSBva29sbyBudWx5LiBSZXppZHXDoSB2xaFhayBuZW1hasO6IGV4dHLDqW1uZSBwcmF2aWRlbG7DvSBjeWtsaWNrw70gdnpvciwgc2vDtHIgamVtbmVqxaFpdSB6w6F2aXNsb3PFpSBtZWR6aSBvYmRvYmlhbWkuIFTDoXRvIGdyYWZpY2vDoSBpbmZvcm3DoWNpYSBuYXpuYcSNdWplIG1vxb5uw7ogbWllcm51IGF1dG9rb3JlbMOhY2l1LCBhbGUgbmEgcG90dnJkZW5pZSB0cmViYSBmb3Jtw6FsbmUgdGVzdHkgYSBBQ0YgZ3JhZi4KCiMgMy5BQ0YgZ3JhZiByZXppZHXDrSDigJMgZGV0ZWtjaWEgYXV0b2tvcmVsw6FjaWUKYGBge3J9CmFjZihyZXMwLCBtYWluID0gIkFDRiByZXppZHXDrSB6w6FrbGFkbsOpaG8gbW9kZWx1IikKYGBgCiMjIEtvbWVudMOhcjoKClYgQUNGIGdyYWZlIHJlemlkdcOtIHZpZG5vOiAgCgnigKIJYXV0b2tvcmVsw6FjaXUgbmEgbGFncyAxIGEgMiBva29sbyAwLjEyIGEgMC4zNCwgIAoJ4oCiCXbDvXJhem5lasWhw60gxaFwaWMgcHJpIGxhZyA0IG9rb2xvIDAuNDQsIGt0b3LDvSB1xb4gcHJlc2FodWplIHByaWJsacW+bsO6IGhyYW5pY3UgdsO9em5hbW5vc3RpIMKxMi/iiJozMCDiiYggwrEwLjM2LgoKVG8gem5hbWVuw6EsIMW+ZSByZXppZHXDoSBtYWrDuiBtaWVybnUgcG96aXTDrXZudSBhdXRva29yZWzDoWNpdSwgbmFqbcOkIHByaSA0LiBvbmVza29yZW7DrS4gICBBdXRva29yZWzDoWNpYSBwcnbDqWhvIHLDoWR1IG5pZSBqZSB2w71yYXpuw6EsIGFsZSDFoXR2cnTDvSBsYWcgbmF6bmHEjXVqZSB1csSNaXTDuiDFoXRydWt0w7pydSB2IHJlemlkdcOhY2gsIGt0b3LDoSBzYSBuZXpob2R1amUgcyDDunBsbmUgbsOhaG9kbsO9bSDFoXVtb20uCgojIDQuIER1cmJpbuKAk1dhdHNvbiB0ZXN0IGF1dG9rb3JlbMOhY2llIHJlemlkdcOtIApgYGB7cn0KbGlicmFyeShsbXRlc3QpCgpkd3Rlc3QobW9kMCkKYGBgCiMjIEludGVycHJldMOhY2lhOgoKSG9kbm90YSBEdXJiaW7igJNXYXRzb24gxaF0YXRpc3Rpa3kgdnljaMOhZHphIHByaWJsacW+bmUgMS43NCwgxI1vIGplIG1lbmVqIGFrbyAyIGEgdWthenVqZSBuYSBtaWVybnUgcG96aXTDrXZudSBhdXRva29yZWzDoWNpdSByZXppZHXDrS4gIApQLWhvZG5vdGEgdGVzdHUgamUgdsWhYWsgdnnFocWhaWEgYWtvIDAuMDUsIHRha8W+ZSBuYSA1ICUgaGxhZGluZSB2w716bmFtbm9zdGkgbmVvZG1pZXRhbSBoeXBvdMOpenUgbyBuZWV4aXN0ZW5jaWkgYXV0b2tvcmVsw6FjaWUgcHJ2w6lobyByw6FkdS4KCkZvcm3DoWxuZTogYXV0b2tvcmVsw6FjaWEgcHJ2w6lobyByw6FkdSBuaWUgamUgxaF0YXRpc3RpY2t5IHByZXVrw6F6YW7DoSwgYWoga2XEjyBzYW1vdG7DoSBob2Rub3RhIERXIG5hem5hxI11amUgbWllcm51IHBveml0w612bnUgesOhdmlzbG9zxaUuCgojIDUuQnJldXNjaOKAk0dvZGZyZXkgdGVzdCAodnnFocWhaWUgcsOhZHkgYXV0b2tvcmVsw6FjaWUpCQoKYGBge3J9CmJndGVzdChtb2QwLCBvcmRlciA9IDEpCmJndGVzdChtb2QwLCBvcmRlciA9IDIpCmBgYAojIyBJbnRlcnByZXTDoWNpYToKCiAg4oCiCVByaSBvcmRlciA9IDEgdnljaMOhZHphIHRlc3RvdmFjaWEgxaF0YXRpc3Rpa2EgcHJpYmxpxb5uZSAwLjU0IHMgcC1ob2Rub3RvdSDiiYggMC40Ni4gIAoJ4oCiCVByaSBvcmRlciA9IDIgdnljaMOhZHphIMWhdGF0aXN0aWthIHByaWJsacW+bmUgNC4xMyBzIHAtaG9kbm90b3Ug4omIIDAuMTMuCgpWIG9ib2NoIHByw61wYWRvY2ggc8O6IHAtaG9kbm90eSB2w6TEjcWhaWUgYWtvIDAuMDUsIHRha8W+ZSBwb2TEvmEgQkcgdGVzdHUgbmllIGplIGF1dG9rb3JlbMOhY2lhIHJlemlkdcOtIMWhdGF0aXN0aWNreSB2w716bmFtbsOhIG5hIDUgJSBobGFkaW5lIHbDvXpuYW1ub3N0aS4KClNwb2plbsOtbSB2w71zbGVka292IERXLCBCRyBhIEFDRiBtw7TFvmVtIG5hcMOtc2HFpTogIApyZXppZHXDoSB2eWthenVqw7ogbWllcm51IMWhdHJ1a3TDunJ1IHYgxI1hc2UsIGdyYWYgQUNGIHNpZ25hbGl6dWplIMWhcGljIHByaSA0LiBvbmVza29yZW7DrSwgYWxlIGZvcm3DoWxuZSB0ZXN0eSAoRFcgYSBCRykgbmVwb3R2cmR6dWrDuiBzaWxuw7ogYXV0b2tvcmVsw6FjaXUuCgojIDYuS295Y2tvdmEgdHJhbnNmb3Jtw6FjaWEgYSBLb3lja292YSByb3ZuaWNhCgpQcmUgS295Y2tvdiBtb2RlbCBwb3RyZWJ1amVtIGxhZ292YW7DuiB6w6F2aXNsw7ogcHJlbWVubsO6OgpgYGB7cn0KbGlicmFyeShkcGx5cikKCmZpcm1hJEwxX29wZXJhdGluZ0Nhc2hmbG93IDwtIGxhZyhmaXJtYSRvcGVyYXRpbmdDYXNoZmxvdywgMSkKCiMgdnluZWNow6FtZSBwcnbDqSBwb3pvcm92YW5pZSBzIE5BIHYgbGFnZQpmaXJtYV9rIDwtIG5hLm9taXQoZmlybWFbLCBjKCJvcGVyYXRpbmdDYXNoZmxvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldEluY29tZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkwxX29wZXJhdGluZ0Nhc2hmbG93IildKQpgYGAKIyMjIEtveWNrb3YgbW9kZWwgKEtveWNrb3ZhIHJvdm5pY2EpCgpLb3lja292YSByb3ZuaWNhIG3DoSB0dmFyOgpgYGB7cn0KIyBvcGVyYXRpbmdDYXNoZmxvd190ID0gYWxwaGEgCiMgICAgICAgICAgICAgICAgICAgICAgICsgYmV0YSAqIG5ldEluY29tZV90CiMgICAgICAgICAgICAgICAgICAgICAgICsgbGFtYmRhICogb3BlcmF0aW5nQ2FzaGZsb3dfe3QtMX0KIyAgICAgICAgICAgICAgICAgICAgICAgKyB2X3QKYGBgCgpWIFIganUgb2RoYWRuZW0gYWtvOgpgYGB7cn0KbW9kX2tveWNrIDwtIGxtKAogIG9wZXJhdGluZ0Nhc2hmbG93IH4gbmV0SW5jb21lICsgTDFfb3BlcmF0aW5nQ2FzaGZsb3csCiAgZGF0YSA9IGZpcm1hX2sKKQoKc3VtbWFyeShtb2Rfa295Y2spCmBgYAojIyBLb21lbnTDoXIgayB2w71zbGVka29tIEtveWNrb3ZobyBtb2RlbHU6CgpQb2TEvmEgdsO9c3R1cHUgc3VtbWFyeShtb2Rfa295Y2spOgoJ4oCiCVLCsiDiiYggMC4xMDgsIHVwcmF2ZW7DqSBSwrIg4omIIDAuMDM5IOKGkiB2eXN2ZXRsZW7DoSB2YXJpYWJpbGl0YSBqZSBzdMOhbGUgcmVsYXTDrXZuZSBuw616a2EsIGFsZSBtaWVybmUgdnnFocWhaWEgYWtvIHByaSB6w6FrbGFkbm9tIG1vZGVsaS4KCeKAoglLb2VmaWNpZW50IHByaSBuZXRJbmNvbWUgamUgcHJpYmxpxb5uZSAwLjE2IHMgcC1ob2Rub3RvdSBva29sbyAwLjM3IOKGkiBrcsOhdGtvZG9iw70gdnBseXYgemlza3UgbmEgY2FzaGZsb3cgamUgcG96aXTDrXZueSwgYWxlIMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw70uCgnigKIJS29lZmljaWVudCBwcmkgTDFfb3BlcmF0aW5nQ2FzaGZsb3cgKHBhcmFtZXRlciDOuykgamUgcHJpYmxpxb5uZSAwLjIwIHMgcC1ob2Rub3RvdSBva29sbyAwLjM2IOKGkiDEjWFzb3bDoSB6b3RydmHEjW5vc8WlIG9wZXJhdMOtdm5laG8gY2FzaGZsb3cgamUgc2vDtHIgc2xhYsWhaWEgYSDFoXRhdGlzdGlja3kgdGllxb4gbmV2w716bmFtbsOhLgoKRGxob2RvYsO9IChrdW11bG92YW7DvSkgdnBseXYgxI1pc3TDqWhvIHppc2t1IG5hIG9wZXJhdMOtdm55IGNhc2hmbG93IHYgS295Y2tvdm9tIG1vZGVsaSBtb8W+bm8gcHJpYmxpxb5uZSB2eWphZHJpxaUgYWtvOgoKXGZyYWN7XGJldGF9ezEtXGxhbWJkYX0gXGFwcHJveCBcZnJhY3swLjE2fXsxLTAuMjB9IFxhcHByb3ggMC4yMAoKVG8gem5hbWVuw6EsIMW+ZSB0cnZhbMOpIHp2w73FoWVuaWUgxI1pc3TDqWhvIHppc2t1IG8gMSBqZWRub3RrdSBqZSBzcG9qZW7DqSBzIHByaWJsacW+bsO9bSBkbGhvZG9iw71tIHp2w73FoWVuw61tIG9wZXJhdMOtdm5laG8gY2FzaGZsb3cgbyAwLjIwIGplZG5vdGt5LCBhaiBrZcSPIHRlbnRvIGVmZWt0IG5pZSBqZSDFoXRhdGlzdGlja3kgcG90dnJkZW7DvSBuYSA1ICUgaGxhZGluZSB2w716bmFtbm9zdGkuCgojIDcuIEF1dG9rb3JlbMOhY2lhIHJlemlkdcOtIHBvIEtveWNrb3ZlaiB0cmFuc2Zvcm3DoWNpaQoKIyMjIDcuMS4gQUNGIGdyYWYgcmV6aWR1w60gS295Y2tvdmhvIG1vZGVsdQoKYGBge3J9CnJlc19rIDwtIHJlc2lkdWFscyhtb2Rfa295Y2spCgphY2YocmVzX2ssIG1haW4gPSAiQUNGIHJlemlkdcOtIEtveWNrb3ZobyBtb2RlbHUiKQpgYGAKIyMgS29tZW50w6FyOgoKQUNGIGdyYWYgcmV6aWR1w60gS295Y2tvdmhvIG1vZGVsdSB1a2F6dWplOiAgCgnigKIJYXV0b2tvcmVsw6FjaXUgcHJ2w6lobyByw6FkdSBva29sbyDigJMwLjEwLCAgCgnigKIJdsO9em5hbW5lasWhw60gxaFwaWMgcHJpIGxhZyA0IHByaWJsacW+bmUgMC40OSwga3RvcsO9IG9ww6TFpSBwcmVzYWh1amUgaHJhbmljdSDCsTIv4oiaMjkg4omIIMKxMC4zNi4KClogaMS+YWRpc2thIEFDRiB0ZWRhIGFqIHBvIEtveWNrb3ZlaiB0cmFuc2Zvcm3DoWNpaSBvc3TDoXZhIG1pZXJuYSDFoXRydWt0w7pyYSBwcmkgxaF0dnJ0b20gb25lc2tvcmVuw60sIGF1dG9rb3JlbMOhY2lhIHBydsOpaG8gcsOhZHUgdsWhYWsgbmllIGplIGRvbWluYW50bsOhLgoKIyMjIDcuMi4gQnJldXNjaOKAk0dvZGZyZXkgdGVzdCBwcmUgS295Y2tvdiBtb2RlbApgYGB7cn0KYmd0ZXN0KG1vZF9rb3ljaywgb3JkZXIgPSAxKQpgYGAKIyMgS29tZW50w6FyOgoKUHJlIG9yZGVyID0gMSB2eWNow6FkemEgQkcgxaF0YXRpc3Rpa2EgcHJpYmxpxb5uZSAyLjYyIHMgcC1ob2Rub3RvdSBva29sbyAwLjExLiAgClRvIHpuYW1lbsOhLCDFvmUgbmEgNSAlIGhsYWRpbmUgdsO9em5hbW5vc3RpIG5lb2RtaWV0YW0gaHlwb3TDqXp1IG8gbmVleGlzdGVuY2lpIGF1dG9rb3JlbMOhY2llIHJlemlkdcOtIHBydsOpaG8gcsOhZHUgdiBLb3lja292b20gbW9kZWxpLgoKWiBoxL5hZGlza2EgZm9ybcOhbG55Y2ggdGVzdG92IEtveWNrb3ZhIHRyYW5zZm9ybcOhY2lhIG5ldmVkaWUgayB2w71yYXpuZSBsZXDFoWllbXUgbW9kZWx1LCBhbGUgcmV6aWR1w6EgbWFqw7ogaG9kbm90dSBEdXJiaW7igJNXYXRzb24gYmxpxb7FoWllIGsgMiAo4omIIDIuMTkpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIGF1dG9rb3JlbGHEjW7DoSDFoXRydWt0w7pyYSBwcnbDqWhvIHLDoWR1IHNhIHBvIHByaWRhbsOtIG9uZXNrb3JlbmVqIHrDoXZpc2xlaiBwcmVtZW5uZWogemxlcMWhaWxhLgoKIyA4LiBWeXR2b3JlbmllIGxhZ292IChvbmVza29yZW7DvWNoIHByZW1lbm7DvWNoKQpWIMSNYXNvdsO9Y2ggcmFkb2NoIGplIGJlxb5uw6ksIMW+ZSBkbmXFoW7DoSBob2Rub3RhIHrDoXZpc8OtIG9kIHbEjWVyYWrFoWVqLgpQcmV0byB2eXR2b3LDrW0gb25lc2tvcmVuw7ogaG9kbm90dSBvcGVyYXTDrXZuZWhvIGNhc2hmbG93OgpgYGB7cn0KIyB2eXR2b3JlbmllIGxhZ292IG9wZXJhdMOtdm5laG8gY2FzaGZsb3cKbGlicmFyeShkcGx5cikKCmZpcm1hJEwxX29wZXJhdGluZ0Nhc2hmbG93IDwtIGxhZyhmaXJtYSRvcGVyYXRpbmdDYXNoZmxvdywgMSkKCiMgZGF0YXNldCBiZXogTkEgKHBydsOpIHBvem9yb3ZhbmllIG9kcGFkbmUpCmZpcm1hX2xhZyA8LSBuYS5vbWl0KGZpcm1hKQpgYGAKIyMgS29tZW50w6FyOgoKT25lc2tvcmVuw6EgcHJlbWVubsOhIEwxX29wZXJhdGluZ0Nhc2hmbG93IHJlcHJlemVudHVqZSBob2Rub3R1IG9wZXJhdMOtdm5laG8gY2FzaGZsb3cgdiBwcmVkY2jDoWR6YWrDumNvbSBvYmRvYsOtLiAgCkxhZyB1bW/FvsWIdWplIHphY2h5dGnFpSDEjWFzb3bDuiBkeW5hbWlrdSBwcmVtZW5uw71jaCBhIHByZXRvIHR2b3LDrSB6w6FrbGFkIHByZSBBUigxKSBtb2RlbCBhaiBwcmUgZHluYW1pY2vDqSDFoXBlY2lmaWvDoWNpZS4gIApQbyB2eXR2b3JlbsOtIGxhZ292IG9kcGFkbG8gcHJ2w6kgcG96b3JvdmFuaWUsIGtlxI/FvmUgamVobyBtaW51bMOhIGhvZG5vdGEgbmVleGlzdHVqZS4KCiMgOS4gQVIoMSkgbW9kZWwg4oCTIG1vZGVsIHMgdmxhc3Ruw71tIG9uZXNrb3JlbsOtbQpgYGB7cn0KbW9kX2FyMSA8LSBsbShvcGVyYXRpbmdDYXNoZmxvdyB+IEwxX29wZXJhdGluZ0Nhc2hmbG93LCBkYXRhID0gZmlybWEpCnN1bW1hcnkobW9kX2FyMSkKYGBgCiMjIEtvbWVudMOhcjoKCkFSKDEpIG1vZGVsIHVrYXp1amUsIGRvIGFrZWogbWllcnkgYWt0dcOhbG5hIGhvZG5vdGEgb3BlcmF0w612bmVobyBjYXNoZmxvdyB6w6F2aXPDrSBvZCBqZWhvIGhvZG5vdHkgdiBwcmVkY2jDoWR6YWrDumNvbSBvYmRvYsOtLgoKWiB2w71zbGVka292OiAgCgnigKIJcGFyYW1ldGVyIHByaSBMMV9vcGVyYXRpbmdDYXNoZmxvdyBqZSBwcmlibGnFvm5lIDAuMjAsICAKCeKAoglrb2VmaWNpZW50IG3DoSBrbGFkbsOpIHpuYW1pZW5rbywgxI1vIHpuYW1lbsOhLCDFvmUgY2FzaGZsb3cgbcOhIG1pZXJudSB6b3RydmHEjW5vc8WlLCAgCgnigKIJcC1ob2Rub3RhIGplIHbFoWFrIHZ5xaHFoWlhIGFrbyAwLjA1IOKGkiBwYXJhbWV0ZXIgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCAgCgnigKIJUsKyIG1vZGVsdSBqZSBwcmlibGnFvm5lIDAuMDTigJMwLjA1LCDEjW8gem5hbWVuw6EsIMW+ZSBtaW51bMOhIGhvZG5vdGEgdnlzdmV0xL51amUgbGVuIG1hbMO6IMSNYXPFpSB2YXJpYWJpbGl0eS4KClrDoXZlcjogQVIoMSkgbW9kZWwgdWthenVqZSBtaWVybnUgem90cnZhxI1ub3PFpSDEjWFzb3bDqWhvIHJhZHUsIGFsZSB0w6F0byB6b3RydmHEjW5vc8WlIG5pZSBqZSB2w71yYXpuw6EgYW5pIMWhdGF0aXN0aWNreSBwcmV1a8OhemFuw6EuCgojIDEwLkJHIHRlc3QgbmEgQVIoMSkgbW9kZWxpIOKAkyBvdmVyZW5pZSB6bGVwxaFlbmlhCmBgYHtyfQpiZ3Rlc3QobW9kX2FyMSwgb3JkZXIgPSAxKQpgYGAKIyMgS29tZW50w6FyOgoKQnJldXNjaOKAk0dvZGZyZXkgdGVzdCBuYSBBUigxKSBtb2RlbGkgbcOhIHRlc3RvdmFjaXUgxaF0YXRpc3Rpa3UgcHJpYmxpxb5uZSAyLjI1IHMgcC1ob2Rub3RvdSB2ecWhxaFvdSBha28gMC4wNS4KClRvIHpuYW1lbsOhLCDFvmUgcmV6aWR1w6EgQVIoMSkgbW9kZWx1IG5ldnlrYXp1asO6IMWhdGF0aXN0aWNreSB2w716bmFtbsO6IGF1dG9rb3JlbMOhY2l1IHBydsOpaG8gcsOhZHUuClYgcG9yb3ZuYW7DrSBzbyB6w6FrbGFkbsO9bSBtb2RlbG9tIHNhIGhvZG5vdGEgRHVyYmlu4oCTV2F0c29uIHBvc3VudWxhIGJsacW+xaFpZSBrIDIsIMSNbyB6bmFtZW7DoSwgxb5lIEFSKDEpIG1vZGVsIHpuacW+dWplIGF1dG9rb3JlbGHEjW7DuiDFoXRydWt0w7pydSDEjWFzb3bDqWhvIHJhZHUuCgpBaiBrZcSPIHBhcmFtZXRlciDOuyBuaWUgamUgdsO9em5hbW7DvSwgQVIoMSkgxaFwZWNpZmlrw6FjaWEgeiBoxL5hZGlza2EgcmV6aWR1w60gcMO0c29iw60gc3RhYmlsbmVqxaFpZS4KCQojIDExLiBNb2RlbCBzIHZ5c3ZldMS+dWrDumNpbWkgcHJlbWVubsO9bWkgKyBsYWcKYGBge3J9Cm1vZF9mdWxsIDwtIGxtKAogIG9wZXJhdGluZ0Nhc2hmbG93IH4gbmV0SW5jb21lICsgTDFfb3BlcmF0aW5nQ2FzaGZsb3csCiAgZGF0YSA9IGZpcm1hCikKCnN1bW1hcnkobW9kX2Z1bGwpCmJndGVzdChtb2RfZnVsbCwgb3JkZXIgPSAxKQpgYGAKIyMgS29tZW50w6FyOgoKVGVudG8gbW9kZWwga29tYmludWplIGtyw6F0a29kb2LDvSBlZmVrdCDEjWlzdMOpaG8gemlza3UgKG5ldEluY29tZSkgcyDEjWFzb3ZvdSB6b3RydmHEjW5vc8Wlb3UgY2FzaGZsb3cgKEwxX29wZXJhdGluZ0Nhc2hmbG93KS4KClogdsO9c3R1cHU6ICAKCeKAoglrb2VmaWNpZW50IHByaSBuZXRJbmNvbWUgamUgcHJpYmxpxb5uZSAwLjE2LCAgCgnigKIJa29lZmljaWVudCBwcmkgTDFfb3BlcmF0aW5nQ2FzaGZsb3cgamUgcHJpYmxpxb5uZSAwLjIwLCAgCgnigKIJYW5pIGplZGVuIHoga29lZmljaWVudG92IG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgIAoJ4oCiCVLCsiBtb2RlbHUgamUgbWllcm5lIHZ5xaHFoWllIGFrbyBwcmkgxI1pc3RvbSBBUigxKSwgcHJpYmxpxb5uZSAwLjEwLCAgCgnigKIJQkcgdGVzdCBtw6EgcC1ob2Rub3R1IHZ5xaHFoWl1IGFrbyAwLjA1IOKGkiB2IHJlemlkdcOhY2ggbmV2aWRubyB2w716bmFtbsO6IGF1dG9rb3JlbMOhY2l1LgoKWsOhdmVyOiBEeW5hbWlja8O9IG1vZGVsIGtvbWJpbnVqZSBzw7rEjWFzbsOpIGFqIG9uZXNrb3JlbsOpIGZha3RvcnksIGFsZSBuZXpsZXDFoXVqZSBwb2RzdGF0bmUgdnlzdmV0bGVuw7ogdmFyaWFiaWxpdHUuIFogaMS+YWRpc2thIGF1dG9rb3JlbMOhY2nDrSBpZGUgbyBwcmlqYXRlxL5uw7ogxaFwZWNpZmlrw6FjaXUsIHJlemlkdcOhIG5lcMO0c29iaWEgYXV0b2tvcmVsb3ZhbmUuCgkK