Background
NextEra Energy, Inc. is one of the largest electric power companies
in North America, its main focus is on clean and renewable energy. This
company was founded in 1925 as the Florida Power & Light Company
(FPL), the company has grown and diversified over the years.NextEra is
the world’s largest generator of renewable energy from the wind and sun.
It operates in 37 states and four Canadian provinces. This company has
been a leader in the transition towards clean energy.
Over the years, NextEra Energy has showed strong financial
performance, with consistent growth in revenues and profitability,
making it an attractive option for many investors.
Visualization
Stock price historical data
# setting time series format
NEE$Date<-as.Date(NEE$Date,"%Y-%m-%d")
# Descriptive stadistics of the dependet variable
summary(NEE$Adj.Close)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 19.44 26.81 40.04 47.19 69.48 89.62
# visualizing time series data
# time series plot
NEExts<-xts(NEE$Adj.Close,order.by=NEE$Date)
dygraph(NEExts, main = "NextEra Energy Stock Price") %>%
dyOptions(colors = RColorBrewer::brewer.pal(4, "Dark2")) %>%
dyShading(from = "2019-1-7",
to = "2022-12-26",
color = "#FFE6E6")
Decomposation of time series
# Decompose a time series
# 1) observed: data observations
# 2) trend: increasing / decreasing value of data observations
# 3) seasonality: repeating short-term cycle in time series
# 4) noise: random variation in time series
NEEts<-ts(NEE$Adj.Close,frequency=52,start=c(2015,1))
NEE_ts_decompose<-decompose(NEEts)
plot(NEE_ts_decompose)

Do the time series data show a trend?
Based on the graph, it is possible to see a positive trend according
to the periods from 2015 to mid-2022, this tells us that the stock had a
good performance over time since, unlike each year, its increase was
maintained, for it shows us a positive trend behavior.
Do the time series data show seasonality? How is the change of the
seasonal component over time?
At first glance it is possible to identify the seasonality, it is
possible to see that the action follows a constant pattern over time, at
the beginning of 2015 it is observed that the action decreases
drastically in the middle of the year, but ends with a high peak. With
the information provided, we can infer that this pattern will happen
again since it tends to start at the top and in the middle of the year
it has a drastic decrease and by the end of the period it increases
drastically.
Estimation
Stationary
# Stationary Test
# H0: Non-stationary and HA: Stationary. p-values < 0.05 reject the H0.
adf.test(NEE$Adj.Close)
##
## Augmented Dickey-Fuller Test
##
## data: NEE$Adj.Close
## Dickey-Fuller = -3.1841, Lag order = 7, p-value = 0.09078
## alternative hypothesis: stationary
# P-Value > 0.05. Fail to reject the H0. The time series data is non-stationary.
Serial autocorrelation
# Serial Autocorrelation
acf(NEE$Adj.Close,main="Significant Autocorrelations")

# There is high serial autocorrelation despite the number of lags of the variable
Models
Model 1 - ARMA(log)
summary(NEE_ARMA<-arma(log(NEE$Adj.Close),order=c(1,1))) # Transforming into log to having a stationary time series
##
## Call:
## arma(x = log(NEE$Adj.Close), order = c(1, 1))
##
## Model:
## ARMA(1,1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.203261 -0.014812 0.001953 0.016020 0.179213
##
## Coefficient(s):
## Estimate Std. Error t value Pr(>|t|)
## ar1 0.997876 0.003145 317.275 <2e-16 ***
## ma1 -0.050680 0.051828 -0.978 0.328
## intercept 0.011187 0.011864 0.943 0.346
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Fit:
## sigma^2 estimated as 0.001036, Conditional Sum-of-Squares = 0.43, AIC = -1676.21
NEE_estimated_stock_price<-exp(NEE_ARMA$fitted.values) # Applying exp to make interpretations on real numbers
plot(NEE_estimated_stock_price)

Model 2 - ARIMA
NEE_ARIMA <- Arima(NEE$Adj.Close,order=c(1,1,1))
print(NEE_ARIMA)
## Series: NEE$Adj.Close
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## -0.0025 -0.0027
## s.e. 1.8575 1.8588
##
## sigma^2 = 3.725: log likelihood = -862.79
## AIC=1731.57 AICc=1731.63 BIC=1743.67
plot(NEE_ARIMA$fitted)

Model 3 - ARiMA(log)
tsmodel = Arima(log(NEE$Adj.Close),order=c(1,1,1))# Transforming into log to having a stationary time series
print(tsmodel)
## Series: log(NEE$Adj.Close)
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## 0.7705 -0.8397
## s.e. 0.0889 0.0724
##
## sigma^2 = 0.001041: log likelihood = 839.21
## AIC=-1672.42 AICc=-1672.36 BIC=-1660.33
confint(tsmodel)
## 2.5 % 97.5 %
## ar1 0.5962488 0.9446956
## ma1 -0.9816467 -0.6976623
plot(exp(tsmodel$fitted))# Applying exp to make interpretations on real numbers

Evaluation
Testing serial autocorrelation in regression residuals
Ho: There is no serial autocorrelation
Ha: There is serial autocorrelation
Model 1 - ARMA(log)
NEE_ARMA_residuals<-NEE_ARMA$residuals
Box.test(NEE_ARMA_residuals,lag=5,type="Ljung-Box")
##
## Box-Ljung test
##
## data: NEE_ARMA_residuals
## X-squared = 15.638, df = 5, p-value = 0.007957
# Reject the Ho. P-value is < 0.05 indicating that ARMA Model does show residual serial autocorrelation.
adf.test(na.omit(NEE_estimated_stock_price))
##
## Augmented Dickey-Fuller Test
##
## data: na.omit(NEE_estimated_stock_price)
## Dickey-Fuller = -3.1595, Lag order = 7, p-value = 0.09497
## alternative hypothesis: stationary
# ADF test suggest that ARMA residuals are stationary since p-value is < 0.05.
Model 2 - ARIMA
acf(NEE_ARIMA$residuals,main="ACF - ARIMA (1,1,1)")

# ACF plot displays weak or no autocorrelation.
Box.test(NEE_ARIMA$residuals,lag=3,type="Ljung-Box")
##
## Box-Ljung test
##
## data: NEE_ARIMA$residuals
## X-squared = 1.5426, df = 3, p-value = 0.6725
# P-value is > 0.05 indicating that ARMA model does not show residual serial autocorrelation.
adf.test(NEE_ARIMA$residuals)
## Warning in adf.test(NEE_ARIMA$residuals): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: NEE_ARIMA$residuals
## Dickey-Fuller = -10.346, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
# ADF test suggest that ARIMA residuals are stationary since p-value is < 0.05.
Model 3 - ARIMA(log)
acf(tsmodel$residuals,main="ACF - ARIMA (1,1,1)")

# ACF plot displays weak or no autocorrelation.
Box.test(tsmodel$residuals,lag=3,type="Ljung-Box")
##
## Box-Ljung test
##
## data: tsmodel$residuals
## X-squared = 3.0945, df = 3, p-value = 0.3773
# P-value is > 0.05 indicating that ARMA model does not show residual serial autocorrelation.
adf.test(tsmodel$residuals)
##
## Augmented Dickey-Fuller Test
##
## data: tsmodel$residuals
## Dickey-Fuller = -9.082, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
# ADF test suggest that ARMA residuals are stationary since p-value is < 0.05.
Selected Model
To decide our winning model we compared AIC from the ARMA and ARIMA
models. In our model you can see a minimal difference where the ARMA is
better, has the lower AIC.
It should be mentioned that our time series is NOT stationary,
however we need our time series to be stationary in order to get the
best model. When our series is not stationary as was the case, the ARIMA
model should be used.
Using the diagnostic tests of both models you can see if there is
stationery in the residues of both models. In the residuals we can see
that there is no serial autocorrelation in the ARIMA (so the difference
transformations were applied) and the ARMA model if there.
Under the above context our winning model is ARIMA(Model 3).
Forecast
temp_forecast<-autoplot(forecast(exp(tsmodel$fitted)))
plot(temp_forecast)

forecast(exp(tsmodel$fitted),h=5)
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 418 82.52227 79.37690 85.66763 77.71185 87.33269
## 419 82.64569 78.39067 86.90070 76.13820 89.15318
## 420 82.76911 77.63594 87.90227 74.91861 90.61960
## 421 82.89253 77.00815 88.77691 73.89315 91.89191
## 422 83.01595 76.46347 89.56842 72.99480 93.03709
Interpreting Results
- ARMA(log) regression results (AIC=-1676.21) shows better performance
than ARIMA(log) results (AIC=-1672.42)
- Both ARMA and ARIMA results suggest that residuals are
stationary
- ARIMA results suggest that there is no serial autocorrelation in the
residuals, on the other hand, in the ARMA model it is found
- The forecast for the next 5 periods is for an increase the NextEra
Energy stock price.
LS0tDQp0aXRsZTogIk5leHRFcmEgRW5lcmd5IFN0b2NrIFByaWNlIg0KYXV0aG9yOiAiSm9zw6kgQXJ0dXJvIFNpbHZhIEZsb3JlcyBBMDExOTgwNDksIE1hcmlhbmEgTGVhbCBMb3BleiBBMDE1NzA5NzcsIFNlYmFzdGlhbiBFc3Bpbm96YSBBMDA4MzM3MDQiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCk5FRTwtcmVhZC5jc3YoIkM6XFxVc2Vyc1xcU2lsdmFcXERvY3VtZW50c1xcVGVjXFxDU1ZcXFNlbWVzdHJlNVxcdHNfc3RvY2tfcHJpY2VzXFx0c19zdG9ja19wcmljZXNcXE5FRS5jc3YiKQ0KYGBgDQoNCiFbXShDOlxcVXNlcnNcXFNpbHZhXFxEb2N1bWVudHNcXFRlY1xcSW1hZ2VuZXNfYWN0c1xcTkVFLmpwZykNCg0KIyMgQmFja2dyb3VuZA0KDQpOZXh0RXJhIEVuZXJneSwgSW5jLiBpcyBvbmUgb2YgdGhlIGxhcmdlc3QgZWxlY3RyaWMgcG93ZXIgY29tcGFuaWVzIGluIE5vcnRoIEFtZXJpY2EsIGl0cyBtYWluIGZvY3VzIGlzIG9uIGNsZWFuIGFuZCByZW5ld2FibGUgZW5lcmd5LiBUaGlzIGNvbXBhbnkgd2FzIGZvdW5kZWQgaW4gMTkyNSBhcyB0aGUgRmxvcmlkYSBQb3dlciAmIExpZ2h0IENvbXBhbnkgKEZQTCksIHRoZSBjb21wYW55IGhhcyBncm93biBhbmQgZGl2ZXJzaWZpZWQgb3ZlciB0aGUgeWVhcnMuTmV4dEVyYSBpcyB0aGUgd29ybGQncyBsYXJnZXN0IGdlbmVyYXRvciBvZiByZW5ld2FibGUgZW5lcmd5IGZyb20gdGhlIHdpbmQgYW5kIHN1bi4gSXQgb3BlcmF0ZXMgaW4gMzcgc3RhdGVzIGFuZCBmb3VyIENhbmFkaWFuIHByb3ZpbmNlcy4gVGhpcyBjb21wYW55IGhhcyBiZWVuIGEgbGVhZGVyIGluIHRoZSB0cmFuc2l0aW9uIHRvd2FyZHMgY2xlYW4gZW5lcmd5LiAgDQoNCk92ZXIgdGhlIHllYXJzLCBOZXh0RXJhIEVuZXJneSBoYXMgc2hvd2VkIHN0cm9uZyBmaW5hbmNpYWwgcGVyZm9ybWFuY2UsIHdpdGggY29uc2lzdGVudCBncm93dGggaW4gcmV2ZW51ZXMgYW5kIHByb2ZpdGFiaWxpdHksIG1ha2luZyBpdCBhbiBhdHRyYWN0aXZlIG9wdGlvbiBmb3IgbWFueSBpbnZlc3RvcnMuICANCiAgDQogIA0KIyMjIyBIb3cgaGFzIGJlZW4gdGhlIHN0b2NrIHByaWNlIC8gdmFyaWFibGXigJlzIHBlcmZvcm1hbmNlIGluIHRoZSBsYXN0IHllYXI/ICANCg0KLSBUaGUgbGF0ZXN0IGNsb3Npbmcgc3RvY2sgcHJpY2UgZm9yIE5leHRFcmEgRW5lcmd5IGFzIG9mIEF1Z3VzdCAzMSwgMjAyMyBpcyA2Ni44MC4gIA0KLSBUaGUgYWxsLXRpbWUgaGlnaCBOZXh0RXJhIEVuZXJneSBzdG9jayBjbG9zaW5nIHByaWNlIHdhcyA4OS42NiBvbiBEZWNlbWJlciAzMSwgMjAyMS4gIA0KLSBUaGUgTmV4dEVyYSBFbmVyZ3kgNTItd2VlayBoaWdoIHN0b2NrIHByaWNlIGlzIDkxLjA2LCB3aGljaCBpcyAzNi4zJSBhYm92ZSB0aGUgY3VycmVudCBzaGFyZSBwcmljZS4gIA0KLSBUaGUgTmV4dEVyYSBFbmVyZ3kgNTItd2VlayBsb3cgc3RvY2sgcHJpY2UgaXMgNjYuNjcsIHdoaWNoIGlzIDAuMiUgYmVsb3cgdGhlIGN1cnJlbnQgc2hhcmUgcHJpY2UuICANCi0gVGhlIGF2ZXJhZ2UgTmV4dEVyYSBFbmVyZ3kgc3RvY2sgcHJpY2UgZm9yIHRoZSBsYXN0IDUyIHdlZWtzIGlzIDc3LjIxLiAgDQoNCg0KIyMgTGlicmFyaWVzDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh6b28pDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KHN0YXRzKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkoYXN0c2EpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShBRVIpDQpsaWJyYXJ5KHZhcnMpDQpsaWJyYXJ5KGR5bmxtKQ0KbGlicmFyeShUU3N0dWRpbykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzYXJpbWEpDQpsaWJyYXJ5KGR5Z3JhcGhzKQ0KYGBgDQoNCiMjIFZpc3VhbGl6YXRpb24NCg0KIyMjIFN0b2NrIHByaWNlIGhpc3RvcmljYWwgZGF0YQ0KYGBge3IgdGltZSBzZXJpZXMgcGxvdCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgc2V0dGluZyB0aW1lIHNlcmllcyBmb3JtYXQgDQpORUUkRGF0ZTwtYXMuRGF0ZShORUUkRGF0ZSwiJVktJW0tJWQiKQ0KDQojIERlc2NyaXB0aXZlIHN0YWRpc3RpY3Mgb2YgdGhlIGRlcGVuZGV0IHZhcmlhYmxlIA0Kc3VtbWFyeShORUUkQWRqLkNsb3NlKQ0KDQojIHZpc3VhbGl6aW5nIHRpbWUgc2VyaWVzIGRhdGEgDQojIHRpbWUgc2VyaWVzIHBsb3QgDQpORUV4dHM8LXh0cyhORUUkQWRqLkNsb3NlLG9yZGVyLmJ5PU5FRSREYXRlKQ0KZHlncmFwaChORUV4dHMsIG1haW4gPSAiTmV4dEVyYSBFbmVyZ3kgU3RvY2sgUHJpY2UiKSAlPiUgDQogIGR5T3B0aW9ucyhjb2xvcnMgPSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNCwgIkRhcmsyIikpICU+JQ0KICBkeVNoYWRpbmcoZnJvbSA9ICIyMDE5LTEtNyIsDQogICAgICAgICAgICB0byA9ICIyMDIyLTEyLTI2IiwgDQogICAgICAgICAgICBjb2xvciA9ICIjRkZFNkU2IikNCmBgYA0KDQojIyMgRGVjb21wb3NhdGlvbiBvZiB0aW1lIHNlcmllcw0KYGBge3IgRGVjb21wb3NlLCB3YXJuaW5nPUZBTFNFfQ0KIyBEZWNvbXBvc2UgYSB0aW1lIHNlcmllcw0KIyAxKSBvYnNlcnZlZDogZGF0YSBvYnNlcnZhdGlvbnMgDQojIDIpIHRyZW5kOiBpbmNyZWFzaW5nIC8gZGVjcmVhc2luZyB2YWx1ZSBvZiBkYXRhIG9ic2VydmF0aW9ucw0KIyAzKSBzZWFzb25hbGl0eTogcmVwZWF0aW5nIHNob3J0LXRlcm0gY3ljbGUgaW4gdGltZSBzZXJpZXMgDQojIDQpIG5vaXNlOiByYW5kb20gdmFyaWF0aW9uIGluIHRpbWUgc2VyaWVzIA0KTkVFdHM8LXRzKE5FRSRBZGouQ2xvc2UsZnJlcXVlbmN5PTUyLHN0YXJ0PWMoMjAxNSwxKSkNCk5FRV90c19kZWNvbXBvc2U8LWRlY29tcG9zZShORUV0cykNCnBsb3QoTkVFX3RzX2RlY29tcG9zZSkgICAgICANCmBgYA0KDQojIyMjIERvIHRoZSB0aW1lIHNlcmllcyBkYXRhIHNob3cgYSB0cmVuZD8gICAgDQpCYXNlZCBvbiB0aGUgZ3JhcGgsIGl0IGlzIHBvc3NpYmxlIHRvIHNlZSBhIHBvc2l0aXZlIHRyZW5kIGFjY29yZGluZyB0byB0aGUgcGVyaW9kcyBmcm9tIDIwMTUgdG8gbWlkLTIwMjIsIHRoaXMgdGVsbHMgdXMgdGhhdCB0aGUgc3RvY2sgaGFkIGEgZ29vZCBwZXJmb3JtYW5jZSBvdmVyIHRpbWUgc2luY2UsIHVubGlrZSBlYWNoIHllYXIsIGl0cyBpbmNyZWFzZSB3YXMgbWFpbnRhaW5lZCwgZm9yIGl0IHNob3dzIHVzIGEgcG9zaXRpdmUgdHJlbmQgYmVoYXZpb3IuICANCg0KIyMjIyBEbyB0aGUgdGltZSBzZXJpZXMgZGF0YSBzaG93IHNlYXNvbmFsaXR5PyBIb3cgaXMgdGhlIGNoYW5nZSBvZiB0aGUgc2Vhc29uYWwgY29tcG9uZW50IG92ZXIgdGltZT8gICAgDQpBdCBmaXJzdCBnbGFuY2UgaXQgaXMgcG9zc2libGUgdG8gaWRlbnRpZnkgdGhlIHNlYXNvbmFsaXR5LCBpdCBpcyBwb3NzaWJsZSB0byBzZWUgdGhhdCB0aGUgYWN0aW9uIGZvbGxvd3MgYSBjb25zdGFudCBwYXR0ZXJuIG92ZXIgdGltZSwgYXQgdGhlIGJlZ2lubmluZyBvZiAyMDE1IGl0IGlzIG9ic2VydmVkIHRoYXQgdGhlIGFjdGlvbiBkZWNyZWFzZXMgZHJhc3RpY2FsbHkgaW4gdGhlIG1pZGRsZSBvZiB0aGUgeWVhciwgYnV0IGVuZHMgd2l0aCBhIGhpZ2ggcGVhay4gV2l0aCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQsIHdlIGNhbiBpbmZlciB0aGF0IHRoaXMgcGF0dGVybiB3aWxsIGhhcHBlbiBhZ2FpbiBzaW5jZSBpdCB0ZW5kcyB0byBzdGFydCBhdCB0aGUgdG9wIGFuZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB5ZWFyIGl0IGhhcyBhIGRyYXN0aWMgZGVjcmVhc2UgYW5kIGJ5IHRoZSBlbmQgb2YgdGhlIHBlcmlvZCBpdCBpbmNyZWFzZXMgZHJhc3RpY2FsbHkuICANCg0KIyMgRXN0aW1hdGlvbg0KDQojIyMgU3RhdGlvbmFyeQ0KYGBge3IgU3RhdGlvbmFyeSB0ZXN0LCB3YXJuaW5nPUZBTFNFfQ0KIyBTdGF0aW9uYXJ5IFRlc3QgDQojIEgwOiBOb24tc3RhdGlvbmFyeSBhbmQgSEE6IFN0YXRpb25hcnkuIHAtdmFsdWVzIDwgMC4wNSByZWplY3QgdGhlIEgwLg0KYWRmLnRlc3QoTkVFJEFkai5DbG9zZSkNCiMgUC1WYWx1ZSA+IDAuMDUuIEZhaWwgdG8gcmVqZWN0IHRoZSBIMC4gVGhlIHRpbWUgc2VyaWVzIGRhdGEgaXMgbm9uLXN0YXRpb25hcnkuIA0KYGBgDQoNCiMjIyBTZXJpYWwgYXV0b2NvcnJlbGF0aW9uDQpgYGB7cn0NCiMgU2VyaWFsIEF1dG9jb3JyZWxhdGlvbg0KYWNmKE5FRSRBZGouQ2xvc2UsbWFpbj0iU2lnbmlmaWNhbnQgQXV0b2NvcnJlbGF0aW9ucyIpDQojIFRoZXJlIGlzIGhpZ2ggc2VyaWFsIGF1dG9jb3JyZWxhdGlvbiBkZXNwaXRlIHRoZSBudW1iZXIgb2YgbGFncyBvZiB0aGUgdmFyaWFibGUNCmBgYA0KDQoNCiMjIyBNb2RlbHMgDQoNCiMjIyMgTW9kZWwgMSAtIEFSTUEobG9nKQ0KYGBge3J9DQpzdW1tYXJ5KE5FRV9BUk1BPC1hcm1hKGxvZyhORUUkQWRqLkNsb3NlKSxvcmRlcj1jKDEsMSkpKSAjIFRyYW5zZm9ybWluZyBpbnRvIGxvZyB0byBoYXZpbmcgYSBzdGF0aW9uYXJ5IHRpbWUgc2VyaWVzDQpORUVfZXN0aW1hdGVkX3N0b2NrX3ByaWNlPC1leHAoTkVFX0FSTUEkZml0dGVkLnZhbHVlcykgIyBBcHBseWluZyBleHAgdG8gbWFrZSBpbnRlcnByZXRhdGlvbnMgb24gcmVhbCBudW1iZXJzDQpwbG90KE5FRV9lc3RpbWF0ZWRfc3RvY2tfcHJpY2UpDQpgYGANCg0KIyMjIyBNb2RlbCAyIC0gQVJJTUENCmBgYHtyfQ0KTkVFX0FSSU1BIDwtIEFyaW1hKE5FRSRBZGouQ2xvc2Usb3JkZXI9YygxLDEsMSkpDQpwcmludChORUVfQVJJTUEpDQpwbG90KE5FRV9BUklNQSRmaXR0ZWQpDQpgYGANCg0KIyMjIyBNb2RlbCAzIC0gQVJpTUEobG9nKQ0KYGBge3J9DQp0c21vZGVsID0gQXJpbWEobG9nKE5FRSRBZGouQ2xvc2UpLG9yZGVyPWMoMSwxLDEpKSMgVHJhbnNmb3JtaW5nIGludG8gbG9nIHRvIGhhdmluZyBhIHN0YXRpb25hcnkgdGltZSBzZXJpZXMNCnByaW50KHRzbW9kZWwpDQoNCmNvbmZpbnQodHNtb2RlbCkNCg0KcGxvdChleHAodHNtb2RlbCRmaXR0ZWQpKSMgQXBwbHlpbmcgZXhwIHRvIG1ha2UgaW50ZXJwcmV0YXRpb25zIG9uIHJlYWwgbnVtYmVycw0KYGBgDQoNCiMjIEV2YWx1YXRpb24NCg0KVGVzdGluZyBzZXJpYWwgYXV0b2NvcnJlbGF0aW9uIGluIHJlZ3Jlc3Npb24gcmVzaWR1YWxzICAgDQpIbzogVGhlcmUgaXMgbm8gc2VyaWFsIGF1dG9jb3JyZWxhdGlvbiAgIA0KSGE6IFRoZXJlIGlzIHNlcmlhbCBhdXRvY29ycmVsYXRpb24gIA0KDQojIyMjIE1vZGVsIDEgLSBBUk1BKGxvZykNCmBgYHtyfQ0KTkVFX0FSTUFfcmVzaWR1YWxzPC1ORUVfQVJNQSRyZXNpZHVhbHMNCkJveC50ZXN0KE5FRV9BUk1BX3Jlc2lkdWFscyxsYWc9NSx0eXBlPSJManVuZy1Cb3giKSANCiMgUmVqZWN0IHRoZSBIby4gUC12YWx1ZSBpcyA8IDAuMDUgaW5kaWNhdGluZyB0aGF0IEFSTUEgTW9kZWwgZG9lcyBzaG93IHJlc2lkdWFsIHNlcmlhbCBhdXRvY29ycmVsYXRpb24uIA0KDQphZGYudGVzdChuYS5vbWl0KE5FRV9lc3RpbWF0ZWRfc3RvY2tfcHJpY2UpKQ0KIyBBREYgdGVzdCBzdWdnZXN0IHRoYXQgQVJNQSByZXNpZHVhbHMgYXJlIHN0YXRpb25hcnkgc2luY2UgcC12YWx1ZSBpcyA8IDAuMDUuIA0KYGBgDQoNCiMjIyMgTW9kZWwgMiAtIEFSSU1BDQpgYGB7cn0NCmFjZihORUVfQVJJTUEkcmVzaWR1YWxzLG1haW49IkFDRiAtIEFSSU1BICgxLDEsMSkiKSAgICAgICAgICAgICAgICANCiMgQUNGIHBsb3QgZGlzcGxheXMgd2VhayBvciBubyBhdXRvY29ycmVsYXRpb24uIA0KDQpCb3gudGVzdChORUVfQVJJTUEkcmVzaWR1YWxzLGxhZz0zLHR5cGU9IkxqdW5nLUJveCIpICAgICAgICAgICAgICAgDQojIFAtdmFsdWUgaXMgPiAwLjA1IGluZGljYXRpbmcgdGhhdCBBUk1BIG1vZGVsIGRvZXMgbm90IHNob3cgcmVzaWR1YWwgc2VyaWFsIGF1dG9jb3JyZWxhdGlvbi4gDQoNCmFkZi50ZXN0KE5FRV9BUklNQSRyZXNpZHVhbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgQURGIHRlc3Qgc3VnZ2VzdCB0aGF0IEFSSU1BIHJlc2lkdWFscyBhcmUgc3RhdGlvbmFyeSBzaW5jZSBwLXZhbHVlIGlzIDwgMC4wNS4gDQoNCmBgYA0KDQojIyMjIE1vZGVsIDMgLSBBUklNQShsb2cpDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KIA0KYWNmKHRzbW9kZWwkcmVzaWR1YWxzLG1haW49IkFDRiAtIEFSSU1BICgxLDEsMSkiKSANCiMgQUNGIHBsb3QgZGlzcGxheXMgd2VhayBvciBubyBhdXRvY29ycmVsYXRpb24uDQoNCkJveC50ZXN0KHRzbW9kZWwkcmVzaWR1YWxzLGxhZz0zLHR5cGU9IkxqdW5nLUJveCIpDQojIFAtdmFsdWUgaXMgPiAwLjA1IGluZGljYXRpbmcgdGhhdCBBUk1BIG1vZGVsIGRvZXMgbm90IHNob3cgcmVzaWR1YWwgc2VyaWFsIGF1dG9jb3JyZWxhdGlvbi4NCg0KYWRmLnRlc3QodHNtb2RlbCRyZXNpZHVhbHMpIA0KIyBBREYgdGVzdCBzdWdnZXN0IHRoYXQgQVJNQSByZXNpZHVhbHMgYXJlIHN0YXRpb25hcnkgc2luY2UgcC12YWx1ZSBpcyA8IDAuMDUuIA0KYGBgDQoNCiMjIyBTZWxlY3RlZCBNb2RlbA0KVG8gZGVjaWRlIG91ciB3aW5uaW5nIG1vZGVsIHdlIGNvbXBhcmVkIEFJQyBmcm9tIHRoZSBBUk1BIGFuZCBBUklNQSBtb2RlbHMuIEluIG91ciBtb2RlbCB5b3UgY2FuIHNlZSBhIG1pbmltYWwgZGlmZmVyZW5jZSB3aGVyZSB0aGUgQVJNQSBpcyBiZXR0ZXIsIGhhcyB0aGUgbG93ZXIgQUlDLiAgDQoNCkl0IHNob3VsZCBiZSBtZW50aW9uZWQgdGhhdCBvdXIgdGltZSBzZXJpZXMgaXMgTk9UIHN0YXRpb25hcnksIGhvd2V2ZXIgd2UgbmVlZCBvdXIgdGltZSBzZXJpZXMgdG8gYmUgc3RhdGlvbmFyeSBpbiBvcmRlciB0byBnZXQgdGhlIGJlc3QgbW9kZWwuIFdoZW4gb3VyIHNlcmllcyBpcyBub3Qgc3RhdGlvbmFyeSBhcyB3YXMgdGhlIGNhc2UsIHRoZSBBUklNQSBtb2RlbCBzaG91bGQgYmUgdXNlZC4gICANCg0KVXNpbmcgdGhlIGRpYWdub3N0aWMgdGVzdHMgb2YgYm90aCBtb2RlbHMgeW91IGNhbiBzZWUgaWYgdGhlcmUgaXMgc3RhdGlvbmVyeSBpbiB0aGUgcmVzaWR1ZXMgb2YgYm90aCBtb2RlbHMuIEluIHRoZSByZXNpZHVhbHMgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIG5vIHNlcmlhbCBhdXRvY29ycmVsYXRpb24gaW4gdGhlIEFSSU1BIChzbyB0aGUgZGlmZmVyZW5jZSB0cmFuc2Zvcm1hdGlvbnMgd2VyZSBhcHBsaWVkKSBhbmQgdGhlIEFSTUEgbW9kZWwgaWYgdGhlcmUuICAgDQoNClVuZGVyIHRoZSBhYm92ZSBjb250ZXh0IG91ciB3aW5uaW5nIG1vZGVsIGlzIEFSSU1BKE1vZGVsIDMpLiAgDQoNCiMjIEZvcmVjYXN0DQpgYGB7cn0NCnRlbXBfZm9yZWNhc3Q8LWF1dG9wbG90KGZvcmVjYXN0KGV4cCh0c21vZGVsJGZpdHRlZCkpKQ0KcGxvdCh0ZW1wX2ZvcmVjYXN0KQ0KDQpmb3JlY2FzdChleHAodHNtb2RlbCRmaXR0ZWQpLGg9NSkNCmBgYA0KDQojIyMjIEludGVycHJldGluZyBSZXN1bHRzDQoNCmEuIEFSTUEobG9nKSByZWdyZXNzaW9uIHJlc3VsdHMgKEFJQz0tMTY3Ni4yMSkgc2hvd3MgYmV0dGVyIHBlcmZvcm1hbmNlIHRoYW4gQVJJTUEobG9nKSByZXN1bHRzIChBSUM9LTE2NzIuNDIpICANCmIuIEJvdGggQVJNQSBhbmQgQVJJTUEgcmVzdWx0cyBzdWdnZXN0IHRoYXQgcmVzaWR1YWxzIGFyZSBzdGF0aW9uYXJ5DQpjLiBBUklNQSByZXN1bHRzIHN1Z2dlc3QgdGhhdCB0aGVyZSBpcyBubyBzZXJpYWwgYXV0b2NvcnJlbGF0aW9uIGluIHRoZSByZXNpZHVhbHMsIG9uIHRoZSBvdGhlciBoYW5kLCBpbiB0aGUgQVJNQSBtb2RlbCBpdCBpcyBmb3VuZA0KZC4gVGhlIGZvcmVjYXN0IGZvciB0aGUgbmV4dCA1IHBlcmlvZHMgaXMgZm9yIGFuIGluY3JlYXNlIHRoZSBOZXh0RXJhIEVuZXJneSBzdG9jayBwcmljZS4NCg0KDQojIyBSZWZlcmVuY2VzDQrigJxOZXh0RXJhIEVuZXJneSAtIDQwIFllYXIgU3RvY2sgUHJpY2UgSGlzdG9yeSB8IE5FRS7igJ0gKEF1Z3VzdCAzMXN0IDIwMjMpIFd3dy5tYWNyb3RyZW5kcy5uZXQsIHd3dy5tYWNyb3RyZW5kcy5uZXQvc3RvY2tzL2NoYXJ0cy9ORUUvbmV4dGVyYS1lbmVyZ3kvc3RvY2stcHJpY2UtaGlzdG9yeS4gIA==