Este documento tem como objetivo contribuir para o entendimento básico sobre econometria. Neste sentido, apresenta como a teoria econômica está relacionada com a econometria (modelo econômico x modelo econométrico) e como a estrutura de dados econômicos define a abordagem econométrica a ser utilizada. No que tange aos dados, os seguintes tipos são abordados:

Basicamente, trata-se de um resumo do Capítulo 1 de Wooldridge (2015) e maiores detalhes podem ser encontrados nesta referência.

TEORIA ECONÔMICA E ECONOMETRIA

Por meio da Econometria é possível avaliar empiricamente a teoria econômica e explicar fatos passados, testar hipóteses, prever resultados de políticas ou eventos futuros e estimar relações entre variáveis econômicas.

Isso é viável porque, em geral, há relações de equilíbrio de longo prazo entre variáveis econômicas. Existem diversas aplicações da econometria, como por exemplo:

Neste sentido, o ecconomista pode fazer uso de diversos campos da econometria de acordo com o fundamento econômico de interesse:

A econometria evoluiu como uma disciplina relacionada com a estatística e matemática, mas com enfoque em problemas inerentes à coleta e à análise de dados econômicos não-experimentais (dados não acumulados por meio de experimentos controlados de indivíduos, firmas ou segmentos da economia)1.

MODELO ECONÔMICO X MODELO ECONOMÉTRICO

Em alguns casos, especialmente aqueles que envolvem o teste de teorias econômicas, constrói-se um modelo econômico formal. Um modelo econômico consiste em equações matemáticas que descrevem várias relações.

Como exemplo, imagine que você seja contratado pelo governo do seu Estado para avaliar a eficácia de um programa de treinamento financiado com recursos públicos com as seguintes características:

Você deve determinar qual o efeito, se houver, do programa de treinamento sobre o salário-hora de cada trabalhador. Qual seria o modelo econômico para este problema?

\[ salárioh = f\left(educ,exper,treina \right) \] onde:

Hipótese: Os trabalhadores são pagos de acordo com sua produtividade.

Um modelo econométrico para o exemplo anterior seria:

\[ salárioh_{i} ={\beta}_{0}+{\beta}_{1}educ_{i}+{\beta}_{2}exper_{i}+{\beta}_{3}treina_{i}+\varepsilon_{i} \]

em que o termo \(\varepsilon_{i}\) para \(i=1,...n\) contém fatores não observados, mas que podem influenciar a produtividade, tais como:

Objetivo: Testar hipótese sobre o parâmetro \({\beta}_{3}\). Exemplo: ele é diferente de zero?

ESTRUTURA DE DADOS ECONÔMICOS

Os dados econômicos apresentam-se em uma variedade de tipos. Embora alguns métodos econométricos possam ser aplicados com pouca ou nenhuma modificação para muitos tipos diferentes de informações, as características especiais de alguns dados devem ser consideradas ou deveriam ser exploradas. Descreveremos a seguir as estruturas de dados mais importantes encontradas nos trabalhos aplicados.

CORTE TRANSVERSAL

Um conjunto de dados de corte transversal consiste em uma amostra de indivíduos, consumidores, empresas, cidades, estados, países ou uma variedade de outras unidades, tomada em um determinado ponto no tempo.

Características importantes deste tipo de dado:

  • Não podemos considerar que eles foram obtidos por uma amostra aleatória;
  • Os dados das unidades não precisam corresponder ao mesmo período;
  • A ordenação dos dados não importa para a análise econométrica

Os dados de corte transversal são amplamente usados em economia e em outras ciências sociais. Em economia, a análise de dados de corte transversal está intimamente alinhada com campos da microeconomia aplicada, tais como economia do trabalho, finanças públicas estaduais e locais, organização industrial, economia urbana, demografia e economia da saúde.

A tabela abaixo apresenta uma amostra de um conjunto de dados de corte transversal para o ano de 1976, de 526 trabalhadores. As variáveis são:

  • wage: salário hora
  • educ: anos de educação formal
  • exper: anos de experiência no mercado de trabalho
  • female: indicador de gênero
  • married: indicador de estado civil
  • tenure: anos com o empregador atual



wage educ exper female married tenure
3 11 2 1 0 0
3 12 22 1 1 2
3 11 2 0 0 0
6 8 44 0 1 28
5 12 7 0 1 2
9 16 9 0 1 8
11 18 15 0 0 7
5 12 5 1 0 3
4 12 26 1 0 4
18 17 22 0 1 21
6 16 8 1 0 2
8 13 3 1 0 0
9 12 15 0 1 0
6 12 18 0 0 3
22 12 31 0 1 15
17 16 14 0 1 0
8 12 10 1 1 0
11 13 16 1 0 10
4 12 13 1 1 0
4 12 36 1 1 6
7 12 11 1 0 4
8 12 29 0 1 13
6 16 9 1 0 9
1 12 3 1 0 1
6 11 37 1 0 8
10 16 3 0 1 3
8 16 11 0 1 10
12 16 31 0 1 0
12 15 30 0 1 0
3 8 9 1 1 1
13 14 23 0 1 5
4 14 2 1 0 5
10 13 16 1 0 16
5 12 7 1 0 3
5 12 3 1 0 0
4 16 22 1 1 4
6 12 15 1 1 6
4 4 39 0 1 15
3 14 3 1 1 3
6 12 11 1 0 0
8 12 3 1 1 0
10 12 20 1 1 5
4 14 16 1 1 0
4 11 45 1 1 12
6 13 11 1 0 4
14 15 20 0 1 13
2 10 1 0 0 0
3 12 36 1 1 2
4 14 9 0 0 2
3 12 15 1 1 1
2 12 18 1 0 0
9 16 3 1 0 2
5 12 15 0 1 5
6 12 7 0 1 7
2 12 2 0 0 0
3 15 3 0 0 0
3 16 1 1 0 1
10 8 13 0 0 0
22 18 8 1 0 8
4 16 7 0 0 0
12 13 40 1 0 20
12 14 42 0 0 5
6 10 36 0 0 8
4 10 13 1 0 0
8 14 9 0 0 3
20 14 26 0 1 23
6 16 7 1 1 4
10 12 25 0 1 3
6 16 10 0 1 5
2 12 3 1 0 2
6 16 3 1 0 0
13 17 17 0 1 2
5 12 17 0 1 8
3 12 20 1 1 34
4 12 7 1 1 0
12 13 24 0 1 19
4 12 28 1 1 0
3 12 2 1 0 1
8 12 19 0 1 13
7 18 13 0 1 0
4 9 22 0 1 5
5 16 3 0 0 1
3 10 4 1 0 0
7 12 7 0 0 5
4 12 6 1 0 2
3 12 13 1 1 3
3 12 14 1 1 0
8 12 14 1 0 4
10 8 40 0 1 24
8 12 11 0 1 7
6 12 14 0 1 6
12 14 40 0 1 39
3 12 1 1 0 0
5 12 2 1 0 0
6 12 4 1 0 1
4 9 19 1 1 1
4 13 1 0 0 0
13 12 34 0 1 22
4 14 5 0 1 2
4 12 3 0 0 0
5 15 6 1 0 6
4 12 14 1 1 0
4 12 35 1 1 12
8 12 8 1 0 4
15 14 7 0 1 7
7 15 11 1 1 3
13 12 14 0 1 11
7 12 35 0 0 10
3 12 46 1 0 0
10 17 7 0 1 0
3 11 45 0 1 12
25 18 29 0 1 25
5 12 6 0 1 3
6 14 15 0 1 0
4 14 33 1 1 16
4 10 15 0 0 0
4 14 5 1 1 0
4 12 7 0 0 2
4 15 6 0 1 1
3 8 33 1 1 12
5 16 2 1 1 1
5 14 4 1 1 0
3 15 1 0 0 0
3 12 29 1 0 0
4 18 17 0 1 3
6 16 17 1 1 3
5 10 36 1 1 3
2 8 31 0 0 30
3 10 23 1 0 2
5 11 13 0 1 1
9 18 3 0 1 3
5 15 15 0 0 0
4 12 48 0 1 1
3 11 6 1 0 0
4 12 12 0 1 0
2 12 5 1 0 0
5 14 19 0 1 5
10 16 9 0 1 3
4 2 39 0 1 13
10 14 28 1 1 11
11 16 23 0 1 20
8 12 2 0 0 0
5 12 15 1 0 1
6 13 5 1 1 0
4 12 18 1 0 2
3 15 2 1 0 2
2 10 3 1 0 0
4 12 31 1 1 4
12 16 20 1 1 5
2 13 34 1 1 15
2 9 5 0 0 0
4 12 11 0 0 0
6 13 31 0 0 3
6 12 8 1 1 5
3 12 2 1 0 2
10 14 18 0 1 5
7 16 3 0 1 0
10 16 3 0 1 2
2 9 4 1 0 1
7 18 4 0 0 4
3 10 1 0 0 0
3 10 1 1 0 0
8 13 28 0 1 5
4 12 47 1 1 4
9 18 13 1 0 1
2 13 2 1 0 6
5 12 48 1 1 2
6 13 6 1 1 5
6 13 8 0 1 0
15 13 25 0 1 21
15 18 13 1 0 7
12 12 8 0 0 1
5 12 19 1 1 10
2 13 1 1 0 4
7 12 43 1 0 5
6 12 19 1 1 9
9 12 11 1 1 5
10 14 43 0 1 4
6 10 44 0 1 3
4 12 22 1 1 11
9 16 3 0 1 2
7 16 3 1 0 2
8 12 41 1 0 11
5 14 5 0 0 0
5 12 14 1 0 11
22 12 24 0 1 16
9 12 28 0 1 8
3 12 25 0 1 8
4 12 3 0 0 0
5 12 11 0 1 0
4 12 7 1 1 6
6 16 9 0 1 2
4 16 5 0 1 0
6 14 9 1 1 3
3 11 1 1 0 0
6 16 2 1 0 1
6 12 13 1 1 0
9 12 10 0 1 2
10 17 5 0 1 3
11 12 30 0 1 8
7 12 31 0 1 19
9 16 1 0 0 2
10 8 9 0 1 0
3 12 10 1 1 0
3 12 38 1 1 0
6 12 19 1 1 6
4 16 5 1 1 0
8 12 26 0 1 2
6 12 35 1 0 12
3 9 2 1 0 0
3 13 1 1 0 2
3 16 19 1 1 10
3 14 3 1 0 2
7 8 36 0 1 24
8 14 29 0 1 24
4 13 1 0 0 2
8 12 38 1 1 3
4 18 1 0 0 2
3 9 29 0 1 0
6 8 36 1 1 15
4 8 4 0 0 0
3 12 45 1 1 4
4 14 22 1 0 3
4 12 20 1 1 4
6 16 5 0 1 0
3 8 15 1 1 2
6 13 10 1 1 2
3 9 3 1 0 0
23 16 16 0 1 7
9 12 38 0 1 1
8 15 33 0 1 26
3 11 2 0 0 0
6 14 6 0 1 5
7 12 19 0 1 3
10 12 29 0 1 0
3 12 2 0 0 0
4 18 3 1 0 1
3 12 4 0 0 0
4 12 10 1 0 1
3 12 4 1 0 0
3 12 14 1 0 10
3 12 15 1 1 5
5 12 19 0 1 0
3 14 17 1 1 0
18 16 29 0 1 7
4 12 2 1 0 0
4 14 5 0 0 0
2 11 38 1 0 3
4 12 3 1 0 0
3 10 47 0 0 0
6 12 7 0 1 6
5 6 47 0 1 13
4 13 23 1 0 2
4 12 12 0 1 3
3 10 11 1 0 0
11 12 25 0 0 23
4 14 6 1 1 0
3 13 3 0 0 1
6 12 14 0 1 7
18 18 13 1 0 0
4 12 9 0 0 0
3 12 1 0 0 0
4 12 6 1 1 0
3 12 11 1 1 1
9 12 47 0 1 44
3 8 49 1 0 6
6 13 37 1 1 17
4 13 2 1 0 0
5 14 7 1 1 0
6 12 22 0 0 8
3 10 8 1 0 0
6 16 1 0 1 1
4 12 43 1 1 6
6 16 2 0 0 2
4 12 2 1 0 1
3 14 1 0 0 3
4 18 1 0 0 0
19 17 26 0 1 20
4 13 1 1 0 1
5 14 37 1 1 7
6 15 12 1 1 4
3 14 41 0 1 23
9 12 24 0 0 1
8 8 38 0 0 26
4 12 18 1 1 0
3 12 26 0 1 1
5 8 45 0 0 2
6 12 27 0 1 0
2 9 2 0 0 0
5 12 41 0 1 8
6 16 11 0 1 4
3 12 5 1 1 0
5 16 3 1 0 1
4 12 3 1 0 2
3 12 4 0 1 0
6 13 21 0 1 13
4 10 34 1 1 26
4 6 49 0 1 6
7 12 6 0 1 5
3 12 26 1 1 9
6 16 9 0 0 0
9 12 23 0 1 9
3 8 33 0 1 2
4 12 5 1 1 2
3 6 49 0 1 7
3 4 48 0 1 0
6 11 35 0 1 31
4 11 23 1 0 2
3 7 26 1 0 1
3 12 16 1 1 0
8 18 23 1 1 3
3 12 36 1 1 8
5 16 4 0 0 0
6 12 10 0 1 0
4 14 18 0 1 2
3 12 3 0 0 1
3 10 7 1 1 0
5 10 7 0 0 7
4 9 33 1 0 2
4 10 34 0 1 12
4 12 8 1 1 0
3 12 17 1 1 1
3 12 2 1 0 0
5 10 5 1 0 0
14 16 41 0 1 16
18 16 35 0 1 28
6 16 11 0 0 4
5 12 4 0 0 0
5 12 12 1 1 3
3 7 35 1 0 0
3 8 33 0 1 0
8 16 8 0 1 6
6 16 2 0 0 0
12 18 8 0 1 10
4 13 29 1 1 1
4 10 14 0 1 5
7 16 26 1 1 3
6 14 11 1 1 3
12 16 10 0 0 2
4 12 13 0 1 0
3 9 23 1 1 20
3 11 1 0 0 2
15 11 35 0 1 31
4 12 5 0 1 2
5 11 13 0 1 11
4 12 22 0 1 3
3 12 21 1 1 9
5 12 19 1 1 0
4 12 13 0 0 0
5 14 15 0 1 5
5 14 3 0 1 0
12 18 6 0 0 2
3 12 6 1 1 5
5 12 16 1 0 1
10 12 31 0 1 2
3 11 1 1 0 0
5 12 5 0 0 2
6 17 3 0 1 0
8 16 11 0 1 0
4 13 6 1 1 7
4 13 11 1 1 3
4 12 7 1 1 2
4 14 5 0 1 0
3 14 5 1 1 4
3 11 2 0 0 2
5 10 44 0 1 7
4 8 44 0 1 25
4 14 13 1 1 0
3 12 26 1 1 15
3 10 2 1 0 1
6 17 10 0 1 3
3 9 2 1 0 0
4 12 35 1 1 0
3 12 6 1 1 5
6 14 8 0 1 1
5 16 1 0 0 0
7 12 14 0 1 10
9 10 14 0 1 6
4 0 22 1 0 10
4 14 8 1 1 4
11 15 1 1 0 4
3 16 15 1 1 5
9 12 14 0 1 12
4 11 37 0 1 10
3 11 1 1 0 1
9 12 4 0 1 4
4 13 29 1 1 0
3 12 45 1 1 8
3 13 22 1 0 0
6 16 42 0 0 10
3 15 9 0 0 0
4 16 8 1 1 0
6 15 31 1 0 15
10 12 24 0 1 24
12 18 16 0 1 5
4 6 6 0 0 0
3 6 14 1 0 0
4 12 47 1 1 25
11 12 34 0 1 5
8 16 6 1 1 2
4 9 7 1 1 4
5 12 27 0 1 2
5 11 24 0 1 5
3 10 18 1 1 0
8 12 12 1 0 3
8 8 27 0 1 3
3 9 49 1 0 0
6 17 4 1 0 0
6 16 24 1 1 2
5 11 3 0 0 0
4 10 2 1 0 0
4 8 29 0 1 11
7 13 34 0 1 21
5 14 10 0 1 3
3 13 5 1 0 0
3 11 2 1 0 0
6 7 39 0 1 21
4 16 5 1 0 2
3 12 14 1 1 2
7 13 8 0 0 2
6 14 10 1 1 1
6 16 2 0 1 2
9 14 9 0 1 3
3 11 1 0 0 0
3 8 45 1 1 1
3 14 33 1 1 3
12 17 21 0 1 18
3 10 2 1 0 0
3 12 9 0 1 1
6 12 33 0 1 2
10 18 16 0 1 2
4 14 10 0 1 0
10 18 9 0 0 8
4 12 8 1 1 1
9 16 9 0 1 1
9 14 23 1 1 0
6 12 23 0 1 8
4 9 22 0 0 18
3 12 37 1 1 0
20 12 22 0 1 4
11 17 28 0 1 25
4 12 14 1 0 0
6 15 19 1 1 4
14 17 10 0 1 9
6 16 25 0 1 0
4 12 21 1 1 0
3 15 32 0 1 0
4 16 21 0 1 10
7 12 36 1 0 0
9 15 2 0 1 2
3 12 11 1 1 0
3 12 40 1 0 2
2 12 11 1 1 1
6 12 9 1 1 7
8 16 23 0 0 4
3 11 1 1 0 0
3 14 30 0 0 13
6 14 41 0 1 33
4 13 6 1 0 0
6 14 11 0 1 0
4 12 43 1 1 17
4 12 39 1 1 2
3 8 50 1 0 24
4 12 26 1 1 20
3 3 51 0 0 30
4 11 3 0 0 9
3 15 3 1 1 1
6 11 15 0 1 9
8 12 17 0 1 6
3 4 36 0 1 0
5 9 31 0 1 9
6 12 9 0 1 4
3 12 42 1 1 10
3 11 3 1 0 0
4 12 37 1 1 14
18 16 23 0 1 22
8 13 21 0 0 5
9 15 11 0 1 12
12 16 35 0 1 13
3 12 42 1 1 0
4 12 3 0 0 0
4 12 13 0 1 0
4 9 14 0 1 7
6 10 14 0 1 11
3 12 39 1 1 1
6 11 11 0 1 8
2 8 28 0 1 3
5 6 18 1 1 0
8 16 6 0 1 2
3 12 26 1 0 1
6 12 21 0 1 6
5 16 34 0 1 2
3 12 17 1 0 2
2 10 2 1 0 0
3 13 5 1 0 0
3 13 1 1 0 0
12 14 40 0 1 30
5 16 39 1 0 21
3 10 1 0 0 1
7 12 14 0 1 5
3 12 2 1 0 2
2 11 2 0 0 1
3 0 42 1 1 0
3 5 34 1 1 0
18 16 10 0 1 3
6 16 4 0 1 3
3 9 4 0 0 0
7 15 21 1 1 3
4 12 31 1 0 3
6 12 20 0 1 14
3 12 36 1 0 1
4 13 7 0 1 0
10 12 15 0 0 0
5 7 25 0 1 17
9 17 7 1 1 0
1 12 17 1 1 0
3 12 3 0 0 1
9 14 12 0 1 11
8 12 18 0 1 5
5 13 47 0 1 1
6 12 2 0 0 0
15 16 14 1 1 2
2 10 2 1 0 0
5 15 13 0 1 18
12 16 5 0 1 1
4 14 5 1 0 4



Para este tipo de dados uma possível abordagem é o uso de Regressão Linear Múltipla e o modelo a ser estimado seria:

\[ wage_{i} = \beta_{0}+\beta_{1}educ_{i}+\beta_{2}exper_{i}+\beta_{3}female_{i}+\beta_{4}married_{i}+\beta_{4}tenure_{i}+\varepsilon_{i} \]

onde \(\varepsilon_{i}\) é uma variável aleatória com média zero, \(E\left(\varepsilon_{t}\right)=0\), e variância constante, \(Var\left(\varepsilon_{i}\right)=\sigma^{2}\).

SÉRIE TEMPORAL

Um conjunto de séries temporais consiste em observações sobre uma variável ou muitas variáveis ao longo do tempo. Exemplos de dados de séries temporais incluem preços de ações, oferda de moeda, índice de preços ao consumidor, produto interno bruto, taxas anuais de homicídios e números de automóveis vendidos.

Características importantes deste tipo de dado:

  • Eventos passados podem influenciar eventos futuros;
  • A ordenação cronológica das observações transmite informações importantes.

Nos gráficos abaixo temos como exemplo a série temporal do fechamento do IBOVESPA bem como a série temporal dos retornos deste índice. Note que há relação temporal nos dados (mais notável no gráfico dos retornos).



Para este tipo de dado a relação linear entre a observação presente e valores passados da série temporal pode contribuir para o modelo a ser estimado. Tal comportamento também pode ser observado entre duas ou mais séries temporais.

Neste sentido, o objetivo da econometria de séries temporais é apresentar como modelar cada um destes casos e será o que aprenderemos neste curso.

DADOS EM PAINEL

Um conjunto de dados em painel consiste de em uma série temporal para cada registro de corte transversal. Como exemplo, suponha que tenhamos o histórico de salário, educação e emprego para um conjunto de indivíduos ao longo de um período de dez anos.

As características importantes deste tipo de dado são:

  • As mesmas unidades de corte transversal são acompanhadas ao longo de um determinado período;
  • A ordenação no corte transversal de um conjunto de dados em painel não é importante.

A tabela abaixo apresenta uma amostra de um conjunto de dados de painel de 11 grandes empresas dos EUA ao longo de 20 anos (1935–1954). As variáveis são:

  • firm: o identificador da firma
  • year: o ano de coleta da observação para a firma
  • inv: investimento bruto da firma
  • value: valor de capital da firma
  • capital: estoque da firma (plantas e equipamentos)
firm year inv value capital
1 1935 317.6 3078.5 2.8
1 1936 391.8 4661.7 52.6
1 1937 410.6 5387.1 156.9
1 1938 257.7 2792.2 209.2
1 1939 330.8 4313.2 203.4
1 1940 461.2 4643.9 207.2
1 1941 512.0 4551.2 255.2
1 1942 448.0 3244.1 303.7
1 1943 499.6 4053.7 264.1
1 1944 547.5 4379.3 201.6
1 1945 561.2 4840.9 265.0
1 1946 688.1 4900.9 402.2
1 1947 568.9 3526.5 761.5
1 1948 529.2 3254.7 922.4
1 1949 555.1 3700.2 1020.1
1 1950 642.9 3755.6 1099.0
1 1951 755.9 4833.0 1207.7
1 1952 891.2 4924.9 1430.5
1 1953 1304.4 6241.7 1777.3
1 1954 1486.7 5593.6 2226.3
2 1935 209.9 1362.4 53.8
2 1936 355.3 1807.1 50.5
2 1937 469.9 2676.3 118.1
2 1938 262.3 1801.9 260.2
2 1939 230.4 1957.3 312.7
2 1940 361.6 2202.9 254.2
2 1941 472.8 2380.5 261.4
2 1942 445.6 2168.6 298.7
2 1943 361.6 1985.1 301.8
2 1944 288.2 1813.9 279.1
2 1945 258.7 1850.2 213.8
2 1946 420.3 2067.7 132.6
2 1947 420.5 1796.7 264.8
2 1948 494.5 1625.8 306.9
2 1949 405.1 1667.0 351.1
2 1950 418.8 1677.4 357.8
2 1951 588.2 2289.5 342.1
2 1952 645.5 2159.4 444.2
2 1953 641.0 2031.3 623.6
2 1954 459.3 2115.5 669.7



Para este tipo de dados uma possível abordagem é o uso da microeconometria por meio de modelos econométricos de dados em painel. O modelo a ser estimado seria:

\[ inv_{it} = \beta_{0it}+\beta_{1it}value_{it}+\beta_{2it}capital_{it}+\varepsilon_{it} \]

onde \(i=1,...,n\) é o índice da unidade de corte transversal e \(t=1,...,T\) o índice de tempo. Este modelo é muito geral e não é estimável quando existem mais parâmetros do que observações. Restrições adicionais deem ser colocadas na forma pela qual \(\beta_{0it}\) e os demais betas variam para cada \(i\) e \(t\) além do comportamento do termo de erro \(\varepsilon_{it}\). O objetivo da microeconometria é tratar estas diferenças e apresentar métodos de estimação para cada caso.

REFERÊNCIAS

Tsay, Ruey S. 2014. An Introduction to Analysis of Financial Data with R. John Wiley & Sons.

Wooldridge, Jeffrey M. 2015. Introductory Econometrics - A Modern Approach. Nelson Education.


  1. Por outro lado, dados experimentais são frequentemente coletados em ambientes de laboratório.

LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPiBJbnRyb2R1w6fDo28gw6AgRWNvbm9tZXRyaWEgPC9iPiA8L2gyPiA8L2NlbnRlcj4gCmF1dGhvcjogPGNlbnRlcj4gSHVkc29uIENoYXZlcyBDb3N0YSA8L2NlbnRlcj4KZ3JhcGhpY3M6IHllcwpsaW5rY29sb3I6IGJsdWUKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGNlcnVsZWFuCiAgICBmaWdfY2FwdGlvbjogeWVzCnJlZmVyZW5jZXM6Ci0gaWQ6IHdvb2xkcmlkZ2UyMDE1aW50cm9kdWN0b3J5CiAgdGl0bGU6IEludHJvZHVjdG9yeSBlY29ub21ldHJpY3MgLSBBIG1vZGVybiBhcHByb2FjaAogIGF1dGhvcjoKICAtIGZhbWlseTogV29vbGRyaWRnZQogICAgZ2l2ZW46IEplZmZyZXkgTQogIHB1Ymxpc2hlcjogTmVsc29uIEVkdWNhdGlvbgogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE1Ci0gaWQ6IHRzYXkyMDE0aW50cm9kdWN0aW9uCiAgdGl0bGU6IEFuIGludHJvZHVjdGlvbiB0byBhbmFseXNpcyBvZiBmaW5hbmNpYWwgZGF0YSB3aXRoIFIKICBhdXRob3I6IAogIC0gZmFtaWx5OiBUc2F5CiAgICBnaXZlbjogUnVleSBTCiAgcHVibGlzaGVyOiBKb2huIFdpbGV5ICYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE0Cm5vY2l0ZTogfCAKICBAd29vbGRyaWRnZTIwMTVpbnRyb2R1Y3RvcnksIEB0c2F5MjAxNGludHJvZHVjdGlvbgotLS0KCkVzdGUgZG9jdW1lbnRvIHRlbSBjb21vIG9iamV0aXZvIGNvbnRyaWJ1aXIgcGFyYSBvIGVudGVuZGltZW50byBiw6FzaWNvIHNvYnJlIGVjb25vbWV0cmlhLiBOZXN0ZSBzZW50aWRvLCBhcHJlc2VudGEgY29tbyBhIHRlb3JpYSBlY29uw7RtaWNhIGVzdMOhIHJlbGFjaW9uYWRhIGNvbSBhIGVjb25vbWV0cmlhIChtb2RlbG8gZWNvbsO0bWljbyB4IG1vZGVsbyBlY29ub23DqXRyaWNvKSBlIGNvbW8gYSBlc3RydXR1cmEgZGUgZGFkb3MgZWNvbsO0bWljb3MgZGVmaW5lIGEgYWJvcmRhZ2VtIGVjb25vbcOpdHJpY2EgYSBzZXIgdXRpbGl6YWRhLiBObyBxdWUgdGFuZ2UgYW9zIGRhZG9zLCBvcyBzZWd1aW50ZXMgdGlwb3Mgc8OjbyBhYm9yZGFkb3M6CgoqIENvcnRlIFRyYW5zdmVyc2FsCiogU8OpcmllIFRlbXBvcmFsCiogRGFkb3MgZW0gUGFpbmVsCgpCYXNpY2FtZW50ZSwgdHJhdGEtc2UgZGUgdW0gcmVzdW1vIGRvIENhcMOtdHVsbyAxIGRlIEB3b29sZHJpZGdlMjAxNWludHJvZHVjdG9yeSBlIG1haW9yZXMgZGV0YWxoZXMgcG9kZW0gc2VyIGVuY29udHJhZG9zIG5lc3RhIHJlZmVyw6puY2lhLgoKIyMjIyMgKipURU9SSUEgRUNPTsOUTUlDQSBFIEVDT05PTUVUUklBKioKClBvciBtZWlvIGRhIEVjb25vbWV0cmlhIMOpIHBvc3PDrXZlbCBhdmFsaWFyIGVtcGlyaWNhbWVudGUgYSB0ZW9yaWEgZWNvbsO0bWljYSBlICoqZXhwbGljYXIgZmF0b3MgcGFzc2Fkb3MsIHRlc3RhciBoaXDDs3Rlc2VzLCBwcmV2ZXIgcmVzdWx0YWRvcyBkZSBwb2zDrXRpY2FzIG91IGV2ZW50b3MgZnV0dXJvcyBlIGVzdGltYXIgcmVsYcOnw7VlcyBlbnRyZSB2YXJpw6F2ZWlzIGVjb27DtG1pY2FzKiouCgpJc3NvIMOpIHZpw6F2ZWwgcG9ycXVlLCBlbSBnZXJhbCwgKipow6EgcmVsYcOnw7VlcyBkZSBlcXVpbMOtYnJpbyBkZSBsb25nbyBwcmF6byBlbnRyZSB2YXJpw6F2ZWlzIGVjb27DtG1pY2FzKiouIEV4aXN0ZW0gZGl2ZXJzYXMgYXBsaWNhw6fDtWVzIGRhIGVjb25vbWV0cmlhLCBjb21vIHBvciBleGVtcGxvOgoKKiBBIHByZXZpc8OjbyBkZSBpbXBvcnRhbnRlcyB2YXJpw6F2ZWlzIG1hY3JvZWNvbsO0bWljYXMsIHRhaXMgY29tbyB0YXhhcyBkZSBqdXJvcywgdGF4YSBkZSBpbmZsYcOnw6NvIGUgcHJvZHV0byBpbnRlcm5vIGJydXRvIChQSUIpOwoqIEVzdHVkYXIgbyBlZmVpdG8gZGUgZ2FzdG9zIHDDumJsaWNvcyBjb20gZXNjb2xhcyBzb2JyZSBvIGRlc2VtcGVuaG8gZGUgZXN0dWRhbnRlczsKKiBBdmFsaWFyIGNvbW8gbyBQSUIsIGNvbnN1bW8sIGludmVzdGltZW50byBlIGdhc3RvcyBnb3Zlcm5hbWVudGFpcyBzw6NvIGRldGVybWluYWRvcyBzaW11bHRhbmVhbWVudGUgbm8gY3VydG8gcHJhem8uIAoKTmVzdGUgc2VudGlkbywgbyBlY2Nvbm9taXN0YSBwb2RlIGZhemVyIHVzbyBkZSBkaXZlcnNvcyBjYW1wb3MgZGEgZWNvbm9tZXRyaWEgZGUgYWNvcmRvIGNvbSBvIGZ1bmRhbWVudG8gZWNvbsO0bWljbyBkZSBpbnRlcmVzc2U6CgoqIEVjb25vbWV0cmlhIGLDoXNpY2EgKHJlZ3Jlc3PDo28gbGluZWFyIG3Dumx0aXBsYSwgLi4uKQoqIEVjb25vbWV0cmlhIGRlIHPDqXJpZXMgdGVtcG9yYWlzIChBUiwgTUEsIEFSTUEsIEFSSU1BLCBBUkNILCBHQVJDSCwgVkFSLCBWRUMsIC4uLikKKiBFY29ub21ldHJpYSBuw6NvLXBhcmFtw6l0cmljYSAocmVncmVzc8OjbyBuw6NvLXBhcmFtw6l0cmljYSwgLi4uLikKKiBNaWNyb2Vjb25vbWV0cmlhIChkYWRvcyBlbSBwYWluZWwsIC4uLikKKiBNYWNyb2Vjb25vbWV0cmlhIChEU0dFLCBEU0dFLVZBUiwgVkFSLCBWRUMsIC4uLikKCkEgZWNvbm9tZXRyaWEgZXZvbHVpdSBjb21vIHVtYSBkaXNjaXBsaW5hIHJlbGFjaW9uYWRhIGNvbSBhIGVzdGF0w61zdGljYSBlIG1hdGVtw6F0aWNhLCBtYXMgY29tIGVuZm9xdWUgZW0gcHJvYmxlbWFzIGluZXJlbnRlcyDDoCBjb2xldGEgZSDDoCBhbsOhbGlzZSBkZSAqKmRhZG9zIGVjb27DtG1pY29zIG7Do28tZXhwZXJpbWVudGFpcyoqIChkYWRvcyBuw6NvIGFjdW11bGFkb3MgcG9yIG1laW8gZGUgZXhwZXJpbWVudG9zIGNvbnRyb2xhZG9zIGRlIGluZGl2w61kdW9zLCBmaXJtYXMgb3Ugc2VnbWVudG9zIGRhIGVjb25vbWlhKVteMV0uCgpbXjFdOiBQb3Igb3V0cm8gbGFkbywgKipkYWRvcyBleHBlcmltZW50YWlzKiogc8OjbyBmcmVxdWVudGVtZW50ZSBjb2xldGFkb3MgZW0gYW1iaWVudGVzIGRlIGxhYm9yYXTDs3Jpby4KCiMjIyMjICoqTU9ERUxPIEVDT07DlE1JQ08gWCBNT0RFTE8gRUNPTk9Nw4lUUklDTyoqCgpFbSBhbGd1bnMgY2Fzb3MsIGVzcGVjaWFsbWVudGUgYXF1ZWxlcyBxdWUgZW52b2x2ZW0gbyB0ZXN0ZSBkZSB0ZW9yaWFzIGVjb27DtG1pY2FzLCBjb25zdHLDs2ktc2UgdW0gKiptb2RlbG8gZWNvbsO0bWljbyoqIGZvcm1hbC4gVW0gbW9kZWxvIGVjb27DtG1pY28gY29uc2lzdGUgZW0gZXF1YcOnw7VlcyBtYXRlbcOhdGljYXMgcXVlIGRlc2NyZXZlbSB2w6FyaWFzIHJlbGHDp8O1ZXMuIAoKQ29tbyBleGVtcGxvLCBpbWFnaW5lIHF1ZSB2b2PDqiBzZWphIGNvbnRyYXRhZG8gcGVsbyBnb3Zlcm5vIGRvIHNldSBFc3RhZG8gcGFyYSBhdmFsaWFyIGEgZWZpY8OhY2lhIGRlIHVtIHByb2dyYW1hIGRlIHRyZWluYW1lbnRvIGZpbmFuY2lhZG8gY29tIHJlY3Vyc29zIHDDumJsaWNvcyBjb20gYXMgc2VndWludGVzIGNhcmFjdGVyw61zdGljYXM6CgoqIEVzc2UgcHJvZ3JhbWEgZW5zaW5hIGFvcyB0cmFiYWxob3JlcyB2w6FyaWFzIG1hbmVpcmFzIGRlIGNvbW8gdXNhciBjb21wdXRhZG9yZXMgbm8gcHJvY2Vzc28gcHJvZHV0aXZvOwoqIE8gcHJvZ3JhbWEsIGNvbSBkdXJhw6fDo28gZGUgMjAgc2VtYW5hcywgb2ZlcmVjZSBjdXJzb3MgZm9yYSBkbyBob3LDoXJpbyBkbyBleHBlZGllbnRlOwoqIFF1YWxxdWVyIHRyYWJhbGhhZG9yIGhvcmlzdGEgZGEgcHJvZHXDp8OjbyBwb2RlIHBhcnRpY2lwYXIsIGUgYSBtYXRyw61jdWxhIGVtIHRvZG8gbyBwcm9ncmFtYSwgb3UgcGFydGUgZGVsZSwgw6kgdm9sdW50w6FyaWEuIAoKVm9jw6ogZGV2ZSBkZXRlcm1pbmFyIHF1YWwgbyBlZmVpdG8sIHNlIGhvdXZlciwgZG8gcHJvZ3JhbWEgZGUgdHJlaW5hbWVudG8gc29icmUgbyBzYWzDoXJpby1ob3JhIGRlIGNhZGEgdHJhYmFsaGFkb3IuIFF1YWwgc2VyaWEgbyBtb2RlbG8gZWNvbsO0bWljbyBwYXJhIGVzdGUgcHJvYmxlbWE/CgokJApzYWzDoXJpb2ggPSBmXGxlZnQoZWR1YyxleHBlcix0cmVpbmEgXHJpZ2h0KQokJApvbmRlOgoKKiAkc2Fsw6FyaW9oJCDDqSBvIHNhbMOhcmlvLWhvcmE7CiogJGVkdWMkIHJlcHJlc2VudGEgb3MgYW5vcyBkZSBlZHVjYcOnw6NvIGZvcm1hbDsKKiAkZXhwZXIkIHJlZmVyZS1zZSBhb3MgZGUgZXhwZXJpw6puY2lhIG5vIG1lcmNhZG8gZGUgdHJhYmFsaG87CiogJHRyZWluYSQgY29ycmVzcG9uZGUgYXMgc2VtYW5hcyBvY3VwYWRhcyBlbSB0cmVpbmFtZW50by4KCioqSGlww7N0ZXNlOioqIE9zIHRyYWJhbGhhZG9yZXMgc8OjbyBwYWdvcyBkZSBhY29yZG8gY29tIHN1YSBwcm9kdXRpdmlkYWRlLgoKVW0gbW9kZWxvIGVjb25vbcOpdHJpY28gcGFyYSBvIGV4ZW1wbG8gYW50ZXJpb3Igc2VyaWE6CgokJApzYWzDoXJpb2hfe2l9ID17XGJldGF9X3swfSt7XGJldGF9X3sxfWVkdWNfe2l9K3tcYmV0YX1fezJ9ZXhwZXJfe2l9K3tcYmV0YX1fezN9dHJlaW5hX3tpfStcdmFyZXBzaWxvbl97aX0KJCQKCmVtIHF1ZSBvIHRlcm1vICRcdmFyZXBzaWxvbl97aX0kIHBhcmEgJGk9MSwuLi5uJCBjb250w6ltIGZhdG9yZXMgbsOjbyBvYnNlcnZhZG9zLCBtYXMgcXVlIHBvZGVtIGluZmx1ZW5jaWFyIGEgcHJvZHV0aXZpZGFkZSwgdGFpcyBjb21vOgoKKiBhcHRpZMOjbyBpbmF0YTsKKiBxdWFsaWRhZGUgZGEgZWR1Y2HDp8OjbzsKKiBmb3JtYcOnw6NvIGRhIGZhbcOtbGlhCgoqKk9iamV0aXZvOioqIFRlc3RhciBoaXDDs3Rlc2Ugc29icmUgbyBwYXLDom1ldHJvICR7XGJldGF9X3szfSQuIEV4ZW1wbG86IGVsZSDDqSBkaWZlcmVudGUgZGUgemVybz8KCiMjIyMjICoqRVNUUlVUVVJBIERFIERBRE9TIEVDT07DlE1JQ09TKioKCk9zIGRhZG9zIGVjb27DtG1pY29zIGFwcmVzZW50YW0tc2UgZW0gdW1hIHZhcmllZGFkZSBkZSB0aXBvcy4gRW1ib3JhIGFsZ3VucyBtw6l0b2RvcyBlY29ub23DqXRyaWNvcyBwb3NzYW0gc2VyIGFwbGljYWRvcyBjb20gcG91Y2Egb3UgbmVuaHVtYSBtb2RpZmljYcOnw6NvIHBhcmEgbXVpdG9zIHRpcG9zIGRpZmVyZW50ZXMgZGUgaW5mb3JtYcOnw7VlcywgYXMgY2FyYWN0ZXLDrXN0aWNhcyBlc3BlY2lhaXMgZGUgYWxndW5zIGRhZG9zIGRldmVtIHNlciBjb25zaWRlcmFkYXMgb3UgZGV2ZXJpYW0gc2VyIGV4cGxvcmFkYXMuIERlc2NyZXZlcmVtb3MgYSBzZWd1aXIgYXMgZXN0cnV0dXJhcyBkZSBkYWRvcyBtYWlzIGltcG9ydGFudGVzIGVuY29udHJhZGFzIG5vcyB0cmFiYWxob3MgYXBsaWNhZG9zLgoKIyMjIyMjICoqQ09SVEUgVFJBTlNWRVJTQUwqKgoKVW0gY29uanVudG8gZGUgZGFkb3MgZGUgY29ydGUgdHJhbnN2ZXJzYWwgY29uc2lzdGUgZW0gdW1hIGFtb3N0cmEgZGUgaW5kaXbDrWR1b3MsIGNvbnN1bWlkb3JlcywgZW1wcmVzYXMsIGNpZGFkZXMsIGVzdGFkb3MsIHBhw61zZXMgb3UgdW1hIHZhcmllZGFkZSBkZSBvdXRyYXMgdW5pZGFkZXMsICoqdG9tYWRhIGVtIHVtIGRldGVybWluYWRvIHBvbnRvIG5vIHRlbXBvKiouIAoKQ2FyYWN0ZXLDrXN0aWNhcyBpbXBvcnRhbnRlcyBkZXN0ZSB0aXBvIGRlIGRhZG86CgoqIE7Do28gcG9kZW1vcyBjb25zaWRlcmFyIHF1ZSBlbGVzIGZvcmFtIG9idGlkb3MgcG9yIHVtYSBhbW9zdHJhIGFsZWF0w7NyaWE7CiogT3MgZGFkb3MgZGFzIHVuaWRhZGVzIG7Do28gcHJlY2lzYW0gY29ycmVzcG9uZGVyIGFvIG1lc21vIHBlcsOtb2RvOwoqIEEgb3JkZW5hw6fDo28gZG9zIGRhZG9zIG7Do28gaW1wb3J0YSBwYXJhIGEgYW7DoWxpc2UgZWNvbm9tw6l0cmljYQoKT3MgZGFkb3MgZGUgY29ydGUgdHJhbnN2ZXJzYWwgc8OjbyBhbXBsYW1lbnRlIHVzYWRvcyBlbSBlY29ub21pYSBlIGVtIG91dHJhcyBjacOqbmNpYXMgc29jaWFpcy4gRW0gZWNvbm9taWEsIGEgYW7DoWxpc2UgZGUgZGFkb3MgZGUgY29ydGUgdHJhbnN2ZXJzYWwgZXN0w6EgaW50aW1hbWVudGUgYWxpbmhhZGEgY29tIGNhbXBvcyBkYSBtaWNyb2Vjb25vbWlhIGFwbGljYWRhLCB0YWlzIGNvbW8gZWNvbm9taWEgZG8gdHJhYmFsaG8sIGZpbmFuw6dhcyBww7pibGljYXMgZXN0YWR1YWlzIGUgbG9jYWlzLCBvcmdhbml6YcOnw6NvIGluZHVzdHJpYWwsIGVjb25vbWlhIHVyYmFuYSwgZGVtb2dyYWZpYSBlIGVjb25vbWlhIGRhIHNhw7pkZS4gCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBQYWNvdGVzIG5lY2Vzc2FyaW9zCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZSh3b29sZHJpZGdlKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHF1YW50bW9kKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKG1hZ3JpdHRyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGRwbHlyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGhpZ2hjaGFydGVyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHBsbSkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShrYWJsZUV4dHJhKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGh0bWx0b29scykpCmBgYAoKQSB0YWJlbGEgYWJhaXhvIGFwcmVzZW50YSB1bWEgYW1vc3RyYSBkZSB1bSBjb25qdW50byBkZSBkYWRvcyBkZSBjb3J0ZSB0cmFuc3ZlcnNhbCBwYXJhIG8gYW5vIGRlIDE5NzYsIGRlIDUyNiB0cmFiYWxoYWRvcmVzLiBBcyB2YXJpw6F2ZWlzIHPDo286CgoqICoqd2FnZSoqOiBzYWzDoXJpbyBob3JhCiogKiplZHVjKio6IGFub3MgZGUgZWR1Y2HDp8OjbyBmb3JtYWwKKiAqKmV4cGVyKio6IGFub3MgZGUgZXhwZXJpw6puY2lhIG5vIG1lcmNhZG8gZGUgdHJhYmFsaG8KKiAqKmZlbWFsZSoqOiBpbmRpY2Fkb3IgZGUgZ8OqbmVybwoqICoqbWFycmllZCoqOiBpbmRpY2Fkb3IgZGUgZXN0YWRvIGNpdmlsCiogKip0ZW51cmUqKjogYW5vcyBjb20gbyBlbXByZWdhZG9yIGF0dWFsCgo8YnI+IDxicj4KCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnfQojIEV4ZW1wbG8gZGUgRGFkb3MgZGUgQ29ydGUgVHJhbnN2ZXJzYWwKZGF0YSgid2FnZTEiLCBwYWNrYWdlID0gIndvb2xkcmlkZ2UiKQp3YWdlMSAlPD4lIGRwbHlyOjptdXRhdGUod2FnZSA9IHJvdW5kKHdhZ2UsMCkpICU8PiUgCiAgZHBseXI6OnNlbGVjdCh3YWdlLGVkdWMsZXhwZXIsZmVtYWxlLG1hcnJpZWQsdGVudXJlKQprbml0cjo6a2FibGUod2FnZTEsIGFsaWduID0gImMiKSAlPiUgCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAicmVzcG9uc2l2ZSIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAga2FibGVFeHRyYTo6c2Nyb2xsX2JveChoZWlnaHQgPSAiMjAwcHgiKQpgYGAKCjxicj4gPGJyPgoKUGFyYSBlc3RlIHRpcG8gZGUgZGFkb3MgdW1hIHBvc3PDrXZlbCBhYm9yZGFnZW0gw6kgbyB1c28gZGUgUmVncmVzc8OjbyBMaW5lYXIgTcO6bHRpcGxhIGUgbyBtb2RlbG8gYSBzZXIgZXN0aW1hZG8gc2VyaWE6CgokJAp3YWdlX3tpfSA9IFxiZXRhX3swfStcYmV0YV97MX1lZHVjX3tpfStcYmV0YV97Mn1leHBlcl97aX0rXGJldGFfezN9ZmVtYWxlX3tpfStcYmV0YV97NH1tYXJyaWVkX3tpfStcYmV0YV97NH10ZW51cmVfe2l9K1x2YXJlcHNpbG9uX3tpfQokJAoKb25kZSAkXHZhcmVwc2lsb25fe2l9JCDDqSB1bWEgdmFyacOhdmVsIGFsZWF0w7NyaWEgY29tIG3DqWRpYSB6ZXJvLCAkRVxsZWZ0KFx2YXJlcHNpbG9uX3t0fVxyaWdodCk9MCQsIGUgdmFyacOibmNpYSBjb25zdGFudGUsICRWYXJcbGVmdChcdmFyZXBzaWxvbl97aX1ccmlnaHQpPVxzaWdtYV57Mn0kLgoKIyMjIyMjICoqU8OJUklFIFRFTVBPUkFMKioKClVtIGNvbmp1bnRvIGRlIHPDqXJpZXMgdGVtcG9yYWlzIGNvbnNpc3RlIGVtIG9ic2VydmHDp8O1ZXMgc29icmUgdW1hIHZhcmnDoXZlbCBvdSBtdWl0YXMgdmFyacOhdmVpcyBhbyBsb25nbyBkbyB0ZW1wby4gRXhlbXBsb3MgZGUgZGFkb3MgZGUgc8OpcmllcyB0ZW1wb3JhaXMgaW5jbHVlbSBwcmXDp29zIGRlIGHDp8O1ZXMsIG9mZXJkYSBkZSBtb2VkYSwgw61uZGljZSBkZSBwcmXDp29zIGFvIGNvbnN1bWlkb3IsIHByb2R1dG8gaW50ZXJubyBicnV0bywgdGF4YXMgYW51YWlzIGRlIGhvbWljw61kaW9zIGUgbsO6bWVyb3MgZGUgYXV0b23Ds3ZlaXMgdmVuZGlkb3MuCgpDYXJhY3RlcsOtc3RpY2FzIGltcG9ydGFudGVzIGRlc3RlIHRpcG8gZGUgZGFkbzoKCiogRXZlbnRvcyBwYXNzYWRvcyBwb2RlbSBpbmZsdWVuY2lhciBldmVudG9zIGZ1dHVyb3M7CiogQSBvcmRlbmHDp8OjbyBjcm9ub2zDs2dpY2EgZGFzIG9ic2VydmHDp8O1ZXMgdHJhbnNtaXRlIGluZm9ybWHDp8O1ZXMgaW1wb3J0YW50ZXMuCgpOb3MgZ3LDoWZpY29zIGFiYWl4byB0ZW1vcyBjb21vIGV4ZW1wbG8gYSBzw6lyaWUgdGVtcG9yYWwgZG8gZmVjaGFtZW50byBkbyBJQk9WRVNQQSBiZW0gY29tbyBhIHPDqXJpZSB0ZW1wb3JhbCBkb3MgcmV0b3Jub3MgZGVzdGUgw61uZGljZS4gTm90ZSBxdWUgaMOhIHJlbGHDp8OjbyB0ZW1wb3JhbCBub3MgZGFkb3MgKG1haXMgbm90w6F2ZWwgbm8gZ3LDoWZpY28gZG9zIHJldG9ybm9zKS4KCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nPUZBTFNFfQojIEV4ZW1wbG8gZGUgU8OpcmllIFRlbXBvcmFsCiMgdHMyID0gZ2V0U3ltYm9scygiXkJWU1AiLCBzcmMgPSAieWFob28iLCB3YXJuaW5ncyA9IEZBTFNFKQojIGhjIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAojICAgaGNfdGl0bGUodGV4dCA9ICJGZWNoYW1lbnRvIElCT1ZFU1BBIikgJT4lIAojICAgaGNfc3VidGl0bGUodGV4dCA9ICJEYWRvcyBleHRyYcOtZG9zIHVzYW5kbyBvIHBhY290ZSBxdWFudG1vZCBkbyBSIikgJT4lIAojICAgaGNfYWRkX3NlcmllcyhCVlNQWyw0XSwgaWQgPSAidHMiKQojIAojIGhjCgpib3Zlc3BhX2RheSA8LSBxdWFudG1vZDo6Z2V0U3ltYm9scygiXkJWU1AiLCBzcmMgPSAieWFob28iLCBhdXRvLmFzc2lnbj1GQUxTRSkKYm92ZXNwYV9sb2dfZGF5X3JldHVybiA8LSBQZXJmb3JtYW5jZUFuYWx5dGljczo6UmV0dXJuLmNhbGN1bGF0ZShib3Zlc3BhX2RheSRCVlNQLkNsb3NlLCBtZXRob2QgPSAiZGlzY3JldGUiKQoKaGMgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICLDjW5kaWNlIElCT1ZFU1BBIikgJT4lIAogIGhjX3N1YnRpdGxlKHRleHQgPSAiRGFkb3MgZXh0cmHDrWRvcyB1c2FuZG8gbyBwYWNvdGUgcXVhbnRtb2QgZG8gUiIpICU+JSAKICBoY19hZGRfc2VyaWVzKG5hbWUgPSAiw61uZGljZSIsIGJvdmVzcGFfZGF5JEJWU1AuQ2xvc2UsIGlkID0gInRzIiwgY29sb3IgPSAiZ3JlZW4iKQoKaGMwIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAogIGhjX3RpdGxlKHRleHQgPSAiUmV0b3Jub3MgZG8gSUJPVkVTUEEiKSAlPiUgCiAgaGNfc3VidGl0bGUodGV4dCA9ICJEYWRvcyBleHRyYcOtZG9zIHVzYW5kbyBvIHBhY290ZSBxdWFudG1vZCBkbyBSIikgJT4lIAogIGhjX2FkZF9zZXJpZXMobmFtZSA9ICJSZXRvcm5vcyIsIGJvdmVzcGFfbG9nX2RheV9yZXR1cm4sIGlkID0gInRzIiwgY29sb3IgPSAiYmx1ZSIpCgpsc3QgPC0gbGlzdChoYyxoYzApCgpod19ncmlkKGxzdCwgbmNvbCA9IDEsIHJvd2hlaWdodCA9IDUwMCkgICU+JSBicm93c2FibGUoKQpgYGAKCjxicj4gPGJyPgoKUGFyYSBlc3RlIHRpcG8gZGUgZGFkbyBhIHJlbGHDp8OjbyBsaW5lYXIgZW50cmUgYSBvYnNlcnZhw6fDo28gcHJlc2VudGUgZSB2YWxvcmVzIHBhc3NhZG9zIGRhIHPDqXJpZSB0ZW1wb3JhbCBwb2RlIGNvbnRyaWJ1aXIgcGFyYSBvIG1vZGVsbyBhIHNlciBlc3RpbWFkby4gVGFsIGNvbXBvcnRhbWVudG8gdGFtYsOpbSBwb2RlIHNlciBvYnNlcnZhZG8gZW50cmUgZHVhcyBvdSBtYWlzIHPDqXJpZXMgdGVtcG9yYWlzLiAKCk5lc3RlIHNlbnRpZG8sIG8gb2JqZXRpdm8gZGEgZWNvbm9tZXRyaWEgZGUgc8OpcmllcyB0ZW1wb3JhaXMgw6kgYXByZXNlbnRhciBjb21vIG1vZGVsYXIgY2FkYSB1bSBkZXN0ZXMgY2Fzb3MgZSBzZXLDoSBvIHF1ZSBhcHJlbmRlcmVtb3MgbmVzdGUgY3Vyc28uIAoKIyMjIyMjICoqREFET1MgRU0gUEFJTkVMKioKClVtIGNvbmp1bnRvIGRlIGRhZG9zIGVtIHBhaW5lbCBjb25zaXN0ZSBkZSBlbSB1bWEgc8OpcmllIHRlbXBvcmFsIHBhcmEgY2FkYSByZWdpc3RybyBkZSBjb3J0ZSB0cmFuc3ZlcnNhbC4gQ29tbyBleGVtcGxvLCBzdXBvbmhhIHF1ZSB0ZW5oYW1vcyBvIGhpc3TDs3JpY28gZGUgc2Fsw6FyaW8sIGVkdWNhw6fDo28gZSBlbXByZWdvIHBhcmEgdW0gY29uanVudG8gZGUgaW5kaXbDrWR1b3MgYW8gbG9uZ28gZGUgdW0gcGVyw61vZG8gZGUgZGV6IGFub3MuCgpBcyBjYXJhY3RlcsOtc3RpY2FzIGltcG9ydGFudGVzIGRlc3RlIHRpcG8gZGUgZGFkbyBzw6NvOgoKKiBBcyBtZXNtYXMgdW5pZGFkZXMgZGUgY29ydGUgdHJhbnN2ZXJzYWwgc8OjbyBhY29tcGFuaGFkYXMgYW8gbG9uZ28gZGUgdW0gZGV0ZXJtaW5hZG8gcGVyw61vZG87CiogQSBvcmRlbmHDp8OjbyBubyBjb3J0ZSB0cmFuc3ZlcnNhbCBkZSB1bSBjb25qdW50byBkZSBkYWRvcyBlbSBwYWluZWwgbsOjbyDDqSBpbXBvcnRhbnRlLiAKCkEgdGFiZWxhIGFiYWl4byBhcHJlc2VudGEgdW1hIGFtb3N0cmEgZGUgdW0gY29uanVudG8gZGUgZGFkb3MgZGUgcGFpbmVsIGRlIDExIGdyYW5kZXMgZW1wcmVzYXMgZG9zIEVVQSBhbyBsb25nbyBkZSAyMCBhbm9zICgxOTM14oCTMTk1NCkuIEFzIHZhcmnDoXZlaXMgc8OjbzoKCiogKipmaXJtKio6IG8gaWRlbnRpZmljYWRvciBkYSBmaXJtYQoqICoqeWVhcioqOiBvIGFubyBkZSBjb2xldGEgZGEgb2JzZXJ2YcOnw6NvIHBhcmEgYSBmaXJtYQoqICoqaW52Kio6IGludmVzdGltZW50byBicnV0byBkYSBmaXJtYQoqICoqdmFsdWUqKjogdmFsb3IgZGUgY2FwaXRhbCBkYSBmaXJtYQoqICoqY2FwaXRhbCoqOiBlc3RvcXVlIGRhIGZpcm1hIChwbGFudGFzIGUgZXF1aXBhbWVudG9zKQoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgRXhlbXBsbyBkZSBEYWRvcyBkZSBDb3J0ZSBUcmFuc3ZlcnNhbApkYXRhKCJHcnVuZmVsZCIsIHBhY2thZ2UgPSAicGxtIikKR3J1bmZlbGQgJTw+JSBkcGx5cjo6c2xpY2UoMTo0MEwpCmtuaXRyOjprYWJsZShHcnVuZmVsZCwgYWxpZ24gPSAiYyIpICU+JSAKICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJyZXNwb25zaXZlIiksIGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUKICBrYWJsZUV4dHJhOjpzY3JvbGxfYm94KGhlaWdodCA9ICIyMDBweCIpCgpgYGAKCjxicj4gPGJyPgoKUGFyYSBlc3RlIHRpcG8gZGUgZGFkb3MgdW1hIHBvc3PDrXZlbCBhYm9yZGFnZW0gw6kgbyB1c28gZGEgbWljcm9lY29ub21ldHJpYSBwb3IgbWVpbyBkZSBtb2RlbG9zIGVjb25vbcOpdHJpY29zIGRlIGRhZG9zIGVtIHBhaW5lbC4gTyBtb2RlbG8gYSBzZXIgZXN0aW1hZG8gc2VyaWE6CgokJAppbnZfe2l0fSA9IFxiZXRhX3swaXR9K1xiZXRhX3sxaXR9dmFsdWVfe2l0fStcYmV0YV97Mml0fWNhcGl0YWxfe2l0fStcdmFyZXBzaWxvbl97aXR9CiQkCgpvbmRlICRpPTEsLi4uLG4kIMOpIG8gw61uZGljZSBkYSB1bmlkYWRlIGRlIGNvcnRlIHRyYW5zdmVyc2FsIGUgJHQ9MSwuLi4sVCQgbyDDrW5kaWNlIGRlIHRlbXBvLiBFc3RlIG1vZGVsbyDDqSBtdWl0byBnZXJhbCBlIG7Do28gw6kgZXN0aW3DoXZlbCBxdWFuZG8gZXhpc3RlbSBtYWlzIHBhcsOibWV0cm9zIGRvIHF1ZSBvYnNlcnZhw6fDtWVzLiBSZXN0cmnDp8O1ZXMgYWRpY2lvbmFpcyBkZWVtIHNlciBjb2xvY2FkYXMgbmEgZm9ybWEgcGVsYSBxdWFsICRcYmV0YV97MGl0fSQgZSBvcyBkZW1haXMgYmV0YXMgdmFyaWFtIHBhcmEgY2FkYSAkaSQgZSAkdCQgYWzDqW0gZG8gY29tcG9ydGFtZW50byBkbyB0ZXJtbyBkZSBlcnJvICRcdmFyZXBzaWxvbl97aXR9JC4gTyBvYmpldGl2byBkYSBtaWNyb2Vjb25vbWV0cmlhIMOpIHRyYXRhciBlc3RhcyBkaWZlcmVuw6dhcyBlIGFwcmVzZW50YXIgbcOpdG9kb3MgZGUgZXN0aW1hw6fDo28gcGFyYSBjYWRhIGNhc28uCgojIyMjIyAqKlJFRkVSw4pOQ0lBUyoqCg==