Load the dataset and calculate QC metrics

Low quality cell filtering

Filtering cells based on number of genes and transcripts detected

Remove cells with to few gene detected or with to many UMI counts

We filter cells which are likely to be doublet based on their higher content of transcript detected as well as cell with to few genes/UMI sequenced

Use Scrublet to detect obvious doublets

Run Scrublet with default parameter

Export raw count matrix as input to Scrublet

## NULL
## Preprocessing...
## Simulating doublets...
## Embedding transcriptomes using PCA...
## Calculating doublet scores...
## Automatically set threshold at doublet score = 0.23
## Detected doublet rate = 3.9%
## Estimated detectable doublet fraction = 70.6%
## Overall doublet rate:
##  Expected   = 10.0%
##  Estimated  = 5.5%
## Elapsed time: 5.0 seconds

## 
## Doublet Singlet 
##     282    4234

Filter genes and normalize counts

Generate Spring projection

Export count matrix use as input to SPRING

## NULL

Spring coordinates were generated using the online version of SPRING with the following parameters :

Number of cells: 4225
Number of genes that passed filter: 1400
Min expressing cells (gene filtering): 3
Min number of UMIs (gene filtering): 3
Gene variability %ile (gene filtering): 90
Number of principal components: 25
Number of nearest neighbors: 8
Number of force layout iterations: 500

Session Info

## [1] "30 novembre, 2020, 10,26"
## 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] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] reticulate_1.13    ggExtra_0.9        RColorBrewer_1.1-2 dplyr_0.8.3       
## [5] Seurat_2.3.4       Matrix_1.2-17      cowplot_1.0.0      ggplot2_3.2.1     
## 
## loaded via a namespace (and not attached):
##   [1] Rtsne_0.15          colorspace_1.4-1    class_7.3-17       
##   [4] modeltools_0.2-22   ggridges_0.5.1      mclust_5.4.5       
##   [7] htmlTable_1.13.2    base64enc_0.1-3     rstudioapi_0.11    
##  [10] proxy_0.4-23        farver_2.0.1        npsurv_0.4-0       
##  [13] flexmix_2.3-15      bit64_4.0.2         codetools_0.2-16   
##  [16] splines_3.6.3       R.methodsS3_1.7.1   lsei_1.2-0         
##  [19] robustbase_0.93-5   knitr_1.26          zeallot_0.1.0      
##  [22] jsonlite_1.7.0      Formula_1.2-3       ica_1.0-2          
##  [25] cluster_2.1.0       kernlab_0.9-29      png_0.1-7          
##  [28] R.oo_1.23.0         shiny_1.4.0         compiler_3.6.3     
##  [31] httr_1.4.1          backports_1.1.5     fastmap_1.0.1      
##  [34] assertthat_0.2.1    lazyeval_0.2.2      later_1.0.0        
##  [37] lars_1.2            acepack_1.4.1       htmltools_0.5.0    
##  [40] tools_3.6.3         igraph_1.2.5        gtable_0.3.0       
##  [43] glue_1.4.1          RANN_2.6.1          reshape2_1.4.3     
##  [46] Rcpp_1.0.5          vctrs_0.2.0         gdata_2.18.0       
##  [49] ape_5.3             nlme_3.1-141        iterators_1.0.12   
##  [52] fpc_2.2-3           gbRd_0.4-11         lmtest_0.9-37      
##  [55] xfun_0.18           stringr_1.4.0       mime_0.7           
##  [58] miniUI_0.1.1.1      lifecycle_0.1.0     irlba_2.3.3        
##  [61] gtools_3.8.1        DEoptimR_1.0-8      MASS_7.3-53        
##  [64] zoo_1.8-6           scales_1.1.0        promises_1.1.0     
##  [67] doSNOW_1.0.18       parallel_3.6.3      yaml_2.2.1         
##  [70] pbapply_1.4-2       gridExtra_2.3       rpart_4.1-15       
##  [73] segmented_1.0-0     latticeExtra_0.6-28 stringi_1.4.6      
##  [76] foreach_1.4.7       checkmate_1.9.4     caTools_1.17.1.2   
##  [79] bibtex_0.4.2        Rdpack_0.11-0       SDMTools_1.1-221.1 
##  [82] rlang_0.4.7         pkgconfig_2.0.3     dtw_1.21-3         
##  [85] prabclus_2.3-1      bitops_1.0-6        evaluate_0.14      
##  [88] lattice_0.20-41     ROCR_1.0-7          purrr_0.3.3        
##  [91] labeling_0.3        htmlwidgets_1.5.1   bit_4.0.4          
##  [94] tidyselect_0.2.5    plyr_1.8.4          magrittr_1.5       
##  [97] R6_2.4.1            snow_0.4-3          gplots_3.0.1.1     
## [100] Hmisc_4.3-0         pillar_1.4.2        foreign_0.8-72     
## [103] withr_2.1.2         fitdistrplus_1.0-14 mixtools_1.1.0     
## [106] survival_2.44-1.1   nnet_7.3-14         tsne_0.1-3         
## [109] tibble_2.1.3        crayon_1.3.4        hdf5r_1.3.2.9000   
## [112] KernSmooth_2.23-15  rmarkdown_2.5       grid_3.6.3         
## [115] data.table_1.12.6   metap_1.1           digest_0.6.25      
## [118] diptest_0.75-7      xtable_1.8-4        httpuv_1.5.2       
## [121] tidyr_1.0.0         R.utils_2.9.0       stats4_3.6.3       
## [124] munsell_0.5.0

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

LS0tCnRpdGxlOiAiQ2VsbCBxdWFsaXR5IGNvbnRyb2wiCmF1dGhvcjoKICAgLSBNYXR0aGlldSBNb3JlYXVeW0luc3RpdHV0ZSBvZiBQc3ljaGlhdHJ5IGFuZCBOZXVyb3NjaWVuY2Ugb2YgUGFyaXMsIElOU0VSTSBVMTI2NiwgNzUwMTQsIFBhcmlzLCBGcmFuY2UsIG1hdHRoaWV1Lm1vcmVhdUBpbnNlcm0uZnJdIFshW10oaHR0cHM6Ly9vcmNpZC5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy9pbWFnZXMvb3JjaWRfMTZ4MTYucG5nKV0oaHR0cHM6Ly9vcmNpZC5vcmcvMDAwMC0wMDAyLTI1OTItMjM3MykKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBkZl9wcmludDogdGliYmxlCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sKICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6IGhlYWRlci5odG1sCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKLS0tCgpgYGB7Y3NzLCBlY2hvPUZBTFNFfQpoMSB7CiAgZm9udC1zaXplOiAzNHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogI2U2NGQwMDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogNDBweDsKICBtYXJnaW4tdG9wOiAycmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICBjb2xvcjogIzAwMDAwMDsKfQpoMiB7CiAgZm9udC1zaXplOiAzMHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQpoMyB7CiAgZm9udC1zaXplOiAyNHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQpoNCB7CiAgZm9udC1zaXplOiAxOHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQpoNSB7CiAgZm9udC1zaXplOiAxNnB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQoKcCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLmFsaWduID0gJ2NlbnRlcicsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UpCmBgYAoKIyBMb2FkIGxpYnJhcmllcwoKYGBge3IgfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShkcGx5cikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ0V4dHJhKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkocmV0aWN1bGF0ZSkKdXNlX3B5dGhvbigiL3Vzci9iaW4vcHl0aG9uMyIpCgojU2V0IGdncGxvdCB0aGVtZSBhcyBjbGFzc2ljCnRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpCmBgYAoKCiMgTG9hZCB0aGUgZGF0YXNldCBhbmQgY2FsY3VsYXRlIFFDIG1ldHJpY3MKCiMjIEluaXRpYWxpemUgYSBTZXVyYXQgb2JqZWN0IGZyb20gdGhlIHJhdyBmaWx0ZXJlZCBnZW5lL2JjIG1hdHJpeApgYGB7cn0KIyBMb2FkIHRoZSByYXcgZmlsdGVyZWRfZ2VuZV9iY19tYXRyaXggb3V0cHV0ZWQgYnkgQ2VsbCBSYW5nZXIgdjIuMS4xCkNvdW50ZGF0YSA8LSBSZWFkMTBYKGRhdGEuZGlyID0gIi4vMS1RdWFsaXR5Q29udHJvbC9SYXdkYXRhIikKCiMgSW5pdGlhbGl6ZSB0aGUgU2V1cmF0IG9iamVjdApSYXcuZGF0YSA8LSBDcmVhdGVTZXVyYXRPYmplY3QocmF3LmRhdGEgPSBDb3VudGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4uY2VsbHMgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLmdlbmVzID0gODAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9ICJFMTIuNS1QU0ItV1QiKQoKUmF3LmRhdGFAbWV0YS5kYXRhJEJhcmNvZGVzIDwtIHJvd25hbWVzKFJhdy5kYXRhQG1ldGEuZGF0YSkKYGBgCgojIyBDYWxjdWxhdGUgcGVyY2VudGFnZSBvZiBtaXRvY2hvbmRyaWFsIG9uIHJpYm9zb21hbCBjb3VudHMKYGBge3J9CiMgUGVyY2VudCBvZiBtaXRvY2hvbmRyaWFsIGNvdW50cwptaXRvLmdlbmVzIDwtIGdyZXAocGF0dGVybiA9ICJebXQtIiwgeCA9IHJvd25hbWVzKHggPSBSYXcuZGF0YUBkYXRhKSwgdmFsdWUgPSBUUlVFKQpwZXJjZW50Lm1pdG8gPC0gTWF0cml4Ojpjb2xTdW1zKFJhdy5kYXRhQHJhdy5kYXRhW21pdG8uZ2VuZXMsIF0pL01hdHJpeDo6Y29sU3VtcyhSYXcuZGF0YUByYXcuZGF0YSkKUmF3LmRhdGEgPC0gQWRkTWV0YURhdGEob2JqZWN0ID0gUmF3LmRhdGEsIG1ldGFkYXRhID0gcGVyY2VudC5taXRvLCBjb2wubmFtZSA9ICJwZXJjZW50Lm1pdG8iKQoKIyBQZXJjZW50IG9mIG1pdG9jaG9uZHJpYWwgcmlib3NvbWFsCnJpYm8uZ2VuZXMgPC0gZ3JlcChwYXR0ZXJuID0gIiheUnBsfF5ScHN8Xk1ycCkiLCB4ID0gcm93bmFtZXMoeCA9IFJhdy5kYXRhQGRhdGEpLCB2YWx1ZSA9IFRSVUUpCnBlcmNlbnQucmlibyA8LSBNYXRyaXg6OmNvbFN1bXMoUmF3LmRhdGFAcmF3LmRhdGFbcmliby5nZW5lcywgXSkvTWF0cml4Ojpjb2xTdW1zKFJhdy5kYXRhQHJhdy5kYXRhKQpSYXcuZGF0YSA8LSBBZGRNZXRhRGF0YShvYmplY3QgPSBSYXcuZGF0YSwgbWV0YWRhdGEgPSBwZXJjZW50LnJpYm8sIGNvbC5uYW1lID0gInBlcmNlbnQucmlibyIpCmBgYAoKYGBge3J9CnJtKGxpc3QgPSBscygpWyFscygpICVpbiUgIlJhdy5kYXRhIl0pCmBgYAoKCiMjIFBMb3Qgc29tZSBRQyBtZXRyaWNzCmBgYHtyIGZpZy5kaW09Yyg1LCA0KX0KI1Zpb2xpbiBwbG90IApWbG5QbG90KG9iamVjdCA9IFJhdy5kYXRhLCBmZWF0dXJlcy5wbG90ID0gYygibkdlbmUiLCJuVU1JIiwgInBlcmNlbnQubWl0byIsICJwZXJjZW50LnJpYm8iKSwgbkNvbCA9IDIgKQpgYGAKCgpgYGB7ciBmaWcuZGltPWMoNiwgMy41KX0KIyBSZWxhdGlvbiBiZXR3ZWVuIG5VTUkgYW5kIG5HZW5lIGRldGVjdGVkCnAxIDwtIGdncGxvdChSYXcuZGF0YUBtZXRhLmRhdGEsIGFlcyh4PW5VTUksIHk9bkdlbmUpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKQpwMSA8LSBnZ01hcmdpbmFsKHAxLCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9ImxpZ2h0Z3JleSIpCgpwMiA8LSBnZ3Bsb3QoUmF3LmRhdGFAbWV0YS5kYXRhLCBhZXMoeD1sb2cxMChuVU1JKSwgeT1sb2cxMChuR2VuZSkpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKQpwMiA8LSBnZ01hcmdpbmFsKHAyLCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9ImxpZ2h0Z3JleSIpCgpwbG90X2dyaWQocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwgbmNvbD0yLCBhbGlnbj0naCcsIHJlbF93aWR0aHMgPSBjKDEsIDEpKQpgYGAKCiMgTG93IHF1YWxpdHkgY2VsbCBmaWx0ZXJpbmcgCgpgYGB7cn0KQ2VsbC5RQy5TdGF0IDwtIFJhdy5kYXRhQG1ldGEuZGF0YQpgYGAKCgojIyBGaWx0ZXJpbmcgY2VsbHMgYmFzZWQgb24gcGVyY2VudGFnZSBvZiBtaXRvY2hvbmRyaWFsIHRyYW5zY3JpcHRzCgpXZSBhcHBsaWVkIGEgaGlnaCBhbmQgbG93IG1lZGlhbiBhYnNvbHV0ZSBkZXZpYXRpb24gKG1hZCkgdGhyZXNob2xkcyB0byBleGNsdWRlIG91dGxpZXIgY2VsbHMKCmBgYHtyIH0KbWF4Lm1pdG8udGhyIDwtIG1lZGlhbihDZWxsLlFDLlN0YXQkcGVyY2VudC5taXRvKSArIDMqbWFkKENlbGwuUUMuU3RhdCRwZXJjZW50Lm1pdG8pCm1pbi5taXRvLnRociA8LSBtZWRpYW4oQ2VsbC5RQy5TdGF0JHBlcmNlbnQubWl0bykgLSAzKm1hZChDZWxsLlFDLlN0YXQkcGVyY2VudC5taXRvKQpgYGAKCgpgYGB7ciBmaWcuZGltPWMoNCwgNCl9CnAxIDwtIGdncGxvdChDZWxsLlFDLlN0YXQsIGFlcyh4PW5HZW5lLCB5PXBlcmNlbnQubWl0bykpICsKICAgICAgZ2VvbV9wb2ludCgpICsKICAgICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IG1heC5taXRvLnRociksIGNvbG91ciA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpICsKICAgICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IG1pbi5taXRvLnRociksIGNvbG91ciA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpICsKICAgICAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSBwYXN0ZTAoYXMubnVtZXJpYyh0YWJsZShDZWxsLlFDLlN0YXQkcGVyY2VudC5taXRvID4gbWF4Lm1pdG8udGhyIHwgQ2VsbC5RQy5TdGF0JHBlcmNlbnQubWl0byA8IG1pbi5taXRvLnRocilbMl0pLCIgY2VsbHMgcmVtb3ZlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYyh0YWJsZShDZWxsLlFDLlN0YXQkcGVyY2VudC5taXRvID4gbWF4Lm1pdG8udGhyIHwgQ2VsbC5RQy5TdGF0JHBlcmNlbnQubWl0byA8IG1pbi5taXRvLnRocilbMV0pLCIgY2VsbHMgcmVtYWluIiksIHggPSA2MDAwLCB5ID0gMC4xKQoKZ2dNYXJnaW5hbChwMSwgdHlwZSA9ICJoaXN0b2dyYW0iLCBmaWxsPSJsaWdodGdyZXkiLCBiaW5zPTEwMCkgCmBgYApgYGB7cn0KIyBGaWx0ZXIgY2VsbHMgYmFzZWQgb24gdGhlc2UgdGhyZXNob2xkcwpDZWxsLlFDLlN0YXQgPC0gQ2VsbC5RQy5TdGF0ICU+JSBmaWx0ZXIocGVyY2VudC5taXRvIDwgbWF4Lm1pdG8udGhyKSAlPiUgZmlsdGVyKHBlcmNlbnQubWl0byA+IG1pbi5taXRvLnRocikKYGBgCgoKIyMgRmlsdGVyaW5nIGNlbGxzIGJhc2VkIG9uIG51bWJlciBvZiBnZW5lcyBhbmQgdHJhbnNjcmlwdHMgZGV0ZWN0ZWQKCiMjIyBSZW1vdmUgY2VsbHMgd2l0aCB0byBmZXcgZ2VuZSBkZXRlY3RlZCBvciB3aXRoIHRvIG1hbnkgVU1JIGNvdW50cwoKV2UgZmlsdGVyIGNlbGxzIHdoaWNoIGFyZSBsaWtlbHkgdG8gYmUgZG91YmxldCBiYXNlZCBvbiB0aGVpciBoaWdoZXIgY29udGVudCBvZiB0cmFuc2NyaXB0IGRldGVjdGVkIGFzIHdlbGwgYXMgY2VsbCB3aXRoIHRvIGZldyBnZW5lcy9VTUkgc2VxdWVuY2VkCgpgYGB7cn0KIyBTZXQgbG93IGFuZCBoaWdodCB0aHJlc2hvbGRzIG9uIHRoZSBudW1iZXIgb2YgZGV0ZWN0ZWQgZ2VuZXMKbWluLkdlbmVzLnRociA8LSBtZWRpYW4obG9nMTAoQ2VsbC5RQy5TdGF0JG5HZW5lKSkgLSAzKm1hZChsb2cxMChDZWxsLlFDLlN0YXQkbkdlbmUpKQptYXguR2VuZXMudGhyIDwtIG1lZGlhbihsb2cxMChDZWxsLlFDLlN0YXQkbkdlbmUpKSArIDMqbWFkKGxvZzEwKENlbGwuUUMuU3RhdCRuR2VuZSkpCgojIFNldCBoaWdodCB0aHJlc2hvbGQgb24gdGhlIG51bWJlciBvZiB0cmFuc2NyaXB0cwptYXgublVNSS50aHIgPC0gbWVkaWFuKGxvZzEwKENlbGwuUUMuU3RhdCRuVU1JKSkgKyAzKm1hZChsb2cxMChDZWxsLlFDLlN0YXQkblVNSSkpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDQsIDQpfQojIEdlbmUvVU1JIHNjYXR0ZXIgcGxvdCBiZWZvcmUgZmlsdGVyaW5nCnAxIDwtIGdncGxvdChDZWxsLlFDLlN0YXQsIGFlcyh4PWxvZzEwKG5VTUkpLCB5PWxvZzEwKG5HZW5lKSkpICsKICAgICAgZ2VvbV9wb2ludCgpICsKICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICAgICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IG1pbi5HZW5lcy50aHIpLCBjb2xvdXIgPSAiZ3JlZW4iLCBsaW5ldHlwZSA9IDIpICsKICAgICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IG1heC5HZW5lcy50aHIpLCBjb2xvdXIgPSAiZ3JlZW4iLCBsaW5ldHlwZSA9IDIpICsKICAgICAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1heC5uVU1JLnRociksIGNvbG91ciA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpCgpnZ01hcmdpbmFsKHAxLCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9ImxpZ2h0Z3JleSIpCmBgYAoKYGBge3J9CiMgRmlsdGVyIGNlbGxzIGJhc2Ugb24gYm90aCBtZXRyaWNzCkNlbGwuUUMuU3RhdCA8LSBDZWxsLlFDLlN0YXQgJT4lIGZpbHRlcihsb2cxMChuR2VuZSkgPiBtaW4uR2VuZXMudGhyKSAlPiUgZmlsdGVyKGxvZzEwKG5VTUkpIDwgbWF4Lm5VTUkudGhyKQpgYGAKCmBgYHtyIGZpZy5kaW09Yyg0LCA0KX0KbG0ubW9kZWwgPC0gbG0oZGF0YSA9IENlbGwuUUMuU3RhdCwgZm9ybXVsYSA9IGxvZzEwKG5HZW5lKSB+IGxvZzEwKG5VTUkpKQoKcDIgPC0gZ2dwbG90KENlbGwuUUMuU3RhdCwgYWVzKHg9bG9nMTAoblVNSSksIHk9bG9nMTAobkdlbmUpKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWluLkdlbmVzLnRociksIGNvbG91ciA9ICJncmVlbiIsIGxpbmV0eXBlID0gMikgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtYXguR2VuZXMudGhyKSwgY29sb3VyID0gImdyZWVuIiwgbGluZXR5cGUgPSAyKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1heC5uVU1JLnRociksIGNvbG91ciA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpICsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSBsbS5tb2RlbCRjb2VmZmljaWVudHNbMV0gLSAwLjA5ICwgc2xvcGUgPSBsbS5tb2RlbCRjb2VmZmljaWVudHNbMl0sIGNvbG9yPSJvcmFuZ2UiKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSBwYXN0ZTAoZGltKENlbGwuUUMuU3RhdClbMV0sICIgUUMgcGFzc2VkIGNlbGxzIiksIHggPSA0LCB5ID0gMy44KQoKZ2dNYXJnaW5hbChwMiwgdHlwZSA9ICJoaXN0b2dyYW0iLCBmaWxsPSJsaWdodGdyZXkiKQpgYGAKCiMjIyBGaWx0ZXIgY2VsbHMgYmVsb3cgdGhlIG1haW4gcG9wdWxhdGlvbiBuVU1JL25HZW5lIHJlbGF0aW9uc2hpcAoKCmBgYHtyfQojIENlbGxzIHRvIGV4Y2x1ZGUgbGllIGJlbG93IGFuIGludGVyc2VwdCBvZmZzZXQgb2YgLTAuMDkKQ2VsbC5RQy5TdGF0JHZhbGlkZUNlbGxzIDwtIGxvZzEwKENlbGwuUUMuU3RhdCRuR2VuZSkgPiAobG9nMTAoQ2VsbC5RQy5TdGF0JG5VTUkpICogbG0ubW9kZWwkY29lZmZpY2llbnRzWzJdICsgKGxtLm1vZGVsJGNvZWZmaWNpZW50c1sxXSAtIDAuMDkpKQpgYGAKCgpgYGB7ciBmaWcuZGltPWMoNCwgNCl9CnAzIDwtIGdncGxvdChDZWxsLlFDLlN0YXQsIGFlcyh4PWxvZzEwKG5VTUkpLCB5PWxvZzEwKG5HZW5lKSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSB2YWxpZGVDZWxscykpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IGxtLm1vZGVsJGNvZWZmaWNpZW50c1sxXSAtIDAuMDkgLCBzbG9wZSA9IGxtLm1vZGVsJGNvZWZmaWNpZW50c1syXSwgY29sb3I9Im9yYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIGxhYmVsID0gcGFzdGUwKGFzLm51bWVyaWModGFibGUoQ2VsbC5RQy5TdGF0JHZhbGlkZUNlbGxzKVsyXSksICIgUUMgcGFzc2VkIGNlbGxzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLm51bWVyaWModGFibGUoQ2VsbC5RQy5TdGF0JHZhbGlkZUNlbGxzKVsxXSksICIgUUMgZmlsdGVyZWQiKSwgeCA9IDQsIHkgPSAzLjgpCgpnZ01hcmdpbmFsKHAzLCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9ImxpZ2h0Z3JleSIpCmBgYAoKYGBge3J9CiMgUmVtb3ZlIHVudmFsaWQgY2VsbHMKQ2VsbC5RQy5TdGF0IDwtIENlbGwuUUMuU3RhdCAlPiUgZmlsdGVyKHZhbGlkZUNlbGxzKQpgYGAKCiMjIyBLZWVwIG9ubHkgdGhlIHZhbGlkIGNlbGxzIGluIHRoZSBTZXVyYXQgb2JqZWN0CmBgYHtyfQpSYXcuZGF0YSA8LSBTdWJzZXREYXRhKFJhdy5kYXRhLCBjZWxscy51c2UgPSBDZWxsLlFDLlN0YXQkQmFyY29kZXMgLCBzdWJzZXQucmF3ID0gVCwgIGRvLmNsZWFuID0gRikKYGBgCgoKYGBge3IgZmlnLmRpbT1jKDQsIDQpfQojIFBsb3QgZmluYWwgUUMgbWV0cmljcwpWbG5QbG90KG9iamVjdCA9IFJhdy5kYXRhLCBmZWF0dXJlcy5wbG90ID0gYygibkdlbmUiLCJuVU1JIiwgInBlcmNlbnQubWl0byIsICJwZXJjZW50LnJpYm8iKSwgbkNvbCA9IDIgKQpgYGAKCgpgYGB7ciBmaWcuZGltPWMoNCwgNCl9CnAxIDwtIGdncGxvdChSYXcuZGF0YUBtZXRhLmRhdGEsIGFlcyh4PWxvZzEwKG5VTUkpLCB5PWxvZzEwKG5HZW5lKSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpCmdnTWFyZ2luYWwocDEsIHR5cGUgPSAiaGlzdG9ncmFtIiwgZmlsbD0ibGlnaHRncmV5IikKYGBgCgpgYGB7cn0Kcm0obGlzdCA9IGxzKClbIWxzKCkgJWluJSAiUmF3LmRhdGEiXSkKYGBgCgoKIyBVc2UgU2NydWJsZXQgdG8gZGV0ZWN0IG9idmlvdXMgZG91YmxldHMKCiMjIFJ1biBTY3J1YmxldCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVyCgpFeHBvcnQgcmF3IGNvdW50IG1hdHJpeCBhcyBpbnB1dCB0byBTY3J1YmxldApgYGB7cn0KI0V4cG9ydCBmaWx0ZXJlZCBtYXRyaXgKZGlyLmNyZWF0ZSgiLi8xLVF1YWxpdHlDb250cm9sL1FDZGF0YSIpCgpleHByRGF0YSA8LSBNYXRyaXgoYXMubWF0cml4KFJhdy5kYXRhQHJhdy5kYXRhKSwgc3BhcnNlID0gVFJVRSkKd3JpdGVNTShleHByRGF0YSwgIi4vMS1RdWFsaXR5Q29udHJvbC9RQ2RhdGEvbWF0cml4Lm10eCIpCmBgYAoKYGBge3B5dGhvbiB9CmltcG9ydCBzY3J1YmxldCBhcyBzY3IKaW1wb3J0IHNjaXB5LmlvCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgb3MKCiNMb2FkIHJhdyBjb3VudHMgbWF0cml4IGFuZCBnZW5lIGxpc3QKaW5wdXRfZGlyID0gJy9ob21lL21hdHRoaWV1L0J1cmVhdS9SL0ZpZ3VyZXNDb2Rlcy8xLVF1YWxpdHlDb250cm9sJwpjb3VudHNfbWF0cml4ID0gc2NpcHkuaW8ubW1yZWFkKGlucHV0X2RpciArICcvUUNkYXRhL21hdHJpeC5tdHgnKS5ULnRvY3NjKCkKCiNJbml0aWFsaXplIFNjcnVibGV0IG9iamVjdApzY3J1YiA9IHNjci5TY3J1YmxldChjb3VudHNfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9kb3VibGV0X3JhdGU9MC4xLAogICAgICAgICAgICAgICAgICAgICBzaW1fZG91YmxldF9yYXRpbz0yLAogICAgICAgICAgICAgICAgICAgICBuX25laWdoYm9ycyA9IDgpCgojUnVuIHRoZSBkZWZhdWx0IHBpcGVsaW5lCmRvdWJsZXRfc2NvcmVzLCBwcmVkaWN0ZWRfZG91YmxldHMgPSBzY3J1Yi5zY3J1Yl9kb3VibGV0cyhtaW5fY291bnRzPTEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2NlbGxzPTMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2dlbmVfdmFyaWFiaWxpdHlfcGN0bD04NSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3ByaW5fY29tcHM9MjUpCgoKYGBgCgpgYGB7ciBmaWcuZGltPWMoNCwgMyl9CiMgSW1wb3J0IHNjcnVibGV0J3MgZG91YmxldCBzY29yZQpSYXcuZGF0YUBtZXRhLmRhdGEkRG91YmxldHNjb3JlIDwtIHB5JGRvdWJsZXRfc2NvcmVzCgojIFBsb3QgZG91YmxldCBzY29yZQpnZ3Bsb3QoUmF3LmRhdGFAbWV0YS5kYXRhLCBhZXMoeCA9IERvdWJsZXRzY29yZSwgc3RhdChuZGVuc2l0eSkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwMCwgY29sb3VyID0ibGlnaHRncmV5IikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC4yMywgY29sb3VyID0gInJlZCIsIGxpbmV0eXBlID0gMikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC4xNSwgY29sb3VyID0gImdyZWVuIiwgbGluZXR5cGUgPSAyKSAjIE1hbnVhbGx5IHNldCB0aHJlc2hvbGQKICAKYGBgCgpgYGB7cn0KIyBNYW51YWxseSBzZXQgdGhyZXNob2xkIGF0IGRvdWJsZXQgc2NvcmUgdG8gMC4xNQpSYXcuZGF0YUBtZXRhLmRhdGEkUHJlZGljdGVkX2RvdWJsZXRzIDwtIGlmZWxzZShweSRkb3VibGV0X3Njb3JlcyA+IDAuMTUsICJEb3VibGV0IiwiU2luZ2xldCIgKQp0YWJsZShSYXcuZGF0YUBtZXRhLmRhdGEkUHJlZGljdGVkX2RvdWJsZXRzKQpgYGAKCgojIyBGaWx0ZXIgZ2VuZXMgYW5kIG5vcm1hbGl6ZSBjb3VudHMKCmBgYHtyfQojIEZpbHRlciBnZW5lcyBleHByZXNzZWQgYnkgbGVzcyB0aGFuIDMgY2VsbHMKbnVtLmNlbGxzIDwtIE1hdHJpeDo6cm93U3VtcyhSYXcuZGF0YUBkYXRhID4gMCkKZ2VuZXMudXNlIDwtIG5hbWVzKHggPSBudW0uY2VsbHNbd2hpY2goeCA9IG51bS5jZWxscyA+PSAzKV0pClJhdy5kYXRhQHJhdy5kYXRhIDwtIFJhdy5kYXRhQHJhdy5kYXRhW2dlbmVzLnVzZSwgXQpSYXcuZGF0YUBkYXRhIDwtIFJhdy5kYXRhQGRhdGFbZ2VuZXMudXNlLCBdCmBgYAoKYGBge3J9CiMgbG9nTm9ybWFsaXplZCB0aGUgZ2VuZSBleHByZXNzaW9uIG1hdHJpeApSYXcuZGF0YSA8LSBOb3JtYWxpemVEYXRhKG9iamVjdCA9IFJhdy5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiTG9nTm9ybWFsaXplIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS5mYWN0b3IgPSByb3VuZChtZWRpYW4oUmF3LmRhdGFAbWV0YS5kYXRhJG5VTUkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkucHJvZ3Jlc3MgPSBGKQpgYGAKCmBgYHtyfQojIEFzc2lnbiBDZWxsLUN5Y2xlIFNjb3JlcwpzLmdlbmVzIDwtIGMoIk1jbTUiLCAiUGNuYSIsICJUeW01IiwgIkZlbjEiLCAiTWNtMiIsICJNY200IiwgIlJybTEiLCAiVW5nIiwgIkdpbnMyIiwgIk1jbTYiLCAiQ2RjYTciLCAiRHRsIiwgIlByaW0xIiwgIlVocmYxIiwgIk1sZjFpcCIsICJIZWxscyIsICJSZmMyIiwgIlJhcDIiLCAiTmFzcCIsICJSYWQ1MWFwMSIsICJHbW5uIiwgIldkcjc2IiwgIlNsYnAiLCAiQ2NuZTIiLCAiVWJyNyIsICJQb2xkMyIsICJNc2gyIiwgIkF0YWQyIiwgIlJhZDUxIiwgIlJybTIiLCAiQ2RjNDUiLCAiQ2RjNiIsICJFeG8xIiwgIlRpcGluIiwgIkRzY2MxIiwgIkJsbSIsICIgQ2FzcDhhcDIiLCAiVXNwMSIsICJDbHNwbiIsICJQb2xhMSIsICJDaGFmMWIiLCAiQnJpcDEiLCAiRTJmOCIpCmcybS5nZW5lcyA8LSBjKCJIbWdiMiIsICJEZGsxIiwiTnVzYXAxIiwgIlViZTJjIiwgIkJpcmM1IiwgIlRweDIiLCAiVG9wMmEiLCAiTmRjODAiLCAiQ2tzMiIsICJOdWYyIiwgIkNrczFiIiwgIk1raTY3IiwgIlRtcG8iLCAiIENlbnBrIiwgIlRhY2MzIiwgIkZhbTY0YSIsICJTbWM0IiwgIkNjbmIyIiwgIkNrYXAybCIsICJDa2FwMiIsICJBdXJrYiIsICJCdWIxIiwgIktpZjExIiwgIkFucDMyZSIsICJUdWJiNGIiLCAiR3RzZTEiLCAia2lmMjBiIiwgIkhqdXJwIiwgIkNkY2EzIiwgIkhuMSIsICJDZGMyMCIsICJUdGsiLCAiQ2RjMjVjIiwgImtpZjJjIiwgIlJhbmdhcDEiLCAiTmNhcGQyIiwgIkRsZ2FwNSIsICJDZGNhMiIsICJDZGNhOCIsICJFY3QyIiwgIktpZjIzIiwgIkhtbXIiLCAiQXVya2EiLCAiUHNyYzEiLCAiQW5sbiIsICJMYnIiLCAiQ2thcDUiLCAiQ2VucGUiLCAiQ3RjZiIsICJOZWsyIiwgIkcyZTMiLCAiR2FzMmwzIiwgIkNieDUiLCAiQ2VucGEiKQoKUmF3LmRhdGEgPC0gQ2VsbEN5Y2xlU2NvcmluZyhvYmplY3QgPSBSYXcuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2VuZXMgPSBzLmdlbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZzJtLmdlbmVzID0gZzJtLmdlbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmlkZW50ID0gVFJVRSkKICAKYGBgCgpgYGB7cn0KIyBSZWdyZXNzZS1vdXQgdW5pbnRlcnJlc3Rpbmcgc291cmNlIG9mIHZhcmlhdGlvbiBhbmQgc2NhbGUgdGhlIGV4cHJlc3Npb24gbWF0cml4ClJhdy5kYXRhQG1ldGEuZGF0YSRDQy5EaWZmZXJlbmNlIDwtIFJhdy5kYXRhQG1ldGEuZGF0YSRTLlNjb3JlIC0gUmF3LmRhdGFAbWV0YS5kYXRhJEcyTS5TY29yZQpSYXcuZGF0YSA8LSBTY2FsZURhdGEob2JqZWN0ID0gUmF3LmRhdGEsCiAgICAgICAgICAgICAgICAgICAgIHZhcnMudG8ucmVncmVzcyA9IGMoIkNDLkRpZmZlcmVuY2UiLCJwZXJjZW50Lm1pdG8iLCJuR2VuZSIsICJuVU1JIiksCiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkucHJvZ3Jlc3MgPSBGKQpgYGAKCiMjIEV4Y2x1ZGUgdGhlIGluZmVyZWQgZG91YmxldHMKCmBgYHtyfQojUmVtb3ZlIFNjcnVibGV0IGluZmVyZWQgZG91YmxldHMKVmFsaWQuQ2VsbHMgPC0gcm93bmFtZXMoUmF3LmRhdGFAbWV0YS5kYXRhW1Jhdy5kYXRhQG1ldGEuZGF0YSRQcmVkaWN0ZWRfZG91YmxldHMgPT0gIlNpbmdsZXQiLF0pCgojTWFudWFsIHJlbW92YWwgb2YgOSBjZWxscyBkdXJpbmcgdGhlIGluaXRpYWwgc3ByaW5nIHZpc3VhbGlzYXRpb24KbWFudWFsLnJlbW92ZWQgPC0gcmVhZC50YWJsZSgiLi8xLVF1YWxpdHlDb250cm9sL1NwcmluZ0Nvb3JkaW5hdGVzL1NwcmluZy5vdXRseWVyLmNzdiIsIGhlYWRlciA9IFQsIHNlcCA9ICI7IikKQ2VsbHMudG8ua2VlcCA8LSBWYWxpZC5DZWxsc1shVmFsaWQuQ2VsbHMgJWluJSBtYW51YWwucmVtb3ZlZCRCYXJjb2RlXQoKUmF3LmRhdGFAbWV0YS5kYXRhJENlbGxzLnRvLmtlZXAgPC0gcm93bmFtZXMoUmF3LmRhdGFAbWV0YS5kYXRhKSAlaW4lIENlbGxzLnRvLmtlZXAKUUNGaWx0ZXJlZC5kYXRhIDwtIFN1YnNldERhdGEoUmF3LmRhdGEsICBjZWxscy51c2UgPSBDZWxscy50by5rZWVwLCBzdWJzZXQucmF3ID0gVCwgIGRvLmNsZWFuID0gRikKYGBgCgpgYGB7cn0Kcm0obGlzdCA9IGxzKClbIWxzKCkgJWluJSAiUUNGaWx0ZXJlZC5kYXRhIl0pCmBgYAoKIyBHZW5lcmF0ZSBTcHJpbmcgcHJvamVjdGlvbgoKIyMgRXhwb3J0IGNvdW50IG1hdHJpeCB1c2UgYXMgaW5wdXQgdG8gU1BSSU5HCmBgYHtyfQojIEV4cG9ydCByYXcgZXhwcmVzc2lvbiBtYXRyaXggYW5kIGdlbmUgbGlzdCB0byByZWdlbmVyYXRlIGEgc3ByaW5nIHBsb3QKZXhwckRhdGEgPC0gTWF0cml4KGFzLm1hdHJpeChRQ0ZpbHRlcmVkLmRhdGFAcmF3LmRhdGEpLCBzcGFyc2UgPSBUUlVFKQp3cml0ZU1NKGV4cHJEYXRhLCAiLi8xLVF1YWxpdHlDb250cm9sL1NwcmluZ0Nvb3JkaW5hdGVzL0V4cHJEYXRhLm10eCIpCgpHZW5lbGlzdCA8LSByb3cubmFtZXMoUUNGaWx0ZXJlZC5kYXRhQHJhdy5kYXRhKQp3cml0ZS50YWJsZShHZW5lbGlzdCwgIi4vMS1RdWFsaXR5Q29udHJvbC9TcHJpbmdDb29yZGluYXRlcy9HZW5lbGlzdC5jc3YiLCBzZXA9Ilx0IiwgY29sLm5hbWVzID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgpTcHJpbmcgY29vcmRpbmF0ZXMgd2VyZSBnZW5lcmF0ZWQgdXNpbmcgdGhlIG9ubGluZSB2ZXJzaW9uIG9mIFtTUFJJTkddKGh0dHBzOi8va2xlaW50b29scy5obXMuaGFydmFyZC5lZHUvdG9vbHMvc3ByaW5nLmh0bWwpIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIDoKCmBgYApOdW1iZXIgb2YgY2VsbHM6IDQyMjUKTnVtYmVyIG9mIGdlbmVzIHRoYXQgcGFzc2VkIGZpbHRlcjogMTQwMApNaW4gZXhwcmVzc2luZyBjZWxscyAoZ2VuZSBmaWx0ZXJpbmcpOiAzCk1pbiBudW1iZXIgb2YgVU1JcyAoZ2VuZSBmaWx0ZXJpbmcpOiAzCkdlbmUgdmFyaWFiaWxpdHkgJWlsZSAoZ2VuZSBmaWx0ZXJpbmcpOiA5MApOdW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHM6IDI1Ck51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9yczogOApOdW1iZXIgb2YgZm9yY2UgbGF5b3V0IGl0ZXJhdGlvbnM6IDUwMApgYGAKCiMjIEltcG9ydCBTUFJJTkcgY29vcmRpbmF0ZXMKCmBgYHtyfQojIEltcG9ydCBTcHJpbmcgY29vcmRpbmF0ZXMKQ29vcmRpbmF0ZXMgPC0gcmVhZC50YWJsZSgiLi8xLVF1YWxpdHlDb250cm9sL1NwcmluZ0Nvb3JkaW5hdGVzL0FsbGNlbGxzX1NwcmluZ0Nvb3JkaW5hdGVzLnR4dCIsIHNlcD0iLCIsIGhlYWRlciA9IEYpWyxjKDIsMyldCnJvd25hbWVzKENvb3JkaW5hdGVzKSA8LSBjb2xuYW1lcyhRQ0ZpbHRlcmVkLmRhdGFAZGF0YSkKUUNGaWx0ZXJlZC5kYXRhIDwtIFNldERpbVJlZHVjdGlvbihRQ0ZpbHRlcmVkLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbi50eXBlID0gInNwcmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QgPSAiY2VsbC5lbWJlZGRpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LmRhdGEgPSBhcy5tYXRyaXgoQ29vcmRpbmF0ZXMpKQpRQ0ZpbHRlcmVkLmRhdGFAZHIkc3ByaW5nQGtleSA8LSAic3ByaW5nIgpjb2xuYW1lcyhRQ0ZpbHRlcmVkLmRhdGFAZHIkc3ByaW5nQGNlbGwuZW1iZWRkaW5ncykgPC0gcGFzdGUwKEdldERpbVJlZHVjdGlvbihvYmplY3Q9UUNGaWx0ZXJlZC5kYXRhLCByZWR1Y3Rpb24udHlwZSA9ICJzcHJpbmciLHNsb3QgPSAia2V5IiksIGMoMSwyKSkKYGBgCgoKYGBge3J9CiMgU3ltbWV0cnkgdHJhbnNmb3JtIG9mIHRoZSBjb29yZGluYXRlcwpTcHJpbmcuU3ltIDwtIGZ1bmN0aW9uKHgpewogIHggPSBhYnMobWF4KFFDRmlsdGVyZWQuZGF0YUBkciRzcHJpbmdAY2VsbC5lbWJlZGRpbmdzWywyXSkteCkKIH0KClFDRmlsdGVyZWQuZGF0YUBkciRzcHJpbmdAY2VsbC5lbWJlZGRpbmdzWywyXSA8LSBzYXBwbHkoUUNGaWx0ZXJlZC5kYXRhQGRyJHNwcmluZ0BjZWxsLmVtYmVkZGluZ3NbLDJdICwgZnVuY3Rpb24oeCkgU3ByaW5nLlN5bSh4KSkKUUNGaWx0ZXJlZC5kYXRhQGRyJHNwcmluZ0BjZWxsLmVtYmVkZGluZ3NbLDFdIDwtIHNhcHBseShRQ0ZpbHRlcmVkLmRhdGFAZHIkc3ByaW5nQGNlbGwuZW1iZWRkaW5nc1ssMV0gLCBmdW5jdGlvbih4KSBTcHJpbmcuU3ltKHgpKQpgYGAKCgojIFBsb3QgdGhlIFFDIGZpbHRlcmVkIGRhdGFzZXQKYGBge3IgZmlnLmRpbT1jKDUuMywgNCl9ClFDRmlsdGVyZWQuZGF0YSA8LSBTZXRBbGxJZGVudChRQ0ZpbHRlcmVkLmRhdGEsIGlkID0gIm9sZC5pZGVudCIpCnAgPC0gRGltUGxvdChRQ0ZpbHRlcmVkLmRhdGEsIAogICAgICAgICAgICAgcmVkdWN0aW9uLnVzZSA9ICJzcHJpbmciLAogICAgICAgICAgICAgY29scy51c2UgPSAiIzk2OTY5NiIsCiAgICAgICAgICAgICBkaW0uMSA9IDEsIAogICAgICAgICAgICAgZGltLjIgPSAyLAogICAgICAgICAgICAgZG8ubGFiZWw9IEYsCiAgICAgICAgICAgICBuby5sZWdlbmQgPSBULAogICAgICAgICAgICAgZG8ucmV0dXJuID0gVCkKCm5jZWxscyA8LSBkaW0oUUNGaWx0ZXJlZC5kYXRhQGRhdGEpWzJdCm5nZW5lcyA8LSBkaW0oUUNGaWx0ZXJlZC5kYXRhQGRhdGEpWzFdCgpwICsgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSBwYXN0ZTAobmNlbGxzLCIgY2VsbHNcbiIsIG5nZW5lcywiIGdlbmVzIiksIHggPSA1MDAsIHkgPSA0MDApCmBgYAoKYGBge3J9CnJtKGxpc3QgPSBscygpWyFscygpICVpbiUgIlFDRmlsdGVyZWQuZGF0YSJdKQpgYGAKCiMgU2F2ZSBTZXVyYXQgb2JqZWN0CmBgYHtyfQpzYXZlUkRTKFFDRmlsdGVyZWQuZGF0YSwgIi4vUUMuZmlsdGVyZWQuY2VsbHMuUkRTIikKYGBgCgoKIyBTZXNzaW9uIEluZm8KYGBge3J9CiNkYXRlCmZvcm1hdChTeXMudGltZSgpLCAiJWQgJUIsICVZLCAlSCwlTSIpCgojUGFja2FnZXMgdXNlZApzZXNzaW9uSW5mbygpCmBgYAo=