Click Here to Return to Previous Page
This file contains statistics and figures from the paper, “Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma
Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.
The paper can be found here:
Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution
Single cell transcriptomic profile of
the whole vomeronasal organ
What cell types, in what quantities, do we find in the whole
VNO?
[1] "There are 34519 cells in the whole VNO dataset."
V1R_mVSN
13201
V2R_mVSN
4366
SUS
3889
sVSN
2601
V1R_iVSN
1794
V2R_iVSN
1582
Microglia
1366
Immune_Fpr
1222
LP
1072
HBC
912
INP
528
Microglia_rp
455
mOSN
430
T_cells
313
Endothelial
251
OEC
220
GBC
218
MV
99
2D PCA of Clusters
2D PCA of Cell-Types
2D UMAP Clusters
2D UMAP visualization of integrated Cell-Type
clusters for whole-VNO single-cell RNA-seq
In two-dimensional UMAP space, 18 cell clusters can be clearly
identified.
Cell-type marker-gene normalized expression across the cell
clusters
These clusters were curated using known cell markers (Fig. 1b).
UMAP of cell-type clusters split by age
UMAP of cell-type clusters split by sex
Spatial location of individual VNO cells color-coded according to
cell type prediction based on the spatial transcriptomic analysis
Location of cell belonging to HBC, GBC, INP, and LP cell types,
respectively. Heat indicates confidence of predicted values
LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSAxIgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30KCmNhdCgiPGJ1dHRvbiBvbmNsaWNrPSdoaXN0b3J5LmJhY2soKScgc3R5bGU9J2ZvbnQtc2l6ZTogMjBweDsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDVweDsnPkNsaWNrIEhlcmUgdG8gUmV0dXJuIHRvIFByZXZpb3VzIFBhZ2U8L2J1dHRvbj4iKQoKYGBgCgpgYGB7ciwgZW5naW5lPSdjc3MnLCBlY2hvID0gRkFMU0V9CgoubmF2LXBpbGxzID4gbGkgPiBhIHsKICBjb2xvcjogYmxhY2s7IC8qIFNldCBpbmFjdGl2ZSB0YWIgdGV4dCBjb2xvciB0byBibGFjayAqLwp9CgoubmF2LXBpbGxzID4gbGkgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkgPiBhOmZvY3VzLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYSwKLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmZvY3VzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgLyogU2V0IGhvdmVyIGJhY2tncm91bmQgY29sb3IgdG8gYSBkYXJrZXIgZ3JheSAqLwogIGNvbG9yOiB3aGl0ZTsgLyogU2V0IGhvdmVyIHRleHQgY29sb3IgdG8gd2hpdGUgZm9yIGJldHRlciBjb250cmFzdCAqLwp9CiAgICAgCmBgYAogIAogIAo+VGhpcyBmaWxlIGNvbnRhaW5zIHN0YXRpc3RpY3MgYW5kIGZpZ3VyZXMgZnJvbSB0aGUgcGFwZXIsICJNb2xlY3VsYXIsIENlbGx1bGFyLCBhbmQgRGV2ZWxvcG1lbnRhbCBPcmdhbml6YXRpb24gb2YgdGhlIE1vdXNlIFZvbWVyb25hc2FsIG9yZ2FuIGF0IFNpbmdsZSBDZWxsIFJlc29sdXRpb24iIGJ5IE1heCBIaWxscyBKci4sIExpbWVpIE1hLCBBaSBGYW5nLCBUaGVsbWEgQ2hpcmVtYmEsIFNldGggTWFsbG95LCBBbGxpc29uIFNjb3R0LCBBbm9qYSBQZXJlcmEsIGFuZCBDLiBSb24gWXUuICAgIAoKVGhlIHBhcGVyIGNhbiBiZSBmb3VuZCBoZXJlOiAgCgpbTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uXShodHRwczovL2VsaWZlc2NpZW5jZXMub3JnL3Jldmlld2VkLXByZXByaW50cy85NzM1NiN0YWItY29udGVudCkKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKIyBSLU1hcmtkb3duIEdsb2JhbCBTZXR0aW5ncyAgCgojIFNldC11cCBhIGRlZmF1bHQgaW1hZ2Ugc2l6ZSBvZiAxMCBYIDEwIGluY2hlcy4gU3VwcHJlc3Mgd2FybmluZwojIGFuZCBlcnJvciBtZXNzYWdlcy4gSGlkZSBjb2RlLgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgY29tbWVudD0iIiwKICAgICAgICAgICAgICAgICAgICAgIGVycm9yPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTIsIGNhY2hlPUZBTFNFKQoKYGBgCgpgYGB7ciBsaWJyYXJpZXMsIGluY2x1ZGU9RkFMU0V9CgojIExpYnJhcnkgTG9hZGluZyAgCgpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkoa2l0KTsgbGlicmFyeSh0aWR5dmVyc2UpOyBsaWJyYXJ5KHN0cmluZ3IpOyBsaWJyYXJ5KHBsb3QzRCkgCiAgbGlicmFyeShnZ3Bsb3QyKTsgbGlicmFyeShkYXRhLnRhYmxlKTsgbGlicmFyeShvcmcuTW0uZWcuZGIpCiAgbGlicmFyeShkcGx5cik7IGxpYnJhcnkoU2V1cmF0KTsgbGlicmFyeShEQkkpOyBsaWJyYXJ5KGNvd3Bsb3QpCiAgbGlicmFyeShNYXRyaXgpOyBsaWJyYXJ5KGdsbUdhbVBvaSk7IGxpYnJhcnkoY2lyY2xpemUpCiAgbGlicmFyeSh0aWJibGUpOyBsaWJyYXJ5KGdncHVicik7IGxpYnJhcnkoc3ZnbGl0ZSk7IGxpYnJhcnkoZ2dzaWduaWYpCiAgbGlicmFyeShzdGF0cyk7IGxpYnJhcnkodmVnYW4pOyBsaWJyYXJ5KHNjYWxlcyk7IGxpYnJhcnkoY2FyZXQpCiAgbGlicmFyeShwYXRjaHdvcmspOyBsaWJyYXJ5KHBsb3RseSk7IGxpYnJhcnkoZ2VvbXRleHRwYXRoKQogIGxpYnJhcnkob3Blbnhsc3gpOyBsaWJyYXJ5KGdyaWRFeHRyYSk7IGxpYnJhcnkoZ2dyZXBlbCkKICBsaWJyYXJ5KEdlbmVPdmVybGFwKTsgbGlicmFyeShiaW9tYVJ0KTsgbGlicmFyeShnZ3BvaW50ZGVuc2l0eSkKICBsaWJyYXJ5KHNsaW5nc2hvdCk7IGxpYnJhcnkodHJhZGVTZXEpOyBsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQogIGxpYnJhcnkodmlyaWRpcyk7IGxpYnJhcnkoVXBTZXRSKTsgbGlicmFyeShwaGVhdG1hcCk7IGxpYnJhcnkobXNpZ2RicikKICBsaWJyYXJ5KGZnc2VhKTsgbGlicmFyeShncmlkKTsgbGlicmFyeShJRFBtaXNjKTsgbGlicmFyeShNQVNTKQogIGxpYnJhcnkoUm1pc2MpOyBsaWJyYXJ5KGdncGxvdGlmeSk7IGxpYnJhcnkoZ2dwbWlzYyk7IGxpYnJhcnkoc2NhbGVzKQogIGxpYnJhcnkoaGVhdG1hcGx5KTsgbGlicmFyeShkZW5kZXh0ZW5kKQp9KQoKYGBgCgpgYGB7cn0KCiMgR2xvYmFsIFZhcmlhYmxlcwoKIyBUaGUgaG9tZSBkaXJlY3RvcnkKaG9tZV9kaXIgPC0gIi9sL1l1L1l1TGFiL0Jpb2luZm9ybWF0aWNzL3Byb2plY3RzL21oaC9zY19WTk8vIgojIERpcmVjdG9yeSBmb3Igc3RvcmluZyBkYXRhIG9iamVjdHMgYXQgY3J1Y2lhbCBzdGFnZXMKb2JqZWN0X2RpciA8LSBwYXN0ZTAoaG9tZV9kaXIsImZpbmFsLnNldS5vYmpzLyIpCiMgRGlyZWN0b3J5IGZvciBpbWFnZXMgZnJvbSB0aGUgZmluYWwgYW5hbHlzaXMKaW1hZ2VfZGlyIDwtIHBhc3RlMChob21lX2RpciwiZmluYWxfaW1hZ2VzLyIpCmFkb2JlX2ltYWdlcyA8LSBwYXN0ZTAoaW1hZ2VfZGlyLCAiYWRvYmVfaWxsdXN0cmF0b3Jfc3ZnX2ZpbGVzLyIpCiMgRGlyZWN0b3J5IGZvciBpbWFnZXMgZm9yIHRoZSBmaW5hbCBwYXBlcgpjbHVzdHJlZV9kaXIgPC0gcGFzdGUwKGltYWdlX2RpciwiY2x1c3RyZWUvIikKIyBBIGRpcmVjdG9yeSBmb3IgVHJhZGVTZXEgZml0R0FNIG91dHB1dApmaXRHQU1fZGlyIDwtIHBhc3RlMChvYmplY3RfZGlyLCAiZml0R0FNLyIpCm1vZV9kaXIgPC0gIi9sL1l1L1l1TGFiL0Jpb2luZm9ybWF0aWNzL3Byb2plY3RzL21oaC9tb2xuZ18yNDA3XzI0NTMvUl9vYmovIgoKIyBPUEVOIGBgYHZuby5zZXUuaW50ZWdyYXRlZGBgYApsb2FkKGZpbGUgPSBwYXN0ZTAob2JqZWN0X2Rpciwidm5vLmludGVncmF0ZWQucG9zdENlbGxJRCIpKQojTG9hZCBOZXVyb25hbCBMaW5lYWdlIFNldXJhdCBPYmplY3QgIApsb2FkKGZpbGUgPSBwYXN0ZTAob2JqZWN0X2RpciwibmV1cm9uLmludGVncmF0ZWQucG9zdENlbGxJRCIpKQoKIyBSZW5hbWUgdW5rbm93bl9tVlNOIHRvIHNWU04KbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2xldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHMobmV1cm9uLmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVtsZXZlbHMobmV1cm9uLmludGVncmF0ZWRAYWN0aXZlLmlkZW50KT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZSlbbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyhuZXVyb24uaW50ZWdyYXRlZCRjZWxsX3R5cGUpW2xldmVscyhuZXVyb24uaW50ZWdyYXRlZCRjZWxsX3R5cGUpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCgojIEdldCBjb2xvciBzY2hlbWUgZm9yIHRoZSB3aG9sZSB2bm8gZGF0YXNldAp2bm8uY2VsbF90eXBlLmNvbG9ycyA8LSBodWVfcGFsKCkobGVuZ3RoKGxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KSkpCm5hbWVzKHZuby5jZWxsX3R5cGUuY29sb3JzKSA8LSBsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkKCiMgS2VlcCBuZXVyb24gZGF0YXNldCBjb2xvciBzY2hlbWUgY29uc2lzdGVudCB3aXRoIHRoZSB3aG9sZSB2bm8gY29sb3Igc2NoZW1lLCB3aGVyZSBwb3NzaWJsZSAgCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIHZuby5jZWxsX3R5cGUuY29sb3JzW2MoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIsIlYxUl9pVlNOIiwiVjJSX2lWU04iLCJHQkMiKV0KbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMgPC0gc2V0TmFtZXMoYyhuZXVyb24uY2VsbF90eXBlLmNvbG9ycywiIzAwQjBGNiIsIiM5NTkwRkYiLCIjRTc2QkYzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMobmFtZXMobmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMpLCJpT1NOIiwibGF0ZV9JTlAiLCJlYXJseV9JTlAiKSkKCm1hdHVyZS5uZXVyb25zIDwtIHN1YnNldChuZXVyb24uaW50ZWdyYXRlZCxpZGVudHM9YygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIikpCm1hdHVyZS5jZWxsX3R5cGUuY29sb3JzIDwtIG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzW2MoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpXQoKZ2xvYmFsLnZhcnMgPC0gYyhscygpLCJnbG9iYWwudmFycyIpCgpgYGAKCioqKiAgCgojIFNpbmdsZSBjZWxsIHRyYW5zY3JpcHRvbWljIHByb2ZpbGUgb2YgdGhlIHdob2xlIHZvbWVyb25hc2FsIG9yZ2FuIHsudGFic2V0IC50YWJzZXQtcGlsbHN9ICAKCiMjIFdoYXQgY2VsbCB0eXBlcywgaW4gd2hhdCBxdWFudGl0aWVzLCBkbyB3ZSBmaW5kIGluIHRoZSB3aG9sZSBWTk8/ICAKCmBgYHtyfQoKcHJpbnQocGFzdGUoIlRoZXJlIGFyZSIsZGltKHZuby5zZXUuaW50ZWdyYXRlZClbMl0sImNlbGxzIGluIHRoZSB3aG9sZSBWTk8gZGF0YXNldC4iKSkKa25pdHI6OmthYmxlKHNvcnQodGFibGUodm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZSksIGRlY3JlYXNpbmcgPSBUUlVFKSxjb2wubmFtZXM9YygiY2VsbCB0eXBlIiwibkNlbGxzIikpCgpgYGAKCiMjIDJEIFBDQSBvZiBDbHVzdGVycyAgCgpgYGB7cn0KCnZuby5zZXUuaW50ZWdyYXRlZCRzZXVyYXRfY2x1c3RlcnMgPC0gZmFjdG9yKHZuby5zZXUuaW50ZWdyYXRlZCRzZXVyYXRfY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1hcy5jaGFyYWN0ZXIoMDozMCkpCgpgYGAKCgpgYGB7cn0KCklkZW50cyh2bm8uc2V1LmludGVncmF0ZWQpIDwtIHZuby5zZXUuaW50ZWdyYXRlZCRzZXVyYXRfY2x1c3RlcnMKdm5vLjJkLmNsdXN0ZXIucGNhIDwtIERpbVBsb3Qodm5vLnNldS5pbnRlZ3JhdGVkLCByZWR1Y3Rpb249InBjYSIsIGxhYmVsPVRSVUUsIHNodWZmbGU9VFJVRSwgcmVwZWw9VFJVRSwgcHQuc2l6ZT0xLjI1KSArCiAgZ2d0aXRsZSgiVk5PIFBDQSBDbHVzdGVycyIpCgp2bm8uMmQuY2x1c3Rlci5wY2EKCmBgYAoKIyMgMkQgUENBIG9mIENlbGwtVHlwZXMgIAoKYGBge3J9CgpJZGVudHModm5vLnNldS5pbnRlZ3JhdGVkKSA8LSB2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlCnZuby4yZC5jbHVzdGVyLnBjYSA8LSBEaW1QbG90KHZuby5zZXUuaW50ZWdyYXRlZCwgcmVkdWN0aW9uPSJwY2EiLCBsYWJlbD1UUlVFLCBzaHVmZmxlPVRSVUUsIHJlcGVsPVRSVUUsIHB0LnNpemU9MS4yNSkgKwogIGdndGl0bGUoIlZOTyBQQ0EgQ2VsbC1UeXBlcyIpCgp2bm8uMmQuY2x1c3Rlci5wY2EKCmBgYAoKIyMgM0QgUENBIG9mIENsdXN0ZXJzICAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgojIFByZXBhcmUgYSBkYXRhZnJhbWUgZm9yIGNlbGwgcGxvdHRpbmcuIFRoZSBsYXN0IGNvbHVtbiB3aWxsIGRldGVybWluZSB0aGUgY29sb3Igb2YgdGhlIGRhdGFwb2ludHMuCnZuby4zZC5wY2EuZGYgPC0gRmV0Y2hEYXRhKG9iamVjdCA9IHZuby5zZXUuaW50ZWdyYXRlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMgPSBjKCJQQ18xIiwgIlBDXzIiLCAiUENfMyIsICJzZXVyYXRfY2x1c3RlcnMiKSkKCmBgYAoKYGBge3J9CgojIFNvcnQgdGhlIGNsdXN0ZXIgbGV2ZWxzIG51bWVyaWNhbGx5CnNvcnRlZF9sZXZlbHMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyh2bm8uM2QucGNhLmRmJHNldXJhdF9jbHVzdGVycykpKQoKIyBTZXQgdGhlIHNldXJhdF9jbHVzdGVycyB0byBiZSBhIGZhY3RvciB3aXRoIHNvcnRlZCBsZXZlbHMKdm5vLjNkLnBjYS5kZiRzZXVyYXRfY2x1c3RlcnMgPC0gZmFjdG9yKHZuby4zZC5wY2EuZGYkc2V1cmF0X2NsdXN0ZXJzLCBsZXZlbHMgPSBzb3J0ZWRfbGV2ZWxzKQoKYGBgCgpgYGB7cn0KCm5Db2xvcnMuY2x1c3RlcnMgPC0gbGVuZ3RoKHNvcnRlZF9sZXZlbHMpCnZuby5jbHVzdGVyLmNvbG9ycyA8LSBodWVfcGFsKCkobkNvbG9ycy5jbHVzdGVycykKCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCiMgUGxvdCB3aXRoIHNtYWxsZXIgbWFya2VyIHNpemUKcCA8LSBwbG90X2x5KGRhdGEgPSB2bm8uM2QucGNhLmRmLAogICAgICAgICAgICAgeCA9IH5QQ18xLCB5ID0gflBDXzIsIHogPSB+UENfMywKICAgICAgICAgICAgIGNvbG9yID0gfnNldXJhdF9jbHVzdGVycywKICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgICAgICBjb2xvcnMgPSB2bm8uY2x1c3Rlci5jb2xvcnMsCiAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAyKSwKICAgICAgICAgICAgIHRleHQgPSB+c2V1cmF0X2NsdXN0ZXJzLAogICAgICAgICAgICAgaG92ZXJpbmZvPSJ0ZXh0IikgJT4lCiAgCiAgIyBMYXlvdXQKICBsYXlvdXQoCiAgICB0aXRsZSA9ICJWTk8gUENBIENsdXN0ZXJzIiwKICAgIGxlZ2VuZCA9IGxpc3QoCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0PSc8Yj4gQ2x1c3RlcnMgPC9iPicpLAogICAgICBpdGVtc2l6aW5nID0gJ2NvbnN0YW50JwogICAgKQogICkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xNX0KCnAKCmBgYAoKIyMgM0QgUENBIG9mIENlbGwtVHlwZXMgIAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCiMgUHJlcGFyZSBhIGRhdGFmcmFtZSBmb3IgY2VsbCBwbG90dGluZy4gVGhlIGxhc3QgY29sdW1uIHdpbGwgZGV0ZXJtaW5lIHRoZSBjb2xvciBvZiB0aGUgZGF0YXBvaW50cy4Kdm5vLjNkLnBjYS5kZiA8LSBGZXRjaERhdGEob2JqZWN0ID0gdm5vLnNldS5pbnRlZ3JhdGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycyA9IGMoIlBDXzEiLCAiUENfMiIsICJQQ18zIiwgImNlbGxfdHlwZSIpKQoKYGBgCgpgYGB7cn0KCiMgU29ydCB0aGUgY2x1c3RlciBsZXZlbHMgbnVtZXJpY2FsbHkKc29ydGVkX2xldmVscyA8LSBsZXZlbHModm5vLjNkLnBjYS5kZiRjZWxsX3R5cGUpCiMgU2V0IHRoZSBzZXVyYXRfY2x1c3RlcnMgdG8gYmUgYSBmYWN0b3Igd2l0aCBzb3J0ZWQgbGV2ZWxzCnZuby4zZC5wY2EuZGYkY2VsbF90eXBlIDwtIGZhY3Rvcih2bm8uM2QucGNhLmRmJGNlbGxfdHlwZSwgbGV2ZWxzID0gc29ydGVkX2xldmVscykKCmBgYAoKYGBge3J9CgpuQ29sb3JzLmNsdXN0ZXJzIDwtIGxlbmd0aChzb3J0ZWRfbGV2ZWxzKQp2bm8uY2x1c3Rlci5jb2xvcnMgPC0gaHVlX3BhbCgpKG5Db2xvcnMuY2x1c3RlcnMpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgojIFBsb3Qgd2l0aCBzbWFsbGVyIG1hcmtlciBzaXplCnAgPC0gcGxvdF9seShkYXRhID0gdm5vLjNkLnBjYS5kZiwKICAgICAgICAgICAgIHggPSB+UENfMSwgeSA9IH5QQ18yLCB6ID0gflBDXzMsCiAgICAgICAgICAgICBjb2xvciA9IH5jZWxsX3R5cGUsCiAgICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgICAgICAgY29sb3JzID0gdm5vLmNsdXN0ZXIuY29sb3JzLAogICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMiksCiAgICAgICAgICAgICB0ZXh0ID0gfmNlbGxfdHlwZSwKICAgICAgICAgICAgIGhvdmVyaW5mbz0idGV4dCIpICU+JQogIAogICMgTGF5b3V0CiAgbGF5b3V0KAogICAgdGl0bGUgPSAiVk5PIFBDQSBDZWxsLVR5cGVzIiwKICAgIGxlZ2VuZCA9IGxpc3QoCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0PSc8Yj4gQ2VsbC1UeXBlIDwvYj4nKSwKICAgICAgaXRlbXNpemluZyA9ICdjb25zdGFudCcKICAgICkKICApCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTV9CgojIFBsb3QgdGhlIG91dHB1dApwCgpgYGAKCiMjIDJEIFVNQVAgQ2x1c3RlcnMgIAoKYGBge3J9CgpJZGVudHModm5vLnNldS5pbnRlZ3JhdGVkKSA8LSB2bm8uc2V1LmludGVncmF0ZWQkc2V1cmF0X2NsdXN0ZXJzCgpmaWdfMUEgPC0gRGltUGxvdCh2bm8uc2V1LmludGVncmF0ZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFLCBzaHVmZmxlID0gVFJVRSkgKwogIGdndGl0bGUoIlZOTyBDbHVzdGVycyIpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpmaWdfMUEKCmBgYAoKIyMgMkQgVU1BUCB2aXN1YWxpemF0aW9uIG9mIGludGVncmF0ZWQgKipDZWxsLVR5cGUqKiBjbHVzdGVycyBmb3Igd2hvbGUtVk5PIHNpbmdsZS1jZWxsIFJOQS1zZXEgIAoKPkluIHR3by1kaW1lbnNpb25hbCBVTUFQIHNwYWNlLCAxOCBjZWxsIGNsdXN0ZXJzIGNhbiBiZSBjbGVhcmx5IGlkZW50aWZpZWQuCgpgYGB7cn0KCklkZW50cyh2bm8uc2V1LmludGVncmF0ZWQpIDwtIHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUKCmZpZzFfYSA8LSBEaW1QbG90KHZuby5zZXUuaW50ZWdyYXRlZCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFRSVUUsIHNodWZmbGUgPSBUUlVFKSArCiAgZ2d0aXRsZSgiVm9tZXJvbmFzYWwgT3JnYW4gQ2VsbCBDbHVzdGVycyIpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWcxX2Euc3ZnIiksIHdpZHRoPTEwLCBoZWlnaHQ9OCkKZmlnMV9hCmludmlzaWJsZShkZXYub2ZmKCkpCmZpZzFfYQoKYGBgCgojIyAzRCBVTUFQIENsdXN0ZXJzICAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpEZWZhdWx0QXNzYXkodm5vLnNldS5pbnRlZ3JhdGVkKSA8LSAiaW50ZWdyYXRlZCIKIyBSZS1ydW4gVU1BUCBpbiA1MCBkaW1lbnNpb25zIGFuZCByZXRhaW4gY2FsY3VsYXRpb25zIGZvciB0aGUgZmlyc3QgMyBkaW1lbnNpb25zCnZuby4zZC51bWFwLnNldSA8LSBSdW5VTUFQKHZuby5zZXUuaW50ZWdyYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5jb21wb25lbnRzID0gM0wpCgojIFByZXBhcmUgYSBkYXRhZnJhbWUgZm9yIGNlbGwgcGxvdHRpbmcuIFRoZSBsYXN0IGNvbHVtbiB3aWxsIGRldGVybWluZSB0aGUgY29sb3Igb2YgdGhlIGRhdGFwb2ludHMuCnZuby4zZC51bWFwLmRmIDwtIEZldGNoRGF0YShvYmplY3Q9dm5vLjNkLnVtYXAuc2V1LHZhcnM9YygiVU1BUF8xIiwiVU1BUF8yIiwiVU1BUF8zIiwic2V1cmF0X2NsdXN0ZXJzIikpCgpybSh2bm8uM2QudW1hcC5zZXUpOyBpbnZpc2libGUoZ2MoKSkKCmBgYAoKYGBge3J9CgojIFNvcnQgdGhlIGNsdXN0ZXIgbGV2ZWxzIG51bWVyaWNhbGx5CnNvcnRlZF9sZXZlbHMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyh2bm8uM2QudW1hcC5kZiRzZXVyYXRfY2x1c3RlcnMpKSkKCiMgU2V0IHRoZSBzZXVyYXRfY2x1c3RlcnMgdG8gYmUgYSBmYWN0b3Igd2l0aCBzb3J0ZWQgbGV2ZWxzCnZuby4zZC51bWFwLmRmJHNldXJhdF9jbHVzdGVycyA8LSBmYWN0b3Iodm5vLjNkLnVtYXAuZGYkc2V1cmF0X2NsdXN0ZXJzLCBsZXZlbHMgPSBzb3J0ZWRfbGV2ZWxzKQoKYGBgCgpgYGB7cn0KCm5Db2xvcnMuY2x1c3RlcnMgPC0gbGVuZ3RoKGxldmVscyh2bm8uM2QudW1hcC5kZiRzZXVyYXRfY2x1c3RlcnMpKQp2bm8uY2x1c3Rlci5jb2xvcnMgPC0gaHVlX3BhbCgpKG5Db2xvcnMuY2x1c3RlcnMpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgojIFBsb3Qgd2l0aCBzbWFsbGVyIG1hcmtlciBzaXplCnZuby4zZC51bWFwLmNsdXN0ZXIgPC0gcGxvdF9seShkYXRhID0gdm5vLjNkLnVtYXAuZGYsCiAgICAgICAgICAgICAgIHggPSB+VU1BUF8xLCB5ID0gflVNQVBfMiwgeiA9IH5VTUFQXzMsCiAgICAgICAgICAgICAgIGNvbG9yID0gfnNldXJhdF9jbHVzdGVycywKICAgICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgICAgICAgICBjb2xvcnMgPSB2bm8uY2x1c3Rlci5jb2xvcnMsCiAgICAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDIpLAogICAgICAgICAgICAgICB0ZXh0ID0gfnNldXJhdF9jbHVzdGVycywKICAgICAgICAgICAgICAgaG92ZXJpbmZvPSJ0ZXh0IiwKICAgICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IFRSVUUpICU+JSAgIyBIaWRlIGxlZ2VuZCBmb3Igb3JpZ2luYWwgdHJhY2UKICAKICAjIExheW91dAogIGxheW91dCgKICAgIHRpdGxlID0gIlZOTyBVTUFQIENsdXN0ZXJzIiwKICAgIGxlZ2VuZCA9IGxpc3QoCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0PSc8Yj4gQ2x1c3RlcnMgPC9iPicpLAogICAgICBpdGVtc2l6aW5nID0gJ2NvbnN0YW50JwogICAgKQogICkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xNX0KCnZuby4zZC51bWFwLmNsdXN0ZXIKCmBgYAoKIyMgM0QgVU1BUCBDZWxsLXR5cGVzICAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpEZWZhdWx0QXNzYXkodm5vLnNldS5pbnRlZ3JhdGVkKSA8LSAiaW50ZWdyYXRlZCIKIyBSZS1ydW4gVU1BUCBpbiA1MCBkaW1lbnNpb25zIGFuZCByZXRhaW4gY2FsY3VsYXRpb25zIGZvciB0aGUgZmlyc3QgMyBkaW1lbnNpb25zCnZuby4zZC51bWFwLnNldSA8LSBSdW5VTUFQKHZuby5zZXUuaW50ZWdyYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcyA9IDE6MjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uY29tcG9uZW50cyA9IDNMKQoKIyBQcmVwYXJlIGEgZGF0YWZyYW1lIGZvciBjZWxsIHBsb3R0aW5nLiBUaGUgbGFzdCBjb2x1bW4gd2lsbCBkZXRlcm1pbmUgdGhlIGNvbG9yIG9mIHRoZSBkYXRhcG9pbnRzLgp2bm8uM2QudW1hcC5kZiA8LSBGZXRjaERhdGEob2JqZWN0PXZuby4zZC51bWFwLnNldSx2YXJzPWMoIlVNQVBfMSIsIlVNQVBfMiIsIlVNQVBfMyIsImNlbGxfdHlwZSIpKQoKcm0odm5vLjNkLnVtYXAuc2V1KTsgaW52aXNpYmxlKGdjKCkpCgpgYGAKCmBgYHtyfQoKIyBTb3J0IHRoZSBjbHVzdGVyIGxldmVscyBudW1lcmljYWxseQpzb3J0ZWRfbGV2ZWxzIDwtIGxldmVscyh2bm8uM2QudW1hcC5kZiRjZWxsX3R5cGUpCiMgU2V0IHRoZSBzZXVyYXRfY2x1c3RlcnMgdG8gYmUgYSBmYWN0b3Igd2l0aCBzb3J0ZWQgbGV2ZWxzCnZuby4zZC51bWFwLmRmJGNlbGxfdHlwZSA8LSBmYWN0b3Iodm5vLjNkLnVtYXAuZGYkY2VsbF90eXBlLCBsZXZlbHMgPSBzb3J0ZWRfbGV2ZWxzKQoKYGBgCgpgYGB7cn0KCm5Db2xvcnMuY2x1c3RlcnMgPC0gbGVuZ3RoKGxldmVscyh2bm8uM2QudW1hcC5kZiRjZWxsX3R5cGUpKQp2bm8uY2x1c3Rlci5jb2xvcnMgPC0gaHVlX3BhbCgpKG5Db2xvcnMuY2x1c3RlcnMpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgojIFBsb3Qgd2l0aCBzbWFsbGVyIG1hcmtlciBzaXplCnZuby4zZC51bWFwLmNsdXN0ZXIgPC0gcGxvdF9seShkYXRhID0gdm5vLjNkLnVtYXAuZGYsCiAgICAgICAgICAgICAgIHggPSB+VU1BUF8xLCB5ID0gflVNQVBfMiwgeiA9IH5VTUFQXzMsCiAgICAgICAgICAgICAgIGNvbG9yID0gfmNlbGxfdHlwZSwKICAgICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgICAgICAgICBjb2xvcnMgPSB2bm8uY2x1c3Rlci5jb2xvcnMsCiAgICAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDIpLAogICAgICAgICAgICAgICB0ZXh0ID0gfmNlbGxfdHlwZSwKICAgICAgICAgICAgICAgaG92ZXJpbmZvPSJ0ZXh0IiwKICAgICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IFRSVUUpICU+JQogICMgTGF5b3V0CiAgbGF5b3V0KAogICAgdGl0bGUgPSAiVk5PIFVNQVAgQ2VsbC1UeXBlcyIsCiAgICBsZWdlbmQgPSBsaXN0KAogICAgICB0aXRsZSA9IGxpc3QodGV4dD0nPGI+IENlbGwtVHlwZSA8L2I+JyksCiAgICAgIGl0ZW1zaXppbmcgPSAnY29uc3RhbnQnCiAgICApCiAgKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTE1fQoKdm5vLjNkLnVtYXAuY2x1c3RlcgoKYGBgCgojIyBDZWxsLXR5cGUgbWFya2VyLWdlbmUgbm9ybWFsaXplZCBleHByZXNzaW9uIGFjcm9zcyB0aGUgY2VsbCBjbHVzdGVycyAgCgo+VGhlc2UgY2x1c3RlcnMgd2VyZSBjdXJhdGVkIHVzaW5nIGtub3duIGNlbGwgbWFya2VycyAoRmlnLiAxYikuCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCiMgT3VyIG1hcmtlciBnZW5lcyB0byBwbG90ICAKcGxvdC5nZW5lcyA8LSBjKCJPbXAiLCJHbmFpMiIsIkduZzEzIiwiTWVpczIiLCJHbmFvMSIsIlJvYm8yIiwiVGZhcDJlIiwiR25hbCIsIkNuZ2EyIiwiUDJyeTE0IiwiWGlzdCIsCiAgICAgICAgICAgICAgICAiR2FwNDMiLCJTdG1uMiIsIk5ldXJvZzEiLCJOZXVyb2QxIiwiQ2NuZDEiLCJBc2NsMSIsIktydDUiLCJLcnQxNSIsIlNveDkiLCJIZXBhY2FtMiIsCiAgICAgICAgICAgICAgICAiRmV6ZjIiLCJTb3gyIiwiUGxwMSIsIlMxMDBiIiwiQ2RoNSIsIkNkMzQiLCJBY3RhMiIsIkNvbDFhMiIsIkN0c3MiLCJEb2NrMiIsIkNkMjA5YSIsCiAgICAgICAgICAgICAgICAiUzEwMGE5IiwiVHJiYzIiKQoKYGBgCgoKYGBge3IsIGluY3VkZT1GQUxTRX0KCnZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuYXNzYXkgPC0gIlJOQSIKIyBHZXQgY2VsbCBleHByZXNzaW9uIGRhdGEgZm9yIHRoZSBnb2ksIHRoZSBjbHVzdGVyLCBhbmQgdGhlIGNlbGwtdHlwZQp2bm8ubWFya2VyX2dlbmVzLmRmIDwtIEZldGNoRGF0YShvYmplY3QgPSB2bm8uc2V1LmludGVncmF0ZWQsIHNsb3Q9J2RhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzID0gYyhwbG90LmdlbmVzLCAic2V1cmF0X2NsdXN0ZXJzIiwgImNlbGxfdHlwZSIpKQp2bm8ubWFya2VyX2dlbmVzLmRmJENlbGwgPC0gcm93bmFtZXModm5vLm1hcmtlcl9nZW5lcy5kZikKCnBsb3QuZ2VuZXMgPC0gcGxvdC5nZW5lc1twbG90LmdlbmVzICVpbiUgY29sbmFtZXModm5vLm1hcmtlcl9nZW5lcy5kZildCgojIFJlc2hhcGUgdGhlIGRhdGEgZm9yIHBsb3R0aW5nCnZuby5tYXJrZXJfZ2VuZXMuZGYgPC0gcmVzaGFwZTI6Om1lbHQodm5vLm1hcmtlcl9nZW5lcy5kZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQudmFycyA9IGMoIkNlbGwiLCJzZXVyYXRfY2x1c3RlcnMiLCJjZWxsX3R5cGUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gcGxvdC5nZW5lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gIkdlbmUiLCB2YWx1ZS5uYW1lID0gIkV4cHIiKQoKYGBgCgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgojIE9yZGVyIHRoZSBnZW5lIGZhY3RvciBsZXZlbHMKdm5vLm1hcmtlcl9nZW5lcy5kZiRHZW5lIDwtCiAgZmFjdG9yKHZuby5tYXJrZXJfZ2VuZXMuZGYkR2VuZSwKICAgICAgICAgbGV2ZWxzPWMoIk9tcCIsIkduYWkyIiwiR25nMTMiLCJNZWlzMiIsIkduYW8xIiwiUm9ibzIiLCJUZmFwMmUiLCJHbmFsIiwiQ25nYTIiLCJQMnJ5MTQiLCJYaXN0IiwKICAgICAgICAgICAgICAgICJHYXA0MyIsIlN0bW4yIiwiTmV1cm9nMSIsIk5ldXJvZDEiLCJDY25kMSIsIkFzY2wxIiwiS3J0NSIsIktydDE1IiwiU294OSIsIkhlcGFjYW0yIiwKICAgICAgICAgICAgICAgICJGZXpmMiIsIlNveDIiLCJQbHAxIiwiUzEwMGIiLCJDZGg1IiwiQ2QzNCIsIkFjdGEyIiwiQ29sMWEyIiwiQ3RzcyIsIkRvY2syIiwiQ2QyMDlhIiwKICAgICAgICAgICAgICAgICJTMTAwYTkiLCJUcmJjMiIpKQoKIyBPcmRlciB0aGUgc2V1cmF0X2NsdXN0ZXJzIGZhY3RvciBsZXZlbHMKdm5vLm1hcmtlcl9nZW5lcy5kZiRzZXVyYXRfY2x1c3RlcnMgPC0gZmFjdG9yKHZuby5tYXJrZXJfZ2VuZXMuZGYkc2V1cmF0X2NsdXN0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoIjAiLCIxIiwiMiIsIjMiLCIxMyIsIjIzIiwiNSIsIjEwIiwiMTUiLCIyMSIsIjI5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkiLCIxMiIsIjYiLCI3IiwiMTkiLCIyNiIsIjE3IiwiMjgiLCIyNyIsIjQiLCIxMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxOCIsIjMwIiwiMjUiLCIyNCIsIjE2IiwiOCIsIjIwIiwiMTQiLCIyMiIpKQoKYGBgCgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgojIEdldCBvcmRlcmVkIGxlZ2VuZCBkYXRhCmxlZ2VuZC5kZiA8LSBkYXRhLmZyYW1lKGNsdXN0ZXI9bGV2ZWxzKHZuby5tYXJrZXJfZ2VuZXMuZGYkc2V1cmF0X2NsdXN0ZXJzKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2VsbF90eXBlPWMocmVwKCJWMVJfbVZTTiIsNikscmVwKCJWMlJfbVZTTiIsMykscmVwKCJtT1NOIiwyKSxyZXAoInNWU04iLDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIlYxUl9pVlNOIiwxKSwiVjJSX2lWU04iLCJJTlAiLCJHQkMiLHJlcCgiSEJDIiwyKSwiTVYiLHJlcCgiU1VTIiw0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9FQyIsIkVuZG90aGVsaWFsIixyZXAoIkxQIiwxKSxyZXAoIk1pY3JvZ2xpYSIsMSksIk1pY3JvZ2xpYV9ycCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbW11bmVfRnByIiwiVF9jZWxscyIpKQoKbGVnZW5kLmRmJGNsdXN0ZXIgPC0gZmFjdG9yKGxlZ2VuZC5kZiRjbHVzdGVyLCBsZXZlbHM9bGV2ZWxzKHZuby5tYXJrZXJfZ2VuZXMuZGYkc2V1cmF0X2NsdXN0ZXJzKSkKbGVnZW5kLmRmJGNlbGxfdHlwZSA8LSBmYWN0b3IobGVnZW5kLmRmJGNlbGxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIsIlYxUl9pVlNOIiwiVjJSX2lWU04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5QIiwiR0JDIiwiSEJDIiwiTVYiLCJTVVMiLCJPRUMiLCJFbmRvdGhlbGlhbCIsIkxQIiwiTWljcm9nbGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pY3JvZ2xpYV9ycCIsIkltbXVuZV9GcHIiLCJUX2NlbGxzIikpCgpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MjUsIGZpZy5oZWlnaHQ9MjB9CgpmaWcxX2IucGFydDEgPC0gZ2dwbG90KHZuby5tYXJrZXJfZ2VuZXMuZGYsIGFlcyh4PXNldXJhdF9jbHVzdGVycywgRXhwciwgZmlsbD1jZWxsX3R5cGUpKSArCiAgZ2VvbV92aW9saW4oc2NhbGUgPSAid2lkdGgiLCBhZGp1c3QgPSAxLCB0cmltID0gVFJVRSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBwb3NpdGlvbj0icmlnaHQiLCBsYWJlbHMgPSBmdW5jdGlvbih4KQogICAgICAgICAgICAgICAgICAgICBjKHJlcCh4ID0gIiIsIHRpbWVzID0gbGVuZ3RoKHgpLTIpLCB4W2xlbmd0aCh4KSAtIDFdLCAiIikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEdlbmUpLCBzY2FsZXMgPSAiZnJlZSIsIHN3aXRjaCA9ICJ5IikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGFuZWwuc3BhY2luZyA9IHVuaXQoMCwgImxpbmVzIiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTU2LCBmYWNlPSJib2xkIiwgaGp1c3Q9MC43KSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgc2l6ZT00MCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTQwKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT01MCwgdmp1c3Q9MC41KSkgKwogIGdndGl0bGUoIlZOTyBDZWxsLVR5cGUgTWFya2VyLUdlbmUgTm9ybWFsaXplZCBFeHByZXNzaW9uIGJ5IENsdXN0ZXIiKSArIHlsYWIoIk5vcm1hbGl6ZWQgR2VuZSBFeHByZXNzaW9uIikKCmZpZzFfYi5wYXJ0MiA8LSBnZ3Bsb3QobGVnZW5kLmRmLCBhZXMoeCA9IGNsdXN0ZXIsIHkgPSAxLCBmaWxsID0gY2VsbF90eXBlKSkgKyAKICBnZW9tX3RpbGUod2lkdGg9MC45NykgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB2bm8uY2VsbF90eXBlLmNvbG9ycykgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKGRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIsIGxhYmVsLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS50aGVtZSA9IGVsZW1lbnRfYmxhbmsoKSwga2V5aGVpZ2h0ID0gMC41LCBucm93ID0gMywgYnlyb3cgPSBUUlVFKSkgKwogIHRoZW1lKGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMiwgJ2xpbmVzJyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MiwgdW5pdD0ncHQnKSwgc2l6ZT0zMCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSAiY2VudGVyIiwKICAgICAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKDAsMCwwLDApLAogICAgICAgIGxlZ2VuZC5ib3gubWFyZ2luID0gbWFyZ2luKC0xMCw1LDAsMCksCiAgICAgICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoMywgImxpbmVzIiksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDcsIDcsIDcsICJwdCIpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTYwLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT00MCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9NTAsIHZqdXN0PTAuNSksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB4bGFiKCJDbHVzdGVyIikKCmZpZzFfYiA8LSBwbG90X2dyaWQoZmlnMV9iLnBhcnQxLCBmaWcxX2IucGFydDIsIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC44MywgMC4xNyksIAogICAgICAgICAgICAgICAgICAgIGFsaWduID0gImh2IiwgYXhpcyA9ICJsciIpCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWcxX2Iuc3ZnIiksd2lkdGg9MjUsIGhlaWdodD0yMCkKZmlnMV9iCmludmlzaWJsZShkZXYub2ZmKCkpCgpmaWcxX2IKCmBgYAoKIyMgVU1BUCBvZiBjZWxsLXR5cGUgY2x1c3RlcnMgc3BsaXQgYnkgYWdlICAKCmBgYHtyLCBmaWcud2lkdGg9MTYsZmlnLmhlaWdodD04fQoKZmlnMV9jIDwtIERpbVBsb3Qodm5vLnNldS5pbnRlZ3JhdGVkLCByZWR1Y3Rpb24gPSAidW1hcCIsIHNodWZmbGUgPSBUUlVFLCBzcGxpdC5ieSA9ICJhZ2UiLCBuY29sID0gMikgJgogIHRoZW1lX3ZvaWQoKSAmIHRoZW1lKGFzcGVjdC5yYXRpbz0xLCBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYsIGZhY2U9ImJvbGQiKSkgJiBOb0xlZ2VuZCgpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMV9jLnN2ZyIpLCB3aWR0aD0xMCwgaGVpZ2h0PTUpCmZpZzFfYwppbnZpc2libGUoZGV2Lm9mZigpKQpmaWcxX2MKCmBgYAoKIyMgVU1BUCBvZiBjZWxsLXR5cGUgY2x1c3RlcnMgc3BsaXQgYnkgc2V4ICAKCmBgYHtyLCBmaWcud2lkdGg9MTYsZmlnLmhlaWdodD04fQoKZmlnMV9kIDwtIERpbVBsb3Qodm5vLnNldS5pbnRlZ3JhdGVkLCByZWR1Y3Rpb24gPSAidW1hcCIsIHNodWZmbGUgPSBUUlVFLCBzcGxpdC5ieSA9ICJzZXgiLCBuY29sID0gMikgKwogIHRoZW1lX3ZvaWQoKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0xLCBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYsIGZhY2U9ImJvbGQiKSkgKyBOb0xlZ2VuZCgpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMV9kLnN2ZyIpLCB3aWR0aD0xMCwgaGVpZ2h0PTUpCmZpZzFfZAppbnZpc2libGUoZGV2Lm9mZigpKQpmaWcxX2QKCmBgYAoKIyMgQSByZXByZXNlbnRhdGl2ZSBpbWFnZSBvZiB0cmFuc2NyaXB0IGRpc3RyaWJ1dGlvbiBmcm9tIE1vbGVjdWxhciBDYXJ0b2dyYXBoecKpIHBsYXRmb3JtLCBSZXNvbHZlIEJpb3NjaWVuY2VzCgohW10oL2wvWXUvWXVMYWIvTGFiIFBhcGVyL0luUHJlcC9WTk9fYXRsYXMvRmluYWwgVmVyc2lvbnMvZmlndXJlX3BhbmVscy9GaWd1cmUxX0UucG5nKQoKIyMgU3BhdGlhbCBsb2NhdGlvbiBvZiBpbmRpdmlkdWFsIFZOTyBjZWxscyBjb2xvci1jb2RlZCBhY2NvcmRpbmcgdG8gY2VsbCB0eXBlIHByZWRpY3Rpb24gYmFzZWQgb24gdGhlIHNwYXRpYWwgdHJhbnNjcmlwdG9taWMgYW5hbHlzaXMgIAoKYGBge3J9Cgpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInJlc29sdmUuc2V1LlBPU1RwcmVkaWN0IikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwicmVzb2x2ZS5kYXRhc2V0cy5QT1NUcHJlZGljdCIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkiKSkKCmBgYAoKYGBge3J9CgpyZXNvbHZlLmNlbGwudHlwZXMgPC0gCiAgYXMuZmFjdG9yKHVubGlzdChsYXBwbHkoY29sbmFtZXMocmVzb2x2ZS5wcmVkaWN0aW9ucy5hc3NheSksIGZ1bmN0aW9uKGNlbGwpewogIHJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpW3doaWNoLm1heCh4PXJlc29sdmUucHJlZGljdGlvbnMuYXNzYXlbICxjZWxsXSldCn0pKSkKCmBgYAoKYGBge3J9CgpJZGVudHMocmVzb2x2ZS5zZXUuaW50ZWdyYXRlZCkgPC0gcmVzb2x2ZS5jZWxsLnR5cGVzCmxldmVscyhyZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKHJlc29sdmUuc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KT09InVua25vd24tbVZTTiJdIDwtICJzVlNOIgoKbGV2ZWxzKHJlc29sdmUuc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KSA8LSBnc3ViKCItIiwiXyIsIGxldmVscyhyZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkpCgpyZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCA8LQogIGZhY3Rvcihhcy5mYWN0b3IocmVzb2x2ZS5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpLCAKICAgICAgICAgbGV2ZWxzID0gYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIiwKICAgICAgICAgICAgICAgICAgICAiVjFSX2lWU04iLCJWMlJfaVZTTiIsIklOUCIsIkdCQyIsIkhCQyIsIk1WIiwKICAgICAgICAgICAgICAgICAgICAiU1VTIiwiT0VDIiwiRW5kb3RoZWxpYWwiLCJMUCIsIk1pY3JvZ2xpYSIsCiAgICAgICAgICAgICAgICAgICAgIk1pY3JvZ2xpYV9ycCIsIkltbXVuZV9GcHIiLCJUX2NlbGxzIikpCgpgYGAKCmBgYHtyfQoKcmVzb2x2ZS5jZWxsX3R5cGUuY29sb3JzIDwtIGh1ZV9wYWwoKShsZW5ndGgobGV2ZWxzKHJlc29sdmUuc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KSkpCgpuYW1lcyhyZXNvbHZlLmNlbGxfdHlwZS5jb2xvcnMpIDwtIGxldmVscyhyZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkKCnJlc29sdmUuY2VsbF90eXBlLmNvbG9yc1siVjFSX21WU04iXSA8LSAiIzAwRkYwMCIgICAjZ3JlZW4KcmVzb2x2ZS5jZWxsX3R5cGUuY29sb3JzWyJWMlJfbVZTTiJdIDwtICIjRkY3RjUwIiAgICNjb3JhbApyZXNvbHZlLmNlbGxfdHlwZS5jb2xvcnNbInNWU04iXSA8LSAiIzhGMDBGRiIgICAgICAgI3Zpb2xldCAKcmVzb2x2ZS5jZWxsX3R5cGUuY29sb3JzWyJMUCJdIDwtICIjMDAwMEZGIiAgICAgICAgICNibHVlICAgCnJlc29sdmUuY2VsbF90eXBlLmNvbG9yc1siU1VTIl0gPC0gIiNGRjAwMDAiICAgICAgICAjcmVkCnJlc29sdmUuY2VsbF90eXBlLmNvbG9yc1siSEJDIl0gPC0gIiNGRkZGMDAiICAgICAgICAjeWVsbG93CnJlc29sdmUuY2VsbF90eXBlLmNvbG9yc1siVjFSX2lWU04iXSA8LSAiI0RGRkYwMCIgICAjY2hhcnRyZXVzZSAKcmVzb2x2ZS5jZWxsX3R5cGUuY29sb3JzWyJWMlJfaVZTTiJdIDwtICIjRkZBNTAwIiAgICNvcmFuZ2UKCmBgYAoKYGBge3J9Cgpjb2xvcnMgPC0gYygiVjFSX21WU04iPSIjNDVCNTAwIiwiVjJSX21WU04iPSIjRTc4NTFFIiwibU9TTiI9IiNEMzkyMDAiLCJzVlNOIj0iIzlDOERGRiIsCiAgICAgICAgICAgICJWMVJfaVZTTiI9IiMwMEMwODciLCJWMlJfaVZTTiI9IiNEMDk0MDAiLCJJTlAiPSIjRkY2MUM3IiwiR0JDIj0iI0VGRkQ1RiIsIAogICAgICAgICAgICAiSEJDIj0iI0ZGRkYwMCIsIk1WIj0iIzAwQzBCMiIsIlNVUyI9IiNGODc2NkQiLCJPRUMiPSIjMDBCQ0Q2IiwKICAgICAgICAgICAgIkVuZG90aGVsaWFsIj0iIzAwQjNGMiIsIkxQIj0iIzI5QTNGRiIsIk1pY3JvZ2xpYSI9IiMwMEJDNTEiLCJNaWNyb2dsaWFfcnAiPSIjRDI3N0ZGIiwKICAgICAgICAgICAgIkltbXVuZV9GcHIiPSIjQjJBMTAwIiwiVF9jZWxscyI9IiNGMTY2RTgiKQoKYGBgCgpgYGB7cn0KCmZpZzFfZi5zYW1wbGVzIDwtIHJlc29sdmUuZGF0YXNldHNbWyJzbGlkZTcuQjJfMiJdXQpjZWxsX25hbWVzIDwtIGNvbG5hbWVzKGZpZzFfZi5zYW1wbGVzKQpjZWxsX3R5cGVzIDwtIHJlc29sdmUuc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50W2NlbGxfbmFtZXNdCmZpZzFfZi5zYW1wbGVzIDwtIEFkZE1ldGFEYXRhKGZpZzFfZi5zYW1wbGVzLCBjZWxsX3R5cGVzLCBjb2wubmFtZT0iY2VsbF90eXBlIikKCmZpZzFfZiA8LSBTcGF0aWFsRGltUGxvdChvYmplY3QgPSBmaWcxX2Yuc2FtcGxlcywgZ3JvdXAuYnkgPSAiY2VsbF90eXBlIiwgcHQuc2l6ZS5mYWN0b3IgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMgPSBjb2xvcnMsIGludGVyYWN0aXZlID0gVFJVRSkgKwogIHRoZW1lKAogICAgYXNwZWN0LnJhdGlvID0gMSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLCJjbSIpCiAgKQoKYGBgCgpgYGB7cn0KCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWcxX2Yuc3ZnIiksIHdpZHRoPTEwLCBoZWlnaHQ9MTApCmZpZzFfZiAKaW52aXNpYmxlKGRldi5vZmYoKSkKZmlnMV9mCgpgYGAKCiMjIExvY2F0aW9uIG9mIGNlbGwgYmVsb25naW5nIHRvIEhCQywgR0JDLCBJTlAsIGFuZCBMUCBjZWxsIHR5cGVzLCByZXNwZWN0aXZlbHkuIEhlYXQgaW5kaWNhdGVzIGNvbmZpZGVuY2Ugb2YgcHJlZGljdGVkIHZhbHVlcyAgCgpgYGB7cn0KCmJsYW5rX3RoZW1lIDwtIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoLTEsIDAsIDAsIDApLCAibnVsbCIpLAogICAgICAgICAgICAgICAgICAgICBwYW5lbC5tYXJnaW4gPSB1bml0KGMoLTEsIDAsIDAsIDApLCAibnVsbCIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0zMiksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyLGFuZ2xlPTkwKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICAgICAgICAgICAgICAgYXNwZWN0LnJhdGlvPTEpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpmaWcxX2cucGFydF8xIDwtIFNwYXRpYWxGZWF0dXJlUGxvdChmaWcxX2Yuc2FtcGxlcywgZmVhdHVyZXM9cm93bmFtZXMocmVzb2x2ZS5wcmVkaWN0aW9ucy5hc3NheSlbMTBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5zaXplLmZhY3Rvcj00KSArIGJsYW5rX3RoZW1lICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0iZ3JleTg1IixoaWdoPSJtYWdlbnRhIikgKwogIHRoZW1lKAogICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLjUsICJjbSIpLCAgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGtleQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCB0aXRsZQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBoanVzdCA9IDAuMywgdmp1c3QgPSAwLjUpICAjIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgbGFiZWxzCiAgKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDUsIGJhcmhlaWdodCA9IDEpKSAjIEFkanVzdCBjb2xvcmJhciB3aWR0aCBhbmQgaGVpZ2h0CgpmaWcxX2cucGFydF8yIDwtIFNwYXRpYWxGZWF0dXJlUGxvdChmaWcxX2Yuc2FtcGxlcywgZmVhdHVyZXM9cm93bmFtZXMocmVzb2x2ZS5wcmVkaWN0aW9ucy5hc3NheSlbMTddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5zaXplLmZhY3Rvcj00KSArIGJsYW5rX3RoZW1lICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0iZ3JleTg1IixoaWdoPSJtYWdlbnRhIikgKwogIHRoZW1lKAogICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLjUsICJjbSIpLCAgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGtleQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCB0aXRsZQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBoanVzdCA9IDAuMjUsIHZqdXN0ID0gMC41KSAgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGxhYmVscwogICkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSA1LCBiYXJoZWlnaHQgPSAxKSkgIyBBZGp1c3QgY29sb3JiYXIgd2lkdGggYW5kIGhlaWdodAoKZmlnMV9nLnBhcnRfMyA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoZmlnMV9mLnNhbXBsZXMsIGZlYXR1cmVzPXJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpWzhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5zaXplLmZhY3Rvcj00KSArIGJsYW5rX3RoZW1lICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0iZ3JleTg1IixoaWdoPSJtYWdlbnRhIikgKwogIHRoZW1lKAogICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLjUsICJjbSIpLCAgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGtleQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCB0aXRsZQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBoanVzdCA9IDAuMjUsIHZqdXN0ID0gMC41KSAgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGxhYmVscwogICkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSA1LCBiYXJoZWlnaHQgPSAxKSkgIyBBZGp1c3QgY29sb3JiYXIgd2lkdGggYW5kIGhlaWdodAoKZmlnMV9nLnBhcnRfNCA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoZmlnMV9mLnNhbXBsZXMsIGZlYXR1cmVzPXJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpWzExXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQuc2l6ZS5mYWN0b3I9NCkgKyBibGFua190aGVtZSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9ImdyZXk4NSIsaGlnaD0ibWFnZW50YSIpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMS41LCAiY20iKSwgICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBrZXkKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAjIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgdGl0bGUKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjMsIHZqdXN0ID0gMC41KSAgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGxhYmVscwogICkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSA1LCBiYXJoZWlnaHQgPSAxKSkgIyBBZGp1c3QgY29sb3JiYXIgd2lkdGggYW5kIGhlaWdodAoKCmZpZzFfZyA8LSBnZ2FycmFuZ2UoZmlnMV9nLnBhcnRfMSwgZmlnMV9nLnBhcnRfMiwgZmlnMV9nLnBhcnRfMywgZmlnMV9nLnBhcnRfNCwgbmNvbD00LCBucm93PTEsIGFsaWduID0gJ2h2JykKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzFfZy5zdmciKSwgd2lkdGg9MTYsIGhlaWdodD00KQpmaWcxX2cgCmludmlzaWJsZShkZXYub2ZmKCkpCmZpZzFfZwoKYGBgCgoKCgo=