rm(list=ls())
download.file("http://www.apradie.com/ec2004/salesbrands3.xlsx", "salesbrands3.xlsx", mode="wb")
trying URL 'http://www.apradie.com/ec2004/salesbrands3.xlsx'
Content type 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' length 18194 bytes (17 KB)
==================================================
downloaded 17 KB
library(readxl)
sales_brands <- read_excel("salesbrands3.xlsx", sheet = "Resultado")

# Always familiarize with the data
head(sales_brands, 5)
# Load library xts. Install the package if you haven't already.
library(xts)

# We save the date column in a new dataset:
month <- sales_brands$date

# We delete the date column from the sales data. The date is the column 1 of the dataset: 
sales_brands <- sales_brands[,c(-1)]
# As you see, when you specify c(-1) in the column index that means that you do not want column 1! 

# Now we create an xts dataset using the previous datasets: 
sales.xts <- xts(x = sales_brands, order.by = month)

head(sales.xts, 5)
Warning: object timezone ('UTC') is different from system timezone ('')
           qbrand1tons salesbrand1 qbrand2tons salesbrand2 qbrand3tons salesbrand3 qbrand4tons
2015-01-01      106.62    60780.72      195.46    60700.51      293.10    75196.35      185.91
2015-02-01      105.82    60411.47      216.09    68289.15      494.46   105010.90      149.30
2015-03-01       88.82    53174.89      220.15    62529.54      356.88    90902.84      144.65
2015-04-01       86.69    50861.69      170.74    50575.68      291.07    72853.34      161.43
2015-05-01       87.23    51014.23      177.17    54327.48      318.09    75277.10      141.09
           salesbrand4 qbrand5tons salesbrand5 qbrand6tons salesbrand6 tonstotal salestotal
2015-01-01    48228.51       28.94     2295.50      338.38    55561.26   1148.41   302762.8
2015-02-01    39922.14       24.66     1973.43      284.52    51469.74   1274.85   327076.8
2015-03-01    39788.22       23.75     1903.24      251.34    50395.48   1085.59   298694.2
2015-04-01    42692.59       21.00     1684.28      230.29    49124.61    961.22   267792.2
2015-05-01    37167.52       23.44     1883.41      250.45    46906.63    997.47   266576.4
# Do you notice any difference between data frames and xts objects?

#delete month variable
rm(month)
plot(sales.xts$qbrand2tons)

plot(sales.xts$qbrand6tons)

ln_sales <- log(sales.xts)
sales_monthly_growth_q2 = diff(ln_sales$qbrand2tons)
sales_monthly_growth_q6 = diff(ln_sales$qbrand6tons)

plot(sales_monthly_growth_q2, type = "l", col = "blue")

lines(sales_monthly_growth_q6, type = "l", col = "red")

sales_annual_growth_q2 = diff(ln_sales$qbrand2tons,lag = 12)
sales_annual_growth_q6 = diff(ln_sales$qbrand6tons,lag = 12)

plot(sales_annual_growth_q2, type = "l", col = "black")

lines(sales_annual_growth_q6, type = "l", col = "blue")

library(tseries)

adf.test(na.omit(sales_annual_growth_q2), alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  na.omit(sales_annual_growth_q2)
Dickey-Fuller = -3.574, Lag order = 3, p-value = 0.04701
alternative hypothesis: stationary

#3 CHALLENGE 1 #RUN AND INTERPRET A DICKY-FULLER TEST FOR THE ANNUAL % DIFFERENCE OF BRAND 6, AND PROVIDE AN INTERPRETATION

# Load necessary library
library(tseries)

# Perform the ADF test on the annual growth rate of Brand 6
adf_test_q6 <- adf.test(na.omit(sales_annual_growth_q6), alternative = "stationary")

# Print the test result
print(adf_test_q6)

    Augmented Dickey-Fuller Test

data:  na.omit(sales_annual_growth_q6)
Dickey-Fuller = -2.3423, Lag order = 3, p-value = 0.4387
alternative hypothesis: stationary

#Con el valor de -2.3423 podemos decir que no es estacionarionaria (tiene una única raíz unitaria) y con este p-value we accept the nule hypothesis que está dentro del 95% de confianza.

library(wbstats)
# Mexico - Infant mortality
infantm<-wb_data(indicator = c("SP.DYN.IMRT.IN"), 
      country="MEX", start_date = 1980, end_date = 2020)

# Mexico - Export value
exports<-wb_data(indicator = c("TX.VAL.MRCH.XD.WD"), 
      country="MEX", start_date = 1980, end_date = 2020)
plot.ts(infantm$SP.DYN.IMRT.IN)

plot.ts(exports$TX.VAL.MRCH.XD.WD)

#Now run a regression using these series. Report the result of the regression. Did you find significant relationship? is your result what you expected? #I don´t see any significant relation because while the infant mortality graph begins up and with a significant curve, the export value goes from a low number to a higher an is increasing while the othe is decreasing. And this is the result that i expect.

m1 <- lm(exports$TX.VAL.MRCH.XD.WD ~ infantm$SP.DYN.IMRT.IN)
summary(m1)

Call:
lm(formula = exports$TX.VAL.MRCH.XD.WD ~ infantm$SP.DYN.IMRT.IN)

Residuals:
    Min      1Q  Median      3Q     Max 
-21.942 -18.107  -2.227  16.959  32.253 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)            122.4937     6.8165   17.97  < 2e-16 ***
infantm$SP.DYN.IMRT.IN  -2.7632     0.2286  -12.09 9.25e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 18.19 on 39 degrees of freedom
Multiple R-squared:  0.7892,    Adjusted R-squared:  0.7838 
F-statistic:   146 on 1 and 39 DF,  p-value: 9.245e-15

#4.1 CHALLENGE 2 - QUESTION: #RESEARCH ABOUT SPURIOUS REGRESSION. With your words briefly explain in which cases you can end up with a spurious regression

When the regression model shows a high R-squared value, suggesting a good fit, which is misleading.

#When the residuals of the regression are non-stationary, indicating that the model does not properly capture the dynamics of the data. #This type of cases can ed up with a spuria regression. #When the t-statistics for the regression coefficients are significant, even though there is no true relationship between the variables.

library(tseries)
# The errors/residual of the regression are stored in the residuals
#   attribute of the m1 model:
adf.test(m1$residuals, alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  m1$residuals
Dickey-Fuller = -2.5852, Lag order = 3, p-value = 0.3434
alternative hypothesis: stationary
library(quantmod)
getSymbols(Symbols=c("^MXX","^GSPC"), peridiocity = "daily",
                     from="2015-01-01", to="2017-10-02")
[1] "MXX"  "GSPC"
#Putting the adjusted prices into one dataset:
data = Ad(merge(MXX,GSPC))
data = na.omit(data)
firstmxx = as.numeric(MXX$MXX.Adjusted[1])
firstus = as.numeric(GSPC$GSPC.Adjusted[1])
invmxx = data$MXX.Adjusted / firstmxx
invus = data$GSPC.Adjusted / firstus 
inv <- merge(invus,invmxx)
plot(inv)


#2nd period
library(quantmod)
getSymbols(Symbols=c("^MXX","^GSPC"), peridiocity = "daily",
                     from="2017-10-03", to="2018-02-28")
[1] "MXX"  "GSPC"
#Putting the adjusted prices into one dataset:
data = Ad(merge(MXX,GSPC))
data = na.omit(data)
secondmxx = as.numeric(MXX$MXX.Adjusted[1])
secondstus = as.numeric(GSPC$GSPC.Adjusted[1])
invmxx = data$MXX.Adjusted / secondmxx
invus = data$GSPC.Adjusted / secondstus 
inv <- merge(invus,invmxx)
plot(inv)

#For both time periods, run a cointegration test and INTERPRET your results.

m2 <- lm( invmxx ~ invus )
summary(m2)

Call:
lm(formula = invmxx ~ invus)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.037454 -0.014008 -0.002567  0.017749  0.040777 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.79716    0.05928  13.447  < 2e-16 ***
invus        0.16206    0.05640   2.874  0.00501 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02006 on 95 degrees of freedom
Multiple R-squared:  0.07997,   Adjusted R-squared:  0.07028 
F-statistic: 8.257 on 1 and 95 DF,  p-value: 0.005008
library(tseries)
# The errors/residual of the regression are stored in the residuals
#   attribute of the m1 model:
adf.test(m2$residuals, alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  m2$residuals
Dickey-Fuller = -1.8913, Lag order = 4, p-value = 0.6214
alternative hypothesis: stationary

#Como el valor de p es mayor a 0.05 podemos decir que la hipotesis nula es aceptada con 95% de confianza que la cointegración no es estacionaria ya que no hay suficiente evidencia para demostrar lo contrario. Por el caso del análisis dickey fuller el valor del estadístico es menos negativo que el valor crítico correspondiente al nivel de significancia ( -1.8913 para el 5% de significancia), no se rechaza la hipótesis nula por que no hay evidencia suficiente. En conclusión podemos decir ya que no es estacionario que no tienen una cointegración.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJtKGxpc3Q9bHMoKSkKYGBgCgpgYGB7cn0KZG93bmxvYWQuZmlsZSgiaHR0cDovL3d3dy5hcHJhZGllLmNvbS9lYzIwMDQvc2FsZXNicmFuZHMzLnhsc3giLCAic2FsZXNicmFuZHMzLnhsc3giLCBtb2RlPSJ3YiIpCmBgYApgYGB7cn0KbGlicmFyeShyZWFkeGwpCmBgYAoKYGBge3J9CnNhbGVzX2JyYW5kcyA8LSByZWFkX2V4Y2VsKCJzYWxlc2JyYW5kczMueGxzeCIsIHNoZWV0ID0gIlJlc3VsdGFkbyIpCgojIEFsd2F5cyBmYW1pbGlhcml6ZSB3aXRoIHRoZSBkYXRhCmhlYWQoc2FsZXNfYnJhbmRzLCA1KQpgYGAKYGBge3J9CiMgTG9hZCBsaWJyYXJ5IHh0cy4gSW5zdGFsbCB0aGUgcGFja2FnZSBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5LgpsaWJyYXJ5KHh0cykKCiMgV2Ugc2F2ZSB0aGUgZGF0ZSBjb2x1bW4gaW4gYSBuZXcgZGF0YXNldDoKbW9udGggPC0gc2FsZXNfYnJhbmRzJGRhdGUKCiMgV2UgZGVsZXRlIHRoZSBkYXRlIGNvbHVtbiBmcm9tIHRoZSBzYWxlcyBkYXRhLiBUaGUgZGF0ZSBpcyB0aGUgY29sdW1uIDEgb2YgdGhlIGRhdGFzZXQ6IApzYWxlc19icmFuZHMgPC0gc2FsZXNfYnJhbmRzWyxjKC0xKV0KIyBBcyB5b3Ugc2VlLCB3aGVuIHlvdSBzcGVjaWZ5IGMoLTEpIGluIHRoZSBjb2x1bW4gaW5kZXggdGhhdCBtZWFucyB0aGF0IHlvdSBkbyBub3Qgd2FudCBjb2x1bW4gMSEgCgojIE5vdyB3ZSBjcmVhdGUgYW4geHRzIGRhdGFzZXQgdXNpbmcgdGhlIHByZXZpb3VzIGRhdGFzZXRzOiAKc2FsZXMueHRzIDwtIHh0cyh4ID0gc2FsZXNfYnJhbmRzLCBvcmRlci5ieSA9IG1vbnRoKQoKaGVhZChzYWxlcy54dHMsIDUpCmBgYApgYGB7cn0KIyBEbyB5b3Ugbm90aWNlIGFueSBkaWZmZXJlbmNlIGJldHdlZW4gZGF0YSBmcmFtZXMgYW5kIHh0cyBvYmplY3RzPwoKI2RlbGV0ZSBtb250aCB2YXJpYWJsZQpybShtb250aCkKYGBgCgpgYGB7cn0KcGxvdChzYWxlcy54dHMkcWJyYW5kMnRvbnMpCmBgYAoKYGBge3J9CnBsb3Qoc2FsZXMueHRzJHFicmFuZDZ0b25zKQpgYGAKYGBge3J9CmxuX3NhbGVzIDwtIGxvZyhzYWxlcy54dHMpCmBgYAoKYGBge3J9CnNhbGVzX21vbnRobHlfZ3Jvd3RoX3EyID0gZGlmZihsbl9zYWxlcyRxYnJhbmQydG9ucykKc2FsZXNfbW9udGhseV9ncm93dGhfcTYgPSBkaWZmKGxuX3NhbGVzJHFicmFuZDZ0b25zKQoKcGxvdChzYWxlc19tb250aGx5X2dyb3d0aF9xMiwgdHlwZSA9ICJsIiwgY29sID0gImJsdWUiKQpgYGAKYGBge3J9CmxpbmVzKHNhbGVzX21vbnRobHlfZ3Jvd3RoX3E2LCB0eXBlID0gImwiLCBjb2wgPSAicmVkIikKYGBgCgpgYGB7cn0Kc2FsZXNfYW5udWFsX2dyb3d0aF9xMiA9IGRpZmYobG5fc2FsZXMkcWJyYW5kMnRvbnMsbGFnID0gMTIpCnNhbGVzX2FubnVhbF9ncm93dGhfcTYgPSBkaWZmKGxuX3NhbGVzJHFicmFuZDZ0b25zLGxhZyA9IDEyKQoKcGxvdChzYWxlc19hbm51YWxfZ3Jvd3RoX3EyLCB0eXBlID0gImwiLCBjb2wgPSAiYmxhY2siKQpgYGAKCmBgYHtyfQpsaW5lcyhzYWxlc19hbm51YWxfZ3Jvd3RoX3E2LCB0eXBlID0gImwiLCBjb2wgPSAiYmx1ZSIpCmBgYApgYGB7cn0KbGlicmFyeSh0c2VyaWVzKQoKYWRmLnRlc3QobmEub21pdChzYWxlc19hbm51YWxfZ3Jvd3RoX3EyKSwgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpCmBgYAojMyBDSEFMTEVOR0UgMQojUlVOIEFORCBJTlRFUlBSRVQgQSBESUNLWS1GVUxMRVIgVEVTVCBGT1IgVEhFIEFOTlVBTCAlIERJRkZFUkVOQ0UgT0YgQlJBTkQgNiwgQU5EIFBST1ZJREUgQU4gSU5URVJQUkVUQVRJT04KCmBgYHtyfQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkKbGlicmFyeSh0c2VyaWVzKQoKIyBQZXJmb3JtIHRoZSBBREYgdGVzdCBvbiB0aGUgYW5udWFsIGdyb3d0aCByYXRlIG9mIEJyYW5kIDYKYWRmX3Rlc3RfcTYgPC0gYWRmLnRlc3QobmEub21pdChzYWxlc19hbm51YWxfZ3Jvd3RoX3E2KSwgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpCgojIFByaW50IHRoZSB0ZXN0IHJlc3VsdApwcmludChhZGZfdGVzdF9xNikKCmBgYAojQ29uIGVsIHZhbG9yIGRlIC0yLjM0MjMgcG9kZW1vcyBkZWNpciBxdWUgbm8gZXMgZXN0YWNpb25hcmlvbmFyaWEgKHRpZW5lIHVuYSDDum5pY2EgcmHDrXogdW5pdGFyaWEpIHkgY29uIGVzdGUgcC12YWx1ZSB3ZSBhY2NlcHQgdGhlIG51bGUgaHlwb3RoZXNpcyBxdWUgZXN0w6EgZGVudHJvIGRlbCA5NSUgZGUgY29uZmlhbnphLgoKYGBge3J9CmxpYnJhcnkod2JzdGF0cykKYGBgCgpgYGB7cn0KIyBNZXhpY28gLSBJbmZhbnQgbW9ydGFsaXR5CmluZmFudG08LXdiX2RhdGEoaW5kaWNhdG9yID0gYygiU1AuRFlOLklNUlQuSU4iKSwgCiAgICAgIGNvdW50cnk9Ik1FWCIsIHN0YXJ0X2RhdGUgPSAxOTgwLCBlbmRfZGF0ZSA9IDIwMjApCgojIE1leGljbyAtIEV4cG9ydCB2YWx1ZQpleHBvcnRzPC13Yl9kYXRhKGluZGljYXRvciA9IGMoIlRYLlZBTC5NUkNILlhELldEIiksIAogICAgICBjb3VudHJ5PSJNRVgiLCBzdGFydF9kYXRlID0gMTk4MCwgZW5kX2RhdGUgPSAyMDIwKQpgYGAKCmBgYHtyfQpwbG90LnRzKGluZmFudG0kU1AuRFlOLklNUlQuSU4pCmBgYAoKYGBge3J9CnBsb3QudHMoZXhwb3J0cyRUWC5WQUwuTVJDSC5YRC5XRCkKYGBgCiNOb3cgcnVuIGEgcmVncmVzc2lvbiB1c2luZyB0aGVzZSBzZXJpZXMuIFJlcG9ydCB0aGUgcmVzdWx0IG9mIHRoZSByZWdyZXNzaW9uLiBEaWQgeW91IGZpbmQgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwPyBpcyB5b3VyIHJlc3VsdCB3aGF0IHlvdSBleHBlY3RlZD8KI0kgZG9uwrR0IHNlZSBhbnkgc2lnbmlmaWNhbnQgcmVsYXRpb24gYmVjYXVzZSB3aGlsZSB0aGUgaW5mYW50IG1vcnRhbGl0eSBncmFwaCBiZWdpbnMgdXAgYW5kIHdpdGggYSBzaWduaWZpY2FudCBjdXJ2ZSwgdGhlIGV4cG9ydCB2YWx1ZSBnb2VzIGZyb20gYSBsb3cgbnVtYmVyIHRvIGEgaGlnaGVyIGFuIGlzIGluY3JlYXNpbmcgd2hpbGUgdGhlIG90aGUgaXMgZGVjcmVhc2luZy4gQW5kIHRoaXMgaXMgdGhlIHJlc3VsdCB0aGF0IGkgZXhwZWN0LgpgYGB7cn0KbTEgPC0gbG0oZXhwb3J0cyRUWC5WQUwuTVJDSC5YRC5XRCB+IGluZmFudG0kU1AuRFlOLklNUlQuSU4pCnN1bW1hcnkobTEpCmBgYAojNC4xIENIQUxMRU5HRSAyIC0gUVVFU1RJT046CiNSRVNFQVJDSCBBQk9VVCBTUFVSSU9VUyBSRUdSRVNTSU9OLiBXaXRoIHlvdXIgd29yZHMgYnJpZWZseSBleHBsYWluIGluIHdoaWNoIGNhc2VzIHlvdSBjYW4gZW5kIHVwIHdpdGggYSBzcHVyaW91cyByZWdyZXNzaW9uCgojIFdoZW4gdGhlIHJlZ3Jlc3Npb24gbW9kZWwgc2hvd3MgYSBoaWdoIFItc3F1YXJlZCB2YWx1ZSwgc3VnZ2VzdGluZyBhIGdvb2QgZml0LCB3aGljaCBpcyBtaXNsZWFkaW5nLgojV2hlbiB0aGUgcmVzaWR1YWxzIG9mIHRoZSByZWdyZXNzaW9uIGFyZSBub24tc3RhdGlvbmFyeSwgaW5kaWNhdGluZyB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBwcm9wZXJseSBjYXB0dXJlIHRoZSBkeW5hbWljcyBvZiB0aGUgZGF0YS4KI1RoaXMgdHlwZSBvZiBjYXNlcyBjYW4gZWQgdXAgd2l0aCBhIHNwdXJpYSByZWdyZXNzaW9uLgojV2hlbiB0aGUgdC1zdGF0aXN0aWNzIGZvciB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgYXJlIHNpZ25pZmljYW50LCBldmVuIHRob3VnaCB0aGVyZSBpcyBubyB0cnVlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB2YXJpYWJsZXMuCgpgYGB7cn0KbGlicmFyeSh0c2VyaWVzKQojIFRoZSBlcnJvcnMvcmVzaWR1YWwgb2YgdGhlIHJlZ3Jlc3Npb24gYXJlIHN0b3JlZCBpbiB0aGUgcmVzaWR1YWxzCiMgICBhdHRyaWJ1dGUgb2YgdGhlIG0xIG1vZGVsOgphZGYudGVzdChtMSRyZXNpZHVhbHMsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQpgYGAKYGBge3J9CmxpYnJhcnkocXVhbnRtb2QpCmdldFN5bWJvbHMoU3ltYm9scz1jKCJeTVhYIiwiXkdTUEMiKSwgcGVyaWRpb2NpdHkgPSAiZGFpbHkiLAogICAgICAgICAgICAgICAgICAgICBmcm9tPSIyMDE1LTAxLTAxIiwgdG89IjIwMTctMTAtMDIiKQpgYGAKCgpgYGB7cn0KI1B1dHRpbmcgdGhlIGFkanVzdGVkIHByaWNlcyBpbnRvIG9uZSBkYXRhc2V0OgpkYXRhID0gQWQobWVyZ2UoTVhYLEdTUEMpKQpkYXRhID0gbmEub21pdChkYXRhKQpgYGAKCmBgYHtyfQpmaXJzdG14eCA9IGFzLm51bWVyaWMoTVhYJE1YWC5BZGp1c3RlZFsxXSkKZmlyc3R1cyA9IGFzLm51bWVyaWMoR1NQQyRHU1BDLkFkanVzdGVkWzFdKQpgYGAKCgpgYGB7cn0KaW52bXh4ID0gZGF0YSRNWFguQWRqdXN0ZWQgLyBmaXJzdG14eAppbnZ1cyA9IGRhdGEkR1NQQy5BZGp1c3RlZCAvIGZpcnN0dXMgCmBgYAoKYGBge3J9CmludiA8LSBtZXJnZShpbnZ1cyxpbnZteHgpCnBsb3QoaW52KQpgYGAKCmBgYHtyfQoKIzJuZCBwZXJpb2QKbGlicmFyeShxdWFudG1vZCkKZ2V0U3ltYm9scyhTeW1ib2xzPWMoIl5NWFgiLCJeR1NQQyIpLCBwZXJpZGlvY2l0eSA9ICJkYWlseSIsCiAgICAgICAgICAgICAgICAgICAgIGZyb209IjIwMTctMTAtMDMiLCB0bz0iMjAxOC0wMi0yOCIpCmBgYAoKYGBge3J9CiNQdXR0aW5nIHRoZSBhZGp1c3RlZCBwcmljZXMgaW50byBvbmUgZGF0YXNldDoKZGF0YSA9IEFkKG1lcmdlKE1YWCxHU1BDKSkKZGF0YSA9IG5hLm9taXQoZGF0YSkKYGBgCgpgYGB7cn0Kc2Vjb25kbXh4ID0gYXMubnVtZXJpYyhNWFgkTVhYLkFkanVzdGVkWzFdKQpzZWNvbmRzdHVzID0gYXMubnVtZXJpYyhHU1BDJEdTUEMuQWRqdXN0ZWRbMV0pCmBgYAoKYGBge3J9Cmludm14eCA9IGRhdGEkTVhYLkFkanVzdGVkIC8gc2Vjb25kbXh4CmludnVzID0gZGF0YSRHU1BDLkFkanVzdGVkIC8gc2Vjb25kc3R1cyAKYGBgCgpgYGB7cn0KaW52IDwtIG1lcmdlKGludnVzLGludm14eCkKcGxvdChpbnYpCmBgYAoKCgojRm9yIGJvdGggdGltZSBwZXJpb2RzLCBydW4gYSBjb2ludGVncmF0aW9uIHRlc3QgYW5kIElOVEVSUFJFVCB5b3VyIHJlc3VsdHMuCgpgYGB7cn0KbTIgPC0gbG0oIGludm14eCB+IGludnVzICkKc3VtbWFyeShtMikKYGBgCmBgYHtyfQpsaWJyYXJ5KHRzZXJpZXMpCiMgVGhlIGVycm9ycy9yZXNpZHVhbCBvZiB0aGUgcmVncmVzc2lvbiBhcmUgc3RvcmVkIGluIHRoZSByZXNpZHVhbHMKIyAgIGF0dHJpYnV0ZSBvZiB0aGUgbTEgbW9kZWw6CmFkZi50ZXN0KG0yJHJlc2lkdWFscywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpCmBgYAojQ29tbyBlbCB2YWxvciBkZSBwIGVzIG1heW9yIGEgMC4wNSBwb2RlbW9zIGRlY2lyIHF1ZSBsYSBoaXBvdGVzaXMgbnVsYSBlcyBhY2VwdGFkYSBjb24gOTUlIGRlIGNvbmZpYW56YSBxdWUgbGEgY29pbnRlZ3JhY2nDs24gbm8gZXMgZXN0YWNpb25hcmlhIHlhIHF1ZSBubyBoYXkgc3VmaWNpZW50ZSBldmlkZW5jaWEgcGFyYSBkZW1vc3RyYXIgbG8gY29udHJhcmlvLiBQb3IgZWwgY2FzbyBkZWwgYW7DoWxpc2lzIGRpY2tleSBmdWxsZXIgZWwgdmFsb3IgZGVsIGVzdGFkw61zdGljbyBlcyBtZW5vcyBuZWdhdGl2byBxdWUgZWwgdmFsb3IgY3LDrXRpY28gY29ycmVzcG9uZGllbnRlIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgKCAtMS44OTEzIHBhcmEgZWwgNSUgZGUgc2lnbmlmaWNhbmNpYSksIG5vIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhIHBvciBxdWUgbm8gaGF5IGV2aWRlbmNpYSBzdWZpY2llbnRlLiBFbiBjb25jbHVzacOzbiBwb2RlbW9zIGRlY2lyIHlhIHF1ZSBubyBlcyBlc3RhY2lvbmFyaW8gcXVlIG5vIHRpZW5lbiB1bmEgY29pbnRlZ3JhY2nDs24uCgo=