Introducción:

library(readxl)
library(xts)
library(quantmod)
library(forecast)
library(tseries)
library(FinTS)
library(dynlm)
library(ggplot2)
library(rugarch)
bacolombia1 <- read_excel("C:/Users/luisa/OneDrive/Escritorio/universidad/series_de_tiempo/ultimotallercor3/Bancolombia.xlsx")
bacolombia1_xts = xts(bacolombia1$Último, order.by = bacolombia1$Fecha)
class(bacolombia1_xts)
[1] "xts" "zoo"
summary(bacolombia1)
     Fecha                         Último     
 Min.   :2014-01-02 00:00:00   Min.   :17700  
 1st Qu.:2016-09-29 06:00:00   1st Qu.:26300  
 Median :2019-07-03 12:00:00   Median :30940  
 Mean   :2019-07-02 00:26:53   Mean   :31234  
 3rd Qu.:2022-03-29 18:00:00   3rd Qu.:35058  
 Max.   :2024-12-30 00:00:00   Max.   :45500  
plot(bacolombia1_xts, main = "Precio último")

  • El precio de la acción ha variado entre 17700 y 45500 COP.

1. Rendimiento diario de la acción

obtenemos el rendimiento diario de la acción

rendimiento1 = dailyReturn(bacolombia1_xts)
plot(rendimiento1, main= "Rendimiento del precio último")

  • Los rendimientos oscilan alrededor de cero, con algunos picos de volatilidad.

  • No se observa una tendencia clara, pero hay posibles agrupamientos de volatilidad.

modelo 1

modelo1 = auto.arima(rendimiento1)
summary(modelo1)
Series: rendimiento1 
ARIMA(0,0,0) with zero mean 

sigma^2 = 0.0004295:  log likelihood = 6581.26
AIC=-13160.53   AICc=-13160.53   BIC=-13154.64

Training set error measures:
                       ME       RMSE        MAE MPE MAPE MASE      ACF1
Training set 0.0003873942 0.02072389 0.01397926 100  100    1 0.0119337
autoplot(modelo1)

  • El modelo no tiene componentes autorregresivos (AR) y sin de medias móviles (MA)

  • Corresponde a un modelo ARIMA(0,0,0) (ruido blanco)

checkresiduals(modelo1)

    Ljung-Box test

data:  Residuals from ARIMA(0,0,0) with zero mean
Q* = 18.789, df = 10, p-value = 0.04303

Model df: 0.   Total lags used: 10

ndiffs(rendimiento1)
[1] 0
  • No hay diferencias
adf.test(rendimiento1)
Aviso: p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  rendimiento1
Dickey-Fuller = -14.576, Lag order = 13, p-value = 0.01
alternative hypothesis: stationary

H0 = No es ESTACIONARIA si el p-value es mayor que 0.05

H1 = Si es ESTACIONARIA si el p-value es menor que 0.05

conclusión:

  • es estacionaria p-value = 0.0

  • El mejor modelo según auto.arima() es ARIMA(0,0,0)

  • La prueba ADF confirma que la serie es estacionaria (p-value = 0.01 < 0.05).

2. ¿Hay efectos ARCH?

Generamos el modelo ARCH a un rezago

modeloarch1 = ArchTest(rendimiento1, lags = 1, demean = T) # lags son los rezagos
modeloarch1

    ARCH LM-test; Null hypothesis: no ARCH effects

data:  rendimiento1
Chi-squared = 230.2, df = 1, p-value < 2.2e-16

H0 = No hay efectos ARCH si el p-value es mayor que 0.05

H1 = Si hay efectos ARCH si el p-value es menor que 0.05

conclución:

  • Si hay efectos ARCH con rezogo hay evidencia significativa de heterocedasticidad condicional

3. Determinar si hay heterocedasticidad

calcular los resuduales al cuadrado de nuestro modelo ARMA(0,0,0)

esto para conocer si hay heterocedastica

Errores_cuadrado = resid(modelo1)^2
plot(Errores_cuadrado, main = "Errores_cuadrado")

Box.test(Errores_cuadrado, lag = 5, type = "Ljung-Box")

    Box-Ljung test

data:  Errores_cuadrado
X-squared = 533.13, df = 5, p-value < 2.2e-16
  • Los errores al cuadrado muestran autocorrelación.

Se hace una regresión con los residuales al cuadrado rezagados esto para observar si nos enfrentamos a un modelo ARCH o no

Regresion1 = dynlm(Errores_cuadrado ~ L(Errores_cuadrado,1))

summary(Regresion1)

Time series regression with "ts" data:
Start = 86401(1), End = 231292801(1)

Call:
dynlm(formula = Errores_cuadrado ~ L(Errores_cuadrado, 1))

Residuals:
      Min        1Q    Median        3Q       Max 
-0.009058 -0.000317 -0.000262 -0.000018  0.057875 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)            3.034e-04  3.233e-05   9.384   <2e-16 ***
L(Errores_cuadrado, 1) 2.939e-01  1.848e-02  15.906   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.001621 on 2675 degrees of freedom
Multiple R-squared:  0.0864,    Adjusted R-squared:  0.08606 
F-statistic:   253 on 1 and 2675 DF,  p-value: < 2.2e-16

H0 = No hay efectos ARCH si el p-value es mayor que 0.05

H1 = Si hay efectos ARCH si el p-value es menor que 0.05

conclución:

  • Hay efectos ARCH con un rezogo

Se revisa la autocorrelación y autocorrelación parcial

autoplot(acf(Errores_cuadrado, lag.max = 2434, ylim = c(-0.5,1))) +
  labs(title = "Autocorrelación parcial de los errores al cuadrado") +
  xlab("Rezagos") +
  ylab("Autocorrelación parcial")

4. Generar el modelo GARCH

  • Modelo ARMA (0,0,0)
# Para identificar el orden de los efectos ARCH:
acf(Errores_cuadrado, lag.max=20)

pacf(Errores_cuadrado, lag.max=20)

ugarch1 = ugarchspec(mean.model = list(armaOrder = c(0,0)))
#resumen
ugarch1

*---------------------------------*
*       GARCH Model Spec          *
*---------------------------------*

Conditional Variance Dynamics   
------------------------------------
GARCH Model     : sGARCH(1,1)
Variance Targeting  : FALSE 

Conditional Mean Dynamics
------------------------------------
Mean Model      : ARFIMA(0,0,0)
Include Mean        : TRUE 
GARCH-in-Mean       : FALSE 

Conditional Distribution
------------------------------------
Distribution    :  norm 
Includes Skew   :  FALSE 
Includes Shape  :  FALSE 
Includes Lambda :  FALSE 
ugfit1 = ugarchfit(spec = ugarch1, data = rendimiento1)
ugfit1

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model  : ARFIMA(0,0,0)
Distribution    : norm 

Optimal Parameters
------------------------------------
        Estimate  Std. Error  t value Pr(>|t|)
mu      0.000639    0.000313   2.0400 0.041348
omega   0.000007    0.000002   3.0185 0.002540
alpha1  0.078693    0.008107   9.7062 0.000000
beta1   0.904183    0.005724 157.9627 0.000000

Robust Standard Errors:
        Estimate  Std. Error  t value Pr(>|t|)
mu      0.000639    0.000290   2.2063 0.027366
omega   0.000007    0.000007   1.0516 0.292990
alpha1  0.078693    0.013101   6.0066 0.000000
beta1   0.904183    0.026879  33.6391 0.000000

LogLikelihood : 6940.956 

Information Criteria
------------------------------------
                    
Akaike       -5.1807
Bayes        -5.1719
Shibata      -5.1807
Hannan-Quinn -5.1775

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.766  0.1839
Lag[2*(p+q)+(p+q)-1][2]     2.168  0.2363
Lag[4*(p+q)+(p+q)-1][5]     2.521  0.5014
d.o.f=0
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.534  0.2156
Lag[2*(p+q)+(p+q)-1][5]     3.961  0.2590
Lag[4*(p+q)+(p+q)-1][9]     6.574  0.2375
d.o.f=2

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]   0.04115 0.500 2.000  0.8392
ARCH Lag[5]   4.93650 1.440 1.667  0.1063
ARCH Lag[7]   5.62359 2.315 1.543  0.1686

Nyblom stability test
------------------------------------
Joint Statistic:  6.1846
Individual Statistics:              
mu     0.02789
omega  0.49470
alpha1 0.50593
beta1  0.50523

Asymptotic Critical Values (10% 5% 1%)
Joint Statistic:         1.07 1.24 1.6
Individual Statistic:    0.35 0.47 0.75

Sign Bias Test
------------------------------------


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20     163.9    4.392e-25
2    30     190.3    1.198e-25
3    40     238.5    1.770e-30
4    50     248.1    2.065e-28


Elapsed time : 1.144861 
# ver coeficientes
ugfit1@fit$coef
          mu        omega       alpha1        beta1 
6.388982e-04 7.322562e-06 7.869304e-02 9.041831e-01 
  • El modelo GARCH estimado tiene β₁ ≈ 1, indicando alta persistencia en la volatilidad.

  • Sin embargo, α₁ ≈ 0, lo que sugiere que los shocks recientes no afectan significativamente la varianza condicional.

#imprimir varianza
ug_var1 = ugfit1@fit$var
autoplot(ts(ug_var1))

# residuales
ug_resid1 = (ugfit1@fit$residuals)^2
autoplot(ts(ug_resid1))

5. Pronostico

# pronostico 
ug_forecast1 = ugarchforecast(ugfit1, n.ahead = 30)
ug_forecast1

*------------------------------------*
*       GARCH Model Forecast         *
*------------------------------------*
Model: sGARCH
Horizon: 30
Roll Steps: 0
Out of Sample: 0

0-roll forecast [T0=2024-12-30]:
        Series   Sigma
T+1  0.0006389 0.01290
T+2  0.0006389 0.01307
T+3  0.0006389 0.01324
T+4  0.0006389 0.01340
T+5  0.0006389 0.01356
T+6  0.0006389 0.01371
T+7  0.0006389 0.01386
T+8  0.0006389 0.01400
T+9  0.0006389 0.01414
T+10 0.0006389 0.01428
T+11 0.0006389 0.01442
T+12 0.0006389 0.01455
T+13 0.0006389 0.01467
T+14 0.0006389 0.01480
T+15 0.0006389 0.01492
T+16 0.0006389 0.01503
T+17 0.0006389 0.01515
T+18 0.0006389 0.01526
T+19 0.0006389 0.01537
T+20 0.0006389 0.01547
T+21 0.0006389 0.01558
T+22 0.0006389 0.01568
T+23 0.0006389 0.01578
T+24 0.0006389 0.01587
T+25 0.0006389 0.01597
T+26 0.0006389 0.01606
T+27 0.0006389 0.01615
T+28 0.0006389 0.01624
T+29 0.0006389 0.01633
T+30 0.0006389 0.01641
# Último precio observado (ejemplo, debes reemplazar con el valor real)
P_t <- bacolombia1$Último[nrow(bacolombia1)]

# Pronósticos de rendimiento
R_forecasts <- c(0.0006389)

# Precios pronosticados
P_t1 <- P_t * (1 + R_forecasts[1])
P_t2 <- P_t1 * (1 + R_forecasts[1])
P_t3 <- P_t2 * (1 + R_forecasts[1])
P_t4 <- P_t3 * (1 + R_forecasts[1])
P_t5 <- P_t4 * (1 + R_forecasts[1])
P_t6 <- P_t5 * (1 + R_forecasts[1])
P_t7 <- P_t6 * (1 + R_forecasts[1])
P_t8 <- P_t7 * (1 + R_forecasts[1])
P_t9 <- P_t8 * (1 + R_forecasts[1])
P_t10 <- P_t9 * (1 + R_forecasts[1])
P_t11 <- P_t10 * (1 + R_forecasts[1])
P_t12 <- P_t11 * (1 + R_forecasts[1])
P_t13 <- P_t12 * (1 + R_forecasts[1])
P_t14 <- P_t13 * (1 + R_forecasts[1])
P_t15 <- P_t14 * (1 + R_forecasts[1])
P_t16 <- P_t15 * (1 + R_forecasts[1])
P_t17 <- P_t16 * (1 + R_forecasts[1])
P_t18 <- P_t17 * (1 + R_forecasts[1])
P_t19 <- P_t18 * (1 + R_forecasts[1])
P_t20 <- P_t19 * (1 + R_forecasts[1])
P_t21 <- P_t20 * (1 + R_forecasts[1])
P_t22 <- P_t21 * (1 + R_forecasts[1])
P_t23 <- P_t22 * (1 + R_forecasts[1])
P_t24 <- P_t23 * (1 + R_forecasts[1])
P_t25 <- P_t24 * (1 + R_forecasts[1])
P_t26 <- P_t25 * (1 + R_forecasts[1])
P_t27 <- P_t26 * (1 + R_forecasts[1])
P_t28 <- P_t27 * (1 + R_forecasts[1])
P_t29 <- P_t28 * (1 + R_forecasts[1])
P_t30 <- P_t29 * (1 + R_forecasts[1])

P_t1 
[1] 23655.1
P_t5 
[1] 23715.61
P_t10
[1] 23791.47
P_t20
[1] 23943.91
P_t30
[1] 24097.33
  • Dado que el modelo GARCH no detectó efectos ARCH significativos, el pronóstico de rendimientos es constante.

Conclusiones Finales:

sobre los rendimientos

  • Comportamiento: Los rendimientos muestran una media cercana a cero (0.000639) con volatilidad variable

  • Estacionariedad: Confirmada por la prueba ADF (p-value=0.01)

  • Autocorrelación: El modelo ARIMA(0,0,0) sugiere que no hay estructura lineal en los rendimientos

  • El modelo GARCH estimado mostró alta persistencia (β₁ ≈ 1), pero con un impacto casi nulo de shocks recientes (α₁ ≈ 0).

Efectos ARCH/GARCH

Presencia de heterocedasticidad:

  • Prueba ARCH altamente significativa (p-value < 2.2e-16)

  • Autocorrelación en errores al cuadrado (Ljung-Box p-value < 2.2e-16)

  • Regresión de errores cuadrados muestra dependencia significativa (β=0.294, p<2e-16)

Modelo GARCH Estimado

σ²ₜ = 7.32e-06 + 0.0787ε²ₜ₋₁ + 0.904σ²ₜ₋₁

  • Alta persistencia en volatilidad (β₁=0.904)

  • Los shocks recientes tienen impacto moderado (α₁=0.0787)

  • La suma α₁+β₁ ≈ 0.983 (<1) indica proceso estacionario pero con alta memoria

Pronósticos

Rendimientos: Constantes en ~0.0006389 (0.06389% diario)

Precios proyectados:

T+1: 23,655.1

T+5: 23,715.61 (+0.26% en 5 días)

T+30: 24,097.33 (+1.87% en 30 días)

  • Clustering de volatilidad: Los períodos de alta volatilidad tienden a agruparse temporalmente

  • Persistencia: La volatilidad muestra memoria de largo plazo (β₁ cercano a 1)

LS0tDQp0aXRsZTogIlRhbGxlciBtb2RlbG8gR0FSQ0giDQphdXRob3I6ICJBbGVqYW5kcm8gUHJpZXRvIg0KZGF0ZTogIjIwMjUtMDUtMzAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc1Jw0KICBlZGl0b3Jfb3B0aW9uczoNCiAgICBtYXJrZG93bjoNCiAgICAgIHdyYXA6IDcyDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBJbnRyb2R1Y2Npw7NuOg0KDQpgYGB7ciBsaWJyZXJpYXN9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoeHRzKQ0KbGlicmFyeShxdWFudG1vZCkNCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KEZpblRTKQ0KbGlicmFyeShkeW5sbSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocnVnYXJjaCkNCmBgYA0KDQpgYGB7ciBkYXRvc30NCmJhY29sb21iaWExIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2x1aXNhL09uZURyaXZlL0VzY3JpdG9yaW8vdW5pdmVyc2lkYWQvc2VyaWVzX2RlX3RpZW1wby91bHRpbW90YWxsZXJjb3IzL0JhbmNvbG9tYmlhLnhsc3giKQ0KYGBgDQoNCmBgYHtyIHNlcmllfQ0KYmFjb2xvbWJpYTFfeHRzID0geHRzKGJhY29sb21iaWExJMOabHRpbW8sIG9yZGVyLmJ5ID0gYmFjb2xvbWJpYTEkRmVjaGEpDQpjbGFzcyhiYWNvbG9tYmlhMV94dHMpDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkoYmFjb2xvbWJpYTEpDQpgYGANCg0KDQpgYGB7cn0NCnBsb3QoYmFjb2xvbWJpYTFfeHRzLCBtYWluID0gIlByZWNpbyDDumx0aW1vIikNCmBgYA0KDQotIEVsIHByZWNpbyBkZSBsYSBhY2Npw7NuIGhhIHZhcmlhZG8gZW50cmUgMTc3MDAgeSA0NTUwMCBDT1AuDQoNCg0KIyAxLiBSZW5kaW1pZW50byBkaWFyaW8gZGUgbGEgYWNjacOzbg0KDQpvYnRlbmVtb3MgZWwgcmVuZGltaWVudG8gZGlhcmlvIGRlIGxhIGFjY2nDs24NCg0KYGBge3J9DQpyZW5kaW1pZW50bzEgPSBkYWlseVJldHVybihiYWNvbG9tYmlhMV94dHMpDQpwbG90KHJlbmRpbWllbnRvMSwgbWFpbj0gIlJlbmRpbWllbnRvIGRlbCBwcmVjaW8gw7psdGltbyIpDQpgYGANCg0KDQotIExvcyByZW5kaW1pZW50b3Mgb3NjaWxhbiBhbHJlZGVkb3IgZGUgY2VybywgY29uIGFsZ3Vub3MgcGljb3MgZGUgdm9sYXRpbGlkYWQuDQoNCi0gTm8gc2Ugb2JzZXJ2YSB1bmEgdGVuZGVuY2lhIGNsYXJhLCBwZXJvIGhheSBwb3NpYmxlcyBhZ3J1cGFtaWVudG9zIGRlIHZvbGF0aWxpZGFkLg0KDQptb2RlbG8gMQ0KDQpgYGB7cn0NCm1vZGVsbzEgPSBhdXRvLmFyaW1hKHJlbmRpbWllbnRvMSkNCnN1bW1hcnkobW9kZWxvMSkNCmBgYA0KDQoNCmBgYHtyfQ0KYXV0b3Bsb3QobW9kZWxvMSkNCmBgYA0KDQotIEVsIG1vZGVsbyBubyB0aWVuZSBjb21wb25lbnRlcyBhdXRvcnJlZ3Jlc2l2b3MgKEFSKSB5IHNpbiBkZSBtZWRpYXMgbcOzdmlsZXMgKE1BKQ0KDQotIENvcnJlc3BvbmRlIGEgdW4gbW9kZWxvIEFSSU1BKDAsMCwwKSAocnVpZG8gYmxhbmNvKSANCg0KYGBge3J9DQpjaGVja3Jlc2lkdWFscyhtb2RlbG8xKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCm5kaWZmcyhyZW5kaW1pZW50bzEpDQpgYGANCi0gTm8gaGF5IGRpZmVyZW5jaWFzDQoNCmBgYHtyfQ0KYWRmLnRlc3QocmVuZGltaWVudG8xKQ0KYGBgDQpIMCA9IE5vIGVzIEVTVEFDSU9OQVJJQSBzaSBlbCBwLXZhbHVlIGVzIG1heW9yIHF1ZSAwLjA1DQoNCkgxID0gU2kgZXMgRVNUQUNJT05BUklBIHNpIGVsIHAtdmFsdWUgZXMgbWVub3IgcXVlIDAuMDUgDQoNCiMjIyBjb25jbHVzacOzbjoNCg0KLSBlcyBlc3RhY2lvbmFyaWEgcC12YWx1ZSA9IDAuMA0KDQotIEVsIG1lam9yIG1vZGVsbyBzZWfDum4gYXV0by5hcmltYSgpIGVzIEFSSU1BKDAsMCwwKQ0KDQotIExhIHBydWViYSBBREYgY29uZmlybWEgcXVlIGxhIHNlcmllIGVzIGVzdGFjaW9uYXJpYSAocC12YWx1ZSA9IDAuMDEgPCAwLjA1KS4NCg0KDQojIDIuIMK/SGF5IGVmZWN0b3MgQVJDSD8NCg0KR2VuZXJhbW9zIGVsIG1vZGVsbyBBUkNIIGEgdW4gcmV6YWdvDQoNCmBgYHtyfQ0KbW9kZWxvYXJjaDEgPSBBcmNoVGVzdChyZW5kaW1pZW50bzEsIGxhZ3MgPSAxLCBkZW1lYW4gPSBUKSAjIGxhZ3Mgc29uIGxvcyByZXphZ29zDQptb2RlbG9hcmNoMQ0KYGBgDQpIMCA9IE5vIGhheSBlZmVjdG9zIEFSQ0ggc2kgZWwgcC12YWx1ZSBlcyBtYXlvciBxdWUgMC4wNSANCg0KSDEgPSBTaSBoYXkgZWZlY3RvcyBBUkNIIHNpIGVsIHAtdmFsdWUgZXMgbWVub3IgcXVlIDAuMDUNCg0KIyMjIGNvbmNsdWNpw7NuOiANCg0KLSBTaSBoYXkgZWZlY3RvcyBBUkNIIGNvbiByZXpvZ28gaGF5IGV2aWRlbmNpYSBzaWduaWZpY2F0aXZhIGRlIGhldGVyb2NlZGFzdGljaWRhZCBjb25kaWNpb25hbA0KDQojIDMuIERldGVybWluYXIgc2kgaGF5IGhldGVyb2NlZGFzdGljaWRhZCANCg0KY2FsY3VsYXIgbG9zIHJlc3VkdWFsZXMgYWwgY3VhZHJhZG8gZGUgbnVlc3RybyBtb2RlbG8gQVJNQSgwLDAsMCkNCg0KZXN0byBwYXJhIGNvbm9jZXIgc2kgaGF5IGhldGVyb2NlZGFzdGljYQ0KYGBge3J9DQpFcnJvcmVzX2N1YWRyYWRvID0gcmVzaWQobW9kZWxvMSleMg0KcGxvdChFcnJvcmVzX2N1YWRyYWRvLCBtYWluID0gIkVycm9yZXNfY3VhZHJhZG8iKQ0KYGBgDQoNCg0KYGBge3J9DQpCb3gudGVzdChFcnJvcmVzX2N1YWRyYWRvLCBsYWcgPSA1LCB0eXBlID0gIkxqdW5nLUJveCIpDQpgYGANCi0gTG9zIGVycm9yZXMgYWwgY3VhZHJhZG8gbXVlc3RyYW4gYXV0b2NvcnJlbGFjacOzbi4NCg0KU2UgaGFjZSB1bmEgcmVncmVzacOzbiBjb24gbG9zIHJlc2lkdWFsZXMgYWwgY3VhZHJhZG8gcmV6YWdhZG9zIGVzdG8gcGFyYSBvYnNlcnZhciBzaSBub3MgZW5mcmVudGFtb3MgYSB1biBtb2RlbG8gQVJDSCBvIG5vDQoNCg0KYGBge3J9DQpSZWdyZXNpb24xID0gZHlubG0oRXJyb3Jlc19jdWFkcmFkbyB+IEwoRXJyb3Jlc19jdWFkcmFkbywxKSkNCg0Kc3VtbWFyeShSZWdyZXNpb24xKQ0KYGBgDQpIMCA9IE5vIGhheSBlZmVjdG9zIEFSQ0ggc2kgZWwgcC12YWx1ZSBlcyBtYXlvciBxdWUgMC4wNQ0KDQpIMSA9IFNpIGhheSBlZmVjdG9zIEFSQ0ggc2kgZWwgcC12YWx1ZSBlcyBtZW5vciBxdWUgMC4wNQ0KDQojIyMgY29uY2x1Y2nDs246IA0KDQotIEhheSBlZmVjdG9zIEFSQ0ggY29uIHVuIHJlem9nbw0KDQoNClNlIHJldmlzYSBsYSBhdXRvY29ycmVsYWNpw7NuIHkgYXV0b2NvcnJlbGFjacOzbiBwYXJjaWFsDQoNCmBgYHtyfQ0KYXV0b3Bsb3QoYWNmKEVycm9yZXNfY3VhZHJhZG8sIGxhZy5tYXggPSAyNDM0LCB5bGltID0gYygtMC41LDEpKSkgKw0KICBsYWJzKHRpdGxlID0gIkF1dG9jb3JyZWxhY2nDs24gcGFyY2lhbCBkZSBsb3MgZXJyb3JlcyBhbCBjdWFkcmFkbyIpICsNCiAgeGxhYigiUmV6YWdvcyIpICsNCiAgeWxhYigiQXV0b2NvcnJlbGFjacOzbiBwYXJjaWFsIikNCmBgYA0KDQojIDQuIEdlbmVyYXIgZWwgbW9kZWxvIEdBUkNIDQoNCi0gTW9kZWxvIEFSTUEgKDAsMCwwKQ0KDQpgYGB7cn0NCiMgUGFyYSBpZGVudGlmaWNhciBlbCBvcmRlbiBkZSBsb3MgZWZlY3RvcyBBUkNIOg0KYWNmKEVycm9yZXNfY3VhZHJhZG8sIGxhZy5tYXg9MjApDQpwYWNmKEVycm9yZXNfY3VhZHJhZG8sIGxhZy5tYXg9MjApDQpgYGANCg0KYGBge3J9DQp1Z2FyY2gxID0gdWdhcmNoc3BlYyhtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDAsMCkpKQ0KI3Jlc3VtZW4NCnVnYXJjaDENCmBgYA0KDQoNCmBgYHtyfQ0KdWdmaXQxID0gdWdhcmNoZml0KHNwZWMgPSB1Z2FyY2gxLCBkYXRhID0gcmVuZGltaWVudG8xKQ0KdWdmaXQxDQpgYGANCg0KDQpgYGB7cn0NCiMgdmVyIGNvZWZpY2llbnRlcw0KdWdmaXQxQGZpdCRjb2VmDQpgYGANCi0gRWwgbW9kZWxvIEdBUkNIIGVzdGltYWRvIHRpZW5lIM6y4oKBIOKJiCAxLCBpbmRpY2FuZG8gYWx0YSBwZXJzaXN0ZW5jaWEgZW4gbGEgdm9sYXRpbGlkYWQuDQoNCi0gU2luIGVtYmFyZ28sIM6x4oKBIOKJiCAwLCBsbyBxdWUgc3VnaWVyZSBxdWUgbG9zIHNob2NrcyByZWNpZW50ZXMgbm8gYWZlY3RhbiBzaWduaWZpY2F0aXZhbWVudGUgbGEgdmFyaWFuemEgY29uZGljaW9uYWwuDQoNCg0KYGBge3J9DQojaW1wcmltaXIgdmFyaWFuemENCnVnX3ZhcjEgPSB1Z2ZpdDFAZml0JHZhcg0KYXV0b3Bsb3QodHModWdfdmFyMSkpDQpgYGANCg0KDQpgYGB7cn0NCiMgcmVzaWR1YWxlcw0KdWdfcmVzaWQxID0gKHVnZml0MUBmaXQkcmVzaWR1YWxzKV4yDQphdXRvcGxvdCh0cyh1Z19yZXNpZDEpKQ0KYGBgDQoNCiMgNS4gUHJvbm9zdGljbw0KDQpgYGB7cn0NCiMgcHJvbm9zdGljbyANCnVnX2ZvcmVjYXN0MSA9IHVnYXJjaGZvcmVjYXN0KHVnZml0MSwgbi5haGVhZCA9IDMwKQ0KdWdfZm9yZWNhc3QxDQpgYGANCg0KDQpgYGB7cn0NCiMgw5psdGltbyBwcmVjaW8gb2JzZXJ2YWRvIChlamVtcGxvLCBkZWJlcyByZWVtcGxhemFyIGNvbiBlbCB2YWxvciByZWFsKQ0KUF90IDwtIGJhY29sb21iaWExJMOabHRpbW9bbnJvdyhiYWNvbG9tYmlhMSldDQoNCiMgUHJvbsOzc3RpY29zIGRlIHJlbmRpbWllbnRvDQpSX2ZvcmVjYXN0cyA8LSBjKDAuMDAwNjM4OSkNCg0KIyBQcmVjaW9zIHByb25vc3RpY2Fkb3MNClBfdDEgPC0gUF90ICogKDEgKyBSX2ZvcmVjYXN0c1sxXSkNClBfdDIgPC0gUF90MSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QzIDwtIFBfdDIgKiAoMSArIFJfZm9yZWNhc3RzWzFdKQ0KUF90NCA8LSBQX3QzICogKDEgKyBSX2ZvcmVjYXN0c1sxXSkNClBfdDUgPC0gUF90NCAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3Q2IDwtIFBfdDUgKiAoMSArIFJfZm9yZWNhc3RzWzFdKQ0KUF90NyA8LSBQX3Q2ICogKDEgKyBSX2ZvcmVjYXN0c1sxXSkNClBfdDggPC0gUF90NyAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3Q5IDwtIFBfdDggKiAoMSArIFJfZm9yZWNhc3RzWzFdKQ0KUF90MTAgPC0gUF90OSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxMSA8LSBQX3QxMCAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxMiA8LSBQX3QxMSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxMyA8LSBQX3QxMiAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxNCA8LSBQX3QxMyAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxNSA8LSBQX3QxNCAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxNiA8LSBQX3QxNSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxNyA8LSBQX3QxNiAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxOCA8LSBQX3QxNyAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QxOSA8LSBQX3QxOCAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyMCA8LSBQX3QxOSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyMSA8LSBQX3QyMCAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyMiA8LSBQX3QyMSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyMyA8LSBQX3QyMiAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyNCA8LSBQX3QyMyAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyNSA8LSBQX3QyNCAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyNiA8LSBQX3QyNSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyNyA8LSBQX3QyNiAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyOCA8LSBQX3QyNyAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QyOSA8LSBQX3QyOCAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQpQX3QzMCA8LSBQX3QyOSAqICgxICsgUl9mb3JlY2FzdHNbMV0pDQoNClBfdDEgDQpQX3Q1IA0KUF90MTANClBfdDIwDQpQX3QzMA0KYGBgDQoNCg0KDQotIERhZG8gcXVlIGVsIG1vZGVsbyBHQVJDSCBubyBkZXRlY3TDsyBlZmVjdG9zIEFSQ0ggc2lnbmlmaWNhdGl2b3MsIGVsIHByb27Ds3N0aWNvIGRlIHJlbmRpbWllbnRvcyBlcyBjb25zdGFudGUuDQoNCg0KIyBDb25jbHVzaW9uZXMgRmluYWxlczoNCg0KIyMjIHNvYnJlIGxvcyByZW5kaW1pZW50b3MNCg0KLSBDb21wb3J0YW1pZW50bzogTG9zIHJlbmRpbWllbnRvcyBtdWVzdHJhbiB1bmEgbWVkaWEgY2VyY2FuYSBhIGNlcm8gKDAuMDAwNjM5KSBjb24gdm9sYXRpbGlkYWQgdmFyaWFibGUNCg0KLSBFc3RhY2lvbmFyaWVkYWQ6IENvbmZpcm1hZGEgcG9yIGxhIHBydWViYSBBREYgKHAtdmFsdWU9MC4wMSkNCg0KLSBBdXRvY29ycmVsYWNpw7NuOiBFbCBtb2RlbG8gQVJJTUEoMCwwLDApIHN1Z2llcmUgcXVlIG5vIGhheSBlc3RydWN0dXJhIGxpbmVhbCBlbiBsb3MgcmVuZGltaWVudG9zDQoNCi0gRWwgbW9kZWxvIEdBUkNIIGVzdGltYWRvIG1vc3Ryw7MgYWx0YSBwZXJzaXN0ZW5jaWEgKM6y4oKBIOKJiCAxKSwgcGVybyBjb24gdW4gaW1wYWN0byBjYXNpIG51bG8gZGUgc2hvY2tzIHJlY2llbnRlcyAozrHigoEg4omIIDApLg0KDQoNCiMjIyBFZmVjdG9zIEFSQ0gvR0FSQ0gNCg0KUHJlc2VuY2lhIGRlIGhldGVyb2NlZGFzdGljaWRhZDoNCg0KLSBQcnVlYmEgQVJDSCBhbHRhbWVudGUgc2lnbmlmaWNhdGl2YSAocC12YWx1ZSA8IDIuMmUtMTYpDQoNCi0gQXV0b2NvcnJlbGFjacOzbiBlbiBlcnJvcmVzIGFsIGN1YWRyYWRvIChManVuZy1Cb3ggcC12YWx1ZSA8IDIuMmUtMTYpDQoNCi0gUmVncmVzacOzbiBkZSBlcnJvcmVzIGN1YWRyYWRvcyBtdWVzdHJhIGRlcGVuZGVuY2lhIHNpZ25pZmljYXRpdmEgKM6yPTAuMjk0LCBwPDJlLTE2KQ0KDQojIyMgTW9kZWxvIEdBUkNIIEVzdGltYWRvDQoNCs+DwrLigpwgPSA3LjMyZS0wNiArIDAuMDc4N861wrLigpzigovigoEgKyAwLjkwNM+DwrLigpzigovigoENCg0KLSBBbHRhIHBlcnNpc3RlbmNpYSBlbiB2b2xhdGlsaWRhZCAozrLigoE9MC45MDQpDQoNCi0gTG9zIHNob2NrcyByZWNpZW50ZXMgdGllbmVuIGltcGFjdG8gbW9kZXJhZG8gKM6x4oKBPTAuMDc4NykNCg0KLSBMYSBzdW1hIM6x4oKBK86y4oKBIOKJiCAwLjk4MyAoPDEpIGluZGljYSBwcm9jZXNvIGVzdGFjaW9uYXJpbyBwZXJvIGNvbiBhbHRhIG1lbW9yaWENCg0KIyMjIFByb27Ds3N0aWNvcw0KDQpSZW5kaW1pZW50b3M6IENvbnN0YW50ZXMgZW4gfjAuMDAwNjM4OSAoMC4wNjM4OSUgZGlhcmlvKQ0KDQpQcmVjaW9zIHByb3llY3RhZG9zOg0KDQpUKzE6IDIzLDY1NS4xDQoNClQrNTogMjMsNzE1LjYxICgrMC4yNiUgZW4gNSBkw61hcykNCg0KVCszMDogMjQsMDk3LjMzICgrMS44NyUgZW4gMzAgZMOtYXMpDQoNCg0KLSBDbHVzdGVyaW5nIGRlIHZvbGF0aWxpZGFkOiBMb3MgcGVyw61vZG9zIGRlIGFsdGEgdm9sYXRpbGlkYWQgdGllbmRlbiBhIGFncnVwYXJzZSB0ZW1wb3JhbG1lbnRlDQoNCi0gUGVyc2lzdGVuY2lhOiBMYSB2b2xhdGlsaWRhZCBtdWVzdHJhIG1lbW9yaWEgZGUgbGFyZ28gcGxhem8gKM6y4oKBIGNlcmNhbm8gYSAxKQ0KDQo=