1 - Configurações Iniciais

1.1 Lags

Nº de pregões entre a compra pela abertura e a venda pelo fechamento ( day trade tem lag igual a 1): 1, 5, 10, 20, 40, 80 e 160.

lags = c(1,5,10,seq(20,160,by=20))

1.2 Carregamento dos dados de BOVA11

precos = read.csv("BOVA11.SA",row.names = 1)

cat("Primeiro pregão: ");cat(rownames(precos)[1]);cat("\n")
Primeiro pregão: 2015-08-25
cat("Último pregão: ");cat(rownames(precos)[nrow(precos)]);cat("\n")
Último pregão: 2020-08-20

2 Estratégia

Compra pela abertura em D+0 e venda pelo fechamento em D + lag - 1.

price_sell = precos$price.close
price_buy = precos$price.open
N = length(price_sell)

Avaliação dos rendimentos para cada lag. A rentabilidade total é a média geométrica das rentabilidades de cada operação, já que ocorrem consecutivamente. A anualização foi feita considerando 250 pregões em 1 ano. O risco foi mensurado pelo desvio-padrão dos retornos diários, usando a média aritmética do retorno no período. P. ex., se no lag de 40 pregões, a rentabilidade de uma operação foi 4%, seu rendimento diário foi de 0.1%, e esse valor será usado para estimar o risco.

# variáveis para armazenamento dos retornos e dos riscos
mi <- sig <- SR <- retornos <- NULL
for (i in lags) {
  # Valor de 1 + rentabilidade
  rend = price_sell[i:N]/price_buy[1:(N-i+1)]
  hist((rend-1)/i*100,
       main = paste0("lag = ",i),
       xlab = "rendimentos diários (%)")
  # Composição e anualização dos retornos
  EAR = (pracma::geomean(rend))^(250/i) - 1
  
  # média dos retornos
  mi = c(mi,
         EAR)
  # desvpad dos retornos diários - risco
  sig = c(sig,
          (rend/i) %>% sd)
}

# Sharp Ratio: medida de risco-retorno
SR = rbind(SR,
           mi/sig)
retornos = rbind(retornos,
                 mi)
plot(lags,retornos,type = "l",
     xlab = "lags",ylab = "retorno médio anualizado (EAR)")

plot(lags,SR,type = "l",
     xlab = "lags",ylab = "sharp ratio")

3 Análise para Várias Ações

3.1 Configurações Iniciais

# papéis analisados
acoes = c("abev3","b3sa3","bbas3","bbdc4","bbse3","bova11","brfs3","brkm5",
          "brml3","ccro3","ciel3","cmig4","cogn3","csan3","csna3","cyre3",
          "ecor3","egie3","elet3","embr3","eqtl3","ggbr4","goau4","hype3",
          "itsa4","itub4","jbss3","lame4","lren3","mglu3","mrfg3","petr4",
          "qual3","radl3","rail3","rent3","sbsp3","suzb3","taee11","usim5",
          "vale3","vivt4","vvar3","wege3","yduq3",
          "bbdc3","brap4","enbr3","flry3","klbn4","mult3","leve3","sanb11",
          "timp3","ugpa3")
acoes = paste0(acoes,".SA") %>% casefold(upper = T)

# lags
lags = c(1,5,10,20,40,80,160)

3.2 Processamento

SR <- retornos <- NULL
for (papel in acoes) {
  precos = read.csv(paste0(papel),row.names = 1)
  price_sell = precos$price.close
  price_buy = precos$price.open
  N = length(price_sell)
  
  mi <- sig <- NULL
  for (i in lags) {
    # rendimentos anualizados - 250 pregões/ano
    rend = price_sell[i:N]/price_buy[1:(N-i+1)]
    EAR = (pracma::geomean(rend))^(250/i) - 1
    
    # retornos
    mi = c(mi,
           EAR)
    # riscos
    sig = c(sig,
            (rend/i) %>% sd)
  }
  # sharp ratio
  SR = rbind(SR,
             mi/sig)
  
  retornos = rbind(retornos,
                   mi)
}
colnames(SR) <- colnames(retornos) <- paste0("lag_",lags)
rownames(SR) <- rownames(retornos) <- acoes
cat("Sharp Ratio (risco-retorno): \n");print((SR %>% colMeans) %>% round(2));cat("\n")
Sharp Ratio (risco-retorno): 
  lag_1   lag_5  lag_10  lag_20  lag_40  lag_80 lag_160 
  -3.52   10.11   18.65   28.32   40.06   55.16   89.81 
cat("EAR (%): \n");print(((retornos %>% colMeans)*100) %>% round(2))
EAR (%): 
  lag_1   lag_5  lag_10  lag_20  lag_40  lag_80 lag_160 
  -9.30   12.36   16.23   18.28   19.41   19.30   21.74 

Retornos para cada papel, por lag e em %:

print((retornos*100) %>% round(2))
           lag_1  lag_5 lag_10 lag_20 lag_40 lag_80 lag_160
ABEV3.SA   -9.56  -7.78  -7.48  -6.73  -6.50  -7.44   -6.30
B3SA3.SA   40.06  41.62  42.88  43.63  43.22  39.06   37.91
BBAS3.SA  -25.62   3.38   8.82  12.14  14.63  14.33   19.27
BBDC4.SA  -12.82   4.38   7.79   9.80  11.11  11.25   15.97
BBSE3.SA  -14.14  -4.55  -2.16  -0.61   0.14  -0.73    1.44
BOVA11.SA -13.39  10.33  13.95  15.84  16.69  15.85   18.51
BRFS3.SA  -35.64 -24.53 -22.88 -22.55 -22.52 -21.27  -19.52
BRKM5.SA  -14.49   6.72   8.92   9.04   7.73   4.30    2.13
BRML3.SA   -4.65   2.86   5.07   5.07   6.90   5.42    8.59
CCRO3.SA   -4.35  -2.61  -1.45   0.62   2.48   1.61    2.71
CIEL3.SA  -41.27 -32.13 -30.35 -29.46 -29.61 -31.47  -30.38
CMIG4.SA  -35.10  -3.73   2.32   6.45   8.87   9.20   13.77
COGN3.SA  -30.08 -10.66  -7.08  -4.06  -2.79  -7.82   -6.77
CSAN3.SA   36.80  35.59  36.27  36.32  33.99  29.09   27.62
CSNA3.SA  -46.31  13.04  21.55  21.45  21.89  18.99   18.34
CYRE3.SA    1.49  19.25  22.71  25.26  25.87  21.81   24.95
ECOR3.SA   -6.83   9.89  13.21  15.93  17.03  17.34   22.91
EGIE3.SA  -13.49   4.95   8.25   9.85  10.55   9.91   11.76
ELET3.SA  -24.17  28.96  39.33  45.16  47.27  44.41   47.19
EMBR3.SA  -41.72 -25.26 -22.77 -22.05 -21.81 -23.58  -19.54
EQTL3.SA   35.08  29.36  29.68  30.47  30.61  28.14   29.36
GGBR4.SA  -33.45  14.37  20.30  21.94  22.56  22.29   28.02
GOAU4.SA  -38.27   9.06  14.73  16.27  18.14  22.33   32.76
HYPE3.SA   18.16  15.00  15.80  17.94  17.40  13.36   11.12
ITSA4.SA  -14.35   4.59   7.99   9.91  10.67  10.18   13.22
ITUB4.SA  -10.72   4.14   6.96   8.68   9.70   9.11   11.72
JBSS3.SA  -17.83   4.87   6.70   6.47   6.81   9.18   14.76
LAME4.SA   -3.46  15.16  18.64  20.22  20.35  18.11   14.61
LREN3.SA   22.65  20.81  21.70  21.64  22.40  23.02   27.31
MGLU3.SA   31.47 161.41 186.54 205.69 226.34 252.03  254.10
MRFG3.SA  -20.57  11.25  14.55  15.97  16.05  16.83   15.33
PETR4.SA  -33.37   8.32  15.01  19.69  22.75  23.22   29.33
QUAL3.SA    3.44   8.16   9.80  10.47  12.21  11.42   17.10
RADL3.SA    1.99  19.09  21.92  23.57  24.16  24.29   25.34
RAIL3.SA    5.38  26.33  29.88  31.74  34.99  37.36   49.17
RENT3.SA   39.03  46.19  49.20  50.04  47.80  44.45   48.09
SBSP3.SA   30.27  29.70  30.44  30.99  31.13  28.00   26.33
SUZB3.SA   -7.25  29.77  33.88  36.22  34.58  33.97   16.66
TAEE11.SA -22.73   2.12   6.13   7.95   8.09   8.83   10.76
USIM5.SA  -56.52   2.12  11.81  13.24  15.74  18.56   33.38
VALE3.SA  -19.34  19.00  23.69  25.37  26.61  29.56   34.01
VIVT4.SA   -1.33   3.25   4.01   4.42   5.10   5.17    7.14
VVAR3.SA  -44.46   5.71  22.66  37.22  43.83  53.08   47.74
WEGE3.SA   -7.78  29.41  35.18  38.54  38.18  35.65   36.44
YDUQ3.SA    8.16  17.76  19.63  20.66  20.31  18.35   24.99
BBDC3.SA   -2.81   3.97   5.84   6.89   7.48   7.09   11.43
BRAP4.SA    4.00  32.33  34.58  35.23  36.11  40.65   51.12
ENBR3.SA  -12.32   4.40   7.25   8.42   9.15   8.78   10.47
FLRY3.SA  -13.19  15.67  20.95  23.41  25.42  26.19   29.41
KLBN4.SA  -35.20   4.76  11.17  13.85  13.83  13.02   11.28
MULT3.SA   16.24  10.36  10.73  10.13   9.94   9.29   12.18
LEVE3.SA  -38.72 -11.97  -7.69  -6.00  -5.17  -6.13   -3.17
SANB11.SA  13.46  14.68  15.05  15.95  16.66  15.46   19.12
TIMP3.SA    8.16  11.00  12.01  12.14  13.58  13.47   17.22
UGPA3.SA  -20.07 -11.94 -11.15 -10.89 -11.23 -12.82  -12.62

EAR buy & hold para cada papel, em %:

retornos_bh = NULL
for (papel in acoes) {
  precos = read.csv(paste0(papel),row.names = 1)
  N = nrow(precos)
  price_sell = precos$price.close[N]
  price_buy = precos$price.open[i]
  
  rend = price_sell/price_buy
  EAR = (rend)^(250/N) - 1
  
  retornos_bh = rbind(retornos_bh,EAR)
}

rownames(retornos_bh) <- acoes
colnames(retornos_bh) <- "EAR"
print((retornos_bh*100) %>% round(2))
             EAR
ABEV3.SA   -7.61
B3SA3.SA   31.02
BBAS3.SA    8.48
BBDC4.SA    5.03
BBSE3.SA   -4.57
BOVA11.SA  14.17
BRFS3.SA  -16.03
BRKM5.SA   -0.81
BRML3.SA   -2.37
CCRO3.SA   -1.72
CIEL3.SA  -29.61
CMIG4.SA    7.69
COGN3.SA  -12.13
CSAN3.SA   21.27
CSNA3.SA    2.05
CYRE3.SA   17.80
ECOR3.SA   14.39
EGIE3.SA    6.90
ELET3.SA   36.05
EMBR3.SA  -20.16
EQTL3.SA   23.59
GGBR4.SA   20.80
GOAU4.SA   26.67
HYPE3.SA    2.27
ITSA4.SA    6.88
ITUB4.SA    4.11
JBSS3.SA   21.01
LAME4.SA   17.45
LREN3.SA   19.04
MGLU3.SA  191.41
MRFG3.SA   22.43
PETR4.SA   19.66
QUAL3.SA   12.73
RADL3.SA   14.73
RAIL3.SA   43.93
RENT3.SA   38.74
SBSP3.SA   15.24
SUZB3.SA    5.12
TAEE11.SA   7.37
USIM5.SA   34.48
VALE3.SA   25.53
VIVT4.SA    2.72
VVAR3.SA   50.63
WEGE3.SA   44.97
YDUQ3.SA   21.53
BBDC3.SA    1.60
BRAP4.SA   42.12
ENBR3.SA    8.02
FLRY3.SA   16.62
KLBN4.SA   15.48
MULT3.SA    3.30
LEVE3.SA   -6.01
SANB11.SA  11.06
TIMP3.SA   15.11
UGPA3.SA  -11.69

4 Considerações

1 - Há uma relação diretamente proporcional entre rentabilidade e tempo posicionado até fechar a operação (lag), bem como entre risco-retorno e lag.

2 - Embora a estratégia seja a mais naïve possível, é ilustrativa sobre como o mercado, no curto prazo, assume um caráter mais aleatório que determinístico, com flutuações pontuais sendo tanto mais relevantes quanto menor for o período posicionado. No longo prazo, as distorções de mercado tendem a se cancelar.

3 - Comprar e esquecer a ação, sem considerar mudanças nos fundamentos, pode levar a resultados piores que a estratégia usada.

LS0tCnRpdGxlOiAiQW7DoWxpc2UgcG9yIExhZyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIDEgLSBDb25maWd1cmHDp8O1ZXMgSW5pY2lhaXMKCiMjIDEuMSA8aT5MYWdzPC9pPgoKTsK6IGRlIHByZWfDtWVzIGVudHJlIGEgY29tcHJhIHBlbGEgYWJlcnR1cmEgZSBhIHZlbmRhIHBlbG8gZmVjaGFtZW50byAoPGk+IGRheSB0cmFkZSA8L2k+IHRlbSA8aT4gbGFnIDwvaT4gaWd1YWwgYSAxKTogMSwgNSwgMTAsIDIwLCA0MCwgODAgZSAxNjAuCgpgYGB7cn0KbGFncyA9IGMoMSw1LDEwLHNlcSgyMCwxNjAsYnk9MjApKQpgYGAKCiMjIDEuMiBDYXJyZWdhbWVudG8gZG9zIGRhZG9zIGRlIEJPVkExMQpgYGB7cn0KcHJlY29zID0gcmVhZC5jc3YoIkJPVkExMS5TQSIscm93Lm5hbWVzID0gMSkKCmNhdCgiUHJpbWVpcm8gcHJlZ8OjbzogIik7Y2F0KHJvd25hbWVzKHByZWNvcylbMV0pO2NhdCgiXG4iKQpjYXQoIsOabHRpbW8gcHJlZ8OjbzogIik7Y2F0KHJvd25hbWVzKHByZWNvcylbbnJvdyhwcmVjb3MpXSk7Y2F0KCJcbiIpCmBgYAoKIyAyIEVzdHJhdMOpZ2lhIAoKQ29tcHJhIHBlbGEgYWJlcnR1cmEgZW0gRCswIGUgdmVuZGEgcGVsbyBmZWNoYW1lbnRvIGVtIEQgKyBsYWcgLSAxLgoKYGBge3J9CnByaWNlX3NlbGwgPSBwcmVjb3MkcHJpY2UuY2xvc2UKcHJpY2VfYnV5ID0gcHJlY29zJHByaWNlLm9wZW4KTiA9IGxlbmd0aChwcmljZV9zZWxsKQpgYGAKCkF2YWxpYcOnw6NvIGRvcyByZW5kaW1lbnRvcyBwYXJhIGNhZGEgPGk+bGFnPC9pPi4gQSByZW50YWJpbGlkYWRlIHRvdGFsIMOpIGEgbcOpZGlhIGdlb23DqXRyaWNhIGRhcyByZW50YWJpbGlkYWRlcyBkZSBjYWRhIG9wZXJhw6fDo28sIGrDoSBxdWUgb2NvcnJlbSBjb25zZWN1dGl2YW1lbnRlLiBBIGFudWFsaXphw6fDo28gZm9pIGZlaXRhIGNvbnNpZGVyYW5kbyAyNTAgcHJlZ8O1ZXMgZW0gMSBhbm8uIE8gcmlzY28gZm9pIG1lbnN1cmFkbyBwZWxvIGRlc3Zpby1wYWRyw6NvIGRvcyByZXRvcm5vcyBkacOhcmlvcywgdXNhbmRvIGEgbcOpZGlhIGFyaXRtw6l0aWNhIGRvIHJldG9ybm8gbm8gcGVyw61vZG8uIFAuIGV4Liwgc2Ugbm8gPGk+bGFnPC9pPiBkZSA0MCBwcmVnw7VlcywgYSByZW50YWJpbGlkYWRlIGRlIHVtYSBvcGVyYcOnw6NvIGZvaSA0JSwgc2V1IHJlbmRpbWVudG8gZGnDoXJpbyBmb2kgZGUgMC4xJSwgZSBlc3NlIHZhbG9yIHNlcsOhIHVzYWRvIHBhcmEgZXN0aW1hciBvIHJpc2NvLiAKCmBgYHtyfQojIHZhcmnDoXZlaXMgcGFyYSBhcm1hemVuYW1lbnRvIGRvcyByZXRvcm5vcyBlIGRvcyByaXNjb3MKbWkgPC0gc2lnIDwtIFNSIDwtIHJldG9ybm9zIDwtIE5VTEwKZm9yIChpIGluIGxhZ3MpIHsKICAjIFZhbG9yIGRlIDEgKyByZW50YWJpbGlkYWRlCiAgcmVuZCA9IHByaWNlX3NlbGxbaTpOXS9wcmljZV9idXlbMTooTi1pKzEpXQogIGhpc3QoKHJlbmQtMSkvaSoxMDAsCiAgICAgICBtYWluID0gcGFzdGUwKCJsYWcgPSAiLGkpLAogICAgICAgeGxhYiA9ICJyZW5kaW1lbnRvcyBkacOhcmlvcyAoJSkiKQogICMgQ29tcG9zacOnw6NvIGUgYW51YWxpemHDp8OjbyBkb3MgcmV0b3Jub3MKICBFQVIgPSAocHJhY21hOjpnZW9tZWFuKHJlbmQpKV4oMjUwL2kpIC0gMQogIAogICMgbcOpZGlhIGRvcyByZXRvcm5vcwogIG1pID0gYyhtaSwKICAgICAgICAgRUFSKQogICMgZGVzdnBhZCBkb3MgcmV0b3Jub3MgZGnDoXJpb3MgLSByaXNjbwogIHNpZyA9IGMoc2lnLAogICAgICAgICAgKHJlbmQvaSkgJT4lIHNkKQp9CiMgU2hhcnAgUmF0aW86IG1lZGlkYSBkZSByaXNjby1yZXRvcm5vClNSID0gcmJpbmQoU1IsCiAgICAgICAgICAgbWkvc2lnKQpyZXRvcm5vcyA9IHJiaW5kKHJldG9ybm9zLAogICAgICAgICAgICAgICAgIG1pKQpgYGAKCmBgYHtyfQpwbG90KGxhZ3MscmV0b3Jub3MsdHlwZSA9ICJsIiwKICAgICB4bGFiID0gImxhZ3MiLHlsYWIgPSAicmV0b3JubyBtw6lkaW8gYW51YWxpemFkbyAoRUFSKSIpCnBsb3QobGFncyxTUix0eXBlID0gImwiLAogICAgIHhsYWIgPSAibGFncyIseWxhYiA9ICJzaGFycCByYXRpbyIpCgpgYGAKCiMgMyBBbsOhbGlzZSBwYXJhIFbDoXJpYXMgQcOnw7VlcwoKIyMgMy4xIENvbmZpZ3VyYcOnw7VlcyBJbmljaWFpcwpgYGB7cn0KIyBwYXDDqWlzIGFuYWxpc2Fkb3MKYWNvZXMgPSBjKCJhYmV2MyIsImIzc2EzIiwiYmJhczMiLCJiYmRjNCIsImJic2UzIiwiYm92YTExIiwiYnJmczMiLCJicmttNSIsCiAgICAgICAgICAiYnJtbDMiLCJjY3JvMyIsImNpZWwzIiwiY21pZzQiLCJjb2duMyIsImNzYW4zIiwiY3NuYTMiLCJjeXJlMyIsCiAgICAgICAgICAiZWNvcjMiLCJlZ2llMyIsImVsZXQzIiwiZW1icjMiLCJlcXRsMyIsImdnYnI0IiwiZ29hdTQiLCJoeXBlMyIsCiAgICAgICAgICAiaXRzYTQiLCJpdHViNCIsImpic3MzIiwibGFtZTQiLCJscmVuMyIsIm1nbHUzIiwibXJmZzMiLCJwZXRyNCIsCiAgICAgICAgICAicXVhbDMiLCJyYWRsMyIsInJhaWwzIiwicmVudDMiLCJzYnNwMyIsInN1emIzIiwidGFlZTExIiwidXNpbTUiLAogICAgICAgICAgInZhbGUzIiwidml2dDQiLCJ2dmFyMyIsIndlZ2UzIiwieWR1cTMiLAogICAgICAgICAgImJiZGMzIiwiYnJhcDQiLCJlbmJyMyIsImZscnkzIiwia2xibjQiLCJtdWx0MyIsImxldmUzIiwic2FuYjExIiwKICAgICAgICAgICJ0aW1wMyIsInVncGEzIikKYWNvZXMgPSBwYXN0ZTAoYWNvZXMsIi5TQSIpICU+JSBjYXNlZm9sZCh1cHBlciA9IFQpCgojIGxhZ3MKbGFncyA9IGMoMSw1LDEwLDIwLDQwLDgwLDE2MCkKYGBgCgojIyAzLjIgUHJvY2Vzc2FtZW50bwpgYGB7cn0KU1IgPC0gcmV0b3Jub3MgPC0gTlVMTApmb3IgKHBhcGVsIGluIGFjb2VzKSB7CiAgcHJlY29zID0gcmVhZC5jc3YocGFzdGUwKHBhcGVsKSxyb3cubmFtZXMgPSAxKQogIHByaWNlX3NlbGwgPSBwcmVjb3MkcHJpY2UuY2xvc2UKICBwcmljZV9idXkgPSBwcmVjb3MkcHJpY2Uub3BlbgogIE4gPSBsZW5ndGgocHJpY2Vfc2VsbCkKICAKICBtaSA8LSBzaWcgPC0gTlVMTAogIGZvciAoaSBpbiBsYWdzKSB7CiAgICAjIHJlbmRpbWVudG9zIGFudWFsaXphZG9zIC0gMjUwIHByZWfDtWVzL2FubwogICAgcmVuZCA9IHByaWNlX3NlbGxbaTpOXS9wcmljZV9idXlbMTooTi1pKzEpXQogICAgRUFSID0gKHByYWNtYTo6Z2VvbWVhbihyZW5kKSleKDI1MC9pKSAtIDEKICAgIAogICAgIyByZXRvcm5vcwogICAgbWkgPSBjKG1pLAogICAgICAgICAgIEVBUikKICAgICMgcmlzY29zCiAgICBzaWcgPSBjKHNpZywKICAgICAgICAgICAgKHJlbmQvaSkgJT4lIHNkKQogIH0KICAjIHNoYXJwIHJhdGlvCiAgU1IgPSByYmluZChTUiwKICAgICAgICAgICAgIG1pL3NpZykKICAKICByZXRvcm5vcyA9IHJiaW5kKHJldG9ybm9zLAogICAgICAgICAgICAgICAgICAgbWkpCn0KY29sbmFtZXMoU1IpIDwtIGNvbG5hbWVzKHJldG9ybm9zKSA8LSBwYXN0ZTAoImxhZ18iLGxhZ3MpCnJvd25hbWVzKFNSKSA8LSByb3duYW1lcyhyZXRvcm5vcykgPC0gYWNvZXMKY2F0KCJTaGFycCBSYXRpbyAocmlzY28tcmV0b3Jubyk6IFxuIik7cHJpbnQoKFNSICU+JSBjb2xNZWFucykgJT4lIHJvdW5kKDIpKTtjYXQoIlxuIikKY2F0KCJFQVIgKCUpOiBcbiIpO3ByaW50KCgocmV0b3Jub3MgJT4lIGNvbE1lYW5zKSoxMDApICU+JSByb3VuZCgyKSkKYGBgCgpSZXRvcm5vcyBwYXJhIGNhZGEgcGFwZWwsIHBvciA8aT5sYWc8L2k+IGUgZW0gJToKCmBgYHtyfQpwcmludCgocmV0b3Jub3MqMTAwKSAlPiUgcm91bmQoMikpCmBgYAoKRUFSIDxpPmJ1eSAmIGhvbGQ8L2k+IHBhcmEgY2FkYSBwYXBlbCwgZW0gJToKYGBge3J9CnJldG9ybm9zX2JoID0gTlVMTApmb3IgKHBhcGVsIGluIGFjb2VzKSB7CiAgcHJlY29zID0gcmVhZC5jc3YocGFzdGUwKHBhcGVsKSxyb3cubmFtZXMgPSAxKQogIE4gPSBucm93KHByZWNvcykKICBwcmljZV9zZWxsID0gcHJlY29zJHByaWNlLmNsb3NlW05dCiAgcHJpY2VfYnV5ID0gcHJlY29zJHByaWNlLm9wZW5baV0KICAKICByZW5kID0gcHJpY2Vfc2VsbC9wcmljZV9idXkKICBFQVIgPSAocmVuZCleKDI1MC9OKSAtIDEKICAKICByZXRvcm5vc19iaCA9IHJiaW5kKHJldG9ybm9zX2JoLEVBUikKfQoKcm93bmFtZXMocmV0b3Jub3NfYmgpIDwtIGFjb2VzCmNvbG5hbWVzKHJldG9ybm9zX2JoKSA8LSAiRUFSIgpwcmludCgocmV0b3Jub3NfYmgqMTAwKSAlPiUgcm91bmQoMikpCmBgYAoKCiMgNCBDb25zaWRlcmHDp8O1ZXMKMSAtIEjDoSB1bWEgcmVsYcOnw6NvIGRpcmV0YW1lbnRlIHByb3BvcmNpb25hbCBlbnRyZSByZW50YWJpbGlkYWRlIGUgdGVtcG8gcG9zaWNpb25hZG8gYXTDqSBmZWNoYXIgYSBvcGVyYcOnw6NvICg8aT5sYWc8L2k+KSwgYmVtIGNvbW8gZW50cmUgcmlzY28tcmV0b3JubyBlIDxpPmxhZzwvaT4uCgoyIC0gRW1ib3JhIGEgZXN0cmF0w6lnaWEgc2VqYSBhIG1haXMgPGk+bmHDr3ZlPC9pPiBwb3Nzw612ZWwsIMOpIGlsdXN0cmF0aXZhIHNvYnJlIGNvbW8gbyBtZXJjYWRvLCBubyBjdXJ0byBwcmF6bywgYXNzdW1lIHVtIGNhcsOhdGVyIG1haXMgYWxlYXTDs3JpbyBxdWUgZGV0ZXJtaW7DrXN0aWNvLCBjb20gZmx1dHVhw6fDtWVzIHBvbnR1YWlzIHNlbmRvIHRhbnRvIG1haXMgcmVsZXZhbnRlcyBxdWFudG8gbWVub3IgZm9yIG8gcGVyw61vZG8gcG9zaWNpb25hZG8uIE5vIGxvbmdvIHByYXpvLCBhcyBkaXN0b3LDp8O1ZXMgZGUgbWVyY2FkbyB0ZW5kZW0gYSBzZSBjYW5jZWxhci4KCjMgLSBDb21wcmFyIGUgZXNxdWVjZXIgYSBhw6fDo28sIHNlbSBjb25zaWRlcmFyIG11ZGFuw6dhcyBub3MgZnVuZGFtZW50b3MsIHBvZGUgbGV2YXIgYSByZXN1bHRhZG9zIHBpb3JlcyBxdWUgYSBlc3RyYXTDqWdpYSB1c2FkYS4=