Este material tem como objetivo contribuir para o entendimento sobre o princípio de máxima verossimilhança. Além da parte teórica, vamos aplicá-lo usando o R. Este procedimento, assim como o método de mínimos quadrados, permite a estimação dos parâmetros de modelos econométricos e a realização de testes de hipóteses relativos a restrições lineares e não lineares ao vetor de parâmetros de um modelo.
Suponha que temos uma amostra aleatória \(\left(y_{1},y_{2},...,y_{n}\right)\) de tamanho \(n\) retirada de uma população. Cada observação é uma variável aleatória com uma função de densidade de probabilidade \(f\left( y_{i}|\theta \right)\) que depende do vetor de parâmetros \(\theta\). Assim, a densidade de probabilidade conjunta para a amostra aleatória (ou vetor aleatório) será dada por:
\[
f \left(y_1, y_2, ...,y_n | \theta \right) = \prod _{i=1}^{n}{f\left({y}_{i}|\theta \right)} =f\left({y}_{1}|\theta \right) \times f\left({y}_{2}|\theta \right) \times ,..., \times f\left({y}_{n}|\theta \right)
\]
onde \(\theta\) é fixo. Note que, antes da retirada da amostra, cada observação é uma variável aleatória cuja função de densidade de probabilidade é igual à função de densidade de probabilidade da população. A média e a variância de cada observação a ser retirada também são iguais à média e variância da população em questão.
Contudo, uma vez que tenha sido obtida uma amostra específica, \(y_{i}\) torna-se fixo e a função de densidade de probabilidade conjunta pode então ser reinterpretada como sendo uma função do vetor de parâmetros \(\theta\) que se torna variável (chamamos esta função de função de verossimilhança).
Em econometria temos o problema de, dada uma amostra, obter a estimativa dos valores dos parâmetros populacionais desconhecidos. Assim, queremos o vetor \(\theta\) que faz a probabilidade de obter-se a amostra já coletada a maior possível, ou seja, temos que achar o \(\theta\) que maximiza a função de verossimilhança abaixo:
\[
L \left(\theta |y_1, y_2, ...,y_n \right) = \prod _{i=1}^{n}{f\left({y}_{i}|\theta \right)}
\]
Matematicamente, basta igualar a zero as derivadas parciais da função de verossimilhança em relação a cada parâmetro do vetor \(\theta\). Podemos também trabalhar com o \(\ln{L}\), pois maximizar o \(\ln{L}\) é em geral mais simples e produz o mesmo resultado dado que o logartimo transforma o produto das densidades de probabilidade na soma dos logaritmos das densidades, conforme abaixo:
\[
\ln{L \left(\theta | y_1, y_2, ...,y_n \right)} = \sum _{i=1}^{n}{\ln{f\left({y}_{i}|\theta \right)}}
\]
Suponha que temos um modelo de regressão linear \(y_{i}=\beta x_{i} + u_{i}\) onde \(u_{i}\) tem distribuição Normal com média \(0\) e variância \(\sigma^{2}\). Por meio do método de máxima verossimilhança obtenha o vetor de parâmetros \(\hat\theta=\left(\hat{\beta},\hat{\sigma}^2\right)\).
Sabemos que a distribuição Normal tem a seguinte função de densidade de probabilidade (forma algébrica de dizer que dado que temos uma média e uma variância, podemos obter a densidade de probabilidade para uma observação de \(x\)):
\[
f\left(x | \mu,\sigma^2\right)=\frac {1}{\sqrt {2\pi {\sigma}^{2}}} exp\left\{-\frac{1}{2} {\left(\frac{x-\mu}{\sigma} \right)}^{2} \right\},\quad -\infty <x<\infty
\]
Isso implica que a função de densidade de probabilidade de \(u_{i}\) é (\(\mu=0\), conforme pressuposto do modelo de regressão linear simples):
\[
f(u_{i} | \mu=0,\sigma²) = \frac {1}{\sqrt {2\pi {\sigma}^{2}}} exp\left\{\frac{-{u}_{i}^{2}}{2{\sigma}^{2}} \right\},\quad para\quad i=1,2,...,n
\]
Em função de \(u_{i}\) ser normalmente distribuído com média \(0\) e variância \(\sigma^{2}\), teremos a seguinte densidade de probabilidade para \(y_{i}\):
\[
f\left({y}_{i} | \mu = \beta x_i, \sigma^2 \right) =\frac{1}{\sqrt{2\pi{\sigma}^{2}}} exp\left\{-\frac{1}{2{\sigma}^{2}} {\left({y}_{i}-\beta{x}_{i} \right)}^{2} \right\} ,\quad para\quad i=1,2,...,n
\]
Com todas estas definições, somos capazes de escrever a função de verosimilhança para o problema em questão. Lembre-se que, como vimos anteriormente, no momento que observamos os valores de \(y_{i}\) passamos a ter como objetivo encontrar quais os parâmetros de \(\theta = \left(\hat{\beta},\hat{\sigma}^{2}\right)\) que maximiza a função de verossimilhança de \(y_{i}\). Logo, temos a seguinte função de verossimilhança para o problema:
\[
L(\theta | y_{i}) = L(\beta,\sigma^{2} | y_{i}) = \prod_{i=1}^{n}{f(\beta,\sigma^{2} | {y}_{i})} = \prod_{i=1}^{n}\frac{1}{\sqrt{2\pi{\sigma}^{2}}} exp\left\{-\frac{1}{2{\sigma}^{2}} {\left({y}_{i}-\beta{x}_{i} \right)}^{2} \right\}
\] Uma alternativa mais razoável para encontrar os valores de \(\theta\) que maximizam a função de verosimilhança é trabalharmos com o logaritmo da verossimilhança, como abaixo (aplicando apenas o logaritmo na função anterior):
\[
\begin{aligned}
&&& \ln{L(\beta,\sigma^{2} | y_{i})} = \ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}} exp\left\{-\frac{1}{2{\sigma}^{2}} {\left({y}_{1}-\beta{x}_{1}\right)}^{2} \right\}\right]} +...+\ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}} exp\left\{-\frac{1}{2{\sigma}^{2}} {\left({y}_{n}-\beta{x}_{n}\right)}^{2} \right\}\right]} \\
&&& \ln{L(\beta,\sigma^{2} | y_{i})} = \ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}}\right]}-\frac{1}{2{\sigma}^{2}}{\left({y}_{1}-\beta{x}_{1}\right)}^{2} + ... + \ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}}\right]}-\frac{1}{2{\sigma}^{2}}{\left({y}_{n}-\beta{x}_{n}\right)}^{2} \\
\end{aligned}
\] que organizando, se transforma em:
\[
\begin{aligned}
&& \ln{L(\beta,\sigma^{2} | y_{i})} = n \times\ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}}\right]}-\frac{1}{2{\sigma}^{2}} \sum_{i=1}^{n}{{\left({y}_{i}-\beta{x}_{i} \right)}^{2}} \\
&& \ln{L(\beta,\sigma^{2} | y_{i})} = n \times \ln{{(2\pi {\sigma}^{2})}^{-\frac{1}{2}}} -\frac{1}{2{\sigma}^{2}} \sum_{i=1}^{n}{{\left({y}_{i}-\beta{x}_{i} \right)}^{2}}
\end{aligned}
\]
Observe que temos agora uma função que depende de \(\beta\) e \(\sigma^{2}\) para valores de \(y_{i}\). Sabemos que para encontrar os valores críticos que otimizam (seja maximizar ou minimizar) uma função precisamos achar os pontos onde a primeira derivada da função em relação a cada um dos parâmetros é igual a zero (condição de primeira ordem).
Além disso, é necessário avaliar a curvatura da função nas proximidades dos valores críticos (condição de segunda ordem) o que nos permite determiar se a função é maximizada ou minimizada nos pontos críticos.
Para este problema, a condição de primeira ordem (CPO) será:
\[
\frac{\partial L}{\partial \theta} = \left(\begin{array}{c} \frac{\partial \ln{L}}{\partial\beta} \\ \frac{\partial \ln{L}}{\partial{\sigma}^{2}} \end{array}\right) = 0
\]
O vetor gradiente \(\frac{\partial L}{\partial \theta}\) é chamado de vetor escore, pois ele representa as primeiras derivadas do logaritmo da densidade. Assim, temos:
\[
\frac{\partial \ln{L}}{\partial\beta}=-\frac{1}{2{\sigma}^{2}}\sum_{i=1}^{n}{2({y}_{i}-\beta{x}_{i})(-{x}_{i})}=0\Rightarrow \hat {\beta} =\frac{ \sum _{i=1}^{n}{({y}_{i}{x}_{i})}}{\sum_{i=1}^{n}{{x}_{i}^{2}}}
\] \[
\frac{\partial \ln{L}}{\partial{\sigma}^{2}} =-\frac{N}{2{\sigma}^{2}} +\frac{1}{2{\left({\sigma}^{2} \right)}^{2}} \sum_{i=1}^{N}{{\left({y}_{i}-\beta{x}_{i} \right)}^{2}}=0\Rightarrow {\hat{\sigma}}^{2}=\frac{\sum _{i=1}^{N}{{\left({y}_{i}-\beta{x}_{i} \right)}^{2}}}{n}
\] A partir dos resultados obtidos acima, podemos observar que o estimador de máxima verossimilhança para \(\beta\) é igual ao estimador de mínimos quadrados ordinários. Por outro lado, o estimador da variância do termo de erro obtido por máxima verossimilhança é viesado, mas consistente.
- PROPRIEDADES DOS ESTIMADORES OBTIDOS PELO PRINCÍPIO DA MÁXIMA VEROSSIMILHANÇA
- São consistentes: \(p \lim{\hat{\theta}}=\theta\)
- Têm distribuição assintótica Normal: \(\hat{\theta} \sim N\left(\theta, I^{-1}(\theta)\right)\) onde \(I(\theta)\) é a matriz de informação de Fischer.
- São assintoticamente eficientes
- São invariantes
A matriz de informação de Fischer é definida como:
\[
I\left(\theta\right) = E\left[\left(\frac{\partial L}{\partial \theta}\right)^2\right] = - E\left[\left(\frac{\partial^2 L}{\partial \theta^2}\right)\right]
\]
onde \(L(\theta)\) é o logaritmo da função de verossimilhança. A terminologia matriz de informação é utilizada em função de \(L(\theta)\) ser a variância de \(\frac{\partial L}{\partial \theta}\) (que é o score cuja média é zero).
Assim, valores altos de \(L(\theta)\) significam que pequenas alterações em \(\theta\) conduzem a grandes alterações no valor do logaritmo da verossimilhança. Além disso, \(I(\theta)\) nos fornece informação sobre a curvatura do logaritmo da verossimilhança (concavidade da função)
Quanto mais côncava a função, mais fácil de detectar o \(\hat{\theta}\) máximo. Caso contrário (mais plana), teremos \(\hat{\theta}\)’s muito próximos do \(\hat{\theta}\) que gera o máximo da função e será difícil encontrar o \(\hat{\theta}\) máximo.
PRÁTICA
Nesta seção você conseguirá aplicar no R todos os conceitos estudados anteriormente.
-
ESTIMAR PARÂMETROS DE UMA AMOSTRA ALEATÓRIA
Suponha que você tem uma amostra aleatória \((x_{1},x_{2},...,x_{n})\) composta por variáveis aleatórias retiradas de uma população com uma função de densidade de probabilidade Normal com média \(\mu\) e variância \(\sigma^{2}\), como abaixo:
\[
f(x|\mu,\sigma^{2})=\frac{1}{\sqrt{2\pi{\sigma}^{2}}} exp \left\{-\frac{1}{2}{\left(\frac{x-\mu}{\sigma}\right)}^{2}\right\}
\] Isto implica que a função densidade de probabilidade conjunta da amostra aleatória (ou vetor aleatório) é:
\[
f(x_{1},x_{2},...,x_{n} | \mu,\sigma^{2}) = \prod_{i=1}^{n}{f({x}_{1},...,x_{n}|\mu,\sigma^{2}})
\] Você quer descobrir quais os valores dos parâmetros \(\mu\) e \(\sigma^{2}\) para sua amostra aleatória. Pelo princípio da verossimilhança sabemos que o problema pode ser escrito da seguinte forma:
\[
L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = \prod_{i=1}^{n}f({{x}_{1},...,x_{n}|\mu,\sigma^{2}}) = f({{x}_{1}|\mu,\sigma^{2}})\times f({{x}_{2}|\mu,\sigma^{2}}) \times... \times f({x_{n}|\mu,\sigma^{2}})
\] Na parte teórica deste documento, vimos que uma alternativa para a solução do problema é trabalhar com o logaritmo da verossimilhança, que aplicado no presente problema, temos:
\[
\begin{aligned}
&&& L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = \sum_{i=1}^{n}{\ln{f({{x}_{1},...,x_{n}|\mu,\sigma^{2}})}} \\
&&& L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = \ln{f(x_1|\mu,\sigma^2)}+\ln{f(x_2|\mu,\sigma^2)}+...+\ln{f(x_n|\mu,\sigma^2)} \\
&&& L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = \ln{\left[\frac{1}{\sqrt{2\pi{\sigma}^{2}}} exp \left\{-\frac{1}{2}{\left(\frac{x_1-\mu}{\sigma}\right)}^{2}\right\}\right]} + ...+\ln{\left[\frac{1}{\sqrt{2\pi{\sigma}^{2}}} exp \left\{-\frac{1}{2}{\left(\frac{x_n-\mu}{\sigma}\right)}^{2}\right\}\right]} \\
&&& L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = \ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}}\right]}-\frac{1}{2{\sigma}^{2}}{\left({x}_{1}-\mu\right)}^{2} + ... + \ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}}\right]}-\frac{1}{2{\sigma}^{2}}{\left({x}_{n}-\mu\right)}^{2} \\
&&& L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = n*\ln{\left[\frac{1}{\sqrt{2\pi {\sigma}^{2}}}\right]}-\frac{1}{2{\sigma}^{2}} \sum_{i=1}^{n}{{\left({x}_{i}-\mu \right)}^{2}} \\
&&& L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = n*\ln{{(2\pi {\sigma}^{2})}^{-\frac{1}{2}}} -\frac{1}{2{\sigma}^{2}} \sum_{i=1}^{n}{{\left({x}_{i}-\mu \right)}^{2}} \\
&&& L(\mu,\sigma^{2}|x_{1},x_{2},...,x_{n}) = -\left(\frac{n}{2}\right)*\ln{{(2\pi {\sigma}^{2})}}-\frac{1}{2{\sigma}^{2}} \sum_{i=1}^{n}{{\left({x}_{i}-\mu \right)}^{2}} \\
\end{aligned}
\]
Nos códigos abaixo mostramos como resolvê-lo usando o logaritmo da verossimilhança e supondo que temos uma amostra aleatória de tamanho \(1000\) para \(x_{i}\).
Num primeiro momento, sabemos os verdadeiros valores de \(\mu\) e \(\sigma^{2}\) (1 e 2, respectivamente) e queremos fazer uso do princípio da verossimilhança para verificar quais os valores o mesmo retorna como estimativa para os parâmetros de interesse (\(\mu\) e \(\sigma^{2}\)). Execute os códigos abaixo e observe que o método da máxima verossimilhança resultará em parâmetros próximos dos verdadeiros parâmetros populacionais.
################################
#### PREPARAR O PROBLEMA #####
################################
# Nese exemplo, vamos mostrar como usar o princípio da máxima verossimilhança para encontrar
# os parâmetros de média e variância de uma amostra de uma variável aleatória que segue
# uma distribuição Normal
# Criamos uma variável aleatória (xi) de tamanho 1000 originada a partir de normal com média 1 e desvio padrão 2
# Para saber as opções da função rnorm execute help(rnorm)
x <- rnorm(1000, mean = 1 , sd = 2)
# função do negativo do log da verossimilhança da Normal
neg_log_lik <- function(x, parametros){
# parâmetros para a distribuição Normal
media <- parametros[1]
desvio <- parametros[2]
n <- length(x)
# log da verossimilhança da Normal
ll <- -(n/2)*log(2*pi*desvio^2) + (-1/(2*desvio^2))*sum((x-media)^2)
# retornar o negativo para maximizar ao invés de minimizar
return(-ll)
}
################################
#### GRÁFICOS #####
################################
# Objetivo: mostrar que maximizar uma função é o mesmo que minimizar o negativo da função
# dividir a tela em duas linhas e uma coluna
par(mfrow=c(2,1))
# gráfico da função do logaritmo da verossmilhança. Observe que estamos multiplicando por -1
# a função que já é o negativo (ou seja, voltando para o seu sinal)
plot(x = seq(from = -3, to = 3, by = 0.1),
y = -1*sapply(seq(from = -3, to = 3, by = 0.1),
FUN = neg_log_lik, par = c(0,1)),
type = "l",
ylab = "",
xlab = "Valor da variável aleatória X",
main = "Log da Verossimilhança para Média=0 e Variância=1")
# gráfico do negativo do logaritmo da verossimilhança
plot(x = seq(from = -3, to = 3, by = 0.1),
y = 1*sapply(seq(from = -3, to = 3, by = 0.1),
FUN = neg_log_lik, par = c(0,1)),
type = "l",
ylab = "",
xlab = "Valor da variável aleatória X",
main = "Negativo do Log da Verossimilhança para Média=0 e Variância=1")
# retornar a tela para uma linha e uma coluna
par(mfrow = c(1,1))
################################
### SOLUCIONAR O PROBLEMA ####
################################
# Uma vez que temos uma função que deve ser maximizada e os parâmetros iniciais, podemos usar
# a função optim do pacote stats para obter as estimativas ótimas para a média e variância.
# - par: atributo que recebe os valores iniciais dos parâmetros. A sequência é importante aqui,
# pois definimos na função que o primeiro é a média e o segundo é a variância
# - fn: a função que deve ser minimizada. Por default, optim faz uma minimização e por isso
# definimos o negativo do logaritmo da verossimilhança dado que minimizar o inverso de uma
# função é o mesmo que maximizá-la
# - method: o algoritmo numérico usado para solucionar o problema.
# - hessian: se queremos (TRUE) ou não (FALSE) que a matriz hessiana do problema de otimização seja
# disponibilizada. Para mais detalhes use help(optim) ou em https://cran.r-project.org/web/packages/fitdistrplus/vignettes/Optimalgo.html
normal.fit <- stats::optim(par = c(0.5,0.5),
fn = neg_log_lik,
x = x,
method = "BFGS",
hessian = TRUE)
################################
#### RESULTADOS ######
################################
# Parâmetros encontrados para a média e variância (condição de primeira ordem). Observe
# que eles estão bem próximos dos valores usados para gerar a variavel aleatória
normal.fit$par
# Resultado: matriz hessiana (condição de segunda ordem). Aqui, temos que avaliar se a matriz
# hessiana é negativa definida ou positiva definida nos pontos críticos encontrados na condição
# de primeira ordem. Como estamos com um problema de minimização (novamente, encontrar os valores
# para a média e variância que minimizam o negativo da função de verossimilhança é o mesmo que
# encontrar os valores que maximizam a função de verossimilhança), temos que verificar se nas
# proximidades da matriz hessiana a função é "convexa". Isso só é possível se os menores principais
# líderes da matriz hessiana são positivos tornando-a positiva definida.
normal.fit$hessian
# Determinante do primeiro menor principal líder
det(matrix(data = normal.fit$hessian[1], nrow = 1, ncol = 1))
# Determinante do segundo menor principal líder
det(matrix(data = normal.fit$hessian, nrow = 2, ncol = 2))
# Matriz de informação de Fisher
# - Mais detalhes em https://rpubs.com/hudsonchavs/maxverosimilhanca
# - Obida por (-hessiana)^(-1). A razão para não ser preciso multiplicar a matriz
# hessiana por -1 é que já fizemos a minimização usando o negativo da verossimilhança
fisher.information.normal.fit <- solve(normal.fit$hessian)
# Desvio padrão de cada estimador (beta0, beta1, desvio)
# - Mais detalhes em https://rpubs.com/hudsonchavs/maxverosimilhanca
# - Usamos a raiz quadrada da diagonal principal
standard.deviance.normal.fit <- sqrt(diag(fisher.information.normal.fit))
# Tabela com os parâmetros estimados, estatística t, desvio padrão do estimador e p-valor
t.normal.fit <- normal.fit$par/standard.deviance.normal.fit
pvalue.normal.fit <- 2*(1-pt(abs(t.normal.fit), length(x)-length(normal.fit$par)))
results.normal.fit <- cbind(normal.fit$par, standard.deviance.normal.fit, t.normal.fit, pvalue.normal.fit)
colnames(results.normal.fit) <- c("parâmetros", "desvio-padrão", "estatística t", "p-valor")
rownames(results.normal.fit) <- c("media", "desvio")
print(results.normal.fit, digits = 3)
-
REGRESSÃO LINEAR SIMPLES
Suponha que você tem uma amostra aleatória de duas variáveis (\(Y_{i},X_{i}\)) de tamanho \(N\) e deseja estimar um modelo de regressão linear simples que relacione elas da seguinte forma:
\[
Y_{i} = \beta_{0} + \beta_{1} X_{i} + \varepsilon_{i}
\] Além disso, assuma a hipótese de que \(\varepsilon \sim N(0,{\sigma}^{2})\) e que você já conhece os verdadeiros parâmetros do modelo econométrico. Seu objetivo é fazer uso do princípio de máxima verossimilhança para testar o quão seus estimadores se aproximam dos parâmetros populacionais conhecidos. Para tanto, vamos supor que a equação populacional é:
\[
Y_{i} = 8 + 3X_{i}
\] Uma vez que \(Y_{i} \sim N(\beta_{0} + \beta_{1}X_{i},{\sigma}^{2})\), temos que a função de verossimilhança para o problema proposto será:
\[
L(\beta_{0} + \beta_{1}X_{i},\sigma^{2}|Y_{i}) = \prod_{i=1}^{N}{f(\beta_{0} + \beta_{1}X_{i},\sigma^{2}|Y_{i})} = \prod_{i=1}^{N}\frac{1}{\sqrt{2\pi{\sigma}^{2}}} exp\left\{-\frac{1}{2{\sigma}^{2}} {\left({y}_{i}-[\beta_{0} + \beta_{1}X_{i}] \right)}^{2} \right\}
\] Nosso objetivo será encontrar \(\hat{{\beta}_{0}}\), \(\hat{{\beta}_{1}}\) e \({\hat{\sigma}}^{2}\) que são os parâmetros a serem estimados para o modelo de regressão linear. Abaixo, códigos que geram os dados e aplicam o princípio de máxima verossimilhança.
################################
#### PREPARAR O PROBLEMA ###
################################
# Neste exemplo vamos mostrar como obter os parâmetros de uma regressão linear simples
# por meio do método da máxima verossimilhança. Para isso, vamos gerar uma amostra de
# y que é função de x e de um ruído. Porém, antes de gerar y com o ruído, saberemos o
# verdadeiro y dado que temos os verdadeiros parâmetros para a regressão linear.
# 1000 observações de X geradas a partir de uma distribuição normal com média 10 e desvio 1
ols.data.x <- rnorm(n = 10000, mean = 10, sd = 1)
# Parâmetros populacionais do modelo de regressão
beta0.true <- 3
beta1.true <- 8
# 1000 observações de Y gerados a partir dos parâmetros populacionais e X
true.y <- beta0.true + beta1.true*ols.data.x
# 1000 observações geradas a partir dos dados populacionais com um termo de erro que segue uma
# normal com média 0 e desvio 1
noise <- rnorm(n = 10000, mean = 0, sd = 1)
data.y <- true.y + noise
# função do negativo do log da verossimilhança da Normal para uma regressão linear
ols_neg_log_lik <- function(y, x, parametros){
# parâmetros para a distribuição Normal de uma regressão linear
desvio <- parametros[1]
betas <- parametros[-1]
media <- cbind(1,x) %*% betas
n <- length(x)
# log da verossimilhança da Normal
ll <- -(n/2)*log(2*pi*desvio^2) + (-1/(2*desvio^2))*sum((y-media)^2)
# retornar o negativo para minimizar ao invés de maximizar
return(-ll)
}
################################
### SOLUCIONAR O PROBLEMA ####
################################
# Uma vez que temos uma função que deve ser maximizada e os parâmetros iniciais, podemos usar
# a função optim do pacote stats para obter as estimativas ótimas para a média (agora uma média
# condicional que é função do vetor beta de parâmetros da regressão linear e a variância que deve
# ser a mesma do termo de erro).
# - par: atributo que recebe os valores iniciais dos parâmetros. A sequência é importante aqui,
# pois definimos na função que o primeiro é a média e o segundo é a variância
# - fn: a função que deve ser minimizada. Por default, optim faz uma minimização e por isso
# definimos o negativo do logaritmo da verossimilhança dado que minimizar o inverso de uma
# função é o mesmo que maximizá-la
# - method: o algoritmo numérico usado para solucionar o problema.
# - hessian: se queremos (TRUE) ou não (FALSE) que a matriz hessiana do problema de otimização seja
# disponibilizada. Para mais detalhes use help(optim) ou em https://cran.r-project.org/web/packages/fitdistrplus/vignettes/Optimalgo.html
ols.fit <- stats::optim(par = c(1,2,2),
fn = ols_neg_log_lik,
y = data.y,
x = ols.data.x,
method = "BFGS",
hessian = TRUE)
# resultado: parâmetros encontrados para desvio, beta0 e beta1 (a ordem é a mesma da definida
# na função ols_neg_log_lik)
ols.fit$par
[1] -1.008859 3.011811 7.997873
# Resultado: matriz hessiana (condição de segunda ordem). Aqui, temos que avaliar se a matriz
# hessiana é negativa definida ou positiva definida nos pontos críticos encontrados na condição
# de primeira ordem. Como estamos com um problema de minimização (novamente, encontrar os valores
# para a média e variância que minimizam o negativo da função de verossimilhança é o mesmo que
# encontrar os valores que maximizam a função de verossimilhança), temos que verificar se nas
# proximidades da matriz hessiana a função é "convexa". Isso só é possível se os menores principais
# líderes da matriz hessiana são positivos tornando-a positiva definida.
ols.fit$hessian
[,1] [,2] [,3]
[1,] 1.965039e+04 1.384797e-02 1.277258e-01
[2,] 1.384797e-02 9.825155e+03 9.825075e+04
[3,] 1.277258e-01 9.825075e+04 9.921188e+05
# Determinante do primeiro menor principal líder
det(matrix(data = ols.fit$hessian[1], nrow = 1, ncol = 1))
[1] 19650.39
# Determinante do segundo menor principal líder
det(matrix(data = ols.fit$hessian[1:2,1:2], nrow = 2, ncol = 2))
[1] 193068131
# Determinante do terceiro menor principal líder
det(matrix(data = ols.fit$hessian, nrow = 3, ncol = 3))
[1] 1.857171e+12
# Matriz de informação de Fisher
# - Mais detalhes em https://rpubs.com/hudsonchavs/maxverosimilhanca
# - Obida por (-hessiana)^(-1). A razão para não ser preciso multiplicar a matriz
# hessiana por -1 é que já fizemos a minimização usando o negativo da verossimilhança
fisher_information <- solve(ols.fit$hessian)
# Desvio padrão de cada estimador (beta0, beta1, desvio)
# - Mais detalhes em https://rpubs.com/hudsonchavs/maxverosimilhanca
# - Usamos a raiz quadrada da diagonal principal
standard_deviance <- sqrt(diag(fisher_information))
# Tabela com os parâmetros estimados, estatística t, desvio padrão do estimador e p-valor
t <- ols.fit$par/standard_deviance
pvalue <- 2*(1-pt(abs(t), length(ols.data.x)-length(ols.fit$par)))
results <- cbind(ols.fit$par, standard_deviance, t, pvalue)
colnames(results) <- c("parâmetros", "desvio-padrão", "estatística t", "p-valor")
rownames(results) <- c("desvio", "beta0", "beta1")
print(results, digits = 3)
parâmetros desvio-padrão estatística t p-valor
desvio -1.01 0.00713 -141.4 0
beta0 3.01 0.10246 29.4 0
beta1 8.00 0.01020 784.4 0
# valor real e ajustado
beta0.estimado <- ols.fit$par[2]
beta1.estimado <- ols.fit$par[3]
y.estimado <- beta0.estimado + beta1.estimado*ols.data.x
residuos <- true.y - y.estimado
# gráfico dos resíduos
plot(residuos, type = "l", xlab = "", ylab = "", main = "resíduos")

######
### PONTO DE ATENÇÃO
######
# O método de máxima verossimilhança é bastante sensível aos valores iniciais usados no problema
# de otimização, principalmente para alguns métodos numéricos. Perceba que se você alterar apenas
# os valores iniciais para c(1,1,1) no problema de regressão linear simples e manter o método numérico,
# os resultados encontrados são alterados. Como não é possível controlar os pontos iniciais bem como
# a escoha do método numérico, a maioria dos pacotes em R que estimam modelos econométricos, fazem
# uso de algum método de estimação a priori (mínimos quadrados ordinários, por exemplo) para encontrar
# parâmetros iniciais e usá-los posteriormente como parâmetros iniciais do método de máxima verossimilhança
REFERÊNCIAS
Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.
Morettin, Pedro Alberto. 2008. Econometria Financeira Um Curso Em Séries Temporais Financeiras. Edgard Blucher.
Tsay, Ruey S. 2010. Analysis of Financial Time Series. John Wiley & Sons.
———. 2014. An Introduction to Analysis of Financial Data with R. John Wiley & Sons.
LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPk8gUHJpbmPDrXBpbyBkZSBNw6F4aW1hIFZlcm9zc2ltaWxoYW7Dp2EgPC9iPiA8L2gyPiA8L2NlbnRlcj4gCmF1dGhvcjogPGNlbnRlcj4gRnJhbmsgTWFnYWxow6NlcyBkZSBQaW5obyAtIElCTUVDL01HIDwvY2VudGVyPgpncmFwaGljczogeWVzCmxpbmtjb2xvcjogYmx1ZQpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogY2VydWxlYW4KICAgIGZpZ19jYXB0aW9uOiB5ZXMKcmVmZXJlbmNlczoKLSBpZDogdHNheTIwMTRpbnRyb2R1Y3Rpb24KICB0aXRsZTogQW4gaW50cm9kdWN0aW9uIHRvIGFuYWx5c2lzIG9mIGZpbmFuY2lhbCBkYXRhIHdpdGggUgogIGF1dGhvcjoKICAtIGZhbWlseTogVHNheQogICAgZ2l2ZW46IFJ1ZXkgUwogIHB1Ymxpc2hlcjogSm9obiBXaWxleSBcJiBTb25zCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMTQKLSBpZDogY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzCiAgdGl0bGU6IFRoZSBlY29ub21ldHJpY3Mgb2YgZmluYW5jaWFsIG1hcmtldHMKICBhdXRob3I6CiAgLSBmYW1pbHk6IENhbXBiZWxsCiAgICBnaXZlbjogSm9obiBZCiAgLSBmYW1pbHk6IExvCiAgICBnaXZlbjogQW5kcmV3IFdlbi1DaHVhbgogIC0gZmFtaWx5OiBNYWNLaW5sYXkKICAgIGdpdmVuOiBBcmNoaWUgQ3JhaWcKICBwdWJsaXNoZXI6IFByaW5jZXRvbiAoTkopIFByaW5jZXRvbiBVbml2ZXJzaXR5IFByZXNzCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDE5OTcKLSBpZDogbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEKICB0aXRsZTogRWNvbm9tZXRyaWEgZmluYW5jZWlyYSB1bSBjdXJzbyBlbSBzw6lyaWVzIHRlbXBvcmFpcyBmaW5hbmNlaXJhcwogIGF1dGhvcjoKICAtIGZhbWlseTogTW9yZXR0aW4KICAgIGdpdmVuOiBQZWRybyBBbGJlcnRvCiAgcHVibGlzaGVyOiBFZGdhcmQgQmx1Y2hlcgogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDA4Ci0gaWQ6IHRzYXkyMDEwYW5hbHlzaXMKICB0aXRsZTogQW5hbHlzaXMgb2YgZmluYW5jaWFsIHRpbWUgc2VyaWVzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBUc2F5CiAgICBnaXZlbjogUnVleSBTCiAgcHVibGlzaGVyOiBKb2huIFdpbGV5IFwmIFNvbnMKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAxMApub2NpdGU6IHwgCiAgQHRzYXkyMDE0aW50cm9kdWN0aW9uLCBAY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzLCBAbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEsIEB0c2F5MjAxMGFuYWx5c2lzCi0tLQoKRXN0ZSBtYXRlcmlhbCB0ZW0gY29tbyBvYmpldGl2byBjb250cmlidWlyIHBhcmEgbyBlbnRlbmRpbWVudG8gc29icmUgbyAqKnByaW5jw61waW8gZGUgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhKiouIEFsw6ltIGRhIHBhcnRlIHRlw7NyaWNhLCB2YW1vcyBhcGxpY8OhLWxvIHVzYW5kbyBvIFtSXShodHRwczovL3d3dy5yLXByb2plY3Qub3JnLykuIEVzdGUgcHJvY2VkaW1lbnRvLCBhc3NpbSBjb21vIG8gbcOpdG9kbyBkZSBtw61uaW1vcyBxdWFkcmFkb3MsIHBlcm1pdGUgYSBlc3RpbWHDp8OjbyBkb3MgcGFyw6JtZXRyb3MgZGUgbW9kZWxvcyBlY29ub23DqXRyaWNvcyBlIGEgcmVhbGl6YcOnw6NvIGRlIHRlc3RlcyBkZSBoaXDDs3Rlc2VzIHJlbGF0aXZvcyBhIHJlc3RyacOnw7VlcyBsaW5lYXJlcyBlIG7Do28gbGluZWFyZXMgYW8gdmV0b3IgZGUgcGFyw6JtZXRyb3MgZGUgdW0gbW9kZWxvLiAKCiogKipNw4lUT0RPKioKClN1cG9uaGEgcXVlIHRlbW9zIHVtYSBhbW9zdHJhIGFsZWF0w7NyaWEgW14xXSAkXGxlZnQoeV97MX0seV97Mn0sLi4uLHlfe259XHJpZ2h0KSQgZGUgdGFtYW5obyAkbiQgcmV0aXJhZGEgZGUgdW1hIHBvcHVsYcOnw6NvLiBDYWRhIG9ic2VydmHDp8OjbyDDqSB1bWEgdmFyacOhdmVsIGFsZWF0w7NyaWEgY29tIHVtYSBmdW7Dp8OjbyBkZSBkZW5zaWRhZGUgZGUgcHJvYmFiaWxpZGFkZSAkZlxsZWZ0KCB5X3tpfXxcdGhldGEgXHJpZ2h0KSQgcXVlIGRlcGVuZGUgZG8gdmV0b3IgZGUgcGFyw6JtZXRyb3MgJFx0aGV0YSQgW14yXS4gQXNzaW0sIGEgZGVuc2lkYWRlIGRlIHByb2JhYmlsaWRhZGUgY29uanVudGEgcGFyYSBhIGFtb3N0cmEgYWxlYXTDs3JpYSAob3UgdmV0b3IgYWxlYXTDs3Jpbykgc2Vyw6EgZGFkYSBwb3I6IAoKW14xXTogTGVtYnJlLXNlIGRlIHF1ZSBxdWFuZG8gZXN0dWRhbW9zIHZldG9yZXMgYWxlYXTDs3Jpb3MgZmFsw6F2YW1vcyBxdWUgZWxlIHNlIGNhcmFjdGVyaXphdmEgY29tbyB1bSBjb25qdW50byBkZSB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzLiBQb3IgaXNzbywgdGVtb3MgZGlzdHJpYnVpw6fDtWVzIGRlIHByb2JhYmlsaWRhZGUgY29uanVudGFzLCBtYXJnaW5haXMgZSBjb25kaWNpb25haXMgcGFyYSB2ZXRvcmVzIGFsZWF0w7NyaW9zIGFvIGNvbnRyw6FyaW8gZGFzIHZhcmnDoXZlaXMgYWxlYXTDs3JpYXMgb25kZSB0ZW1vcyBkaXN0cmlidWnDp8O1ZXMgZGUgcHJvYmFiaWxpZGFkZS4gQXF1aSwgZXN0YW1vcyBpbnRlcmVzc2Fkb3MgbmEgcHJvYmFiaWxpZGFkZSBjb25qdW50YSBkZSBvYnRlciBhbyBtZXNtbyB0ZW1wbyBhIG5vc3NhIGFtb3N0cmEgYWxlYXTDs3JpYSBxdWUgw6kgdW0gdmV0b3IgYWxlYXTDs3Jpby4gUG9yIGlzc28sIHV0aWxpemFtb3MgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIGNvbmp1bnRhLgoKW14yXTogTyBxdWUgw6kgbyB2ZXRvciBkZSBwYXLDom1ldHJvcyAkXHRoZXRhJD8gVG9kYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIGRlIHVtYSB2YXJpw6F2ZWwgYWxlYXTDs3JpYSBjb250w61udWEgb3UgZGlzY3JldGEgdGVtIHBhcsOibWV0cm9zLiBQb3IgZXhlbXBsbywgYSBOb3JtYWwgdGVtIGEgbcOpZGlhIGUgYSB2YXJpw6JuY2lhLiBRdWFuZG8gZmFsYW1vcyBubyB2ZXRvciBkZSBwYXLDom1ldHJvcyAkXHRoZXRhJCwgZXN0YW1vcyBkaXplbmRvIHF1ZSBuZXN0ZSB2ZXRvciBlc3TDo28gb3MgcGFyw6JtZXRyb3MgZGEgZGlzdHJpYnVpw6fDo28gZGUgcHJvYmFiaWxpZGFkZSAocXVlIG5vIGNhc28gZGEgTm9ybWFsIMOpIGEgbcOpZGlhIGUgdmFyacOibmNpYSwgb3Ugc2VqYSwgJFx0aGV0YT1cbGVmdChcbXUsXHNpZ21hXnsyfVxyaWdodCkkLiBOYSBtZWRpZGEgcXVlIGFsdGVyYW1vcyBvcyBjb21wb25lbnRlcyBkZXN0ZSB2ZXRvciwgbyBncsOhZmljbyBkYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIMOpIG1vZGlmaWNhZG8uIExlbWJyYSBkbyBleGVtcGxvIG9uZGUgYWx0ZXJhbW9zIGEgbcOpZGlhIGUgYSB2YXJpw6JuY2lhIGRhIE5vcm1hbD8gQWNlc3NlIGVzdGUgW2xpbmtdKGh0dHBzOi8vc3RhdGlzdGljcy5jYWxwb2x5LmVkdS9zaGlueSkgcGFyYSBlbnRlbmRlciBwb3IgbWVpbyBkZSB1bSBzaW11bGFkb3IuICAKCiQkCmYgXGxlZnQoeV8xLCB5XzIsIC4uLix5X24gfCBcdGhldGEgXHJpZ2h0KSA9IFxwcm9kIF97aT0xfV57bn17ZlxsZWZ0KHt5fV97aX18XHRoZXRhICBccmlnaHQpfSA9ZlxsZWZ0KHt5fV97MX18XHRoZXRhICBccmlnaHQpIFx0aW1lcyBmXGxlZnQoe3l9X3syfXxcdGhldGEgIFxyaWdodCkgXHRpbWVzICwuLi4sIFx0aW1lcyBmXGxlZnQoe3l9X3tufXxcdGhldGEgIFxyaWdodCkgCiQkCgpvbmRlICRcdGhldGEkIMOpIGZpeG8uIE5vdGUgcXVlLCBhbnRlcyBkYSByZXRpcmFkYSBkYSBhbW9zdHJhLCBjYWRhIG9ic2VydmHDp8OjbyDDqSB1bWEgdmFyacOhdmVsIGFsZWF0w7NyaWEgY3VqYSBmdW7Dp8OjbyBkZSBkZW5zaWRhZGUgZGUgcHJvYmFiaWxpZGFkZSDDqSBpZ3VhbCDDoCBmdW7Dp8OjbyBkZSBkZW5zaWRhZGUgZGUgcHJvYmFiaWxpZGFkZSBkYSBwb3B1bGHDp8Ojby4gQSBtw6lkaWEgZSBhIHZhcmnDom5jaWEgZGUgY2FkYSBvYnNlcnZhw6fDo28gYSBzZXIgcmV0aXJhZGEgdGFtYsOpbSBzw6NvIGlndWFpcyDDoCBtw6lkaWEgZSB2YXJpw6JuY2lhIGRhIHBvcHVsYcOnw6NvIGVtIHF1ZXN0w6NvLiAKCkNvbnR1ZG8sIHVtYSB2ZXogcXVlIHRlbmhhIHNpZG8gb2J0aWRhIHVtYSBhbW9zdHJhIGVzcGVjw61maWNhLCAkeV97aX0kIHRvcm5hLXNlIGZpeG8gZSBhIGZ1bsOnw6NvIGRlIGRlbnNpZGFkZSBkZSBwcm9iYWJpbGlkYWRlIGNvbmp1bnRhIHBvZGUgZW50w6NvIHNlciByZWludGVycHJldGFkYSBjb21vIHNlbmRvIHVtYSBmdW7Dp8OjbyBkbyB2ZXRvciBkZSBwYXLDom1ldHJvcyAkXHRoZXRhJCBxdWUgc2UgdG9ybmEgdmFyacOhdmVsIChjaGFtYW1vcyBlc3RhIGZ1bsOnw6NvIGRlICoqZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSoqKS4KCkVtIGVjb25vbWV0cmlhIHRlbW9zIG8gcHJvYmxlbWEgZGUsIGRhZGEgdW1hIGFtb3N0cmEsIG9idGVyIGEgZXN0aW1hdGl2YSBkb3MgdmFsb3JlcyBkb3MgcGFyw6JtZXRyb3MgcG9wdWxhY2lvbmFpcyBkZXNjb25oZWNpZG9zLiBBc3NpbSwgcXVlcmVtb3MgbyB2ZXRvciAkXHRoZXRhJCBxdWUgZmF6IGEgcHJvYmFiaWxpZGFkZSBkZSBvYnRlci1zZSBhIGFtb3N0cmEgasOhIGNvbGV0YWRhIGEgbWFpb3IgcG9zc8OtdmVsLCBvdSBzZWphLCB0ZW1vcyBxdWUgYWNoYXIgbyAkXHRoZXRhJCBxdWUgbWF4aW1pemEgYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIGFiYWl4bzoKCiQkCkwgXGxlZnQoXHRoZXRhIHx5XzEsIHlfMiwgLi4uLHlfbiAgXHJpZ2h0KSA9IFxwcm9kIF97aT0xfV57bn17ZlxsZWZ0KHt5fV97aX18XHRoZXRhICBccmlnaHQpfQokJAoKTWF0ZW1hdGljYW1lbnRlLCBiYXN0YSBpZ3VhbGFyIGEgemVybyBhcyBkZXJpdmFkYXMgcGFyY2lhaXMgZGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBlbSByZWxhw6fDo28gYSBjYWRhIHBhcsOibWV0cm8gZG8gdmV0b3IgJFx0aGV0YSQuIFBvZGVtb3MgdGFtYsOpbSB0cmFiYWxoYXIgY29tIG8gJFxsbntMfSQsIHBvaXMgbWF4aW1pemFyIG8gJFxsbntMfSQgw6kgZW0gZ2VyYWwgbWFpcyBzaW1wbGVzIGUgcHJvZHV6IG8gbWVzbW8gcmVzdWx0YWRvIGRhZG8gcXVlIG8gbG9nYXJ0aW1vICoqdHJhbnNmb3JtYSBvIHByb2R1dG8gZGFzIGRlbnNpZGFkZXMgZGUgcHJvYmFiaWxpZGFkZSBuYSBzb21hIGRvcyBsb2dhcml0bW9zIGRhcyBkZW5zaWRhZGVzKiosIGNvbmZvcm1lIGFiYWl4bzoKCiQkClxsbntMIFxsZWZ0KFx0aGV0YSB8IHlfMSwgeV8yLCAuLi4seV9uIFxyaWdodCl9ID0gXHN1bSBfe2k9MX1ee259e1xsbntmXGxlZnQoe3l9X3tpfXxcdGhldGEgIFxyaWdodCl9fQokJAoKKiAqKkVYRU1QTE8qKgoKU3Vwb25oYSBxdWUgdGVtb3MgdW0gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gbGluZWFyICR5X3tpfT1cYmV0YSB4X3tpfSArIHVfe2l9JCBvbmRlICR1X3tpfSQgdGVtIGRpc3RyaWJ1acOnw6NvIE5vcm1hbCBjb20gbcOpZGlhICQwJCBlIHZhcmnDom5jaWEgJFxzaWdtYV57Mn0kLiBQb3IgbWVpbyBkbyBtw6l0b2RvIGRlIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSBvYnRlbmhhIG8gdmV0b3IgZGUgcGFyw6JtZXRyb3MgJFxoYXRcdGhldGE9XGxlZnQoXGhhdHtcYmV0YX0sXGhhdHtcc2lnbWF9XjJccmlnaHQpJC4gCgpTYWJlbW9zIHF1ZSBhIGRpc3RyaWJ1acOnw6NvIE5vcm1hbCB0ZW0gYSBzZWd1aW50ZSBmdW7Dp8OjbyBkZSBkZW5zaWRhZGUgZGUgcHJvYmFiaWxpZGFkZSAoZm9ybWEgYWxnw6licmljYSBkZSBkaXplciBxdWUgZGFkbyBxdWUgdGVtb3MgdW1hIG3DqWRpYSBlIHVtYSB2YXJpw6JuY2lhLCBwb2RlbW9zIG9idGVyIGEgZGVuc2lkYWRlIGRlIHByb2JhYmlsaWRhZGUgcGFyYSB1bWEgb2JzZXJ2YcOnw6NvIGRlICR4JCk6IAoKJCQKZlxsZWZ0KHggfCBcbXUsXHNpZ21hXjJccmlnaHQpPVxmcmFjIHsxfXtcc3FydCB7MlxwaSB7XHNpZ21hfV57Mn19fSBleHBcbGVmdFx7LVxmcmFjezF9ezJ9IHtcbGVmdChcZnJhY3t4LVxtdX17XHNpZ21hfSAgXHJpZ2h0KX1eezJ9IFxyaWdodFx9LFxxdWFkIC1caW5mdHkgPHg8XGluZnR5CiQkCgpJc3NvIGltcGxpY2EgcXVlIGEgZnVuw6fDo28gZGUgZGVuc2lkYWRlIGRlIHByb2JhYmlsaWRhZGUgZGUgJHVfe2l9JCDDqSAoJFxtdT0wJCwgY29uZm9ybWUgcHJlc3N1cG9zdG8gZG8gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gbGluZWFyIHNpbXBsZXMpOgoKJCQKZih1X3tpfSB8IFxtdT0wLFxzaWdtYcKyKSA9IFxmcmFjIHsxfXtcc3FydCB7MlxwaSB7XHNpZ21hfV57Mn19fSBleHBcbGVmdFx7XGZyYWN7LXt1fV97aX1eezJ9fXsye1xzaWdtYX1eezJ9fSAgXHJpZ2h0XH0sXHF1YWQgcGFyYVxxdWFkIGk9MSwyLC4uLixuCiQkCgpFbSBmdW7Dp8OjbyBkZSAkdV97aX0kIHNlciBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG8gY29tIG3DqWRpYSAkMCQgZSB2YXJpw6JuY2lhICRcc2lnbWFeezJ9JCwgdGVyZW1vcyBhIHNlZ3VpbnRlIGRlbnNpZGFkZSBkZSBwcm9iYWJpbGlkYWRlIHBhcmEgJHlfe2l9JDoKCiQkCmZcbGVmdCh7eX1fe2l9IHwgXG11ID0gXGJldGEgeF9pLCBcc2lnbWFeMiBccmlnaHQpID1cZnJhY3sxfXtcc3FydHsyXHBpe1xzaWdtYX1eezJ9fX0gZXhwXGxlZnRcey1cZnJhY3sxfXsye1xzaWdtYX1eezJ9fSB7XGxlZnQoe3l9X3tpfS1cYmV0YXt4fV97aX0gXHJpZ2h0KX1eezJ9IFxyaWdodFx9ICxccXVhZCBwYXJhXHF1YWQgaT0xLDIsLi4uLG4KJCQKCkNvbSB0b2RhcyBlc3RhcyBkZWZpbmnDp8O1ZXMsIHNvbW9zIGNhcGF6ZXMgZGUgZXNjcmV2ZXIgYSBmdW7Dp8OjbyBkZSB2ZXJvc2ltaWxoYW7Dp2EgcGFyYSBvIHByb2JsZW1hIGVtIHF1ZXN0w6NvLiBMZW1icmUtc2UgcXVlLCBjb21vIHZpbW9zIGFudGVyaW9ybWVudGUsIG5vIG1vbWVudG8gcXVlIG9ic2VydmFtb3Mgb3MgdmFsb3JlcyBkZSAkeV97aX0kIHBhc3NhbW9zIGEgdGVyIGNvbW8gb2JqZXRpdm8gZW5jb250cmFyIHF1YWlzIG9zIHBhcsOibWV0cm9zIGRlICRcdGhldGEgPSBcbGVmdChcaGF0e1xiZXRhfSxcaGF0e1xzaWdtYX1eezJ9XHJpZ2h0KSQgcXVlIG1heGltaXphIGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBkZSAkeV97aX0kLiBMb2dvLCB0ZW1vcyBhIHNlZ3VpbnRlIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2EgcGFyYSBvIHByb2JsZW1hOgoKJCQKTChcdGhldGEgfCB5X3tpfSkgPSBMKFxiZXRhLFxzaWdtYV57Mn0gfCB5X3tpfSkgPSBccHJvZF97aT0xfV57bn17ZihcYmV0YSxcc2lnbWFeezJ9IHwge3l9X3tpfSl9ID0gXHByb2Rfe2k9MX1ee259XGZyYWN7MX17XHNxcnR7MlxwaXtcc2lnbWF9XnsyfX19IGV4cFxsZWZ0XHstXGZyYWN7MX17Mntcc2lnbWF9XnsyfX0ge1xsZWZ0KHt5fV97aX0tXGJldGF7eH1fe2l9IFxyaWdodCl9XnsyfSBccmlnaHRcfQokJApVbWEgYWx0ZXJuYXRpdmEgbWFpcyByYXpvw6F2ZWwgcGFyYSBlbmNvbnRyYXIgb3MgdmFsb3JlcyBkZSAkXHRoZXRhJCBxdWUgbWF4aW1pemFtIGEgZnVuw6fDo28gZGUgdmVyb3NpbWlsaGFuw6dhIMOpIHRyYWJhbGhhcm1vcyBjb20gbyBsb2dhcml0bW8gZGEgdmVyb3NzaW1pbGhhbsOnYSwgY29tbyBhYmFpeG8gKGFwbGljYW5kbyBhcGVuYXMgbyBsb2dhcml0bW8gbmEgZnVuw6fDo28gYW50ZXJpb3IpOgoKJCQKXGJlZ2lue2FsaWduZWR9CiYmJiBcbG57TChcYmV0YSxcc2lnbWFeezJ9IHwgeV97aX0pfSA9IFxsbntcbGVmdFtcZnJhY3sxfXtcc3FydHsyXHBpIHtcc2lnbWF9XnsyfX19IGV4cFxsZWZ0XHstXGZyYWN7MX17Mntcc2lnbWF9XnsyfX0ge1xsZWZ0KHt5fV97MX0tXGJldGF7eH1fezF9XHJpZ2h0KX1eezJ9IFxyaWdodFx9XHJpZ2h0XX0gKy4uLitcbG57XGxlZnRbXGZyYWN7MX17XHNxcnR7MlxwaSB7XHNpZ21hfV57Mn19fSBleHBcbGVmdFx7LVxmcmFjezF9ezJ7XHNpZ21hfV57Mn19IHtcbGVmdCh7eX1fe259LVxiZXRhe3h9X3tufVxyaWdodCl9XnsyfSBccmlnaHRcfVxyaWdodF19IFxcCiYmJiBcbG57TChcYmV0YSxcc2lnbWFeezJ9IHwgeV97aX0pfSA9IFxsbntcbGVmdFtcZnJhY3sxfXtcc3FydHsyXHBpIHtcc2lnbWF9XnsyfX19XHJpZ2h0XX0tXGZyYWN7MX17Mntcc2lnbWF9XnsyfX17XGxlZnQoe3l9X3sxfS1cYmV0YXt4fV97MX1ccmlnaHQpfV57Mn0gICsgLi4uICsgXGxue1xsZWZ0W1xmcmFjezF9e1xzcXJ0ezJccGkge1xzaWdtYX1eezJ9fX1ccmlnaHRdfS1cZnJhY3sxfXsye1xzaWdtYX1eezJ9fXtcbGVmdCh7eX1fe259LVxiZXRhe3h9X3tufVxyaWdodCl9XnsyfSAgXFwKXGVuZHthbGlnbmVkfQokJApxdWUgb3JnYW5pemFuZG8sIHNlIHRyYW5zZm9ybWEgZW06CgokJApcYmVnaW57YWxpZ25lZH0KJiYgXGxue0woXGJldGEsXHNpZ21hXnsyfSB8IHlfe2l9KX0gPSBuIFx0aW1lc1xsbntcbGVmdFtcZnJhY3sxfXtcc3FydHsyXHBpIHtcc2lnbWF9XnsyfX19XHJpZ2h0XX0tXGZyYWN7MX17Mntcc2lnbWF9XnsyfX0gXHN1bV97aT0xfV57bn17e1xsZWZ0KHt5fV97aX0tXGJldGF7eH1fe2l9IFxyaWdodCl9XnsyfX0gXFwKJiYgXGxue0woXGJldGEsXHNpZ21hXnsyfSB8IHlfe2l9KX0gPSBuIFx0aW1lcyBcbG57eygyXHBpIHtcc2lnbWF9XnsyfSl9XnstXGZyYWN7MX17Mn19fSAtXGZyYWN7MX17Mntcc2lnbWF9XnsyfX0gXHN1bV97aT0xfV57bn17e1xsZWZ0KHt5fV97aX0tXGJldGF7eH1fe2l9IFxyaWdodCl9XnsyfX0KXGVuZHthbGlnbmVkfQokJAoKT2JzZXJ2ZSBxdWUgdGVtb3MgYWdvcmEgdW1hIGZ1bsOnw6NvIHF1ZSBkZXBlbmRlIGRlICRcYmV0YSQgZSAkXHNpZ21hXnsyfSQgcGFyYSB2YWxvcmVzIGRlICR5X3tpfSQuIFNhYmVtb3MgcXVlIHBhcmEgZW5jb250cmFyIG9zIHZhbG9yZXMgY3LDrXRpY29zIHF1ZSBvdGltaXphbSAoc2VqYSBtYXhpbWl6YXIgb3UgbWluaW1pemFyKSB1bWEgZnVuw6fDo28gcHJlY2lzYW1vcyBhY2hhciBvcyBwb250b3Mgb25kZSBhIHByaW1laXJhIGRlcml2YWRhIGRhIGZ1bsOnw6NvIGVtIHJlbGHDp8OjbyBhIGNhZGEgdW0gZG9zIHBhcsOibWV0cm9zIMOpIGlndWFsIGEgemVybyAoY29uZGnDp8OjbyBkZSBwcmltZWlyYSBvcmRlbSkuIAoKQWzDqW0gZGlzc28sIMOpIG5lY2Vzc8OhcmlvIGF2YWxpYXIgYSBjdXJ2YXR1cmEgZGEgZnVuw6fDo28gbmFzIHByb3hpbWlkYWRlcyBkb3MgdmFsb3JlcyBjcsOtdGljb3MgKGNvbmRpw6fDo28gZGUgc2VndW5kYSBvcmRlbSkgbyBxdWUgbm9zIHBlcm1pdGUgZGV0ZXJtaWFyIHNlIGEgZnVuw6fDo28gw6kgbWF4aW1pemFkYSBvdSBtaW5pbWl6YWRhIG5vcyBwb250b3MgY3LDrXRpY29zLiAKClBhcmEgZXN0ZSBwcm9ibGVtYSwgYSBjb25kacOnw6NvIGRlIHByaW1laXJhIG9yZGVtIChDUE8pIHNlcsOhOgoKJCQKXGZyYWN7XHBhcnRpYWwgTH17XHBhcnRpYWwgXHRoZXRhfSA9IFxsZWZ0KFxiZWdpbnthcnJheX17Y30gXGZyYWN7XHBhcnRpYWwgXGxue0x9fXtccGFydGlhbFxiZXRhfSBcXCBcZnJhY3tccGFydGlhbCBcbG57TH19e1xwYXJ0aWFse1xzaWdtYX1eezJ9fSBcZW5ke2FycmF5fVxyaWdodCkgPSAwCiQkCgpPIHZldG9yIGdyYWRpZW50ZSAkXGZyYWN7XHBhcnRpYWwgTH17XHBhcnRpYWwgXHRoZXRhfSQgw6kgY2hhbWFkbyBkZSAqKnZldG9yIGVzY29yZSoqLCBwb2lzIGVsZSByZXByZXNlbnRhIGFzIHByaW1laXJhcyBkZXJpdmFkYXMgZG8gbG9nYXJpdG1vIGRhIGRlbnNpZGFkZS4gQXNzaW0sIHRlbW9zOiAKCiQkClxmcmFje1xwYXJ0aWFsIFxsbntMfX17XHBhcnRpYWxcYmV0YX09LVxmcmFjezF9ezJ7XHNpZ21hfV57Mn19XHN1bV97aT0xfV57bn17Mih7eX1fe2l9LVxiZXRhe3h9X3tpfSkoLXt4fV97aX0pfT0wXFJpZ2h0YXJyb3cgXGhhdCB7XGJldGF9ID1cZnJhY3sgXHN1bSBfe2k9MX1ee259eyh7eX1fe2l9e3h9X3tpfSl9fXtcc3VtX3tpPTF9XntufXt7eH1fe2l9XnsyfX19IAokJAokJApcZnJhY3tccGFydGlhbCBcbG57TH19e1xwYXJ0aWFse1xzaWdtYX1eezJ9fSA9LVxmcmFje059ezJ7XHNpZ21hfV57Mn19ICtcZnJhY3sxfXsye1xsZWZ0KHtcc2lnbWF9XnsyfSBccmlnaHQpfV57Mn19IFxzdW1fe2k9MX1ee059e3tcbGVmdCh7eX1fe2l9LVxiZXRhe3h9X3tpfSBccmlnaHQpfV57Mn19PTBcUmlnaHRhcnJvdyB7XGhhdHtcc2lnbWF9fV57Mn09XGZyYWN7XHN1bSBfe2k9MX1ee059e3tcbGVmdCh7eX1fe2l9LVxiZXRhe3h9X3tpfSBccmlnaHQpfV57Mn19fXtufSAKJCQKQSBwYXJ0aXIgZG9zIHJlc3VsdGFkb3Mgb2J0aWRvcyBhY2ltYSwgcG9kZW1vcyBvYnNlcnZhciBxdWUgbyBlc3RpbWFkb3IgZGUgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhIHBhcmEgJFxiZXRhJCDDqSBpZ3VhbCBhbyBlc3RpbWFkb3IgZGUgbcOtbmltb3MgcXVhZHJhZG9zIG9yZGluw6FyaW9zLiBQb3Igb3V0cm8gbGFkbywgbyBlc3RpbWFkb3IgZGEgdmFyacOibmNpYSBkbyB0ZXJtbyBkZSBlcnJvIG9idGlkbyBwb3IgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhIMOpIHZpZXNhZG8sIG1hcyBjb25zaXN0ZW50ZS4gCgoqICoqUFJPUFJJRURBREVTIERPUyBFU1RJTUFET1JFUyBPQlRJRE9TIFBFTE8gUFJJTkPDjVBJTyBEQSBNw4FYSU1BIFZFUk9TU0lNSUxIQU7Dh0EqKgoKMSkgU8OjbyBjb25zaXN0ZW50ZXM6ICRwIFxsaW17XGhhdHtcdGhldGF9fT1cdGhldGEkCjIpIFTDqm0gZGlzdHJpYnVpw6fDo28gYXNzaW50w7N0aWNhIE5vcm1hbDogJFxoYXR7XHRoZXRhfSBcc2ltIE5cbGVmdChcdGhldGEsIEleey0xfShcdGhldGEpXHJpZ2h0KSQgb25kZSAkSShcdGhldGEpJCDDqSBhICoqbWF0cml6IGRlIGluZm9ybWHDp8OjbyBkZSBGaXNjaGVyKiouIAozKSBTw6NvIGFzc2ludG90aWNhbWVudGUgZWZpY2llbnRlcwo0KSBTw6NvIGludmFyaWFudGVzCgpBICoqbWF0cml6IGRlIGluZm9ybWHDp8OjbyBkZSBGaXNjaGVyKiogw6kgZGVmaW5pZGEgY29tbzoKCiQkCklcbGVmdChcdGhldGFccmlnaHQpID0gRVxsZWZ0W1xsZWZ0KFxmcmFje1xwYXJ0aWFsIEx9e1xwYXJ0aWFsIFx0aGV0YX1ccmlnaHQpXjJccmlnaHRdID0gLSBFXGxlZnRbXGxlZnQoXGZyYWN7XHBhcnRpYWxeMiBMfXtccGFydGlhbCBcdGhldGFeMn1ccmlnaHQpXHJpZ2h0XQokJAoKb25kZSAkTChcdGhldGEpJCDDqSBvIGxvZ2FyaXRtbyBkYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhLiBBIHRlcm1pbm9sb2dpYSBtYXRyaXogZGUgaW5mb3JtYcOnw6NvIMOpIHV0aWxpemFkYSBlbSBmdW7Dp8OjbyBkZSAkTChcdGhldGEpJCBzZXIgYSB2YXJpw6JuY2lhIGRlICRcZnJhY3tccGFydGlhbCBMfXtccGFydGlhbCBcdGhldGF9JCAocXVlIMOpIG8gc2NvcmUgY3VqYSBtw6lkaWEgw6kgemVybykuIAoKQXNzaW0sIHZhbG9yZXMgYWx0b3MgZGUgJEwoXHRoZXRhKSQgc2lnbmlmaWNhbSBxdWUgcGVxdWVuYXMgYWx0ZXJhw6fDtWVzIGVtICRcdGhldGEkIGNvbmR1emVtIGEgZ3JhbmRlcyBhbHRlcmHDp8O1ZXMgbm8gdmFsb3IgZG8gbG9nYXJpdG1vIGRhIHZlcm9zc2ltaWxoYW7Dp2EuIEFsw6ltIGRpc3NvLCAkSShcdGhldGEpJCBub3MgZm9ybmVjZSBpbmZvcm1hw6fDo28gc29icmUgYSBjdXJ2YXR1cmEgZG8gbG9nYXJpdG1vIGRhIHZlcm9zc2ltaWxoYW7Dp2EgKGNvbmNhdmlkYWRlIGRhIGZ1bsOnw6NvKSAKClF1YW50byBtYWlzIGPDtG5jYXZhIGEgZnVuw6fDo28sIG1haXMgZsOhY2lsIGRlIGRldGVjdGFyIG8gJFxoYXR7XHRoZXRhfSQgbcOheGltby4gQ2FzbyBjb250csOhcmlvIChtYWlzIHBsYW5hKSwgdGVyZW1vcyAkXGhhdHtcdGhldGF9JCdzIG11aXRvIHByw7N4aW1vcyBkbyAkXGhhdHtcdGhldGF9JCBxdWUgZ2VyYSBvIG3DoXhpbW8gZGEgZnVuw6fDo28gZSBzZXLDoSBkaWbDrWNpbCBlbmNvbnRyYXIgbyAkXGhhdHtcdGhldGF9JCBtw6F4aW1vLgoKIyMjIyAqKlBSw4FUSUNBKioKCk5lc3RhIHNlw6fDo28gdm9jw6ogY29uc2VndWlyw6EgYXBsaWNhciBubyBSIHRvZG9zIG9zIGNvbmNlaXRvcyBlc3R1ZGFkb3MgYW50ZXJpb3JtZW50ZS4gCgo8b2wgc3RhcnQ9IjEiPgo8bGk+IDxoNT4gPGI+IEVTVElNQVIgUEFSw4JNRVRST1MgREUgVU1BIEFNT1NUUkEgQUxFQVTDk1JJQSA8L2I+IDwvaDU+IDwvbGk+Cjwvb2w+CgpTdXBvbmhhIHF1ZSB2b2PDqiB0ZW0gdW1hIGFtb3N0cmEgYWxlYXTDs3JpYSAkKHhfezF9LHhfezJ9LC4uLix4X3tufSkkIGNvbXBvc3RhIHBvciB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIHJldGlyYWRhcyBkZSB1bWEgcG9wdWxhw6fDo28gY29tIHVtYSBmdW7Dp8OjbyBkZSBkZW5zaWRhZGUgZGUgcHJvYmFiaWxpZGFkZSBOb3JtYWwgY29tIG3DqWRpYSAkXG11JCBlIHZhcmnDom5jaWEgJFxzaWdtYV57Mn0kLCBjb21vIGFiYWl4bzoKCiQkCmYoeHxcbXUsXHNpZ21hXnsyfSk9XGZyYWN7MX17XHNxcnR7MlxwaXtcc2lnbWF9XnsyfX19IGV4cCBcbGVmdFx7LVxmcmFjezF9ezJ9e1xsZWZ0KFxmcmFje3gtXG11fXtcc2lnbWF9XHJpZ2h0KX1eezJ9XHJpZ2h0XH0KJCQKSXN0byBpbXBsaWNhIHF1ZSBhIGZ1bsOnw6NvIGRlbnNpZGFkZSBkZSBwcm9iYWJpbGlkYWRlIGNvbmp1bnRhIGRhIGFtb3N0cmEgYWxlYXTDs3JpYSAob3UgdmV0b3IgYWxlYXTDs3Jpbykgw6k6CgokJApmKHhfezF9LHhfezJ9LC4uLix4X3tufSB8IFxtdSxcc2lnbWFeezJ9KSA9IFxwcm9kX3tpPTF9XntufXtmKHt4fV97MX0sLi4uLHhfe259fFxtdSxcc2lnbWFeezJ9fSkKJCQKVm9jw6ogcXVlciBkZXNjb2JyaXIgcXVhaXMgb3MgdmFsb3JlcyBkb3MgcGFyw6JtZXRyb3MgJFxtdSQgZSAkXHNpZ21hXnsyfSQgcGFyYSBzdWEgYW1vc3RyYSBhbGVhdMOzcmlhLiBQZWxvIHByaW5jw61waW8gZGEgdmVyb3NzaW1pbGhhbsOnYSBzYWJlbW9zIHF1ZSBvIHByb2JsZW1hIHBvZGUgc2VyIGVzY3JpdG8gZGEgc2VndWludGUgZm9ybWE6CgokJApMKFxtdSxcc2lnbWFeezJ9fHhfezF9LHhfezJ9LC4uLix4X3tufSkgPSBccHJvZF97aT0xfV57bn1mKHt7eH1fezF9LC4uLix4X3tufXxcbXUsXHNpZ21hXnsyfX0pID0gZih7e3h9X3sxfXxcbXUsXHNpZ21hXnsyfX0pXHRpbWVzIGYoe3t4fV97Mn18XG11LFxzaWdtYV57Mn19KSBcdGltZXMuLi4gXHRpbWVzIGYoe3hfe259fFxtdSxcc2lnbWFeezJ9fSkgCiQkCk5hIHBhcnRlIHRlw7NyaWNhIGRlc3RlIGRvY3VtZW50bywgdmltb3MgcXVlIHVtYSBhbHRlcm5hdGl2YSBwYXJhIGEgc29sdcOnw6NvIGRvIHByb2JsZW1hIMOpIHRyYWJhbGhhciBjb20gbyAqKmxvZ2FyaXRtbyBkYSB2ZXJvc3NpbWlsaGFuw6dhKiosIHF1ZSBhcGxpY2FkbyBubyBwcmVzZW50ZSBwcm9ibGVtYSwgdGVtb3M6CgokJApcYmVnaW57YWxpZ25lZH0KJiYmIEwoXG11LFxzaWdtYV57Mn18eF97MX0seF97Mn0sLi4uLHhfe259KSA9IFxzdW1fe2k9MX1ee259e1xsbntmKHt7eH1fezF9LC4uLix4X3tufXxcbXUsXHNpZ21hXnsyfX0pfX0gXFwKJiYmIEwoXG11LFxzaWdtYV57Mn18eF97MX0seF97Mn0sLi4uLHhfe259KSA9IFxsbntmKHhfMXxcbXUsXHNpZ21hXjIpfStcbG57Zih4XzJ8XG11LFxzaWdtYV4yKX0rLi4uK1xsbntmKHhfbnxcbXUsXHNpZ21hXjIpfSBcXAomJiYgTChcbXUsXHNpZ21hXnsyfXx4X3sxfSx4X3syfSwuLi4seF97bn0pID0gXGxue1xsZWZ0W1xmcmFjezF9e1xzcXJ0ezJccGl7XHNpZ21hfV57Mn19fSBleHAgXGxlZnRcey1cZnJhY3sxfXsyfXtcbGVmdChcZnJhY3t4XzEtXG11fXtcc2lnbWF9XHJpZ2h0KX1eezJ9XHJpZ2h0XH1ccmlnaHRdfSArIC4uLitcbG57XGxlZnRbXGZyYWN7MX17XHNxcnR7MlxwaXtcc2lnbWF9XnsyfX19IGV4cCBcbGVmdFx7LVxmcmFjezF9ezJ9e1xsZWZ0KFxmcmFje3hfbi1cbXV9e1xzaWdtYX1ccmlnaHQpfV57Mn1ccmlnaHRcfVxyaWdodF19IFxcCiYmJiBMKFxtdSxcc2lnbWFeezJ9fHhfezF9LHhfezJ9LC4uLix4X3tufSkgPSBcbG57XGxlZnRbXGZyYWN7MX17XHNxcnR7MlxwaSB7XHNpZ21hfV57Mn19fVxyaWdodF19LVxmcmFjezF9ezJ7XHNpZ21hfV57Mn19e1xsZWZ0KHt4fV97MX0tXG11XHJpZ2h0KX1eezJ9ICsgLi4uICsgXGxue1xsZWZ0W1xmcmFjezF9e1xzcXJ0ezJccGkge1xzaWdtYX1eezJ9fX1ccmlnaHRdfS1cZnJhY3sxfXsye1xzaWdtYX1eezJ9fXtcbGVmdCh7eH1fe259LVxtdVxyaWdodCl9XnsyfSAgXFwKJiYmIEwoXG11LFxzaWdtYV57Mn18eF97MX0seF97Mn0sLi4uLHhfe259KSA9IG4qXGxue1xsZWZ0W1xmcmFjezF9e1xzcXJ0ezJccGkge1xzaWdtYX1eezJ9fX1ccmlnaHRdfS1cZnJhY3sxfXsye1xzaWdtYX1eezJ9fSBcc3VtX3tpPTF9XntufXt7XGxlZnQoe3h9X3tpfS1cbXUgXHJpZ2h0KX1eezJ9fSBcXAomJiYgTChcbXUsXHNpZ21hXnsyfXx4X3sxfSx4X3syfSwuLi4seF97bn0pID0gbipcbG57eygyXHBpIHtcc2lnbWF9XnsyfSl9XnstXGZyYWN7MX17Mn19fSAtXGZyYWN7MX17Mntcc2lnbWF9XnsyfX0gXHN1bV97aT0xfV57bn17e1xsZWZ0KHt4fV97aX0tXG11IFxyaWdodCl9XnsyfX0gXFwKJiYmIEwoXG11LFxzaWdtYV57Mn18eF97MX0seF97Mn0sLi4uLHhfe259KSA9IC1cbGVmdChcZnJhY3tufXsyfVxyaWdodCkqXGxue3soMlxwaSB7XHNpZ21hfV57Mn0pfX0tXGZyYWN7MX17Mntcc2lnbWF9XnsyfX0gXHN1bV97aT0xfV57bn17e1xsZWZ0KHt4fV97aX0tXG11IFxyaWdodCl9XnsyfX0gXFwKXGVuZHthbGlnbmVkfQokJAoKTm9zIGPDs2RpZ29zIGFiYWl4byBtb3N0cmFtb3MgY29tbyByZXNvbHbDqi1sbyB1c2FuZG8gbyAqKmxvZ2FyaXRtbyBkYSB2ZXJvc3NpbWlsaGFuw6dhKiogZSBzdXBvbmRvIHF1ZSB0ZW1vcyB1bWEgYW1vc3RyYSBhbGVhdMOzcmlhIGRlIHRhbWFuaG8gJDEwMDAkIHBhcmEgJHhfe2l9JC4gCgpOdW0gcHJpbWVpcm8gbW9tZW50bywgc2FiZW1vcyBvcyB2ZXJkYWRlaXJvcyB2YWxvcmVzIGRlICRcbXUkIGUgJFxzaWdtYV57Mn0kICgxIGUgMiwgcmVzcGVjdGl2YW1lbnRlKSBlIHF1ZXJlbW9zIGZhemVyIHVzbyBkbyBwcmluY8OtcGlvIGRhIHZlcm9zc2ltaWxoYW7Dp2EgcGFyYSB2ZXJpZmljYXIgcXVhaXMgb3MgdmFsb3JlcyBvIG1lc21vIHJldG9ybmEgY29tbyBlc3RpbWF0aXZhIHBhcmEgb3MgcGFyw6JtZXRyb3MgZGUgaW50ZXJlc3NlICgkXG11JCBlICRcc2lnbWFeezJ9JCkuIEV4ZWN1dGUgb3MgY8OzZGlnb3MgYWJhaXhvIGUgb2JzZXJ2ZSBxdWUgbyBtw6l0b2RvIGRhIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSByZXN1bHRhcsOhIGVtIHBhcsOibWV0cm9zIHByw7N4aW1vcyBkb3MgdmVyZGFkZWlyb3MgcGFyw6JtZXRyb3MgcG9wdWxhY2lvbmFpcy4KCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMgIFBSRVBBUkFSIE8gUFJPQkxFTUEgICMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIE5lc2UgZXhlbXBsbywgdmFtb3MgbW9zdHJhciBjb21vIHVzYXIgbyBwcmluY8OtcGlvIGRhIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSBwYXJhIGVuY29udHJhcgojIG9zIHBhcsOibWV0cm9zIGRlIG3DqWRpYSBlIHZhcmnDom5jaWEgZGUgdW1hIGFtb3N0cmEgZGUgdW1hIHZhcmnDoXZlbCBhbGVhdMOzcmlhIHF1ZSBzZWd1ZSAKIyB1bWEgZGlzdHJpYnVpw6fDo28gTm9ybWFsCgojIENyaWFtb3MgdW1hIHZhcmnDoXZlbCBhbGVhdMOzcmlhICh4aSkgZGUgdGFtYW5obyAxMDAwIG9yaWdpbmFkYSBhIHBhcnRpciBkZSBub3JtYWwgY29tIG3DqWRpYSAxIGUgZGVzdmlvIHBhZHLDo28gMgojIFBhcmEgc2FiZXIgYXMgb3DDp8O1ZXMgZGEgZnVuw6fDo28gcm5vcm0gZXhlY3V0ZSBoZWxwKHJub3JtKQp4IDwtIHJub3JtKDEwMDAsIG1lYW4gPSAxICwgc2QgPSAyKQoKIyBmdW7Dp8OjbyBkbyBuZWdhdGl2byBkbyBsb2cgZGEgdmVyb3NzaW1pbGhhbsOnYSBkYSBOb3JtYWwKbmVnX2xvZ19saWsgPC0gZnVuY3Rpb24oeCwgcGFyYW1ldHJvcyl7CiAgIyBwYXLDom1ldHJvcyBwYXJhIGEgZGlzdHJpYnVpw6fDo28gTm9ybWFsCiAgbWVkaWEgPC0gcGFyYW1ldHJvc1sxXQogIGRlc3ZpbyA8LSBwYXJhbWV0cm9zWzJdCiAgbiA8LSBsZW5ndGgoeCkKICAjIGxvZyBkYSB2ZXJvc3NpbWlsaGFuw6dhIGRhIE5vcm1hbAogIGxsIDwtIC0obi8yKSpsb2coMipwaSpkZXN2aW9eMikgKyAoLTEvKDIqZGVzdmlvXjIpKSpzdW0oKHgtbWVkaWEpXjIpCiAgIyByZXRvcm5hciBvIG5lZ2F0aXZvIHBhcmEgbWF4aW1pemFyIGFvIGludsOpcyBkZSBtaW5pbWl6YXIgCiAgcmV0dXJuKC1sbCkKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgICAgIEdSw4FGSUNPUyAgICAgICAgICMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIE9iamV0aXZvOiBtb3N0cmFyIHF1ZSBtYXhpbWl6YXIgdW1hIGZ1bsOnw6NvIMOpIG8gbWVzbW8gcXVlIG1pbmltaXphciBvIG5lZ2F0aXZvIGRhIGZ1bsOnw6NvCgojIGRpdmlkaXIgYSB0ZWxhIGVtIGR1YXMgbGluaGFzIGUgdW1hIGNvbHVuYQpwYXIobWZyb3c9YygyLDEpKQoKIyBncsOhZmljbyBkYSBmdW7Dp8OjbyBkbyBsb2dhcml0bW8gZGEgdmVyb3NzbWlsaGFuw6dhLiBPYnNlcnZlIHF1ZSBlc3RhbW9zIG11bHRpcGxpY2FuZG8gcG9yIC0xCiMgYSBmdW7Dp8OjbyBxdWUgasOhIMOpIG8gbmVnYXRpdm8gKG91IHNlamEsIHZvbHRhbmRvIHBhcmEgbyBzZXUgc2luYWwpCnBsb3QoeCA9IHNlcShmcm9tID0gLTMsIHRvID0gMywgYnkgPSAwLjEpLAogICAgIHkgPSAtMSpzYXBwbHkoc2VxKGZyb20gPSAtMywgdG8gPSAzLCBieSA9IDAuMSksIAogICAgICAgICAgICAgICAgICAgRlVOID0gbmVnX2xvZ19saWssIHBhciA9IGMoMCwxKSksCiAgICAgdHlwZSA9ICJsIiwKICAgICB5bGFiID0gIiIsCiAgICAgeGxhYiA9ICJWYWxvciBkYSB2YXJpw6F2ZWwgYWxlYXTDs3JpYSBYIiwgCiAgICAgbWFpbiA9ICJMb2cgZGEgVmVyb3NzaW1pbGhhbsOnYSBwYXJhIE3DqWRpYT0wIGUgVmFyacOibmNpYT0xIikKCiMgZ3LDoWZpY28gZG8gbmVnYXRpdm8gZG8gbG9nYXJpdG1vIGRhIHZlcm9zc2ltaWxoYW7Dp2EKcGxvdCh4ID0gc2VxKGZyb20gPSAtMywgdG8gPSAzLCBieSA9IDAuMSksCiAgICAgeSA9IDEqc2FwcGx5KHNlcShmcm9tID0gLTMsIHRvID0gMywgYnkgPSAwLjEpLCAKICAgICAgICAgICAgICAgICAgRlVOID0gbmVnX2xvZ19saWssIHBhciA9IGMoMCwxKSksCiAgICAgdHlwZSA9ICJsIiwKICAgICB5bGFiID0gIiIsCiAgICAgeGxhYiA9ICJWYWxvciBkYSB2YXJpw6F2ZWwgYWxlYXTDs3JpYSBYIiwgCiAgICAgbWFpbiA9ICJOZWdhdGl2byBkbyBMb2cgZGEgVmVyb3NzaW1pbGhhbsOnYSBwYXJhIE3DqWRpYT0wIGUgVmFyacOibmNpYT0xIikKCiMgcmV0b3JuYXIgYSB0ZWxhIHBhcmEgdW1hIGxpbmhhIGUgdW1hIGNvbHVuYQpwYXIobWZyb3cgPSBjKDEsMSkpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgIFNPTFVDSU9OQVIgTyBQUk9CTEVNQSAgIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBVbWEgdmV6IHF1ZSB0ZW1vcyB1bWEgZnVuw6fDo28gcXVlIGRldmUgc2VyIG1heGltaXphZGEgZSBvcyBwYXLDom1ldHJvcyBpbmljaWFpcywgcG9kZW1vcyB1c2FyCiMgYSBmdW7Dp8OjbyBvcHRpbSBkbyBwYWNvdGUgc3RhdHMgcGFyYSBvYnRlciBhcyBlc3RpbWF0aXZhcyDDs3RpbWFzIHBhcmEgYSBtw6lkaWEgZSB2YXJpw6JuY2lhLiAKIyAtIHBhcjogYXRyaWJ1dG8gcXVlIHJlY2ViZSBvcyB2YWxvcmVzIGluaWNpYWlzIGRvcyBwYXLDom1ldHJvcy4gQSBzZXF1w6puY2lhIMOpIGltcG9ydGFudGUgYXF1aSwgCiMgcG9pcyBkZWZpbmltb3MgbmEgZnVuw6fDo28gcXVlIG8gcHJpbWVpcm8gw6kgYSBtw6lkaWEgZSBvIHNlZ3VuZG8gw6kgYSB2YXJpw6JuY2lhCiMgLSBmbjogYSBmdW7Dp8OjbyBxdWUgZGV2ZSBzZXIgbWluaW1pemFkYS4gUG9yIGRlZmF1bHQsIG9wdGltIGZheiB1bWEgbWluaW1pemHDp8OjbyBlIHBvciBpc3NvCiMgZGVmaW5pbW9zIG8gbmVnYXRpdm8gZG8gbG9nYXJpdG1vIGRhIHZlcm9zc2ltaWxoYW7Dp2EgZGFkbyBxdWUgbWluaW1pemFyIG8gaW52ZXJzbyBkZSB1bWEgCiMgZnVuw6fDo28gw6kgbyBtZXNtbyBxdWUgbWF4aW1pesOhLWxhCiMgLSBtZXRob2Q6IG8gYWxnb3JpdG1vIG51bcOpcmljbyB1c2FkbyBwYXJhIHNvbHVjaW9uYXIgbyBwcm9ibGVtYS4gCiMgLSBoZXNzaWFuOiBzZSBxdWVyZW1vcyAoVFJVRSkgb3UgbsOjbyAoRkFMU0UpIHF1ZSBhIG1hdHJpeiBoZXNzaWFuYSBkbyBwcm9ibGVtYSBkZSBvdGltaXphw6fDo28gc2VqYQojIGRpc3BvbmliaWxpemFkYS4gUGFyYSBtYWlzIGRldGFsaGVzIHVzZSBoZWxwKG9wdGltKSBvdSBlbSBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZml0ZGlzdHJwbHVzL3ZpZ25ldHRlcy9PcHRpbWFsZ28uaHRtbApub3JtYWwuZml0IDwtIHN0YXRzOjpvcHRpbShwYXIgPSBjKDAuNSwwLjUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gbmVnX2xvZ19saWssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIkJGR1MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVzc2lhbiA9IFRSVUUpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjICAgICAgIFJFU1VMVEFET1MgICAgICMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBQYXLDom1ldHJvcyBlbmNvbnRyYWRvcyBwYXJhIGEgbcOpZGlhIGUgdmFyacOibmNpYSAoY29uZGnDp8OjbyBkZSBwcmltZWlyYSBvcmRlbSkuIE9ic2VydmUKIyBxdWUgZWxlcyBlc3TDo28gYmVtIHByw7N4aW1vcyBkb3MgdmFsb3JlcyB1c2Fkb3MgcGFyYSBnZXJhciBhIHZhcmlhdmVsIGFsZWF0w7NyaWEKbm9ybWFsLmZpdCRwYXIgCgojIFJlc3VsdGFkbzogbWF0cml6IGhlc3NpYW5hIChjb25kacOnw6NvIGRlIHNlZ3VuZGEgb3JkZW0pLiBBcXVpLCB0ZW1vcyBxdWUgYXZhbGlhciBzZSBhIG1hdHJpegojIGhlc3NpYW5hIMOpIG5lZ2F0aXZhIGRlZmluaWRhIG91IHBvc2l0aXZhIGRlZmluaWRhIG5vcyBwb250b3MgY3LDrXRpY29zIGVuY29udHJhZG9zIG5hIGNvbmRpw6fDo28KIyBkZSBwcmltZWlyYSBvcmRlbS4gQ29tbyBlc3RhbW9zIGNvbSB1bSBwcm9ibGVtYSBkZSBtaW5pbWl6YcOnw6NvIChub3ZhbWVudGUsIGVuY29udHJhciBvcyB2YWxvcmVzIAojIHBhcmEgYSBtw6lkaWEgZSB2YXJpw6JuY2lhIHF1ZSBtaW5pbWl6YW0gbyBuZWdhdGl2byBkYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIMOpIG8gbWVzbW8gcXVlIAojIGVuY29udHJhciBvcyB2YWxvcmVzIHF1ZSBtYXhpbWl6YW0gYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhKSwgdGVtb3MgcXVlIHZlcmlmaWNhciBzZSBuYXMgCiMgcHJveGltaWRhZGVzIGRhIG1hdHJpeiBoZXNzaWFuYSBhIGZ1bsOnw6NvIMOpICJjb252ZXhhIi4gSXNzbyBzw7Mgw6kgcG9zc8OtdmVsIHNlIG9zIG1lbm9yZXMgcHJpbmNpcGFpcwojIGzDrWRlcmVzIGRhIG1hdHJpeiBoZXNzaWFuYSBzw6NvIHBvc2l0aXZvcyB0b3JuYW5kby1hIHBvc2l0aXZhIGRlZmluaWRhLiAKbm9ybWFsLmZpdCRoZXNzaWFuCgojIERldGVybWluYW50ZSBkbyBwcmltZWlybyBtZW5vciBwcmluY2lwYWwgbMOtZGVyCmRldChtYXRyaXgoZGF0YSA9IG5vcm1hbC5maXQkaGVzc2lhblsxXSwgbnJvdyA9IDEsIG5jb2wgPSAxKSkKCiMgRGV0ZXJtaW5hbnRlIGRvIHNlZ3VuZG8gbWVub3IgcHJpbmNpcGFsIGzDrWRlcgpkZXQobWF0cml4KGRhdGEgPSBub3JtYWwuZml0JGhlc3NpYW4sIG5yb3cgPSAyLCBuY29sID0gMikpCgojIE1hdHJpeiBkZSBpbmZvcm1hw6fDo28gZGUgRmlzaGVyCiMgIC0gTWFpcyBkZXRhbGhlcyBlbSBodHRwczovL3JwdWJzLmNvbS9odWRzb25jaGF2cy9tYXh2ZXJvc2ltaWxoYW5jYQojICAtIE9iaWRhIHBvciAoLWhlc3NpYW5hKV4oLTEpLiBBIHJhesOjbyBwYXJhIG7Do28gc2VyIHByZWNpc28gbXVsdGlwbGljYXIgYSBtYXRyaXoKIyBoZXNzaWFuYSBwb3IgLTEgw6kgcXVlIGrDoSBmaXplbW9zIGEgbWluaW1pemHDp8OjbyB1c2FuZG8gbyBuZWdhdGl2byBkYSB2ZXJvc3NpbWlsaGFuw6dhCmZpc2hlci5pbmZvcm1hdGlvbi5ub3JtYWwuZml0IDwtIHNvbHZlKG5vcm1hbC5maXQkaGVzc2lhbikKCiMgRGVzdmlvIHBhZHLDo28gZGUgY2FkYSBlc3RpbWFkb3IgKGJldGEwLCBiZXRhMSwgZGVzdmlvKQojICAtIE1haXMgZGV0YWxoZXMgZW0gaHR0cHM6Ly9ycHVicy5jb20vaHVkc29uY2hhdnMvbWF4dmVyb3NpbWlsaGFuY2EKIyAgLSBVc2Ftb3MgYSByYWl6IHF1YWRyYWRhIGRhIGRpYWdvbmFsIHByaW5jaXBhbCAKc3RhbmRhcmQuZGV2aWFuY2Uubm9ybWFsLmZpdCA8LSBzcXJ0KGRpYWcoZmlzaGVyLmluZm9ybWF0aW9uLm5vcm1hbC5maXQpKQoKIyBUYWJlbGEgY29tIG9zIHBhcsOibWV0cm9zIGVzdGltYWRvcywgZXN0YXTDrXN0aWNhIHQsIGRlc3ZpbyBwYWRyw6NvIGRvIGVzdGltYWRvciBlIHAtdmFsb3IKdC5ub3JtYWwuZml0IDwtIG5vcm1hbC5maXQkcGFyL3N0YW5kYXJkLmRldmlhbmNlLm5vcm1hbC5maXQKcHZhbHVlLm5vcm1hbC5maXQgPC0gMiooMS1wdChhYnModC5ub3JtYWwuZml0KSwgbGVuZ3RoKHgpLWxlbmd0aChub3JtYWwuZml0JHBhcikpKQpyZXN1bHRzLm5vcm1hbC5maXQgPC0gY2JpbmQobm9ybWFsLmZpdCRwYXIsIHN0YW5kYXJkLmRldmlhbmNlLm5vcm1hbC5maXQsIHQubm9ybWFsLmZpdCwgcHZhbHVlLm5vcm1hbC5maXQpCmNvbG5hbWVzKHJlc3VsdHMubm9ybWFsLmZpdCkgPC0gYygicGFyw6JtZXRyb3MiLCAiZGVzdmlvLXBhZHLDo28iLCAiZXN0YXTDrXN0aWNhIHQiLCAicC12YWxvciIpCnJvd25hbWVzKHJlc3VsdHMubm9ybWFsLmZpdCkgPC0gYygibWVkaWEiLCAiZGVzdmlvIikKcHJpbnQocmVzdWx0cy5ub3JtYWwuZml0LCBkaWdpdHMgPSAzKQpgYGAKCgo8b2wgc3RhcnQ9IjIiPgo8bGk+IDxoNT4gPGI+IFJFR1JFU1PDg08gTElORUFSIFNJTVBMRVMgPC9iPiA8L2g1PiA8L2xpPgo8L29sPgoKU3Vwb25oYSBxdWUgdm9jw6ogdGVtIHVtYSBhbW9zdHJhIGFsZWF0w7NyaWEgZGUgZHVhcyB2YXJpw6F2ZWlzICgkWV97aX0sWF97aX0kKSBkZSB0YW1hbmhvICROJCBlIGRlc2VqYSBlc3RpbWFyIHVtIG1vZGVsbyBkZSByZWdyZXNzw6NvIGxpbmVhciBzaW1wbGVzIHF1ZSByZWxhY2lvbmUgZWxhcyBkYSBzZWd1aW50ZSBmb3JtYToKCiQkCllfe2l9ID0gXGJldGFfezB9ICsgXGJldGFfezF9IFhfe2l9ICsgXHZhcmVwc2lsb25fe2l9CiQkCkFsw6ltIGRpc3NvLCBhc3N1bWEgYSBoaXDDs3Rlc2UgZGUgcXVlICRcdmFyZXBzaWxvbiBcc2ltIE4oMCx7XHNpZ21hfV57Mn0pJCBlIHF1ZSB2b2PDqiBqw6EgY29uaGVjZSBvcyB2ZXJkYWRlaXJvcyBwYXLDom1ldHJvcyBkbyBtb2RlbG8gZWNvbm9tw6l0cmljby4gU2V1IG9iamV0aXZvIMOpIGZhemVyIHVzbyBkbyAqKnByaW5jw61waW8gZGUgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhKiogcGFyYSB0ZXN0YXIgbyBxdcOjbyBzZXVzIGVzdGltYWRvcmVzIHNlIGFwcm94aW1hbSBkb3MgcGFyw6JtZXRyb3MgcG9wdWxhY2lvbmFpcyBjb25oZWNpZG9zLiBQYXJhIHRhbnRvLCB2YW1vcyBzdXBvciBxdWUgYSBlcXVhw6fDo28gcG9wdWxhY2lvbmFsIMOpOgoKJCQKWV97aX0gPSA4ICsgM1hfe2l9CiQkClVtYSB2ZXogcXVlICRZX3tpfSBcc2ltIE4oXGJldGFfezB9ICsgXGJldGFfezF9WF97aX0se1xzaWdtYX1eezJ9KSQsIHRlbW9zIHF1ZSBhIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2EgcGFyYSBvIHByb2JsZW1hIHByb3Bvc3RvIHNlcsOhOgoKJCQKTChcYmV0YV97MH0gKyBcYmV0YV97MX1YX3tpfSxcc2lnbWFeezJ9fFlfe2l9KSA9IFxwcm9kX3tpPTF9XntOfXtmKFxiZXRhX3swfSArIFxiZXRhX3sxfVhfe2l9LFxzaWdtYV57Mn18WV97aX0pfSA9IFxwcm9kX3tpPTF9XntOfVxmcmFjezF9e1xzcXJ0ezJccGl7XHNpZ21hfV57Mn19fSBleHBcbGVmdFx7LVxmcmFjezF9ezJ7XHNpZ21hfV57Mn19IHtcbGVmdCh7eX1fe2l9LVtcYmV0YV97MH0gKyBcYmV0YV97MX1YX3tpfV0gXHJpZ2h0KX1eezJ9IFxyaWdodFx9CiQkCk5vc3NvIG9iamV0aXZvIHNlcsOhIGVuY29udHJhciAkXGhhdHt7XGJldGF9X3swfX0kLCAkXGhhdHt7XGJldGF9X3sxfX0kIGUgJHtcaGF0e1xzaWdtYX19XnsyfSQgcXVlIHPDo28gb3MgcGFyw6JtZXRyb3MgYSBzZXJlbSBlc3RpbWFkb3MgcGFyYSBvIG1vZGVsbyBkZSByZWdyZXNzw6NvIGxpbmVhci4gQWJhaXhvLCBjw7NkaWdvcyBxdWUgZ2VyYW0gb3MgZGFkb3MgZSBhcGxpY2FtIG8gcHJpbmPDrXBpbyBkZSBtw6F4aW1hIHZlcm9zc2ltaWxoYW7Dp2EuCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgUFJFUEFSQVIgTyBQUk9CTEVNQSAgICAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgTmVzdGUgZXhlbXBsbyB2YW1vcyBtb3N0cmFyIGNvbW8gb2J0ZXIgb3MgcGFyw6JtZXRyb3MgZGUgdW1hIHJlZ3Jlc3PDo28gbGluZWFyIHNpbXBsZXMKIyBwb3IgbWVpbyBkbyBtw6l0b2RvIGRhIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYS4gUGFyYSBpc3NvLCB2YW1vcyBnZXJhciB1bWEgYW1vc3RyYSBkZSAKIyB5IHF1ZSDDqSBmdW7Dp8OjbyBkZSB4IGUgZGUgdW0gcnXDrWRvLiBQb3LDqW0sIGFudGVzIGRlIGdlcmFyIHkgY29tIG8gcnXDrWRvLCBzYWJlcmVtb3MgbwojIHZlcmRhZGVpcm8geSBkYWRvIHF1ZSB0ZW1vcyBvcyB2ZXJkYWRlaXJvcyBwYXLDom1ldHJvcyBwYXJhIGEgcmVncmVzc8OjbyBsaW5lYXIuCgojIDEwMDAgb2JzZXJ2YcOnw7VlcyBkZSBYIGdlcmFkYXMgYSBwYXJ0aXIgZGUgdW1hIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCBjb20gbcOpZGlhIDEwIGUgZGVzdmlvIDEKb2xzLmRhdGEueCA8LSBybm9ybShuID0gMTAwMDAsIG1lYW4gPSAxMCwgc2QgPSAxKQoKIyBQYXLDom1ldHJvcyBwb3B1bGFjaW9uYWlzIGRvIG1vZGVsbyBkZSByZWdyZXNzw6NvCmJldGEwLnRydWUgPC0gMwpiZXRhMS50cnVlIDwtIDgKCiMgMTAwMCBvYnNlcnZhw6fDtWVzIGRlIFkgZ2VyYWRvcyBhIHBhcnRpciBkb3MgcGFyw6JtZXRyb3MgcG9wdWxhY2lvbmFpcyBlIFgKdHJ1ZS55IDwtIGJldGEwLnRydWUgKyBiZXRhMS50cnVlKm9scy5kYXRhLngKCiMgMTAwMCBvYnNlcnZhw6fDtWVzIGdlcmFkYXMgYSBwYXJ0aXIgZG9zIGRhZG9zIHBvcHVsYWNpb25haXMgY29tIHVtIHRlcm1vIGRlIGVycm8gcXVlIHNlZ3VlIHVtYSAKIyBub3JtYWwgY29tIG3DqWRpYSAwIGUgZGVzdmlvIDEKbm9pc2UgPC0gcm5vcm0obiA9IDEwMDAwLCBtZWFuID0gMCwgc2QgPSAxKQpkYXRhLnkgPC0gdHJ1ZS55ICsgbm9pc2UgCgojIGZ1bsOnw6NvIGRvIG5lZ2F0aXZvIGRvIGxvZyBkYSB2ZXJvc3NpbWlsaGFuw6dhIGRhIE5vcm1hbCBwYXJhIHVtYSByZWdyZXNzw6NvIGxpbmVhcgpvbHNfbmVnX2xvZ19saWsgPC0gZnVuY3Rpb24oeSwgeCwgcGFyYW1ldHJvcyl7CiAgIyBwYXLDom1ldHJvcyBwYXJhIGEgZGlzdHJpYnVpw6fDo28gTm9ybWFsIGRlIHVtYSByZWdyZXNzw6NvIGxpbmVhcgogIGRlc3ZpbyA8LSBwYXJhbWV0cm9zWzFdCiAgYmV0YXMgPC0gcGFyYW1ldHJvc1stMV0KICBtZWRpYSA8LSBjYmluZCgxLHgpICUqJSBiZXRhcwogIG4gPC0gbGVuZ3RoKHgpCiAgIyBsb2cgZGEgdmVyb3NzaW1pbGhhbsOnYSBkYSBOb3JtYWwKICBsbCA8LSAtKG4vMikqbG9nKDIqcGkqZGVzdmlvXjIpICsgKC0xLygyKmRlc3Zpb14yKSkqc3VtKCh5LW1lZGlhKV4yKQogICMgcmV0b3JuYXIgbyBuZWdhdGl2byBwYXJhIG1pbmltaXphciBhbyBpbnbDqXMgZGUgbWF4aW1pemFyCiAgcmV0dXJuKC1sbCkKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjICBTT0xVQ0lPTkFSIE8gUFJPQkxFTUEgICMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgVW1hIHZleiBxdWUgdGVtb3MgdW1hIGZ1bsOnw6NvIHF1ZSBkZXZlIHNlciBtYXhpbWl6YWRhIGUgb3MgcGFyw6JtZXRyb3MgaW5pY2lhaXMsIHBvZGVtb3MgdXNhcgojIGEgZnVuw6fDo28gb3B0aW0gZG8gcGFjb3RlIHN0YXRzIHBhcmEgb2J0ZXIgYXMgZXN0aW1hdGl2YXMgw7N0aW1hcyBwYXJhIGEgbcOpZGlhIChhZ29yYSB1bWEgbcOpZGlhCiMgY29uZGljaW9uYWwgcXVlIMOpIGZ1bsOnw6NvIGRvIHZldG9yIGJldGEgZGUgcGFyw6JtZXRyb3MgZGEgcmVncmVzc8OjbyBsaW5lYXIgZSBhIHZhcmnDom5jaWEgcXVlIGRldmUKIyBzZXIgYSBtZXNtYSBkbyB0ZXJtbyBkZSBlcnJvKS4gCiMgLSBwYXI6IGF0cmlidXRvIHF1ZSByZWNlYmUgb3MgdmFsb3JlcyBpbmljaWFpcyBkb3MgcGFyw6JtZXRyb3MuIEEgc2VxdcOqbmNpYSDDqSBpbXBvcnRhbnRlIGFxdWksIAojIHBvaXMgZGVmaW5pbW9zIG5hIGZ1bsOnw6NvIHF1ZSBvIHByaW1laXJvIMOpIGEgbcOpZGlhIGUgbyBzZWd1bmRvIMOpIGEgdmFyacOibmNpYQojIC0gZm46IGEgZnVuw6fDo28gcXVlIGRldmUgc2VyIG1pbmltaXphZGEuIFBvciBkZWZhdWx0LCBvcHRpbSBmYXogdW1hIG1pbmltaXphw6fDo28gZSBwb3IgaXNzbwojIGRlZmluaW1vcyBvIG5lZ2F0aXZvIGRvIGxvZ2FyaXRtbyBkYSB2ZXJvc3NpbWlsaGFuw6dhIGRhZG8gcXVlIG1pbmltaXphciBvIGludmVyc28gZGUgdW1hIAojIGZ1bsOnw6NvIMOpIG8gbWVzbW8gcXVlIG1heGltaXrDoS1sYQojIC0gbWV0aG9kOiBvIGFsZ29yaXRtbyBudW3DqXJpY28gdXNhZG8gcGFyYSBzb2x1Y2lvbmFyIG8gcHJvYmxlbWEuIAojIC0gaGVzc2lhbjogc2UgcXVlcmVtb3MgKFRSVUUpIG91IG7Do28gKEZBTFNFKSBxdWUgYSBtYXRyaXogaGVzc2lhbmEgZG8gcHJvYmxlbWEgZGUgb3RpbWl6YcOnw6NvIHNlamEKIyBkaXNwb25pYmlsaXphZGEuIFBhcmEgbWFpcyBkZXRhbGhlcyB1c2UgaGVscChvcHRpbSkgb3UgZW0gaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2ZpdGRpc3RycGx1cy92aWduZXR0ZXMvT3B0aW1hbGdvLmh0bWwKb2xzLmZpdCA8LSBzdGF0czo6b3B0aW0ocGFyID0gYygxLDIsMiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBmbiA9IG9sc19uZWdfbG9nX2xpaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkYXRhLnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBvbHMuZGF0YS54LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIkJGR1MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVzc2lhbiA9IFRSVUUpCgojIHJlc3VsdGFkbzogcGFyw6JtZXRyb3MgZW5jb250cmFkb3MgcGFyYSBkZXN2aW8sIGJldGEwIGUgIGJldGExIChhIG9yZGVtIMOpIGEgbWVzbWEgZGEgZGVmaW5pZGEKIyBuYSBmdW7Dp8OjbyBvbHNfbmVnX2xvZ19saWspCm9scy5maXQkcGFyCgojIFJlc3VsdGFkbzogbWF0cml6IGhlc3NpYW5hIChjb25kacOnw6NvIGRlIHNlZ3VuZGEgb3JkZW0pLiBBcXVpLCB0ZW1vcyBxdWUgYXZhbGlhciBzZSBhIG1hdHJpegojIGhlc3NpYW5hIMOpIG5lZ2F0aXZhIGRlZmluaWRhIG91IHBvc2l0aXZhIGRlZmluaWRhIG5vcyBwb250b3MgY3LDrXRpY29zIGVuY29udHJhZG9zIG5hIGNvbmRpw6fDo28KIyBkZSBwcmltZWlyYSBvcmRlbS4gQ29tbyBlc3RhbW9zIGNvbSB1bSBwcm9ibGVtYSBkZSBtaW5pbWl6YcOnw6NvIChub3ZhbWVudGUsIGVuY29udHJhciBvcyB2YWxvcmVzIAojIHBhcmEgYSBtw6lkaWEgZSB2YXJpw6JuY2lhIHF1ZSBtaW5pbWl6YW0gbyBuZWdhdGl2byBkYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIMOpIG8gbWVzbW8gcXVlIAojIGVuY29udHJhciBvcyB2YWxvcmVzIHF1ZSBtYXhpbWl6YW0gYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhKSwgdGVtb3MgcXVlIHZlcmlmaWNhciBzZSBuYXMgCiMgcHJveGltaWRhZGVzIGRhIG1hdHJpeiBoZXNzaWFuYSBhIGZ1bsOnw6NvIMOpICJjb252ZXhhIi4gSXNzbyBzw7Mgw6kgcG9zc8OtdmVsIHNlIG9zIG1lbm9yZXMgcHJpbmNpcGFpcwojIGzDrWRlcmVzIGRhIG1hdHJpeiBoZXNzaWFuYSBzw6NvIHBvc2l0aXZvcyB0b3JuYW5kby1hIHBvc2l0aXZhIGRlZmluaWRhLiAKb2xzLmZpdCRoZXNzaWFuCgojIERldGVybWluYW50ZSBkbyBwcmltZWlybyBtZW5vciBwcmluY2lwYWwgbMOtZGVyCmRldChtYXRyaXgoZGF0YSA9IG9scy5maXQkaGVzc2lhblsxXSwgbnJvdyA9IDEsIG5jb2wgPSAxKSkKCiMgRGV0ZXJtaW5hbnRlIGRvIHNlZ3VuZG8gbWVub3IgcHJpbmNpcGFsIGzDrWRlcgpkZXQobWF0cml4KGRhdGEgPSBvbHMuZml0JGhlc3NpYW5bMToyLDE6Ml0sIG5yb3cgPSAyLCBuY29sID0gMikpCgojIERldGVybWluYW50ZSBkbyB0ZXJjZWlybyBtZW5vciBwcmluY2lwYWwgbMOtZGVyCmRldChtYXRyaXgoZGF0YSA9IG9scy5maXQkaGVzc2lhbiwgbnJvdyA9IDMsIG5jb2wgPSAzKSkKCiMgTWF0cml6IGRlIGluZm9ybWHDp8OjbyBkZSBGaXNoZXIKIyAgLSBNYWlzIGRldGFsaGVzIGVtIGh0dHBzOi8vcnB1YnMuY29tL2h1ZHNvbmNoYXZzL21heHZlcm9zaW1pbGhhbmNhCiMgIC0gT2JpZGEgcG9yICgtaGVzc2lhbmEpXigtMSkuIEEgcmF6w6NvIHBhcmEgbsOjbyBzZXIgcHJlY2lzbyBtdWx0aXBsaWNhciBhIG1hdHJpegojIGhlc3NpYW5hIHBvciAtMSDDqSBxdWUgasOhIGZpemVtb3MgYSBtaW5pbWl6YcOnw6NvIHVzYW5kbyBvIG5lZ2F0aXZvIGRhIHZlcm9zc2ltaWxoYW7Dp2EKZmlzaGVyX2luZm9ybWF0aW9uIDwtIHNvbHZlKG9scy5maXQkaGVzc2lhbikKCiMgRGVzdmlvIHBhZHLDo28gZGUgY2FkYSBlc3RpbWFkb3IgKGJldGEwLCBiZXRhMSwgZGVzdmlvKQojICAtIE1haXMgZGV0YWxoZXMgZW0gaHR0cHM6Ly9ycHVicy5jb20vaHVkc29uY2hhdnMvbWF4dmVyb3NpbWlsaGFuY2EKIyAgLSBVc2Ftb3MgYSByYWl6IHF1YWRyYWRhIGRhIGRpYWdvbmFsIHByaW5jaXBhbCAKc3RhbmRhcmRfZGV2aWFuY2UgPC0gc3FydChkaWFnKGZpc2hlcl9pbmZvcm1hdGlvbikpCgojIFRhYmVsYSBjb20gb3MgcGFyw6JtZXRyb3MgZXN0aW1hZG9zLCBlc3RhdMOtc3RpY2EgdCwgZGVzdmlvIHBhZHLDo28gZG8gZXN0aW1hZG9yIGUgcC12YWxvcgp0IDwtIG9scy5maXQkcGFyL3N0YW5kYXJkX2RldmlhbmNlCnB2YWx1ZSA8LSAyKigxLXB0KGFicyh0KSwgbGVuZ3RoKG9scy5kYXRhLngpLWxlbmd0aChvbHMuZml0JHBhcikpKQpyZXN1bHRzIDwtIGNiaW5kKG9scy5maXQkcGFyLCBzdGFuZGFyZF9kZXZpYW5jZSwgdCwgcHZhbHVlKQpjb2xuYW1lcyhyZXN1bHRzKSA8LSBjKCJwYXLDom1ldHJvcyIsICJkZXN2aW8tcGFkcsOjbyIsICJlc3RhdMOtc3RpY2EgdCIsICJwLXZhbG9yIikKcm93bmFtZXMocmVzdWx0cykgPC0gYygiZGVzdmlvIiwgImJldGEwIiwgImJldGExIikKcHJpbnQocmVzdWx0cywgZGlnaXRzID0gMykKCiMgdmFsb3IgcmVhbCBlIGFqdXN0YWRvIApiZXRhMC5lc3RpbWFkbyA8LSBvbHMuZml0JHBhclsyXQpiZXRhMS5lc3RpbWFkbyA8LSBvbHMuZml0JHBhclszXQp5LmVzdGltYWRvIDwtIGJldGEwLmVzdGltYWRvICsgYmV0YTEuZXN0aW1hZG8qb2xzLmRhdGEueApyZXNpZHVvcyA8LSB0cnVlLnkgLSB5LmVzdGltYWRvCgojIGdyw6FmaWNvIGRvcyByZXPDrWR1b3MKcGxvdChyZXNpZHVvcywgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIG1haW4gPSAicmVzw61kdW9zIikKCiMjIyMjIwojIyMgIFBPTlRPIERFIEFURU7Dh8ODTwojIyMjIyMKCiMgTyBtw6l0b2RvIGRlIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSDDqSBiYXN0YW50ZSBzZW5zw612ZWwgYW9zIHZhbG9yZXMgaW5pY2lhaXMgdXNhZG9zIG5vIHByb2JsZW1hCiMgZGUgb3RpbWl6YcOnw6NvLCBwcmluY2lwYWxtZW50ZSBwYXJhIGFsZ3VucyBtw6l0b2RvcyBudW3DqXJpY29zLiBQZXJjZWJhIHF1ZSBzZSB2b2PDqiBhbHRlcmFyIGFwZW5hcwojIG9zIHZhbG9yZXMgaW5pY2lhaXMgcGFyYSBjKDEsMSwxKSBubyBwcm9ibGVtYSBkZSByZWdyZXNzw6NvIGxpbmVhciBzaW1wbGVzIGUgbWFudGVyIG8gbcOpdG9kbyBudW3DqXJpY28sIAojIG9zIHJlc3VsdGFkb3MgZW5jb250cmFkb3Mgc8OjbyBhbHRlcmFkb3MuIENvbW8gbsOjbyDDqSBwb3Nzw612ZWwgY29udHJvbGFyIG9zIHBvbnRvcyBpbmljaWFpcyBiZW0gY29tbwojIGEgZXNjb2hhIGRvIG3DqXRvZG8gbnVtw6lyaWNvLCBhIG1haW9yaWEgZG9zIHBhY290ZXMgZW0gUiBxdWUgZXN0aW1hbSBtb2RlbG9zIGVjb25vbcOpdHJpY29zLCBmYXplbQojIHVzbyBkZSBhbGd1bSBtw6l0b2RvIGRlIGVzdGltYcOnw6NvIGEgcHJpb3JpIChtw61uaW1vcyBxdWFkcmFkb3Mgb3JkaW7DoXJpb3MsIHBvciBleGVtcGxvKSBwYXJhIGVuY29udHJhcgojIHBhcsOibWV0cm9zIGluaWNpYWlzIGUgdXPDoS1sb3MgcG9zdGVyaW9ybWVudGUgY29tbyBwYXLDom1ldHJvcyBpbmljaWFpcyBkbyBtw6l0b2RvIGRlIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYQpgYGAKCiMjIyMgKipSRUZFUsOKTkNJQVMqKg==