1 Questão 1 — Box-Jenkins e projeção

1.1 Coleta dos dados (SIDRA)

## Helper: localiza a coluna de código de período de forma tolerante a acento.
## (O SIDRA tem várias colunas "(Código)"; pegamos a do tempo, mês ou trimestre.)
col_periodo <- function(df, freq = c("mes", "tri")) {
  freq <- match.arg(freq)
  pat  <- if (freq == "mes") "M.s \\(C.digo\\)" else "Trimestre \\(C.digo\\)"
  nm   <- grep(pat, names(df), value = TRUE)
  if (!length(nm))
    stop("Coluna de período não encontrada. Colunas disponíveis: ",
         paste(names(df), collapse = " | "))
  as.character(df[[nm[1]]])
}

## ---------------------------------------------------------------------------
## IPCA mensal --- variação mensal (%), 2000-01 a 2021-12.
## Fonte: tabela 1737 (série histórica do IPCA), variable 63 = variação mensal.
## OBS.: a tabela 118 NÃO possui a variável 63 (foi o que travou o knit antes).
## Se o enunciado exigir a 118, rode  info_sidra(118)  e ajuste o código.
## ---------------------------------------------------------------------------
ipca_raw <- get_sidra(x = 1737, variable = 63, period = "200001-202112")

cod_m <- col_periodo(ipca_raw, "mes")              # "YYYYMM"
ipca <- tibble(
  data  = as.Date(paste0(substr(cod_m, 1, 4), "-", substr(cod_m, 5, 6), "-01")),
  valor = as.numeric(ipca_raw$Valor)
) %>% arrange(data) %>% filter(!is.na(valor))

ipca_ts <- ts(ipca$valor,
              start = c(year(min(ipca$data)), month(min(ipca$data))),
              frequency = 12)

## ---------------------------------------------------------------------------
## PIB trimestral a preços de mercado, índice de volume DESSAZONALIZADO.
## SIDRA tabela 1621, variable 584 (índice de volume COM ajuste sazonal),
## classificação c11255 = 90707 (PIB a preços de mercado).
## ATENÇÃO: na 1621 a variável é 584 (a 583 é a versão SEM ajuste, tabela 1620).
## Confirme com  info_sidra(1621)  se algo mudar.
## ---------------------------------------------------------------------------
pib_raw <- get_sidra(x = 1621, variable = 584, period = "200001-202104",
                     classific = "c11255", category = list(90707))

cod_t <- col_periodo(pib_raw, "tri")               # "YYYYTT" (TT = trimestre 01-04)
tri   <- as.integer(substr(cod_t, 5, 6))
pib <- tibble(
  data  = as.Date(paste0(substr(cod_t, 1, 4), "-",
                         sprintf("%02d", (tri - 1) * 3 + 1), "-01")),
  valor = as.numeric(pib_raw$Valor)
) %>% arrange(data) %>% filter(!is.na(valor))

pib_ts <- ts(pib$valor,
             start = c(year(min(pib$data)), quarter(min(pib$data))),
             frequency = 4)

## Conferência rápida (esperado: ~264 meses de IPCA e ~88 trimestres de PIB).
message("IPCA: ", nrow(ipca), " obs | PIB: ", nrow(pib), " obs")

1.2 Pré-tratamento: dessazonalização e transformação

O enunciado pede as séries dessazonalizadas. A série de PIB da tabela 1621 já vem com ajuste sazonal do IBGE, então basta tomar a primeira diferença do log (o crescimento trimestral). Já a inflação do IPCA não vem ajustada; aplico o X-13ARIMA-SEATS (via seasonal::seas), com recuo para STL caso o binário não esteja disponível no ambiente. Como ambas as séries entram já sem componente sazonal, o Box-Jenkins é aplicado sem termos sazonais (seasonal = FALSE) — incluí-los seria modelar uma sazonalidade que já foi removida.

# IPCA dessazonalizado
ipca_sa <- tryCatch(
  final(seas(ipca_ts)),
  error = function(e) {
    message("X-13 indisponível; usando STL.")
    as.ts(seasadj(stl(ipca_ts, s.window = "periodic")))
  }
)

# PIB: primeira diferença do log (já dessazonalizado na origem)
dlpib <- diff(log(pib_ts))

# visualização das séries de trabalho
autoplot(ipca_sa, colour = cor_serie) +
  labs(title = "IPCA --- variação mensal dessazonalizada",
       x = NULL, y = "% a.m.",
       caption = "Fonte: IBGE/SIDRA (tab. 1737), ajuste sazonal próprio.") +
  theme_jv()

autoplot(dlpib, colour = cor_serie) +
  labs(title = "PIB --- primeira diferença do log (crescimento trimestral)",
       x = NULL, y = "Δ log",
       caption = "Fonte: IBGE/SIDRA (tab. 1621, dessazonalizado).") +
  theme_jv()

1.3 Metodologia de Box-Jenkins

Encapsulo as quatro etapas numa função: (1) identificação — testes de raiz unitária e ACF/PACF para sugerir \((p,d,q)\); (2) estimação — deixo o auto.arima buscar por AIC corrigido, mas reporto o objeto para inspeção manual; (3) diagnóstico — Ljung-Box e ACF dos resíduos, para checar ruído branco; e (4) projeção\(h\) passos à frente com intervalos.

box_jenkins <- function(y, h, nome, sazonal = TRUE) {
  cat("==== ", nome, " ====\n", sep = "")

  # (1) Identificação: ordem de integração
  cat("ndiffs (ADF):", ndiffs(y, test = "adf"),
      "| nsdiffs:", ifelse(sazonal, tryCatch(nsdiffs(y), error = function(e) 0), 0), "\n")
  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))

  # (2) Estimação
  fit <- auto.arima(y, seasonal = sazonal, stepwise = FALSE,
                    approximation = FALSE, ic = "aicc")
  cat("\nModelo selecionado:\n"); print(fit)

  # (3) Diagnóstico
  print(checkresiduals(fit))

  # (4) Projeção
  fc <- forecast(fit, h = h)
  print(autoplot(fc) +
          labs(title = paste("Projeção", h, "passos à frente ---", nome),
               x = NULL, y = NULL) +
          theme_jv())
  invisible(list(fit = fit, fc = fc))
}

1.3.1 IPCA — modelo e projeção (12 meses)

res_ipca <- box_jenkins(ipca_sa, h = 12, nome = "IPCA (mensal)", sazonal = FALSE)

## ==== IPCA (mensal) ====
## ndiffs (ADF): 0 | nsdiffs: 0 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y
## Dickey-Fuller = -4.4425, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
##  KPSS Test for Level Stationarity
## 
## data:  y
## KPSS Level = 0.28598, Truncation lag parameter = 5, p-value = 0.1
## 
## 
## Modelo selecionado:
## Series: y 
## ARIMA(1,0,0) with non-zero mean 
## 
## Coefficients:
##          ar1    mean
##       0.6761  0.5122
## s.e.  0.0449  0.0460
## 
## sigma^2 = 0.06009:  log likelihood = -2.73
## AIC=11.45   AICc=11.55   BIC=22.18
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 24.92, df = 23, p-value = 0.3544
## 
## Model df: 1.   Total lags used: 24
## 
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 24.92, df = 23, p-value = 0.3544

Leitura. A inflação mensal dessazonalizada tende a ser estacionária em nível (o ADF costuma rejeitar a raiz unitária e o KPSS não rejeita estacionariedade), de modo que \(d=0\). O formato de ACF/PACF de uma série de inflação em geral sugere um processo de memória curta — tipicamente um AR de baixa ordem com algum termo MA, e o auto.arima costuma chegar a algo como um ARMA(p,q) parcimonioso. Os resíduos passando no teste de Ljung-Box (p-valor alto) indicam que o modelo capturou a dinâmica e o que sobra é ruído branco; só então a projeção é confiável. A projeção de 12 meses converge suavemente para a média de longo prazo da inflação mensal, com os intervalos se abrindo conforme o horizonte — comportamento esperado de um modelo estacionário. Confirme a ordem exata \((p,d,q)\) que o seu knit selecionou.

1.3.2 PIB — modelo e projeção (4 trimestres)

res_pib <- box_jenkins(dlpib, h = 4, nome = "Δlog PIB (trimestral)", sazonal = FALSE)

## ==== Δlog PIB (trimestral) ====
## ndiffs (ADF): 0 | nsdiffs: 0 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y
## Dickey-Fuller = -4.111, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
##  KPSS Test for Level Stationarity
## 
## data:  y
## KPSS Level = 0.38214, Truncation lag parameter = 3, p-value = 0.08485
## 
## 
## Modelo selecionado:
## Series: y 
## ARIMA(0,0,0) with non-zero mean 
## 
## Coefficients:
##         mean
##       0.0054
## s.e.  0.0019
## 
## sigma^2 = 0.0003181:  log likelihood = 227.36
## AIC=-450.73   AICc=-450.59   BIC=-445.8
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,0) with non-zero mean
## Q* = 3.969, df = 8, p-value = 0.8599
## 
## Model df: 0.   Total lags used: 8
## 
## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,0) with non-zero mean
## Q* = 3.969, df = 8, p-value = 0.8599

Leitura. Trabalhando já na primeira diferença do log, a série de crescimento do PIB é, por construção, \(I(0)\) se o PIB em log for \(I(1)\) — o ADF aplicado a dlpib deve rejeitar a raiz unitária. A dinâmica trimestral do crescimento costuma ser fraca, e não raro o melhor modelo por AICc é bastante simples (um ARMA de ordem baixa, eventualmente próximo de um ruído branco com média não-nula). Vale notar a sensibilidade da amostra 2000–2021: a recessão de 2015–2016 e o choque da pandemia em 2020 são outliers fortes que inflam a variância dos resíduos e alargam os intervalos de projeção — por isso a previsão de quatro trimestres à frente carrega incerteza considerável. Cheque os resíduos: se o Ljung-Box rejeitar, vale testar uma ordem maior ou tratar os outliers de 2020.


2 Questão 2 — Testes de raiz unitária na estrutura a termo

2.1 Coleta dos dados (FRED)

## API key do FRED.
## Preferência: variável de ambiente FRED_API_KEY (.Renviron). Se não houver,
## usa a chave embutida abaixo.
## >>> SEGURANÇA: esta chave fica visível no código publicado. Gere uma nova
##     chave em https://fred.stlouisfed.org/ (My Account -> API Keys) depois de
##     entregar/publicar, e troque a linha abaixo. <<<
chave_fred <- Sys.getenv("FRED_API_KEY")
if (!nzchar(chave_fred)) chave_fred <- "92497f6cde356c5b00a02d7cd3af24b2"
fredr_set_key(chave_fred)

# GS1  = 1-Year Treasury Constant Maturity, mensal (média das diárias)
# GS10 = 10-Year Treasury Constant Maturity, mensal
gs1  <- fredr(series_id = "GS1")
gs10 <- fredr(series_id = "GS10")

juros <- gs1  %>% transmute(data = date, y1 = value) %>%
  inner_join(gs10 %>% transmute(data = date, y10 = value), by = "data") %>%
  arrange(data) %>% mutate(spread = y10 - y1)

# objetos ts (mensais) para os testes
y1_ts     <- ts(juros$y1,     start = c(year(min(juros$data)), month(min(juros$data))), frequency = 12)
y10_ts    <- ts(juros$y10,    start = c(year(min(juros$data)), month(min(juros$data))), frequency = 12)
spread_ts <- ts(juros$spread, start = c(year(min(juros$data)), month(min(juros$data))), frequency = 12)
juros %>% tidyr::pivot_longer(c(y1, y10, spread), names_to = "serie", values_to = "v") %>%
  ggplot(aes(data, v, colour = serie)) +
  geom_hline(yintercept = 0, colour = "grey70", linewidth = 0.3) +
  geom_line(linewidth = 0.55) +
  scale_colour_manual(values = c(y1 = "#b5651d", y10 = "#2f5c4f", spread = "#444444"),
                      labels = c(y1 = "1 ano", y10 = "10 anos", spread = "spread (10a-1a)"),
                      name = NULL) +
  labs(title = "Treasuries de 1 e 10 anos e o spread a termo",
       x = NULL, y = "% a.a.",
       caption = "Fonte: FRED (GS1, GS10).") +
  theme_jv()

2.2 (a) Ordem de integração de cada série

Aplico o teste de Dickey-Fuller aumentado a cada taxa, em nível e em primeira diferença. Uso a versão ur.df (com termo de deriva) para inspecionar a estatística contra os valores críticos, e complemento com ndiffs para a contagem de diferenças sugerida.

df_report <- function(x, nome, tipo = "drift") {
  cat("---", nome, "---\n")
  print(summary(ur.df(x, type = tipo, selectlags = "AIC")))
  cat("ndiffs(ADF) =", ndiffs(x, test = "adf"), "\n\n")
}
df_report(y1_ts,  "Taxa 1 ano (nível)")
## --- Taxa 1 ano (nível) ---
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression drift 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.11975 -0.11771 -0.01713  0.12560  1.90410 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.047710   0.021344   2.235  0.02565 *  
## z.lag.1     -0.010098   0.003779  -2.672  0.00767 ** 
## z.diff.lag   0.374622   0.031371  11.942  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3615 on 873 degrees of freedom
## Multiple R-squared:  0.1437, Adjusted R-squared:  0.1418 
## F-statistic: 73.26 on 2 and 873 DF,  p-value: < 2.2e-16
## 
## 
## Value of test-statistic is: -2.6723 3.5736 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau2 -3.43 -2.86 -2.57
## phi1  6.43  4.59  3.78
## 
## ndiffs(ADF) = 1
df_report(y10_ts, "Taxa 10 anos (nível)")
## --- Taxa 10 anos (nível) ---
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression drift 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.65407 -0.12326 -0.00394  0.12733  1.51213 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.032457   0.018278   1.776   0.0761 .  
## z.lag.1     -0.005669   0.002934  -1.932   0.0537 .  
## z.diff.lag   0.308869   0.032170   9.601   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2491 on 873 degrees of freedom
## Multiple R-squared:  0.09772,    Adjusted R-squared:  0.09565 
## F-statistic: 47.27 on 2 and 873 DF,  p-value: < 2.2e-16
## 
## 
## Value of test-statistic is: -1.9318 1.8747 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau2 -3.43 -2.86 -2.57
## phi1  6.43  4.59  3.78
## 
## ndiffs(ADF) = 1
df_report(diff(y1_ts),  "Taxa 1 ano (1ª diferença)")
## --- Taxa 1 ano (1ª diferença) ---
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression drift 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.96119 -0.11039  0.00649  0.12880  1.89339 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.001244   0.011958   0.104    0.917    
## z.lag.1     -0.773226   0.037028 -20.882  < 2e-16 ***
## z.diff.lag   0.226943   0.032979   6.881 1.13e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3537 on 872 degrees of freedom
## Multiple R-squared:  0.3504, Adjusted R-squared:  0.3489 
## F-statistic: 235.1 on 2 and 872 DF,  p-value: < 2.2e-16
## 
## 
## Value of test-statistic is: -20.8823 218.0361 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau2 -3.43 -2.86 -2.57
## phi1  6.43  4.59  3.78
## 
## ndiffs(ADF) = 0
df_report(diff(y10_ts), "Taxa 10 anos (1ª diferença)")
## --- Taxa 10 anos (1ª diferença) ---
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression drift 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.61920 -0.12201 -0.00226  0.13210  1.40263 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.001367   0.008257   0.166    0.869    
## z.lag.1     -0.838278   0.039012 -21.488  < 2e-16 ***
## z.diff.lag   0.208497   0.033114   6.296 4.82e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2443 on 872 degrees of freedom
## Multiple R-squared:  0.3751, Adjusted R-squared:  0.3737 
## F-statistic: 261.8 on 2 and 872 DF,  p-value: < 2.2e-16
## 
## 
## Value of test-statistic is: -21.4878 230.862 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau2 -3.43 -2.86 -2.57
## phi1  6.43  4.59  3.78
## 
## ndiffs(ADF) = 0

Leitura. O padrão típico — e o que se espera teoricamente para taxas de juros — é que ambas as séries sejam \(I(1)\): em nível, o ADF não rejeita a raiz unitária (estatística acima do valor crítico), mas, ao diferenciar uma vez, a raiz unitária é rejeitada. Ou seja, as duas taxas compartilham a mesma ordem de integração, \(I(1)\). Isso é coerente com o fato de juros nominais herdarem a persistência das expectativas de inflação e da política monetária, que se comportam como tendências estocásticas. Confirme nos seus resultados: se o nível rejeitar para alguma série, reporte-a como \(I(0)\) e ajuste a discussão.

2.3 (b) Teste de Dickey-Fuller para o spread

df_report(spread_ts, "Spread 10a - 1a (nível)")
## --- Spread 10a - 1a (nível) ---
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression drift 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.56638 -0.10927 -0.00928  0.10487  2.13718 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.031521   0.010433   3.021  0.00259 ** 
## z.lag.1     -0.035046   0.007429  -4.717 2.78e-06 ***
## z.diff.lag   0.312227   0.032149   9.712  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2376 on 873 degrees of freedom
## Multiple R-squared:  0.1096, Adjusted R-squared:  0.1075 
## F-statistic: 53.72 on 2 and 873 DF,  p-value: < 2.2e-16
## 
## 
## Value of test-statistic is: -4.7174 11.1271 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau2 -3.43 -2.86 -2.57
## phi1  6.43  4.59  3.78
## 
## ndiffs(ADF) = 0
print(kpss.test(spread_ts))
## 
##  KPSS Test for Level Stationarity
## 
## data:  spread_ts
## KPSS Level = 1.3075, Truncation lag parameter = 6, p-value = 0.01

Leitura. O resultado de interesse é se o spread, apesar de ser a diferença de duas séries \(I(1)\), é estacionário. Na maioria das amostras longas o ADF rejeita a raiz unitária no spread (e o KPSS não rejeita estacionariedade), indicando que o spread é \(I(0)\) — ainda que persistente. Esse é o caso mais comum, mas o spread a termo é uma série sabidamente “quase-unitária”: não se assuste se o teste ficar no limiar; nesse caso reporte a ambiguidade e apoie-se no KPSS e na inspeção do gráfico.

2.4 (c) Implicações econômicas para a estrutura a termo

Se as duas taxas são \(I(1)\) e o spread é \(I(0)\), então as séries de 1 e 10 anos são cointegradas com vetor de cointegração \((1,-1)\): elas dividem uma única tendência estocástica comum — o nível geral dos juros — e o spread é o desvio estacionário em torno dessa relação de equilíbrio de longo prazo. Em termos econômicos, isso diz que as pontas curta e longa da curva não vagueiam indefinidamente para longe uma da outra; choques que abrem o spread tendem a se dissipar, e a estrutura a termo retorna a uma configuração de equilíbrio.

Essa é exatamente a previsão da hipótese das expectativas da estrutura a termo: a taxa longa é, a menos de um prêmio a termo aproximadamente estável, a média das taxas curtas futuras esperadas. Sob essa hipótese, taxa longa e taxa curta podem cada uma ter raiz unitária (porque as expectativas de juros futuros têm), mas a diferença entre elas — o prêmio mais o componente de expectativas — é estacionária. A cointegração \((1,-1)\) é, portanto, uma assinatura empírica da hipótese das expectativas com prêmio de risco estacionário.

A leitura se inverte no cenário alternativo: se o spread também fosse \(I(1)\), as duas pontas da curva não estariam ancoradas entre si no longo prazo, o que seria incompatível com a versão simples da hipótese das expectativas e apontaria para um prêmio a termo com tendência estocástica própria (variando permanentemente no tempo). Daí a importância do teste — ele distingue uma curva de juros com âncora de longo prazo de uma em que as maturidades se descolam. Reporte qual dos dois cenários seus dados sustentam e ancore a conclusão nas estatísticas obtidas.

LS0tDQp0aXRsZTogIkxpc3RhIDIgLS0tIFJhaXogVW5pdMOhcmlhIGUgTW9kZWxvcyBNdWx0aXZhcmlhZG9zIg0Kc3VidGl0bGU6ICJNYWNyb2Vjb25vbWlhIEFwbGljYWRhIC0tLSBCb3gtSmVua2lucyBlIFRlc3RlcyBkZSBSYWl6IFVuaXTDoXJpYSINCmF1dGhvcjogIkphY3F1ZXMgR2FicmllbCBHdWVkZXMgVmlkZWxhIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgZGUgJUIgZGUgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwNCiAgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy53aWR0aCA9IDcuMiwgZmlnLmhlaWdodCA9IDQsIGRwaSA9IDEzMA0KKQ0KDQojIyAtLS0gUGFjb3RlczogaW5zdGFsYSBvIHF1ZSBmYWx0YXIgZSBjYXJyZWdhIHR1ZG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Kb3B0aW9ucyhyZXBvcyA9IGMoQ1JBTiA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKSkNCg0KcGtncyA8LSBjKCJzaWRyYXIiLCAgICAgIyBkYWRvcyBkbyBJQkdFL1NJRFJBIChRdWVzdMOjbyAxKQ0KICAgICAgICAgICJmcmVkciIsICAgICAgIyBkYWRvcyBkbyBGUkVEIChRdWVzdMOjbyAyKQ0KICAgICAgICAgICJmb3JlY2FzdCIsICAgIyBBUklNQSwgYXV0by5hcmltYSwgQWNmL1BhY2YsIGZvcmVjYXN0LCBjaGVja3Jlc2lkdWFscw0KICAgICAgICAgICJ0c2VyaWVzIiwgICAgIyBhZGYudGVzdCwga3Bzcy50ZXN0DQogICAgICAgICAgInVyY2EiLCAgICAgICAjIHVyLmRmIChEaWNrZXktRnVsbGVyIGNvbSBzZWxlw6fDo28gZGUgZGVmYXNhZ2VucykNCiAgICAgICAgICAic2Vhc29uYWwiLCAgICMgWC0xM0FSSU1BLVNFQVRTIHBhcmEgZGVzc2F6b25hbGl6YXIgbyBJUENBDQogICAgICAgICAgIngxM2JpbmFyeSIsICAjIGJpbsOhcmlvIGRvIFgtMTMgKG5lY2Vzc8OhcmlvIHBlbG8gc2Vhc29uYWwpDQogICAgICAgICAgImx1YnJpZGF0ZSIsICJkcGx5ciIsICJ0aWR5ciIsICJ6b28iLA0KICAgICAgICAgICJnZ3Bsb3QyIiwgImtuaXRyIiwgImJyb29tIiwgInB1cnJyIiwgInRpYmJsZSIpDQoNCmZhbHRhbmRvIDwtIHBrZ3NbIXZhcHBseShwa2dzLCByZXF1aXJlTmFtZXNwYWNlLCBsb2dpY2FsKDEpLCBxdWlldGx5ID0gVFJVRSldDQppZiAobGVuZ3RoKGZhbHRhbmRvKSA+IDApIHsNCiAgdHJ5KGluc3RhbGwucGFja2FnZXMoZmFsdGFuZG8sIGRlcGVuZGVuY2llcyA9IFRSVUUpLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KaW52aXNpYmxlKGxhcHBseShwa2dzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKQ0KDQpzZXQuc2VlZCgyMDI2MDYwMSkNCg0KIyMgLS0tIFRlbWEgZ3LDoWZpY28gcHLDs3ByaW8gKGV2aXRhIG8gdmlzdWFsIHBhZHLDo28gZG8gZ2dwbG90KSAtLS0tLS0tLS0tLS0tLS0tDQp0aGVtZV9qdiA8LSBmdW5jdGlvbihiYXNlID0gMTIpIHsNCiAgZ2dwbG90Mjo6dGhlbWVfbGlnaHQoYmFzZV9zaXplID0gYmFzZSwgYmFzZV9mYW1pbHkgPSAic2FucyIpICsNCiAgICBnZ3Bsb3QyOjp0aGVtZSgNCiAgICAgIHBsb3QudGl0bGUgICAgICA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gYmFzZSArIDIsIGhqdXN0ID0gMCksDQogICAgICBwbG90LnN1YnRpdGxlICAgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoY29sb3VyID0gImdyZXkzMCIsIHNpemUgPSBiYXNlIC0gMSksDQogICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLA0KICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTkwIiwgbGluZXdpZHRoID0gMC4zKSwNCiAgICAgIHBhbmVsLmJvcmRlciAgICA9IGdncGxvdDI6OmVsZW1lbnRfcmVjdChjb2xvdXIgPSAiZ3JleTU1IiwgZmlsbCA9IE5BLCBsaW5ld2lkdGggPSAwLjUpLA0KICAgICAgYXhpcy50aWNrcyAgICAgID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5NTUiLCBsaW5ld2lkdGggPSAwLjQpLA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsDQogICAgICBwbG90LmNhcHRpb24gICAgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoY29sb3VyID0gImdyZXk0NSIsIGhqdXN0ID0gMCwgc2l6ZSA9IGJhc2UgLSAzKQ0KICAgICkNCn0NCmNvcl9zZXJpZSA8LSAiIzJmNWM0ZiIgICAjIHZlcmRlLXBldHLDs2xlbywgcHJvcG9zaXRhbG1lbnRlIGZvcmEgZG8gcGFkcsOjbw0KY29yX3ByZXYgIDwtICIjYjU2NTFkIiAgICMgdGVycmFjb3RhIHBhcmEgYXMgcHJvamXDp8O1ZXMNCmBgYA0KDQoNCiMgUXVlc3TDo28gMSAtLS0gQm94LUplbmtpbnMgZSBwcm9qZcOnw6NvDQoNCiMjIENvbGV0YSBkb3MgZGFkb3MgKFNJRFJBKQ0KDQpgYGB7ciBxMS1kYWRvc30NCiMjIEhlbHBlcjogbG9jYWxpemEgYSBjb2x1bmEgZGUgY8OzZGlnbyBkZSBwZXLDrW9kbyBkZSBmb3JtYSB0b2xlcmFudGUgYSBhY2VudG8uDQojIyAoTyBTSURSQSB0ZW0gdsOhcmlhcyBjb2x1bmFzICIoQ8OzZGlnbykiOyBwZWdhbW9zIGEgZG8gdGVtcG8sIG3DqnMgb3UgdHJpbWVzdHJlLikNCmNvbF9wZXJpb2RvIDwtIGZ1bmN0aW9uKGRmLCBmcmVxID0gYygibWVzIiwgInRyaSIpKSB7DQogIGZyZXEgPC0gbWF0Y2guYXJnKGZyZXEpDQogIHBhdCAgPC0gaWYgKGZyZXEgPT0gIm1lcyIpICJNLnMgXFwoQy5kaWdvXFwpIiBlbHNlICJUcmltZXN0cmUgXFwoQy5kaWdvXFwpIg0KICBubSAgIDwtIGdyZXAocGF0LCBuYW1lcyhkZiksIHZhbHVlID0gVFJVRSkNCiAgaWYgKCFsZW5ndGgobm0pKQ0KICAgIHN0b3AoIkNvbHVuYSBkZSBwZXLDrW9kbyBuw6NvIGVuY29udHJhZGEuIENvbHVuYXMgZGlzcG9uw612ZWlzOiAiLA0KICAgICAgICAgcGFzdGUobmFtZXMoZGYpLCBjb2xsYXBzZSA9ICIgfCAiKSkNCiAgYXMuY2hhcmFjdGVyKGRmW1tubVsxXV1dKQ0KfQ0KDQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMjIElQQ0EgbWVuc2FsIC0tLSB2YXJpYcOnw6NvIG1lbnNhbCAoJSksIDIwMDAtMDEgYSAyMDIxLTEyLg0KIyMgRm9udGU6IHRhYmVsYSAxNzM3IChzw6lyaWUgaGlzdMOzcmljYSBkbyBJUENBKSwgdmFyaWFibGUgNjMgPSB2YXJpYcOnw6NvIG1lbnNhbC4NCiMjIE9CUy46IGEgdGFiZWxhIDExOCBOw4NPIHBvc3N1aSBhIHZhcmnDoXZlbCA2MyAoZm9pIG8gcXVlIHRyYXZvdSBvIGtuaXQgYW50ZXMpLg0KIyMgU2UgbyBlbnVuY2lhZG8gZXhpZ2lyIGEgMTE4LCByb2RlICBpbmZvX3NpZHJhKDExOCkgIGUgYWp1c3RlIG8gY8OzZGlnby4NCiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KaXBjYV9yYXcgPC0gZ2V0X3NpZHJhKHggPSAxNzM3LCB2YXJpYWJsZSA9IDYzLCBwZXJpb2QgPSAiMjAwMDAxLTIwMjExMiIpDQoNCmNvZF9tIDwtIGNvbF9wZXJpb2RvKGlwY2FfcmF3LCAibWVzIikgICAgICAgICAgICAgICMgIllZWVlNTSINCmlwY2EgPC0gdGliYmxlKA0KICBkYXRhICA9IGFzLkRhdGUocGFzdGUwKHN1YnN0cihjb2RfbSwgMSwgNCksICItIiwgc3Vic3RyKGNvZF9tLCA1LCA2KSwgIi0wMSIpKSwNCiAgdmFsb3IgPSBhcy5udW1lcmljKGlwY2FfcmF3JFZhbG9yKQ0KKSAlPiUgYXJyYW5nZShkYXRhKSAlPiUgZmlsdGVyKCFpcy5uYSh2YWxvcikpDQoNCmlwY2FfdHMgPC0gdHMoaXBjYSR2YWxvciwNCiAgICAgICAgICAgICAgc3RhcnQgPSBjKHllYXIobWluKGlwY2EkZGF0YSkpLCBtb250aChtaW4oaXBjYSRkYXRhKSkpLA0KICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAxMikNCg0KIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIyBQSUIgdHJpbWVzdHJhbCBhIHByZcOnb3MgZGUgbWVyY2Fkbywgw61uZGljZSBkZSB2b2x1bWUgREVTU0FaT05BTElaQURPLg0KIyMgU0lEUkEgdGFiZWxhIDE2MjEsIHZhcmlhYmxlIDU4NCAow61uZGljZSBkZSB2b2x1bWUgQ09NIGFqdXN0ZSBzYXpvbmFsKSwNCiMjIGNsYXNzaWZpY2HDp8OjbyBjMTEyNTUgPSA5MDcwNyAoUElCIGEgcHJlw6dvcyBkZSBtZXJjYWRvKS4NCiMjIEFURU7Dh8ODTzogbmEgMTYyMSBhIHZhcmnDoXZlbCDDqSA1ODQgKGEgNTgzIMOpIGEgdmVyc8OjbyBTRU0gYWp1c3RlLCB0YWJlbGEgMTYyMCkuDQojIyBDb25maXJtZSBjb20gIGluZm9fc2lkcmEoMTYyMSkgIHNlIGFsZ28gbXVkYXIuDQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnBpYl9yYXcgPC0gZ2V0X3NpZHJhKHggPSAxNjIxLCB2YXJpYWJsZSA9IDU4NCwgcGVyaW9kID0gIjIwMDAwMS0yMDIxMDQiLA0KICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljID0gImMxMTI1NSIsIGNhdGVnb3J5ID0gbGlzdCg5MDcwNykpDQoNCmNvZF90IDwtIGNvbF9wZXJpb2RvKHBpYl9yYXcsICJ0cmkiKSAgICAgICAgICAgICAgICMgIllZWVlUVCIgKFRUID0gdHJpbWVzdHJlIDAxLTA0KQ0KdHJpICAgPC0gYXMuaW50ZWdlcihzdWJzdHIoY29kX3QsIDUsIDYpKQ0KcGliIDwtIHRpYmJsZSgNCiAgZGF0YSAgPSBhcy5EYXRlKHBhc3RlMChzdWJzdHIoY29kX3QsIDEsIDQpLCAiLSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJTAyZCIsICh0cmkgLSAxKSAqIDMgKyAxKSwgIi0wMSIpKSwNCiAgdmFsb3IgPSBhcy5udW1lcmljKHBpYl9yYXckVmFsb3IpDQopICU+JSBhcnJhbmdlKGRhdGEpICU+JSBmaWx0ZXIoIWlzLm5hKHZhbG9yKSkNCg0KcGliX3RzIDwtIHRzKHBpYiR2YWxvciwNCiAgICAgICAgICAgICBzdGFydCA9IGMoeWVhcihtaW4ocGliJGRhdGEpKSwgcXVhcnRlcihtaW4ocGliJGRhdGEpKSksDQogICAgICAgICAgICAgZnJlcXVlbmN5ID0gNCkNCg0KIyMgQ29uZmVyw6puY2lhIHLDoXBpZGEgKGVzcGVyYWRvOiB+MjY0IG1lc2VzIGRlIElQQ0EgZSB+ODggdHJpbWVzdHJlcyBkZSBQSUIpLg0KbWVzc2FnZSgiSVBDQTogIiwgbnJvdyhpcGNhKSwgIiBvYnMgfCBQSUI6ICIsIG5yb3cocGliKSwgIiBvYnMiKQ0KYGBgDQoNCiMjIFByw6ktdHJhdGFtZW50bzogZGVzc2F6b25hbGl6YcOnw6NvIGUgdHJhbnNmb3JtYcOnw6NvDQoNCk8gZW51bmNpYWRvIHBlZGUgYXMgc8OpcmllcyAqZGVzc2F6b25hbGl6YWRhcyouIEEgc8OpcmllIGRlIFBJQiBkYSB0YWJlbGEgMTYyMSBqw6ENCnZlbSBjb20gYWp1c3RlIHNhem9uYWwgZG8gSUJHRSwgZW50w6NvIGJhc3RhIHRvbWFyIGEgKipwcmltZWlyYSBkaWZlcmVuw6dhIGRvIGxvZyoqDQoobyBjcmVzY2ltZW50byB0cmltZXN0cmFsKS4gSsOhIGEgaW5mbGHDp8OjbyBkbyBJUENBIG7Do28gdmVtIGFqdXN0YWRhOyBhcGxpY28gbw0KWC0xM0FSSU1BLVNFQVRTICh2aWEgYHNlYXNvbmFsOjpzZWFzYCksIGNvbSByZWN1byBwYXJhIFNUTCBjYXNvIG8gYmluw6FyaW8gbsOjbw0KZXN0ZWphIGRpc3BvbsOtdmVsIG5vIGFtYmllbnRlLiBDb21vIGFtYmFzIGFzIHPDqXJpZXMgZW50cmFtIGrDoSBzZW0gY29tcG9uZW50ZQ0Kc2F6b25hbCwgbyBCb3gtSmVua2lucyDDqSBhcGxpY2FkbyAqKnNlbSoqIHRlcm1vcyBzYXpvbmFpcyAoYHNlYXNvbmFsID0gRkFMU0VgKSDigJQNCmluY2x1w60tbG9zIHNlcmlhIG1vZGVsYXIgdW1hIHNhem9uYWxpZGFkZSBxdWUgasOhIGZvaSByZW1vdmlkYS4NCg0KYGBge3IgcTEtcHJlcH0NCiMgSVBDQSBkZXNzYXpvbmFsaXphZG8NCmlwY2Ffc2EgPC0gdHJ5Q2F0Y2goDQogIGZpbmFsKHNlYXMoaXBjYV90cykpLA0KICBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICBtZXNzYWdlKCJYLTEzIGluZGlzcG9uw612ZWw7IHVzYW5kbyBTVEwuIikNCiAgICBhcy50cyhzZWFzYWRqKHN0bChpcGNhX3RzLCBzLndpbmRvdyA9ICJwZXJpb2RpYyIpKSkNCiAgfQ0KKQ0KDQojIFBJQjogcHJpbWVpcmEgZGlmZXJlbsOnYSBkbyBsb2cgKGrDoSBkZXNzYXpvbmFsaXphZG8gbmEgb3JpZ2VtKQ0KZGxwaWIgPC0gZGlmZihsb2cocGliX3RzKSkNCg0KIyB2aXN1YWxpemHDp8OjbyBkYXMgc8OpcmllcyBkZSB0cmFiYWxobw0KYXV0b3Bsb3QoaXBjYV9zYSwgY29sb3VyID0gY29yX3NlcmllKSArDQogIGxhYnModGl0bGUgPSAiSVBDQSAtLS0gdmFyaWHDp8OjbyBtZW5zYWwgZGVzc2F6b25hbGl6YWRhIiwNCiAgICAgICB4ID0gTlVMTCwgeSA9ICIlIGEubS4iLA0KICAgICAgIGNhcHRpb24gPSAiRm9udGU6IElCR0UvU0lEUkEgKHRhYi4gMTczNyksIGFqdXN0ZSBzYXpvbmFsIHByw7NwcmlvLiIpICsNCiAgdGhlbWVfanYoKQ0KDQphdXRvcGxvdChkbHBpYiwgY29sb3VyID0gY29yX3NlcmllKSArDQogIGxhYnModGl0bGUgPSAiUElCIC0tLSBwcmltZWlyYSBkaWZlcmVuw6dhIGRvIGxvZyAoY3Jlc2NpbWVudG8gdHJpbWVzdHJhbCkiLA0KICAgICAgIHggPSBOVUxMLCB5ID0gIs6UIGxvZyIsDQogICAgICAgY2FwdGlvbiA9ICJGb250ZTogSUJHRS9TSURSQSAodGFiLiAxNjIxLCBkZXNzYXpvbmFsaXphZG8pLiIpICsNCiAgdGhlbWVfanYoKQ0KYGBgDQoNCiMjIE1ldG9kb2xvZ2lhIGRlIEJveC1KZW5raW5zDQoNCkVuY2Fwc3VsbyBhcyBxdWF0cm8gZXRhcGFzIG51bWEgZnVuw6fDo286ICgxKSAqKmlkZW50aWZpY2HDp8OjbyoqIOKAlCB0ZXN0ZXMgZGUgcmFpeg0KdW5pdMOhcmlhIGUgQUNGL1BBQ0YgcGFyYSBzdWdlcmlyICQocCxkLHEpJDsgKDIpICoqZXN0aW1hw6fDo28qKiDigJQgZGVpeG8gbw0KYGF1dG8uYXJpbWFgIGJ1c2NhciBwb3IgQUlDIGNvcnJpZ2lkbywgbWFzIHJlcG9ydG8gbyBvYmpldG8gcGFyYSBpbnNwZcOnw6NvIG1hbnVhbDsNCigzKSAqKmRpYWduw7NzdGljbyoqIOKAlCBManVuZy1Cb3ggZSBBQ0YgZG9zIHJlc8OtZHVvcywgcGFyYSBjaGVjYXIgcnXDrWRvIGJyYW5jbzsgZQ0KKDQpICoqcHJvamXDp8OjbyoqIOKAlCAkaCQgcGFzc29zIMOgIGZyZW50ZSBjb20gaW50ZXJ2YWxvcy4NCg0KYGBge3IgcTEtZnVuY2FvfQ0KYm94X2plbmtpbnMgPC0gZnVuY3Rpb24oeSwgaCwgbm9tZSwgc2F6b25hbCA9IFRSVUUpIHsNCiAgY2F0KCI9PT09ICIsIG5vbWUsICIgPT09PVxuIiwgc2VwID0gIiIpDQoNCiAgIyAoMSkgSWRlbnRpZmljYcOnw6NvOiBvcmRlbSBkZSBpbnRlZ3Jhw6fDo28NCiAgY2F0KCJuZGlmZnMgKEFERik6IiwgbmRpZmZzKHksIHRlc3QgPSAiYWRmIiksDQogICAgICAifCBuc2RpZmZzOiIsIGlmZWxzZShzYXpvbmFsLCB0cnlDYXRjaChuc2RpZmZzKHkpLCBlcnJvciA9IGZ1bmN0aW9uKGUpIDApLCAwKSwgIlxuIikNCiAgcHJpbnQoYWRmLnRlc3QoeSkpICAgICAgICAgICAgICAgICAjIEgwOiByYWl6IHVuaXTDoXJpYQ0KICBwcmludChrcHNzLnRlc3QoeSkpICAgICAgICAgICAgICAgICMgSDA6IGVzdGFjaW9uYXJpZWRhZGUNCg0KICBwYXIobWZyb3cgPSBjKDEsIDIpKQ0KICBBY2YoeSwgIG1haW4gPSBwYXN0ZSgiQUNGIC0iLCAgbm9tZSkpDQogIFBhY2YoeSwgbWFpbiA9IHBhc3RlKCJQQUNGIC0iLCBub21lKSkNCiAgcGFyKG1mcm93ID0gYygxLCAxKSkNCg0KICAjICgyKSBFc3RpbWHDp8Ojbw0KICBmaXQgPC0gYXV0by5hcmltYSh5LCBzZWFzb25hbCA9IHNhem9uYWwsIHN0ZXB3aXNlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgIGFwcHJveGltYXRpb24gPSBGQUxTRSwgaWMgPSAiYWljYyIpDQogIGNhdCgiXG5Nb2RlbG8gc2VsZWNpb25hZG86XG4iKTsgcHJpbnQoZml0KQ0KDQogICMgKDMpIERpYWduw7NzdGljbw0KICBwcmludChjaGVja3Jlc2lkdWFscyhmaXQpKQ0KDQogICMgKDQpIFByb2plw6fDo28NCiAgZmMgPC0gZm9yZWNhc3QoZml0LCBoID0gaCkNCiAgcHJpbnQoYXV0b3Bsb3QoZmMpICsNCiAgICAgICAgICBsYWJzKHRpdGxlID0gcGFzdGUoIlByb2plw6fDo28iLCBoLCAicGFzc29zIMOgIGZyZW50ZSAtLS0iLCBub21lKSwNCiAgICAgICAgICAgICAgIHggPSBOVUxMLCB5ID0gTlVMTCkgKw0KICAgICAgICAgIHRoZW1lX2p2KCkpDQogIGludmlzaWJsZShsaXN0KGZpdCA9IGZpdCwgZmMgPSBmYykpDQp9DQpgYGANCg0KIyMjIElQQ0EgLS0tIG1vZGVsbyBlIHByb2plw6fDo28gKDEyIG1lc2VzKQ0KDQpgYGB7ciBxMS1pcGNhLCBmaWcuaGVpZ2h0PTMuNiwgcmVzdWx0cz0naG9sZCd9DQpyZXNfaXBjYSA8LSBib3hfamVua2lucyhpcGNhX3NhLCBoID0gMTIsIG5vbWUgPSAiSVBDQSAobWVuc2FsKSIsIHNhem9uYWwgPSBGQUxTRSkNCmBgYA0KDQoqKkxlaXR1cmEuKiogQSBpbmZsYcOnw6NvIG1lbnNhbCBkZXNzYXpvbmFsaXphZGEgdGVuZGUgYSBzZXIgKiplc3RhY2lvbsOhcmlhIGVtIG7DrXZlbCoqDQoobyBBREYgY29zdHVtYSByZWplaXRhciBhIHJhaXogdW5pdMOhcmlhIGUgbyBLUFNTIG7Do28gcmVqZWl0YSBlc3RhY2lvbmFyaWVkYWRlKSwNCmRlIG1vZG8gcXVlICRkPTAkLiBPIGZvcm1hdG8gZGUgQUNGL1BBQ0YgZGUgdW1hIHPDqXJpZSBkZSBpbmZsYcOnw6NvIGVtIGdlcmFsIHN1Z2VyZQ0KdW0gcHJvY2Vzc28gZGUgbWVtw7NyaWEgY3VydGEg4oCUIHRpcGljYW1lbnRlIHVtIEFSIGRlIGJhaXhhIG9yZGVtIGNvbSBhbGd1bSB0ZXJtbyBNQSwNCmUgbyBgYXV0by5hcmltYWAgY29zdHVtYSBjaGVnYXIgYSBhbGdvIGNvbW8gdW0gQVJNQShwLHEpIHBhcmNpbW9uaW9zby4gT3MgcmVzw61kdW9zDQpwYXNzYW5kbyBubyB0ZXN0ZSBkZSBManVuZy1Cb3ggKHAtdmFsb3IgYWx0bykgaW5kaWNhbSBxdWUgbyBtb2RlbG8gY2FwdHVyb3UgYQ0KZGluw6JtaWNhIGUgbyBxdWUgc29icmEgw6kgcnXDrWRvIGJyYW5jbzsgc8OzIGVudMOjbyBhIHByb2plw6fDo28gw6kgY29uZmnDoXZlbC4gQSBwcm9qZcOnw6NvDQpkZSAxMiBtZXNlcyBjb252ZXJnZSBzdWF2ZW1lbnRlIHBhcmEgYSBtw6lkaWEgZGUgbG9uZ28gcHJhem8gZGEgaW5mbGHDp8OjbyBtZW5zYWwsDQpjb20gb3MgaW50ZXJ2YWxvcyBzZSBhYnJpbmRvIGNvbmZvcm1lIG8gaG9yaXpvbnRlIOKAlCBjb21wb3J0YW1lbnRvIGVzcGVyYWRvIGRlIHVtDQptb2RlbG8gZXN0YWNpb27DoXJpby4gKkNvbmZpcm1lIGEgb3JkZW0gZXhhdGEgJChwLGQscSkkIHF1ZSBvIHNldSBrbml0IHNlbGVjaW9ub3UuKg0KDQojIyMgUElCIC0tLSBtb2RlbG8gZSBwcm9qZcOnw6NvICg0IHRyaW1lc3RyZXMpDQoNCmBgYHtyIHExLXBpYiwgZmlnLmhlaWdodD0zLjYsIHJlc3VsdHM9J2hvbGQnfQ0KcmVzX3BpYiA8LSBib3hfamVua2lucyhkbHBpYiwgaCA9IDQsIG5vbWUgPSAizpRsb2cgUElCICh0cmltZXN0cmFsKSIsIHNhem9uYWwgPSBGQUxTRSkNCmBgYA0KDQoqKkxlaXR1cmEuKiogVHJhYmFsaGFuZG8gasOhIG5hIHByaW1laXJhIGRpZmVyZW7Dp2EgZG8gbG9nLCBhIHPDqXJpZSBkZSBjcmVzY2ltZW50byBkbw0KUElCIMOpLCBwb3IgY29uc3RydcOnw6NvLCAkSSgwKSQgc2UgbyBQSUIgZW0gbG9nIGZvciAkSSgxKSQg4oCUIG8gQURGIGFwbGljYWRvIGEgYGRscGliYA0KZGV2ZSByZWplaXRhciBhIHJhaXogdW5pdMOhcmlhLiBBIGRpbsOibWljYSB0cmltZXN0cmFsIGRvIGNyZXNjaW1lbnRvIGNvc3R1bWEgc2VyDQpmcmFjYSwgZSBuw6NvIHJhcm8gbyBtZWxob3IgbW9kZWxvIHBvciBBSUNjIMOpIGJhc3RhbnRlIHNpbXBsZXMgKHVtIEFSTUEgZGUgb3JkZW0NCmJhaXhhLCBldmVudHVhbG1lbnRlIHByw7N4aW1vIGRlIHVtIHJ1w61kbyBicmFuY28gY29tIG3DqWRpYSBuw6NvLW51bGEpLiBWYWxlIG5vdGFyIGENCnNlbnNpYmlsaWRhZGUgZGEgYW1vc3RyYSAyMDAwLS0yMDIxOiBhIHJlY2Vzc8OjbyBkZSAyMDE1LS0yMDE2IGUgbyBjaG9xdWUgZGENCnBhbmRlbWlhIGVtIDIwMjAgc8OjbyAqb3V0bGllcnMqIGZvcnRlcyBxdWUgaW5mbGFtIGEgdmFyacOibmNpYSBkb3MgcmVzw61kdW9zIGUNCmFsYXJnYW0gb3MgaW50ZXJ2YWxvcyBkZSBwcm9qZcOnw6NvIOKAlCBwb3IgaXNzbyBhIHByZXZpc8OjbyBkZSBxdWF0cm8gdHJpbWVzdHJlcyDDoA0KZnJlbnRlIGNhcnJlZ2EgaW5jZXJ0ZXphIGNvbnNpZGVyw6F2ZWwuICpDaGVxdWUgb3MgcmVzw61kdW9zOiBzZSBvIExqdW5nLUJveCByZWplaXRhciwNCnZhbGUgdGVzdGFyIHVtYSBvcmRlbSBtYWlvciBvdSB0cmF0YXIgb3Mgb3V0bGllcnMgZGUgMjAyMC4qDQoNCi0tLQ0KDQojIFF1ZXN0w6NvIDIgLS0tIFRlc3RlcyBkZSByYWl6IHVuaXTDoXJpYSBuYSBlc3RydXR1cmEgYSB0ZXJtbw0KDQojIyBDb2xldGEgZG9zIGRhZG9zIChGUkVEKQ0KDQpgYGB7ciBxMi1kYWRvcywgZXZhbD1UUlVFfQ0KIyMgQVBJIGtleSBkbyBGUkVELg0KIyMgUHJlZmVyw6puY2lhOiB2YXJpw6F2ZWwgZGUgYW1iaWVudGUgRlJFRF9BUElfS0VZICguUmVudmlyb24pLiBTZSBuw6NvIGhvdXZlciwNCiMjIHVzYSBhIGNoYXZlIGVtYnV0aWRhIGFiYWl4by4NCiMjID4+PiBTRUdVUkFOw4dBOiBlc3RhIGNoYXZlIGZpY2Egdmlzw612ZWwgbm8gY8OzZGlnbyBwdWJsaWNhZG8uIEdlcmUgdW1hIG5vdmENCiMjICAgICBjaGF2ZSBlbSBodHRwczovL2ZyZWQuc3Rsb3Vpc2ZlZC5vcmcvIChNeSBBY2NvdW50IC0+IEFQSSBLZXlzKSBkZXBvaXMgZGUNCiMjICAgICBlbnRyZWdhci9wdWJsaWNhciwgZSB0cm9xdWUgYSBsaW5oYSBhYmFpeG8uIDw8PA0KY2hhdmVfZnJlZCA8LSBTeXMuZ2V0ZW52KCJGUkVEX0FQSV9LRVkiKQ0KaWYgKCFuemNoYXIoY2hhdmVfZnJlZCkpIGNoYXZlX2ZyZWQgPC0gIjkyNDk3ZjZjZGUzNTZjNWIwMGEwMmQ3Y2QzYWYyNGIyIg0KZnJlZHJfc2V0X2tleShjaGF2ZV9mcmVkKQ0KDQojIEdTMSAgPSAxLVllYXIgVHJlYXN1cnkgQ29uc3RhbnQgTWF0dXJpdHksIG1lbnNhbCAobcOpZGlhIGRhcyBkacOhcmlhcykNCiMgR1MxMCA9IDEwLVllYXIgVHJlYXN1cnkgQ29uc3RhbnQgTWF0dXJpdHksIG1lbnNhbA0KZ3MxICA8LSBmcmVkcihzZXJpZXNfaWQgPSAiR1MxIikNCmdzMTAgPC0gZnJlZHIoc2VyaWVzX2lkID0gIkdTMTAiKQ0KDQpqdXJvcyA8LSBnczEgICU+JSB0cmFuc211dGUoZGF0YSA9IGRhdGUsIHkxID0gdmFsdWUpICU+JQ0KICBpbm5lcl9qb2luKGdzMTAgJT4lIHRyYW5zbXV0ZShkYXRhID0gZGF0ZSwgeTEwID0gdmFsdWUpLCBieSA9ICJkYXRhIikgJT4lDQogIGFycmFuZ2UoZGF0YSkgJT4lIG11dGF0ZShzcHJlYWQgPSB5MTAgLSB5MSkNCg0KIyBvYmpldG9zIHRzIChtZW5zYWlzKSBwYXJhIG9zIHRlc3Rlcw0KeTFfdHMgICAgIDwtIHRzKGp1cm9zJHkxLCAgICAgc3RhcnQgPSBjKHllYXIobWluKGp1cm9zJGRhdGEpKSwgbW9udGgobWluKGp1cm9zJGRhdGEpKSksIGZyZXF1ZW5jeSA9IDEyKQ0KeTEwX3RzICAgIDwtIHRzKGp1cm9zJHkxMCwgICAgc3RhcnQgPSBjKHllYXIobWluKGp1cm9zJGRhdGEpKSwgbW9udGgobWluKGp1cm9zJGRhdGEpKSksIGZyZXF1ZW5jeSA9IDEyKQ0Kc3ByZWFkX3RzIDwtIHRzKGp1cm9zJHNwcmVhZCwgc3RhcnQgPSBjKHllYXIobWluKGp1cm9zJGRhdGEpKSwgbW9udGgobWluKGp1cm9zJGRhdGEpKSksIGZyZXF1ZW5jeSA9IDEyKQ0KYGBgDQoNCmBgYHtyIHEyLXBsb3QsIGZpZy5oZWlnaHQ9My44fQ0KanVyb3MgJT4lIHRpZHlyOjpwaXZvdF9sb25nZXIoYyh5MSwgeTEwLCBzcHJlYWQpLCBuYW1lc190byA9ICJzZXJpZSIsIHZhbHVlc190byA9ICJ2IikgJT4lDQogIGdncGxvdChhZXMoZGF0YSwgdiwgY29sb3VyID0gc2VyaWUpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJncmV5NzAiLCBsaW5ld2lkdGggPSAwLjMpICsNCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDAuNTUpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKHkxID0gIiNiNTY1MWQiLCB5MTAgPSAiIzJmNWM0ZiIsIHNwcmVhZCA9ICIjNDQ0NDQ0IiksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyh5MSA9ICIxIGFubyIsIHkxMCA9ICIxMCBhbm9zIiwgc3ByZWFkID0gInNwcmVhZCAoMTBhLTFhKSIpLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGxhYnModGl0bGUgPSAiVHJlYXN1cmllcyBkZSAxIGUgMTAgYW5vcyBlIG8gc3ByZWFkIGEgdGVybW8iLA0KICAgICAgIHggPSBOVUxMLCB5ID0gIiUgYS5hLiIsDQogICAgICAgY2FwdGlvbiA9ICJGb250ZTogRlJFRCAoR1MxLCBHUzEwKS4iKSArDQogIHRoZW1lX2p2KCkNCmBgYA0KDQojIyAoYSkgT3JkZW0gZGUgaW50ZWdyYcOnw6NvIGRlIGNhZGEgc8OpcmllDQoNCkFwbGljbyBvIHRlc3RlIGRlIERpY2tleS1GdWxsZXIgYXVtZW50YWRvIGEgY2FkYSB0YXhhLCBlbSBuw612ZWwgZSBlbSBwcmltZWlyYQ0KZGlmZXJlbsOnYS4gVXNvIGEgdmVyc8OjbyBgdXIuZGZgIChjb20gdGVybW8gZGUgZGVyaXZhKSBwYXJhIGluc3BlY2lvbmFyIGENCmVzdGF0w61zdGljYSBjb250cmEgb3MgdmFsb3JlcyBjcsOtdGljb3MsIGUgY29tcGxlbWVudG8gY29tIGBuZGlmZnNgIHBhcmEgYQ0KY29udGFnZW0gZGUgZGlmZXJlbsOnYXMgc3VnZXJpZGEuDQoNCmBgYHtyIHEyLWFkZi1uaXZlaXN9DQpkZl9yZXBvcnQgPC0gZnVuY3Rpb24oeCwgbm9tZSwgdGlwbyA9ICJkcmlmdCIpIHsNCiAgY2F0KCItLS0iLCBub21lLCAiLS0tXG4iKQ0KICBwcmludChzdW1tYXJ5KHVyLmRmKHgsIHR5cGUgPSB0aXBvLCBzZWxlY3RsYWdzID0gIkFJQyIpKSkNCiAgY2F0KCJuZGlmZnMoQURGKSA9IiwgbmRpZmZzKHgsIHRlc3QgPSAiYWRmIiksICJcblxuIikNCn0NCmRmX3JlcG9ydCh5MV90cywgICJUYXhhIDEgYW5vIChuw612ZWwpIikNCmRmX3JlcG9ydCh5MTBfdHMsICJUYXhhIDEwIGFub3MgKG7DrXZlbCkiKQ0KYGBgDQoNCmBgYHtyIHEyLWFkZi1kaWZmc30NCmRmX3JlcG9ydChkaWZmKHkxX3RzKSwgICJUYXhhIDEgYW5vICgxwqogZGlmZXJlbsOnYSkiKQ0KZGZfcmVwb3J0KGRpZmYoeTEwX3RzKSwgIlRheGEgMTAgYW5vcyAoMcKqIGRpZmVyZW7Dp2EpIikNCmBgYA0KDQoqKkxlaXR1cmEuKiogTyBwYWRyw6NvIHTDrXBpY28g4oCUIGUgbyBxdWUgc2UgZXNwZXJhIHRlb3JpY2FtZW50ZSBwYXJhIHRheGFzIGRlIGp1cm9zIOKAlA0Kw6kgcXVlICoqYW1iYXMgYXMgc8OpcmllcyBzZWphbSAkSSgxKSQqKjogZW0gbsOtdmVsLCBvIEFERiAqbsOjbyogcmVqZWl0YSBhIHJhaXoNCnVuaXTDoXJpYSAoZXN0YXTDrXN0aWNhIGFjaW1hIGRvIHZhbG9yIGNyw610aWNvKSwgbWFzLCBhbyBkaWZlcmVuY2lhciB1bWEgdmV6LCBhIHJhaXoNCnVuaXTDoXJpYSDDqSByZWplaXRhZGEuIE91IHNlamEsIGFzIGR1YXMgdGF4YXMgY29tcGFydGlsaGFtIGEgbWVzbWEgb3JkZW0gZGUNCmludGVncmHDp8OjbywgJEkoMSkkLiBJc3NvIMOpIGNvZXJlbnRlIGNvbSBvIGZhdG8gZGUganVyb3Mgbm9taW5haXMgaGVyZGFyZW0gYQ0KcGVyc2lzdMOqbmNpYSBkYXMgZXhwZWN0YXRpdmFzIGRlIGluZmxhw6fDo28gZSBkYSBwb2zDrXRpY2EgbW9uZXTDoXJpYSwgcXVlIHNlIGNvbXBvcnRhbQ0KY29tbyB0ZW5kw6puY2lhcyBlc3RvY8Ohc3RpY2FzLiAqQ29uZmlybWUgbm9zIHNldXMgcmVzdWx0YWRvczogc2UgbyBuw612ZWwgcmVqZWl0YXINCnBhcmEgYWxndW1hIHPDqXJpZSwgcmVwb3J0ZS1hIGNvbW8gJEkoMCkkIGUgYWp1c3RlIGEgZGlzY3Vzc8Ojby4qDQoNCiMjIChiKSBUZXN0ZSBkZSBEaWNrZXktRnVsbGVyIHBhcmEgbyBzcHJlYWQNCg0KYGBge3IgcTItYWRmLXNwcmVhZH0NCmRmX3JlcG9ydChzcHJlYWRfdHMsICJTcHJlYWQgMTBhIC0gMWEgKG7DrXZlbCkiKQ0KcHJpbnQoa3Bzcy50ZXN0KHNwcmVhZF90cykpDQpgYGANCg0KKipMZWl0dXJhLioqIE8gcmVzdWx0YWRvIGRlIGludGVyZXNzZSDDqSBzZSBvIHNwcmVhZCwgYXBlc2FyIGRlIHNlciBhIGRpZmVyZW7Dp2EgZGUNCmR1YXMgc8OpcmllcyAkSSgxKSQsIMOpICoqZXN0YWNpb27DoXJpbyoqLiBOYSBtYWlvcmlhIGRhcyBhbW9zdHJhcyBsb25nYXMgbyBBREYNCnJlamVpdGEgYSByYWl6IHVuaXTDoXJpYSBubyBzcHJlYWQgKGUgbyBLUFNTIG7Do28gcmVqZWl0YSBlc3RhY2lvbmFyaWVkYWRlKSwNCmluZGljYW5kbyBxdWUgbyBzcHJlYWQgw6kgJEkoMCkkIOKAlCBhaW5kYSBxdWUgcGVyc2lzdGVudGUuICpFc3NlIMOpIG8gY2FzbyBtYWlzIGNvbXVtLA0KbWFzIG8gc3ByZWFkIGEgdGVybW8gw6kgdW1hIHPDqXJpZSBzYWJpZGFtZW50ZSAicXVhc2UtdW5pdMOhcmlhIjogbsOjbyBzZSBhc3N1c3RlIHNlIG8NCnRlc3RlIGZpY2FyIG5vIGxpbWlhcjsgbmVzc2UgY2FzbyByZXBvcnRlIGEgYW1iaWd1aWRhZGUgZSBhcG9pZS1zZSBubyBLUFNTIGUgbmENCmluc3Blw6fDo28gZG8gZ3LDoWZpY28uKg0KDQojIyAoYykgSW1wbGljYcOnw7VlcyBlY29uw7RtaWNhcyBwYXJhIGEgZXN0cnV0dXJhIGEgdGVybW8NCg0KU2UgYXMgZHVhcyB0YXhhcyBzw6NvICRJKDEpJCBlIG8gc3ByZWFkIMOpICRJKDApJCwgZW50w6NvIGFzIHPDqXJpZXMgZGUgMSBlIDEwIGFub3Mgc8Ojbw0KKipjb2ludGVncmFkYXMqKiBjb20gdmV0b3IgZGUgY29pbnRlZ3Jhw6fDo28gJCgxLC0xKSQ6IGVsYXMgZGl2aWRlbSB1bWEgKsO6bmljYSoNCnRlbmTDqm5jaWEgZXN0b2PDoXN0aWNhIGNvbXVtIOKAlCBvIG7DrXZlbCBnZXJhbCBkb3MganVyb3Mg4oCUIGUgbyBzcHJlYWQgw6kgbyBkZXN2aW8NCmVzdGFjaW9uw6FyaW8gZW0gdG9ybm8gZGVzc2EgcmVsYcOnw6NvIGRlIGVxdWlsw61icmlvIGRlIGxvbmdvIHByYXpvLiBFbSB0ZXJtb3MNCmVjb27DtG1pY29zLCBpc3NvIGRpeiBxdWUgYXMgcG9udGFzIGN1cnRhIGUgbG9uZ2EgZGEgY3VydmEgKipuw6NvIHZhZ3VlaWFtDQppbmRlZmluaWRhbWVudGUgcGFyYSBsb25nZSB1bWEgZGEgb3V0cmEqKjsgY2hvcXVlcyBxdWUgYWJyZW0gbyBzcHJlYWQgdGVuZGVtIGEgc2UNCmRpc3NpcGFyLCBlIGEgZXN0cnV0dXJhIGEgdGVybW8gcmV0b3JuYSBhIHVtYSBjb25maWd1cmHDp8OjbyBkZSBlcXVpbMOtYnJpby4NCg0KRXNzYSDDqSBleGF0YW1lbnRlIGEgcHJldmlzw6NvIGRhICoqaGlww7N0ZXNlIGRhcyBleHBlY3RhdGl2YXMqKiBkYSBlc3RydXR1cmEgYSB0ZXJtbzoNCmEgdGF4YSBsb25nYSDDqSwgYSBtZW5vcyBkZSB1bSBwcsOqbWlvIGEgdGVybW8gYXByb3hpbWFkYW1lbnRlIGVzdMOhdmVsLCBhIG3DqWRpYSBkYXMNCnRheGFzIGN1cnRhcyBmdXR1cmFzIGVzcGVyYWRhcy4gU29iIGVzc2EgaGlww7N0ZXNlLCB0YXhhIGxvbmdhIGUgdGF4YSBjdXJ0YSBwb2RlbQ0KY2FkYSB1bWEgdGVyIHJhaXogdW5pdMOhcmlhIChwb3JxdWUgYXMgZXhwZWN0YXRpdmFzIGRlIGp1cm9zIGZ1dHVyb3MgdMOqbSksIG1hcyBhDQpkaWZlcmVuw6dhIGVudHJlIGVsYXMg4oCUIG8gcHLDqm1pbyBtYWlzIG8gY29tcG9uZW50ZSBkZSBleHBlY3RhdGl2YXMg4oCUIMOpIGVzdGFjaW9uw6FyaWEuDQpBIGNvaW50ZWdyYcOnw6NvICQoMSwtMSkkIMOpLCBwb3J0YW50bywgdW1hIGFzc2luYXR1cmEgZW1ww61yaWNhIGRhIGhpcMOzdGVzZSBkYXMNCmV4cGVjdGF0aXZhcyBjb20gcHLDqm1pbyBkZSByaXNjbyBlc3RhY2lvbsOhcmlvLg0KDQpBIGxlaXR1cmEgc2UgaW52ZXJ0ZSBubyBjZW7DoXJpbyBhbHRlcm5hdGl2bzogKipzZSBvIHNwcmVhZCB0YW1iw6ltIGZvc3NlICRJKDEpJCoqLCBhcw0KZHVhcyBwb250YXMgZGEgY3VydmEgbsOjbyBlc3RhcmlhbSBhbmNvcmFkYXMgZW50cmUgc2kgbm8gbG9uZ28gcHJhem8sIG8gcXVlIHNlcmlhDQppbmNvbXBhdMOtdmVsIGNvbSBhIHZlcnPDo28gc2ltcGxlcyBkYSBoaXDDs3Rlc2UgZGFzIGV4cGVjdGF0aXZhcyBlIGFwb250YXJpYSBwYXJhIHVtDQpwcsOqbWlvIGEgdGVybW8gY29tIHRlbmTDqm5jaWEgZXN0b2PDoXN0aWNhIHByw7NwcmlhICh2YXJpYW5kbyBwZXJtYW5lbnRlbWVudGUgbm8NCnRlbXBvKS4gRGHDrSBhIGltcG9ydMOibmNpYSBkbyB0ZXN0ZSDigJQgZWxlIGRpc3Rpbmd1ZSB1bWEgY3VydmEgZGUganVyb3MgY29tIMOibmNvcmEgZGUNCmxvbmdvIHByYXpvIGRlIHVtYSBlbSBxdWUgYXMgbWF0dXJpZGFkZXMgc2UgZGVzY29sYW0uIFJlcG9ydGUgcXVhbCBkb3MgZG9pcyBjZW7DoXJpb3MNCnNldXMgZGFkb3Mgc3VzdGVudGFtIGUgYW5jb3JlIGEgY29uY2x1c8OjbyBuYXMgZXN0YXTDrXN0aWNhcyBvYnRpZGFzLg0KDQo=