5.5
install.packages("forecast", repos="http://cran.rstudio.com")
# Load the library
library(forecast)
# Parameters for the MA(1) process
theta <- 0.6
n <- 200 # Length of each time series
num_series <- 20 # Number of series to generate
# Generate 20 realizations of the MA(1) process
set.seed(42)
simulated_series <- lapply(1:num_series, function(i) {
arima.sim(model=list(ma=theta), n=n)
})
# Reducing the size of the margins
par(mfrow=c(5, 4), mar=c(2, 2, 2, 2)) # Setting smaller margins
for (i in 1:num_series) {
plot(simulated_series[[i]], type = "l", main = paste("MA(1) Series", i), ylab = "", xlab = "Time")
}
# Plotting ACF and PACF for the first series
par(mfrow=c(1,2))
Acf(simulated_series[[1]], main="ACF of MA(1) Series")
Pacf(simulated_series[[1]], main="PACF of MA(1) Series")
# Initialization
innovations_estimates <- numeric(num_series)
mle_estimates <- numeric(num_series)
# Estimation
for (i in 1:num_series) {
fit_innov <- tryCatch({
Arima(simulated_series[[i]], order=c(0,0,1), method="CSS")
}, error = function(e) NULL)
fit_mle <- tryCatch({
Arima(simulated_series[[i]], order=c(0,0,1), method="ML")
}, error = function(e) NULL)
# Check if the fit object is NULL, which means the fitting failed
if (!is.null(fit_innov) && "ma1" %in% names(fit_innov$coef)) {
innovations_estimates[i] <- fit_innov$coef["ma1"]
} else {
innovations_estimates[i] <- NA # Assign NA if the model did not return a result
}
if (!is.null(fit_mle) && "ma1" %in% names(fit_mle$coef)) {
mle_estimates[i] <- fit_mle$coef["ma1"]
} else {
mle_estimates[i] <- NA # Assign NA if the model did not return a result
}
}
# Output results with NA handling
# Print results with names
results <- c(
mean_innovations = mean(innovations_estimates, na.rm = TRUE),
variance_innovations = var(innovations_estimates, na.rm = TRUE),
mean_mle = mean(mle_estimates, na.rm = TRUE),
variance_mle = var(mle_estimates, na.rm = TRUE)
)
# Use print to display the named results
print(results)
# Simulate the creation of estimates as examples
# This should be replaced with your actual calculations
moment_estimates <- rnorm(100, mean = 0.6, sd = 1) # Placeholder for illustrative purposes
innovations_estimates <- rnorm(100, mean = 0.6, sd = 1) # Placeholder
mle_estimates <- rnorm(100, mean = 0.6, sd = 1) # Placeholder
# Calculate means and variances
mean_moment <- mean(moment_estimates, na.rm = TRUE)
variance_moment <- var(moment_estimates, na.rm = TRUE)
mean_innovations <- mean(innovations_estimates, na.rm = TRUE)
variance_innovations <- var(innovations_estimates, na.rm = TRUE)
mean_mle <- mean(mle_estimates, na.rm = TRUE)
variance_mle <- var(mle_estimates, na.rm = TRUE)
# Create a named vector with all results
results <- c(
mean_moment = mean_moment,
variance_moment = variance_moment,
mean_innovations = mean_innovations,
variance_innovations = variance_innovations,
mean_mle = mean_mle,
variance_mle = variance_mle
)
# Print the results
print("Results:")
print(results)
6.4
# Load the tseries package
library(tseries)
library(forecast)
# Your data as a numeric vector
lake_huron_data <- c(
10.38, 11.86, 10.97, 10.8, 9.79, 10.39, 10.42, 10.82, 11.4, 11.32,
11.44, 11.68, 11.17, 10.53, 10.01, 9.91, 9.14, 9.16, 9.55, 9.67,
8.44, 8.24, 9.1, 9.09, 9.35, 8.82, 9.32, 9.01, 9, 9.8,
9.83, 9.72, 9.89, 10.01, 9.37, 8.69, 8.19, 8.67, 9.55, 8.92,
8.09, 9.37, 10.13, 10.14, 9.51, 9.24, 8.66, 8.86, 8.05, 7.79,
6.75, 6.75, 7.82, 8.64, 10.58, 9.48, 7.38, 6.9, 6.94, 6.24,
6.84, 6.85, 6.9, 7.79, 8.18, 7.51, 7.23, 8.42, 9.61, 9.05,
9.26, 9.22, 9.38, 9.1, 7.95, 8.12, 9.75, 10.85, 10.41, 9.96,
9.61, 8.76, 8.18, 7.21, 7.13, 9.1, 8.25, 7.91, 6.89, 5.96,
6.8, 7.68, 8.38, 8.52, 9.74, 9.31, 9.89, 9.96
)
# Convert the vector to a time series object
lake_huron_ts <- ts(lake_huron_data)
# Fit AR(1) model using Arima function from forecast package
ar1_model <- Arima(lake_huron_ts, order=c(1,0,0))
ar1_se <- sqrt(diag(vcov(ar1_model))) # Extracting standard errors
# Fit AR(2) model using Arima function from forecast package
ar2_model <- Arima(lake_huron_ts, order=c(2,0,0))
ar2_se <- sqrt(diag(vcov(ar2_model))) # Extracting standard errors
# Perform ADF test on the original data (not on the model residuals)
# since adf.test expects raw time series data
adf_test_ar1 <- adf.test(lake_huron_ts, alternative="stationary", k=1)
adf_test_ar2 <- adf.test(lake_huron_ts, alternative="stationary", k=2)
# Output the standard errors and ADF test results
list(
AR1_SE = ar1_se,
AR1_ADF_Statistic = adf_test_ar1$statistic,
AR1_p_value = adf_test_ar1$p.value,
AR1_Critical_Values = adf_test_ar1$critical.values,
AR2_SE = ar2_se,
AR2_ADF_Statistic = adf_test_ar2$statistic,
AR2_p_value = adf_test_ar2$p.value,
AR2_Critical_Values = adf_test_ar2$critical.values
)
6.7
# Install and load necessary packages
if (!requireNamespace("forecast", quietly = TRUE)) {
install.packages("forecast")
}
library(forecast)
# Load the AirPassengers dataset and prepare the shortened version
data("AirPassengers")
airpass_short <- AirPassengers[1:(length(AirPassengers) - 12)]
# (a) Prepare the data by logging and differencing
# Log-transform the shortened dataset
air_1_logged <- log(airpass_short)
# Plot the first differences of the logged data
plot(diff(air_1_logged, lag = 1), type = 'l', main = "First Differences of Logged Data", ylab = "Differenced Log(Passengers)")

# Plot the seasonal differences of the logged data
plot(diff(air_1_logged, lag = 12), type = 'l', main = "Seasonal Differences of Logged Data", ylab = "Differenced Log(Passengers)")

# Differencing the logged data for seasonality
air_1_diff <- diff(air_1_logged, lag = 12)
# (b) Auto-fit an ARIMA model to identify the best model automatically based on AIC/BIC
auto_model <- auto.arima(air_1_diff)
# (c) Examine residuals to check for whiteness
# Plot residuals of the fitted ARIMA model
residuals <- residuals(auto_model)
plot(residuals, type = 'l', main = "Residuals of ARIMA Model")

# Check residuals for any autocorrelation with ACF and PACF plots
acf(residuals, main = "ACF of ARIMA Model Residuals")

pacf(residuals, main = "PACF of ARIMA Model Residuals")

# (d) Forecast future values with 95% confidence intervals
forecasts <- forecast(auto_model, h = 12, level = c(95))
# Ensure there are no infinite or NA values in the results
air_1_forecast <- air_1_forecast[!is.na(air_1_forecast)]
air_1_uci <- air_1_uci[!is.na(air_1_uci)]
air_1_lci <- air_1_lci[!is.na(air_1_lci)]
# Plotting forecasts along with the original data and confidence intervals
plot(AirPassengers, type = 'l', main = "Forecast with 95% Confidence Intervals", ylab = "Passenger Count")
lines(seq(length(air_1_logged) + 1, length(air_1_logged) + 12), air_1_forecast, col = 'red')
lines(seq(length(air_1_logged) + 1, length(air_1_logged) + 12), air_1_uci, col = 'red', lty = 2)
lines(seq(length(air_1_logged) + 1, length(air_1_logged) + 12), air_1_lci, col = 'red', lty = 2)

# (e) Print numerical values for the 12-step ahead forecast and the 95% prediction bounds
forecast_values <- data.frame(
PointForecast = air_1_forecast,
Lower95 = air_1_lci,
Upper95 = air_1_uci
)
print(forecast_values)
# Saving the shortened dataset
write.table(airpass_short, file = "ASHORT.TSM", row.names = FALSE, col.names = FALSE, quote = FALSE)
6.8
library(forecast)
library(stats)
# Assuming 'airpass' is the original non-log-transformed dataset
# Subtracting 12 from the length to reserve the last year for validation
air_1 <- log(airpass[1:(length(airpass) - 12)])
# Classical decomposition of the log-transformed data to extract trend and seasonal components
decomposed <- decompose(ts(air_1, frequency = 12))
# Deseasonalize by subtracting the seasonal component
air_1_deseason <- decomposed$x - decomposed$seasonal
# Subtracting the quadratic trend using a least squares regression model
x <- 1:length(air_1_deseason)
fit <- lm(air_1_deseason ~ poly(x, 2, raw=TRUE))
# Store the estimated trend for later use
est_trend <- fitted(fit)
# Residuals from the deseasonalized and detrended data
residuals <- air_1_deseason - est_trend
# Fit an ARMA model to the residuals
resid_model <- auto.arima(residuals)
# Forecast future values with the fitted ARMA model
forecast_resid <- forecast(resid_model, h = 12)
# Add back the estimated trend and seasonal components to the residuals' forecast
forecast_x <- length(air_1) + seq_along(forecast_resid$mean)
forecast_trend <- predict(fit, newdata = data.frame(x = forecast_x))
forecast_season <- decomposed$seasonal[1:12] # Assuming the seasonality repeats annually
forecast_mean <- forecast_resid$mean + forecast_trend + forecast_season
# Exponentiate to bring the forecast back to the original scale
forecast_final <- exp(forecast_mean)
# Actual values for the last year for comparison
actual_values <- airpass[(length(airpass) - 11):length(airpass)]
# Calculate errors
errors <- actual_values - forecast_final
log_forecast_lci <- forecast_resid$lower[, 2] # Assuming the 95% CI is in the 2nd column
log_forecast_uci <- forecast_resid$upper[, 2] # Assuming the 95% CI is in the 2nd column
# Add back the trend and seasonal components to the log confidence intervals
log_forecast_lci <- log_forecast_lci + forecast_trend + forecast_season
log_forecast_uci <- log_forecast_uci + forecast_trend + forecast_season
# Exponentiate to bring the forecast confidence intervals back to the original scale
forecast_lci <- exp(log_forecast_lci)
forecast_uci <- exp(log_forecast_uci)
# Compare with the results of Problem 6.7
# This step is up to you, as you need to calculate or obtain the errors from Problem 6.7 for comparison
# Plotting the original data and the forecast including confidence intervals
ts_plot <- ts(airpass, frequency = 12, start = c(1949, 1))
plot(ts_plot, main="Air Passengers Forecast vs Actual", ylab="Number of Passengers", xlab="Year", col = "black", lwd = 1)
points(ts_plot[(length(air_1)+1):length(airpass)], col = "blue", pch=19) # actual values
lines(forecast_x, forecast_final, col = "red", lwd = 2) # forecasted values
lines(forecast_x, forecast_lci, col = "red", lty = 2) # lower 95% CI
lines(forecast_x, forecast_uci, col = "red", lty = 2) # upper 95% CI
legend("topleft", legend=c("Actual", "Forecast", "95% CI"), col=c("blue", "red", "red"), lty=c(NA, 1, 2), pch=c(19, NA, NA), cex=0.8)

# Printing the forecast errors
performance_assess <- data.frame(
Act = actual_values,
For = forecast_final,
Err = errors,
LCL = forecast_lci,
UCL = forecast_uci
)
print(performance_assess)
NA
LS0tCnRpdGxlOiAnSVRTTSBQUk9CTEVNUycKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCjUuNQoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnJzdHVkaW8uY29tIikKCiMgTG9hZCB0aGUgbGlicmFyeQpsaWJyYXJ5KGZvcmVjYXN0KQpgYGAKCgpgYGB7cn0KIyBQYXJhbWV0ZXJzIGZvciB0aGUgTUEoMSkgcHJvY2Vzcwp0aGV0YSA8LSAwLjYKbiA8LSAyMDAgICMgTGVuZ3RoIG9mIGVhY2ggdGltZSBzZXJpZXMKbnVtX3NlcmllcyA8LSAyMCAgIyBOdW1iZXIgb2Ygc2VyaWVzIHRvIGdlbmVyYXRlCgojIEdlbmVyYXRlIDIwIHJlYWxpemF0aW9ucyBvZiB0aGUgTUEoMSkgcHJvY2VzcwpzZXQuc2VlZCg0MikKc2ltdWxhdGVkX3NlcmllcyA8LSBsYXBwbHkoMTpudW1fc2VyaWVzLCBmdW5jdGlvbihpKSB7CiAgYXJpbWEuc2ltKG1vZGVsPWxpc3QobWE9dGhldGEpLCBuPW4pCn0pCiMgUmVkdWNpbmcgdGhlIHNpemUgb2YgdGhlIG1hcmdpbnMKcGFyKG1mcm93PWMoNSwgNCksIG1hcj1jKDIsIDIsIDIsIDIpKSAgIyBTZXR0aW5nIHNtYWxsZXIgbWFyZ2lucwoKZm9yIChpIGluIDE6bnVtX3NlcmllcykgewogIHBsb3Qoc2ltdWxhdGVkX3Nlcmllc1tbaV1dLCB0eXBlID0gImwiLCBtYWluID0gcGFzdGUoIk1BKDEpIFNlcmllcyIsIGkpLCB5bGFiID0gIiIsIHhsYWIgPSAiVGltZSIpCn0KCmBgYAoKCmBgYHtyfQojIFBsb3R0aW5nIEFDRiBhbmQgUEFDRiBmb3IgdGhlIGZpcnN0IHNlcmllcwpwYXIobWZyb3c9YygxLDIpKQpBY2Yoc2ltdWxhdGVkX3Nlcmllc1tbMV1dLCBtYWluPSJBQ0Ygb2YgTUEoMSkgU2VyaWVzIikKUGFjZihzaW11bGF0ZWRfc2VyaWVzW1sxXV0sIG1haW49IlBBQ0Ygb2YgTUEoMSkgU2VyaWVzIikKYGBgCmBgYHtyfQojIEluaXRpYWxpemF0aW9uCmlubm92YXRpb25zX2VzdGltYXRlcyA8LSBudW1lcmljKG51bV9zZXJpZXMpCm1sZV9lc3RpbWF0ZXMgPC0gbnVtZXJpYyhudW1fc2VyaWVzKQoKIyBFc3RpbWF0aW9uCmZvciAoaSBpbiAxOm51bV9zZXJpZXMpIHsKICBmaXRfaW5ub3YgPC0gdHJ5Q2F0Y2goewogICAgQXJpbWEoc2ltdWxhdGVkX3Nlcmllc1tbaV1dLCBvcmRlcj1jKDAsMCwxKSwgbWV0aG9kPSJDU1MiKQogIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgTlVMTCkKICAKICBmaXRfbWxlIDwtIHRyeUNhdGNoKHsKICAgIEFyaW1hKHNpbXVsYXRlZF9zZXJpZXNbW2ldXSwgb3JkZXI9YygwLDAsMSksIG1ldGhvZD0iTUwiKQogIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgTlVMTCkKCiAgIyBDaGVjayBpZiB0aGUgZml0IG9iamVjdCBpcyBOVUxMLCB3aGljaCBtZWFucyB0aGUgZml0dGluZyBmYWlsZWQKICBpZiAoIWlzLm51bGwoZml0X2lubm92KSAmJiAibWExIiAlaW4lIG5hbWVzKGZpdF9pbm5vdiRjb2VmKSkgewogICAgaW5ub3ZhdGlvbnNfZXN0aW1hdGVzW2ldIDwtIGZpdF9pbm5vdiRjb2VmWyJtYTEiXQogIH0gZWxzZSB7CiAgICBpbm5vdmF0aW9uc19lc3RpbWF0ZXNbaV0gPC0gTkEgICMgQXNzaWduIE5BIGlmIHRoZSBtb2RlbCBkaWQgbm90IHJldHVybiBhIHJlc3VsdAogIH0KCiAgaWYgKCFpcy5udWxsKGZpdF9tbGUpICYmICJtYTEiICVpbiUgbmFtZXMoZml0X21sZSRjb2VmKSkgewogICAgbWxlX2VzdGltYXRlc1tpXSA8LSBmaXRfbWxlJGNvZWZbIm1hMSJdCiAgfSBlbHNlIHsKICAgIG1sZV9lc3RpbWF0ZXNbaV0gPC0gTkEgICMgQXNzaWduIE5BIGlmIHRoZSBtb2RlbCBkaWQgbm90IHJldHVybiBhIHJlc3VsdAogIH0KfQoKIyBPdXRwdXQgcmVzdWx0cyB3aXRoIE5BIGhhbmRsaW5nCiMgUHJpbnQgcmVzdWx0cyB3aXRoIG5hbWVzCnJlc3VsdHMgPC0gYygKICBtZWFuX2lubm92YXRpb25zID0gbWVhbihpbm5vdmF0aW9uc19lc3RpbWF0ZXMsIG5hLnJtID0gVFJVRSksCiAgdmFyaWFuY2VfaW5ub3ZhdGlvbnMgPSB2YXIoaW5ub3ZhdGlvbnNfZXN0aW1hdGVzLCBuYS5ybSA9IFRSVUUpLAogIG1lYW5fbWxlID0gbWVhbihtbGVfZXN0aW1hdGVzLCBuYS5ybSA9IFRSVUUpLAogIHZhcmlhbmNlX21sZSA9IHZhcihtbGVfZXN0aW1hdGVzLCBuYS5ybSA9IFRSVUUpCikKCiMgVXNlIHByaW50IHRvIGRpc3BsYXkgdGhlIG5hbWVkIHJlc3VsdHMKcHJpbnQocmVzdWx0cykKYGBgCgoKYGBge3J9CiMgU2ltdWxhdGUgdGhlIGNyZWF0aW9uIG9mIGVzdGltYXRlcyBhcyBleGFtcGxlcwojIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggeW91ciBhY3R1YWwgY2FsY3VsYXRpb25zCm1vbWVudF9lc3RpbWF0ZXMgPC0gcm5vcm0oMTAwLCBtZWFuID0gMC42LCBzZCA9IDEpICAjIFBsYWNlaG9sZGVyIGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMKaW5ub3ZhdGlvbnNfZXN0aW1hdGVzIDwtIHJub3JtKDEwMCwgbWVhbiA9IDAuNiwgc2QgPSAxKSAgIyBQbGFjZWhvbGRlcgptbGVfZXN0aW1hdGVzIDwtIHJub3JtKDEwMCwgbWVhbiA9IDAuNiwgc2QgPSAxKSAgIyBQbGFjZWhvbGRlcgoKIyBDYWxjdWxhdGUgbWVhbnMgYW5kIHZhcmlhbmNlcwptZWFuX21vbWVudCA8LSBtZWFuKG1vbWVudF9lc3RpbWF0ZXMsIG5hLnJtID0gVFJVRSkKdmFyaWFuY2VfbW9tZW50IDwtIHZhcihtb21lbnRfZXN0aW1hdGVzLCBuYS5ybSA9IFRSVUUpCm1lYW5faW5ub3ZhdGlvbnMgPC0gbWVhbihpbm5vdmF0aW9uc19lc3RpbWF0ZXMsIG5hLnJtID0gVFJVRSkKdmFyaWFuY2VfaW5ub3ZhdGlvbnMgPC0gdmFyKGlubm92YXRpb25zX2VzdGltYXRlcywgbmEucm0gPSBUUlVFKQptZWFuX21sZSA8LSBtZWFuKG1sZV9lc3RpbWF0ZXMsIG5hLnJtID0gVFJVRSkKdmFyaWFuY2VfbWxlIDwtIHZhcihtbGVfZXN0aW1hdGVzLCBuYS5ybSA9IFRSVUUpCgojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciB3aXRoIGFsbCByZXN1bHRzCnJlc3VsdHMgPC0gYygKICBtZWFuX21vbWVudCA9IG1lYW5fbW9tZW50LAogIHZhcmlhbmNlX21vbWVudCA9IHZhcmlhbmNlX21vbWVudCwKICBtZWFuX2lubm92YXRpb25zID0gbWVhbl9pbm5vdmF0aW9ucywKICB2YXJpYW5jZV9pbm5vdmF0aW9ucyA9IHZhcmlhbmNlX2lubm92YXRpb25zLAogIG1lYW5fbWxlID0gbWVhbl9tbGUsCiAgdmFyaWFuY2VfbWxlID0gdmFyaWFuY2VfbWxlCikKCiMgUHJpbnQgdGhlIHJlc3VsdHMKcHJpbnQoIlJlc3VsdHM6IikKcHJpbnQocmVzdWx0cykKYGBgCgo2LjQKCmBgYHtyfQojIExvYWQgdGhlIHRzZXJpZXMgcGFja2FnZQpsaWJyYXJ5KHRzZXJpZXMpCmxpYnJhcnkoZm9yZWNhc3QpCiMgWW91ciBkYXRhIGFzIGEgbnVtZXJpYyB2ZWN0b3IKbGFrZV9odXJvbl9kYXRhIDwtIGMoCiAgICAxMC4zOCwgMTEuODYsIDEwLjk3LCAxMC44LCA5Ljc5LCAxMC4zOSwgMTAuNDIsIDEwLjgyLCAxMS40LCAxMS4zMiwKICAgIDExLjQ0LCAxMS42OCwgMTEuMTcsIDEwLjUzLCAxMC4wMSwgOS45MSwgOS4xNCwgOS4xNiwgOS41NSwgOS42NywKICAgIDguNDQsIDguMjQsIDkuMSwgOS4wOSwgOS4zNSwgOC44MiwgOS4zMiwgOS4wMSwgOSwgOS44LAogICAgOS44MywgOS43MiwgOS44OSwgMTAuMDEsIDkuMzcsIDguNjksIDguMTksIDguNjcsIDkuNTUsIDguOTIsCiAgICA4LjA5LCA5LjM3LCAxMC4xMywgMTAuMTQsIDkuNTEsIDkuMjQsIDguNjYsIDguODYsIDguMDUsIDcuNzksCiAgICA2Ljc1LCA2Ljc1LCA3LjgyLCA4LjY0LCAxMC41OCwgOS40OCwgNy4zOCwgNi45LCA2Ljk0LCA2LjI0LAogICAgNi44NCwgNi44NSwgNi45LCA3Ljc5LCA4LjE4LCA3LjUxLCA3LjIzLCA4LjQyLCA5LjYxLCA5LjA1LAogICAgOS4yNiwgOS4yMiwgOS4zOCwgOS4xLCA3Ljk1LCA4LjEyLCA5Ljc1LCAxMC44NSwgMTAuNDEsIDkuOTYsCiAgICA5LjYxLCA4Ljc2LCA4LjE4LCA3LjIxLCA3LjEzLCA5LjEsIDguMjUsIDcuOTEsIDYuODksIDUuOTYsCiAgICA2LjgsIDcuNjgsIDguMzgsIDguNTIsIDkuNzQsIDkuMzEsIDkuODksIDkuOTYKKQoKIyBDb252ZXJ0IHRoZSB2ZWN0b3IgdG8gYSB0aW1lIHNlcmllcyBvYmplY3QKbGFrZV9odXJvbl90cyA8LSB0cyhsYWtlX2h1cm9uX2RhdGEpCgojIEZpdCBBUigxKSBtb2RlbCB1c2luZyBBcmltYSBmdW5jdGlvbiBmcm9tIGZvcmVjYXN0IHBhY2thZ2UKYXIxX21vZGVsIDwtIEFyaW1hKGxha2VfaHVyb25fdHMsIG9yZGVyPWMoMSwwLDApKQphcjFfc2UgPC0gc3FydChkaWFnKHZjb3YoYXIxX21vZGVsKSkpICAjIEV4dHJhY3Rpbmcgc3RhbmRhcmQgZXJyb3JzCgojIEZpdCBBUigyKSBtb2RlbCB1c2luZyBBcmltYSBmdW5jdGlvbiBmcm9tIGZvcmVjYXN0IHBhY2thZ2UKYXIyX21vZGVsIDwtIEFyaW1hKGxha2VfaHVyb25fdHMsIG9yZGVyPWMoMiwwLDApKQphcjJfc2UgPC0gc3FydChkaWFnKHZjb3YoYXIyX21vZGVsKSkpICAjIEV4dHJhY3Rpbmcgc3RhbmRhcmQgZXJyb3JzCgojIFBlcmZvcm0gQURGIHRlc3Qgb24gdGhlIG9yaWdpbmFsIGRhdGEgKG5vdCBvbiB0aGUgbW9kZWwgcmVzaWR1YWxzKQojIHNpbmNlIGFkZi50ZXN0IGV4cGVjdHMgcmF3IHRpbWUgc2VyaWVzIGRhdGEKYWRmX3Rlc3RfYXIxIDwtIGFkZi50ZXN0KGxha2VfaHVyb25fdHMsIGFsdGVybmF0aXZlPSJzdGF0aW9uYXJ5Iiwgaz0xKQphZGZfdGVzdF9hcjIgPC0gYWRmLnRlc3QobGFrZV9odXJvbl90cywgYWx0ZXJuYXRpdmU9InN0YXRpb25hcnkiLCBrPTIpCgojIE91dHB1dCB0aGUgc3RhbmRhcmQgZXJyb3JzIGFuZCBBREYgdGVzdCByZXN1bHRzCmxpc3QoCiAgQVIxX1NFID0gYXIxX3NlLAogIEFSMV9BREZfU3RhdGlzdGljID0gYWRmX3Rlc3RfYXIxJHN0YXRpc3RpYywKICBBUjFfcF92YWx1ZSA9IGFkZl90ZXN0X2FyMSRwLnZhbHVlLAogIEFSMV9Dcml0aWNhbF9WYWx1ZXMgPSBhZGZfdGVzdF9hcjEkY3JpdGljYWwudmFsdWVzLAogIEFSMl9TRSA9IGFyMl9zZSwKICBBUjJfQURGX1N0YXRpc3RpYyA9IGFkZl90ZXN0X2FyMiRzdGF0aXN0aWMsCiAgQVIyX3BfdmFsdWUgPSBhZGZfdGVzdF9hcjIkcC52YWx1ZSwKICBBUjJfQ3JpdGljYWxfVmFsdWVzID0gYWRmX3Rlc3RfYXIyJGNyaXRpY2FsLnZhbHVlcwopCgpgYGAKCjYuNwoKYGBge3J9CiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMKCmxpYnJhcnkoZm9yZWNhc3QpCgojIExvYWQgdGhlIEFpclBhc3NlbmdlcnMgZGF0YXNldCBhbmQgcHJlcGFyZSB0aGUgc2hvcnRlbmVkIHZlcnNpb24KZGF0YSgiQWlyUGFzc2VuZ2VycyIpCmFpcnBhc3Nfc2hvcnQgPC0gQWlyUGFzc2VuZ2Vyc1sxOihsZW5ndGgoQWlyUGFzc2VuZ2VycykgLSAxMildCgojIChhKSBQcmVwYXJlIHRoZSBkYXRhIGJ5IGxvZ2dpbmcgYW5kIGRpZmZlcmVuY2luZwojIExvZy10cmFuc2Zvcm0gdGhlIHNob3J0ZW5lZCBkYXRhc2V0CmFpcl8xX2xvZ2dlZCA8LSBsb2coYWlycGFzc19zaG9ydCkKCiMgUGxvdCB0aGUgZmlyc3QgZGlmZmVyZW5jZXMgb2YgdGhlIGxvZ2dlZCBkYXRhCnBsb3QoZGlmZihhaXJfMV9sb2dnZWQsIGxhZyA9IDEpLCB0eXBlID0gJ2wnLCBtYWluID0gIkZpcnN0IERpZmZlcmVuY2VzIG9mIExvZ2dlZCBEYXRhIiwgeWxhYiA9ICJEaWZmZXJlbmNlZCBMb2coUGFzc2VuZ2VycykiKQoKIyBQbG90IHRoZSBzZWFzb25hbCBkaWZmZXJlbmNlcyBvZiB0aGUgbG9nZ2VkIGRhdGEKcGxvdChkaWZmKGFpcl8xX2xvZ2dlZCwgbGFnID0gMTIpLCB0eXBlID0gJ2wnLCBtYWluID0gIlNlYXNvbmFsIERpZmZlcmVuY2VzIG9mIExvZ2dlZCBEYXRhIiwgeWxhYiA9ICJEaWZmZXJlbmNlZCBMb2coUGFzc2VuZ2VycykiKQoKIyBEaWZmZXJlbmNpbmcgdGhlIGxvZ2dlZCBkYXRhIGZvciBzZWFzb25hbGl0eQphaXJfMV9kaWZmIDwtIGRpZmYoYWlyXzFfbG9nZ2VkLCBsYWcgPSAxMikKCiMgKGIpIEF1dG8tZml0IGFuIEFSSU1BIG1vZGVsIHRvIGlkZW50aWZ5IHRoZSBiZXN0IG1vZGVsIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gQUlDL0JJQwphdXRvX21vZGVsIDwtIGF1dG8uYXJpbWEoYWlyXzFfZGlmZikKCiMgKGMpIEV4YW1pbmUgcmVzaWR1YWxzIHRvIGNoZWNrIGZvciB3aGl0ZW5lc3MKIyBQbG90IHJlc2lkdWFscyBvZiB0aGUgZml0dGVkIEFSSU1BIG1vZGVsCnJlc2lkdWFscyA8LSByZXNpZHVhbHMoYXV0b19tb2RlbCkKcGxvdChyZXNpZHVhbHMsIHR5cGUgPSAnbCcsIG1haW4gPSAiUmVzaWR1YWxzIG9mIEFSSU1BIE1vZGVsIikKIyBDaGVjayByZXNpZHVhbHMgZm9yIGFueSBhdXRvY29ycmVsYXRpb24gd2l0aCBBQ0YgYW5kIFBBQ0YgcGxvdHMKYWNmKHJlc2lkdWFscywgbWFpbiA9ICJBQ0Ygb2YgQVJJTUEgTW9kZWwgUmVzaWR1YWxzIikKcGFjZihyZXNpZHVhbHMsIG1haW4gPSAiUEFDRiBvZiBBUklNQSBNb2RlbCBSZXNpZHVhbHMiKQoKIyAoZCkgRm9yZWNhc3QgZnV0dXJlIHZhbHVlcyB3aXRoIDk1JSBjb25maWRlbmNlIGludGVydmFscwpmb3JlY2FzdHMgPC0gZm9yZWNhc3QoYXV0b19tb2RlbCwgaCA9IDEyLCBsZXZlbCA9IGMoOTUpKQoKIyBFbnN1cmUgdGhlcmUgYXJlIG5vIGluZmluaXRlIG9yIE5BIHZhbHVlcyBpbiB0aGUgcmVzdWx0cwphaXJfMV9mb3JlY2FzdCA8LSBhaXJfMV9mb3JlY2FzdFshaXMubmEoYWlyXzFfZm9yZWNhc3QpXQphaXJfMV91Y2kgPC0gYWlyXzFfdWNpWyFpcy5uYShhaXJfMV91Y2kpXQphaXJfMV9sY2kgPC0gYWlyXzFfbGNpWyFpcy5uYShhaXJfMV9sY2kpXQoKIyBQbG90dGluZyBmb3JlY2FzdHMgYWxvbmcgd2l0aCB0aGUgb3JpZ2luYWwgZGF0YSBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKcGxvdChBaXJQYXNzZW5nZXJzLCB0eXBlID0gJ2wnLCBtYWluID0gIkZvcmVjYXN0IHdpdGggOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWxzIiwgeWxhYiA9ICJQYXNzZW5nZXIgQ291bnQiKQpsaW5lcyhzZXEobGVuZ3RoKGFpcl8xX2xvZ2dlZCkgKyAxLCBsZW5ndGgoYWlyXzFfbG9nZ2VkKSArIDEyKSwgYWlyXzFfZm9yZWNhc3QsIGNvbCA9ICdyZWQnKQpsaW5lcyhzZXEobGVuZ3RoKGFpcl8xX2xvZ2dlZCkgKyAxLCBsZW5ndGgoYWlyXzFfbG9nZ2VkKSArIDEyKSwgYWlyXzFfdWNpLCBjb2wgPSAncmVkJywgbHR5ID0gMikKbGluZXMoc2VxKGxlbmd0aChhaXJfMV9sb2dnZWQpICsgMSwgbGVuZ3RoKGFpcl8xX2xvZ2dlZCkgKyAxMiksIGFpcl8xX2xjaSwgY29sID0gJ3JlZCcsIGx0eSA9IDIpCgoKIyAoZSkgUHJpbnQgbnVtZXJpY2FsIHZhbHVlcyBmb3IgdGhlIDEyLXN0ZXAgYWhlYWQgZm9yZWNhc3QgYW5kIHRoZSA5NSUgcHJlZGljdGlvbiBib3VuZHMKZm9yZWNhc3RfdmFsdWVzIDwtIGRhdGEuZnJhbWUoCiAgUG9pbnRGb3JlY2FzdCA9IGFpcl8xX2ZvcmVjYXN0LAogIExvd2VyOTUgPSBhaXJfMV9sY2ksCiAgVXBwZXI5NSA9IGFpcl8xX3VjaQopCnByaW50KGZvcmVjYXN0X3ZhbHVlcykKCiMgU2F2aW5nIHRoZSBzaG9ydGVuZWQgZGF0YXNldAp3cml0ZS50YWJsZShhaXJwYXNzX3Nob3J0LCBmaWxlID0gIkFTSE9SVC5UU00iLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UpCgoKCgoKYGBgCgoKCgoKCgoKCgoKCgo2LjgKCmBgYHtyfQpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KHN0YXRzKQoKIyBBc3N1bWluZyAnYWlycGFzcycgaXMgdGhlIG9yaWdpbmFsIG5vbi1sb2ctdHJhbnNmb3JtZWQgZGF0YXNldAojIFN1YnRyYWN0aW5nIDEyIGZyb20gdGhlIGxlbmd0aCB0byByZXNlcnZlIHRoZSBsYXN0IHllYXIgZm9yIHZhbGlkYXRpb24KYWlyXzEgPC0gbG9nKGFpcnBhc3NbMToobGVuZ3RoKGFpcnBhc3MpIC0gMTIpXSkKCiMgQ2xhc3NpY2FsIGRlY29tcG9zaXRpb24gb2YgdGhlIGxvZy10cmFuc2Zvcm1lZCBkYXRhIHRvIGV4dHJhY3QgdHJlbmQgYW5kIHNlYXNvbmFsIGNvbXBvbmVudHMKZGVjb21wb3NlZCA8LSBkZWNvbXBvc2UodHMoYWlyXzEsIGZyZXF1ZW5jeSA9IDEyKSkKCiMgRGVzZWFzb25hbGl6ZSBieSBzdWJ0cmFjdGluZyB0aGUgc2Vhc29uYWwgY29tcG9uZW50CmFpcl8xX2Rlc2Vhc29uIDwtIGRlY29tcG9zZWQkeCAtIGRlY29tcG9zZWQkc2Vhc29uYWwKCiMgU3VidHJhY3RpbmcgdGhlIHF1YWRyYXRpYyB0cmVuZCB1c2luZyBhIGxlYXN0IHNxdWFyZXMgcmVncmVzc2lvbiBtb2RlbAp4IDwtIDE6bGVuZ3RoKGFpcl8xX2Rlc2Vhc29uKQpmaXQgPC0gbG0oYWlyXzFfZGVzZWFzb24gfiBwb2x5KHgsIDIsIHJhdz1UUlVFKSkKCiMgU3RvcmUgdGhlIGVzdGltYXRlZCB0cmVuZCBmb3IgbGF0ZXIgdXNlCmVzdF90cmVuZCA8LSBmaXR0ZWQoZml0KQoKIyBSZXNpZHVhbHMgZnJvbSB0aGUgZGVzZWFzb25hbGl6ZWQgYW5kIGRldHJlbmRlZCBkYXRhCnJlc2lkdWFscyA8LSBhaXJfMV9kZXNlYXNvbiAtIGVzdF90cmVuZAoKIyBGaXQgYW4gQVJNQSBtb2RlbCB0byB0aGUgcmVzaWR1YWxzCnJlc2lkX21vZGVsIDwtIGF1dG8uYXJpbWEocmVzaWR1YWxzKQoKIyBGb3JlY2FzdCBmdXR1cmUgdmFsdWVzIHdpdGggdGhlIGZpdHRlZCBBUk1BIG1vZGVsCmZvcmVjYXN0X3Jlc2lkIDwtIGZvcmVjYXN0KHJlc2lkX21vZGVsLCBoID0gMTIpCgojIEFkZCBiYWNrIHRoZSBlc3RpbWF0ZWQgdHJlbmQgYW5kIHNlYXNvbmFsIGNvbXBvbmVudHMgdG8gdGhlIHJlc2lkdWFscycgZm9yZWNhc3QKZm9yZWNhc3RfeCA8LSBsZW5ndGgoYWlyXzEpICsgc2VxX2Fsb25nKGZvcmVjYXN0X3Jlc2lkJG1lYW4pCmZvcmVjYXN0X3RyZW5kIDwtIHByZWRpY3QoZml0LCBuZXdkYXRhID0gZGF0YS5mcmFtZSh4ID0gZm9yZWNhc3RfeCkpCmZvcmVjYXN0X3NlYXNvbiA8LSBkZWNvbXBvc2VkJHNlYXNvbmFsWzE6MTJdICMgQXNzdW1pbmcgdGhlIHNlYXNvbmFsaXR5IHJlcGVhdHMgYW5udWFsbHkKZm9yZWNhc3RfbWVhbiA8LSBmb3JlY2FzdF9yZXNpZCRtZWFuICsgZm9yZWNhc3RfdHJlbmQgKyBmb3JlY2FzdF9zZWFzb24KCiMgRXhwb25lbnRpYXRlIHRvIGJyaW5nIHRoZSBmb3JlY2FzdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzY2FsZQpmb3JlY2FzdF9maW5hbCA8LSBleHAoZm9yZWNhc3RfbWVhbikKCgojIEFjdHVhbCB2YWx1ZXMgZm9yIHRoZSBsYXN0IHllYXIgZm9yIGNvbXBhcmlzb24KYWN0dWFsX3ZhbHVlcyA8LSBhaXJwYXNzWyhsZW5ndGgoYWlycGFzcykgLSAxMSk6bGVuZ3RoKGFpcnBhc3MpXQoKIyBDYWxjdWxhdGUgZXJyb3JzCmVycm9ycyA8LSBhY3R1YWxfdmFsdWVzIC0gZm9yZWNhc3RfZmluYWwKCmxvZ19mb3JlY2FzdF9sY2kgPC0gZm9yZWNhc3RfcmVzaWQkbG93ZXJbLCAyXSAgIyBBc3N1bWluZyB0aGUgOTUlIENJIGlzIGluIHRoZSAybmQgY29sdW1uCmxvZ19mb3JlY2FzdF91Y2kgPC0gZm9yZWNhc3RfcmVzaWQkdXBwZXJbLCAyXSAgIyBBc3N1bWluZyB0aGUgOTUlIENJIGlzIGluIHRoZSAybmQgY29sdW1uCgojIEFkZCBiYWNrIHRoZSB0cmVuZCBhbmQgc2Vhc29uYWwgY29tcG9uZW50cyB0byB0aGUgbG9nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCmxvZ19mb3JlY2FzdF9sY2kgPC0gbG9nX2ZvcmVjYXN0X2xjaSArIGZvcmVjYXN0X3RyZW5kICsgZm9yZWNhc3Rfc2Vhc29uCmxvZ19mb3JlY2FzdF91Y2kgPC0gbG9nX2ZvcmVjYXN0X3VjaSArIGZvcmVjYXN0X3RyZW5kICsgZm9yZWNhc3Rfc2Vhc29uCgojIEV4cG9uZW50aWF0ZSB0byBicmluZyB0aGUgZm9yZWNhc3QgY29uZmlkZW5jZSBpbnRlcnZhbHMgYmFjayB0byB0aGUgb3JpZ2luYWwgc2NhbGUKZm9yZWNhc3RfbGNpIDwtIGV4cChsb2dfZm9yZWNhc3RfbGNpKQpmb3JlY2FzdF91Y2kgPC0gZXhwKGxvZ19mb3JlY2FzdF91Y2kpCiMgQ29tcGFyZSB3aXRoIHRoZSByZXN1bHRzIG9mIFByb2JsZW0gNi43CiMgVGhpcyBzdGVwIGlzIHVwIHRvIHlvdSwgYXMgeW91IG5lZWQgdG8gY2FsY3VsYXRlIG9yIG9idGFpbiB0aGUgZXJyb3JzIGZyb20gUHJvYmxlbSA2LjcgZm9yIGNvbXBhcmlzb24KIyBQbG90dGluZyB0aGUgb3JpZ2luYWwgZGF0YSBhbmQgdGhlIGZvcmVjYXN0IGluY2x1ZGluZyBjb25maWRlbmNlIGludGVydmFscwp0c19wbG90IDwtIHRzKGFpcnBhc3MsIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMTk0OSwgMSkpCnBsb3QodHNfcGxvdCwgbWFpbj0iQWlyIFBhc3NlbmdlcnMgRm9yZWNhc3QgdnMgQWN0dWFsIiwgeWxhYj0iTnVtYmVyIG9mIFBhc3NlbmdlcnMiLCB4bGFiPSJZZWFyIiwgY29sID0gImJsYWNrIiwgbHdkID0gMSkKcG9pbnRzKHRzX3Bsb3RbKGxlbmd0aChhaXJfMSkrMSk6bGVuZ3RoKGFpcnBhc3MpXSwgY29sID0gImJsdWUiLCBwY2g9MTkpICMgYWN0dWFsIHZhbHVlcwpsaW5lcyhmb3JlY2FzdF94LCBmb3JlY2FzdF9maW5hbCwgY29sID0gInJlZCIsIGx3ZCA9IDIpICMgZm9yZWNhc3RlZCB2YWx1ZXMKbGluZXMoZm9yZWNhc3RfeCwgZm9yZWNhc3RfbGNpLCBjb2wgPSAicmVkIiwgbHR5ID0gMikgIyBsb3dlciA5NSUgQ0kKbGluZXMoZm9yZWNhc3RfeCwgZm9yZWNhc3RfdWNpLCBjb2wgPSAicmVkIiwgbHR5ID0gMikgIyB1cHBlciA5NSUgQ0kKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kPWMoIkFjdHVhbCIsICJGb3JlY2FzdCIsICI5NSUgQ0kiKSwgY29sPWMoImJsdWUiLCAicmVkIiwgInJlZCIpLCBsdHk9YyhOQSwgMSwgMiksIHBjaD1jKDE5LCBOQSwgTkEpLCBjZXg9MC44KQoKCgoKIyBQcmludGluZyB0aGUgZm9yZWNhc3QgZXJyb3JzCnBlcmZvcm1hbmNlX2Fzc2VzcyA8LSBkYXRhLmZyYW1lKAogIEFjdCA9IGFjdHVhbF92YWx1ZXMsCiAgRm9yID0gZm9yZWNhc3RfZmluYWwsCiAgRXJyID0gZXJyb3JzLAogIExDTCA9IGZvcmVjYXN0X2xjaSwKICBVQ0wgPSBmb3JlY2FzdF91Y2kKKQoKcHJpbnQocGVyZm9ybWFuY2VfYXNzZXNzKQoKYGBgCgoKCgoKCgoKCgo=