I. Introduction

Briefly describe what is time series analysis.

According to TIBCO “Time series analysis is a technique in statistics that deals with time series data and trend analysis, it follows periodic time intervals that have been measured in regular time intervals or have been collected in particular time intervals.”It is an analysis that, through a specific period of time, seeks to know the sequence of data points collected during a time interval. What distinguishes time series data from other data is that the analysis can show how variables change over time, which tells us that time plays a big role as they show us how data is attached over time. of your result. Thus providing us with additional information and creating an order between the data. It should be noted that it is a vital tool for statistics and data analysis since it can be used in a wide variety of fields, such as finance, meteorology, economics, among others.

II. Background

What are the latest trends of Nearshoring in Mexico? Please cite at least 1 external reference to develop your explanation. Complementing evidence 1, the topic of nearshoring is becoming more and more popular as companies look for new ways to innovate their sunmsintras chains and implement distribution centers in profitable locations, one of the advantages of nearshoring are cost savings, speed to market and quality control. Nearshoring is boosting job creation and the Mexican and US economy, particularly in the manufacturing, financial and IT sectors. learning. (Abdel Haisam, 2023) In my opinion digital transformation is an upcoming opportunity that focusing on starting the digital presence and capability of the company with a digital infrastructure, IT and AI are becoming a fast growing trend on the rise for company in the United States and China and many other countries.

III. Description of the Problem Situation

What is the problem situation? How to address the problem situation? There’s many factors to take into consideration when answering these questions, but in my opinion these questions seek to answer Maria concerns and questions by analyzing the data through the definition of Econometrics. The problem situation will be that due the activity of China and the war on trade with the United states, also the active war with Russia and Ukraine, Maria wants to find another country were is attractive and offers innovation and development seeking alternatives third option for country, Maria came across Mexico and found out about its potential of production and recent investment like Tesla, investment 10 billion dollars to create a production center. This event and many others have popped up the question regarding all the factors, and know if Mexico is a good country to implement a near-shoring strategy due to its proximity with the United States market.

The aim is to have a model to predict the events base on time series, so we can know how the behavior over time has impact the variables and estimates if entering the Mexican laboral production market is a good idea according to the variable dependent on “IED_MXN”, since it is a way of measuring whether nearshoring is occurring in the country, to add to this showing the time series format, adding an ARMA and ARIMA model and lastly a VAR model that this will help us forecast when using multiple time series variables estimating single regression model, the estimation of the VAR regression model is y OLS.

IV. Data and Methodology

Libraries

#Installing libraries
library(readxl)
library(tidyverse)
library(ggplot2)
library(corrplot)
library(gmodels)
library(effects)
library(stargazer)
library(olsrr)        
#library(kableExtra)
library(jtools)
library(fastmap)
library(Hmisc)
library(naniar)
library(glmnet)
library(caret)
library(car)
library(lmtest)
library(dplyr)
library(xts)
library(zoo)
library(tseries)
library(stats)
library(forecast)
library(astsa)
library(corrplot)
library(AER)
library(dynlm)
library(vars)
#library(mFilter)
library(TSstudio)
library(tidyverse)
library(sarima)
library(stargazer)
library(forecast)
bd <-read.csv("C:\\Users\\sebastian\\Downloads\\SP_SeriesTiempo.csv")
bd1<- read.csv("C:\\Users\\sebastian\\Downloads\\sp_data.csv")
  • Briefly describe the dataset’s selected variables

This time series file of the variable “FDI_flows” has values from quarterly periods of a data set that records the evolution of Foreign Direct Investment (FDI). The variable “FDI_flows” generally refers to the amount of money that enters or is sold from the country as foreign direct investment in a specific quarter, which is used to evaluate near shoring in Mexico. The periods are broken down on a quarterly basis, a conversion of each year has 4 quarters.

  • Plot the variable IED_Flujos using a time series format:
# setting time series format 
bd$date <- as.yearmon(bd$periodo, format="%m/%d/%Y")

IEDF <-ts(bd$IED_Flujos,frequency=4,start=c(1999,1))

# Descriptive stadistics of the dependet variable 
summary(bd$IED_Flujos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1341    4351    6238    7036    8053   22794
plot(bd$date, bd$IED_Flujos, type="l", col="red", lwd=2, xlab="Time Period", ylab="Stock price", main="IED flujos Trimestral")

In this graph we can see the behavior of FDI_Flows on a quarterly basis from 1999 to 2023.

  1. decompose the time series data into trend, seasonal, and random components.
# 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
flujo_time<-decompose(IEDF)
plot(flujo_time)

Briefly, describe the decomposition time series plot.

Do the time series data show a trend?

Based on the we can see that it is possible to see a trend with a lot of volatility since in the periods we can see how it rises and falls drastically, as the periods we can see that during the quarters it has very high and low peaks. At a far away look we can infer that has a positive trend, from the moment it started to the end date, obviously theirs high and lows but if we see from behind we can see that over time in average it has gone up since it firs quarter, also there’s drastically increase in late 2014s, then it goes down and remains in some way constant.

Do the time series data show seasonality?

As we are observing a trimester period, the graph is very detailed, since over time we can see some high and very low peaks, this high pattern stands out throughout the year, since the graph has the same behavior over time, which at first glance can be seen to be stationary, over time this pattern remains constant.

  1. detect the presence of stationary
# Stationary Test 
# H0: Non-stationary and HA: Stationary. p-values < 0.05 reject the H0.
adf.test(bd$IED_Flujos)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  bd$IED_Flujos
## Dickey-Fuller = -4.1994, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
# p-values < 0.05 reject the H0.The time series data is stationary. 
  1. detect the presence of serial autocorrelation
# Serial Autocorrelation
acf(bd$IED_Flujos,main="Significant Autocorrelations")

# There is not much serial autocorrelation despite the number of lags of the variable

V. Time Series Regression Analysis

a. Time Series Model 1 - Estimate 2 different time series regression models. You might want to consider ARMA (p,q) and / or ARIMA (p,d,q).

plot(bd$date,bd$IED_Flujos,type="l",col="blue",lwd=2,xlab="Time Period",ylab="IED_Flujos",main="IED_Flujos")

plot(bd$date,log(bd$IED_Flujos),type="l",col="red",lwd=2,xlab="Time Period",ylab="IED_Flujos",main="IED_Flujos")

plot(diff(log(bd$IED_Flujos)),type="l",ylab="first order difference",main = "Differences IED_Flujos")

adf.test(log(bd$IED_Flujos))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  log(bd$IED_Flujos)
## Dickey-Fuller = -3.7217, Lag order = 4, p-value = 0.02635
## alternative hypothesis: stationary
# # The p value of 0.02635 is smaller than 0.05, which this means we reject H0, stationary
adf.test(diff(log(bd$IED_Flujos)))
## Warning in adf.test(diff(log(bd$IED_Flujos))): p-value smaller than printed
## p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(log(bd$IED_Flujos))
## Dickey-Fuller = -5.9411, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
## p value is 0.01 is less than 0.05 which means we reject H0, meaning it is stationary.

Models

# Model 2 ARIMA 1
IED_ARIMA <- Arima(log(bd$IED_Flujos), order = c(2, 1, 1))
print(IED_ARIMA)
## Series: log(bd$IED_Flujos) 
## ARIMA(2,1,1) 
## 
## Coefficients:
##          ar1     ar2      ma1
##       0.0012  -0.415  -0.8601
## s.e.  0.1056   0.102   0.0708
## 
## sigma^2 = 0.246:  log likelihood = -67.79
## AIC=143.59   AICc=144.03   BIC=153.8
# plot model arima
plot(IED_ARIMA$residuals, main = "ARIMA(2,1,1) - IED Flujos")

acf(IED_ARIMA$residuals, main = "ACF - ARIMA 2,1,1") 

Box.test(IED_ARIMA$residuals, lag = 1, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  IED_ARIMA$residuals
## X-squared = 0.14398, df = 1, p-value = 0.7044
adf.test(IED_ARIMA$residuals)
## Warning in adf.test(IED_ARIMA$residuals): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  IED_ARIMA$residuals
## Dickey-Fuller = -4.646, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
# p value 0.01 is less than 0.05, meaning is stationary.
# Model 2 ARIMA2
IED_ARIMA2 <- Arima(bd$IED_Flujos, order = c(0, 1, 2))
print(IED_ARIMA2)
## Series: bd$IED_Flujos 
## ARIMA(0,1,2) 
## 
## Coefficients:
##           ma1     ma2
##       -1.0896  0.1489
## s.e.   0.1718  0.1724
## 
## sigma^2 = 15775204:  log likelihood = -922.22
## AIC=1850.44   AICc=1850.71   BIC=1858.11
#Plot model
plot(IED_ARIMA2$residuals, main = "ARIMA(0,1,2) - IED Flujos")

acf(IED_ARIMA2$residuals, main = "ACF - ARIMA (0,1,2) ")

Box.test(IED_ARIMA2$residuals, lag = 1, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  IED_ARIMA2$residuals
## X-squared = 0.0083572, df = 1, p-value = 0.9272
adf.test(IED_ARIMA2$residuals)
## Warning in adf.test(IED_ARIMA2$residuals): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  IED_ARIMA2$residuals
## Dickey-Fuller = -4.4229, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
# our p value is less than 0.05, meaning its stationary 
# Model 3 ARMA
summary(IED_ARMA<-arma(log(bd$IED_Flujos),order=c(1,1)))
## 
## Call:
## arma(x = log(bd$IED_Flujos), order = c(1, 1))
## 
## Model:
## ARMA(1,1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.41237 -0.35244 -0.00571  0.27709  1.50759 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1         -0.2976      0.2271   -1.310  0.19003    
## ma1          0.5173      0.1999    2.588  0.00967 ** 
## intercept   11.3149      1.9794    5.716 1.09e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 0.2688,  Conditional Sum-of-Squares = 25.26,  AIC = 152.3
# plot model
# plot(IED_ARMA)
# se tarda mucho en mostrar las graficas
IED_estimated<-exp(IED_ARMA$fitted.values)
plot(IED_estimated)

IED_ARMA_residuales<- IED_ARMA$residuals
Box.test(IED_ARMA_residuales,lag=5,type="Ljung-Box") 
## 
##  Box-Ljung test
## 
## data:  IED_ARMA_residuales
## X-squared = 13.689, df = 5, p-value = 0.01771
# p-value is > 0.05 indicating that ARMA Model does show residual serial autocorrelation.
IED_ARMA$residuals <- na.omit(IED_ARMA$residuals)
adf.test(IED_ARMA$residuals)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  IED_ARMA$residuals
## Dickey-Fuller = -3.644, Lag order = 4, p-value = 0.03336
## alternative hypothesis: stationary
#Show summary
summary(IED_ARMA)
## 
## Call:
## arma(x = log(bd$IED_Flujos), order = c(1, 1))
## 
## Model:
## ARMA(1,1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.41237 -0.35244 -0.00571  0.27709  1.50759 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1         -0.2976      0.2271   -1.310  0.19003    
## ma1          0.5173      0.1999    2.588  0.00967 ** 
## intercept   11.3149      1.9794    5.716 1.09e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 0.2688,  Conditional Sum-of-Squares = 25.26,  AIC = 152.3
summary(IED_ARMA)
## 
## Call:
## arma(x = log(bd$IED_Flujos), order = c(1, 1))
## 
## Model:
## ARMA(1,1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.41237 -0.35244 -0.00571  0.27709  1.50759 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1         -0.2976      0.2271   -1.310  0.19003    
## ma1          0.5173      0.1999    2.588  0.00967 ** 
## intercept   11.3149      1.9794    5.716 1.09e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 0.2688,  Conditional Sum-of-Squares = 25.26,  AIC = 152.3
## The p-value of Ljung box is  0.01771  this havng a  grader result than 0.05, means that it does not have serial autocorrelation. ADF is telling us that ARMA is stationary since the p-value is 0.01 and its lower than 0.05.
  • Based on diagnostic tests, compare the 3 estimated time series regression models, and select the results that you consider might generate the best forecast.
# model 1
AIC(IED_ARIMA)
## [1] 143.5873
# Arima 1
f_arima1<- fitted(IED_ARIMA)
r_arima1 <- sqrt(mean((f_arima1 - bd$IED_Flujos)^2))
print(r_arima1)
## [1] 8065.557
# model 2
AIC(IED_ARIMA2)
## [1] 1850.445
fvalues_arima2 <- fitted(IED_ARIMA2)
R_ARIMA2 <- sqrt(mean((fvalues_arima2 - bd$IED_Flujos)^2))
print(R_ARIMA2)
## [1] 3909.249
# Forecast ARMA
ARMA <- arima(log(bd$IED_Flujos), order = c(1, 0, 1))
AICAA <- AIC(ARMA)
AICAA
## [1] 152.6035
ARMA <- arima(log(bd$IED_Flujos), order = c(1, 0, 1))
residuales_arma <- ARMA$residuals
r_arma <- sqrt(mean((log(bd$IED_Flujos) - residuales_arma)^2))
print(r_arma)
## [1] 8.721015
#AIC evaluation

AIC(IED_ARIMA)
## [1] 143.5873
#
AIC(IED_ARIMA2)
## [1] 1850.445
AICAA
## [1] 152.6035

Through the evaluation, 3 proposed models were analyzed, for the ARMA model the least AIC was -152.60 and in addition there were low RMSE values, these tell us that the model fits the information in a more precise way. With this model and information we generate a projection of the forecast 5 years into the future.

  • By using the selected model, make a forecast for the next 5 periods. In doing so, include a time series plot showing your forecast.
IED_Model_forecast<-forecast(IED_estimated,h=5)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
IED_Model_forecast
##     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
##  97       6188.802 5222.402 7155.202 4710.821 7666.783
##  98       6188.802 5222.402 7155.202 4710.821 7666.783
##  99       6188.802 5222.402 7155.202 4710.821 7666.783
## 100       6188.802 5222.402 7155.202 4710.821 7666.783
## 101       6188.802 5222.402 7155.202 4710.821 7666.783
plot(IED_Model_forecast)

autoplot(IED_Model_forecast)

b. Time Series Model 2 From the time series dataset, select the explanatory variables that might explain the Nearshoring in Mexico.

  1. Education: The quality and access to teaching and learning in a society. It can be measured by indicators such as the level of education achieved by the population, the literacy rate, etc. Education is essential for the development of a society, since it influences economic growth.

  2. Innovation: Is the process of creating and applying new ideas, products or methods to improve and advance in different areas, from technology to the economy. It involves creativity, development, implementation and seeks to have a positive impact.

  3. Exchange rate: The value of one currency with respect to another. It can be fixed or floating, depending on whether exchange rates are determined by the market or by government intervention.

  4. Exportation: Refer to goods and services produced in a country and sold to other countries. These sales may include manufactured products, raw materials, technological services, among others.

  • In describing the above relationships, please include a time series plot that displays the selected variables’ performance over the time period.
# 1 educacion
ggplot(bd1, aes(x = periodo, y = Educacion)) + 
  geom_line(color = "purple") + 
  labs(title = "Time Series of Educacion", 
       x = "Date", 
       y = "Educacion") + 
  theme_minimal()
## Warning: Removed 3 rows containing missing values (`geom_line()`).

ggplot(bd1, aes(x = periodo, y = Innovacion)) + 
  geom_line(color = "blue") + 
  labs(title = "Time Series of Innovacion", 
       x = "Date", 
       y = "Innovacion") + 
  theme_minimal()
## Warning: Removed 2 rows containing missing values (`geom_line()`).

ggplot(bd1, aes(x = periodo, y = Tipo_de_Cambio)) + 
  geom_line(color = "green") + 
  labs(title = "Time Series of Exchange rate", 
       x = "Date", 
       y = "Tipo de Cambio") + 
  theme_minimal()

ggplot(bd1, aes(x = periodo, y = Exportaciones)) + 
  geom_line(color = "orange") + 
  labs(title = "Time Series of Exportaciones", 
       x = "Date", 
       y = "Exportaciones") + 
  theme_minimal()

ggplot(bd1, aes(x = periodo, y = Salario_Diario)) + 
  geom_line(color = "purple") + 
  labs(title = "Time Series of Salario Diario", 
       x = "Date", 
       y = "Salario Diario") + 
  theme_minimal()

ggplot(bd1, aes(x = periodo, y = Inseguridad_Homicidio)) + 
  geom_line(color = "red") + 
  labs(title = "Time Series of Inseguridad_Homicidio", 
       x = "Date", 
       y = "Inseguridad_Homicidio") + 
  theme_minimal()
## Warning: Removed 1 row containing missing values (`geom_line()`).

Describe the hypothetical relationship / impact between each selected factor and the dependent variable IED_Flujos. For example, how does the exchange rate increase / reduce the foreign direct investment flows in Mexico?

We can see at first glance that we can positive and negatives variables, our positive variables that have a good influence on nearshoring in mexico is, educaction, exchange rate, exportation, daily wage and our negative impact variables our the rate of homicide and insecurity, and in some way innovation because in the graph we can see that it decreases.

The variables with the greatest impact on IED_MXN were Education, had a significance of 1%, and Insecurity due to Homicide, with a statistical significance of 5%. And for one unit of the coefficient “Inseguridad_Homicidio” the dependent variable is estimated to decrease by approximately 0.0221

The coefficient for “Education” tells us that for one unit it increases in education, the dependent variable increases by 0.3271 units approximately, For “Tipo_de_Cambio” is approximately 0.0345, indicating that a positive change in the exchange rate is associated with an estimated increase of approximately 0.0345 units in the dependent variable. And for “Salario_Diario” , for each unit it increases the dependent variable is estimated to increase by 0.0006 units but it will have a slightly small effect.

  • Estimate a VAR_Model that includes at least 1 explanatory factor that might affect the dependent variable IED_Flujos.
for(column in names(bd1)) {
  if(is.numeric(bd1[[column]])) {
    bd1[[column]][is.na(bd1[[column]])] <- median(bd1[[column]], na.rm = TRUE)
  }
}
adf.test(bd1$IED_Flujos) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  bd1$IED_Flujos
## Dickey-Fuller = -3.0832, Lag order = 2, p-value = 0.1597
## alternative hypothesis: stationary
VAR <- cbind(bd1$IED_Flujos, bd1$PIB_Per_Capita, bd1$Tipo_de_Cambio)


lag_select<-VARselect(VAR,lag.max=5,type="const", season=52) 
lag_select$selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      1      1      1      1
lag_select$criteria
##           1    2    3    4    5
## AIC(n) -Inf -Inf -Inf -Inf -Inf
## HQ(n)  -Inf -Inf -Inf -Inf -Inf
## SC(n)  -Inf -Inf -Inf -Inf -Inf
## FPE(n)    0    0    0    0    0
d_IED<-diff(bd1$IED_Flujos)
d_GDP<-diff(bd1$PIB_Per_Capita)
d_Exchange<-diff(bd1$Tipo_de_Cambio)

VAR_ld<- cbind(d_IED, d_GDP, d_Exchange)
colnames(VAR_ld)<-cbind("IED","GDP","Exchange rate")
VAR_m1<-VAR(VAR_ld,p=1,type="const",season=NULL,exog=NULL) 
summary(VAR_m1)
## 
## VAR Estimation Results:
## ========================= 
## Endogenous variables: IED, GDP, Exchange.rate 
## Deterministic variables: const 
## Sample size: 24 
## Log Likelihood: -504.546 
## Roots of the characteristic polynomial:
## 0.3893 0.3421 0.2301
## Call:
## VAR(y = VAR_ld, p = 1, type = "const", exogen = NULL)
## 
## 
## Estimation results for equation IED: 
## ==================================== 
## IED = IED.l1 + GDP.l1 + Exchange.rate.l1 + const 
## 
##                    Estimate Std. Error t value Pr(>|t|)    
## IED.l1              -0.7119     0.1733  -4.107 0.000548 ***
## GDP.l1               0.8930     0.5135   1.739 0.097380 .  
## Exchange.rate.l1 -3124.8934  1202.0980  -2.600 0.017144 *  
## const             2792.4588  1566.8882   1.782 0.089911 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 6844 on 20 degrees of freedom
## Multiple R-Squared: 0.489,   Adjusted R-squared: 0.4124 
## F-statistic:  6.38 on 3 and 20 DF,  p-value: 0.003284 
## 
## 
## Estimation results for equation GDP: 
## ==================================== 
## GDP = IED.l1 + GDP.l1 + Exchange.rate.l1 + const 
## 
##                   Estimate Std. Error t value Pr(>|t|)
## IED.l1            -0.04424    0.07501  -0.590    0.562
## GDP.l1             0.36042    0.22220   1.622    0.120
## Exchange.rate.l1  -5.24003  520.20423  -0.010    0.992
## const            647.20008  678.06610   0.954    0.351
## 
## 
## Residual standard error: 2962 on 20 degrees of freedom
## Multiple R-Squared: 0.1195,  Adjusted R-squared: -0.01258 
## F-statistic: 0.9047 on 3 and 20 DF,  p-value: 0.4563 
## 
## 
## Estimation results for equation Exchange.rate: 
## ============================================== 
## Exchange.rate = IED.l1 + GDP.l1 + Exchange.rate.l1 + const 
## 
##                   Estimate Std. Error t value Pr(>|t|)
## IED.l1           3.862e-05  3.286e-05   1.175    0.254
## GDP.l1           2.543e-05  9.734e-05   0.261    0.797
## Exchange.rate.l1 7.416e-02  2.279e-01   0.325    0.748
## const            3.087e-01  2.970e-01   1.039    0.311
## 
## 
## Residual standard error: 1.297 on 20 degrees of freedom
## Multiple R-Squared: 0.07951, Adjusted R-squared: -0.05856 
## F-statistic: 0.5759 on 3 and 20 DF,  p-value: 0.6375 
## 
## 
## 
## Covariance matrix of residuals:
##                    IED       GDP Exchange.rate
## IED           46844023 4114725.2     -1934.792
## GDP            4114725 8772476.7       -72.103
## Exchange.rate    -1935     -72.1         1.683
## 
## Correlation matrix of residuals:
##                   IED      GDP Exchange.rate
## IED            1.0000  0.20298      -0.21788
## GDP            0.2030  1.00000      -0.01876
## Exchange.rate -0.2179 -0.01876       1.00000
#Transform non stationary to stationary 
  • Detect if the estimated VAR_Model residuals are stationary.
VAR_m1_residuals<-data.frame(residuals(VAR_m1))
adf.test(VAR_m1_residuals$IED)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  VAR_m1_residuals$IED
## Dickey-Fuller = -3.5146, Lag order = 2, p-value = 0.06187
## alternative hypothesis: stationary
# p value is 0.06 bigger than 0.05 this is non stationary
  • Detect if the estimated VAR_Model residuals show serial autocorrelation.
Box.test(VAR_m1_residuals$IED,lag=1,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  VAR_m1_residuals$IED
## X-squared = 0.47979, df = 1, p-value = 0.4885
# p value is 0.488 meaning is  much grater than 0.05, meaning no autocorrelation
  • Based on the regression results and diagnostic tests, select the VAR_Model that you consider might generate the best forecast.

On behalf of the information from the diagnostics test we see that the VAR model is our best chose because of its fit data, by transforming the variables “Educacion” and “Inseguridads_Homicidio” by applying logarithmic and difference operations so we can make them stationary.

  • Briefly interpret the regression results. That is, is there a statistically significant relationship between the explanatory variable(s) and the main dependent variable?

Since the p- value is greater than 0.05, we don’t know if there autocorrelation at a lag of 1 in the model’s residuals and so by failing to reject the null hypothesis by the unknown information of the model.

  • Is there an instantaneous causality between IED_Flujos and the selected explanatory variables? Estimate a Granger Causality Test to either reject or fail to reject the hypothesis of instantaneous causality.
gran <- causality(VAR_m1,cause="IED")
gran
## $Granger
## 
##  Granger causality H0: IED do not Granger-cause GDP Exchange.rate
## 
## data:  VAR object VAR_m1
## F-Test = 0.85197, df1 = 2, df2 = 60, p-value = 0.4317
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: IED and GDP Exchange.rate
## 
## data:  VAR object VAR_m1
## Chi-squared = 1.9218, df = 2, p-value = 0.3826
# with the granger test we can observed that our p-value is 0.38 meaning is greater than 5, there's is no instantaneous casualty between the selected explanatory variables. 
  • Based on the selected VAR_Model, forecast the increasing / decreasing trend of FDI inflows in Mexico for the next 5 periods. Display the forecast in a time series plot.
f_1 <- predict(VAR_m1,n.ahead=60,ci=0.95)
fanchart(f_1,names="IED_Flujos",main="IED_Flujos",xlab="Time Period",ylab="IED_Flujos")
## Warning in fanchart(f_1, names = "IED_Flujos", main = "IED_Flujos", xlab = "Time Period", : 
## Invalid variable name(s) supplied, using first variable.

model_forecast11 <-forecast(IED_estimated,h=5)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
model_forecast11
##     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
##  97       6188.802 5222.402 7155.202 4710.821 7666.783
##  98       6188.802 5222.402 7155.202 4710.821 7666.783
##  99       6188.802 5222.402 7155.202 4710.821 7666.783
## 100       6188.802 5222.402 7155.202 4710.821 7666.783
## 101       6188.802 5222.402 7155.202 4710.821 7666.783
plot(model_forecast11)

autoplot(model_forecast11)

VI. Conclusions and Recommendations

  • Briefly describe the main insights from previous sections.

Through the evaluation and based on the results in the diagnostics test, the wining model was ARMA model with an AIC of 152.60 and in addition there were low RMSE values, these tell us that the model fits the information in a more precise way. Since being a valuable tool for forecasting it combines auto regressive and moving average or AR/MA components to capture the autocorrelation patterns in the data. The main difference between the ARMA and ARIMA model, is that ARIMA uses non stationary data, and ARMA stationary data, since our data data is non-stationary, has trends, or seasonality, its recommended to use ARIMA. This report will help Maria on behalf of her problem, because it gives her more tools to make an accurate and informed decisions, on expand to Mexico.

  • Based on the selected results, please share at least 1 recommendation that address the problem situation.

The primary variables to consider when wanting to expand near-shoring in any country will be the level of education, number of exports, insecurity, salary wages and PIB to have a more diverse vision. Another great tool to determine the viability of a country is to use the PESTLE tool. It allows identifying external factors that may affect the activity and normal functioning of companies. Also I recommend to have a data set set in the same time period, and same currency so we can have more accurate information and don’t waste to much time on converting information.

Lastly Mexico presents a favorable environment for near shoring, standing out in terms of innovation and opportunities. Its geographic position, diversity, growing economy, and educated population make it an attractive destination for companies looking to outsource services and manufacturing. Geographic proximity to the United States, supported by trade agreements such as the USMCA, provides strategic access to one of the largest markets in the world. Like Tesla chose to near-shoring in Mexico due to its strategic location near the United States, lower labor costs, and the favorable trade agreements the country offers. Thanks to this agreement Mexico is attracting more attention towards foreign companies that want to invest.

References:

Time series analysis: Definition, types, techniques, and when it’s used. (s/f). Tableau. Recuperado el 6 de septiembre de 2023, de https://www.tableau.com/learn/articles/time-series-analysis

(S/f-b). Tibco.com. Recuperado el 6 de septiembre de 2023, de https://www.tibco.com/reference-center/what-is-time-series-analysis

Mexico: The future of nearshoring. (s/f). Tango.io. Recuperado el 6 de septiembre de 2023, de https://www.tango.io/blog/mexico-the-future-of-nearshoring

IZO. (2019, julio 11). Análisis PESTEL: ¿Qué es y Cómo Ayuda en la Estrategia? IZO. https://izo.es/que-es-analisis-pestel/

LS0tDQp0aXRsZTogIkV2aWRlbmNlIDIiDQphdXRob3I6ICJTZWJhc3RpYW4gRXNwaW5vemEgQTAwODMzNzA0Ig0KZGF0ZTogIlNlcHRlbWJlciAyMDIzIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQotLS0NCjxpbWcgc3JjPSJDOlxcVXNlcnNcXHNlYmFzdGlhblxcRG93bmxvYWRzXFxtZXhpY29jYWphcy5wbmciPg0KDQojIEkuIEludHJvZHVjdGlvbg0KKipCcmllZmx5IGRlc2NyaWJlIHdoYXQgaXMgdGltZSBzZXJpZXMgYW5hbHlzaXMuKioNCg0KQWNjb3JkaW5nIHRvIFRJQkNPIOKAnFRpbWUgc2VyaWVzIGFuYWx5c2lzIGlzIGEgdGVjaG5pcXVlIGluIHN0YXRpc3RpY3MgdGhhdCBkZWFscyB3aXRoIHRpbWUgc2VyaWVzIGRhdGEgYW5kIHRyZW5kIGFuYWx5c2lzLCBpdCBmb2xsb3dzIHBlcmlvZGljIHRpbWUgaW50ZXJ2YWxzIHRoYXQgaGF2ZSBiZWVuIG1lYXN1cmVkIGluIHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMgb3IgaGF2ZSBiZWVuIGNvbGxlY3RlZCBpbiBwYXJ0aWN1bGFyIHRpbWUgaW50ZXJ2YWxzLuKAnUl0IGlzIGFuIGFuYWx5c2lzIHRoYXQsIHRocm91Z2ggYSBzcGVjaWZpYyBwZXJpb2Qgb2YgdGltZSwgc2Vla3MgdG8ga25vdyB0aGUgc2VxdWVuY2Ugb2YgZGF0YSBwb2ludHMgY29sbGVjdGVkIGR1cmluZyBhIHRpbWUgaW50ZXJ2YWwuIFdoYXQgZGlzdGluZ3Vpc2hlcyB0aW1lIHNlcmllcyBkYXRhIGZyb20gb3RoZXIgZGF0YSBpcyB0aGF0IHRoZSBhbmFseXNpcyBjYW4gc2hvdyBob3cgdmFyaWFibGVzIGNoYW5nZSBvdmVyIHRpbWUsIHdoaWNoIHRlbGxzIHVzIHRoYXQgdGltZSBwbGF5cyBhIGJpZyByb2xlIGFzIHRoZXkgc2hvdyB1cyBob3cgZGF0YSBpcyBhdHRhY2hlZCBvdmVyIHRpbWUuIG9mIHlvdXIgcmVzdWx0LiBUaHVzIHByb3ZpZGluZyB1cyB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYW5kIGNyZWF0aW5nIGFuIG9yZGVyIGJldHdlZW4gdGhlIGRhdGEuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGl0IGlzIGEgdml0YWwgdG9vbCBmb3Igc3RhdGlzdGljcyBhbmQgZGF0YSBhbmFseXNpcyBzaW5jZSBpdCBjYW4gYmUgdXNlZCBpbiBhIHdpZGUgdmFyaWV0eSBvZiBmaWVsZHMsIHN1Y2ggYXMgZmluYW5jZSwgbWV0ZW9yb2xvZ3ksIGVjb25vbWljcywgYW1vbmcgb3RoZXJzLg0KDQojIElJLiBCYWNrZ3JvdW5kDQoqKldoYXQgYXJlIHRoZSBsYXRlc3QgdHJlbmRzIG9mIE5lYXJzaG9yaW5nIGluIE1leGljbz8gUGxlYXNlIGNpdGUgYXQgbGVhc3QgMSBleHRlcm5hbCByZWZlcmVuY2UgdG8gZGV2ZWxvcCB5b3VyIGV4cGxhbmF0aW9uLioqDQpDb21wbGVtZW50aW5nIGV2aWRlbmNlIDEsIHRoZSB0b3BpYyBvZiBuZWFyc2hvcmluZyBpcyBiZWNvbWluZyBtb3JlIGFuZCBtb3JlIHBvcHVsYXIgYXMgY29tcGFuaWVzIGxvb2sgZm9yIG5ldyB3YXlzIHRvIGlubm92YXRlIHRoZWlyIHN1bm1zaW50cmFzIGNoYWlucyBhbmQgaW1wbGVtZW50IGRpc3RyaWJ1dGlvbiBjZW50ZXJzIGluIHByb2ZpdGFibGUgbG9jYXRpb25zLCBvbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgbmVhcnNob3JpbmcgYXJlIGNvc3Qgc2F2aW5ncywgc3BlZWQgdG8gbWFya2V0IGFuZCBxdWFsaXR5IGNvbnRyb2wuIE5lYXJzaG9yaW5nIGlzIGJvb3N0aW5nIGpvYiBjcmVhdGlvbiBhbmQgdGhlIE1leGljYW4gYW5kIFVTIGVjb25vbXksIHBhcnRpY3VsYXJseSBpbiB0aGUgbWFudWZhY3R1cmluZywgZmluYW5jaWFsIGFuZCBJVCBzZWN0b3JzLiBsZWFybmluZy4gKEFiZGVsIEhhaXNhbSwgMjAyMykgSW4gbXkgb3BpbmlvbiBkaWdpdGFsIHRyYW5zZm9ybWF0aW9uIGlzIGFuIHVwY29taW5nIG9wcG9ydHVuaXR5IHRoYXQgZm9jdXNpbmcgb24gc3RhcnRpbmcgdGhlIGRpZ2l0YWwgcHJlc2VuY2UgYW5kIGNhcGFiaWxpdHkgb2YgdGhlIGNvbXBhbnkgd2l0aCBhIGRpZ2l0YWwgaW5mcmFzdHJ1Y3R1cmUsIElUIGFuZCBBSSBhcmUgYmVjb21pbmcgYSBmYXN0IGdyb3dpbmcgdHJlbmQgb24gdGhlIHJpc2UgZm9yIGNvbXBhbnkgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIENoaW5hIGFuZCBtYW55IG90aGVyIGNvdW50cmllcy4NCg0KDQojIElJSS4gRGVzY3JpcHRpb24gb2YgdGhlIFByb2JsZW0gU2l0dWF0aW9uDQoqKldoYXQgaXMgdGhlIHByb2JsZW0gc2l0dWF0aW9uPyBIb3cgdG8gYWRkcmVzcyB0aGUgcHJvYmxlbSBzaXR1YXRpb24/KioNClRoZXJlJ3MgbWFueSBmYWN0b3JzIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uIHdoZW4gYW5zd2VyaW5nIHRoZXNlIHF1ZXN0aW9ucywgYnV0IGluIG15IG9waW5pb24gdGhlc2UgcXVlc3Rpb25zIHNlZWsgdG8gYW5zd2VyIE1hcmlhIGNvbmNlcm5zIGFuZCBxdWVzdGlvbnMgYnkgYW5hbHl6aW5nIHRoZSBkYXRhIHRocm91Z2ggdGhlIGRlZmluaXRpb24gb2YgRWNvbm9tZXRyaWNzLiBUaGUgcHJvYmxlbSBzaXR1YXRpb24gd2lsbCBiZSB0aGF0IGR1ZSB0aGUgYWN0aXZpdHkgb2YgQ2hpbmEgYW5kIHRoZSB3YXIgb24gdHJhZGUgd2l0aCB0aGUgVW5pdGVkIHN0YXRlcywgYWxzbyB0aGUgYWN0aXZlIHdhciB3aXRoIFJ1c3NpYSBhbmQgVWtyYWluZSwgTWFyaWEgd2FudHMgdG8gZmluZCBhbm90aGVyIGNvdW50cnkgd2VyZSBpcyBhdHRyYWN0aXZlIGFuZCBvZmZlcnMgaW5ub3ZhdGlvbiBhbmQgZGV2ZWxvcG1lbnQgc2Vla2luZyBhbHRlcm5hdGl2ZXMgdGhpcmQgb3B0aW9uIGZvciBjb3VudHJ5LCBNYXJpYSBjYW1lIGFjcm9zcyBNZXhpY28gYW5kIGZvdW5kIG91dCBhYm91dCBpdHMgcG90ZW50aWFsIG9mIHByb2R1Y3Rpb24gYW5kIHJlY2VudCBpbnZlc3RtZW50IGxpa2UgVGVzbGEsIGludmVzdG1lbnQgMTAgYmlsbGlvbiBkb2xsYXJzIHRvIGNyZWF0ZSBhIHByb2R1Y3Rpb24gY2VudGVyLiBUaGlzIGV2ZW50IGFuZCBtYW55IG90aGVycyBoYXZlIHBvcHBlZCB1cCB0aGUgcXVlc3Rpb24gcmVnYXJkaW5nIGFsbCB0aGUgZmFjdG9ycywgYW5kIGtub3cgaWYgTWV4aWNvIGlzIGEgZ29vZCBjb3VudHJ5IHRvIGltcGxlbWVudCBhIG5lYXItc2hvcmluZyBzdHJhdGVneSBkdWUgdG8gaXRzIHByb3hpbWl0eSB3aXRoIHRoZSBVbml0ZWQgU3RhdGVzIG1hcmtldC4gDQoNClRoZSBhaW0gaXMgdG8gaGF2ZSBhIG1vZGVsIHRvIHByZWRpY3QgdGhlIGV2ZW50cyBiYXNlIG9uIHRpbWUgc2VyaWVzLCBzbyB3ZSBjYW4ga25vdyBob3cgdGhlIGJlaGF2aW9yIG92ZXIgdGltZSBoYXMgaW1wYWN0IHRoZSB2YXJpYWJsZXMgYW5kIGVzdGltYXRlcyBpZiBlbnRlcmluZyB0aGUgTWV4aWNhbiBsYWJvcmFsIHByb2R1Y3Rpb24gbWFya2V0IGlzIGEgZ29vZCBpZGVhIGFjY29yZGluZyB0byB0aGUgdmFyaWFibGUgZGVwZW5kZW50IG9uIOKAnElFRF9NWE7igJ0sIHNpbmNlIGl0IGlzIGEgd2F5IG9mIG1lYXN1cmluZyB3aGV0aGVyIG5lYXJzaG9yaW5nIGlzIG9jY3VycmluZyBpbiB0aGUgY291bnRyeSwgdG8gYWRkIHRvIHRoaXMgc2hvd2luZyB0aGUgdGltZSBzZXJpZXMgZm9ybWF0LCAgYWRkaW5nIGFuIEFSTUEgYW5kIEFSSU1BIG1vZGVsIGFuZCBsYXN0bHkgYSBWQVIgbW9kZWwgdGhhdCB0aGlzIHdpbGwgaGVscCB1cyBmb3JlY2FzdCB3aGVuIHVzaW5nIG11bHRpcGxlIHRpbWUgc2VyaWVzIHZhcmlhYmxlcyBlc3RpbWF0aW5nIHNpbmdsZSByZWdyZXNzaW9uIG1vZGVsLCB0aGUgZXN0aW1hdGlvbiBvZiB0aGUgVkFSIHJlZ3Jlc3Npb24gbW9kZWwgaXMgeSBPTFMuIA0KDQojIElWLiBEYXRhIGFuZCBNZXRob2RvbG9neQ0KIyMgTGlicmFyaWVzDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0luc3RhbGxpbmcgbGlicmFyaWVzDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoZ21vZGVscykNCmxpYnJhcnkoZWZmZWN0cykNCmxpYnJhcnkoc3RhcmdhemVyKQ0KbGlicmFyeShvbHNycikgICAgICAgIA0KI2xpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoanRvb2xzKQ0KbGlicmFyeShmYXN0bWFwKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkobmFuaWFyKQ0KbGlicmFyeShnbG1uZXQpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHh0cykNCmxpYnJhcnkoem9vKQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KGFzdHNhKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShkeW5sbSkNCmxpYnJhcnkodmFycykNCiNsaWJyYXJ5KG1GaWx0ZXIpDQpsaWJyYXJ5KFRTc3R1ZGlvKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNhcmltYSkNCmxpYnJhcnkoc3RhcmdhemVyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmBgYA0KDQpgYGB7cn0NCmJkIDwtcmVhZC5jc3YoIkM6XFxVc2Vyc1xcc2ViYXN0aWFuXFxEb3dubG9hZHNcXFNQX1Nlcmllc1RpZW1wby5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmQxPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcc2ViYXN0aWFuXFxEb3dubG9hZHNcXHNwX2RhdGEuY3N2IikNCmBgYA0KDQotIEJyaWVmbHkgZGVzY3JpYmUgdGhlIGRhdGFzZXTigJlzIHNlbGVjdGVkIHZhcmlhYmxlcw0KDQpUaGlzIHRpbWUgc2VyaWVzIGZpbGUgb2YgdGhlIHZhcmlhYmxlICJGRElfZmxvd3MiIGhhcyB2YWx1ZXMgZnJvbSBxdWFydGVybHkgcGVyaW9kcyBvZiBhIGRhdGEgc2V0IHRoYXQgcmVjb3JkcyB0aGUgZXZvbHV0aW9uIG9mIEZvcmVpZ24gRGlyZWN0IEludmVzdG1lbnQgKEZESSkuIFRoZSB2YXJpYWJsZSAiRkRJX2Zsb3dzIiBnZW5lcmFsbHkgcmVmZXJzIHRvIHRoZSBhbW91bnQgb2YgbW9uZXkgdGhhdCBlbnRlcnMgb3IgaXMgc29sZCBmcm9tIHRoZSBjb3VudHJ5IGFzIGZvcmVpZ24gZGlyZWN0IGludmVzdG1lbnQgaW4gYSBzcGVjaWZpYyBxdWFydGVyLCB3aGljaCBpcyB1c2VkIHRvIGV2YWx1YXRlIG5lYXIgc2hvcmluZyBpbiBNZXhpY28uIFRoZSBwZXJpb2RzIGFyZSBicm9rZW4gZG93biBvbiBhIHF1YXJ0ZXJseSBiYXNpcywgYSBjb252ZXJzaW9uIG9mIGVhY2ggeWVhciBoYXMgNCBxdWFydGVycy4NCg0KLSBQbG90IHRoZSB2YXJpYWJsZSBJRURfRmx1am9zIHVzaW5nIGEgdGltZSBzZXJpZXMgZm9ybWF0Og0KDQoNCmBgYHtyfQ0KIyBzZXR0aW5nIHRpbWUgc2VyaWVzIGZvcm1hdCANCmJkJGRhdGUgPC0gYXMueWVhcm1vbihiZCRwZXJpb2RvLCBmb3JtYXQ9IiVtLyVkLyVZIikNCg0KSUVERiA8LXRzKGJkJElFRF9GbHVqb3MsZnJlcXVlbmN5PTQsc3RhcnQ9YygxOTk5LDEpKQ0KDQojIERlc2NyaXB0aXZlIHN0YWRpc3RpY3Mgb2YgdGhlIGRlcGVuZGV0IHZhcmlhYmxlIA0Kc3VtbWFyeShiZCRJRURfRmx1am9zKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChiZCRkYXRlLCBiZCRJRURfRmx1am9zLCB0eXBlPSJsIiwgY29sPSJyZWQiLCBsd2Q9MiwgeGxhYj0iVGltZSBQZXJpb2QiLCB5bGFiPSJTdG9jayBwcmljZSIsIG1haW49IklFRCBmbHVqb3MgVHJpbWVzdHJhbCIpDQpgYGANCg0KSW4gdGhpcyBncmFwaCB3ZSBjYW4gc2VlIHRoZSBiZWhhdmlvciBvZiBGRElfRmxvd3Mgb24gYSBxdWFydGVybHkgYmFzaXMgZnJvbSAxOTk5IHRvIDIwMjMuDQoNCg0KaSkgZGVjb21wb3NlIHRoZSB0aW1lIHNlcmllcyBkYXRhIGludG8gdHJlbmQsIHNlYXNvbmFsLCBhbmQgcmFuZG9tIGNvbXBvbmVudHMuDQpgYGB7ciBEZWNvbXBvc2UsIHdhcm5pbmc9RkFMU0V9DQojIERlY29tcG9zZSBhIHRpbWUgc2VyaWVzDQojIDEpIG9ic2VydmVkOiBkYXRhIG9ic2VydmF0aW9ucyANCiMgMikgdHJlbmQ6IGluY3JlYXNpbmcgLyBkZWNyZWFzaW5nIHZhbHVlIG9mIGRhdGEgb2JzZXJ2YXRpb25zDQojIDMpIHNlYXNvbmFsaXR5OiByZXBlYXRpbmcgc2hvcnQtdGVybSBjeWNsZSBpbiB0aW1lIHNlcmllcyANCiMgNCkgbm9pc2U6IHJhbmRvbSB2YXJpYXRpb24gaW4gdGltZSBzZXJpZXMNCmZsdWpvX3RpbWU8LWRlY29tcG9zZShJRURGKQ0KcGxvdChmbHVqb190aW1lKQ0KYGBgDQoNCkJyaWVmbHksIGRlc2NyaWJlIHRoZSBkZWNvbXBvc2l0aW9uIHRpbWUgc2VyaWVzIHBsb3QuIA0KDQoqKkRvIHRoZSB0aW1lIHNlcmllcyBkYXRhIHNob3cgYSB0cmVuZD8qKiANCg0KQmFzZWQgb24gdGhlIHdlIGNhbiBzZWUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBzZWUgYSB0cmVuZCB3aXRoIGEgbG90IG9mIHZvbGF0aWxpdHkgc2luY2UgaW4gdGhlIHBlcmlvZHMgd2UgY2FuIHNlZSBob3cgaXQgcmlzZXMgYW5kIGZhbGxzIGRyYXN0aWNhbGx5LCBhcyB0aGUgcGVyaW9kcyB3ZSBjYW4gc2VlIHRoYXQgZHVyaW5nIHRoZSBxdWFydGVycyBpdCBoYXMgdmVyeSBoaWdoIGFuZCBsb3cgcGVha3MuIEF0IGEgZmFyIGF3YXkgbG9vayB3ZSBjYW4gaW5mZXIgdGhhdCBoYXMgYSBwb3NpdGl2ZSB0cmVuZCwgZnJvbSB0aGUgbW9tZW50IGl0IHN0YXJ0ZWQgdG8gdGhlIGVuZCBkYXRlLCBvYnZpb3VzbHkgdGhlaXJzIGhpZ2ggYW5kIGxvd3MgYnV0IGlmIHdlIHNlZSBmcm9tIGJlaGluZCB3ZSBjYW4gc2VlIHRoYXQgb3ZlciB0aW1lIGluIGF2ZXJhZ2UgaXQgaGFzIGdvbmUgdXAgc2luY2UgaXQgZmlycyBxdWFydGVyLCBhbHNvIHRoZXJlJ3MgZHJhc3RpY2FsbHkgaW5jcmVhc2UgaW4gbGF0ZSAyMDE0cywgdGhlbiBpdCBnb2VzIGRvd24gYW5kIHJlbWFpbnMgaW4gc29tZSB3YXkgY29uc3RhbnQuIA0KDQoNCioqRG8gdGhlIHRpbWUgc2VyaWVzIGRhdGEgc2hvdyBzZWFzb25hbGl0eT8qKg0KDQpBcyB3ZSBhcmUgb2JzZXJ2aW5nIGEgdHJpbWVzdGVyIHBlcmlvZCwgdGhlIGdyYXBoIGlzIHZlcnkgZGV0YWlsZWQsIHNpbmNlIG92ZXIgdGltZSB3ZSBjYW4gc2VlIHNvbWUgaGlnaCBhbmQgdmVyeSBsb3cgcGVha3MsIHRoaXMgaGlnaCBwYXR0ZXJuIHN0YW5kcyBvdXQgdGhyb3VnaG91dCB0aGUgeWVhciwgc2luY2UgdGhlIGdyYXBoIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBvdmVyIHRpbWUsIHdoaWNoIGF0IGZpcnN0IGdsYW5jZSBjYW4gYmUgc2VlbiB0byBiZSBzdGF0aW9uYXJ5LCBvdmVyIHRpbWUgdGhpcyBwYXR0ZXJuIHJlbWFpbnMgY29uc3RhbnQuDQoNCmlpKSBkZXRlY3QgdGhlIHByZXNlbmNlIG9mIHN0YXRpb25hcnkNCmBgYHtyIFN0YXRpb25hcnkgdGVzdCwgd2FybmluZz1GQUxTRX0NCiMgU3RhdGlvbmFyeSBUZXN0IA0KIyBIMDogTm9uLXN0YXRpb25hcnkgYW5kIEhBOiBTdGF0aW9uYXJ5LiBwLXZhbHVlcyA8IDAuMDUgcmVqZWN0IHRoZSBIMC4NCmFkZi50ZXN0KGJkJElFRF9GbHVqb3MpDQojIHAtdmFsdWVzIDwgMC4wNSByZWplY3QgdGhlIEgwLlRoZSB0aW1lIHNlcmllcyBkYXRhIGlzIHN0YXRpb25hcnkuIA0KYGBgDQoNCg0KaWlpKSBkZXRlY3QgdGhlIHByZXNlbmNlIG9mIHNlcmlhbCBhdXRvY29ycmVsYXRpb24NCg0KYGBge3J9DQojIFNlcmlhbCBBdXRvY29ycmVsYXRpb24NCmFjZihiZCRJRURfRmx1am9zLG1haW49IlNpZ25pZmljYW50IEF1dG9jb3JyZWxhdGlvbnMiKQ0KIyBUaGVyZSBpcyBub3QgbXVjaCBzZXJpYWwgYXV0b2NvcnJlbGF0aW9uIGRlc3BpdGUgdGhlIG51bWJlciBvZiBsYWdzIG9mIHRoZSB2YXJpYWJsZQ0KYGBgDQoNCg0KDQojIFYuIFRpbWUgU2VyaWVzIFJlZ3Jlc3Npb24gQW5hbHlzaXMNCioqYS4gVGltZSBTZXJpZXMgTW9kZWwgMSoqDQotIEVzdGltYXRlIDIgZGlmZmVyZW50IHRpbWUgc2VyaWVzIHJlZ3Jlc3Npb24gbW9kZWxzLiBZb3UgbWlnaHQgd2FudCB0byBjb25zaWRlciBBUk1BIChwLHEpIGFuZCAvIG9yIEFSSU1BIChwLGQscSkuDQoNCmBgYHtyfQ0KcGxvdChiZCRkYXRlLGJkJElFRF9GbHVqb3MsdHlwZT0ibCIsY29sPSJibHVlIixsd2Q9Mix4bGFiPSJUaW1lIFBlcmlvZCIseWxhYj0iSUVEX0ZsdWpvcyIsbWFpbj0iSUVEX0ZsdWpvcyIpDQpgYGANCmBgYHtyfQ0KcGxvdChiZCRkYXRlLGxvZyhiZCRJRURfRmx1am9zKSx0eXBlPSJsIixjb2w9InJlZCIsbHdkPTIseGxhYj0iVGltZSBQZXJpb2QiLHlsYWI9IklFRF9GbHVqb3MiLG1haW49IklFRF9GbHVqb3MiKQ0KYGBgDQpgYGB7cn0NCnBsb3QoZGlmZihsb2coYmQkSUVEX0ZsdWpvcykpLHR5cGU9ImwiLHlsYWI9ImZpcnN0IG9yZGVyIGRpZmZlcmVuY2UiLG1haW4gPSAiRGlmZmVyZW5jZXMgSUVEX0ZsdWpvcyIpDQpgYGANCmBgYHtyfQ0KYWRmLnRlc3QobG9nKGJkJElFRF9GbHVqb3MpKQ0KIyAjIFRoZSBwIHZhbHVlIG9mIDAuMDI2MzUgaXMgc21hbGxlciB0aGFuIDAuMDUsIHdoaWNoIHRoaXMgbWVhbnMgd2UgcmVqZWN0IEgwLCBzdGF0aW9uYXJ5DQpgYGANCmBgYHtyfQ0KYWRmLnRlc3QoZGlmZihsb2coYmQkSUVEX0ZsdWpvcykpKQ0KIyMgcCB2YWx1ZSBpcyAwLjAxIGlzIGxlc3MgdGhhbiAwLjA1IHdoaWNoIG1lYW5zIHdlIHJlamVjdCBIMCwgbWVhbmluZyBpdCBpcyBzdGF0aW9uYXJ5Lg0KYGBgDQoNCiMjIyMgTW9kZWxzDQpgYGB7cn0NCiMgTW9kZWwgMiBBUklNQSAxDQpJRURfQVJJTUEgPC0gQXJpbWEobG9nKGJkJElFRF9GbHVqb3MpLCBvcmRlciA9IGMoMiwgMSwgMSkpDQpwcmludChJRURfQVJJTUEpDQoNCiMgcGxvdCBtb2RlbCBhcmltYQ0KcGxvdChJRURfQVJJTUEkcmVzaWR1YWxzLCBtYWluID0gIkFSSU1BKDIsMSwxKSAtIElFRCBGbHVqb3MiKQ0KDQpgYGANCmBgYHtyfQ0KYWNmKElFRF9BUklNQSRyZXNpZHVhbHMsIG1haW4gPSAiQUNGIC0gQVJJTUEgMiwxLDEiKSANCmBgYA0KYGBge3J9DQpCb3gudGVzdChJRURfQVJJTUEkcmVzaWR1YWxzLCBsYWcgPSAxLCB0eXBlID0gIkxqdW5nLUJveCIpDQpgYGANCmBgYHtyfQ0KYWRmLnRlc3QoSUVEX0FSSU1BJHJlc2lkdWFscykNCiMgcCB2YWx1ZSAwLjAxIGlzIGxlc3MgdGhhbiAwLjA1LCBtZWFuaW5nIGlzIHN0YXRpb25hcnkuDQoNCmBgYA0KYGBge3J9DQojIE1vZGVsIDIgQVJJTUEyDQpJRURfQVJJTUEyIDwtIEFyaW1hKGJkJElFRF9GbHVqb3MsIG9yZGVyID0gYygwLCAxLCAyKSkNCnByaW50KElFRF9BUklNQTIpDQoNCiNQbG90IG1vZGVsDQpwbG90KElFRF9BUklNQTIkcmVzaWR1YWxzLCBtYWluID0gIkFSSU1BKDAsMSwyKSAtIElFRCBGbHVqb3MiKQ0KDQpgYGANCg0KYGBge3J9DQphY2YoSUVEX0FSSU1BMiRyZXNpZHVhbHMsIG1haW4gPSAiQUNGIC0gQVJJTUEgKDAsMSwyKSAiKQ0KDQpgYGANCg0KYGBge3J9DQpCb3gudGVzdChJRURfQVJJTUEyJHJlc2lkdWFscywgbGFnID0gMSwgdHlwZSA9ICJManVuZy1Cb3giKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmFkZi50ZXN0KElFRF9BUklNQTIkcmVzaWR1YWxzKQ0KIyBvdXIgcCB2YWx1ZSBpcyBsZXNzIHRoYW4gMC4wNSwgbWVhbmluZyBpdHMgc3RhdGlvbmFyeSANCmBgYA0KDQpgYGB7cn0NCiMgTW9kZWwgMyBBUk1BDQpzdW1tYXJ5KElFRF9BUk1BPC1hcm1hKGxvZyhiZCRJRURfRmx1am9zKSxvcmRlcj1jKDEsMSkpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBwbG90IG1vZGVsDQojIHBsb3QoSUVEX0FSTUEpDQojIHNlIHRhcmRhIG11Y2hvIGVuIG1vc3RyYXIgbGFzIGdyYWZpY2FzDQpgYGANCg0KYGBge3J9DQpJRURfZXN0aW1hdGVkPC1leHAoSUVEX0FSTUEkZml0dGVkLnZhbHVlcykNCnBsb3QoSUVEX2VzdGltYXRlZCkNCmBgYA0KDQpgYGB7cn0NCklFRF9BUk1BX3Jlc2lkdWFsZXM8LSBJRURfQVJNQSRyZXNpZHVhbHMNCkJveC50ZXN0KElFRF9BUk1BX3Jlc2lkdWFsZXMsbGFnPTUsdHlwZT0iTGp1bmctQm94IikgDQojIHAtdmFsdWUgaXMgPiAwLjA1IGluZGljYXRpbmcgdGhhdCBBUk1BIE1vZGVsIGRvZXMgc2hvdyByZXNpZHVhbCBzZXJpYWwgYXV0b2NvcnJlbGF0aW9uLg0KYGBgDQoNCmBgYHtyfQ0KSUVEX0FSTUEkcmVzaWR1YWxzIDwtIG5hLm9taXQoSUVEX0FSTUEkcmVzaWR1YWxzKQ0KYWRmLnRlc3QoSUVEX0FSTUEkcmVzaWR1YWxzKQ0KDQojU2hvdyBzdW1tYXJ5DQpzdW1tYXJ5KElFRF9BUk1BKQ0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoSUVEX0FSTUEpDQoNCiMjIFRoZSBwLXZhbHVlIG9mIExqdW5nIGJveCBpcyAgMC4wMTc3MSAgdGhpcyBoYXZuZyBhICBncmFkZXIgcmVzdWx0IHRoYW4gMC4wNSwgbWVhbnMgdGhhdCBpdCBkb2VzIG5vdCBoYXZlIHNlcmlhbCBhdXRvY29ycmVsYXRpb24uIEFERiBpcyB0ZWxsaW5nIHVzIHRoYXQgQVJNQSBpcyBzdGF0aW9uYXJ5IHNpbmNlIHRoZSBwLXZhbHVlIGlzIDAuMDEgYW5kIGl0cyBsb3dlciB0aGFuIDAuMDUuDQoNCmBgYA0KDQoNCg0KLSBCYXNlZCBvbiBkaWFnbm9zdGljIHRlc3RzLCBjb21wYXJlIHRoZSAzIGVzdGltYXRlZCB0aW1lIHNlcmllcyByZWdyZXNzaW9uIG1vZGVscywgYW5kIHNlbGVjdCB0aGUgcmVzdWx0cyB0aGF0IHlvdSBjb25zaWRlciBtaWdodCBnZW5lcmF0ZSB0aGUgYmVzdCBmb3JlY2FzdC4NCg0KYGBge3J9DQojIG1vZGVsIDENCkFJQyhJRURfQVJJTUEpDQpgYGANCg0KYGBge3J9DQojIEFyaW1hIDENCmZfYXJpbWExPC0gZml0dGVkKElFRF9BUklNQSkNCnJfYXJpbWExIDwtIHNxcnQobWVhbigoZl9hcmltYTEgLSBiZCRJRURfRmx1am9zKV4yKSkNCnByaW50KHJfYXJpbWExKQ0KYGBgDQoNCmBgYHtyfQ0KIyBtb2RlbCAyDQpBSUMoSUVEX0FSSU1BMikNCmBgYA0KDQpgYGB7cn0NCmZ2YWx1ZXNfYXJpbWEyIDwtIGZpdHRlZChJRURfQVJJTUEyKQ0KUl9BUklNQTIgPC0gc3FydChtZWFuKChmdmFsdWVzX2FyaW1hMiAtIGJkJElFRF9GbHVqb3MpXjIpKQ0KcHJpbnQoUl9BUklNQTIpDQpgYGANCg0KYGBge3J9DQojIEZvcmVjYXN0IEFSTUENCkFSTUEgPC0gYXJpbWEobG9nKGJkJElFRF9GbHVqb3MpLCBvcmRlciA9IGMoMSwgMCwgMSkpDQpBSUNBQSA8LSBBSUMoQVJNQSkNCkFJQ0FBDQpgYGANCg0KYGBge3J9DQpBUk1BIDwtIGFyaW1hKGxvZyhiZCRJRURfRmx1am9zKSwgb3JkZXIgPSBjKDEsIDAsIDEpKQ0KcmVzaWR1YWxlc19hcm1hIDwtIEFSTUEkcmVzaWR1YWxzDQpyX2FybWEgPC0gc3FydChtZWFuKChsb2coYmQkSUVEX0ZsdWpvcykgLSByZXNpZHVhbGVzX2FybWEpXjIpKQ0KcHJpbnQocl9hcm1hKQ0KYGBgDQoNCmBgYHtyfQ0KI0FJQyBldmFsdWF0aW9uDQoNCkFJQyhJRURfQVJJTUEpDQojDQpBSUMoSUVEX0FSSU1BMikNCmBgYA0KDQoNCmBgYHtyfQ0KQUlDQUENCmBgYA0KDQpUaHJvdWdoIHRoZSBldmFsdWF0aW9uLCAzIHByb3Bvc2VkIG1vZGVscyB3ZXJlIGFuYWx5emVkLCBmb3IgdGhlIEFSTUEgbW9kZWwgdGhlIGxlYXN0IEFJQyB3YXMgLTE1Mi42MCBhbmQgaW4gYWRkaXRpb24gdGhlcmUgd2VyZSBsb3cgUk1TRSB2YWx1ZXMsIHRoZXNlIHRlbGwgdXMgdGhhdCB0aGUgbW9kZWwgZml0cyB0aGUgaW5mb3JtYXRpb24gaW4gYSBtb3JlIHByZWNpc2Ugd2F5LiBXaXRoIHRoaXMgbW9kZWwgYW5kIGluZm9ybWF0aW9uIHdlIGdlbmVyYXRlIGEgcHJvamVjdGlvbiBvZiB0aGUgZm9yZWNhc3QgNSB5ZWFycyBpbnRvIHRoZSBmdXR1cmUuDQoNCi0gQnkgdXNpbmcgdGhlIHNlbGVjdGVkIG1vZGVsLCBtYWtlIGEgZm9yZWNhc3QgZm9yIHRoZSBuZXh0IDUgcGVyaW9kcy4gSW4NCmRvaW5nIHNvLCBpbmNsdWRlIGEgdGltZSBzZXJpZXMgcGxvdCBzaG93aW5nIHlvdXIgZm9yZWNhc3QuDQoNCmBgYHtyfQ0KSUVEX01vZGVsX2ZvcmVjYXN0PC1mb3JlY2FzdChJRURfZXN0aW1hdGVkLGg9NSkNCklFRF9Nb2RlbF9mb3JlY2FzdA0KYGBgDQoNCmBgYHtyfQ0KcGxvdChJRURfTW9kZWxfZm9yZWNhc3QpDQpgYGANCg0KYGBge3J9DQphdXRvcGxvdChJRURfTW9kZWxfZm9yZWNhc3QpDQpgYGANCg0KDQoqKmIuIFRpbWUgU2VyaWVzIE1vZGVsIDIqKg0KRnJvbSB0aGUgdGltZSBzZXJpZXMgZGF0YXNldCwgc2VsZWN0IHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgdGhhdCBtaWdodCBleHBsYWluIHRoZSBOZWFyc2hvcmluZyBpbiBNZXhpY28uDQoNCjEuIEVkdWNhdGlvbjogVGhlIHF1YWxpdHkgYW5kIGFjY2VzcyB0byB0ZWFjaGluZyBhbmQgbGVhcm5pbmcgaW4gYSBzb2NpZXR5LiBJdCBjYW4gYmUgbWVhc3VyZWQgYnkgaW5kaWNhdG9ycyBzdWNoIGFzIHRoZSBsZXZlbCBvZiBlZHVjYXRpb24gYWNoaWV2ZWQgYnkgdGhlIHBvcHVsYXRpb24sIHRoZSBsaXRlcmFjeSByYXRlLCBldGMuIEVkdWNhdGlvbiBpcyBlc3NlbnRpYWwgZm9yIHRoZSBkZXZlbG9wbWVudCBvZiBhIHNvY2lldHksIHNpbmNlIGl0IGluZmx1ZW5jZXMgZWNvbm9taWMgZ3Jvd3RoLg0KDQoyLiBJbm5vdmF0aW9uOiBJcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbmQgYXBwbHlpbmcgbmV3IGlkZWFzLCBwcm9kdWN0cyBvciBtZXRob2RzIHRvIGltcHJvdmUgYW5kIGFkdmFuY2UgaW4gZGlmZmVyZW50IGFyZWFzLCBmcm9tIHRlY2hub2xvZ3kgdG8gdGhlIGVjb25vbXkuIEl0IGludm9sdmVzIGNyZWF0aXZpdHksIGRldmVsb3BtZW50LCBpbXBsZW1lbnRhdGlvbiBhbmQgc2Vla3MgdG8gaGF2ZSBhIHBvc2l0aXZlIGltcGFjdC4NCg0KMy4gRXhjaGFuZ2UgcmF0ZTogVGhlIHZhbHVlIG9mIG9uZSBjdXJyZW5jeSB3aXRoIHJlc3BlY3QgdG8gYW5vdGhlci4gSXQgY2FuIGJlIGZpeGVkIG9yIGZsb2F0aW5nLCBkZXBlbmRpbmcgb24gd2hldGhlciBleGNoYW5nZSByYXRlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWFya2V0IG9yIGJ5IGdvdmVybm1lbnQgaW50ZXJ2ZW50aW9uLg0KDQo0LiBFeHBvcnRhdGlvbjogUmVmZXIgdG8gZ29vZHMgYW5kIHNlcnZpY2VzIHByb2R1Y2VkIGluIGEgY291bnRyeSBhbmQgc29sZCB0byBvdGhlciBjb3VudHJpZXMuIFRoZXNlIHNhbGVzIG1heSBpbmNsdWRlIG1hbnVmYWN0dXJlZCBwcm9kdWN0cywgcmF3IG1hdGVyaWFscywgdGVjaG5vbG9naWNhbCBzZXJ2aWNlcywgYW1vbmcgb3RoZXJzLg0KDQoNCi0gSW4gZGVzY3JpYmluZyB0aGUgYWJvdmUgcmVsYXRpb25zaGlwcywgcGxlYXNlIGluY2x1ZGUgYSB0aW1lIHNlcmllcyBwbG90IHRoYXQgZGlzcGxheXMgdGhlIHNlbGVjdGVkIHZhcmlhYmxlc+KAmSBwZXJmb3JtYW5jZSBvdmVyIHRoZSB0aW1lIHBlcmlvZC4NCg0KYGBge3J9DQojIDEgZWR1Y2FjaW9uDQpnZ3Bsb3QoYmQxLCBhZXMoeCA9IHBlcmlvZG8sIHkgPSBFZHVjYWNpb24pKSArIA0KICBnZW9tX2xpbmUoY29sb3IgPSAicHVycGxlIikgKyANCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBvZiBFZHVjYWNpb24iLCANCiAgICAgICB4ID0gIkRhdGUiLCANCiAgICAgICB5ID0gIkVkdWNhY2lvbiIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGJkMSwgYWVzKHggPSBwZXJpb2RvLCB5ID0gSW5ub3ZhY2lvbikpICsgDQogIGdlb21fbGluZShjb2xvciA9ICJibHVlIikgKyANCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBvZiBJbm5vdmFjaW9uIiwgDQogICAgICAgeCA9ICJEYXRlIiwgDQogICAgICAgeSA9ICJJbm5vdmFjaW9uIikgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChiZDEsIGFlcyh4ID0gcGVyaW9kbywgeSA9IFRpcG9fZGVfQ2FtYmlvKSkgKyANCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyZWVuIikgKyANCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBvZiBFeGNoYW5nZSByYXRlIiwgDQogICAgICAgeCA9ICJEYXRlIiwgDQogICAgICAgeSA9ICJUaXBvIGRlIENhbWJpbyIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGJkMSwgYWVzKHggPSBwZXJpb2RvLCB5ID0gRXhwb3J0YWNpb25lcykpICsgDQogIGdlb21fbGluZShjb2xvciA9ICJvcmFuZ2UiKSArIA0KICBsYWJzKHRpdGxlID0gIlRpbWUgU2VyaWVzIG9mIEV4cG9ydGFjaW9uZXMiLCANCiAgICAgICB4ID0gIkRhdGUiLCANCiAgICAgICB5ID0gIkV4cG9ydGFjaW9uZXMiKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChiZDEsIGFlcyh4ID0gcGVyaW9kbywgeSA9IFNhbGFyaW9fRGlhcmlvKSkgKyANCiAgZ2VvbV9saW5lKGNvbG9yID0gInB1cnBsZSIpICsgDQogIGxhYnModGl0bGUgPSAiVGltZSBTZXJpZXMgb2YgU2FsYXJpbyBEaWFyaW8iLCANCiAgICAgICB4ID0gIkRhdGUiLCANCiAgICAgICB5ID0gIlNhbGFyaW8gRGlhcmlvIikgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoYmQxLCBhZXMoeCA9IHBlcmlvZG8sIHkgPSBJbnNlZ3VyaWRhZF9Ib21pY2lkaW8pKSArIA0KICBnZW9tX2xpbmUoY29sb3IgPSAicmVkIikgKyANCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBvZiBJbnNlZ3VyaWRhZF9Ib21pY2lkaW8iLCANCiAgICAgICB4ID0gIkRhdGUiLCANCiAgICAgICB5ID0gIkluc2VndXJpZGFkX0hvbWljaWRpbyIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkRlc2NyaWJlIHRoZSBoeXBvdGhldGljYWwgcmVsYXRpb25zaGlwIC8gaW1wYWN0IGJldHdlZW4gZWFjaCBzZWxlY3RlZCBmYWN0b3IgYW5kIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgSUVEX0ZsdWpvcy4gRm9yIGV4YW1wbGUsIGhvdyBkb2VzIHRoZSBleGNoYW5nZSByYXRlIGluY3JlYXNlIC8gcmVkdWNlIHRoZSBmb3JlaWduIGRpcmVjdCBpbnZlc3RtZW50IGZsb3dzIGluIE1leGljbz8NCg0KV2UgY2FuIHNlZSBhdCBmaXJzdCBnbGFuY2UgdGhhdCB3ZSBjYW4gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlcyB2YXJpYWJsZXMsIG91ciBwb3NpdGl2ZSB2YXJpYWJsZXMgdGhhdCBoYXZlIGEgZ29vZCBpbmZsdWVuY2Ugb24gbmVhcnNob3JpbmcgaW4gbWV4aWNvIGlzLCBlZHVjYWN0aW9uLCBleGNoYW5nZSByYXRlLCBleHBvcnRhdGlvbiwgZGFpbHkgd2FnZSBhbmQgb3VyIG5lZ2F0aXZlIGltcGFjdCB2YXJpYWJsZXMgb3VyIHRoZSByYXRlIG9mIGhvbWljaWRlIGFuZCBpbnNlY3VyaXR5LCBhbmQgaW4gc29tZSB3YXkgaW5ub3ZhdGlvbiBiZWNhdXNlIGluIHRoZSBncmFwaCB3ZSBjYW4gc2VlIHRoYXQgaXQgZGVjcmVhc2VzLiANCg0KVGhlIHZhcmlhYmxlcyB3aXRoIHRoZSBncmVhdGVzdCBpbXBhY3Qgb24gSUVEX01YTiB3ZXJlIEVkdWNhdGlvbiwgaGFkIGEgc2lnbmlmaWNhbmNlIG9mIDElLCBhbmQgSW5zZWN1cml0eSBkdWUgdG8gSG9taWNpZGUsIHdpdGggYSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgNSUuIEFuZCBmb3Igb25lIHVuaXQgb2YgdGhlIGNvZWZmaWNpZW50IOKAnEluc2VndXJpZGFkX0hvbWljaWRpb+KAnSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGlzIGVzdGltYXRlZCB0byBkZWNyZWFzZSBieSBhcHByb3hpbWF0ZWx5IDAuMDIyMQ0KDQpUaGUgY29lZmZpY2llbnQgZm9yIOKAnEVkdWNhdGlvbuKAnSB0ZWxscyB1cyB0aGF0IGZvciBvbmUgdW5pdCBpdCBpbmNyZWFzZXMgaW4gZWR1Y2F0aW9uLCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGluY3JlYXNlcyBieSAwLjMyNzEgdW5pdHMgYXBwcm94aW1hdGVseSwgRm9yIOKAnFRpcG9fZGVfQ2FtYmlv4oCdIGlzIGFwcHJveGltYXRlbHkgMC4wMzQ1LCBpbmRpY2F0aW5nIHRoYXQgYSBwb3NpdGl2ZSBjaGFuZ2UgaW4gdGhlIGV4Y2hhbmdlIHJhdGUgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVzdGltYXRlZCBpbmNyZWFzZSBvZiBhcHByb3hpbWF0ZWx5IDAuMDM0NSB1bml0cyBpbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLiBBbmQgZm9yIOKAnFNhbGFyaW9fRGlhcmlv4oCdICwgZm9yIGVhY2ggdW5pdCBpdCBpbmNyZWFzZXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBpcyBlc3RpbWF0ZWQgdG8gaW5jcmVhc2UgYnkgMC4wMDA2IHVuaXRzIGJ1dCBpdCB3aWxsIGhhdmUgYSBzbGlnaHRseSBzbWFsbCBlZmZlY3QuDQoNCg0KDQotIEVzdGltYXRlIGEgVkFSX01vZGVsIHRoYXQgaW5jbHVkZXMgYXQgbGVhc3QgMSBleHBsYW5hdG9yeSBmYWN0b3IgdGhhdCBtaWdodCBhZmZlY3QgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBJRURfRmx1am9zLg0KYGBge3J9DQpmb3IoY29sdW1uIGluIG5hbWVzKGJkMSkpIHsNCiAgaWYoaXMubnVtZXJpYyhiZDFbW2NvbHVtbl1dKSkgew0KICAgIGJkMVtbY29sdW1uXV1baXMubmEoYmQxW1tjb2x1bW5dXSldIDwtIG1lZGlhbihiZDFbW2NvbHVtbl1dLCBuYS5ybSA9IFRSVUUpDQogIH0NCn0NCmBgYA0KDQpgYGB7cn0NCmFkZi50ZXN0KGJkMSRJRURfRmx1am9zKSANCmBgYA0KYGBge3J9DQpWQVIgPC0gY2JpbmQoYmQxJElFRF9GbHVqb3MsIGJkMSRQSUJfUGVyX0NhcGl0YSwgYmQxJFRpcG9fZGVfQ2FtYmlvKQ0KDQoNCmxhZ19zZWxlY3Q8LVZBUnNlbGVjdChWQVIsbGFnLm1heD01LHR5cGU9ImNvbnN0Iiwgc2Vhc29uPTUyKSANCmxhZ19zZWxlY3Qkc2VsZWN0aW9uDQpgYGANCg0KYGBge3J9DQpsYWdfc2VsZWN0JGNyaXRlcmlhDQpgYGANCg0KYGBge3J9DQpkX0lFRDwtZGlmZihiZDEkSUVEX0ZsdWpvcykNCmRfR0RQPC1kaWZmKGJkMSRQSUJfUGVyX0NhcGl0YSkNCmRfRXhjaGFuZ2U8LWRpZmYoYmQxJFRpcG9fZGVfQ2FtYmlvKQ0KDQpWQVJfbGQ8LSBjYmluZChkX0lFRCwgZF9HRFAsIGRfRXhjaGFuZ2UpDQpjb2xuYW1lcyhWQVJfbGQpPC1jYmluZCgiSUVEIiwiR0RQIiwiRXhjaGFuZ2UgcmF0ZSIpDQpWQVJfbTE8LVZBUihWQVJfbGQscD0xLHR5cGU9ImNvbnN0IixzZWFzb249TlVMTCxleG9nPU5VTEwpIA0Kc3VtbWFyeShWQVJfbTEpDQojVHJhbnNmb3JtIG5vbiBzdGF0aW9uYXJ5IHRvIHN0YXRpb25hcnkgDQpgYGANCg0KLSBEZXRlY3QgaWYgdGhlIGVzdGltYXRlZCBWQVJfTW9kZWwgcmVzaWR1YWxzIGFyZSBzdGF0aW9uYXJ5Lg0KYGBge3J9DQpWQVJfbTFfcmVzaWR1YWxzPC1kYXRhLmZyYW1lKHJlc2lkdWFscyhWQVJfbTEpKQ0KYWRmLnRlc3QoVkFSX20xX3Jlc2lkdWFscyRJRUQpDQojIHAgdmFsdWUgaXMgMC4wNiBiaWdnZXIgdGhhbiAwLjA1IHRoaXMgaXMgbm9uIHN0YXRpb25hcnkNCmBgYA0KDQoNCi0gRGV0ZWN0IGlmIHRoZSBlc3RpbWF0ZWQgVkFSX01vZGVsIHJlc2lkdWFscyBzaG93IHNlcmlhbCBhdXRvY29ycmVsYXRpb24uDQoNCmBgYHtyfQ0KQm94LnRlc3QoVkFSX20xX3Jlc2lkdWFscyRJRUQsbGFnPTEsdHlwZT0iTGp1bmctQm94IikNCiMgcCB2YWx1ZSBpcyAwLjQ4OCBtZWFuaW5nIGlzICBtdWNoIGdyYXRlciB0aGFuIDAuMDUsIG1lYW5pbmcgbm8gYXV0b2NvcnJlbGF0aW9uDQpgYGANCg0KDQoNCi0gQmFzZWQgb24gdGhlIHJlZ3Jlc3Npb24gcmVzdWx0cyBhbmQgZGlhZ25vc3RpYyB0ZXN0cywgc2VsZWN0IHRoZSBWQVJfTW9kZWwgdGhhdCB5b3UgY29uc2lkZXIgbWlnaHQgZ2VuZXJhdGUgdGhlIGJlc3QgZm9yZWNhc3QuDQoNCk9uIGJlaGFsZiBvZiB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGlhZ25vc3RpY3MgdGVzdCB3ZSBzZWUgdGhhdCB0aGUgVkFSIG1vZGVsIGlzIG91ciBiZXN0IGNob3NlIGJlY2F1c2Ugb2YgaXRzIGZpdCBkYXRhLCBieSB0cmFuc2Zvcm1pbmcgdGhlIHZhcmlhYmxlcyAiRWR1Y2FjaW9uIiBhbmQgIkluc2VndXJpZGFkc19Ib21pY2lkaW8iIGJ5IGFwcGx5aW5nIGxvZ2FyaXRobWljIGFuZCBkaWZmZXJlbmNlIG9wZXJhdGlvbnMgc28gd2UgY2FuIG1ha2UgdGhlbSBzdGF0aW9uYXJ5LiANCg0KLSBCcmllZmx5IGludGVycHJldCB0aGUgcmVncmVzc2lvbiByZXN1bHRzLiBUaGF0IGlzLCBpcyB0aGVyZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlKHMpIGFuZCB0aGUgbWFpbiBkZXBlbmRlbnQgdmFyaWFibGU/DQoNClNpbmNlIHRoZSBwLSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMC4wNSwgd2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBhdXRvY29ycmVsYXRpb24gYXQgYSBsYWcgb2YgMSBpbiB0aGUgbW9kZWwncyByZXNpZHVhbHMgYW5kIHNvIGJ5IGZhaWxpbmcgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgYnkgdGhlIHVua25vd24gaW5mb3JtYXRpb24gb2YgdGhlIG1vZGVsLg0KDQoNCi0gSXMgdGhlcmUgYW4gaW5zdGFudGFuZW91cyBjYXVzYWxpdHkgYmV0d2VlbiBJRURfRmx1am9zIGFuZCB0aGUgc2VsZWN0ZWQgZXhwbGFuYXRvcnkgdmFyaWFibGVzPyBFc3RpbWF0ZSBhIEdyYW5nZXIgQ2F1c2FsaXR5IFRlc3QgdG8gZWl0aGVyIHJlamVjdCBvciBmYWlsIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBvZiBpbnN0YW50YW5lb3VzIGNhdXNhbGl0eS4NCmBgYHtyfQ0KZ3JhbiA8LSBjYXVzYWxpdHkoVkFSX20xLGNhdXNlPSJJRUQiKQ0KZ3Jhbg0KIyB3aXRoIHRoZSBncmFuZ2VyIHRlc3Qgd2UgY2FuIG9ic2VydmVkIHRoYXQgb3VyIHAtdmFsdWUgaXMgMC4zOCBtZWFuaW5nIGlzIGdyZWF0ZXIgdGhhbiA1LCB0aGVyZSdzIGlzIG5vIGluc3RhbnRhbmVvdXMgY2FzdWFsdHkgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgZXhwbGFuYXRvcnkgdmFyaWFibGVzLiANCmBgYA0KDQoNCi0gQmFzZWQgb24gdGhlIHNlbGVjdGVkIFZBUl9Nb2RlbCwgZm9yZWNhc3QgdGhlIGluY3JlYXNpbmcgLyBkZWNyZWFzaW5nIHRyZW5kIG9mIEZESSBpbmZsb3dzIGluIE1leGljbyBmb3IgdGhlIG5leHQgNSBwZXJpb2RzLiBEaXNwbGF5IHRoZSBmb3JlY2FzdCBpbiBhIHRpbWUgc2VyaWVzIHBsb3QuDQoNCg0KYGBge3J9DQpmXzEgPC0gcHJlZGljdChWQVJfbTEsbi5haGVhZD02MCxjaT0wLjk1KQ0KZmFuY2hhcnQoZl8xLG5hbWVzPSJJRURfRmx1am9zIixtYWluPSJJRURfRmx1am9zIix4bGFiPSJUaW1lIFBlcmlvZCIseWxhYj0iSUVEX0ZsdWpvcyIpDQpgYGANCmBgYHtyfQ0KbW9kZWxfZm9yZWNhc3QxMSA8LWZvcmVjYXN0KElFRF9lc3RpbWF0ZWQsaD01KQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxfZm9yZWNhc3QxMQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChtb2RlbF9mb3JlY2FzdDExKQ0KYGBgDQoNCmBgYHtyfQ0KYXV0b3Bsb3QobW9kZWxfZm9yZWNhc3QxMSkNCmBgYA0KDQoNCiMgVkkuIENvbmNsdXNpb25zIGFuZCBSZWNvbW1lbmRhdGlvbnMNCi0gQnJpZWZseSBkZXNjcmliZSB0aGUgbWFpbiBpbnNpZ2h0cyBmcm9tIHByZXZpb3VzIHNlY3Rpb25zLg0KDQpUaHJvdWdoIHRoZSBldmFsdWF0aW9uIGFuZCBiYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgZGlhZ25vc3RpY3MgdGVzdCwgdGhlIHdpbmluZyBtb2RlbCB3YXMgIEFSTUEgbW9kZWwgd2l0aCBhbiBBSUMgb2YgMTUyLjYwIGFuZCBpbiBhZGRpdGlvbiB0aGVyZSB3ZXJlIGxvdyBSTVNFIHZhbHVlcywgdGhlc2UgdGVsbCB1cyB0aGF0IHRoZSBtb2RlbCBmaXRzIHRoZSBpbmZvcm1hdGlvbiBpbiBhIG1vcmUgcHJlY2lzZSB3YXkuIFNpbmNlIGJlaW5nIGEgdmFsdWFibGUgdG9vbCBmb3IgZm9yZWNhc3RpbmcgaXQgY29tYmluZXMgYXV0byByZWdyZXNzaXZlIGFuZCBtb3ZpbmcgYXZlcmFnZSBvciBBUi9NQSBjb21wb25lbnRzIHRvIGNhcHR1cmUgdGhlIGF1dG9jb3JyZWxhdGlvbiBwYXR0ZXJucyBpbiB0aGUgZGF0YS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBBUk1BIGFuZCBBUklNQSBtb2RlbCwgaXMgdGhhdCBBUklNQSB1c2VzIG5vbiBzdGF0aW9uYXJ5IGRhdGEsIGFuZCBBUk1BIHN0YXRpb25hcnkgZGF0YSwgc2luY2Ugb3VyIGRhdGEgIGRhdGEgaXMgbm9uLXN0YXRpb25hcnksIGhhcyB0cmVuZHMsIG9yIHNlYXNvbmFsaXR5LCBpdHMgcmVjb21tZW5kZWQgdG8gdXNlIEFSSU1BLiBUaGlzIHJlcG9ydCB3aWxsIGhlbHAgTWFyaWEgb24gYmVoYWxmIG9mIGhlciBwcm9ibGVtLCBiZWNhdXNlIGl0IGdpdmVzIGhlciBtb3JlIHRvb2xzIHRvIG1ha2UgYW4gYWNjdXJhdGUgYW5kIGluZm9ybWVkIGRlY2lzaW9ucywgb24gZXhwYW5kIHRvIE1leGljby4gIA0KDQoNCi0gQmFzZWQgb24gdGhlIHNlbGVjdGVkIHJlc3VsdHMsIHBsZWFzZSBzaGFyZSBhdCBsZWFzdCAxIHJlY29tbWVuZGF0aW9uIHRoYXQgYWRkcmVzcyB0aGUgcHJvYmxlbSBzaXR1YXRpb24uDQoNClRoZSBwcmltYXJ5IHZhcmlhYmxlcyB0byBjb25zaWRlciB3aGVuIHdhbnRpbmcgdG8gZXhwYW5kIG5lYXItc2hvcmluZyBpbiBhbnkgY291bnRyeSB3aWxsIGJlIHRoZSBsZXZlbCBvZiBlZHVjYXRpb24sIG51bWJlciBvZiBleHBvcnRzLCBpbnNlY3VyaXR5LCBzYWxhcnkgd2FnZXMgYW5kIFBJQiB0byBoYXZlIGEgbW9yZSBkaXZlcnNlIHZpc2lvbi4gQW5vdGhlciBncmVhdCB0b29sIHRvIGRldGVybWluZSB0aGUgdmlhYmlsaXR5IG9mIGEgY291bnRyeSBpcyB0byB1c2UgdGhlIFBFU1RMRSB0b29sLiBJdCBhbGxvd3MgaWRlbnRpZnlpbmcgZXh0ZXJuYWwgZmFjdG9ycyB0aGF0IG1heSBhZmZlY3QgdGhlIGFjdGl2aXR5IGFuZCBub3JtYWwgZnVuY3Rpb25pbmcgb2YgY29tcGFuaWVzLiBBbHNvIEkgcmVjb21tZW5kIHRvIGhhdmUgYSBkYXRhIHNldCBzZXQgaW4gdGhlIHNhbWUgdGltZSBwZXJpb2QsIGFuZCBzYW1lIGN1cnJlbmN5IHNvIHdlIGNhbiBoYXZlIG1vcmUgYWNjdXJhdGUgaW5mb3JtYXRpb24gYW5kIGRvbid0IHdhc3RlIHRvIG11Y2ggdGltZSBvbiBjb252ZXJ0aW5nIGluZm9ybWF0aW9uLiANCg0KTGFzdGx5IE1leGljbyBwcmVzZW50cyBhIGZhdm9yYWJsZSBlbnZpcm9ubWVudCBmb3IgbmVhciBzaG9yaW5nLCBzdGFuZGluZyBvdXQgaW4gdGVybXMgb2YgaW5ub3ZhdGlvbiBhbmQgb3Bwb3J0dW5pdGllcy4gSXRzIGdlb2dyYXBoaWMgcG9zaXRpb24sIGRpdmVyc2l0eSwgZ3Jvd2luZyBlY29ub215LCBhbmQgIGVkdWNhdGVkIHBvcHVsYXRpb24gbWFrZSBpdCBhbiBhdHRyYWN0aXZlIGRlc3RpbmF0aW9uIGZvciBjb21wYW5pZXMgbG9va2luZyB0byBvdXRzb3VyY2Ugc2VydmljZXMgYW5kIG1hbnVmYWN0dXJpbmcuIEdlb2dyYXBoaWMgcHJveGltaXR5IHRvIHRoZSBVbml0ZWQgU3RhdGVzLCBzdXBwb3J0ZWQgYnkgdHJhZGUgYWdyZWVtZW50cyBzdWNoIGFzIHRoZSBVU01DQSwgcHJvdmlkZXMgc3RyYXRlZ2ljIGFjY2VzcyB0byBvbmUgb2YgdGhlIGxhcmdlc3QgbWFya2V0cyBpbiB0aGUgd29ybGQuIExpa2UgVGVzbGEgY2hvc2UgdG8gbmVhci1zaG9yaW5nIGluIE1leGljbyBkdWUgdG8gaXRzIHN0cmF0ZWdpYyBsb2NhdGlvbiBuZWFyIHRoZSBVbml0ZWQgU3RhdGVzLCBsb3dlciBsYWJvciBjb3N0cywgYW5kIHRoZSBmYXZvcmFibGUgdHJhZGUgYWdyZWVtZW50cyB0aGUgY291bnRyeSBvZmZlcnMuIFRoYW5rcyB0byB0aGlzIGFncmVlbWVudCBNZXhpY28gaXMgYXR0cmFjdGluZyBtb3JlIGF0dGVudGlvbiB0b3dhcmRzIGZvcmVpZ24gY29tcGFuaWVzIHRoYXQgd2FudCB0byBpbnZlc3QuDQoNCg0KIyBSZWZlcmVuY2VzOiANClRpbWUgc2VyaWVzIGFuYWx5c2lzOiBEZWZpbml0aW9uLCB0eXBlcywgdGVjaG5pcXVlcywgYW5kIHdoZW4gaXTigJlzIHVzZWQuIChzL2YpLiBUYWJsZWF1LiBSZWN1cGVyYWRvIGVsIDYgZGUgc2VwdGllbWJyZSBkZSAyMDIzLCBkZSBodHRwczovL3d3dy50YWJsZWF1LmNvbS9sZWFybi9hcnRpY2xlcy90aW1lLXNlcmllcy1hbmFseXNpcw0KDQooUy9mLWIpLiBUaWJjby5jb20uIFJlY3VwZXJhZG8gZWwgNiBkZSBzZXB0aWVtYnJlIGRlIDIwMjMsIGRlIGh0dHBzOi8vd3d3LnRpYmNvLmNvbS9yZWZlcmVuY2UtY2VudGVyL3doYXQtaXMtdGltZS1zZXJpZXMtYW5hbHlzaXMNCg0KTWV4aWNvOiBUaGUgZnV0dXJlIG9mIG5lYXJzaG9yaW5nLiAocy9mKS4gVGFuZ28uaW8uIFJlY3VwZXJhZG8gZWwgNiBkZSBzZXB0aWVtYnJlIGRlIDIwMjMsIGRlIGh0dHBzOi8vd3d3LnRhbmdvLmlvL2Jsb2cvbWV4aWNvLXRoZS1mdXR1cmUtb2YtbmVhcnNob3JpbmcNCg0KSVpPLiAoMjAxOSwganVsaW8gMTEpLiBBbsOhbGlzaXMgUEVTVEVMOiDCv1F1w6kgZXMgeSBDw7NtbyBBeXVkYSBlbiBsYSBFc3RyYXRlZ2lhPyBJWk8uIGh0dHBzOi8vaXpvLmVzL3F1ZS1lcy1hbmFsaXNpcy1wZXN0ZWwvDQoNCg0KDQoNCg0K