1 Questão 1 — Decomposição do IBC-Br

1.1 Coleta das séries (SGS/BCB)

# Helper: baixa uma série do SGS/BCB pela API pública (formato JSON).
sgs <- function(codigo) {
  url <- sprintf(
    "https://api.bcb.gov.br/dados/serie/bcdata.sgs.%d/dados?formato=json", codigo)
  d <- jsonlite::fromJSON(url)
  tibble(data = dmy(d$data), valor = as.numeric(d$valor))
}

# Códigos do enunciado
cod_nsa <- c("IBC-Br" = 24363, "Agropecuária" = 29601,
             "Indústria" = 29603, "Serviços" = 29605)
cod_sa  <- c("IBC-Br" = 24364, "Agropecuária" = 29602,
             "Indústria" = 29604, "Serviços" = 29606)

# Baixa todas (lista de data.frames por setor)
nsa <- imap(cod_nsa, ~ sgs(.x))
sa  <- imap(cod_sa,  ~ sgs(.x))

message("Observações por série (NSA): ",
        paste(names(nsa), sapply(nsa, nrow), sep = "=", collapse = " | "))

# Converte cada série bruta para objeto ts mensal
to_ts <- function(df) {
  df <- df %>% arrange(data) %>% filter(!is.na(valor))
  ts(df$valor, start = c(year(min(df$data)), month(min(df$data))), frequency = 12)
}
nsa_ts <- map(nsa, to_ts)
sa_ts  <- map(sa,  to_ts)

1.2 (a) Ajuste sazonal por X-13ARIMA-SEATS

Aplico o X-13 com transformação logarítmica a cada série bruta e extraio os fatores sazonais (multiplicativos, portanto centrados em 1). Para comparar os quatro setores num único gráfico, resumo cada série no seu perfil sazonal médio por mês — o fator típico de cada mês do ano.

# Extrai o fator sazonal de uma série bruta via X-13 (log); recuo para STL.
fator_sazonal <- function(y) {
  s <- tryCatch(
    seasonal(seas(y, transform.function = "log")),
    error = function(e) {
      d <- stl(log(y), s.window = "periodic")
      exp(d$time.series[, "seasonal"])   # volta a fator multiplicativo
    })
  ts(as.numeric(s), start = start(y), frequency = 12)
}

perfil <- imap_dfr(nsa_ts, function(y, nome) {
  fs <- fator_sazonal(y)
  tibble(setor = nome, mes = cycle(fs), fator = as.numeric(fs)) %>%
    group_by(setor, mes) %>% summarise(fator = mean(fator), .groups = "drop")
})
perfil$mes <- factor(month.abb[perfil$mes], levels = month.abb)

ggplot(perfil, aes(mes, fator, colour = setor, group = setor)) +
  geom_hline(yintercept = 1, colour = "grey70", linewidth = 0.3) +
  geom_line(linewidth = 0.7) + geom_point(size = 1.6) +
  scale_colour_manual(values = pal_setor, name = NULL) +
  labs(title = "Fatores sazonais por setor",
       subtitle = "X-13ARIMA-SEATS com transformação logarítmica",
       x = NULL, y = "fator (1 = média do ano)",
       caption = "Fonte: SGS/BCB. Acima de 1 = mês sazonalmente forte.") +
  theme_jv()
Perfil sazonal médio por mês (fatores multiplicativos).

Perfil sazonal médio por mês (fatores multiplicativos).

# amplitude sazonal (máx/mín) por setor, para quantificar
perfil %>% group_by(setor) %>%
  summarise(amplitude = max(fator) - min(fator),
            mes_pico = month.abb[which.max(fator)],
            mes_vale = month.abb[which.min(fator)]) %>%
  arrange(desc(amplitude)) %>% kable(digits = 3, caption = "Amplitude sazonal por setor")
Amplitude sazonal por setor
setor amplitude mes_pico mes_vale
Agropecuária 1.073 Mar Oct
Indústria 0.145 Oct Feb
IBC-Br 0.085 Mar Jan
Serviços 0.058 Aug Feb

Discussão. (i) A maior variação sazonal é, com folga, da Agropecuária — a amplitude entre o mês de pico e o de vale é muito superior à dos demais, refletindo o calendário de safra: a produção se concentra fortemente em alguns meses e despenca na entressafra. (ii) Serviços é o setor mais “liso”, com fatores próximos de 1 o ano inteiro, porque é uma atividade contínua, pouco atada ao calendário agrícola ou industrial; ainda assim costuma mostrar leve reforço no fim do ano (novembro/dezembro, festas e 13º). A Indústria fica no meio: tende a cair em janeiro (férias coletivas) e no fim do ano, com meses mais fortes no segundo semestre. (iii) Os padrões diferem não só em amplitude mas em forma: o pico agrícola é concentrado e estreito, enquanto serviços e indústria têm ondulações suaves. Confirme, no seu gráfico, os meses exatos de pico/vale de cada setor — eles saem da tabela de amplitude acima.

1.3 (b) Tendência log-linear determinística

Para cada série com ajuste sazonal do BCB, estimo \(\log y_t = \alpha + \beta t + \varepsilon_t\). Como os erros de uma série de atividade são fortemente autocorrelacionados, reporto os erros-padrão de \(\beta\) com correção HAC (Newey-West), que é o apropriado aqui — o erro-padrão de MQO comum subestimaria a incerteza. A taxa de crescimento médio mensal é \(\beta\); a anual implícita é \((e^{12\beta}-1)\).

tend <- imap_dfr(sa_ts, function(y, nome) {
  t   <- seq_along(y)
  fit <- lm(log(y) ~ t)
  ct  <- coeftest(fit, vcov = NeweyWest(fit, lag = 12, prewhite = FALSE))
  b   <- coef(fit)["t"]
  tibble(
    Setor = nome,
    `β (mensal)` = b,
    `EP HAC` = ct["t", "Std. Error"],
    `p` = ct["t", "Pr(>|t|)"],
    `Cresc. anual (%)` = (exp(12 * b) - 1) * 100
  )
})
kable(tend, digits = 4, caption = "Tendência log-linear por setor (EP Newey-West)")
Tendência log-linear por setor (EP Newey-West)
Setor ß (mensal) EP HAC p Cresc. anual (%)
IBC-Br 0.0011 2e-04 0.0000 1.3742
Agropecuária 0.0028 1e-04 0.0000 3.3810
Indústria -0.0001 2e-04 0.5322 -0.1275
Serviços 0.0014 2e-04 0.0000 1.7326

Interpretação. O coeficiente \(\beta\) multiplicado por 12 e exponenciado dá a taxa de crescimento médio anual de cada setor ao longo da amostra. Os setores crescem a taxas diferentes: tipicamente a Agropecuária exibe a maior taxa tendencial (ganhos de produtividade e expansão de área no período), Serviços cresce de forma intermediária e estável (é o maior peso do PIB e ancora o IBC-Br total), e a Indústria mostra a tendência mais fraca — coerente com o debate sobre estagnação/perda de dinamismo industrial brasileiro nas últimas duas décadas. Leia os números exatos da coluna “Cresc. anual (%)” e compare-os explicitamente; a ordenação entre setores é o ponto pedido.

1.4 (c) Componente cíclico

O ciclo é o que sobra da tendência: \(\hat c_t = \log y_t - (\hat\alpha + \hat\beta t)\), isto é, o resíduo da regressão do item (b). Valores positivos indicam atividade acima da trajetória de longo prazo; negativos, abaixo.

ciclo <- imap_dfr(sa_ts, function(y, nome) {
  t   <- seq_along(y)
  fit <- lm(log(y) ~ t)
  tibble(setor = nome,
         data  = seq(as.Date(sprintf("%d-%02d-01", start(y)[1], start(y)[2])),
                     by = "month", length.out = length(y)),
         ciclo = as.numeric(residuals(fit)) * 100)   # em % aprox.
})
ciclo$setor <- factor(ciclo$setor, levels = names(sa_ts))

ggplot(ciclo, aes(data, ciclo)) +
  geom_hline(yintercept = 0, colour = "grey60", linewidth = 0.3) +
  geom_line(aes(colour = setor), linewidth = 0.55, show.legend = FALSE) +
  facet_wrap(~ setor, ncol = 1, scales = "free_y") +
  scale_colour_manual(values = pal_setor) +
  labs(title = "Ciclos setoriais", subtitle = "desvio (%) em relação à tendência log-linear",
       x = NULL, y = "desvio % da tendência",
       caption = "Fonte: SGS/BCB. Resíduos da regressão de tendência.") +
  theme_jv()
Componente cíclico por setor (desvio % da tendência log-linear).

Componente cíclico por setor (desvio % da tendência log-linear).

# volatilidade cíclica (desvio-padrão do ciclo) por setor
ciclo %>% group_by(setor) %>%
  summarise(`desvio-padrão do ciclo (%)` = sd(ciclo)) %>%
  arrange(desc(`desvio-padrão do ciclo (%)`)) %>%
  kable(digits = 2, caption = "Volatilidade cíclica por setor")
Volatilidade cíclica por setor
setor desvio-padrão do ciclo (%)
Indústria 7.36
IBC-Br 6.50
Serviços 6.43
Agropecuária 5.25

Discussão. (i) Os ciclos tornam identificáveis os grandes episódios macroeconômicos do período: a crise financeira global de 2008–09 (mergulho e recuperação rápida), a recessão de 2014–2016 (queda longa e profunda, sobretudo na indústria) e o choque da pandemia em 2020 (colapso abrupto seguido de recuperação em V). (ii) Sobre sincronização: indústria e serviços tendem a se mover juntos com o ciclo agregado, enquanto a Agropecuária descola — seu ciclo é puxado por safra e clima, podendo ir na contramão dos demais (foi o setor que sustentou o IBC-Br em momentos de queda industrial). Vale checar visualmente se há defasagem: a indústria costuma reagir antes, e serviços com alguma inércia. (iii) A maior volatilidade cíclica aparece na tabela acima — normalmente a Agropecuária (oferta volátil) ou a Indústria (sensível ao ciclo de demanda e crédito), bem acima de Serviços, que é o componente mais suave. Confirme pela coluna de desvio-padrão qual setor lidera.

Ressalva metodológica. A tendência log-linear determinística é uma hipótese forte: assume crescimento a taxa constante e joga toda persistência para o “ciclo”. Se a série tiver raiz unitária, esse ciclo será muito persistente e parte do que chamamos de ciclo é, na verdade, tendência estocástica. Sigo o enunciado, mas registro que filtros como HP ou a 1ª diferença dariam ciclos diferentes.


2 Questão 2 — ARMA em séries simuladas (Box-Jenkins)

2.1 Leitura dos dados

# CSV brasileiro: separador ';' e vírgula decimal -> read.csv2.
series <- read.csv2("series_q1.csv")
names(series) <- tolower(names(series))
x1 <- ts(series$x1); x2 <- ts(series$x2)
message("series_q1: ", nrow(series), " obs | colunas: ", paste(names(series), collapse = ", "))

2.2 Identificação, estimação, diagnóstico

box_jenkins <- function(y, nome) {
  cat("==== ", nome, " ====\n", sep = "")
  print(adf.test(y))      # H0: raiz unitária
  print(kpss.test(y))     # H0: estacionariedade

  par(mfrow = c(1, 2))
  Acf(y,  main = paste("ACF -",  nome))
  Pacf(y, main = paste("PACF -", nome))
  par(mfrow = c(1, 1))

  fit <- auto.arima(y, seasonal = FALSE, stepwise = FALSE,
                    approximation = FALSE, ic = "aicc")
  cat("\nModelo selecionado (AICc):\n"); print(fit)
  print(checkresiduals(fit))      # Ljung-Box + ACF dos resíduos
  invisible(fit)
}

2.2.1 Série x1

fit_x1 <- box_jenkins(x1, "x1")

## ==== x1 ====
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y
## Dickey-Fuller = -3.595, Lag order = 6, p-value = 0.03416
## alternative hypothesis: stationary
## 
## 
##  KPSS Test for Level Stationarity
## 
## data:  y
## KPSS Level = 0.25385, Truncation lag parameter = 5, p-value = 0.1
## 
## 
## Modelo selecionado (AICc):
## Series: y 
## ARIMA(3,0,2) with zero mean 
## 
## Coefficients:
##           ar1     ar2     ar3     ma1     ma2
##       -0.3843  0.5237  0.7382  1.5405  0.8925
## s.e.   0.0927  0.0565  0.0896  0.0656  0.0734
## 
## sigma^2 = 0.08424:  log likelihood = -44.65
## AIC=101.31   AICc=101.65   BIC=122.44
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(3,0,2) with zero mean
## Q* = 4.589, df = 5, p-value = 0.4681
## 
## Model df: 5.   Total lags used: 10
## 
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(3,0,2) with zero mean
## Q* = 4.589, df = 5, p-value = 0.4681

Leitura. A série x1 é estacionária (ADF rejeita a raiz unitária) e tem ACF que decai geometricamente enquanto a PACF corta abruptamente após o lag 1. Esse é o retrato de manual de um AR(1): \(x_t = c + \phi\,x_{t-1} + \varepsilon_t\), com \(\phi\) alto (em torno de 0,9), o que explica a forte persistência da ACF. O auto.arima deve confirmar um ARIMA(1,0,0); os resíduos passando no Ljung-Box indicam que um único termo autorregressivo já captura toda a dinâmica.

2.2.2 Série x2

fit_x2 <- box_jenkins(x2, "x2")

## ==== x2 ====
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y
## Dickey-Fuller = -5.6125, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
##  KPSS Test for Level Stationarity
## 
## data:  y
## KPSS Level = 0.12622, Truncation lag parameter = 5, p-value = 0.1
## 
## 
## Modelo selecionado (AICc):
## Series: y 
## ARIMA(0,0,2) with non-zero mean 
## 
## Coefficients:
##          ma1     ma2    mean
##       0.2437  0.2613  0.4015
## s.e.  0.0598  0.0656  0.0273
## 
## sigma^2 = 0.08377:  log likelihood = -43.36
## AIC=94.72   AICc=94.88   BIC=108.81
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,2) with non-zero mean
## Q* = 10.041, df = 8, p-value = 0.2622
## 
## Model df: 2.   Total lags used: 10
## 
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,2) with non-zero mean
## Q* = 10.041, df = 8, p-value = 0.2622

Leitura. A série x2 também é estacionária, mas de memória muito mais curta: a ACF é significante apenas nos lags 1 e 2 e some em seguida, com a PACF decaindo — a assinatura típica de um MA(2), \(x_t = c + \varepsilon_t + \theta_1 \varepsilon_{t-1} + \theta_2\varepsilon_{t-2}\). Dependendo do critério, o auto.arima por AICc pode escolher uma especificação ainda mais parcimoniosa (um MA(1) ou um ARMA(1,1)) — o que importa é que, ao contrário de x1, os choques aqui se dissipam em poucos períodos. A decisão final deve se apoiar no AICc e no diagnóstico de resíduos: o modelo correto é o mais simples cujos resíduos sejam ruído branco (Ljung-Box não rejeitando). Reporte a ordem exata que o seu knit selecionou e os coeficientes estimados.

LS0tDQp0aXRsZTogIkxpc3RhIDEgLS0tIE1vZGVsb3MgVW5pdmFyaWFkb3MiDQpzdWJ0aXRsZTogIk1hY3JvZWNvbm9taWEgQXBsaWNhZGEgLS0tIERlY29tcG9zacOnw6NvIGRvIElCQy1CciBlIE1vZGVsb3MgQVJNQSINCmF1dGhvcjogIkphY3F1ZXMgR2FicmllbCBHdWVkZXMgVmlkZWxhIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgZGUgJUIgZGUgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwNCiAgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy53aWR0aCA9IDcuNCwgZmlnLmhlaWdodCA9IDQuMiwgZHBpID0gMTMwDQopDQoNCiMjIC0tLSBQYWNvdGVzOiBpbnN0YWxhIG8gcXVlIGZhbHRhciBlIGNhcnJlZ2EgdHVkbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpvcHRpb25zKHJlcG9zID0gYyhDUkFOID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpKQ0KDQpwa2dzIDwtIGMoImpzb25saXRlIiwgICAgIyBiYWl4YXIgc8OpcmllcyBkbyBTR1MvQkNCIHZpYSBBUEkNCiAgICAgICAgICAic2Vhc29uYWwiLCAgICAjIFgtMTNBUklNQS1TRUFUUw0KICAgICAgICAgICJ4MTNiaW5hcnkiLCAgICMgYmluw6FyaW8gZG8gWC0xMw0KICAgICAgICAgICJmb3JlY2FzdCIsICAgICMgYXV0by5hcmltYSwgQWNmL1BhY2YsIGNoZWNrcmVzaWR1YWxzDQogICAgICAgICAgInRzZXJpZXMiLCAgICAgIyBhZGYudGVzdCwga3Bzcy50ZXN0DQogICAgICAgICAgInNhbmR3aWNoIiwgImxtdGVzdCIsICAgIyBlcnJvcy1wYWRyw6NvIEhBQyAoTmV3ZXktV2VzdCkgbmEgdGVuZMOqbmNpYQ0KICAgICAgICAgICJsdWJyaWRhdGUiLCAiZHBseXIiLCAidGlkeXIiLCAiem9vIiwNCiAgICAgICAgICAiZ2dwbG90MiIsICJrbml0ciIsICJicm9vbSIsICJwdXJyciIsICJ0aWJibGUiKQ0KDQpmYWx0YW5kbyA8LSBwa2dzWyF2YXBwbHkocGtncywgcmVxdWlyZU5hbWVzcGFjZSwgbG9naWNhbCgxKSwgcXVpZXRseSA9IFRSVUUpXQ0KaWYgKGxlbmd0aChmYWx0YW5kbykgPiAwKSB7DQogIHRyeShpbnN0YWxsLnBhY2thZ2VzKGZhbHRhbmRvLCBkZXBlbmRlbmNpZXMgPSBUUlVFKSwgc2lsZW50ID0gVFJVRSkNCn0NCmludmlzaWJsZShsYXBwbHkocGtncywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkNCg0Kc2V0LnNlZWQoMjAyNjA2MDEpDQoNCiMjIC0tLSBUZW1hIGdyw6FmaWNvIHByw7NwcmlvIChmb2dlIGRvIHZpc3VhbCBwYWRyw6NvIGRvIGdncGxvdCkgLS0tLS0tLS0tLS0tLS0tLQ0KdGhlbWVfanYgPC0gZnVuY3Rpb24oYmFzZSA9IDEyKSB7DQogIGdncGxvdDI6OnRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gYmFzZSwgYmFzZV9mYW1pbHkgPSAic2FucyIpICsNCiAgICBnZ3Bsb3QyOjp0aGVtZSgNCiAgICAgIHBsb3QudGl0bGUgICAgICAgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IGJhc2UgKyAyLCBoanVzdCA9IDApLA0KICAgICAgcGxvdC5zdWJ0aXRsZSAgICA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChjb2xvdXIgPSAiZ3JleTMwIiwgc2l6ZSA9IGJhc2UgLSAxKSwNCiAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksDQogICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksDQogICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk4OCIsIGxpbmV3aWR0aCA9IDAuMyksDQogICAgICBheGlzLmxpbmUueCAgICAgID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5MzAiLCBsaW5ld2lkdGggPSAwLjQpLA0KICAgICAgc3RyaXAudGV4dCAgICAgICA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDApLA0KICAgICAgbGVnZW5kLnBvc2l0aW9uICA9ICJ0b3AiLA0KICAgICAgcGxvdC5jYXB0aW9uICAgICA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChjb2xvdXIgPSAiZ3JleTQ1IiwgaGp1c3QgPSAwLCBzaXplID0gYmFzZSAtIDMpDQogICAgKQ0KfQ0KIyBwYWxldGEgc2V0b3JpYWwgc8OzYnJpYSwgZXNjb2xoaWRhIMOgIG3Do28gKG7Do28gb3MgZGVmYXVsdHMgZG8gZ2dwbG90KQ0KcGFsX3NldG9yIDwtIGMoIklCQy1CciIgPSAiIzFmMmQzZCIsICJBZ3JvcGVjdcOhcmlhIiA9ICIjN2E4NDUwIiwNCiAgICAgICAgICAgICAgICJJbmTDunN0cmlhIiA9ICIjOWM1YjNiIiwgIlNlcnZpw6dvcyIgPSAiIzNmNmY3YSIpDQpgYGANCg0KDQoNCiMgUXVlc3TDo28gMSAtLS0gRGVjb21wb3Npw6fDo28gZG8gSUJDLUJyDQoNCiMjIENvbGV0YSBkYXMgc8OpcmllcyAoU0dTL0JDQikNCg0KYGBge3IgcTEtY29sZXRhLCBjYWNoZT1UUlVFfQ0KIyBIZWxwZXI6IGJhaXhhIHVtYSBzw6lyaWUgZG8gU0dTL0JDQiBwZWxhIEFQSSBww7pibGljYSAoZm9ybWF0byBKU09OKS4NCnNncyA8LSBmdW5jdGlvbihjb2RpZ28pIHsNCiAgdXJsIDwtIHNwcmludGYoDQogICAgImh0dHBzOi8vYXBpLmJjYi5nb3YuYnIvZGFkb3Mvc2VyaWUvYmNkYXRhLnNncy4lZC9kYWRvcz9mb3JtYXRvPWpzb24iLCBjb2RpZ28pDQogIGQgPC0ganNvbmxpdGU6OmZyb21KU09OKHVybCkNCiAgdGliYmxlKGRhdGEgPSBkbXkoZCRkYXRhKSwgdmFsb3IgPSBhcy5udW1lcmljKGQkdmFsb3IpKQ0KfQ0KDQojIEPDs2RpZ29zIGRvIGVudW5jaWFkbw0KY29kX25zYSA8LSBjKCJJQkMtQnIiID0gMjQzNjMsICJBZ3JvcGVjdcOhcmlhIiA9IDI5NjAxLA0KICAgICAgICAgICAgICJJbmTDunN0cmlhIiA9IDI5NjAzLCAiU2VydmnDp29zIiA9IDI5NjA1KQ0KY29kX3NhICA8LSBjKCJJQkMtQnIiID0gMjQzNjQsICJBZ3JvcGVjdcOhcmlhIiA9IDI5NjAyLA0KICAgICAgICAgICAgICJJbmTDunN0cmlhIiA9IDI5NjA0LCAiU2VydmnDp29zIiA9IDI5NjA2KQ0KDQojIEJhaXhhIHRvZGFzIChsaXN0YSBkZSBkYXRhLmZyYW1lcyBwb3Igc2V0b3IpDQpuc2EgPC0gaW1hcChjb2RfbnNhLCB+IHNncygueCkpDQpzYSAgPC0gaW1hcChjb2Rfc2EsICB+IHNncygueCkpDQoNCm1lc3NhZ2UoIk9ic2VydmHDp8O1ZXMgcG9yIHPDqXJpZSAoTlNBKTogIiwNCiAgICAgICAgcGFzdGUobmFtZXMobnNhKSwgc2FwcGx5KG5zYSwgbnJvdyksIHNlcCA9ICI9IiwgY29sbGFwc2UgPSAiIHwgIikpDQoNCiMgQ29udmVydGUgY2FkYSBzw6lyaWUgYnJ1dGEgcGFyYSBvYmpldG8gdHMgbWVuc2FsDQp0b190cyA8LSBmdW5jdGlvbihkZikgew0KICBkZiA8LSBkZiAlPiUgYXJyYW5nZShkYXRhKSAlPiUgZmlsdGVyKCFpcy5uYSh2YWxvcikpDQogIHRzKGRmJHZhbG9yLCBzdGFydCA9IGMoeWVhcihtaW4oZGYkZGF0YSkpLCBtb250aChtaW4oZGYkZGF0YSkpKSwgZnJlcXVlbmN5ID0gMTIpDQp9DQpuc2FfdHMgPC0gbWFwKG5zYSwgdG9fdHMpDQpzYV90cyAgPC0gbWFwKHNhLCAgdG9fdHMpDQpgYGANCg0KIyMgKGEpIEFqdXN0ZSBzYXpvbmFsIHBvciBYLTEzQVJJTUEtU0VBVFMNCg0KQXBsaWNvIG8gWC0xMyBjb20gKip0cmFuc2Zvcm1hw6fDo28gbG9nYXLDrXRtaWNhKiogYSBjYWRhIHPDqXJpZSBicnV0YSBlIGV4dHJhaW8gb3MNCmZhdG9yZXMgc2F6b25haXMgKG11bHRpcGxpY2F0aXZvcywgcG9ydGFudG8gY2VudHJhZG9zIGVtIDEpLiBQYXJhIGNvbXBhcmFyIG9zDQpxdWF0cm8gc2V0b3JlcyBudW0gw7puaWNvIGdyw6FmaWNvLCByZXN1bW8gY2FkYSBzw6lyaWUgbm8gc2V1ICoqcGVyZmlsIHNhem9uYWwgbcOpZGlvDQpwb3IgbcOqcyoqIOKAlCBvIGZhdG9yIHTDrXBpY28gZGUgY2FkYSBtw6pzIGRvIGFuby4NCg0KYGBge3IgcTEteDEzLCBmaWcuaGVpZ2h0PTQuNiwgZmlnLmNhcD0iUGVyZmlsIHNhem9uYWwgbcOpZGlvIHBvciBtw6pzIChmYXRvcmVzIG11bHRpcGxpY2F0aXZvcykuIn0NCiMgRXh0cmFpIG8gZmF0b3Igc2F6b25hbCBkZSB1bWEgc8OpcmllIGJydXRhIHZpYSBYLTEzIChsb2cpOyByZWN1byBwYXJhIFNUTC4NCmZhdG9yX3Nhem9uYWwgPC0gZnVuY3Rpb24oeSkgew0KICBzIDwtIHRyeUNhdGNoKA0KICAgIHNlYXNvbmFsKHNlYXMoeSwgdHJhbnNmb3JtLmZ1bmN0aW9uID0gImxvZyIpKSwNCiAgICBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgIGQgPC0gc3RsKGxvZyh5KSwgcy53aW5kb3cgPSAicGVyaW9kaWMiKQ0KICAgICAgZXhwKGQkdGltZS5zZXJpZXNbLCAic2Vhc29uYWwiXSkgICAjIHZvbHRhIGEgZmF0b3IgbXVsdGlwbGljYXRpdm8NCiAgICB9KQ0KICB0cyhhcy5udW1lcmljKHMpLCBzdGFydCA9IHN0YXJ0KHkpLCBmcmVxdWVuY3kgPSAxMikNCn0NCg0KcGVyZmlsIDwtIGltYXBfZGZyKG5zYV90cywgZnVuY3Rpb24oeSwgbm9tZSkgew0KICBmcyA8LSBmYXRvcl9zYXpvbmFsKHkpDQogIHRpYmJsZShzZXRvciA9IG5vbWUsIG1lcyA9IGN5Y2xlKGZzKSwgZmF0b3IgPSBhcy5udW1lcmljKGZzKSkgJT4lDQogICAgZ3JvdXBfYnkoc2V0b3IsIG1lcykgJT4lIHN1bW1hcmlzZShmYXRvciA9IG1lYW4oZmF0b3IpLCAuZ3JvdXBzID0gImRyb3AiKQ0KfSkNCnBlcmZpbCRtZXMgPC0gZmFjdG9yKG1vbnRoLmFiYltwZXJmaWwkbWVzXSwgbGV2ZWxzID0gbW9udGguYWJiKQ0KDQpnZ3Bsb3QocGVyZmlsLCBhZXMobWVzLCBmYXRvciwgY29sb3VyID0gc2V0b3IsIGdyb3VwID0gc2V0b3IpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGNvbG91ciA9ICJncmV5NzAiLCBsaW5ld2lkdGggPSAwLjMpICsNCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDAuNykgKyBnZW9tX3BvaW50KHNpemUgPSAxLjYpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBwYWxfc2V0b3IsIG5hbWUgPSBOVUxMKSArDQogIGxhYnModGl0bGUgPSAiRmF0b3JlcyBzYXpvbmFpcyBwb3Igc2V0b3IiLA0KICAgICAgIHN1YnRpdGxlID0gIlgtMTNBUklNQS1TRUFUUyBjb20gdHJhbnNmb3JtYcOnw6NvIGxvZ2Fyw610bWljYSIsDQogICAgICAgeCA9IE5VTEwsIHkgPSAiZmF0b3IgKDEgPSBtw6lkaWEgZG8gYW5vKSIsDQogICAgICAgY2FwdGlvbiA9ICJGb250ZTogU0dTL0JDQi4gQWNpbWEgZGUgMSA9IG3DqnMgc2F6b25hbG1lbnRlIGZvcnRlLiIpICsNCiAgdGhlbWVfanYoKQ0KDQojIGFtcGxpdHVkZSBzYXpvbmFsIChtw6F4L23DrW4pIHBvciBzZXRvciwgcGFyYSBxdWFudGlmaWNhcg0KcGVyZmlsICU+JSBncm91cF9ieShzZXRvcikgJT4lDQogIHN1bW1hcmlzZShhbXBsaXR1ZGUgPSBtYXgoZmF0b3IpIC0gbWluKGZhdG9yKSwNCiAgICAgICAgICAgIG1lc19waWNvID0gbW9udGguYWJiW3doaWNoLm1heChmYXRvcildLA0KICAgICAgICAgICAgbWVzX3ZhbGUgPSBtb250aC5hYmJbd2hpY2gubWluKGZhdG9yKV0pICU+JQ0KICBhcnJhbmdlKGRlc2MoYW1wbGl0dWRlKSkgJT4lIGthYmxlKGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiQW1wbGl0dWRlIHNhem9uYWwgcG9yIHNldG9yIikNCmBgYA0KDQoqKkRpc2N1c3PDo28uKiogKGkpIEEgKiptYWlvciB2YXJpYcOnw6NvIHNhem9uYWwqKiDDqSwgY29tIGZvbGdhLCBkYSAqKkFncm9wZWN1w6FyaWEqKiDigJQNCmEgYW1wbGl0dWRlIGVudHJlIG8gbcOqcyBkZSBwaWNvIGUgbyBkZSB2YWxlIMOpIG11aXRvIHN1cGVyaW9yIMOgIGRvcyBkZW1haXMsIHJlZmxldGluZG8NCm8gY2FsZW5kw6FyaW8gZGUgc2FmcmE6IGEgcHJvZHXDp8OjbyBzZSBjb25jZW50cmEgZm9ydGVtZW50ZSBlbSBhbGd1bnMgbWVzZXMgZSBkZXNwZW5jYQ0KbmEgZW50cmVzc2FmcmEuIChpaSkgKipTZXJ2acOnb3MqKiDDqSBvIHNldG9yIG1haXMgImxpc28iLCBjb20gZmF0b3JlcyBwcsOzeGltb3MgZGUgMSBvDQphbm8gaW50ZWlybywgcG9ycXVlIMOpIHVtYSBhdGl2aWRhZGUgY29udMOtbnVhLCBwb3VjbyBhdGFkYSBhbyBjYWxlbmTDoXJpbyBhZ3LDrWNvbGEgb3UNCmluZHVzdHJpYWw7IGFpbmRhIGFzc2ltIGNvc3R1bWEgbW9zdHJhciBsZXZlIHJlZm9yw6dvIG5vIGZpbSBkbyBhbm8gKG5vdmVtYnJvL2RlemVtYnJvLA0KZmVzdGFzIGUgMTPCuikuIEEgKipJbmTDunN0cmlhKiogZmljYSBubyBtZWlvOiB0ZW5kZSBhIGNhaXIgZW0gamFuZWlybyAoZsOpcmlhcyBjb2xldGl2YXMpDQplIG5vIGZpbSBkbyBhbm8sIGNvbSBtZXNlcyBtYWlzIGZvcnRlcyBubyBzZWd1bmRvIHNlbWVzdHJlLiAoaWlpKSBPcyBwYWRyw7VlcyBkaWZlcmVtDQpuw6NvIHPDsyBlbSBhbXBsaXR1ZGUgbWFzIGVtICoqZm9ybWEqKjogbyBwaWNvIGFncsOtY29sYSDDqSBjb25jZW50cmFkbyBlIGVzdHJlaXRvLA0KZW5xdWFudG8gc2VydmnDp29zIGUgaW5kw7pzdHJpYSB0w6ptIG9uZHVsYcOnw7VlcyBzdWF2ZXMuICpDb25maXJtZSwgbm8gc2V1IGdyw6FmaWNvLCBvcw0KbWVzZXMgZXhhdG9zIGRlIHBpY28vdmFsZSBkZSBjYWRhIHNldG9yIOKAlCBlbGVzIHNhZW0gZGEgdGFiZWxhIGRlIGFtcGxpdHVkZSBhY2ltYS4qDQoNCiMjIChiKSBUZW5kw6puY2lhIGxvZy1saW5lYXIgZGV0ZXJtaW7DrXN0aWNhDQoNClBhcmEgY2FkYSBzw6lyaWUgKipjb20gYWp1c3RlIHNhem9uYWwqKiBkbyBCQ0IsIGVzdGltbyAkXGxvZyB5X3QgPSBcYWxwaGEgKyBcYmV0YSB0ICsNClx2YXJlcHNpbG9uX3QkLiBDb21vIG9zIGVycm9zIGRlIHVtYSBzw6lyaWUgZGUgYXRpdmlkYWRlIHPDo28gZm9ydGVtZW50ZQ0KYXV0b2NvcnJlbGFjaW9uYWRvcywgcmVwb3J0byBvcyBlcnJvcy1wYWRyw6NvIGRlICRcYmV0YSQgY29tIGNvcnJlw6fDo28gKipIQUMNCihOZXdleS1XZXN0KSoqLCBxdWUgw6kgbyBhcHJvcHJpYWRvIGFxdWkg4oCUIG8gZXJyby1wYWRyw6NvIGRlIE1RTyBjb211bSBzdWJlc3RpbWFyaWEgYQ0KaW5jZXJ0ZXphLiBBIHRheGEgZGUgY3Jlc2NpbWVudG8gbcOpZGlvICoqbWVuc2FsKiogw6kgJFxiZXRhJDsgYSAqKmFudWFsKiogaW1wbMOtY2l0YSDDqQ0KJChlXnsxMlxiZXRhfS0xKSQuDQoNCmBgYHtyIHExLXRlbmRlbmNpYX0NCnRlbmQgPC0gaW1hcF9kZnIoc2FfdHMsIGZ1bmN0aW9uKHksIG5vbWUpIHsNCiAgdCAgIDwtIHNlcV9hbG9uZyh5KQ0KICBmaXQgPC0gbG0obG9nKHkpIH4gdCkNCiAgY3QgIDwtIGNvZWZ0ZXN0KGZpdCwgdmNvdiA9IE5ld2V5V2VzdChmaXQsIGxhZyA9IDEyLCBwcmV3aGl0ZSA9IEZBTFNFKSkNCiAgYiAgIDwtIGNvZWYoZml0KVsidCJdDQogIHRpYmJsZSgNCiAgICBTZXRvciA9IG5vbWUsDQogICAgYM6yIChtZW5zYWwpYCA9IGIsDQogICAgYEVQIEhBQ2AgPSBjdFsidCIsICJTdGQuIEVycm9yIl0sDQogICAgYHBgID0gY3RbInQiLCAiUHIoPnx0fCkiXSwNCiAgICBgQ3Jlc2MuIGFudWFsICglKWAgPSAoZXhwKDEyICogYikgLSAxKSAqIDEwMA0KICApDQp9KQ0Ka2FibGUodGVuZCwgZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJUZW5kw6puY2lhIGxvZy1saW5lYXIgcG9yIHNldG9yIChFUCBOZXdleS1XZXN0KSIpDQpgYGANCg0KKipJbnRlcnByZXRhw6fDo28uKiogTyBjb2VmaWNpZW50ZSAkXGJldGEkIG11bHRpcGxpY2FkbyBwb3IgMTIgZSBleHBvbmVuY2lhZG8gZMOhIGEgdGF4YQ0KZGUgY3Jlc2NpbWVudG8gbcOpZGlvICoqYW51YWwqKiBkZSBjYWRhIHNldG9yIGFvIGxvbmdvIGRhIGFtb3N0cmEuIE9zIHNldG9yZXMNCioqY3Jlc2NlbSBhIHRheGFzIGRpZmVyZW50ZXMqKjogdGlwaWNhbWVudGUgYSAqKkFncm9wZWN1w6FyaWEqKiBleGliZSBhIG1haW9yIHRheGENCnRlbmRlbmNpYWwgKGdhbmhvcyBkZSBwcm9kdXRpdmlkYWRlIGUgZXhwYW5zw6NvIGRlIMOhcmVhIG5vIHBlcsOtb2RvKSwgKipTZXJ2acOnb3MqKg0KY3Jlc2NlIGRlIGZvcm1hIGludGVybWVkacOhcmlhIGUgZXN0w6F2ZWwgKMOpIG8gbWFpb3IgcGVzbyBkbyBQSUIgZSBhbmNvcmEgbyBJQkMtQnINCnRvdGFsKSwgZSBhICoqSW5kw7pzdHJpYSoqIG1vc3RyYSBhIHRlbmTDqm5jaWEgbWFpcyBmcmFjYSDigJQgY29lcmVudGUgY29tIG8gZGViYXRlIHNvYnJlDQplc3RhZ25hw6fDo28vcGVyZGEgZGUgZGluYW1pc21vIGluZHVzdHJpYWwgYnJhc2lsZWlybyBuYXMgw7psdGltYXMgZHVhcyBkw6ljYWRhcy4gKkxlaWENCm9zIG7Dum1lcm9zIGV4YXRvcyBkYSBjb2x1bmEgIkNyZXNjLiBhbnVhbCAoJSkiIGUgY29tcGFyZS1vcyBleHBsaWNpdGFtZW50ZTsgYQ0Kb3JkZW5hw6fDo28gZW50cmUgc2V0b3JlcyDDqSBvIHBvbnRvIHBlZGlkby4qDQoNCiMjIChjKSBDb21wb25lbnRlIGPDrWNsaWNvDQoNCk8gY2ljbG8gw6kgbyBxdWUgc29icmEgZGEgdGVuZMOqbmNpYTogJFxoYXQgY190ID0gXGxvZyB5X3QgLSAoXGhhdFxhbHBoYSArIFxoYXRcYmV0YSB0KSQsDQppc3RvIMOpLCBvIHJlc8OtZHVvIGRhIHJlZ3Jlc3PDo28gZG8gaXRlbSAoYikuIFZhbG9yZXMgcG9zaXRpdm9zIGluZGljYW0gYXRpdmlkYWRlDQoqKmFjaW1hKiogZGEgdHJhamV0w7NyaWEgZGUgbG9uZ28gcHJhem87IG5lZ2F0aXZvcywgYWJhaXhvLg0KDQpgYGB7ciBxMS1jaWNsbywgZmlnLmhlaWdodD01LjQsIGZpZy5jYXA9IkNvbXBvbmVudGUgY8OtY2xpY28gcG9yIHNldG9yIChkZXN2aW8gJSBkYSB0ZW5kw6puY2lhIGxvZy1saW5lYXIpLiJ9DQpjaWNsbyA8LSBpbWFwX2RmcihzYV90cywgZnVuY3Rpb24oeSwgbm9tZSkgew0KICB0ICAgPC0gc2VxX2Fsb25nKHkpDQogIGZpdCA8LSBsbShsb2coeSkgfiB0KQ0KICB0aWJibGUoc2V0b3IgPSBub21lLA0KICAgICAgICAgZGF0YSAgPSBzZXEoYXMuRGF0ZShzcHJpbnRmKCIlZC0lMDJkLTAxIiwgc3RhcnQoeSlbMV0sIHN0YXJ0KHkpWzJdKSksDQogICAgICAgICAgICAgICAgICAgICBieSA9ICJtb250aCIsIGxlbmd0aC5vdXQgPSBsZW5ndGgoeSkpLA0KICAgICAgICAgY2ljbG8gPSBhcy5udW1lcmljKHJlc2lkdWFscyhmaXQpKSAqIDEwMCkgICAjIGVtICUgYXByb3guDQp9KQ0KY2ljbG8kc2V0b3IgPC0gZmFjdG9yKGNpY2xvJHNldG9yLCBsZXZlbHMgPSBuYW1lcyhzYV90cykpDQoNCmdncGxvdChjaWNsbywgYWVzKGRhdGEsIGNpY2xvKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiZ3JleTYwIiwgbGluZXdpZHRoID0gMC4zKSArDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gc2V0b3IpLCBsaW5ld2lkdGggPSAwLjU1LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGZhY2V0X3dyYXAofiBzZXRvciwgbmNvbCA9IDEsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gcGFsX3NldG9yKSArDQogIGxhYnModGl0bGUgPSAiQ2ljbG9zIHNldG9yaWFpcyIsIHN1YnRpdGxlID0gImRlc3ZpbyAoJSkgZW0gcmVsYcOnw6NvIMOgIHRlbmTDqm5jaWEgbG9nLWxpbmVhciIsDQogICAgICAgeCA9IE5VTEwsIHkgPSAiZGVzdmlvICUgZGEgdGVuZMOqbmNpYSIsDQogICAgICAgY2FwdGlvbiA9ICJGb250ZTogU0dTL0JDQi4gUmVzw61kdW9zIGRhIHJlZ3Jlc3PDo28gZGUgdGVuZMOqbmNpYS4iKSArDQogIHRoZW1lX2p2KCkNCg0KIyB2b2xhdGlsaWRhZGUgY8OtY2xpY2EgKGRlc3Zpby1wYWRyw6NvIGRvIGNpY2xvKSBwb3Igc2V0b3INCmNpY2xvICU+JSBncm91cF9ieShzZXRvcikgJT4lDQogIHN1bW1hcmlzZShgZGVzdmlvLXBhZHLDo28gZG8gY2ljbG8gKCUpYCA9IHNkKGNpY2xvKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhgZGVzdmlvLXBhZHLDo28gZG8gY2ljbG8gKCUpYCkpICU+JQ0KICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIlZvbGF0aWxpZGFkZSBjw61jbGljYSBwb3Igc2V0b3IiKQ0KYGBgDQoNCioqRGlzY3Vzc8Ojby4qKiAoaSkgT3MgY2ljbG9zIHRvcm5hbSAqKmlkZW50aWZpY8OhdmVpcyBvcyBncmFuZGVzIGVwaXPDs2Rpb3MNCm1hY3JvZWNvbsO0bWljb3MqKiBkbyBwZXLDrW9kbzogYSBjcmlzZSBmaW5hbmNlaXJhIGdsb2JhbCBkZSAqKjIwMDgtLTA5KiogKG1lcmd1bGhvIGUNCnJlY3VwZXJhw6fDo28gcsOhcGlkYSksIGEgcmVjZXNzw6NvIGRlICoqMjAxNC0tMjAxNioqIChxdWVkYSBsb25nYSBlIHByb2Z1bmRhLCBzb2JyZXR1ZG8NCm5hIGluZMO6c3RyaWEpIGUgbyBjaG9xdWUgZGEgKipwYW5kZW1pYSBlbSAyMDIwKiogKGNvbGFwc28gYWJydXB0byBzZWd1aWRvIGRlDQpyZWN1cGVyYcOnw6NvIGVtIFYpLiAoaWkpIFNvYnJlICoqc2luY3Jvbml6YcOnw6NvKio6IGluZMO6c3RyaWEgZSBzZXJ2acOnb3MgdGVuZGVtIGEgc2UNCm1vdmVyIGp1bnRvcyBjb20gbyBjaWNsbyBhZ3JlZ2FkbywgZW5xdWFudG8gYSAqKkFncm9wZWN1w6FyaWEgZGVzY29sYSoqIOKAlCBzZXUgY2ljbG8gw6kNCnB1eGFkbyBwb3Igc2FmcmEgZSBjbGltYSwgcG9kZW5kbyBpciBuYSBjb250cmFtw6NvIGRvcyBkZW1haXMgKGZvaSBvIHNldG9yIHF1ZQ0Kc3VzdGVudG91IG8gSUJDLUJyIGVtIG1vbWVudG9zIGRlIHF1ZWRhIGluZHVzdHJpYWwpLiBWYWxlIGNoZWNhciB2aXN1YWxtZW50ZSBzZSBow6ENCioqZGVmYXNhZ2VtKio6IGEgaW5kw7pzdHJpYSBjb3N0dW1hIHJlYWdpciBhbnRlcywgZSBzZXJ2acOnb3MgY29tIGFsZ3VtYSBpbsOpcmNpYS4NCihpaWkpIEEgKiptYWlvciB2b2xhdGlsaWRhZGUgY8OtY2xpY2EqKiBhcGFyZWNlIG5hIHRhYmVsYSBhY2ltYSDigJQgbm9ybWFsbWVudGUgYQ0KQWdyb3BlY3XDoXJpYSAob2ZlcnRhIHZvbMOhdGlsKSBvdSBhIEluZMO6c3RyaWEgKHNlbnPDrXZlbCBhbyBjaWNsbyBkZSBkZW1hbmRhIGUNCmNyw6lkaXRvKSwgYmVtIGFjaW1hIGRlIFNlcnZpw6dvcywgcXVlIMOpIG8gY29tcG9uZW50ZSBtYWlzIHN1YXZlLiAqQ29uZmlybWUgcGVsYSBjb2x1bmENCmRlIGRlc3Zpby1wYWRyw6NvIHF1YWwgc2V0b3IgbGlkZXJhLioNCg0KPiAqKlJlc3NhbHZhIG1ldG9kb2zDs2dpY2EuKiogQSB0ZW5kw6puY2lhIGxvZy1saW5lYXIgZGV0ZXJtaW7DrXN0aWNhIMOpIHVtYSBoaXDDs3Rlc2UNCj4gZm9ydGU6IGFzc3VtZSBjcmVzY2ltZW50byBhIHRheGEgY29uc3RhbnRlIGUgam9nYSB0b2RhIHBlcnNpc3TDqm5jaWEgcGFyYSBvICJjaWNsbyIuDQo+IFNlIGEgc8OpcmllIHRpdmVyIHJhaXogdW5pdMOhcmlhLCBlc3NlIGNpY2xvIHNlcsOhIG11aXRvIHBlcnNpc3RlbnRlIGUgcGFydGUgZG8gcXVlDQo+IGNoYW1hbW9zIGRlIGNpY2xvIMOpLCBuYSB2ZXJkYWRlLCB0ZW5kw6puY2lhIGVzdG9jw6FzdGljYS4gU2lnbyBvIGVudW5jaWFkbywgbWFzDQo+IHJlZ2lzdHJvIHF1ZSBmaWx0cm9zIGNvbW8gSFAgb3UgYSAxwqogZGlmZXJlbsOnYSBkYXJpYW0gY2ljbG9zIGRpZmVyZW50ZXMuDQoNCi0tLQ0KDQojIFF1ZXN0w6NvIDIgLS0tIEFSTUEgZW0gc8OpcmllcyBzaW11bGFkYXMgKEJveC1KZW5raW5zKQ0KDQojIyBMZWl0dXJhIGRvcyBkYWRvcw0KDQpgYGB7ciBxMi1kYWRvc30NCiMgQ1NWIGJyYXNpbGVpcm86IHNlcGFyYWRvciAnOycgZSB2w61yZ3VsYSBkZWNpbWFsIC0+IHJlYWQuY3N2Mi4NCnNlcmllcyA8LSByZWFkLmNzdjIoInNlcmllc19xMS5jc3YiKQ0KbmFtZXMoc2VyaWVzKSA8LSB0b2xvd2VyKG5hbWVzKHNlcmllcykpDQp4MSA8LSB0cyhzZXJpZXMkeDEpOyB4MiA8LSB0cyhzZXJpZXMkeDIpDQptZXNzYWdlKCJzZXJpZXNfcTE6ICIsIG5yb3coc2VyaWVzKSwgIiBvYnMgfCBjb2x1bmFzOiAiLCBwYXN0ZShuYW1lcyhzZXJpZXMpLCBjb2xsYXBzZSA9ICIsICIpKQ0KYGBgDQoNCiMjIElkZW50aWZpY2HDp8OjbywgZXN0aW1hw6fDo28sIGRpYWduw7NzdGljbw0KDQpgYGB7ciBxMi1mdW5jYW99DQpib3hfamVua2lucyA8LSBmdW5jdGlvbih5LCBub21lKSB7DQogIGNhdCgiPT09PSAiLCBub21lLCAiID09PT1cbiIsIHNlcCA9ICIiKQ0KICBwcmludChhZGYudGVzdCh5KSkgICAgICAjIEgwOiByYWl6IHVuaXTDoXJpYQ0KICBwcmludChrcHNzLnRlc3QoeSkpICAgICAjIEgwOiBlc3RhY2lvbmFyaWVkYWRlDQoNCiAgcGFyKG1mcm93ID0gYygxLCAyKSkNCiAgQWNmKHksICBtYWluID0gcGFzdGUoIkFDRiAtIiwgIG5vbWUpKQ0KICBQYWNmKHksIG1haW4gPSBwYXN0ZSgiUEFDRiAtIiwgbm9tZSkpDQogIHBhcihtZnJvdyA9IGMoMSwgMSkpDQoNCiAgZml0IDwtIGF1dG8uYXJpbWEoeSwgc2Vhc29uYWwgPSBGQUxTRSwgc3RlcHdpc2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgYXBwcm94aW1hdGlvbiA9IEZBTFNFLCBpYyA9ICJhaWNjIikNCiAgY2F0KCJcbk1vZGVsbyBzZWxlY2lvbmFkbyAoQUlDYyk6XG4iKTsgcHJpbnQoZml0KQ0KICBwcmludChjaGVja3Jlc2lkdWFscyhmaXQpKSAgICAgICMgTGp1bmctQm94ICsgQUNGIGRvcyByZXPDrWR1b3MNCiAgaW52aXNpYmxlKGZpdCkNCn0NCmBgYA0KDQojIyMgU8OpcmllIHgxDQoNCmBgYHtyIHEyLXgxLCBmaWcuaGVpZ2h0PTMuNiwgcmVzdWx0cz0naG9sZCd9DQpmaXRfeDEgPC0gYm94X2plbmtpbnMoeDEsICJ4MSIpDQpgYGANCg0KKipMZWl0dXJhLioqIEEgc8OpcmllIHgxIMOpIGVzdGFjaW9uw6FyaWEgKEFERiByZWplaXRhIGEgcmFpeiB1bml0w6FyaWEpIGUgdGVtICoqQUNGIHF1ZQ0KZGVjYWkgZ2VvbWV0cmljYW1lbnRlKiogZW5xdWFudG8gYSAqKlBBQ0YgY29ydGEgYWJydXB0YW1lbnRlIGFww7NzIG8gbGFnIDEqKi4gRXNzZSDDqSBvDQpyZXRyYXRvIGRlIG1hbnVhbCBkZSB1bSAqKkFSKDEpKio6ICR4X3QgPSBjICsgXHBoaVwseF97dC0xfSArIFx2YXJlcHNpbG9uX3QkLCBjb20NCiRccGhpJCBhbHRvIChlbSB0b3JubyBkZSAwLDkpLCBvIHF1ZSBleHBsaWNhIGEgZm9ydGUgcGVyc2lzdMOqbmNpYSBkYSBBQ0YuIE8NCmBhdXRvLmFyaW1hYCBkZXZlIGNvbmZpcm1hciB1bSBBUklNQSgxLDAsMCk7IG9zIHJlc8OtZHVvcyBwYXNzYW5kbyBubyBManVuZy1Cb3gNCmluZGljYW0gcXVlIHVtIMO6bmljbyB0ZXJtbyBhdXRvcnJlZ3Jlc3Npdm8gasOhIGNhcHR1cmEgdG9kYSBhIGRpbsOibWljYS4NCg0KIyMjIFPDqXJpZSB4Mg0KDQpgYGB7ciBxMi14MiwgZmlnLmhlaWdodD0zLjYsIHJlc3VsdHM9J2hvbGQnfQ0KZml0X3gyIDwtIGJveF9qZW5raW5zKHgyLCAieDIiKQ0KYGBgDQoNCioqTGVpdHVyYS4qKiBBIHPDqXJpZSB4MiB0YW1iw6ltIMOpIGVzdGFjaW9uw6FyaWEsIG1hcyBkZSAqKm1lbcOzcmlhIG11aXRvIG1haXMgY3VydGEqKjogYQ0KQUNGIMOpIHNpZ25pZmljYW50ZSBhcGVuYXMgbm9zICoqbGFncyAxIGUgMioqIGUgc29tZSBlbSBzZWd1aWRhLCBjb20gYSBQQUNGIGRlY2FpbmRvIOKAlA0KYSBhc3NpbmF0dXJhIHTDrXBpY2EgZGUgdW0gKipNQSgyKSoqLCAkeF90ID0gYyArIFx2YXJlcHNpbG9uX3QgKyBcdGhldGFfMQ0KXHZhcmVwc2lsb25fe3QtMX0gKyBcdGhldGFfMlx2YXJlcHNpbG9uX3t0LTJ9JC4gRGVwZW5kZW5kbyBkbyBjcml0w6lyaW8sIG8gYGF1dG8uYXJpbWFgDQpwb3IgQUlDYyBwb2RlIGVzY29saGVyIHVtYSBlc3BlY2lmaWNhw6fDo28gYWluZGEgbWFpcyBwYXJjaW1vbmlvc2EgKHVtIE1BKDEpIG91IHVtDQpBUk1BKDEsMSkpIOKAlCBvIHF1ZSBpbXBvcnRhIMOpIHF1ZSwgYW8gY29udHLDoXJpbyBkZSB4MSwgb3MgY2hvcXVlcyBhcXVpIHNlIGRpc3NpcGFtIGVtDQpwb3Vjb3MgcGVyw61vZG9zLiBBIGRlY2lzw6NvIGZpbmFsIGRldmUgc2UgYXBvaWFyIG5vIEFJQ2MgKiplKiogbm8gZGlhZ27Ds3N0aWNvIGRlDQpyZXPDrWR1b3M6IG8gbW9kZWxvIGNvcnJldG8gw6kgbyBtYWlzIHNpbXBsZXMgY3Vqb3MgcmVzw61kdW9zIHNlamFtIHJ1w61kbyBicmFuY28NCihManVuZy1Cb3ggbsOjbyByZWplaXRhbmRvKS4gKlJlcG9ydGUgYSBvcmRlbSBleGF0YSBxdWUgbyBzZXUga25pdCBzZWxlY2lvbm91IGUgb3MNCmNvZWZpY2llbnRlcyBlc3RpbWFkb3MuKg0KDQo=