Pallial transition state cells

Extract apical progenitors

We perform K-means clustering on the 4 cell state scores :

  • Sub-pallial neurons SP
  • Pallial neurons Pal
  • Sub-pallial BP SP.BP
  • Pallial BP Pal.BP

We then extract the Pallial cells branch. We also excludes CR cells cluster form the trajectory inference.

# Remove the sub-pallial cells branch
MeanKclust.SPscore <- aggregate(SP_signature1 ~ kmeanClust, Allcells.data@meta.data, mean)
SPclust <- MeanKclust.SPscore %>% filter(SP_signature1 == max(SP_signature1)) %>% pull(kmeanClust)

SP.cells <- Allcells.data@meta.data %>% filter(kmeanClust == SPclust) %>% pull(Barcodes)

# Remove cells not use for trajectory inference
Excluded.clusters <- Allcells.data@meta.data %>%
                  filter(Cluster.ident %in% grep("*Sub|GABA|LN.Glut.13|LN.Glut.14|LN.Glut.1$", unique(as.character(Allcells.data@ident)), value = T)) %>%
                  pull(Barcodes) 

# We further keep only pallial apical progenitor clusters
MeanKclust.APscore <- aggregate(AP_signature1 ~ kmeanClust, Allcells.data@meta.data, mean)
APclust <- MeanKclust.APscore %>% filter(AP_signature1 == max(AP_signature1)) %>% pull(kmeanClust)

All.AP <- Allcells.data@meta.data %>% filter(kmeanClust == APclust) %>% pull(Barcodes)
Valide.AP <- Allcells.data@meta.data %>% filter(Cluster.ident %in% grep("Dorsal.Pallium|lateral.Pallium.1|lateral.Pallium.2|Ventral.Pallium",
                                                unique(as.character(Allcells.data@ident)), value = T)) %>% pull(Barcodes)

filtered.AP <- All.AP[!All.AP %in% Valide.AP]

# Remove all invalide cells + 3 pallial outlier cells
Cells.to.use <- rownames(Allcells.data@meta.data)[!rownames(Allcells.data@meta.data) %in% unique(c(SP.cells, Excluded.clusters, filtered.AP, c("ATTTCTGCACGGCCAT" , "CAAGTTGCAAGCCTAT", "CTACATTGTAGCTGCC")))]
Allcells.data <- SubsetData(Allcells.data, cells.use = Cells.to.use, subset.raw = T,  do.clean = F)

Velocity estimation

Velocity estimation and visualisation

## calculating cell knn ... done
## calculating convolved matrices ... done
## gene kNN ... scaling gene weights ... convolving matrices ... done
## fitting gamma coefficients ... done. succesfful fit for 2423 genes
## filtered out 3 out of 2423 genes due to low nmat-emat correlation
## filtered out 10 out of 2420 genes due to low nmat-emat slope
## calculating RNA velocity shift ... re-estimating gamma of individual genes ... done
## calculating RNA velocity shift ... done
## calculating extrapolated cell state ... done
## delta projections ... sqrt knn ... transition probs ... done
## calculating arrows ... done
## grid estimates ... grid.sd= 0.288576  min.arrow.size= 0.005771519  max.grid.arrow.length= 0.04106169  done
## expression shifts .... done

Compute cells’ fate bias towards each mature neuronal type

Prepare FateID input data

We restricted the analysis to the most variable genes as dertermined by the Seurat function “FindVariableGenes” excluding cell cycle phase genes

Compte the cells’ fate bias

## minnr: 10 
## minnrh: 30 
## test set size iteration 1 : 10 10 10 10 10 10 10 
## randomforest iteration 1 of 50 cells
## test set size iteration 2 : 10 10 10 10 10 10 10 
## randomforest iteration 2 of 62 cells
## test set size iteration 3 : 10 10 10 10 10 10 10 
## randomforest iteration 3 of 53 cells
## test set size iteration 4 : 10 10 10 10 10 10 10 
## randomforest iteration 4 of 55 cells
## test set size iteration 5 : 10 10 10 10 10 10 10 
## randomforest iteration 5 of 49 cells
## test set size iteration 6 : 10 10 10 10 10 10 10 
## randomforest iteration 6 of 48 cells
## test set size iteration 7 : 10 10 10 10 10 10 10 
## randomforest iteration 7 of 54 cells
## test set size iteration 8 : 10 10 10 10 10 10 10 
## randomforest iteration 8 of 49 cells
## test set size iteration 9 : 10 10 10 10 10 10 10 
## randomforest iteration 9 of 50 cells
## test set size iteration 10 : 10 10 10 10 10 10 10 
## randomforest iteration 10 of 51 cells
## test set size iteration 11 : 10 10 10 10 10 10 10 
## randomforest iteration 11 of 52 cells
## test set size iteration 12 : 10 10 10 10 10 10 10 
## randomforest iteration 12 of 44 cells
## test set size iteration 13 : 10 10 10 10 10 10 10 
## randomforest iteration 13 of 45 cells
## test set size iteration 14 : 10 10 10 10 10 10 10 
## randomforest iteration 14 of 42 cells
## test set size iteration 15 : 10 10 10 10 10 10 10 
## randomforest iteration 15 of 43 cells
## test set size iteration 16 : 10 10 10 10 10 10 10 
## randomforest iteration 16 of 40 cells
## test set size iteration 17 : 10 10 10 10 10 10 10 
## randomforest iteration 17 of 40 cells
## test set size iteration 18 : 10 10 10 10 10 10 10 
## randomforest iteration 18 of 37 cells
## test set size iteration 19 : 10 10 10 10 10 10 10 
## randomforest iteration 19 of 42 cells
## test set size iteration 20 : 10 10 10 10 10 10 10 
## randomforest iteration 20 of 43 cells
## test set size iteration 21 : 10 10 10 10 10 10 10 
## randomforest iteration 21 of 48 cells
## test set size iteration 22 : 10 10 10 10 10 10 10 
## randomforest iteration 22 of 47 cells
## test set size iteration 23 : 10 10 10 10 10 10 10 
## randomforest iteration 23 of 50 cells
## test set size iteration 24 : 10 10 10 10 10 10 10 
## randomforest iteration 24 of 52 cells
## test set size iteration 25 : 10 10 10 10 10 10 10 
## randomforest iteration 25 of 53 cells
## test set size iteration 26 : 10 10 10 10 10 10 10 
## randomforest iteration 26 of 57 cells
## test set size iteration 27 : 10 10 10 10 10 10 10 
## randomforest iteration 27 of 54 cells
## test set size iteration 28 : 10 10 10 10 10 10 10 
## randomforest iteration 28 of 49 cells
## test set size iteration 29 : 10 10 10 10 10 10 10 
## randomforest iteration 29 of 54 cells
## test set size iteration 30 : 10 10 10 10 10 10 10 
## randomforest iteration 30 of 51 cells
## test set size iteration 31 : 10 10 10 10 10 10 10 
## randomforest iteration 31 of 50 cells
## test set size iteration 32 : 10 10 10 10 10 10 10 
## randomforest iteration 32 of 55 cells
## test set size iteration 33 : 5 5 5 5 5 5 10 
## randomforest iteration 33 of 36 cells
## test set size iteration 34 : 10 10 10 10 10 10 10 
## randomforest iteration 34 of 56 cells
## test set size iteration 35 : 10 10 10 10 10 10 10 
## randomforest iteration 35 of 55 cells
## test set size iteration 36 : 10 10 10 10 10 10 10 
## randomforest iteration 36 of 55 cells
## test set size iteration 37 : 10 10 10 10 10 10 10 
## randomforest iteration 37 of 54 cells
## test set size iteration 38 : 10 10 10 10 10 10 10 
## randomforest iteration 38 of 56 cells
## test set size iteration 39 : 10 10 10 10 10 10 10 
## randomforest iteration 39 of 58 cells
## test set size iteration 40 : 10 10 10 10 10 10 10 
## randomforest iteration 40 of 47 cells
## test set size iteration 41 : 10 10 10 10 10 10 10 
## randomforest iteration 41 of 44 cells
## test set size iteration 42 : 10 10 10 10 10 10 10 
## randomforest iteration 42 of 30 cells
## test set size iteration 43 : 10 10 10 10 10 10 10 
## randomforest iteration 43 of 18 cells
## test set size iteration 44 : 10 10 10 10 10 10 10 
## randomforest iteration 44 of 2 cells

Import lineage bias into Seurat meta.data

Manuscript Fig. 7A and S7A

Manuscript Fig. 7A and S7A

Manuscript Fig. 7B

Manuscript Fig. 7B

Extract the Nr4a2 and Nfix “lineage” cells

Aligne cells along Pseudotime

We decided to use spring space dimensionality reduction to fit the principale curve because it has been calculated on all cells together. Thus reflecting pan neuronal differentiation axis of variation.

Find DEG between the two trajectories and along the pseudotime

Find direction of the DEG

We find direction of the DEG by calculating the area between curves (ABC) for branch-dependent genes by adapting the monocle package function calABCs. Genes specific ABC is computed on smoothed expression value over 100 points along the pseudotime

Cluster the genes by expression profiles along the two trajectories

Nr4a2 neurons specific transcriptional trajectories

Manuscript Fig. 7D

Manuscript Fig. 7D

Nfix neurons specific transcriptional trajectories

Manuscript Fig. 7C

Manuscript Fig. 7C

Inspect the genes which best predict early fate bias within BPs

Extract cells in BP state

Find the genes which best classify BP between the 2 trajectories

Session Info

## [1] "30 novembre, 2020, 11,27"
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.5 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
## LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3
## 
## locale:
##  [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8    
##  [5] LC_MONETARY=fr_FR.UTF-8    LC_MESSAGES=fr_FR.UTF-8   
##  [7] LC_PAPER=fr_FR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
##  [1] splines   stats4    parallel  stats     graphics  grDevices utils    
##  [8] datasets  methods   base     
## 
## other attached packages:
##  [1] wesanderson_0.3.6   RColorBrewer_1.1-2  patchwork_0.0.1    
##  [4] ggExtra_0.9         reshape2_1.4.3      dplyr_0.8.3        
##  [7] seriation_1.2-9     velocyto.R_0.6      FateID_0.1.9       
## [10] monocle_2.14.0      DDRTree_0.1.5       irlba_2.3.3        
## [13] VGAM_1.1-2          Biobase_2.46.0      BiocGenerics_0.32.0
## [16] princurve_2.1.4     Seurat_2.3.4        Matrix_1.2-17      
## [19] cowplot_1.0.0       ggplot2_3.2.1      
## 
## loaded via a namespace (and not attached):
##   [1] snow_0.4-3           backports_1.1.5      Hmisc_4.3-0         
##   [4] plyr_1.8.4           igraph_1.2.5         lazyeval_0.2.2      
##   [7] densityClust_0.3     lle_1.1              fastICA_1.2-2       
##  [10] digest_0.6.25        foreach_1.4.7        htmltools_0.5.0     
##  [13] viridis_0.5.1        lars_1.2             gdata_2.18.0        
##  [16] magrittr_1.5         checkmate_1.9.4      cluster_2.1.0       
##  [19] mixtools_1.1.0       ROCR_1.0-7           limma_3.42.0        
##  [22] matrixStats_0.55.0   R.utils_2.9.0        docopt_0.6.1        
##  [25] askpass_1.1          colorspace_1.4-1     ggrepel_0.8.1       
##  [28] xfun_0.18            sparsesvd_0.2        crayon_1.3.4        
##  [31] jsonlite_1.7.0       zeallot_0.1.0        survival_2.44-1.1   
##  [34] zoo_1.8-6            iterators_1.0.12     ape_5.3             
##  [37] glue_1.4.1           registry_0.5-1       gtable_0.3.0        
##  [40] kernlab_0.9-29       prabclus_2.3-1       DEoptimR_1.0-8      
##  [43] scales_1.1.0         pheatmap_1.0.12      som_0.3-5.1         
##  [46] bibtex_0.4.2         miniUI_0.1.1.1       Rcpp_1.0.5          
##  [49] metap_1.1            dtw_1.21-3           xtable_1.8-4        
##  [52] viridisLite_0.3.0    htmlTable_1.13.2     reticulate_1.13     
##  [55] foreign_0.8-72       bit_4.0.4            proxy_0.4-23        
##  [58] mclust_5.4.5         SDMTools_1.1-221.1   Formula_1.2-3       
##  [61] tsne_0.1-3           umap_0.2.3.1         htmlwidgets_1.5.1   
##  [64] httr_1.4.1           FNN_1.1.3            gplots_3.0.1.1      
##  [67] fpc_2.2-3            acepack_1.4.1        modeltools_0.2-22   
##  [70] ica_1.0-2            farver_2.0.1         pkgconfig_2.0.3     
##  [73] R.methodsS3_1.7.1    flexmix_2.3-15       nnet_7.3-14         
##  [76] locfit_1.5-9.1       labeling_0.3         later_1.0.0         
##  [79] tidyselect_0.2.5     rlang_0.4.7          munsell_0.5.0       
##  [82] tools_3.6.3          ggridges_0.5.1       fastmap_1.0.1       
##  [85] evaluate_0.14        stringr_1.4.0        yaml_2.2.1          
##  [88] npsurv_0.4-0         knitr_1.26           bit64_4.0.2         
##  [91] fitdistrplus_1.0-14  robustbase_0.93-5    caTools_1.17.1.2    
##  [94] randomForest_4.6-14  purrr_0.3.3          RANN_2.6.1          
##  [97] pbapply_1.4-2        nlme_3.1-141         mime_0.7            
## [100] slam_0.1-46          R.oo_1.23.0          hdf5r_1.3.2.9000    
## [103] compiler_3.6.3       rstudioapi_0.11      png_0.1-7           
## [106] lsei_1.2-0           tibble_2.1.3         stringi_1.4.6       
## [109] highr_0.8            lattice_0.20-41      HSMMSingleCell_1.6.0
## [112] vctrs_0.2.0          pillar_1.4.2         lifecycle_0.1.0     
## [115] combinat_0.0-8       Rdpack_0.11-0        lmtest_0.9-37       
## [118] data.table_1.12.6    bitops_1.0-6         gbRd_0.4-11         
## [121] httpuv_1.5.2         pcaMethods_1.78.0    R6_2.4.1            
## [124] latticeExtra_0.6-28  promises_1.1.0       TSP_1.1-10          
## [127] KernSmooth_2.23-15   gridExtra_2.3        codetools_0.2-16    
## [130] MASS_7.3-53          gtools_3.8.1         assertthat_0.2.1    
## [133] openssl_1.4.1        withr_2.1.2          qlcMatrix_0.9.7     
## [136] mgcv_1.8-33          diptest_0.75-7       doSNOW_1.0.18       
## [139] grid_3.6.3           rpart_4.1-15         tidyr_1.0.0         
## [142] class_7.3-17         rmarkdown_2.5        segmented_1.0-0     
## [145] Rtsne_0.15           shiny_1.4.0          snowfall_1.84-6.1   
## [148] scatterplot3d_0.3-41 base64enc_0.1-3

  1. Institute of Psychiatry and Neuroscience of Paris, INSERM U1266, 75014, Paris, France,

LS0tCnRpdGxlOiAiQ29tcGFyYWlzb24gb2YgVlAgYW5kIERQIGRlcml2ZWQgbmV1cm9ucyBkaWZmZXJlbnRpYXRpb24gdHJhamVjdG9yaWVzIgphdXRob3I6CiAgIC0gTWF0dGhpZXUgTW9yZWF1XltJbnN0aXR1dGUgb2YgUHN5Y2hpYXRyeSBhbmQgTmV1cm9zY2llbmNlIG9mIFBhcmlzLCBJTlNFUk0gVTEyNjYsIDc1MDE0LCBQYXJpcywgRnJhbmNlLCBtYXR0aGlldS5tb3JlYXVAaW5zZXJtLmZyXSBbIVtdKGh0dHBzOi8vb3JjaWQub3JnL3NpdGVzL2RlZmF1bHQvZmlsZXMvaW1hZ2VzL29yY2lkXzE2eDE2LnBuZyldKGh0dHBzOi8vb3JjaWQub3JnLzAwMDAtMDAwMi0yNTkyLTIzNzMpCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgZGZfcHJpbnQ6IHRpYmJsZQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrCiAgICBpbmNsdWRlczoKICAgICAgaW5faGVhZGVyOiBoZWFkZXIuaHRtbAogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogeWVzCi0tLQoKYGBge2NzcywgZWNobz1GQUxTRX0KaDEgewogIGZvbnQtc2l6ZTogMzRweDsKICBtYXJnaW4tdG9wOiAycmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07CiAgY29sb3I6ICNlNjRkMDA7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDQwcHg7CiAgbWFyZ2luLXRvcDogMnJlbTsKICBtYXJnaW4tYm90dG9tOiAxcmVtOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgY29sb3I6ICMwMDAwMDA7Cn0KaDIgewogIGZvbnQtc2l6ZTogMzBweDsKICBtYXJnaW4tdG9wOiAycmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07CiAgY29sb3I6ICMwMDAwMDA7Cn0KaDMgewogIGZvbnQtc2l6ZTogMjRweDsKICBtYXJnaW4tdG9wOiAycmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07CiAgY29sb3I6ICMwMDAwMDA7Cn0KaDQgewogIGZvbnQtc2l6ZTogMjBweDsKICBtYXJnaW4tdG9wOiAycmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07CiAgY29sb3I6ICMwMDAwMDA7Cn0KaDUgewogIGZvbnQtc2l6ZTogMThweDsKICBtYXJnaW4tdG9wOiAycmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07CiAgY29sb3I6ICMwMDAwMDA7Cn0KCi5zY3JvbGwtMTAwIHsKICBtYXgtaGVpZ2h0OiAyMDBweDsKICBvdmVyZmxvdy15OiBhdXRvOwogIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Cn0KCnAgewogIGZvbnQtc2l6ZTogMTZweDsKfQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5hbGlnbiA9ICdjZW50ZXInLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFKQpgYGAKCiMgTG9hZCBsaWJyYXJpZXMgYW5kIFFDRmlsdGVyZWQgZGF0YXNldAoKYGBge3IgfQojIExvYWQgbGlicmFyeQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShwcmluY3VydmUpCmxpYnJhcnkobW9ub2NsZSkKbGlicmFyeShGYXRlSUQpCmxpYnJhcnkodmVsb2N5dG8uUikKbGlicmFyeShwYXJhbGxlbCkKbGlicmFyeShzZXJpYXRpb24pCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGdnRXh0cmEpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeSh3ZXNhbmRlcnNvbikKCiNTZXQgZ2dwbG90IHRoZW1lIGFzIGNsYXNzaWMKdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkKYGBgCgpgYGB7cn0KIyBMb2FkIHRoZSBmdWxsIGFubm90YXRlZCBkYXRhc2V0CkFsbGNlbGxzLmRhdGEgPC0gcmVhZFJEUygiLi9DbHVzdGVyZWQuY2VsbHMuUkRTIikKYGBgCgpgYGB7ciBmaWcuZGltPWMoOCwgNil9CmNvbG9ycyA8LSAgYygiIzk2OTY5NiIsCiAgICAgICAgICAgICAgdG9sb3dlcihjKCIjNjhCMDQxIiwgIiNFM0MxNDgiLCAiI0I3RDE3NCIsICIjODNDM0I4IiwgIiMwMDlGREEiLCAiIzNFNjlBQyIsICIjRTQ2QjZCIikpLAogICAgICAgICAgICAgICIjZWM3NTZkIiwgIiNjNzczYTciLCAiIzcyOTNjOCIsICIjYjc5ZjBiIiwgIiMzY2E3M2YiLCIjMzFiNmJkIiwKICAgICAgICAgICAgICAiI2ViY2IyZSIsICIjOWVjMjJmIiwgIiNhOTk2MWIiLCAiI2NjM2ExYiIsICIjY2M4Nzc4IiAsICIjZDE0YzhkIiwgIiM0Y2FiZGMiLCAiIzVhYjc5MyIsICIjZTc4MjNhIiwiI2U2YmI5YiIsICIjMDQ2YzlhIiwgIiM0Nzg0YTIiICwgIiM0OTkwYzkiKQoKRGltUGxvdChBbGxjZWxscy5kYXRhLAogICAgICAgIHJlZHVjdGlvbi51c2UgPSAic3ByaW5nIiwgCiAgICAgICAgZGltLjEgPSAxLAogICAgICAgIGRpbS4yID0gMiwKICAgICAgICBkby5sYWJlbD1ULAogICAgICAgIGxhYmVsLnNpemUgPSAyLAogICAgICAgIG5vLmxlZ2VuZCA9IEYsCiAgICAgICAgY29scy51c2UgPSBjb2xvcnMpCmBgYAoKIyBQYWxsaWFsIHRyYW5zaXRpb24gc3RhdGUgY2VsbHMKCiMjIEV4dHJhY3QgYXBpY2FsIHByb2dlbml0b3JzCgpXZSBwZXJmb3JtIEstbWVhbnMgY2x1c3RlcmluZyBvbiB0aGUgNCBjZWxsIHN0YXRlIHNjb3JlcyA6CgotIFN1Yi1wYWxsaWFsIG5ldXJvbnMgYFNQYAotIFBhbGxpYWwgbmV1cm9ucyBgUGFsYAotIFN1Yi1wYWxsaWFsIEJQIGBTUC5CUGAKLSBQYWxsaWFsIEJQIGBQYWwuQlBgCgpgYGB7cn0KIyBDYWxjdWxhdGUgUGFsbGlhbCBhbmQgU3ViLXBhbGxpYWwgQlAgc2NvcmVzClBhbC5CUC5nZW5lcyA8LSBjKCJFb21lcyIsICJOZXVyb2cyIiwgIk5ldXJvZzEiLCAiUHJtdDgiLCAiTnJwMSIpCmdlbmVzLmxpc3QgPC0gbGlzdChQYWwuQlAuZ2VuZXMpCmVucmljaC5uYW1lIDwtICJQYWwuQlBfc2lnbmF0dXJlIgpBbGxjZWxscy5kYXRhIDwtIEFkZE1vZHVsZVNjb3JlKEFsbGNlbGxzLmRhdGEsIGdlbmVzLmxpc3QgPSBnZW5lcy5saXN0LCBnZW5lcy5wb29sID0gTlVMTCwgbi5iaW4gPSA1LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQudXNlID0gMSwgY3RybC5zaXplID0gbGVuZ3RoKGdlbmVzLmxpc3QpLCB1c2UuayA9IEZBTFNFLCBlbnJpY2gubmFtZSA9IGVucmljaC5uYW1lICwKICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20uc2VlZCA9IDEpCgoKU1AuQlAuZ2VuZXMgPC0gYygiRGx4MSIsICJEbHgyIiwgIkRseDUiLCJBc2NsMSIsICJHc3gyIikKZ2VuZXMubGlzdCA8LSBsaXN0KFNQLkJQLmdlbmVzKQplbnJpY2gubmFtZSA8LSAiU1AuQlBfc2lnbmF0dXJlIgpBbGxjZWxscy5kYXRhIDwtIEFkZE1vZHVsZVNjb3JlKEFsbGNlbGxzLmRhdGEsIGdlbmVzLmxpc3QgPSBnZW5lcy5saXN0LCBnZW5lcy5wb29sID0gTlVMTCwgbi5iaW4gPSA1LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQudXNlID0gMSwgY3RybC5zaXplID0gbGVuZ3RoKGdlbmVzLmxpc3QpLCB1c2UuayA9IEZBTFNFLCBlbnJpY2gubmFtZSA9IGVucmljaC5uYW1lICwKICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20uc2VlZCA9IDEpCmBgYAoKYGBge3J9CnNldC5zZWVkKDEwMCkKIyBSdW4gSy1tZWFucyBjbHVzdGVyaW5nCmNsIDwtIGttZWFucyhjYmluZChBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRTUF9zaWduYXR1cmUxLAogICAgICAgICAgICAgICAgICAgQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkUGFsX3NpZ25hdHVyZTEsCiAgICAgICAgICAgICAgICAgICBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRTUC5CUF9zaWduYXR1cmUxLAogICAgICAgICAgICAgICAgICAgQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkUGFsLkJQX3NpZ25hdHVyZTEpLCA0KQoKQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEka21lYW5DbHVzdCA8LSBwYXN0ZTAoIkNsdXN0LiIsY2wkY2x1c3RlcikKYGBgCgpgYGB7ciBmaWcuZGltPWMoNS4zLCA0KX0KY29sLnBhbCA8LSB3ZXNfcGFsZXR0ZSgiR3JhbmRCdWRhcGVzdDEiLCA0LCB0eXBlID0gImRpc2NyZXRlIikKCnAxIDwtIGdncGxvdChBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSwgYWVzKHg9U1Bfc2lnbmF0dXJlMSwgeT1QYWxfc2lnbmF0dXJlMSwgY29sb3VyID0ga21lYW5DbHVzdCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbC5wYWwpICsKICBnZW9tX3BvaW50KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpnZ01hcmdpbmFsKHAxLCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9ImxpZ2h0Z3JleSIpCgpEaW1QbG90KEFsbGNlbGxzLmRhdGEsCiAgICAgICAgZ3JvdXAuYnkgPSAia21lYW5DbHVzdCIsCiAgICAgICAgcmVkdWN0aW9uLnVzZSA9ICJzcHJpbmciLAogICAgICAgIGNvbHMudXNlID0gY29sLnBhbCwKICAgICAgICBkaW0uMSA9IDEsCiAgICAgICAgZGltLjIgPSAyLAogICAgICAgIGRvLmxhYmVsPVQsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDQsCiAgICAgICAgbm8ubGVnZW5kID0gRikKYGBgCgpXZSB0aGVuIGV4dHJhY3QgdGhlIFBhbGxpYWwgY2VsbHMgYnJhbmNoLiBXZSBhbHNvIGV4Y2x1ZGVzIENSIGNlbGxzIGNsdXN0ZXIgZm9ybSB0aGUgdHJhamVjdG9yeSBpbmZlcmVuY2UuCgpgYGB7cn0KIyBSZW1vdmUgdGhlIHN1Yi1wYWxsaWFsIGNlbGxzIGJyYW5jaApNZWFuS2NsdXN0LlNQc2NvcmUgPC0gYWdncmVnYXRlKFNQX3NpZ25hdHVyZTEgfiBrbWVhbkNsdXN0LCBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSwgbWVhbikKU1BjbHVzdCA8LSBNZWFuS2NsdXN0LlNQc2NvcmUgJT4lIGZpbHRlcihTUF9zaWduYXR1cmUxID09IG1heChTUF9zaWduYXR1cmUxKSkgJT4lIHB1bGwoa21lYW5DbHVzdCkKClNQLmNlbGxzIDwtIEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhICU+JSBmaWx0ZXIoa21lYW5DbHVzdCA9PSBTUGNsdXN0KSAlPiUgcHVsbChCYXJjb2RlcykKCiMgUmVtb3ZlIGNlbGxzIG5vdCB1c2UgZm9yIHRyYWplY3RvcnkgaW5mZXJlbmNlCkV4Y2x1ZGVkLmNsdXN0ZXJzIDwtIEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhICU+JQogICAgICAgICAgICAgICAgICBmaWx0ZXIoQ2x1c3Rlci5pZGVudCAlaW4lIGdyZXAoIipTdWJ8R0FCQXxMTi5HbHV0LjEzfExOLkdsdXQuMTR8TE4uR2x1dC4xJCIsIHVuaXF1ZShhcy5jaGFyYWN0ZXIoQWxsY2VsbHMuZGF0YUBpZGVudCkpLCB2YWx1ZSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgcHVsbChCYXJjb2RlcykgCgojIFdlIGZ1cnRoZXIga2VlcCBvbmx5IHBhbGxpYWwgYXBpY2FsIHByb2dlbml0b3IgY2x1c3RlcnMKTWVhbktjbHVzdC5BUHNjb3JlIDwtIGFnZ3JlZ2F0ZShBUF9zaWduYXR1cmUxIH4ga21lYW5DbHVzdCwgQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEsIG1lYW4pCkFQY2x1c3QgPC0gTWVhbktjbHVzdC5BUHNjb3JlICU+JSBmaWx0ZXIoQVBfc2lnbmF0dXJlMSA9PSBtYXgoQVBfc2lnbmF0dXJlMSkpICU+JSBwdWxsKGttZWFuQ2x1c3QpCgpBbGwuQVAgPC0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEgJT4lIGZpbHRlcihrbWVhbkNsdXN0ID09IEFQY2x1c3QpICU+JSBwdWxsKEJhcmNvZGVzKQpWYWxpZGUuQVAgPC0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEgJT4lIGZpbHRlcihDbHVzdGVyLmlkZW50ICVpbiUgZ3JlcCgiRG9yc2FsLlBhbGxpdW18bGF0ZXJhbC5QYWxsaXVtLjF8bGF0ZXJhbC5QYWxsaXVtLjJ8VmVudHJhbC5QYWxsaXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGFzLmNoYXJhY3RlcihBbGxjZWxscy5kYXRhQGlkZW50KSksIHZhbHVlID0gVCkpICU+JSBwdWxsKEJhcmNvZGVzKQoKZmlsdGVyZWQuQVAgPC0gQWxsLkFQWyFBbGwuQVAgJWluJSBWYWxpZGUuQVBdCgojIFJlbW92ZSBhbGwgaW52YWxpZGUgY2VsbHMgKyAzIHBhbGxpYWwgb3V0bGllciBjZWxscwpDZWxscy50by51c2UgPC0gcm93bmFtZXMoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEpWyFyb3duYW1lcyhBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSkgJWluJSB1bmlxdWUoYyhTUC5jZWxscywgRXhjbHVkZWQuY2x1c3RlcnMsIGZpbHRlcmVkLkFQLCBjKCJBVFRUQ1RHQ0FDR0dDQ0FUIiAsICJDQUFHVFRHQ0FBR0NDVEFUIiwgIkNUQUNBVFRHVEFHQ1RHQ0MiKSkpXQpBbGxjZWxscy5kYXRhIDwtIFN1YnNldERhdGEoQWxsY2VsbHMuZGF0YSwgY2VsbHMudXNlID0gQ2VsbHMudG8udXNlLCBzdWJzZXQucmF3ID0gVCwgIGRvLmNsZWFuID0gRikKYGBgCgpgYGB7ciBmaWcuZGltPWMoOCwgNil9CmNvbG9ycyA8LSAgYygiIzk2OTY5NiIsCiAgICAgICAgICAgICAgdG9sb3dlcihjKCIjNjhCMDQxIiwgIiNFM0MxNDgiLCAiI0I3RDE3NCIsICIjRTQ2QjZCIikpLAogICAgICAgICAgICAgICIjY2MzYTFiIiwgIiNjYzg3NzgiICwgIiNkMTRjOGQiLCAiIzRjYWJkYyIsICIjNWFiNzkzIiwgIiNlNzgyM2EiLCIjZTZiYjliIiwgIiMwNDZjOWEiLCAiIzQ3ODRhMiIgLCAiIzQ5OTBjOSIpCgpEaW1QbG90KEFsbGNlbGxzLmRhdGEsCiAgICAgICAgcmVkdWN0aW9uLnVzZSA9ICJzcHJpbmciLCAKICAgICAgICBkaW0uMSA9IDEsCiAgICAgICAgZGltLjIgPSAyLAogICAgICAgIGRvLmxhYmVsPVQsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDIsCiAgICAgICAgbm8ubGVnZW5kID0gVCwKICAgICAgICBjb2xzLnVzZSA9IGNvbG9ycykKYGBgCgojIyBGaWx0ZXIgdGhlIGdlbmUgY291bnRzIG1hdHJpeAoKYGBge3J9CiMgRmlsdGVyIGdlbmVzCm51bS5jZWxscyA8LSBNYXRyaXg6OnJvd1N1bXMoQWxsY2VsbHMuZGF0YUByYXcuZGF0YSA+IDApCmdlbmVzLnVzZSA8LSBuYW1lcyh4ID0gbnVtLmNlbGxzW3doaWNoKHggPSBudW0uY2VsbHMgPj0gMjApXSkKQWxsY2VsbHMuZGF0YUByYXcuZGF0YSA8LSBBbGxjZWxscy5kYXRhQHJhdy5kYXRhW2dlbmVzLnVzZSwgXQoKIyBOb3JtYWxpemF0aW9uIGFuZCB2YXJpYWJsZSBnZW5lcyBzZWxlY3Rpb24KQWxsY2VsbHMuZGF0YSA8LSBOb3JtYWxpemVEYXRhKG9iamVjdCA9IEFsbGNlbGxzLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJMb2dOb3JtYWxpemUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLmZhY3RvciA9IHJvdW5kKG1lZGlhbihBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRuVU1JKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnByb2dyZXNzID0gRikKCkFsbGNlbGxzLmRhdGEgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gQWxsY2VsbHMuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuLmZ1bmN0aW9uID0gRXhwTWVhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwZXJzaW9uLmZ1bmN0aW9uID0gTG9nVk1SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgubG93LmN1dG9mZiA9IDAuMDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5oaWdoLmN1dG9mZiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5jdXRvZmYgPSAyLCBkby5wbG90ID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnByb2dyZXNzID0gRikKYGBgCgojIFZlbG9jaXR5IGVzdGltYXRpb24KCiMjIFNldCBDbHVzdGVyIElkIGFuZCBjb2xvciBwYWxldHRlIGZvciB2ZWxvY2l0eSBpbnRlcm5hbCBwbG90dGluZyBmdW5jdGlvbnMKYGBge3J9CiMgVGFrZSB0aGUgY2x1c3RlciBpZCBmcm9tIFNldXJhdCBhbmFseXNpcwpjbHVzdGVyLmxhYmVsIDwtIEFsbGNlbGxzLmRhdGFAaWRlbnQKQ2x1c3Rlci5pZGVudCA8LSBhcy5jaGFyYWN0ZXIoQWxsY2VsbHMuZGF0YUBpZGVudCkKCiMgU2V0IGNvbG9yIFBhbGV0dGUgZm9yIGxheW91dApwYWxldHRlIDwtIGMoc2NhbGVzOjpodWVfcGFsKCkobGVuZ3RoKHVuaXF1ZShDbHVzdGVyLmlkZW50KSkpKQpjb2xvcnNpZGVudCA8LSBjYmluZChpZGVudCA9IHNvcnQodW5pcXVlKENsdXN0ZXIuaWRlbnQpKSwKICAgICAgICAgICAgICAgICAgICAgY29sb3JzID0gYygiIzk2OTY5NiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9sb3dlcihjKCIjNjhCMDQxIiwgIiNFM0MxNDgiLCAiI0I3RDE3NCIsICIjRTQ2QjZCIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjY2MzYTFiIiwgIiNjYzg3NzgiICwgIiNkMTRjOGQiLCAiIzRjYWJkYyIsICIjNWFiNzkzIiwgIiNlNzgyM2EiLCIjZTZiYjliIiwgIiMwNDZjOWEiLCAiIzQ3ODRhMiIgLCAiIzQ5OTBjOSIpICkKCiMgQ3JlYXRlIGFubm90YXRpb24gZGF0YS5mcmFtZQpDZWxscy5Db2xvci5kZiA8LSBkYXRhLmZyYW1lKHNhbXBsZV9uYW1lID0gcm93Lm5hbWVzKEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5X3R5cGVfbGFiZWwgPSBhcy5jaGFyYWN0ZXIoQ2x1c3Rlci5pZGVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeV90eXBlX2NvbG9yID0gYXMuY2hhcmFjdGVyKGNvbG9yc2lkZW50W21hdGNoKENsdXN0ZXIuaWRlbnQsIGNvbG9yc2lkZW50WywxXSksMl0pKQoKCmNlbGwuY29sb3JzIDwtIENlbGxzLkNvbG9yLmRmJHByaW1hcnlfdHlwZV9jb2xvcgpuYW1lcyhjZWxsLmNvbG9ycykgPC0gQ2VsbHMuQ29sb3IuZGYkc2FtcGxlX25hbWUKCnJtKENlbGxzLkNvbG9yLmRmLGNvbG9yc2lkZW50LHBhbGV0dGUpCmBgYAoKIyMgTG9hZCB0aGUgdmVsb2NpdG8gTG9vbSBmaWxlIGNvbnRhaW5pbmcgc3BsaWNlZCAvIHVuc3BsaWNlZCBnZW5lIGNvdW50IG1hdHJpeApgYGB7cn0KIyBMb2FkIExvb20gZmlsZSBjb250YWluaW5nIHNwbGljZWQgVlMgdW5zcGxpY2VkIHRyYW5zY3JpcHRzIGNvdW50IG1hdHJpY2VzCkxvb21QYXRoIDwtICIuL3ZlbG9jeXRvL0UxMi1XVC5sb29tIiAKbGRhdCA8LSByZWFkLmxvb20ubWF0cmljZXMoTG9vbVBhdGgpCgpCYXJjb2Rlc1ZlbG9jaXR5IDwtIHN0cmluZ2k6OnN0cmlfc3ViKGxkYXQkc3BsaWNlZEBEaW1uYW1lc1tbMl1dLDQwLDU1KQoKbGRhdCRzcGxpY2VkQERpbW5hbWVzW1syXV0gPC0gQmFyY29kZXNWZWxvY2l0eQpsZGF0JHVuc3BsaWNlZEBEaW1uYW1lc1tbMl1dIDwtIEJhcmNvZGVzVmVsb2NpdHkKbGRhdCRhbWJpZ3VvdXNARGltbmFtZXNbWzJdXSA8LSBCYXJjb2Rlc1ZlbG9jaXR5CgojIEZpbHRlciBtYXRyaXgKbGRhdCRzcGxpY2VkIDwtIGxkYXQkc3BsaWNlZFsscm93bmFtZXMoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEpXQpsZGF0JHVuc3BsaWNlZCA8LSBsZGF0JHVuc3BsaWNlZFsscm93bmFtZXMoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEpXQoKbGRhdCRzcGxpY2VkIDwtIGxkYXQkc3BsaWNlZFshZHVwbGljYXRlZChsZGF0W1sidW5zcGxpY2VkIl1dQERpbW5hbWVzW1sxXV0pLF0KbGRhdCR1bnNwbGljZWQgPC0gbGRhdCR1bnNwbGljZWRbIWR1cGxpY2F0ZWQobGRhdFtbInVuc3BsaWNlZCJdXUBEaW1uYW1lc1tbMV1dKSxdCgojIENsZWFuIHdvcmtzcGFjZQpybShsaXN0PWxzKClbIWxzKCkgJWluJSBjKCJBbGxjZWxscy5kYXRhIiwgImxkYXQiLCAiY2VsbC5jb2xvcnMiLCAiY2x1c3Rlci5sYWJlbCIpXSkKYGBgCgojIyBTZWxlY3QgZ2VuZXMgdXNlZCBmb3IgdmVsb2NpdHkgZXN0aW1hdGlvbgpgYGB7cn0Kc3BsaWNlZCA8LSBsZGF0JHNwbGljZWQKdW5zcGxpY2VkIDwtIGxkYXQkdW5zcGxpY2VkCgojIEZpbHRlciBnZW5lcyBieSBjbHVzdGVyIGV4cHJlc3Npb24KRmlsdGVyZWQuc3BsaWNlZCA8LSBmaWx0ZXIuZ2VuZXMuYnkuY2x1c3Rlci5leHByZXNzaW9uKHNwbGljZWQsY2x1c3Rlci5sYWJlbCxtaW4ubWF4LmNsdXN0ZXIuYXZlcmFnZSA9IDAuMykKRmlsdGVyZWQudW5zcGxpY2VkIDwtIGZpbHRlci5nZW5lcy5ieS5jbHVzdGVyLmV4cHJlc3Npb24odW5zcGxpY2VkLGNsdXN0ZXIubGFiZWwsbWluLm1heC5jbHVzdGVyLmF2ZXJhZ2UgPSAwLjMpCgojIEZpbHRlciBDZWxsIGN5Y2xlIGFzc29jaWF0ZWQgZ2VuZXMKQ0NnZW5lcyA8LSBhcy5jaGFyYWN0ZXIocmVhZC50YWJsZSgiLi9Qcm9nZW5pdG9ycy9DZWxsQ3ljbGVHZW5lcy5jc3YiLCBzZXAgPSAiXHQiLCBoZWFkZXIgPSBGKVssMV0pCgpGaWx0ZXJlZC5zcGxpY2VkICA8LSBGaWx0ZXJlZC5zcGxpY2VkWyFyb3duYW1lcyhGaWx0ZXJlZC5zcGxpY2VkKSAlaW4lIENDZ2VuZXMsXQpGaWx0ZXJlZC51bnNwbGljZWQgPC0gRmlsdGVyZWQudW5zcGxpY2VkWyFyb3duYW1lcyhGaWx0ZXJlZC51bnNwbGljZWQpICVpbiUgQ0NnZW5lcyxdCmBgYAoKCmBgYHtyfQpBbGxjZWxscy5kYXRhIDwtIFJ1blBDQShvYmplY3QgPSBBbGxjZWxscy5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBwY3MuY29tcHV0ZSA9IDIwLAogICAgICAgICAgICAgICAgICAgICAgICBkby5wcmludCA9IEYpCgpjZWxsLmRpc3QgPC0gYXMuZGlzdCgxLWFybWFDb3IodChBbGxjZWxscy5kYXRhQGRyJHBjYUBjZWxsLmVtYmVkZGluZ3MpKSkKYGBgCgojIyBWZWxvY2l0eSBlc3RpbWF0aW9uIGFuZCB2aXN1YWxpc2F0aW9uCmBgYHtyfQojIFZlbG9jaXR5IGVzdGltYXRpb24KZml0LnF1YW50aWxlIDwtIDAuMDQKcnZlbC5jZCA8LSBnZW5lLnJlbGF0aXZlLnZlbG9jaXR5LmVzdGltYXRlcyhGaWx0ZXJlZC5zcGxpY2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcmVkLnVuc3BsaWNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVQ9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2VsbHMgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHZW5lcyA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuZGlzdD1jZWxsLmRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml0LnF1YW50aWxlPWZpdC5xdWFudGlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmNvcmVzID0gZGV0ZWN0Q29yZXMoKSAtMikKYGBgCgpgYGB7ciBmaWcuc2hvdz0naGlkZSd9CiMgVmVsb2NpdHkgb24gZW1iZWRkaW5nCmVtYiA8LSBBbGxjZWxscy5kYXRhQGRyJHNwcmluZ0BjZWxsLmVtYmVkZGluZ3MvNTAKClNwcmluZy52ZWxvIDwtIHNob3cudmVsb2NpdHkub24uZW1iZWRkaW5nLmNvcihlbWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydmVsLmNkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbj01MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPSdzcXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvdy5zY2FsZT0wLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93LmdyaWQuZmxvdz1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLmdyaWQuY2VsbC5tYXNzPTAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWQubj00MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Lmx3ZD0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8ucGFyPUYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmJvcmRlci5hbHBoYSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmNvbG9ycz1jZWxsLmNvbG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc2NhbGluZyA9IFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uZGV0YWlscz0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uY29yZT0gZGV0ZWN0Q29yZXMoKSAtMikKCmBgYAoKYGBge3IgZmlnLmRpbT1jKDksIDYpfQpTcHJpbmcucGxvdCA8LSBhcy5kYXRhLmZyYW1lKEFsbGNlbGxzLmRhdGFAZHIkc3ByaW5nQGNlbGwuZW1iZWRkaW5ncy81MCkgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZSh4MCA9IFNwcmluZy52ZWxvJGFycm93c1ssICJ4MCJdLAogICAgICAgICAgICAgICAgICAgICAgeDEgPSBTcHJpbmcudmVsbyRhcnJvd3NbLCAieDEiXSwKICAgICAgICAgICAgICAgICAgICAgIHkwID0gU3ByaW5nLnZlbG8kYXJyb3dzWywgInkwIl0sCiAgICAgICAgICAgICAgICAgICAgICB5MSA9IFNwcmluZy52ZWxvJGFycm93c1ssICJ5MSJdKSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKHgyID0geDAgKyAoeDEgLSB4MCksCiAgICAgICAgICAgICAgICAgICAgICB5MiA9IHkwICsgKHkxIC0geTApKSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKENsdXN0ZXIgPSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRDbHVzdGVyLmlkZW50KQoKY29sb3JzIDwtIGMoIiM5Njk2OTYiLAogICAgICAgICAgICB0b2xvd2VyKGMoIiM2OEIwNDEiLCAiI0UzQzE0OCIsICIjQjdEMTc0IiwgIiNFNDZCNkIiKSksCiAgICAgICAgICAgICIjY2MzYTFiIiwgIiNjYzg3NzgiICwgIiNkMTRjOGQiLCAiIzRjYWJkYyIsICIjNWFiNzkzIiwgIiNlNzgyM2EiLCIjZTZiYjliIiwgIiMwNDZjOWEiLCAiIzQ3ODRhMiIgLCAiIzQ5OTBjOSIpCgpnZ3Bsb3QoU3ByaW5nLnBsb3QpICsKICAgIGdlb21fcG9pbnQoYWVzKHggPSBzcHJpbmcxLCB5ID0gc3ByaW5nMiwgY29sb3VyID0gQ2x1c3RlcikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpICsKICAgIGdlb21fc2VnbWVudChhZXMoeCA9IHgwLCB4ZW5kID0geDIsIHkgPSB5MCwgeWVuZCA9IHkyKSwKICAgICAgICAgICAgICAgICBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMywgInBvaW50cyIpLCB0eXBlID0gImNsb3NlZCIpLAogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5MjAiLCBhbHBoYSA9IDAuOCkgKyAKICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCgpgYGB7ciBmaWcuZGltPWMoOSwgNil9Cmdsb2JhbC52ZWwuYXJyb3cgPC0gU3ByaW5nLnZlbG8kZ2Fycm93cyAlPiUKICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh4MiA9IHgwICsgKHgxIC0geDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB5MCArICh5MSAtIHkwKSkKCmdncGxvdChTcHJpbmcucGxvdCkgKwogICAgZ2VvbV9wb2ludChhZXMoeCA9IHNwcmluZzEsIHkgPSBzcHJpbmcyLCBjb2xvdXIgPSBDbHVzdGVyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9ycykgKwogICAgZ2VvbV9zZWdtZW50KGRhdGEgPSBnbG9iYWwudmVsLmFycm93LAogICAgICAgICAgICAgICAgIGFlcyh4ID0geDAsIHhlbmQgPSB4MiwgeSA9IHkwLCB5ZW5kID0geTIpLAogICAgICAgICAgICAgICAgIHNpemUgPSAxLAogICAgICAgICAgICAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgzLCAicG9pbnRzIiksIHR5cGUgPSAib3BlbiIpLAogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5MjAiLCBhbHBoYSA9IDAuOCkgKyAKICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCgpgYGB7cn0Kcm0obGlzdCA9IGxzKClbIWxzKCkgJWluJSAiQWxsY2VsbHMuZGF0YSJdKQpgYGAKCiMgQ29tcHV0ZSBjZWxscycgZmF0ZSBiaWFzIHRvd2FyZHMgZWFjaCBtYXR1cmUgbmV1cm9uYWwgdHlwZQoKIyMgUHJlcGFyZSBGYXRlSUQgaW5wdXQgZGF0YQoKYGBge3J9CiMgRmF0ZUlEIHJlcXVpZXJlcyB0aGUgdGVybWluYWwgY2x1c3RlcnMgSUQgdG8gYmUgc2V0IGFzIGludGVnZXJzClRlcm1pbmFsRmF0ZXMgPC0gZ3JlcCgiMTZ8MjR8MjJ8MTl8MjZ8MjB8MjEiLCB1bmlxdWUoYXMuY2hhcmFjdGVyKEFsbGNlbGxzLmRhdGFAaWRlbnQpKSwgdmFsdWUgPSBUKQoKQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkTmV3Q2x1c3RlcklEIDwtIHNhcHBseShhcy5jaGFyYWN0ZXIoQWxsY2VsbHMuZGF0YUBpZGVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgaWYoeCA9PSBUZXJtaW5hbEZhdGVzWzFdKXt4PTF9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih4PT0gVGVybWluYWxGYXRlc1syXSl7eD0yfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoeD09IFRlcm1pbmFsRmF0ZXNbM10pe3g9M30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHg9PSBUZXJtaW5hbEZhdGVzWzRdKXt4PTR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih4PT0gVGVybWluYWxGYXRlc1s1XSl7eD01fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoeD09IFRlcm1pbmFsRmF0ZXNbNl0pe3g9Nn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHg9PSBUZXJtaW5hbEZhdGVzWzddKXt4PTd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXt4PXh9KQpBbGxjZWxscy5kYXRhIDwtIFNldEFsbElkZW50KEFsbGNlbGxzLmRhdGEsIGlkID0gIk5ld0NsdXN0ZXJJRCIpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDgsIDYpfQpjb2xvcnMgPC0gIGMoIiNjYzg3NzgiICwgIiNkMTRjOGQiLCAiIzRjYWJkYyIsICIjNWFiNzkzIiwgIiNlNzgyM2EiLCIjZTZiYjliIiwiI2NjM2ExYiIsCiAgICAgICAgICAgICAiIzk2OTY5NiIsCiAgICAgICAgICAgICAgdG9sb3dlcihjKCIjNjhCMDQxIiwgIiNFM0MxNDgiLCAiI0I3RDE3NCIsICIjRTQ2QjZCIikpLAogICAgICAgICAgICAgICIjMDQ2YzlhIiwgIiM0Nzg0YTIiICwgIiM0OTkwYzkiKQoKRGltUGxvdChBbGxjZWxscy5kYXRhLAogICAgICAgIHJlZHVjdGlvbi51c2UgPSAic3ByaW5nIiwgCiAgICAgICAgZGltLjEgPSAxLAogICAgICAgIGRpbS4yID0gMiwKICAgICAgICBkby5sYWJlbD1ULAogICAgICAgIGxhYmVsLnNpemUgPSA0LAogICAgICAgIG5vLmxlZ2VuZCA9IEYsCiAgICAgICAgY29scy51c2UgPSBjb2xvcnMpCmBgYAoKV2UgcmVzdHJpY3RlZCB0aGUgYW5hbHlzaXMgdG8gdGhlIG1vc3QgdmFyaWFibGUgZ2VuZXMgYXMgZGVydGVybWluZWQgYnkgdGhlIFNldXJhdCBmdW5jdGlvbiAiRmluZFZhcmlhYmxlR2VuZXMiIGV4Y2x1ZGluZyBjZWxsIGN5Y2xlIHBoYXNlIGdlbmVzCgpgYGB7cn0KIyBFeGNsdWRlIGNlbGwgY3ljbGUgYXNzb2NpYXRlZCBnZW5lcwpDQ2dlbmVzIDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKCIuL1Byb2dlbml0b3JzL0NlbGxDeWNsZUdlbmVzLmNzdiIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IEYpWywxXSkKSW5wdXQuZ2VuZXMgPC0gQWxsY2VsbHMuZGF0YUB2YXIuZ2VuZXNbIUFsbGNlbGxzLmRhdGFAdmFyLmdlbmVzICVpbiUgQ0NnZW5lc10KCk5vcm0uTWF0IDwtIGFzLmRhdGEuZnJhbWUoYXMubWF0cml4KEFsbGNlbGxzLmRhdGFAZGF0YVtJbnB1dC5nZW5lcyxdKSkKCiMgU2V0IGEgY2x1c3RlciBhc3NpZ25tZW50IGZhY3RvciBmb3IgZWFjaCBjZWxscwpDbHVzdGVySWRlbnQgPC0gYXMuY2hhcmFjdGVyKEFsbGNlbGxzLmRhdGFAaWRlbnQpCm5hbWVzKENsdXN0ZXJJZGVudCkgPC0gbmFtZXMoQWxsY2VsbHMuZGF0YUBpZGVudCkKCkF0dHJhY3RvcnMgPC0gMTo3CmBgYAoKIyMgQ29tcHRlIHRoZSBjZWxscycgZmF0ZSBiaWFzCgpgYGB7ciBjbGFzcy5vdXRwdXQ9InNjcm9sbC0xMDAifQpJbmZlcmVkLkZhdGUuYmlhcyAgPC0gZmF0ZUJpYXMoTm9ybS5NYXQsIENsdXN0ZXJJZGVudCwgQXR0cmFjdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAxLWNvcihOb3JtLk1hdCwgbWV0aG9kID0gInNwZWFybWFuIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5ucj0xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm5yaD0zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0PVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlPTAuOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYmZhY3Rvcj01LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlLmRpc3Q9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkPTEyMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnRyZWU9TlVMTCkKYGBgCgojIyBJbnNwZWN0IHRoZSB0ZXN0IHNldCB1c2UgYXQgY2xhc3NpZmljYXRpb24gaXRlcmF0aW9uCmBgYHtyfQpBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRGYXRlSUQuaXRlcmF0aW9uIDwtICIwIgpBbGxjZWxscy5kYXRhIDwtIFNldEFsbElkZW50KEFsbGNlbGxzLmRhdGEsIGlkID0gIkZhdGVJRC5pdGVyYXRpb24iKQoKZm9yIChpIGluIHNlcSgwLCBsZW5ndGgoSW5mZXJlZC5GYXRlLmJpYXMkcmZsKSwgYnkgPSA1KVstMV0pIHsKICBpdGVyIDwtIHNlcShpLTQsaSkKICBCYXJjb2RlcyA8LSBjKCkKICBmb3IgKGogaW4gaXRlcikgewogICAgQmFyY29kZXMgPC0gYyhCYXJjb2RlcywgbmFtZXMoSW5mZXJlZC5GYXRlLmJpYXMkcmZsW1tqXV0kdGVzdCRwcmVkaWN0ZWQpKQogIH0KICBBbGxjZWxscy5kYXRhIDwtIFNldElkZW50KEFsbGNlbGxzLmRhdGEsIGNlbGxzLnVzZSA9IEJhcmNvZGVzLCBpZGVudC51c2UgPSBwYXN0ZTAoIml0ZXIgIixpdGVyWzFdLCIgdG8gIiwgaXRlcls0XSkpCn0KYGBgCgoKYGBge3IgZmlnLmRpbT1jKDgsIDYpfQpEaW1QbG90KEFsbGNlbGxzLmRhdGEsCiAgICAgICAgcmVkdWN0aW9uLnVzZSA9ICJzcHJpbmciLAogICAgICAgIGRpbS4xID0gMSxkaW0uMiA9IDIsCiAgICAgICAgZG8ubGFiZWw9VCwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICBuby5sZWdlbmQgPSBGLAogICAgICAgIGNvbHMudXNlID0gYygiI2RmZGZkZiIsIGNvbG9ycykpCgpBbGxjZWxscy5kYXRhIDwtIFNldEFsbElkZW50KEFsbGNlbGxzLmRhdGEsIGlkID0gIkNsdXN0ZXIuaWRlbnQiKQpgYGAKCiMjIEltcG9ydCBsaW5lYWdlIGJpYXMgaW50byBTZXVyYXQgbWV0YS5kYXRhCgpgYGB7cn0KcHJvYnMgPC0gSW5mZXJlZC5GYXRlLmJpYXMkcHJvYnNbLHNlcShsZW5ndGgoQXR0cmFjdG9ycykpXQoKQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5OcjRhMiA8LSBwcm9icyR0MQpBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLkZveHAyYyA8LSBwcm9icyR0MgpBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLlBwcDFyMTRjIDwtIHByb2JzJHQzCkFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJHByb2IuRmV6ZjEgPC0gcHJvYnMkdDQKQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5Gb3hwMmEgPC0gcHJvYnMkdDUKQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5Gb3hwMmIgPC0gcHJvYnMkdDYKQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5OZml4IDwtIHByb2JzJHQ3CmBgYAoKYGBge3IgZmlnLmRpbT1jKDksIDkpLCBmaWcuY2FwPSAiTWFudXNjcmlwdCBGaWcuIDdBIGFuZCBTN0EifQpGZWF0dXJlUGxvdChvYmplY3QgPSBBbGxjZWxscy5kYXRhLAogICAgICAgICAgICBmZWF0dXJlcy5wbG90ID0gYygicHJvYi5OcjRhMiIsICJwcm9iLk5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvYi5QcHAxcjE0YyIsInByb2IuRmV6ZjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvYi5Gb3hwMmEiLCAicHJvYi5Gb3hwMmIiLCAicHJvYi5Gb3hwMmMiKSwKICAgICAgICAgICAgY29scy51c2UgPSByZXYoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKG4gPSAxMSwgbmFtZSA9ICJTcGVjdHJhbCIpKSwKICAgICAgICAgICAgcmVkdWN0aW9uLnVzZSA9ICJzcHJpbmciLAogICAgICAgICAgICBuby5sZWdlbmQgPSBUKQpgYGAKCmBgYHtyIGZpZy5kaW09Yyg4LCA2KSwgIGZpZy5jYXA9ICJNYW51c2NyaXB0IEZpZy4gN0IifQpOZXcuZGF0YSA8LSBkYXRhLmZyYW1lKGJhcmNvZGU9QWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkQmFyY29kZXMsCiAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcj0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkQ2x1c3Rlci5pZGVudCwKICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmcxPSBBbGxjZWxscy5kYXRhQGRyJHNwcmluZ0BjZWxsLmVtYmVkZGluZ3NbLDFdLAogICAgICAgICAgICAgICAgICAgICAgIHNwcmluZzI9IEFsbGNlbGxzLmRhdGFAZHIkc3ByaW5nQGNlbGwuZW1iZWRkaW5nc1ssMl0sCiAgICAgICAgICAgICAgICAgICAgICAgTnI0YTIuYmlhc2VkPSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLk5yNGEyLAogICAgICAgICAgICAgICAgICAgICAgIE5maXguYmlhc2VkPSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLk5maXgsCiAgICAgICAgICAgICAgICAgICAgICAgUHBwMXIxNGMuYmlhc2VkID0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5QcHAxcjE0YywKICAgICAgICAgICAgICAgICAgICAgICBGZXpmMS5iaWFzZWQgPSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLkZlemYxKQoKTmV3LmRhdGEgPC0gTmV3LmRhdGEgJT4lIGZpbHRlcighY2x1c3RlciAlaW4lIGdyZXAoIjI2fDIwfDIxIiwgdW5pcXVlKGFzLmNoYXJhY3RlcihBbGxjZWxscy5kYXRhQGlkZW50KSksIHZhbHVlID0gVCkpCgpOZXcuZGF0YSRsaW5lYWdlLmJpYXMgPC0gY29sbmFtZXMoTmV3LmRhdGFbLDU6OF0pW2FwcGx5KE5ldy5kYXRhWyw1OjhdLDEsd2hpY2gubWF4KV0KCmdncGxvdChOZXcuZGF0YSwgYWVzKHNwcmluZzEsIHNwcmluZzIsIGNvbG91ciA9IGxpbmVhZ2UuYmlhcykpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNlNzgyM2EiLCIjY2MzOTFiIiwiIzAyNmM5YSIsIiNkMTRjOGQiKSkgKwogIGdlb21fcG9pbnQoKSAKYGBgCgoKIyBFeHRyYWN0IHRoZSBOcjRhMiBhbmQgTmZpeCAibGluZWFnZSIgY2VsbHMKCiMjIEZpbmQgY2VsbHMgd2l0aCBzdHJvbmcgYmlhc2UgdG93YXJkIE5yNGEyIG5ldXJvbnMKCmBgYHtyfQpBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSROcjRhMi5iaWFzZSA8LSBpZmVsc2UoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5OcjRhMiA+IDAuNSAmIGFicyhBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLk5maXgtIEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJHByb2IuTnI0YTIpID4gMC4yNSwgIk5yNGEyLmxpbmVhZ2UiLCAiT3RoZXIubGluZWFnZXMiICkKCnRhYmxlKEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJE5yNGEyLmJpYXNlKQpgYGAKCgojIyBGaW5kIGNlbGxzIHdpdGggc3Ryb25nIGJpYXNlIHRvd2FyZCBOZml4IG5ldXJvbnMKCmBgYHtyfQpBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSROZml4LmJpYXNlIDwtIGlmZWxzZShBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLk5maXggPiAwLjUgJiBhYnMoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5OZml4LSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLk5yNGEyKSA+IDAuMjUsICJOZml4LmxpbmVhZ2UiLCAiT3RoZXIubGluZWFnZXMiICkKCnRhYmxlKEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJE5maXguYmlhc2UpCmBgYAoKIyMgUGxvdCBhbGwgYmlhc2VkIGNlbGxzIG9uIHNwcmluZyBlbWJlZGRpbmcKYGBge3IgZmlnLmRpbT1jKDgsIDYpfQpOcjRhMiA8LSByb3duYW1lcyhzdWJzZXQoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEsIEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJE5yNGEyLmJpYXNlID09ICJOcjRhMi5saW5lYWdlIikpCk5maXggPC0gcm93bmFtZXMoc3Vic2V0KEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhLCBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSROZml4LmJpYXNlID09ICJOZml4LmxpbmVhZ2UiKSkKCkFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJGxpbmVhZ2UuYmlhcyA8LSBzYXBwbHkoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkQmFyY29kZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgaWYoeCAlaW4lIE5yNGEyKXt4PSJOcjRhMi5saW5lYWdlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHggJWluJSBOZml4ICl7eD0gIk5maXgubGluZWFnZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXt4PSAiTm90LmFzc2lnbmVkIn0pCgpEaW1QbG90KEFsbGNlbGxzLmRhdGEsCiAgICAgICAgZ3JvdXAuYnkgPSAibGluZWFnZS5iaWFzIiwKICAgICAgICByZWR1Y3Rpb24udXNlID0gInNwcmluZyIsCiAgICAgICAgZGltLjEgPSAxLAogICAgICAgIGRpbS4yID0gMiwKICAgICAgICBkby5sYWJlbD1ULAogICAgICAgIGxhYmVsLnNpemUgPSA0LAogICAgICAgIGNvbHMudXNlID0gYygiI2NjMzkxYiIsIiM5Njk2OTYiLCIjMDI2YzlhIiksCiAgICAgICAgbm8ubGVnZW5kID0gRikKYGBgCgojIyBJbnNwZWN0IGZhdGUgYmlhcyBhbW9uZyBBUHMKCmBgYHtyfQojIEZhdGUgYmlhc2UgaW4gcHJvZ2VuaXRvciBkb21haW5lcwpkYXRhIDwtIG1lbHQoZGF0YS5mcmFtZShDbHVzdGVycyA9IEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJENsdXN0ZXIuaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIE5maXguc2NvcmUgPSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRwcm9iLk5maXgsCiAgICAgICAgICAgICAgICAgICAgICAgIE5yNGEyLnNjb3JlID0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkcHJvYi5OcjRhMikpCgpjb2xuYW1lcyhkYXRhKSA8LSBjKCJDbHVzdGVycyIsICJsaW5lYWdlIiwgIlNjb3JlIikKYGBgCgpgYGB7ciBmaWcuZGltPWMoNiwgNC41KX0KZGF0YSAlPiUKICAgICBmaWx0ZXIoQ2x1c3RlcnMgJWluJSBjKCJBUC5WZW50cmFsLlBhbGxpdW0iLCAiQVAubGF0ZXJhbC5QYWxsaXVtLjEiLCAiQVAubGF0ZXJhbC5QYWxsaXVtLjIiLCAiQVAuRG9yc2FsLlBhbGxpdW0iKSkgJT4lCiAgICAgbXV0YXRlKENsdXN0ZXJzID0gZmFjdG9yKENsdXN0ZXJzLCBsZXZlbHMgPWMoIkFQLlZlbnRyYWwuUGFsbGl1bSIsICJBUC5sYXRlcmFsLlBhbGxpdW0uMSIsICJBUC5sYXRlcmFsLlBhbGxpdW0uMiIsICJBUC5Eb3JzYWwuUGFsbGl1bSIpKSkgJT4lCiAgICAgZ2dwbG90KGFlcyh4PWZhY3RvcihsaW5lYWdlLCBsZXZlbHMgPSBjKCJOcjRhMi5zY29yZSIsICJOZml4LnNjb3JlIikgKSwgeT1TY29yZSwgZmlsbD0gQ2x1c3RlcnMpKSArIAogICAgICAgIGdlb21fYm94cGxvdChub3RjaD1UUlVFKSArCiAgICAgICAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjIpLCBzaXplID0gLjUsIGFlcyhncm91cD1DbHVzdGVycykpICsKICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IGMoIiM2OGIwNDEiLCAiI2UzYzE0OCIsICIjYjdkMTc0IiwgIiNlNDZiNmIiKSkgICsKICAgICAgICB4bGFiKCIiKQpgYGAKCiMjIEV4dHJhY3QgTnI0YTIgYW5kIE5maXggYmlhc2VkIGNlbGxzCgpgYGB7ciBmaWcuZGltPWMoOCwgNil9CiMgU3Vic2V0IGRhdGFzZXQgdG8ga2VlcCBvbmx5IGNlbGxzIHdoaXRoIGNvbmZpZGVudCBkaWZmZXJlbmNlcyBpbiBmYXRlIHByb2JhYmlsaXRpZXMKVlAuRFAubGluZWFnZS5jZWxscyA8LSBjKHJvd25hbWVzKHN1YnNldChBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSwgQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkTnI0YTIuYmlhc2UgPT0gIk5yNGEyLmxpbmVhZ2UiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhzdWJzZXQoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEsIEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJE5maXguYmlhc2UgPT0gIk5maXgubGluZWFnZSIpKSkKCgojIFdlIGZ1cnRoZXIgb25seSByZXRhaW4gVlAgYW5kIERQICBwcm9nZW5pdG9yIGNsdXN0ZXJzCkFsbGNlbGxzLmRhdGEgPC0gU3Vic2V0RGF0YShBbGxjZWxscy5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMudXNlID0gVlAuRFAubGluZWFnZS5jZWxscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LnJlbW92ZSA9IGMoIkFQLmxhdGVyYWwuUGFsbGl1bS4xIiwgIkFQLmxhdGVyYWwuUGFsbGl1bS4yIikgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2V0LnJhdyA9IFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkby5jbGVhbiA9IEYpCgoKRGltUGxvdChBbGxjZWxscy5kYXRhLAogICAgICAgIHJlZHVjdGlvbi51c2UgPSAic3ByaW5nIiwKICAgICAgICBkaW0uMSA9IDEsCiAgICAgICAgZGltLjIgPSAyLAogICAgICAgIGRvLmxhYmVsPVQsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDQsCiAgICAgICAgY29scy51c2UgPSBjKCAiI2RmZGZkZiIsIiM2OGIwNDEiLCAiI2U0NmI2YiIsIiNjYzNhMWIiLCIjY2M4Nzc4IiwiI2U2YmI5YiIgLCIjMDQ2YzlhIiwiIzQ3ODRhMiIpLAogICAgICAgIG5vLmxlZ2VuZCA9IFQpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDgsIDYpLCBmaWcuY2FwPSAiTWFudXNjcmlwdCBGaWcuIDdDIn0KQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkTGluZWFnZSA8LSBpZmVsc2UoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkTnI0YTIuYmlhc2UgPT0gIk5yNGEyLmxpbmVhZ2UiLCAiTnI0YTIubGluZWFnZSIsICJOZml4LmxpbmVhZ2UiKQoKRGltUGxvdChBbGxjZWxscy5kYXRhLAogICAgICAgIGdyb3VwLmJ5ID0gIkxpbmVhZ2UiLAogICAgICAgIHJlZHVjdGlvbi51c2UgPSAic3ByaW5nIiwKICAgICAgICBkaW0uMSA9IDEsCiAgICAgICAgZGltLjIgPSAyLAogICAgICAgIGRvLmxhYmVsPVQsCiAgICAgICAgY29scy51c2UgPSBjKCIjY2MzOTFiIiwiIzAyNmM5YSIpLAogICAgICAgIGxhYmVsLnNpemUgPSA0LAogICAgICAgIG5vLmxlZ2VuZCA9IEYpCmBgYAoKYGBge3J9CnJtKGxpc3QgPSBscygpWyFscygpICVpbiUgYygiQWxsY2VsbHMuZGF0YSIpXSkKYGBgCgojIEFsaWduZSBjZWxscyBhbG9uZyBQc2V1ZG90aW1lCgpXZSBkZWNpZGVkIHRvIHVzZSBzcHJpbmcgc3BhY2UgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIHRvIGZpdCB0aGUgcHJpbmNpcGFsZSBjdXJ2ZSBiZWNhdXNlIGl0IGhhcyBiZWVuIGNhbGN1bGF0ZWQgb24gYWxsIGNlbGxzIHRvZ2V0aGVyLiBUaHVzIHJlZmxlY3RpbmcgcGFuIG5ldXJvbmFsIGRpZmZlcmVudGlhdGlvbiBheGlzIG9mIHZhcmlhdGlvbi4KCiMjIE5yNGEyIG5ldXJvbnMgUHNldWRvdGltZSBvcmRlcmluZwoKYGBge3J9Ck5yNGEyLmxpbmVhZ2UuY2VsbHMgPC0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKExpbmVhZ2UgPT0gIk5yNGEyLmxpbmVhZ2UiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICBwdWxsKEJhcmNvZGVzKQoKIyMgRml0IGEgcHJpbmNpcGFsZSBjdXJ2ZSBvbiB0aGUgZGF0YSBpbiB0aGUgc3ByaW5nIHNwYWNlCmRhdGEuTnI0YTIgPC0gYXMuZGF0YS5mcmFtZShBbGxjZWxscy5kYXRhQGRyJHNwcmluZ0BjZWxsLmVtYmVkZGluZ3NbTnI0YTIubGluZWFnZS5jZWxscywxOjJdKQoKZml0IDwtIHByaW5jaXBhbF9jdXJ2ZShhcy5tYXRyaXgoZGF0YS5OcjRhMlssMToyXSksCiAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoZXI9J3Ntb290aF9zcGxpbmUnLAogICAgICAgICAgICAgICAgICAgICAgIHRyYWNlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaD0yKQoKTnI0YTIucGMubGluZSA8LSBhcy5kYXRhLmZyYW1lKGZpdCRzW29yZGVyKGZpdCRsYW1iZGEpLF0pICNUaGUgcHJpbmNpcGFsIGN1cnZlIHNtb290aGVkCmRhdGEuTnI0YTIkUHNldWRvdGltZVNjb3JlIDwtIGZpdCRsYW1iZGEvbWF4KGZpdCRsYW1iZGEpCgpkYXRhLk5yNGEyJENsdXN0ZXIgPC0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKExpbmVhZ2UgPT0gIk5yNGEyLmxpbmVhZ2UiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICBwdWxsKE5ld0NsdXN0ZXJJRCkKCiMgRGlyZWN0aW9uIG9mIHRoZSBtYXR1cmF0aW9uIHNjb3JlIHVzaW5nIE5lcyBleHByZXNzaW9uIChyZXZlcnRlIGlmIHBvc2l0aXZlIGNvcnJlbGF0aW9uKQppZiAoY29yKGRhdGEuTnI0YTIkUHNldWRvdGltZVNjb3JlLCBBbGxjZWxscy5kYXRhQGRhdGFbJ0htZ2EyJywgTnI0YTIubGluZWFnZS5jZWxsc10pID4gMCkgewogIGRhdGEuTnI0YTIkUHNldWRvdGltZVNjb3JlIDwtIC0oZGF0YS5OcjRhMiRQc2V1ZG90aW1lU2NvcmUgLSBtYXgoZGF0YS5OcjRhMiRQc2V1ZG90aW1lU2NvcmUpKQp9CmBgYAoKIyMgTmZpeCBuZXVyb25zIFBzZXVkb3RpbWUgb3JkZXJpbmcKCmBgYHtyfQpOZml4LmxpbmVhZ2UuY2VsbHMgPC0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEgJT4lCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoTGluZWFnZSA9PSAiTmZpeC5saW5lYWdlIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICBwdWxsKEJhcmNvZGVzKQoKIyMgRml0IGEgcHJpbmNpcGFsZSBjdXJ2ZSBvbiB0aGUgZGF0YSBpbiB0aGUgc3ByaW5nIHNwYWNlCmRhdGEuTmZpeCA8LSBhcy5kYXRhLmZyYW1lKEFsbGNlbGxzLmRhdGFAZHIkc3ByaW5nQGNlbGwuZW1iZWRkaW5nc1tOZml4LmxpbmVhZ2UuY2VsbHMsMToyXSkKCmZpdCA8LSBwcmluY2lwYWxfY3VydmUoYXMubWF0cml4KGRhdGEuTmZpeFssMToyXSksCiAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoZXI9J3Ntb290aF9zcGxpbmUnLAogICAgICAgICAgICAgICAgICAgICAgIHRyYWNlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaD0yKQoKTmZpeC5wYy5saW5lIDwtIGFzLmRhdGEuZnJhbWUoZml0JHNbb3JkZXIoZml0JGxhbWJkYSksXSkgI1RoZSBwcmluY2lwYWwgY3VydmUgc21vb3RoZWQKZGF0YS5OZml4JFBzZXVkb3RpbWVTY29yZSA8LSBmaXQkbGFtYmRhL21heChmaXQkbGFtYmRhKQoKZGF0YS5OZml4JENsdXN0ZXIgPC0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEgJT4lCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihMaW5lYWdlID09ICJOZml4LmxpbmVhZ2UiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgcHVsbChOZXdDbHVzdGVySUQpCgoKIyBEaXJlY3Rpb24gb2YgdGhlIG1hdHVyYXRpb24gc2NvcmUgdXNpbmcgTmVzIGV4cHJlc3Npb24gKHJldmVydGUgaWYgcG9zaXRpdmUgY29ycmVsYXRpb24pCmlmIChjb3IoZGF0YS5OZml4JFBzZXVkb3RpbWVTY29yZSwgQWxsY2VsbHMuZGF0YUBkYXRhWydIbWdhMicsIE5maXgubGluZWFnZS5jZWxsc10pID4gMCkgewogIGRhdGEuTmZpeCRQc2V1ZG90aW1lU2NvcmUgPC0gLShkYXRhLk5maXgkUHNldWRvdGltZVNjb3JlIC0gbWF4KGRhdGEuTmZpeCRQc2V1ZG90aW1lU2NvcmUpKQp9CmBgYAoKIyMgQ29tYmluZSBib3RoIHRyYWplY3Rvcnkgb3JkZXJpbmdzCgpgYGB7cn0KUHNldWRvdGltZSA8LSByYmluZChkYXRhLk5yNGEyICU+JSBkcGx5cjo6c2VsZWN0KFBzZXVkb3RpbWVTY29yZSksCiAgICAgICAgICAgICAgICAgICAgZGF0YS5OZml4ICU+JSBkcGx5cjo6c2VsZWN0KFBzZXVkb3RpbWVTY29yZSkpCgpBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRQc2V1ZG90aW1lIDwtIFBzZXVkb3RpbWVbcm93bmFtZXMoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEpLF0KYGBgCgoKYGBge3IgZmlnLmRpbT1jKDgsIDYpfQojUGxvdCBwc2V1ZG90aW1lIHNjb3JlIGFsb25nIHRoZSB0d28gcHJpbmNpcGFsIGN1cnZlcwpkYXRhIDwtIGFzLmRhdGEuZnJhbWUoQWxsY2VsbHMuZGF0YUBkciRzcHJpbmdAY2VsbC5lbWJlZGRpbmdzWywxOjJdKQpkYXRhJFBzZXVkb3RpbWVTY29yZSA8LSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRQc2V1ZG90aW1lCgpjb2xzIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbChuID0xMSwgbmFtZSA9ICJTcGVjdHJhbCIpKSgxMDApCgpnZ3Bsb3QoZGF0YSwgYWVzKHNwcmluZzEsIHNwcmluZzIpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9UHNldWRvdGltZVNjb3JlKSwgc2l6ZT0yLCBzaGFwZT0xNikgKyAKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3Vycz1yZXYoY29scyksIG5hbWU9J1NwZXVkb3RpbWUgc2NvcmUnKSArCiAgZ2VvbV9saW5lKGRhdGE9TmZpeC5wYy5saW5lLCBjb2xvcj0iI2NjMzkxYiIsIHNpemU9MC43NykgKwogIGdlb21fbGluZShkYXRhPU5yNGEyLnBjLmxpbmUsIGNvbG9yPSIjMDI2YzlhIiwgc2l6ZT0wLjc3KQpgYGAKCmBgYHtyfQpybShsaXN0ID0gbHMoKVshbHMoKSAlaW4lIGMoIkFsbGNlbGxzLmRhdGEiKV0pCmBgYAoKCiMgRmluZCBERUcgYmV0d2VlbiB0aGUgdHdvIHRyYWplY3RvcmllcyBhbmQgYWxvbmcgdGhlIHBzZXVkb3RpbWUgCgojIyBGaWx0ZXIgZ2VuZSBjb3VudHMgbWF0cml4CmBgYHtyfQojIEZpbHRlciBnZW5lcwpudW0uY2VsbHMgPC0gTWF0cml4Ojpyb3dTdW1zKEFsbGNlbGxzLmRhdGFAcmF3LmRhdGEgPiAwKQpnZW5lcy51c2UgPC0gbmFtZXMoeCA9IG51bS5jZWxsc1tudW0uY2VsbHMgPj0gMTBdKQpBbGxjZWxscy5kYXRhQHJhdy5kYXRhIDwtIEFsbGNlbGxzLmRhdGFAcmF3LmRhdGFbZ2VuZXMudXNlLCBdCgojIE5vcm1hbGl6YXRpb24gYW5kIHZhcmlhYmxlIGdlbmUgc2VsZWN0aW9uCkFsbGNlbGxzLmRhdGEgPC0gTm9ybWFsaXplRGF0YShvYmplY3QgPSBBbGxjZWxscy5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiTG9nTm9ybWFsaXplIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS5mYWN0b3IgPSByb3VuZChtZWRpYW4oQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkblVNSSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5wcm9ncmVzcyA9IEYpCgpBbGxjZWxscy5kYXRhIDwtIEZpbmRWYXJpYWJsZUdlbmVzKG9iamVjdCA9IEFsbGNlbGxzLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbi5mdW5jdGlvbiA9IEV4cE1lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGVyc2lvbi5mdW5jdGlvbiA9IExvZ1ZNUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Lmxvdy5jdXRvZmYgPSAwLjAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguaGlnaC5jdXRvZmYgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkuY3V0b2ZmID0gMS4zLCBkby5wbG90ID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnByb2dyZXNzID0gRikKbGVuZ3RoKEFsbGNlbGxzLmRhdGFAdmFyLmdlbmVzKQpgYGAKCiMjIEluaXRpYWxpemUgYSBtb25vY2xlIG9iamVjdAoKYGBge3J9CiMgVHJhbnNmZXJ0IG1ldGFkYXRhCm1ldGEuZGF0YSA8LSBkYXRhLmZyYW1lKGJhcmNvZGUgPSByb3duYW1lcyhBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXIgPSBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRDbHVzdGVyLmlkZW50LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5lYWdlID0gQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkTGluZWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvdGltZS5TY29yZSA9IEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJFBzZXVkb3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IHJvd25hbWVzKEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhKSkKCkFubm90LmRhdGEgIDwtIG5ldygnQW5ub3RhdGVkRGF0YUZyYW1lJywgZGF0YSA9IG1ldGEuZGF0YSkKCiMgVHJhbnNmZXJ0IGNvdW50IGRhdGEKY291bnQuZGF0YSA9IGRhdGEuZnJhbWUoZ2VuZV9zaG9ydF9uYW1lID0gcm93bmFtZXMoQWxsY2VsbHMuZGF0YUByYXcuZGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IHJvd25hbWVzKEFsbGNlbGxzLmRhdGFAcmF3LmRhdGEpKQoKZmVhdHVyZS5kYXRhIDwtIG5ldygnQW5ub3RhdGVkRGF0YUZyYW1lJywgZGF0YSA9IGNvdW50LmRhdGEpCgojIENyZWF0ZSB0aGUgQ2VsbERhdGFTZXQgb2JqZWN0CmdibV9jZHMgPC0gbmV3Q2VsbERhdGFTZXQoYXMubWF0cml4KEFsbGNlbGxzLmRhdGFAcmF3LmRhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBoZW5vRGF0YSA9IEFubm90LmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZURhdGEgPSBmZWF0dXJlLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJEZXRlY3Rpb25MaW1pdCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkZhbWlseSA9IG5lZ2Jpbm9taWFsKCkpCmBgYAoKYGBge3J9CmdibV9jZHMgPC0gZXN0aW1hdGVTaXplRmFjdG9ycyhnYm1fY2RzKQpnYm1fY2RzIDwtIGVzdGltYXRlRGlzcGVyc2lvbnMoZ2JtX2NkcykKZ2JtX2NkcyA8LSBkZXRlY3RHZW5lcyhnYm1fY2RzLCBtaW5fZXhwciA9IDAuMSkKYGBgCgpgYGB7cn0Kcm0obGlzdCA9IGxzKClbIWxzKCkgJWluJSBjKCJBbGxjZWxscy5kYXRhIiwgImdibV9jZHMiKV0pCmBgYAoKIyMgVGVzdCBlYWNoIGdlbmUgdHJlbmQgb3ZlciBwc2V1ZG90aW1lIHNjb3JlCgpgYGB7cn0KIyBFeGNsdWRlIGNlbGwgY3ljbGUgYXNzb2NpYXRlZCBnZW5lcwpDQ2dlbmVzIDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKCIuL1Byb2dlbml0b3JzL0NlbGxDeWNsZUdlbmVzLmNzdiIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IEYpWywxXSkKSW5wdXQuZ2VuZXMgPC0gQWxsY2VsbHMuZGF0YUB2YXIuZ2VuZXNbIUFsbGNlbGxzLmRhdGFAdmFyLmdlbmVzICVpbiUgQ0NnZW5lc10KYGBgCgpgYGB7cn0KU3BldWRvdGltZS5saW5lYWdlcy5kaWZmIDwtIGRpZmZlcmVudGlhbEdlbmVUZXN0KGdibV9jZHNbSW5wdXQuZ2VuZXMsXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsTW9kZWxGb3JtdWxhU3RyID0gIn5zbS5ucyhQc2V1ZG90aW1lLlNjb3JlLCBkZiA9IDMpKkxpbmVhZ2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZWRNb2RlbEZvcm11bGFTdHIgPSAifnNtLm5zKFBzZXVkb3RpbWUuU2NvcmUsIGRmID0gMykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gZGV0ZWN0Q29yZXMoKSAtIDIpCgojIEZpbHRlciBnZW5lcyBiYXNlZCBvbiBGRFIKU3BldWRvdGltZS5saW5lYWdlcy5kaWZmLmZpbHRlcmVkIDwtIFNwZXVkb3RpbWUubGluZWFnZXMuZGlmZiAlPiUgZmlsdGVyKHF2YWwgPCA1ZS0yKQpgYGAKCiMjIEZpbmQgZGlyZWN0aW9uIG9mIHRoZSBERUcKCldlIGZpbmQgZGlyZWN0aW9uIG9mIHRoZSBERUcgYnkgY2FsY3VsYXRpbmcgdGhlIGFyZWEgYmV0d2VlbiBjdXJ2ZXMgKEFCQykgZm9yIGJyYW5jaC1kZXBlbmRlbnQgZ2VuZXMgYnkgYWRhcHRpbmcgdGhlIG1vbm9jbGUgcGFja2FnZSBmdW5jdGlvbiBgY2FsQUJDc2AuIEdlbmVzIHNwZWNpZmljIEFCQyBpcyBjb21wdXRlZCBvbiBzbW9vdGhlZCBleHByZXNzaW9uIHZhbHVlIG92ZXIgMTAwIHBvaW50cyBhbG9uZyB0aGUgcHNldWRvdGltZQkKCiMjIyBTbW9vdGggZ2VuZSBleHByZXNzaW9uIGFsb25nIHBzZXVkb3RpbWUgCmBgYHtyfQojIENyZWF0ZSBhIG5ldyBwc2V1ZG8tRFYgdmVjdG9yIG9mIDUwMCBwb2ludHMKblBvaW50cyA8LSAxMDAKCm5ld19kYXRhID0gbGlzdCgpCmZvciAoTGluZWFnZSBpbiB1bmlxdWUocERhdGEoZ2JtX2NkcykkTGluZWFnZSkpewogIG5ld19kYXRhW1tsZW5ndGgobmV3X2RhdGEpICsgMV1dID0gZGF0YS5mcmFtZShQc2V1ZG90aW1lLlNjb3JlID0gc2VxKG1pbihwRGF0YShnYm1fY2RzKSRQc2V1ZG90aW1lLlNjb3JlKSwgbWF4KHBEYXRhKGdibV9jZHMpJFBzZXVkb3RpbWUuU2NvcmUpLCBsZW5ndGgub3V0ID0gblBvaW50cyksIExpbmVhZ2U9TGluZWFnZSkKfQoKbmV3X2RhdGEgPSBkby5jYWxsKHJiaW5kLCBuZXdfZGF0YSkKCiMgU21vb3RoIGdlbmUgZXhwcmVzc2lvbgpjdXJ2ZV9tYXRyaXggPC0gZ2VuU21vb3RoQ3VydmVzKGdibV9jZHNbYXMuY2hhcmFjdGVyKFNwZXVkb3RpbWUubGluZWFnZXMuZGlmZi5maWx0ZXJlZCRnZW5lX3Nob3J0X25hbWUpLF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlbmRfZm9ybXVsYSA9ICJ+c20ubnMoUHNldWRvdGltZS5TY29yZSwgZGYgPSAzKSpMaW5lYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV9leHByID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGF0YSA9IG5ld19kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzPSBkZXRlY3RDb3JlcygpIC0gMikKYGBgCgojIyMgQ29tcHV0ZSB0aGUgQUJDIGZvciBlYWNoIGdlbmUKYGBge3J9CiMgRXh0cmFjdCBtYXRyaXggY29udGFpbmluZyBzbW9vdGhlZCBjdXJ2ZXMgZm9yIGVhY2ggbGluZWFnZXMKTnI0YTJfY3VydmVfbWF0cml4IDwtIGN1cnZlX21hdHJpeFssIDE6blBvaW50c10gIyB0aGUgZmlyc3QgMTAwIHBvaW50cyBjb3JyZXNwb25kIHRvIE5yNGEyIGNlbGxzCk5maXhfY3VydmVfbWF0cml4IDwtIGN1cnZlX21hdHJpeFssIChuUG9pbnRzICsgMSk6KDIgKiBuUG9pbnRzKV0KICAKQUJDc19yZXMgPC0gTnI0YTJfY3VydmVfbWF0cml4IC0gTmZpeF9jdXJ2ZV9tYXRyaXggIyBEaXJlY3Rpb24gb2YgdGhlIGNvbXBhcmlzb24gOiBwb3N0aXZlIEFCQ3MgPD0+IFVwcmVndWxhdGVkIGluIE5yNGEyIGxpbmVhZ2UKSUxSX3JlcyA8LSBsb2cyKE5yNGEyX2N1cnZlX21hdHJpeC8gKE5maXhfY3VydmVfbWF0cml4ICsgMC4xKSkgIyBBdmVyYWdlIGxvZ0ZDIGJldHdlZW4gdGhlIDIgY3VydmVzCiAgCkFCQ3NfcmVzIDwtIGFwcGx5KEFCQ3NfcmVzLCAxLCBmdW5jdGlvbih4LCBuUG9pbnRzKSB7CiAgICAgICAgICAgICAgICAgIGF2Z19kZWx0YV94IDwtICh4WzE6KG5Qb2ludHMgLSAxKV0gKyB4WzI6KG5Qb2ludHMpXSkvMgogICAgICAgICAgICAgICAgICBzdGVwIDwtICgxMDAvKG5Qb2ludHMgLSAxKSkKICAgICAgICAgICAgICAgICAgcmVzIDwtIHJvdW5kKHN1bShhdmdfZGVsdGFfeCAqIHN0ZXApLCAzKQogICAgICAgICAgICAgICAgICByZXR1cm4ocmVzKX0sCiAgICAgICAgICAgICAgICAgIG5Qb2ludHMgPSBuUG9pbnRzKSAjIENvbXB1dGUgdGhlIGFyZWEgYmVsb3cgdGhlIGN1cnZlCiAgCkFCQ3NfcmVzIDwtIGNiaW5kKEFCQ3NfcmVzLCBJTFJfcmVzWyxuY29sKElMUl9yZXMpXSkKY29sbmFtZXMoQUJDc19yZXMpPC0gYygiQUJDcyIsICJFbmRwb2ludF9JTFIiKQoKIyBJbXBvcnQgQUJDIHZhbHVlcyBpbnRvIHRoZSBERSB0ZXN0IHJlc3VsdHMgdGFibGUKU3BldWRvdGltZS5saW5lYWdlcy5kaWZmLmZpbHRlcmVkIDwtIGNiaW5kKFNwZXVkb3RpbWUubGluZWFnZXMuZGlmZi5maWx0ZXJlZFssMTo0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCQ3NfcmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BldWRvdGltZS5saW5lYWdlcy5kaWZmLmZpbHRlcmVkWyw1OjZdKQpgYGAKCiMgQ2x1c3RlciB0aGUgZ2VuZXMgYnkgZXhwcmVzc2lvbiBwcm9maWxlcyBhbG9uZyB0aGUgdHdvIHRyYWplY3RvcmllcwoKIyMgTnI0YTIgbmV1cm9ucyBzcGVjaWZpYyB0cmFuc2NyaXB0aW9uYWwgdHJhamVjdG9yaWVzCgpgYGB7cn0KIyBFeHRyYWN0IE5yNGEyIG5ldXJvbnMgdHJhamVjdG9yeSBnZW5lcwpOcjRhMi5yZXMgPC0gYXMuZGF0YS5mcmFtZShTcGV1ZG90aW1lLmxpbmVhZ2VzLmRpZmYuZmlsdGVyZWRbU3BldWRvdGltZS5saW5lYWdlcy5kaWZmLmZpbHRlcmVkJEFCQ3MgPiAwLF0pCk5yNGEyLmdlbmVzIDwtIHJvdy5uYW1lcyhOcjRhMi5yZXMpCk5yNGEyX2N1cnZlX21hdHJpeCA8LSBOcjRhMl9jdXJ2ZV9tYXRyaXhbcm93bmFtZXMoTnI0YTJfY3VydmVfbWF0cml4KSAlaW4lIE5yNGEyLmdlbmVzLCBdCmBgYAoKYGBge3J9CiMgR3JvdXBlIGdlbmVzIGluIDYgY2x1c3RlcnMgdXNpbmcgcGFydGl0aW9uaW5nIHJvdW5kIG1lZG9pZHMKTnI0YTIuZ2VuZXMuY2x1c3RlcnMgPC0gY2x1c3Rlcjo6cGFtKGFzLmRpc3QoKDEgLSBjb3IodChOcjRhMl9jdXJ2ZV9tYXRyaXgpLCBtZXRob2QgPSAicGVhcnNvbiIpKSksIGs9NikKCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHN0b3JpbmcgREVHIHRlc3QgYW5kIGNsdXN0ZXJpbmcgcmVzdWx0cwpOcjRhMi5HZW5lLmR5bmFtaXF1ZSA8LSBkYXRhLmZyYW1lKEdlbmU9IG5hbWVzKE5yNGEyLmdlbmVzLmNsdXN0ZXJzJGNsdXN0ZXJpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2YWw9TnI0YTIucmVzJHB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXZhbD1OcjRhMi5yZXMkcXZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQkNzPU5yNGEyLnJlcyRBQkNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmUuQ2x1c3RlcnM9IHBhc3RlMCgiQ2x1c3QuIiwgTnI0YTIuZ2VuZXMuY2x1c3RlcnMkY2x1c3RlcmluZykpICU+JSBhcnJhbmdlKEdlbmUuQ2x1c3RlcnMpCgpyb3cubmFtZXMoTnI0YTIuR2VuZS5keW5hbWlxdWUpIDwtIE5yNGEyLkdlbmUuZHluYW1pcXVlJEdlbmUKCndyaXRlLnRhYmxlKE5yNGEyLkdlbmUuZHluYW1pcXVlLCAiLi9OcjRhMi5HZW5lLmR5bmFtaXF1ZS5jc3YiLCBzZXA9IjsiKQpgYGAKCmBgYHtyIGZpZy5kaW09Yyg5LCA1KSwgZmlnLmNhcD0gIk1hbnVzY3JpcHQgRmlnLiA3RCJ9CiMgT3JkZXIgdGhlIHJvd3MgdXNpbmcgc2VyaWF0aW9uCmRzdCA8LSBhcy5kaXN0KCgxLWNvcihzY2FsZSh0KE5yNGEyX2N1cnZlX21hdHJpeCkpLCBtZXRob2QgPSAicGVhcnNvbiIpKSkKcm93LnNlciA8LSBzZXJpYXRlKGRzdCwgbWV0aG9kID0iUjJFIikgIyJSMkUiCmdlbmUub3JkZXIgPC0gcm93bmFtZXMoTnI0YTJfY3VydmVfbWF0cml4W2dldF9vcmRlcihyb3cuc2VyKSxdKQoKYW5uby5jb2xvcnMgPC0gbGlzdChsaW5lYWdlID0gYyhOZml4PSIjY2MzOTFiIiwgTnI0YTI9IiMwMjZjOWEiKSwKICAgICAgICAgICAgICAgICAgICBHZW5lLkNsdXN0ZXJzID0gYyhDbHVzdC4xID0iI2I3OWYwYiIgLCBDbHVzdC4yPSIjZTQ2QjZiIiwgQ2x1c3QuMz0iI2U3ODIzYSIsIENsdXN0LjQ9IiNjYzg3NzgiLCBDbHVzdC41PSIjNjhiMDQxIiwgQ2x1c3QuNj0iIzVhYjc5MyIpKQoKCnBoZWF0bWFwOjpwaGVhdG1hcChjdXJ2ZV9tYXRyaXhbZ2VuZS5vcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKDIwMDoxMDEsICNOZml4IHBvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxMDApXSwgI05yNGEyIHBvaW50cwogICAgICAgICAgICAgICAgICAgc2NhbGUgPSAicm93IiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEYsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9yb3cgPSBOcjRhMi5HZW5lLmR5bmFtaXF1ZSAlPiUgZHBseXI6OnNlbGVjdChHZW5lLkNsdXN0ZXJzKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gZGF0YS5mcmFtZShsaW5lYWdlID0gcmVwKGMoIk5yNGEyIiwgIk5maXgiKSwgZWFjaD0xMDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5uby5jb2xvcnMsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRiwKICAgICAgICAgICAgICAgICAgIHNob3dfcm93bmFtZXMgPSBULAogICAgICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gMiwKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksCiAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoLTIuNSwyLjUsIGxlbmd0aC5vdXQgPSAxMSksCiAgICAgICAgICAgICAgICAgICBtYWluID0gIk5yNGEyIGNlbGxzIGVucmljaGVkIGdlbmVzIGV4cHJlc3Npb24gYWxvbmcgcHNldWRvdGltZSIpCmBgYAoKCiMjIE5maXggbmV1cm9ucyBzcGVjaWZpYyB0cmFuc2NyaXB0aW9uYWwgdHJhamVjdG9yaWVzCgpgYGB7cn0KIyBFeHRyYWN0IE5maXggbmV1cm9ucyB0cmFqZWN0b3J5IGdlbmVzCk5maXgucmVzIDwtIGFzLmRhdGEuZnJhbWUoU3BldWRvdGltZS5saW5lYWdlcy5kaWZmLmZpbHRlcmVkW1NwZXVkb3RpbWUubGluZWFnZXMuZGlmZi5maWx0ZXJlZCRBQkNzIDwgMCxdKQpOZml4LmdlbmVzIDwtIHJvdy5uYW1lcyhOZml4LnJlcykKTmZpeF9jdXJ2ZV9tYXRyaXggPC0gTmZpeF9jdXJ2ZV9tYXRyaXhbcm93bmFtZXMoTmZpeF9jdXJ2ZV9tYXRyaXgpICVpbiUgTmZpeC5nZW5lcywgXQpgYGAKCmBgYHtyfQojIEdyb3VwZSBnZW5lcyBpbiA2IGNsdXN0ZXJzIGJ5IHBhcnRpdGlvbmluZyByb3VuZCBtZWRvaWRzCk5maXguZ2VuZXMuY2x1c3RlcnMgPC0gY2x1c3Rlcjo6cGFtKGFzLmRpc3QoKDEgLSBjb3IodChOZml4X2N1cnZlX21hdHJpeCksIG1ldGhvZCA9ICJwZWFyc29uIikpKSwgaz02KQoKIyBDcmVhdGUgYSBkYXRhZnJhbWUgc3RvcmluZyBERUcgdGVzdCBhbmQgY2x1c3RlcmluZyByZXN1bHRzCk5maXguR2VuZS5keW5hbWlxdWUgPC0gZGF0YS5mcmFtZShHZW5lPSBuYW1lcyhOZml4LmdlbmVzLmNsdXN0ZXJzJGNsdXN0ZXJpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2YWw9TmZpeC5yZXMkcHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdmFsPU5maXgucmVzJHF2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJDcz1OZml4LnJlcyRBQkNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmUuQ2x1c3RlcnM9IHBhc3RlMCgiQ2x1c3QuIiwgTmZpeC5nZW5lcy5jbHVzdGVycyRjbHVzdGVyaW5nKSkgJT4lIGFycmFuZ2UoR2VuZS5DbHVzdGVycykKCnJvdy5uYW1lcyhOZml4LkdlbmUuZHluYW1pcXVlKSA8LSBOZml4LkdlbmUuZHluYW1pcXVlJEdlbmUKCndyaXRlLnRhYmxlKE5maXguR2VuZS5keW5hbWlxdWUsICIuL05maXguR2VuZS5keW5hbWlxdWUuY3N2Iiwgc2VwPSI7IikKYGBgCgpgYGB7ciBmaWcuZGltPWMoOSwgNSksIGZpZy5jYXA9ICJNYW51c2NyaXB0IEZpZy4gN0MifQojIE9yZGVyIHRoZSByb3dzIHVzaW5nIHNlcmlhdGlvbgpkc3QgPC0gYXMuZGlzdCgoMS1jb3Ioc2NhbGUodChOZml4X2N1cnZlX21hdHJpeCkpLCBtZXRob2QgPSAicGVhcnNvbiIpKSkKcm93LnNlciA8LSBzZXJpYXRlKGRzdCwgbWV0aG9kID0iUjJFIikKZ2VuZS5vcmRlciA8LSByb3duYW1lcyhOZml4X2N1cnZlX21hdHJpeFtnZXRfb3JkZXIocm93LnNlciksXSkKCgpwaGVhdG1hcDo6cGhlYXRtYXAoY3VydmVfbWF0cml4W2dlbmUub3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygyMDA6MTAxLCAjTmZpeCBwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MTAwKV0sICNOcjRhMiBwb2ludHMKICAgICAgICAgICAgICAgICAgIHNjYWxlID0gInJvdyIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRiwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fcm93ID0gTmZpeC5HZW5lLmR5bmFtaXF1ZSAlPiUgZHBseXI6OnNlbGVjdChHZW5lLkNsdXN0ZXJzKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gZGF0YS5mcmFtZShsaW5lYWdlID0gcmVwKGMoIk5yNGEyIiwgIk5maXgiKSwgZWFjaD0xMDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5uby5jb2xvcnMsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRiwKICAgICAgICAgICAgICAgICAgIHNob3dfcm93bmFtZXMgPSBULAogICAgICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gMiwKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksCiAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoLTIuNSwyLjUsIGxlbmd0aC5vdXQgPSAxMSksCiAgICAgICAgICAgICAgICAgICBtYWluID0gIk5maXggY2VsbHMgZW5yaWNoZWQgZ2VuZXMgZXhwcmVzc2lvbiBhbG9uZyBwc2V1ZG90aW1lIikKYGBgCiMgUGxvdCByZWxldmFudCBnZW5lIHRyZW5kcwoKYGBge3J9CiMgbG9hZCBjdXN0b20gcGxvdHRpbmcgZnVuY3Rpb25zCnNvdXJjZSgiLi9mdW5jdGlvbnMvVHJhamVjdG9yaWVzUGxvdEZ1bmN0aW9ucy5SIikKYGBgCgpgYGB7ciBmaWcuZGltPWMoMTAsNSksIGZpZy5jYXA9ICJNYW51c2NyaXB0IEZpZy4gN0UifQpQbG90LkdlbmVzLnRyZW5kKEFsbGNlbGxzLmRhdGEsCiAgICAgICAgICAgICAgICAgZ2VuZXMgPSBjKCJOZmliIiwgIkRieDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV1cm9kNiIsICJQYngzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBjcDQiLCAiWmZoeDMiKSwKICAgICAgICAgICAgICAgICBjb2xvci5ieSA9ICJsaW5lYWdlIiwKICAgICAgICAgICAgICAgICBVc2Uuc2NhbGUuZGF0YSA9IEYpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDksNSksIGZpZy5jYXA9ICJNYW51c2NyaXB0IEZpZy4gN0UifQpQbG90LkdlbmVzLnRyZW5kKEFsbGNlbGxzLmRhdGEsCiAgICAgICAgICAgICAgICAgZ2VuZXMgPSBjKCJOZXVyb2Q0IiwgIk5ldXJvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiWmZoeDMiLCAiVHViYjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV5MSIsICJNYXB0IiksCiAgICAgICAgICAgICAgICAgY29sb3IuYnkgPSAibGluZWFnZSIsCiAgICAgICAgICAgICAgICAgVXNlLnNjYWxlLmRhdGEgPSBGKQpgYGAKCmBgYHtyIGZpZy5kaW09Yyg5LDUpLCBmaWcuY2FwPSAiTWFudXNjcmlwdCBGaWcuIFM3QiJ9ClBsb3QuR2VuZXMudHJlbmQoQWxsY2VsbHMuZGF0YSwKICAgICAgICAgICAgICAgICBnZW5lcyA9IGMoIlRicjEiLCAiRW14MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXVyb2QxIiwgIkhleTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV1cm9kMiIsICJGbHJ0MyIpLAogICAgICAgICAgICAgICAgIGNvbG9yLmJ5ID0gImxpbmVhZ2UiLAogICAgICAgICAgICAgICAgIFVzZS5zY2FsZS5kYXRhID0gRikKYGBgCgpgYGB7ciBmaWcuZGltPWMoOSw1KSwgZmlnLmNhcD0gIk1hbnVzY3JpcHQgRmlnLiBTN0IifQpQbG90LkdlbmVzLnRyZW5kKEFsbGNlbGxzLmRhdGEsCiAgICAgICAgICAgICAgICAgZ2VuZXMgPSBjKCJOZmlhIiwgIkRtcnQzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNucjEiLCAiU2xjMzBhMTAiKSwKICAgICAgICAgICAgICAgICBjb2xvci5ieSA9ICJsaW5lYWdlIiwKICAgICAgICAgICAgICAgICBVc2Uuc2NhbGUuZGF0YSA9IEYpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDEwLDUpLCBmaWcuY2FwPSAiTWFudXNjcmlwdCBGaWcuIFM3QiJ9ClBsb3QuR2VuZXMudHJlbmQoQWxsY2VsbHMuZGF0YSwKICAgICAgICAgICAgICAgICBnZW5lcyA9IGMoIk1laXMyIiwgIkdtMjkyNjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiTnIyZjIiLCAiRGxldTciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiWmJ0YjIwIiwgIlN2aWwiKSwKICAgICAgICAgICAgICAgICBjb2xvci5ieSA9ICJsaW5lYWdlIiwKICAgICAgICAgICAgICAgICBVc2Uuc2NhbGUuZGF0YSA9IEYpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDksNSksIGZpZy5jYXA9ICJNYW51c2NyaXB0IEZpZy4gUzdCIn0KUGxvdC5HZW5lcy50cmVuZChBbGxjZWxscy5kYXRhLAogICAgICAgICAgICAgICAgIGdlbmVzID0gYygiRXBoYTMiLCAiUGRsaW00IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRveCIsICJUZmFwMmMiKSwKICAgICAgICAgICAgICAgICBjb2xvci5ieSA9ICJsaW5lYWdlIiwKICAgICAgICAgICAgICAgICBVc2Uuc2NhbGUuZGF0YSA9IEYpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDksNSksIGZpZy5jYXA9ICJNYW51c2NyaXB0IEZpZy4gUzdCIn0KUGxvdC5HZW5lcy50cmVuZChBbGxjZWxscy5kYXRhLAogICAgICAgICAgICAgICAgIGdlbmVzID0gYygiTmV1cm9nMSIsICJFb21lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdGcyIiwgIkZveGcxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVteDIiKSwKICAgICAgICAgICAgICAgICBjb2xvci5ieSA9ICJsaW5lYWdlIiwKICAgICAgICAgICAgICAgICBVc2Uuc2NhbGUuZGF0YSA9IEYpCmBgYAoKIyBJbnNwZWN0IHRoZSBnZW5lcyB3aGljaCBiZXN0IHByZWRpY3QgZWFybHkgZmF0ZSBiaWFzIHdpdGhpbiBCUHMKCiMjIEV4dHJhY3QgY2VsbHMgaW4gQlAgc3RhdGUKCmBgYHtyfQpzZXQuc2VlZCgxMDApCiMgUnVuIEttZWFucyBjbHVzdGVyaW5nCmNsIDwtIGttZWFucyhjYmluZChBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRBUF9zaWduYXR1cmUxLAogICAgICAgICAgICAgICAgICAgQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEkQlBfc2lnbmF0dXJlMSwKICAgICAgICAgICAgICAgICAgIEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJEVOX3NpZ25hdHVyZTEsCiAgICAgICAgICAgICAgICAgICBBbGxjZWxscy5kYXRhQG1ldGEuZGF0YSRMTl9zaWduYXR1cmUxKSwgNCkKCkFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhJGttZWFuQ2x1c3QgPC0gcGFzdGUwKCJDbHVzdC4iLGNsJGNsdXN0ZXIpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDUuMywgNCl9CmNvbC5wYWwgPC0gd2VzX3BhbGV0dGUoIkdyYW5kQnVkYXBlc3QxIiwgNCwgdHlwZSA9ICJkaXNjcmV0ZSIpCgpwMSA8LSBnZ3Bsb3QoQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEsIGFlcyh4PUFQX3NpZ25hdHVyZTEsIHk9QlBfc2lnbmF0dXJlMSwgY29sb3VyID0ga21lYW5DbHVzdCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbC5wYWwpICsKICBnZW9tX3BvaW50KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpnZ01hcmdpbmFsKHAxLCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9ImxpZ2h0Z3JleSIpCgpEaW1QbG90KEFsbGNlbGxzLmRhdGEsCiAgICAgICAgZ3JvdXAuYnkgPSAia21lYW5DbHVzdCIsCiAgICAgICAgcmVkdWN0aW9uLnVzZSA9ICJzcHJpbmciLAogICAgICAgIGNvbHMudXNlID0gY29sLnBhbCwKICAgICAgICBkaW0uMSA9IDEsCiAgICAgICAgZGltLjIgPSAyLAogICAgICAgIGRvLmxhYmVsPVQsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDQsCiAgICAgICAgbm8ubGVnZW5kID0gRikKYGBgCgoKYGBge3J9CiMgRmluZCB0aGUga21lYW5zIGNsdXN0ZXIgd2l0aCB0aGUgaGlnaGVzdCBtZWFuIEJQX3NpZ25hdHVyZTEgc2NvcmUKTWVhbktjbHVzdC5CUHNjb3JlIDwtIGFnZ3JlZ2F0ZShCUF9zaWduYXR1cmUxIH4ga21lYW5DbHVzdCwgQWxsY2VsbHMuZGF0YUBtZXRhLmRhdGEsIG1lYW4pCkJQY2x1c3QgPC0gTWVhbktjbHVzdC5CUHNjb3JlICU+JSBmaWx0ZXIoQlBfc2lnbmF0dXJlMSA9PSBtYXgoQlBfc2lnbmF0dXJlMSkpICU+JSBwdWxsKGttZWFuQ2x1c3QpCgojIEV4dHJhY3QgYmFyY29kZXMgYW5kIGZpbHRlciB0aGUgc2V1cmF0IG9iamVjdApHbHV0LmNlbGxzIDwtIEFsbGNlbGxzLmRhdGFAbWV0YS5kYXRhICU+JSBmaWx0ZXIoa21lYW5DbHVzdCA9PSBCUGNsdXN0KSAlPiUgcHVsbChCYXJjb2RlcykKQlAuZGF0YSA8LSAgU3Vic2V0RGF0YShBbGxjZWxscy5kYXRhLCBjZWxscy51c2UgPSBHbHV0LmNlbGxzICwgc3Vic2V0LnJhdyA9IFQsICBkby5jbGVhbiA9IEYpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDUuMywgNCl9CkRpbVBsb3QoQlAuZGF0YSwKICAgICAgICBncm91cC5ieSA9ICJMaW5lYWdlIiwKICAgICAgICByZWR1Y3Rpb24udXNlID0gInNwcmluZyIsCiAgICAgICAgZGltLjEgPSAxLAogICAgICAgIGRpbS4yID0gMiwKICAgICAgICBkby5sYWJlbD1ULAogICAgICAgIGNvbHMudXNlID0gYygiI2NjMzkxYiIsIiMwMjZjOWEiKSwKICAgICAgICBsYWJlbC5zaXplID0gNCwKICAgICAgICBuby5sZWdlbmQgPSBGKQpgYGAKCmBgYHtyfQojIEZpbHRlciBnZW5lcwpudW0uY2VsbHMgPC0gTWF0cml4Ojpyb3dTdW1zKEJQLmRhdGFAcmF3LmRhdGEgPiAwKQpnZW5lcy51c2UgPC0gbmFtZXMoeCA9IG51bS5jZWxsc1tudW0uY2VsbHMgPj0gMTBdKQpCUC5kYXRhQHJhdy5kYXRhIDwtIEJQLmRhdGFAcmF3LmRhdGFbZ2VuZXMudXNlLCBdCgojIE5vcm1hbGl6YXRpb24gYW5kIHZhcmlhYmxlIGdlbmUgc2VsZWN0aW9uCkJQLmRhdGEgPC0gTm9ybWFsaXplRGF0YShvYmplY3QgPSBCUC5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiTG9nTm9ybWFsaXplIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS5mYWN0b3IgPSByb3VuZChtZWRpYW4oQlAuZGF0YUBtZXRhLmRhdGEkblVNSSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5wcm9ncmVzcyA9IEYpCgpCUC5kYXRhIDwtIEZpbmRWYXJpYWJsZUdlbmVzKG9iamVjdCA9IEJQLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbi5mdW5jdGlvbiA9IEV4cE1lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGVyc2lvbi5mdW5jdGlvbiA9IExvZ1ZNUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Lmxvdy5jdXRvZmYgPSAwLjAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguaGlnaC5jdXRvZmYgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkuY3V0b2ZmID0gMS4zLCBkby5wbG90ID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnByb2dyZXNzID0gRikKYGBgCgojIyBGaW5kIHRoZSBnZW5lcyB3aGljaCBiZXN0IGNsYXNzaWZ5IEJQIGJldHdlZW4gdGhlIDIgdHJhamVjdG9yaWVzCgpgYGB7cn0KIyBFeGNsdWRlIGNlbGwgY3ljbGUgYXNzb2NpYXRlZCwgbXQgYW5kIHJpYm8gcmlibwpDQ2dlbmVzIDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKCIvaG9tZS9tYXR0aGlldS9CdXJlYXUvUi9GaWd1cmVzQ29kZXMvUHJvZ2VuaXRvcnMvQ2VsbEN5Y2xlR2VuZXMuY3N2Iiwgc2VwID0gIlx0IiwgaGVhZGVyID0gRilbLDFdKQpHZW5lc1RvUmVtb3ZlIDwtIGMoZ3JlcChwYXR0ZXJuID0gIiheUnBsfF5ScHN8Xk1ycCkiLCB4ID0gcm93Lm5hbWVzKEJQLmRhdGFAZGF0YSksIHZhbHVlID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICBncmVwKHBhdHRlcm4gPSAiXm10LSIsIHggPSByb3cubmFtZXMoQlAuZGF0YUBkYXRhKSwgdmFsdWUgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICJYaXN0IiwgQ0NnZW5lcykKCklucHV0LmdlbmVzIDwtIEJQLmRhdGFAdmFyLmdlbmVzWyFCUC5kYXRhQHZhci5nZW5lcyAlaW4lIEdlbmVzVG9SZW1vdmVdCgojIFNldCBpZGVudApCUC5kYXRhIDwtIFNldEFsbElkZW50KEJQLmRhdGEsIGlkID0gIkxpbmVhZ2UiKQoKCk5maXh2c05yNGEyLkRFZ2VuZXMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gQlAuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnVzZSA9ICJyb2MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSAiTmZpeC5saW5lYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gIk5yNGEyLmxpbmVhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5wY3QgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ZjLnRocmVzaG9sZCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQuYmFyID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcyA9IEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMudXNlID0gSW5wdXQuZ2VuZXMpCgpOZml4dnNOcjRhMi5ERWdlbmVzJEdlbmUgPC0gcm93bmFtZXMoTmZpeHZzTnI0YTIuREVnZW5lcykKCndyaXRlLnRhYmxlKE5maXh2c05yNGEyLkRFZ2VuZXMsICIuL0JQX1JPQ19yZXMuY3N2Iiwgc2VwPSI7IikKYGBgCgpgYGB7ciBmaWcuZGltPWMoOSwgNil9CiMgU2V0IGEgbmV3IGRhdGEgZnJhbWUgd2hpY2ggd2lsbCBzdG9yZSBhbGwgdmFyaWFibGUgbmVlZGVkIHRvIGdlbmVyYXRlIHRoZSBwbG90ClZwbG90LmRhdGEgPC0gZGF0YS5mcmFtZShnZW5lID0gTmZpeHZzTnI0YTIuREVnZW5lcyRHZW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgQVVDID0gTmZpeHZzTnI0YTIuREVnZW5lcyRteUFVQywgCiAgICAgICAgICAgICAgICAgICAgICAgICBMb2dGQyA9IE5maXh2c05yNGEyLkRFZ2VuZXMkYXZnX2xvZ0ZDKQoKdGVtcG9yYWwubW9kdWxlIDwtIHJvdy5uYW1lcyhyZWFkLnRhYmxlKCIuL1Byb2dlbml0b3JzL1RlbXBvcmFsLmdlbmUuY2x1c3RlcnMuY3N2Iiwgc2VwID0gIjsiLCBoZWFkZXIgPSBULCByb3cubmFtZXMgPSAxKSkKc3BhdGlhbC5tb2R1bGUgPC0gcm93Lm5hbWVzKHJlYWQudGFibGUoIi4vUHJvZ2VuaXRvcnMvU3BhdGlhbC5nZW5lLmNsdXN0ZXJzLmNzdiIsIHNlcCA9ICI7IiwgaGVhZGVyID0gVCwgcm93Lm5hbWVzID0gMSkpCgpWcGxvdC5kYXRhIDwtIGRwbHlyOjptdXRhdGUoVnBsb3QuZGF0YSwgY29sb3IgPSBkcGx5cjo6Y2FzZV93aGVuKFZwbG90LmRhdGEkZ2VuZSAlaW4lIHRlbXBvcmFsLm1vZHVsZSB+ICJUZW1wb3JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVnBsb3QuZGF0YSRnZW5lICVpbiUgc3BhdGlhbC5tb2R1bGUgfiAiU3BhdGlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJOQSIpKQoKZ2dwbG90KFZwbG90LmRhdGEsIGFlcyh4ID0gTG9nRkMsIHkgPSBBVUMsIGNvbG9yID0gY29sb3IpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMiwgYWxwaGEgPSAwLjgsIG5hLnJtID0gVCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkFQIG1vZHVsZSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIlRlbXBvcmFsIiA9ICIjY2MzOTFiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BhdGlhbCIgPSAiIzAyNmM5YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5BIiA9ICIjOTY5Njk2IikpICsKICB4bGFiKGV4cHJlc3Npb24obG9nKCJGb2xkIGNoYW5nZSIpKSkgKwogIHlsYWIoIkFVQyIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0wLjQsIDAuNCksIGNvbG91ciA9ICIjOTY5Njk2IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGMoMC42NSwgMC4zNSksIGNvbG91ciA9ICIjOTY5Njk2IikgKwogIGdncmVwZWw6Omdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9aWZlbHNlKGdlbmUgJWluJSBjKHRlbXBvcmFsLm1vZHVsZSxzcGF0aWFsLm1vZHVsZSkgJiBhYnMoVnBsb3QuZGF0YSRMb2dGQykgPiAwLjQgJiAoVnBsb3QuZGF0YSRBVUMgPiAwLjY1IHwgVnBsb3QuZGF0YSRBVUMgPCAwLjM1KSwgYXMuY2hhcmFjdGVyKGdlbmUpLCcnKSksCiAgICAgICAgICAgICAgICAgIGJveC5wYWRkaW5nICAgPSAwLjM1LCAKICAgICAgICAgICAgICAgICAgcG9pbnQucGFkZGluZyA9IDAuNSwKICAgICAgICAgICAgICAgICAgc2VnbWVudC5jb2xvciA9ICdncmV5NTAnLAogICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKQoKYGBgCgoKIyMgUGxvdCBnZW5lcyBvbiBTcHJpbmcgcGxvdAoKYGBge3IgZmlnLmRpbT1jKDksIDUpfQpGZWF0dXJlUGxvdChvYmplY3QgPSBCUC5kYXRhLAogICAgICAgICAgICBmZWF0dXJlcy5wbG90ID0gYygiRW14MSIsICJaYnRiMjAiKSwKICAgICAgICAgICAgY29scy51c2UgPSBjKCJncmV5OTAiLCBicmV3ZXIucGFsKDksIllsR25CdSIpKSwKICAgICAgICAgICAgcHQuc2l6ZSA9IDIsCiAgICAgICAgICAgIHJlZHVjdGlvbi51c2UgPSAic3ByaW5nIiwKICAgICAgICAgICAgbm8ubGVnZW5kID0gVCwKICAgICAgICAgICAgb3ZlcmxheSA9IEYsCiAgICAgICAgICAgIGRhcmsudGhlbWUgPSBGKQpgYGAKCiMgU2Vzc2lvbiBJbmZvCmBgYHtyfQojZGF0ZQpmb3JtYXQoU3lzLnRpbWUoKSwgIiVkICVCLCAlWSwgJUgsJU0iKQoKI1BhY2thZ2VzIHVzZWQKc2Vzc2lvbkluZm8oKQpgYGA=