library(tidyverse)
library(here)
library(caret)
library(ggplot2)
options(max.print = .Machine$integer.max)
set.seed(37)
theme_set(theme_minimal())

Introdução

Nesta análise iremos construir modelos preditivos de regressão para a predição de votação de candidatos à Câmara Federal de Deputados. Anteriormente, nesta análise, buscamos explicar essas votações através da regressão linear multivariada.

Uma regressão com muitos coeficientes torna o modelo muito complexo, dificultando sua interpretação. Uma das consequências disso é o overfitting, que acontece quando o modelo se adapta ao ruído dos dados. Os métodos Ridge, Lasso e KNN são uma forma de eliminar esse problema, pois reduzem a complexidade do modelo, minimizando as chances do overfitting acontecer.

Nesta análise, utilizaremos estes métodos para prever a quantidade de votos que um candidato receberá.

Primeiramente, vamos importar nossos dados. Uma melhor descrição das variáveis pode ser encontrada, também, aqui.

train <- read.csv(here("data/train.csv"))

Perguntas

Usando todas as variáveis disponíveis, tune (usando validação cruzada): (i) um modelo de regressão Ridge, (ii) um modelo de regressão Lasso e (iii) um modelo KNN. Para os modelos de regressão linear, o parâmetro a ser tunado é o lambda (penalização dos coeficientes) e o KNN o número de vizinhos.

Inicialmente, vamos retirar dos nossos dados as colunas que servem apenas para identificar um candidato, a variável cargo, que possui apenas um valor, e as variáveis categóricas de vários níveis.

train <- train %>% 
  select(-sequencial_candidato,
         -nome,
         -cargo,
         -uf,
         -ocupacao)

Agora, vamos utilizar a validação cruzada.

fitControl <- trainControl(method = "cv",
                           number = 10,
                           search = "random")

(i) Modelo de Regressão Ridge.

lambdaGrid <- expand.grid(lambda = 10^seq(10, -2, length=100))

ridge <- train(votos ~ ., 
               data = train,
               method = "ridge",
               trControl = fitControl,
               preProcess = c('scale', 'center', 'nzv'),
               tuneGrid = lambdaGrid)
ridge
# Ridge Regression 
# 
# 7476 samples
#   18 predictor
# 
# Pre-processing: scaled (27), centered (27), remove (28) 
# Resampling: Cross-Validated (10 fold) 
# Summary of sample sizes: 6728, 6728, 6729, 6728, 6729, 6728, ... 
# Resampling results across tuning parameters:
# 
#   lambda        RMSE       Rsquared   MAE     
#   1.000000e-02   37285.91  0.4108784  16191.83
#   1.321941e-02   37311.86  0.4106387  16192.27
#   1.747528e-02   37345.55  0.4103062  16191.31
#   2.310130e-02   37387.56  0.4098917  16187.08
#   3.053856e-02   37438.91  0.4094078  16177.98
#   4.037017e-02   37501.53  0.4088640  16163.30
#   5.336699e-02   37578.79  0.4082613  16141.69
#   7.054802e-02   37676.22  0.4075885  16110.63
#   9.326033e-02   37802.50  0.4068199  16069.10
#   1.232847e-01   37970.89  0.4059166  16023.47
#   1.629751e-01   38201.46  0.4048305  15976.69
#   2.154435e-01   38524.55  0.4035123  15935.85
#   2.848036e-01   38985.86  0.4019229  15917.25
#   3.764936e-01   39653.28  0.4000447  15957.85
#   4.977024e-01   40624.93  0.3978911  16099.52
#   6.579332e-01   42035.99  0.3955093  16416.33
#   8.697490e-01   44059.65  0.3929765  17012.19
#   1.149757e+00   46896.07  0.3903894  18045.90
#   1.519911e+00   50744.43  0.3878512  19634.59
#   2.009233e+00   55759.84  0.3854564  21959.49
#   2.656088e+00   62005.33  0.3832791  24998.55
#   3.511192e+00   69414.73  0.3813659  28829.52
#   4.641589e+00   77780.33  0.3797344  33252.63
#   6.135907e+00   86772.26  0.3783782  38022.49
#   8.111308e+00   95986.84  0.3772743  42917.56
#   1.072267e+01  105011.22  0.3763908  47711.89
#   1.417474e+01  113485.88  0.3756930  52226.75
#   1.873817e+01  121148.12  0.3751474  56312.88
#   2.477076e+01  127848.40  0.3747242  59887.26
#   3.274549e+01  133541.96  0.3743979  62926.80
#   4.328761e+01  138265.10  0.3741474  65446.96
#   5.722368e+01  142106.50  0.3739558  67494.13
#   7.564633e+01  145181.19  0.3738097  69131.47
#   1.000000e+02  147611.02  0.3736984  70425.22
#   1.321941e+02  149512.05  0.3736139  71437.73
#   1.747528e+02  150987.74  0.3735497  72225.15
#   2.310130e+02  152126.30  0.3735010  72833.07
#   3.053856e+02  153000.66  0.3734641  73299.77
#   4.037017e+02  153669.70  0.3734361  73656.83
#   5.336699e+02  154180.23  0.3734149  73929.25
#   7.054802e+02  154569.00  0.3733989  74136.66
#   9.326033e+02  154864.56  0.3733867  74294.32
#   1.232847e+03  155089.00  0.3733775  74414.03
#   1.629751e+03  155259.27  0.3733706  74504.84
#   2.154435e+03  155388.35  0.3733653  74573.68
#   2.848036e+03  155486.16  0.3733613  74625.84
#   3.764936e+03  155560.24  0.3733583  74665.35
#   4.977024e+03  155616.33  0.3733560  74695.26
#   6.579332e+03  155658.79  0.3733543  74717.90
#   8.697490e+03  155690.93  0.3733530  74735.04
#   1.149757e+04  155715.25  0.3733520  74748.01
#   1.519911e+04  155733.66  0.3733513  74757.82
#   2.009233e+04  155747.58  0.3733507  74765.25
#   2.656088e+04  155758.12  0.3733503  74770.86
#   3.511192e+04  155766.09  0.3733500  74775.12
#   4.641589e+04  155772.12  0.3733497  74778.33
#   6.135907e+04  155776.68  0.3733495  74780.76
#   8.111308e+04  155780.13  0.3733494  74782.60
#   1.072267e+05  155782.74  0.3733493  74784.00
#   1.417474e+05  155784.72  0.3733492  74785.05
#   1.873817e+05  155786.21  0.3733492  74785.85
#   2.477076e+05  155787.34  0.3733491  74786.45
#   3.274549e+05  155788.20  0.3733491  74786.90
#   4.328761e+05  155788.84  0.3733490  74787.25
#   5.722368e+05  155789.33  0.3733490  74787.51
#   7.564633e+05  155789.70  0.3733490  74787.71
#   1.000000e+06  155789.98  0.3733490  74787.86
#   1.321941e+06  155790.20  0.3733490  74787.97
#   1.747528e+06  155790.36  0.3733490  74788.05
#   2.310130e+06  155790.48  0.3733490  74788.12
#   3.053856e+06  155790.57  0.3733490  74788.17
#   4.037017e+06  155790.64  0.3733490  74788.21
#   5.336699e+06  155790.69  0.3733490  74788.23
#   7.054802e+06  155790.73  0.3733490  74788.25
#   9.326033e+06  155790.76  0.3733490  74788.27
#   1.232847e+07  155790.78  0.3733490  74788.28
#   1.629751e+07  155790.80  0.3733490  74788.29
#   2.154435e+07  155790.81  0.3733490  74788.30
#   2.848036e+07  155790.82  0.3733490  74788.30
#   3.764936e+07  155790.83  0.3733490  74788.31
#   4.977024e+07  155790.84  0.3733490  74788.31
#   6.579332e+07  155790.84  0.3733490  74788.31
#   8.697490e+07  155790.84  0.3733490  74788.32
#   1.149757e+08  155790.85  0.3733490  74788.32
#   1.519911e+08  155790.85  0.3733490  74788.32
#   2.009233e+08  155790.85  0.3733490  74788.32
#   2.656088e+08  155790.85  0.3733490  74788.32
#   3.511192e+08  155790.85  0.3733490  74788.32
#   4.641589e+08  155790.85  0.3733490  74788.32
#   6.135907e+08  155790.85  0.3733490  74788.32
#   8.111308e+08  155790.85  0.3733490  74788.32
#   1.072267e+09  155790.85  0.3733490  74788.32
#   1.417474e+09  155790.85  0.3733490  74788.32
#   1.873817e+09  155790.85  0.3733490  74788.32
#   2.477076e+09  155790.85  0.3733490  74788.32
#   3.274549e+09  155790.85  0.3733490  74788.32
#   4.328761e+09  155790.85  0.3733490  74788.32
#   5.722368e+09  155790.85  0.3733490  74788.32
#   7.564633e+09  155790.85  0.3733490  74788.32
#   1.000000e+10  155790.85  0.3733490  74788.32
# 
# RMSE was used to select the optimal model using the smallest value.
# The final value used for the model was lambda = 0.01.

(ii) Modelo de Regressão Lasso

fractionGrid <- expand.grid(fraction = seq(.1, .9, length = 100))

lasso <- train(votos ~ ., 
               data = train,
               method = "lasso",
               trControl = fitControl,
               preProcess = c('scale', 'center', 'nzv'),
               tuneGrid = fractionGrid)
lasso
# The lasso 
# 
# 7476 samples
#   18 predictor
# 
# Pre-processing: scaled (27), centered
#  (27), remove (28) 
# Resampling: Cross-Validated (10 fold) 
# Summary of sample sizes: 6728, 6730, 6728, 6728, 6728, 6729, ... 
# Resampling results across tuning parameters:
# 
#   fraction   RMSE      Rsquared   MAE     
#   0.1000000  38642.19  0.3848477  16315.32
#   0.1080808  38834.80  0.3828931  16324.38
#   0.1161616  39032.77  0.3811543  16333.44
#   0.1242424  39235.42  0.3796083  16342.50
#   0.1323232  39442.17  0.3782330  16351.55
#   0.1404040  39652.53  0.3770081  16360.61
#   0.1484848  39866.06  0.3759153  16369.67
#   0.1565657  40082.41  0.3749386  16378.73
#   0.1646465  40301.24  0.3740637  16387.79
#   0.1727273  40522.30  0.3732780  16396.85
#   0.1808081  40745.34  0.3725709  16405.91
#   0.1888889  40970.15  0.3719329  16414.97
#   0.1969697  41196.56  0.3713559  16424.03
#   0.2050505  41424.41  0.3708327  16433.09
#   0.2131313  41653.56  0.3703572  16442.15
#   0.2212121  41883.88  0.3699240  16451.21
#   0.2292929  42115.28  0.3695285  16460.27
#   0.2373737  42347.66  0.3691666  16469.33
#   0.2454545  42580.92  0.3688347  16478.39
#   0.2535354  42815.00  0.3685298  16487.45
#   0.2616162  43049.83  0.3682489  16496.51
#   0.2696970  43285.35  0.3679899  16505.57
#   0.2777778  43521.50  0.3677504  16514.63
#   0.2858586  43758.24  0.3675287  16523.69
#   0.2939394  43995.52  0.3673230  16532.75
#   0.3020202  44233.30  0.3671319  16541.81
#   0.3101010  44471.54  0.3669541  16550.87
#   0.3181818  44710.22  0.3667884  16559.93
#   0.3262626  44949.30  0.3666337  16568.99
#   0.3343434  45188.76  0.3664891  16578.05
#   0.3424242  45428.57  0.3663537  16587.11
#   0.3505051  45668.71  0.3662268  16596.17
#   0.3585859  45909.15  0.3661077  16605.23
#   0.3666667  46149.89  0.3659958  16614.29
#   0.3747475  46390.89  0.3658905  16623.35
#   0.3828283  46632.15  0.3657913  16632.41
#   0.3909091  46873.65  0.3656978  16641.47
#   0.3989899  47115.37  0.3656095  16650.52
#   0.4070707  47357.31  0.3655260  16659.58
#   0.4151515  47599.45  0.3654471  16668.64
#   0.4232323  47841.78  0.3653723  16677.70
#   0.4313131  48084.29  0.3653015  16686.76
#   0.4393939  48326.97  0.3652343  16695.82
#   0.4474747  48569.81  0.3651705  16704.88
#   0.4555556  48812.80  0.3651098  16713.94
#   0.4636364  49055.94  0.3650521  16723.00
#   0.4717172  49299.22  0.3649972  16732.06
#   0.4797980  49542.64  0.3649449  16741.12
#   0.4878788  49786.17  0.3648950  16750.18
#   0.4959596  50029.83  0.3648474  16759.24
#   0.5040404  50273.60  0.3648019  16768.30
#   0.5121212  50517.48  0.3647585  16777.36
#   0.5202020  50761.46  0.3647170  16786.42
#   0.5282828  51005.54  0.3646773  16795.48
#   0.5363636  51249.72  0.3646393  16804.54
#   0.5444444  51493.99  0.3646028  16813.60
#   0.5525253  51738.35  0.3645679  16822.66
#   0.5606061  51982.78  0.3645344  16831.72
#   0.5686869  52227.30  0.3645022  16840.78
#   0.5767677  52471.90  0.3644714  16849.84
#   0.5848485  52716.57  0.3644417  16858.90
#   0.5929293  52961.31  0.3644132  16867.96
#   0.6010101  53206.11  0.3643858  16877.02
#   0.6090909  53450.98  0.3643594  16886.08
#   0.6171717  53695.92  0.3643340  16895.14
#   0.6252525  53940.91  0.3643095  16904.20
#   0.6333333  54185.97  0.3642859  16913.26
#   0.6414141  54431.08  0.3642632  16922.32
#   0.6494949  54676.24  0.3642412  16931.38
#   0.6575758  54921.45  0.3642201  16940.44
#   0.6656566  55166.72  0.3641996  16949.49
#   0.6737374  55412.03  0.3641799  16958.55
#   0.6818182  55657.39  0.3641608  16967.61
#   0.6898990  55902.80  0.3641424  16976.67
#   0.6979798  56148.24  0.3641245  16985.73
#   0.7060606  56393.73  0.3641073  16994.79
#   0.7141414  56639.27  0.3640906  17003.85
#   0.7222222  56884.84  0.3640744  17012.91
#   0.7303030  57130.44  0.3640588  17021.97
#   0.7383838  57376.09  0.3640436  17031.03
#   0.7464646  57621.77  0.3640289  17040.09
#   0.7545455  57867.48  0.3640147  17049.15
#   0.7626263  58113.23  0.3640008  17058.21
#   0.7707071  58359.01  0.3639874  17067.27
#   0.7787879  58604.82  0.3639744  17076.33
#   0.7868687  58850.67  0.3639618  17085.39
#   0.7949495  59096.54  0.3639495  17094.45
#   0.8030303  59342.44  0.3639376  17103.51
#   0.8111111  59588.37  0.3639260  17112.57
#   0.8191919  59834.32  0.3639148  17121.63
#   0.8272727  60080.30  0.3639038  17130.69
#   0.8353535  60326.31  0.3638932  17139.75
#   0.8434343  60572.34  0.3638828  17148.81
#   0.8515152  60818.40  0.3638728  17157.87
#   0.8595960  61064.48  0.3638629  17166.93
#   0.8676768  61310.58  0.3638534  17175.99
#   0.8757576  61556.70  0.3638441  17185.05
#   0.8838384  61802.85  0.3638350  17194.11
#   0.8919192  62049.01  0.3638262  17203.17
#   0.9000000  62295.20  0.3638176  17212.23
# 
# RMSE was used to select the optimal model
#  using the smallest value.
# The final value used for the model was
#  fraction = 0.1.

(iii) Modelo KNN.

knnGrid <- expand.grid(k = seq(1, 100, length=100))

knn <- train(votos ~ .,
             data = train,
             method = "knn",
             trControl = fitControl,
             preProcess = c('scale', 'center', 'nzv'),
             tuneGrid = knnGrid)
knn
# k-Nearest Neighbors 
# 
# 7476 samples
#   18 predictor
# 
# Pre-processing: scaled (27), centered (27), remove (28) 
# Resampling: Cross-Validated (10 fold) 
# Summary of sample sizes: 6728, 6728, 6728, 6728, 6728, 6729, ... 
# Resampling results across tuning parameters:
# 
#   k    RMSE      Rsquared   MAE     
#     1  39590.44  0.3862799  15381.88
#     2  37167.56  0.4294439  13930.65
#     3  35371.46  0.4630306  13314.64
#     4  34622.11  0.4798480  13073.82
#     5  34238.83  0.4892339  12835.11
#     6  34698.04  0.4785924  12911.47
#     7  34357.34  0.4886469  12837.88
#     8  34049.18  0.4980518  12759.87
#     9  34030.43  0.4990378  12799.41
#    10  34026.00  0.4991038  12812.29
#    11  33943.69  0.5019108  12786.70
#    12  33984.58  0.5011603  12840.54
#    13  33937.09  0.5031835  12869.59
#    14  33938.13  0.5037618  12882.91
#    15  33996.95  0.5022974  12941.52
#    16  33972.10  0.5037643  12965.29
#    17  33972.50  0.5040242  12991.06
#    18  33989.73  0.5041524  13013.16
#    19  33985.07  0.5046022  13047.05
#    20  34026.85  0.5036187  13067.02
#    21  34020.33  0.5043436  13106.36
#    22  34013.41  0.5047910  13109.82
#    23  33998.49  0.5053982  13111.13
#    24  34021.16  0.5045920  13132.46
#    25  34085.60  0.5026646  13168.65
#    26  34104.19  0.5022285  13176.22
#    27  34141.88  0.5008675  13209.97
#    28  34148.22  0.5011873  13212.88
#    29  34169.11  0.5012985  13215.41
#    30  34178.75  0.5014839  13230.16
#    31  34179.34  0.5018145  13220.68
#    32  34185.16  0.5021520  13214.24
#    33  34201.40  0.5018754  13215.76
#    34  34246.49  0.5009640  13223.09
#    35  34296.27  0.4994913  13260.76
#    36  34307.88  0.4993427  13271.57
#    37  34322.59  0.4992152  13283.17
#    38  34359.88  0.4985052  13299.53
#    39  34374.36  0.4979220  13318.58
#    40  34419.33  0.4965822  13348.06
#    41  34466.76  0.4953434  13379.65
#    42  34484.54  0.4950057  13411.82
#    43  34534.96  0.4935595  13455.70
#    44  34570.02  0.4926484  13498.04
#    45  34579.36  0.4927892  13513.46
#    46  34608.78  0.4920655  13540.12
#    47  34614.31  0.4923375  13561.26
#    48  34652.54  0.4912735  13589.55
#    49  34675.37  0.4906998  13616.94
#    50  34702.54  0.4901829  13637.19
#    51  34723.20  0.4898901  13649.42
#    52  34740.71  0.4896901  13668.01
#    53  34771.23  0.4888510  13686.12
#    54  34799.81  0.4881109  13719.47
#    55  34828.53  0.4872162  13752.63
#    56  34852.06  0.4866434  13779.02
#    57  34857.89  0.4865359  13790.75
#    58  34843.17  0.4874145  13797.83
#    59  34881.75  0.4862853  13815.79
#    60  34901.92  0.4857017  13834.16
#    61  34909.96  0.4857047  13839.64
#    62  34922.06  0.4855083  13854.50
#    63  34948.12  0.4847626  13881.75
#    64  34955.30  0.4846196  13900.76
#    65  34977.99  0.4841329  13918.85
#    66  35014.56  0.4830444  13944.08
#    67  35029.38  0.4824660  13965.46
#    68  35047.16  0.4819754  13985.39
#    69  35063.29  0.4814069  14000.23
#    70  35077.96  0.4809808  14018.89
#    71  35101.53  0.4802459  14045.34
#    72  35121.86  0.4796296  14066.82
#    73  35140.56  0.4791648  14079.44
#    74  35162.45  0.4786162  14100.32
#    75  35184.67  0.4780427  14113.74
#    76  35200.04  0.4776865  14132.02
#    77  35216.61  0.4773027  14149.96
#    78  35235.86  0.4767582  14163.50
#    79  35244.84  0.4767540  14176.32
#    80  35250.27  0.4768065  14191.70
#    81  35254.06  0.4769629  14200.59
#    82  35273.77  0.4765515  14219.34
#    83  35287.13  0.4762929  14232.99
#    84  35289.64  0.4763490  14244.49
#    85  35310.79  0.4758519  14260.76
#    86  35294.40  0.4766080  14267.88
#    87  35305.69  0.4764606  14276.26
#    88  35323.03  0.4760973  14284.75
#    89  35348.90  0.4753998  14305.21
#    90  35366.46  0.4750482  14312.07
#    91  35380.56  0.4748401  14322.59
#    92  35393.08  0.4746048  14329.96
#    93  35390.75  0.4748567  14335.14
#    94  35407.90  0.4745384  14346.81
#    95  35428.63  0.4739101  14354.87
#    96  35444.09  0.4735954  14363.20
#    97  35454.19  0.4735241  14372.79
#    98  35462.65  0.4735148  14379.34
#    99  35480.99  0.4730622  14387.06
#   100  35490.63  0.4729729  14391.26
# 
# RMSE was used to select the optimal model using the smallest value.
# The final value used for the model was k = 13.

Compare os três modelos em termos do erro RMSE de validação cruzada.

O modelo com menor valor par ao RMSE foi o KNN, cujo valor final foi 33937.09 para k = 13. O modelo Ridge vem logo em seguida com o segundo menor valor, que foi 37285.91 para lamba = 0.01. Por último, o modelo com um maior valor de RMSE foi o Lasso, que, selecionando fraction = 0.1 resultou em 38642.19.

Quais as variáveis mais importantes segundo o modelo de regressão Ridge e Lasso? Variáveis foram descartadas pelo Lasso? Quais?

Para o modelo Ridge, temos:

ggplot(varImp(ridge))

De acordo com o gráfico, as variáveis mais importantes são, em ordem de importância: 1. total_receita 2. total_despesa 3. recursos_de_pessoas_juridicas 4. recursos_de_pessoas_fisicas 5. quantidade_fornecedores 6. quantidade_despesas 7. media_receita 8. recursos_de_partido_politico 9. quantidade_doadores 10. quantidade_doacoes 11. grau 12. estado_civil 13. partido 14. sexo

Para o modelo Lasso, temos:

ggplot(varImp(lasso))

De acordo com o gráfico, vemos que a maioria das variáveis mais importantes para o modelo Ridge são também importantes para o modelo Lasso. As variáveis descartadas pelo modelo Lasso, são: * ano * recursos_proprios * recursos_de_outros_candidatos.comites * media_despesa

Re-treine o melhor modelo (usando os melhores valores de parâmetros encontrados em todos os dados, sem usar validação cruzada).

best.grid <- expand.grid(k = knn$bestTune)

best.model <- train(votos ~ .,
                    data = train,
                    method = "knn",
                    tuneGrid = best.grid)
best.model

Use esse último modelo treinado para prever os dados de teste disponíveis no challenge disponível plataforma Kaggle.

test <- read.csv(here("data/test.csv"))
submission <- test %>%
  select(sequencial_candidato)
test <- test %>% 
  select(-sequencial_candidato,
         -nome,
         -cargo,
         -uf,
         -ocupacao)
predictions <- predict(best.model, test)
submission$votos <- predictions
submission <- submission %>% 
  select(ID = sequencial_candidato,
         votos = votos)
write.csv(x = submission,
          file = "sample_submission.csv",
          row.names = FALSE)
LS0tCnRpdGxlOiAiUHJlZGnDp8OjbyBkZSBWb3Rhw6fDo28gZGUgRGVwdXRhZG9zIgphdXRob3I6ICJWYWx0ZXIgTHVjZW5hIgpkYXRlOiAiMjkgZGUgb3V0dWJybyBkZSAyMDE4IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoY2FyZXQpCmxpYnJhcnkoZ2dwbG90MikKb3B0aW9ucyhtYXgucHJpbnQgPSAuTWFjaGluZSRpbnRlZ2VyLm1heCkKc2V0LnNlZWQoMzcpCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKCkpCmBgYAoKIyBJbnRyb2R1w6fDo28KCk5lc3RhIGFuw6FsaXNlIGlyZW1vcyBjb25zdHJ1aXIgbW9kZWxvcyBwcmVkaXRpdm9zIGRlIHJlZ3Jlc3PDo28gcGFyYSBhIHByZWRpw6fDo28gZGUgdm90YcOnw6NvIGRlIGNhbmRpZGF0b3Mgw6AgQ8OibWFyYSBGZWRlcmFsIGRlIERlcHV0YWRvcy4gQW50ZXJpb3JtZW50ZSwgW25lc3RhIGFuw6FsaXNlXShodHRwOi8vcnB1YnMuY29tL3ZhbHRlcmx1Y2VuYS92b3RhY2FvX3JlZ3Jlc3NhbyksIGJ1c2NhbW9zIGV4cGxpY2FyIGVzc2FzIHZvdGHDp8O1ZXMgYXRyYXbDqXMgZGEgcmVncmVzc8OjbyBsaW5lYXIgbXVsdGl2YXJpYWRhLiAKClVtYSByZWdyZXNzw6NvIGNvbSBtdWl0b3MgY29lZmljaWVudGVzIHRvcm5hIG8gbW9kZWxvIG11aXRvIGNvbXBsZXhvLCBkaWZpY3VsdGFuZG8gc3VhIGludGVycHJldGHDp8Ojby4gVW1hIGRhcyBjb25zZXF1w6puY2lhcyBkaXNzbyDDqSBvICpvdmVyZml0dGluZyosIHF1ZSBhY29udGVjZSBxdWFuZG8gbyBtb2RlbG8gc2UgYWRhcHRhIGFvIHJ1w61kbyBkb3MgZGFkb3MuIE9zIG3DqXRvZG9zIFJpZGdlLCBMYXNzbyBlIEtOTiBzw6NvIHVtYSBmb3JtYSBkZSBlbGltaW5hciBlc3NlIHByb2JsZW1hLCBwb2lzIHJlZHV6ZW0gYSBjb21wbGV4aWRhZGUgZG8gbW9kZWxvLCBtaW5pbWl6YW5kbyBhcyBjaGFuY2VzIGRvIG92ZXJmaXR0aW5nIGFjb250ZWNlci4KCk5lc3RhIGFuw6FsaXNlLCB1dGlsaXphcmVtb3MgZXN0ZXMgbcOpdG9kb3MgcGFyYSBwcmV2ZXIgYSBxdWFudGlkYWRlIGRlIHZvdG9zIHF1ZSB1bSBjYW5kaWRhdG8gcmVjZWJlcsOhLgoKUHJpbWVpcmFtZW50ZSwgdmFtb3MgaW1wb3J0YXIgbm9zc29zIGRhZG9zLiBVbWEgbWVsaG9yIGRlc2NyacOnw6NvIGRhcyB2YXJpw6F2ZWlzIHBvZGUgc2VyIGVuY29udHJhZGEsIHRhbWLDqW0sIFthcXVpXShodHRwOi8vcnB1YnMuY29tL3ZhbHRlcmx1Y2VuYS92b3RhY2FvX3JlZ3Jlc3NhbykuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0cmFpbiA8LSByZWFkLmNzdihoZXJlKCJkYXRhL3RyYWluLmNzdiIpKQpgYGAKCiMgUGVyZ3VudGFzCgojIyBVc2FuZG8gdG9kYXMgYXMgdmFyacOhdmVpcyBkaXNwb27DrXZlaXMsIHR1bmUgKHVzYW5kbyB2YWxpZGHDp8OjbyBjcnV6YWRhKTogKGkpIHVtIG1vZGVsbyBkZSByZWdyZXNzw6NvIFJpZGdlLCAoaWkpIHVtIG1vZGVsbyBkZSByZWdyZXNzw6NvIExhc3NvIGUgKGlpaSkgdW0gbW9kZWxvIEtOTi4gUGFyYSBvcyBtb2RlbG9zIGRlIHJlZ3Jlc3PDo28gbGluZWFyLCBvIHBhcsOibWV0cm8gYSBzZXIgdHVuYWRvIMOpIG8gbGFtYmRhIChwZW5hbGl6YcOnw6NvIGRvcyBjb2VmaWNpZW50ZXMpIGUgbyBLTk4gbyBuw7ptZXJvIGRlIHZpemluaG9zLgoKSW5pY2lhbG1lbnRlLCB2YW1vcyByZXRpcmFyIGRvcyBub3Nzb3MgZGFkb3MgYXMgY29sdW5hcyBxdWUgc2VydmVtIGFwZW5hcyBwYXJhIGlkZW50aWZpY2FyIHVtIGNhbmRpZGF0bywgYSB2YXJpw6F2ZWwgYGNhcmdvYCwgcXVlIHBvc3N1aSBhcGVuYXMgdW0gdmFsb3IsIGUgYXMgdmFyacOhdmVpcyBjYXRlZ8OzcmljYXMgZGUgdsOhcmlvcyBuw612ZWlzLgoKYGBge3J9CnRyYWluIDwtIHRyYWluICU+JSAKICBzZWxlY3QoLXNlcXVlbmNpYWxfY2FuZGlkYXRvLAogICAgICAgICAtbm9tZSwKICAgICAgICAgLWNhcmdvLAogICAgICAgICAtdWYsCiAgICAgICAgIC1vY3VwYWNhbykKYGBgCgpBZ29yYSwgdmFtb3MgdXRpbGl6YXIgYSB2YWxpZGHDp8OjbyBjcnV6YWRhLgoKYGBge3J9CmZpdENvbnRyb2wgPC0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2ggPSAicmFuZG9tIikKYGBgCgojIyMgKGkpIE1vZGVsbyBkZSBSZWdyZXNzw6NvIFJpZGdlLgoKYGBge3IgZXZhbD1GQUxTRX0KbGFtYmRhR3JpZCA8LSBleHBhbmQuZ3JpZChsYW1iZGEgPSAxMF5zZXEoMTAsIC0yLCBsZW5ndGg9MTAwKSkKCnJpZGdlIDwtIHRyYWluKHZvdG9zIH4gLiwgCiAgICAgICAgICAgICAgIGRhdGEgPSB0cmFpbiwKICAgICAgICAgICAgICAgbWV0aG9kID0gInJpZGdlIiwKICAgICAgICAgICAgICAgdHJDb250cm9sID0gZml0Q29udHJvbCwKICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoJ3NjYWxlJywgJ2NlbnRlcicsICduenYnKSwKICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBsYW1iZGFHcmlkKQpyaWRnZQpgYGAKCgpgYGB7cn0KIyBSaWRnZSBSZWdyZXNzaW9uIAojIAojIDc0NzYgc2FtcGxlcwojICAgMTggcHJlZGljdG9yCiMgCiMgUHJlLXByb2Nlc3Npbmc6IHNjYWxlZCAoMjcpLCBjZW50ZXJlZCAoMjcpLCByZW1vdmUgKDI4KSAKIyBSZXNhbXBsaW5nOiBDcm9zcy1WYWxpZGF0ZWQgKDEwIGZvbGQpIAojIFN1bW1hcnkgb2Ygc2FtcGxlIHNpemVzOiA2NzI4LCA2NzI4LCA2NzI5LCA2NzI4LCA2NzI5LCA2NzI4LCAuLi4gCiMgUmVzYW1wbGluZyByZXN1bHRzIGFjcm9zcyB0dW5pbmcgcGFyYW1ldGVyczoKIyAKIyAgIGxhbWJkYSAgICAgICAgUk1TRSAgICAgICBSc3F1YXJlZCAgIE1BRSAgICAgCiMgICAxLjAwMDAwMGUtMDIgICAzNzI4NS45MSAgMC40MTA4Nzg0ICAxNjE5MS44MwojICAgMS4zMjE5NDFlLTAyICAgMzczMTEuODYgIDAuNDEwNjM4NyAgMTYxOTIuMjcKIyAgIDEuNzQ3NTI4ZS0wMiAgIDM3MzQ1LjU1ICAwLjQxMDMwNjIgIDE2MTkxLjMxCiMgICAyLjMxMDEzMGUtMDIgICAzNzM4Ny41NiAgMC40MDk4OTE3ICAxNjE4Ny4wOAojICAgMy4wNTM4NTZlLTAyICAgMzc0MzguOTEgIDAuNDA5NDA3OCAgMTYxNzcuOTgKIyAgIDQuMDM3MDE3ZS0wMiAgIDM3NTAxLjUzICAwLjQwODg2NDAgIDE2MTYzLjMwCiMgICA1LjMzNjY5OWUtMDIgICAzNzU3OC43OSAgMC40MDgyNjEzICAxNjE0MS42OQojICAgNy4wNTQ4MDJlLTAyICAgMzc2NzYuMjIgIDAuNDA3NTg4NSAgMTYxMTAuNjMKIyAgIDkuMzI2MDMzZS0wMiAgIDM3ODAyLjUwICAwLjQwNjgxOTkgIDE2MDY5LjEwCiMgICAxLjIzMjg0N2UtMDEgICAzNzk3MC44OSAgMC40MDU5MTY2ICAxNjAyMy40NwojICAgMS42Mjk3NTFlLTAxICAgMzgyMDEuNDYgIDAuNDA0ODMwNSAgMTU5NzYuNjkKIyAgIDIuMTU0NDM1ZS0wMSAgIDM4NTI0LjU1ICAwLjQwMzUxMjMgIDE1OTM1Ljg1CiMgICAyLjg0ODAzNmUtMDEgICAzODk4NS44NiAgMC40MDE5MjI5ICAxNTkxNy4yNQojICAgMy43NjQ5MzZlLTAxICAgMzk2NTMuMjggIDAuNDAwMDQ0NyAgMTU5NTcuODUKIyAgIDQuOTc3MDI0ZS0wMSAgIDQwNjI0LjkzICAwLjM5Nzg5MTEgIDE2MDk5LjUyCiMgICA2LjU3OTMzMmUtMDEgICA0MjAzNS45OSAgMC4zOTU1MDkzICAxNjQxNi4zMwojICAgOC42OTc0OTBlLTAxICAgNDQwNTkuNjUgIDAuMzkyOTc2NSAgMTcwMTIuMTkKIyAgIDEuMTQ5NzU3ZSswMCAgIDQ2ODk2LjA3ICAwLjM5MDM4OTQgIDE4MDQ1LjkwCiMgICAxLjUxOTkxMWUrMDAgICA1MDc0NC40MyAgMC4zODc4NTEyICAxOTYzNC41OQojICAgMi4wMDkyMzNlKzAwICAgNTU3NTkuODQgIDAuMzg1NDU2NCAgMjE5NTkuNDkKIyAgIDIuNjU2MDg4ZSswMCAgIDYyMDA1LjMzICAwLjM4MzI3OTEgIDI0OTk4LjU1CiMgICAzLjUxMTE5MmUrMDAgICA2OTQxNC43MyAgMC4zODEzNjU5ICAyODgyOS41MgojICAgNC42NDE1ODllKzAwICAgNzc3ODAuMzMgIDAuMzc5NzM0NCAgMzMyNTIuNjMKIyAgIDYuMTM1OTA3ZSswMCAgIDg2NzcyLjI2ICAwLjM3ODM3ODIgIDM4MDIyLjQ5CiMgICA4LjExMTMwOGUrMDAgICA5NTk4Ni44NCAgMC4zNzcyNzQzICA0MjkxNy41NgojICAgMS4wNzIyNjdlKzAxICAxMDUwMTEuMjIgIDAuMzc2MzkwOCAgNDc3MTEuODkKIyAgIDEuNDE3NDc0ZSswMSAgMTEzNDg1Ljg4ICAwLjM3NTY5MzAgIDUyMjI2Ljc1CiMgICAxLjg3MzgxN2UrMDEgIDEyMTE0OC4xMiAgMC4zNzUxNDc0ICA1NjMxMi44OAojICAgMi40NzcwNzZlKzAxICAxMjc4NDguNDAgIDAuMzc0NzI0MiAgNTk4ODcuMjYKIyAgIDMuMjc0NTQ5ZSswMSAgMTMzNTQxLjk2ICAwLjM3NDM5NzkgIDYyOTI2LjgwCiMgICA0LjMyODc2MWUrMDEgIDEzODI2NS4xMCAgMC4zNzQxNDc0ICA2NTQ0Ni45NgojICAgNS43MjIzNjhlKzAxICAxNDIxMDYuNTAgIDAuMzczOTU1OCAgNjc0OTQuMTMKIyAgIDcuNTY0NjMzZSswMSAgMTQ1MTgxLjE5ICAwLjM3MzgwOTcgIDY5MTMxLjQ3CiMgICAxLjAwMDAwMGUrMDIgIDE0NzYxMS4wMiAgMC4zNzM2OTg0ICA3MDQyNS4yMgojICAgMS4zMjE5NDFlKzAyICAxNDk1MTIuMDUgIDAuMzczNjEzOSAgNzE0MzcuNzMKIyAgIDEuNzQ3NTI4ZSswMiAgMTUwOTg3Ljc0ICAwLjM3MzU0OTcgIDcyMjI1LjE1CiMgICAyLjMxMDEzMGUrMDIgIDE1MjEyNi4zMCAgMC4zNzM1MDEwICA3MjgzMy4wNwojICAgMy4wNTM4NTZlKzAyICAxNTMwMDAuNjYgIDAuMzczNDY0MSAgNzMyOTkuNzcKIyAgIDQuMDM3MDE3ZSswMiAgMTUzNjY5LjcwICAwLjM3MzQzNjEgIDczNjU2LjgzCiMgICA1LjMzNjY5OWUrMDIgIDE1NDE4MC4yMyAgMC4zNzM0MTQ5ICA3MzkyOS4yNQojICAgNy4wNTQ4MDJlKzAyICAxNTQ1NjkuMDAgIDAuMzczMzk4OSAgNzQxMzYuNjYKIyAgIDkuMzI2MDMzZSswMiAgMTU0ODY0LjU2ICAwLjM3MzM4NjcgIDc0Mjk0LjMyCiMgICAxLjIzMjg0N2UrMDMgIDE1NTA4OS4wMCAgMC4zNzMzNzc1ICA3NDQxNC4wMwojICAgMS42Mjk3NTFlKzAzICAxNTUyNTkuMjcgIDAuMzczMzcwNiAgNzQ1MDQuODQKIyAgIDIuMTU0NDM1ZSswMyAgMTU1Mzg4LjM1ICAwLjM3MzM2NTMgIDc0NTczLjY4CiMgICAyLjg0ODAzNmUrMDMgIDE1NTQ4Ni4xNiAgMC4zNzMzNjEzICA3NDYyNS44NAojICAgMy43NjQ5MzZlKzAzICAxNTU1NjAuMjQgIDAuMzczMzU4MyAgNzQ2NjUuMzUKIyAgIDQuOTc3MDI0ZSswMyAgMTU1NjE2LjMzICAwLjM3MzM1NjAgIDc0Njk1LjI2CiMgICA2LjU3OTMzMmUrMDMgIDE1NTY1OC43OSAgMC4zNzMzNTQzICA3NDcxNy45MAojICAgOC42OTc0OTBlKzAzICAxNTU2OTAuOTMgIDAuMzczMzUzMCAgNzQ3MzUuMDQKIyAgIDEuMTQ5NzU3ZSswNCAgMTU1NzE1LjI1ICAwLjM3MzM1MjAgIDc0NzQ4LjAxCiMgICAxLjUxOTkxMWUrMDQgIDE1NTczMy42NiAgMC4zNzMzNTEzICA3NDc1Ny44MgojICAgMi4wMDkyMzNlKzA0ICAxNTU3NDcuNTggIDAuMzczMzUwNyAgNzQ3NjUuMjUKIyAgIDIuNjU2MDg4ZSswNCAgMTU1NzU4LjEyICAwLjM3MzM1MDMgIDc0NzcwLjg2CiMgICAzLjUxMTE5MmUrMDQgIDE1NTc2Ni4wOSAgMC4zNzMzNTAwICA3NDc3NS4xMgojICAgNC42NDE1ODllKzA0ICAxNTU3NzIuMTIgIDAuMzczMzQ5NyAgNzQ3NzguMzMKIyAgIDYuMTM1OTA3ZSswNCAgMTU1Nzc2LjY4ICAwLjM3MzM0OTUgIDc0NzgwLjc2CiMgICA4LjExMTMwOGUrMDQgIDE1NTc4MC4xMyAgMC4zNzMzNDk0ICA3NDc4Mi42MAojICAgMS4wNzIyNjdlKzA1ICAxNTU3ODIuNzQgIDAuMzczMzQ5MyAgNzQ3ODQuMDAKIyAgIDEuNDE3NDc0ZSswNSAgMTU1Nzg0LjcyICAwLjM3MzM0OTIgIDc0Nzg1LjA1CiMgICAxLjg3MzgxN2UrMDUgIDE1NTc4Ni4yMSAgMC4zNzMzNDkyICA3NDc4NS44NQojICAgMi40NzcwNzZlKzA1ICAxNTU3ODcuMzQgIDAuMzczMzQ5MSAgNzQ3ODYuNDUKIyAgIDMuMjc0NTQ5ZSswNSAgMTU1Nzg4LjIwICAwLjM3MzM0OTEgIDc0Nzg2LjkwCiMgICA0LjMyODc2MWUrMDUgIDE1NTc4OC44NCAgMC4zNzMzNDkwICA3NDc4Ny4yNQojICAgNS43MjIzNjhlKzA1ICAxNTU3ODkuMzMgIDAuMzczMzQ5MCAgNzQ3ODcuNTEKIyAgIDcuNTY0NjMzZSswNSAgMTU1Nzg5LjcwICAwLjM3MzM0OTAgIDc0Nzg3LjcxCiMgICAxLjAwMDAwMGUrMDYgIDE1NTc4OS45OCAgMC4zNzMzNDkwICA3NDc4Ny44NgojICAgMS4zMjE5NDFlKzA2ICAxNTU3OTAuMjAgIDAuMzczMzQ5MCAgNzQ3ODcuOTcKIyAgIDEuNzQ3NTI4ZSswNiAgMTU1NzkwLjM2ICAwLjM3MzM0OTAgIDc0Nzg4LjA1CiMgICAyLjMxMDEzMGUrMDYgIDE1NTc5MC40OCAgMC4zNzMzNDkwICA3NDc4OC4xMgojICAgMy4wNTM4NTZlKzA2ICAxNTU3OTAuNTcgIDAuMzczMzQ5MCAgNzQ3ODguMTcKIyAgIDQuMDM3MDE3ZSswNiAgMTU1NzkwLjY0ICAwLjM3MzM0OTAgIDc0Nzg4LjIxCiMgICA1LjMzNjY5OWUrMDYgIDE1NTc5MC42OSAgMC4zNzMzNDkwICA3NDc4OC4yMwojICAgNy4wNTQ4MDJlKzA2ICAxNTU3OTAuNzMgIDAuMzczMzQ5MCAgNzQ3ODguMjUKIyAgIDkuMzI2MDMzZSswNiAgMTU1NzkwLjc2ICAwLjM3MzM0OTAgIDc0Nzg4LjI3CiMgICAxLjIzMjg0N2UrMDcgIDE1NTc5MC43OCAgMC4zNzMzNDkwICA3NDc4OC4yOAojICAgMS42Mjk3NTFlKzA3ICAxNTU3OTAuODAgIDAuMzczMzQ5MCAgNzQ3ODguMjkKIyAgIDIuMTU0NDM1ZSswNyAgMTU1NzkwLjgxICAwLjM3MzM0OTAgIDc0Nzg4LjMwCiMgICAyLjg0ODAzNmUrMDcgIDE1NTc5MC44MiAgMC4zNzMzNDkwICA3NDc4OC4zMAojICAgMy43NjQ5MzZlKzA3ICAxNTU3OTAuODMgIDAuMzczMzQ5MCAgNzQ3ODguMzEKIyAgIDQuOTc3MDI0ZSswNyAgMTU1NzkwLjg0ICAwLjM3MzM0OTAgIDc0Nzg4LjMxCiMgICA2LjU3OTMzMmUrMDcgIDE1NTc5MC44NCAgMC4zNzMzNDkwICA3NDc4OC4zMQojICAgOC42OTc0OTBlKzA3ICAxNTU3OTAuODQgIDAuMzczMzQ5MCAgNzQ3ODguMzIKIyAgIDEuMTQ5NzU3ZSswOCAgMTU1NzkwLjg1ICAwLjM3MzM0OTAgIDc0Nzg4LjMyCiMgICAxLjUxOTkxMWUrMDggIDE1NTc5MC44NSAgMC4zNzMzNDkwICA3NDc4OC4zMgojICAgMi4wMDkyMzNlKzA4ICAxNTU3OTAuODUgIDAuMzczMzQ5MCAgNzQ3ODguMzIKIyAgIDIuNjU2MDg4ZSswOCAgMTU1NzkwLjg1ICAwLjM3MzM0OTAgIDc0Nzg4LjMyCiMgICAzLjUxMTE5MmUrMDggIDE1NTc5MC44NSAgMC4zNzMzNDkwICA3NDc4OC4zMgojICAgNC42NDE1ODllKzA4ICAxNTU3OTAuODUgIDAuMzczMzQ5MCAgNzQ3ODguMzIKIyAgIDYuMTM1OTA3ZSswOCAgMTU1NzkwLjg1ICAwLjM3MzM0OTAgIDc0Nzg4LjMyCiMgICA4LjExMTMwOGUrMDggIDE1NTc5MC44NSAgMC4zNzMzNDkwICA3NDc4OC4zMgojICAgMS4wNzIyNjdlKzA5ICAxNTU3OTAuODUgIDAuMzczMzQ5MCAgNzQ3ODguMzIKIyAgIDEuNDE3NDc0ZSswOSAgMTU1NzkwLjg1ICAwLjM3MzM0OTAgIDc0Nzg4LjMyCiMgICAxLjg3MzgxN2UrMDkgIDE1NTc5MC44NSAgMC4zNzMzNDkwICA3NDc4OC4zMgojICAgMi40NzcwNzZlKzA5ICAxNTU3OTAuODUgIDAuMzczMzQ5MCAgNzQ3ODguMzIKIyAgIDMuMjc0NTQ5ZSswOSAgMTU1NzkwLjg1ICAwLjM3MzM0OTAgIDc0Nzg4LjMyCiMgICA0LjMyODc2MWUrMDkgIDE1NTc5MC44NSAgMC4zNzMzNDkwICA3NDc4OC4zMgojICAgNS43MjIzNjhlKzA5ICAxNTU3OTAuODUgIDAuMzczMzQ5MCAgNzQ3ODguMzIKIyAgIDcuNTY0NjMzZSswOSAgMTU1NzkwLjg1ICAwLjM3MzM0OTAgIDc0Nzg4LjMyCiMgICAxLjAwMDAwMGUrMTAgIDE1NTc5MC44NSAgMC4zNzMzNDkwICA3NDc4OC4zMgojIAojIFJNU0Ugd2FzIHVzZWQgdG8gc2VsZWN0IHRoZSBvcHRpbWFsIG1vZGVsIHVzaW5nIHRoZSBzbWFsbGVzdCB2YWx1ZS4KIyBUaGUgZmluYWwgdmFsdWUgdXNlZCBmb3IgdGhlIG1vZGVsIHdhcyBsYW1iZGEgPSAwLjAxLgpgYGAKCiMjIyAoaWkpIE1vZGVsbyBkZSBSZWdyZXNzw6NvIExhc3NvCgpgYGB7ciBldmFsPUZBTFNFfQpmcmFjdGlvbkdyaWQgPC0gZXhwYW5kLmdyaWQoZnJhY3Rpb24gPSBzZXEoLjEsIC45LCBsZW5ndGggPSAxMDApKQoKbGFzc28gPC0gdHJhaW4odm90b3MgfiAuLCAKICAgICAgICAgICAgICAgZGF0YSA9IHRyYWluLAogICAgICAgICAgICAgICBtZXRob2QgPSAibGFzc28iLAogICAgICAgICAgICAgICB0ckNvbnRyb2wgPSBmaXRDb250cm9sLAogICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygnc2NhbGUnLCAnY2VudGVyJywgJ256dicpLAogICAgICAgICAgICAgICB0dW5lR3JpZCA9IGZyYWN0aW9uR3JpZCkKbGFzc28KYGBgCgpgYGB7cn0KIyBUaGUgbGFzc28gCiMgCiMgNzQ3NiBzYW1wbGVzCiMgICAxOCBwcmVkaWN0b3IKIyAKIyBQcmUtcHJvY2Vzc2luZzogc2NhbGVkICgyNyksIGNlbnRlcmVkCiMgICgyNyksIHJlbW92ZSAoMjgpIAojIFJlc2FtcGxpbmc6IENyb3NzLVZhbGlkYXRlZCAoMTAgZm9sZCkgCiMgU3VtbWFyeSBvZiBzYW1wbGUgc2l6ZXM6IDY3MjgsIDY3MzAsIDY3MjgsIDY3MjgsIDY3MjgsIDY3MjksIC4uLiAKIyBSZXNhbXBsaW5nIHJlc3VsdHMgYWNyb3NzIHR1bmluZyBwYXJhbWV0ZXJzOgojIAojICAgZnJhY3Rpb24gICBSTVNFICAgICAgUnNxdWFyZWQgICBNQUUgICAgIAojICAgMC4xMDAwMDAwICAzODY0Mi4xOSAgMC4zODQ4NDc3ICAxNjMxNS4zMgojICAgMC4xMDgwODA4ICAzODgzNC44MCAgMC4zODI4OTMxICAxNjMyNC4zOAojICAgMC4xMTYxNjE2ICAzOTAzMi43NyAgMC4zODExNTQzICAxNjMzMy40NAojICAgMC4xMjQyNDI0ICAzOTIzNS40MiAgMC4zNzk2MDgzICAxNjM0Mi41MAojICAgMC4xMzIzMjMyICAzOTQ0Mi4xNyAgMC4zNzgyMzMwICAxNjM1MS41NQojICAgMC4xNDA0MDQwICAzOTY1Mi41MyAgMC4zNzcwMDgxICAxNjM2MC42MQojICAgMC4xNDg0ODQ4ICAzOTg2Ni4wNiAgMC4zNzU5MTUzICAxNjM2OS42NwojICAgMC4xNTY1NjU3ICA0MDA4Mi40MSAgMC4zNzQ5Mzg2ICAxNjM3OC43MwojICAgMC4xNjQ2NDY1ICA0MDMwMS4yNCAgMC4zNzQwNjM3ICAxNjM4Ny43OQojICAgMC4xNzI3MjczICA0MDUyMi4zMCAgMC4zNzMyNzgwICAxNjM5Ni44NQojICAgMC4xODA4MDgxICA0MDc0NS4zNCAgMC4zNzI1NzA5ICAxNjQwNS45MQojICAgMC4xODg4ODg5ICA0MDk3MC4xNSAgMC4zNzE5MzI5ICAxNjQxNC45NwojICAgMC4xOTY5Njk3ICA0MTE5Ni41NiAgMC4zNzEzNTU5ICAxNjQyNC4wMwojICAgMC4yMDUwNTA1ICA0MTQyNC40MSAgMC4zNzA4MzI3ICAxNjQzMy4wOQojICAgMC4yMTMxMzEzICA0MTY1My41NiAgMC4zNzAzNTcyICAxNjQ0Mi4xNQojICAgMC4yMjEyMTIxICA0MTg4My44OCAgMC4zNjk5MjQwICAxNjQ1MS4yMQojICAgMC4yMjkyOTI5ICA0MjExNS4yOCAgMC4zNjk1Mjg1ICAxNjQ2MC4yNwojICAgMC4yMzczNzM3ICA0MjM0Ny42NiAgMC4zNjkxNjY2ICAxNjQ2OS4zMwojICAgMC4yNDU0NTQ1ICA0MjU4MC45MiAgMC4zNjg4MzQ3ICAxNjQ3OC4zOQojICAgMC4yNTM1MzU0ICA0MjgxNS4wMCAgMC4zNjg1Mjk4ICAxNjQ4Ny40NQojICAgMC4yNjE2MTYyICA0MzA0OS44MyAgMC4zNjgyNDg5ICAxNjQ5Ni41MQojICAgMC4yNjk2OTcwICA0MzI4NS4zNSAgMC4zNjc5ODk5ICAxNjUwNS41NwojICAgMC4yNzc3Nzc4ICA0MzUyMS41MCAgMC4zNjc3NTA0ICAxNjUxNC42MwojICAgMC4yODU4NTg2ICA0Mzc1OC4yNCAgMC4zNjc1Mjg3ICAxNjUyMy42OQojICAgMC4yOTM5Mzk0ICA0Mzk5NS41MiAgMC4zNjczMjMwICAxNjUzMi43NQojICAgMC4zMDIwMjAyICA0NDIzMy4zMCAgMC4zNjcxMzE5ICAxNjU0MS44MQojICAgMC4zMTAxMDEwICA0NDQ3MS41NCAgMC4zNjY5NTQxICAxNjU1MC44NwojICAgMC4zMTgxODE4ICA0NDcxMC4yMiAgMC4zNjY3ODg0ICAxNjU1OS45MwojICAgMC4zMjYyNjI2ICA0NDk0OS4zMCAgMC4zNjY2MzM3ICAxNjU2OC45OQojICAgMC4zMzQzNDM0ICA0NTE4OC43NiAgMC4zNjY0ODkxICAxNjU3OC4wNQojICAgMC4zNDI0MjQyICA0NTQyOC41NyAgMC4zNjYzNTM3ICAxNjU4Ny4xMQojICAgMC4zNTA1MDUxICA0NTY2OC43MSAgMC4zNjYyMjY4ICAxNjU5Ni4xNwojICAgMC4zNTg1ODU5ICA0NTkwOS4xNSAgMC4zNjYxMDc3ICAxNjYwNS4yMwojICAgMC4zNjY2NjY3ICA0NjE0OS44OSAgMC4zNjU5OTU4ICAxNjYxNC4yOQojICAgMC4zNzQ3NDc1ICA0NjM5MC44OSAgMC4zNjU4OTA1ICAxNjYyMy4zNQojICAgMC4zODI4MjgzICA0NjYzMi4xNSAgMC4zNjU3OTEzICAxNjYzMi40MQojICAgMC4zOTA5MDkxICA0Njg3My42NSAgMC4zNjU2OTc4ICAxNjY0MS40NwojICAgMC4zOTg5ODk5ICA0NzExNS4zNyAgMC4zNjU2MDk1ICAxNjY1MC41MgojICAgMC40MDcwNzA3ICA0NzM1Ny4zMSAgMC4zNjU1MjYwICAxNjY1OS41OAojICAgMC40MTUxNTE1ICA0NzU5OS40NSAgMC4zNjU0NDcxICAxNjY2OC42NAojICAgMC40MjMyMzIzICA0Nzg0MS43OCAgMC4zNjUzNzIzICAxNjY3Ny43MAojICAgMC40MzEzMTMxICA0ODA4NC4yOSAgMC4zNjUzMDE1ICAxNjY4Ni43NgojICAgMC40MzkzOTM5ICA0ODMyNi45NyAgMC4zNjUyMzQzICAxNjY5NS44MgojICAgMC40NDc0NzQ3ICA0ODU2OS44MSAgMC4zNjUxNzA1ICAxNjcwNC44OAojICAgMC40NTU1NTU2ICA0ODgxMi44MCAgMC4zNjUxMDk4ICAxNjcxMy45NAojICAgMC40NjM2MzY0ICA0OTA1NS45NCAgMC4zNjUwNTIxICAxNjcyMy4wMAojICAgMC40NzE3MTcyICA0OTI5OS4yMiAgMC4zNjQ5OTcyICAxNjczMi4wNgojICAgMC40Nzk3OTgwICA0OTU0Mi42NCAgMC4zNjQ5NDQ5ICAxNjc0MS4xMgojICAgMC40ODc4Nzg4ICA0OTc4Ni4xNyAgMC4zNjQ4OTUwICAxNjc1MC4xOAojICAgMC40OTU5NTk2ICA1MDAyOS44MyAgMC4zNjQ4NDc0ICAxNjc1OS4yNAojICAgMC41MDQwNDA0ICA1MDI3My42MCAgMC4zNjQ4MDE5ICAxNjc2OC4zMAojICAgMC41MTIxMjEyICA1MDUxNy40OCAgMC4zNjQ3NTg1ICAxNjc3Ny4zNgojICAgMC41MjAyMDIwICA1MDc2MS40NiAgMC4zNjQ3MTcwICAxNjc4Ni40MgojICAgMC41MjgyODI4ICA1MTAwNS41NCAgMC4zNjQ2NzczICAxNjc5NS40OAojICAgMC41MzYzNjM2ICA1MTI0OS43MiAgMC4zNjQ2MzkzICAxNjgwNC41NAojICAgMC41NDQ0NDQ0ICA1MTQ5My45OSAgMC4zNjQ2MDI4ICAxNjgxMy42MAojICAgMC41NTI1MjUzICA1MTczOC4zNSAgMC4zNjQ1Njc5ICAxNjgyMi42NgojICAgMC41NjA2MDYxICA1MTk4Mi43OCAgMC4zNjQ1MzQ0ICAxNjgzMS43MgojICAgMC41Njg2ODY5ICA1MjIyNy4zMCAgMC4zNjQ1MDIyICAxNjg0MC43OAojICAgMC41NzY3Njc3ICA1MjQ3MS45MCAgMC4zNjQ0NzE0ICAxNjg0OS44NAojICAgMC41ODQ4NDg1ICA1MjcxNi41NyAgMC4zNjQ0NDE3ICAxNjg1OC45MAojICAgMC41OTI5MjkzICA1Mjk2MS4zMSAgMC4zNjQ0MTMyICAxNjg2Ny45NgojICAgMC42MDEwMTAxICA1MzIwNi4xMSAgMC4zNjQzODU4ICAxNjg3Ny4wMgojICAgMC42MDkwOTA5ICA1MzQ1MC45OCAgMC4zNjQzNTk0ICAxNjg4Ni4wOAojICAgMC42MTcxNzE3ICA1MzY5NS45MiAgMC4zNjQzMzQwICAxNjg5NS4xNAojICAgMC42MjUyNTI1ICA1Mzk0MC45MSAgMC4zNjQzMDk1ICAxNjkwNC4yMAojICAgMC42MzMzMzMzICA1NDE4NS45NyAgMC4zNjQyODU5ICAxNjkxMy4yNgojICAgMC42NDE0MTQxICA1NDQzMS4wOCAgMC4zNjQyNjMyICAxNjkyMi4zMgojICAgMC42NDk0OTQ5ICA1NDY3Ni4yNCAgMC4zNjQyNDEyICAxNjkzMS4zOAojICAgMC42NTc1NzU4ICA1NDkyMS40NSAgMC4zNjQyMjAxICAxNjk0MC40NAojICAgMC42NjU2NTY2ICA1NTE2Ni43MiAgMC4zNjQxOTk2ICAxNjk0OS40OQojICAgMC42NzM3Mzc0ICA1NTQxMi4wMyAgMC4zNjQxNzk5ICAxNjk1OC41NQojICAgMC42ODE4MTgyICA1NTY1Ny4zOSAgMC4zNjQxNjA4ICAxNjk2Ny42MQojICAgMC42ODk4OTkwICA1NTkwMi44MCAgMC4zNjQxNDI0ICAxNjk3Ni42NwojICAgMC42OTc5Nzk4ICA1NjE0OC4yNCAgMC4zNjQxMjQ1ICAxNjk4NS43MwojICAgMC43MDYwNjA2ICA1NjM5My43MyAgMC4zNjQxMDczICAxNjk5NC43OQojICAgMC43MTQxNDE0ICA1NjYzOS4yNyAgMC4zNjQwOTA2ICAxNzAwMy44NQojICAgMC43MjIyMjIyICA1Njg4NC44NCAgMC4zNjQwNzQ0ICAxNzAxMi45MQojICAgMC43MzAzMDMwICA1NzEzMC40NCAgMC4zNjQwNTg4ICAxNzAyMS45NwojICAgMC43MzgzODM4ICA1NzM3Ni4wOSAgMC4zNjQwNDM2ICAxNzAzMS4wMwojICAgMC43NDY0NjQ2ICA1NzYyMS43NyAgMC4zNjQwMjg5ICAxNzA0MC4wOQojICAgMC43NTQ1NDU1ICA1Nzg2Ny40OCAgMC4zNjQwMTQ3ICAxNzA0OS4xNQojICAgMC43NjI2MjYzICA1ODExMy4yMyAgMC4zNjQwMDA4ICAxNzA1OC4yMQojICAgMC43NzA3MDcxICA1ODM1OS4wMSAgMC4zNjM5ODc0ICAxNzA2Ny4yNwojICAgMC43Nzg3ODc5ICA1ODYwNC44MiAgMC4zNjM5NzQ0ICAxNzA3Ni4zMwojICAgMC43ODY4Njg3ICA1ODg1MC42NyAgMC4zNjM5NjE4ICAxNzA4NS4zOQojICAgMC43OTQ5NDk1ICA1OTA5Ni41NCAgMC4zNjM5NDk1ICAxNzA5NC40NQojICAgMC44MDMwMzAzICA1OTM0Mi40NCAgMC4zNjM5Mzc2ICAxNzEwMy41MQojICAgMC44MTExMTExICA1OTU4OC4zNyAgMC4zNjM5MjYwICAxNzExMi41NwojICAgMC44MTkxOTE5ICA1OTgzNC4zMiAgMC4zNjM5MTQ4ICAxNzEyMS42MwojICAgMC44MjcyNzI3ICA2MDA4MC4zMCAgMC4zNjM5MDM4ICAxNzEzMC42OQojICAgMC44MzUzNTM1ICA2MDMyNi4zMSAgMC4zNjM4OTMyICAxNzEzOS43NQojICAgMC44NDM0MzQzICA2MDU3Mi4zNCAgMC4zNjM4ODI4ICAxNzE0OC44MQojICAgMC44NTE1MTUyICA2MDgxOC40MCAgMC4zNjM4NzI4ICAxNzE1Ny44NwojICAgMC44NTk1OTYwICA2MTA2NC40OCAgMC4zNjM4NjI5ICAxNzE2Ni45MwojICAgMC44Njc2NzY4ICA2MTMxMC41OCAgMC4zNjM4NTM0ICAxNzE3NS45OQojICAgMC44NzU3NTc2ICA2MTU1Ni43MCAgMC4zNjM4NDQxICAxNzE4NS4wNQojICAgMC44ODM4Mzg0ICA2MTgwMi44NSAgMC4zNjM4MzUwICAxNzE5NC4xMQojICAgMC44OTE5MTkyICA2MjA0OS4wMSAgMC4zNjM4MjYyICAxNzIwMy4xNwojICAgMC45MDAwMDAwICA2MjI5NS4yMCAgMC4zNjM4MTc2ICAxNzIxMi4yMwojIAojIFJNU0Ugd2FzIHVzZWQgdG8gc2VsZWN0IHRoZSBvcHRpbWFsIG1vZGVsCiMgIHVzaW5nIHRoZSBzbWFsbGVzdCB2YWx1ZS4KIyBUaGUgZmluYWwgdmFsdWUgdXNlZCBmb3IgdGhlIG1vZGVsIHdhcwojICBmcmFjdGlvbiA9IDAuMS4KYGBgCgojIyMgKGlpaSkgTW9kZWxvIEtOTi4KCmBgYHtyIGV2YWw9RkFMU0V9CmtubkdyaWQgPC0gZXhwYW5kLmdyaWQoayA9IHNlcSgxLCAxMDAsIGxlbmd0aD0xMDApKQoKa25uIDwtIHRyYWluKHZvdG9zIH4gLiwKICAgICAgICAgICAgIGRhdGEgPSB0cmFpbiwKICAgICAgICAgICAgIG1ldGhvZCA9ICJrbm4iLAogICAgICAgICAgICAgdHJDb250cm9sID0gZml0Q29udHJvbCwKICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCdzY2FsZScsICdjZW50ZXInLCAnbnp2JyksCiAgICAgICAgICAgICB0dW5lR3JpZCA9IGtubkdyaWQpCmtubgpgYGAKCmBgYHtyfQojIGstTmVhcmVzdCBOZWlnaGJvcnMgCiMgCiMgNzQ3NiBzYW1wbGVzCiMgICAxOCBwcmVkaWN0b3IKIyAKIyBQcmUtcHJvY2Vzc2luZzogc2NhbGVkICgyNyksIGNlbnRlcmVkICgyNyksIHJlbW92ZSAoMjgpIAojIFJlc2FtcGxpbmc6IENyb3NzLVZhbGlkYXRlZCAoMTAgZm9sZCkgCiMgU3VtbWFyeSBvZiBzYW1wbGUgc2l6ZXM6IDY3MjgsIDY3MjgsIDY3MjgsIDY3MjgsIDY3MjgsIDY3MjksIC4uLiAKIyBSZXNhbXBsaW5nIHJlc3VsdHMgYWNyb3NzIHR1bmluZyBwYXJhbWV0ZXJzOgojIAojICAgayAgICBSTVNFICAgICAgUnNxdWFyZWQgICBNQUUgICAgIAojICAgICAxICAzOTU5MC40NCAgMC4zODYyNzk5ICAxNTM4MS44OAojICAgICAyICAzNzE2Ny41NiAgMC40Mjk0NDM5ICAxMzkzMC42NQojICAgICAzICAzNTM3MS40NiAgMC40NjMwMzA2ICAxMzMxNC42NAojICAgICA0ICAzNDYyMi4xMSAgMC40Nzk4NDgwICAxMzA3My44MgojICAgICA1ICAzNDIzOC44MyAgMC40ODkyMzM5ICAxMjgzNS4xMQojICAgICA2ICAzNDY5OC4wNCAgMC40Nzg1OTI0ICAxMjkxMS40NwojICAgICA3ICAzNDM1Ny4zNCAgMC40ODg2NDY5ICAxMjgzNy44OAojICAgICA4ICAzNDA0OS4xOCAgMC40OTgwNTE4ICAxMjc1OS44NwojICAgICA5ICAzNDAzMC40MyAgMC40OTkwMzc4ICAxMjc5OS40MQojICAgIDEwICAzNDAyNi4wMCAgMC40OTkxMDM4ICAxMjgxMi4yOQojICAgIDExICAzMzk0My42OSAgMC41MDE5MTA4ICAxMjc4Ni43MAojICAgIDEyICAzMzk4NC41OCAgMC41MDExNjAzICAxMjg0MC41NAojICAgIDEzICAzMzkzNy4wOSAgMC41MDMxODM1ICAxMjg2OS41OQojICAgIDE0ICAzMzkzOC4xMyAgMC41MDM3NjE4ICAxMjg4Mi45MQojICAgIDE1ICAzMzk5Ni45NSAgMC41MDIyOTc0ICAxMjk0MS41MgojICAgIDE2ICAzMzk3Mi4xMCAgMC41MDM3NjQzICAxMjk2NS4yOQojICAgIDE3ICAzMzk3Mi41MCAgMC41MDQwMjQyICAxMjk5MS4wNgojICAgIDE4ICAzMzk4OS43MyAgMC41MDQxNTI0ICAxMzAxMy4xNgojICAgIDE5ICAzMzk4NS4wNyAgMC41MDQ2MDIyICAxMzA0Ny4wNQojICAgIDIwICAzNDAyNi44NSAgMC41MDM2MTg3ICAxMzA2Ny4wMgojICAgIDIxICAzNDAyMC4zMyAgMC41MDQzNDM2ICAxMzEwNi4zNgojICAgIDIyICAzNDAxMy40MSAgMC41MDQ3OTEwICAxMzEwOS44MgojICAgIDIzICAzMzk5OC40OSAgMC41MDUzOTgyICAxMzExMS4xMwojICAgIDI0ICAzNDAyMS4xNiAgMC41MDQ1OTIwICAxMzEzMi40NgojICAgIDI1ICAzNDA4NS42MCAgMC41MDI2NjQ2ICAxMzE2OC42NQojICAgIDI2ICAzNDEwNC4xOSAgMC41MDIyMjg1ICAxMzE3Ni4yMgojICAgIDI3ICAzNDE0MS44OCAgMC41MDA4Njc1ICAxMzIwOS45NwojICAgIDI4ICAzNDE0OC4yMiAgMC41MDExODczICAxMzIxMi44OAojICAgIDI5ICAzNDE2OS4xMSAgMC41MDEyOTg1ICAxMzIxNS40MQojICAgIDMwICAzNDE3OC43NSAgMC41MDE0ODM5ICAxMzIzMC4xNgojICAgIDMxICAzNDE3OS4zNCAgMC41MDE4MTQ1ICAxMzIyMC42OAojICAgIDMyICAzNDE4NS4xNiAgMC41MDIxNTIwICAxMzIxNC4yNAojICAgIDMzICAzNDIwMS40MCAgMC41MDE4NzU0ICAxMzIxNS43NgojICAgIDM0ICAzNDI0Ni40OSAgMC41MDA5NjQwICAxMzIyMy4wOQojICAgIDM1ICAzNDI5Ni4yNyAgMC40OTk0OTEzICAxMzI2MC43NgojICAgIDM2ICAzNDMwNy44OCAgMC40OTkzNDI3ICAxMzI3MS41NwojICAgIDM3ICAzNDMyMi41OSAgMC40OTkyMTUyICAxMzI4My4xNwojICAgIDM4ICAzNDM1OS44OCAgMC40OTg1MDUyICAxMzI5OS41MwojICAgIDM5ICAzNDM3NC4zNiAgMC40OTc5MjIwICAxMzMxOC41OAojICAgIDQwICAzNDQxOS4zMyAgMC40OTY1ODIyICAxMzM0OC4wNgojICAgIDQxICAzNDQ2Ni43NiAgMC40OTUzNDM0ICAxMzM3OS42NQojICAgIDQyICAzNDQ4NC41NCAgMC40OTUwMDU3ICAxMzQxMS44MgojICAgIDQzICAzNDUzNC45NiAgMC40OTM1NTk1ICAxMzQ1NS43MAojICAgIDQ0ICAzNDU3MC4wMiAgMC40OTI2NDg0ICAxMzQ5OC4wNAojICAgIDQ1ICAzNDU3OS4zNiAgMC40OTI3ODkyICAxMzUxMy40NgojICAgIDQ2ICAzNDYwOC43OCAgMC40OTIwNjU1ICAxMzU0MC4xMgojICAgIDQ3ICAzNDYxNC4zMSAgMC40OTIzMzc1ICAxMzU2MS4yNgojICAgIDQ4ICAzNDY1Mi41NCAgMC40OTEyNzM1ICAxMzU4OS41NQojICAgIDQ5ICAzNDY3NS4zNyAgMC40OTA2OTk4ICAxMzYxNi45NAojICAgIDUwICAzNDcwMi41NCAgMC40OTAxODI5ICAxMzYzNy4xOQojICAgIDUxICAzNDcyMy4yMCAgMC40ODk4OTAxICAxMzY0OS40MgojICAgIDUyICAzNDc0MC43MSAgMC40ODk2OTAxICAxMzY2OC4wMQojICAgIDUzICAzNDc3MS4yMyAgMC40ODg4NTEwICAxMzY4Ni4xMgojICAgIDU0ICAzNDc5OS44MSAgMC40ODgxMTA5ICAxMzcxOS40NwojICAgIDU1ICAzNDgyOC41MyAgMC40ODcyMTYyICAxMzc1Mi42MwojICAgIDU2ICAzNDg1Mi4wNiAgMC40ODY2NDM0ICAxMzc3OS4wMgojICAgIDU3ICAzNDg1Ny44OSAgMC40ODY1MzU5ICAxMzc5MC43NQojICAgIDU4ICAzNDg0My4xNyAgMC40ODc0MTQ1ICAxMzc5Ny44MwojICAgIDU5ICAzNDg4MS43NSAgMC40ODYyODUzICAxMzgxNS43OQojICAgIDYwICAzNDkwMS45MiAgMC40ODU3MDE3ICAxMzgzNC4xNgojICAgIDYxICAzNDkwOS45NiAgMC40ODU3MDQ3ICAxMzgzOS42NAojICAgIDYyICAzNDkyMi4wNiAgMC40ODU1MDgzICAxMzg1NC41MAojICAgIDYzICAzNDk0OC4xMiAgMC40ODQ3NjI2ICAxMzg4MS43NQojICAgIDY0ICAzNDk1NS4zMCAgMC40ODQ2MTk2ICAxMzkwMC43NgojICAgIDY1ICAzNDk3Ny45OSAgMC40ODQxMzI5ICAxMzkxOC44NQojICAgIDY2ICAzNTAxNC41NiAgMC40ODMwNDQ0ICAxMzk0NC4wOAojICAgIDY3ICAzNTAyOS4zOCAgMC40ODI0NjYwICAxMzk2NS40NgojICAgIDY4ICAzNTA0Ny4xNiAgMC40ODE5NzU0ICAxMzk4NS4zOQojICAgIDY5ICAzNTA2My4yOSAgMC40ODE0MDY5ICAxNDAwMC4yMwojICAgIDcwICAzNTA3Ny45NiAgMC40ODA5ODA4ICAxNDAxOC44OQojICAgIDcxICAzNTEwMS41MyAgMC40ODAyNDU5ICAxNDA0NS4zNAojICAgIDcyICAzNTEyMS44NiAgMC40Nzk2Mjk2ICAxNDA2Ni44MgojICAgIDczICAzNTE0MC41NiAgMC40NzkxNjQ4ICAxNDA3OS40NAojICAgIDc0ICAzNTE2Mi40NSAgMC40Nzg2MTYyICAxNDEwMC4zMgojICAgIDc1ICAzNTE4NC42NyAgMC40NzgwNDI3ICAxNDExMy43NAojICAgIDc2ICAzNTIwMC4wNCAgMC40Nzc2ODY1ICAxNDEzMi4wMgojICAgIDc3ICAzNTIxNi42MSAgMC40NzczMDI3ICAxNDE0OS45NgojICAgIDc4ICAzNTIzNS44NiAgMC40NzY3NTgyICAxNDE2My41MAojICAgIDc5ICAzNTI0NC44NCAgMC40NzY3NTQwICAxNDE3Ni4zMgojICAgIDgwICAzNTI1MC4yNyAgMC40NzY4MDY1ICAxNDE5MS43MAojICAgIDgxICAzNTI1NC4wNiAgMC40NzY5NjI5ICAxNDIwMC41OQojICAgIDgyICAzNTI3My43NyAgMC40NzY1NTE1ICAxNDIxOS4zNAojICAgIDgzICAzNTI4Ny4xMyAgMC40NzYyOTI5ICAxNDIzMi45OQojICAgIDg0ICAzNTI4OS42NCAgMC40NzYzNDkwICAxNDI0NC40OQojICAgIDg1ICAzNTMxMC43OSAgMC40NzU4NTE5ICAxNDI2MC43NgojICAgIDg2ICAzNTI5NC40MCAgMC40NzY2MDgwICAxNDI2Ny44OAojICAgIDg3ICAzNTMwNS42OSAgMC40NzY0NjA2ICAxNDI3Ni4yNgojICAgIDg4ICAzNTMyMy4wMyAgMC40NzYwOTczICAxNDI4NC43NQojICAgIDg5ICAzNTM0OC45MCAgMC40NzUzOTk4ICAxNDMwNS4yMQojICAgIDkwICAzNTM2Ni40NiAgMC40NzUwNDgyICAxNDMxMi4wNwojICAgIDkxICAzNTM4MC41NiAgMC40NzQ4NDAxICAxNDMyMi41OQojICAgIDkyICAzNTM5My4wOCAgMC40NzQ2MDQ4ICAxNDMyOS45NgojICAgIDkzICAzNTM5MC43NSAgMC40NzQ4NTY3ICAxNDMzNS4xNAojICAgIDk0ICAzNTQwNy45MCAgMC40NzQ1Mzg0ICAxNDM0Ni44MQojICAgIDk1ICAzNTQyOC42MyAgMC40NzM5MTAxICAxNDM1NC44NwojICAgIDk2ICAzNTQ0NC4wOSAgMC40NzM1OTU0ICAxNDM2My4yMAojICAgIDk3ICAzNTQ1NC4xOSAgMC40NzM1MjQxICAxNDM3Mi43OQojICAgIDk4ICAzNTQ2Mi42NSAgMC40NzM1MTQ4ICAxNDM3OS4zNAojICAgIDk5ICAzNTQ4MC45OSAgMC40NzMwNjIyICAxNDM4Ny4wNgojICAgMTAwICAzNTQ5MC42MyAgMC40NzI5NzI5ICAxNDM5MS4yNgojIAojIFJNU0Ugd2FzIHVzZWQgdG8gc2VsZWN0IHRoZSBvcHRpbWFsIG1vZGVsIHVzaW5nIHRoZSBzbWFsbGVzdCB2YWx1ZS4KIyBUaGUgZmluYWwgdmFsdWUgdXNlZCBmb3IgdGhlIG1vZGVsIHdhcyBrID0gMTMuCmBgYAoKIyMgQ29tcGFyZSBvcyB0csOqcyBtb2RlbG9zIGVtIHRlcm1vcyBkbyBlcnJvIFJNU0UgZGUgdmFsaWRhw6fDo28gY3J1emFkYS4KCk8gbW9kZWxvIGNvbSBtZW5vciB2YWxvciBwYXIgYW8gUk1TRSBmb2kgbyBLTk4sIGN1am8gdmFsb3IgZmluYWwgZm9pIDMzOTM3LjA5IHBhcmEgayA9IDEzLiBPIG1vZGVsbyBSaWRnZSB2ZW0gbG9nbyBlbSBzZWd1aWRhIGNvbSBvIHNlZ3VuZG8gbWVub3IgdmFsb3IsIHF1ZSBmb2kgMzcyODUuOTEgcGFyYSBsYW1iYSA9IDAuMDEuIFBvciDDumx0aW1vLCBvIG1vZGVsbyBjb20gdW0gbWFpb3IgdmFsb3IgZGUgUk1TRSBmb2kgbyBMYXNzbywgcXVlLCBzZWxlY2lvbmFuZG8gZnJhY3Rpb24gPSAwLjEgcmVzdWx0b3UgZW0gMzg2NDIuMTkuCgojIyBRdWFpcyBhcyB2YXJpw6F2ZWlzIG1haXMgaW1wb3J0YW50ZXMgc2VndW5kbyBvIG1vZGVsbyBkZSByZWdyZXNzw6NvIFJpZGdlIGUgTGFzc28/ICBWYXJpw6F2ZWlzIGZvcmFtIGRlc2NhcnRhZGFzIHBlbG8gTGFzc28/IFF1YWlzPwoKUGFyYSBvIG1vZGVsbyBSaWRnZSwgdGVtb3M6CgpgYGB7cn0KZ2dwbG90KHZhckltcChyaWRnZSkpCmBgYAoKRGUgYWNvcmRvIGNvbSBvIGdyw6FmaWNvLCBhcyB2YXJpw6F2ZWlzIG1haXMgaW1wb3J0YW50ZXMgc8OjbywgZW0gb3JkZW0gZGUgaW1wb3J0w6JuY2lhOgoxLiBgdG90YWxfcmVjZWl0YWAKMi4gYHRvdGFsX2Rlc3Blc2FgCjMuIGByZWN1cnNvc19kZV9wZXNzb2FzX2p1cmlkaWNhc2AKNC4gYHJlY3Vyc29zX2RlX3Blc3NvYXNfZmlzaWNhc2AKNS4gYHF1YW50aWRhZGVfZm9ybmVjZWRvcmVzYAo2LiBgcXVhbnRpZGFkZV9kZXNwZXNhc2AKNy4gYG1lZGlhX3JlY2VpdGFgCjguIGByZWN1cnNvc19kZV9wYXJ0aWRvX3BvbGl0aWNvYAo5LiBgcXVhbnRpZGFkZV9kb2Fkb3Jlc2AKMTAuIGBxdWFudGlkYWRlX2RvYWNvZXNgCjExLiBgZ3JhdWAKMTIuIGBlc3RhZG9fY2l2aWxgCjEzLiBgcGFydGlkb2AKMTQuIGBzZXhvYAoKUGFyYSBvIG1vZGVsbyBMYXNzbywgdGVtb3M6CgpgYGB7cn0KZ2dwbG90KHZhckltcChsYXNzbykpCmBgYAoKRGUgYWNvcmRvIGNvbSBvIGdyw6FmaWNvLCB2ZW1vcyBxdWUgYSBtYWlvcmlhIGRhcyB2YXJpw6F2ZWlzIG1haXMgaW1wb3J0YW50ZXMgcGFyYSBvIG1vZGVsbyBSaWRnZSBzw6NvIHRhbWLDqW0gaW1wb3J0YW50ZXMgcGFyYSBvIG1vZGVsbyBMYXNzby4KQXMgdmFyacOhdmVpcyBkZXNjYXJ0YWRhcyBwZWxvIG1vZGVsbyBMYXNzbywgc8OjbzoKKiBgYW5vYAoqIGByZWN1cnNvc19wcm9wcmlvc2AKKiBgcmVjdXJzb3NfZGVfb3V0cm9zX2NhbmRpZGF0b3MuY29taXRlc2AKKiBgbWVkaWFfZGVzcGVzYWAKCiMjIFJlLXRyZWluZSBvIG1lbGhvciBtb2RlbG8gKHVzYW5kbyBvcyBtZWxob3JlcyB2YWxvcmVzIGRlIHBhcsOibWV0cm9zIGVuY29udHJhZG9zIGVtIHRvZG9zIG9zIGRhZG9zLCBzZW0gdXNhciB2YWxpZGHDp8OjbyBjcnV6YWRhKS4KCmBgYHtyIGV2YWw9RkFMU0V9CmJlc3QuZ3JpZCA8LSBleHBhbmQuZ3JpZChrID0ga25uJGJlc3RUdW5lKQoKYmVzdC5tb2RlbCA8LSB0cmFpbih2b3RvcyB+IC4sCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRyYWluLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJrbm4iLAogICAgICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gYmVzdC5ncmlkKQpiZXN0Lm1vZGVsCmBgYAoKIyMgVXNlIGVzc2Ugw7psdGltbyBtb2RlbG8gdHJlaW5hZG8gcGFyYSBwcmV2ZXIgb3MgZGFkb3MgZGUgdGVzdGUgZGlzcG9uw612ZWlzIG5vIGNoYWxsZW5nZSBkaXNwb27DrXZlbCBwbGF0YWZvcm1hIEthZ2dsZS4KCmBgYHtyfQp0ZXN0IDwtIHJlYWQuY3N2KGhlcmUoImRhdGEvdGVzdC5jc3YiKSkKCnN1Ym1pc3Npb24gPC0gdGVzdCAlPiUKICBzZWxlY3Qoc2VxdWVuY2lhbF9jYW5kaWRhdG8pCgp0ZXN0IDwtIHRlc3QgJT4lIAogIHNlbGVjdCgtc2VxdWVuY2lhbF9jYW5kaWRhdG8sCiAgICAgICAgIC1ub21lLAogICAgICAgICAtY2FyZ28sCiAgICAgICAgIC11ZiwKICAgICAgICAgLW9jdXBhY2FvKQoKcHJlZGljdGlvbnMgPC0gcHJlZGljdChiZXN0Lm1vZGVsLCB0ZXN0KQpzdWJtaXNzaW9uJHZvdG9zIDwtIHByZWRpY3Rpb25zCnN1Ym1pc3Npb24gPC0gc3VibWlzc2lvbiAlPiUgCiAgc2VsZWN0KElEID0gc2VxdWVuY2lhbF9jYW5kaWRhdG8sCiAgICAgICAgIHZvdG9zID0gdm90b3MpCndyaXRlLmNzdih4ID0gc3VibWlzc2lvbiwKICAgICAgICAgIGZpbGUgPSAic2FtcGxlX3N1Ym1pc3Npb24uY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKCg==