Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
── Attaching packages ──────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.2.0     ✔ purrr   0.3.2
✔ tibble  2.1.3     ✔ dplyr   0.8.1
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ─────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()

Attaching package: ‘modelr’

The following object is masked from ‘package:broom’:

    bootstrap

Dados da CAPES sobre avaliação da pós-graduação

A CAPES é um órgão do MEC que tem a atribuição de acompanhar a pós-graduação na universidade brasileira. Uma das formas que ela encontrou de fazer isso e pela qual ela é bastante criticada é através de uma avaliação quantitativa a cada x anos (era 3, mudou para 4).

Usaremos dados da penúltima avaliação da CAPES:

cacc_tudo = read_projectdata()

glimpse(cacc_tudo)
Observations: 73
Variables: 31
$ Instituição                  <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS", "UNIVERSIDADE FEDERAL…
$ Programa                     <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA DA COMPUTAÇÃO (15…
$ Nível                        <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3, 3, 3, 4, 6, 3, 3, 3, …
$ Sigla                        <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FUFPI", "UFC", "UNIFOR",…
$ `Tem doutorado`              <chr> "Sim", "Sim", "Não", "Não", "Não", "Sim", "Sim", "Não", "…
$ `Docentes colaboradores`     <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00, 1.00, 6.25, 2.75, 0.7…
$ `Docentes permanentes`       <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 20.75, 16.00, 15.75, 8.…
$ `Docentes visitantes`        <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75, 0.50, 1.00, 0.50, 0.0…
$ `Resumos em conf`            <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24, 27, 4, 30, 20, 5, 14…
$ `Resumos expandidos em conf` <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, 16, 5, 25, 29, 28, 81,…
$ `Artigos em conf`            <int> 390, 284, 115, 73, 150, 269, 179, 0, 120, 92, 389, 60, 12…
$ Dissertacoes                 <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, 108, 12, 94, 108…
$ Teses                        <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0, 0, 40, 144, 0, …
$ periodicos_A1                <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 44, 0, 6, 21, 20, 93, 7…
$ periodicos_A2                <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, 23, 2, 6, 20, 15, 43, …
$ periodicos_B1                <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 32, 4, 2, 11, 29, 51, 2…
$ periodicos_B2                <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, 0, 0, 4, 1, 10, 6, 1, …
$ periodicos_B3                <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9, 0, 2, 6, 16, 20, 13, …
$ periodicos_B4                <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0, 4, 5, 1, 3, 3, 5, 3, …
$ periodicos_B5                <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 11, 0, 4, 16, 9, 29, 18…
$ periodicos_C                 <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 16, 1, 14, 28, 8, 19, 2…
$ periodicos_NA                <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14, 19, 0, 27, 26, 18, 29…
$ per_comaluno_A1              <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, 0, 0, 2, 8, 63, 1, 1, 3…
$ per_comaluno_A2              <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, 0, 0, 1, 11, 22, 0, 0, …
$ per_comaluno_B1              <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, 0, 1, 5, 18, 37, 0, 1,…
$ per_comaluno_B2              <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0, 0, …
$ per_comaluno_B3              <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, 0, 0, 1, 10, 12, 0, 0, 0…
$ per_comaluno_B4              <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, 0, 2, 0, 0, 2, 0, 2, 0, …
$ per_comaluno_B5              <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, 0, 2, 5, 3, 17, 1, 4, 5,…
$ per_comaluno_C               <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, 0, 11, 3, 8, 13, 4, 5, 2…
$ per_comaluno_NA              <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, 0, 17, 6, 7, 17, 0, 3,…

Produção e produtividade de artigos

Uma das maneiras de avaliar a produção dos docentes que a CAPES utiliza é quantificando a produção de artigos pelos docentes. Os artigos são categorizados em extratos ordenados (A1 é o mais alto), e separados entre artigos em conferências e periódicos. Usaremos para esse lab a produção em periódicos avaliados com A1, A2 e B1.

cacc = cacc_tudo %>%
  transmute(
    docentes = `Docentes permanentes`,
    producao = (periodicos_A1 + periodicos_A2 + periodicos_B1),
    produtividade = producao / docentes,
    mestrados = Dissertacoes,
    doutorados = Teses,
    tem_doutorado = tolower(`Tem doutorado`) == "sim",
    mestrados_pprof = mestrados / docentes,
    doutorados_pprof = doutorados / docentes
  )

cacc_md = cacc %>% 
  filter(tem_doutorado)

EDA

skimr::skim(cacc)
Skim summary statistics
 n obs: 73 
 n variables: 8 

── Variable type:integer ────────────────────────────────────────────────────────────────────────
   variable missing complete  n  mean    sd p0 p25 p50 p75 p100     hist
 doutorados       0       73 73 14.96 30.98  0   0   0  14  152 ▇▁▁▁▁▁▁▁
  mestrados       0       73 73 75.79 63.23  0  39  58 103  433 ▇▇▂▁▁▁▁▁
   producao       0       73 73 58.03 65.44  0  18  42  67  355 ▇▅▁▁▁▁▁▁

── Variable type:logical ────────────────────────────────────────────────────────────────────────
      variable missing complete  n mean                   count
 tem_doutorado       0       73 73 0.47 FAL: 39, TRU: 34, NA: 0

── Variable type:numeric ────────────────────────────────────────────────────────────────────────
         variable missing complete  n  mean    sd   p0   p25   p50   p75  p100     hist
         docentes       0       73 73 20.63 12.27 8.25 11.25 16.75 25.75 67.25 ▇▅▂▁▁▁▁▁
 doutorados_pprof       0       73 73  0.43  0.73 0     0     0     0.57  2.69 ▇▁▁▁▁▁▁▁
  mestrados_pprof       0       73 73  3.66  1.81 0     2.57  3.58  4.88  8.19 ▂▃▅▇▅▃▁▂
    produtividade       0       73 73  2.36  1.37 0     1.4   2.27  3.2   5.66 ▃▆▆▇▃▃▂▂
skimr::skim(cacc_md)
Skim summary statistics
 n obs: 34 
 n variables: 8 

── Variable type:integer ────────────────────────────────────────────────────────────────────────
   variable missing complete  n   mean    sd p0 p25 p50    p75 p100     hist
 doutorados       0       34 34  32.12 39.07  0   1  18  50.5   152 ▇▃▂▂▁▁▁▁
  mestrados       0       34 34 104.47 78.48  0  60 102 119.75  433 ▃▇▅▁▁▁▁▁
   producao       0       34 34  97.74 75.81 26  49  71 104.75  355 ▇▅▁▁▁▁▁▁

── Variable type:logical ────────────────────────────────────────────────────────────────────────
      variable missing complete  n mean          count
 tem_doutorado       0       34 34    1 TRU: 34, NA: 0

── Variable type:numeric ────────────────────────────────────────────────────────────────────────
         variable missing complete  n  mean    sd    p0    p25   p50   p75  p100     hist
         docentes       0       34 34 27.85 13.6  10    19.44  25    32.31 67.25 ▆▇▇▂▂▁▂▁
 doutorados_pprof       0       34 34  0.92  0.84  0     0.033  0.99  1.45  2.69 ▇▂▁▅▂▂▁▁
  mestrados_pprof       0       34 34  3.66  1.72  0     2.8    3.65  4.47  7.4  ▂▁▅▇▇▅▁▂
    produtividade       0       34 34  3.31  1.16  1.54  2.37   3.16  4.15  5.66 ▆▆▆▇▃▅▂▃
cacc %>% 
  ggplot(aes(x = docentes)) + 
  geom_histogram(bins = 15, fill = paleta[1])


cacc %>% 
  ggplot(aes(x = producao)) + 
  geom_histogram(bins = 15, fill = paleta[2])


cacc %>% 
  ggplot(aes(x = produtividade)) + 
  geom_histogram(bins = 15, fill = paleta[3])

Se quisermos modelar o efeito do tamanho do programa em termos de docentes (permanentes) na quantidade de artigos publicados, podemos usar regressão.

Importante: sempre queremos ver os dados antes de fazermos qualquer modelo ou sumário:

cacc %>% 
  ggplot(aes(x = docentes, y = producao)) + 
  geom_point()

Parece que existe uma relação. Vamos criar um modelo então:

modelo1 = lm(producao ~ docentes, data = cacc)

tidy(modelo1, conf.int = TRUE, conf.level = 0.95)
glance(modelo1)

Para visualizar o modelo:

cacc_augmented = cacc %>% 
  add_predictions(modelo1) 

cacc_augmented %>% 
  ggplot(aes(x = docentes)) + 
  geom_line(aes(y = pred), colour = "brown") + 
  geom_point(aes(y = producao)) + 
  labs(y = "Produção do programa")

Se considerarmos que temos apenas uma amostra de todos os programas de pós em CC no Brasil, o que podemos inferir a partir desse modelo sobre a relação entre número de docentes permanentes e produção de artigos em programas de pós?

Normalmente reportaríamos o resultado da seguinte maneira, substituindo VarIndepX e todos os x’s e y’s pelos nomes e valores de fato:

Regressão múltipla foi utilizada para analisar se VarIndep1 e VarIndep2 tem uma associação significativa com VarDep. Os resultados da regressão indicam que um modelo com os 2 preditores no formato VarDep = XXX.VarIndep1 + YYY.VarIndep2 explicam XX,XX% da variância da variável de resposta (R2 = XX,XX). VarIndep1, medida como/em [unidade ou o que é o 0 e o que é 1] tem uma relação significativa com o erro (b = [yy,yy; zz,zz], IC com 95%), assim como VarIndep2 medida como [unidade ou o que é o 0 e o que é 1] (b = [yy,yy; zz,zz], IC com 95%). O aumento de 1 unidade de VarIndep1 produz uma mudança de xxx em VarDep, enquanto um aumento…

Produza aqui a sua versão desse texto, portanto:


Regressão múltipla foi utilizada para analisar se docentes tem uma associação significativa com produção. Os resultados da regressão indicam que um modelo com os 2 preditores no formato producao = 4,81 * docentes - 41,27 explicam 81,45% da variância da variável de resposta (R2 = 0,8145886). Docentes, medida em unidades, tem uma relação significativa com o erro (b = [4,269955; 5,356786], IC com 95%). O aumento de 1 unidade de docente produz uma mudança de 4,81 em produção.


Dito isso, o que significa a relação que você encontrou na prática para entendermos os programas de pós graduação no Brasil? E algum palpite de por que a relação que encontramos é forte?


Significa que quanto maior o número de docentes, maior a produção. O palpite para essa relação é que a grande maioria dos trabalhos produzidos precisa de um orientador, que é um docente, e isso faz com que quanto maior o número de docentes, maior a produção de trabalhos.


Mais fatores

modelo2 = lm(producao ~ docentes + mestrados_pprof + doutorados_pprof + tem_doutorado, 
             data = cacc_md)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

E se considerarmos também o número de alunos?

modelo2 = lm(producao ~ docentes + mestrados + doutorados, data = cacc)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

Visualizar o modelo com muitas variáveis independentes fica mais difícil

para_plotar_modelo = cacc %>% 
  data_grid(producao = seq_range(producao, 10), # Crie um vetor de 10 valores no range
            docentes = seq_range(docentes, 4),  
            # mestrados = seq_range(mestrados, 3),
            mestrados = median(mestrados),
            doutorados = seq_range(doutorados, 3)) %>% 
  add_predictions(modelo2)

glimpse(para_plotar_modelo)
Observations: 120
Variables: 5
$ producao   <dbl> 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.0…
$ docentes   <dbl> 8.25000, 8.25000, 8.25000, 27.91667, 27.91667, 27.91667, 47.58333, 47.58333…
$ mestrados  <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,…
$ doutorados <dbl> 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, …
$ pred       <dbl> 3.199123, 79.257725, 155.316327, 72.026777, 148.085378, 224.143980, 140.854…
para_plotar_modelo %>% 
  ggplot(aes(x = docentes, y = pred)) + 
  geom_line(aes(group = doutorados, colour = doutorados)) + 
  geom_point(data = cacc, aes(y = producao, colour = doutorados))

Considerando agora esses três fatores, o que podemos dizer sobre como cada um deles se relaciona com a produção de um programa de pós em CC? E sobre o modelo? Ele explica mais que o modelo 1?


Regressão múltipla foi utilizada para analisar se número de docentes, dissertações de mestrado e teses de doutorado tem uma associação significativa com a produção. Os resultados da regressão indicam que um modelo com os 3 preditores no formato producao = 3,4997 * docentes - 0,1949 * mestrados + 1,0007 * doutorados - 14,3663 explicam 87,06% da variância da variável de resposta (R2 = 0,8706642). A variável docentes, medida em unidades, tem uma relação significativa com o erro (b = [2,5827; 4,4166], IC com 95%), assim como mestrados, medida em unidades(b = [-0,3577; -0,0321], IC com 95%), assim como doutorados, medida em unidades(b = [0,6355112; 1,3660], IC com 95%). O aumento de 1 unidade de docentes produz um aumento de 3,4997 na produção, enquanto um aumento de 1 unidade de mestrados produz uma redução de 0,1949 na produção, enquanto um aumento de 1 unidade de doutorados produz um aumento de 1,0007 na produção.

É mais completo que modelo anterior, pois explica como a variável de produção cresce ou diminui considerando vários fatores.


Agora produtividade

Diferente de medirmos produção (total produzido), é medirmos produtividade (produzido / utilizado). Abaixo focaremos nessa análise. Para isso crie um modelo que investiga como um conjunto de fatores que você julga que são relevantes se relacionam com a produtividade dos programas. Crie um modelo que avalie como pelo menos 3 fatores se relacionam com a produtividade de um programa. Pode reutilizar fatores que já definimos e analisamos para produção. Mas cuidado para não incluir fatores que sejam função linear de outros já incluídos (ex: incluir A, B e um terceiro C=A+B)

Produza abaixo o modelo e um texto que comente (i) o modelo, tal como os que fizemos antes, e (ii) as implicações - o que aprendemos sobre como funcionam programas de pós no Brasil.


Criando um modelo baseado em produtividade:

modelo3 = lm(produtividade ~ docentes + mestrados + doutorados + tem_doutorado, 
             data = cacc)

tidy(modelo3, conf.int = TRUE, conf.level = 0.95)
glance(modelo3)

Visualizando o modelo com muitas variáveis independentes:

para_plotar_modelo = cacc %>% 
  data_grid(produtividade = seq_range(produtividade, 10), # Crie um vetor de 10 valores no range
            docentes = seq_range(docentes, 4),  
            # mestrados = seq_range(mestrados, 3),
            mestrados = median(mestrados),
            doutorados = seq_range(doutorados, 3), 
            tem_doutorado = median(tem_doutorado)) %>% 
  add_predictions(modelo3)

glimpse(para_plotar_modelo)
Observations: 120
Variables: 6
$ produtividade <dbl> 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000…
$ docentes      <dbl> 8.25000, 8.25000, 8.25000, 27.91667, 27.91667, 27.91667, 47.58333, 47.58…
$ mestrados     <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, …
$ doutorados    <dbl> 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, …
$ tem_doutorado <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FA…
$ pred          <dbl> 1.460124, 2.817475, 4.174827, 1.643066, 3.000418, 4.357770, 1.826009, 3.…
para_plotar_modelo %>% 
  ggplot(aes(x = docentes, y = pred)) + 
  geom_line(aes(group = doutorados, color = doutorados)) + 
  geom_point(data = cacc, aes(y = produtividade, color = doutorados))

Considerando agora esses três fatores, o que podemos dizer sobre como cada um deles se relaciona com a produtividade de um programa de pós em CC? E sobre o modelo? Ele explica mais que o modelo anterior?


Regressão múltipla foi utilizada para analisar se número de docentes, dissertações de mestrado, teses de doutorado e programas que tem doutorado tem uma associação significativa com a produtividade. Os resultados da regressão indicam que um modelo com os 4 preditores no formato produtividade = 0,0093 * docentes - 0,0031 * mestrados + 0,0178 * doutorados + 1,2402 * tem_doutorado + 1,5648 explicam 51,66% da variância da variável de resposta (R2 = 0,5166287). A variável docentes, medida em unidades, tem uma relação significativa com o erro (b = [-0,0295; 0,0481], IC com 95%), assim como mestrados, medida em unidades(b = [-0,0098; 0,0035], IC com 95%), assim como doutorados, medida em unidades(b = [0,002763971; 0,032955808], IC com 95%), assim como tem_doutorado medida como 0 quando o programa não tem doutorado e 1 quando o programa tem (b = [0,6815; 1,7988], IC com 95%). O aumento de 1 unidade de docentes produz um aumento de 0,0093 na produtividade, enquanto um aumento de 1 unidade de mestrados produz uma redução de 0,0031 na produtividade, enquanto um aumento de 1 unidade de doutorados produz um aumento de 0,0178 na produtividade, e quando o programa tem_doutorado produz um aumento de 1,2402 na produtividade.

É praticamente análogo ao modelo anterior, só o crescimento da variável de produtividade é menor, visto que ela já é uma relação entre produção e o número de docentes.

LS0tCnRpdGxlOiAiUmVncmVzc8OjbyBsaW5lYXIgbmEgcHLDoXRpY2EiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KG1vZGVscikKc291cmNlKGhlcmU6OmhlcmUoImNvZGUvbGliLlIiKSkKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCgprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gNiwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQgPSA1KQoKcGFsZXRhID0gYygiIzQwNEU0RCIsCiAgICAgICAgICAgIiM5MkRDRTUiLAogICAgICAgICAgICIjOTM4QkExIiwKICAgICAgICAgICAiIzJEMzE0MiIsCiAgICAgICAgICAgIiNGNDc0M0IiKQpgYGAKCiMjIERhZG9zIGRhIENBUEVTIHNvYnJlIGF2YWxpYcOnw6NvIGRhIHDDs3MtZ3JhZHVhw6fDo28KCkEgQ0FQRVMgw6kgdW0gw7NyZ8OjbyBkbyBNRUMgcXVlIHRlbSBhIGF0cmlidWnDp8OjbyBkZSBhY29tcGFuaGFyIGEgcMOzcy1ncmFkdWHDp8OjbyBuYSB1bml2ZXJzaWRhZGUgYnJhc2lsZWlyYS4gVW1hIGRhcyBmb3JtYXMgcXVlIGVsYSBlbmNvbnRyb3UgZGUgZmF6ZXIgaXNzbyBlIHBlbGEgcXVhbCBlbGEgw6kgYmFzdGFudGUgY3JpdGljYWRhIMOpIGF0cmF2w6lzIGRlIHVtYSBhdmFsaWHDp8OjbyBxdWFudGl0YXRpdmEgYSBjYWRhIHggYW5vcyAoZXJhIDMsIG11ZG91IHBhcmEgNCkuIAoKVXNhcmVtb3MgZGFkb3MgZGEgcGVuw7psdGltYSBhdmFsaWHDp8OjbyBkYSBDQVBFUzogCgpgYGB7cn0KY2FjY190dWRvID0gcmVhZF9wcm9qZWN0ZGF0YSgpCgpnbGltcHNlKGNhY2NfdHVkbykKYGBgCgojIyMgUHJvZHXDp8OjbyBlIHByb2R1dGl2aWRhZGUgZGUgYXJ0aWdvcwoKVW1hIGRhcyBtYW5laXJhcyBkZSBhdmFsaWFyIGEgcHJvZHXDp8OjbyBkb3MgZG9jZW50ZXMgcXVlIGEgQ0FQRVMgdXRpbGl6YSDDqSBxdWFudGlmaWNhbmRvIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zIHBlbG9zIGRvY2VudGVzLiBPcyBhcnRpZ29zIHPDo28gY2F0ZWdvcml6YWRvcyBlbSBleHRyYXRvcyBvcmRlbmFkb3MgKEExIMOpIG8gbWFpcyBhbHRvKSwgZSBzZXBhcmFkb3MgZW50cmUgYXJ0aWdvcyBlbSBjb25mZXLDqm5jaWFzIGUgcGVyacOzZGljb3MuIFVzYXJlbW9zIHBhcmEgZXNzZSBsYWIgYSBwcm9kdcOnw6NvIGVtIHBlcmnDs2RpY29zIGF2YWxpYWRvcyBjb20gQTEsIEEyIGUgQjEuIAoKYGBge3J9CmNhY2MgPSBjYWNjX3R1ZG8gJT4lCiAgdHJhbnNtdXRlKAogICAgZG9jZW50ZXMgPSBgRG9jZW50ZXMgcGVybWFuZW50ZXNgLAogICAgcHJvZHVjYW8gPSAocGVyaW9kaWNvc19BMSArIHBlcmlvZGljb3NfQTIgKyBwZXJpb2RpY29zX0IxKSwKICAgIHByb2R1dGl2aWRhZGUgPSBwcm9kdWNhbyAvIGRvY2VudGVzLAogICAgbWVzdHJhZG9zID0gRGlzc2VydGFjb2VzLAogICAgZG91dG9yYWRvcyA9IFRlc2VzLAogICAgdGVtX2RvdXRvcmFkbyA9IHRvbG93ZXIoYFRlbSBkb3V0b3JhZG9gKSA9PSAic2ltIiwKICAgIG1lc3RyYWRvc19wcHJvZiA9IG1lc3RyYWRvcyAvIGRvY2VudGVzLAogICAgZG91dG9yYWRvc19wcHJvZiA9IGRvdXRvcmFkb3MgLyBkb2NlbnRlcwogICkKCmNhY2NfbWQgPSBjYWNjICU+JSAKICBmaWx0ZXIodGVtX2RvdXRvcmFkbykKYGBgCgoKIyMjIEVEQQoKYGBge3J9CnNraW1yOjpza2ltKGNhY2MpCmBgYAoKYGBge3J9CnNraW1yOjpza2ltKGNhY2NfbWQpCmBgYAoKYGBge3J9CmNhY2MgJT4lIAogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbMV0pCgpjYWNjICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwcm9kdWNhbykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1LCBmaWxsID0gcGFsZXRhWzJdKQoKY2FjYyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcHJvZHV0aXZpZGFkZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1LCBmaWxsID0gcGFsZXRhWzNdKQpgYGAKClNlIHF1aXNlcm1vcyBtb2RlbGFyIG8gZWZlaXRvIGRvIHRhbWFuaG8gZG8gcHJvZ3JhbWEgZW0gdGVybW9zIGRlIGRvY2VudGVzIChwZXJtYW5lbnRlcykgbmEgcXVhbnRpZGFkZSBkZSBhcnRpZ29zIHB1YmxpY2Fkb3MsIHBvZGVtb3MgdXNhciByZWdyZXNzw6NvLiAKCipJbXBvcnRhbnRlKjogc2VtcHJlIHF1ZXJlbW9zIHZlciBvcyBkYWRvcyBhbnRlcyBkZSBmYXplcm1vcyBxdWFscXVlciBtb2RlbG8gb3Ugc3Vtw6FyaW86IAoKYGBge3J9CmNhY2MgJT4lIAogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzLCB5ID0gcHJvZHVjYW8pKSArIAogIGdlb21fcG9pbnQoKQpgYGAKClBhcmVjZSBxdWUgZXhpc3RlIHVtYSByZWxhw6fDo28uIFZhbW9zIGNyaWFyIHVtIG1vZGVsbyBlbnTDo286CgpgYGB7cn0KbW9kZWxvMSA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMsIGRhdGEgPSBjYWNjKQoKdGlkeShtb2RlbG8xLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpnbGFuY2UobW9kZWxvMSkKYGBgCgpQYXJhIHZpc3VhbGl6YXIgbyBtb2RlbG86CgpgYGB7cn0KY2FjY19hdWdtZW50ZWQgPSBjYWNjICU+JSAKICBhZGRfcHJlZGljdGlvbnMobW9kZWxvMSkgCgpjYWNjX2F1Z21lbnRlZCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMpKSArIAogIGdlb21fbGluZShhZXMoeSA9IHByZWQpLCBjb2xvdXIgPSAiYnJvd24iKSArIAogIGdlb21fcG9pbnQoYWVzKHkgPSBwcm9kdWNhbykpICsgCiAgbGFicyh5ID0gIlByb2R1w6fDo28gZG8gcHJvZ3JhbWEiKQpgYGAKClNlIGNvbnNpZGVyYXJtb3MgcXVlIHRlbW9zIGFwZW5hcyB1bWEgYW1vc3RyYSBkZSB0b2RvcyBvcyBwcm9ncmFtYXMgZGUgcMOzcyBlbSBDQyBubyBCcmFzaWwsIG8gcXVlIHBvZGVtb3MgaW5mZXJpciBhIHBhcnRpciBkZXNzZSBtb2RlbG8gc29icmUgYSByZWxhw6fDo28gZW50cmUgbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyBlIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBlbSBwcm9ncmFtYXMgZGUgcMOzcz8gCgpOb3JtYWxtZW50ZSByZXBvcnRhcsOtYW1vcyBvIHJlc3VsdGFkbyBkYSBzZWd1aW50ZSBtYW5laXJhLCBzdWJzdGl0dWluZG8gVmFySW5kZXBYIGUgdG9kb3Mgb3MgeCdzIGUgeSdzIHBlbG9zIG5vbWVzIGUgdmFsb3JlcyBkZSBmYXRvOgoKPiBSZWdyZXNzw6NvIG3Dumx0aXBsYSBmb2kgdXRpbGl6YWRhIHBhcmEgYW5hbGlzYXIgc2UgVmFySW5kZXAxIGUgVmFySW5kZXAyIHRlbSB1bWEgYXNzb2NpYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIFZhckRlcC4gT3MgcmVzdWx0YWRvcyBkYSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gb3MgMiBwcmVkaXRvcmVzIG5vIGZvcm1hdG8gVmFyRGVwID0gWFhYLlZhckluZGVwMSArIFlZWS5WYXJJbmRlcDIgZXhwbGljYW0gWFgsWFglIGRhIHZhcmnDom5jaWEgZGEgdmFyacOhdmVsIGRlIHJlc3Bvc3RhIChSMiA9IFhYLFhYKS4gVmFySW5kZXAxLCBtZWRpZGEgY29tby9lbSBbdW5pZGFkZSBvdSBvIHF1ZSDDqSBvIDAgZSBvIHF1ZSDDqSAxXSB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvIGVycm8gKGIgPSBbeXkseXk7IHp6LHp6XSwgSUMgY29tIDk1JSksIGFzc2ltIGNvbW8gVmFySW5kZXAyIG1lZGlkYSBjb21vIFt1bmlkYWRlIG91IG8gcXVlIMOpIG8gMCBlIG8gcXVlIMOpIDFdIChiID0gW3l5LHl5OyB6eix6el0sIElDIGNvbSA5NSUpLiBPIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRlIFZhckluZGVwMSBwcm9kdXogdW1hIG11ZGFuw6dhIGRlIHh4eCBlbSBWYXJEZXAsIGVucXVhbnRvIHVtIGF1bWVudG8uLi4KClByb2R1emEgYXF1aSBhIHN1YSB2ZXJzw6NvIGRlc3NlIHRleHRvLCBwb3J0YW50bzoKCi0tLS0tCgo+IFJlZ3Jlc3PDo28gbcO6bHRpcGxhIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSBkb2NlbnRlcyB0ZW0gdW1hIGFzc29jaWHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBwcm9kdcOnw6NvLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSBvcyAyIHByZWRpdG9yZXMgbm8gZm9ybWF0byBwcm9kdWNhbyA9IDQsODEgKiBkb2NlbnRlcyAtIDQxLDI3IGV4cGxpY2FtIDgxLDQ1JSBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZSByZXNwb3N0YSAoUjIgPSAwLDgxNDU4ODYpLiBEb2NlbnRlcywgbWVkaWRhIGVtIHVuaWRhZGVzLCB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvIGVycm8gKGIgPSBbNCwyNjk5NTU7IDUsMzU2Nzg2XSwgSUMgY29tIDk1JSkuIE8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgZG9jZW50ZSBwcm9kdXogdW1hIG11ZGFuw6dhIGRlIDQsODEgZW0gcHJvZHXDp8Ojby4KCi0tLS0tCgpEaXRvIGlzc28sIG8gcXVlIHNpZ25pZmljYSBhIHJlbGHDp8OjbyBxdWUgdm9jw6ogZW5jb250cm91IG5hIHByw6F0aWNhIHBhcmEgZW50ZW5kZXJtb3Mgb3MgcHJvZ3JhbWFzIGRlIHDDs3MgZ3JhZHVhw6fDo28gbm8gQnJhc2lsPyBFIGFsZ3VtIHBhbHBpdGUgZGUgcG9yIHF1ZSBhIHJlbGHDp8OjbyBxdWUgZW5jb250cmFtb3Mgw6kgZm9ydGU/CgotLS0tLQoKU2lnbmlmaWNhIHF1ZSBxdWFudG8gbWFpb3IgbyBuw7ptZXJvIGRlIGRvY2VudGVzLCBtYWlvciBhIHByb2R1w6fDo28uIE8gcGFscGl0ZSBwYXJhIGVzc2EgcmVsYcOnw6NvIMOpIHF1ZSBhIGdyYW5kZSBtYWlvcmlhIGRvcyB0cmFiYWxob3MgcHJvZHV6aWRvcyBwcmVjaXNhIGRlIHVtIG9yaWVudGFkb3IsIHF1ZSDDqSB1bSBkb2NlbnRlLCBlIGlzc28gZmF6IGNvbSBxdWUgcXVhbnRvIG1haW9yIG8gbsO6bWVybyBkZSBkb2NlbnRlcywgbWFpb3IgYSBwcm9kdcOnw6NvIGRlIHRyYWJhbGhvcy4KCi0tLS0tCgojIyBNYWlzIGZhdG9yZXMKCmBgYHtyfQptb2RlbG8yID0gbG0ocHJvZHVjYW8gfiBkb2NlbnRlcyArIG1lc3RyYWRvc19wcHJvZiArIGRvdXRvcmFkb3NfcHByb2YgKyB0ZW1fZG91dG9yYWRvLCAKICAgICAgICAgICAgIGRhdGEgPSBjYWNjX21kKQoKdGlkeShtb2RlbG8yLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpnbGFuY2UobW9kZWxvMikKYGBgCgpFIHNlIGNvbnNpZGVyYXJtb3MgdGFtYsOpbSBvIG7Dum1lcm8gZGUgYWx1bm9zPwoKYGBge3J9Cm1vZGVsbzIgPSBsbShwcm9kdWNhbyB+IGRvY2VudGVzICsgbWVzdHJhZG9zICsgZG91dG9yYWRvcywgZGF0YSA9IGNhY2MpCgp0aWR5KG1vZGVsbzIsIGNvbmYuaW50ID0gVFJVRSwgY29uZi5sZXZlbCA9IDAuOTUpCmdsYW5jZShtb2RlbG8yKQpgYGAKClZpc3VhbGl6YXIgbyBtb2RlbG8gY29tIG11aXRhcyB2YXJpw6F2ZWlzIGluZGVwZW5kZW50ZXMgZmljYSBtYWlzIGRpZsOtY2lsCgpgYGB7cn0KcGFyYV9wbG90YXJfbW9kZWxvID0gY2FjYyAlPiUgCiAgZGF0YV9ncmlkKHByb2R1Y2FvID0gc2VxX3JhbmdlKHByb2R1Y2FvLCAxMCksICMgQ3JpZSB1bSB2ZXRvciBkZSAxMCB2YWxvcmVzIG5vIHJhbmdlCiAgICAgICAgICAgIGRvY2VudGVzID0gc2VxX3JhbmdlKGRvY2VudGVzLCA0KSwgIAogICAgICAgICAgICAjIG1lc3RyYWRvcyA9IHNlcV9yYW5nZShtZXN0cmFkb3MsIDMpLAogICAgICAgICAgICBtZXN0cmFkb3MgPSBtZWRpYW4obWVzdHJhZG9zKSwKICAgICAgICAgICAgZG91dG9yYWRvcyA9IHNlcV9yYW5nZShkb3V0b3JhZG9zLCAzKSkgJT4lIAogIGFkZF9wcmVkaWN0aW9ucyhtb2RlbG8yKQoKZ2xpbXBzZShwYXJhX3Bsb3Rhcl9tb2RlbG8pCgpgYGAKCmBgYHtyfQpwYXJhX3Bsb3Rhcl9tb2RlbG8gJT4lIAogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzLCB5ID0gcHJlZCkpICsgCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGRvdXRvcmFkb3MsIGNvbG91ciA9IGRvdXRvcmFkb3MpKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IGNhY2MsIGFlcyh5ID0gcHJvZHVjYW8sIGNvbG91ciA9IGRvdXRvcmFkb3MpKQpgYGAKCkNvbnNpZGVyYW5kbyBhZ29yYSBlc3NlcyB0csOqcyBmYXRvcmVzLCBvIHF1ZSBwb2RlbW9zIGRpemVyIHNvYnJlIGNvbW8gY2FkYSB1bSBkZWxlcyBzZSByZWxhY2lvbmEgY29tIGEgcHJvZHXDp8OjbyBkZSB1bSBwcm9ncmFtYSBkZSBww7NzIGVtIENDPyBFIHNvYnJlIG8gbW9kZWxvPyBFbGUgZXhwbGljYSBtYWlzIHF1ZSBvIG1vZGVsbyAxPyAKCi0tLS0tCgo8IS0tICoqRVhQTElDQcOHw4NPKio6ICpTdWJzdGl0dWEgZXNzZSB0ZXh0byBwb3IgdGV4dG8gZmVpdG8gdGFsIHF1YWwgbyBxdWUgdXNhbW9zIGNvbSB1bWEgdmFyacOhdmVsKiAtLT4KCj4gUmVncmVzc8OjbyBtw7psdGlwbGEgZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlIG7Dum1lcm8gZGUgZG9jZW50ZXMsIGRpc3NlcnRhw6fDtWVzIGRlIG1lc3RyYWRvIGUgdGVzZXMgZGUgZG91dG9yYWRvIHRlbSB1bWEgYXNzb2NpYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIGEgcHJvZHXDp8Ojby4gT3MgcmVzdWx0YWRvcyBkYSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gb3MgMyBwcmVkaXRvcmVzIG5vIGZvcm1hdG8gcHJvZHVjYW8gPSAzLDQ5OTcgKiBkb2NlbnRlcyAtIDAsMTk0OSAqIG1lc3RyYWRvcyArIDEsMDAwNyAqIGRvdXRvcmFkb3MgLSAxNCwzNjYzIGV4cGxpY2FtIDg3LDA2JSBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZSByZXNwb3N0YSAoUjIgPSAwLDg3MDY2NDIpLiBBIHZhcmnDoXZlbCBkb2NlbnRlcywgbWVkaWRhIGVtIHVuaWRhZGVzLCB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvIGVycm8gKGIgPSBbMiw1ODI3OyA0LDQxNjZdLCBJQyBjb20gOTUlKSwgYXNzaW0gY29tbyBtZXN0cmFkb3MsIG1lZGlkYSBlbSB1bmlkYWRlcyhiID0gWy0wLDM1Nzc7IC0wLDAzMjFdLCBJQyBjb20gOTUlKSwgYXNzaW0gY29tbyBkb3V0b3JhZG9zLCBtZWRpZGEgZW0gdW5pZGFkZXMoYiA9IFswLDYzNTUxMTI7IDEsMzY2MF0sIElDIGNvbSA5NSUpLiBPIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRlIGRvY2VudGVzIHByb2R1eiB1bSBhdW1lbnRvIGRlIDMsNDk5NyBuYSBwcm9kdcOnw6NvLCBlbnF1YW50byB1bSBhdW1lbnRvIGRlIDEgdW5pZGFkZSBkZSBtZXN0cmFkb3MgcHJvZHV6IHVtYSByZWR1w6fDo28gZGUgMCwxOTQ5IG5hIHByb2R1w6fDo28sIGVucXVhbnRvIHVtIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRlIGRvdXRvcmFkb3MgcHJvZHV6IHVtIGF1bWVudG8gZGUgMSwwMDA3IG5hIHByb2R1w6fDo28uIAoKw4kgbWFpcyBjb21wbGV0byBxdWUgbW9kZWxvIGFudGVyaW9yLCBwb2lzIGV4cGxpY2EgY29tbyBhIHZhcmnDoXZlbCBkZSBwcm9kdcOnw6NvIGNyZXNjZSBvdSBkaW1pbnVpIGNvbnNpZGVyYW5kbyB2w6FyaW9zIGZhdG9yZXMuCgotLS0tLQoKCiMjIEFnb3JhIHByb2R1dGl2aWRhZGUgCgpEaWZlcmVudGUgZGUgbWVkaXJtb3MgcHJvZHXDp8OjbyAodG90YWwgcHJvZHV6aWRvKSwgw6kgbWVkaXJtb3MgcHJvZHV0aXZpZGFkZSAocHJvZHV6aWRvIC8gdXRpbGl6YWRvKS4gQWJhaXhvIGZvY2FyZW1vcyBuZXNzYSBhbsOhbGlzZS4gUGFyYSBpc3NvIGNyaWUgdW0gbW9kZWxvIHF1ZSBpbnZlc3RpZ2EgY29tbyB1bSBjb25qdW50byBkZSBmYXRvcmVzIHF1ZSB2b2PDqiBqdWxnYSBxdWUgc8OjbyByZWxldmFudGVzIHNlIHJlbGFjaW9uYW0gY29tIGEgcHJvZHV0aXZpZGFkZSBkb3MgcHJvZ3JhbWFzLiBDcmllIHVtIG1vZGVsbyBxdWUgYXZhbGllIGNvbW8gX3BlbG8gbWVub3MgMyBmYXRvcmVzXyBzZSByZWxhY2lvbmFtIGNvbSBhIHByb2R1dGl2aWRhZGUgZGUgdW0gcHJvZ3JhbWEuIFBvZGUgcmV1dGlsaXphciBmYXRvcmVzIHF1ZSBqw6EgZGVmaW5pbW9zIGUgYW5hbGlzYW1vcyBwYXJhIHByb2R1w6fDo28uIE1hcyBjdWlkYWRvIHBhcmEgbsOjbyBpbmNsdWlyIGZhdG9yZXMgcXVlIHNlamFtIGZ1bsOnw6NvIGxpbmVhciBkZSBvdXRyb3MgasOhIGluY2x1w61kb3MgKGV4OiBpbmNsdWlyIEEsIEIgZSB1bSB0ZXJjZWlybyBDPUErQikKClByb2R1emEgYWJhaXhvIG8gbW9kZWxvIGUgdW0gdGV4dG8gcXVlIGNvbWVudGUgKGkpIG8gbW9kZWxvLCB0YWwgY29tbyBvcyBxdWUgZml6ZW1vcyBhbnRlcywgZSAoaWkpIGFzIGltcGxpY2HDp8O1ZXMgLSBvIHF1ZSBhcHJlbmRlbW9zIHNvYnJlIGNvbW8gZnVuY2lvbmFtIHByb2dyYW1hcyBkZSBww7NzIG5vIEJyYXNpbC4KCi0tLQoKQ3JpYW5kbyB1bSBtb2RlbG8gYmFzZWFkbyBlbSBwcm9kdXRpdmlkYWRlOgoKCmBgYHtyfQptb2RlbG8zID0gbG0ocHJvZHV0aXZpZGFkZSB+IGRvY2VudGVzICsgbWVzdHJhZG9zICsgZG91dG9yYWRvcyArIHRlbV9kb3V0b3JhZG8sIAogICAgICAgICAgICAgZGF0YSA9IGNhY2MpCgp0aWR5KG1vZGVsbzMsIGNvbmYuaW50ID0gVFJVRSwgY29uZi5sZXZlbCA9IDAuOTUpCgpnbGFuY2UobW9kZWxvMykKYGBgCgpWaXN1YWxpemFuZG8gbyBtb2RlbG8gY29tIG11aXRhcyB2YXJpw6F2ZWlzIGluZGVwZW5kZW50ZXM6CgpgYGB7cn0KcGFyYV9wbG90YXJfbW9kZWxvID0gY2FjYyAlPiUgCiAgZGF0YV9ncmlkKHByb2R1dGl2aWRhZGUgPSBzZXFfcmFuZ2UocHJvZHV0aXZpZGFkZSwgMTApLCAjIENyaWUgdW0gdmV0b3IgZGUgMTAgdmFsb3JlcyBubyByYW5nZQogICAgICAgICAgICBkb2NlbnRlcyA9IHNlcV9yYW5nZShkb2NlbnRlcywgNCksICAKICAgICAgICAgICAgIyBtZXN0cmFkb3MgPSBzZXFfcmFuZ2UobWVzdHJhZG9zLCAzKSwKICAgICAgICAgICAgbWVzdHJhZG9zID0gbWVkaWFuKG1lc3RyYWRvcyksCiAgICAgICAgICAgIGRvdXRvcmFkb3MgPSBzZXFfcmFuZ2UoZG91dG9yYWRvcywgMyksIAogICAgICAgICAgICB0ZW1fZG91dG9yYWRvID0gbWVkaWFuKHRlbV9kb3V0b3JhZG8pKSAlPiUgCiAgYWRkX3ByZWRpY3Rpb25zKG1vZGVsbzMpCgpnbGltcHNlKHBhcmFfcGxvdGFyX21vZGVsbykKCmBgYAoKYGBge3J9CnBhcmFfcGxvdGFyX21vZGVsbyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMsIHkgPSBwcmVkKSkgKyAKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gZG91dG9yYWRvcywgY29sb3IgPSBkb3V0b3JhZG9zKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjYWNjLCBhZXMoeSA9IHByb2R1dGl2aWRhZGUsIGNvbG9yID0gZG91dG9yYWRvcykpCmBgYAoKQ29uc2lkZXJhbmRvIGFnb3JhIGVzc2VzIHRyw6pzIGZhdG9yZXMsIG8gcXVlIHBvZGVtb3MgZGl6ZXIgc29icmUgY29tbyBjYWRhIHVtIGRlbGVzIHNlIHJlbGFjaW9uYSBjb20gYSBwcm9kdXRpdmlkYWRlIGRlIHVtIHByb2dyYW1hIGRlIHDDs3MgZW0gQ0M/IEUgc29icmUgbyBtb2RlbG8/IEVsZSBleHBsaWNhIG1haXMgcXVlIG8gbW9kZWxvIGFudGVyaW9yPyAKCi0tLS0tCgo8IS0tICoqRVhQTElDQcOHw4NPKio6ICpTdWJzdGl0dWEgZXNzZSB0ZXh0byBwb3IgdGV4dG8gZmVpdG8gdGFsIHF1YWwgbyBxdWUgdXNhbW9zIGNvbSB1bWEgdmFyacOhdmVsKiAtLT4KCj4gUmVncmVzc8OjbyBtw7psdGlwbGEgZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlIG7Dum1lcm8gZGUgZG9jZW50ZXMsIGRpc3NlcnRhw6fDtWVzIGRlIG1lc3RyYWRvLCB0ZXNlcyBkZSBkb3V0b3JhZG8gZSBwcm9ncmFtYXMgcXVlIHRlbSBkb3V0b3JhZG8gdGVtIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gYSBwcm9kdXRpdmlkYWRlLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSBvcyA0IHByZWRpdG9yZXMgbm8gZm9ybWF0byBwcm9kdXRpdmlkYWRlID0gMCwwMDkzICogZG9jZW50ZXMgLSAwLDAwMzEgKiBtZXN0cmFkb3MgKyAwLDAxNzggKiBkb3V0b3JhZG9zICsgMSwyNDAyICogdGVtX2RvdXRvcmFkbyArIDEsNTY0OCBleHBsaWNhbSA1MSw2NiUgZGEgdmFyacOibmNpYSBkYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgKFIyID0gMCw1MTY2Mjg3KS4gQSB2YXJpw6F2ZWwgZG9jZW50ZXMsIG1lZGlkYSBlbSB1bmlkYWRlcywgdGVtIHVtYSByZWxhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gbyBlcnJvIChiID0gWy0wLDAyOTU7IDAsMDQ4MV0sIElDIGNvbSA5NSUpLCBhc3NpbSBjb21vIG1lc3RyYWRvcywgbWVkaWRhIGVtIHVuaWRhZGVzKGIgPSBbLTAsMDA5ODsJMCwwMDM1XSwgSUMgY29tIDk1JSksIGFzc2ltIGNvbW8gZG91dG9yYWRvcywgbWVkaWRhIGVtIHVuaWRhZGVzKGIgPSBbMCwwMDI3NjM5NzE7CTAsMDMyOTU1ODA4XSwgSUMgY29tIDk1JSksIGFzc2ltIGNvbW8gdGVtX2RvdXRvcmFkbyBtZWRpZGEgY29tbyAwIHF1YW5kbyBvIHByb2dyYW1hIG7Do28gdGVtIGRvdXRvcmFkbyBlIDEgcXVhbmRvIG8gcHJvZ3JhbWEgdGVtIChiID0gWzAsNjgxNTsgMSw3OTg4XSwgSUMgY29tIDk1JSkuIE8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgZG9jZW50ZXMgcHJvZHV6IHVtIGF1bWVudG8gZGUgMCwwMDkzIG5hIHByb2R1dGl2aWRhZGUsIGVucXVhbnRvIHVtIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRlIG1lc3RyYWRvcyBwcm9kdXogdW1hIHJlZHXDp8OjbyBkZSAwLDAwMzEgbmEgcHJvZHV0aXZpZGFkZSwgZW5xdWFudG8gdW0gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgZG91dG9yYWRvcyBwcm9kdXogdW0gYXVtZW50byBkZSAwLDAxNzggbmEgcHJvZHV0aXZpZGFkZSwgZSBxdWFuZG8gbyBwcm9ncmFtYSB0ZW1fZG91dG9yYWRvIHByb2R1eiB1bSBhdW1lbnRvIGRlIDEsMjQwMiBuYSBwcm9kdXRpdmlkYWRlLiAKCsOJIHByYXRpY2FtZW50ZSBhbsOhbG9nbyBhbyBtb2RlbG8gYW50ZXJpb3IsIHPDsyBvIGNyZXNjaW1lbnRvIGRhIHZhcmnDoXZlbCBkZSBwcm9kdXRpdmlkYWRlIMOpIG1lbm9yLCB2aXN0byBxdWUgZWxhIGrDoSDDqSB1bWEgcmVsYcOnw6NvIGVudHJlIHByb2R1w6fDo28gZSBvIG7Dum1lcm8gZGUgZG9jZW50ZXMu