{"created_by":"Tampermonkey","version":"1","scripts":[{"name":"全网VIP视频免费破解去广告;【百度文库破解】内容复制|文档下载;知乎视频下载;YouTube油管播放助手","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["*://wenku.baidu.com/*","https://*.youku.com/v_*","https://*.iqiyi.com/v_*","https://*.iqiyi.com/w_*","https://*.iqiyi.com/a_*","https://*.le.com/ptv/vplay/*","https://v.qq.com/x/cover/*","https://v.qq.com/x/page/*","https://*.tudou.com/listplay/*","https://*.tudou.com/albumplay/*","https://*.tudou.com/programs/view/*","https://*.mgtv.com/b/*","https://film.sohu.com/album/*","https://tv.sohu.com/v/*","https://*.baofeng.com/play/*","https://vip.pptv.com/show/*","https://v.pptv.com/show/*","*://www.zhihu.com/*","*://v.vzuu.com/video/*","*://video.zhihu.com/video/*","*://www.youtube.com/watch?v=*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["zhihu.com","vzuu.com"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-end","orig_noframes":null}},"storage":{"ts":1637743188690,"data":{}},"enabled":true,"position":1,"file_url":"https://greasyfork.org/scripts/398314-%E5%85%A8%E7%BD%91vip%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A-%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93%E7%A0%B4%E8%A7%A3-%E5%86%85%E5%AE%B9%E5%A4%8D%E5%88%B6-%E6%96%87%E6%A1%A3%E4%B8%8B%E8%BD%BD-%E7%9F%A5%E4%B9%8E%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD-youtube%E6%B2%B9%E7%AE%A1%E6%92%AD%E6%94%BE%E5%8A%A9%E6%89%8B/code/%E5%85%A8%E7%BD%91VIP%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A%EF%BC%9B%E3%80%90%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93%E7%A0%B4%E8%A7%A3%E3%80%91%E5%86%85%E5%AE%B9%E5%A4%8D%E5%88%B6%7C%E6%96%87%E6%A1%A3%E4%B8%8B%E8%BD%BD%EF%BC%9B%E7%9F%A5%E4%B9%8E%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%EF%BC%9BYouTube%E6%B2%B9%E7%AE%A1%E6%92%AD%E6%94%BE%E5%8A%A9%E6%89%8B.user.js","uuid":"985e9485-bb72-488f-86ed-92c2a3e13d93","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrvvJvjgJDnmb7luqbmloflupPnoLTop6PjgJHlhoXlrrnlpI3liLZ85paH5qGj5LiL6L2977yb55+l5LmO6KeG6aKR5LiL6L2977ybWW91VHViZeayueeuoeaSreaUvuWKqeaJiwovLyBAbmFtZXNwYWNlICAgIGZlbmdkaWFuc2FucmVuX3ZpZGVvX3RleHRfaGVscGVyCi8vIEB2ZXJzaW9uICAgICAgMi4wLjMKLy8gQGRlc2NyaXB0aW9uICDluLjnlKjlip/og73kuJPlsZ7pm4blkIg6IOS4gOOAgeeZvuW6puaWh+W6k+aWh+aho+WGheWuueiHqueUseWkjeWItu+8jOaWh+aho+WFjei0ueS4i+i9ve+8m+S6jOOAgeS4gOmUruegtOino++8mueIseWlh+iJunzohb7orq/op4bpopF85LyY6YW3fOiKkuaenFRW562JVklQ54m55p2D5oiW5Lya5ZGY6KeG6aKR77yM5pmu6YCa6KeG6aKR5Y675bm/5ZGK6auY6YCf5pKt5pS+77yM6Kej5p6Q5o6l5Y+j6LS15Zyo56iz5a6a5aSf55So44CC5pSv5oyB77yaVGFtcGVybW9ua2V5fFZpb2xlbnRtb25rZXl8R3JlYXN5bW9ua2V577yM54mI5pysNC4wK+S7peS4iuacgOS9s++8iOavj+S4que9keermeino+aekOaMiemSruS9jee9ruWPr+iHquWumuS5ie+8jOmBv+WFjemBruaMoe+8ie+8m+S4ieOAgeeIseWlh+iJuuOAgeS8mOmFt+OAgeiFvuiur+inhumikeWOn+e9keermeW5v+WRiui/h+a7pO+8myDlm5vjgIHkuLrnn6XkuY7nmoTop4bpopHmkq3mlL7lmajmt7vliqDkuIvovb3lip/og73vvJvkupTjgIFZb3VUdWJl5rK5566h6Ieq5Yqo6Lez5bm/5ZGK77yM6Ieq5Yqo5omT5byA57+76K+R5a2X5bmV77yM5aaC5p6c5omT5byA5aSx6LSl77yM6K+35omL5Yqo54K55Ye75LiA5LiL5a2X5bmV5oyJ6ZKu44CCIAovLyBAYXV0aG9yICAgICAgIOS6uumsvOaDheacquS6huOAgeeOi+i2heOAgWNydWQtYm95Ci8vIEBjb3B5cmlnaHQgICAg5Lq66ay85oOF5pyq5LqGLCDnjovotoUg44CBY3J1ZC1ib3kKLy8gQGluY2x1ZGUgICAgICAqOi8vd2Vua3UuYmFpZHUuY29tLyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovLyoueW91a3UuY29tL3ZfKgovLyBAaW5jbHVkZSAgICAgIGh0dHBzOi8vKi5pcWl5aS5jb20vdl8qCi8vIEBpbmNsdWRlICAgICAgaHR0cHM6Ly8qLmlxaXlpLmNvbS93XyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovLyouaXFpeWkuY29tL2FfKgovLyBAaW5jbHVkZSAgICAgIGh0dHBzOi8vKi5sZS5jb20vcHR2L3ZwbGF5LyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovL3YucXEuY29tL3gvY292ZXIvKgovLyBAaW5jbHVkZSAgICAgIGh0dHBzOi8vdi5xcS5jb20veC9wYWdlLyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovLyoudHVkb3UuY29tL2xpc3RwbGF5LyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovLyoudHVkb3UuY29tL2FsYnVtcGxheS8qCi8vIEBpbmNsdWRlICAgICAgaHR0cHM6Ly8qLnR1ZG91LmNvbS9wcm9ncmFtcy92aWV3LyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovLyoubWd0di5jb20vYi8qCi8vIEBpbmNsdWRlICAgICAgaHR0cHM6Ly9maWxtLnNvaHUuY29tL2FsYnVtLyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovL3R2LnNvaHUuY29tL3YvKgovLyBAaW5jbHVkZSAgICAgIGh0dHBzOi8vKi5iYW9mZW5nLmNvbS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovL3ZpcC5wcHR2LmNvbS9zaG93LyoKLy8gQGluY2x1ZGUgICAgICBodHRwczovL3YucHB0di5jb20vc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgKjovL3d3dy56aGlodS5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly92LnZ6dXUuY29tL3ZpZGVvLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vdmlkZW8uemhpaHUuY29tL3ZpZGVvLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9KgovLyBAY29ubmVjdCAgICAgIHpoaWh1LmNvbQovLyBAY29ubmVjdCAgICAgIHZ6dXUuY29tCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9qcXVlcnlAMy4yLjEvZGlzdC9qcXVlcnkubWluLmpzCi8vIEBncmFudCAgICAgICAgR01faW5mbwovLyBAZ3JhbnQgICAgICAgIEdNX2Rvd25sb2FkCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX29wZW5JblRhYgovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LWVuZAovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbigpIHsKCSd1c2Ugc3RyaWN0JzsJCiAgICB2YXIgJCA9ICQgfHwgd2luZG93LiQ7CiAgICB2YXIgd2luZG93X3VybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgdmFyIHdlYnNpdGVfaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0OwoJaWYod2luZG93LnRvcCAhPSB3aW5kb3cuc2VsZil7CiAgICAJcmV0dXJuOwogICAgfQoJdmFyIGZlbmdkaWFuc2FucmVuX29iamVjdD17fTsKCWZlbmdkaWFuc2FucmVuX29iamVjdC5pc1J1bkN1cnJlbnRQYXJ0PWZ1bmN0aW9uKCl7CgkJdmFyIGhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQl2YXIgdmlkZW9XZWJzaXRlcyA9IFsiaXFpeWkuY29tIiwidi5xcS5jb20iLCJ5b3VrdS5jb20iLCAibGUuY29tIiwidHVkb3UuY29tIiwibWd0di5jb20iLCJzb2h1LmNvbSIsImFjZnVuLmNuIiwiYmFvZmVuZy5jb20iLCJwcHR2LmNvbSJdOwoJCWZvcih2YXIgYj0wOyBiPHZpZGVvV2Vic2l0ZXMubGVuZ3RoOyBiKyspewoJCQlpZihob3N0LmluZGV4T2YodmlkZW9XZWJzaXRlc1tiXSkgIT0gLTEpewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKCWZlbmdkaWFuc2FucmVuX29iamVjdC5nZXRXZWJzaXRlTmFtZT1mdW5jdGlvbigpewoJCXZhciBuYW1lPSJvdGhlciI7CgkJaWYod2Vic2l0ZV9ob3N0LmluZGV4T2YoImlxaXlpLmNvbSIpIT0tMSl7CgkJCW5hbWU9ImlxaXlpIjsKCQl9ZWxzZSBpZih3ZWJzaXRlX2hvc3QuaW5kZXhPZigicXEuY29tIikhPS0xKXsKCQkJbmFtZT0icXEiOwoJCX1lbHNlIGlmKHdlYnNpdGVfaG9zdC5pbmRleE9mKCJ5b3VrdS5jb20iKSE9LTEpewoJCQluYW1lPSJ5b3VrdSI7CgkJfWVsc2UgaWYod2Vic2l0ZV9ob3N0LmluZGV4T2YoIm1ndHYuY29tIikhPS0xKXsKCQkJbmFtZT0ibWd0diI7CgkJfWVsc2UgaWYod2Vic2l0ZV9ob3N0LmluZGV4T2YoInR1ZG91LmNvbSIpIT0tMSl7CgkJCW5hbWU9InR1ZG91IjsKCQl9ZWxzZSBpZih3ZWJzaXRlX2hvc3QuaW5kZXhPZigic29odS5jb20iKSE9LTEpewoJCQluYW1lPSJzb2h1IjsKCQl9CgkJcmV0dXJuIG5hbWU7Cgl9OwoJZmVuZ2RpYW5zYW5yZW5fb2JqZWN0LmdlbmVyYXRlSHRtbEFuZEV2ZW50ID0gZnVuY3Rpb24oKXsKCQl2YXIgbGVmdD0wOwoJCXZhciB0b3A9MzAwOwoJCQoJCS8v5Yid5aeL5YyW5L2N572u5L+h5oGvCgkJdmFyIHBsYXllckJveFBvc2l0aW9uID0gR01fZ2V0VmFsdWUoInBsYXllckJveFBvc2l0aW9uXyIrdGhpcy5nZXRXZWJzaXRlTmFtZSgpKTsKCQlpZighIXBsYXllckJveFBvc2l0aW9uKXsKCQkJbGVmdD1wbGF5ZXJCb3hQb3NpdGlvbi5sZWZ0OwoJCQl0b3A9cGxheWVyQm94UG9zaXRpb24udG9wOwoJCX0KCQl2YXIgY3NzID0gIiNmZW5nZGlhbnNhbnJlbl9vYmplY3R2aWRlb19wbGF5ZXJfYm94e3Bvc2l0aW9uOmZpeGVkOyB0b3A6Iit0b3ArInB4OyBsZWZ0OiIrbGVmdCsicHg7IHotaW5kZXg6OTk5OyB3aWR0aDoyNXB4O2JhY2tncm91bmQtY29sb3I6cmVkO307IgoJCQljc3MgKz0gIiNmZW5nZGlhbnNhbnJlbl9vYmplY3R2aWRlb19wbGF5ZXJfYm94PmRpdnt3aWR0aDoxMDAlOyBoZWlnaHQ6MjBweDt9IjsKCQkJY3NzICs9ICIjZmVuZ2RpYW5zYW5yZW5fb2JqZWN0dmlkZW9fcGxheWVyX2JveD5kaXY+aW1ne3dpZHRoOjkwJTt9IjsKCQkJY3NzICs9ICIjZmVuZ2RpYW5zYW5yZW5fb2JqZWN0dmlkZW9fcGxheWVyX2p1bXB7Y3Vyc29yOnBvaW50ZXI7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy10b3A6NXB4O30iCgkJCWNzcyArPSAiI2ZlbmdkaWFuc2FucmVuX29iamVjdHZpZGVvX3BsYXllcl9ib3hfbW92ZXtjdXJzb3I6bW92ZTttYXJnaW4tdG9wOjVweDt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjVweCAwcHg7fSIKCQkKCQkkKCJoZWFkIikuYXBwZW5kKCI8c3R5bGU+Iitjc3MrIjwvc3R5bGU+IikKCQkKCQl2YXIgbW92ZUltYWdlPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFEalVsRVFWUm9RKzJZVFlpVlZSakhmMzhFU1FYWFZoc0hsNElJSlJwdW1zR0ZXbzJqdFpuR3RycVNNVEMzNlNZUWcvQURvbWlWWHhzL1N2eWdoVHFyb2FoQVc3UWJkSk5LbXlBd1IwUWZlZUM1Y3VibDN2dWVtWHZlNUE3M3JPNTczL09lOC8rZDg1em40NGcrYitwei9Rd0FYdlVPRG5aZzBlNkFtVTBDWHdMUGdRMlMvbWdDdGhFVE1yT053QzFnV1loK0JHeVI5SE5waU9JQVpqWU1uQUZlcjRoOUNFeEl1bGtTb2lpQW1iMEhuQVZXZGhENWIwQmNLUVZSRE1ETXRnT1hnU1VoN2o5Z2VmeCtuSmpUTStBalNUK1VnQ2dKNERiL2JvaWFCYzREdStQNXRJc0dYb3ZuS1VsdWFqMjNrZ0FUZ0F1OUIzd0tyQWMrRDRXSGdUdkFTZUFOQjVQazU2VG5WZ3pBbFpqWmFra080TDhQcFFDUy9IbE9uNTdWUTNPNVVDZUFFcUxUTVlydVFEcndZZ0Q0QlBnK29JWWxUWlZlZlIrdnNSMEllOThHL0MzcDl5YkV6d3NnL1B4bndIZWxQRWdWeXN6MkFPUEFVVW5YY3FDemRpQWk3STlKa0JwcWVadWNTWEw2dUFjRDdrWmZEM1k3SkYydCs3WVdJSEliajVxdDlPQ2VwS0c2Z1JmeTNzd2N3RUc4ZWRveEpza0RaTWZXRlNDeXlrdEpZdVlSZGp3bkRUQ3puY0NCMkxWSlNiL1VRWm5aR0hBdWlkZ1BnSjNkdnUwSVlHYnJnR2xnUlV6c3VjMUZZS1lpeE5PQ09SN0d6UFlCeHl2OTFrcjZzK0pxM2VZOU1xZHREYkFyeWFOODNnT1N2bTYzQU4wQW5nQkw2MVl0M3IrZGVob3o4N3pmYTRLMC9TUnBhK3NQTXhzRi9Gemx0S2VTMm1vcEJiQmQwdlZFWER1QWFVbWJrejZlK0hXMTc0UnNWbEtyT0pvRDNBMWdQL0JGa2daN1NueWhqUW5OU0RwVk1ZMkR3SkhLMHU2UzVPZnBaVE96dDRBUDJwalFoOG04YmtMdmRDcEo2dzd4SnNBblhSV1QrQ0grdUNxa2FnTm01cXY3Zm9qN3h5czBTU2ZxYkNVT3ZoZEVyYlRicXpnL3hCMUwwUnczT2hJUUxUZDZYOUtiZFdJVzh0N00va29PdGJ0UkY5KzFCSzBGY0NGbTVxdnBzYUJWYmYwZmdjeGpRRzNwbVFVUUVPNmovYXJrbktSdkY3TENkZDhrcWNTeG5Gamo0MlVEMUUzZTduMmNoWldTdkZadXBEVUdFQjdtdDFDOXQ2bGRheEtnYlVsWmVoc0dBSlhBMUw5RmZYaVFiN3BjcTl3R3ZvcDB1ZGlaS0daQ1p0YjNGMXZkcmhiVGEwYXZ0a1p6UzhhNlExOXNCeUxZNVZ6dWVpNVZXeXJXQ1crOUx3b1FFSjJ1MTcyNjh1djEzQlE2aTZFNFFFQjRNWE9qVXMyTjVKU1ZXYXFUVG8wQUJJU1hwTDlHdXVJMWNkdVNjTDZDcS8wYkEraFZXTzczQTREY2xXcXEzMkFIbWxyWjNISDdmZ2RlQUw3R1NVQnFzT2tTQUFBQUFFbEZUa1N1UW1DQyI7CgkJdmFyIHBsYXllckltYWdlPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFCdGtsRVFWUm9RKzJZVHl0RlFSakduK2N6S0J0Yks3dTc5amw4Q0Z0TEszYXVoWVdGSkVtUzVFWTNLUXRsSVpJb3R5UkpraFFMSVVXUmJrZFQ3OVJaVUhmK24xTnoxalB6L243dk05T1pjNGlhUDZ3NVA3SkE2Z1J6QWprQnh3N2tMZVRZUU9mcHhna1VSVEVDWUJ6QUFJQjFBRk1rSDUxSkxCZXdFYmdCTUZpcWR5Y1NDNVlNVHROc0JJcC9LbTZMeUxFVGtlRmtud0txZEZkSmlNaUhJWXZWY044Q0dxSURvRWxTblpHZ1R5Z0JEYjBxYVZ5R3NnZ3RvTGpmUkdJNmhFUU1BYzE5SUNLN1BrVmlDbWp1T1JGNThDR1NRa0J4MzR2RXZLdEVLZ0hOdlNNaVI3WWlxUVVVdDNveE5rWGszVlNrQ2dLYStVSWsxa3drcWlTZ3VTZEpUdlFxVVVXQlY1SjlkUmJva0d6VVZlQUZ3Q2pKVmgwRlZ1UVFYL1VLcjhaVjRReWNDL2lHQ2JnZW0xTGdSNzRkMUxYNzB3WStaUUp0NmZxSkxYaXFCRzRGZk5FVlBJWEFyTUEvK1lLUHRZWDJCWHpQSjNpTUJKNEZmQ1lFZUdpQlpZRy9EZ2tmWWd1ZENmaG1hSERmQ1h5WC9nZDl4WUszVGVBUXdIQUpja3U2ZmhvVDNDV0JJUUJqQVBvQnRFa3VwUUMzRmtnSisxZHQ0N3RRRnZEY2daeUE1NFlhTDVjVE1HNlo1d2s1QWM4Tk5WN3VGKzE1dERHd0JITitBQUFBQUVsRlRrU3VRbUNDIjsKCQl2YXIgaHRtbCA9ICI8ZGl2IGlkPSdmZW5nZGlhbnNhbnJlbl9vYmplY3R2aWRlb19wbGF5ZXJfYm94Jz4iKwoJCQkJCSI8ZGl2IGlkPSdmZW5nZGlhbnNhbnJlbl9vYmplY3R2aWRlb19wbGF5ZXJfanVtcCcgbmFtZT0n6Lez6L2s5Yiw6Kej5p6QJz48aW1nIHNyYz0nIitwbGF5ZXJJbWFnZSsiJz48L2Rpdj4iKwoJCQkJCSI8ZGl2IGlkPSdmZW5nZGlhbnNhbnJlbl9vYmplY3R2aWRlb19wbGF5ZXJfYm94X21vdmUnIG5hbWU9J+enu+WKqOaMiemSric+PGltZyBzcmM9JyIrbW92ZUltYWdlKyInPjwvZGl2PiIrCgkJCQkiPC9kaXY+IjsKCQkkKCJib2R5IikuYXBwZW5kKGh0bWwpOwoJCQoJCSQoIiNmZW5nZGlhbnNhbnJlbl9vYmplY3R2aWRlb19wbGF5ZXJfanVtcCIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCXZhciBwbGF5YmFja1dlYnNpdGU9Imh0dHBzOi8vd3d3LnhpeGljYWkudG9wL21vdi9zLz9zdj03JnVybD0iK3dpbmRvd191cmw7CgkJCUdNX29wZW5JblRhYihwbGF5YmFja1dlYnNpdGUsIHthY3RpdmU6IHRydWV9KTsKCQl9KTsKCQl0aGlzLmxpc3RlbmVyTW91c2UoKTsKCX07CglmZW5nZGlhbnNhbnJlbl9vYmplY3QucG9pbnQ9eyJ4IjowLCJ5IjowLCJsIjowLCJ0IjowfTsKCWZlbmdkaWFuc2FucmVuX29iamVjdC5pc0Rvd249ZmFsc2U7CglmZW5nZGlhbnNhbnJlbl9vYmplY3QuJGJveD1udWxsOwoJZmVuZ2RpYW5zYW5yZW5fb2JqZWN0Lmxpc3RlbmVyTW91c2UgPSBmdW5jdGlvbigpewoJCXZhciB0aGF0ID0gdGhpczsKCQkKCQl0aGlzLiRib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVuZ2RpYW5zYW5yZW5fb2JqZWN0dmlkZW9fcGxheWVyX2JveF9tb3ZlJyk7CgkJdGhpcy4kYm94Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24oZSkgewoJCQkvL+mYu+atoum7mOiupOS6i+S7tgoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJICAgIC8v6I635Y+WeOWdkOagh+WSjHnlnZDmoIcKCQkgICAgdGhhdC5wb2ludC54ID0gZS5jbGllbnRYOwoJCSAgICB0aGF0LnBvaW50LnkgPSBlLmNsaWVudFk7CgkJICAgIC8v6I635Y+W5bem6YOo5ZKM6aG26YOo55qE5YGP56e76YePCgkJICAgIHRoYXQucG9pbnQubCA9IHRoYXQuJGJveC5wYXJlbnROb2RlLm9mZnNldExlZnQ7CgkJICAgIHRoYXQucG9pbnQudCA9IHRoYXQuJGJveC5wYXJlbnROb2RlLm9mZnNldFRvcDsKCQkgICAgLy/lvIDlhbPmiZPlvIAKCQkgICAgdGhhdC5pc0Rvd24gPSB0cnVlOwoJCSAgICAvL+iuvue9ruagt+W8jyAgCgkJICAgIHRoYXQuJGJveC5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7CgkJfTsKCQl3aW5kb3cub25tb3VzZW1vdmUgPSBmdW5jdGlvbihlKSB7CgkJCS8v6Zi75q2i6buY6K6k5LqL5Lu2CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQkJaWYgKHRoYXQuaXNEb3duID09IGZhbHNlKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJLy/ojrflj5Z45ZKMeQoJCQl2YXIgbnggPSBlLmNsaWVudFg7CgkJCXZhciBueSA9IGUuY2xpZW50WTsKCQkJLy/orqHnrpfnp7vliqjlkI7nmoTlt6blgY/np7vph4/lkozpobbpg6jnmoTlgY/np7vph48KCQkJdmFyIG5sID0gbnggLSAodGhhdC5wb2ludC54IC0gdGhhdC5wb2ludC5sKTsKCQkJdmFyIG50ID0gbnkgLSAodGhhdC5wb2ludC55IC0gdGhhdC5wb2ludC50KTsKCQkJLy/mm7TmlrDkvY3nva4KCQkJdGhhdC4kYm94LnBhcmVudE5vZGUuc3R5bGUubGVmdCA9IG5sICsgJ3B4JzsKCQkJdGhhdC4kYm94LnBhcmVudE5vZGUuc3R5bGUudG9wID0gbnQgKyAncHgnOwoJCQlHTV9zZXRWYWx1ZSgicGxheWVyQm94UG9zaXRpb25fIit0aGF0LmdldFdlYnNpdGVOYW1lKCkseyJsZWZ0IjpubCwgInRvcCI6bnR9KQoJCX0KCQlmZW5nZGlhbnNhbnJlbl9vYmplY3QuJGJveC5vbm1vdXNldXAgPSBmdW5jdGlvbigpIHsKCQkJLy/lvIDlhbPlhbPpl60KCQkJdGhhdC5pc0Rvd24gPSBmYWxzZTsKCQkJdGhhdC4kYm94LnN0eWxlLmN1cnNvciA9ICdtb3ZlJzsKCQl9Cgl9OwoJZmVuZ2RpYW5zYW5yZW5fb2JqZWN0LnJlbW92ZUFEID0gZnVuY3Rpb24oKXsKCQl2YXIgdmlkZW9XZWJzaXRlQURSZW1vdmVfPXt9OwoJCXZpZGVvV2Vic2l0ZUFEUmVtb3ZlXy5tZXRob2QxPWZ1bmN0aW9uKCl7CgkJCXdpbmRvdy5fc2V0VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0CgkJICAgIHdpbmRvdy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKGhhbmRsZXIsIHRpbWVvdXQsIC4uLmFyZykgewoJCSAgICAgICAgd2luZG93Ll9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQgLyAzMCwgLi4uYXJnKQoJCSAgICB9CgkJfTsKCQl2aWRlb1dlYnNpdGVBRFJlbW92ZV8ubWV0aG9kMj1mdW5jdGlvbigpewoJCQl3aW5kb3cuX3NldEludGVydmFsID0gd2luZG93LnNldEludGVydmFsCgkJICAgIHdpbmRvdy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uIChoYW5kbGVyLCB0aW1lb3V0LCAuLi5hcmcpIHsKCQkgICAgICAgIHdpbmRvdy5fc2V0SW50ZXJ2YWwoaGFuZGxlciwgdGltZW91dCAvIDMwLCAuLi5hcmcpCgkJICAgIH0KCQl9OwoJCXZpZGVvV2Vic2l0ZUFEUmVtb3ZlXy5tZXRob2QzPWZ1bmN0aW9uKCl7CgkJCXdpbmRvdy5yYXRlID0gMAoJCSAgICB3aW5kb3cuRGF0ZS5ub3cgPSAoKT0+e3JldHVybiBuZXcgd2luZG93LkRhdGUoKS5nZXRUaW1lKCkgKyAod2luZG93LnJhdGUgKz0gMTAwMDApfQoJCSAgICBzZXRJbnRlcnZhbCgoKT0+e3dpbmRvdy5yYXRlID0gMH0sIDYwMDAwMCkKCQl9OwoJCXZpZGVvV2Vic2l0ZUFEUmVtb3ZlXy55b3VrdT1mdW5jdGlvbigpewoJCQl2YXIgJHRoYXQ9dGhpczsKCQkJd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQkgICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKVsxXSkgewoJCSAgICAgICAgICAgIHNldEludGVydmFsKCgpPT57ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKVsxXS5wbGF5YmFja1JhdGUgPSAxNn0sMTAwKQoJCSAgICAgICAgfSBlbHNlIHsKCQkgICAgICAgICAgICR0aGF0Lm1ldGhvZDEoKQoJCSAgICAgICAgfQoJCSAgICB9CgkJfTsKCQl2aWRlb1dlYnNpdGVBRFJlbW92ZV8uaXFpeWk9ZnVuY3Rpb24oKXsKCQkJdGhpcy5tZXRob2QzKCk7CgkJfTsKCQl2aWRlb1dlYnNpdGVBRFJlbW92ZV8ucXE9ZnVuY3Rpb24oKXsKCQkJLy8gc2V0SW50ZXJ2YWwoKCk9PnsKCQkgLy8gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd2aWRlbycpWzBdLnN0YXR1cyA9PSAnSURMRScpIHsKCQkgLy8gICAgICAgICAgICBzZXRJbnRlcnZhbCgoKT0+ewoJCSAvLyAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd2aWRlbycpWzJdLnBsYXliYWNrUmF0ZSA9IDE2CgkJIC8vICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3ZpZGVvJylbM10ucGxheWJhY2tSYXRlID0gMTYKCQkgLy8gICAgICAgICAgICB9LDEwMCkKCQkgLy8gICAgICAgIH0KCQkgLy8gICAgfSwxMDApOwoJCX07CgkJdmlkZW9XZWJzaXRlQURSZW1vdmVfLnN0YXJ0PWZ1bmN0aW9uKCl7CgkJCXN3aXRjaCAod2Vic2l0ZV9ob3N0KSB7CgkJICAgICAgICBjYXNlICd2LnlvdWt1LmNvbSc6CgkJICAgICAgICAgICAgdGhpcy55b3VrdSgpOwoJCSAgICAgICAgICAgIGJyZWFrCgkJICAgICAgICBjYXNlICd2LnFxLmNvbScgOgoJCSAgICAgICAgICAgIHRoaXMucXEoKQoJCSAgICAgICAgICAgIGJyZWFrCgkJICAgICAgICBjYXNlICd3d3cuaXFpeWkuY29tJyA6CgkJICAgICAgICAgICAgdGhpcy5pcWl5aSgpCgkJICAgICAgICAgICAgYnJlYWsKCQkgICAgICAgIGRlZmF1bHQgOgoJCSAgICAgICAgICAgIGJyZWFrCgkJICAgIH0KCQl9OwoJCXZpZGVvV2Vic2l0ZUFEUmVtb3ZlXy5zdGFydCgpOwoJfTsKCWZlbmdkaWFuc2FucmVuX29iamVjdC5zdGFydD1mdW5jdGlvbigpewoJCWlmKHRoaXMuaXNSdW5DdXJyZW50UGFydCgpKXsKCQkJdGhpcy5nZW5lcmF0ZUh0bWxBbmRFdmVudCgpOwoJCQl0aGlzLnJlbW92ZUFEKCk7CgkJfQoJfTsKCWZlbmdkaWFuc2FucmVuX29iamVjdC5zdGFydCgpOwoJCgkKCS8qKgoJICog55m+5bqm5paH5bqT5byA5aeLCgkgKi8KCWNvbnN0IGJhaWR1d2Vua3VIZWxwZXJfPXt9OwoJYmFpZHV3ZW5rdUhlbHBlcl8ud2Vua3Vkb3dubG9hZFVybCA9ICJodHRwOi8vd3d3LnRvb2w3Ny5jb20vdGFtcGVybW9ua2V5L2RvYy9kb3dubG9hZD93ZW5rdV91cmw9IjsKCWJhaWR1d2Vua3VIZWxwZXJfLmlzUnVuID0gZnVuY3Rpb24oKXsKCQlpZih3ZWJzaXRlX2hvc3QuaW5kZXhPZigid2Vua3UuYmFpZHUuY29tIikgIT0gLTEpewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKCWJhaWR1d2Vua3VIZWxwZXJfLnJlbW92ZUFEPWZ1bmN0aW9uKCl7CgkJaWYod2Vic2l0ZV9ob3N0LmluZGV4T2YoIndlbmt1LmJhaWR1LmNvbSIpICE9IC0xKXsKCQkgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCQkgICAgCSQoIi5iYW5uZXItYWQiKS5oaWRlKCk7CgkJICAgIAkkKCIudW5pb24tYWQtYm90dG9tIikuaGlkZSgpOwoJCSAgICAJJCgiaWZyYW1lIikuaGlkZSgpOwoJCSAgICAJCgkJICAgIAkvL1ZJUOWOu+W5v+WRiuWwj+aMiemSrgoJCSAgICAJJCgiLmdnYnRtLXZpcC1jbG9zZSIpLmhpZGUoKTsKCQkgICAgCSQoIi5hZC12aXAtY2xvc2UtYm90dG9tIikuaGlkZSgpOwoJCSAgICAJJCgiLmFkLXZpcC1jbG9zZSIpLmhpZGUoKTsKCQkgICAgCQoJCSAgICAJLy/mkJzntKLpobXpnaIKCQkgICAgCSQoIiNmZW5nY2hhb2FkIikuaGlkZSgpOwoJCSAgICAJJCgiLnNlYXJjaC1hc2lkZS1hZFdyYXAiKS5oaWRlKCk7CgkJICAgIH0sMzAwKTsKCSAgICB9Cgl9OwoJYmFpZHV3ZW5rdUhlbHBlcl8uZ2VuZXJhdGVIdG1sPWZ1bmN0aW9uKCl7CgkJdmFyICR0aGF0ID0gdGhpczsKCQlpZigod2luZG93X3VybC5pbmRleE9mKCJ3ZW5rdS5iYWlkdS5jb20vdmlldyIpPT0tMSAmJiB3aW5kb3dfdXJsLmluZGV4T2YoIndlbmt1LmJhaWR1LmNvbS9saW5rIik9PS0xKSAKCQkJfHwgd2Vic2l0ZV9ob3N0IT0id2Vua3UuYmFpZHUuY29tIil7CgkJCXJldHVybjsKCQl9CgkJCgkJdGhpcy5vcGVuQWxsUGFnZSgpOyAgLy/mipjlj6DnmoTmlofmoaPlhajpg6jlsZXlvIAKCQkKCQl2YXIgdG9wQm94ID0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6OTk5OTk5O2JhY2tncm91bmQtY29sb3I6I2NjYztjdXJzb3I6cG9pbnRlcjt0b3A6MTUwcHg7bGVmdDowcHg7Jz4iKwoJCQkJCQkiPGRpdiBpZD0nYmFpZHV3ZW5rdV9oZWxwZXJfZG93bmxvYWRfYnRuJyBzdHlsZT0nZm9udC1zaXplOjEycHg7cGFkZGluZzo4cHggMnB4O2NvbG9yOiNGRkY7YmFja2dyb3VuZC1jb2xvcjojMjVBRTg0Oyc+5LiL6L29PC9kaXY+IisKCQkJCQkJIjxkaXYgaWQ9J2JhaWR1d2Vua3VfaGVscGVyX2NvcHlhbGxfYnRuJyBzdHlsZT0nZm9udC1zaXplOjEycHg7cGFkZGluZzo4cHggMnB4O2NvbG9yOiNGRkY7YmFja2dyb3VuZC1jb2xvcjojRkU4QTIzOyc+5aSN5Yi2PC9kaXY+IisKCQkJCSAJICI8L2Rpdj4iOwoJCSQoImJvZHkiKS5hcHBlbmQodG9wQm94KTsKCQkKCQkvL+ino+aekOS4i+i9vQoJCSQoImJvZHkiKS5vbigiY2xpY2siLCIjYmFpZHV3ZW5rdV9oZWxwZXJfZG93bmxvYWRfYnRuIixmdW5jdGlvbigpewoJCQl2YXIgd2Vua3VVcmwgPSAkdGhhdC53ZW5rdWRvd25sb2FkVXJsK2VuY29kZVVSSUNvbXBvbmVudCh3aW5kb3dfdXJsKTsKCQkJR01fb3BlbkluVGFiKHdlbmt1VXJsLCB7IGFjdGl2ZTogdHJ1ZSB9KTsKCQl9KTsKCQkKCQlpZigkKCIjcmVhZGVyLWNvbnRhaW5lciIpLmxlbmd0aCA9PSAwKXsgLy/ov5nmmK/ml6fnmoTmlofmoaPlsZXnpLrpobXpnaIKCQkJdmFyIG9uZVBhZ2VDb3B5Q29udGVudEh0bWwgPSAnPGRpdiBjbGFzcz0iYmFpZHV3ZW5rdV9oZWxwZXJfY29weV9vbmVwYWdlIiBzdHlsZT0iZmxvYXQ6bGVmdDtwYWRkaW5nOjNweCA4cHg7YmFja2dyb3VuZDpncmVlbjt6LWluZGV4Ojk5OTtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6NjBweDtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I0ZFOEEyMztmb250LXNpemU6MTNweDtjdXJzb3I6cG9pbnRlcjsiPuWkjeWItuatpOmhtemdouWGheWuuTwvZGl2Pic7IAoJCQkkKCcubW9kLnJlYWRlci1wYWdlLmNvbXBsZXgsIC5wcHQtcGFnZS1pdGVtLCAubW9kLnJlYWRlci1wYWdlLW1vZC5jb21wbGV4LCAucmVhZGVyLXBhZ2Utd3JhcCcpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkkKHRoaXMpLnByZXBlbmQob25lUGFnZUNvcHlDb250ZW50SHRtbCk7CgkJCX0pOwoJCQkvL+WkjeWItuWFqOmDqOaWh+aho+WGheWuuQoJCQkkKCJib2R5Iikub24oImNsaWNrIiwiI2JhaWR1d2Vua3VfaGVscGVyX2NvcHlhbGxfYnRuIixmdW5jdGlvbigpewoJCQkJJHRoYXQuY29weWJhaWR1V2Vua3VBbGwoKTsKCQkJfSk7CgkJCS8v5aSN5Yi25q+P5LiA6aG15YaF5a65CgkJCSQoImJvZHkiKS5vbigiY2xpY2siLCIuYmFpZHV3ZW5rdV9oZWxwZXJfY29weV9vbmVwYWdlIixmdW5jdGlvbigpewoJCQkJdmFyICRpbm5lciA9ICQodGhpcykucGFyZW50KCIubW9kIikuZmluZCgiLmlubmVyIikKCQkJCSR0aGF0LmNvcHliYWlkdVdlbmt1T25lKCRpbm5lciwgdHJ1ZSk7CgkJCX0pOwoJCX1lbHNleyAvL+aWsOeahOS7mOi0uemhtemdogoJCQl2YXIgb25lUGFnZUNvcHlDb250ZW50SHRtbCA9ICc8ZGl2IGNsYXNzPSJiYWlkdXdlbmt1X2hlbHBlcl9jb3B5X29uZXBhZ2UiIHN0eWxlPSJmbG9hdDpsZWZ0O3BhZGRpbmc6M3B4IDhweDtiYWNrZ3JvdW5kOmdyZWVuO3otaW5kZXg6OTk5O3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDo2MHB4O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojRkU4QTIzO2ZvbnQtc2l6ZToxM3B4O2N1cnNvcjpwb2ludGVyOyI+5aSN5Yi25q2k6aG16Z2i5YaF5a65PC9kaXY+JzsgCgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7ICAvL+a3u+WKoOWkjeWItuaMiemSrgoJCQkJJCgnLnJlYWRlci1wYWdlJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQlpZigkKHRoaXMpLmZpbmQoIi5iYWlkdXdlbmt1X2hlbHBlcl9jb3B5X29uZXBhZ2UiKS5sZW5ndGg9PTApewoJCQkJCQkkKHRoaXMpLnByZXBlbmQob25lUGFnZUNvcHlDb250ZW50SHRtbCk7CgkJCQkJfQoJCQkJfSk7CgkJCX0sMjAwKTsKCQkJLy/lpI3liLblhajpg6jmlofmoaPlhoXlrrkKCQkJJCgiYm9keSIpLm9uKCJjbGljayIsIiNiYWlkdXdlbmt1X2hlbHBlcl9jb3B5YWxsX2J0biIsZnVuY3Rpb24oKXsKCQkJCSR0aGF0LmNvcHliYWlkdVdlbmt1QWxsX1ZJUCgpOwoJCQl9KTsKCQkJLy/lpI3liLbmr4/kuIDpobXlhoXlrrkKCQkJJCgiYm9keSIpLm9uKCJjbGljayIsICIuYmFpZHV3ZW5rdV9oZWxwZXJfY29weV9vbmVwYWdlIiwgZnVuY3Rpb24oKXsKCQkJCSR0aGF0LmNvcHliYWlkdVdlbmt1T25lX1ZJUCgkKHRoaXMpLnBhcmVudHMoIi5yZWFkZXItcGFnZSIpLCB0cnVlKTsKCQkJfSk7CgkJfQkJCgl9OwoJYmFpZHV3ZW5rdUhlbHBlcl8uc2hvd0JhaWR1Q29weUNvbnRlbnRCb3g9ZnVuY3Rpb24oc3RyKXsKCQl2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OwoJCXZhciBvcGFjaXR5ID0gJzAuOTUnOwoJCWlmICh1YS5pbmRleE9mKCJFZGdlIikgPj0gMCkgewoJCSAgICBvcGFjaXR5ID0gJzAuNic7CgkJfSBlbHNlewoJCSAgICBvcGFjaXR5ID0gJzAuOTUnOwoJCX0KCQl2YXIgY29weVRleHRCb3ggPSAnPGRpdiBpZD0iYmFpZHV3ZW5rdV9oZWxwZXJfY29weV90ZXh0X2JveCIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7cG9zaXRpb246IGZpeGVkO3otaW5kZXg6IDk5OTk7ZGlzcGxheTogYmxvY2s7dG9wOiAwcHg7bGVmdDogMHB4O2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwnICsgb3BhY2l0eSArICcpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDIwcHgpO2Rpc3BsYXk6IGZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Ij4nKwoJCQkJCQkJJzxkaXYgaWQ9ImJhaWR1d2Vua3VfaGVscGVyX2NvcHlfYm94X2Nsb3NlIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtwb3NpdGlvbjpmaXhlZDt0b3A6MHB4O2xlZnQ6MHB4OyI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjE2cHg7bWFyZ2luLXRvcDoyMHB4O3RleHQtYWxpZ246Y2VudGVyOyI+PGI+54K55Ye75paH5pys5aSW5YWz6Zet5by55qGGPC9iPjwvZGl2PjwvZGl2PicrCgkJCQkJCSAgCSc8cHJlIGlkPSJiYWlkdXdlbmt1X2hlbHBlcl9jb3B5X3RleHRfY29udGVudCIgc3R5bGU9InBhZGRpbmc6MjBweDtib3JkZXI6MXB4IHNvbGlkICNDQ0M7Ym9yZGVyLXJhZGl1czo0cHg7d2lkdGg6NjAlO2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjIycHg7ei1pbmRleDoxMDAwMDt3aGl0ZS1zcGFjZTpwcmUtd3JhcDt3aGl0ZS1zcGFjZTotbW96LXByZS13cmFwO3doaXRlLXNwYWNlOi1wcmUtd3JhcDt3aGl0ZS1zcGFjZTotby1wcmUtd3JhcDt3b3JkLXdyYXA6YnJlYWstd29yZDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjcwJTtvdmVyZmxvdzphdXRvOyI+PC9wcmU+JysKCQkJCQkJICAnPC9kaXY+Iic7CgkJJCgnI2JhaWR1d2Vua3VfaGVscGVyX2NvcHlfdGV4dF9ib3gnKS5yZW1vdmUoKTsKCSAgICAkKCdib2R5JykuYXBwZW5kKGNvcHlUZXh0Qm94KTsKCSAgICAkKCcjYmFpZHV3ZW5rdV9oZWxwZXJfY29weV90ZXh0X2NvbnRlbnQnKS5odG1sKHN0cik7CgkgICAgJCgnI2JhaWR1d2Vua3VfaGVscGVyX2NvcHlfYm94X2Nsb3NlJykuY2xpY2soZnVuY3Rpb24oKSB7CgkgICAgICAgJCgnI2JhaWR1d2Vua3VfaGVscGVyX2NvcHlfdGV4dF9ib3gnKS5yZW1vdmUoKTsKCSAgICB9KTsKCX07CgliYWlkdXdlbmt1SGVscGVyXy5zaG93RGlhbG9nPWZ1bmN0aW9uKHN0cil7CgkJdmFyIGRpYWxvZ0h0bWwgPSAnPGRpdiBpZD0iYmFpZHV3ZW5rdV9oZWxwZXJfZGlhbG9nIiBzdHlsZT0ibWFyZ2luOjBweCBhdXRvO29wYWNpdHk6MC44O3BhZGRpbmc6NXB4IDEwcHg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDogMTAwMDE7ZGlzcGxheTogYmxvY2s7Ym90dG9tOjMwcHg7bGVmdDo0NCU7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNDRTQ4MEY7Zm9udC1zaXplOjEzcHg7Ym9yZGVyLXJhZGl1czozcHg7Ij4nK3N0cisnPC9kaXY+JzsKCQkkKCcjYmFpZHV3ZW5rdV9oZWxwZXJfZGlhbG9nJykucmVtb3ZlKCk7CgkgICAgJCgnYm9keScpLmFwcGVuZChkaWFsb2dIdG1sKTsKCSAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkgICAgCSQoJyNiYWlkdXdlbmt1X2hlbHBlcl9kaWFsb2cnKS5yZW1vdmUoKTsKCSAgICB9LCAxNTAwKTsKCX07CgliYWlkdXdlbmt1SGVscGVyXy5vcGVuQWxsUGFnZT1mdW5jdGlvbigpewoJCS8vMjAyMS0wNy0xOQnnoLTop6PpnIDopoFWSVDmiY3og73miZPlvIDnmoTpmZDliLYKCQkvLyB2YXIgJGZvbGRQYWdlVGV4dCA9ICQoIi5mb2xkLXBhZ2UtdGV4dCIpOwoJCS8vICRmb2xkUGFnZVRleHQub24oImNsaWNrIiwgZnVuY3Rpb24oZSl7CgkJLy8gCXdpbmRvdy5zdG9wKCk7CgkJLy8gfSk7CgkJLy8yMDIxLTA5LTE4IOWPquacieeZu+W9leeUqOaIt+aJjeiDvea1j+iniOWZqOWFqOmDqAoJfTsKCWJhaWR1d2Vua3VIZWxwZXJfLmNvcHliYWlkdVdlbmt1QWxsX1ZJUD1mdW5jdGlvbigpeyAgLyoqKiDmlrDpobXpnaLlhoXlrrnmj5Dlj5YgKioqKi8KCQl2YXIgY29udGVudEh0bWwgPSAiIjsKCQl2YXIgdGhhdCA9IHRoaXM7CgkJJCgiLnJlYWRlci1wYWdlIikuZWFjaChmdW5jdGlvbigpewoJCQljb250ZW50SHRtbCArPSB0aGF0LmNvcHliYWlkdVdlbmt1T25lX1ZJUCgkKHRoaXMpLCBmYWxzZSk7CgkJfSk7CgkJaWYoISFjb250ZW50SHRtbCl7CgkJCXRoaXMuc2hvd0JhaWR1Q29weUNvbnRlbnRCb3goY29udGVudEh0bWwpOwoJCX1lbHNlewoJCQl0aGlzLnNob3dEaWFsb2coIuaPkOWPluaWh+aho+WGheWuueWksei0peS6hiIpOwoJCX0KCX07CgliYWlkdXdlbmt1SGVscGVyXy5jb3B5YmFpZHVXZW5rdU9uZV9WSVA9ZnVuY3Rpb24oJHBhZ2UsIGlzYXBwZW5kKXsKCQl2YXIgJHRoYXQgPSB0aGlzOwoJCXZhciBjb250ZW50SHRtbCA9ICIiOyAgLy/mj5Dlj5bmloflrZcKCQl2YXIgcGljTnVtID0gMDsgICAgICAgIC8v5Zu+54mH5pWw55uuCgkJdmFyIHBpY1RlbXBsYXRlID0gIjxkaXYgc3R5bGU9J21hcmdpbjoxMHB4IDBweDt0ZXh0LWFsaWduOmNlbnRlcjsnPjxpbWcgc3JjPSdAJyB3aWR0aD0nOTAlJz48ZGl2Pl9fX1/lm74oIylfX19fPC9kaXY+PC9kaXY+IjsKCQkKCQkvL3dvcmTvvIx4bHN457G75Z6L55qE5paH5qGjCgkJJHBhZ2UuZmluZCgiLnJlYWRlci1waWMtbGF5ZXIsLnJlYWRlci10eHQtbGF5ZXIiKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCWlmKCQodGhpcykuaGFzQ2xhc3MoInJlYWRlci1waWMtbGF5ZXIiKSl7CgkJCQkkKHRoaXMpLmZpbmQoImltZyIpLmVhY2goZnVuY3Rpb24oKXsKCQkJCQl2YXIgaW1hZ2V1cmwgPSAkKHRoaXMpLmF0dHIoInNyYyIpOwoJCQkJCWlmKCEhaW1hZ2V1cmwpewoJCQkJCQlwaWNOdW0rKzsKCQkJCQkJdmFyIGltYWdlSHRtbCA9IHBpY1RlbXBsYXRlOwoJCQkJCQlpbWFnZUh0bWwgPSBpbWFnZUh0bWwucmVwbGFjZSgvIy9nLHBpY051bSk7CgkJCQkJCWltYWdlSHRtbCA9IGltYWdlSHRtbC5yZXBsYWNlKC9AL2csaW1hZ2V1cmwpOwoJCQkJCQljb250ZW50SHRtbCArPSBpbWFnZUh0bWw7CgkJCQkJfQoJCQkJfSk7CgkJCX1lbHNlewoJCQkJJCh0aGlzKS5maW5kKCIucmVhZGVyLXdvcmQtbGF5ZXIiKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJY29udGVudEh0bWwgKz0gJCh0aGlzKS50ZXh0KCkucmVwbGFjZSgvXHUyMDAyL2csICcgJyk7CgkJCQl9KTsKCQkJfQoJCX0pOwoJCQoJCS8vdHh057G75Z6L55qE5paH5qGjCgkJJHBhZ2UuZmluZCgiLnAtdHh0IikuZWFjaChmdW5jdGlvbigpewoJCQljb250ZW50SHRtbCArPSAkKHRoaXMpLnRleHQoKS5yZXBsYWNlKC9cdTIwMDIvZywgJyAnKTsKCQl9KTsKCQkKCQljb250ZW50SHRtbCA9IGNvbnRlbnRIdG1sLnJlcGxhY2UoL+OAglxzL2csICfjgIJcclxuJyk7CgkJaWYoISFjb250ZW50SHRtbCl7CgkJCWlmKGlzYXBwZW5kKXsKCQkJCSR0aGF0LnNob3dCYWlkdUNvcHlDb250ZW50Qm94KGNvbnRlbnRIdG1sKTsKCQkJfQoJCQlyZXR1cm4gY29udGVudEh0bWw7CgkJfWVsc2V7CgkJCWlmKGlzYXBwZW5kKXsKCQkJCSR0aGF0LnNob3dEaWFsb2coIuaPkOWPluaWh+aho+WGheWuueWksei0peS6hiIpOwoJCQl9CgkJCXJldHVybiAiIjsKCQl9Cgl9OwoJYmFpZHV3ZW5rdUhlbHBlcl8uY29weWJhaWR1V2Vua3VBbGw9ZnVuY3Rpb24oKXsgLyoqKiDml6fpobXpnaLlhoXlrrnmj5Dlj5YgKioqKi8KCQl2YXIgY29udGVudEh0bWwgPSAiIjsKCQl2YXIgdGhhdCA9IHRoaXM7CgkJJCgiLmlubmVyIikuZWFjaChmdW5jdGlvbigpewoJCQljb250ZW50SHRtbCArPSB0aGF0LmNvcHliYWlkdVdlbmt1T25lKCQodGhpcyksIGZhbHNlKTsKCQl9KTsKCQlpZighIWNvbnRlbnRIdG1sKXsKCQkJdGhpcy5zaG93QmFpZHVDb3B5Q29udGVudEJveChjb250ZW50SHRtbCk7CgkJfWVsc2V7CgkJCXRoaXMuc2hvd0RpYWxvZygi5o+Q5Y+W5paH5qGj5YaF5a655aSx6LSl5LqGIik7CgkJfQoJfTsKCWJhaWR1d2Vua3VIZWxwZXJfLmNvcHliYWlkdVdlbmt1T25lPWZ1bmN0aW9uKCRpbm5lciwgaXNhcHBlbmQpewoJCXZhciAkdGhhdCA9IHRoaXM7CgkJdmFyIHN0ciA9ICIiOyAgLy/mj5Dlj5bmloflrZcKCQkKCQkkaW5uZXIuZmluZCgnLnJlYWRlci13b3JkLWxheWVyJykuZWFjaChmdW5jdGlvbigpewoJCQlzdHIgKz0gJCh0aGlzKS50ZXh0KCkucmVwbGFjZSgvXHUyMDAyL2csICcgJyk7CgkJfSk7CgkJJGlubmVyLmZpbmQoJy5wLXR4dCcpLmVhY2goZnVuY3Rpb24oKXsKCQkJc3RyICs9ICQodGhpcykudGV4dCgpLnJlcGxhY2UoL1x1MjAwMi9nLCAnICcpOwoJCX0pOwoJCXN0ciA9IHN0ci5yZXBsYWNlKC/jgIJccy9nLCAn44CCXHJcbicpOwoJCQoJCS8v5o+Q5Y+WY3Nz5Lit55qE5Zu+54mHCgkJdmFyIHBpY0h0bWwgPSAiIjsKCQl2YXIgcGljVXJsUmVnID0gL1woKChcJ3xcIik/aHR0cHMuKj8pXCkvaTsKCQl2YXIgY3NzVXJsID0gIiI7CgkJdmFyIHBpY051bSA9IDA7CgkJdmFyIHBpY1VybExlbmd0aE1pbiA9IDY1OwoJCXZhciBwaWNUZW1wbGF0ZSA9ICI8ZGl2IHN0eWxlPSdtYXJnaW46MTBweCAwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Jz48aW1nIHNyYz0nQCcgd2lkdGg9JzkwJSc+PGRpdj5fX19f5Zu+KCMpX19fXzwvZGl2PjwvZGl2PiI7CgkJJGlubmVyLmZpbmQoJy5yZWFkZXItcGljLWl0ZW0nKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCWNzc1VybD0gJCh0aGlzKS5jc3MoImJhY2tncm91bmQtaW1hZ2UiKTsKCQkJaWYoISFjc3NVcmwgJiYgKGNzc1VybC5pbmRleE9mKCJodHRwcyIpIT0tMSB8fCBjc3NVcmwuaW5kZXhPZigiSFRUUFMiKSE9LTEpKXsKCQkJCXZhciBhcnJheSA9IGNzc1VybC5tYXRjaChwaWNVcmxSZWcpOwoJCQkJaWYoYXJyYXkubGVuZ3RoPjEpewoJCQkJCWNzc1VybCA9IGFycmF5WzFdLnJlcGxhY2UoL1wiL2csICIiKTsKCQkJCQlpZighIWNzc1VybCAmJiBjc3NVcmwubGVuZ3RoPnBpY1VybExlbmd0aE1pbil7CgkJCQkJCXBpY051bSArKzsKCQkJCQkJdmFyIG9uZVBpYyA9IHBpY1RlbXBsYXRlOwoJCQkJCQlvbmVQaWMgPSBvbmVQaWMucmVwbGFjZSgvIy9nLHBpY051bSk7CgkJCQkJCW9uZVBpYyA9IG9uZVBpYy5yZXBsYWNlKC9AL2csY3NzVXJsKTsKCQkJCQkJcGljSHRtbCArPSBvbmVQaWM7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCX0pOwoJCQoJCXZhciBzcmNVcmwgPSAiIjsKCQkkaW5uZXIuZmluZCgnaW1nJykuZWFjaChmdW5jdGlvbigpewoJCQlzcmNVcmwgPSAkKHRoaXMpLmF0dHIoInNyYyIpOwoJCQlpZighIXNyY1VybCAmJiBzcmNVcmwubGVuZ3RoPnBpY1VybExlbmd0aE1pbiAmJiBzcmNVcmwuaW5kZXhPZigiaHR0cHM6Ly93a3JldHlwZSIpIT0tMSl7CgkJCQlwaWNOdW0gKys7CgkJCQl2YXIgb25lUGljID0gcGljVGVtcGxhdGU7CgkJCQlvbmVQaWMgPSBvbmVQaWMucmVwbGFjZSgvIy9nLHBpY051bSk7CgkJCQlvbmVQaWMgPSBvbmVQaWMucmVwbGFjZSgvQC9nLHNyY1VybCk7CgkJCQlwaWNIdG1sICs9IG9uZVBpYzsKCQkJfQoJCX0pOwoJCQoJCS8v6L+95Yqg5YaF5a65CgkJdmFyIGNvbnRlbnRIdG1sID0gc3RyK3BpY0h0bWw7CgkJaWYoISFjb250ZW50SHRtbCAmJiBjb250ZW50SHRtbC5sZW5ndGg+MCl7CgkJCWlmKGlzYXBwZW5kKXsKCQkJCSR0aGF0LnNob3dCYWlkdUNvcHlDb250ZW50Qm94KGNvbnRlbnRIdG1sKTsKCQkJfQoJCQlyZXR1cm4gY29udGVudEh0bWw7CgkJfWVsc2V7CgkJCWlmKGlzYXBwZW5kKXsKCQkJCSR0aGF0LnNob3dEaWFsb2coIuaPkOWPluaWh+aho+WGheWuueWksei0peS6hiIpOwoJCQl9CgkJCXJldHVybiAiIjsKCQl9Cgl9OwoJYmFpZHV3ZW5rdUhlbHBlcl8uc3RhcnQ9ZnVuY3Rpb24oKXsKCQlpZih0aGlzLmlzUnVuKCkpewkJCQoJCQl0aGlzLmdlbmVyYXRlSHRtbCgpOwoJCQl0aGlzLnJlbW92ZUFEKCk7CgkJfQoJfTsKCWJhaWR1d2Vua3VIZWxwZXJfLnN0YXJ0KCk7Cn0pKCk7CgovKioKICog5L2c6ICF5aSH5rOo77yaCiAqIOeOi+i2heWFiOeUn+eahOefpeS5juinhumikeS4i+i9veiEmuacrOS7o+eggemdnuW4uOeyvueCvO+8jOaIkeiupOS4uuatpOWKn+iDveS4jemcgOimgeWGjeS6jOasoee8luWGmeS6hgogKiDmraTpg6jliIbku6PnoIHlt7Lojrflvpfljp/kvZzogIXmjojmnYPlkIzmhI/vvIzlubbnrKblkIhNSVTljY/orq7vvIzor7fnn6XmgonvvIEKICogCiAqIOS4i+i9veefpeS5juinhumike+8jOS9nOiAhe+8mueOi+i2he+8jCDohJrmnKzpk77mjqXvvJpodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvMzkyMDYKICog54mI5pys77yaMS4zMAogKiDniYjmnYPlvZLljp/kvZzogIXmiYDmnIkKICovCihhc3luYyAoKSA9PiB7CiAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0ID09ICd3d3cuemhpaHUuY29tJykgcmV0dXJuOwogCiAgY29uc29sZS5sb2coJ+efpeS5juinhumikeS4i+i9vTonKTsKIAogIGNvbnN0IHBsYXlsaXN0QmFzZVVybCA9ICdodHRwczovL2xlbnMuemhpaHUuY29tL2FwaS92NC92aWRlb3MvJzsKICAvLyBjb25zdCB2aWRlb0Jhc2VVcmwgPSAnaHR0cHM6Ly92aWRlby56aGlodS5jb20vdmlkZW8vJzsKICBjb25zdCB2aWRlb0lkID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCk7IC8vIOinhumikWlkCiAgY29uc3QgbWVudVN0eWxlID0gJ3RyYW5zZm9ybTpub25lICFpbXBvcnRhbnQ7IGxlZnQ6YXV0byAhaW1wb3J0YW50OyByaWdodDotMC41ZW0gIWltcG9ydGFudDsnOwogIGNvbnN0IHBsYXllcklkID0gJ3BsYXllcic7CiAgY29uc3QgY292ZXJTZWxlY3RvciA9ICcjJyArIHBsYXllcklkICsgJyA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpudGgtb2YtdHlwZSgyKSc7CiAgY29uc3QgY29udHJvbEJhclNlbGVjdG9yID0gJyMnICsgcGxheWVySWQgKyAnID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2Omxhc3QtY2hpbGQgPiBkaXY6bGFzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCc7CiAgY29uc3Qgc3ZnRG93bmxvYWQgPSAnPHBhdGggZD0iTTkuNSw0IEgxNC41IFYxMCBIMTcuOCBMMTIsMTUuOCBMNi4yLDEwIEg5LjUgWiBNNi4yLDE4IEgxNy44IFYyMCBINi4yIFoiPjwvcGF0aD4nOwogIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsYXllcklkKTsKICAvLyBjb25zdCByZXNvbHV0aW9ucyA9IHsn5pmu5riFJzogJ2xkJywgJ+agh+a4hSc6ICdzZCcsICfpq5jmuIUnOiAnaGQnLCAn6LaF5riFJzogJ2ZoZCd9OwogIGNvbnN0IHJlc29sdXRpb25zID0gWwogICAge2VuYW1lOiAnbGQnLCBjbmFtZTogJ+aZrua4hSd9LAogICAge2VuYW1lOiAnc2QnLCBjbmFtZTogJ+agh+a4hSd9LAogICAge2VuYW1lOiAnaGQnLCBjbmFtZTogJ+mrmOa4hSd9LAogICAge2VuYW1lOiAnZmhkJywgY25hbWU6ICfotoXmuIUnfQogIF07CiAgbGV0IHZpZGVvcyA9IFtdOyAvLyDlrZjlgqjlkITliIbovqjnjofnmoTop4bpopHkv6Hmga8KIAogIGZ1bmN0aW9uIGZldGNoUmV0cnkgKHVybCwgb3B0aW9ucyA9IHt9LCB0aW1lcyA9IDEsIGRlbGF5ID0gMTAwMCwgY2hlY2tTdGF0dXMgPSB0cnVlKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAvLyBmZXRjaCDmiJDlip/lpITnkIblh73mlbAKICAgICAgZnVuY3Rpb24gc3VjY2VzcyAocmVzKSB7CiAgICAgICAgaWYgKGNoZWNrU3RhdHVzICYmICFyZXMub2spIHsKICAgICAgICAgIGZhaWx1cmUocmVzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICByZXNvbHZlKHJlcyk7CiAgICAgICAgfQogICAgICB9CiAKICAgICAgLy8g5Y2V5qyh5aSx6LSl5aSE55CG5Ye95pWwCiAgICAgIGZ1bmN0aW9uIGZhaWx1cmUgKGVycm9yKSB7CiAgICAgICAgaWYgKC0tdGltZXMpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZmV0Y2hVcmwsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogCiAgICAgIC8vIOaAu+S9k+Wksei0peWkhOeQhuWHveaVsAogICAgICBmdW5jdGlvbiBmaW5hbEhhbmRsZXIgKGVycm9yKSB7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KIAogICAgICBmdW5jdGlvbiBmZXRjaFVybCAoKSB7CiAgICAgICAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucykKICAgICAgICAgIC50aGVuKHN1Y2Nlc3MpCiAgICAgICAgICAuY2F0Y2goZmFpbHVyZSkKICAgICAgICAgIC5jYXRjaChmaW5hbEhhbmRsZXIpOwogICAgICB9CiAKICAgICAgZmV0Y2hVcmwoKTsKICAgIH0pOwogIH0KIAogIC8vIOS4i+i9veaMh+WumnVybOeahOi1hOa6kAogIGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkVXJsICh1cmwsIG5hbWUgPSAobmV3IERhdGUoKSkudmFsdWVPZigpICsgJy5tcDQnKSB7CiAgICAvLyBHcmVhc2Vtb25rZXkg6ZyA6KaB5oqKIHVybCDovazkuLogYmxvYlVybAogICAgaWYgKEdNX2luZm8uc2NyaXB0SGFuZGxlciA9PT0gJ0dyZWFzZW1vbmtleScpIHsKICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hSZXRyeSh1cmwpOwogICAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzLmJsb2IoKTsKICAgICAgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgIH0KIAogICAgLy8gQ2hyb21lIOWPr+S7peS9v+eUqCBUYW1wZXJtb25rZXkg55qEIEdNX2Rvd25sb2FkIOWHveaVsOe7lei/hyBDU1AoQ29udGVudCBTZWN1cml0eSBQb2xpY3kpIOeahOmZkOWItgogICAgaWYgKHdpbmRvdy5HTV9kb3dubG9hZCkgewogICAgICBHTV9kb3dubG9hZCh7dXJsLCBuYW1lfSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLy8gZmlyZWZveCDpnIDopoHnpoHnlKggQ1NQLCBhYm91dDpjb25maWcgLT4gc2VjdXJpdHkuY3NwLmVuYWJsZSA9PiBmYWxzZQogICAgICBsZXQgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgYS5ocmVmID0gdXJsOwogICAgICBhLmRvd25sb2FkID0gbmFtZTsKICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAvLyBhLnRhcmdldCA9ICdfYmxhbmsnOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgICBhLmNsaWNrKCk7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7CiAKICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCksIDEwMCk7CiAgICB9CiAgfQogCiAgLy8g5qC85byP5YyW5paH5Lu25aSn5bCPCiAgZnVuY3Rpb24gaHVtYW5TaXplIChzaXplKSB7CiAgICBsZXQgbiA9IE1hdGgubG9nKHNpemUpIC8gTWF0aC5sb2coMTAyNCkgfCAwOwogICAgcmV0dXJuIChzaXplIC8gTWF0aC5wb3coMTAyNCwgbikpLnRvRml4ZWQoMCkgKyAnICcgKyAobiA/ICdLTUdUUEVaWSdbLS1uXSArICdCJyA6ICdCeXRlcycpOwogIH0KIAogIGlmICghcGxheWVyKSByZXR1cm47CiAKICAvLyDojrflj5bop4bpopHkv6Hmga8KICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFJldHJ5KHBsYXlsaXN0QmFzZVVybCArIHZpZGVvSWQsIHsKICAgIGhlYWRlcnM6IHsKICAgICAgJ3JlZmVyZXInOiAncmVmZXJlckJhc2VVcmwgKyB2aWRlb0lkJywKICAgICAgJ2F1dGhvcml6YXRpb24nOiAnb2F1dGggYzNjZWY3YzY2YTE4NDNmOGIzYTllNmExZTMxNjBlMjAnIC8vIGluIHpwbGF5ZXIubWluLmpzIG9mIHpoaWh1CiAgICB9CiAgfSwgMyk7CiAgY29uc3QgdmlkZW9JbmZvID0gYXdhaXQgcmVzLmpzb24oKTsKIAogIC8vIOiOt+WPluS4jeWQjOWIhui+qOeOh+inhumikeeahOS/oeaBrwogIGZvciAoY29uc3QgW2tleSwgdmlkZW9dIG9mIE9iamVjdC5lbnRyaWVzKHZpZGVvSW5mby5wbGF5bGlzdCkpIHsKICAgIHZpZGVvLm5hbWUgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgIHZpZGVvLmNuYW1lID0gcmVzb2x1dGlvbnMuZmluZCh2ID0+IHYuZW5hbWUgPT09IHZpZGVvLm5hbWUpPy5jbmFtZQogICAgaWYgKCF2aWRlb3MuZmluZCh2ID0+IHYuc2l6ZSA9PT0gdmlkZW8uc2l6ZSkpIHsKICAgICAgdmlkZW9zLnB1c2godmlkZW8pOwogICAgfQogIH0KIAogIC8vIOaMieagvOW8j+Wkp+Wwj+aOkuW6jwogIHZpZGVvcyA9IHZpZGVvcy5zb3J0KGZ1bmN0aW9uICh2MSwgdjIpIHsKICAgIGNvbnN0IHYxSW5kZXggPSByZXNvbHV0aW9ucy5maW5kSW5kZXgodiA9PiB2LmVuYW1lID09PSB2MS5uYW1lKTsKICAgIGNvbnN0IHYySW5kZXggPSByZXNvbHV0aW9ucy5maW5kSW5kZXgodiA9PiB2LmVuYW1lID09PSB2Mi5uYW1lKTsKIAogICAgcmV0dXJuIHYxSW5kZXggPT09IHYySW5kZXggPyAwIDogKHYxSW5kZXggPiB2MkluZGV4ID8gMSA6IC0xKTsKICAgIC8vIHJldHVybiB2MS5zaXplID09PSB2Mi5zaXplID8gMCA6ICh2MS5zaXplID4gdjIuc2l6ZSA/IDEgOiAtMSk7CiAgfSkucmV2ZXJzZSgpOwogCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgKGV2dCkgPT4gewogICAgY29uc3QgZG9tQ29udHJvbEJhciA9IGV2dC5yZWxhdGVkTm9kZS5xdWVyeVNlbGVjdG9yKCc6c2NvcGUgPiBkaXY6bGFzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpudGgtb2YtdHlwZSgyKScpOwogICAgaWYgKCFkb21Db250cm9sQmFyIHx8IGRvbUNvbnRyb2xCYXIucXVlcnlTZWxlY3RvcignLmRvd25sb2FkJykpIHJldHVybjsKIAogICAgY29uc3QgZG9tQnV0dG9uc0JhciA9IGRvbUNvbnRyb2xCYXIucXVlcnlTZWxlY3RvcignOnNjb3BlID4gZGl2Omxhc3QtY2hpbGQnKTsKICAgIGNvbnN0IGRvbUZ1bGxTY3JlZW5CdG4gPSBkb21CdXR0b25zQmFyLnF1ZXJ5U2VsZWN0b3IoJzpzY29wZSA+IGRpdjpudGgtbGFzdC1vZi10eXBlKDIpJyk7CiAgICBjb25zdCBkb21SZXNvbHV0aW9uQnRuID0gQXJyYXkuZnJvbShkb21CdXR0b25zQmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IGRpdicpKS5maWx0ZXIoZWwgPT4gZWwuaW5uZXJUZXh0LnN1YnN0cigxLCAxKSA9PT0gJ+a4hScpWzBdOwogICAgbGV0IGRvbURvd25sb2FkQnRuLCBkZWZhdWx0UmVzb2x1dGlvbiwgYnV0dG9uczsKICAgIGlmICghZG9tRnVsbFNjcmVlbkJ0biB8fCAhZG9tRnVsbFNjcmVlbkJ0bi5xdWVyeVNlbGVjdG9yKCdidXR0b24nKSkgcmV0dXJuOwogCiAgICAvLyDlhYvpmobliIbovqjnjofoj5zljZXmiJblhajlsY/mjInpkq7kuLrkuIvovb3mjInpkq4KICAgIGRvbURvd25sb2FkQnRuID0gKGRvbVJlc29sdXRpb25CdG4gJiYgKGRvbVJlc29sdXRpb25CdG4uY2xhc3NOYW1lID09PSBkb21GdWxsU2NyZWVuQnRuLmNsYXNzTmFtZSkpCiAgICAgID8gZG9tUmVzb2x1dGlvbkJ0bi5jbG9uZU5vZGUodHJ1ZSkKICAgICAgOiBkb21GdWxsU2NyZWVuQnRuLmNsb25lTm9kZSh0cnVlKTsKIAogICAgZGVmYXVsdFJlc29sdXRpb24gPSBkb21Eb3dubG9hZEJ0bi5xdWVyeVNlbGVjdG9yKCdidXR0b24nKS5pbm5lclRleHQ7CiAKICAgIC8vIOeUn+aIkOS4i+i9veaMiemSruWbvuaghwogICAgZG9tRG93bmxvYWRCdG4ucXVlcnlTZWxlY3RvcignYnV0dG9uOmZpcnN0LWNoaWxkJykub3V0ZXJIVE1MID0gZG9tRnVsbFNjcmVlbkJ0bi5jbG9uZU5vZGUodHJ1ZSkucXVlcnlTZWxlY3RvcignYnV0dG9uJykub3V0ZXJIVE1MOwogICAgZG9tRG93bmxvYWRCdG4ucXVlcnlTZWxlY3Rvcignc3ZnJykuaW5uZXJIVE1MID0gc3ZnRG93bmxvYWQ7CiAgICBkb21Eb3dubG9hZEJ0bi5jbGFzc05hbWUgPSBkb21Eb3dubG9hZEJ0bi5jbGFzc05hbWUgKyAnIGRvd25sb2FkJzsKIAogICAgYnV0dG9ucyA9IGRvbURvd25sb2FkQnRuLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpOwogCiAgICAvLyBidXR0b24g5YWD57Sg5re75Yqg5a+55bqU55qE5LiL6L295Zyw5Z2A5bGe5oCnCiAgICBidXR0b25zLmZvckVhY2goZG9tID0+IHsKICAgICAgY29uc3QgdmlkZW8gPSB2aWRlb3MuZmluZCh2ID0+IHYuY25hbWUgPT09IGRvbS5pbm5lclRleHQpIHx8IHZpZGVvc1t2aWRlb3MubGVuZ3RoIC0gMV07CiAKICAgICAgZG9tLmRhdGFzZXQudmlkZW8gPSB2aWRlby5wbGF5X3VybDsKICAgICAgaWYgKGRvbS5pbm5lclRleHQpIHsKICAgICAgICAoZG9tLmlubmVyVGV4dCA9IGAke2RvbS5pbm5lclRleHR9ICgke2h1bWFuU2l6ZSh2aWRlby5zaXplKX0pYCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoYnV0dG9ucy5sZW5ndGggPT0gMSkgewogICAgICAgIGRvbS5uZXh0U2libGluZy5xdWVyeVNlbGVjdG9yKCdkaXYnKS5pbm5lclRleHQgPSBodW1hblNpemUodmlkZW8uc2l6ZSk7CiAgICAgIH0KICAgIH0pOwogCiAgICAvLyDpvKDmoIfkuovku7YgLSDmmL7npLroj5zljZUKICAgIGRvbURvd25sb2FkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicsICgpID0+IHsKICAgICAgY29uc3QgZG9tTWVudSA9IGRvbURvd25sb2FkQnRuLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgxKScpOwogICAgICBpZiAoZG9tTWVudSkgewogICAgICAgIGRvbU1lbnUuc3R5bGUuY3NzVGV4dCA9IG1lbnVTdHlsZSArICdvcGFjaXR5OjEgIWltcG9ydGFudDsgdmlzaWJpbGl0eTp2aXNpYmxlICFpbXBvcnRhbnQnOwogICAgICB9CiAgICB9KTsKIAogICAgLy8g6byg5qCH5LqL5Lu2IC0g6ZqQ6JeP6I+c5Y2VCiAgICBkb21Eb3dubG9hZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCAoKSA9PiB7CiAgICAgIGNvbnN0IGRvbU1lbnUgPSBkb21Eb3dubG9hZEJ0bi5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMSknKTsKICAgICAgaWYgKGRvbU1lbnUpIHsKICAgICAgICBkb21NZW51LnN0eWxlLmNzc1RleHQgPSBtZW51U3R5bGU7CiAgICAgIH0KICAgIH0pOwogCiAgICAvLyDpvKDmoIfkuovku7YgLSDpgInmi6noj5zljZXpobkKICAgIGRvbURvd25sb2FkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGV2ZW50ID0+IHsKICAgICAgbGV0IGUgPSBldmVudC5zcmNFbGVtZW50IHx8IGV2ZW50LnRhcmdldDsKIAogICAgICB3aGlsZSAoZS50YWdOYW1lICE9PSAnQlVUVE9OJykgewogICAgICAgIGUgPSBlLnBhcmVudE5vZGU7CiAgICAgIH0KIAogICAgICBkb3dubG9hZFVybChlLmRhdGFzZXQudmlkZW8pOwogICAgfSk7CiAKICAgIC8vIOaYvuekuuS4i+i9veaMiemSrgogICAgZG9tQnV0dG9uc0Jhci5hcHBlbmRDaGlsZChkb21Eb3dubG9hZEJ0bik7CiAgfSk7Cn0pKCk7CgovL2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8zODI0MjYKLy95b3V0dWJl6Ieq5Yqo5YiH5o2i5Lit5paH5a2X5bmVCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIAogICAgdmFyIHdpbmRvd191cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgIHZhciB3ZWJzaXRlX2hvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKICAgIAogICAgaWYod2Vic2l0ZV9ob3N0LmluZGV4T2YoInlvdXR1YmUuY29tIik9PS0xKXsgIC8v5LiN5piveW91dHViZeWwseS4jeaJp+ihjAogICAgCXJldHVybjsKICAgIH0KICAgIHZhciBsYW5nID0gbnVsbDsKICAgIGZ1bmN0aW9uIGk4bkluaXQoKXsKICAgICAgICB0cnl7CiAgICAgICAgICAgIGxhbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykuZ2V0QXR0cmlidXRlKCdsYW5nJykudHJpbSgpOwogICAgICAgIH1jYXRjaChlcnIpewoKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyKHRleHQpIHsKICAgICAgICBzd2l0Y2gobGFuZykgewogICAgICAgICAgICBjYXNlICd6aC1DTic6CiAgICAgICAgICAgIGNhc2UgJ3poJzoKICAgICAgICAgICAgICAgIHJldHVybiBpOG5aaEhhbnModGV4dCk7CiAgICAgICAgICAgIGNhc2UgJ3poLVRXJzoKICAgICAgICAgICAgY2FzZSAnemgtSEsnOgogICAgICAgICAgICAgICAgcmV0dXJuIGk4blpoSGFudCh0ZXh0KTsKICAgICAgICAgICAgY2FzZSAnZW4tVVMnOgogICAgICAgICAgICBjYXNlICdlbic6CiAgICAgICAgICAgIGNhc2UgJ2VuLUdCJzoKICAgICAgICAgICAgICAgIHJldHVybiBpOG5FblVTKHRleHQpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGk4blpoSGFucyh0ZXh0KSB7CiAgICAgICAgc3dpdGNoKHRleHQpewogICAgICAgICAgICBjYXNlICflvIDlkK/nv7vor5HlrZfluZUnOgogICAgICAgICAgICBjYXNlICflhbPpl63nv7vor5HlrZfluZUnOgogICAgICAgICAgICBjYXNlICflrZfluZUnOgogICAgICAgICAgICBjYXNlICfmt7vliqDlrZfluZUnOgogICAgICAgICAgICBjYXNlICflhbPpl60nOgogICAgICAgICAgICBjYXNlICfkuK3mlocnOgogICAgICAgICAgICBjYXNlICfnroDkvZMnOgogICAgICAgICAgICBjYXNlICfnuYHkvZMnOgogICAgICAgICAgICBjYXNlICflj7Dmub4nOgogICAgICAgICAgICBjYXNlICfpppnmuK8nOgogICAgICAgICAgICBjYXNlICfoh6rliqjnv7vor5EnOgogICAgICAgICAgICBjYXNlICfoh6rliqjnlJ/miJAnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQoKICAgIGZ1bmN0aW9uIGk4blpoSGFudCh0ZXh0KSB7CiAgICAgICAgc3dpdGNoKHRleHQpewogICAgICAgICAgICBjYXNlICflvIDlkK/nv7vor5HlrZfluZUnOgogICAgICAgICAgICAgICAgcmV0dXJuICfplovllZ/nv7vora/lrZfluZUnOwogICAgICAgICAgICBjYXNlICflhbPpl63nv7vor5HlrZfluZUnOgogICAgICAgICAgICAgICAgcmV0dXJuICfpl5zplonnv7vora/lrZfluZUnOwogICAgICAgICAgICBjYXNlICflrZfluZUnOgogICAgICAgICAgICAgICAgcmV0dXJuICflrZfluZUnOwogICAgICAgICAgICBjYXNlICfmt7vliqDlrZfluZUnOgogICAgICAgICAgICAgICAgcmV0dXJuICfmlrDlop7lrZfluZUnOwogICAgICAgICAgICBjYXNlICflhbPpl60nOgogICAgICAgICAgICAgICAgcmV0dXJuICfpl5zploknOwogICAgICAgICAgICBjYXNlICfkuK3mlocnOgogICAgICAgICAgICAgICAgcmV0dXJuICfkuK3mlocnOwogICAgICAgICAgICBjYXNlICfnroDkvZMnOgogICAgICAgICAgICAgICAgcmV0dXJuICfnsKHpq5QnOwogICAgICAgICAgICBjYXNlICfnuYHkvZMnOgogICAgICAgICAgICAgICAgcmV0dXJuICfnuYHpq5QnOwogICAgICAgICAgICBjYXNlICflj7Dmub4nOgogICAgICAgICAgICAgICAgcmV0dXJuICflj7DngaMnOwogICAgICAgICAgICBjYXNlICfpppnmuK8nOgogICAgICAgICAgICAgICAgcmV0dXJuICfpppnmuK8nOwogICAgICAgICAgICBjYXNlICfoh6rliqjnv7vor5EnOgogICAgICAgICAgICAgICAgcmV0dXJuICfoh6rli5Xnv7vora8nOwogICAgICAgICAgICBjYXNlICfoh6rliqjnlJ/miJAnOgogICAgICAgICAgICAgICAgcmV0dXJuICfoh6rli5XnlKLnlJ8nCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CgogICAgZnVuY3Rpb24gaThuRW5VUyh0ZXh0KSB7CiAgICAgICAgc3dpdGNoKHRleHQpewogICAgICAgICAgICBjYXNlICflvIDlkK/nv7vor5HlrZfluZUnOgogICAgICAgICAgICAgICAgcmV0dXJuICdUdXJuIG9uIHN1YnRpdGxlcyc7CiAgICAgICAgICAgIGNhc2UgJ+WFs+mXree/u+ivkeWtl+W5lSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1R1cm4gb2ZmIHN1YnRpdGxlcyc7CiAgICAgICAgICAgIGNhc2UgJ+Wtl+W5lSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1N1YnRpdGxlcy9DQyc7CiAgICAgICAgICAgIGNhc2UgJ+a3u+WKoOWtl+W5lSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ2FkZCBzdWJ0aXRsZXMvQ0MnOwogICAgICAgICAgICBjYXNlICflhbPpl60nOgogICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnOwogICAgICAgICAgICBjYXNlICfkuK3mlocnOgogICAgICAgICAgICAgICAgcmV0dXJuICdDaGluZXNlIChTaW1wbGlmaWVkKSc7CiAgICAgICAgICAgIGNhc2UgJ+eugOS9kyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ0NoaW5lc2UgKFNpbXBsaWZpZWQpJzsKICAgICAgICAgICAgY2FzZSAn57mB5L2TJzoKICAgICAgICAgICAgICAgIHJldHVybiAnQ2hpbmVzZSAoVHJhZGl0aW9uYWwpJzsKICAgICAgICAgICAgY2FzZSAn5Y+w5rm+JzoKICAgICAgICAgICAgICAgIHJldHVybiAnQ2hpbmVzZSAoVGFpd2FuKSc7CiAgICAgICAgICAgIGNhc2UgJ+mmmea4ryc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ0NoaW5lc2UgKEhvbmcgS29uZyknOwogICAgICAgICAgICBjYXNlICfoh6rliqjnv7vor5EnOgogICAgICAgICAgICAgICAgcmV0dXJuICdBdXRvLXRyYW5zbGF0ZSc7CiAgICAgICAgICAgIGNhc2UgJ+iHquWKqOeUn+aIkCc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ2F1dG8tZ2VuZXJhdGVkJwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRBYnNQb3NpdGlvbihlbCl7CiAgICAgICAgdmFyIGVsMiA9IGVsOwogICAgICAgIHZhciBjdXJ0b3AgPSAwOwogICAgICAgIHZhciBjdXJsZWZ0ID0gMDsKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgfHwgZG9jdW1lbnQuYWxsKSB7CiAgICAgICAgICAgIGRvICB7CiAgICAgICAgICAgICAgICBjdXJsZWZ0ICs9IGVsLm9mZnNldExlZnQtZWwuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgIGN1cnRvcCArPSBlbC5vZmZzZXRUb3AtZWwuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgZWwgPSBlbC5vZmZzZXRQYXJlbnQ7CiAgICAgICAgICAgICAgICBlbDIgPSBlbDIucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIHdoaWxlIChlbDIgIT0gZWwpIHsKICAgICAgICAgICAgICAgICAgICBjdXJsZWZ0IC09IGVsMi5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgICAgIGN1cnRvcCAtPSBlbDIuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgIGVsMiA9IGVsMi5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlIChlbC5vZmZzZXRQYXJlbnQpOwoKICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmxheWVycykgewogICAgICAgICAgICBjdXJ0b3AgKz0gZWwueTsKICAgICAgICAgICAgY3VybGVmdCArPSBlbC54OwogICAgICAgIH0KICAgICAgICByZXR1cm4gW2N1cnRvcCwgY3VybGVmdF07CiAgICB9OwoKICAgIGZ1bmN0aW9uIGdldFBsYXllcigpIHsKICAgICAgICB2YXIgcGxheWVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3l0ZC1wbGF5ZXInKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheWVyJyk7CiAgICAgICAgLy8g5aaC5p6c5pKt5pS+5Zmo55qE6K6+572u5LiN5Zyo5Y+v6KeG5Yy65Z+f77yM5bCx5YGc5q2i6Ieq5Yqo5byA5ZCv57+76K+RCiAgICAgICAgdmFyIFt4LCB5XSA9IFswLCAwXQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFt4LCB5XSA9IGdldEFic1Bvc2l0aW9uKHBsYXllcik7CiAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciB2aXNpYmxlX2FyZWEgPSB5ICsgcGxheWVyLmNsaWVudEhlaWdodCAtIDI1MDsKICAgICAgICBpZiAoZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3AgPiB2aXNpYmxlX2FyZWEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGxheWVyOwogICAgfQoKICAgIC8vIOa3u+WKoOW8gOWFswogICAgZnVuY3Rpb24gSW5pdFRyYW5zbGF0ZUJ1dHRvbigpewogICAgICAgIHZhciBjb2x0cm9sX3BsYWNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1jaHJvbWUtY29udHJvbHMgLnl0cC1yaWdodC1jb250cm9scycpOwogICAgICAgIGlmKGNvbHRyb2xfcGxhY2UgJiYgY29sdHJvbF9wbGFjZS5xdWVyeVNlbGVjdG9yKCcucGx1Z2lucy10cmFucy1idG4nKSA9PSBudWxsKSB7CiAgICAgICAgICAgIHZhciB0cmFuc19jb2x0cm9sX2J0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgICAgICB0cmFuc19jb2x0cm9sX2J0bi5jbGFzc05hbWUgPSAncGx1Z2lucy10cmFucy1idG4nOwogICAgICAgICAgICB0cmFuc19jb2x0cm9sX2J0bi5zdHlsZSA9ICdwb3NpdGlvbjogcmVsYXRpdmU7dG9wOiAtMzYlOyBtYXJnaW4tcmlnaHQ6MTBweDsgYm9yZGVyLXJhZGl1czogMjVweDtib3JkZXI6IG5vbmU7IG9wYWNpdHk6IDAuOTU7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IG91dGxpbmU6bm9uZTsnOwoKICAgICAgICAgICAgdHJhbnNfY29sdHJvbF9idG4ub25jbGljayA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgdHJhbnNfY29sdHJvbF9zdGF0ZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGx1Z2lucy10cmFucy1zdGF0ZScpOwogICAgICAgICAgICAgICAgaWYodHJhbnNfY29sdHJvbF9zdGF0ZSA9PSAnb24nKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwbHVnaW5zLXRyYW5zLXN0YXRlJywgJ29mZicpOwogICAgICAgICAgICAgICAgICAgIHRyYW5zX2NvbHRyb2xfYnRuLmlubmVyVGV4dCA9IHRyKCflvIDlkK/nv7vor5HlrZfluZUnKTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVTdWJ0aXRsZXNUcmFucygpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3BsdWdpbnMtdHJhbnMtc3RhdGUnLCAnb24nKTsKICAgICAgICAgICAgICAgICAgICB0cmFuc19jb2x0cm9sX2J0bi5pbm5lclRleHQgPSB0cign5YWz6Zet57+76K+R5a2X5bmVJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGlzRW5hYmxlVHJhbnNsYXRlKCkpewogICAgICAgICAgICAgICAgdHJhbnNfY29sdHJvbF9idG4uaW5uZXJUZXh0ID0gdHIoJ+WFs+mXree/u+ivkeWtl+W5lScpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHJhbnNfY29sdHJvbF9idG4uaW5uZXJUZXh0ID0gdHIoJ+W8gOWQr+e/u+ivkeWtl+W5lScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOWxj+iUvXlvdXR1YmXlvLrooYzmt7vliqDnmoTkuovku7YKICAgICAgICAgICAgdHJhbnNfY29sdHJvbF9idG4uYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgICAgIGNvbHRyb2xfcGxhY2UucHJlcGVuZCh0cmFuc19jb2x0cm9sX2J0bik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGlzRW5hYmxlVHJhbnNsYXRlKCl7CiAgICAgICAgdmFyIHRyYW5zU3RhdGUgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BsdWdpbnMtdHJhbnMtc3RhdGUnKTsKICAgICAgICByZXR1cm4gdHJhbnNTdGF0ZSA9PSAnb24nOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhc09wZW5WaWRlb1NldHRpbmdzKCl7CiAgICAgICAgdmFyIG1lbnUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueXRwLXBvcHVwLnl0cC1zZXR0aW5ncy1tZW51Jyk7CiAgICAgICAgcmV0dXJuIG1lbnUgJiYgbWVudS5zdHlsZS5kaXNwbGF5ICE9ICdub25lJzsKICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZVZpZGVvU2V0dGluZ3NQbGFjZSgpewogICAgICAgIHZhciBtZW51UGxhY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueXRwLXNldHRpbmdzLW1lbnUnKTsKICAgICAgICB2YXIgbWVudVBsYWNlQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1zZXR0aW5ncy1idXR0b24nKTsKICAgICAgICBpZihtZW51UGxhY2UgJiYgbWVudVBsYWNlLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnKSB7CiAgICAgICAgICAgIG1lbnVQbGFjZUJ0bi5jbGljaygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvcGVuVmlkZW9TZXR0aW5nc1BsYWNlKGNhbGxiYWNrKXsKICAgICAgICBpZighaGFzT3BlblZpZGVvU2V0dGluZ3MoKSkgewogICAgICAgICAgICB2YXIgbWVudVBsYWNlQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1zZXR0aW5ncy1idXR0b24nKTsKICAgICAgICAgICAgaWYobWVudVBsYWNlQnRuKSB7CiAgICAgICAgICAgICAgICBtZW51UGxhY2VCdG4uY2xpY2soKTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYXNWaWRlb1N1YnRpdGxlcygpewogICAgICAgIHZhciBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueXRwLXN1YnRpdGxlcy1idXR0b24ueXRwLWJ1dHRvbicpOwogICAgICAgIHJldHVybiAgZG9tICE9IG51bGwgJiYgZG9tLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOwogICAgfQoKICAgIC8vIOmcgOimgeS/ruaUuQogICAgZnVuY3Rpb24gb3BlblZpZGVvU3VidGl0bGVzKCl7CiAgICAgICAgdmFyIHNldHRpbmdzUGxhY2VJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy55dHAtcG9wdXAueXRwLXNldHRpbmdzLW1lbnUgLnl0cC1tZW51aXRlbScpOwogICAgICAgIHNldHRpbmdzUGxhY2VJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgaWYoaXRlbS5pbm5lclRleHQgJiYgaXRlbS5pbm5lclRleHQuaW5kZXhPZih0cign5a2X5bmVJykpID4gLTEgJiYgaXRlbS5pbm5lclRleHQuaW5kZXhPZih0cign5re75Yqg5a2X5bmVJykpID09IC0xKSB7CiAgICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8g5YaF572u566A5L2T5a2X5bmVCiAgICAgICAgc2V0dGluZ3NQbGFjZUl0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICBpZihpdGVtLmlubmVyVGV4dCAmJiBpdGVtLmlubmVyVGV4dC5pbmRleE9mKHRyKCfnroDkvZMnKSkgPiAtMSkgewogICAgICAgICAgICAgICAgaXRlbS5jbGljaygpOwogICAgICAgICAgICAgICAgLy8g6Ziy5q2i5peg6ZmQ54K55Ye76I+c5Y2VCiAgICAgICAgICAgICAgICBzZXRTdWJ0aXRsZXNUcmFucygnemgtSGFucycpOwogICAgICAgICAgICAgICAgY2xvc2VWaWRlb1NldHRpbmdzUGxhY2UoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIHZhciBjdXJMbmFnID0gZ2V0U3VidGl0bGVzVHJhbnMoKTsKICAgICAgICBpZihjdXJMbmFnID09ICdpbm5lci1TdWJzdGl0bGUnKSB7CiAgICAgICAgICAgIC8vIOWmguaenOayoeacieeugOS9k+Wtl++8jOWwseaJk+W8gOiHquWKqOe/u+ivkQogICAgICAgICAgICBzZXR0aW5nc1BsYWNlSXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICBpZihpdGVtLmlubmVyVGV4dCAmJiBpdGVtLmlubmVyVGV4dC5pbmRleE9mKHRyKCfoh6rliqjnv7vor5EnKSkgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIGl0ZW0uY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICBzZXRTdWJ0aXRsZXNUcmFucygnaW5uZXItU3Vic3RpdGxlJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSBlbHNlIGlmKGN1ckxuYWcgIT0gJ3poLUhhbnMnKSB7CiAgICAgICAgICAgIC8vIOWmguaenOayoeacieWwseaJk+W8gOe5geS9k+WtlwogICAgICAgICAgICBzZXR0aW5nc1BsYWNlSXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICBpZihpdGVtLmlubmVyVGV4dCkgewogICAgICAgICAgICAgICAgICAgIFsn57mB5L2TJywgJ+WPsOa5vicsICfpppnmuK8nLCAn5Lit5paHJ10uZm9yRWFjaChmdW5jdGlvbihsYW5nVGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBsYW5nVGV4dCA9IHRyKGxhbmdUZXh0KQogICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlubmVyVGV4dC5pbmRleE9mKGxhbmdUZXh0KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdWJ0aXRsZXNUcmFucygnaW5uZXItU3Vic3RpdGxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZVZpZGVvU2V0dGluZ3NQbGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdmFyIHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1idXR0b24ueXRwLXBhbmVsLXRpdGxlJykuaW5uZXJUZXh0LnRyaW0oKTsKICAgICAgICAgICAgaWYodGl0bGUuaW5kZXhPZih0cign5a2X5bmVJykpID49IC0xKSB7CiAgICAgICAgICAgICAgICAvLyDmsqHmnInkuK3mlofnm7jlhbPlrZfluZXvvIzlsLHpmo/kvr/pgInkuIDkuKrlrZfluZUs54S25ZCO5omN6Ieq5Yqo57+76K+RCiAgICAgICAgICAgICAgICBzZXR0aW5nc1BsYWNlSXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5pbm5lclRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmdUZXh0ID0gaXRlbS5pbm5lclRleHQudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihsYW5nVGV4dC5pbmRleE9mKHRyKCfmt7vliqDlrZfluZUnKSkgPT0gLTEgJiYgbGFuZ1RleHQuaW5kZXhPZih0cign5YWz6ZetJykpID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdWJ0aXRsZXNUcmFucygnaW5uZXItU3Vic3RpdGxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZVZpZGVvU2V0dGluZ3NQbGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgc2V0dGluZ3NQbGFjZUl0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaW5uZXJUZXh0ICYmIGl0ZW0uaW5uZXJUZXh0LmluZGV4T2YodHIoJ+iHquWKqOeUn+aIkCcpKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3VidGl0bGVzVHJhbnMoJ2lubmVyLVN1YnN0aXRsZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZVZpZGVvU2V0dGluZ3NQbGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGxheVN1YnRpdGxlcygpIHsKICAgICAgICB2YXIgc3VidGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueXRwLXN1YnRpdGxlcy1idXR0b24ueXRwLWJ1dHRvblthcmlhLXByZXNzZWQ9ImZhbHNlIl0nKTsKICAgICAgICBpZihzdWJ0aXRsZSkgewogICAgICAgICAgICBzdWJ0aXRsZS5jbGljaygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpc1N1YnRpdGxlc1RyYW5zKCl7CiAgICAgICAgLy8gY3VyTGFuZyA9PSAnemgtSGFudCcKICAgICAgICAvLyDnu5/kuIDmiYDmnInor63oqIDorr7nva7nv7vor5HkuLrnroDkvZPkuK3mlocKICAgICAgICAvLyBlbi1VSzogZW4tZ2IKICAgICAgICAvLyBlbi1VUzogIGVuCiAgICAgICAgLy8gemgtQ04gemgtSGFucyB6aC1IYW50CiAgICAgICAgcmV0dXJuIGdldFN1YnRpdGxlc1RyYW5zKCkgPT0gJ3poLUhhbnMnOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZVN1YnRpdGxlc1RyYW5zKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy55dHAtcGxheWVyLWNvbnRlbnQnKS5yZW1vdmVBdHRyaWJ1dGUoJ3RyYW5zbGF0ZS16aC1oYW5zJyk7CiAgICAgICAgfWNhdGNoKGVycikgewoKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U3VidGl0bGVzVHJhbnMoKXsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1wbGF5ZXItY29udGVudCcpLmdldEF0dHJpYnV0ZSgndHJhbnNsYXRlLXpoLWhhbnMnKTsKICAgICAgICB9Y2F0Y2goZXJyKSB7CiAgICAgICAgICAgIHJldHVybiBsYW5nOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXRTdWJ0aXRsZXNUcmFucyhsYW5nKSB7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1wbGF5ZXItY29udGVudCcpLnNldEF0dHJpYnV0ZSgndHJhbnNsYXRlLXpoLWhhbnMnLCBsYW5nKTsKICAgIH0KCiAgICBmdW5jdGlvbiBvcGVuU3VidGl0bGVzKCl7CiAgICAgICAgCiAgICAgICAgaWYoaGFzVmlkZW9TdWJ0aXRsZXMoKSkgewogICAgICAgICAgICBkaXNwbGF5U3VidGl0bGVzKCk7CgogICAgICAgICAgICB2YXIgaXNUcmFucyA9IGlzU3VidGl0bGVzVHJhbnMoKTsKICAgICAgICAgICAgY29uc29sZS5sb2coaXNUcmFucyk7CiAgICAgICAgICAgIGlmKGlzVHJhbnMgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIC8vIOmHh+eUqGNhbGxiYWNr5pa55byP5omT5byA5ZKM5YWz6Zet77yM6Ziy5q2ic2V0dGltZW91dOWvvOiHtOeahOmXrumimAogICAgICAgICAgICAgICAgb3BlblZpZGVvU2V0dGluZ3NQbGFjZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAvLyDliIfmjaLlrZfluZUKICAgICAgICAgICAgICAgICAgICBvcGVuVmlkZW9TdWJ0aXRsZXMoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIOmYsuatouWIh+aNouinhumikei/h+eoi++8jOaJk+W8gOWtl+W5le+8jOS4jeWFs+mXrQogICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1idXR0b24ueXRwLXBhbmVsLXRpdGxlJykuaW5uZXJUZXh0LnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmKHRpdGxlLmluZGV4T2YodHIoJ+Wtl+W5lScpKSA+PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGNsb3NlVmlkZW9TZXR0aW5nc1BsYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1jYXRjaChlcnIpIHsKCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlQ29sdHJvbEJ1dHRvblN0YXRlKCkgewogICAgICAgIHZhciB0cmFuc1N0YXRlID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwbHVnaW5zLXRyYW5zLXN0YXRlJyk7CiAgICAgICAgdmFyIHRyYW5zQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsdWdpbnMtdHJhbnMtYnRuJykKICAgICAgICBpZih0cmFuc0J0bikgewogICAgICAgICAgICBpZih0cmFuc1N0YXRlID09ICdvbicgJiYgdHJhbnNCdG4uaW5uZXJUZXh0ICE9IHRyKCflhbPpl63nv7vor5HlrZfluZUnKSkgewogICAgICAgICAgICAgICAgdHJhbnNCdG4uaW5uZXJUZXh0ID0gdHIoJ+WFs+mXree/u+ivkeWtl+W5lScpOwogICAgICAgICAgICB9IGVsc2UgaWYodHJhbnNTdGF0ZSA9PSAnb2ZmJyAmJiB0cmFuc0J0bi5pbm5lclRleHQgIT0gdHIoJ+W8gOWQr+e/u+ivkeWtl+W5lScpKSB7CiAgICAgICAgICAgICAgICB0cmFuc0J0bi5pbm5lclRleHQgPSB0cign5byA5ZCv57+76K+R5a2X5bmVJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGlkZVBhZ2VBZHMoKQogICAgewogICAgICAgIFsnLnZpZGVvLWFkcycsICcjcGxheWVyLWFkcyddLmZvckVhY2goZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikuZm9yRWFjaChmdW5jdGlvbihlbG1lbnQpewogICAgICAgICAgICAgICAgZWxtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzVmlkZW9BZHNUaW1lKCl7CiAgICAgICAgdmFyIGFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFkLXNob3dpbmcnKTsKICAgICAgICB2YXIgc2tpcEFkQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnl0cC1hZC1za2lwLWJ1dHRvbicpOwoKICAgICAgICB2YXIgdm9sdW1lT3BlblN0YXRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3l0cC1zdmctdm9sdW1lLWFuaW1hdGlvbi1tYXNrIik7CiAgICAgICAgdmFyIHZvbHVtZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy55dHAtbXV0ZS1idXR0b24nKTsKICAgICAgICAvLyDliKTmlq3mnInmsqHmnInlub/lkYoKICAgICAgICBpZihhZCl7CiAgICAgICAgICAgIC8vIOWFs+mXremfs+mHjwogICAgICAgICAgICBpZih2b2x1bWVPcGVuU3RhdGUgJiYgdm9sdW1lQnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2b2x1bWVCdXR0b24uY2xpY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIOato+W4uOinhumike+8jOaJk+W8gOmfs+mHjwogICAgICAgICAgICBpZih2b2x1bWVPcGVuU3RhdGUgPT0gbnVsbCAmJiB2b2x1bWVCdXR0b24pewogICAgICAgICAgICAgICAgdm9sdW1lQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8g6Lez6L+H5bm/5ZGKCiAgICAgICAgaWYoc2tpcEFkQnV0dG9uKQogICAgICAgIHsKICAgICAgICAgICAgc2tpcEFkQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhZCAhPSBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIG1haW4oKSB7CiAgICAgICAgaThuSW5pdCgpOwogICAgICAgIHNldEludGVydmFsKAogICAgICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIOS4jeaYvuekuumUmeivr+S/oeaBrwogICAgICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgICAgIGdldFBsYXllcigpICYmIChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBJbml0VHJhbnNsYXRlQnV0dG9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbHRyb2xCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihpc0VuYWJsZVRyYW5zbGF0ZSgpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVQYWdlQWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaXNWaWRlb0Fkc1RpbWUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5TdWJ0aXRsZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKSB7CiAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTAwCiAgICAgICAgKQogICAgfTsKICAgIG1haW4oKTsKfSkoKTs=","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js","ts":1637743188945,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My4yLjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO3ZhciBjPVtdLGQ9YS5kb2N1bWVudCxlPU9iamVjdC5nZXRQcm90b3R5cGVPZixmPWMuc2xpY2UsZz1jLmNvbmNhdCxoPWMucHVzaCxpPWMuaW5kZXhPZixqPXt9LGs9ai50b1N0cmluZyxsPWouaGFzT3duUHJvcGVydHksbT1sLnRvU3RyaW5nLG49bS5jYWxsKE9iamVjdCksbz17fTtmdW5jdGlvbiBwKGEsYil7Yj1ifHxkO3ZhciBjPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50ZXh0PWEsYi5oZWFkLmFwcGVuZENoaWxkKGMpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9dmFyIHE9IjMuMi4xIixyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyByLmZuLmluaXQoYSxiKX0scz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csdD0vXi1tcy0vLHU9Ly0oW2Etel0pL2csdj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O3IuZm49ci5wcm90b3R5cGU9e2pxdWVyeTpxLGNvbnN0cnVjdG9yOnIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBmLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9mLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPXIubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiByLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhyLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoYTwwP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmM8Yj9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aCxzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LHIuZXh0ZW5kPXIuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxyLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2g8aTtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYoci5pc1BsYWluT2JqZWN0KGQpfHwoZT1BcnJheS5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZBcnJheS5pc0FycmF5KGMpP2M6W10pOmY9YyYmci5pc1BsYWluT2JqZWN0KGMpP2M6e30sZ1tiXT1yLmV4dGVuZChqLGYsZCkpOnZvaWQgMCE9PWQmJihnW2JdPWQpKTtyZXR1cm4gZ30sci5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKHErTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PXIudHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3ZhciBiPXIudHlwZShhKTtyZXR1cm4oIm51bWJlciI9PT1ifHwic3RyaW5nIj09PWIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiEoIWF8fCJbb2JqZWN0IE9iamVjdF0iIT09ay5jYWxsKGEpKSYmKCEoYj1lKGEpKXx8KGM9bC5jYWxsKGIsImNvbnN0cnVjdG9yIikmJmIuY29uc3RydWN0b3IsImZ1bmN0aW9uIj09dHlwZW9mIGMmJm0uY2FsbChjKT09PW4pKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2ErIiI6Im9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYT9qW2suY2FsbChhKV18fCJvYmplY3QiOnR5cGVvZiBhfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe3AoYSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHQsIm1zLSIpLnJlcGxhY2UodSx2KX0sZWFjaDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtpZih3KGEpKXtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVha31lbHNlIGZvcihkIGluIGEpaWYoYi5jYWxsKGFbZF0sZCxhW2RdKT09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOihhKyIiKS5yZXBsYWNlKHMsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHcoT2JqZWN0KGEpKT9yLm1lcmdlKGMsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKTpoLmNhbGwoYyxhKSksY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/LTE6aS5jYWxsKGIsYSxjKX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO2Q8YztkKyspYVtlKytdPWJbZF07cmV0dXJuIGEubGVuZ3RoPWUsYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkLGU9W10sZj0wLGc9YS5sZW5ndGgsaD0hYztmPGc7ZisrKWQ9IWIoYVtmXSxmKSxkIT09aCYmZS5wdXNoKGFbZl0pO3JldHVybiBlfSxtYXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj0wLGg9W107aWYodyhhKSlmb3IoZD1hLmxlbmd0aDtmPGQ7ZisrKWU9YihhW2ZdLGYsYyksbnVsbCE9ZSYmaC5wdXNoKGUpO2Vsc2UgZm9yKGYgaW4gYSllPWIoYVtmXSxmLGMpLG51bGwhPWUmJmgucHVzaChlKTtyZXR1cm4gZy5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2lmKCJzdHJpbmciPT10eXBlb2YgYiYmKGM9YVtiXSxiPWEsYT1jKSxyLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGQ9Zi5jYWxsKGFyZ3VtZW50cywyKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYnx8dGhpcyxkLmNvbmNhdChmLmNhbGwoYXJndW1lbnRzKSkpfSxlLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8ci5ndWlkKyssZX0sbm93OkRhdGUubm93LHN1cHBvcnQ6b30pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihyLmZuW1N5bWJvbC5pdGVyYXRvcl09Y1tTeW1ib2wuaXRlcmF0b3JdKSxyLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7alsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiB3KGEpe3ZhciBiPSEhYSYmImxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPXIudHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iIT09YyYmIXIuaXNXaW5kb3coYSkmJigiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYSl9dmFyIHg9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEQ9W10sRT1ELnBvcCxGPUQucHVzaCxHPUQucHVzaCxIPUQuc2xpY2UsST1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0sSj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLEs9IltcXHgyMFxcdFxcclxcblxcZl0iLEw9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixNPSJcXFsiK0srIiooIitMKyIpKD86IitLKyIqKFsqXiR8IX5dPz0pIitLKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTCsiKSl8KSIrSysiKlxcXSIsTj0iOigiK0wrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK00rIikqKXwuKilcXCl8KSIsTz1uZXcgUmVnRXhwKEsrIisiLCJnIiksUD1uZXcgUmVnRXhwKCJeIitLKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0srIiskIiwiZyIpLFE9bmV3IFJlZ0V4cCgiXiIrSysiKiwiK0srIioiKSxSPW5ldyBSZWdFeHAoIl4iK0srIiooWz4rfl18IitLKyIpIitLKyIqIiksUz1uZXcgUmVnRXhwKCI9IitLKyIqKFteXFxdJ1wiXSo/KSIrSysiKlxcXSIsImciKSxUPW5ldyBSZWdFeHAoTiksVT1uZXcgUmVnRXhwKCJeIitMKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitMKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK0wrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK0wrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitNKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitLKyI/fCgiK0srIil8LikiLCJpZyIpLGFhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6ZDwwP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxiYT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxjYT1mdW5jdGlvbihhLGIpe3JldHVybiBiPyJcMCI9PT1hPyJcdWZmZmQiOmEuc2xpY2UoMCwtMSkrIlxcIithLmNoYXJDb2RlQXQoYS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2F9LGRhPWZ1bmN0aW9uKCl7bSgpfSxlYT10YShmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwJiYoImZvcm0iaW4gYXx8ImxhYmVsImluIGEpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0cuYXBwbHkoRD1ILmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLERbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0c9e2FwcGx5OkQubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ri5hcHBseShhLEguY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHM9YiYmYi5vd25lckRvY3VtZW50LHc9Yj9iLm5vZGVUeXBlOjk7aWYoZD1kfHxbXSwic3RyaW5nIiE9dHlwZW9mIGF8fCFhfHwxIT09dyYmOSE9PXcmJjExIT09dylyZXR1cm4gZDtpZighZSYmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLHApKXtpZigxMSE9PXcmJihsPVouZXhlYyhhKSkpaWYoZj1sWzFdKXtpZig5PT09dyl7aWYoIShqPWIuZ2V0RWxlbWVudEJ5SWQoZikpKXJldHVybiBkO2lmKGouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNlIGlmKHMmJihqPXMuZ2V0RWxlbWVudEJ5SWQoZikpJiZ0KGIsaikmJmouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNle2lmKGxbMl0pcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChmPWxbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gRy5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSksZH1pZihjLnFzYSYmIUFbYSsiICJdJiYoIXF8fCFxLnRlc3QoYSkpKXtpZigxIT09dylzPWIscj1hO2Vsc2UgaWYoIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhrPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9rPWsucmVwbGFjZShiYSxjYSk6Yi5zZXRBdHRyaWJ1dGUoImlkIixrPXUpLG89ZyhhKSxoPW8ubGVuZ3RoO3doaWxlKGgtLSlvW2hdPSIjIitrKyIgIitzYShvW2hdKTtyPW8uam9pbigiLCIpLHM9JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxifWlmKHIpdHJ5e3JldHVybiBHLmFwcGx5KGQscy5xdWVyeVNlbGVjdG9yQWxsKHIpKSxkfWNhdGNoKHgpe31maW5hbGx5e2s9PT11JiZiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShQLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1jLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiZhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImZvcm0iaW4gYj9iLnBhcmVudE5vZGUmJmIuZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gYj8ibGFiZWwiaW4gYi5wYXJlbnROb2RlP2IucGFyZW50Tm9kZS5kaXNhYmxlZD09PWE6Yi5kaXNhYmxlZD09PWE6Yi5pc0Rpc2FibGVkPT09YXx8Yi5pc0Rpc2FibGVkIT09IWEmJmVhKGIpPT09YTpiLmRpc2FibGVkPT09YToibGFiZWwiaW4gYiYmYi5kaXNhYmxlZD09PWF9fWZ1bmN0aW9uIHBhKGEpe3JldHVybiBpYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixpYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1nYS5zdXBwb3J0PXt9LGY9Z2EuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhYiYmIkhUTUwiIT09Yi5ub2RlTmFtZX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89bi5kb2N1bWVudEVsZW1lbnQscD0hZihuKSx2IT09biYmKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVkudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19LGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjLGQsZSxmPWIuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZil7aWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdO2U9Yi5nZXRFbGVtZW50c0J5TmFtZShhKSxkPTA7d2hpbGUoZj1lW2QrK10paWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdfXJldHVybltdfX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnApcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKX0scj1bXSxxPVtdLChjLnFzYT1ZLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrSysiKlsqXiR8IX5dPz0iKSwyIT09YS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmcS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLG8uYXBwZW5kQ2hpbGQoYSkuZGlzYWJsZWQ9ITAsMiE9PWEucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVkudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiKiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixOKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9WS50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8WS50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09bnx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1ufHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0koayxhKS1JKGssYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgYyxkPTAsZT1hLnBhcmVudE5vZGUsZj1iLnBhcmVudE5vZGUsZz1bYV0saD1bYl07aWYoIWV8fCFmKXJldHVybiBhPT09bj8tMTpiPT09bj8xOmU/LTE6Zj8xOms/SShrLGEpLUkoayxiKTowO2lmKGU9PT1mKXJldHVybiBsYShhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSlnLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTt3aGlsZShnW2RdPT09aFtkXSlkKys7cmV0dXJuIGQ/bGEoZ1tkXSxoW2RdKTpnW2RdPT09dj8tMTpoW2RdPT09dj8xOjB9LG4pOm59LGdhLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ2EoYSxudWxsLG51bGwsYil9LGdhLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShTLCI9JyQxJ10iKSxjLm1hdGNoZXNTZWxlY3RvciYmcCYmIUFbYisiICJdJiYoIXJ8fCFyLnRlc3QoYikpJiYoIXF8fCFxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZDLmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lc2NhcGU9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoYmEsY2EpfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6VixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKF8sYWEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKF8sYWEpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxnYS5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZnYS5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gVi5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZULnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0srIikiK2ErIigiK0srInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjohYnx8KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShPLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iJiYoZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxnYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2lhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1JKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmlhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFt1XT9pYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZ2EoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczppYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoXyxhYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFUudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6b2EoITEpLGRpc2FibGVkOm9hKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6cGEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnBhKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpwYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuW2M8MD9jK2I6Y119KSxldmVuOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6cGEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1jPDA/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpwYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWM8MD9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bWEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bmEoYik7ZnVuY3Rpb24gcmEoKXt9cmEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyByYSxnPWdhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1RLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1SLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFAsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1WW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBzYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7YjxjO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHRhKGEsYixjKXt2YXIgZD1iLmRpcixlPWIubmV4dCxmPWV8fGQsZz1jJiYicGFyZW50Tm9kZSI9PT1mLGg9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxlKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGcpcmV0dXJuIGEoYixjLGUpO3JldHVybiExfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG09W3csaF07aWYoaSl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZykmJmEoYixjLGkpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxnKWlmKGw9Ylt1XXx8KGJbdV09e30pLGs9bFtiLnVuaXF1ZUlEXXx8KGxbYi51bmlxdWVJRF09e30pLGUmJmU9PT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpYj1iW2RdfHxiO2Vsc2V7aWYoKGo9a1tmXSkmJmpbMF09PT13JiZqWzFdPT09aClyZXR1cm4gbVsyXT1qWzJdO2lmKGtbZl09bSxtWzJdPWEoYixjLGkpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB1YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB2YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB3YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtoPGk7aCsrKShmPWFbaF0pJiYoYyYmIWMoZixkLGUpfHwoZy5wdXNoKGYpLGomJmIucHVzaChoKSkpO3JldHVybiBnfWZ1bmN0aW9uIHhhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXhhKGQpKSxlJiYhZVt1XSYmKGU9eGEoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dmEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6d2EocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXdhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj13YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6Ry5hcHBseShnLHIpfSl9ZnVuY3Rpb24geWEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz10YShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9dGEoZnVuY3Rpb24oYSl7cmV0dXJuIEkoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2k8ZjtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bdGEodWEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7ZTxmO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHhhKGk+MSYmdWEobSksaT4xJiZzYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxpPGUmJnlhKGEuc2xpY2UoaSxlKSksZTxmJiZ5YShhPWEuc2xpY2UoZSkpLGU8ZiYmc2EoYSkpfW0ucHVzaChjKX1yZXR1cm4gdWEobSl9ZnVuY3Rpb24gemEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbyxxLHI9MCxzPSIwIix0PWYmJltdLHU9W10sdj1qLHg9Znx8ZSYmZC5maW5kLlRBRygiKiIsaykseT13Kz1udWxsPT12PzE6TWF0aC5yYW5kb20oKXx8LjEsej14Lmxlbmd0aDtmb3IoayYmKGo9Zz09PW58fGd8fGspO3MhPT16JiZudWxsIT0obD14W3NdKTtzKyspe2lmKGUmJmwpe289MCxnfHxsLm93bmVyRG9jdW1lbnQ9PT1ufHwobShsKSxoPSFwKTt3aGlsZShxPWFbbysrXSlpZihxKGwsZ3x8bixoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXkpfWMmJigobD0hcSYmbCkmJnItLSxmJiZ0LnB1c2gobCkpfWlmKHIrPXMsYyYmcyE9PXIpe289MDt3aGlsZShxPWJbbysrXSlxKHQsdSxnLGgpO2lmKGYpe2lmKHI+MCl3aGlsZShzLS0pdFtzXXx8dVtzXXx8KHVbc109RS5jYWxsKGkpKTt1PXdhKHUpfUcuYXBwbHkoaSx1KSxrJiYhZiYmdS5sZW5ndGg+MCYmcitiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz15LGo9diksdH07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eWEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHphKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsaSxqLGssbCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG49IWUmJmcoYT1tLnNlbGVjdG9yfHxhKTtpZihjPWN8fFtdLDE9PT1uLmxlbmd0aCl7aWYoaT1uWzBdPW5bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2lbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChqLm1hdGNoZXNbMF0ucmVwbGFjZShfLGFhKSxiKXx8W10pWzBdLCFiKXJldHVybiBjO20mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGkuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWY9Vi5uZWVkc0NvbnRleHQudGVzdChhKT8wOmkubGVuZ3RoO3doaWxlKGYtLSl7aWYoaj1pW2ZdLGQucmVsYXRpdmVbaz1qLnR5cGVdKWJyZWFrO2lmKChsPWQuZmluZFtrXSkmJihlPWwoai5tYXRjaGVzWzBdLnJlcGxhY2UoXyxhYSksJC50ZXN0KGlbMF0udHlwZSkmJnFhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoaS5zcGxpY2UoZiwxKSxhPWUubGVuZ3RoJiZzYShpKSwhYSlyZXR1cm4gRy5hcHBseShjLGUpLGM7YnJlYWt9fX1yZXR1cm4obXx8aChhLG4pKShlLGIsIXAsYywhYnx8JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxiKSxjfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtpZighYylyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7aWYoIWMmJiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEosZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFjKXJldHVybiBhW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTtyLmZpbmQ9eCxyLmV4cHI9eC5zZWxlY3RvcnMsci5leHByWyI6Il09ci5leHByLnBzZXVkb3Msci51bmlxdWVTb3J0PXIudW5pcXVlPXgudW5pcXVlU29ydCxyLnRleHQ9eC5nZXRUZXh0LHIuaXNYTUxEb2M9eC5pc1hNTCxyLmNvbnRhaW5zPXguY29udGFpbnMsci5lc2NhcGVTZWxlY3Rvcj14LmVzY2FwZTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmcihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9LEE9ci5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBCKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudG9Mb3dlckNhc2UoKX12YXIgQz0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaSxEPS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gRShhLGIsYyl7cmV0dXJuIHIuaXNGdW5jdGlvbihiKT9yLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTpiLm5vZGVUeXBlP3IuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KToic3RyaW5nIiE9dHlwZW9mIGI/ci5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGkuY2FsbChiLGEpPi0xIT09Y30pOkQudGVzdChiKT9yLmZpbHRlcihiLGEsYyk6KGI9ci5maWx0ZXIoYixhKSxyLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gaS5jYWxsKGIsYSk+LTEhPT1jJiYxPT09YS5ub2RlVHlwZX0pKX1yLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9yLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOnIuZmluZC5tYXRjaGVzKGEsci5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxyLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjLGQ9dGhpcy5sZW5ndGgsZT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2socihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYoci5jb250YWlucyhlW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihjPXRoaXMucHVzaFN0YWNrKFtdKSxiPTA7YjxkO2IrKylyLmZpbmQoYSxlW2JdLGMpO3JldHVybiBkPjE/ci51bmlxdWVTb3J0KGMpOmN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhRSh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmQS50ZXN0KGEpP3IoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgRixHPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC8sSD1yLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxGLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hWzBdJiYiPiI9PT1hW2EubGVuZ3RoLTFdJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOkcuZXhlYyhhKSwhZXx8IWVbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxjKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihlWzFdKXtpZihiPWIgaW5zdGFuY2VvZiByP2JbMF06YixyLm1lcmdlKHRoaXMsci5wYXJzZUhUTUwoZVsxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpkLCEwKSksQy50ZXN0KGVbMV0pJiZyLmlzUGxhaW5PYmplY3QoYikpZm9yKGUgaW4gYilyLmlzRnVuY3Rpb24odGhpc1tlXSk/dGhpc1tlXShiW2VdKTp0aGlzLmF0dHIoZSxiW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gZj1kLmdldEVsZW1lbnRCeUlkKGVbMl0pLGYmJih0aGlzWzBdPWYsdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6ci5pc0Z1bmN0aW9uKGEpP3ZvaWQgMCE9PWMucmVhZHk/Yy5yZWFkeShhKTphKHIpOnIubWFrZUFycmF5KGEsdGhpcyl9O0gucHJvdG90eXBlPXIuZm4sRj1yKGQpO3ZhciBJPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEo9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ci5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1yKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGM7YSsrKWlmKHIuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPSJzdHJpbmciIT10eXBlb2YgYSYmcihhKTtpZighQS50ZXN0KGEpKWZvcig7ZDxlO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJnIuZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9yLnVuaXF1ZVNvcnQoZik6Zil9LGluZGV4OmZ1bmN0aW9uKGEpe3JldHVybiBhPyJzdHJpbmciPT10eXBlb2YgYT9pLmNhbGwocihhKSx0aGlzWzBdKTppLmNhbGwodGhpcyxhLmpxdWVyeT9hWzBdOmEpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIudW5pcXVlU29ydChyLm1lcmdlKHRoaXMuZ2V0KCkscihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBLKGEsYil7d2hpbGUoKGE9YVtiXSkmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1yLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB5KGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEsoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4geShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4geShhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHkoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHooKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiB6KGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBCKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50OihCKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksci5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsYil7ci5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXIubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9ci5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKEpbYV18fHIudW5pcXVlU29ydChlKSxJLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgTD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE0oYSl7dmFyIGI9e307cmV0dXJuIHIuZWFjaChhLm1hdGNoKEwpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifXIuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP00oYSk6ci5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZj1bXSxnPVtdLGg9LTEsaT1mdW5jdGlvbigpe2ZvcihlPWV8fGEub25jZSxkPWI9ITA7Zy5sZW5ndGg7aD0tMSl7Yz1nLnNoaWZ0KCk7d2hpbGUoKytoPGYubGVuZ3RoKWZbaF0uYXBwbHkoY1swXSxjWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlJiYoaD1mLmxlbmd0aCxjPSExKX1hLm1lbW9yeXx8KGM9ITEpLGI9ITEsZSYmKGY9Yz9bXToiIil9LGo9e2FkZDpmdW5jdGlvbigpe3JldHVybiBmJiYoYyYmIWImJihoPWYubGVuZ3RoLTEsZy5wdXNoKGMpKSxmdW5jdGlvbiBkKGIpe3IuZWFjaChiLGZ1bmN0aW9uKGIsYyl7ci5pc0Z1bmN0aW9uKGMpP2EudW5pcXVlJiZqLmhhcyhjKXx8Zi5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PXIudHlwZShjKSYmZChjKX0pfShhcmd1bWVudHMpLGMmJiFiJiZpKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiByLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9ci5pbkFycmF5KGIsZixjKSk+LTEpZi5zcGxpY2UoYywxKSxjPD1oJiZoLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ci5pbkFycmF5KGEsZik+LTE6Zi5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gZiYmKGY9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGY9Yz0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFmfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGU9Zz1bXSxjfHxifHwoZj1jPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfTtmdW5jdGlvbiBOKGEpe3JldHVybiBhfWZ1bmN0aW9uIE8oYSl7dGhyb3cgYX1mdW5jdGlvbiBQKGEsYixjLGQpe3ZhciBlO3RyeXthJiZyLmlzRnVuY3Rpb24oZT1hLnByb21pc2UpP2UuY2FsbChhKS5kb25lKGIpLmZhaWwoYyk6YSYmci5pc0Z1bmN0aW9uKGU9YS50aGVuKT9lLmNhbGwoYSxiLGMpOmIuYXBwbHkodm9pZCAwLFthXS5zbGljZShkKSl9Y2F0Y2goYSl7Yy5hcHBseSh2b2lkIDAsW2FdKX19ci5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGIpe3ZhciBjPVtbIm5vdGlmeSIsInByb2dyZXNzIixyLkNhbGxiYWNrcygibWVtb3J5Iiksci5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxkPSJwZW5kaW5nIixlPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBkfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZi5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oYSl7cmV0dXJuIGUudGhlbihudWxsLGEpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGIpe3IuZWFjaChjLGZ1bmN0aW9uKGMsZCl7dmFyIGU9ci5pc0Z1bmN0aW9uKGFbZFs0XV0pJiZhW2RbNF1dO2ZbZFsxXV0oZnVuY3Rpb24oKXt2YXIgYT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZyLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhiLm5vdGlmeSkuZG9uZShiLnJlc29sdmUpLmZhaWwoYi5yZWplY3QpOmJbZFswXSsiV2l0aCJdKHRoaXMsZT9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKGIsZCxlKXt2YXIgZj0wO2Z1bmN0aW9uIGcoYixjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxpPWFyZ3VtZW50cyxqPWZ1bmN0aW9uKCl7dmFyIGEsajtpZighKGI8Zikpe2lmKGE9ZC5hcHBseShoLGkpLGE9PT1jLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtqPWEmJigib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhKSYmYS50aGVuLHIuaXNGdW5jdGlvbihqKT9lP2ouY2FsbChhLGcoZixjLE4sZSksZyhmLGMsTyxlKSk6KGYrKyxqLmNhbGwoYSxnKGYsYyxOLGUpLGcoZixjLE8sZSksZyhmLGMsTixjLm5vdGlmeVdpdGgpKSk6KGQhPT1OJiYoaD12b2lkIDAsaT1bYV0pLChlfHxjLnJlc29sdmVXaXRoKShoLGkpKX19LGs9ZT9qOmZ1bmN0aW9uKCl7dHJ5e2ooKX1jYXRjaChhKXtyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJnIuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhhLGsuc3RhY2tUcmFjZSksYisxPj1mJiYoZCE9PU8mJihoPXZvaWQgMCxpPVthXSksYy5yZWplY3RXaXRoKGgsaSkpfX07Yj9rKCk6KHIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoay5zdGFja1RyYWNlPXIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLGEuc2V0VGltZW91dChrKSl9fXJldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGEpe2NbMF1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihlKT9lOk4sYS5ub3RpZnlXaXRoKSksY1sxXVszXS5hZGQoZygwLGEsci5pc0Z1bmN0aW9uKGIpP2I6TikpLGNbMl1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihkKT9kOk8pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9yLmV4dGVuZChhLGUpOmV9fSxmPXt9O3JldHVybiByLmVhY2goYyxmdW5jdGlvbihhLGIpe3ZhciBnPWJbMl0saD1iWzVdO2VbYlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtkPWh9LGNbMy1hXVsyXS5kaXNhYmxlLGNbMF1bMl0ubG9jayksZy5hZGQoYlszXS5maXJlKSxmW2JbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGZbYlswXSsiV2l0aCJdKHRoaXM9PT1mP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZltiWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGUucHJvbWlzZShmKSxiJiZiLmNhbGwoZixmKSxmfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cy5sZW5ndGgsYz1iLGQ9QXJyYXkoYyksZT1mLmNhbGwoYXJndW1lbnRzKSxnPXIuRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtkW2FdPXRoaXMsZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/Zi5jYWxsKGFyZ3VtZW50cyk6YywtLWJ8fGcucmVzb2x2ZVdpdGgoZCxlKX19O2lmKGI8PTEmJihQKGEsZy5kb25lKGgoYykpLnJlc29sdmUsZy5yZWplY3QsIWIpLCJwZW5kaW5nIj09PWcuc3RhdGUoKXx8ci5pc0Z1bmN0aW9uKGVbY10mJmVbY10udGhlbikpKXJldHVybiBnLnRoZW4oKTt3aGlsZShjLS0pUChlW2NdLGgoYyksZy5yZWplY3QpO3JldHVybiBnLnByb21pc2UoKX19KTt2YXIgUT0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oYixjKXthLmNvbnNvbGUmJmEuY29uc29sZS53YXJuJiZiJiZRLnRlc3QoYi5uYW1lKSYmYS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrYi5tZXNzYWdlLGIuc3RhY2ssYyl9LHIucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oYil7YS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYn0pfTt2YXIgUj1yLkRlZmVycmVkKCk7ci5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gUi50aGVuKGEpWyJjYXRjaCJdKGZ1bmN0aW9uKGEpe3IucmVhZHlFeGNlcHRpb24oYSl9KSx0aGlzfSxyLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tci5yZWFkeVdhaXQ6ci5pc1JlYWR5KXx8KHIuaXNSZWFkeT0hMCxhIT09ITAmJi0tci5yZWFkeVdhaXQ+MHx8Ui5yZXNvbHZlV2l0aChkLFtyXSkpfX0pLHIucmVhZHkudGhlbj1SLnRoZW47ZnVuY3Rpb24gUygpe2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsUyksCmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsUyksci5yZWFkeSgpfSJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWQucmVhZHlTdGF0ZSYmIWQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Euc2V0VGltZW91dChyLnJlYWR5KTooZC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixTKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFMpKTt2YXIgVD1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09ci50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpVChhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxyLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwocihhKSxjKX0pKSxiKSlmb3IoO2g8aTtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxVPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gVigpe3RoaXMuZXhwYW5kbz1yLmV4cGFuZG8rVi51aWQrK31WLnVpZD0xLFYucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihhKXt2YXIgYj1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGJ8fChiPXt9LFUoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1iOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KSkpLGJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzLmNhY2hlKGEpO2lmKCJzdHJpbmciPT10eXBlb2YgYillW3IuY2FtZWxDYXNlKGIpXT1jO2Vsc2UgZm9yKGQgaW4gYillW3IuY2FtZWxDYXNlKGQpXT1iW2RdO3JldHVybiBlfSxnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW3IuY2FtZWxDYXNlKGIpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmInN0cmluZyI9PXR5cGVvZiBiJiZ2b2lkIDA9PT1jP3RoaXMuZ2V0KGEsYik6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9YVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PWQpe2lmKHZvaWQgMCE9PWIpe0FycmF5LmlzQXJyYXkoYik/Yj1iLm1hcChyLmNhbWVsQ2FzZSk6KGI9ci5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIubWF0Y2goTCl8fFtdKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlkZWxldGUgZFtiW2NdXX0odm9pZCAwPT09Ynx8ci5pc0VtcHR5T2JqZWN0KGQpKSYmKGEubm9kZVR5cGU/YVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgYVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9YVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1iJiYhci5pc0VtcHR5T2JqZWN0KGIpfX07dmFyIFc9bmV3IFYsWD1uZXcgVixZPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sWj0vW0EtWl0vZztmdW5jdGlvbiAkKGEpe3JldHVybiJ0cnVlIj09PWF8fCJmYWxzZSIhPT1hJiYoIm51bGwiPT09YT9udWxsOmE9PT0rYSsiIj8rYTpZLnRlc3QoYSk/SlNPTi5wYXJzZShhKTphKX1mdW5jdGlvbiBfKGEsYixjKXt2YXIgZDtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKFosIi0kJiIpLnRvTG93ZXJDYXNlKCksYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSQoYyl9Y2F0Y2goZSl7fVguc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfXIuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBYLmhhc0RhdGEoYSl8fFcuaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFguYWNjZXNzKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1gucmVtb3ZlKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gVy5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1cucmVtb3ZlKGEsYil9fSksci5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1YLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIVcuZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPXIuY2FtZWxDYXNlKGQuc2xpY2UoNSkpLF8oZixkLGVbZF0pKSk7Vy5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSl9KTpUKHRoaXMsZnVuY3Rpb24oYil7dmFyIGM7aWYoZiYmdm9pZCAwPT09Yil7aWYoYz1YLmdldChmLGEpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1fKGYsYSksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtYLnJlbW92ZSh0aGlzLGEpfSl9fSksci5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXJldHVybiBiPShifHwiZngiKSsicXVldWUiLGQ9Vy5nZXQoYSxiKSxjJiYoIWR8fEFycmF5LmlzQXJyYXkoYyk/ZD1XLmFjY2VzcyhhLGIsci5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W119LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9ci5xdWV1ZShhLGIpLGQ9Yy5sZW5ndGgsZT1jLnNoaWZ0KCksZj1yLl9xdWV1ZUhvb2tzKGEsYiksZz1mdW5jdGlvbigpe3IuZGVxdWV1ZShhLGIpfTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoImZ4Ij09PWImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBmLnN0b3AsZS5jYWxsKGEsZyxmKSksIWQmJmYmJmYuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihhLGIpe3ZhciBjPWIrInF1ZXVlSG9va3MiO3JldHVybiBXLmdldChhLGMpfHxXLmFjY2VzcyhhLGMse2VtcHR5OnIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1cucmVtb3ZlKGEsW2IrInF1ZXVlIixjXSl9KX0pfX0pLHIuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9ImZ4IixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9yLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPXIucXVldWUodGhpcyxhLGIpO3IuX3F1ZXVlSG9va3ModGhpcyxhKSwiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09Y1swXSYmci5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPXIuRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fCJmeCI7d2hpbGUoZy0tKWM9Vy5nZXQoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIGFhPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGJhPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIithYSsiKShbYS16JV0qKSQiLCJpIiksY2E9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxkYT1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09YS5zdHlsZS5kaXNwbGF5fHwiIj09PWEuc3R5bGUuZGlzcGxheSYmci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSkmJiJub25lIj09PXIuY3NzKGEsImRpc3BsYXkiKX0sZWE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O2Z1bmN0aW9uIGZhKGEsYixjLGQpe3ZhciBlLGY9MSxnPTIwLGg9ZD9mdW5jdGlvbigpe3JldHVybiBkLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiByLmNzcyhhLGIsIiIpfSxpPWgoKSxqPWMmJmNbM118fChyLmNzc051bWJlcltiXT8iIjoicHgiKSxrPShyLmNzc051bWJlcltiXXx8InB4IiE9PWomJitpKSYmYmEuZXhlYyhyLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixyLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBnYT17fTtmdW5jdGlvbiBoYShhKXt2YXIgYixjPWEub3duZXJEb2N1bWVudCxkPWEubm9kZU5hbWUsZT1nYVtkXTtyZXR1cm4gZT9lOihiPWMuYm9keS5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoZCkpLGU9ci5jc3MoYiwiZGlzcGxheSIpLGIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSwibm9uZSI9PT1lJiYoZT0iYmxvY2siKSxnYVtkXT1lLGUpfWZ1bmN0aW9uIGlhKGEsYil7Zm9yKHZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWQ9YVtmXSxkLnN0eWxlJiYoYz1kLnN0eWxlLmRpc3BsYXksYj8oIm5vbmUiPT09YyYmKGVbZl09Vy5nZXQoZCwiZGlzcGxheSIpfHxudWxsLGVbZl18fChkLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmZGEoZCkmJihlW2ZdPWhhKGQpKSk6Im5vbmUiIT09YyYmKGVbZl09Im5vbmUiLFcuc2V0KGQsImRpc3BsYXkiLGMpKSk7Zm9yKGY9MDtmPGc7ZisrKW51bGwhPWVbZl0mJihhW2ZdLnN0eWxlLmRpc3BsYXk9ZVtmXSk7cmV0dXJuIGF9ci5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGEodGhpcyk/cih0aGlzKS5zaG93KCk6cih0aGlzKS5oaWRlKCl9KX19KTt2YXIgamE9L14oPzpjaGVja2JveHxyYWRpbykkL2ksa2E9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSspL2ksbGE9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG1hPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07bWEub3B0Z3JvdXA9bWEub3B0aW9uLG1hLnRib2R5PW1hLnRmb290PW1hLmNvbGdyb3VwPW1hLmNhcHRpb249bWEudGhlYWQsbWEudGg9bWEudGQ7ZnVuY3Rpb24gbmEoYSxiKXt2YXIgYztyZXR1cm4gYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOltdLHZvaWQgMD09PWJ8fGImJkIoYSxiKT9yLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIG9hKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKVcuc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxXLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfXZhciBwYT0vPHwmIz9cdys7LztmdW5jdGlvbiBxYShhLGIsYyxkLGUpe2Zvcih2YXIgZixnLGgsaSxqLGssbD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPVtdLG49MCxvPWEubGVuZ3RoO248bztuKyspaWYoZj1hW25dLGZ8fDA9PT1mKWlmKCJvYmplY3QiPT09ci50eXBlKGYpKXIubWVyZ2UobSxmLm5vZGVUeXBlP1tmXTpmKTtlbHNlIGlmKHBhLnRlc3QoZikpe2c9Z3x8bC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxoPShrYS5leGVjKGYpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGk9bWFbaF18fG1hLl9kZWZhdWx0LGcuaW5uZXJIVE1MPWlbMV0rci5odG1sUHJlZmlsdGVyKGYpK2lbMl0saz1pWzBdO3doaWxlKGstLSlnPWcubGFzdENoaWxkO3IubWVyZ2UobSxnLmNoaWxkTm9kZXMpLGc9bC5maXJzdENoaWxkLGcudGV4dENvbnRlbnQ9IiJ9ZWxzZSBtLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7bC50ZXh0Q29udGVudD0iIixuPTA7d2hpbGUoZj1tW24rK10paWYoZCYmci5pbkFycmF5KGYsZCk+LTEpZSYmZS5wdXNoKGYpO2Vsc2UgaWYoaj1yLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxnPW5hKGwuYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGomJm9hKGcpLGMpe2s9MDt3aGlsZShmPWdbaysrXSlsYS50ZXN0KGYudHlwZXx8IiIpJiZjLnB1c2goZil9cmV0dXJuIGx9IWZ1bmN0aW9uKCl7dmFyIGE9ZC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYj1hLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGM9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Muc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxjLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxjLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxiLmFwcGVuZENoaWxkKGMpLG8uY2hlY2tDbG9uZT1iLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsby5ub0Nsb25lQ2hlY2tlZD0hIWIuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciByYT1kLmRvY3VtZW50RWxlbWVudCxzYT0vXmtleS8sdGE9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLHVhPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiB2YSgpe3JldHVybiEwfWZ1bmN0aW9uIHdhKCl7cmV0dXJuITF9ZnVuY3Rpb24geGEoKXt0cnl7cmV0dXJuIGQuYWN0aXZlRWxlbWVudH1jYXRjaChhKXt9fWZ1bmN0aW9uIHlhKGEsYixjLGQsZSxmKXt2YXIgZyxoO2lmKCJvYmplY3QiPT10eXBlb2YgYil7InN0cmluZyIhPXR5cGVvZiBjJiYoZD1kfHxjLGM9dm9pZCAwKTtmb3IoaCBpbiBiKXlhKGEsaCxjLGQsYltoXSxmKTtyZXR1cm4gYX1pZihudWxsPT1kJiZudWxsPT1lPyhlPWMsZD1jPXZvaWQgMCk6bnVsbD09ZSYmKCJzdHJpbmciPT10eXBlb2YgYz8oZT1kLGQ9dm9pZCAwKTooZT1kLGQ9YyxjPXZvaWQgMCkpLGU9PT0hMSllPXdhO2Vsc2UgaWYoIWUpcmV0dXJuIGE7cmV0dXJuIDE9PT1mJiYoZz1lLGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9ci5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LmFkZCh0aGlzLGIsZSxkLGMpfSl9ci5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbixvLHAscT1XLmdldChhKTtpZihxKXtjLmhhbmRsZXImJihmPWMsYz1mLmhhbmRsZXIsZT1mLnNlbGVjdG9yKSxlJiZyLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJhLGUpLGMuZ3VpZHx8KGMuZ3VpZD1yLmd1aWQrKyksKGk9cS5ldmVudHMpfHwoaT1xLmV2ZW50cz17fSksKGc9cS5oYW5kbGUpfHwoZz1xLmhhbmRsZT1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHImJnIuZXZlbnQudHJpZ2dlcmVkIT09Yi50eXBlP3IuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGI9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSloPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuJiYobD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LG49KGU/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG4sbD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LGs9ci5leHRlbmQoe3R5cGU6bixvcmlnVHlwZTpwLGRhdGE6ZCxoYW5kbGVyOmMsZ3VpZDpjLmd1aWQsc2VsZWN0b3I6ZSxuZWVkc0NvbnRleHQ6ZSYmci5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGUpLG5hbWVzcGFjZTpvLmpvaW4oIi4iKX0sZiksKG09aVtuXSl8fChtPWlbbl09W10sbS5kZWxlZ2F0ZUNvdW50PTAsbC5zZXR1cCYmbC5zZXR1cC5jYWxsKGEsZCxvLGcpIT09ITF8fGEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hZGRFdmVudExpc3RlbmVyKG4sZykpLGwuYWRkJiYobC5hZGQuY2FsbChhLGspLGsuaGFuZGxlci5ndWlkfHwoay5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGspOm0ucHVzaChrKSxyLmV2ZW50Lmdsb2JhbFtuXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG4sbyxwLHE9Vy5oYXNEYXRhKGEpJiZXLmdldChhKTtpZihxJiYoaT1xLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuKXtsPXIuZXZlbnQuc3BlY2lhbFtuXXx8e30sbj0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8bixtPWlbbl18fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrby5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcCE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEsbyxxLmhhbmRsZSkhPT0hMXx8ci5yZW1vdmVFdmVudChhLG4scS5oYW5kbGUpLGRlbGV0ZSBpW25dKX1lbHNlIGZvcihuIGluIGkpci5ldmVudC5yZW1vdmUoYSxuK2Jbal0sYyxkLCEwKTtyLmlzRW1wdHlPYmplY3QoaSkmJlcucmVtb3ZlKGEsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZhciBiPXIuZXZlbnQuZml4KGEpLGMsZCxlLGYsZyxoLGk9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGo9KFcuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYi50eXBlXXx8W10saz1yLmV2ZW50LnNwZWNpYWxbYi50eXBlXXx8e307Zm9yKGlbMF09YixjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKylpW2NdPWFyZ3VtZW50c1tjXTtpZihiLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGIpIT09ITEpe2g9ci5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYixqKSxjPTA7d2hpbGUoKGY9aFtjKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7Yi5jdXJyZW50VGFyZ2V0PWYuZWxlbSxkPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tkKytdKSYmIWIuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSliLnJuYW1lc3BhY2UmJiFiLnJuYW1lc3BhY2UudGVzdChnLm5hbWVzcGFjZSl8fChiLmhhbmRsZU9iaj1nLGIuZGF0YT1nLmRhdGEsZT0oKHIuZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGIucmVzdWx0PWUpPT09ITEmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGIpLGIucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg9W10saT1iLmRlbGVnYXRlQ291bnQsaj1hLnRhcmdldDtpZihpJiZqLm5vZGVUeXBlJiYhKCJjbGljayI9PT1hLnR5cGUmJmEuYnV0dG9uPj0xKSlmb3IoO2ohPT10aGlzO2o9ai5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1qLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8ai5kaXNhYmxlZCE9PSEwKSl7Zm9yKGY9W10sZz17fSxjPTA7YzxpO2MrKylkPWJbY10sZT1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1nW2VdJiYoZ1tlXT1kLm5lZWRzQ29udGV4dD9yKGUsdGhpcykuaW5kZXgoaik+LTE6ci5maW5kKGUsdGhpcyxudWxsLFtqXSkubGVuZ3RoKSxnW2VdJiZmLnB1c2goZCk7Zi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmZ9KX1yZXR1cm4gaj10aGlzLGk8Yi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmIuc2xpY2UoaSl9KSxofSxhZGRQcm9wOmZ1bmN0aW9uKGEsYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIuRXZlbnQucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpyLmlzRnVuY3Rpb24oYik/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGIodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFthXX0sc2V0OmZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19KX0sZml4OmZ1bmN0aW9uKGEpe3JldHVybiBhW3IuZXhwYW5kb10/YTpuZXcgci5FdmVudChhKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcyE9PXhhKCkmJnRoaXMuZm9jdXMpcmV0dXJuIHRoaXMuZm9jdXMoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXM9PT14YSgpJiZ0aGlzLmJsdXIpcmV0dXJuIHRoaXMuYmx1cigpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZigiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZCKHRoaXMsImlucHV0IikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fSxyLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMpfSxyLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiByLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT92YTp3YSx0aGlzLnRhcmdldD1hLnRhcmdldCYmMz09PWEudGFyZ2V0Lm5vZGVUeXBlP2EudGFyZ2V0LnBhcmVudE5vZGU6YS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWEuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9YS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9YSxiJiZyLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxyLm5vdygpLHZvaWQodGhpc1tyLmV4cGFuZG9dPSEwKSk6bmV3IHIuRXZlbnQoYSxiKX0sci5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOndhLGlzUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD12YSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sci5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihhKXt2YXIgYj1hLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS53aGljaCYmc2EudGVzdChhLnR5cGUpP251bGwhPWEuY2hhckNvZGU/YS5jaGFyQ29kZTphLmtleUNvZGU6IWEud2hpY2gmJnZvaWQgMCE9PWImJnRhLnRlc3QoYS50eXBlKT8xJmI/MToyJmI/Mzo0JmI/MjowOmEud2hpY2h9fSxyLmV2ZW50LmFkZFByb3ApLHIuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtyLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fHIuY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLHIuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4geWEodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB5YSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixyKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9d2EpLHRoaXMuZWFjaChmdW5jdGlvbigpe3IuZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9fSk7dmFyIHphPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxBYT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxCYT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxDYT0vXnRydWVcLyguKikvLERhPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBFYShhLGIpe3JldHVybiBCKGEsInRhYmxlIikmJkIoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP3IoIj50Ym9keSIsYSlbMF18fGE6YX1mdW5jdGlvbiBGYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIEdhKGEpe3ZhciBiPUNhLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gSGEoYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihXLmhhc0RhdGEoYSkmJihmPVcuYWNjZXNzKGEpLGc9Vy5zZXQoYixmKSxqPWYuZXZlbnRzKSl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihlIGluIGopZm9yKGM9MCxkPWpbZV0ubGVuZ3RoO2M8ZDtjKyspci5ldmVudC5hZGQoYixlLGpbZV1bY10pfVguaGFzRGF0YShhKSYmKGg9WC5hY2Nlc3MoYSksaT1yLmV4dGVuZCh7fSxoKSxYLnNldChiLGkpKX19ZnVuY3Rpb24gSWEoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PWMmJmphLnRlc3QoYS50eXBlKT9iLmNoZWNrZWQ9YS5jaGVja2VkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBKYShhLGIsYyxkKXtiPWcuYXBwbHkoW10sYik7dmFyIGUsZixoLGksaixrLGw9MCxtPWEubGVuZ3RoLG49bS0xLHE9YlswXSxzPXIuaXNGdW5jdGlvbihxKTtpZihzfHxtPjEmJiJzdHJpbmciPT10eXBlb2YgcSYmIW8uY2hlY2tDbG9uZSYmQmEudGVzdChxKSlyZXR1cm4gYS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWEuZXEoZSk7cyYmKGJbMF09cS5jYWxsKHRoaXMsZSxmLmh0bWwoKSkpLEphKGYsYixjLGQpfSk7aWYobSYmKGU9cWEoYixhWzBdLm93bmVyRG9jdW1lbnQsITEsYSxkKSxmPWUuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9ZiksZnx8ZCkpe2ZvcihoPXIubWFwKG5hKGUsInNjcmlwdCIpLEZhKSxpPWgubGVuZ3RoO2w8bTtsKyspaj1lLGwhPT1uJiYoaj1yLmNsb25lKGosITAsITApLGkmJnIubWVyZ2UoaCxuYShqLCJzY3JpcHQiKSkpLGMuY2FsbChhW2xdLGosbCk7aWYoaSlmb3Ioaz1oW2gubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsci5tYXAoaCxHYSksbD0wO2w8aTtsKyspaj1oW2xdLGxhLnRlc3Qoai50eXBlfHwiIikmJiFXLmFjY2VzcyhqLCJnbG9iYWxFdmFsIikmJnIuY29udGFpbnMoayxqKSYmKGouc3JjP3IuX2V2YWxVcmwmJnIuX2V2YWxVcmwoai5zcmMpOnAoai50ZXh0Q29udGVudC5yZXBsYWNlKERhLCIiKSxrKSl9cmV0dXJuIGF9ZnVuY3Rpb24gS2EoYSxiLGMpe2Zvcih2YXIgZCxlPWI/ci5maWx0ZXIoYixhKTphLGY9MDtudWxsIT0oZD1lW2ZdKTtmKyspY3x8MSE9PWQubm9kZVR5cGV8fHIuY2xlYW5EYXRhKG5hKGQpKSxkLnBhcmVudE5vZGUmJihjJiZyLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudCxkKSYmb2EobmEoZCwic2NyaXB0IikpLGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSk7cmV0dXJuIGF9ci5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh6YSwiPCQxPjwvJDI+Iil9LGNsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY2xvbmVOb2RlKCEwKSxpPXIuY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKCEoby5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8ci5pc1hNTERvYyhhKSkpZm9yKGc9bmEoaCksZj1uYShhKSxkPTAsZT1mLmxlbmd0aDtkPGU7ZCsrKUlhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fG5hKGEpLGc9Z3x8bmEoaCksZD0wLGU9Zi5sZW5ndGg7ZDxlO2QrKylIYShmW2RdLGdbZF0pO2Vsc2UgSGEoYSxoKTtyZXR1cm4gZz1uYShoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZvYShnLCFpJiZuYShhLCJzY3JpcHQiKSksaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZT1yLmV2ZW50LnNwZWNpYWwsZj0wO3ZvaWQgMCE9PShjPWFbZl0pO2YrKylpZihVKGMpKXtpZihiPWNbVy5leHBhbmRvXSl7aWYoYi5ldmVudHMpZm9yKGQgaW4gYi5ldmVudHMpZVtkXT9yLmV2ZW50LnJlbW92ZShjLGQpOnIucmVtb3ZlRXZlbnQoYyxkLGIuaGFuZGxlKTtjW1cuZXhwYW5kb109dm9pZCAwfWNbWC5leHBhbmRvXSYmKGNbWC5leHBhbmRvXT12b2lkIDApfX19KSxyLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBLYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIEthKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9yLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSmEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUVhKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9RWEodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKTE9PT1hLm5vZGVUeXBlJiYoci5jbGVhbkRhdGEobmEoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGwhPWEmJmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiByLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIUFhLnRlc3QoYSkmJiFtYVsoa2EuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9ci5odG1sUHJlZmlsdGVyKGEpO3RyeXtmb3IoO2M8ZDtjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKHIuY2xlYW5EYXRhKG5hKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIEphKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMucGFyZW50Tm9kZTtyLmluQXJyYXkodGhpcyxhKTwwJiYoci5jbGVhbkRhdGEobmEodGhpcykpLGMmJmMucmVwbGFjZUNoaWxkKGIsdGhpcykpfSxhKX19KSxyLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W10sZT1yKGEpLGY9ZS5sZW5ndGgtMSxnPTA7Zzw9ZjtnKyspYz1nPT09Zj90aGlzOnRoaXMuY2xvbmUoITApLHIoZVtnXSlbYl0oYyksaC5hcHBseShkLGMuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhkKX19KTt2YXIgTGE9L15tYXJnaW4vLE1hPW5ldyBSZWdFeHAoIl4oIithYSsiKSg/IXB4KVthLXolXSskIiwiaSIpLE5hPWZ1bmN0aW9uKGIpe3ZhciBjPWIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gYyYmYy5vcGVuZXJ8fChjPWEpLGMuZ2V0Q29tcHV0ZWRTdHlsZShiKX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2lmKGkpe2kuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt0b3A6MSU7d2lkdGg6NTAlIixpLmlubmVySFRNTD0iIixyYS5hcHBlbmRDaGlsZChoKTt2YXIgYj1hLmdldENvbXB1dGVkU3R5bGUoaSk7Yz0iMSUiIT09Yi50b3AsZz0iMnB4Ij09PWIubWFyZ2luTGVmdCxlPSI0cHgiPT09Yi53aWR0aCxpLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGY9IjRweCI9PT1iLm1hcmdpblJpZ2h0LHJhLnJlbW92ZUNoaWxkKGgpLGk9bnVsbH19dmFyIGMsZSxmLGcsaD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlJiYoaS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGkuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixvLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxoLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixoLmFwcGVuZENoaWxkKGkpLHIuZXh0ZW5kKG8se3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGN9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxlfSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxmfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGd9fSkpfSgpO2Z1bmN0aW9uIE9hKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8TmEoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdLCIiIT09Z3x8ci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fChnPXIuc3R5bGUoYSxiKSksIW8ucGl4ZWxNYXJnaW5SaWdodCgpJiZNYS50ZXN0KGcpJiZMYS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiBQYShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgUWE9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFJhPS9eLS0vLFNhPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sVWE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFZhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gV2EoYSl7aWYoYSBpbiBWYSlyZXR1cm4gYTt2YXIgYj1hWzBdLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPVVhLmxlbmd0aDt3aGlsZShjLS0paWYoYT1VYVtjXStiLGEgaW4gVmEpcmV0dXJuIGF9ZnVuY3Rpb24gWGEoYSl7dmFyIGI9ci5jc3NQcm9wc1thXTtyZXR1cm4gYnx8KGI9ci5jc3NQcm9wc1thXT1XYShhKXx8YSksYn1mdW5jdGlvbiBZYShhLGIsYyl7dmFyIGQ9YmEuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMl0tKGN8fDApKSsoZFszXXx8InB4Iik6Yn1mdW5jdGlvbiBaYShhLGIsYyxkLGUpe3ZhciBmLGc9MDtmb3IoZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MDtmPDQ7Zis9MikibWFyZ2luIj09PWMmJihnKz1yLmNzcyhhLGMrY2FbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1yLmNzcyhhLCJwYWRkaW5nIitjYVtmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09ci5jc3MoYSwiYm9yZGVyIitjYVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPXIuY3NzKGEsInBhZGRpbmciK2NhW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1yLmNzcyhhLCJib3JkZXIiK2NhW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiAkYShhLGIsYyl7dmFyIGQsZT1OYShhKSxmPU9hKGEsYixlKSxnPSJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZSk7cmV0dXJuIE1hLnRlc3QoZik/ZjooZD1nJiYoby5ib3hTaXppbmdSZWxpYWJsZSgpfHxmPT09YS5zdHlsZVtiXSksImF1dG8iPT09ZiYmKGY9YVsib2Zmc2V0IitiWzBdLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKV0pLGY9cGFyc2VGbG9hdChmKXx8MCxmK1phKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZSkrInB4Iil9ci5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1PYShhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpLGo9YS5zdHlsZTtyZXR1cm4gaXx8KGI9WGEoaCkpLGc9ci5jc3NIb29rc1tiXXx8ci5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTpqW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9YmEuZXhlYyhjKSkmJmVbMV0mJihjPWZhKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChyLmNzc051bWJlcltoXT8iIjoicHgiKSksby5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaltiXT0iaW5oZXJpdCIpLGcmJiJzZXQiaW4gZyYmdm9pZCAwPT09KGM9Zy5zZXQoYSxjLGQpKXx8KGk/ai5zZXRQcm9wZXJ0eShiLGMpOmpbYl09YykpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpO3JldHVybiBpfHwoYj1YYShoKSksZz1yLmNzc0hvb2tzW2JdfHxyLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZSYmKGU9T2EoYSxiLGQpKSwibm9ybWFsIj09PWUmJmIgaW4gVGEmJihlPVRhW2JdKSwiIj09PWN8fGM/KGY9cGFyc2VGbG9hdChlKSxjPT09ITB8fGlzRmluaXRlKGYpP2Z8fDA6ZSk6ZX19KSxyLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7ci5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiFRYS50ZXN0KHIuY3NzKGEsImRpc3BsYXkiKSl8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/JGEoYSxiLGQpOmVhKGEsU2EsZnVuY3Rpb24oKXtyZXR1cm4gJGEoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj1kJiZOYShhKSxnPWQmJlphKGEsYixkLCJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZiksZik7cmV0dXJuIGcmJihlPWJhLmV4ZWMoYykpJiYicHgiIT09KGVbM118fCJweCIpJiYoYS5zdHlsZVtiXT1jLGM9ci5jc3MoYSxiKSksWWEoYSxjLGcpfX19KSxyLmNzc0hvb2tzLm1hcmdpbkxlZnQ9UGEoby5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxiKXtpZihiKXJldHVybihwYXJzZUZsb2F0KE9hKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1lYShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksci5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ZDw0O2QrKyllW2ErY2FbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sTGEudGVzdChhKXx8KHIuY3NzSG9va3NbYStiXS5zZXQ9WWEpfSksci5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKGQ9TmEoYSksZT1iLmxlbmd0aDtnPGU7ZysrKWZbYltnXV09ci5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP3Iuc3R5bGUoYSxiLGMpOnIuY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIF9hKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBfYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfXIuVHdlZW49X2EsX2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHxyLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9Yix0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9ZCx0aGlzLnVuaXQ9Znx8KHIuY3NzTnVtYmVyW2NdPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1fYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6X2EucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9X2EucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1iPXIuZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWI9YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpfYS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxfYS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9X2EucHJvdG90eXBlLF9hLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gMSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbCE9YS5lbGVtW2EucHJvcF0mJm51bGw9PWEuZWxlbS5zdHlsZVthLnByb3BdP2EuZWxlbVthLnByb3BdOihiPXIuY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKX0sc2V0OmZ1bmN0aW9uKGEpe3IuZnguc3RlcFthLnByb3BdP3IuZnguc3RlcFthLnByb3BdKGEpOjEhPT1hLmVsZW0ubm9kZVR5cGV8fG51bGw9PWEuZWxlbS5zdHlsZVtyLmNzc1Byb3BzW2EucHJvcF1dJiYhci5jc3NIb29rc1thLnByb3BdP2EuZWxlbVthLnByb3BdPWEubm93OnIuc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpfX19LF9hLnByb3BIb29rcy5zY3JvbGxUb3A9X2EucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sci5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxyLmZ4PV9hLnByb3RvdHlwZS5pbml0LHIuZnguc3RlcD17fTt2YXIgYWIsYmIsY2I9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGRiPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZWIoKXtiYiYmKGQuaGlkZGVuPT09ITEmJmEucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2EucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGViKTphLnNldFRpbWVvdXQoZWIsci5meC5pbnRlcnZhbCksci5meC50aWNrKCkpfWZ1bmN0aW9uIGZiKCl7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe2FiPXZvaWQgMH0pLGFiPXIubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowO2Q8NDtkKz0yLWIpYz1jYVtkXSxlWyJtYXJnaW4iK2NdPWVbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIGhiKGEsYixjKXtmb3IodmFyIGQsZT0oa2IudHdlZW5lcnNbYl18fFtdKS5jb25jYXQoa2IudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7ZjxnO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gaWIoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD0id2lkdGgiaW4gYnx8ImhlaWdodCJpbiBiLG09dGhpcyxuPXt9LG89YS5zdHlsZSxwPWEubm9kZVR5cGUmJmRhKGEpLHE9Vy5nZXQoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGc9ci5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWcudW5xdWV1ZWQmJihnLnVucXVldWVkPTAsaD1nLmVtcHR5LmZpcmUsZy5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7Zy51bnF1ZXVlZHx8aCgpfSksZy51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtnLnVucXVldWVkLS0sci5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8Zy5lbXB0eS5maXJlKCl9KX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxjYi50ZXN0KGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHA/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFxfHx2b2lkIDA9PT1xW2RdKWNvbnRpbnVlO3A9ITB9bltkXT1xJiZxW2RdfHxyLnN0eWxlKGEsZCl9aWYoaT0hci5pc0VtcHR5T2JqZWN0KGIpLGl8fCFyLmlzRW1wdHlPYmplY3Qobikpe2wmJjE9PT1hLm5vZGVUeXBlJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1xJiZxLmRpc3BsYXksbnVsbD09aiYmKGo9Vy5nZXQoYSwiZGlzcGxheSIpKSxrPXIuY3NzKGEsImRpc3BsYXkiKSwibm9uZSI9PT1rJiYoaj9rPWo6KGlhKFthXSwhMCksaj1hLnN0eWxlLmRpc3BsYXl8fGosaz1yLmNzcyhhLCJkaXNwbGF5IiksaWEoW2FdKSkpLCgiaW5saW5lIj09PWt8fCJpbmxpbmUtYmxvY2siPT09ayYmbnVsbCE9aikmJiJub25lIj09PXIuY3NzKGEsImZsb2F0IikmJihpfHwobS5kb25lKGZ1bmN0aW9uKCl7by5kaXNwbGF5PWp9KSxudWxsPT1qJiYoaz1vLmRpc3BsYXksaj0ibm9uZSI9PT1rPyIiOmspKSxvLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz0iaGlkZGVuIixtLmFsd2F5cyhmdW5jdGlvbigpe28ub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxvLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLG8ub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSksaT0hMTtmb3IoZCBpbiBuKWl8fChxPyJoaWRkZW4iaW4gcSYmKHA9cS5oaWRkZW4pOnE9Vy5hY2Nlc3MoYSwiZnhzaG93Iix7ZGlzcGxheTpqfSksZiYmKHEuaGlkZGVuPSFwKSxwJiZpYShbYV0sITApLG0uZG9uZShmdW5jdGlvbigpe3B8fGlhKFthXSksVy5yZW1vdmUoYSwiZnhzaG93Iik7Zm9yKGQgaW4gbilyLnN0eWxlKGEsZCxuW2RdKX0pKSxpPWhiKHA/cVtkXTowLGQsbSksZCBpbiBxfHwocVtkXT1pLnN0YXJ0LHAmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPXIuY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sQXJyYXkuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9ci5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBrYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1rYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPXIuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWFifHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtnPGk7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksZjwxJiZpP2M6KGl8fGgubm90aWZ5V2l0aChhLFtqLDEsMF0pLGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpyLmV4dGVuZCh7fSxiKSxvcHRzOnIuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpyLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmFifHxmYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9ci5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmPGc7ZisrKWlmKGQ9a2IucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIHIuaXNGdW5jdGlvbihkLnN0b3ApJiYoci5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPXIucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiByLm1hcChrLGhiLGopLHIuaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLGoucHJvZ3Jlc3Moai5vcHRzLnByb2dyZXNzKS5kb25lKGoub3B0cy5kb25lLGoub3B0cy5jb21wbGV0ZSkuZmFpbChqLm9wdHMuZmFpbCkuYWx3YXlzKGoub3B0cy5hbHdheXMpLHIuZngudGltZXIoci5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksan1yLkFuaW1hdGlvbj1yLmV4dGVuZChrYix7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYik7cmV0dXJuIGZhKGMuZWxlbSxhLGJhLmV4ZWMoYiksYyksY31dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsYil7ci5pc0Z1bmN0aW9uKGEpPyhiPWEsYT1bIioiXSk6YT1hLm1hdGNoKEwpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWM9YVtkXSxrYi50d2VlbmVyc1tjXT1rYi50d2VlbmVyc1tjXXx8W10sa2IudHdlZW5lcnNbY10udW5zaGlmdChiKX0scHJlZmlsdGVyczpbaWJdLHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/a2IucHJlZmlsdGVycy51bnNoaWZ0KGEpOmtiLnByZWZpbHRlcnMucHVzaChhKX19KSxyLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiYib2JqZWN0Ij09dHlwZW9mIGE/ci5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxyLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIXIuaXNGdW5jdGlvbihiKSYmYn07cmV0dXJuIHIuZngub2ZmP2QuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIGQuZHVyYXRpb24mJihkLmR1cmF0aW9uIGluIHIuZnguc3BlZWRzP2QuZHVyYXRpb249ci5meC5zcGVlZHNbZC5kdXJhdGlvbl06ZC5kdXJhdGlvbj1yLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtyLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJnIuZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxyLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihkYSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ci5pc0VtcHR5T2JqZWN0KGEpLGY9ci5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsci5leHRlbmQoe30sYSksZik7KGV8fFcuZ2V0KHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9ci50aW1lcnMsZz1XLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZkYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxyLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1XLmdldCh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9ci50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLHIucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2I8ZztiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksci5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPXIuZm5bYl07ci5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxyLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksci50aW1lcnM9W10sci5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj0wLGM9ci50aW1lcnM7Zm9yKGFiPXIubm93KCk7YjxjLmxlbmd0aDtiKyspYT1jW2JdLGEoKXx8Y1tiXSE9PWF8fGMuc3BsaWNlKGItLSwxKTtjLmxlbmd0aHx8ci5meC5zdG9wKCksYWI9dm9pZCAwfSxyLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe3IudGltZXJzLnB1c2goYSksci5meC5zdGFydCgpfSxyLmZ4LmludGVydmFsPTEzLHIuZnguc3RhcnQ9ZnVuY3Rpb24oKXtiYnx8KGJiPSEwLGViKCkpfSxyLmZ4LnN0b3A9ZnVuY3Rpb24oKXtiYj1udWxsfSxyLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxyLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9ci5meD9yLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYT1kLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYj1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGM9Yi5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTthLnR5cGU9ImNoZWNrYm94IixvLmNoZWNrT249IiIhPT1hLnZhbHVlLG8ub3B0U2VsZWN0ZWQ9Yy5zZWxlY3RlZCxhPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnZhbHVlPSJ0IixhLnR5cGU9InJhZGlvIixvLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGIsbWI9ci5leHByLmF0dHJIYW5kbGU7ci5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVCh0aGlzLHIuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxyLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuZ2V0QXR0cmlidXRlP3IucHJvcChhLGIsYyk6KDE9PT1mJiZyLmlzWE1MRG9jKGEpfHwoZT1yLmF0dHJIb29rc1tiLnRvTG93ZXJDYXNlKCldfHwoci5leHByLm1hdGNoLmJvb2wudGVzdChiKT9sYjp2b2lkIDApKSx2b2lkIDAhPT1jP251bGw9PT1jP3ZvaWQgci5yZW1vdmVBdHRyKGEsYik6ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDooZD1yLmZpbmQuYXR0cihhLGIpLApudWxsPT1kP3ZvaWQgMDpkKSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIW8ucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJkIoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTAsZT1iJiZiLm1hdGNoKEwpO2lmKGUmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZVtkKytdKWEucmVtb3ZlQXR0cmlidXRlKGMpfX0pLGxiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/ci5yZW1vdmVBdHRyKGEsYyk6YS5zZXRBdHRyaWJ1dGUoYyxjKSxjfX0sci5lYWNoKHIuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9bWJbYl18fHIuZmluZC5hdHRyO21iW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGc9Yi50b0xvd2VyQ2FzZSgpO3JldHVybiBkfHwoZj1tYltnXSxtYltnXT1lLGU9bnVsbCE9YyhhLGIsZCk/ZzpudWxsLG1iW2ddPWYpLGV9fSk7dmFyIG5iPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksb2I9L14oPzphfGFyZWEpJC9pO3IuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFQodGhpcyxyLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3IucHJvcEZpeFthXXx8YV19KX19KSxyLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gMT09PWYmJnIuaXNYTUxEb2MoYSl8fChiPXIucHJvcEZpeFtiXXx8YixlPXIucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1yLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOm5iLnRlc3QoYS5ub2RlTmFtZSl8fG9iLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLG8ub3B0U2VsZWN0ZWR8fChyLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksci5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtyLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7ZnVuY3Rpb24gcGIoYSl7dmFyIGI9YS5tYXRjaChMKXx8W107cmV0dXJuIGIuam9pbigiICIpfWZ1bmN0aW9uIHFiKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifXIuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYoci5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7cih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHFiKHRoaXMpKSl9KTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pZC5pbmRleE9mKCIgIitmKyIgIik8MCYmKGQrPWYrIiAiKTtoPXBiKGQpLGUhPT1oJiZjLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaT0wO2lmKHIuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYixxYih0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pd2hpbGUoZC5pbmRleE9mKCIgIitmKyIgIik+LTEpZD1kLnJlcGxhY2UoIiAiK2YrIiAiLCIgIik7aD1wYihkKSxlIT09aCYmYy5zZXRBdHRyaWJ1dGUoImNsYXNzIixoKX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnIuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHFiKHRoaXMpLGIpLGIpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsZCxlLGY7aWYoInN0cmluZyI9PT1jKXtkPTAsZT1yKHRoaXMpLGY9YS5tYXRjaChMKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZSB2b2lkIDAhPT1hJiYiYm9vbGVhbiIhPT1jfHwoYj1xYih0aGlzKSxiJiZXLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixiKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixifHxhPT09ITE/IiI6Vy5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD0wO2I9IiAiK2ErIiAiO3doaWxlKGM9dGhpc1tkKytdKWlmKDE9PT1jLm5vZGVUeXBlJiYoIiAiK3BiKHFiKGMpKSsiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHJiPS9cci9nO3IuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1yLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMscih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOkFycmF5LmlzQXJyYXkoZSkmJihlPXIubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPXIudmFsSG9va3NbdGhpcy50eXBlXXx8ci52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPXIudmFsSG9va3NbZS50eXBlXXx8ci52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UocmIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLHIuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ci5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOnBiKHIudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1hLm9wdGlvbnMsZj1hLnNlbGVjdGVkSW5kZXgsZz0ic2VsZWN0LW9uZSI9PT1hLnR5cGUsaD1nP251bGw6W10saT1nP2YrMTplLmxlbmd0aDtmb3IoZD1mPDA/aTpnP2Y6MDtkPGk7ZCsrKWlmKGM9ZVtkXSwoYy5zZWxlY3RlZHx8ZD09PWYpJiYhYy5kaXNhYmxlZCYmKCFjLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFCKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9cihjKS52YWwoKSxnKXJldHVybiBiO2gucHVzaChiKX1yZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPXIubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWQ9ZVtnXSwoZC5zZWxlY3RlZD1yLmluQXJyYXkoci52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPi0xKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksci5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7ci52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7aWYoQXJyYXkuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPXIuaW5BcnJheShyKGEpLnZhbCgpLGIpPi0xfX0sby5jaGVja09ufHwoci52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBzYj0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87ci5leHRlbmQoci5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihiLGMsZSxmKXt2YXIgZyxoLGksaixrLG0sbixvPVtlfHxkXSxwPWwuY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1sLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWk9ZT1lfHxkLDMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmIXNiLnRlc3QocCtyLmV2ZW50LnRyaWdnZXJlZCkmJihwLmluZGV4T2YoIi4iKT4tMSYmKHE9cC5zcGxpdCgiLiIpLHA9cS5zaGlmdCgpLHEuc29ydCgpKSxrPXAuaW5kZXhPZigiOiIpPDAmJiJvbiIrcCxiPWJbci5leHBhbmRvXT9iOm5ldyByLkV2ZW50KHAsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1mPzI6MyxiLm5hbWVzcGFjZT1xLmpvaW4oIi4iKSxiLnJuYW1lc3BhY2U9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWUpLGM9bnVsbD09Yz9bYl06ci5tYWtlQXJyYXkoYyxbYl0pLG49ci5ldmVudC5zcGVjaWFsW3BdfHx7fSxmfHwhbi50cmlnZ2VyfHxuLnRyaWdnZXIuYXBwbHkoZSxjKSE9PSExKSl7aWYoIWYmJiFuLm5vQnViYmxlJiYhci5pc1dpbmRvdyhlKSl7Zm9yKGo9bi5kZWxlZ2F0ZVR5cGV8fHAsc2IudGVzdChqK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGk9aDtpPT09KGUub3duZXJEb2N1bWVudHx8ZCkmJm8ucHVzaChpLmRlZmF1bHRWaWV3fHxpLnBhcmVudFdpbmRvd3x8YSl9Zz0wO3doaWxlKChoPW9bZysrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWc+MT9qOm4uYmluZFR5cGV8fHAsbT0oVy5nZXQoaCwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZXLmdldChoLCJoYW5kbGUiKSxtJiZtLmFwcGx5KGgsYyksbT1rJiZoW2tdLG0mJm0uYXBwbHkmJlUoaCkmJihiLnJlc3VsdD1tLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gYi50eXBlPXAsZnx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8bi5fZGVmYXVsdCYmbi5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpIT09ITF8fCFVKGUpfHxrJiZyLmlzRnVuY3Rpb24oZVtwXSkmJiFyLmlzV2luZG93KGUpJiYoaT1lW2tdLGkmJihlW2tdPW51bGwpLHIuZXZlbnQudHJpZ2dlcmVkPXAsZVtwXSgpLHIuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxpJiYoZVtrXT1pKSksYi5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ci5leHRlbmQobmV3IHIuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7ci5ldmVudC50cmlnZ2VyKGQsbnVsbCxiKX19KSxyLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtpZihjKXJldHVybiByLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApfX0pLHIuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3IuZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLHIuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxvLmZvY3VzaW49Im9uZm9jdXNpbiJpbiBhLG8uZm9jdXNpbnx8ci5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe3IuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxyLmV2ZW50LmZpeChhKSl9O3IuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1XLmFjY2VzcyhkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLFcuYWNjZXNzKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9Vy5hY2Nlc3MoZCxiKS0xO2U/Vy5hY2Nlc3MoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxXLnJlbW92ZShkLGIpKX19fSk7dmFyIHRiPWEubG9jYXRpb24sdWI9ci5ub3coKSx2Yj0vXD8vO3IucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGM7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7Yz0obmV3IGEuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKX1jYXRjaChkKXtjPXZvaWQgMH1yZXR1cm4gYyYmIWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxyLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKSxjfTt2YXIgd2I9L1xbXF0kLyx4Yj0vXHI/XG4vZyx5Yj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEFiKGEsYixjLGQpe3ZhciBlO2lmKEFycmF5LmlzQXJyYXkoYikpci5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHx3Yi50ZXN0KGEpP2QoYSxlKTpBYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09ci50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpQWIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfXIucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1yLmlzRnVuY3Rpb24oYik/YigpOmI7ZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09Yz8iIjpjKX07aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFyLmlzUGxhaW5PYmplY3QoYSkpci5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlBYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIil9LHIuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gci5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXIucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP3IubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXIodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ6Yi50ZXN0KHRoaXMubm9kZU5hbWUpJiYheWIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IWphLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9cih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOkFycmF5LmlzQXJyYXkoYyk/ci5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHhiLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YiwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBCYj0vJTIwL2csQ2I9LyMuKiQvLERiPS8oWz8mXSlfPVteJl0qLyxFYj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEZiPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLEdiPS9eKD86R0VUfEhFQUQpJC8sSGI9L15cL1wvLyxJYj17fSxKYj17fSxLYj0iKi8iLmNvbmNhdCgiKiIpLExiPWQuY3JlYXRlRWxlbWVudCgiYSIpO0xiLmhyZWY9dGIuaHJlZjtmdW5jdGlvbiBNYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8W107aWYoci5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWRbMF0/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxyLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYihhLGIpe3ZhciBjLGQsZT1yLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZyLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihkKWZvcihlIGluIGgpaWYoaFtlXSYmaFtlXS50ZXN0KGQpKXtpLnVuc2hpZnQoZSk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGUgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tlKyIgIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31pZihmKXJldHVybiBmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl19ZnVuY3Rpb24gUWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1yLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6dGIuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6RmIudGVzdCh0Yi5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpLYix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6ci5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/T2IoT2IoYSxyLmFqYXhTZXR0aW5ncyksYik6T2Ioci5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6TWIoSWIpLGFqYXhUcmFuc3BvcnQ6TWIoSmIpLGFqYXg6ZnVuY3Rpb24oYixjKXsib2JqZWN0Ij09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGM9Y3x8e307dmFyIGUsZixnLGgsaSxqLGssbCxtLG4sbz1yLmFqYXhTZXR1cCh7fSxjKSxwPW8uY29udGV4dHx8byxxPW8uY29udGV4dCYmKHAubm9kZVR5cGV8fHAuanF1ZXJ5KT9yKHApOnIuZXZlbnQscz1yLkRlZmVycmVkKCksdD1yLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1PW8uc3RhdHVzQ29kZXx8e30sdj17fSx3PXt9LHg9ImNhbmNlbGVkIix5PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoayl7aWYoIWgpe2g9e307d2hpbGUoYj1FYi5leGVjKGcpKWhbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9aFthLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGs/ZzpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWsmJihhPXdbYS50b0xvd2VyQ2FzZSgpXT13W2EudG9Mb3dlckNhc2UoKV18fGEsdlthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1rJiYoby5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoayl5LmFsd2F5cyhhW3kuc3RhdHVzXSk7ZWxzZSBmb3IoYiBpbiBhKXVbYl09W3VbYl0sYVtiXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHg7cmV0dXJuIGUmJmUuYWJvcnQoYiksQSgwLGIpLHRoaXN9fTtpZihzLnByb21pc2UoeSksby51cmw9KChifHxvLnVybHx8dGIuaHJlZikrIiIpLnJlcGxhY2UoSGIsdGIucHJvdG9jb2wrIi8vIiksby50eXBlPWMubWV0aG9kfHxjLnR5cGV8fG8ubWV0aG9kfHxvLnR5cGUsby5kYXRhVHlwZXM9KG8uZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8WyIiXSxudWxsPT1vLmNyb3NzRG9tYWluKXtqPWQuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtqLmhyZWY9by51cmwsai5ocmVmPWouaHJlZixvLmNyb3NzRG9tYWluPUxiLnByb3RvY29sKyIvLyIrTGIuaG9zdCE9ai5wcm90b2NvbCsiLy8iK2ouaG9zdH1jYXRjaCh6KXtvLmNyb3NzRG9tYWluPSEwfX1pZihvLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygby5kYXRhJiYoby5kYXRhPXIucGFyYW0oby5kYXRhLG8udHJhZGl0aW9uYWwpKSxOYihJYixvLGMseSksaylyZXR1cm4geTtsPXIuZXZlbnQmJm8uZ2xvYmFsLGwmJjA9PT1yLmFjdGl2ZSsrJiZyLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLG8udHlwZT1vLnR5cGUudG9VcHBlckNhc2UoKSxvLmhhc0NvbnRlbnQ9IUdiLnRlc3Qoby50eXBlKSxmPW8udXJsLnJlcGxhY2UoQ2IsIiIpLG8uaGFzQ29udGVudD9vLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJjA9PT0oby5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoby5kYXRhPW8uZGF0YS5yZXBsYWNlKEJiLCIrIikpOihuPW8udXJsLnNsaWNlKGYubGVuZ3RoKSxvLmRhdGEmJihmKz0odmIudGVzdChmKT8iJiI6Ij8iKStvLmRhdGEsZGVsZXRlIG8uZGF0YSksby5jYWNoZT09PSExJiYoZj1mLnJlcGxhY2UoRGIsIiQxIiksbj0odmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK3ViKysgK24pLG8udXJsPWYrbiksby5pZk1vZGlmaWVkJiYoci5sYXN0TW9kaWZpZWRbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHIubGFzdE1vZGlmaWVkW2ZdKSxyLmV0YWdbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsci5ldGFnW2ZdKSksKG8uZGF0YSYmby5oYXNDb250ZW50JiZvLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsby5jb250ZW50VHlwZSkseS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLG8uZGF0YVR5cGVzWzBdJiZvLmFjY2VwdHNbby5kYXRhVHlwZXNbMF1dP28uYWNjZXB0c1tvLmRhdGFUeXBlc1swXV0rKCIqIiE9PW8uZGF0YVR5cGVzWzBdPyIsICIrS2IrIjsgcT0wLjAxIjoiIik6by5hY2NlcHRzWyIqIl0pO2ZvcihtIGluIG8uaGVhZGVycyl5LnNldFJlcXVlc3RIZWFkZXIobSxvLmhlYWRlcnNbbV0pO2lmKG8uYmVmb3JlU2VuZCYmKG8uYmVmb3JlU2VuZC5jYWxsKHAseSxvKT09PSExfHxrKSlyZXR1cm4geS5hYm9ydCgpO2lmKHg9ImFib3J0Iix0LmFkZChvLmNvbXBsZXRlKSx5LmRvbmUoby5zdWNjZXNzKSx5LmZhaWwoby5lcnJvciksZT1OYihKYixvLGMseSkpe2lmKHkucmVhZHlTdGF0ZT0xLGwmJnEudHJpZ2dlcigiYWpheFNlbmQiLFt5LG9dKSxrKXJldHVybiB5O28uYXN5bmMmJm8udGltZW91dD4wJiYoaT1hLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt5LmFib3J0KCJ0aW1lb3V0Iil9LG8udGltZW91dCkpO3RyeXtrPSExLGUuc2VuZCh2LEEpfWNhdGNoKHope2lmKGspdGhyb3cgejtBKC0xLHopfX1lbHNlIEEoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIEEoYixjLGQsaCl7dmFyIGosbSxuLHYsdyx4PWM7a3x8KGs9ITAsaSYmYS5jbGVhclRpbWVvdXQoaSksZT12b2lkIDAsZz1ofHwiIix5LnJlYWR5U3RhdGU9Yj4wPzQ6MCxqPWI+PTIwMCYmYjwzMDB8fDMwND09PWIsZCYmKHY9UGIobyx5LGQpKSx2PVFiKG8sdix5LGopLGo/KG8uaWZNb2RpZmllZCYmKHc9eS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihyLmxhc3RNb2RpZmllZFtmXT13KSx3PXkuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoci5ldGFnW2ZdPXcpKSwyMDQ9PT1ifHwiSEVBRCI9PT1vLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1iP3g9Im5vdG1vZGlmaWVkIjooeD12LnN0YXRlLG09di5kYXRhLG49di5lcnJvcixqPSFuKSk6KG49eCwhYiYmeHx8KHg9ImVycm9yIixiPDAmJihiPTApKSkseS5zdGF0dXM9Yix5LnN0YXR1c1RleHQ9KGN8fHgpKyIiLGo/cy5yZXNvbHZlV2l0aChwLFttLHgseV0pOnMucmVqZWN0V2l0aChwLFt5LHgsbl0pLHkuc3RhdHVzQ29kZSh1KSx1PXZvaWQgMCxsJiZxLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt5LG8saj9tOm5dKSx0LmZpcmVXaXRoKHAsW3kseF0pLGwmJihxLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3ksb10pLC0tci5hY3RpdmV8fHIuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB5fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gci5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHIuZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLHIuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe3JbYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHIuaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLHIuYWpheChyLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sci5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksci5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gci5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxyLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gdGhpc1swXSYmKHIuaXNGdW5jdGlvbihhKSYmKGE9YS5jYWxsKHRoaXNbMF0pKSxiPXIoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiByLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXIodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9ci5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7cih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxyLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIXIuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LHIuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxyLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319O3ZhciBSYj17MDoyMDAsMTIyMzoyMDR9LFNiPXIuYWpheFNldHRpbmdzLnhocigpO28uY29ycz0hIVNiJiYid2l0aENyZWRlbnRpYWxzImluIFNiLG8uYWpheD1TYj0hIVNiLHIuYWpheFRyYW5zcG9ydChmdW5jdGlvbihiKXt2YXIgYyxkO2lmKG8uY29yc3x8U2ImJiFiLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7dmFyIGcsaD1iLnhocigpO2lmKGgub3BlbihiLnR5cGUsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpLGIueGhyRmllbGRzKWZvcihnIGluIGIueGhyRmllbGRzKWhbZ109Yi54aHJGaWVsZHNbZ107Yi5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYi5taW1lVHlwZSksYi5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihnIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGcsZVtnXSk7Yz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtjJiYoYz1kPWgub25sb2FkPWgub25lcnJvcj1oLm9uYWJvcnQ9aC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09YT9oLmFib3J0KCk6ImVycm9yIj09PWE/Im51bWJlciIhPXR5cGVvZiBoLnN0YXR1cz9mKDAsImVycm9yIik6ZihoLnN0YXR1cyxoLnN0YXR1c1RleHQpOmYoUmJbaC5zdGF0dXNdfHxoLnN0YXR1cyxoLnN0YXR1c1RleHQsInRleHQiIT09KGgucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIGgucmVzcG9uc2VUZXh0P3tiaW5hcnk6aC5yZXNwb25zZX06e3RleHQ6aC5yZXNwb25zZVRleHR9LGguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LGgub25sb2FkPWMoKSxkPWgub25lcnJvcj1jKCJlcnJvciIpLHZvaWQgMCE9PWgub25hYm9ydD9oLm9uYWJvcnQ9ZDpoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1oLnJlYWR5U3RhdGUmJmEuc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmQoKX0pfSxjPWMoImFib3J0Iik7dHJ5e2guc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCl9Y2F0Y2goaSl7aWYoYyl0aHJvdyBpfX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX0pLHIuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXthLmNyb3NzRG9tYWluJiYoYS5jb250ZW50cy5zY3JpcHQ9ITEpfSksci5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ2xvYmFsRXZhbChhKSxhfX19KSxyLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksci5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXtiPXIoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZigiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGQuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgVGI9W10sVWI9Lyg9KVw/KD89JnwkKXxcP1w/LztyLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9VGIucG9wKCl8fHIuZXhwYW5kbysiXyIrdWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLHIuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKFViLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVWIudGVzdChiLmRhdGEpJiYiZGF0YSIpO2lmKGh8fCJqc29ucCI9PT1iLmRhdGFUeXBlc1swXSlyZXR1cm4gZT1iLmpzb25wQ2FsbGJhY2s9ci5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGg/YltoXT1iW2hdLnJlcGxhY2UoVWIsIiQxIitlKTpiLmpzb25wIT09ITEmJihiLnVybCs9KHZiLnRlc3QoYi51cmwpPyImIjoiPyIpK2IuanNvbnArIj0iK2UpLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBnfHxyLmVycm9yKGUrIiB3YXMgbm90IGNhbGxlZCIpLGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIixmPWFbZV0sYVtlXT1mdW5jdGlvbigpe2c9YXJndW1lbnRzfSxkLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWY/cihhKS5yZW1vdmVQcm9wKGUpOmFbZV09ZixiW2VdJiYoYi5qc29ucENhbGxiYWNrPWMuanNvbnBDYWxsYmFjayxUYi5wdXNoKGUpKSxnJiZyLmlzRnVuY3Rpb24oZikmJmYoZ1swXSksZz1mPXZvaWQgMH0pLCJzY3JpcHQifSksby5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1kLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09YS5jaGlsZE5vZGVzLmxlbmd0aH0oKSxyLnBhcnNlSFRNTD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybltdOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSk7dmFyIGUsZixnO3JldHVybiBifHwoby5jcmVhdGVIVE1MRG9jdW1lbnQ/KGI9ZC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLGU9Yi5jcmVhdGVFbGVtZW50KCJiYXNlIiksZS5ocmVmPWQubG9jYXRpb24uaHJlZixiLmhlYWQuYXBwZW5kQ2hpbGQoZSkpOmI9ZCksZj1DLmV4ZWMoYSksZz0hYyYmW10sZj9bYi5jcmVhdGVFbGVtZW50KGZbMV0pXTooZj1xYShbYV0sYixnKSxnJiZnLmxlbmd0aCYmcihnKS5yZW1vdmUoKSxyLm1lcmdlKFtdLGYuY2hpbGROb2RlcykpfSxyLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD4tMSYmKGQ9cGIoYS5zbGljZShoKSksYT1hLnNsaWNlKDAsaCkpLHIuaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmci5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP3IoIjxkaXY+IikuYXBwZW5kKHIucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sci5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtyLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksci5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ3JlcChyLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0sci5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1yLmNzcyhhLCJwb3NpdGlvbiIpLGw9cihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9ci5jc3MoYSwidG9wIiksaT1yLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmKGYraSkuaW5kZXhPZigiYXV0byIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxyLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsci5leHRlbmQoe30saCkpKSxudWxsIT1iLnRvcCYmKG0udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG0ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG0pOmwuY3NzKG0pfX0sci5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3Iub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQsZSxmPXRoaXNbMF07aWYoZilyZXR1cm4gZi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGI9Zi5vd25lckRvY3VtZW50LGM9Yi5kb2N1bWVudEVsZW1lbnQsZT1iLmRlZmF1bHRWaWV3LHt0b3A6ZC50b3ArZS5wYWdlWU9mZnNldC1jLmNsaWVudFRvcCxsZWZ0OmQubGVmdCtlLnBhZ2VYT2Zmc2V0LWMuY2xpZW50TGVmdH0pOnt0b3A6MCxsZWZ0OjB9fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXIuY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLEIoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkPXt0b3A6ZC50b3Arci5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxsZWZ0OmQubGVmdCtyLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKX0pLHt0b3A6Yi50b3AtZC50b3Atci5jc3MoYywibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtZC5sZWZ0LXIuY3NzKGMsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYic3RhdGljIj09PXIuY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8cmF9KX19KSxyLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0icGFnZVlPZmZzZXQiPT09YjtyLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmO3JldHVybiByLmlzV2luZG93KGEpP2Y9YTo5PT09YS5ub2RlVHlwZSYmKGY9YS5kZWZhdWx0Vmlldyksdm9pZCAwPT09ZT9mP2ZbYl06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP2YucGFnZVhPZmZzZXQ6ZSxjP2U6Zi5wYWdlWU9mZnNldCk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgpfX0pLHIuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe3IuY3NzSG9va3NbYl09UGEoby5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7aWYoYylyZXR1cm4gYz1PYShhLGIpLE1hLnRlc3QoYyk/cihhKS5wb3NpdGlvbigpW2JdKyJweCI6Y30pfSksci5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7ci5mbltkXT1mdW5jdGlvbihlLGYpe3ZhciBnPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxoPWN8fChlPT09ITB8fGY9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihiLGMsZSl7dmFyIGY7cmV0dXJuIHIuaXNXaW5kb3coYik/MD09PWQuaW5kZXhPZigib3V0ZXIiKT9iWyJpbm5lciIrYV06Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGY9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGZbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGZbIm9mZnNldCIrYV0sZlsiY2xpZW50IithXSkpOnZvaWQgMD09PWU/ci5jc3MoYixjLGgpOnIuc3R5bGUoYixjLGUsaCl9LGIsZz9lOnZvaWQgMCxnKX19KX0pLHIuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KSxyLmhvbGRSZWFkeT1mdW5jdGlvbihhKXthP3IucmVhZHlXYWl0Kys6ci5yZWFkeSghMCl9LHIuaXNBcnJheT1BcnJheS5pc0FycmF5LHIucGFyc2VKU09OPUpTT04ucGFyc2Usci5ub2RlTmFtZT1CLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIFZiPWEualF1ZXJ5LFdiPWEuJDtyZXR1cm4gci5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1yJiYoYS4kPVdiKSxiJiZhLmpRdWVyeT09PXImJihhLmpRdWVyeT1WYikscn0sYnx8KGEualF1ZXJ5PWEuJD1yKSxyfSk7Cg=="}]},{"name":"超星学习通网课助手|视频挂机考试答题|全网聚合题库每日自动更新适用于几乎所有专业科目|完全免费永久使用【网课通用版】","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["*://*.chaoxing.com/*","*://*.edu.cn/*","*://*.nbdlib.cn/*","*://*.hnsyu.net/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["api.muketool.com","api2.muketool.com"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-end","orig_noframes":null}},"storage":{"ts":1637743403503,"data":{}},"enabled":true,"position":2,"file_url":"https://greasyfork.org/scripts/426360-%E8%B6%85%E6%98%9F%E5%AD%A6%E4%B9%A0%E9%80%9A%E7%BD%91%E8%AF%BE%E5%8A%A9%E6%89%8B-%E8%A7%86%E9%A2%91%E6%8C%82%E6%9C%BA%E8%80%83%E8%AF%95%E7%AD%94%E9%A2%98-%E5%85%A8%E7%BD%91%E8%81%9A%E5%90%88%E9%A2%98%E5%BA%93%E6%AF%8F%E6%97%A5%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E9%80%82%E7%94%A8%E4%BA%8E%E5%87%A0%E4%B9%8E%E6%89%80%E6%9C%89%E4%B8%93%E4%B8%9A%E7%A7%91%E7%9B%AE-%E5%AE%8C%E5%85%A8%E5%85%8D%E8%B4%B9%E6%B0%B8%E4%B9%85%E4%BD%BF%E7%94%A8-%E7%BD%91%E8%AF%BE%E9%80%9A%E7%94%A8%E7%89%88/code/%E8%B6%85%E6%98%9F%E5%AD%A6%E4%B9%A0%E9%80%9A%E7%BD%91%E8%AF%BE%E5%8A%A9%E6%89%8B%7C%E8%A7%86%E9%A2%91%E6%8C%82%E6%9C%BA%E8%80%83%E8%AF%95%E7%AD%94%E9%A2%98%7C%E5%85%A8%E7%BD%91%E8%81%9A%E5%90%88%E9%A2%98%E5%BA%93%E6%AF%8F%E6%97%A5%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E9%80%82%E7%94%A8%E4%BA%8E%E5%87%A0%E4%B9%8E%E6%89%80%E6%9C%89%E4%B8%93%E4%B8%9A%E7%A7%91%E7%9B%AE%7C%E5%AE%8C%E5%85%A8%E5%85%8D%E8%B4%B9%E6%B0%B8%E4%B9%85%E4%BD%BF%E7%94%A8%E3%80%90%E7%BD%91%E8%AF%BE%E9%80%9A%E7%94%A8%E7%89%88%E3%80%91.user.js","uuid":"cb594dd7-bbf2-4d2a-aed1-8d1a4224ec37","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDotoXmmJ/lrabkuaDpgJrnvZHor77liqnmiYt86KeG6aKR5oyC5py66ICD6K+V562U6aKYfOWFqOe9keiBmuWQiOmimOW6k+avj+aXpeiHquWKqOabtOaWsOmAgueUqOS6juWHoOS5juaJgOacieS4k+S4muenkeebrnzlrozlhajlhY3otLnmsLjkuYXkvb/nlKjjgJDnvZHor77pgJrnlKjniYjjgJEKLy8gQHZlcnNpb24gICAgICAxLjAuNwovLyBAbmFtZXNwYWNlICAgIE11a2V0b29sCi8vIEBkZXNjcmlwdGlvbiAg44CQ8J+lh+aTjeS9nOeugOWNleOAkei2heaYn+WwlOmbhU1PT0Poh6rliqjmjILmnLrvvIzml6DpnIDphY3nva7lronoo4XljbPlj6/kvb/nlKjjgILjgJDwn5SK5Yqf6IO96b2Q5YWo44CR5pSv5oyB6KeG6aKR44CB6Z+z6aKR44CB5paH5qGj44CB5Zu+5Lmm6Ieq5Yqo5a6M5oiQ77yb56ug6IqC5rWL6aqM6Ieq5Yqo562U6aKY44CB6Ieq5Yqo5o+Q5Lqk77yM5pSv5oyB6Ieq5Yqo5YiH5o2i5Lu75Yqh54K544CB5oyC5py66ZiF6K+75pe26ZW/44CB6Ieq5Yqo55m75b2V562J44CC44CQ8J+TlOeLrOWutumimOW6k+OAkeeLrOWutuS4sOWvjOivlemimOW6k++8jOeyvuWHhuivhuWIq++8jOetlOahiOWFqOWvueOAguOAkOKcqOWKn+iDveaJqeWxleOAkeino+mZpOWQhOexu+WKn+iDvemZkOWItu+8jOaUr+aMgeS4i+i9veinhumikeOAgXBkZuaWh+aho++8jOW8gOaUvuiHquWumuS5ieWPguaVsAovLyBAYXV0aG9yICAgICAgIE11a2V0b29sCi8vIEBtYXRjaCAgICAgICAgKjovLyouY2hhb3hpbmcuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5lZHUuY24vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLm5iZGxpYi5jbi8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouaG5zeXUubmV0LyoKLy8gQGNvbm5lY3QgICAgICBhcGkubXVrZXRvb2wuY29tCi8vIEBjb25uZWN0ICAgICAgYXBpMi5tdWtldG9vbC5jb20KLy8gQHJ1bi1hdCAgICAgICBkb2N1bWVudC1lbmQKLy8gQGdyYW50ICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQGdyYW50ICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9zZXRDbGlwYm9hcmQKLy8gQGxpY2Vuc2UgICAgICBNSVQKLy8gQHN1cHBvcnRVUkwgICBodHRwczovL2RvY3MubXVrZXRvb2wuY29tCi8vIEBob21lcGFnZSAgICAgaHR0cHM6Ly93d3cubXVrZXRvb2wuY29tCi8vIEBvcmlnaW5hbC1zY3JpcHQgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM2OTYyNS0lRTglQjYlODUlRTYlOTglOUYlRTclQkQlOTElRTglQUYlQkUlRTUlOEElQTklRTYlODklOEIKLy8gQG9yaWdpbmFsLWF1dGhvciB3eW42NjU4MTcKLy8gQG9yaWdpbmFsLWxpY2Vuc2UgTUlUCi8vID09L1VzZXJTY3JpcHQ9PQoKLy8g6K6+572u5L+u5pS55ZCO77yM6ZyA6KaB5Yi35paw5oiW6YeN5paw5omT5byA572R6K++6aG16Z2i5omN5Lya55Sf5pWICnZhciBzZXR0aW5nID0gewoKICAgIC8v6L+Z6YeM6K6+572u6ISa5pys5omA5L2/55So55qE6aKY5bqT5o6l5Y+j44CC6buY6K6k5L2/55SoTXVrZXRvb2zlm6LpmJ/popjlupPvvIzmgqjkuZ/lj6/ku6Xoh6rooYzmm7/mjaLkuLrlhbbku5bpopjlupPmnI3liqHlmajjgIIKICAgIC8vTXVrZXRvb2zlm6LpmJ/pu5jorqTmj5DkvpvkuKTkuKrpopjlupPmjqXlj6PvvJrigJxodHRwOi8vYXBpLm11a2V0b29sLmNvbToyMDg2L+KAne+8iOm7mOiupOS9v+eUqOivpeaOpeWPo++8ieWSjOKAnGh0dHA6Ly9hcGkyLm11a2V0b29sLmNvbToyMDg2L+KAne+8jAogICAgLy/kuozkuKrpopjlupPor5XpopjmlbDmja7kuIDmoLfvvIzljLrliKvlnKjkuo7liY3ogIXkvb/nlKjliqDpgJ/nur/ot6/vvIzlk43lupTmm7Tlv6vkvYbmmK/mmJPlj5fmlLvlh7vvvJvlkI7ogIXph4fnlKjlm73lpJbpq5jpmLLnur/ot6/pgJ/luqbnlaXmhaLkvYbml6Dop4bnvZHnu5zmlLvlh7vjgILlpoLmnpzmgqjlj5HnjrDlhbbkuK3kuIDkuKrpopjlupPlpLHogZTvvIzlj6/ku6XlsJ3or5XliIfmjaLkuLrlj6bkuIDkuKrjgIIKICAgICB0aWt1OiAnaHR0cDovL2FwaS5tdWtldG9vbC5jb20vJwoKICAgIC8vIDVFMyA9PSA1MDAw77yM56eR5a2m6K6w5pWw5rOV77yM6KGo56S65q+r56eS5pWwCiAgICAsdGltZTogOEUzIC8vIOm7mOiupOWTjeW6lOmAn+W6puS4ujXnp5LvvIzkuI3lu7rorq7lsI/kuo4156eSCiAgICAsIHJldmlldzogMCAvLyDlpI3kuaDmqKHlvI/vvIzlrozmlbTmjILmnLrop4bpopEo6Z+z6aKRKeaXtumVv++8jOaUr+aMgeaMguacuuS7u+WKoeeCueW3suWujOaIkOeahOinhumikeWSjOmfs+mike+8jOm7mOiupOWFs+mXrQogICAgLCBxdWV1ZTogMSAvLyDpmJ/liJfmqKHlvI/vvIzlvIDlkK/lkI7ku7vliqHngrnpgJDkuIDlrozmiJDvvIzlhbPpl63liJnljZXpobXpnaLmiYDmnInku7vliqHngrnlkIzml7bov5vooYzvvIzpu5jorqTlvIDlkK8KCiAgICAvLyAx5Luj6KGo5byA5ZCv77yMMOS7o+ihqOWFs+mXrQogICAgLCB2aWRlbzogMSAvLyDop4bpopHmlK/mjIHlkI7lj7DjgIHliIfmjaLnqpflj6PkuI3mmoLlgZzvvIzmlK/mjIHlpJrop4bpopHvvIzpu5jorqTlvIDlkK8KICAgICwgd29yazogMSAvLyDoh6rliqjnrZTpopjlip/og70o56ug6IqC5rWL6aqMKe+8jOS9nOS4mumcgOimgeaJi+WKqOW8gOWQr+afpeivou+8jOmrmOWHhuehrueOh++8jOm7mOiupOW8gOWQrwogICAgLCBhdWRpbzogMSAvLyDpn7PpopHoh6rliqjmkq3mlL7vvIzkuI7op4bpopHlip/og73lhbHkuqt2b2zlkoxyYXRl5Y+C5pWw77yM6buY6K6k5byA5ZCvCiAgICAsIGJvb2s6IDEgLy8g5Zu+5Lmm6ZiF6K+75Lu75Yqh54K577yM6Z2e6K++56iL6ZiF6K+75Lu75Yqh54K577yM6buY6K6k5byA5ZCvCiAgICAsIGRvY3M6IDEgLy8g5paH5qGj6ZiF6K+75Lu75Yqh54K577yMUFBU57G75Lu75Yqh54K56Ieq5Yqo5a6M5oiQ6ZiF6K+75Lu75Yqh77yM6buY6K6k5byA5ZCvCiAgICAvLyDmnKzljLrln5/lj4LmlbDvvIzkuIrmlrnkuLrku7vliqHngrnlip/og73vvIzkuIvmlrnkuLrni6znq4vlip/og70KICAgICwganVtcDogMSAvLyDoh6rliqjliIfmjaLku7vliqHngrnjgIHnq6DoioLjgIHor77nqIso6ZyA6KaB6YWN572uY291cnNl5Y+C5pWwKe+8jOm7mOiupOW8gOWQrwogICAgLCByZWFkOiAnNjUnIC8vIOaMguacuuivvueoi+mYheivu+aXtumXtO+8jOWNleS9jeaYr+WIhumSn++8jCc2NSfku6PooajmjILmnLo2NeWIhumSn++8jOivt+aJi+WKqOaJk+W8gOmYheivu+mhtemdou+8jOm7mOiupCc2NSfliIbpkp8KICAgICwgZmFjZTogMSAvLyDop6PpmaTpnaLpg6jor4bliKso5LiN5pSv5oyB5LqM57u056CB57G76Z2i6YOo6YeH6ZuGKe+8jOatpOWKn+iDveS7heS4uuS4tOaXtuino+mZpO+8jOm7mOiupOW8gOWQrwogICAgLCB0b3RhbDogMSAvLyDmmL7npLror77nqIvov5vluqbnmoTnu5/orqHmlbDmja7vvIzlnKjlrabkuaDov5vluqbpobXpnaLnmoTkuIrmlrnlsZXnpLrvvIzpu5jorqTlvIDlkK8KCiAgICAvLyDku4XlvIDlkK92aWRlbyhhdWRpbynml7bvvIzkv67mlLnmraTlpITmiY3kvJrnlJ/mlYgKICAgICwgbGluZTogJ+WFrOe9kTEnIC8vIOinhumikeaSreaUvueahOm7mOiupOi1hOa6kOe6v+i3r++8jOatpOWKn+iDvemAgueUqOS6juezu+e7n+m7mOiupOe6v+i3r+aXoOi1hOa6kO+8jOm7mOiupCflhaznvZExJwogICAgLCBodHRwOiAn5qCH5riFJyAvLyDop4bpopHmkq3mlL7nmoTpu5jorqTmuIXmmbDluqbvvIzml6DmlYjlj4LmlbDliJnkvb/nlKjns7vnu5/pu5jorqTmuIXmmbDluqbvvIzpu5jorqQn5qCH5riFJwogICAgLy8g5pys5Yy65Z+f5Y+C5pWw77yM5LiK5pa55Li6dmlkZW/lip/og73ni6zkuqvvvIzkuIvmlrnkuLphdWRpb+WKn+iDveWFseS6qwogICAgLCB2b2w6ICcwJyAvLyDpu5jorqTpn7Pph4/nmoTnmb7liIbmlbDvvIzorr7lrprojIPlm7TvvJpbMCwxMDBd77yMJzAn5Li66Z2Z6Z+z77yM6buY6K6kJzAnCiAgICAsIHJhdGU6ICcxJyAvLyDop4bpopHmkq3mlL7pu5jorqTlgI3njofvvIzlj4LmlbDojIPlm7Qw4oiqWzAuMDYyNSwxNl3vvIwnMCfkuLrnp5Lov4fvvIzpu5jorqQnMSflgI0KCiAgICAvLyDku4XlvIDlkK93b3Jr5pe277yM5L+u5pS55q2k5aSE5omN5Lya55Sf5pWICiAgICAvLyBhdXRvOiAxIOW3suaUvue9rumdouadvyzor7flnKjpnaLmnb/phY3nva4s6buY6K6k5Li66Ieq5Yqo5o+Q5LqkIC8vIOetlOmimOWujOaIkOWQjuiHquWKqOaPkOS6pO+8jOm7mOiupOW8gOWQrwogICAgLCBub25lOiAwIC8vIOaXoOWMuemFjeetlOahiOaXtuaJp+ihjOm7mOiupOaTjeS9nO+8jOWFs+mXreWQjuiLpemimOebruaXoOWMuemFjeetlOahiOWImeS8muaaguaXtuS/neWtmOW3suS9nOetlOeahOmimOebru+8jOm7mOiupOW8gOWQrwogICAgLCBzY2FsZTogMCAvLyDlr4zmlofmnKznvJbovpHlmajpq5jluqboh6rliqjmi4nkvLjvvIznlKjkuo7mlofmnKznsbvpopjnm67vvIznrZTpopjmoYbmoLnmja7lhoXlrrnoh6rliqjosIPmlbTlpKflsI/vvIzpu5jorqTlhbPpl60KCiAgICAvLyDku4XlvIDlkK9qdW1w5pe277yM5L+u5pS55q2k5aSE5omN5Lya55Sf5pWICiAgICAsIGNvdXJzZTogMCAvLyDlvZPliY3or77nqIvlrozmiJDlkI7oh6rliqjliIfmjaLor77nqIvvvIzku4XmlK/mjIHmjInnhafmoLnnm67lvZXor77nqIvpobrluo/liIfmjaLvvIzpu5jorqTlvIDlkK8KICAgICwgbG9jazogMSAvLyDot7Pov4fmnKrlvIDmlL4o5Zu+5qCH5piv6ZSBKeeahOeroOiKgu+8jOWNs+mXr+WFs+aooeW8j+aIluWumuaXtuWPkeaUvueahOS7u+WKoeeCue+8jOm7mOiupOW8gOWQrwoKICAgIC8vIOiHquWKqOeZu+W9leWKn+iDvemFjee9ruWMugogICAgLCBzY2hvb2w6ICfotKblj7fkuLrmiYvmnLrlj7flj6/ku6XkuI3kv67mlLnmraTlj4LmlbAnIC8vIOWtpuagoS/ljZXkvY0v5py65p6E56CB77yM6KaB5rGC5a6M5pW05pyJ5pWI5Y+v5p+l6K+i77yM5L6L5aaCJ+a4heWNjuWkp+WtpicKICAgICwgdXNlcm5hbWU6ICcnIC8vIOWtpuWPty/lt6Xlj7cv5YCf5Lmm6K+B5Y+3KOmCrueusS/miYvmnLrlj7cv6LSm5Y+3Ke+8jOS+i+WmgicyMDE4MDEwMTAxJ++8jOm7mOiupCcnCiAgICAsIHBhc3N3b3JkOiAnJyAvLyDlr4bnoIHvvIzkvovlpoInMTIzNDU2J++8jOm7mOiupCcnCgogICAgLCBzY3JpcHQ6ICd2MWN4JwogICAgLCB2ZXJzaW9uOiAnMS4wLjcnCgp9LApfc2VsZiA9IHVuc2FmZVdpbmRvdywKdXJsID0gbG9jYXRpb24ucGF0aG5hbWUsCnRvcCA9IF9zZWxmOwoKdmFyIHRtcFN1Ym1pdCA9IDE7Ly/mnKzmrKEKT2JqZWN0LmRlZmluZVByb3BlcnR5KHNldHRpbmcsICJhdXRvIiwgewpnZXQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0bXBTdWJtaXQgPj0gMikgewogICAgICAgIHJldHVybiB0bXBTdWJtaXQgPT09IDM7CiAgICB9CiAgICByZXR1cm4gR01fZ2V0VmFsdWUoImF1dG9zdWJtaXQiKTsKfSwgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsKICAgIHRtcFN1Ym1pdCA9IHZhbHVlICsgMjsKfQp9KTsKCnNldHRpbmcubm90aWNlID0gJ+WFrOWRiuagjyc7CgppZiAodXJsICE9ICcvc3R1ZHlBcHAvc3R1ZHlpbmcnICYmIHRvcCAhPSBfc2VsZi50b3ApIGRvY3VtZW50LmRvbWFpbiA9IGxvY2F0aW9uLmhvc3QucmVwbGFjZSgvLis/XC4vLCAnJyk7Cgp0cnkgewp3aGlsZSAodG9wICE9IF9zZWxmLnRvcCkgewogICAgdG9wID0gdG9wLnBhcmVudC5kb2N1bWVudCA/IHRvcC5wYXJlbnQgOiBfc2VsZi50b3A7CiAgICBpZiAodG9wLmxvY2F0aW9uLnBhdGhuYW1lID09ICcvbXljb3Vyc2Uvc3R1ZGVudHN0dWR5JykgYnJlYWs7Cn0KfSBjYXRjaCAoZXJyKSB7Ci8vIGNvbnNvbGUubG9nKGVycik7CnRvcCA9IF9zZWxmOwp9Cgp2YXIgJCA9IF9zZWxmLmpRdWVyeSB8fCB0b3AualF1ZXJ5LApwYXJlbnQgPSBfc2VsZiA9PSB0b3AgPyBzZWxmIDogX3NlbGYucGFyZW50LApFeHQgPSBfc2VsZi5FeHQgfHwgcGFyZW50LkV4dCB8fCB7fSwKVUUgPSBfc2VsZi5VRSwKdmpzID0gX3NlbGYudmlkZW9qczsKClN0cmluZy5wcm90b3R5cGUudG9DREIgPSBmdW5jdGlvbiAoKSB7CnJldHVybiB0aGlzLnJlcGxhY2UoL1xzL2csICcnKS5yZXBsYWNlKC9bXHVmZjAxLVx1ZmY1ZV0vZywgZnVuY3Rpb24gKHN0cikgewogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoMCkgLSA2NTI0OCk7Cn0pLnJlcGxhY2UoL1vigJzigJ1dL2csICciJykucmVwbGFjZSgvW+KAmOKAmV0vZywgIiciKS5yZXBsYWNlKC/jgIIvZywgJy4nKTsKfTsKCnNldHRpbmcubm9ybWFsID0gJyc7IC8vICc6dmlzaWJsZScKLy8gc2V0dGluZy50aW1lICs9IE1hdGguY2VpbChzZXR0aW5nLnRpbWUgKiBNYXRoLnJhbmRvbSgpKSAtIHNldHRpbmcudGltZSAvIDI7CnNldHRpbmcuam9iID0gWyc6bm90KCopJ107CgpzZXR0aW5nLnZpZGVvICYmIHNldHRpbmcuam9iLnB1c2goJ2lmcmFtZVtzcmMqPSIvdmlkZW8vaW5kZXguaHRtbCJdJyk7CnNldHRpbmcud29yayAmJiBzZXR0aW5nLmpvYi5wdXNoKCdpZnJhbWVbc3JjKj0iL3dvcmsvaW5kZXguaHRtbCJdJyk7CnNldHRpbmcuYXVkaW8gJiYgc2V0dGluZy5qb2IucHVzaCgnaWZyYW1lW3NyYyo9Ii9hdWRpby9pbmRleC5odG1sIl0nKTsKc2V0dGluZy5ib29rICYmIHNldHRpbmcuam9iLnB1c2goJ2lmcmFtZVtzcmMqPSIvaW5uZXJib29rL2luZGV4Lmh0bWwiXScpOwpzZXR0aW5nLmRvY3MgJiYgc2V0dGluZy5qb2IucHVzaCgnaWZyYW1lW3NyYyo9Ii9wcHQvaW5kZXguaHRtbCJdJywgJ2lmcmFtZVtzcmMqPSIvcGRmL2luZGV4Lmh0bWwiXScpOwoKc2V0dGluZy50aXAgPSAhc2V0dGluZy5xdWV1ZSB8fCB0b3AgIT0gX3NlbGYgJiYgam9iU29ydCgkIHx8IEV4dC5xdWVyeSk7CgppZiAodXJsID09ICcvbXljb3Vyc2Uvc3R1ZGVudHN0dWR5Jykgewpfc2VsZi5jaGVja01vYmlsZUJyb3dlckxlYXJuID0gJC5ub29wOwp2YXIgY2xhc3NJZCA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvY2xhW3pzXXsyfWlkPShcZCspL2kpWzFdIHx8IDAsCiAgICBjb3Vyc2VJZCA9IF9zZWxmLmNvdXJzZUlkIHx8IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvY291cnNlSWQ9KFxkKykvaSlbMV0gfHwgMDsKc2V0dGluZy5sb2NrIHx8ICQoJyNjb3Vyc2V0cmVlJykub24oJ2NsaWNrJywgJ1tvbmNsaWNrKj12b2lkXSwgW2hyZWYqPXZvaWRdJywgZnVuY3Rpb24gKCkgewogICAgX3NlbGYuZ2V0VGVhY2hlckFqYXgoY291cnNlSWQsIGNsYXNzSWQsICQodGhpcykucGFyZW50KCkuYXR0cignaWQnKS5zbGljZSgzKSk7Cn0pOwp9IGVsc2UgaWYgKHVybCA9PSAnL2FuYW5hcy9tb2R1bGVzL3ZpZGVvL2luZGV4Lmh0bWwnICYmIHNldHRpbmcudmlkZW8pIHsKaWYgKHNldHRpbmcucmV2aWV3KSBfc2VsZi5ncmVlbmxpZ3RoID0gRXh0LmVtcHR5Rm47CmNoZWNrUGxheWVyKF9zZWxmLnN1cHBvcnRINVZpZGVvKCkpOwp9IGVsc2UgaWYgKHVybCA9PSAnL3dvcmsvZG9Ib21lV29ya05ldycgfHwgdXJsID09ICcvYXBpL3dvcmsnIHx8IHVybCA9PSAnL3dvcmsvYWRkU3R1ZGVudFdvcmtOZXdXZWInfHwgdXJsID09ICcvbW9vYzIvd29yay9kb3dvcmsnKSB7CmNvbnNvbGUubG9nKCLov5vlhaXnrZTpopjnlYzpnaLvvIEiKTsKaWYgKCFVRSkgewogICAgdmFyIGxlbiA9ICgkIHx8IEV4dC5xdWVyeSB8fCBBcnJheSkoJ2ZvbnQ6Y29udGFpbnMo5pyq55m75b2VKScsIGRvY3VtZW50KS5sZW5ndGg7CiAgICBzZXRUaW1lb3V0KGxlbiA9PSAxID8gdG9wLmxvY2F0aW9uLnJlbG9hZCA6IHBhcmVudC5ncmVlbmxpZ3RoLCBzZXR0aW5nLnRpbWUpOwp9IGVsc2UgaWYgKHNldHRpbmcud29yaykgewogICAgc2V0VGltZW91dChyZWxpZXZlTGltaXQsIDApOwogICAgYmVmb3JlRmluZCgpOwp9Cn0gZWxzZSBpZiAodXJsID09ICcvYW5hbmFzL21vZHVsZXMvYXVkaW8vaW5kZXguaHRtbCcgJiYgc2V0dGluZy5hdWRpbykgewppZiAoc2V0dGluZy5yZXZpZXcpIF9zZWxmLmdyZWVubGlndGggPSBFeHQuZW1wdHlGbjsKX3NlbGYudmlkZW9qcyA9IGhvb2tBdWRpbzsKaG9va0F1ZGlvLnhociA9IHZqcy54aHI7Cn0gZWxzZSBpZiAodXJsID09ICcvYW5hbmFzL21vZHVsZXMvaW5uZXJib29rL2luZGV4Lmh0bWwnICYmIHNldHRpbmcuYm9vayAmJiBzZXR0aW5nLnRpcCkgewpzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIF9zZWxmLnNldHRpbmcgPyBfc2VsZi50b3Aub25jaGFuZ2VwYWdlKF9zZWxmLmdldEZyYW1lQXR0cignZW5kJykpIDogX3NlbGYuZ3JlZW5saWd0aCgpOwp9LCBzZXR0aW5nLnRpbWUpOwp9IGVsc2UgaWYgKHVybC5tYXRjaCgvXlwvYW5hbmFzXC9tb2R1bGVzXC8ocHB0fHBkZilcL2luZGV4XC5odG1sJC8pICYmIHNldHRpbmcuZG9jcyAmJiBzZXR0aW5nLnRpcCkgewpzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIF9zZWxmLnNldHRpbmcgPyBfc2VsZi5maW5pc2hKb2IoKSA6IF9zZWxmLmdyZWVubGlndGgoKTsKfSwgc2V0dGluZy50aW1lKTsKZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCAxKTsKfSBlbHNlIGlmICh1cmwgPT0gJy9rbm93bGVkZ2UvY2FyZHMnKSB7CiQgJiYgY2hlY2tUb05leHQoKTsKfSBlbHNlIGlmICh1cmwubWF0Y2goL15cLyhjb3Vyc2V8enQpXC9cZCtcLmh0bWwkLykpIHsKc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICArc2V0dGluZy5yZWFkICYmIF9zZWxmLnNlbmRMb2dzICYmICQoJy5jb3Vyc2Vfc2VjdGlvbjplcSgwKSAuY2hhcHRlclRleHQnKS5jbGljaygpOwp9LCBzZXR0aW5nLnRpbWUpOwp9IGVsc2UgaWYgKHVybCA9PSAnL3p0bm9kZWRldGFpbGNvbnRyb2xsZXIvdmlzaXRub2RlZGV0YWlsJykgewpzZXR0aW5nLnJlYWQgKj0gNjAgLyAkKCcuY291cnNlX3NlY3Rpb24nKS5sZW5ndGg7CnNldHRpbmcucmVhZCAmJiBfc2VsZi5zZW5kTG9ncyAmJiBhdXRvUmVhZCgpOwp9IGVsc2UgaWYgKHVybCA9PSAnL215Y291cnNlL3N0dWRlbnRjb3Vyc2UnKSB7CnZhciBndiA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvZD1cZCsmL2cpOwpzZXR0aW5nLnRvdGFsICYmICQoJzxhPicsIHsKICAgIGhyZWY6ICcvbW9vY0FuYWx5c2lzL2NoYXB0ZXJTdGF0aXN0aWNCeVVzZXI/Y2xhc3NJJyArIGd2WzFdICsgJ2NvdXJzZUknICsgZ3ZbMF0gKyAndXNlcklkPScgKyBfc2VsZi5nZXRDb29raWUoJ191aWQnKSArICcmdXQ9cycsCiAgICB0YXJnZXQ6ICdfYmxhbmsnLAogICAgdGl0bGU6ICfngrnlh7vmn6XnnIvnq6DoioLnu5/orqEnLAogICAgc3R5bGU6ICdtYXJnaW46IDAgMjVweDsnLAogICAgaHRtbDogJ+acrOivvueoi+WFsScgKyAkKCcuaWNvbicpLmxlbmd0aCArICfoioLvvIzliankvZknICsgJCgnZW06bm90KC5vcGVubG9jayknKS5sZW5ndGggKyAn6IqC5pyq5a6M5oiQJwp9KS5hcHBlbmRUbygnLnp0X2xvZ28nKS5wYXJlbnQoKS53aWR0aCgnYXV0bycpOwp9IGVsc2UgaWYgKHVybC5tYXRjaCgvXlwvdmlzaXRcLyhjb3Vyc2VzfGludGVyYWN0aW9uKSQvKSkgewpzZXR0aW5nLmZhY2UgJiYgJCgnLnptb2RlbCcpLm9uKCdjbGljaycsICdbb25jbGlja149b3BlbkZhY2VUaXBdJywgRGlzcGxheVVSTCk7Cn0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5tYXRjaCgvXnBhc3Nwb3J0Mi8pKSB7CnNldHRpbmcudXNlcm5hbWUgJiYgZ2V0U2Nob29sSWQoKTsKfSBlbHNlIGlmIChsb2NhdGlvbi5ob3N0bmFtZSA9PSAnaS5tb29jLmNoYW94aW5nLmNvbScpIHsKX3NlbGYubGF5dWkudXNlKCdsYXllcicsIGZ1bmN0aW9uICgpIHsKICAgIHRoaXMubGF5ZXIub3Blbih7IGNvbnRlbnQ6ICfmi5bliqjov5vluqbmnaHjgIHlgI3pgJ/mkq3mlL7jgIHnp5Lov4fkvJrlr7zoh7TkuI3oia/orrDlvZXvvIHpopjlupPlnKjmhaLmhaLooaXlhYXvvIzmkJzkuI3liLDnmoTpopjnm67ns7vnu5/kvJrlnKjmrKHml6Xov5vooYzoh6rliqjooaXlhYUnLCB0aXRsZTogJ011a2V0b29s6LaF5pif572R6K++5Yqp5omL5o+Q56S6JywgYnRuOiAn5oiR5bey55+l5oKJJywgb2Zmc2V0OiAndCcsIGNsb3NlQnRuOiAwIH0pOwp9KTsKfSBlbHNlIGlmICh1cmwgPT0gJy93aWRnZXQvcGN2b3RlL2dvU3R1ZGVudFZvdGVQYWdlJykgewokKCc6Y2hlY2tlZCcpLmNsaWNrKCk7CiQoJy5TdHVkZW50VGltdScpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7CiAgICB2YXIgYW5zID0gX3NlbGYucXVlc3Rpb25saXN0W2luZGV4XS5hbnN3ZXI7CiAgICAkKCc6cmFkaW8sIDpjaGVja2JveCcsIHRoaXMpLmVhY2goZnVuY3Rpb24gKG51bSkgewogICAgICAgIGFuc1tudW1dLmlzYW5zd2VyICYmIHRoaXMuY2xpY2soKTsKICAgIH0pOwogICAgJCgnOnRleHQnLCB0aGlzKS52YWwoZnVuY3Rpb24gKG51bSkgewogICAgICAgIHJldHVybiAkKGFuc1tudW1dLmNvbnRlbnQpLnRleHQoKS50cmltKCk7CiAgICB9KTsKfSk7Cn0gZWxzZSBpZiAodXJsID09ICcvd29yay9zZWxlY3RXb3JrUXVlc3Rpb25ZaVBpWXVlJykgewpzdWJtaXRBbnN3ZXIoZ2V0SWZyYW1lKCkucGFyZW50KCksICQuZXh0ZW5kKHRydWUsIFtdLCBwYXJlbnQuX2RhdGEpKTsKfQoKZnVuY3Rpb24gZ2V0SWZyYW1lKHRpcCwgd2luLCBqb2IpIHsKaWYgKCEkKSByZXR1cm4gRXh0LmdldChmcmFtZUVsZW1lbnQgfHwgW10pLnBhcmVudCgpLmNoaWxkKCcuYW5zLWpvYi1pY29uJykgfHwgRXh0LmdldChbXSk7CmRvIHsKICAgIHdpbiA9IHdpbiA/IHdpbi5wYXJlbnQgOiBfc2VsZjsKICAgIGpvYiA9ICQod2luLmZyYW1lRWxlbWVudCkucHJldkFsbCgnLmFucy1qb2ItaWNvbicpOwp9IHdoaWxlICgham9iLmxlbmd0aCAmJiB3aW4ucGFyZW50LmZyYW1lRWxlbWVudCk7CnJldHVybiB0aXAgPyB3aW4gOiBqb2I7Cn0KCmZ1bmN0aW9uIGpvYlNvcnQoJCkgewp2YXIgZm4gPSAkLmZuID8gW2dldElmcmFtZSgxKSwgJ2xlbmd0aCddIDogW3NlbGYsICdkb20nXSwKICAgIHNlbCA9IHNldHRpbmcuam9iLmpvaW4oJywgOm5vdCguYW5zLWpvYi1maW5pc2hlZCkgPiAuYW5zLWpvYi1pY29uJyArIHNldHRpbmcubm9ybWFsICsgJyB+ICcpOwppZiAoJChzZWwsIGZuWzBdLnBhcmVudC5kb2N1bWVudClbMF0gPT0gZm5bMF0uZnJhbWVFbGVtZW50KSByZXR1cm4gdHJ1ZTsKaWYgKCFnZXRJZnJhbWUoKVtmblsxXV0gfHwgZ2V0SWZyYW1lKCkucGFyZW50KCkuaXMoJy5hbnMtam9iLWZpbmlzaGVkJykpIHJldHVybiBudWxsOwpzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAkKHNlbCwgZm5bMF0ucGFyZW50LmRvY3VtZW50KVswXSA9PSBmblswXS5mcmFtZUVsZW1lbnQgJiYgZm5bMF0ubG9jYXRpb24ucmVsb2FkKCk7Cn0sIHNldHRpbmcudGltZSk7Cn0KCmZ1bmN0aW9uIGNoZWNrUGxheWVyKHRpcCkgewpfc2VsZi52aWRlb2pzID0gaG9va1ZpZGVvOwpob29rVmlkZW8ueGhyID0gdmpzLnhocjsKRXh0LmlzU29nb3UgPSBFeHQuaXNJb3MgPSBFeHQuaXNBbmRyb2lkID0gZmFsc2U7CnZhciBkYXRhID0gRXh0LmRlY29kZShfc2VsZi5jb25maWcoJ2RhdGEnKSkgfHwge307CmRlbGV0ZSBkYXRhLmRhbm1ha3U7CmRhdGEuZG91Ymxlc3BlZWQgPSAxOwpmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhJywgRXh0LmVuY29kZShkYXRhKSk7CmlmICh0aXApIHJldHVybjsKX3NlbGYuc3VwcG9ydEg1VmlkZW8gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9OwphbGVydCgn5q2k5rWP6KeI5Zmo5LiN5pSv5oyBaHRtbDXmkq3mlL7lmajvvIzor7fmm7TmjaLmtY/op4jlmagnKTsKfQoKZnVuY3Rpb24gaG9va1ZpZGVvKCkgewpfc2VsZi5hbGVydCA9IGNvbnNvbGUubG9nOwp2YXIgY29uZmlnID0gYXJndW1lbnRzWzFdLAogICAgbGluZSA9IEV4dC5BcnJheS5maWx0ZXIoRXh0LkFycmF5Lm1hcChjb25maWcucGxheWxpbmVzLCBmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLmxhYmVsID09IHNldHRpbmcubGluZSAmJiBpbmRleDsKICAgIH0pLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICByZXR1cm4gRXh0LmlzTnVtYmVyKHZhbHVlKTsKICAgIH0pWzBdIHx8IDAsCiAgICBodHRwID0gRXh0LkFycmF5LmZpbHRlcihjb25maWcuc291cmNlcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLmxhYmVsID09IHNldHRpbmcuaHR0cDsKICAgIH0pWzBdOwpjb25maWcucGxheWxpbmVzLnVuc2hpZnQoY29uZmlnLnBsYXlsaW5lc1tsaW5lXSk7CmNvbmZpZy5wbGF5bGluZXMuc3BsaWNlKGxpbmUgKyAxLCAxKTsKY29uZmlnLnBsdWdpbnMudmlkZW9Kc1Jlc29sdXRpb25Td2l0Y2hlci5kZWZhdWx0ID0gaHR0cCA/IGh0dHAucmVzIDogMzYwOwpjb25maWcucGx1Z2lucy5zdHVkeUNvbnRyb2wuZW5hYmxlU3dpdGNoV2luZG93ID0gMTsKY29uZmlnLnBsdWdpbnMudGltZWxpbmVPYmplY3RzLnVybCA9ICcvcmljaHZpZGVvL2luaXRkYXRhd2l0aHZpZXdlcj8nOwpjb25maWcucGx1Z2lucy5zZWVrQmFyQ29udHJvbC5lbmFibGVGYXN0Rm9yd2FyZCA9IDE7CmlmICghc2V0dGluZy5xdWV1ZSkgZGVsZXRlIGNvbmZpZy5wbHVnaW5zLnN0dWR5Q29udHJvbDsKLy8gY29uZmlnLnByZWxvYWQgPSBzZXR0aW5nLnRpcCA/ICdhdXRvJyA6ICdub25lJzsKdmFyIHBsYXllciA9IHZqcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgYSA9ICc8YSBocmVmPSJodHRwczovL2QwLmFuYW5hcy5jaGFveGluZy5jb20vZG93bmxvYWQvJyArIF9zZWxmLmNvbmZpZygnb2JqZWN0aWQnKSArICciIHRhcmdldD0iX2JsYW5rIj4nLAogICAgaW1nID0gJzxpbWcgc3JjPSJodHRwczovL2QwLmFuYW5hcy5jaGFveGluZy5jb20vZG93bmxvYWQvZTM2M2IyNTZjMGU5YmM1YmQ4MjY2YmY5OWRkNmQ2YmIiIHN0eWxlPSJtYXJnaW46IDZweCAwIDAgNnB4OyI+JzsKcGxheWVyLnZvbHVtZShNYXRoLnJvdW5kKHNldHRpbmcudm9sKSAvIDEwMCB8fCAwKTsKRXh0LmdldChwbGF5ZXIuY29udHJvbEJhci5hZGRDaGlsZCgnQnV0dG9uJykuZWxfKS5zZXRIVE1MKGEgKyBpbWcgKyAnPC9hPicpLmRvbS50aXRsZSA9ICfkuIvovb3op4bpopEnOwpwbGF5ZXIub24oJ2xvYWRzdGFydCcsIGZ1bmN0aW9uICgpIHsKICAgIHNldHRpbmcudGlwICYmIHRoaXMucGxheSgpLmNhdGNoKEV4dC5lbXB0eUZuKTsKICAgIHRoaXMucGxheWJhY2tSYXRlKHNldHRpbmcucmF0ZSA+IDE2IHx8IHNldHRpbmcucmF0ZSA8IDAuMDYyNSA/IDEgOiBzZXR0aW5nLnJhdGUpOwp9KTsKcGxheWVyLm9uZShbJ2xvYWRlZG1ldGFkYXRhJywgJ2ZpcnN0cGxheSddLCBmdW5jdGlvbiAoKSB7CiAgICBzZXR0aW5nLnR3byA9IHNldHRpbmcucmF0ZSA9PT0gJzAnICYmIHNldHRpbmcudHdvIDwgMTsKICAgIHNldHRpbmcudHdvICYmIGNvbmZpZy5wbHVnaW5zLnNlZWtCYXJDb250cm9sLnNlbmRMb2codGhpcy5jaGlsZHJlbl9bMF0sICdlbmRlZCcsIE1hdGguZmxvb3IodGhpcy5jYWNoZV8uZHVyYXRpb24pKTsKfSk7CnBsYXllci5vbignZW5kZWQnLCBmdW5jdGlvbiAoKSB7CiAgICBFeHQuZmx5KGZyYW1lRWxlbWVudCkucGFyZW50KCkuYWRkQ2xzKCdhbnMtam9iLWZpbmlzaGVkJyk7Cn0pOwpyZXR1cm4gcGxheWVyOwp9CgpmdW5jdGlvbiBob29rQXVkaW8oKSB7Cl9zZWxmLmFsZXJ0ID0gY29uc29sZS5sb2c7CnZhciBjb25maWcgPSBhcmd1bWVudHNbMV07CmNvbmZpZy5wbHVnaW5zLnN0dWR5Q29udHJvbC5lbmFibGVTd2l0Y2hXaW5kb3cgPSAxOwpjb25maWcucGx1Z2lucy5zZWVrQmFyQ29udHJvbC5lbmFibGVGYXN0Rm9yd2FyZCA9IDE7CmlmICghc2V0dGluZy5xdWV1ZSkgZGVsZXRlIGNvbmZpZy5wbHVnaW5zLnN0dWR5Q29udHJvbDsKdmFyIHBsYXllciA9IHZqcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgYSA9ICc8YSBocmVmPSJodHRwczovL2QwLmFuYW5hcy5jaGFveGluZy5jb20vZG93bmxvYWQvJyArIF9zZWxmLmNvbmZpZygnb2JqZWN0aWQnKSArICciIHRhcmdldD0iX2JsYW5rIj4nLAogICAgaW1nID0gJzxpbWcgc3JjPSJodHRwczovL2QwLmFuYW5hcy5jaGFveGluZy5jb20vZG93bmxvYWQvZTM2M2IyNTZjMGU5YmM1YmQ4MjY2YmY5OWRkNmQ2YmIiIHN0eWxlPSJtYXJnaW46IDZweCAwIDAgNnB4OyI+JzsKcGxheWVyLnZvbHVtZShNYXRoLnJvdW5kKHNldHRpbmcudm9sKSAvIDEwMCB8fCAwKTsKcGxheWVyLnBsYXliYWNrUmF0ZShzZXR0aW5nLnJhdGUgPiAxNiB8fCBzZXR0aW5nLnJhdGUgPCAwLjA2MjUgPyAxIDogc2V0dGluZy5yYXRlKTsKRXh0LmdldChwbGF5ZXIuY29udHJvbEJhci5hZGRDaGlsZCgnQnV0dG9uJykuZWxfKS5zZXRIVE1MKGEgKyBpbWcgKyAnPC9hPicpLmRvbS50aXRsZSA9ICfkuIvovb3pn7PpopEnOwpwbGF5ZXIub24oJ2xvYWRlZGRhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICBzZXR0aW5nLnRpcCAmJiB0aGlzLnBsYXkoKS5jYXRjaChFeHQuZW1wdHlGbik7Cn0pOwpwbGF5ZXIub25lKCdmaXJzdHBsYXknLCBmdW5jdGlvbiAoKSB7CiAgICBzZXR0aW5nLnJhdGUgPT09ICcwJyAmJiBjb25maWcucGx1Z2lucy5zZWVrQmFyQ29udHJvbC5zZW5kTG9nKHRoaXMuY2hpbGRyZW5fWzBdLCAnZW5kZWQnLCBNYXRoLmZsb29yKHRoaXMuY2FjaGVfLmR1cmF0aW9uKSk7Cn0pOwpwbGF5ZXIub24oJ2VuZGVkJywgZnVuY3Rpb24gKCkgewogICAgRXh0LmZseShmcmFtZUVsZW1lbnQpLnBhcmVudCgpLmFkZENscygnYW5zLWpvYi1maW5pc2hlZCcpOwp9KTsKcmV0dXJuIHBsYXllcjsKfQoKZnVuY3Rpb24gcmVsaWV2ZUxpbWl0KCkgewppZiAoc2V0dGluZy5zY2FsZSkgX3NlbGYuVUVESVRPUl9DT05GSUcuc2NhbGVFbmFibGVkID0gZmFsc2U7CiQuZWFjaChVRS5pbnN0YW50cywgZnVuY3Rpb24gKCkgewogICAgdmFyIGtleSA9IHRoaXMua2V5OwogICAgdGhpcy5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgVUUuZ2V0RWRpdG9yKGtleSk7CiAgICB9KTsKfSk7Cn0KCmZ1bmN0aW9uIGJlZm9yZUZpbmQoKSB7CnNldHRpbmcucmVnbCA9IHBhcmVudC5ncmVlbmxpZ3RoIHx8ICQubm9vcDsKaWYgKCQudHlwZShwYXJlbnQuX2RhdGEpID09ICdhcnJheScpIHJldHVybiBzZXR0aW5nLnJlZ2woKTsKdmFyIG1heGltaXplID0gJCgKICAgICc8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBkYXNoZWQgI0VENEM3ODsgcG9zaXRpb246IGZpeGVkOyB0b3A6IDA7IHJpZ2h0OiAwOyB6LWluZGV4OiA5OTk5OTsgYmFja2dyb3VuZC1jb2xvcjogIzAwQzlBNzsgb3ZlcmZsb3cteDogYXV0bztkaXNwbGF5Om5vbmU7Ij4mbmJzcDvilqMmbmJzcDs8L2Rpdj4nCikuYXBwZW5kVG8oJ2JvZHknKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAkKHNldHRpbmcuZGl2KS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgIEdNX3NldFZhbHVlKCJtaW5pbWl6ZSIsICIwIik7CiAgICAkKG1heGltaXplKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwp9KTsKCnNldHRpbmcuZGl2ID0gJCgKICAgICc8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBkYXNoZWQgIzM3N0RGRjsgd2lkdGg6IDMzMHB4OyBwb3NpdGlvbjogZml4ZWQ7IHRvcDogMDsgcmlnaHQ6IDA7IHotaW5kZXg6IDk5OTk5OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRUJGMkZGOyBvdmVyZmxvdy14OiBhdXRvOyI+JyArCiAgICAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogbWVkaXVtOyI+PC9zcGFuPicgKwogICAgJzxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogbWVkaXVtO3dpZHRoOjcwJTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij7mraPlnKjmkJzntKLnrZTmoYguLi48L2Rpdj4nICsKICAgICc8ZGl2IHN0eWxlPSJ3aWR0aDozMCU7ZGlzcGxheTogaW5saW5lLWJsb2NrO3BhZGRpbmctcmlnaHQ6IDEwcHg7Ym94LXNpemluZzogYm9yZGVyLWJveDt0ZXh0LWFsaWduOiByaWdodDsiPjxtaW5pbWl6ZSBzdHlsZT0id2lkdGg6MjBweDtmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDogMTJweDtmb250LXdlaWdodDogYm9sZDtjdXJzb3I6IGNvbnRleHQtbWVudTt1c2VyLXNlbGVjdDpub25lOyI+5LiAPC9taW5pbWl6ZT48L2Rpdj4nICsKCiAgICAnPGRpdiBzdHlsZT0iYm9yZGVyLXRvcDogMXB4IHNvbGlkICMwMDA7bWFyZ2luOiAycHg7b3ZlcmZsb3c6IGhpZGRlbjtmb250LXdlaWdodDo4MDA7Ij5NdWtlVG9vbCDotoXmmJ/nvZHor77liqnmiYsg5a6Y572R77yaaHR0cDovL211a2V0b29sLmNvbTwvZGl2PicgKwoKICAgICc8ZGl2IGlkPSJjeC1ub3RpY2UiIHN0eWxlPSJib3JkZXItdG9wOiAxcHggc29saWQgIzAwMDtib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDttYXJnaW46IDRweCAwcHg7b3ZlcmZsb3c6IGhpZGRlbjsiPicgKyBzZXR0aW5nLm5vdGljZSArICc8L2Rpdj4nICsKCgoKICAgICc8YnV0dG9uIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHg7Ij7mmoLlgZznrZTpopg8L2J1dHRvbj4nICsKICAgICc8YnV0dG9uIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHg7Ij4nICsgKHNldHRpbmcuYXV0byA/ICflj5bmtojmnKzmrKHoh6rliqjmj5DkuqQnIDogJ+W8gOWQr+acrOasoeiHquWKqOaPkOS6pCcpICsgJzwvYnV0dG9uPicgKwogICAgJzxidXR0b24gc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweDsiPumHjeaWsOafpeivojwvYnV0dG9uPicgKwogICAgJzxidXR0b24+5oqY5Y+g6Z2i5p2/PC9idXR0b24+PGJyPicgKwogICAgJzxpbnB1dCBpZD0iYXV0b3N1Ym1pdCIgdHlwZT0iY2hlY2tib3giJyArIChzZXR0aW5nLmF1dG8gPyAnIGNoZWNrZWQnIDogJycpICsgJz7oh6rliqjmj5DkuqQ8L2lucHV0PicgKwogICAgJzxkaXYgc3R5bGU9Im1heC1oZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyI+JyArCiAgICAnPHRhYmxlIGJvcmRlcj0iMSIgc3R5bGU9ImZvbnQtc2l6ZTogMTJweDsiPicgKwogICAgJzx0aGVhZD4nICsKICAgICc8dHI+JyArCiAgICAnPHRoIHN0eWxlPSJ3aWR0aDogMjVweDsgbWluLXdpZHRoOiAyNXB4OyI+6aKY5Y+3PC90aD4nICsKICAgICc8dGggc3R5bGU9IndpZHRoOiA2MCU7IG1pbi13aWR0aDogMTMwcHg7Ij7popjnm67vvIjngrnlh7vlj6/lpI3liLbvvIk8L3RoPicgKwogICAgJzx0aCBzdHlsZT0ibWluLXdpZHRoOiAxMzBweDsiPuetlOahiO+8iOeCueWHu+WPr+WkjeWItu+8iTwvdGg+JyArCiAgICAnPC90cj4nICsKICAgICc8L3RoZWFkPicgKwogICAgJzx0Zm9vdCBzdHlsZT0iZGlzcGxheTogbm9uZTsiPicgKwogICAgJzx0cj4nICsKICAgICc8dGggY29sc3Bhbj0iMyI+562U5qGI5o+Q56S65qGGIOW3suaKmOWPoDwvdGg+JyArCiAgICAnPC90cj4nICsKICAgICc8L3Rmb290PicgKwogICAgJzx0Ym9keT4nICsKICAgICc8dHI+JyArCiAgICAnPHRkIGNvbHNwYW49IjMiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+PC90ZD4nICsKICAgICc8L3RyPicgKwogICAgJzwvdGJvZHk+JyArCiAgICAnPC90YWJsZT4nICsKICAgICc8L2Rpdj4nICsKICAgICc8L2Rpdj4nCikuYXBwZW5kVG8oJ2JvZHknKS5vbignY2xpY2snLCAnYnV0dG9uLCB0ZCwgaW5wdXQnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbGVuID0gJCh0aGlzKS5wcmV2QWxsKCdidXR0b24nKS5sZW5ndGg7CiAgICBpZiAodGhpcy5ub2RlTmFtZSA9PSAnVEQnKSB7CiAgICAgICAgJCh0aGlzKS5wcmV2KCkubGVuZ3RoICYmIEdNX3NldENsaXBib2FyZCgkKHRoaXMpLnRleHQoKSk7CiAgICB9IGVsc2UgaWYgKCEkKHRoaXMpLnNpYmxpbmdzKCkubGVuZ3RoKSB7CiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS50ZXh0KCfmraPlnKjmkJzntKLnrZTmoYguLi4nKTsKICAgICAgICBzZXR0aW5nLm51bSsrOwogICAgfSBlbHNlIGlmIChsZW4gPT09IDApIHsKICAgICAgICBpZiAoc2V0dGluZy5sb29wKSB7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2V0dGluZy5sb29wKTsKICAgICAgICAgICAgZGVsZXRlIHNldHRpbmcubG9vcDsKICAgICAgICAgICAgbGVuID0gWyflt7LmmoLlgZzmkJzntKInLCAn57un57ut562U6aKYJ107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0dGluZy5sb29wID0gc2V0SW50ZXJ2YWwoZmluZEFuc3dlciwgc2V0dGluZy50aW1lKTsKICAgICAgICAgICAgbGVuID0gWyfmraPlnKjmkJzntKLnrZTmoYguLi4nLCAn5pqC5YGc562U6aKYJ107CiAgICAgICAgfQogICAgICAgIHNldHRpbmcuZGl2LmNoaWxkcmVuKCdkaXY6ZXEoMCknKS5odG1sKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICQodGhpcykuZGF0YSgnaHRtbCcpIHx8IGxlblswXTsKICAgICAgICB9KS5yZW1vdmVEYXRhKCdodG1sJyk7CiAgICAgICAgJCh0aGlzKS5odG1sKGxlblsxXSk7CiAgICB9IGVsc2UgaWYgKGxlbiA9PSAxKSB7CiAgICAgICAgc2V0dGluZy5hdXRvID0gIXNldHRpbmcuYXV0bzsKICAgICAgICAkKHRoaXMpLmh0bWwoc2V0dGluZy5hdXRvID8gJ+WPlua2iOacrOasoeiHquWKqOaPkOS6pCcgOiAn5byA5ZCv5pys5qyh6Ieq5Yqo5o+Q5LqkJyk7CiAgICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7CiAgICAgICAgcGFyZW50LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfSBlbHNlIGlmIChsZW4gPT0gMykgewogICAgICAgIHNldHRpbmcuZGl2LmZpbmQoJ3Rib2R5LCB0Zm9vdCcpLnRvZ2dsZSgpOwogICAgfSBlbHNlIGlmICh0aGlzLmlkID09ICJhdXRvc3VibWl0IikgewogICAgICAgIC8vIOmimOebruiHquWKqOaPkOS6pOmFjee9rgogICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2hlY2tlZCk7CiAgICAgICAgR01fc2V0VmFsdWUoImF1dG9zdWJtaXQiLCB0aGlzLmNoZWNrZWQpOwogICAgfQp9KS5vbignY2xpY2snLCAnbWluaW1pemUnLCBmdW5jdGlvbiAoKSB7CiAgICAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICBHTV9zZXRWYWx1ZSgibWluaW1pemUiLCAiMSIpOwogICAgJChtYXhpbWl6ZSkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7Cn0pLmZpbmQoJ3RhYmxlLCB0ZCwgdGgnKS5jc3MoJ2JvcmRlcicsICcxcHggc29saWQnKS5lbmQoKTsKCmlmIChHTV9nZXRWYWx1ZSgibWluaW1pemUiKSA9PSAiMSIpIHsKICAgICQoc2V0dGluZy5kaXYpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAkKG1heGltaXplKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKfQoKc2V0dGluZy5sb3NlID0gc2V0dGluZy5udW0gPSAwOwpzZXR0aW5nLmRhdGEgPSBwYXJlbnQuX2RhdGEgPSBbXTsKc2V0dGluZy5vdmVyID0gJzxidXR0b24gc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweDsiPui3s+i/h+atpOmimDwvYnV0dG9uPic7CnNldHRpbmcuY3VycyA9ICQoJ3NjcmlwdDpjb250YWlucyhjb3Vyc2VOYW1lKScsIHRvcC5kb2N1bWVudCkudGV4dCgpLm1hdGNoKC9jb3Vyc2VOYW1lOlwnKC4rPylcJ3wkLylbMV0gfHwgJCgnaDEnKS50ZXh0KCkudHJpbSgpIHx8ICfml6AnOwpzZXR0aW5nLmxvb3AgPSBzZXRJbnRlcnZhbChmaW5kQW5zd2VyLCBzZXR0aW5nLnRpbWUpOwp2YXIgdGlwID0gKHsgdW5kZWZpbmVkOiAn5Lu75Yqh54K55o6S6Zif5LitJywgbnVsbDogJ+etieW+heWIh+aNouS4rScgfSlbc2V0dGluZy50aXBdOwp0aXAgJiYgc2V0dGluZy5kaXYuY2hpbGRyZW4oJ2RpdjplcSgwKScpLmRhdGEoJ2h0bWwnLCB0aXApLnNpYmxpbmdzKCdidXR0b246ZXEoMCknKS5jbGljaygpOwoKR01feG1saHR0cFJlcXVlc3QoewogICAgbWV0aG9kOiAnR0VUJywKICAgIHVybDogc2V0dGluZy50aWt1ICsgJ25vdGljZT9zY3JpcHQ9JyArIHNldHRpbmcudHlwZSArICcmdmVyc2lvbj0nICsgc2V0dGluZy52ZXJzaW9uLAogICAgdGltZW91dDogc2V0dGluZy50aW1lLAogICAgb25sb2FkOiBmdW5jdGlvbiAoeGhyKSB7CiAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgIHZhciBvYmogPSAkLnBhcnNlSlNPTih4aHIucmVzcG9uc2VUZXh0KSB8fCB7fTsKICAgICAgICAgICAgc2V0dGluZy5ub3RpY2UgPSBvYmouaW5qZWN0aW9uOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY3gtbm90aWNlJykuaW5uZXJIVE1MID0gc2V0dGluZy5ub3RpY2U7CiAgICAgICAgfQogICAgfSwKICAgIG9udGltZW91dDogZnVuY3Rpb24gKCkgewogICAgICAgIHNldHRpbmcubG9vcCAmJiBzZXR0aW5nLmRpdi5jaGlsZHJlbignZGl2OmVxKDApJykuaHRtbChzZXR0aW5nLm92ZXIgKyAn5pyN5Yqh5Zmo6LaF5pe277yM5q2j5Zyo6YeN6K+VLi4uJyk7CiAgICB9Cn0pOwp9CgpmdW5jdGlvbiBmaW5kQW5zd2VyKCkgewppZiAoc2V0dGluZy5udW0gPj0gJCgnLlRpTXUnKS5sZW5ndGgpIHsKICAgIHZhciBhcnIgPSBzZXR0aW5nLmxvc2UgPyBbJ+aciSA8Zm9udCBjb2xvcj0icmVkIj4nICsgc2V0dGluZy5sb3NlICsgJzwvZm9udD4g6YGT6aKY55uu5Yy56YWN5Yiw55qE562U5qGI5Y+v6IO95LiN5YeG56Gu77yI5bey57qi6Imy6auY5Lqu5o+Q56S677yJJywgc2F2ZVRoaXNdIDogWyfnrZTpopjlt7LlrozmiJAnLCBzdWJtaXRUaGlzXTsKICAgIHNldHRpbmcuZGl2LmNoaWxkcmVuKCdkaXY6ZXEoMCknKS5kYXRhKCdodG1sJywgYXJyWzBdKS5zaWJsaW5ncygnYnV0dG9uOmVxKDApJykuaGlkZSgpLmNsaWNrKCk7CiAgICByZXR1cm4gc2V0VGltZW91dChhcnJbMV0sIHNldHRpbmcudGltZSk7Cn0KdmFyICRUaU11ID0gJCgnLlRpTXUnKS5lcShzZXR0aW5nLm51bSksCiAgICBxdWVzdGlvbiA9IGZpbHRlckltZygkVGlNdS5maW5kKCcuWnlfVEl0bGU6ZXEoMCkgLmNsZWFyZml4JykpLnJlcGxhY2UoL17jgJAuKj/jgJFccyovLCAnJykucmVwbGFjZSgvXHMq77yIXGQrXC5cZCvliIbvvIkkLywgJycpLnJlcGxhY2UoL1soXVxzKlspXeOAgiQvLCAnJykucmVwbGFjZSgv77yIXHMq77yJ44CCJC8sICcnKS5yZXBsYWNlKC9bKF1ccypbKV0kLywgJycpLnJlcGxhY2UoL++8iFxzKu+8iSQvLCAnJykucmVwbGFjZSgv44CCJC8sICcnKSwKICAgIHR5cGUgPSAkVGlNdS5maW5kKCdpbnB1dFtuYW1lXj1hbnN3ZXJ0eXBlXTplcSgwKScpLnZhbCgpIHx8ICctMSc7Cgpjb25zb2xlLmxvZygkVGlNdSk7CgppZihxdWVzdGlvbiA9PSAiIil7CiAgICBxdWVzdGlvbiA9IGZpbHRlckltZygkVGlNdS5maW5kKCcubWFya19uYW1lOmVxKDApIC5jb2xvckRlZXAnKSk7Cn0KY29uc29sZS5sb2coJFRpTXUuZmluZCgnLm1hcmtfbmFtZTplcSgwKSAuY29sb3JEZWVwJykpOwoKR01feG1saHR0cFJlcXVlc3QoewogICAgbWV0aG9kOiAnUE9TVCcsCiAgICB1cmw6IHNldHRpbmcudGlrdSArICd2MS9jeCcsCiAgICBoZWFkZXJzOiB7CiAgICAgICAgJ0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLAogICAgfSwKICAgIGRhdGE6ICdxdWVzdGlvbj0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXN0aW9uKSArICcmdHlwZT0nICsgdHlwZSArICcmaWQ9JyArICgkKCcjd29ya0xpYnJhcnlJZCcpLnZhbCgpIHx8ICQoJyNvbGRXb3JrSWQnKS52YWwoKSksCiAgICB0aW1lb3V0OiBzZXR0aW5nLnRpbWUsCiAgICBvbmxvYWQ6IGZ1bmN0aW9uICh4aHIpIHsKICAgICAgICBpZiAoIXNldHRpbmcubG9vcCkgewogICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgdmFyIG9iaiA9ICQucGFyc2VKU09OKHhoci5yZXNwb25zZVRleHQpIHx8IHt9OwogICAgICAgICAgICBvYmouYW5zd2VyID0gb2JqLmRhdGE7CiAgICAgICAgICAgIGlmIChvYmouY29kZSkgewogICAgICAgICAgICAgICAgc2V0dGluZy5kaXYuY2hpbGRyZW4oJ2RpdjplcSgwKScpLnRleHQoJ+ato+WcqOaQnOe0ouetlOahiC4uLicpOwogICAgICAgICAgICAgICAgdmFyIHRkID0gJzx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQ7JywKICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBTdHJpbmcob2JqLmFuc3dlcikucmVwbGFjZSgvJi9nLCAnJicpLnJlcGxhY2UoLzwoPyFpbWcpL2csICc8Jyk7CiAgICAgICAgICAgICAgICBvYmouYW5zd2VyID0gL15odHRwLy50ZXN0KGFuc3dlcikgPyAnPGltZyBzcmM9IicgKyBvYmouYW5zd2VyICsgJyI+JyA6IG9iai5hbnN3ZXI7CiAgICAgICAgICAgICAgICAkKAogICAgICAgICAgICAgICAgICAgICc8dHI+JyArCiAgICAgICAgICAgICAgICAgICAgdGQgKyAnIHRleHQtYWxpZ246IGNlbnRlcjsiPicgKyAkVGlNdS5maW5kKCcuWnlfVEl0bGU6ZXEoMCkgaScpLnRleHQoKS50cmltKCkgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICB0ZCArICciIHRpdGxlPSLngrnlh7vlj6/lpI3liLYiPicgKyAocXVlc3Rpb24ubWF0Y2goJzxpbWcnKSA/IHF1ZXN0aW9uIDogcXVlc3Rpb24ucmVwbGFjZSgvJi9nLCAnJicpLnJlcGxhY2UoLzwvZywgJzwnKSkgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICB0ZCArICciIHRpdGxlPSLngrnlh7vlj6/lpI3liLYiPicgKyAoL15odHRwLy50ZXN0KGFuc3dlcikgPyBvYmouYW5zd2VyIDogJycpICsgYW5zd2VyICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvdHI+JwogICAgICAgICAgICAgICAgKS5hcHBlbmRUbyhzZXR0aW5nLmRpdi5maW5kKCd0Ym9keScpKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBmaWxsQW5zd2VyKCRUaU11LmZpbmQoJ3VsOmVxKDApJykuZmluZCgnbGknKSwgb2JqLCB0eXBlKSA/ICcnIDogJyNFRDRDNzgnKTsKICAgICAgICAgICAgICAgIHNldHRpbmcuZGF0YVtzZXR0aW5nLm51bSsrXSA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiBvYmouY29kZSA+IDAgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbjogcXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uOiBvYmouYW5zd2VyLAogICAgICAgICAgICAgICAgICAgIHR5cGU6IE51bWJlcih0eXBlKQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldHRpbmcuZGl2LmNoaWxkcmVuKCdkaXY6ZXEoMCknKS5odG1sKG9iai5hbnN3ZXIgfHwgc2V0dGluZy5vdmVyICsgJ+acjeWKoeWZqOe5geW/me+8jOato+WcqOmHjeivlS4uLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldHRpbmcuZGl2LmNoaWxkcmVuKCdzcGFuJykuaHRtbChvYmoubXNnIHx8ICcnKTsKICAgICAgICB9IGVsc2UgaWYgKHhoci5zdGF0dXMgPT0gNDAzKSB7CiAgICAgICAgICAgIHZhciBodG1sID0geGhyLnJlc3BvbnNlVGV4dC5pbmRleE9mKCd7JykgPyAn6K+35rGC6L+H5LqO6aKR57mB77yM6K+356iN5ZCO5YaN6K+VJyA6ICQucGFyc2VKU09OKHhoci5yZXNwb25zZVRleHQpLmRhdGE7CiAgICAgICAgICAgIHNldHRpbmcuZGl2LmNoaWxkcmVuKCdkaXY6ZXEoMCknKS5kYXRhKCdodG1sJywgaHRtbCkuc2libGluZ3MoJ2J1dHRvbjplcSgwKScpLmNsaWNrKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0dGluZy5kaXYuY2hpbGRyZW4oJ2RpdjplcSgwKScpLmh0bWwoJ+mimOW6k+W8guW4uCzlj6/og73ooqvmgbbmhI/mlLvlh7vkuoYuLi7or7fnrYnlvoXmgaLlpI0nKTsKICAgICAgICB9CiAgICB9LAogICAgb250aW1lb3V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2V0dGluZy5sb29wICYmIHNldHRpbmcuZGl2LmNoaWxkcmVuKCdkaXY6ZXEoMCknKS5odG1sKHNldHRpbmcub3ZlciArICfmnI3liqHlmajotoXml7bvvIzmraPlnKjph43or5UuLi4nKTsKICAgIH0KfSk7Cn0KCmZ1bmN0aW9uIGZpbGxBbnN3ZXIoJGxpLCBvYmosIHR5cGUpIHsKdmFyICRpbnB1dCA9ICRsaS5maW5kKCc6cmFkaW8sIDpjaGVja2JveCcpLAogICAgc3RyID0gU3RyaW5nKG9iai5hbnN3ZXIpLnRvQ0RCKCkgfHwgbmV3IERhdGUoKS50b1N0cmluZygpLAogICAgZGF0YSA9IHN0ci5zcGxpdCgvI3xceDAxfFx8LyksCiAgICBvcHQgPSBvYmoub3B0IHx8IHN0ciwKICAgIHN0YXRlID0gc2V0dGluZy5sb3NlOwovLyAkbGkuZmluZCgnOnJhZGlvOmNoZWNrZWQnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwpvYmouY29kZSA+IDAgJiYgJGlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4KSB7CiAgICBpZiAodGhpcy52YWx1ZSA9PSAndHJ1ZScpIHsKICAgICAgICBkYXRhLmpvaW4oKS5tYXRjaCgvKF58LCko5q2j56GufOaYr3zlr7l84oiafFR8cmkpKCx8JCkvKSAmJiB0aGlzLmNsaWNrKCk7CiAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUgPT0gJ2ZhbHNlJykgewogICAgICAgIGRhdGEuam9pbigpLm1hdGNoKC8oXnwsKSjplJnor6985ZCmfOmUmXzDl3xGfHdyKSgsfCQpLykgJiYgdGhpcy5jbGljaygpOwogICAgfSBlbHNlIHsKICAgICAgICB2YXIgdGlwID0gZmlsdGVySW1nKCRsaS5lcShpbmRleCkuZmluZCgnLmFmdGVyJykpLnRvQ0RCKCkgfHwgbmV3IERhdGUoKS50b1N0cmluZygpOwogICAgICAgIEJvb2xlYW4oJC5pbkFycmF5KHRpcCwgZGF0YSkgKyAxIHx8ICh0eXBlID09ICcxJyAmJiBzdHIuaW5kZXhPZih0aXApICsgMSkpID09IHRoaXMuY2hlY2tlZCB8fCB0aGlzLmNsaWNrKCk7CiAgICB9Cn0pLmVhY2goZnVuY3Rpb24gKCkgewogICAgaWYgKCEvXkE/Qj9DP0Q/RT9GP0c/JC8udGVzdChvcHQpKSByZXR1cm4gZmFsc2U7CiAgICBCb29sZWFuKG9wdC5tYXRjaCh0aGlzLnZhbHVlKSkgPT0gdGhpcy5jaGVja2VkIHx8IHRoaXMuY2xpY2soKTsKfSk7CmlmICh0eXBlLm1hdGNoKC9eWzAxM10kLykpIHsKICAgICRpbnB1dC5pcygnOmNoZWNrZWQnKSB8fCAoc2V0dGluZy5ub25lID8gKCRpbnB1dFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAkaW5wdXQubGVuZ3RoKV0gfHwgJCgpKS5jbGljaygpIDogc2V0dGluZy5sb3NlKyspOwp9IGVsc2UgaWYgKHR5cGUubWF0Y2goL14oMnxbNC05XXwxWzA4XSkkLykpIHsKICAgIGRhdGEgPSBTdHJpbmcob2JqLmFuc3dlcikuc3BsaXQoLyN8XHgwMXxcfC8pOwogICAgc3RyID0gJGxpLmVuZCgpLmZpbmQoJ3RleHRhcmVhJykuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICBpbmRleCA9IChvYmouY29kZSA+IDAgJiYgZGF0YVtpbmRleF0pIHx8ICcnOwogICAgICAgIGlmIChvYmouY29kZSA+IDApIHsKICAgICAgICAgICAgVUUuZ2V0RWRpdG9yKHRoaXMubmFtZSkuc2V0Q29udGVudChpbmRleC50cmltKCkpOwogICAgICAgIH0KICAgIH0pLmxlbmd0aDsKICAgIChvYmouY29kZSA+IDAgJiYgZGF0YS5sZW5ndGggPT0gc3RyKSB8fCBzZXR0aW5nLm5vbmUgfHwgc2V0dGluZy5sb3NlKys7Cn0gZWxzZSB7CiAgICBzZXR0aW5nLm5vbmUgfHwgc2V0dGluZy5sb3NlKys7Cn0KcmV0dXJuIHN0YXRlID09IHNldHRpbmcubG9zZTsKfQoKZnVuY3Rpb24gc2F2ZVRoaXMoKSB7CmlmICghc2V0dGluZy5hdXRvKSByZXR1cm4gc2V0VGltZW91dChzYXZlVGhpcywgc2V0dGluZy50aW1lKTsKc2V0dGluZy5kaXYuY2hpbGRyZW4oJ2J1dHRvbjpsdCgzKScpLmhpZGUoKS5lcSgxKS5jbGljaygpOwpfc2VsZi5hbGVydCA9IGNvbnNvbGUubG9nOwokKCcjdGVtcHNhdmUnKS5jbGljaygpOwpzZXR0aW5nLnJlZ2woKTsKfQoKZnVuY3Rpb24gc3VibWl0VGhpcygpIHsKaWYgKCFzZXR0aW5nLmF1dG8pIHsKfSBlbHNlIGlmICghJCgnLkJ0bl9ibHVlXzE6dmlzaWJsZScpLmxlbmd0aCkgewogICAgc2V0dGluZy5kaXYuY2hpbGRyZW4oJ2J1dHRvbjpsdCgzKScpLmhpZGUoKS5lcSgxKS5jbGljaygpOwogICAgcmV0dXJuIHNldHRpbmcucmVnbCgpOwp9IGVsc2UgaWYgKCQoJyNjb25maXJtU3ViV2luOnZpc2libGUnKS5sZW5ndGgpIHsKICAgIHZhciBidG4gPSAkKCcjdGlwQ29udGVudCArICogPiBhJykub2Zmc2V0KCkgfHwgeyB0b3A6IDAsIGxlZnQ6IDAgfSwKICAgICAgICBtb3VzZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpOwogICAgYnRuID0gW2J0bi5sZWZ0ICsgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiA0NiksIGJ0bi50b3AgKyBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDI2KV07CiAgICBtb3VzZS5pbml0TW91c2VFdmVudCgnY2xpY2snLCB0cnVlLCB0cnVlLCBkb2N1bWVudC5kZWZhdWx0VmlldywgMCwgMCwgMCwgYnRuWzBdLCBidG5bMV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKTsKICAgIF9zZWxmLmV2ZW50ID0gJC5leHRlbmQodHJ1ZSwge30sIG1vdXNlKTsKICAgIGRlbGV0ZSBfc2VsZi5ldmVudC5pc1RydXN0ZWQ7CiAgICBfc2VsZi5mb3JtMXN1Ym1pdCgpOwp9IGVsc2UgewogICAgJCgnLkJ0bl9ibHVlXzEnKVswXS5jbGljaygpOwp9CnNldFRpbWVvdXQoc3VibWl0VGhpcywgTWF0aC5jZWlsKHNldHRpbmcudGltZSAqIE1hdGgucmFuZG9tKCkpICogMik7Cn0KCmZ1bmN0aW9uIGNoZWNrVG9OZXh0KCkgewp2YXIgJHRpcCA9ICQoc2V0dGluZy5qb2Iuam9pbignLCAnKSwgZG9jdW1lbnQpLnByZXZBbGwoJy5hbnMtam9iLWljb24nICsgc2V0dGluZy5ub3JtYWwpOwpzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAkdGlwLnBhcmVudCgnOm5vdCguYW5zLWpvYi1maW5pc2hlZCknKS5sZW5ndGggfHwgc2V0dGluZy5qdW1wICYmIHRvTmV4dCgpOwp9LCBzZXR0aW5nLnRpbWUpOwp9CgpmdW5jdGlvbiB0b05leHQoKSB7CnZhciAkY3VyID0gJCgnI2N1cicgKyAkKCcjY2hhcHRlcklkaWQnKS52YWwoKSksCiAgICAkdGlwID0gJCgnc3Bhbi5jdXJyZW50cyB+IHNwYW4nKSwKICAgIHNlbCA9IHNldHRpbmcucmV2aWV3ID8gJ2h0bWwnIDogJy5ibHVlJzsKaWYgKCEkY3VyLmhhcyhzZWwpLmxlbmd0aCAmJiAkdGlwLmxlbmd0aCkgcmV0dXJuICR0aXAuZXEoMCkuY2xpY2soKTsKJHRpcCA9ICQoJy5yb3VuZHBvaW50U3R1ZGVudCwgLnJvdW5kcG9pbnQnKS5wYXJlbnQoKTsKJHRpcCA9ICR0aXAuc2xpY2UoJHRpcC5pbmRleCgkY3VyKSArIDEpLm5vdCgnOmhhcygnICsgc2VsICsgJyknKTsKJHRpcC5ub3Qoc2V0dGluZy5sb2NrID8gJzpoYXMoLmxvY2spJyA6ICdodG1sJykuZmluZCgnc3BhbicpLmVxKDApLmNsaWNrKCk7CiR0aXAubGVuZ3RoIHx8IHNldHRpbmcuY291cnNlICYmIHN3aXRjaENvdXJzZSgpOwp9CgpmdW5jdGlvbiBzd2l0Y2hDb3Vyc2UoKSB7CkdNX3htbGh0dHBSZXF1ZXN0KHsKICAgIG1ldGhvZDogJ0dFVCcsCiAgICB1cmw6ICcvdmlzaXQvY291cnNlcy9zdHVkeT9pc0FqYXg9dHJ1ZSZmaWxlSWQ9MCZkZWJ1Zz0nLAogICAgaGVhZGVyczogewogICAgICAgICdSZWZlcmVyJzogbG9jYXRpb24ub3JpZ2luICsgJy92aXNpdC9jb3Vyc2VzJywKICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcKICAgIH0sCiAgICBvbmxvYWQ6IGZ1bmN0aW9uICh4aHIpIHsKICAgICAgICB2YXIgbGlzdCA9ICQoJ2gzIGFbdGFyZ2V0XScsIHhoci5yZXNwb25zZVRleHQpLm1hcChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJCh0aGlzKS5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBpbmRleCA9IGxpc3QubWFwKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2godG9wLmNvdXJzZUlkKSAmJiBpbmRleDsKICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkLmlzTnVtZXJpYyh0aGlzKTsKICAgICAgICAgICAgfSlbMF0gKyAxIHx8IDA7CiAgICAgICAgc2V0dGluZy5jb3Vyc2UgPSBsaXN0W2luZGV4XSA/IGdvQ291cnNlKGxpc3RbaW5kZXhdKSA6IDA7CiAgICB9Cn0pOwp9CgpmdW5jdGlvbiBnb0NvdXJzZSh1cmwpIHsKR01feG1saHR0cFJlcXVlc3QoewogICAgbWV0aG9kOiAnR0VUJywKICAgIHVybDogdXJsLAogICAgb25sb2FkOiBmdW5jdGlvbiAoeGhyKSB7CiAgICAgICAgJC5nbG9iYWxFdmFsKCdsb2NhdGlvbi5ocmVmID0gIicgKyAkKCcuYXJ0aWNsZW5hbWUgYVtocmVmXScsIHhoci5yZXNwb25zZVRleHQpLmF0dHIoJ2hyZWYnKSArICciOycpOwogICAgfQp9KTsKfQoKZnVuY3Rpb24gYXV0b1JlYWQoKSB7CiQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHsKICAgIHNjcm9sbFRvcDogJChkb2N1bWVudCkuaGVpZ2h0KCkgLSAkKHdpbmRvdykuaGVpZ2h0KCkKfSwgTWF0aC5yb3VuZChzZXR0aW5nLnJlYWQpICogMUUzLCBmdW5jdGlvbiAoKSB7CiAgICAkKCcubm9kZUl0ZW0uciBpJykuY2xpY2soKTsKfSkub25lKCdjbGljaycsICcjdG9wJywgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAkKGV2ZW50LmRlbGVnYXRlVGFyZ2V0KS5zdG9wKCk7Cn0pOwp9CgpmdW5jdGlvbiBEaXNwbGF5VVJMKCkgewpfc2VsZi5XQVkuYm94LmhpZGUoKTsKdmFyICRsaSA9ICQodGhpcykuY2xvc2VzdCgnbGknKTsKJC5nZXQoJy92aXNpdC9nb1RvQ291cnNlQnlGYWNlJywgewogICAgY291cnNlSWQ6ICRsaS5maW5kKCdpbnB1dFtuYW1lPWNvdXJzZUlkXScpLnZhbCgpLAogICAgY2xhenpJZDogJGxpLmZpbmQoJ2lucHV0W25hbWU9Y2xhc3NJZF0nKS52YWwoKQp9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgJGxpLmZpbmQoJ1tvbmNsaWNrXj1vcGVuRmFjZVRpcF0nKS5yZW1vdmVBdHRyKCdvbmNsaWNrJykuYXR0cih7CiAgICAgICAgdGFyZ2V0OiAnX2JsYW5rJywKICAgICAgICBocmVmOiAkKGRhdGEpLmZpbHRlcignc2NyaXB0Omxhc3QnKS50ZXh0KCkubWF0Y2goL25cKCIoLis/KSIvKVsxXQogICAgfSk7CiAgICBhbGVydCgn5pys6K++56iL5bey5Li05pe26Kej6Zmk6Z2i6YOo6K+G5YirJyk7Cn0sICdodG1sJyk7Cn0KCmZ1bmN0aW9uIGdldFNjaG9vbElkKCkgewp2YXIgc2Nob29sID0gL14xXGR7MTB9JC8udGVzdChzZXR0aW5nLnVzZXJuYW1lKSA/ICcnIDogc2V0dGluZy5zY2hvb2w7CmlmICghaXNOYU4oc2Nob29sKSkgcmV0dXJuIHNldFRpbWVvdXQodG9Mb2dpbiwgc2V0dGluZy50aW1lLCBzY2hvb2wpOwppZiAoc2Nob29sID09ICfotKblj7fkuLrmiYvmnLrlj7flj6/ku6XkuI3kv67mlLnmraTlj4LmlbAnKSByZXR1cm4gYWxlcnQoJ+ivt+S/ruaUuXNjaG9vbOWPguaVsCcpOwokLmdldEpTT04oJy9vcmcvc2VhcmNoVW5pcz9maWx0ZXI9JyArIGVuY29kZVVSSShzY2hvb2wpICsgJyZwcm9kdWN0PTQ0JywgZnVuY3Rpb24gKGRhdGEpIHsKICAgIGlmICghZGF0YS5yZXN1bHQpIHJldHVybiBhbGVydCgn5a2m5qCh5p+l6K+i6ZSZ6K+vJyk7CiAgICB2YXIgbXNnID0gJC5ncmVwKGRhdGEuZnJvbXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZS5uYW1lID09IHNjaG9vbDsKICAgIH0pWzBdOwogICAgbXNnID8gc2V0VGltZW91dCh0b0xvZ2luLCBzZXR0aW5nLnRpbWUsIG1zZy5zY2hvb2xpZCkgOiBhbGVydCgn5a2m5qCh5ZCN56ew5LiN5a6M5pW0Jyk7Cn0pOwp9CgpmdW5jdGlvbiB0b0xvZ2luKGZpZCkgewpHTV94bWxodHRwUmVxdWVzdCh7CiAgICBtZXRob2Q6ICdHRVQnLAogICAgdXJsOiAnL2FwaS9sb2dpbj9uYW1lPScgKyBzZXR0aW5nLnVzZXJuYW1lICsgJyZwd2Q9JyArIHNldHRpbmcucGFzc3dvcmQgKyAnJnNjaG9vbGlkPScgKyBmaWQgKyAnJnZlcmlmeT0wJywKICAgIG9ubG9hZDogZnVuY3Rpb24gKHhocikgewogICAgICAgIHZhciBvYmogPSAkLnBhcnNlSlNPTih4aHIucmVzcG9uc2VUZXh0KSB8fCB7fTsKICAgICAgICBvYmoucmVzdWx0ID8gbG9jYXRpb24uaHJlZiA9IGRlY29kZVVSSUNvbXBvbmVudCgkKCcjcmVmLCAjcmVmZXJfMHgwMDEnKS52YWwoKSkgOiBhbGVydChvYmouZXJyb3JNc2cgfHwgJ0Vycm9yJyk7CiAgICB9Cn0pOwp9CgpmdW5jdGlvbiBzdWJtaXRBbnN3ZXIoJGpvYiwgZGF0YSkgewokam9iLnJlbW92ZUNsYXNzKCdhbnMtam9iLWZpbmlzaGVkJyk7CmRhdGEgPSBkYXRhLmxlbmd0aCA/ICQoZGF0YSkgOiAkKCcuVGlNdScpLm1hcChmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGl0bGUgPSBmaWx0ZXJJbWcoJCgnLlp5X1RJdGxlIC5jbGVhcmZpeCcsIHRoaXMpKTsKICAgIHJldHVybiB7CiAgICAgICAgcXVlc3Rpb246IHRpdGxlLnJlcGxhY2UoL17jgJAuKj/jgJFccyovLCAnJyksCiAgICAgICAgdHlwZTogKHsg5Y2V6YCJ6aKYOiAwLCDlpJrpgInpopg6IDEsIOWhq+epuumimDogMiwg5Yik5pat6aKYOiAzIH0pW3RpdGxlLm1hdGNoKC9e44CQKC4qPynjgJF8JC8pWzFdXQogICAgfTsKfSk7CmRhdGEgPSAkLmdyZXAoZGF0YS5tYXAoZnVuY3Rpb24gKGluZGV4KSB7CiAgICB2YXIgJFRpTXUgPSAkKCcuVGlNdScpLmVxKGluZGV4KTsKICAgIGlmICghKCQuaXNQbGFpbk9iamVjdCh0aGlzKSAmJiB0aGlzLnR5cGUgPCA0ICYmICRUaU11LmZpbmQoJy5mcicpLmxlbmd0aCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSAyKSB7CiAgICAgICAgdmFyICRhbnMgPSAkVGlNdS5maW5kKCcuUHlfdGssIC5QeV9hbnN3ZXInKS5lcSgwKTsKICAgICAgICBpZiAoISRUaU11LmZpbmQoJy5jdW8nKS5sZW5ndGggJiYgdGhpcy5jb2RlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKCEkYW5zLmZpbmQoJy5jdW8nKS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5vcHRpb24gPSAkYW5zLmZpbmQoJy5jbGVhcmZpeCcpLm1hcChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJCh0aGlzKS50ZXh0KCkudHJpbSgpOwogICAgICAgICAgICB9KS5nZXQoKS5qb2luKCcjJykgfHwgJ+aXoCc7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvZGUpIHsKICAgICAgICAgICAgdGhpcy5jb2RlID0gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09IDMpIHsKICAgICAgICB2YXIgYW5zID0gJFRpTXUuZmluZCgnLmZvbnQyMDpsYXN0JykudGV4dCgpOwogICAgICAgIGlmICgkVGlNdS5maW5kKCcuY3VvJykubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gKHsgJ+KImic6ICfplJnor68nLCAnw5cnOiAn5q2j56GuJyB9KVthbnNdIHx8ICfml6AnOwogICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY29kZSkgewogICAgICAgICAgICB0aGlzLm9wdGlvbiA9ICh7ICfiiJonOiAn5q2j56GuJywgJ8OXJzogJ+mUmeivrycgfSlbYW5zXSB8fCAn5pegJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICB2YXIgdGV4dCA9ICRUaU11LmZpbmQoJy5QeV9hbnN3ZXIgPiBzcGFuOmVxKDApJykudGV4dCgpOwogICAgICAgIGlmICgkVGlNdS5maW5kKCcuZHVpJykubGVuZ3RoICYmIHRoaXMuY29kZSAmJiAhL15BP0I/Qz9EP0U/Rj9HPyQvLnRlc3QodGhpcy5vcHRpb24pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKCRUaU11LmZpbmQoJy5kdWknKS5sZW5ndGggfHwgdGV4dC5tYXRjaCgn5q2j56Gu562U5qGIJykpIHsKICAgICAgICAgICAgdGV4dCA9IHRleHQubWF0Y2goL1tBLUddL2dpKSB8fCBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb24gPSAkLm1hcCh0ZXh0LCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJJbWcoJFRpTXUuZmluZCgnLmZsOmNvbnRhaW5zKCcgKyB2YWx1ZSArICcpICsgYScpKTsKICAgICAgICAgICAgfSkuam9pbignIycpIHx8ICfml6AnOwogICAgICAgICAgICB0aGlzLmtleSA9IHRleHQuam9pbignJyk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvZGUpIHsKICAgICAgICAgICAgdGhpcy5jb2RlID0gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwp9KSwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUub3B0aW9uICE9ICfml6AnOwp9KTsKc2V0dGluZy5jdXJzID0gJCgnc2NyaXB0OmNvbnRhaW5zKGNvdXJzZU5hbWUpJywgdG9wLmRvY3VtZW50KS50ZXh0KCkubWF0Y2goL2NvdXJzZU5hbWU6XCcoLis/KVwnfCQvKVsxXSB8fCAkKCdoMScpLnRleHQoKS50cmltKCkgfHwgJ+aXoCc7CmRhdGEubGVuZ3RoICYmIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgIG1ldGhvZDogJ1BPU1QnLAogICAgdXJsOiBzZXR0aW5nLnRpa3UgKyAnP3dvcmtSZWxhdGlvbklkPScgKyAkKCcjd29ya0lkJykudmFsKCksCiAgICBoZWFkZXJzOiB7CiAgICAgICAgJ0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLAogICAgfSwKICAgIGRhdGE6ICdjb3Vyc2U9JyArIGVuY29kZVVSSUNvbXBvbmVudChzZXR0aW5nLmN1cnMpICsgJyZkYXRhPScgKyBlbmNvZGVVUklDb21wb25lbnQoKEV4dC5lbmNvZGUgfHwgSlNPTi5zdHJpbmdpZnkpKGRhdGEpKSArICcmaWQ9JyArICQoJyNqb2JpZCcpLnZhbCgpLnNsaWNlKDUpCn0pOwokam9iLmFkZENsYXNzKCdhbnMtam9iLWZpbmlzaGVkJyk7Cn0KCmZ1bmN0aW9uIGZpbHRlckltZyhkb20pIHsKcmV0dXJuICQoZG9tKS5jbG9uZSgpLmZpbmQoJ2ltZ1tzcmNdJykucmVwbGFjZVdpdGgoZnVuY3Rpb24gKCkgewogICAgcmV0dXJuICQoJzxwPjwvcD4nKS50ZXh0KCc8aW1nIHNyYz0iJyArICQodGhpcykuYXR0cignc3JjJykgKyAnIj4nKTsKfSkuZW5kKCkuZmluZCgnaWZyYW1lW3NyY10nKS5yZXBsYWNlV2l0aChmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gJCgnPHA+PC9wPicpLnRleHQoJzxpZnJhbWUgc3JjPSInICsgJCh0aGlzKS5hdHRyKCdzcmMnKSArICciPjwvaXJhbWU+Jyk7Cn0pLmVuZCgpLnRleHQoKS50cmltKCk7Cn0KCgo="},{"name":"百度网盘简易下载助手(直链下载复活版)","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["*://pan.baidu.com/*","*://yun.baidu.com/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["localhost","127.0.0.1","yyxxs.cn","softxm.cn","softxm.vip","42.193.51.61","119.28.33.23","119.28.139.214","49.234.47.193","82.156.65.179","42.193.127.85","81.70.253.99","49.232.252.126","82.156.15.149","59.110.224.13","59.110.225.22","59.110.226.3","baidu.com"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1637743440530,"data":{}},"enabled":true,"position":3,"file_url":"https://greasyfork.org/scripts/418182-%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%AE%80%E6%98%93%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B-%E7%9B%B4%E9%93%BE%E4%B8%8B%E8%BD%BD%E5%A4%8D%E6%B4%BB%E7%89%88/code/%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%AE%80%E6%98%93%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B%EF%BC%88%E7%9B%B4%E9%93%BE%E4%B8%8B%E8%BD%BD%E5%A4%8D%E6%B4%BB%E7%89%88%EF%BC%89.user.js","uuid":"61bed75f-bf29-4d79-8455-62321e4d41dd","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDnmb7luqbnvZHnm5jnroDmmJPkuIvovb3liqnmiYvvvIjnm7Tpk77kuIvovb3lpI3mtLvniYjvvIkKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vYmQuc29mdHhtLmNuL2JkLwovLyBAdmVyc2lvbiAgICAgIDEuMy43Ci8vIEBhbnRpZmVhdHVyZSAgbWVtYmVyc2hpcAovLyBAZGVzY3JpcHRpb24gIOKWiOKWiOKWiOKWiCAyMDIxMTI05ruh6YCf5o6l5Y+j5L6d54S25Y+v55SoIOKWiOKWiOKWiOKWiOS4gOS4que6r+WHgOWlveeUqOeahOebtOmTvuS4i+i9veWKqeaJi++8jOe7neaXoOWkmuS9memZhOWKoOWKn+iDveOAguWFjVNWSVDkvJrlkZjvvIzlhY3lronoo4XmtY/op4jlmajmianlsZXvvIzml6Dop4bpu5Hlj7fjgILlj6ropoHkvaDmnInkuKpJRE3miJZBcmlhMu+8jOWwseiDveS6q+WPl+aegemAn+S4i+i9veeahOW/q+aEn++8gfCfkY3wn5GN8J+RjfCfkY3wn5GNIOeDreeDiOW6huelneivhOiuuui2hTIwMDAg8J+RjfCfkY3wn5GN8J+RjfCfkY0KLy8gQGljb24gICAgICAgICBkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80UmMwUlhocFpnQUFUVTBBS2dBQUFBZ0FCd0VTQUFNQUFBQUJBQUVBQUFFYUFBVUFBQUFCQUFBQVlnRWJBQVVBQUFBQkFBQUFhZ0VvQUFNQUFBQUJBQUlBQUFFeEFBSUFBQUFpQUFBQWNnRXlBQUlBQUFBVUFBQUFsSWRwQUFRQUFBQUJBQUFBcUFBQUFOUUFBQUJJQUFBQUFRQUFBRWdBQUFBQlFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0ZkcGJtUnZkM01wQURJd01qQTZNRGs2TURrZ01EQTZNamM2TlRZQUFBT2dBUUFEQUFBQUFmLy9BQUNnQWdBRUFBQUFBUUFBQUdTZ0F3QUVBQUFBQVFBQUFHUUFBQUFBQUFBQUJnRURBQU1BQUFBQkFBWUFBQUVhQUFVQUFBQUJBQUFCSWdFYkFBVUFBQUFCQUFBQktnRW9BQU1BQUFBQkFBSUFBQUlCQUFRQUFBQUJBQUFCTWdJQ0FBUUFBQUFCQUFBVitnQUFBQUFBQUFCSUFBQUFBUUFBQUVnQUFBQUIvOWovN1FBTVFXUnZZbVZmUTAwQUF2L3VBQTVCWkc5aVpRQmtnQUFBQUFILzJ3Q0VBQXdJQ0FnSkNBd0pDUXdSQ3dvTEVSVVBEQXdQRlJnVEV4VVRFeGdSREF3TURBd01FUXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdCRFFzTERRNE5FQTRPRUJRT0RnNFVGQTRPRGc0VUVRd01EQXdNRVJFTURBd01EQXdSREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNRFAvQUFCRUlBS0FBb0FNQklnQUNFUUVERVFILzNRQUVBQXIveEFFL0FBQUJCUUVCQVFFQkFRQUFBQUFBQUFBREFBRUNCQVVHQndnSkNnc0JBQUVGQVFFQkFRRUJBQUFBQUFBQUFBRUFBZ01FQlFZSENBa0tDeEFBQVFRQkF3SUVBZ1VIQmdnRkF3d3pBUUFDRVFNRUlSSXhCVUZSWVJNaWNZRXlCaFNSb2JGQ0l5UVZVc0ZpTXpSeWd0RkRCeVdTVS9EaDhXTnpOUmFpc29NbVJKTlVaRVhDbzNRMkY5SlY0bVh5czRURDAzWGo4MFlubEtTRnRKWEUxT1QwcGJYRjFlWDFWbVoyaHBhbXRzYlc1dlkzUjFkbmQ0ZVhwN2ZIMStmM0VRQUNBZ0VDQkFRREJBVUdCd2NHQlRVQkFBSVJBeUV4RWdSQlVXRnhJaE1GTW9HUkZLR3hRaVBCVXRId015Umk0WEtDa2tOVEZXTnpOUEVsQmhhaXNvTUhKalhDMGtTVFZLTVhaRVZWTm5SbDR2S3poTVBUZGVQelJwU2toYlNWeE5UazlLVzF4ZFhsOVZabWRvYVdwcmJHMXViMkp6ZEhWMmQzaDVlbnQ4Zi8yZ0FNQXdFQUFoRURFUUEvQU9sU1NTU2FDa2tra2xLU1NTU1VwSklBa3dCSlBBQ3hlcWZXM3BIVDNPcWE0NXVRM1IxV09RV3RQaGJrTy9STi9xMStxOUpNWW1Sb0MzYVNYQzVQMTY2eFlmMWFxakZaMjlwdGQvbjJsclAvQUFKVTNmVzM2eU9NL2JTUDZ0VlFIL250SmxITHo4QStqSkx6a2ZXejZ4Z3o5dUo4alhVUi93Q2UxWm8rdkhYYWlQVzlESmIzRDY5aC93QS9IZFgvQU5Ra284dlB1Qzk2a3VlNmQ5ZHVsWlJGZVkxM1Q3VHB1ZWQ5SlA4QXg3UnVxLzY5WC8xeGREMkJCQmE0UzF3TWdnOE9hNGZTYWt4eWpLSnFRcFNTU1NTMVNTU1NTbEpKSkpLZi85RHBVa2trbWdwSkpKSlNrdEFDU1EwQUV1Y1RBQUdybk9jZm90YWt1Uyt2SFdITjI5R29kQWMwV1pwSGNIM1VZMzlyK2Z1LzZ5a3VoQXlrQUdsOVkvclhabmwrRjA1NXJ3QkxiTGhMWDMrUDhxdkUvY3IrbmY4QTRiL1JMbkFBQkFFQWNBSjBrRzdHSWlLQ2tra2tseWtra2tsS1dyMEg2eDVmUm5pdlcvcDVNMll2ZHM4MllwUDgxWi93Zjh6ZC93Q0NMS1NTUVlpUW9pdytzWStSajVXUFhrNHRndW91RzZ1eHZCSHcvTmUzNkwyZm1JaTRQNm5kWk9EbkRwOXp2MVRPY0EyZUs3ejdhN1A2dC84QU0yLzlhc1hlSXRMSkRnbFhUb3BKSkpKWXBKSkpKVC8vMGVsU1NTU2FDa2tra2xMT2ZYV3gxdHBpdXRwZTgveVdqZS8vQUtMVjVSazVWdWJrM1psMzg1a3ZkYTd5M0dRMyt3MzJMMGI2eVdHcjZ2OEFVWGprMEZnLzY0VzAvd0RVdlhtcVRaNVlhU1BqU2tra2tHd3BKSlJlNE1ZNXg0YUNmdVNVdW5XdjlhT2xYZEs2aGpZMXpXc2U3QXhIdWEwYlJ2YlVNYkovclA4QXRGRmo3UDY2eUVsS1NTU1NVc1JJSW1EMkk3SHhYcVhTYzc5bzlMeGMwL1R1ckhxLzhZMzlGZjhBK0NzZXZMbDNmMUdzTHVodllmOEFCWk5nSHdjMnV6L3FuSXNQTUM0ZzlqK2IwS1NTU1RVVWtra2twLy9TNlZKSkpKb0tTU1NTVTB1dVkvMnJvdWZRQkxuNDd5MGZ5bUQxbWY4QVNyWGw0SUlCSEIxWHJ6UTF6ZzEzMFhlMTN3UHRjdkpMS1hZOXRtTzc2VkQzVkgrdzQxLzk5U2JQTEhTUThpeFNUU1BGUFExK1RhS2NWcnNpNTMwYXFXbXg1K0ZkUWU1QnNLWFJmVWY2dXY2ejFkbDlyZjhBSi9UM3N0eUhIaDlnUHFZK0kzOTdlNXZxMy91VWY4ZFdyZlEvOFhIV001emJlcXowekUwSlo3WFpMeG9kcksvZlhqYm0vbjMvQUtSbi9jWmVrNEhUOExwdUpYaFlOUW94NnZvTUVuVTZ1ZTk3dmRaWS93RFBzZWtrQzNuL0FQR0I5WGJ1czlNWmw0alMvUDZkdmV5dG9rMjFQZzVGRGY4QWhXN0dYMC84WDZQK0dYbERYQndEbW1RZFFWNyt1Tyt0UCtMMmpxZHorb2RKZXpFemJDWFhVdmtVWFBKOTFrc2wyTGUvL0NQWXg5VnY1OWZxZnBVa2tkbnpKSlhPcDlGNnYwaDIzcWVIYmpON1drYnFqUDd1VFZ2by93Q21xTFhzZDlGd2RIZ1FVbHJKZWdmVXVqMHZxL1UrTmNpMjIwL0RkNkRQK2pTdlBuSGEwdThCUDNMMUxwR1A5bDZSZzR4ME5XUFdIZjFuTjlSLy9UZWl3Y3dmU0IzTGJTU1NTYXFra2trbFAvL1Q2VkpKSkpvS1NTU1NVcGNhNzZyNTNWdnJqbTBZcldESHF1cXlzbTIzK2JheTNaa2VrV2dPOVd5LzlNMzB2Ni9xTFMrc3Yxby9aYnZzV0NHMlo4QTJ2ZU56S1FSdVlDei9BQW1ROXZ1MmZRcVovT0xWL3dBVy9VN09vZE96M1pWeHV6bTVRZGM1MEErbTZxdG1NZGpHc1l5cjlGZFV6K285SnM4dkNRUEVkQVE3di9OejZ0aDB0NlJnaURJL1ZxcEhoK1lxUDFrNjFiOVY4Wm1aajR0Tm1GZHVwZlZXQlMvN1M0YnNXeHoyZXl6RmRYWGJYZjhBby9Yci9ScmVXWjlZK2gwZGU2VlowNjIzMEhGemJLYnRIYkxHSDJ1ZFh1YnZadGMrdXhpRGJJMDBlUzZCL2pLejhucWxHSDFiSHh4ajVWZ3BiZGpoN0hWdnNPeWx6MjIyWE50cDlUMlArZzluODR2UVNJTUhrTGdPZ2Y0dGMzRTZwUm1kVnlhTEtNVjdibVU0Kzl4c2V3NzZ2VWRheXIwNm0yYmJIZnpucWZ6YTcvblVwRlViV1hFL1d2OEF4ZzVQU3VxV2RNNlhqMVcyWXNESnZ5TnptNzNBV2VqVFZVK3YrYlk1bnFXdnMrbi9BSU5kc3VJK3RmOEFpK3krcWRVczZwMHUrbGpzcUhaTkdRWE1BZTBOcjlhbTJ0bHY4NHh2NlNwN1ArdUpCVXI2T3A5VXZyWG0vV0tYREhyeHFzVmhibis0dUw3My93QkdiaGpkN01mMG1XMlpIMmxuMC8wRlArRXRXdmQwVG9lUVduSTZiaVhGdWpUWmoxT2dlRFpZc3o2by9WL0crcnZUN0tuNU5kK1hsUEZtVGExd0RKYU5sVk5JY2QzcDFlNzN2L25IdlcraGZaUWllbysxOG8rdGYxTnp1bjlUTjFUYTM5TTZqbGl1ZzBqWjZQcnYvUjR0bEgrRGF4cnZUcHNxL1Erei9BL3phN1o4Ynp0K2lEQStBNFJQcnhtTnd2cXZtWGVvSzdpYW00aDBuMXhaWGJSNllmOEFTZlY2ZnIveUdWK291VCtybjF0Zm01RE9uOVREUmtXbmJqNUxCdEQzZjZHNnNleGxyLzhBQldWK3l6K2I5Tk9EVzVtQk5FYlJlblNTU1NhaWtra2tsUDhBLzlUcFVra2ttZ3BPMGdIYzdWcmRTUEllNU1uYVljREVnY2p4U1UrU1dYMlpOdG1UYWQxdDczV3ZjZTdubmVVYnAvVWMvcG1XM002ZmU3R3lXZ3Q5UnNHV3UrbFhaVzhPcnRxZHQraFkxVDZ2MDJ6cFhVcnNKNE94cDMwTzdQcGNUNkwyL3dEbnQvOEF3ckZVUWRBRUVBamJvOXAwbi9HYjFSdlVhVDFrVWZzOG5aYzZpb3NjemRHM0ovbkxYV05wL3dBSlczL0JlcC93YTc1dlRlbld0RnRZM3N0RzlqMlAzTmMxM3VhK3R3bmN4LzVxOE1KRFJKNEM5SCtyVlhYZWc5THhtMXpsdGNDL0o2VmE4TU5ZZVhPYU9uWHU5bE56V3VaNitKZityVzI3L1RzeDdVREVTM0FQbXVHYzQvMGpIaTAwZTNyWXl1dHRiQkRHQ0dqblFLdmpaekw4ek53OWhaWmd1ckJrenZydXJiZFZrTjBidHJjLzFzZi9BSXpIc1FPbmRmNlQxRi9vMFhpckxHajhISUhvNUxUQWREc2E3YTkvUDg1VDZ0WC9BQWluMURvdEdiZFhsYjdzTE9wYVdWWnVNNFYyaXNrV09vZnZiWlRrWTdudDMramtWV3MvMGFWTGliMUJ1MlhVK29zNmRqc3VjejFiTHI2c2Fpa09EWFdXWFBiV0dNYzcvUnM5UzkvL0FBVk5pdHVBTXRQdWFaQjhDRG9zL0U2RlhUbXR6OG5JeWVwWnRiWE1vdXlpMGlscnh0dCt5NCtOWFJqVXZ0YjdMTC9TOWZaK2o5WDAxTHFQVytsZE5kNmVYa05HUWZvWWxZTnVROGtTMFY0ZEcvSWQvbWJFVlhXcDBTL3MzcDhhMHRnRFdTWWovT1hCZGUveGtaOWZWWFY5QmRRN0FvYjZlKzJ2MUczUGticjYvZFU5bFZXMzBhUGZzdC9TVy82RmEzVy8yeDlZTUsramM3cG1PK3A0b3d0elRiYzgvd0EzKzA3cXkrdW1oMGJQc09PLy9DZnJkLzhBZ0Y1aVE1cml4N1N4N0NXdlk0UVd1YWRyMk9IN3pISUNJR3dBOGxwemU1cHhHWEQzTnQ3ckhYT3FkYnlXNVBVcnZWZFVDMm10clF5dXNPTzU0cHFiKy84QW4yUDMzUDhBOUlxQkxnTnpUdGMzM05jT1FSN211L3N1VG8ySGczOVF5NnNIR0UyNUIyZzltdC93dHovK0RwWjczb28yMUw2amkzdXljVEh5WENIWDFWMnVIbTlyWHUvNlRrVlJaV3lwaktxLzV1cHJXTW45MWdERy93RFJhcEl1Y3BKSkpKVC9BUC9WNlRjM3hDVzV2aUZ1N1dmdU4velIvY2x0Wis0My9OSDl5VEI5MlA3MzRPRnViNGhMYzN4QzNkalAzRy81b1diZjlZL3E1UXpIc09aajNOekxoalkzMmZiZVgya2h1eHJhTi8wTjdQVWYvTHIvQU5JeEpYM1kvdmZnNVBVK2w5TzZyUUtNMW03WkpxdGFkdGxaUDBqVlovSy9QcmQramV1YnQrb0IzL29PcE45UC9oYWZjUDhBdHEzWTVlbVd0cnBhNTl3WlhYV0hPZTk0QWExclJ1ZTl6aitZeHFwZEk2djBycmVJYzNwanhmanRzZFVYbXNzOTdOcm5lMjFyWGZSc1k1SmRISE9PZ24rRHluU1BxbjB2cGxyY2w3em1aVEROZGxnRFdNSS9QcW9idS9TZjhKYSt4YmU0ZUkrOWJ1MW43amY4MGYzS3N6cVBTck9wTzZTeStoM1VXTjN1eEJCc0RmNVdtM2RydjlQZDZtejlJa2lXQ1VqWm5mMGNYTHhjSE5yRmViUlZsTWI5RnR6V3Yyeis0WGU2dit3cTdlazR0YmRtTms1dUl5WjJZK2JrTWJQOVIxdGpWcVpuMXArcitKMG0vcTR1Wmw0bVBiOW5kOW1hMTduWFNQMEZXLzAyUGR0ZDZtN2Y2ZnBMWWRXd0dOamY4MGYzSktHR1EyblhrOG9lbDBQYVdYNW1ma3NKQkxMczdJYzJScjlDdTJwSHhNVEJ3V09aaFVWWXpYL1Q5Sm9hWGY4QUdQOEE1eXovQUs0OWRIdForNDMvQURSL2NxUFV1czlKNlhrWU9ObXVGZDNVcmZReFdpdmRMcGEzYytCK2pyMzJWTTMvQVBDSktPR1IzbVQ1dENXK0lXUjFqNnM5TDZ0WWNoN25ZMldmcFpGVUhmR2c5ZWwvc3RkL3duNk8xZG9XTUJnc2JJL2tqKzVMYXo5eHYrYVA3a2xSd1NpYkU2K2o1azM2Z1AzKy9xVFBUL2swbmZIOXE3WXVoNlIwWHB2U0tuTnhBWFcyQ0xjaXdnMlBBMTI2UTJ1ci9ncTEwak0zcDFtZGIwNnUybDJkanNiYmZqQUF2WXgyalhQOXY4cG50K24ra3IvZlU4dkl4TUxFdXpjcmJYajR6RGJjL2FERFc4dzFvM09ja3Vsam5JVVo2ZVRqN20rSVMzTjhRdGZEeWNQT3hLYzNGMjJZK1N3V1ZQMkFFdGQ0dGNQYWpiV2Z1Ti96Ui9ja3MrN0g5NzhIQzNOOFFsdWI0aGJ1MW43amY4MGYzSmJXZnVOL3pSL2NrcjdzZjN2d2YvL1c5Q1NTU1FTdUpKZ2FrNlI0eXZJbmRDNkRkMTc2eGRZQXY2ZjBQb1R3S3ZzYncydzVJYzJtdHVMYmEyNXJHMlpOZHRuL0FBSHE0LzhBZzE2NjBrT0JHcEJCQzh0K3MyQmIweXZLNlZqOVp3SDlJNnYxUmo4aXR6bXV5c2V5eDI5NzcyTk96N1BqK2wrbTN2OEE4SC9ndlZzUlUzUHJXeS9wbjFmeE9qOU55T29ablV2ckw2UmRSbTNtKzVsSURiSFk3R3M5TmxMckxyV1UyZTM5S3lxNVovMWQ2MzlkT2xkR3ZxeEtNVDdIME85dUpiaXZZWDIzNUY5enEzMDQ5bFBxZXZrTnNmNy9BRXJhL3dCSDZYcCtvdWtHWjBYRnd1cGZXeG5WSDllNnQwckhPTU02eGdiVFhkWVBUcFpoVVZWVjBNYmJiYjczMVc1SDZQMVAwbjZWRStvdlI4VS9Wem91U3g3YmFXT3V6bmlOWDVyaTdGWmJadUR2NkJUNnRUUGQ3N3ZTdS93U1NuUSt1bjFodCtydjFmdHpxMjdNMjB0eDhadWp3eTU3WFBjOXhQdGY5bVl5eHpQWitrdDlOY0greE0vNnZkQ1plOXJyL3JWOWFISEh4MkV6WlZSWUEvS2Z1ZjhBOXE4bjFhNjdySC96UHIvem44OHZTUHJEMHFycS9STTNCZlF6SXNmUmFjVVdDZHQ0cmY4QVo3YS96bVdOZWZwTVdUWmI5Wkx1azlENnAwREQ2Zm5XTndhcCsxay9hR09zclkyOXVKa2VyUlV4anRucDIvcFBWOVJKVHgrYjBmNnpkRndPay9Wdks2Wmk1V0tlcVY1Rk4yUGNBY3EySEIyUGE2MTM2UGRVL3dCTDE3TWVyMDYyVkwwdnBlWjFiTXJzdDZwMDM5bFdoOE1xKzBNeWQ3U056ck4xRFcrbHRkN2RqMXhmV2VwZlhTL3FYUS90ZjFlcnF1b3pIVzR0VGNsaEYxamE5M3A3L1VmNld4amZWM3ZjdXE2Sm0vV1hMc3QvYlhTcWVsMHRhRFNXWGk2eHpwK2k2dXMyTjJiTjN2OEEwYVNtZlgvckgwcjZ1NGJjenFWamdMSGJLYWF3SFcyTy9QOEFTcmM2djJWTjkxdGozN1ArdVdWcm0vckpYKzBQOFlQMVVxRW1yMHhsc2E2V3dHdnN5OXptTytnL2JqczN0Umo5V3VvOWQrdU4zVnV2VStuMHJwanpWMHZFY1FSY0szVFhrT1lQcFk5cnYxbTNmL1BmbzZQNW10V2VwVW0zL0dWMFc0ay9vc0RKZjhUK3MxNi85dkpLZWh4TS9FemhlN0ZzOVg3TGZaaTVHaGJ0dXFqMXF2ZUcvUjNmVFdaOWEvckxiOVdzQ3ZxRGNCK2ZXYk5scGE3WXlvUitqZmM3WmIvTzJmbzJlM1ovd24wRVIySGxkTjZ0bGRSd3FIWmVMMUlNT2JpMUZyYldaRlFOZGVaanR2c294N0s4bWsrbm1NMzEyK3BYOW8vU0xPL3hrdnVaOVNjN1kyTjdxRzJ4cnRhYldPZDdoL3dqYTYwbFBEZlZQNjNZZlNYUDZoazNNczZyMWJxRFIxSzIydDd2VHdnZld5TGEzVk4vbnNpNngzdHI5VCtaL21sdGZYeTc2M3M2TGwyV1plSmwvVi9xYjZqaWtNOUxJYlhZNXVUaTBpc3NwZjhBUnI5Ky93QloreFZxTGVpWWYxaCtxUnhLMjNOcjZZWDVBd21OdHVma1BwdWoyVUF2KzEvYVBvdXUvbWJQMG42UDlJaC9YSHBtWDAwWU9ObC9XSE91b3V5YWJiNnNwcHlEaHRmdjlQSXlNaXU2eHRsclAwM28wMTdQdFhvWkZsU1NIdVBxdGkvV1hEd1c0WFc2OEtxbkVxcm93MlloZWJJckd4enNoem5QcTl6ZjdmcXJiV0YwUG9QVmNQSy9hR2I5WWNuckZkbGY2T3VBekdjMTQ5bDJ6MWNobG43OVZsWHByZFNTcEpKSkJULy8xL1FrbGxmYjh6OThmNXJmL0lwZmI4ejk4ZjVyZi9JcE1YM2lIYVg4dnE2b0pCa2NoY3I5WnZxVDA3TmJYbmRMNmRqSHFWZVhUZll4eDlPdStzUC9BRm1tK1hlaTFsbS8xYmYwZTkreGF2Mi9NL2ZIK2EzL0FNaWw5dnpQM3gvbXQvOEFJcEsrOFE3Uy9sOVZ1dWRDcXo4ZnAvVE1XdXVqcGRPYXkvTG9yYTFqRFJVTExXME5vYnNhNzE4ajAydi9BTTlUcXdjM3ArWGsyZE9aWGRoNTFoeUxNVzJ3MUduSWZIcjNVVytuZHZ4Y21QVnV4LzV5bS84QW1QNTFSKzM1bjc0L3pXLytSUyszNW43NC93QTF2L2tVbGZlSWRwZmgvRjFnZHJwYjJNZy9CVWVrZE8vWmVHY0ZqMnZ4NjdiWFlqUTBnMTAyT043TVo1YzUvcWVnK3l4bGIvOEFRK21xL3dCdnpQM3gvbXQvOGlsOXZ6UDN4L210L3dESXBLKzhRN1MvbC9oTXVzNFdaZm1kSHk4T3RscjhETjlTNXIzYkFLYkszNDkxb1A1N3FkelgrazMzMkxUMDdjZGxsZmI4ejk4ZjVyZi9BQ0tYMi9NL2ZIK2EzL3lLU3Z2RU8wdncvaTZxeUxlbGRScyt0bU4xWjlsSjZmallsdE5iQTB0dkZsdTBPcnMxYzIyci9EVjJ0MmJQNXIwLzhKWkw3Zm1mdmovTmIvNUZMN2ZtZnZqL0FEVy8rUlNWOTRoMmwvTDZ1cW8yVjFYVnZxdVkyMnF3RnRsZGpRNWptbjZUSHNmTFh0V1o5dnpQM3gvbXQvOEFJcGZiOHo5OGY1cmYvSXBLKzhRN1MvRCtLQS9WUHBsUFYrbjlTNmJUVDA5dUd6SnJ5SzhkbnB2dGJmWDZWVG0yMW4yMlk5bTUyOS85aFQ2ajBRdmYwbXZCcWFLY1hxVmVkbTNQc0p1ZDZiTFdlclkrM2ZibVdXYjJzZTU5dnFmemRlejB2NWtuMi9NL2ZIK2EzL3lLWDIvTS9mSCthMy95S1N2dkVPMHY1ZlZ0WW5TZW5ZVGc3RHArenRCY1cwMXZzRkRTL3dEbkhWWWZxZlpLdC84QXdkS3RySyszNW43NC93QTF2L2tVdnQrWisrUDgxdjhBNUZKWDNpSGFYNGZ4ZFZKWlgyL00vZkgrYTMveUtYMi9NL2ZIK2EzL0FNaWtyN3hEdEwrWDFmL1E2VkpKSkpvS1NTU1NVcEpKSkpTa2tra2xLU1NTU1VwSkpKSlNra2trbEtTU1NTVXBKSkpKU2tra2tsUC8yZi9oRXRGb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdkFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cGtZejBpYUhSMGNEb3ZMM0IxY213dWIzSm5MMlJqTDJWc1pXMWxiblJ6THpFdU1TOGlJSGh0Ykc1ek9uaHRjRTFOUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmJXMHZJaUI0Yld4dWN6cHpkRVYyZEQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wzTlVlWEJsTDFKbGMyOTFjbU5sUlhabGJuUWpJaUI0Yld4dWN6cHpkRkpsWmowaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wzTlVlWEJsTDFKbGMyOTFjbU5sVW1WbUl5SWdlRzFzYm5NNmNHaHZkRzl6YUc5d1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM0JvYjNSdmMyaHZjQzh4TGpBdklpQjRiWEE2UTNKbFlYUnZjbFJ2YjJ3OUlrRmtiMkpsSUZCb2IzUnZjMmh2Y0NCRFF5QXlNREU1SUNoWGFXNWtiM2R6S1NJZ2VHMXdPa055WldGMFpVUmhkR1U5SWpJd01qQXRNRGt0TURoVU1qTTZNREk2TlRFck1EZzZNREFpSUhodGNEcE5aWFJoWkdGMFlVUmhkR1U5SWpJd01qQXRNRGt0TURsVU1EQTZNamM2TlRZck1EZzZNREFpSUhodGNEcE5iMlJwWm5sRVlYUmxQU0l5TURJd0xUQTVMVEE1VkRBd09qSTNPalUyS3pBNE9qQXdJaUJrWXpwbWIzSnRZWFE5SW1sdFlXZGxMMnB3WldjaUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk5tSmxZelJrWlRNdE9EVmhaQzAyTnpRd0xXRTFPV1V0T1RrMllqazBPVFJqWVRreElpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSmhaRzlpWlRwa2IyTnBaRHB3YUc5MGIzTm9iM0E2T0RBek9XVmhNek10TVRRM05TMDBZVFJpTFdJek9EQXRPRE5sTmpkbE5qWTBOREV3SWlCNGJYQk5UVHBQY21sbmFXNWhiRVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2WWpJNFl6azBaR1V0TmpFeU9TMDJZalJpTFRnMFlXTXRZbVV5TjJRM01qRmhOMk0zSWlCd2FHOTBiM05vYjNBNlEyOXNiM0pOYjJSbFBTSXpJajRnUEhodGNFMU5Pa2hwYzNSdmNuaytJRHh5WkdZNlUyVnhQaUE4Y21SbU9teHBJSE4wUlhaME9tRmpkR2x2YmowaVkzSmxZWFJsWkNJZ2MzUkZkblE2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwaU1qaGpPVFJrWlMwMk1USTVMVFppTkdJdE9EUmhZeTFpWlRJM1pEY3lNV0UzWXpjaUlITjBSWFowT25kb1pXNDlJakl3TWpBdE1Ea3RNRGhVTWpNNk1ESTZOVEVyTURnNk1EQWlJSE4wUlhaME9uTnZablIzWVhKbFFXZGxiblE5SWtGa2IySmxJRkJvYjNSdmMyaHZjQ0JEUXlBeU1ERTVJQ2hYYVc1a2IzZHpLU0l2UGlBOGNtUm1PbXhwSUhOMFJYWjBPbUZqZEdsdmJqMGljMkYyWldRaUlITjBSWFowT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9USmlNVE13T0RZdE5UQXpaQzAzWWpSbUxUZzVNREl0TURrNE16VmxZbUU0TVRVNUlpQnpkRVYyZERwM2FHVnVQU0l5TURJd0xUQTVMVEE0VkRJek9qVXhPak0zS3pBNE9qQXdJaUJ6ZEVWMmREcHpiMlowZDJGeVpVRm5aVzUwUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhPU0FvVjJsdVpHOTNjeWtpSUhOMFJYWjBPbU5vWVc1blpXUTlJaThpTHo0Z1BISmtaanBzYVNCemRFVjJkRHBoWTNScGIyNDlJbk5oZG1Wa0lpQnpkRVYyZERwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09qWm1NV0ZtT0Rjd0xUazBZamt0WmpVME1TMDVOVFUzTFRSalkyVm1aV0U1WkdFMVl5SWdjM1JGZG5RNmQyaGxiajBpTWpBeU1DMHdPUzB3T1ZRd01Eb3lOem8xTmlzd09Eb3dNQ0lnYzNSRmRuUTZjMjltZEhkaGNtVkJaMlZ1ZEQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0ZkcGJtUnZkM01wSWlCemRFVjJkRHBqYUdGdVoyVmtQU0l2SWk4K0lEeHlaR1k2YkdrZ2MzUkZkblE2WVdOMGFXOXVQU0pqYjI1MlpYSjBaV1FpSUhOMFJYWjBPbkJoY21GdFpYUmxjbk05SW1aeWIyMGdZWEJ3YkdsallYUnBiMjR2ZG01a0xtRmtiMkpsTG5Cb2IzUnZjMmh2Y0NCMGJ5QnBiV0ZuWlM5cWNHVm5JaTgrSUR4eVpHWTZiR2tnYzNSRmRuUTZZV04wYVc5dVBTSmtaWEpwZG1Wa0lpQnpkRVYyZERwd1lYSmhiV1YwWlhKelBTSmpiMjUyWlhKMFpXUWdabkp2YlNCaGNIQnNhV05oZEdsdmJpOTJibVF1WVdSdlltVXVjR2h2ZEc5emFHOXdJSFJ2SUdsdFlXZGxMMnB3WldjaUx6NGdQSEprWmpwc2FTQnpkRVYyZERwaFkzUnBiMjQ5SW5OaGRtVmtJaUJ6ZEVWMmREcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPalppWldNMFpHVXpMVGcxWVdRdE5qYzBNQzFoTlRsbExUazVObUk1TkRrMFkyRTVNU0lnYzNSRmRuUTZkMmhsYmowaU1qQXlNQzB3T1Mwd09WUXdNRG95TnpvMU5pc3dPRG93TUNJZ2MzUkZkblE2YzI5bWRIZGhjbVZCWjJWdWREMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tGZHBibVJ2ZDNNcElpQnpkRVYyZERwamFHRnVaMlZrUFNJdklpOCtJRHd2Y21SbU9sTmxjVDRnUEM5NGJYQk5UVHBJYVhOMGIzSjVQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG8yWmpGaFpqZzNNQzA1TkdJNUxXWTFOREV0T1RVMU55MDBZMk5sWm1WaE9XUmhOV01pSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2WWpJNFl6azBaR1V0TmpFeU9TMDJZalJpTFRnMFlXTXRZbVV5TjJRM01qRmhOMk0zSWlCemRGSmxaanB2Y21sbmFXNWhiRVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2WWpJNFl6azBaR1V0TmpFeU9TMDJZalJpTFRnMFlXTXRZbVV5TjJRM01qRmhOMk0zSWk4K0lEeHdhRzkwYjNOb2IzQTZWR1Y0ZEV4aGVXVnljejRnUEhKa1pqcENZV2MrSUR4eVpHWTZiR2tnY0dodmRHOXphRzl3T2t4aGVXVnlUbUZ0WlQwaTZMMnY1THUyNWJDUDVhYTVJaUJ3YUc5MGIzTm9iM0E2VEdGNVpYSlVaWGgwUFNMb3ZhL2t1N2Jsc0kvbHBya2lMejRnUEM5eVpHWTZRbUZuUGlBOEwzQm9iM1J2YzJodmNEcFVaWGgwVEdGNVpYSnpQaUE4Y0dodmRHOXphRzl3T2tSdlkzVnRaVzUwUVc1alpYTjBiM0p6UGlBOGNtUm1Pa0poWno0Z1BISmtaanBzYVQ1NGJYQXVaR2xrT2pCbVlXVXpNRGc1TFRjeVlUSXRNVE0wTXkwNVlUVmpMVFF5Tm1RNU5XRXlOelkxTVR3dmNtUm1PbXhwUGlBOGNtUm1PbXhwUG5odGNDNWthV1E2WW1ObU5UUTVPREl0T1RWaU55MDFaalF3TFRnMU5UUXRZMkZsTVRFNVpqQXlPRFZrUEM5eVpHWTZiR2srSUR3dmNtUm1Pa0poWno0Z1BDOXdhRzkwYjNOb2IzQTZSRzlqZFcxbGJuUkJibU5sYzNSdmNuTStJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUR3L2VIQmhZMnRsZENCbGJtUTlJbmNpUHo3LzdSOHNVR2h2ZEc5emFHOXdJRE11TUFBNFFrbE5CQ1VBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU9FSkpUUVE2QUFBQUFBRFhBQUFBRUFBQUFBRUFBQUFBQUF0d2NtbHVkRTkxZEhCMWRBQUFBQVVBQUFBQVVITjBVMkp2YjJ3QkFBQUFBRWx1ZEdWbGJuVnRBQUFBQUVsdWRHVUFBQUFBU1cxbklBQUFBQTl3Y21sdWRGTnBlSFJsWlc1Q2FYUmliMjlzQUFBQUFBdHdjbWx1ZEdWeVRtRnRaVlJGV0ZRQUFBQUJBQUFBQUFBUGNISnBiblJRY205dlpsTmxkSFZ3VDJKcVl3QUFBQVZvSVdnM2k3NS9iZ0FBQUFBQUNuQnliMjltVTJWMGRYQUFBQUFCQUFBQUFFSnNkRzVsYm5WdEFBQUFER0oxYVd4MGFXNVFjbTl2WmdBQUFBbHdjbTl2WmtOTldVc0FPRUpKVFFRN0FBQUFBQUl0QUFBQUVBQUFBQUVBQUFBQUFCSndjbWx1ZEU5MWRIQjFkRTl3ZEdsdmJuTUFBQUFYQUFBQUFFTndkRzVpYjI5c0FBQUFBQUJEYkdKeVltOXZiQUFBQUFBQVVtZHpUV0p2YjJ3QUFBQUFBRU55YmtOaWIyOXNBQUFBQUFCRGJuUkRZbTl2YkFBQUFBQUFUR0pzYzJKdmIyd0FBQUFBQUU1bmRIWmliMjlzQUFBQUFBQkZiV3hFWW05dmJBQUFBQUFBU1c1MGNtSnZiMndBQUFBQUFFSmphMmRQWW1wakFBQUFBUUFBQUFBQUFGSkhRa01BQUFBREFBQUFBRkprSUNCa2IzVmlRRy9nQUFBQUFBQUFBQUFBUjNKdUlHUnZkV0pBYitBQUFBQUFBQUFBQUFCQ2JDQWdaRzkxWWtCdjRBQUFBQUFBQUFBQUFFSnlaRlJWYm5SR0kxSnNkQUFBQUFBQUFBQUFBQUFBQUVKc1pDQlZiblJHSTFKc2RBQUFBQUFBQUFBQUFBQUFBRkp6YkhSVmJuUkdJMUI0YkVCU0FBQUFBQUFBQUFBQUNuWmxZM1J2Y2tSaGRHRmliMjlzQVFBQUFBQlFaMUJ6Wlc1MWJRQUFBQUJRWjFCekFBQUFBRkJuVUVNQUFBQUFUR1ZtZEZWdWRFWWpVbXgwQUFBQUFBQUFBQUFBQUFBQVZHOXdJRlZ1ZEVZalVteDBBQUFBQUFBQUFBQUFBQUFBVTJOc0lGVnVkRVlqVUhKalFGa0FBQUFBQUFBQUFBQVFZM0p2Y0Zkb1pXNVFjbWx1ZEdsdVoySnZiMndBQUFBQURtTnliM0JTWldOMFFtOTBkRzl0Ykc5dVp3QUFBQUFBQUFBTVkzSnZjRkpsWTNSTVpXWjBiRzl1WndBQUFBQUFBQUFOWTNKdmNGSmxZM1JTYVdkb2RHeHZibWNBQUFBQUFBQUFDMk55YjNCU1pXTjBWRzl3Ykc5dVp3QUFBQUFBT0VKSlRRUHRBQUFBQUFBUUFFZ0FBQUFCQUFFQVNBQUFBQUVBQVRoQ1NVMEVKZ0FBQUFBQURnQUFBQUFBQUFBQUFBQS9nQUFBT0VKSlRRUU5BQUFBQUFBRUFBQUFXamhDU1UwRUdRQUFBQUFBQkFBQUFCNDRRa2xOQS9NQUFBQUFBQWtBQUFBQUFBQUFBQUVBT0VKSlRTY1FBQUFBQUFBS0FBRUFBQUFBQUFBQUFUaENTVTBEOVFBQUFBQUFTQUF2Wm1ZQUFRQnNabVlBQmdBQUFBQUFBUUF2Wm1ZQUFRQ2htWm9BQmdBQUFBQUFBUUF5QUFBQUFRQmFBQUFBQmdBQUFBQUFBUUExQUFBQUFRQXRBQUFBQmdBQUFBQUFBVGhDU1UwRCtBQUFBQUFBY0FBQS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vd1BvQUFBQUFQLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLzhENkFBQUFBRC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vQStnQUFBQUEvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL3dQb0FBQTRRa2xOQkFBQUFBQUFBQUlBQXpoQ1NVMEVBZ0FBQUFBQUNBQUFBQUFBQUFBQU9FSkpUUVF3QUFBQUFBQUVBUUVCQVRoQ1NVMEVMUUFBQUFBQUJnQUJBQUFBRFRoQ1NVMEVDQUFBQUFBQUVBQUFBQUVBQUFKQUFBQUNRQUFBQUFBNFFrbE5CQjRBQUFBQUFBUUFBQUFBT0VKSlRRUWFBQUFBQUFNOUFBQUFCZ0FBQUFBQUFBQUFBQUFCTEFBQUFTd0FBQUFFajI5Tzlsd1BXYmtBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBU3dBQUFFc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUVBQUFBQUFBQnVkV3hzQUFBQUFnQUFBQVppYjNWdVpITlBZbXBqQUFBQUFRQUFBQUFBQUZKamRERUFBQUFFQUFBQUFGUnZjQ0JzYjI1bkFBQUFBQUFBQUFCTVpXWjBiRzl1WndBQUFBQUFBQUFBUW5SdmJXeHZibWNBQUFFc0FBQUFBRkpuYUhSc2IyNW5BQUFCTEFBQUFBWnpiR2xqWlhOV2JFeHpBQUFBQVU5aWFtTUFBQUFCQUFBQUFBQUZjMnhwWTJVQUFBQVNBQUFBQjNOc2FXTmxTVVJzYjI1bkFBQUFBQUFBQUFkbmNtOTFjRWxFYkc5dVp3QUFBQUFBQUFBR2IzSnBaMmx1Wlc1MWJRQUFBQXhGVTJ4cFkyVlBjbWxuYVc0QUFBQU5ZWFYwYjBkbGJtVnlZWFJsWkFBQUFBQlVlWEJsWlc1MWJRQUFBQXBGVTJ4cFkyVlVlWEJsQUFBQUFFbHRaeUFBQUFBR1ltOTFibVJ6VDJKcVl3QUFBQUVBQUFBQUFBQlNZM1F4QUFBQUJBQUFBQUJVYjNBZ2JHOXVad0FBQUFBQUFBQUFUR1ZtZEd4dmJtY0FBQUFBQUFBQUFFSjBiMjFzYjI1bkFBQUJMQUFBQUFCU1oyaDBiRzl1WndBQUFTd0FBQUFEZFhKc1ZFVllWQUFBQUFFQUFBQUFBQUJ1ZFd4c1ZFVllWQUFBQUFFQUFBQUFBQUJOYzJkbFZFVllWQUFBQUFFQUFBQUFBQVpoYkhSVVlXZFVSVmhVQUFBQUFRQUFBQUFBRG1ObGJHeFVaWGgwU1hOSVZFMU1ZbTl2YkFFQUFBQUlZMlZzYkZSbGVIUlVSVmhVQUFBQUFRQUFBQUFBQ1dodmNucEJiR2xuYm1WdWRXMEFBQUFQUlZOc2FXTmxTRzl5ZWtGc2FXZHVBQUFBQjJSbFptRjFiSFFBQUFBSmRtVnlkRUZzYVdkdVpXNTFiUUFBQUE5RlUyeHBZMlZXWlhKMFFXeHBaMjRBQUFBSFpHVm1ZWFZzZEFBQUFBdGlaME52Ykc5eVZIbHdaV1Z1ZFcwQUFBQVJSVk5zYVdObFFrZERiMnh2Y2xSNWNHVUFBQUFBVG05dVpRQUFBQWwwYjNCUGRYUnpaWFJzYjI1bkFBQUFBQUFBQUFwc1pXWjBUM1YwYzJWMGJHOXVad0FBQUFBQUFBQU1ZbTkwZEc5dFQzVjBjMlYwYkc5dVp3QUFBQUFBQUFBTGNtbG5hSFJQZFhSelpYUnNiMjVuQUFBQUFBQTRRa2xOQkNnQUFBQUFBQXdBQUFBQ1AvQUFBQUFBQUFBNFFrbE5CQkVBQUFBQUFBRUJBRGhDU1UwRUZBQUFBQUFBQkFBQUFBMDRRa2xOQkF3QUFBQUFGaFlBQUFBQkFBQUFvQUFBQUtBQUFBSGdBQUVzQUFBQUZmb0FHQUFCLzlqLzdRQU1RV1J2WW1WZlEwMEFBdi91QUE1QlpHOWlaUUJrZ0FBQUFBSC8yd0NFQUF3SUNBZ0pDQXdKQ1F3UkN3b0xFUlVQREF3UEZSZ1RFeFVURXhnUkRBd01EQXdNRVF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3QkRRc0xEUTRORUE0T0VCUU9EZzRVRkE0T0RnNFVFUXdNREF3TUVSRU1EQXdNREF3UkRBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURQL0FBQkVJQUtBQW9BTUJJZ0FDRVFFREVRSC8zUUFFQUFyL3hBRS9BQUFCQlFFQkFRRUJBUUFBQUFBQUFBQURBQUVDQkFVR0J3Z0pDZ3NCQUFFRkFRRUJBUUVCQUFBQUFBQUFBQUVBQWdNRUJRWUhDQWtLQ3hBQUFRUUJBd0lFQWdVSEJnZ0ZBd3d6QVFBQ0VRTUVJUkl4QlVGUllSTWljWUV5QmhTUm9iRkNJeVFWVXNGaU16UnlndEZEQnlXU1UvRGg4V056TlJhaXNvTW1SSk5VWkVYQ28zUTJGOUpWNG1YeXM0VEQwM1hqODBZbmxLU0Z0SlhFMU9UMHBiWEYxZVgxVm1aMmhwYW10c2JXNXZZM1IxZG5kNGVYcDdmSDErZjNFUUFDQWdFQ0JBUURCQVVHQndjR0JUVUJBQUlSQXlFeEVnUkJVV0Z4SWhNRk1vR1JGS0d4UWlQQlV0SHdNeVJpNFhLQ2trTlRGV056TlBFbEJoYWlzb01ISmpYQzBrU1RWS01YWkVWVk5uUmw0dkt6aE1QVGRlUHpScFNraGJTVnhOVGs5S1cxeGRYbDlWWm1kb2FXcHJiRzF1YjJKemRIVjJkM2g1ZW50OGYvMmdBTUF3RUFBaEVERVFBL0FPbFNTU1NhQ2tra2tsS1NTU1NVcEpJQWt3QkpQQUN4ZXFmVzNwSFQzT3FhNDV1UTNSMVdPUVd0UGhia08vUk4vcTErcTlKTVltUm9DM2FTWEM1UDE2NnhZZjFhcWpGWjI5cHRkL24ybHJQL0FBSlUzZlczNnlPTS9iU1A2dFZRSC9udEpsSEx6OEErakpMemtmV3o2eGd6OXVKOGpYVVIvd0NlMVpvK3ZIWGFpUFc5REpiM0Q2OWgvd0EvSGRYL0FOUWtvOHZQdUM5Nmt1ZTZkOWR1bFpSRmVZMTNUN1RwdWVkOUpQOEF4N1J1cS82OVgvMXhkRDJCQkJhNFMxd01nZzhPYTRmU2FreHlqS0pxUXBTU1NTUzFTU1NTU2xKSkpKS2YvOURwVWtra21ncEpKSkpTa3RBQ1NRMEFFdWNUQUFHcm5PY2ZvdGFrdVMrdkhXSE4yOUdvZEFjMFdacEhjSDNVWTM5citmdS82eWt1aEF5a0FHbDlZL3JYWm5sK0YwNTVyd0JMYkxoTFgzK1A4cXZFL2NyK25mOEE0Yi9STG5BQUJBRUFjQUowa0c3R0lpS0Nra2trbHlra2trbEtXcjBINng1ZlJuaXZXL3A1TTJZdmRzODJZcFA4MVovd2Y4emQvd0NDTEtTU1FZaVFvaXcrc1krUmo1V1BYazR0Z3VvdUc2dXh2Qkh3L05lMzZMMmZtSWk0UDZuZFpPRG5EcDl6djFUT2NBMmVLN3o3YTdQNnQvOEFNMi85YXNYZUl0TEpEZ2xYVG9wSkpKSllwSkpKSlQvLzBlbFNTU1NhQ2tra2tsTE9mWFd4MXRwaXV0cGU4L3lXamUvL0FLTFY1Ums1VnViazNabDM4NWt2ZGE3eTNHUTMrdzMyTDBiNnlXR3I2djhBVVhqazBGZy82NFcwL3dEVXZYbXFUWjVZYVNQalNra2trR3dwSkpSZTRNWTV4NGFDZnVTVXVuV3Y5YU9sWGRLNmhqWTF6V3NlN0F4SHVhMGJSdmJVTWJKL3JQOEF0RkZqN1A2NnlFbEtTU1NTVXNSSUltRDJJN0h4WHFYU2M3OW85THhjMC9UdXJIcS84WTM5RmY4QStDc2V2TGwzZjFHc0x1aHZZZjhBQlpOZ0h3YzJ1ei9xbklzUE1DNGc5aitiMEtTU1NUVVVra2trcC8vUzZWSkpKSm9LU1NTU1UwdXVZLzJyb3VmUUJMbjQ3eTBmeW1EMW1mOEFTclhsNElJQkhCMVhyelExemcxMzBYZTEzd1B0Y3ZKTEtYWTl0bU83NlZEM1ZIK3c0MS85OVNiUExIU1E4aXhTVFNQRlBRMStUYUtjVnJzaTUzMGFxV214NStGZFFlNUJzS1hSZlVmNnV2NnoxZGw5cmY4QUovVDNzdHlISGg5Z1BxWStJMzk3ZTV2cTMvdVVmOGRXcmZRLzhYSFdNNXpiZXF6MHpFMEpaN1haTHhvZHJLL2ZYamJtL24zL0FLUm4vY1plazRIVDhMcHVKWGhZTlFveDZ2b01FblU2dWU5N3ZkWlkvd0RQc2Vra0Mzbi9BUEdCOVhidXM5TVpsNGpTL1A2ZHZleXRvazIxUGc1RkRmOEFoVzdHWDAvOFg2UCtHWGxEWEJ3RG1tUWRRVjcrdU8rdFArTDJqcWR6K29kSmV6RXpiQ1hYVXZrVVhQSjkxa3NsMkxlLy9DUFl4OVZ2NTlmcWZwVWtrZG56SkpYT3A5RjZ2MGgyM3FlSGJqTjdXa2JxalA3dVRWdm8vd0NtcUxYc2Q5RndkSGdRVWxySmVnZlV1ajB2cS9VK05jaTIyMC9EZDZEUCtqU3ZQbkhhMHU4QlAzTDFMcEdQOWw2Umc0eDBOV1BXSGYxbk45Ui8vVGVpd2N3ZlNCM0xiU1NTU2Fxa2tra2xQLy9UNlZKSkpKb0tTU1NTVXBjYTc2cjUzVnZyam0wWXJXREhxdXF5c20yMytiYXkzWmtla1dnTzlXeS85TTMwdjYvcUxTK3N2MW8vWmJ2c1dDRzJaOEEydmVOektRUnVZQ3ovQUFtUTl2dTJmUXFaL09MVi93QVcvVTdPb2RPejNaVnh1em01UWRjNTBBK202cXRtTWRqR3NZeXI5RmRVeitvOUpzOHZDUVBFZEFRN3YvTno2dGgwdDZSZ2lESS9WcXBIaCtZcVAxazYxYjlWOFptWmo0dE5tRmR1cGZWV0JTLzdTNGJzV3h6MmV5ekZkWFhiWGY4QW8vWHIvUnJlV1o5WStoMGRlNlZaMDYyMzBIRnpiS2J0SGJMR0gydWRYdWJ2WnRjK3V4aURiSTAwZVM2Qi9qS3o4bnFsR0gxYkh4eGo1VmdwYmRqaDdIVnZzT3lsejIyMlhOdHA5VDJQK2c5bjg0dlFTSU1Ia0xnT2dmNHRjM0U2cFJtZFZ5YUxLTVY3Ym1VNCs5eHNldzc2dlVkYXlyMDZtMmJiSGZ6bnFmemE3L25VcEZVYldYRS9XdjhBeGc1UFN1cVdkTTZYajFXMllzREp2eU56bTczQVdlalRWVSt2K2JZNW5xV3ZzK24vQUlOZHN1SSt0ZjhBaSt5K3FkVXM2cDB1K2xqc3FIWk5HUVhNQWUwTnI5YW0ydGx2ODR4djZTcDdQK3VKQlVyNk9wOVV2clhtL1dLWERIcnhxc1ZoYm4rNHVMNzMvd0JHYmhqZDdNZjBtVzJaSDJsbjAvMEZQK0V0V3ZkMFRvZVFXbkk2YmlYRnVqVFpqMU9nZURaWXN6Nm8vVi9HK3J2VDdLbjVOZCtYbFBGbVRhMXdESmFObFZOSWNkM3AxZTczdi9uSHZXK2hmWlFpZW8rMThvK3RmMU56dW45VE4xVGEzOU02amxpdWcwalo2UHJ2L1I0dGxIK0RheHJ2VHBzcS9RK3ovQS96YTdaOGJ6dCtpREErQTRSUHJ4bU53dnF2bVhlb0s3aWFtNGgwbjF4WlhiUjZZZjhBU2ZWNmZyL3lHVitvdVQrcm4xdGZtNURPbjlURFJrV25iajVMQnREM2Y2RzZzZXhsci84QUJXVit5eitiOU5PRFc1bUJORWJSZW5TU1NTYWlra2trbFA4QS85VHBVa2trbWdwTzBnSGM3VnJkU1BJZTVNbmFZY0RFZ2NqeFNVK1NXWDJaTnRtVGFkMXQ3M1d2Y2U3bm5lVWJwL1VjL3BtVzNNNmZlN0d5V2d0OVJzR1d1K2xYWlc4T3J0cWR0K2hZMVQ2djAyenBYVXJzSjRPeHAzME83UHBjVDZMMi93RG50LzhBd3JGVVFkQUVFQWpibzlwMG4vR2IxUnZVYVQxa1VmczhuWmM2aW9zY3pkRzNKL25MWFdOcC93QUpXMy9CZXAvd2E3NXZUZW5XdEZ0WTNzdEc5ajJQM05jMTN1YSt0d25jeC81cThNSkRSSjRDOUgrclZYWGVnOUx4bTF6bHRjQy9KNlZhOE1OWWVYT2FPblh1OWxOeld1WjYrSmYrclcyNy9Uc3g3VURFUzNBUG11R2M0LzBqSGkwMGUzcll5dXR0YkJER0NHam5RS3ZqWnpMOHpOdzloWlpndXJCa3p2cnVyYmRWa04wYnRyYy8xc2YvQUl6SHNRT25kZjZUMUYvbzBYaXJMR2o4SElIbzVMVEFkRHNhN2E5L1A4NVQ2dFgvQUFpbjFEb3RHYmRYbGI3c0xPcGFXVlp1TTRWMmlza1dPb2Z2YlpUa1k3bnQzK2prVldzLzBhVkxpYjFCdTJYVStvczZkanN1Y3oxYkxyNnNhaWtPRFhXV1hQYldHTWM3L1JzOVM5Ly9BQVZOaXR1QU10UHVhWkI4Q0Rvcy9FNkZYVG10ejhuSXllcFp0YlhNb3V5aTBpbHJ4dHQreTQrTlhSalV2dGI3TEwvUzlmWitqOVgwMUxxUFcrbGROZDZlWGtOR1Fmb1lsWU51UThrUzBWNGRHL0lkL21iRVZYV3AwUy9zM3A4YTB0Z0RXU1lqL09YQmRlL3hrWjlmVlhWOUJkUTdBb2I2ZSsydjFHM1BrYnI2L2RVOWxWVzMwYVBmc3QvU1cvNkZhM1cvMng5WU1LK2pjN3BtTytwNG93dHpUYmM4L3dBMyswN3F5K3VtaDBiUHNPTy8vQ2ZyZC84QWdGNWlRNXJpeDdTeDdDV3ZZNFFXdWFkcjJPSDd6SElDSUd3QThscHplNXB4R1hEM050N3JIWE9xZGJ5VzVQVXJ2VmRVQzJtdHJReXVzT081NHBxYisvOEFuMlAzM1A4QTlJcUJMZ056VHRjMzNOY09RUjdtdS9zdVRvMkhnMzlReTZzSEdFMjVCMmc5bXQvd3R6LytEcFo3M29vMjFMNmppM3V5Y1RIeVhDSFgxVjJ1SG05clh1LzZUa1ZSWld5cGpLcS81dXByV01uOTFnREcvd0RSYXBJdWNwSkpKSlQvQVAvVjZUYzN4Q1c1dmlGdTdXZnVOL3pSL2NsdForNDMvTkg5eVRCOTJQNzM0T0Z1YjRoTGMzeEMzZGpQM0cvNW9XYmY5WS9xNVF6SHNPWmozTnpMaGpZMzJmYmVYMmtodXhyYU4vME43UFVmL0xyL0FOSXhKWDNZL3ZmZzVQVStsOU82clFLTTFtN1pKcXRhZHRsWlAwalZaL0svUHJkK2pldWJ0K29CMy9vT3BOOVAvaGFmY1A4QXRxM1k1ZW1XdHJwYTU5d1pYWFdIT2U5NEFhMXJSdWU5emorWXhxcGRJNnYwcnJlSWMzcGp4Zmp0c2RVWG1zczk3TnJuZTIxclhmUnNZNUpkSEhPT2duK0R5blNQcW4wdnBscmNsN3ptWlRETmRsZ0RXTUkvUHFvYnUvU2Y4SmEreGJlNGVJKzlidTFuN2pmODBmM0tzenFQU3JPcE82U3kraDNVV04zdXhCQnNEZjVXbTNkcnY5UGQ2bXo5SWtpV0NValpuZjBjWEx4Y0hOckZlYlJWbE1iOUZ0eld2MnorNFhlNnYrd3E3ZWs0dGJkbU5rNXVJeVoyWStia01iUDlSMXRqVnFabjFwK3IrSjBtL3E0dVpsNG1QYjluZDltYTE3blhTUDBGVy8wMlBkdGQ2bTdmNmZwTFlkV3dHTmpmODBmM0pLR0dRMm5YazhvZWwwUGFXWDVtZmtzSkJMTHM3SWMyUnI5Q3UycEh4TVRCd1dPWmhVVll6WC9UOUpvYVhmOEFHUDhBNXl6L0FLNDlkSHRaKzQzL0FEUi9jcVBVdXM5SjZYa1lPTm11RmQzVXJmUXhXaXZkTHBhM2MrQitqcjMyVk0zL0FQQ0pLT0dSM21UNXRDVytJV1IxajZzOUw2dFljaDduWTJXZnBaRlVIZkdnOWVsL3N0ZC93bjZPMWRvV01CZ3NiSS9rais1TGF6OXh2K2FQN2tsUndTaWJFNitqNWszNmdQMysvcVRQVC9rMG5mSDlxN1l1aDZSMFhwdlNLbk54QVhXMkNMY2l3ZzJQQTEyNlEydXIvZ3ExMGpNM3AxbWRiMDZ1MmwyZGpzYmJmakFBdll4MmpYUDl2OHBudCtuK2tyL2ZVOHZJeE1MRXV6Y3JiWGo0ekRiYy9hRERXOHcxbzNPY2t1bGpuSVVaNmVUajdtK0lTM044UXRmRHljUE94S2MzRjIyWStTd1dWUDJBRXRkNHRjUGFqYldmdU4velIvY2tzKzdIOTc4SEMzTjhRbHViNGhidTFuN2pmODBmM0piV2Z1Ti96Ui9ja3I3c2YzdndmLy9XOUNTU1NRU3VKSmdhazZSNHl2SW5kQzZEZDE3NnhkWUF2NmYwUG9Ud0t2c2J3Mnc1SWMybXR1TGJhMjVyRzJaTmR0bi9BQUhxNC84QWcxNjYwa09CR3BCQkM4dCtzMkJiMHl2SzZWajlad0g5STZ2MVJqOGl0em11eXNleXgyOTc3Mk5PejdQaitsK20zdjhBOEgvZ3ZWc1JVM1ByV3kvcG4xZnhPajlOeU9vWm5VdnJMNlJkUm0zbSs1bElEYkhZN0dzOU5sTHJMcldVMmUzOUt5cTVaLzFkNjM5ZE9sZEd2cXhLTVQ3SDBPOXVKYml2WVgyMzVGOXpxMzA0OWxQcWV2a05zZjcvQUVyYS93Qkg2WHArb3VrR1owWEZ3dXBmV3huVkg5ZTZ0MHJIT01NNnhnYlRYZFlQVHBaaFVWVlYwTWJiYmI3MzFXNUg2UDFQMG42VkUrb3ZSOFUvVnpvdVN4N2JhV091em5pTlg1cmk3RlpiWnVEdjZCVDZ0VFBkNzd2U3Uvd1NTblErdW4xaHQrcnYxZnR6cTI3TTIwdHg4WnVqd3k1N1hQYzl4UHRmOW1ZeXh6UFora3Q5TmNIK3hNLzZ2ZENaZTlyci9yVjlhSEhIeDJFelpWUllBL0tmdWY4QTlxOG4xYTY3ckgvelByL3puODh2U1ByRDBxcnEvUk0zQmZReklzZlJhY1VXQ2R0NHJmOEFaN2Evem1XTmVmcE1XVFpiOVpMdWs5RDZwMERENmZuV053YXArMWsvYUdPc3JZMjl1SmtlclJVeGp0bnAyL3BQVjlSSlR4K2IwZjZ6ZEZ3T2svVnZLNlppNVdLZXFWNUZOMlBjQWNxMkhCMlBhNjEzNlBkVS93QkwxN01lcjA2MlZMMHZwZVoxYk1yc3Q2cDAzOWxXaDhNcSswTXlkN1NOenJOMURXK2x0ZDdkajF4ZldlcGZYUy9xWFEvdGYxZXJxdW96SFc0dFRjbGhGMWphOTNwNy9VZjZXeGpmVjN2Y3VxNkptL1dYTHN0L2JYU3FlbDB0YURTV1hpNnh6cCtpNnVzMk4yYk4zdjhBMGFTbWZYL3JIMHI2dTRiY3pxVmpnTEhiS2Fhd0hXMk8vUDhBU3JjNnYyVk45MXRqMzdQK3VXVnJtL3JKWCswUDhZUDFVcUVtcjB4bHNhNld3R3ZzeTl6bU8rZy9ianMzdFJqOVd1bzlkK3VOM1Z1dlUrbjBycGp6VjB2RWNRUmNLM1RYa09ZUHBZOXJ2MW0zZi9QZm82UDVtdFdlcFVtMy9HVjBXNGsvb3NESmY4VCtzMTYvOXZKS2VoeE0vRXpoZTdGczlYN0xmWmk1R2hidHVxajFxdmVHL1IzZlRXWjlhL3JMYjlXc0N2cURjQitmV2JObHBhN1l5b1IramZjN1piL08yZm8yZTNaL3duMEVSMkhsZE42dGxkUndxSFplTDFJTU9iaTFGcmJXWkZRTmRlWmp0dnNveDdLOG1rK25tTTMxMitwWDlvL1NMTy94a3Z1WjlTYzdZMk43cUcyeHJ0YWJXT2Q3aC93amE2MGxQRGZWUDYzWWZTWFA2aGszTXM2cjFicURSMUsyMnQ3dlR3Z2ZXeUxhM1ZOL25zaTZ4M3RyOVQrWi9tbHRmWHk3NjNzNkxsMldaZUpsL1YvcWI2amlrTTlMSWJYWTV1VGkwaXNzcGY4QVJyOSsvd0JaK3hWcUxlaVlmMWgrcVJ4SzIzTnI2WVg1QXdtTnR1ZmtQcHVqMlVBdisxL2FQb3V1L21iUDBuNlA5SWgvWEhwbVgwMFlPTmwvV0hPdW91eWFiYjZzcHB5RGh0ZnY5UEl5TWl1Nnh0bHJQMDNvMDE3UHRYb1pGbFNTSHVQcXRpL1dYRHdXNFhXNjhLcW5FcXJvdzJZaGViSXJHeHpzaHpuUHE5emY3ZnFyYldGMFBvUFZjUEsvYUdiOVljbnJGZGxmNk91QXpHYzE0OWwyejFjaGxuNzlWbFhwcmRTU3BKSkpCVC8vMS9Ra2xsZmI4ejk4ZjVyZi9JcGZiOHo5OGY1cmYvSXBNWDNpSGFYOHZxNm9KQmtjaGNyOVp2cVQwN05iWG5kTDZkakhxVmVYVGZZeHg5T3Urc1AvQUZtbStYZWkxbG0vMWJmMGU5K3hhdjIvTS9mSCthMy9BTWlsOXZ6UDN4L210LzhBSXBLKzhRN1MvbDlWdXVkQ3F6OGZwL1RNV3V1anBkT2F5L0xvcmExakRSVUxMVzBOb2JzYTcxOGowMnYvQU05VHF3YzNwK1hrMmRPWlhkaDUxaHlMTVcydzFHbklmSHIzVVcrbmR2eGNtUFZ1eC81eW0vOEFtUDUxUiszNW43NC96Vy8rUlMrMzVuNzQvd0Exdi9rVWxmZUlkcGZoL0YxZ2RycGIyTWcvQlVla2RPL1plR2NGajJ2eDY3YlhZalEwZzEwMk9ON01aNWM1L3FlZyt5eGxiLzhBUSttcS93QnZ6UDN4L210LzhpbDl2elAzeC9tdC93RElwSys4UTdTL2wvaE11czRXWmZtZEh5OE90bHI4RE45UzVyM2JBS2JLMzQ5MW9QNTdxZHpYK2szMzJMVDA3Y2RsbGZiOHo5OGY1cmYvQUNLWDIvTS9mSCthMy95S1N2dkVPMHZ3L2k2cXlMZWxkUnMrdG1OMVo5bEo2ZmpZbHROYkEwdHZGbHUwT3JzMWMyMnIvRFYydDJiUDVyMC84SlpMN2ZtZnZqL05iLzVGTDdmbWZ2ai9BRFcvK1JTVjk0aDJsL0w2dXFvMlYxWFZ2cXVZMjJxd0Z0bGRqUTVqbW42VEhzZkxYdFdaOXZ6UDN4L210LzhBSXBmYjh6OThmNXJmL0lwSys4UTdTL0QrS0EvVlBwbFBWK245UzZiVFQwOXVHekpyeUs4ZG5wdnRiZlg2VlRtMjFuMjJZOW01MjkvOWhUNmowUXZmMG12QnFhS2NYcVZlZG0zUHNKdWQ2YkxXZXJZKzNmYm1XV2Iyc2U1OXZxZnpkZXowdjVrbjIvTS9mSCthMy95S1gyL00vZkgrYTMveUtTdnZFTzB2NWZWdFluU2VuWVRnN0RwK3p0QmNXMDF2c0ZEUy93RG5IVllmcWZaS3QvOEF3ZEt0cksrMzVuNzQvd0Exdi9rVXZ0K1orK1A4MXY4QTVGSlgzaUhhWDRmeGRWSlpYMi9NL2ZIK2EzL3lLWDIvTS9mSCthMy9BTWlrcjd4RHRMK1gxZi9RNlZKSkpKb0tTU1NTVXBKSkpKU2tra2tsS1NTU1NVcEpKSkpTa2tra2xLU1NTU1VwSkpKSlNra2trbFAvMlRoQ1NVMEVJUUFBQUFBQVhRQUFBQUVCQUFBQUR3QkJBR1FBYndCaUFHVUFJQUJRQUdnQWJ3QjBBRzhBY3dCb0FHOEFjQUFBQUJjQVFRQmtBRzhBWWdCbEFDQUFVQUJvQUc4QWRBQnZBSE1BYUFCdkFIQUFJQUJEQUVNQUlBQXlBREFBTVFBNUFBQUFBUUE0UWtsTkJBWUFBQUFBQUFjQUNBQUFBQUVCQVAvYkFFTUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFnRUJBUUVCQWdFQkFRSUNBZ0lDQWdJQ0FnTURCQU1EQXdNREFnSURCQU1EQkFRRUJBUUNBd1VGQkFRRkJBUUVCUC9iQUVNQkFRRUJBUUVCQWdFQkFnUURBZ01FQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJQL0FBQkVJQUdRQVpBTUJFUUFDRVFFREVRSC94QUFmQUFBQkJBSURBUUVBQUFBQUFBQUFBQUFBQndnSkNnSUdBUU1GQkF2L3hBQThFQUFBQmdJQkF3SUNCd1lEQ1FBQUFBQUJBZ01FQlFZSENBQVJFaE1KSVJSQkZSWVhJakZXbFNOUllZSFIwd295Y1ROVFlvS1JrcUhCNGYvRUFCd0JBUUFDQWdNQkFBQUFBQUFBQUFBQUFBQUJBd0lFQlFjSUJ2L0VBRDBSQUFFREFRWURBZ29KQkFNQUFBQUFBQUVBQWhFREJBVUdFaUV4QjBGUmt0SVRGQlVpWVhHQmthSHdGaGN5UWxKVVZXSnlJOEhSNFRPQ3NmL2FBQXdEQVFBQ0VRTVJBRDhBbTQ0WGo5SENJNFJINGNJc0RHNmQzN2lrRlE0OXZzUW9lNG1FZmtBZk1SOWc0U1UydTdibGFvNDVmTHhkMjJOdzNBeWpZd2tjeGF0M2FTVWszTUhYcVZSQnFaVTVUZXcvZE1BRDdjaVF1Y3NtR01SMjVvcVdTdzFYTlBQSVFQZVlDMEpEMUdOR25LcFVVOXBNU2xPY2VoVE9KUjQxUy9tYzdZQ2gvTWVKSFZianNFWXVhSk4zVlBjRC93Q0ZPT3gvbDdGZVdHaDMyTU1sVVBJalZJbmtXVXBkcVpXTlJ1VVB4TXFraXFaUk1BL2Vjb2NsY0hiYnV2RzdYWmJ3czc2Ui9lMHQ5eElnK3dwUkNtQVE2L0w5NEI3Y0xUV1hDSTRSSENJNFJIQ0k0UkhDSkdNOVo0eHhyaGpHdzVZeWxOZlJGWWdVd1NSYnR5RlhtckU5VkEzd2tYR054TUFydTNCaWlVaE9vRktCVG5PWXFaRG1BWUM1SzZMbnQxKzNneTdidlptcU81OG1nYnVjZVRSL29ha0tvWHRwNmpHd08xa3RLeDdtZmtNYzRsVmNHTEQ0cHFNb295ajFFQU4rek5OdkUreFdTY0NIUVRpcUlOeW1FUVRSS0FkUnBMaWRsNlZ3M2dpNXNPMDIxR01GVzA4NmpoSm45Z09qQjBqenVwVEJreUFtQWxUQXFRQ1BYdFNLQkEvMTlnNWl2c1RKM1haMU4vdkZQKzhlRkdVTDFxN1liRFQ1eGpaYWpPek5Xc1Vhc0M3Q2Zya292QnpUSTVSNmdaTjBnWWloUkQrQnVnL01PTmVTcnIwS05wcEdoYUdCN0R1MXdCQjloa0t3eDZmSHEyekZoc0VEaEhiQ1paTHU1bFpPSHBPYjNKVTQ0NnpzNWlwdG8remdRQ3BkVmpDVk5LVEtCUDJoaWxjRis5NXdzWStkQ3VsTVo4TnFkQ2crOXNPTk1Oa3ZvalhUbTZuejAzTE5kUHM5RllnQVJBUklZQktZb2lCaWlIUVNpQTlCQWVXTHBZYmFMTGhTamhFY0lqaEVjSXNUZGUwZWdDSS9JQURxSS95NFFxb1A2dld5OGptalpxV3hiRXlKejQ2MS9YVnAwYXlRVzZzcE93R0tRWitTTUFleGprVTdXQ1poOXlwc1Q5T25rTjFxZTZUQzlKOE5iaFpkZHdOdDlWdjllMHc4bm1HZmNiN3ZPUHBQb1VWQUIwRG9ITUYyS3VlRVhIVVA0LzhBUWVFWFBDTHJVSUJpaUFnQmdNSGFZcHY4b2dQc0lmOEFrZUU5S3VMZWxEczFLN0U2d3M0MjN5S3Nwa1BDMHNURzFra25hM21mempFcllpOERJTG1IN3hsRHRlNXNvY2ZjNmtlY3dpSW1IbHpESVhtUGlMY0ZPNU1RR3BabXhRcmp3alFOZzZZZTBlak5xQnlEbzJVbjNNbDhHamhFY0lqaEVjSXNSVkZGUk5VcEJVTWtjRmdUS1h1TW9KQjdnS0FmTVI2ZE9uOGVUR2tyRWlkRitlamNaZDlZYnRkSitVTXFlVG5iaExUVWlaY1JGWVYzVWk1WFc3K3Z2MTdsREFQWDM2aHpXT3BsZTFMTlNaUXN0S2pUK3kxalFQVUdnQmEvd3JsaWIzNkZEOFRDQUFIOCtFVDY4L2FiM0RER2wyanV6OHRBS01ZdlpqNjhHZHZoUlVJc1VHY3VpdFZ2aVJFd2xLTHVLVGV1a08wcEFNaWtJL2VIcVBNQTRGNWFPUzJLbEIxT3owNmgrOVArdmdtS2dJRCtIK25NMXJybmhGT3o2RFV2SW81ZzJGZ0V4V0dIZjRzaUpwMlVPNFc1SFRTYkZCdWMzeUF3cHZISlErWWdCdjNEeXhrNnJxSGpCU3BtNjdEV1AyaFVjQjZpeVQ4UUZaMzVZdWhVY0lqaEVjSWpoRUFmeEhJdDA2aWlvVlVBNmRldmFZRGYrdUZCRWlGUTEzQm95ZUxOcXRpYU1KU3RHZGZ6Qk9Bd0JVUVJUSzFldlR5TFBvSWowNkNpOFM2Y29jSWNWNjl3MWJQS0dIckRiQ1pMcVRKOVlHVS9FRk45alVIRTFJTkltRVFXbXBaK3FDREdKaGtUVEVxOVVNUFFwRVd5SUdWT1lSRUFBcENpSTlmdzVDNXdha0FicXdWNmJQb0k3QWJIMityNUoydnFOaHdQcmd3ZW9URWpXN1FnYUJ5NWw1dVF4VlFqWStLTjBjUmpOeUFBUmVSZWxTVUJJNXdiSW5VTUNxZFQ2clc2TjNYSTJXN3ExWndkVUVOK1B1VnlyYWZTL0NlMk9zVmcxWHZNQTJnTWZPNEZuRzBaZXJNRUd6N0U3eUlSQktBa29GTXdlTkk4Y0JDSmtTSDdpcmN5eUIrcEZURHpXYTh0ZG1DNTJ0WnFkYWw0RTdENStmOEFDL1B4M1U5Sm5jN1NDZG0xYnJqU1l5TGlkazRNTVBuWEZjTTZzK1A1SnNKaDhTa2dta1U3cUlYRW9mZmJTQkNGSWJxQkZsaTlEanRzcU5mcUY4MVhzZGV6bnptNmRWR2FWMDJNYnNLNmFuVUEzWjR5T1V6S2RRL0V2YjNkZXY4QUQ4ZVpyV1ZrdjBGcVFMZW5iSFpMV1JBQmxyVkJZL1lMaVgzTW5IczNVbzZLVWYzZDhpMTYvd0FTaHl5bU5DVjBaeGd0ZWEwMkd3ZmhhOTUvN0VOSHdhVllONVl1bWtjSWpoRWNJamhGOEVsSXNZdGcra3BONDBqbzJPYUtQNUdRa0hKR1RDUFFSSVpSWmRkWTRnUk5OTWhUR01jNGdVb0ZFUkVPRkxHdnF2Rk9tQ1hFd0FOU1NkZ0FOeWVRNXBvZWhPbE9zKzRXN0diL0FGRW1kenFXWjhZVloyenhKV2FKOVZXbG5vRnJzLzFVYnNySklTeFpKcVpOeWl6UWN4Z3N4YkU3VE9GRHErWVNwRkliU3RENGRrYnV2WGZDKzZMd3NtRzZOQytLUnB2cHVlQTEwVGxKek5rQW1OeUlPdW1vVXF1NTlZbTlZZFJzMDVnMG14VGpxbDVxeFJXVnNpVldEb0dFNEZZTGNWdDJwU2JGeXdhdFUzQ3lmd2lxenp0YW5JdUtzVTM2Q29RRG9xYTRPWWdQT2k3R3ROTTBhUnFXZHZuZXI1K2Zjb3pmUUgzdzNaM0pWMktqdG5KUjNrdWowTnREdjZmbHlRcGpLcHZXOHkrY3VrM3RkTXV6Ym9OM2dmREprZWdYc0ZWcjJkcGo5cXlaUXpxc1kySVdyZHRwdEZZbHRUVUJXUWxoVUFweFRTODZnSmlLYUFLQWlLNWdBUktuM2o3RjdoNkY3aDlnN3VvL2h5bGN1NHdGVDEwSDlUMzFSZG52VW9QcmxrYVNjMCtpVE51bDIyVktCRVlkam8xL3IxQ3dDeTc1WWlEeGRENGhBeWdzbThPcTVrenVmT1dYT29rbUszZ01UWWV5bTFtWmNGUXRWc3JXbndUdHAxRURTTmZtVlpVMk0wZzFvMmN4bGtUSFYveFRSWW8yUjZxNnF6dklGUG9GZGlzbjFnams0TGZGUTh5b3dVVlFjSnFCM2xVSHU2OXh3TjE3akR5cHRSdzFCWEoxYkhRcXR5dUgrZG8vdjZwOVFVQytsR0tNWjZjdjgxYU1JNWJxMTJ6SmlmTkZnc05saTBpL1Fkb2xJZVJUalhOZmxEUngvWVFVaWpScDF3YW5XVGJxcW5JWXdkQTY4aFNjSE1CQzhuY1didXZPbGlSMXNyVVhDekJyR01mdTBtQ1NOSmd5NDZHSjVTRklHQTlRQWY4QTV5MWRWcm5oRWNJamhFY0lvTVBYTHk3YmFmaGZFK0s2OCtkeGtKbDIyU2E5M1Zhbk1pTXd4Z203SlZDTVVPQSs2S3JoOG11cWwrQ253YVFHQVM5UUhDb2RGMnp3a3UyeldtOUxUZU5ZQXZvdGFHVHlMeVFYZXNBUUR5a3FNYjAzUFZsenY2YmkxM2c2VlY2bGxURmVSWkJHZnNtTkxxK2R3cUxXWGJ0eXRFNWVMazJvR1diTG5RSWtnc21kTlZGWk5CTHFRcDB5cWMxM3NEOTkxNkpzdHJxV1lFTTJLdWMrblY2aUZVOVRURkNkb3FsNFBoTE50RFRWWlpnd2RCcnM3QTVoaE00UDhET3hxenhJSExtTGNwZU1wSEpTaDRWaUtvckFRNEVGVGdiMHUyMzJtcTE5a3RyNkxRQ0lhMWhrOGljd08yeSsvd0FPWWh1aXoyZDlLOGJycDJtb1NDQzk5UnBhSWlCa2NBUWQ5Uk9zYkJTTlpCdTBiaExHVXhkNWxoSlRNRlMycldRdEswR3dib1BFR1NqeG8zbHB0VnNtVXFmalpvckx5VHNFaTkvZ1pMaVVwakFBRHZVYWIyVTIwM3VMbkFBRnhpWEhxUU5KSjZhTGpyWFdvbXErdlNwaGpDNGtOQkpEUVRvQVRKaG8wa21UejFYeVduTlZHcjBwaTJCanBXT3VrNW1DMU40Q2tSTk9tbU0wNmsyQmtGbnNqWXk5aW9nYUlqbWlCbkxoNlFSVDZLSUprTVpWZEVoN1NEcUR5V3ViUXdaY3NuTnQxK0s5dTAxUDZUWFVtMjF4bktLWk5nWlNiZlFKNCtOTElKb0IzZ3ZJdWxrVEdNVnVRcHVoMVRnUklnR0g3b0FJODRtOEx0dEZ2ZTExRzExYUlBSWltV3daNW5NMDZoZlJYVGZWaXVpbFVGcXU2aGFjeEJtcUhrdGdSQXlQYm9kOWlaMlZYZmIzL0VubzRmeTVkTVQ2cll4b093RklwY01qV0dPZEwzYTVSaXp0RmhRQlpPUmZzbUxKSWliNk1UUDRVMDFRT2g4VWRCZFFoL0NvaVllWHMxbGRTb01wMUhseEFBSk81MDNNUUpPNTBqMEw0NjhiNjhOYTZsV3pVbTAydWNTR3RuSzJUTU5tVEEyRWsrczdxcWhMN1A1cm1kalgyMjA5ZFpDVnpuSVpCSEtVdmJnSVJncEl5QXFGTXFpQ0NRQW1tME9nbURMNFVnZU1yYm9sMEVvYzNXK2Jzdmxid3NkbnZheTFiRmJtaDFPcTB0ZDdlbnBHaEI1RUNGZkdnNUVaaUhpSmo0WVdZVEVPMG1QZ3plNW1meGJaSno0UkgvZzhvay81ZWJDOFpWS2ZncXI2VXpsSkU5WU1UN1lYcmNMRkhDSTRSSENKanUrK25yRGNyQ1kwWnZLTXE1ZnFwTWZXN0d0bGtVanF4akovNFROM0ROOEJBRlFHcnhFM2lVTW1CakpuVFJVQXB2R0pEUTRTSVgxV0Q4VFB3dmUzamJtbDFGNHkxR2pjdG1RUnl6Tk9vbmNTT2FxOVMzcGw3MnhGbU5WUjF5dU1vdUxrVVVaMkNlUmtyVG5CZTd0Qllrc0RrcmNxWSt3OXlva01BRDdsQWZibFJZN1pkLzA4ZVlScVVQR1BIbUFkSEJ3ZVBSbHl6UHFsVDcrbmY2YjdqVjZweVYyeUZZSGNmc1RaSERaN0ZXM0dkaVVpcHJDeURZcWdwTllXWklYOW80V01zb0w0VEVVWnVTQVJ1ZEZ3aVUza3pEQkVPMVhWbUl1SnQ0VnIycFdqRGozVTZOR1l6RC9rSjN6dC9EQWhyVHFOVG9UcE5mVmRzZG9xU2lqRzIyb1l1ei9HdHdLaW5ab3llVndQa2x5bUE5Qk85WUMwZXdiaFh0RWVwMnBvOU00aC9zRWdFUURYZFpSOXdyN202T09Wa2RTRk8rN0k1ci94VTRjMzE1U1E0ZXFTdkVwMnc3Zkh6MmRsc1ErbnBqbkYxbnNZQW5OVDZXVUtUVEdzd1VWQlZINDF4Q1JEbDZxbUNuYXA0U3BkcGpDSnVoVEFCaGcyZDUwekxsMzhaOEkwRzU2RktxNTNRVThzKzB2V2xaQ3NXVzg5TnhqczYyYXZPYU1vcVJaeGhERzBhNmhjV1N3a04zcGtzTHQwb2VTbmlGRUNqOE02TTJqekdLVXhtQnhLVVMzVTZMV0dkeXVzY1U4WEw4dnlrNngzWTN4YWdkQ1FacUVmeUVCdnB5aWVwaFZRZHVmU00yQng1a0t5VG12ZEtmWmR4Sk5TaThyWFkrdVBHNjkzcHlLNmdxL1JqNlBWVUlvdVZ1SmhUU2ROdklDaVJTZDVVemdZQmx6VE9pK3p3MXhLdWEzV0psSytxb28ybG9BY1hBaGo0MHpOSUJBbmN0TVFaaVF2UjAyOUkzT3Q3eUxXN1RzZlRIbUtjVDF5V1FtWml2V055Z1M3MzBHeWhWaVJqZGdrYzVtemRZeENsWGN1UklJSkNjcVpEbU1BbE5ZWmtxdkUvRW02TEhZYWxudU9xSzFwZUNBNW9PUmtpTXhKaVNPUUU2d1NRRmE3SVVDLzVTRVRLQWRDcHBsN0Uwd0QyQXBTL0lBQUFBQStRQUhMZVM4N2haOEtVY0lwSy9zdng1K1NLeCtsSi8wNVJKNnIxdDlFY0xmcDlIc0JhN2JxaGoycDFleTJjbUtpMm85YnJ6MndGckZNcWljL2NMSUxKc3E1Q1BpV1BjVDRsNjQ4WGhidCs4dmtWVVRMM0IzZGVKUFZRY0pZV0FueWZTN0FVUzJwSHE1K25QdDdrKzZZeXJOUXN1TFgwRE94TldxRHJNbUpKU3N1Y2d5VGhnNWQyRnNSdTNhT1VZc0s4czJGbytWbEhTUk8vdlVLSUlrOGhzaUhBVEtvYmhqQ2puUjVQcGRnSngyaXU0bW8yL2RLc1Y4eFhVNlZBUnJmSjFtcFZCZ3JOWTY2dmZzbndsYmNJdEJ1VEt2SU9Ca0dzYThXT3VWSWp0RUZDZzFNWXc5cGlqeURtRzVWbFBDdUZLbTEzMHV3RjUrdys5V2pHdE95T050V0w1QWhLWlJ1OU1sc3FYSUtqVVcweFhjQlV5R2pIc3E4dDk2ZUdXSjlIeHdvc0hCaUFtVlpjNVFLZnhkcWlJcWhtSWtLSDRXd3ExMlh5ZlJuK0FXdmFsN3Y0QjNPeVJpR280aTF5bjQrcVpVMUttOXVWYmJkNHlPalpPcHdyVElLbVA2NjBkeGpRN2t2a25GV0V2SW9tTTRJWkZxelM3MHhPb2NxVWtPQWtsWXN3dmhWN2dCZDFMWDlnVWxac1pZOEFCRUtQV1JINUZDS1NFUjVqbVBWWGZSSEMzNmZTN0FUUWRYczY0TjJwdW0yOVRwdUgyc015MU0yVWZheXpGbWxHN1IxRzMyV2lvMW05azNjZW1Rb0hSVGJyT2pOaFNWRTVoQXFhbmNIazdDU1M0YzFXM0NtRm51TVhmUmdmc0NVUGFUSVd0bW9Hdm1WTm1NejFtRGk4WllpclJyRFlGbytCUWRTMG9xZFZOdEh4VWNrb1pOTlY4L2RMdG1qWkk1eUZNcTRLSmprSUJqbEF1SmdGWlB3bmhWamN4dStqMkFrYXpodGZxRHIvck5aTmk4Z1F0QWdaT0MxK2NaL2E0RHNOa3JkYnpoTW90MkNMaFNCU2lWSFJqZlNLVHh3bEZ1QVNLcVJ1N0JRcHhIeG1EZ1ppWWxZT3d0aFZyY3h1K2pQOEFuUllzWllueXJqcWo1RWlLTFVtcmE1VktNc3lzUVE4ZE9PcTJ1L1lObnEwVTdjdFRuUUYwek00RnV1VWh1Z0tJbTlnOXVSSjZxeG1FOExPYUQ1UHBkZ0pRZnN2eDUrU0t4K2xKLzA0azlWbDlFY0xmcDlIc0JIMlg0OC9KRlkvU2svNmNTZXFmUkhDMzZmUjdBVys4aGZSTFhyV1NSVXJkalRocE5yQ1RDbGJrRTRlY2ZIOGJLRWVHWk9DdEhxeHZrbTNXRkpZNC9JcVJoNDVxSGJLbE5wWWZJdDBVdlhwZE05aDlmTmFUU3VvTlcwK2w1dUwzT2pjN3VNbHk5eXN0bnYyWDhpMEt0VjByaHJPeXRsalFNMFBJeXJ0b2FBYk5VMEhTaGhWVFFHdzZhbGFESlBtVEhMZjNwNnZvbStuNXFGY3doZDVzSzQycE5mb2NQdG5rNjdZSmRzRkZKVElkWmlhNDNVeGRSWUIvTUxuTy9FaG80YkJiWkpFNmhVSHoreXhCeFNFalVwU3c0bllxMmd4cE9jRG1WdXViZERvUW1WZlZhWnpXSzg5YlZXWFk3TjJGY3pYcU93czlxOEJzRGM4UlNSSkdUazhiTVpDWWZOa0MxMXROVWxPT1dTajFFbnk3Vm8wS0pUaWtCaUFUb3NTeVhPbldlblJOb3diVk5XYTU2a3VXcjdSZlE0M3BveG9mRE9MSlNtWW5wR0dZN0hpbUxyT3BaTHM2Zlc2WWprTG8yaVVHRWdteWkwMmgxanJOMUQxMTJJdDBqSmlkWVppQ1ZBeStFSnluNTlxbXkyYWl0ME5nTjJkZGNHNGlsTWs2ODZrWWVDSjJTMmoyQXJya3RlbE00UGlTQ293R0o2ODlBVEdVUlVGa280bkFJVVV3YnVpRVVQOTFGTnhpSWlWZTRQZFVEUm9OeWY3SnNtaEZHeTlVYTNzVGx6RmpxU2ROa2ZXMDJGdVdjTVh3YVNTcnJMMU1keWg2ZzZSYnBxQUFua29SVnRIVFRCQk5Rdm5DTFhiZ1l4MWlFNWtZMEI2TEJqWENYRHFVaVByeDROeHJzbGtmMG42eGtMS2R3MXhxMlR0bVpXcFhQTTh4YkF4OVdhSEFSMENTMmtSbFl5Vk9TSVRsVlhyQnVaaXBLcCtSSlJBeVlsTUFtVExMT2F4dEprQWhRVjJtdTNpemVqaGhpL1pIcEd0dXlGZXova3VOc0JzL2JSVEV2V05qY0pYYTU1VUdYeUNsVVhZMWdHeDZzN1NCRldZbXlQbHlObDdFOU1LeDFDdG1mSkgybFVSTEFUOC82VjFuUkRIZDJ4ZGhBS2phZGI5UzlWNFJPek9wekhtS2RPTG04dldNRTRpUVNRYy9TVG1SV2pXS1N6NTBzWlV4bG1pYXFLcVJFRCtVUkh0TFVkNVc1U0JEZFlUMmVGYWpoRWtuMjQ0djhBellsK2x2UDdYTXNqbDhWOVltRHZ6ZzdGVHVMcVd6Vmlwd21vaXRaMnl5U3laa1ZVVm9sMnFpc1F3Q1V4RGtGRVFNVXdHRUJLSUNBZ0lnUHNQR1IzUlFlSWVEdnpvN0ZUdXBpVUhxOXBYUjdKdGZZOFRPNERDaHR0OFBNc1NXeU94RGl1Rm9TRkVNM2lKNkVlV0N1TE5JdE5acy9rRzgyUXpvZ21GdW92RnRsaFNGVVRuR2NydG9WWDArd1pKSXRvRS9zcWQxTFZpZXI2MllJZXQwOE4yeDNqK29LVnFCcms3amlJaVRMMG13R3JNQzFyTU5KaWlxME1xMGZsalkrTmFPWExOUlA0MGtXejg1VEhTOGhoYTQ4bGszaUJnMW4yYmFJL2hVN2lVeFcxNEtVeVMzeXVXek9rTGdsajlYR1RwWnNEOUdMbUlnMG1TWWJwUG1maDdGMUdqdjRsUnFzWVFNaUVrOUtIVUZ6QUVaWExJOFFzR2s1dkhCUDhLbmRXbnc1c0t3bXdOKzJFWjVKbFBwbkkrSWF4aU93MUZTRTdxd0tkVGxyRkp4Y3NrcjhMOFdEcnRzejlvZFB5K0FVeXBtOGZrRHVCbGR0Q2ZXRmc3Tm04ZEhZcWQxTFg5dCtMZ0VwdnJTZ2Z0TUFpVThXOEVwdWc5ZWcvc3Z3SDU4WkhLVHhFd2QrZEhZcWQxSVByMUc0RzF4cUZ0cDlXeVpicldoZGN5WEhPRS9PMzlSZWNzcjJZdXMwck55WlZIS2JSSXAwa2xGUVNSRXhPL3dBYVJlOHh6aVk0c3JqeVVNNGc0TllJRnRIWXFkMUtoYTd4cnhmWW9rRGZXbEh2OWZJK1JrdnE3ZktDbmM2OGRkdWJ1UVdNeGV0RlVST1FSSHRQMjl4ZTRlZ2gxSGdOY05RanVJT0RYYjJ3ZGlwM1UxMXBnalQ2QXd6aTdCZEluWHRNcGVLTFhTcDJFY05JMDA1WTVTTm90dVF1Y1JXbnI1MDBPY1l3WHJkSWhra2ZHWXFTU1lGSHFYdUdjcnBsWUhIK0RNdVVXMGRpcDNFNk9yM3JYeWtOSE1mUy9xeFVZOTQ2RjY2ajZ6VlZZT1BWVkVPM3Y4Q0tCVXkrM3NCU0ZBcFE5Z0FPUmtjZDFZT0lXREJ0YkIyS25kVzBmYmppL3dETmlYNlc4L3RjWkhLZnJFd2QrY0hZcWR4SDI0NHYvTmlYNlc4L3RjWkhKOVltRHZ6ZzdGVHVLUExseTh1STRSSENJNFJIQ0k0UkhDSTRSSENJNFJIQ0k0UkhDSTRSSENJNFJIQ0k0UkhDSTRSSENJNFJIQ0k0UkhDSTRSZi8yUT09Ci8vIEBhdXRob3IgICAgICAg6L2v5Lu25bCP5aa5Ci8vIEBtYXRjaCAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly95dW4uYmFpZHUuY29tLyoKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3N3ZWV0YWxlcnRAMi4xLjIvZGlzdC9zd2VldGFsZXJ0Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2xpcGJvYXJkQDIuMC42L2Rpc3QvY2xpcGJvYXJkLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbG9hZC12YXB0Y2hhLXNka0AxLjAuMC9sb2FkdmFwdGNoYS5taW4uanMKLy8gQHJ1bi1hdCAgICAgICBkb2N1bWVudC1pZGxlCi8vIEBncmFudCAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgICAgR01fYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZGVsZXRlVmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9saXN0VmFsdWVzCi8vIEBncmFudCAgICAgICAgR01fb3BlbkluVGFiCi8vIEBncmFudCAgICAgICAgR01fbm90aWZpY2F0aW9uCi8vIEBncmFudCAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGNvbm5lY3QgICAgICBsb2NhbGhvc3QKLy8gQGNvbm5lY3QgICAgICAxMjcuMC4wLjEKLy8gQGNvbm5lY3QgICAgICB5eXh4cy5jbgovLyBAY29ubmVjdCAgICAgIHNvZnR4bS5jbgovLyBAY29ubmVjdCAgICAgIHNvZnR4bS52aXAKLy8gQGNvbm5lY3QgICAgICA0Mi4xOTMuNTEuNjEKLy8gQGNvbm5lY3QgICAgICAxMTkuMjguMzMuMjMKLy8gQGNvbm5lY3QgICAgICAxMTkuMjguMTM5LjIxNAovLyBAY29ubmVjdCAgICAgIDQ5LjIzNC40Ny4xOTMKLy8gQGNvbm5lY3QgICAgICA4Mi4xNTYuNjUuMTc5Ci8vIEBjb25uZWN0ICAgICAgNDIuMTkzLjEyNy44NQovLyBAY29ubmVjdCAgICAgIDgxLjcwLjI1My45OQovLyBAY29ubmVjdCAgICAgIDQ5LjIzMi4yNTIuMTI2Ci8vIEBjb25uZWN0ICAgICAgODIuMTU2LjE1LjE0OQovLyBAY29ubmVjdCAgICAgIDU5LjExMC4yMjQuMTMKLy8gQGNvbm5lY3QgICAgICA1OS4xMTAuMjI1LjIyCi8vIEBjb25uZWN0ICAgICAgNTkuMTEwLjIyNi4zCi8vIEBjb25uZWN0ICAgICAgYmFpZHUuY29tCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBsZXQgZ2xvYmFsRGF0YSA9IHsKICAgICAgICBzY3JpcHRWZXJzaW9uOiAnMS4zLjcnLAogICAgICAgIGRvbWFpbjogJ2h0dHA6Ly84Mi4xNTYuNjUuMTc5JywKICAgICAgICBkb21haW5COiAnaHR0cDovL2JkLnl5eHhzLmNuJywKICAgICAgICBkb21haW5DOiAnaHR0cDovLzgyLjE1Ni4xNS4xNDknLAogICAgICAgIGRvbWFpbkQ6ICdodHRwOi8vNDIuMTkzLjUxLjYxJywKICAgICAgICBkb21haW5FOiAnaHR0cDovLzgxLjcwLjI1My45OScsCiAgICAgICAgZG9tYWluRjogJ2h0dHA6Ly8xMTkuMjguMTM5LjIxNCcsCiAgICAgICAgZG9tYWluRzogJ2h0dHA6Ly80OS4yMzQuNDcuMTkzJywKICAgICAgICAvLyBkb21haW5IOiAnaHR0cDovL2xvY2FsaG9zdDo0ODgxOCcsCiAgICAgICAgY29zOiBmYWxzZSwKICAgICAgICBwYXJhbTogJycsCiAgICAgICAgZG93bmxvYWRpbmc6IDAsCiAgICAgICAgc2VuZGluZzogMCwKICAgICAgICBzdG9yYWdlTmFtZVByZWZpeDogJ3NvZnR4bV9zdG9yYWdlTmFtZScsIC8vIOacrOWcsOWCqOWtmOWQjeensOWJjee8gAogICAgICAgIHBhcmFtRG9tYWluOiBgaHR0cHM6Ly9zb2Z0eG0ubGFuem91aS5jb21gLCAvLyDmlZnnqIvot7PovazlnLDlnYAKICAgICAgICBwYXJhbURvbWFpbjI6IGBodHRwczovL3MzLmJtcC5vdmhgLCAvLyDmlZnnqIvot7PovazlnLDlnYAKICAgIH0KCiAgICBsZXQgZ2V0QXBwU2V0dGluZ0RhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc2NyaXB0VmVyc2lvbjogZ2xvYmFsRGF0YS5zY3JpcHRWZXJzaW9uLAogICAgICAgICAgICBwYXJhbTogZ2xvYmFsRGF0YS5wYXJhbSwKICAgICAgICAgICAgc3RvcmFnZU5hbWVQcmVmaXg6IGdsb2JhbERhdGEuc3RvcmFnZU5hbWVQcmVmaXgsCiAgICAgICAgICAgIGdldERvd25sb2FkVXJsOiBgL2JkL2dldERvd25sb2FkVXJsMi5waHBgLAogICAgICAgICAgICAvLyBwYXJhbVVybDogYCR7Z2xvYmFsRGF0YS5wYXJhbURvbWFpbn0vcGFyYW1zLmRhdGEubG9jYWxob3N0YCwgLy8g5pWZ56iL6Lez6L2s5Zyw5Z2ACiAgICAgICAgICAgIC8vIHBhcmFtVXJsOiBgJHtnbG9iYWxEYXRhLnBhcmFtRG9tYWlufS9iMDFucWM3eWpgLCAvLyDmlZnnqIvot7PovazlnLDlnYAKICAgICAgICAgICAgYXJpYTJEb3dubG9hZFVybDogYCR7Z2xvYmFsRGF0YS5wYXJhbURvbWFpbn0vYjAxbnFjN3lqYCwgLy8gQXJpYTLova/ku7bkuIvovb3lnLDlnYAKICAgICAgICAgICAgYXJpYTJDb3Vyc2VVcmw6IGBodHRwczovL3d3dy5jbmJsb2dzLmNvbS9zb2Z0eG1tL3AvMTM5NzI2NzguaHRtbCNhcmlhMmAsIC8vIEFyaWEy5pWZ56iL5Zyw5Z2ACiAgICAgICAgICAgIGlkbURvd25sb2FkVXJsOiBgaHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29mdHhtbS9wLzEzOTcyNjc4Lmh0bWwjaWRtYCwgLy8gaWRt5pWZ56iL5Zyw5Z2ACiAgICAgICAgfQogICAgfQoKICAgIGxldCB0bXBEYXRhID0gewogICAgICAgIHJlc3BvbnNlOiAnJywKICAgICAgICBwd2Q6ICcnLAogICAgICAgIGZzX2lkOiAnJywKICAgICAgICB0b2tlbjogJycsCiAgICB9CgogICAgbGV0IGNvbmZpZ0RlZmF1bHQgPSB7CiAgICAgICAgc2F2ZVBhdGg6ICdEOlxcX19lYXN5SGVscGVyX18nLAogICAgICAgIGpzb25ScGM6ICdodHRwOi8vbG9jYWxob3N0OjY4MDAvanNvbnJwYycsCiAgICAgICAgdG9rZW46ICcnLAogICAgICAgIG1pbmU6ICcnLAogICAgICAgIGNvZGU6ICcnLAogICAgfTsKICAgIGxldCBnZXRDb25maWcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8g5LiK5qyh5L2/55SoID4g5bqU55So6YWN572uID4g5Luj56CB6buY6K6kCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc2F2ZVBhdGg6IGdldFN0b3JhZ2UuZ2V0TGFzdFVzZSgnc2F2ZVBhdGgnKSB8fCBnZXRTdG9yYWdlLmdldEFwcENvbmZpZygnc2F2ZVBhdGgnKSB8fCBjb25maWdEZWZhdWx0LnNhdmVQYXRoLAogICAgICAgICAgICBqc29uUnBjOiBnZXRTdG9yYWdlLmdldExhc3RVc2UoJ2pzb25ScGMnKSB8fCBnZXRTdG9yYWdlLmdldEFwcENvbmZpZygnanNvblJwYycpIHx8IGNvbmZpZ0RlZmF1bHQuanNvblJwYywKICAgICAgICAgICAgdG9rZW46IGdldFN0b3JhZ2UuZ2V0TGFzdFVzZSgndG9rZW4nKSB8fCBnZXRTdG9yYWdlLmdldEFwcENvbmZpZygndG9rZW4nKSB8fCBjb25maWdEZWZhdWx0LnRva2VuLAogICAgICAgICAgICBtaW5lOiBnZXRTdG9yYWdlLmdldExhc3RVc2UoJ21pbmUnKSB8fCBnZXRTdG9yYWdlLmdldEFwcENvbmZpZygnbWluZScpIHx8IGNvbmZpZ0RlZmF1bHQubWluZSwKICAgICAgICAgICAgY29kZTogZ2V0U3RvcmFnZS5nZXRMYXN0VXNlKCdjb2RlJykgfHwgY29uZmlnRGVmYXVsdC5jb2RlLAogICAgICAgIH0KICAgIH0KICAgIGxldCBnZXRTdG9yYWdlID0gewogICAgICAgIGdldEFwcENvbmZpZzogKGtleSkgPT4gewogICAgICAgICAgICByZXR1cm4gR01fZ2V0VmFsdWUoZ2V0QXBwU2V0dGluZ0RhdGEoKS5zdG9yYWdlTmFtZVByZWZpeCArICdfYXBwXycgKyBrZXkpIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgc2V0QXBwQ29uZmlnOiAoa2V5LCB2YWx1ZSkgPT4gewogICAgICAgICAgICBHTV9zZXRWYWx1ZShnZXRBcHBTZXR0aW5nRGF0YSgpLnN0b3JhZ2VOYW1lUHJlZml4ICsgJ19hcHBfJyArIGtleSwgdmFsdWUgfHwgJycpOwogICAgICAgIH0sCiAgICAgICAgZ2V0TGFzdFVzZTogKGtleSkgPT4gewogICAgICAgICAgICByZXR1cm4gR01fZ2V0VmFsdWUoZ2V0QXBwU2V0dGluZ0RhdGEoKS5zdG9yYWdlTmFtZVByZWZpeCArICdfbGFzdF8nICsga2V5KSB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHNldExhc3RVc2U6IChrZXksIHZhbHVlKSA9PiB7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKGdldEFwcFNldHRpbmdEYXRhKCkuc3RvcmFnZU5hbWVQcmVmaXggKyAnX2xhc3RfJyArIGtleSwgdmFsdWUgfHwgJycpOwogICAgICAgIH0sCiAgICAgICAgZ2V0Q29tbW9uVmFsdWU6IChrZXkpID0+IHsKICAgICAgICAgICAgcmV0dXJuIEdNX2dldFZhbHVlKGdldEFwcFNldHRpbmdEYXRhKCkuc3RvcmFnZU5hbWVQcmVmaXggKyAnX2NvbW1vbl8nICsga2V5KSB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHNldENvbW1vblZhbHVlOiAoa2V5LCB2YWx1ZSkgPT4gewogICAgICAgICAgICBHTV9zZXRWYWx1ZShnZXRBcHBTZXR0aW5nRGF0YSgpLnN0b3JhZ2VOYW1lUHJlZml4ICsgJ19jb21tb25fJyArIGtleSwgdmFsdWUgfHwgJycpOwogICAgICAgIH0KICAgIH0KCiAgICBsZXQgYnRuRG93bmxvYWQgPSB7CiAgICAgICAgaWQ6ICdidG5FYXN5SGVscGVyJywKICAgICAgICB0ZXh0OiAn566A5piT5LiL6L295Yqp5omLJywKICAgICAgICB0aXRsZTogJ+S9v+eUqOeZvuW6pue9keebmOeugOaYk+S4i+i9veWKqeaJi+i/m+ihjOS4i+i9vScsCiAgICAgICAgaHRtbDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gYAogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCIgc3R5bGU9ImNvbG9yOiNmZmZmZmYiIHRpdGxlPSIke3RoaXMudGV4dH0iPjwvZW0+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogYXV0bzsiPiR7dGhpcy50ZXh0fTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgYAogICAgICAgIH0KICAgIH0KCiAgICBsZXQgaXNPbGRIb21lUGFnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgdXJsID0gbG9jYXRpb24uaHJlZjsKICAgICAgICBpZiAodXJsLmluZGV4T2YoIi5iYWlkdS5jb20vZGlzay9ob21lIikgPiAwKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCBpc05ld0hvbWVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGxldCB1cmwgPSBsb2NhdGlvbi5ocmVmOwogICAgICAgIGlmICh1cmwuaW5kZXhPZigiLmJhaWR1LmNvbS9kaXNrL21haW4iKSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH07CgogICAgbGV0IGdldFNlbGVjdGVkRmlsZUxpc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHJlcXVpcmUoJ3N5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcycpLmluc3RhbmNlRm9yU3lzdGVtLmxpc3QuZ2V0U2VsZWN0ZWQoKTsKICAgIH07CgogICAgbGV0IGdldEZpbGVMaXN0U3RhdCA9IGZ1bmN0aW9uIChmaWxlTGlzdCkgewogICAgICAgIGxldCBmaWxlU3RhdCA9IHsKICAgICAgICAgICAgZmlsZV9udW06IDAsCiAgICAgICAgICAgIGRpcl9udW06IDAKICAgICAgICB9OwogICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgaWYgKGl0ZW0uaXNkaXIgPT0gMCkgewogICAgICAgICAgICAgICAgZmlsZVN0YXQuZmlsZV9udW0rKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZpbGVTdGF0LmRpcl9udW0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmaWxlU3RhdDsKICAgIH07CgogICAgbGV0IGluaXRCdXR0b25FdmVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygnaW5pdEJ1dHRvbkV2ZW505Yid5aeL5YyW5oyJ6ZKu5LqL5Lu2Jyk7CiAgICAgICAgbGV0IHl1bkRhdGEgPSBnZXRZdW5EYXRhKCk7CiAgICAgICAgbGV0IGlzT2xkSG9tZSA9IGlzT2xkSG9tZVBhZ2UoKTsKICAgICAgICBsZXQgaXNOZXdIb21lID0gaXNOZXdIb21lUGFnZSgpOwogICAgICAgIGlmICh5dW5EYXRhIHx8IGlzT2xkSG9tZSkgewogICAgICAgICAgICAvL+aaguaXtumZkOWItuWPquiDveWcqOeuoeeQhumhtemdouS4reS9v+eUqAogICAgICAgICAgICBpZiAoIWlzT2xkSG9tZSkgewogICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yU3dhbCgn5b+F6aG75YWI6L2s5a2Y5Yiw6Ieq5bex572R55uY5Lit77yM54S25ZCO6L+b5YWl572R55uY6L+b6KGM5LiL6L2977yBJyk7CiAgICAgICAgICAgICAgICBzaG93U2hhcmVTYXZlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsZXQgZmlsZUxpc3QgPSBnZXRTZWxlY3RlZEZpbGVMaXN0KCk7CiAgICAgICAgICAgICAgICBsZXQgZmlsZVN0YXQgPSBnZXRGaWxlTGlzdFN0YXQoZmlsZUxpc3QpOwogICAgICAgICAgICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlU3RhdC5maWxlX251bSA+IDEgfHwgZmlsZVN0YXQuZGlyX251bSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yKCfor7fpgInmi6nkuIDkuKrmlofku7bov5vooYzkuIvovb3vvIjmmoLml7bkuI3mlK/mjIHmlofku7blpLnlkozlpJrmlofku7bmibnph4/kuIvovb3vvIknKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVN0YXQuZGlyX251bSA9PSAwICYmIGZpbGVTdGF0LmZpbGVfbnVtID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Rvd25sb2FkRGlhbG9nKGZpbGVMaXN0LCBmaWxlU3RhdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAvL+iHquWKqOS4i+i9vQogICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRKcXVlcnkoKSgiI2RpYWxvZ0J0bkdldFVybCIpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzaG93VGlwRXJyb3JTd2FsKCfor7fpgInmi6nkuIDkuKrmlofku7bov5vooYzkuIvovb0nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNob3dMb2dpbigpOwogICAgICAgIH0KICAgIH07CgogICAgbGV0IGdldFl1bkRhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHVuc2FmZVdpbmRvdy55dW5EYXRhOwogICAgfTsKCiAgICBsZXQgc2hvd1RpcEVycm9yU3dhbCA9IGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzaG93U3dhbChlcnIsIHtpY29uOiAnZXJyb3InfSk7CiAgICB9CiAgICBsZXQgc2hvd1RpcEVycm9yID0gZnVuY3Rpb24gKGVycikgewogICAgICAgIC8vIHNob3dTd2FsKGVycix7aWNvbjogJ2Vycm9yJ30pOwogICAgICAgIGFsZXJ0KGVycik7CiAgICB9CiAgICBsZXQgc2hvd1RpcEluZm8gPSBmdW5jdGlvbiAoaW5mbykgewogICAgICAgIGdldEpxdWVyeSgpKCIjZGlhbG9nT3BUaXBzIikuc2hvdygpLmh0bWwoaW5mbyk7CiAgICB9CiAgICBsZXQgc2hvd1RpcEluZm9BcmlhID0gZnVuY3Rpb24gKGluZm8pIHsKICAgICAgICBnZXRKcXVlcnkoKSgiI2RpYWxvZ09wVGlwc0FyaWEiKS5zaG93KCkuaHRtbChpbmZvKTsKICAgIH0KICAgIGxldCBzaG93VGlwSW5mb0lkbSA9IGZ1bmN0aW9uIChpbmZvKSB7CiAgICAgICAgZ2V0SnF1ZXJ5KCkoIiNkaWFsb2dPcFRpcHNJZG0iKS5zaG93KCkuaHRtbChpbmZvKTsKICAgIH0KCiAgICBsZXQgc2hvd1N3YWwgPSBmdW5jdGlvbiAoY29udGVudCwgb3B0aW9uKSB7CiAgICAgICAgZGl2VGlwcy5pbm5lckhUTUwgPSBjb250ZW50OwogICAgICAgIG9wdGlvbi5jb250ZW50ID0gZGl2VGlwczsKICAgICAgICBpZiAoIW9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYnV0dG9uJykpIHsKICAgICAgICAgICAgb3B0aW9uLmJ1dHRvbiA9ICfmnJUg55+lIOmBkyDkuoYnCiAgICAgICAgfQogICAgICAgIHN3YWwob3B0aW9uKTsKICAgIH0KCiAgICBsZXQgc2hvd0xvZ2luID0gZnVuY3Rpb24gKCkgewogICAgICAgIGdldEpxdWVyeSgpKCJbbm9kZS10eXBlPSdoZWFkZXItbG9naW4tYnRuJ10iKS5jbGljaygpOwogICAgfTsKICAgIGxldCBzaG93U2hhcmVTYXZlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGdldEpxdWVyeSgpKCJbbm9kZS10eXBlPSdzaGFyZVNhdmUnXSIpLmNsaWNrKCk7CiAgICB9OwogICAgbGV0IGdldEpxdWVyeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcmVxdWlyZSgiYmFzZTp3aWRnZXQvbGlicy9qcXVlcnlwYWNrZXQuanMiKTsKICAgIH07CgogICAgLy/kuIvovb3pnaLmnb8KICAgIGxldCBzaG93RG93bmxvYWREaWFsb2cgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIGZpbGVTdGF0KSB7CiAgICAgICAgbGV0IHRoZUZpbGUgPSBmaWxlTGlzdFswXTsKICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGVGaWxlKTsKICAgICAgICBsZXQgY29udGVudCA9IGAKICAgICAgICAgICAgPGRpdiBpZD0iZG93bmxvYWREaWFsb2ciPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nVG9wIj4KICAgICAgICAgICAgICAgICAgICDor7fngrnlh7vkuIvmlrnmjInpkq7vvIzlvIDlp4vkuIvovb0gPHNwYW4gaWQ9ImRpYWxvZ0ZpbGVOYW1lIj4ke0N1dFN0cmluZyh0aGVGaWxlLnNlcnZlcl9maWxlbmFtZSwgNDApfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nTWlkZGxlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2dMZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nTGVmdFRpcHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nTGVmdFRpcHMxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPuOAkOaWueW8jzHjgJE8L3N0cm9uZz5JRE0g5b+F6aG76K6+572uNOe6v+eoi+WPiuS/ruaUuVVB5Li6IDxzdHJvbmc+c29mdHhtO25ldGRpc2s8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2dMZWZ0VGlwc0xpbmsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIke2dldEFwcFNldHRpbmdEYXRhKCkuaWRtRG93bmxvYWRVcmx9IiB0YXJnZXQ9Il9ibGFuayI+44CQSURN6YWN572u5pWZ56iL44CRPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2dMZWZ0VGlwczIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+44CQ5pa55byPMuOAkTwvc3Ryb25nPkFyaWEyIOaXoOmcgOmFjee9ruWNs+WPr+S9v+eUqAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZ0xlZnRUaXBzTGluayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiR7Z2V0QXBwU2V0dGluZ0RhdGEoKS5hcmlhMkRvd25sb2FkVXJsfSIgdGFyZ2V0PSJfYmxhbmsiPuOAkOeCueWHu+S4i+i9veOAkTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIke2dldEFwcFNldHRpbmdEYXRhKCkuYXJpYTJDb3Vyc2VVcmx9IiB0YXJnZXQ9Il9ibGFuayI+44CQ5L2/55So5pWZ56iL44CRPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2dRciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGlkPSJkaWFsb2dRckltZyIgc3JjPSJodHRwczovL3MzLmJtcC5vdmgvaW1ncy8yMDIxLzEwLzE0MjY0ZTRjMDNkY2I4NmYuZ2lmIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2dSaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRpYWxvZ0NvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJkaWFsb2dCdG5HZXRVcmwiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IueCueWHu+iOt+WPluebtOmTvuWcsOWdgCIgY2xhc3M9ImJ0bkludGVyZmFjZSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRpYWxvZ1JlbWFyayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWoCBJRE3kuIvovb3pgJ/luqY8c3Ryb25nPjZNL3M8L3N0cm9uZz7lt6blj7PvvIxBcmlhMuS4i+i9vemAn+W6puWPr+S7pTxzdHJvbmc+6LeR5ruh5bim5a69PC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pagIOS4i+i9vemAn+W6pjxzdHJvbmc+5Zug5Lq66ICM5byCPC9zdHJvbmc+77yM54m55Yir5piv5YWx5Lqr572R57uc77yI5L6L5aaCIOagoeWbree9ke+8iQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2dPcFRpcHMiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nVmFwdGNoYUNvZGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRpYWxvZ1ZhcHRjaGFDb2RlSW5wdXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGlhbG9nVmFwdGNoYUNvZGVUaXBzIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iZGlhbG9nQ29kZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7Z2V0Q29uZmlnKCkuY29kZX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nQ29kZVJlbWFyayI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRpYWxvZ09wQnV0dG9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJkaWFsb2dCdG5JZG0iIHR5cGU9ImJ1dHRvbiIgZGF0YS1jbGlwYm9hcmQtdGV4dD0iIiB2YWx1ZT0i5aSN5Yi255u06ZO+5Zyw5Z2AIiBjbGFzcz0iYnRuSW50ZXJmYWNlIGJ0bkdyZWVuIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRpYWxvZ09wVGlwc0lkbSI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJkaWFsb2dCdG5BcmlhIiB0eXBlPSJidXR0b24iIHZhbHVlPSLlj5HpgIHoh7NBcmlhMiIgY2xhc3M9ImJ0bkludGVyZmFjZSBidG5HcmVlbiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2dPcFRpcHNBcmlhIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2dEaXZTYXZlUGF0aCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOS/neWtmOi3r+W+hO+8mjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZGlhbG9nVHh0U2F2ZVBhdGgiIHZhbHVlPSIke2dldENvbmZpZygpLnNhdmVQYXRofSIgc3R5bGU9IndpZHRoOiAxNzBweDsiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkaWFsb2dBcmlhQ29uZmlnQ2xpY2siPumFjee9rkFyaWEyPj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRpYWxvZ0FyaWFDb25maWciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJkaWFsb2dBcmlhUlBDIiB2YWx1ZT0iJHtnZXRDb25maWcoKS5qc29uUnBjfSIgdGl0bGU9IlJQQ+WcsOWdgCIgcGxhY2Vob2xkZXI9IlJQQ+WcsOWdgCIgc3R5bGU9IndpZHRoOiAyNDBweDsiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImRpYWxvZ0FyaWFUb2tlbiIgdmFsdWU9IiR7Z2V0Q29uZmlnKCkudG9rZW59IiB0aXRsZT0idG9rZW4iIHBsYWNlaG9sZGVyPSJ0b2tlbiIgc3R5bGU9IndpZHRoOiA3N3B4OyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZGlhbG9nQXJpYU1pbmUiIHZhbHVlPSJjaGVja2VkIiAke2dldENvbmZpZygpLm1pbmV9PiDmiJHkvb/nlKjoh6rlt7HnmoRBcmlhMu+8iOWmguS4jeaHgu+8jOWLv+WLvumAie+8iQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBpZD0iZGlhbG9nQm90dG9tIj7kvJfmiYDlkajnn6XnmoTljp/lm6DvvIzohJrmnKzkuI3lj6/og73luLjlnKjvvIzkvYbkvZzogIXluLjlnKjvvIzlhbPms6jmiY3og73kuI3ov7fot6/vvIHvvIHvvIE8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgICBzaG93U3dhbChjb250ZW50LCB7CiAgICAgICAgICAgIGJ1dHRvbjogJ+WFsyDpl60nLAogICAgICAgICAgICBjbG9zZU9uQ2xpY2tPdXRzaWRlOiBmYWxzZQogICAgICAgIH0pOwoKICAgICAgICAvL+WIhuS6q++8iOWFpeWPoyDvvIkKICAgICAgICBsZXQgZGlhbG9nQnRuQ2xpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChnbG9iYWxEYXRhLmRvd25sb2FkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0U2hhcmVTdGFydFN0YXRlKCk7CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5bey5YiG5Lqr6L+H6K+l5paH5Lu277yI5LiN6YeN5aSN5YiG5Lqr77yM5LuF6ZmQ5LqO5b2T5YmN56qX5Y+j55qE5LiK5LiA5qyh5YiG5Lqr77yJCiAgICAgICAgICAgIGxldCB0ID0gZ2V0VG1wRGF0YSgpOwogICAgICAgICAgICBpZiAodC5yZXNwb25zZSAmJiB0LmZzX2lkID09IHRoZUZpbGUuZnNfaWQpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybign5bey5YiG5Lqr6L+H5q2k5paH5Lu277yM5LiN5YaN6YeN5aSN5YiG5LqrJyk7CiAgICAgICAgICAgICAgICBnZXREb3dubG9hZFVybCh0LnJlc3BvbnNlLCB0LnB3ZCwgdC5mc19pZCwgJycpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygn5pyq5YiG5Lqr6L+H5q2k5paH5Lu277yM5byA5aeL5YiG5LqrJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8v6I635Y+W5pWw5o2uCiAgICAgICAgICAgIGxldCBiZHN0b2tlbiA9IHVuc2FmZVdpbmRvdy5sb2NhbHMuZ2V0KCdiZHN0b2tlbicpOwogICAgICAgICAgICBsZXQgcHdkID0gZ2V0Um5kUHdkKDQpOwogICAgICAgICAgICAvLys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAvL+WIhuS6qwogICAgICAgICAgICBsZXQgZGV0YWlscyA9IHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsCiAgICAgICAgICAgICAgICB0aW1lb3V0OiAxMDAwMCwgLy8gMTDnp5LotoXml7YKICAgICAgICAgICAgICAgIHVybDogYC9zaGFyZS9zZXQ/Y2hhbm5lbD1jaHVubGVpJmNsaWVudHR5cGU9MCZ3ZWI9MSZjaGFubmVsPWNodW5sZWkmd2ViPTEmYXBwX2lkPTI1MDUyOCZiZHN0b2tlbj0ke2Jkc3Rva2VufSZjbGllbnR0eXBlPTBgLAogICAgICAgICAgICAgICAgZGF0YTogYGZpZF9saXN0PVske3RoZUZpbGUuZnNfaWR9XSZzY2hhbm5lbD00JmNoYW5uZWxfbGlzdD1bXSZwZXJpb2Q9MSZwd2Q9JHtwd2R9YCwKICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCfliIbkuqvmlofku7bml7bvvIznmb7luqbov5Tlm57vvJonLCByZXMpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyZXMucmVzcG9uc2UuZXJybm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ET++8mueci+eci+eZvuW6puWTqumHjOaciei/meS6m+eKtuaAgeeggeino+mHigogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyDmraPluLjov5Tlm54KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aKinJlc3BvbnNlLCBwd2QsIGZzX2lk5a2Y5Yiw5YWs55So5Y+Y6YeP77yM54S25ZCO5ZyocGFzc+S6i+S7tuS4reWGjeWPluWHugogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRtcERhdGEocmVzLnJlc3BvbnNlLCBwd2QsIHRoZUZpbGUuZnNfaWQsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREb3dubG9hZFVybChyZXMucmVzcG9uc2UsIHB3ZCwgdGhlRmlsZS5mc19pZCwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+WPkeeUn+mUmeivr++8gScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yKCfnmb7luqbor7TvvJrmgqjku4rlpKnliIbkuqvlpKrlpJrkuobvvIwyNOWwj+aXtuWQjuWGjeivleWQp++8gVxu55m+5bqm6L+U5Zue54q25oCB56CB77yaJyArIHJlcy5yZXNwb25zZS5lcnJubyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+WPkeeUn+mUmeivr++8gScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yKCfnmb7luqbor7TvvJror6Xmlofku7bnpoHmraLliIbkuqvvvIFcbueZvuW6pui/lOWbnueKtuaAgeegge+8micgKyByZXMucmVzcG9uc2UuZXJybm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgLTY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+WPkeeUn+mUmeivr++8gScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yKCfnmb7luqbor7TvvJror7fph43mlrDnmbvlvZXvvIFcbueZvuW6pui/lOWbnueKtuaAgeegge+8micgKyByZXMucmVzcG9uc2UuZXJybm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIOWFtuWug+mUmeivrwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvKCflj5HnlJ/plJnor6/vvIEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcign5YiG5Lqr5paH5Lu25aSx6LSl77yM6K+36YeN6K+V77yBXG7nmb7luqbov5Tlm57nirbmgIHnoIHvvJonICsgcmVzLnJlc3BvbnNlLmVycm5vICsgJ1xu5L2/55So55m+5bqm5YiG5Lqr5oyJ6ZKu6K+V6K+V77yM5bCx55+l6YGT5YW35L2T5Y6f5Zug5LqG44CCJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+WPkeeUn+mUmeivr++8gScpCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcign5YiG5Lqr5paH5Lu25aSx6LSl77yM5a+86Ie05peg5rOV6I635Y+W55u06ZO+5LiL6L295Zyw5Z2A77yBXG7nmb7luqbov5Tlm57vvJonICsgcmVzLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9udGltZW91dDogKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvKCflj5HnlJ/plJnor6/vvIEnKQogICAgICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcign5YiG5Lqr5paH5Lu25pe26L+e5o6l55m+5bqm5o6l5Y+j6LaF5pe277yM6K+36YeN6K+V77yBJyk7CiAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXMpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9uZXJyb3I6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzaG93VGlwSW5mbygn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgICAgICAgICBzaG93VGlwRXJyb3IoJ+WIhuS6q+aWh+S7tuaXtuWPkeeUn+mUmeivr++8jOivt+mHjeivle+8gScpOwogICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KGRldGFpbHMpOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+WPkeeUn+mUmeivr++8gScpCiAgICAgICAgICAgICAgICBzaG93VGlwRXJyb3IoJ+acquefpemUmeivr++8jOivt+mHjeivle+8gScpOwogICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIC8v57uR5a6a5oyJ6ZKu54K55Ye777yI54K55Ye76I635Y+W55u06ZO+5Zyw5Z2A77yJCiAgICAgICAgZ2V0SnF1ZXJ5KCkoIiNkaWFsb2dCdG5HZXRVcmwiKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGRpYWxvZ0J0bkNsaWNrKCkKICAgICAgICB9KTsKICAgICAgICAvL+eCueWHu+mFjee9rkFyaWEyCiAgICAgICAgZ2V0SnF1ZXJ5KCkoIiNkaWFsb2dBcmlhQ29uZmlnQ2xpY2siKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHNob3dBcmlhQ29uZmlnKCkKICAgICAgICB9KTsKICAgICAgICAvLyDnu5Hlrprngrnlh7vlpI3liLbkuovku7YKICAgICAgICBjb3B5VXJsMkNsaXBib2FyZCgpOwogICAgfTsKCiAgICAvL+ivt+axguWkh+eUqOWPguaVsAogICAgbGV0IGdldFBhcmFtcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgaGtVcmwgPSAiaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3BjbG91ZC91c2VyL2dldGluZm8/cXVlcnlfdWs9Mjk0Mjg0NDc0MiI7CiAgICAgICAgLy8gbGV0IGhrVXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NDg4MTgvYmQvZ2V0aW5mby5waHA/cXVlcnlfdWs9Mjk0Mjg0NDc0MiI7CiAgICAgICAgbGV0IGRldGFpbHMgPSB7CiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDAwLCAvLyAxMOenkui2heaXtgogICAgICAgICAgICB1cmw6IGhrVXJsICsgJyYnICsgbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLAogICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICBnbG9iYWxEYXRhLmRvbWFpbkIgPSByZXMucmVzcG9uc2UudXNlcl9pbmZvLmludHJvOwogICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuaW5mbygiZG9tYWluQu+8miIgKyBnbG9iYWxEYXRhLmRvbWFpbkIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KGRldGFpbHMpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgIH0KICAgIH0KICAgIC8v5byD55SoCiAgICBsZXQgc2V0QXBwU2V0dGluZ0RhdGEgPSBmdW5jdGlvbiAocGFyYW1EYXRhKSB7CiAgICAgICAgbGV0IGZpbGVuYW1lID0gZ2V0TWlkU3RyKHBhcmFtRGF0YSwgJzxzcGFuIGlkPSJmaWxlbmFtZSI+JywgJzwvc3Bhbj4nKTsKICAgICAgICBsZXQgaiA9IGdldEpxdWVyeSgpLnBhcnNlSlNPTihkZWNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpKTsKICAgICAgICAvLyBjb25zb2xlLmxvZygnc2V0QXBwU2V0dGluZ0RhdGEnKTsKICAgICAgICAvLyBjb25zb2xlLmxvZyhqKTsKICAgICAgICBpZiAoai5lcnIpIHsKICAgICAgICAgICAgc2hvd1RpcEVycm9yU3dhbChqLmVycik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgalsnY29zJ10gPSB0cnVlOwogICAgICAgICAgICBnZXRKcXVlcnkoKS5leHRlbmQoZ2xvYmFsRGF0YSwgaik7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coZ2xvYmFsRGF0YSk7CiAgICAgICAgfQogICAgfQoKICAgIGxldCBzZXRTaGFyZVN0YXJ0U3RhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZ2xvYmFsRGF0YS5kb3dubG9hZGluZyA9IDE7CiAgICAgICAgc2hvd1RpcEluZm8oJ+ato+WcqOWIhuS6q+aWh+S7ti4uLicpCiAgICAgICAgLy/kv53lrZjnlKjmiLfovpPlhaXnmoTmlbDmja4KICAgICAgICBzYXZlTGFzdFVzZURhdGEoKTsKICAgICAgICBnZXRKcXVlcnkoKSgnI2RpYWxvZ1ZhcHRjaGFDb2RlJykuaGlkZSgpOwogICAgfQogICAgbGV0IHNldFNoYXJlQ29tcGxldGVTdGF0ZSA9IGZ1bmN0aW9uIChpc1N1Y2Nlc3MpIHsKICAgICAgICBpc1N1Y2Nlc3MgPSBpc1N1Y2Nlc3MgfHwgZmFsc2U7CiAgICAgICAgaWYoIWlzU3VjY2Vzcyl7CiAgICAgICAgICAgIC8v5aSx6LSl5LmL5ZCO77yM5YWB6K646YeN5aSN54K55Ye75oyJ6ZKuCiAgICAgICAgICAgIGdsb2JhbERhdGEuZG93bmxvYWRpbmcgPSAwOwogICAgICAgIH0KICAgICAgICAvL+S/neWtmOeUqOaIt+i+k+WFpeeahOaVsOaNrgogICAgICAgIHNhdmVMYXN0VXNlRGF0YSgpOwogICAgICAgIC8v6YeN572udmFwdGNoYemqjOivgQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8v6Ziy5q2i5p+Q5Lqb55So5oi35peg5rOV6K6/6ZeudmFwdGNoYeWumOe9keiAjOS4reaWrQogICAgICAgICAgICBpZiAodmFwdGNoYUFsbCAhPT0gbnVsbCAmJiB2YXB0Y2hhQWxsLmhhc093blByb3BlcnR5KCJyZXNldCIpKSB7CiAgICAgICAgICAgICAgICB2YXB0Y2hhQWxsLnJlc2V0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oInZhcHRjaGFBbGwgaXMgdW5kZWZpbmVkIik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICB9CiAgICB9CiAgICAvL+iwg+eUqOWHveaVsO+8mmFyaWFEb3dubG9hZAogICAgbGV0IHNldFNlbmRBcmlhU3RhcnRTdGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBnbG9iYWxEYXRhLnNlbmRpbmcgPSAxOwogICAgICAgIHNob3dUaXBJbmZvQXJpYSgn5q2j5Zyo5Y+R6YCB6IezQXJpYTIuLi4nKTsKICAgICAgICAvLyBnZXRKcXVlcnkoKSgiI2RpYWxvZ0J0bkFyaWEiKS52YWwoJ+ato+WcqOWPkemAgeiHs0FyaWEyLi4uJyk7CiAgICAgICAgLy/kv53lrZjnlKjmiLfovpPlhaXnmoTmlbDmja4KICAgICAgICBzYXZlTGFzdFVzZURhdGEoKTsKICAgIH0KICAgIGxldCBzZXRTZW5kQXJpYUNvbXBsZXRlU3RhdGUgPSBmdW5jdGlvbiAoaXNTdWNjZXNzKSB7CiAgICAgICAgZ2xvYmFsRGF0YS5zZW5kaW5nID0gMDsKICAgICAgICBpZiAoaXNTdWNjZXNzKSB7CiAgICAgICAgICAgIGdldEpxdWVyeSgpKCIjZGlhbG9nQnRuQXJpYSIpLnZhbCgnQXJpYTLlt7Lnu4/lvIDlp4vkuIvovb3kuoYnKTsKICAgICAgICAgICAgLy8gc2hvd1RpcEluZm9BcmlhKCdBcmlhMuW3sue7j+W8gOWni+S4i+i9veS6hicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdldEpxdWVyeSgpKCIjZGlhbG9nQnRuQXJpYSIpLnZhbCgn5Y+R6YCB6IezQXJpYTInKTsKICAgICAgICAgICAgLy8gc2hvd1RpcEluZm9BcmlhKCdBcmlhMuW3sue7j+W8gOWni+S4i+i9veS6hu+8jOWIh+aNoui/h+WOu+eci+eci+WQp34nKTsKICAgICAgICB9CiAgICAgICAgLy/kv53lrZjnlKjmiLfovpPlhaXnmoTmlbDmja4KICAgICAgICBzYXZlTGFzdFVzZURhdGEoKTsKICAgIH0KCiAgICBsZXQgc2hvd0FyaWFDb25maWcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IHQgPSBnZXRKcXVlcnkoKSgiI2RpYWxvZ0FyaWFDb25maWciKTsKICAgICAgICBpZiAodC5jc3MoImRpc3BsYXkiKSA9PSAibm9uZSIpIHsKICAgICAgICAgICAgdC5zaG93KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdC5oaWRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8v5YiG5Lqr5oiQ5Yqf5ZCO77yM5byA5aeL5omL5Yq/6aqM6K+BCiAgICBsZXQgdmFwdGNoYVZhbGlkYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGxvYWRWYXB0Y2hhU2RrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFwdGNoYSh7CiAgICAgICAgICAgICAgICB2aWQ6ICI1ZmM1MjUyNjU2MTgxZWE4OWY5ZWFkMmUiLCAvLyDpqozor4HljZXlhYNpZAogICAgICAgICAgICAgICAgdHlwZTogImludmlzaWJsZSIsIC8vIOaYvuekuuexu+WeiyDpmpDol4/lvI8KICAgICAgICAgICAgICAgIHNjZW5lOiAxLCAvLyDlnLrmma/lgLwg6buY6K6kMAogICAgICAgICAgICAgICAgb2ZmbGluZV9zZXJ2ZXI6ICIiLCAvL+emu+e6v+aooeW8j+acjeWKoeerr+WcsOWdgO+8jOiLpeWwmuacqumFjee9ruemu+e6v+aooeW8j++8jOivt+Whq+WGmeS7u+aEj+WcsOWdgOWNs+WPr+OAggogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YXB0Y2hhT2JqKSB7CiAgICAgICAgICAgICAgICB2YXB0Y2hhQWxsID0gdmFwdGNoYU9iajsgLy/lsIZWQVBUQ0hB6aqM6K+B5a6e5L6L5L+d5a2Y5Yiw5YWo5bGA5Y+Y6YeP5LitCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YXB0Y2hhQWxsKTsKCiAgICAgICAgICAgICAgICAvL+mqjOivgemAmui/h+aXtuinpuWPkQogICAgICAgICAgICAgICAgdmFwdGNoYUFsbC5saXN0ZW4oInBhc3MiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8g6aqM6K+B5oiQ5Yqf6L+b6KGM5ZCO57ut5pON5L2cCiAgICAgICAgICAgICAgICAgICAgbGV0IHRva2VuID0gdmFwdGNoYUFsbC5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRva2VuKTsKICAgICAgICAgICAgICAgICAgICBsZXQgdCA9IGdldFRtcERhdGEoKTsKICAgICAgICAgICAgICAgICAgICBnZXREb3dubG9hZFVybCh0LnJlc3BvbnNlLCB0LnB3ZCwgdC5mc19pZCwgdG9rZW4pOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy/lhbPpl63pqozor4HlvLnnqpfml7bop6blj5EKICAgICAgICAgICAgICAgIHZhcHRjaGFBbGwubGlzdGVuKCJjbG9zZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzaG93VGlwSW5mbygn6YCa6L+H6aqM6K+B5omN5Y+v5Lul5Y+W55u06ZO+77yB54K55Ye75LiK6Z2i5oyJ6ZKu6YeN5paw5byA5aeL44CCJyk7CiAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCkKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8v5byA5aeL5omL5Yq/6aqM6K+BCiAgICAgICAgICAgICAgICB2YXB0Y2hhQWxsLnZhbGlkYXRlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGxldCBzZXRUbXBEYXRhID0gZnVuY3Rpb24gKHJlc3BvbnNlLCBwd2QsIGZzX2lkLCB0b2tlbikgewogICAgICAgIHRtcERhdGEucmVzcG9uc2UgPSByZXNwb25zZTsKICAgICAgICB0bXBEYXRhLnB3ZCA9IHB3ZDsKICAgICAgICB0bXBEYXRhLmZzX2lkID0gZnNfaWQ7CiAgICAgICAgdG1wRGF0YS50b2tlbiA9IHRva2VuOwogICAgfQogICAgbGV0IGdldFRtcERhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRtcERhdGE7CiAgICB9CiAgICAvL+aJi+WKv+mqjOivgeaIkOWKn+WQju+8jOacjeWKoeWZqOiOt+WPluebtOmTvuWcsOWdgAogICAgbGV0IGdldERvd25sb2FkVXJsUmVhbCA9IGZ1bmN0aW9uIChkb21haW4sIHJlc3BvbnNlLCBwd2QsIGZzaWQsIHRva2VuKSB7CiAgICAgICAgLy8gY29uc29sZS5sb2coJ+WIhuS6q+aIkOWKn+WQjui/lOWbnu+8micsIHJlc3BvbnNlKTsKICAgICAgICBsZXQgYXUgPSBnZXRKcXVlcnkoKSgnI2RpYWxvZ1FySW1nJykuYXR0cignc3JjJyk7CiAgICAgICAgbGV0IHNob3J0dXJsID0gcmVzcG9uc2Uuc2hvcnR1cmw7CiAgICAgICAgbGV0IHN1cmwgPSBzaG9ydHVybC5zdWJzdHJpbmcoc2hvcnR1cmwubGFzdEluZGV4T2YoJy8nKSArIDEsIHNob3J0dXJsLmxlbmd0aCk7CiAgICAgICAgbGV0IGRvd25sb2FkVXJsID0gYCR7Z2V0QXBwU2V0dGluZ0RhdGEoKS5nZXREb3dubG9hZFVybH0/dmVyc2lvbj0ke2dldEFwcFNldHRpbmdEYXRhKCkuc2NyaXB0VmVyc2lvbn0mdD04ODg4YCArIG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgIGRvd25sb2FkVXJsID0gZG9tYWluICsgZG93bmxvYWRVcmwgKyBnZXRBcHBTZXR0aW5nRGF0YSgpLnBhcmFtOwoKICAgICAgICBsZXQgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgcGFyYW1zLmFwcGVuZCgnc3VybCcsIHN1cmwpOwogICAgICAgIHBhcmFtcy5hcHBlbmQoJ3B3ZCcsIHB3ZCk7CiAgICAgICAgcGFyYW1zLmFwcGVuZCgnc2hhcmVpZCcsIHJlc3BvbnNlLnNoYXJlaWQpOwogICAgICAgIHBhcmFtcy5hcHBlbmQoJ2Zyb20nLCB1bnNhZmVXaW5kb3cubG9jYWxzLmdldCgndWsnKSk7CiAgICAgICAgcGFyYW1zLmFwcGVuZCgnZnNpZGxpc3QnLCBgWyR7ZnNpZH1dYCk7CiAgICAgICAgcGFyYW1zLmFwcGVuZCgnc3RhcnQnLCBnZXRTdG9yYWdlLmdldENvbW1vblZhbHVlKCdzdGFydCcpKTsKICAgICAgICBwYXJhbXMuYXBwZW5kKCdjb2RlJywgZ2V0SnF1ZXJ5KCkoJyNkaWFsb2dDb2RlJykudmFsKCkudHJpbSgpKTsKICAgICAgICBwYXJhbXMuYXBwZW5kKCd1JywgZ2V0SnF1ZXJ5KCkoJy51c2VyLW5hbWUnKS5odG1sKCkpOwogICAgICAgIHBhcmFtcy5hcHBlbmQoJ2ZuJywgZ2V0U2VsZWN0ZWRGaWxlTGlzdCgpWzBdLnNlcnZlcl9maWxlbmFtZSk7CiAgICAgICAgcGFyYW1zLmFwcGVuZCgndG9rZW4nLCB0b2tlbik7CiAgICAgICAgcGFyYW1zLmFwcGVuZCgnYXUnLCBhdS5pbmRleE9mKGdsb2JhbERhdGEucGFyYW1Eb21haW4yKSA9PSAwID8gJycgOiBhdSk7CiAgICAgICAgLy/ov5znqIvor7fmsYLnm7Tpk77kuIvovb3lnLDlnYAKICAgICAgICBsZXQgZGV0YWlscyA9IHsKICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLAogICAgICAgICAgICB0aW1lb3V0OiAzMDAwMCwgLy8gMzDnp5LotoXml7YKICAgICAgICAgICAgdXJsOiBkb3dubG9hZFVybCwKICAgICAgICAgICAgLy8gZGF0YTogYHN1cmw9JHtzdXJsfSZwd2Q9JHtwd2R9YCwgLS1waHDnq6/mlLbkuI3liLDmlbDmja4KICAgICAgICAgICAgZGF0YTogcGFyYW1zLAogICAgICAgICAgICBvbmxvYWRzdGFydDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbGV0IHRtcFRpcHMgPSAn5q2j5Zyo6L+c56iL6K+35rGC55u06ZO+5Zyw5Z2ALi4uJzsKICAgICAgICAgICAgICAgIGlmIChkb21haW4gPT0gZ2xvYmFsRGF0YS5kb21haW5CKSB0bXBUaXBzID0gJ+W/q+WlveS6hu+8jOWGjeiAkOW/g+etieS4gOS4i+S4iy4uLic7CiAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHRtcFRpcHMgPSAn5Lq65py66aqM6K+B6YCa6L+HfiAnICsgdG1wVGlwczsKICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvKHRtcFRpcHMpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ+ivt+axguWPguaVsO+8micpOwogICAgICAgICAgICAgICAgLy8gcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHsKICAgICAgICAgICAgICAgIC8vICAgICAgY29uc29sZS5sb2coIiVzIC0tPiAlcyIsIGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgLy8gfSkKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfov5znqIvor7fmsYLnm7Tpk77lnLDlnYDvvIzov5Tlm57vvJonLCByZXMpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmVzLnJlc3BvbnNlLmVycm5vKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8g5q2j5bi46L+U5ZueCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAzOiAvLyBhcmlhMiBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaGFyZUNvbXBsZXRlU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VDbGlja0V2ZW50KHJlcy5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlU3RhcnRTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1FyVGlwcyhyZXMucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOiAvLyDniYjmnKzlpKrml6cKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yU3dhbChyZXMucmVzcG9uc2UuZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMTogLy8gdmFwdGNoYemqjOivgeS4jeaIkOWKnwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VGlwSW5mbyhyZXMucmVzcG9uc2UuZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEpxdWVyeSgpKCcjZGlhbG9nVmFwdGNoYUNvZGUnKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UXJUaXBzKHJlcy5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDI6IC8vIOaFoumAn+ebtOmTvgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VGlwSW5mbyhyZXMucmVzcG9uc2UuZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwNDogLy8g6ZyA6KaB5omL5Yq/6aqM6K+BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VGlwSW5mbyhyZXMucmVzcG9uc2UuZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFwdGNoYVZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDAxOiAvLyDph43or5UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb21haW4gPT0gZ2xvYmFsRGF0YS5kb21haW5CKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+WPkeeUn+mUmeivr++8gScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yKHJlcy5yZXNwb25zZS5lcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mdnuWkh+eUqOaOpeWPo+ivt+axguaXtu+8jOWwsee7p+e7reS9v+eUqOWkh+eUqOaOpeWPo+WGjeivt+axgjHmrKEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREb3dubG9hZFVybFJlYWwoZ2xvYmFsRGF0YS5kb21haW5CLCByZXNwb25zZSwgcHdkLCBmc2lkLCB0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8g5YW25a6D6ZSZ6K+vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VGlwSW5mbygn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcihyZXMucmVzcG9uc2UuZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFpbiA9PSBnbG9iYWxEYXRhLmRvbWFpbkIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+WPkeeUn+mUmeivr++8gScpCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcign6K+35rGC55u06ZO+5LiL6L295Zyw5Z2A5aSx6LSl77yB5pyN5Yqh5Zmo6L+U5Zue77yaJyArIHJlcy5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRTaGFyZUNvbXBsZXRlU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvL+mdnuWkh+eUqOaOpeWPo+ivt+axguaXtu+8jOWwsee7p+e7reS9v+eUqOWkh+eUqOaOpeWPo+WGjeivt+axgjHmrKEKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RG93bmxvYWRVcmxSZWFsKGdsb2JhbERhdGEuZG9tYWluQiwgcmVzcG9uc2UsIHB3ZCwgZnNpZCwgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb250aW1lb3V0OiAocmVzKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlcyk7CiAgICAgICAgICAgICAgICBpZiAoZG9tYWluID09IGdsb2JhbERhdGEuZG9tYWluQikgewogICAgICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvKCflj5HnlJ/plJnor6/vvIEnKQogICAgICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcign6K+35rGC55u06ZO+5LiL6L295Zyw5Z2A5pe26L+e5o6l5pyN5Yqh5Zmo5o6l5Y+j6LaF5pe277yM6K+36YeN6K+V77yBJyk7CiAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVDb21wbGV0ZVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8v6Z2e5aSH55So5o6l5Y+j6K+35rGC5pe277yM5bCx57un57ut5L2/55So5aSH55So5o6l5Y+j5YaN6K+35rGCMeasoQogICAgICAgICAgICAgICAgICAgIGdldERvd25sb2FkVXJsUmVhbChnbG9iYWxEYXRhLmRvbWFpbkIsIHJlc3BvbnNlLCBwd2QsIGZzaWQsIHRva2VuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25lcnJvcjogKHJlcykgPT4gewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXMpOwogICAgICAgICAgICAgICAgaWYgKGRvbWFpbiA9PSBnbG9iYWxEYXRhLmRvbWFpbkIpIHsKICAgICAgICAgICAgICAgICAgICBzaG93VGlwSW5mbygn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgICAgICAgICBzaG93VGlwRXJyb3IoJ+ivt+axguebtOmTvuS4i+i9veWcsOWdgOaXtui/nuaOpeacjeWKoeWZqOaOpeWPo+WHuumUme+8jOivt+mHjeivle+8gScpOwogICAgICAgICAgICAgICAgICAgIHNldFNoYXJlQ29tcGxldGVTdGF0ZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL+mdnuWkh+eUqOaOpeWPo+ivt+axguaXtu+8jOWwsee7p+e7reS9v+eUqOWkh+eUqOaOpeWPo+WGjeivt+axgjHmrKEKICAgICAgICAgICAgICAgICAgICBnZXREb3dubG9hZFVybFJlYWwoZ2xvYmFsRGF0YS5kb21haW5CLCByZXNwb25zZSwgcHdkLCBmc2lkLCB0b2tlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KGRldGFpbHMpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHNob3dUaXBJbmZvKCflj5HnlJ/plJnor6/vvIEnKQogICAgICAgICAgICBzaG93VGlwRXJyb3IoJ+i/nOeoi+ivt+axguacquefpemUmeivr++8jOivt+mHjeivle+8gScpOwogICAgICAgICAgICBzZXRTaGFyZUNvbXBsZXRlU3RhdGUoKTsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgfQogICAgfQoKICAgIC8v5p+l6K+i5o6l5Y+j5Zyw5Z2ALS0+5Y+R6LW35pyN5Yqh5Zmo6K+35rGCCiAgICBsZXQgZ2V0RG93bmxvYWRVcmwgPSBmdW5jdGlvbiAocmVzcG9uc2UsIHB3ZCwgZnNpZCwgdG9rZW4pIHsKICAgICAgICBsZXQgYmRVcmwgPSAiaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3BjbG91ZC91c2VyL2dldGluZm8/cXVlcnlfdWs9NDc3NDg1MzQwIjsKICAgICAgICAvLyBsZXQgYmRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo0ODgxOC9iZC9nZXRpbmZvLnBocD9xdWVyeV91az00Nzc0ODUzNDAiOwogICAgICAgIGxldCBkZXRhaWxzID0gewogICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICB0aW1lb3V0OiAxMDAwMCwgLy8gMTDnp5LotoXml7YKICAgICAgICAgICAgdXJsOiBiZFVybCArICcmJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJywKICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvKCfmraPlnKjmn6Xor6LmnI3liqHlmajmjqXlj6PlnLDlnYAuLi4nKTsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXMpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5pbmZvKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMucmVzcG9uc2UuZXJybm8gPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlmRG9tYWluID0gcmVzLnJlc3BvbnNlLnVzZXJfaW5mby5pbnRybzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGlmRG9tYWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERvd25sb2FkVXJsUmVhbChpZkRvbWFpbiwgcmVzcG9uc2UsIHB3ZCwgZnNpZCwgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgZ2V0RG93bmxvYWRVcmxSZWFsKGdsb2JhbERhdGEuZG9tYWluQiwgcmVzcG9uc2UsIHB3ZCwgZnNpZCwgdG9rZW4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB0cnkgewogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdChkZXRhaWxzKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAgZ2V0RG93bmxvYWRVcmxSZWFsKGdsb2JhbERhdGEuZG9tYWluQiwgcmVzcG9uc2UsIHB3ZCwgZnNpZCwgdG9rZW4pOwogICAgICAgIH0KICAgIH0KCiAgICAvL+ivt+axguebtOmTvuaIkOWKn+WQju+8jOaUueWPmOaMiemSrueCueWHu+S6i+S7tgogICAgbGV0IGNoYW5nZUNsaWNrRXZlbnQgPSBmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgLy/mmL7npLrmk43kvZzmjInpkq4KICAgICAgICBnZXRKcXVlcnkoKSgiI2RpYWxvZ09wQnV0dG9ucyIpLnNob3coKTsKICAgICAgICBpZiAocmVzLmVycm5vID09IDApIHsKICAgICAgICAgICAgLy/mraPluLjov5Tlm57vvJrlpI3liLbnm7Tpk77kuIvovb3lnLDlnYAKICAgICAgICAgICAgc2hvd1RpcEluZm8oJ+iOt+WPluebtOmTvuaIkOWKn++8jOivt+WcqOS4i+aWuemAieaLqeS4i+i9veaWueW8j+OAgicpOwogICAgICAgICAgICBsZXQgdXJsID0gcmVzLmFyaWEyaW5mby5wYXJhbXNbMV1bMF07CiAgICAgICAgICAgIGdldEpxdWVyeSgpKCIjZGlhbG9nQnRuSWRtIikuYXR0cigiZGF0YS1jbGlwYm9hcmQtdGV4dCIsIHVybCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9BcmlhMiDkuIvovb3mj5DnpLrvvIjpmpDol49pZG3kuIvovb3mjInpkq7vvIkKICAgICAgICAgICAgc2hvd1RpcEluZm8ocmVzLmVycik7CiAgICAgICAgICAgIGdldEpxdWVyeSgpKCIjZGlhbG9nQnRuSWRtIikuaGlkZSgpOwogICAgICAgICAgICBnZXRKcXVlcnkoKSgiI2RpYWxvZ09wVGlwc0lkbSIpLmhpZGUoKTsKICAgICAgICB9CiAgICAgICAgLy/lj5HpgIHoh7NBcmlhMgogICAgICAgIGxldCBidG5BcmlhMiA9IGdldEpxdWVyeSgpKCIjZGlhbG9nQnRuQXJpYSIpOwogICAgICAgIGJ0bkFyaWEyLnVuYmluZCgpOwogICAgICAgIGJ0bkFyaWEyLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgYXJpYURvd25sb2FkKHJlcyk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvL+ivt+axguebtOmTvuaIkOWKn+WQju+8jHRpcHMKICAgIGxldCBzaG93UXJUaXBzID0gZnVuY3Rpb24gKHJlcykgewogICAgICAgIGxldCBxckltZyA9IGdldEpxdWVyeSgpLnRyaW0ocmVzLnFySW1nKTsKICAgICAgICBsZXQgcXJUaXBzID0gZ2V0SnF1ZXJ5KCkudHJpbShyZXMucXJUaXBzKTsKICAgICAgICBsZXQgY29kZVRpcHMgPSBnZXRKcXVlcnkoKS50cmltKHJlcy5jb2RlVGlwcyk7CiAgICAgICAgbGV0IGNvZGVSZW1hcmsgPSBnZXRKcXVlcnkoKS50cmltKHJlcy5jb2RlUmVtYXJrKTsKICAgICAgICAvL2NvbnNvbGUubG9nKHFySW1nLCBxclRpcHMpOwogICAgICAgIGlmIChxckltZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGdldEpxdWVyeSgpKCIjZGlhbG9nUXJJbWciKS5hdHRyKCdzcmMnLCBxckltZyk7CiAgICAgICAgfQogICAgICAgIGlmIChxclRpcHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBnZXRKcXVlcnkoKSgiI2RpYWxvZ0JvdHRvbSIpLmh0bWwocXJUaXBzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvZGVUaXBzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZ2V0SnF1ZXJ5KCkoIiNkaWFsb2dWYXB0Y2hhQ29kZVRpcHMiKS5odG1sKGNvZGVUaXBzKS5zaG93KCk7CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlUmVtYXJrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZ2V0SnF1ZXJ5KCkoIiNkaWFsb2dDb2RlUmVtYXJrIikuaHRtbChjb2RlUmVtYXJrKS5zaG93KCk7CiAgICAgICAgfQogICAgfQogICAgLy/or7fmsYLnm7Tpk77miJDlip/lkI7vvIx4eHh4CiAgICBsZXQgc2F2ZVN0YXJ0U3RhdGUgPSBmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgbGV0IHN0YXJ0ID0gZ2V0U3RvcmFnZS5nZXRDb21tb25WYWx1ZSgnc3RhcnQnKTsKICAgICAgICBpZiAoc3RhcnQpIHJldHVybjsKICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgIGdldFN0b3JhZ2Uuc2V0Q29tbW9uVmFsdWUoJ3N0YXJ0Jywgc3RhcnQpOwogICAgfQogICAgLy/lj5HpgIHoh7NhcmlhMgogICAgbGV0IGFyaWFEb3dubG9hZCA9IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxldCBycGNEaXIgPSAoZ2V0SnF1ZXJ5KCkoIiNkaWFsb2dUeHRTYXZlUGF0aCIpLnZhbCgpKS5yZXBsYWNlKC9cXC9nLCAnLycpOwogICAgICAgIGxldCBycGNVcmwgPSBnZXRKcXVlcnkoKSgiI2RpYWxvZ0FyaWFSUEMiKS52YWwoKTsKICAgICAgICBsZXQgcnBjVG9rZW4gPSBnZXRKcXVlcnkoKSgiI2RpYWxvZ0FyaWFUb2tlbiIpLnZhbCgpOwogICAgICAgIC8v5L2/55So6Ieq5bex55qEQXJpYTIKICAgICAgICBpZiAoZ2V0Q29uZmlnKCkubWluZSA9PSAiY2hlY2tlZCIpIHsKICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm5vID09IDApIHsKICAgICAgICAgICAgICAgIC8v5q2j5bi46L+U5ZueCiAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuYXJpYTJpbmZvLnBhcmFtc1syXS5kaXI7CiAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuYXJpYTJpbmZvLnBhcmFtc1syXVsnbWF4LWNvbm5lY3Rpb24tcGVyLXNlcnZlciddOwogICAgICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlLmFyaWEyaW5mby5wYXJhbXNbMl0uc3BsaXQ7CiAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuYXJpYTJpbmZvLnBhcmFtc1syXVsncGllY2UtbGVuZ3RoJ107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0FyaWEyIG9ubHkKICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5hcmlhMmluZm8ucGFyYW1zWzBdWzBdLnBhcmFtc1syXS5kaXI7CiAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuYXJpYTJpbmZvLnBhcmFtc1swXVswXS5wYXJhbXNbMl1bJ21heC1jb25uZWN0aW9uLXBlci1zZXJ2ZXInXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5hcmlhMmluZm8ucGFyYW1zWzBdWzBdLnBhcmFtc1syXS5zcGxpdDsKICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5hcmlhMmluZm8ucGFyYW1zWzBdWzBdLnBhcmFtc1syXVsncGllY2UtbGVuZ3RoJ107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShyZXNwb25zZS5hcmlhMmluZm8pOwogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJ3t7e3JwY0Rpcn19fScsIHJwY0RpcikucmVwbGFjZSgne3t7cnBjVG9rZW59fX0nLCBycGNUb2tlbik7CiAgICAgICAgLy/lj5HpgIHoh7NhcmlhMgogICAgICAgIGxldCBkZXRhaWxzID0gewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsCiAgICAgICAgICAgIHRpbWVvdXQ6IDMwMDAsIC8vIDPnp5LotoXml7YKICAgICAgICAgICAgdXJsOiBycGNVcmwsCiAgICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICAgIG9ubG9hZHN0YXJ0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBzZXRTZW5kQXJpYVN0YXJ0U3RhdGUoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5Y+R6YCB6IezQXJpYTLvvIzov5Tlm57vvJonLCByZXMpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXMucmVzcG9uc2UucmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOato+W4uOi/lOWbngogICAgICAgICAgICAgICAgICAgICAgICBzZXRTZW5kQXJpYUNvbXBsZXRlU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvQXJpYSgnQXJpYTLlt7Lnu4/lvIDlp4vkuIvovb3kuobvvIzliIfmjaLov4fljrvnnIvnnIvlkKd+Jyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YW25a6D6ZSZ6K+vCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvQXJpYSgn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcEVycm9yKHJlcy5yZXNwb25zZS5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VuZEFyaWFDb21wbGV0ZVN0YXRlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvQXJpYSgn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgICAgICAgICBzaG93VGlwRXJyb3IoJ+WPkemAgeiHs0FyaWEy5aSx6LSl77yBPGJyIC8+5pyN5Yqh5Zmo6L+U5Zue77yaJyArIHJlcy5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgIHNldFNlbmRBcmlhQ29tcGxldGVTdGF0ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBvbnRpbWVvdXQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvQXJpYSgn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcign6L+e5o6l5YiwUlBD5pyN5Yqh5Zmo6LaF5pe277ya6K+35qOA5p+lQXJpYTLmmK/lkKblt7Lov57mjqXvvIxSUEPphY3nva7mmK/lkKbmraPnoa7vvIEnKTsKICAgICAgICAgICAgICAgIHNldFNlbmRBcmlhQ29tcGxldGVTdGF0ZShmYWxzZSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlcyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uZXJyb3I6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgIHNob3dUaXBJbmZvQXJpYSgn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgICAgIHNob3dUaXBFcnJvcign5Y+R6YCB6IezQXJpYTLml7blj5HnlJ/plJnor6/vvIzor7fph43or5XvvIEnKTsKICAgICAgICAgICAgICAgIHNldFNlbmRBcmlhQ29tcGxldGVTdGF0ZShmYWxzZSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KGRldGFpbHMpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHNob3dUaXBJbmZvQXJpYSgn5Y+R55Sf6ZSZ6K+v77yBJykKICAgICAgICAgICAgc2hvd1RpcEVycm9yKCflj5HpgIHoh7NBcmlhMuaXtuWPkeeUn+acquefpemUmeivr++8jOivt+mHjeivle+8gScpOwogICAgICAgICAgICBzZXRTZW5kQXJpYUNvbXBsZXRlU3RhdGUoZmFsc2UpOwogICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICB9CiAgICB9CiAgICAvL+S/neWtmOeUqOaIt+i+k+WFpeeahOaVsOaNru+8iOS4i+asoeW9k+m7mOiupOWAvOS9v+eUqO+8iQogICAgbGV0IHNhdmVMYXN0VXNlRGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBnZXRTdG9yYWdlLnNldExhc3RVc2UoJ3NhdmVQYXRoJywgZ2V0SnF1ZXJ5KCkoIiNkaWFsb2dUeHRTYXZlUGF0aCIpLnZhbCgpKTsKICAgICAgICBnZXRTdG9yYWdlLnNldExhc3RVc2UoJ2pzb25ScGMnLCBnZXRKcXVlcnkoKSgiI2RpYWxvZ0FyaWFSUEMiKS52YWwoKSk7CiAgICAgICAgZ2V0U3RvcmFnZS5zZXRMYXN0VXNlKCd0b2tlbicsIGdldEpxdWVyeSgpKCIjZGlhbG9nQXJpYVRva2VuIikudmFsKCkpOwogICAgICAgIGxldCBtaW5lID0gIiI7CiAgICAgICAgaWYgKGdldEpxdWVyeSgpKCIjZGlhbG9nQXJpYU1pbmUiKS5wcm9wKCJjaGVja2VkIikgPT0gdHJ1ZSkgewogICAgICAgICAgICBtaW5lID0gImNoZWNrZWQiOwogICAgICAgIH0KICAgICAgICBnZXRTdG9yYWdlLnNldExhc3RVc2UoJ21pbmUnLCBtaW5lKTsKICAgICAgICBnZXRTdG9yYWdlLnNldExhc3RVc2UoJ2NvZGUnLCBnZXRKcXVlcnkoKSgiI2RpYWxvZ0NvZGUiKS52YWwoKSk7CiAgICB9CgogICAgLy/lpI3liLbnm7Tpk77kuIvovb3lnLDlnYAKICAgIGxldCBjb3B5VXJsMkNsaXBib2FyZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgY29weUJ0biA9IG5ldyBDbGlwYm9hcmRKUygnI2RpYWxvZ0J0bklkbScpCiAgICAgICAgY29weUJ0bi5vbigic3VjY2VzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIC8vIOWkjeWItuaIkOWKn++8iOWPs+mUruS4i+i9veS4jeWlveS9v++8jOWIq+WGjeWwneivleS6hu+8iQogICAgICAgICAgICBzaG93VGlwSW5mb0lkbShg55u06ZO+5LiL6L295Zyw5Z2A5aSN5Yi25oiQ5Yqf77yBYCkKICAgICAgICB9KTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IOWFrOWFseWHveaVsAogICAgZnVuY3Rpb24gQ3V0U3RyaW5nKHN0ciwgbGVuLCBzdWZmaXgpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuICIiOwogICAgICAgIGlmIChsZW4gPD0gMCkgcmV0dXJuICIiOwogICAgICAgIGlmICghc3VmZml4KSBzdWZmaXggPSAiLi4uIjsKICAgICAgICBsZXQgdGVtcGxlbiA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KGkpID4gMjU1KSB7CiAgICAgICAgICAgICAgICB0ZW1wbGVuICs9IDI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0ZW1wbGVuKysKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVtcGxlbiA9PSBsZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGkgKyAxKSArIHN1ZmZpeDsKICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGVuID4gbGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBpKSArIHN1ZmZpeDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFJuZFB3ZChsZW4pIHsKICAgICAgICBsZW4gPSBsZW4gfHwgNDsKICAgICAgICBsZXQgJGNoYXJzID0gJ0FFSlBUWmFlanB0ejI1OCc7CiAgICAgICAgbGV0IG1heFBvcyA9ICRjaGFycy5sZW5ndGg7CiAgICAgICAgbGV0IHB3ZCA9ICcnOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgcHdkICs9ICRjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbWF4UG9zKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwd2Q7CiAgICB9CgogICAgZnVuY3Rpb24gY2hlY2tWc2l0ZSgpIHsKICAgICAgICBsZXQgdkRvbWFpbiA9IGRvY3VtZW50LmRvbWFpbi5zcGxpdCgnLicpLnNsaWNlKC0yKS5qb2luKCcuJyk7CiAgICAgICAgaWYgKHZEb21haW4gPT0gJ3ZhcHRjaGEuY29tJykgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIOW7tui/n+aJp+ihjO+8jOWQpuWImeaJvuS4jeWIsOWvueW6lOeahOaMiemSrgogICAgbGV0IHNsZWVwID0gZnVuY3Rpb24gKHRpbWUpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZSkpOwogICAgfTsKCiAgICAvKioKICAgICAqIOW3suefpeWJjeWQjuaWhyDlj5bkuK3pl7TmlofmnKwKICAgICAqIEBwYXJhbSBzdHIg5YWo5paHCiAgICAgKiBAcGFyYW0gc3RhcnQg5YmN5paHCiAgICAgKiBAcGFyYW0gZW5kIOWQjuaWhwogICAgICogQHJldHVybnMg5Lit6Ze05paH5pysIHx8IG51bGwKICAgICAqLwogICAgbGV0IGdldE1pZFN0ciA9IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBlbmQpIHsKICAgICAgICBsZXQgcmVzID0gc3RyLm1hdGNoKG5ldyBSZWdFeHAoYCR7c3RhcnR9KC4qPykke2VuZH1gKSkKICAgICAgICByZXR1cm4gcmVzID8gcmVzWzFdIDogbnVsbAogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gY3NzCiAgICBHTV9hZGRTdHlsZShgCiAgICAgICAgLnN3YWwtbW9kYWwgewogICAgICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICAgICAgbWluLXdpZHRoOiA3MzBweDsKICAgICAgICB9CiAgICAgICAgI2Rvd25sb2FkRGlhbG9newogICAgICAgICAgICB3aWR0aDogNzMwcHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAjZGlhbG9nVG9wewogICAgICAgICAgICBtYXJnaW46IDIwcHggMDsKICAgICAgICB9CiAgICAgICAgI2RpYWxvZ0ZpbGVOYW1lewogICAgICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI2RpYWxvZ01pZGRsZXt9CiAgICAgICAgI2RpYWxvZ0xlZnRUaXBzewogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgICAgICBtYXJnaW46IDAgMCAxMHB4IDBweDsKICAgICAgICAgICAgY29sb3I6ICM0YzQ0MzM7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICB9CiAgICAgICAgI2RpYWxvZ0xlZnRUaXBzMSwjZGlhbG9nTGVmdFRpcHMyewogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmNGM3NTg7CiAgICAgICAgICAgIHBhZGRpbmc6IDVweCAwIDVweCAwOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgfQogICAgICAgIC5kaWFsb2dMZWZ0VGlwc0xpbmt7CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB9CiAgICAgICAgI2RpYWxvZ1JpZ2h0ewogICAgICAgICAgICB3aWR0aDogNTAlOwogICAgICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHg7CiAgICAgICAgfQogICAgICAgICNkaWFsb2dDb250ZW50IGlucHV0ewogICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIH0KICAgICAgICAjZGlhbG9nUmVtYXJrewogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICB9CiAgICAgICAgI2RpYWxvZ1ZhcHRjaGFDb2RlewogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgI0VERDsKICAgICAgICB9CiAgICAgICAgI2RpYWxvZ1ZhcHRjaGFDb2RlSW5wdXR7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgI2RpYWxvZ0NvZGV7CiAgICAgICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgfQogICAgICAgICNkaWFsb2dDb2RlUmVtYXJre30KICAgICAgICAjZGlhbG9nUXJ7CiAgICAgICAgICAgIHdpZHRoOiAyNjVweDsKICAgICAgICAgICAgaGVpZ2h0OiAyNjVweDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIH0KICAgICAgICAjZGlhbG9nUXIgaW1newogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDI3cHg7CiAgICAgICAgfQogICAgICAgICNkaWFsb2dDbGVhcnsKICAgICAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgfQogICAgICAgICNkaWFsb2dCb3R0b217CiAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgICAgIG1hcmdpbjogMTVweCAtMjBweCAwIC0yMHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjRjNzU4OwogICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDAgMTBweCAyNXB4OwogICAgICAgICAgICBjb2xvcjogIzRjNDQzMzsKICAgICAgICB9CiAgICAgICAgLmJ0bkludGVyZmFjZSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMDAgIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICB0cmFuc2l0aW9uOiAuM3M7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMjVweCAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IE1pY3Jvc29mdCBZYUhlaSxTaW1IZWksVGFob21hOwogICAgICAgICAgICBmb250LXdlaWdodDogMTAwOwogICAgICAgICAgICBsZXR0ZXItc3BhY2luZzogMnB4OwogICAgICAgIH0KICAgICAgICAuYnRuR3JlZW4gewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjNWNiODVjICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICNkaWFsb2dEaXZTYXZlUGF0aHsKICAgICAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIH0KICAgICAgICAjZGlhbG9nT3BUaXBzLCAjZGlhbG9nT3BUaXBzQXJpYSwgI2RpYWxvZ09wVGlwc0lkbXsKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y0Yzc1ODsKICAgICAgICAgICAgcGFkZGluZzogM3B4IDE0cHg7CiAgICAgICAgICAgIGNvbG9yOiAjNGM0NDMzOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgICAgfQogICAgICAgICNkaWFsb2dPcEJ1dHRvbnN7CiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICAgICNkaWFsb2dCdG5JZG0sICNkaWFsb2dCdG5BcmlhewogICAgICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICAgIH0KICAgICAgICAjZGlhbG9nQXJpYUNvbmZpZ3sKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICAgIH0KICAgICAgICAjZGlhbG9nQXJpYUNvbmZpZ0NsaWNrewogICAgICAgICAgICBjb2xvcjogIzAwOThFQTsKICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgICAgIGN1cnNvcjpwb2ludGVyOwogICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIH0KICAgICAgICAjZGlhbG9nQXJpYUNvbmZpZ3sKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIH0KICAgICAgICAjZGlhbG9nTGVmdHsKICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgICAgIHdpZHRoOiA0NyU7CiAgICAgICAgfQogICAgICAgIC5zd2FsLWZvb3RlcnsKICAgICAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIH0KICAgIGApOwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IOmAu+i+keS7o+eggeW8gOWniwogICAgY29uc29sZS5sb2coJ+iEmuacrOW8gOWniycpOwogICAgZ2V0UGFyYW1zKCk7CgogICAgY29uc3QgZGl2VGlwcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZGl2VGlwcy5pZCA9ICJkaXZUaXBzIjsKCiAgICBsZXQgaXNMb2dpbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sb2dpbi1tYWluJyk7IC8vIOeZu+W9lemhtemdogogICAgbGV0IGlzVnNpdGUgPSBjaGVja1ZzaXRlKCk7CgogICAgLy/ovb3lhaV2YXB0Y2hhCiAgICBsZXQgdmFwdGNoYUFsbCA9IG51bGw7CgogICAgbGV0IHN0YXJ0ID0gZnVuY3Rpb24gKCkgey8v6L+t5Luj6LCD55SoCiAgICAgICAgaWYgKGlzVnNpdGUpIHJldHVybjsKICAgICAgICBsZXQgYnRuVXBsb2FkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25vZGUtdHlwZT11cGxvYWRdJyk7IC8vIOeuoeeQhumhtemdou+8muOAkOS4iuS8oOOAkQogICAgICAgIGxldCBidG5RckNvZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbm9kZS10eXBlPXFyQ29kZV0nKTsgLy8g5YiG5Lqr6aG16Z2i77ya44CQ5L+d5a2Y5Yiw5omL5py644CRCiAgICAgICAgaWYgKCFidG5VcGxvYWQgJiYgIWJ0blFyQ29kZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygn5om+5LiN5Yiw44CQ5LiK5Lyg44CR5oiW44CQ5L+d5a2Y5Yiw5omL5py644CR77yMMeenkuWQjuWwhumHjeaWsOafpeaJvu+8gScpOwogICAgICAgICAgICBzbGVlcCg1MDApLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgc3RhcnQoKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8g5Yib5bu65oyJ6ZKuIFNUQVJUCiAgICAgICAgbGV0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICBidG4uaWQgPSBidG5Eb3dubG9hZC5pZDsKICAgICAgICBidG4udGl0bGUgPSBidG5Eb3dubG9hZC50aXRsZTsKICAgICAgICBidG4uaW5uZXJIVE1MID0gYnRuRG93bmxvYWQuaHRtbCgpOwogICAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbjogMHB4Oyc7CiAgICAgICAgYnRuLmNsYXNzTmFtZSA9ICdnLWJ1dHRvbiBnLWJ1dHRvbi1yZWQtbGFyZ2UnOwogICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGluaXRCdXR0b25FdmVudCgpOwogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSk7CiAgICAgICAgLy8g5Yib5bu65oyJ6ZKuIEVORAoKICAgICAgICAvLyDmt7vliqDmjInpkq4gU1RBUlQKICAgICAgICBsZXQgcGFyZW50ID0gbnVsbDsKICAgICAgICBpZiAoYnRuVXBsb2FkKSB7CiAgICAgICAgICAgIHBhcmVudCA9IGJ0blVwbG9hZC5wYXJlbnROb2RlOwogICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGJ0biwgcGFyZW50LmNoaWxkTm9kZXNbMF0pOwogICAgICAgIH0gZWxzZSBpZiAoYnRuUXJDb2RlKSB7CiAgICAgICAgICAgIHBhcmVudCA9IGJ0blFyQ29kZS5wYXJlbnROb2RlOwogICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGJ0biwgYnRuUXJDb2RlKTsKICAgICAgICB9CiAgICAgICAgLy8g5re75Yqg5oyJ6ZKuIEVORAoKICAgICAgICAvLyDkv67mlLnmkJzntKLmoYblrr3luqbvvIzlkKbliJnlnKjlsI/mmL7npLrlmajkuIrvvIzlhYPntKDkvJrph43lj6AKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuJykuZm9yRWFjaCgoZSkgPT4gewogICAgICAgICAgICBpZiAoZS50ZXh0Q29udGVudC5pbmNsdWRlcygn5pCc57Si5oKo55qE5paH5Lu2JykpIHsKICAgICAgICAgICAgICAgIGxldCBkaXZQID0gZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZQogICAgICAgICAgICAgICAgZGl2UC5zdHlsZS5tYXhXaWR0aCA9ICcyMDBweCc7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBzbGVlcCg1MDApLnRoZW4oKCkgPT4gewogICAgICAgIHN0YXJ0KCk7CiAgICB9KQp9KSgpOwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj","requires":[{"meta":{"name":"sweetalert.min.js","url":"https://cdn.jsdelivr.net/npm/sweetalert@2.1.2/dist/sweetalert.min.js","ts":1637743723174,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuc3dhbD1lKCk6dC5zd2FsPWUoKX0odGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG8pe2lmKG5bb10pcmV0dXJuIG5bb10uZXhwb3J0czt2YXIgcj1uW29dPXtpOm8sbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtvXS5jYWxsKHIuZXhwb3J0cyxyLHIuZXhwb3J0cyxlKSxyLmw9ITAsci5leHBvcnRzfXZhciBuPXt9O3JldHVybiBlLm09dCxlLmM9bixlLmQ9ZnVuY3Rpb24odCxuLG8pe2Uubyh0LG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6b30pfSxlLm49ZnVuY3Rpb24odCl7dmFyIG49dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChuLCJhIixuKSxufSxlLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LGUucD0iIixlKGUucz04KX0oW2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJzd2FsLWJ1dHRvbiI7ZS5DTEFTU19OQU1FUz17TU9EQUw6InN3YWwtbW9kYWwiLE9WRVJMQVk6InN3YWwtb3ZlcmxheSIsU0hPV19NT0RBTDoic3dhbC1vdmVybGF5LS1zaG93LW1vZGFsIixNT0RBTF9USVRMRToic3dhbC10aXRsZSIsTU9EQUxfVEVYVDoic3dhbC10ZXh0IixJQ09OOiJzd2FsLWljb24iLElDT05fQ1VTVE9NOiJzd2FsLWljb24tLWN1c3RvbSIsQ09OVEVOVDoic3dhbC1jb250ZW50IixGT09URVI6InN3YWwtZm9vdGVyIixCVVRUT05fQ09OVEFJTkVSOiJzd2FsLWJ1dHRvbi1jb250YWluZXIiLEJVVFRPTjpvLENPTkZJUk1fQlVUVE9OOm8rIi0tY29uZmlybSIsQ0FOQ0VMX0JVVFRPTjpvKyItLWNhbmNlbCIsREFOR0VSX0JVVFRPTjpvKyItLWRhbmdlciIsQlVUVE9OX0xPQURJTkc6bysiLS1sb2FkaW5nIixCVVRUT05fTE9BREVSOm8rIl9fbG9hZGVyIn0sZS5kZWZhdWx0PWUuQ0xBU1NfTkFNRVN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZ2V0Tm9kZT1mdW5jdGlvbih0KXt2YXIgZT0iLiIrdDtyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKX0sZS5zdHJpbmdUb05vZGU9ZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuaW5uZXJIVE1MPXQudHJpbSgpLGUuZmlyc3RDaGlsZH0sZS5pbnNlcnRBZnRlcj1mdW5jdGlvbih0LGUpe3ZhciBuPWUubmV4dFNpYmxpbmc7ZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LG4pfSxlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7dC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHQpfSxlLnRocm93RXJyPWZ1bmN0aW9uKHQpe3Rocm93IHQ9dC5yZXBsYWNlKC8gKyg/PSApL2csIiIpLCJTd2VldEFsZXJ0OiAiKyh0PXQudHJpbSgpKX0sZS5pc1BsYWluT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gbnVsbD09PWV8fGU9PT1PYmplY3QucHJvdG90eXBlfSxlLm9yZGluYWxTdWZmaXhPZj1mdW5jdGlvbih0KXt2YXIgZT10JTEwLG49dCUxMDA7cmV0dXJuIDE9PT1lJiYxMSE9PW4/dCsic3QiOjI9PT1lJiYxMiE9PW4/dCsibmQiOjM9PT1lJiYxMyE9PW4/dCsicmQiOnQrInRoIn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbyhuKDI1KSk7dmFyIHI9bigyNik7ZS5vdmVybGF5TWFya3VwPXIuZGVmYXVsdCxvKG4oMjcpKSxvKG4oMjgpKSxvKG4oMjkpKTt2YXIgaT1uKDApLGE9aS5kZWZhdWx0Lk1PREFMX1RJVExFLHM9aS5kZWZhdWx0Lk1PREFMX1RFWFQsYz1pLmRlZmF1bHQuSUNPTixsPWkuZGVmYXVsdC5GT09URVI7ZS5pY29uTWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytjKyciPjwvZGl2PicsZS50aXRsZU1hcmt1cD0nXG4gIDxkaXYgY2xhc3M9IicrYSsnIj48L2Rpdj5cbicsZS50ZXh0TWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytzKyciPjwvZGl2PicsZS5mb290ZXJNYXJrdXA9J1xuICA8ZGl2IGNsYXNzPSInK2wrJyI+PC9kaXY+XG4nfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpO2UuQ09ORklSTV9LRVk9ImNvbmZpcm0iLGUuQ0FOQ0VMX0tFWT0iY2FuY2VsIjt2YXIgcj17dmlzaWJsZTohMCx0ZXh0Om51bGwsdmFsdWU6bnVsbCxjbGFzc05hbWU6IiIsY2xvc2VNb2RhbDohMH0saT1PYmplY3QuYXNzaWduKHt9LHIse3Zpc2libGU6ITEsdGV4dDoiQ2FuY2VsIix2YWx1ZTpudWxsfSksYT1PYmplY3QuYXNzaWduKHt9LHIse3RleHQ6Ik9LIix2YWx1ZTohMH0pO2UuZGVmYXVsdEJ1dHRvbkxpc3Q9e2NhbmNlbDppLGNvbmZpcm06YX07dmFyIHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgZS5DT05GSVJNX0tFWTpyZXR1cm4gYTtjYXNlIGUuQ0FOQ0VMX0tFWTpyZXR1cm4gaTtkZWZhdWx0OnZhciBuPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLHt0ZXh0Om4sdmFsdWU6dH0pfX0sYz1mdW5jdGlvbih0LGUpe3ZhciBuPXModCk7cmV0dXJuITA9PT1lP09iamVjdC5hc3NpZ24oe30sbix7dmlzaWJsZTohMH0pOiJzdHJpbmciPT10eXBlb2YgZT9PYmplY3QuYXNzaWduKHt9LG4se3Zpc2libGU6ITAsdGV4dDplfSk6by5pc1BsYWluT2JqZWN0KGUpP09iamVjdC5hc3NpZ24oe3Zpc2libGU6ITB9LG4sZSk6T2JqZWN0LmFzc2lnbih7fSxuLHt2aXNpYmxlOiExfSl9LGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXt9LG49MCxvPU9iamVjdC5rZXlzKHQpO248by5sZW5ndGg7bisrKXt2YXIgcj1vW25dLGE9dFtyXSxzPWMocixhKTtlW3JdPXN9cmV0dXJuIGUuY2FuY2VsfHwoZS5jYW5jZWw9aSksZX0sdT1mdW5jdGlvbih0KXt2YXIgbj17fTtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpuW2UuQ0FOQ0VMX0tFWV09T2JqZWN0LmFzc2lnbih7fSxpLHt2aXNpYmxlOiExfSk7YnJlYWs7Y2FzZSAyOm5bZS5DQU5DRUxfS0VZXT1jKGUuQ0FOQ0VMX0tFWSx0WzBdKSxuW2UuQ09ORklSTV9LRVldPWMoZS5DT05GSVJNX0tFWSx0WzFdKTticmVhaztkZWZhdWx0Om8udGhyb3dFcnIoIkludmFsaWQgbnVtYmVyIG9mICdidXR0b25zJyBpbiBhcnJheSAoIit0Lmxlbmd0aCsiKS5cbiAgICAgIElmIHlvdSB3YW50IG1vcmUgdGhhbiAyIGJ1dHRvbnMsIHlvdSBuZWVkIHRvIHVzZSBhbiBvYmplY3QhIil9cmV0dXJuIG59O2UuZ2V0QnV0dG9uTGlzdE9wdHM9ZnVuY3Rpb24odCl7dmFyIG49ZS5kZWZhdWx0QnV0dG9uTGlzdDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bltlLkNPTkZJUk1fS0VZXT1jKGUuQ09ORklSTV9LRVksdCk6QXJyYXkuaXNBcnJheSh0KT9uPXUodCk6by5pc1BsYWluT2JqZWN0KHQpP249bCh0KTohMD09PXQ/bj11KFshMCwhMF0pOiExPT09dD9uPXUoWyExLCExXSk6dm9pZCAwPT09dCYmKG49ZS5kZWZhdWx0QnV0dG9uTGlzdCksbn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMSkscj1uKDIpLGk9bigwKSxhPWkuZGVmYXVsdC5NT0RBTCxzPWkuZGVmYXVsdC5PVkVSTEFZLGM9bigzMCksbD1uKDMxKSx1PW4oMzIpLGY9bigzMyk7ZS5pbmplY3RFbEludG9Nb2RhbD1mdW5jdGlvbih0KXt2YXIgZT1vLmdldE5vZGUoYSksbj1vLnN0cmluZ1RvTm9kZSh0KTtyZXR1cm4gZS5hcHBlbmRDaGlsZChuKSxufTt2YXIgZD1mdW5jdGlvbih0KXt0LmNsYXNzTmFtZT1hLHQudGV4dENvbnRlbnQ9IiJ9LHA9ZnVuY3Rpb24odCxlKXtkKHQpO3ZhciBuPWUuY2xhc3NOYW1lO24mJnQuY2xhc3NMaXN0LmFkZChuKX07ZS5pbml0TW9kYWxDb250ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPW8uZ2V0Tm9kZShhKTtwKGUsdCksYy5kZWZhdWx0KHQuaWNvbiksbC5pbml0VGl0bGUodC50aXRsZSksbC5pbml0VGV4dCh0LnRleHQpLGYuZGVmYXVsdCh0LmNvbnRlbnQpLHUuZGVmYXVsdCh0LmJ1dHRvbnMsdC5kYW5nZXJNb2RlKX07dmFyIG09ZnVuY3Rpb24oKXt2YXIgdD1vLmdldE5vZGUocyksZT1vLnN0cmluZ1RvTm9kZShyLm1vZGFsTWFya3VwKTt0LmFwcGVuZENoaWxkKGUpfTtlLmRlZmF1bHQ9bX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigzKSxyPXtpc09wZW46ITEscHJvbWlzZTpudWxsLGFjdGlvbnM6e30sdGltZXI6bnVsbH0saT1PYmplY3QuYXNzaWduKHt9LHIpO2UucmVzZXRTdGF0ZT1mdW5jdGlvbigpe2k9T2JqZWN0LmFzc2lnbih7fSxyKX0sZS5zZXRBY3Rpb25WYWx1ZT1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGEoby5DT05GSVJNX0tFWSx0KTtmb3IodmFyIGUgaW4gdClhKGUsdFtlXSl9O3ZhciBhPWZ1bmN0aW9uKHQsZSl7aS5hY3Rpb25zW3RdfHwoaS5hY3Rpb25zW3RdPXt9KSxPYmplY3QuYXNzaWduKGkuYWN0aW9uc1t0XSx7dmFsdWU6ZX0pfTtlLnNldEFjdGlvbk9wdGlvbnNGb3I9ZnVuY3Rpb24odCxlKXt2YXIgbj0odm9pZCAwPT09ZT97fTplKS5jbG9zZU1vZGFsLG89dm9pZCAwPT09bnx8bjtPYmplY3QuYXNzaWduKGkuYWN0aW9uc1t0XSx7Y2xvc2VNb2RhbDpvfSl9LGUuZGVmYXVsdD1pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9bigzKSxpPW4oMCksYT1pLmRlZmF1bHQuT1ZFUkxBWSxzPWkuZGVmYXVsdC5TSE9XX01PREFMLGM9aS5kZWZhdWx0LkJVVFRPTixsPWkuZGVmYXVsdC5CVVRUT05fTE9BRElORyx1PW4oNSk7ZS5vcGVuTW9kYWw9ZnVuY3Rpb24oKXtvLmdldE5vZGUoYSkuY2xhc3NMaXN0LmFkZChzKSx1LmRlZmF1bHQuaXNPcGVuPSEwfTt2YXIgZj1mdW5jdGlvbigpe28uZ2V0Tm9kZShhKS5jbGFzc0xpc3QucmVtb3ZlKHMpLHUuZGVmYXVsdC5pc09wZW49ITF9O2Uub25BY3Rpb249ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ci5DQU5DRUxfS0VZKTt2YXIgZT11LmRlZmF1bHQuYWN0aW9uc1t0XSxuPWUudmFsdWU7aWYoITE9PT1lLmNsb3NlTW9kYWwpe3ZhciBpPWMrIi0tIit0O28uZ2V0Tm9kZShpKS5jbGFzc0xpc3QuYWRkKGwpfWVsc2UgZigpO3UuZGVmYXVsdC5wcm9taXNlLnJlc29sdmUobil9LGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LHUuZGVmYXVsdCk7cmV0dXJuIGRlbGV0ZSB0LnByb21pc2UsZGVsZXRlIHQudGltZXIsdH0sZS5zdG9wTG9hZGluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuIitjKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3RbZV0uY2xhc3NMaXN0LnJlbW92ZShsKX19fSxmdW5jdGlvbih0LGUpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfHwoMCxldmFsKSgidGhpcyIpfWNhdGNoKHQpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfXQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3QuZXhwb3J0cz1lLnN3ZWV0QWxlcnQ9big5KX0pLmNhbGwoZSxuKDcpKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt0LmV4cG9ydHM9ZS5zd2FsPW4oMTApfSkuY2FsbChlLG4oNykpfSxmdW5jdGlvbih0LGUsbil7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJm4oMTEpLG4oMTYpO3ZhciBvPW4oMjMpLmRlZmF1bHQ7dC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1uKDEyKTsic3RyaW5nIj09dHlwZW9mIG8mJihvPVtbdC5pLG8sIiJdXSk7dmFyIHI9e2luc2VydEF0OiJ0b3AifTtyLnRyYW5zZm9ybT12b2lkIDA7bigxNCkobyxyKTtvLmxvY2FscyYmKHQuZXhwb3J0cz1vLmxvY2Fscyl9LGZ1bmN0aW9uKHQsZSxuKXtlPXQuZXhwb3J0cz1uKDEzKSh2b2lkIDApLGUucHVzaChbdC5pLCcuc3dhbC1pY29uLS1lcnJvcntib3JkZXItY29sb3I6I2YyNzQ3NDstd2Via2l0LWFuaW1hdGlvbjphbmltYXRlRXJyb3JJY29uIC41czthbmltYXRpb246YW5pbWF0ZUVycm9ySWNvbiAuNXN9LnN3YWwtaWNvbi0tZXJyb3JfX3gtbWFya3twb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrOy13ZWJraXQtYW5pbWF0aW9uOmFuaW1hdGVYTWFyayAuNXM7YW5pbWF0aW9uOmFuaW1hdGVYTWFyayAuNXN9LnN3YWwtaWNvbi0tZXJyb3JfX2xpbmV7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjVweDt3aWR0aDo0N3B4O2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NDtkaXNwbGF5OmJsb2NrO3RvcDozN3B4O2JvcmRlci1yYWRpdXM6MnB4fS5zd2FsLWljb24tLWVycm9yX19saW5lLS1sZWZ0ey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7bGVmdDoxN3B4fS5zd2FsLWljb24tLWVycm9yX19saW5lLS1yaWdodHstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7cmlnaHQ6MTZweH1ALXdlYmtpdC1rZXlmcmFtZXMgYW5pbWF0ZUVycm9ySWNvbnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlWCgwZGVnKTt0cmFuc2Zvcm06cm90YXRlWCgwZGVnKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgYW5pbWF0ZUVycm9ySWNvbnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlWCgwZGVnKTt0cmFuc2Zvcm06cm90YXRlWCgwZGVnKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBhbmltYXRlWE1hcmt7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4xNSk7dHJhbnNmb3JtOnNjYWxlKDEuMTUpO21hcmdpbi10b3A6LTZweH10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7bWFyZ2luLXRvcDowO29wYWNpdHk6MX19QGtleWZyYW1lcyBhbmltYXRlWE1hcmt7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4xNSk7dHJhbnNmb3JtOnNjYWxlKDEuMTUpO21hcmdpbi10b3A6LTZweH10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7bWFyZ2luLXRvcDowO29wYWNpdHk6MX19LnN3YWwtaWNvbi0td2FybmluZ3tib3JkZXItY29sb3I6I2Y4YmI4Njstd2Via2l0LWFuaW1hdGlvbjpwdWxzZVdhcm5pbmcgLjc1cyBpbmZpbml0ZSBhbHRlcm5hdGU7YW5pbWF0aW9uOnB1bHNlV2FybmluZyAuNzVzIGluZmluaXRlIGFsdGVybmF0ZX0uc3dhbC1pY29uLS13YXJuaW5nX19ib2R5e3dpZHRoOjVweDtoZWlnaHQ6NDdweDt0b3A6MTBweDtib3JkZXItcmFkaXVzOjJweDttYXJnaW4tbGVmdDotMnB4fS5zd2FsLWljb24tLXdhcm5pbmdfX2JvZHksLnN3YWwtaWNvbi0td2FybmluZ19fZG90e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO2JhY2tncm91bmQtY29sb3I6I2Y4YmI4Nn0uc3dhbC1pY29uLS13YXJuaW5nX19kb3R7d2lkdGg6N3B4O2hlaWdodDo3cHg7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLWxlZnQ6LTRweDtib3R0b206LTExcHh9QC13ZWJraXQta2V5ZnJhbWVzIHB1bHNlV2FybmluZ3swJXtib3JkZXItY29sb3I6I2Y4ZDQ4Nn10b3tib3JkZXItY29sb3I6I2Y4YmI4Nn19QGtleWZyYW1lcyBwdWxzZVdhcm5pbmd7MCV7Ym9yZGVyLWNvbG9yOiNmOGQ0ODZ9dG97Ym9yZGVyLWNvbG9yOiNmOGJiODZ9fS5zd2FsLWljb24tLXN1Y2Nlc3N7Ym9yZGVyLWNvbG9yOiNhNWRjODZ9LnN3YWwtaWNvbi0tc3VjY2VzczphZnRlciwuc3dhbC1pY29uLS1zdWNjZXNzOmJlZm9yZXtjb250ZW50OiIiO2JvcmRlci1yYWRpdXM6NTAlO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjYwcHg7aGVpZ2h0OjEyMHB4O2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5zd2FsLWljb24tLXN1Y2Nlc3M6YmVmb3Jle2JvcmRlci1yYWRpdXM6MTIwcHggMCAwIDEyMHB4O3RvcDotN3B4O2xlZnQ6LTMzcHg7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjo2MHB4IDYwcHg7dHJhbnNmb3JtLW9yaWdpbjo2MHB4IDYwcHh9LnN3YWwtaWNvbi0tc3VjY2VzczphZnRlcntib3JkZXItcmFkaXVzOjAgMTIwcHggMTIwcHggMDt0b3A6LTExcHg7bGVmdDozMHB4Oy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46MCA2MHB4O3RyYW5zZm9ybS1vcmlnaW46MCA2MHB4Oy13ZWJraXQtYW5pbWF0aW9uOnJvdGF0ZVBsYWNlaG9sZGVyIDQuMjVzIGVhc2UtaW47YW5pbWF0aW9uOnJvdGF0ZVBsYWNlaG9sZGVyIDQuMjVzIGVhc2UtaW59LnN3YWwtaWNvbi0tc3VjY2Vzc19fcmluZ3t3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlcjo0cHggc29saWQgaHNsYSg5OCw1NSUsNjklLC4yKTtib3JkZXItcmFkaXVzOjUwJTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTRweDt0b3A6LTRweDt6LWluZGV4OjJ9LnN3YWwtaWNvbi0tc3VjY2Vzc19faGlkZS1jb3JuZXJze3dpZHRoOjVweDtoZWlnaHQ6OTBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cGFkZGluZzoxcHg7cG9zaXRpb246YWJzb2x1dGU7bGVmdDoyOHB4O3RvcDo4cHg7ei1pbmRleDoxOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbC1pY29uLS1zdWNjZXNzX19saW5le2hlaWdodDo1cHg7YmFja2dyb3VuZC1jb2xvcjojYTVkYzg2O2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czoycHg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyfS5zd2FsLWljb24tLXN1Y2Nlc3NfX2xpbmUtLXRpcHt3aWR0aDoyNXB4O2xlZnQ6MTRweDt0b3A6NDZweDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpOy13ZWJraXQtYW5pbWF0aW9uOmFuaW1hdGVTdWNjZXNzVGlwIC43NXM7YW5pbWF0aW9uOmFuaW1hdGVTdWNjZXNzVGlwIC43NXN9LnN3YWwtaWNvbi0tc3VjY2Vzc19fbGluZS0tbG9uZ3t3aWR0aDo0N3B4O3JpZ2h0OjhweDt0b3A6MzhweDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7LXdlYmtpdC1hbmltYXRpb246YW5pbWF0ZVN1Y2Nlc3NMb25nIC43NXM7YW5pbWF0aW9uOmFuaW1hdGVTdWNjZXNzTG9uZyAuNzVzfUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVQbGFjZWhvbGRlcnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QGtleWZyYW1lcyByb3RhdGVQbGFjZWhvbGRlcnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIGFuaW1hdGVTdWNjZXNzVGlwezAle3dpZHRoOjA7bGVmdDoxcHg7dG9wOjE5cHh9NTQle3dpZHRoOjA7bGVmdDoxcHg7dG9wOjE5cHh9NzAle3dpZHRoOjUwcHg7bGVmdDotOHB4O3RvcDozN3B4fTg0JXt3aWR0aDoxN3B4O2xlZnQ6MjFweDt0b3A6NDhweH10b3t3aWR0aDoyNXB4O2xlZnQ6MTRweDt0b3A6NDVweH19QGtleWZyYW1lcyBhbmltYXRlU3VjY2Vzc1RpcHswJXt3aWR0aDowO2xlZnQ6MXB4O3RvcDoxOXB4fTU0JXt3aWR0aDowO2xlZnQ6MXB4O3RvcDoxOXB4fTcwJXt3aWR0aDo1MHB4O2xlZnQ6LThweDt0b3A6MzdweH04NCV7d2lkdGg6MTdweDtsZWZ0OjIxcHg7dG9wOjQ4cHh9dG97d2lkdGg6MjVweDtsZWZ0OjE0cHg7dG9wOjQ1cHh9fUAtd2Via2l0LWtleWZyYW1lcyBhbmltYXRlU3VjY2Vzc0xvbmd7MCV7d2lkdGg6MDtyaWdodDo0NnB4O3RvcDo1NHB4fTY1JXt3aWR0aDowO3JpZ2h0OjQ2cHg7dG9wOjU0cHh9ODQle3dpZHRoOjU1cHg7cmlnaHQ6MDt0b3A6MzVweH10b3t3aWR0aDo0N3B4O3JpZ2h0OjhweDt0b3A6MzhweH19QGtleWZyYW1lcyBhbmltYXRlU3VjY2Vzc0xvbmd7MCV7d2lkdGg6MDtyaWdodDo0NnB4O3RvcDo1NHB4fTY1JXt3aWR0aDowO3JpZ2h0OjQ2cHg7dG9wOjU0cHh9ODQle3dpZHRoOjU1cHg7cmlnaHQ6MDt0b3A6MzVweH10b3t3aWR0aDo0N3B4O3JpZ2h0OjhweDt0b3A6MzhweH19LnN3YWwtaWNvbi0taW5mb3tib3JkZXItY29sb3I6I2M5ZGFlMX0uc3dhbC1pY29uLS1pbmZvOmJlZm9yZXt3aWR0aDo1cHg7aGVpZ2h0OjI5cHg7Ym90dG9tOjE3cHg7Ym9yZGVyLXJhZGl1czoycHg7bWFyZ2luLWxlZnQ6LTJweH0uc3dhbC1pY29uLS1pbmZvOmFmdGVyLC5zd2FsLWljb24tLWluZm86YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7YmFja2dyb3VuZC1jb2xvcjojYzlkYWUxfS5zd2FsLWljb24tLWluZm86YWZ0ZXJ7d2lkdGg6N3B4O2hlaWdodDo3cHg7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLWxlZnQ6LTNweDt0b3A6MTlweH0uc3dhbC1pY29ue3dpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXdpZHRoOjRweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czo1MCU7cGFkZGluZzowO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Y29udGVudC1ib3g7bWFyZ2luOjIwcHggYXV0b30uc3dhbC1pY29uOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MzJweH0uc3dhbC1pY29uLS1jdXN0b217d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjB9LnN3YWwtaWNvbiBpbWd7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5zd2FsLXRpdGxle2NvbG9yOnJnYmEoMCwwLDAsLjY1KTtmb250LXdlaWdodDo2MDA7dGV4dC10cmFuc2Zvcm06bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MTNweCAxNnB4O2ZvbnQtc2l6ZToyN3B4O2xpbmUtaGVpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjB9LnN3YWwtdGl0bGU6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDoyNnB4fS5zd2FsLXRpdGxlOm5vdCg6Zmlyc3QtY2hpbGQpe3BhZGRpbmctYm90dG9tOjB9LnN3YWwtdGl0bGU6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjEzcHh9LnN3YWwtdGV4dHtmb250LXNpemU6MTZweDtwb3NpdGlvbjpyZWxhdGl2ZTtmbG9hdDpub25lO2xpbmUtaGVpZ2h0Om5vcm1hbDt2ZXJ0aWNhbC1hbGlnbjp0b3A7dGV4dC1hbGlnbjpsZWZ0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowO3BhZGRpbmc6MCAxMHB4O2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjpyZ2JhKDAsMCwwLC42NCk7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDIwcHgpO292ZXJmbG93LXdyYXA6YnJlYWstd29yZDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnN3YWwtdGV4dDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjQ1cHh9LnN3YWwtdGV4dDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206NDVweH0uc3dhbC1mb290ZXJ7dGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nLXRvcDoxM3B4O21hcmdpbi10b3A6MTNweDtwYWRkaW5nOjEzcHggMTZweDtib3JkZXItcmFkaXVzOmluaGVyaXQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9LnN3YWwtYnV0dG9uLWNvbnRhaW5lcnttYXJnaW46NXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlfS5zd2FsLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM3Y2QxZjk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXJhZGl1czo1cHg7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmc6MTBweCAyNHB4O21hcmdpbjowO2N1cnNvcjpwb2ludGVyfS5zd2FsLWJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNzhjYmYyfS5zd2FsLWJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNzBiY2UwfS5zd2FsLWJ1dHRvbjpmb2N1c3tvdXRsaW5lOm5vbmU7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSg0MywxMTQsMTY1LC4yOSl9LnN3YWwtYnV0dG9uW2Rpc2FibGVkXXtvcGFjaXR5Oi41O2N1cnNvcjpkZWZhdWx0fS5zd2FsLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uc3dhbC1idXR0b24tLWNhbmNlbHtjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2VmZWZlZn0uc3dhbC1idXR0b24tLWNhbmNlbDpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4fS5zd2FsLWJ1dHRvbi0tY2FuY2VsOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNkN2Q3ZDd9LnN3YWwtYnV0dG9uLS1jYW5jZWw6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSgxMTYsMTM2LDE1MCwuMjkpfS5zd2FsLWJ1dHRvbi0tZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2U2NDk0Mn0uc3dhbC1idXR0b24tLWRhbmdlcjpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZGY0NzQwfS5zd2FsLWJ1dHRvbi0tZGFuZ2VyOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjZjQyM2J9LnN3YWwtYnV0dG9uLS1kYW5nZXI6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSgxNjUsNDMsNDMsLjI5KX0uc3dhbC1jb250ZW50e3BhZGRpbmc6MCAyMHB4O21hcmdpbi10b3A6MjBweDtmb250LXNpemU6bWVkaXVtfS5zd2FsLWNvbnRlbnQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjIwcHh9LnN3YWwtY29udGVudF9faW5wdXQsLnN3YWwtY29udGVudF9fdGV4dGFyZWF7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxNHB4O2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xNCk7cGFkZGluZzoxMHB4IDEzcHg7Ym9yZGVyLXJhZGl1czoycHg7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjJzfS5zd2FsLWNvbnRlbnRfX2lucHV0OmZvY3VzLC5zd2FsLWNvbnRlbnRfX3RleHRhcmVhOmZvY3Vze291dGxpbmU6bm9uZTtib3JkZXItY29sb3I6IzZkYjhmZn0uc3dhbC1jb250ZW50X190ZXh0YXJlYXtyZXNpemU6dmVydGljYWx9LnN3YWwtYnV0dG9uLS1sb2FkaW5ne2NvbG9yOnRyYW5zcGFyZW50fS5zd2FsLWJ1dHRvbi0tbG9hZGluZ34uc3dhbC1idXR0b25fX2xvYWRlcntvcGFjaXR5OjF9LnN3YWwtYnV0dG9uX19sb2FkZXJ7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OmF1dG87d2lkdGg6NDNweDt6LWluZGV4OjI7bGVmdDo1MCU7dG9wOjUwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKTt0ZXh0LWFsaWduOmNlbnRlcjtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6MH0uc3dhbC1idXR0b25fX2xvYWRlciBkaXZ7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7bWFyZ2luOjJweDtvcGFjaXR5Oi40O2JvcmRlci1yYWRpdXM6N3B4O2JhY2tncm91bmQtY29sb3I6aHNsYSgwLDAlLDEwMCUsLjkpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnM7LXdlYmtpdC1hbmltYXRpb246c3dhbC1sb2FkaW5nLWFuaW0gMXMgaW5maW5pdGU7YW5pbWF0aW9uOnN3YWwtbG9hZGluZy1hbmltIDFzIGluZmluaXRlfS5zd2FsLWJ1dHRvbl9fbG9hZGVyIGRpdjpudGgtY2hpbGQoM24rMil7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LjE1czthbmltYXRpb24tZGVsYXk6LjE1c30uc3dhbC1idXR0b25fX2xvYWRlciBkaXY6bnRoLWNoaWxkKDNuKzMpey13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi4zczthbmltYXRpb24tZGVsYXk6LjNzfUAtd2Via2l0LWtleWZyYW1lcyBzd2FsLWxvYWRpbmctYW5pbXswJXtvcGFjaXR5Oi40fTIwJXtvcGFjaXR5Oi40fTUwJXtvcGFjaXR5OjF9dG97b3BhY2l0eTouNH19QGtleWZyYW1lcyBzd2FsLWxvYWRpbmctYW5pbXswJXtvcGFjaXR5Oi40fTIwJXtvcGFjaXR5Oi40fTUwJXtvcGFjaXR5OjF9dG97b3BhY2l0eTouNH19LnN3YWwtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MDtvdmVyZmxvdy15OmF1dG87YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40KTt6LWluZGV4OjEwMDAwO3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuM3N9LnN3YWwtb3ZlcmxheTpiZWZvcmV7Y29udGVudDoiICI7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2hlaWdodDoxMDAlfS5zd2FsLW92ZXJsYXktLXNob3ctbW9kYWx7b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmF1dG99LnN3YWwtb3ZlcmxheS0tc2hvdy1tb2RhbCAuc3dhbC1tb2RhbHtvcGFjaXR5OjE7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1hbmltYXRpb246c2hvd1N3ZWV0QWxlcnQgLjNzO2FuaW1hdGlvbjpzaG93U3dlZXRBbGVydCAuM3M7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5zd2FsLW1vZGFse3dpZHRoOjQ3OHB4O29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtib3JkZXItcmFkaXVzOjVweDtwb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjIwcHggYXV0bztkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjo1MCUgNTAlO3RyYW5zZm9ybS1vcmlnaW46NTAlIDUwJTt6LWluZGV4OjEwMDAxO3RyYW5zaXRpb246b3BhY2l0eSAuMnMsLXdlYmtpdC10cmFuc2Zvcm0gLjNzO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyxvcGFjaXR5IC4yczt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuM3Msb3BhY2l0eSAuMnMsLXdlYmtpdC10cmFuc2Zvcm0gLjNzfUBtZWRpYSAobWF4LXdpZHRoOjUwMHB4KXsuc3dhbC1tb2RhbHt3aWR0aDpjYWxjKDEwMCUgLSAyMHB4KX19QC13ZWJraXQta2V5ZnJhbWVzIHNob3dTd2VldEFsZXJ0ezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0xJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguNSk7dHJhbnNmb3JtOnNjYWxlKC41KX00NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSk7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOTUpO3RyYW5zZm9ybTpzY2FsZSguOTUpfXRvey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBzaG93U3dlZXRBbGVydHswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9MSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUpO3RyYW5zZm9ybTpzY2FsZSguNSl9NDUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMDUpO3RyYW5zZm9ybTpzY2FsZSgxLjA1KX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjk1KTt0cmFuc2Zvcm06c2NhbGUoLjk1KX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9fScsIiJdKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQsZSl7dmFyIG49dFsxXXx8IiIscj10WzNdO2lmKCFyKXJldHVybiBuO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hKXt2YXIgaT1vKHIpO3JldHVybltuXS5jb25jYXQoci5zb3VyY2VzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4iLyojIHNvdXJjZVVSTD0iK3Iuc291cmNlUm9vdCt0KyIgKi8ifSkpLmNvbmNhdChbaV0pLmpvaW4oIlxuIil9cmV0dXJuW25dLmpvaW4oIlxuIil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4iLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodCkpKSkrIiAqLyJ9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGUpe3ZhciBvPW4oZSx0KTtyZXR1cm4gZVsyXT8iQG1lZGlhICIrZVsyXSsieyIrbysifSI6b30pLmpvaW4oIiIpfSxlLmk9ZnVuY3Rpb24odCxuKXsic3RyaW5nIj09dHlwZW9mIHQmJih0PVtbbnVsbCx0LCIiXV0pO2Zvcih2YXIgbz17fSxyPTA7cjx0aGlzLmxlbmd0aDtyKyspe3ZhciBpPXRoaXNbcl1bMF07Im51bWJlciI9PXR5cGVvZiBpJiYob1tpXT0hMCl9Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXTsibnVtYmVyIj09dHlwZW9mIGFbMF0mJm9bYVswXV18fChuJiYhYVsyXT9hWzJdPW46biYmKGFbMl09IigiK2FbMl0rIikgYW5kICgiK24rIikiKSxlLnB1c2goYSkpfX0sZX19LGZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl0scj1tW28uaWRdO2lmKHIpe3IucmVmcysrO2Zvcih2YXIgaT0wO2k8ci5wYXJ0cy5sZW5ndGg7aSsrKXIucGFydHNbaV0oby5wYXJ0c1tpXSk7Zm9yKDtpPG8ucGFydHMubGVuZ3RoO2krKylyLnBhcnRzLnB1c2godShvLnBhcnRzW2ldLGUpKX1lbHNle2Zvcih2YXIgYT1bXSxpPTA7aTxvLnBhcnRzLmxlbmd0aDtpKyspYS5wdXNoKHUoby5wYXJ0c1tpXSxlKSk7bVtvLmlkXT17aWQ6by5pZCxyZWZzOjEscGFydHM6YX19fX1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciBuPVtdLG89e30scj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgaT10W3JdLGE9ZS5iYXNlP2lbMF0rZS5iYXNlOmlbMF0scz1pWzFdLGM9aVsyXSxsPWlbM10sdT17Y3NzOnMsbWVkaWE6Yyxzb3VyY2VNYXA6bH07b1thXT9vW2FdLnBhcnRzLnB1c2godSk6bi5wdXNoKG9bYV09e2lkOmEscGFydHM6W3VdfSl9cmV0dXJuIG59ZnVuY3Rpb24gaSh0LGUpe3ZhciBuPXYodC5pbnNlcnRJbnRvKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0SW50bycgcGFyYW1ldGVyIGlzIGludmFsaWQuIik7dmFyIG89d1t3Lmxlbmd0aC0xXTtpZigidG9wIj09PXQuaW5zZXJ0QXQpbz9vLm5leHRTaWJsaW5nP24uaW5zZXJ0QmVmb3JlKGUsby5uZXh0U2libGluZyk6bi5hcHBlbmRDaGlsZChlKTpuLmluc2VydEJlZm9yZShlLG4uZmlyc3RDaGlsZCksdy5wdXNoKGUpO2Vsc2V7aWYoImJvdHRvbSIhPT10Lmluc2VydEF0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICdpbnNlcnRBdCcuIE11c3QgYmUgJ3RvcCcgb3IgJ2JvdHRvbScuIik7bi5hcHBlbmRDaGlsZChlKX19ZnVuY3Rpb24gYSh0KXtpZihudWxsPT09dC5wYXJlbnROb2RlKXJldHVybiExO3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTt2YXIgZT13LmluZGV4T2YodCk7ZT49MCYmdy5zcGxpY2UoZSwxKX1mdW5jdGlvbiBzKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7cmV0dXJuIHQuYXR0cnMudHlwZT0idGV4dC9jc3MiLGwoZSx0LmF0dHJzKSxpKHQsZSksZX1mdW5jdGlvbiBjKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTtyZXR1cm4gdC5hdHRycy50eXBlPSJ0ZXh0L2NzcyIsdC5hdHRycy5yZWw9InN0eWxlc2hlZXQiLGwoZSx0LmF0dHJzKSxpKHQsZSksZX1mdW5jdGlvbiBsKHQsZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXt0LnNldEF0dHJpYnV0ZShuLGVbbl0pfSl9ZnVuY3Rpb24gdSh0LGUpe3ZhciBuLG8scixpO2lmKGUudHJhbnNmb3JtJiZ0LmNzcyl7aWYoIShpPWUudHJhbnNmb3JtKHQuY3NzKSkpcmV0dXJuIGZ1bmN0aW9uKCl7fTt0LmNzcz1pfWlmKGUuc2luZ2xldG9uKXt2YXIgbD1oKys7bj1nfHwoZz1zKGUpKSxvPWYuYmluZChudWxsLG4sbCwhMSkscj1mLmJpbmQobnVsbCxuLGwsITApfWVsc2UgdC5zb3VyY2VNYXAmJiJmdW5jdGlvbiI9PXR5cGVvZiBVUkwmJiJmdW5jdGlvbiI9PXR5cGVvZiBVUkwuY3JlYXRlT2JqZWN0VVJMJiYiZnVuY3Rpb24iPT10eXBlb2YgVVJMLnJldm9rZU9iamVjdFVSTCYmImZ1bmN0aW9uIj09dHlwZW9mIEJsb2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hPyhuPWMoZSksbz1wLmJpbmQobnVsbCxuLGUpLHI9ZnVuY3Rpb24oKXthKG4pLG4uaHJlZiYmVVJMLnJldm9rZU9iamVjdFVSTChuLmhyZWYpfSk6KG49cyhlKSxvPWQuYmluZChudWxsLG4pLHI9ZnVuY3Rpb24oKXthKG4pfSk7cmV0dXJuIG8odCksZnVuY3Rpb24oZSl7aWYoZSl7aWYoZS5jc3M9PT10LmNzcyYmZS5tZWRpYT09PXQubWVkaWEmJmUuc291cmNlTWFwPT09dC5zb3VyY2VNYXApcmV0dXJuO28odD1lKX1lbHNlIHIoKX19ZnVuY3Rpb24gZih0LGUsbixvKXt2YXIgcj1uPyIiOm8uY3NzO2lmKHQuc3R5bGVTaGVldCl0LnN0eWxlU2hlZXQuY3NzVGV4dD14KGUscik7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShyKSxhPXQuY2hpbGROb2RlczthW2VdJiZ0LnJlbW92ZUNoaWxkKGFbZV0pLGEubGVuZ3RoP3QuaW5zZXJ0QmVmb3JlKGksYVtlXSk6dC5hcHBlbmRDaGlsZChpKX19ZnVuY3Rpb24gZCh0LGUpe3ZhciBuPWUuY3NzLG89ZS5tZWRpYTtpZihvJiZ0LnNldEF0dHJpYnV0ZSgibWVkaWEiLG8pLHQuc3R5bGVTaGVldCl0LnN0eWxlU2hlZXQuY3NzVGV4dD1uO2Vsc2V7Zm9yKDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKX19ZnVuY3Rpb24gcCh0LGUsbil7dmFyIG89bi5jc3Mscj1uLnNvdXJjZU1hcCxpPXZvaWQgMD09PWUuY29udmVydFRvQWJzb2x1dGVVcmxzJiZyOyhlLmNvbnZlcnRUb0Fic29sdXRlVXJsc3x8aSkmJihvPXkobykpLHImJihvKz0iXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocikpKSkrIiAqLyIpO3ZhciBhPW5ldyBCbG9iKFtvXSx7dHlwZToidGV4dC9jc3MifSkscz10LmhyZWY7dC5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoYSkscyYmVVJMLnJldm9rZU9iamVjdFVSTChzKX12YXIgbT17fSxiPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksZX19KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdyYmZG9jdW1lbnQmJmRvY3VtZW50LmFsbCYmIXdpbmRvdy5hdG9ifSksdj1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHZvaWQgMD09PWVbbl0mJihlW25dPXQuY2FsbCh0aGlzLG4pKSxlW25dfX0oZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCl9KSxnPW51bGwsaD0wLHc9W10seT1uKDE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIERFQlVHJiZERUJVRyYmIm9iamVjdCIhPXR5cGVvZiBkb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzdHlsZS1sb2FkZXIgY2Fubm90IGJlIHVzZWQgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCIpO2U9ZXx8e30sZS5hdHRycz0ib2JqZWN0Ij09dHlwZW9mIGUuYXR0cnM/ZS5hdHRyczp7fSxlLnNpbmdsZXRvbnx8KGUuc2luZ2xldG9uPWIoKSksZS5pbnNlcnRJbnRvfHwoZS5pbnNlcnRJbnRvPSJoZWFkIiksZS5pbnNlcnRBdHx8KGUuaW5zZXJ0QXQ9ImJvdHRvbSIpO3ZhciBuPXIodCxlKTtyZXR1cm4gbyhuLGUpLGZ1bmN0aW9uKHQpe2Zvcih2YXIgaT1bXSxhPTA7YTxuLmxlbmd0aDthKyspe3ZhciBzPW5bYV0sYz1tW3MuaWRdO2MucmVmcy0tLGkucHVzaChjKX1pZih0KXtvKHIodCxlKSxlKX1mb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIGM9aVthXTtpZigwPT09Yy5yZWZzKXtmb3IodmFyIGw9MDtsPGMucGFydHMubGVuZ3RoO2wrKyljLnBhcnRzW2xdKCk7ZGVsZXRlIG1bYy5pZF19fX19O3ZhciB4PWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIHRbZV09bix0LmZpbHRlcihCb29sZWFuKS5qb2luKCJcbiIpfX0oKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5sb2NhdGlvbjtpZighZSl0aHJvdyBuZXcgRXJyb3IoImZpeFVybHMgcmVxdWlyZXMgd2luZG93LmxvY2F0aW9uIik7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDt2YXIgbj1lLnByb3RvY29sKyIvLyIrZS5ob3N0LG89bitlLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sIi8iKTtyZXR1cm4gdC5yZXBsYWNlKC91cmxccypcKCgoPzpbXikoXXxcKCg/OlteKShdK3xcKFteKShdKlwpKSpcKSkqKVwpL2dpLGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS50cmltKCkucmVwbGFjZSgvXiIoLiopIiQvLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KS5yZXBsYWNlKC9eJyguKiknJC8sZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pO2lmKC9eKCN8ZGF0YTp8aHR0cDpcL1wvfGh0dHBzOlwvXC98ZmlsZTpcL1wvXC8pL2kudGVzdChyKSlyZXR1cm4gdDt2YXIgaTtyZXR1cm4gaT0wPT09ci5pbmRleE9mKCIvLyIpP3I6MD09PXIuaW5kZXhPZigiLyIpP24rcjpvK3IucmVwbGFjZSgvXlwuXC8vLCIiKSwidXJsKCIrSlNPTi5zdHJpbmdpZnkoaSkrIikifSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIG89bigxNyk7InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fHdpbmRvdy5Qcm9taXNlfHwod2luZG93LlByb21pc2U9byksbigyMSksU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc3x8KFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBlJiYoZT0wKSwhKGUrdC5sZW5ndGg+dGhpcy5sZW5ndGgpJiYtMSE9PXRoaXMuaW5kZXhPZih0LGUpfSksQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJpbmNsdWRlcyIse3ZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKCcidGhpcyIgaXMgbnVsbCBvciBub3QgZGVmaW5lZCcpO3ZhciBuPU9iamVjdCh0aGlzKSxvPW4ubGVuZ3RoPj4+MDtpZigwPT09bylyZXR1cm4hMTtmb3IodmFyIHI9MHxlLGk9TWF0aC5tYXgocj49MD9yOm8tTWF0aC5hYnMociksMCk7aTxvOyl7aWYoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fCJudW1iZXIiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiBlJiZpc05hTih0KSYmaXNOYU4oZSl9KG5baV0sdCkpcmV0dXJuITA7aSsrfXJldHVybiExfX0pLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZmdW5jdGlvbih0KXt0LmZvckVhY2goZnVuY3Rpb24odCl7dC5oYXNPd25Qcm9wZXJ0eSgicmVtb3ZlIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyZW1vdmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX19KX0pfShbRWxlbWVudC5wcm90b3R5cGUsQ2hhcmFjdGVyRGF0YS5wcm90b3R5cGUsRG9jdW1lbnRUeXBlLnByb3RvdHlwZV0pfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihuKXtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0LmFwcGx5KGUsYXJndW1lbnRzKX19ZnVuY3Rpb24gaSh0KXtpZigib2JqZWN0IiE9dHlwZW9mIHRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Iik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IGEgZnVuY3Rpb24iKTt0aGlzLl9zdGF0ZT0wLHRoaXMuX2hhbmRsZWQ9ITEsdGhpcy5fdmFsdWU9dm9pZCAwLHRoaXMuX2RlZmVycmVkcz1bXSxmKHQsdGhpcyl9ZnVuY3Rpb24gYSh0LGUpe2Zvcig7Mz09PXQuX3N0YXRlOyl0PXQuX3ZhbHVlO2lmKDA9PT10Ll9zdGF0ZSlyZXR1cm4gdm9pZCB0Ll9kZWZlcnJlZHMucHVzaChlKTt0Ll9oYW5kbGVkPSEwLGkuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCl7dmFyIG49MT09PXQuX3N0YXRlP2Uub25GdWxmaWxsZWQ6ZS5vblJlamVjdGVkO2lmKG51bGw9PT1uKXJldHVybiB2b2lkKDE9PT10Ll9zdGF0ZT9zOmMpKGUucHJvbWlzZSx0Ll92YWx1ZSk7dmFyIG87dHJ5e289bih0Ll92YWx1ZSl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgYyhlLnByb21pc2UsdCl9cyhlLnByb21pc2Usbyl9KX1mdW5jdGlvbiBzKHQsZSl7dHJ5e2lmKGU9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuIik7aWYoZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpKXt2YXIgbj1lLnRoZW47aWYoZSBpbnN0YW5jZW9mIGkpcmV0dXJuIHQuX3N0YXRlPTMsdC5fdmFsdWU9ZSx2b2lkIGwodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIHZvaWQgZihyKG4sZSksdCl9dC5fc3RhdGU9MSx0Ll92YWx1ZT1lLGwodCl9Y2F0Y2goZSl7Yyh0LGUpfX1mdW5jdGlvbiBjKHQsZSl7dC5fc3RhdGU9Mix0Ll92YWx1ZT1lLGwodCl9ZnVuY3Rpb24gbCh0KXsyPT09dC5fc3RhdGUmJjA9PT10Ll9kZWZlcnJlZHMubGVuZ3RoJiZpLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpe3QuX2hhbmRsZWR8fGkuX3VuaGFuZGxlZFJlamVjdGlvbkZuKHQuX3ZhbHVlKX0pO2Zvcih2YXIgZT0wLG49dC5fZGVmZXJyZWRzLmxlbmd0aDtlPG47ZSsrKWEodCx0Ll9kZWZlcnJlZHNbZV0pO3QuX2RlZmVycmVkcz1udWxsfWZ1bmN0aW9uIHUodCxlLG4pe3RoaXMub25GdWxmaWxsZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsLHRoaXMub25SZWplY3RlZD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGwsdGhpcy5wcm9taXNlPW59ZnVuY3Rpb24gZih0LGUpe3ZhciBuPSExO3RyeXt0KGZ1bmN0aW9uKHQpe258fChuPSEwLHMoZSx0KSl9LGZ1bmN0aW9uKHQpe258fChuPSEwLGMoZSx0KSl9KX1jYXRjaCh0KXtpZihuKXJldHVybjtuPSEwLGMoZSx0KX19dmFyIGQ9c2V0VGltZW91dDtpLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKG51bGwsdCl9LGkucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihvKTtyZXR1cm4gYSh0aGlzLG5ldyB1KHQsZSxuKSksbn0saS5hbGw9ZnVuY3Rpb24odCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk7cmV0dXJuIG5ldyBpKGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gbyhpLGEpe3RyeXtpZihhJiYoIm9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYSkpe3ZhciBzPWEudGhlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgcylyZXR1cm4gdm9pZCBzLmNhbGwoYSxmdW5jdGlvbih0KXtvKGksdCl9LG4pfWVbaV09YSwwPT0tLXImJnQoZSl9Y2F0Y2godCl7bih0KX19aWYoMD09PWUubGVuZ3RoKXJldHVybiB0KFtdKTtmb3IodmFyIHI9ZS5sZW5ndGgsaT0wO2k8ZS5sZW5ndGg7aSsrKW8oaSxlW2ldKX0pfSxpLnJlc29sdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3Rvcj09PWk/dDpuZXcgaShmdW5jdGlvbihlKXtlKHQpfSl9LGkucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaShmdW5jdGlvbihlLG4pe24odCl9KX0saS5yYWNlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaShmdW5jdGlvbihlLG4pe2Zvcih2YXIgbz0wLHI9dC5sZW5ndGg7bzxyO28rKyl0W29dLnRoZW4oZSxuKX0pfSxpLl9pbW1lZGlhdGVGbj0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZnVuY3Rpb24odCl7ZSh0KX18fGZ1bmN0aW9uKHQpe2QodCwwKX0saS5fdW5oYW5kbGVkUmVqZWN0aW9uRm49ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLHQpfSxpLl9zZXRJbW1lZGlhdGVGbj1mdW5jdGlvbih0KXtpLl9pbW1lZGlhdGVGbj10fSxpLl9zZXRVbmhhbmRsZWRSZWplY3Rpb25Gbj1mdW5jdGlvbih0KXtpLl91bmhhbmRsZWRSZWplY3Rpb25Gbj10fSx2b2lkIDAhPT10JiZ0LmV4cG9ydHM/dC5leHBvcnRzPWk6bi5Qcm9taXNlfHwobi5Qcm9taXNlPWkpfSh0aGlzKX0pLmNhbGwoZSxuKDE4KS5zZXRJbW1lZGlhdGUpfSxmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuX2lkPXQsdGhpcy5fY2xlYXJGbj1lfXZhciByPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtlLnNldFRpbWVvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8oci5jYWxsKHNldFRpbWVvdXQsd2luZG93LGFyZ3VtZW50cyksY2xlYXJUaW1lb3V0KX0sZS5zZXRJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiBuZXcgbyhyLmNhbGwoc2V0SW50ZXJ2YWwsd2luZG93LGFyZ3VtZW50cyksY2xlYXJJbnRlcnZhbCl9LGUuY2xlYXJUaW1lb3V0PWUuY2xlYXJJbnRlcnZhbD1mdW5jdGlvbih0KXt0JiZ0LmNsb3NlKCl9LG8ucHJvdG90eXBlLnVucmVmPW8ucHJvdG90eXBlLnJlZj1mdW5jdGlvbigpe30sby5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LHRoaXMuX2lkKX0sZS5lbnJvbGw9ZnVuY3Rpb24odCxlKXtjbGVhclRpbWVvdXQodC5faWRsZVRpbWVvdXRJZCksdC5faWRsZVRpbWVvdXQ9ZX0sZS51bmVucm9sbD1mdW5jdGlvbih0KXtjbGVhclRpbWVvdXQodC5faWRsZVRpbWVvdXRJZCksdC5faWRsZVRpbWVvdXQ9LTF9LGUuX3VucmVmQWN0aXZlPWUuYWN0aXZlPWZ1bmN0aW9uKHQpe2NsZWFyVGltZW91dCh0Ll9pZGxlVGltZW91dElkKTt2YXIgZT10Ll9pZGxlVGltZW91dDtlPj0wJiYodC5faWRsZVRpbWVvdXRJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fb25UaW1lb3V0JiZ0Ll9vblRpbWVvdXQoKX0sZSkpfSxuKDE5KSxlLnNldEltbWVkaWF0ZT1zZXRJbW1lZGlhdGUsZS5jbGVhckltbWVkaWF0ZT1jbGVhckltbWVkaWF0ZX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0LGUpeyFmdW5jdGlvbih0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1uZXcgRnVuY3Rpb24oIiIrdCkpO2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT1hcmd1bWVudHNbbisxXTt2YXIgbz17Y2FsbGJhY2s6dCxhcmdzOmV9O3JldHVybiBsW2NdPW8scyhjKSxjKyt9ZnVuY3Rpb24gcih0KXtkZWxldGUgbFt0XX1mdW5jdGlvbiBpKHQpe3ZhciBlPXQuY2FsbGJhY2ssbz10LmFyZ3M7c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDA6ZSgpO2JyZWFrO2Nhc2UgMTplKG9bMF0pO2JyZWFrO2Nhc2UgMjplKG9bMF0sb1sxXSk7YnJlYWs7Y2FzZSAzOmUob1swXSxvWzFdLG9bMl0pO2JyZWFrO2RlZmF1bHQ6ZS5hcHBseShuLG8pfX1mdW5jdGlvbiBhKHQpe2lmKHUpc2V0VGltZW91dChhLDAsdCk7ZWxzZXt2YXIgZT1sW3RdO2lmKGUpe3U9ITA7dHJ5e2koZSl9ZmluYWxseXtyKHQpLHU9ITF9fX19aWYoIXQuc2V0SW1tZWRpYXRlKXt2YXIgcyxjPTEsbD17fSx1PSExLGY9dC5kb2N1bWVudCxkPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2Q9ZCYmZC5zZXRUaW1lb3V0P2Q6dCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHQucHJvY2Vzcyk/ZnVuY3Rpb24oKXtzPWZ1bmN0aW9uKHQpe2UubmV4dFRpY2soZnVuY3Rpb24oKXthKHQpfSl9fSgpOmZ1bmN0aW9uKCl7aWYodC5wb3N0TWVzc2FnZSYmIXQuaW1wb3J0U2NyaXB0cyl7dmFyIGU9ITAsbj10Lm9ubWVzc2FnZTtyZXR1cm4gdC5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtlPSExfSx0LnBvc3RNZXNzYWdlKCIiLCIqIiksdC5vbm1lc3NhZ2U9bixlfX0oKT9mdW5jdGlvbigpe3ZhciBlPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixuPWZ1bmN0aW9uKG4pe24uc291cmNlPT09dCYmInN0cmluZyI9PXR5cGVvZiBuLmRhdGEmJjA9PT1uLmRhdGEuaW5kZXhPZihlKSYmYSgrbi5kYXRhLnNsaWNlKGUubGVuZ3RoKSl9O3QuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4sITEpOnQuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsbikscz1mdW5jdGlvbihuKXt0LnBvc3RNZXNzYWdlKGUrbiwiKiIpfX0oKTp0Lk1lc3NhZ2VDaGFubmVsP2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IE1lc3NhZ2VDaGFubmVsO3QucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2EodC5kYXRhKX0scz1mdW5jdGlvbihlKXt0LnBvcnQyLnBvc3RNZXNzYWdlKGUpfX0oKTpmJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGYuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/ZnVuY3Rpb24oKXt2YXIgdD1mLmRvY3VtZW50RWxlbWVudDtzPWZ1bmN0aW9uKGUpe3ZhciBuPWYuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXthKGUpLG4ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsdC5yZW1vdmVDaGlsZChuKSxuPW51bGx9LHQuYXBwZW5kQ2hpbGQobil9fSgpOmZ1bmN0aW9uKCl7cz1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KGEsMCx0KX19KCksZC5zZXRJbW1lZGlhdGU9byxkLmNsZWFySW1tZWRpYXRlPXJ9fSgidW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/dm9pZCAwPT09dD90aGlzOnQ6c2VsZil9KS5jYWxsKGUsbig3KSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIG8oKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHIodCl7aWYodT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigodT09PW58fCF1KSYmc2V0VGltZW91dClyZXR1cm4gdT1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIHUodCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIHUuY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIHUuY2FsbCh0aGlzLHQsMCl9fX1mdW5jdGlvbiBpKHQpe2lmKGY9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigoZj09PW98fCFmKSYmY2xlYXJUaW1lb3V0KXJldHVybiBmPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e3JldHVybiBmKHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gZi5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIGYuY2FsbCh0aGlzLHQpfX19ZnVuY3Rpb24gYSgpe2ImJnAmJihiPSExLHAubGVuZ3RoP209cC5jb25jYXQobSk6dj0tMSxtLmxlbmd0aCYmcygpKX1mdW5jdGlvbiBzKCl7aWYoIWIpe3ZhciB0PXIoYSk7Yj0hMDtmb3IodmFyIGU9bS5sZW5ndGg7ZTspe2ZvcihwPW0sbT1bXTsrK3Y8ZTspcCYmcFt2XS5ydW4oKTt2PS0xLGU9bS5sZW5ndGh9cD1udWxsLGI9ITEsaSh0KX19ZnVuY3Rpb24gYyh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfWZ1bmN0aW9uIGwoKXt9dmFyIHUsZixkPXQuZXhwb3J0cz17fTshZnVuY3Rpb24oKXt0cnl7dT0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om59Y2F0Y2godCl7dT1ufXRyeXtmPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0Om99Y2F0Y2godCl7Zj1vfX0oKTt2YXIgcCxtPVtdLGI9ITEsdj0tMTtkLm5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07bS5wdXNoKG5ldyBjKHQsZSkpLDEhPT1tLmxlbmd0aHx8Ynx8cihzKX0sYy5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZC50aXRsZT0iYnJvd3NlciIsZC5icm93c2VyPSEwLGQuZW52PXt9LGQuYXJndj1bXSxkLnZlcnNpb249IiIsZC52ZXJzaW9ucz17fSxkLm9uPWwsZC5hZGRMaXN0ZW5lcj1sLGQub25jZT1sLGQub2ZmPWwsZC5yZW1vdmVMaXN0ZW5lcj1sLGQucmVtb3ZlQWxsTGlzdGVuZXJzPWwsZC5lbWl0PWwsZC5wcmVwZW5kTGlzdGVuZXI9bCxkLnByZXBlbmRPbmNlTGlzdGVuZXI9bCxkLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm5bXX0sZC5iaW5kaW5nPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sZC5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGQuY2hkaXI9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sZC51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuKDIyKS5wb2x5ZmlsbCgpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8odCxlKXtpZih2b2lkIDA9PT10fHxudWxsPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBmaXJzdCBhcmd1bWVudCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KHQpLG89MTtvPGFyZ3VtZW50cy5sZW5ndGg7bysrKXt2YXIgcj1hcmd1bWVudHNbb107aWYodm9pZCAwIT09ciYmbnVsbCE9PXIpZm9yKHZhciBpPU9iamVjdC5rZXlzKE9iamVjdChyKSksYT0wLHM9aS5sZW5ndGg7YTxzO2ErKyl7dmFyIGM9aVthXSxsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixjKTt2b2lkIDAhPT1sJiZsLmVudW1lcmFibGUmJihuW2NdPXJbY10pfX1yZXR1cm4gbn1mdW5jdGlvbiByKCl7T2JqZWN0LmFzc2lnbnx8T2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdCwiYXNzaWduIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6b30pfXQuZXhwb3J0cz17YXNzaWduOm8scG9seWZpbGw6cn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMjQpLHI9big2KSxpPW4oNSksYT1uKDM2KSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj1hLmdldE9wdHMuYXBwbHkodm9pZCAwLHQpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LGUpe2kuZGVmYXVsdC5wcm9taXNlPXtyZXNvbHZlOnQscmVqZWN0OmV9LG8uZGVmYXVsdChuKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vcGVuTW9kYWwoKX0pfSl9fTtzLmNsb3NlPXIub25BY3Rpb24scy5nZXRTdGF0ZT1yLmdldFN0YXRlLHMuc2V0QWN0aW9uVmFsdWU9aS5zZXRBY3Rpb25WYWx1ZSxzLnN0b3BMb2FkaW5nPXIuc3RvcExvYWRpbmcscy5zZXREZWZhdWx0cz1hLnNldERlZmF1bHRzLGUuZGVmYXVsdD1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9bigwKSxpPXIuZGVmYXVsdC5NT0RBTCxhPW4oNCkscz1uKDM0KSxjPW4oMzUpLGw9bigxKTtlLmluaXQ9ZnVuY3Rpb24odCl7by5nZXROb2RlKGkpfHwoZG9jdW1lbnQuYm9keXx8bC50aHJvd0VycigiWW91IGNhbiBvbmx5IHVzZSBTd2VldEFsZXJ0IEFGVEVSIHRoZSBET00gaGFzIGxvYWRlZCEiKSxzLmRlZmF1bHQoKSxhLmRlZmF1bHQoKSksYS5pbml0TW9kYWxDb250ZW50KHQpLGMuZGVmYXVsdCh0KX0sZS5kZWZhdWx0PWUuaW5pdH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigwKSxyPW8uZGVmYXVsdC5NT0RBTDtlLm1vZGFsTWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytyKyciIHJvbGU9ImRpYWxvZyIgYXJpYS1tb2RhbD0idHJ1ZSI+PC9kaXY+JyxlLmRlZmF1bHQ9ZS5tb2RhbE1hcmt1cH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigwKSxyPW8uZGVmYXVsdC5PVkVSTEFZLGk9JzxkaXYgXG4gICAgY2xhc3M9IicrcisnIlxuICAgIHRhYkluZGV4PSItMSI+XG4gIDwvZGl2Pic7ZS5kZWZhdWx0PWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMCkscj1vLmRlZmF1bHQuSUNPTjtlLmVycm9ySWNvbk1hcmt1cD1mdW5jdGlvbigpe3ZhciB0PXIrIi0tZXJyb3IiLGU9dCsiX19saW5lIjtyZXR1cm4nXG4gICAgPGRpdiBjbGFzcz0iJyt0KydfX3gtbWFyayI+XG4gICAgICA8c3BhbiBjbGFzcz0iJytlKyIgIitlKyctLWxlZnQiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPSInK2UrIiAiK2UrJy0tcmlnaHQiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgJ30sZS53YXJuaW5nSWNvbk1hcmt1cD1mdW5jdGlvbigpe3ZhciB0PXIrIi0td2FybmluZyI7cmV0dXJuJ1xuICAgIDxzcGFuIGNsYXNzPSInK3QrJ19fYm9keSI+XG4gICAgICA8c3BhbiBjbGFzcz0iJyt0KydfX2RvdCI+PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgJ30sZS5zdWNjZXNzSWNvbk1hcmt1cD1mdW5jdGlvbigpe3ZhciB0PXIrIi0tc3VjY2VzcyI7cmV0dXJuJ1xuICAgIDxzcGFuIGNsYXNzPSInK3QrIl9fbGluZSAiK3QrJ19fbGluZS0tbG9uZyI+PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPSInK3QrIl9fbGluZSAiK3QrJ19fbGluZS0tdGlwIj48L3NwYW4+XG5cbiAgICA8ZGl2IGNsYXNzPSInK3QrJ19fcmluZyI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz0iJyt0KydfX2hpZGUtY29ybmVycyI+PC9kaXY+XG4gICd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDApLHI9by5kZWZhdWx0LkNPTlRFTlQ7ZS5jb250ZW50TWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytyKyciPlxuXG4gIDwvZGl2PlxuJ30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigwKSxyPW8uZGVmYXVsdC5CVVRUT05fQ09OVEFJTkVSLGk9by5kZWZhdWx0LkJVVFRPTixhPW8uZGVmYXVsdC5CVVRUT05fTE9BREVSO2UuYnV0dG9uTWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytyKyciPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9IicraSsnIlxuICAgID48L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3M9IicrYSsnIj5cbiAgICAgIDxkaXY+PC9kaXY+XG4gICAgICA8ZGl2PjwvZGl2PlxuICAgICAgPGRpdj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbid9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oNCkscj1uKDIpLGk9bigwKSxhPWkuZGVmYXVsdC5JQ09OLHM9aS5kZWZhdWx0LklDT05fQ1VTVE9NLGM9WyJlcnJvciIsIndhcm5pbmciLCJzdWNjZXNzIiwiaW5mbyJdLGw9e2Vycm9yOnIuZXJyb3JJY29uTWFya3VwKCksd2FybmluZzpyLndhcm5pbmdJY29uTWFya3VwKCksc3VjY2VzczpyLnN1Y2Nlc3NJY29uTWFya3VwKCl9LHU9ZnVuY3Rpb24odCxlKXt2YXIgbj1hKyItLSIrdDtlLmNsYXNzTGlzdC5hZGQobik7dmFyIG89bFt0XTtvJiYoZS5pbm5lckhUTUw9byl9LGY9ZnVuY3Rpb24odCxlKXtlLmNsYXNzTGlzdC5hZGQocyk7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7bi5zcmM9dCxlLmFwcGVuZENoaWxkKG4pfSxkPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPW8uaW5qZWN0RWxJbnRvTW9kYWwoci5pY29uTWFya3VwKTtjLmluY2x1ZGVzKHQpP3UodCxlKTpmKHQsZSl9fTtlLmRlZmF1bHQ9ZH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigyKSxyPW4oNCksaT1mdW5jdGlvbih0KXtuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCJBcHBsZVdlYktpdCIpJiYodC5zdHlsZS5kaXNwbGF5PSJub25lIix0Lm9mZnNldEhlaWdodCx0LnN0eWxlLmRpc3BsYXk9IiIpfTtlLmluaXRUaXRsZT1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1yLmluamVjdEVsSW50b01vZGFsKG8udGl0bGVNYXJrdXApO2UudGV4dENvbnRlbnQ9dCxpKGUpfX0sZS5pbml0VGV4dD1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dC5zcGxpdCgiXG4iKS5mb3JFYWNoKGZ1bmN0aW9uKHQsbixvKXtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpKSxuPG8ubGVuZ3RoLTEmJmUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSl9KTt2YXIgbj1yLmluamVjdEVsSW50b01vZGFsKG8udGV4dE1hcmt1cCk7bi5hcHBlbmRDaGlsZChlKSxpKG4pfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMSkscj1uKDQpLGk9bigwKSxhPWkuZGVmYXVsdC5CVVRUT04scz1pLmRlZmF1bHQuREFOR0VSX0JVVFRPTixjPW4oMyksbD1uKDIpLHU9big2KSxmPW4oNSksZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS50ZXh0LGk9ZS52YWx1ZSxkPWUuY2xhc3NOYW1lLHA9ZS5jbG9zZU1vZGFsLG09by5zdHJpbmdUb05vZGUobC5idXR0b25NYXJrdXApLGI9bS5xdWVyeVNlbGVjdG9yKCIuIithKSx2PWErIi0tIit0O2lmKGIuY2xhc3NMaXN0LmFkZCh2KSxkKXsoQXJyYXkuaXNBcnJheShkKT9kOmQuc3BsaXQoIiAiKSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aD4wfSkuZm9yRWFjaChmdW5jdGlvbih0KXtiLmNsYXNzTGlzdC5hZGQodCl9KX1uJiZ0PT09Yy5DT05GSVJNX0tFWSYmYi5jbGFzc0xpc3QuYWRkKHMpLGIudGV4dENvbnRlbnQ9cjt2YXIgZz17fTtyZXR1cm4gZ1t0XT1pLGYuc2V0QWN0aW9uVmFsdWUoZyksZi5zZXRBY3Rpb25PcHRpb25zRm9yKHQse2Nsb3NlTW9kYWw6cH0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHUub25BY3Rpb24odCl9KSxtfSxwPWZ1bmN0aW9uKHQsZSl7dmFyIG49ci5pbmplY3RFbEludG9Nb2RhbChsLmZvb3Rlck1hcmt1cCk7Zm9yKHZhciBvIGluIHQpe3ZhciBpPXRbb10sYT1kKG8saSxlKTtpLnZpc2libGUmJm4uYXBwZW5kQ2hpbGQoYSl9MD09PW4uY2hpbGRyZW4ubGVuZ3RoJiZuLnJlbW92ZSgpfTtlLmRlZmF1bHQ9cH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigzKSxyPW4oNCksaT1uKDIpLGE9big1KSxzPW4oNiksYz1uKDApLGw9Yy5kZWZhdWx0LkNPTlRFTlQsdT1mdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldCxuPWUudmFsdWU7YS5zZXRBY3Rpb25WYWx1ZShuKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKHQpe2lmKCJFbnRlciI9PT10LmtleSlyZXR1cm4gcy5vbkFjdGlvbihvLkNPTkZJUk1fS0VZKX0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZvY3VzKCksYS5zZXRBY3Rpb25WYWx1ZSgiIil9LDApfSxmPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLHI9bCsiX18iK2U7by5jbGFzc0xpc3QuYWRkKHIpO2Zvcih2YXIgaSBpbiBuKXt2YXIgYT1uW2ldO29baV09YX0iaW5wdXQiPT09ZSYmdShvKSx0LmFwcGVuZENoaWxkKG8pfSxkPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXIuaW5qZWN0RWxJbnRvTW9kYWwoaS5jb250ZW50TWFya3VwKSxuPXQuZWxlbWVudCxvPXQuYXR0cmlidXRlczsic3RyaW5nIj09dHlwZW9mIG4/ZihlLG4sbyk6ZS5hcHBlbmRDaGlsZChuKX19O2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9bigyKSxpPWZ1bmN0aW9uKCl7dmFyIHQ9by5zdHJpbmdUb05vZGUoci5vdmVybGF5TWFya3VwKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpfTtlLmRlZmF1bHQ9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big1KSxyPW4oNiksaT1uKDEpLGE9bigzKSxzPW4oMCksYz1zLmRlZmF1bHQuTU9EQUwsbD1zLmRlZmF1bHQuQlVUVE9OLHU9cy5kZWZhdWx0Lk9WRVJMQVksZj1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdigpfSxkPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxnKCl9LHA9ZnVuY3Rpb24odCl7aWYoby5kZWZhdWx0LmlzT3Blbilzd2l0Y2godC5rZXkpe2Nhc2UiRXNjYXBlIjpyZXR1cm4gci5vbkFjdGlvbihhLkNBTkNFTF9LRVkpfX0sbT1mdW5jdGlvbih0KXtpZihvLmRlZmF1bHQuaXNPcGVuKXN3aXRjaCh0LmtleSl7Y2FzZSJUYWIiOnJldHVybiBmKHQpfX0sYj1mdW5jdGlvbih0KXtpZihvLmRlZmF1bHQuaXNPcGVuKXJldHVybiJUYWIiPT09dC5rZXkmJnQuc2hpZnRLZXk/ZCh0KTp2b2lkIDB9LHY9ZnVuY3Rpb24oKXt2YXIgdD1pLmdldE5vZGUobCk7dCYmKHQudGFiSW5kZXg9MCx0LmZvY3VzKCkpfSxnPWZ1bmN0aW9uKCl7dmFyIHQ9aS5nZXROb2RlKGMpLGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuIitsKSxuPWUubGVuZ3RoLTEsbz1lW25dO28mJm8uZm9jdXMoKX0saD1mdW5jdGlvbih0KXt0W3QubGVuZ3RoLTFdLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLG0pfSx3PWZ1bmN0aW9uKHQpe3RbMF0uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYil9LHk9ZnVuY3Rpb24oKXt2YXIgdD1pLmdldE5vZGUoYyksZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK2wpO2UubGVuZ3RoJiYoaChlKSx3KGUpKX0seD1mdW5jdGlvbih0KXtpZihpLmdldE5vZGUodSk9PT10LnRhcmdldClyZXR1cm4gci5vbkFjdGlvbihhLkNBTkNFTF9LRVkpfSxfPWZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0Tm9kZSh1KTtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix4KSx0JiZlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix4KX0saz1mdW5jdGlvbih0KXtvLmRlZmF1bHQudGltZXImJmNsZWFyVGltZW91dChvLmRlZmF1bHQudGltZXIpLHQmJihvLmRlZmF1bHQudGltZXI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gci5vbkFjdGlvbihhLkNBTkNFTF9LRVkpfSx0KSl9LE89ZnVuY3Rpb24odCl7dC5jbG9zZU9uRXNjP2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixwKTpkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIscCksdC5kYW5nZXJNb2RlP3YoKTpnKCkseSgpLF8odC5jbG9zZU9uQ2xpY2tPdXRzaWRlKSxrKHQudGltZXIpfTtlLmRlZmF1bHQ9T30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxKSxyPW4oMyksaT1uKDM3KSxhPW4oMzgpLHM9e3RpdGxlOm51bGwsdGV4dDpudWxsLGljb246bnVsbCxidXR0b25zOnIuZGVmYXVsdEJ1dHRvbkxpc3QsY29udGVudDpudWxsLGNsYXNzTmFtZTpudWxsLGNsb3NlT25DbGlja091dHNpZGU6ITAsY2xvc2VPbkVzYzohMCxkYW5nZXJNb2RlOiExLHRpbWVyOm51bGx9LGM9T2JqZWN0LmFzc2lnbih7fSxzKTtlLnNldERlZmF1bHRzPWZ1bmN0aW9uKHQpe2M9T2JqZWN0LmFzc2lnbih7fSxzLHQpfTt2YXIgbD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmJ1dHRvbixuPXQmJnQuYnV0dG9ucztyZXR1cm4gdm9pZCAwIT09ZSYmdm9pZCAwIT09biYmby50aHJvd0VycigiQ2Fubm90IHNldCBib3RoICdidXR0b24nIGFuZCAnYnV0dG9ucycgb3B0aW9ucyEiKSx2b2lkIDAhPT1lP3tjb25maXJtOmV9Om59LHU9ZnVuY3Rpb24odCl7cmV0dXJuIG8ub3JkaW5hbFN1ZmZpeE9mKHQrMSl9LGY9ZnVuY3Rpb24odCxlKXtvLnRocm93RXJyKHUoZSkrIiBhcmd1bWVudCAoJyIrdCsiJykgaXMgaW52YWxpZCIpfSxkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCsxLHI9ZVtuXTtvLmlzUGxhaW5PYmplY3Qocil8fHZvaWQgMD09PXJ8fG8udGhyb3dFcnIoIkV4cGVjdGVkICIrdShuKSsiIGFyZ3VtZW50ICgnIityKyInKSB0byBiZSBhIHBsYWluIG9iamVjdCIpfSxwPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCsxLHI9ZVtuXTt2b2lkIDAhPT1yJiZvLnRocm93RXJyKCJVbmV4cGVjdGVkICIrdShuKSsiIGFyZ3VtZW50ICgiK3IrIikiKX0sbT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10eXBlb2YgZSxhPSJzdHJpbmciPT09aSxzPWUgaW5zdGFuY2VvZiBFbGVtZW50O2lmKGEpe2lmKDA9PT1uKXJldHVybnt0ZXh0OmV9O2lmKDE9PT1uKXJldHVybnt0ZXh0OmUsdGl0bGU6clswXX07aWYoMj09PW4pcmV0dXJuIGQobixyKSx7aWNvbjplfTtmKGUsbil9ZWxzZXtpZihzJiYwPT09bilyZXR1cm4gZChuLHIpLHtjb250ZW50OmV9O2lmKG8uaXNQbGFpbk9iamVjdChlKSlyZXR1cm4gcChuLHIpLGU7ZihlLG4pfX07ZS5nZXRPcHRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPXt9O3QuZm9yRWFjaChmdW5jdGlvbihlLG8pe3ZhciByPW0oMCxlLG8sdCk7T2JqZWN0LmFzc2lnbihuLHIpfSk7dmFyIG89bChuKTtuLmJ1dHRvbnM9ci5nZXRCdXR0b25MaXN0T3B0cyhvKSxkZWxldGUgbi5idXR0b24sbi5jb250ZW50PWkuZ2V0Q29udGVudE9wdHMobi5jb250ZW50KTt2YXIgdT1PYmplY3QuYXNzaWduKHt9LHMsYyxuKTtyZXR1cm4gT2JqZWN0LmtleXModSkuZm9yRWFjaChmdW5jdGlvbih0KXthLkRFUFJFQ0FURURfT1BUU1t0XSYmYS5sb2dEZXByZWNhdGlvbih0KX0pLHV9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9e2VsZW1lbnQ6ImlucHV0IixhdHRyaWJ1dGVzOntwbGFjZWhvbGRlcjoiIn19O2UuZ2V0Q29udGVudE9wdHM9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIG8uaXNQbGFpbk9iamVjdCh0KT9PYmplY3QuYXNzaWduKGUsdCk6dCBpbnN0YW5jZW9mIEVsZW1lbnQ/e2VsZW1lbnQ6dH06ImlucHV0Ij09PXQ/cjpudWxsfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5sb2dEZXByZWNhdGlvbj1mdW5jdGlvbih0KXt2YXIgbj1lLkRFUFJFQ0FURURfT1BUU1t0XSxvPW4ub25seVJlbmFtZSxyPW4ucmVwbGFjZW1lbnQsaT1uLnN1Yk9wdGlvbixhPW4ubGluayxzPW8/InJlbmFtZWQiOiJkZXByZWNhdGVkIixjPSdTd2VldEFsZXJ0IHdhcm5pbmc6ICInK3QrJyIgb3B0aW9uIGhhcyBiZWVuICcrcysiLiI7aWYocil7Yys9IiBQbGVhc2UgdXNlIisoaT8nICInK2krJyIgaW4gJzoiICIpKyciJytyKyciIGluc3RlYWQuJ312YXIgbD0iaHR0cHM6Ly9zd2VldGFsZXJ0LmpzLm9yZyI7Yys9YT8iIE1vcmUgZGV0YWlsczogIitsK2E6IiBNb3JlIGRldGFpbHM6ICIrbCsiL2d1aWRlcy8jdXBncmFkaW5nLWZyb20tMXgiLGNvbnNvbGUud2FybihjKX0sZS5ERVBSRUNBVEVEX09QVFM9e3R5cGU6e3JlcGxhY2VtZW50OiJpY29uIixsaW5rOiIvZG9jcy8jaWNvbiJ9LGltYWdlVXJsOntyZXBsYWNlbWVudDoiaWNvbiIsbGluazoiL2RvY3MvI2ljb24ifSxjdXN0b21DbGFzczp7cmVwbGFjZW1lbnQ6ImNsYXNzTmFtZSIsb25seVJlbmFtZTohMCxsaW5rOiIvZG9jcy8jY2xhc3NuYW1lIn0saW1hZ2VTaXplOnt9LHNob3dDYW5jZWxCdXR0b246e3JlcGxhY2VtZW50OiJidXR0b25zIixsaW5rOiIvZG9jcy8jYnV0dG9ucyJ9LHNob3dDb25maXJtQnV0dG9uOntyZXBsYWNlbWVudDoiYnV0dG9uIixsaW5rOiIvZG9jcy8jYnV0dG9uIn0sY29uZmlybUJ1dHRvblRleHQ6e3JlcGxhY2VtZW50OiJidXR0b24iLGxpbms6Ii9kb2NzLyNidXR0b24ifSxjb25maXJtQnV0dG9uQ29sb3I6e30sY2FuY2VsQnV0dG9uVGV4dDp7cmVwbGFjZW1lbnQ6ImJ1dHRvbnMiLGxpbms6Ii9kb2NzLyNidXR0b25zIn0sY2xvc2VPbkNvbmZpcm06e3JlcGxhY2VtZW50OiJidXR0b24iLHN1Yk9wdGlvbjoiY2xvc2VNb2RhbCIsbGluazoiL2RvY3MvI2J1dHRvbiJ9LGNsb3NlT25DYW5jZWw6e3JlcGxhY2VtZW50OiJidXR0b25zIixzdWJPcHRpb246ImNsb3NlTW9kYWwiLGxpbms6Ii9kb2NzLyNidXR0b25zIn0sc2hvd0xvYWRlck9uQ29uZmlybTp7cmVwbGFjZW1lbnQ6ImJ1dHRvbnMifSxhbmltYXRpb246e30saW5wdXRUeXBlOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxpbnB1dFZhbHVlOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxpbnB1dFBsYWNlaG9sZGVyOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxodG1sOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxhbGxvd0VzY2FwZUtleTp7cmVwbGFjZW1lbnQ6ImNsb3NlT25Fc2MiLG9ubHlSZW5hbWU6ITAsbGluazoiL2RvY3MvI2Nsb3Nlb25lc2MifSxhbGxvd0NsaWNrT3V0c2lkZTp7cmVwbGFjZW1lbnQ6ImNsb3NlT25DbGlja091dHNpZGUiLG9ubHlSZW5hbWU6ITAsbGluazoiL2RvY3MvI2Nsb3Nlb25jbGlja291dHNpZGUifX19XSl9KTs="},{"meta":{"name":"clipboard.min.js","url":"https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js","ts":1637743723175,"mimetype":"text/javascript"},"source":"LyohCiAqIGNsaXBib2FyZC5qcyB2Mi4wLjYKICogaHR0cHM6Ly9jbGlwYm9hcmRqcy5jb20vCiAqIAogKiBMaWNlbnNlZCBNSVQgwqkgWmVubyBSb2NoYQogKi8KIWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuQ2xpcGJvYXJkSlM9ZSgpOnQuQ2xpcGJvYXJkSlM9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIG89e30sci5tPW49W2Z1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCJTRUxFQ1QiPT09dC5ub2RlTmFtZSl0LmZvY3VzKCksZT10LnZhbHVlO2Vsc2UgaWYoIklOUFVUIj09PXQubm9kZU5hbWV8fCJURVhUQVJFQSI9PT10Lm5vZGVOYW1lKXt2YXIgbj10Lmhhc0F0dHJpYnV0ZSgicmVhZG9ubHkiKTtufHx0LnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKSx0LnNlbGVjdCgpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksbnx8dC5yZW1vdmVBdHRyaWJ1dGUoInJlYWRvbmx5IiksZT10LnZhbHVlfWVsc2V7dC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpJiZ0LmZvY3VzKCk7dmFyIG89d2luZG93LmdldFNlbGVjdGlvbigpLHI9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtyLnNlbGVjdE5vZGVDb250ZW50cyh0KSxvLnJlbW92ZUFsbFJhbmdlcygpLG8uYWRkUmFuZ2UociksZT1vLnRvU3RyaW5nKCl9cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt9bi5wcm90b3R5cGU9e29uOmZ1bmN0aW9uKHQsZSxuKXt2YXIgbz10aGlzLmV8fCh0aGlzLmU9e30pO3JldHVybihvW3RdfHwob1t0XT1bXSkpLnB1c2goe2ZuOmUsY3R4Om59KSx0aGlzfSxvbmNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgbz10aGlzO2Z1bmN0aW9uIHIoKXtvLm9mZih0LHIpLGUuYXBwbHkobixhcmd1bWVudHMpfXJldHVybiByLl89ZSx0aGlzLm9uKHQscixuKX0sZW1pdDpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbj0oKHRoaXMuZXx8KHRoaXMuZT17fSkpW3RdfHxbXSkuc2xpY2UoKSxvPTAscj1uLmxlbmd0aDtvPHI7bysrKW5bb10uZm4uYXBwbHkobltvXS5jdHgsZSk7cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXx8KHRoaXMuZT17fSksbz1uW3RdLHI9W107aWYobyYmZSlmb3IodmFyIGk9MCxhPW8ubGVuZ3RoO2k8YTtpKyspb1tpXS5mbiE9PWUmJm9baV0uZm4uXyE9PWUmJnIucHVzaChvW2ldKTtyZXR1cm4gci5sZW5ndGg/blt0XT1yOmRlbGV0ZSBuW3RdLHRoaXN9fSx0LmV4cG9ydHM9bix0LmV4cG9ydHMuVGlueUVtaXR0ZXI9bn0sZnVuY3Rpb24odCxlLG4pe3ZhciBkPW4oMyksaD1uKDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYoIXQmJiFlJiYhbil0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzIik7aWYoIWQuc3RyaW5nKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIlNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nIik7aWYoIWQuZm4obikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhpcmQgYXJndW1lbnQgbXVzdCBiZSBhIEZ1bmN0aW9uIik7aWYoZC5ub2RlKHQpKXJldHVybiBzPWUsZj1uLCh1PXQpLmFkZEV2ZW50TGlzdGVuZXIocyxmKSx7ZGVzdHJveTpmdW5jdGlvbigpe3UucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGYpfX07aWYoZC5ub2RlTGlzdCh0KSlyZXR1cm4gYT10LGM9ZSxsPW4sQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcihjLGwpfSkse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGMsbCl9KX19O2lmKGQuc3RyaW5nKHQpKXJldHVybiBvPXQscj1lLGk9bixoKGRvY3VtZW50LmJvZHksbyxyLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QiKTt2YXIgbyxyLGksYSxjLGwsdSxzLGZ9fSxmdW5jdGlvbih0LG4pe24ubm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiYxPT09dC5ub2RlVHlwZX0sbi5ub2RlTGlzdD1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7cmV0dXJuIHZvaWQgMCE9PXQmJigiW29iamVjdCBOb2RlTGlzdF0iPT09ZXx8IltvYmplY3QgSFRNTENvbGxlY3Rpb25dIj09PWUpJiYibGVuZ3RoImluIHQmJigwPT09dC5sZW5ndGh8fG4ubm9kZSh0WzBdKSl9LG4uc3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIFN0cmluZ30sbi5mbj1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBhPW4oNSk7ZnVuY3Rpb24gaSh0LGUsbixvLHIpe3ZhciBpPWZ1bmN0aW9uKGUsbix0LG8pe3JldHVybiBmdW5jdGlvbih0KXt0LmRlbGVnYXRlVGFyZ2V0PWEodC50YXJnZXQsbiksdC5kZWxlZ2F0ZVRhcmdldCYmby5jYWxsKGUsdCl9fS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihuLGkscikse2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixpLHIpfX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8scil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuYWRkRXZlbnRMaXN0ZW5lcj9pLmFwcGx5KG51bGwsYXJndW1lbnRzKToiZnVuY3Rpb24iPT10eXBlb2Ygbj9pLmJpbmQobnVsbCxkb2N1bWVudCkuYXBwbHkobnVsbCxhcmd1bWVudHMpOigic3RyaW5nIj09dHlwZW9mIHQmJih0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCkpLEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGZ1bmN0aW9uKHQpe3JldHVybiBpKHQsZSxuLG8scil9KSl9fSxmdW5jdGlvbih0LGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgRWxlbWVudCYmIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpe3ZhciBuPUVsZW1lbnQucHJvdG90eXBlO24ubWF0Y2hlcz1uLm1hdGNoZXNTZWxlY3Rvcnx8bi5tb3pNYXRjaGVzU2VsZWN0b3J8fG4ubXNNYXRjaGVzU2VsZWN0b3J8fG4ub01hdGNoZXNTZWxlY3Rvcnx8bi53ZWJraXRNYXRjaGVzU2VsZWN0b3J9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKDt0JiY5IT09dC5ub2RlVHlwZTspe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm1hdGNoZXMmJnQubWF0Y2hlcyhlKSlyZXR1cm4gdDt0PXQucGFyZW50Tm9kZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24ucihlKTt2YXIgbz1uKDApLHI9bi5uKG8pLGk9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9O2Z1bmN0aW9uIGEodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1mdW5jdGlvbiBjKHQpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLGMpLHRoaXMucmVzb2x2ZU9wdGlvbnModCksdGhpcy5pbml0U2VsZWN0aW9uKCl9dmFyIGw9KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmYSh0LnByb3RvdHlwZSxlKSxuJiZhKHQsbiksdH0oYyxbe2tleToicmVzb2x2ZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPTA8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD90Ont9O3RoaXMuYWN0aW9uPWUuYWN0aW9uLHRoaXMuY29udGFpbmVyPWUuY29udGFpbmVyLHRoaXMuZW1pdHRlcj1lLmVtaXR0ZXIsdGhpcy50YXJnZXQ9ZS50YXJnZXQsdGhpcy50ZXh0PWUudGV4dCx0aGlzLnRyaWdnZXI9ZS50cmlnZ2VyLHRoaXMuc2VsZWN0ZWRUZXh0PSIifX0se2tleToiaW5pdFNlbGVjdGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRleHQ/dGhpcy5zZWxlY3RGYWtlKCk6dGhpcy50YXJnZXQmJnRoaXMuc2VsZWN0VGFyZ2V0KCl9fSx7a2V5OiJzZWxlY3RGYWtlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT0icnRsIj09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGlyIik7dGhpcy5yZW1vdmVGYWtlKCksdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHQucmVtb3ZlRmFrZSgpfSx0aGlzLmZha2VIYW5kbGVyPXRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2spfHwhMCx0aGlzLmZha2VFbGVtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIiksdGhpcy5mYWtlRWxlbS5zdHlsZS5mb250U2l6ZT0iMTJwdCIsdGhpcy5mYWtlRWxlbS5zdHlsZS5ib3JkZXI9IjAiLHRoaXMuZmFrZUVsZW0uc3R5bGUucGFkZGluZz0iMCIsdGhpcy5mYWtlRWxlbS5zdHlsZS5tYXJnaW49IjAiLHRoaXMuZmFrZUVsZW0uc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmZha2VFbGVtLnN0eWxlW2U/InJpZ2h0IjoibGVmdCJdPSItOTk5OXB4Ijt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7dGhpcy5mYWtlRWxlbS5zdHlsZS50b3A9bisicHgiLHRoaXMuZmFrZUVsZW0uc2V0QXR0cmlidXRlKCJyZWFkb25seSIsIiIpLHRoaXMuZmFrZUVsZW0udmFsdWU9dGhpcy50ZXh0LHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuc2VsZWN0ZWRUZXh0PXIoKSh0aGlzLmZha2VFbGVtKSx0aGlzLmNvcHlUZXh0KCl9fSx7a2V5OiJyZW1vdmVGYWtlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZmFrZUhhbmRsZXImJih0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKSx0aGlzLmZha2VIYW5kbGVyPW51bGwsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrPW51bGwpLHRoaXMuZmFrZUVsZW0mJih0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmZha2VFbGVtKSx0aGlzLmZha2VFbGVtPW51bGwpfX0se2tleToic2VsZWN0VGFyZ2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRUZXh0PXIoKSh0aGlzLnRhcmdldCksdGhpcy5jb3B5VGV4dCgpfX0se2tleToiY29weVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwO3RyeXtlPWRvY3VtZW50LmV4ZWNDb21tYW5kKHRoaXMuYWN0aW9uKX1jYXRjaCh0KXtlPSExfXRoaXMuaGFuZGxlUmVzdWx0KGUpfX0se2tleToiaGFuZGxlUmVzdWx0Iix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmVtaXR0ZXIuZW1pdCh0PyJzdWNjZXNzIjoiZXJyb3IiLHthY3Rpb246dGhpcy5hY3Rpb24sdGV4dDp0aGlzLnNlbGVjdGVkVGV4dCx0cmlnZ2VyOnRoaXMudHJpZ2dlcixjbGVhclNlbGVjdGlvbjp0aGlzLmNsZWFyU2VsZWN0aW9uLmJpbmQodGhpcyl9KX19LHtrZXk6ImNsZWFyU2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudHJpZ2dlciYmdGhpcy50cmlnZ2VyLmZvY3VzKCksZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCksd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpfX0se2tleToiZGVzdHJveSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUZha2UoKX19LHtrZXk6ImFjdGlvbiIsc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPTA8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD90OiJjb3B5IjtpZih0aGlzLl9hY3Rpb249ZSwiY29weSIhPT10aGlzLl9hY3Rpb24mJiJjdXQiIT09dGhpcy5fYWN0aW9uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCAiYWN0aW9uIiB2YWx1ZSwgdXNlIGVpdGhlciAiY29weSIgb3IgImN1dCInKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGlvbn19LHtrZXk6InRhcmdldCIsc2V0OmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe2lmKCF0fHwib2JqZWN0IiE9PSh2b2lkIDA9PT10PyJ1bmRlZmluZWQiOmkodCkpfHwxIT09dC5ub2RlVHlwZSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtpZigiY29weSI9PT10aGlzLmFjdGlvbiYmdC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIGF0dHJpYnV0ZS4gUGxlYXNlIHVzZSAicmVhZG9ubHkiIGluc3RlYWQgb2YgImRpc2FibGVkIiBhdHRyaWJ1dGUnKTtpZigiY3V0Ij09PXRoaXMuYWN0aW9uJiYodC5oYXNBdHRyaWJ1dGUoInJlYWRvbmx5Iil8fHQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpO3RoaXMuX3RhcmdldD10fX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RhcmdldH19XSksYyksdT1uKDEpLHM9bi5uKHUpLGY9bigyKSxkPW4ubihmKSxoPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmeSh0LnByb3RvdHlwZSxlKSxuJiZ5KHQsbiksdH07ZnVuY3Rpb24geSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXZhciBtPShmdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9KHYscy5hKSxwKHYsW3trZXk6InJlc29sdmVPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0wPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PXQ/dDp7fTt0aGlzLmFjdGlvbj0iZnVuY3Rpb24iPT10eXBlb2YgZS5hY3Rpb24/ZS5hY3Rpb246dGhpcy5kZWZhdWx0QWN0aW9uLHRoaXMudGFyZ2V0PSJmdW5jdGlvbiI9PXR5cGVvZiBlLnRhcmdldD9lLnRhcmdldDp0aGlzLmRlZmF1bHRUYXJnZXQsdGhpcy50ZXh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlLnRleHQ/ZS50ZXh0OnRoaXMuZGVmYXVsdFRleHQsdGhpcy5jb250YWluZXI9Im9iamVjdCI9PT1oKGUuY29udGFpbmVyKT9lLmNvbnRhaW5lcjpkb2N1bWVudC5ib2R5fX0se2tleToibGlzdGVuQ2xpY2siLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5saXN0ZW5lcj1kKCkodCwiY2xpY2siLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uQ2xpY2sodCl9KX19LHtrZXk6Im9uQ2xpY2siLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGVsZWdhdGVUYXJnZXR8fHQuY3VycmVudFRhcmdldDt0aGlzLmNsaXBib2FyZEFjdGlvbiYmKHRoaXMuY2xpcGJvYXJkQWN0aW9uPW51bGwpLHRoaXMuY2xpcGJvYXJkQWN0aW9uPW5ldyBsKHthY3Rpb246dGhpcy5hY3Rpb24oZSksdGFyZ2V0OnRoaXMudGFyZ2V0KGUpLHRleHQ6dGhpcy50ZXh0KGUpLGNvbnRhaW5lcjp0aGlzLmNvbnRhaW5lcix0cmlnZ2VyOmUsZW1pdHRlcjp0aGlzfSl9fSx7a2V5OiJkZWZhdWx0QWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYigiYWN0aW9uIix0KX19LHtrZXk6ImRlZmF1bHRUYXJnZXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWIoInRhcmdldCIsdCk7aWYoZSlyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKX19LHtrZXk6ImRlZmF1bHRUZXh0Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYigidGV4dCIsdCl9fSx7a2V5OiJkZXN0cm95Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubGlzdGVuZXIuZGVzdHJveSgpLHRoaXMuY2xpcGJvYXJkQWN0aW9uJiYodGhpcy5jbGlwYm9hcmRBY3Rpb24uZGVzdHJveSgpLHRoaXMuY2xpcGJvYXJkQWN0aW9uPW51bGwpfX1dLFt7a2V5OiJpc1N1cHBvcnRlZCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT10P3Q6WyJjb3B5IiwiY3V0Il0sbj0ic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUsbz0hIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZDtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe289byYmISFkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQodCl9KSxvfX1dKSx2KTtmdW5jdGlvbiB2KHQsZSl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdik7dmFyIG49ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX0odGhpcywodi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih2KSkuY2FsbCh0aGlzKSk7cmV0dXJuIG4ucmVzb2x2ZU9wdGlvbnMoZSksbi5saXN0ZW5DbGljayh0KSxufWZ1bmN0aW9uIGIodCxlKXt2YXIgbj0iZGF0YS1jbGlwYm9hcmQtIit0O2lmKGUuaGFzQXR0cmlidXRlKG4pKXJldHVybiBlLmdldEF0dHJpYnV0ZShuKX1lLmRlZmF1bHQ9bX1dLHIuYz1vLHIuZD1mdW5jdGlvbih0LGUsbil7ci5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Om59KX0sci5yPWZ1bmN0aW9uKHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LHIudD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9cihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihyLnIobiksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSlyLmQobixvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiBufSxyLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIHIuZChlLCJhIixlKSxlfSxyLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LHIucD0iIixyKHIucz02KS5kZWZhdWx0O2Z1bmN0aW9uIHIodCl7aWYob1t0XSlyZXR1cm4gb1t0XS5leHBvcnRzO3ZhciBlPW9bdF09e2k6dCxsOiExLGV4cG9ydHM6e319O3JldHVybiBuW3RdLmNhbGwoZS5leHBvcnRzLGUsZS5leHBvcnRzLHIpLGUubD0hMCxlLmV4cG9ydHN9dmFyIG4sb30pOw=="},{"meta":{"name":"loadvaptcha.min.js","url":"https://cdn.jsdelivr.net/npm/load-vaptcha-sdk@1.0.0/loadvaptcha.min.js","ts":1637743723173,"mimetype":"text/javascript"},"source":"LyoqCiAqIE1pbmlmaWVkIGJ5IGpzRGVsaXZyIHVzaW5nIFRlcnNlciB2NS4zLjUuCiAqIE9yaWdpbmFsIGZpbGU6IC9ucG0vbG9hZC12YXB0Y2hhLXNka0AxLjAuMC9sb2FkdmFwdGNoYS5qcwogKgogKiBEbyBOT1QgdXNlIFNSSSB3aXRoIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBmaWxlcyEgTW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly93d3cuanNkZWxpdnIuY29tL3VzaW5nLXNyaS13aXRoLWR5bmFtaWMtZmlsZXMKICovCmxldCBsb2FkVmFwdGNoYVNkaz10PT57bGV0IGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZhcHRjaGFfc2RrIik7ZT90KCk6KGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZS5zZXRBdHRyaWJ1dGUoImlkIiwidmFwdGNoYV9zZGsiKSxlLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvamF2YXNjcmlwdCIpLGUuc2V0QXR0cmlidXRlKCJzcmMiLCJodHRwczovL3YudmFwdGNoYS5jb20vdjMuanMiKSxlLm9ubG9hZD10LGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoZSkpfTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9L3NtLzVlODg5MWM5ZjI0N2E4M2Y0MDU3MjY5OWQ3MzgzMTgyMmM1ZDdhY2VkMjFiZjQyNGExYjc5NzczNzc0Y2VlZWQubWFw"}]},{"name":"懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、百度网盘直接下载等多合一版。长期更新,放心使用。","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["*://pan.baidu.com/disk/home*","*://yun.baidu.com/disk/home*","*://pan.baidu.com/s*","*://yun.baidu.com/s*","*://pan.baidu.com/share/*","*://yun.baidu.com/share/*","*.youku.com/v*","*m.youku.com/*","*.iqiyi.com/v_*","*.iqiyi.com/w_*","*.iqiyi.com/a_*","*.iq.com/play/*","*.le.com/ptv/vplay/*","*v.qq.com/x*","*v.qq.com/p*","*v.qq.com/cover*","*v.qq.com/tv/*","*.tudou.com/listplay/*","*.tudou.com/albumplay/*","*.tudou.com/programs/view/*","*.tudou.com/v*","*.mgtv.com/b/*","*tv.sohu.com/*","*film.sohu.com/album/*","*.bilibili.com/video/*","*.bilibili.com/anime/*","*.bilibili.com/bangumi/play/*","*.bilibili.com/s/*","*.pptv.com/show/*","*.wasu.cn/Play/show*","*v.yinyuetai.com/video/*","*v.yinyuetai.com/playlist/*","*://item.taobao.com/*","*://*detail.tmall.com/*","*://*detail.tmall.hk/*","*://*item.jd.com/*","*://*.yiyaojd.com/*","*://*.liangxinyao.com/*","*music.163.com/*","*://y.qq.com/*","*://i.y.qq.com/*","*://*.kugou.com/*","*://*kuwo.cn/*","*://*.xiami.com/*","*://music.taihe.com/song*","*://*.1ting.com/player*","*://music.migu.cn/v*","*://*.lizhi.fm/*","*://*.qingting.fm/*","*://*.ximalaya.com/*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":["*://*.eggvod.cn/*"],"merge_excludes":true,"use_connects":[],"orig_connects":["d.pcs.baidu.com","baidu.com","baidupcs.com","baiduyun.wiki","localhost"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1637743449319,"data":{}},"enabled":true,"position":4,"file_url":"https://greasyfork.org/scripts/370634-%E6%87%92%E4%BA%BA%E4%B8%93%E7%94%A8-%E5%85%A8%E7%BD%91vip%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A-%E5%85%A8%E7%BD%91%E9%9F%B3%E4%B9%90%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD-%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD%E7%AD%89%E5%A4%9A%E5%90%88%E4%B8%80%E7%89%88-%E9%95%BF%E6%9C%9F%E6%9B%B4%E6%96%B0-%E6%94%BE%E5%BF%83%E4%BD%BF%E7%94%A8/code/%E6%87%92%E4%BA%BA%E4%B8%93%E7%94%A8%EF%BC%8C%E5%85%A8%E7%BD%91VIP%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A%E3%80%81%E5%85%A8%E7%BD%91%E9%9F%B3%E4%B9%90%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD%E3%80%81%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD%E7%AD%89%E5%A4%9A%E5%90%88%E4%B8%80%E7%89%88%E3%80%82%E9%95%BF%E6%9C%9F%E6%9B%B4%E6%96%B0%EF%BC%8C%E6%94%BE%E5%BF%83%E4%BD%BF%E7%94%A8%E3%80%82.user.js","uuid":"a48330f2-8918-4879-b8dc-8f48d3f03475","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDmh5LkurrkuJPnlKjvvIzlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrjgIHlhajnvZHpn7PkuZDnm7TmjqXkuIvovb3jgIHnmb7luqbnvZHnm5jnm7TmjqXkuIvovb3nrYnlpJrlkIjkuIDniYjjgILplb/mnJ/mm7TmlrDvvIzmlL7lv4Pkvb/nlKjjgIIKLy8gQG5hbWVzcGFjZSAJIGxhbmhhaGEKLy8gQHZlcnNpb24gICAgICAzLjcKLy8gQGRlc2NyaXB0aW9uICDoh6rnlKjnu4TlkIjlnovlpJrlip/og73ohJrmnKzvvIzml6DpnIDlhbPms6jlhazkvJflj7fvvIzpm4blkIjkuobkvJjphbfjgIHniLHlpYfoibrjgIHohb7orq/jgIHoipLmnpznrYnlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrvvIznvZHmmJPkupHpn7PkuZDjgIFRUemfs+S5kOOAgemFt+eLl+OAgemFt+aIkeOAgeiZvuexs+OAgeicu+ick0ZN44CB6I2U5p6dRk3jgIHllpzpqazmi4npm4XnrYnnvZHnq5npn7PkuZDlkozmnInlo7Dkuabpn7PpopHlhY3lrqLmiLfnq6/kuIvovb3vvIznmb7luqbnvZHnm5jnm7TmjqXkuIvovb3vvIzkvJjmg6DliLjmn6Xor6LnrYnlh6DkuKroh6rlt7HluLjnlKjnmoTlip/og73jgIIKLy8gQGF1dGhvciAgICAgICBsYW5oYWhh77yMc3loeXoxOTkw77yMemhtYWkKLy8gQGljb24gICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUdRQUFBQmtDQVlBQUFCdzRwVlVBQUFROEVsRVFWUjRYdTFkQ1hRVVJScithcElRVDF3UXc2RVlCY1NFckNnS0NvUW93b29jTGlyS2VvQW9MRDV4MllEdStoVENQbmRkSmVDNUN0NmdJQnRkbFVNUXhBUEU5NWdNS2tiaG9XR0NLTWdwc1BqVW9Fc0lrTnIzVGFkaE11bWVxZTZ1bmdSSThTQkFWOWZ4Zi9XZjlWZVhnSWNpcGN6eThQcFIvYW9Rb3N6TkJJV1RsNlNVdlFBTUFIQUpnRmJZc1NzZEg1ZTB3aWNsd01wVndLN2RUcG83ZXVwbU5BTzZkUWE2ZERKK3RzallDR0FMZ0dJQTd3b2grRk9wS0FNaTkrMjdHWTBhRGNTVzdkM3h5dXN0RUNwSncyYjIyVkJxVVNDek5aQjN5VDZNdUdrcm1tY3NSMlhsSXBHZVBrK0ZVa3FBeUc4Mi9CbW50N3dXejg2OEFDKzkybFNsNFlZNkFOSWJBYmZjc0F0M0RpdkJ0dS9uaTNadHBpV2lTMXhBNUE4L2RNZTg5d2FnN1ZsOThlRGo1MkxucmhNVE5kanczSUlDelU4cngvMzNyTVdHRFlzeHNPOWljZHBwbjl2UnlSWVF1WHYzSUtTa0RNQ2txVDJ4OElQVElaRGVRR3dQRkpDeUFnT3YvQTczNVMvRmZyRlFOUC9OQjFhdFdRSWlmOTQ3QlBzckJtUFVYN3VqOU91bUVFanhNSlNHVjAwS1NIa0FPZTEzNHNVblBrSnF5bHpSdVBIOFdPTFVBa1R1MjNjakRzb2hHSkdmaXpYaEpnM1U5SUVDSFR2c3hLeW5QMFJhV3BFUTR0M29IbW9BSXFXOERNQkk1RS9vaDJYTFQvVmhLQTFObWhTNHV2OTJGSTUvQzhBTUljUWhuVklUa004K2Z3anJOOTJFQng4L0MwSUVHcWpuSXdVb3ZpWVdoSEZXNjVuaXdvNVBtRDBkQWtUdStya3ZVZy9laFQ2REw4WC85aDN2NDFBYW1qWXBjTUx4NVhqL3pTVVE4a25SdEduRWVUd015TUwzLzRIUFZ3L0ZHMiszZ1JCSy9rbFNLZHY1QXVEMEZzRHBMUTJQbU1YOGQreEFHRFZnS1ZzUGJQc2VLUHNHS0ZtZDFPRXFkU2JsUWR3dzhDdGNkTkUwOGZ2ZlBYTUlFTGxqeDNrUXFlTnc1Zlg5VUhtZ2ZpanlWaTJBWGoyQWl6c0J2UzlWbWwvQ1NnVHFzMVhBc3FBQlVuMG9qZEsreC90dnpFTktZSkpvMW14YmhCTms0V09ESUZQR29taE9Wd2pScU03R2VmSkpCZ2pEL2dCa25lUHZNTWc1czk0RWxoVUQyM2Y0MjFlODFpVit3WWliUDRLUWo0aDdSaGNiZ0hUclB4cFZ1QjNsUDU5WEo4cWMzSEJOUCtDV3dVRGprNU5QbkxjV0E4L09xQnRnSkE2Z1Zjc1NwTWlueFFkelhqVUE2WkJYZ0txcVlSQTRGOGxVSCtTSVB3MDNPS0krbExvQVJsWlZBU2hGVldDNldGYzh4UUFrSi9lZk9JZ2hFS0xOWVRYdk00V3U3Z3VNRytPY0l5aGV0dTB3ZElGWktINElyc2xkNURncWZ5cDkvdDFKS2Q4RC9IdTJ3VEhKS0ZJQ0V1c1FDTXdTYTRPRjFTS3IzMVQ4dUdjUWhHemxPNGVRUUJNTERHV3RVcWg4U1h4VEllLzVSZVd0dzNVSUZLMHk5c2VmV2UzVTNxZUZOcUhRZitVdnlSRnlBMUx3cWlnTjNXOEEwdSttSW16YTNBOFEvb2JXZStVQkU4Y241Z29TZmY2N3dQekYrZ25DQlRGNkJOQTd6K0NxUk9XMk1UVzVNVkY5cDg4SmlNQlduSERjSEZHeTlHNERrTHdCNzJEM2p6MGhBaWM0YlUrNS9uMzVpWFVGeGRFekx4dGcrRjBJQmtFaE9QSEVHa1ZZdC83K2prWmlONW8yV1NSQ0M0Y2JnSFM4L0VOVVZ1WWlJUHdKc1Q4MEhyZzJ6cVRJRVFTQ3Nyc3VDcTA3QW1QSE1UbDUvbzVLeWoxSVRWa212bHgralFGSWR2ZmxrWDF5RWREcmczQ0NVd3JqNndzNmFRV0ZnRlBkb0p0RTVKTHhZd0NLMWVoQ3JyMWlzTzdlYXJZbjVWNUFCa1Y0eFpYVmdQVDRHRUJuQ0tScTdYbkdGSHN3Q01Ea0tja1JUMDRtUlVBSURBSDZiRFZRTU5GLy8wUmlINEJQUkxpNHB3RklWdmVWZ0xnUUFhRnZJeXFlbUtMbE5HR2lmb1h0aFBEMXFhNlUrd0h4cVFnWDU1a2k2M01nY0w2Mm5VSDZGNVRMVm9WZzNKWmY5eUxLRFNBMG1lOGJZM0Q5aDh1QkNaUDB6SVBlT2xBaXdzWGRURUJXUWFJakFnSHZleUJrK2FtRlJ4OFluTkVIYnhvT3Axbm9xMXczd2cyME5kK3BrZ2NCK1lVb1czRnhkZWdrZHpVa3ZNZXhLSGZudm16dFp4ekpuRUh5a1R2bVduanY5T2hwSVhvcEVnUmt0UWlIT3BzY3NnWkFEb1JIRHJGVDRrYzZHQ1EyRjlzU0c3UDh1dUhlOUNIM1JTRFhpUENLQzZzQnlmM1NBTVJEWkpFNmc3b2p0dENhb3M2b0wvc1BYbGF5blc1a1dHZTR4ZHhWKzZxU1ZaQllJOWFGT2xWYldibGZRYUNEYTBEb2IxQytXb1hPR1E5S2h1ZXRPbmt2OVRqUGVUT3NQWHN2SVJZcEdmSDlTb1JENXg4R0JPaUFnRXNPWWJDUSt4bXhoVTVmZm9FWEV0Uy9kKzJNRmk5Y1VoMkNGK0VWSFUybFhncUpiRmNjWWlkYkthcm80ZGExQis0SHBET25BbDB1cU4yeVd5NlJVa0ppclNnTC9iWWFrQjVyd2JNZWJuU0lIWGZRQzYrcjJKUWZJRVMzeVREK3pDbjZKRUlWTjBXaUFjbktEVmZ2RmpyTE5ySFRIVHJpUDJ5Ym9Yb21PSEFEaXFibGd2ZjhKclY2KzFaY3dsQUxEUmluaFJ3aUVCWnJRem1tRGlsenRYMXJaMW5wVU9SV0pqUWRzY2xUL2QyZlVDV21sVi9pMWllSkFDTEt4TnJpRHQ0QW9STVlteDJpZ3p0SWxOS2dQV2tZdGlBd2Raa3R3dEZSd1ROc3o2MWlXcElVMDI2S0ZrRHNsRG4xaHR1QlJVOG1IaUJtUFhNUDVVZzNIQXlsdms2VWhiTGRjd2hYQmpOR1lvdFhyOVZzVHdVUTF1V09IaGRBZmRJdlRybWtPdEZCbElXeXFnSHBzUTVDdG5lVTRHQ2wxT2lORXhBZFJSVVFzeThxZmtaZm83TlJkSXdqR1cxb0FjU0tZTHJFVlNJZEVvOUlkTkJvVkNSYnZ6Q3Q2WnIrd0o0OVJncVJrMUJSTFVDeWUzd05JYytKeXIyT3Z5N3M3SEI2NWZUT2RSUXJ3R2xXcXVaYU1VMlVoRW1HZm9tMU5pbEdHWlpYWFJRUlFNVFhvcXo0WEhNTDF4a2dkdWF1em1RQUswQk1zNUw2aTJOSWxNWkR3bER4RjgzUnNVVHMyN0FTMzQ1TTRBZ2c2MFc0dUwwWjdWMFBvSjJ5RHJGUzZMck0zWGhLUFhxU0JJUFJWNnNZV2l6cC9OWXZWb0RRREtib1ZDcGVBZEhwcGRvTk9CNkhSTDlEQjIzY1dPdllVbXpiMUM4UFQzRW0zMVVJeWgzUzJHd1ZKMTU3SkhLQ2IwUTRkSTY1UWZVTklOb3FjNGhuRmxXWXBTb2dabFBVYTRVRmFybThUS3ArZUtvKy9XSWxNY2lWZlJTVHlEMERFcnUzVEtJNGtwaytBR0kybVNqcHpheW5NNm5hemlkVDFha1JRT1MzSXJ5aW5Uc09jYnA2RmVoZnE0cVhQcWhmVE1XZnFHK3VaSVpodkZpSDFHT01lc2VXT2dWRWQ3amRDeUFtWVJqZUtaeWdybC9HRkxnVFkzWnVRQU1nTnV5Z3FsL2M3dnBwQnlRcjkxdEhoM1Ywck41RW9zU1BQdXo4cCtpeHFLN3E2SGU4K21YVlowUkVXYWl0R1Z3OCtnRmhhQ01TS285S2RJdGRGUFRxdTFya0JpUmFQSjZWdW5Gb3h6MGdWbWF2empnV0NhQ0xReWhPR0pWV09iSGxkbVBOQ2hBbmdWWUxEdGtBZ2JNOStTRk9IS0ZFSzQ3UG1TVVllL3pNU1JJQkZUcUJpSGN1eFJ3SHh6NzVLZmNPb3c3SFVHS2pLQXUxTVVXV00wQzhPa0lxZ01TbTI2aXVPSnE4bE9rcVI2d1o3cGsweFp2SkcxazhGanVuVGtJblJyVFhBeUIyU296eVYyZDBsYXVjSzV5K2drcXlIVUVjbHg5ZlQ1Q0FIQ05GTENQQ09zWnJKVjRkdVFIVmdJUk5Ec25PTlRoRTlVeTBYZUt4enZDN0NoZVpkYUtQQ1NSNmo4QXlBcXdhR2svVW5wM0o2MFM4d2lzZ2RrcFhwMktuNk9GQlVSN01qQndHblZGYnRKaDFWUFVFZ2RDOW8ralZ3aUl0amRESmR5Szg0bXd6ZExJUkVQeEdWcUwxY1BpNWxTSnpFbEJMMUpOVllqTXpJYzJWVFlXdG9pZjhQanBucFQ5VTlaMUpBeTJBMk9rUlhVa09WZ0ZNeW1WK3hVRkZUM0N5REhqcTBoTldDOGd1ODhhUi9pQnpSTmhra3dpSHpuTFBJWFdSQnNRSXJjckhhUmdvcFBXa1MwL1ljYlBkOFFTbmk3STJJTG5mQVNKVFZhY2ZHcCtWcjBDaWNSL0FxL1hpTk91RWc2S280T3JVclNmc0FMSGlZamM3cDhaK3lHWVJEbVdhVzdqdUFMRUxPenRsV2FzSk93SEViejFoTlQ2ZGM5Y0dDSzBjSHZPS1RUYlF3U1dxZ05DeW8vWGtsU01UR1JteHo2MjR3KzBSREF0QU5nRTQwNUdWWlE3UXp1enp1b09ZQ0pCa0hlcTNBc3B1ems2ODgraDJ0UUlTajB1YzVDYkZUdHp1VUF4bE5EL0ZrU3c5RVR1dWVDZU5vODF5Snh5bkZSQjJiTGRpM0c3NHNNM1lXRlpkZjZER0pQQ1VpZFlmNWZRaUVReEF0b2h3NkV4VHFic1hXV3pLamt2NFRJZUNkN0xhL0t3Yjc2U3hsK043QmlEYlJEaDBoaDVBckZaME5HR2MydVYrRXRWdDIzYnhPMjJMVHU1QWFmSGwrZ0Rod096a3ZnNnJ5eTBoZGJ4SENjQVFpZFZ1bzg1OW9OSmc5ZGVBc25NM0EyanR5c3FLbm5BODBlVkZuK2dncXRzMk9DY2U4TFQ2ampEMTJxRGgraUlDcGNIclRRN1JBd2duYlJlTzVqTzNWb2hiWW5wOUx4NFliRnYzZGtOcGNLUUp5RlorU2Qwemg1Z0VzSXZ4SEVtQUpBTERpMVZsdDFCS2czZUx5RjJFT1QwK0FvVEREOXpHV1g2NllqeGVWN2piOTZuQWVRcllMcERwMWdGTU5KN1M0TDBFcEM5eTh2UjlCdFRPR2psU3pOK2gxd1BqeDlxVHppOHcyR05wOE84RTVEcms1T2s3MFhLa2lpdVZEeno3Q1lZQnlHUUNjaXR5OG1ZbTRpYmw1MWJpeW1vSExYb2YzTXhFWjZBdzJVRkNNMHVGMFlaNHhXOHdERUNlSUNDamtKUDNuRExCNDFWVUVWZnhDR0FDdzhuN3ZibmtKRjBvV2VLMk5QZzBBZmtMY3ZJZTF3SklJbkdsbXFiRHdmQnJEUVNHOTN2b0xMeWZoT05RU1l3Z3Q5SzBUVllnc3pUNEFnRVpoNXk4U1ZybWJDZXU4c2NiKytCdWJzb2gxM3pJRzNIV3U3dTZpTHFCbjFLaWY4UU1GcFV0WUJLakxqN3dYQnFjUVVEdXh3VzlIc0QrL2Q0d3NSTlhKQ1NKb2tvSWxWR3d6ZkpmakRQaFZ1ZkJTZnpHSjdtN3BVZFhOcVBLUEtMcnBLVUJxNWNWRVpDSGNPbkFDZmpoUjZkTjFLeHY5OTJzUksyU0FKVG5pWTQ0SjJySDYzTXptOUhyRjBiZGp1UFVKc0R5dC85RFFCN0dvTnZ1eGJwdjNUWmx2UGZ4WXVkY1lLYnA4SDJWbXdxOGpkRDZiUzRJNmlvLzA0VlV4bjF1VzJEZXpEa0U1RW5rangvclNYbkcrM2l5MVdEaWJiOUdGRzQvUStiN3lUWFVFZFJOS2puREtnVDFXcWR2TCtEeEIrWVRrS2N4cldnMG5uekJmWk9xNHNwcGRnakJJZWZ3YklmVHE0dGlaME5PTUcvcElSREo5bmNTVWRlNFgyVVJBWGtlSzFmZDRlbTdzeXJpeXZ6QWwxdENrRnNZQXFmeHdIMko2SEM0eVVuUmJWUHg4OThFZ1NtdWZ2czFpUWllNlBtY2w3NUhkdnQ3ak9CaVplVWlYRFcwYldUZ1RrdThjRHZiU25ieW10UHgxNGY2elRNcXNPVE5sU0kxOVRJai9DN2xYRHcxclRkZW5IV0s0L0hGKzB5c21UUGx1TkZqNkFWK1RXN1VyWnR4OGZtdmkyNlhqRE1BMmJ2M2p5amZNeEpYM3RBSmxmdWRYM3NVcTBPU2xWdDdOT0RXS08wWExKbTlEQUpQaVdiTmxoMDZmeUFYTFoySUwxYmZoTmZleWtTZzRlcnVwR0ROSzd5SERpNURwL05lRWYxN1A4WStEd05TWHA2SEEzSlU1SUxpWC9mV2p3dUtrMEtWT3V6a2xNWTc4VTdSQWh3NDhMekl5SWpjbEZuamhJNzg0c3RiOE4yV2tTaVkyQVVCMFhDbnVwOVk4V2EyU1g5Ympzek02YUpUaC9sbVY3V09UTWxuWGhxSHJkdUhZc0Y3N1FHUjV1ZVlqdG0ycStSZURMcHFGVnEzbUNudUhENHRtZzYxQWZuMTEwNFFhYmRoeE9oQldCTSs0NWdsbWw4VGw3SUNIYlBYNHRRbVJlTFpSLzhWMjQzbG9VTDVVMFVmeU1xaHVQMnVQbGo3ZFhPL3huYk10VXN3Y3JMS0lNUnJZdmIwUjYzbWIzdktVNWFYWDRQVXRNRzRmM0pQTEZyYVhPdVZlc2NjRWhGbmJ5LzZYMUdHbjhyZkVDODk4YkFkQ2VJZXU1VVZGUU9RbnQ0Znl6L3VpWDg4Y2laMi9QZEVWMWRhSElzQVJNODVvOWtlUEhEdmwxaS9jWTRZT2FTV21JcXJRMkpwSjZYc2pBMGJlcU5seTF3OE56TWIwNHN5QUhHaWNlZWhnMlBVeHlJb3ZBNXYxTEFmY01ld0VtemJ0VUMweTN3eEVSbVVLU3IzNysrRkpjRWV5TW5xaUZtdloyTEZ5aWJZdU9Wa0NCd1BpVVlJSUFESjMxSlVaMEJHdDIzOG5YOUdNdStqamJ6cS96QnIxM3B1MXEzeElORzg2dlo1Wm1zZ3Qwc0ZicjF4TTFxM0NxS3ljckZJVDUrbk1paGxRQTZSWmV2V3JwZyt1d015bW1SaVVMK1dDSDZhZ2M5V05jYktMNDdEenQxcGdFd0ZCTUZKUVFBQ1ZlQmxsUUpFaWI4Z3EzOFRuTWlYQ2c2REZlbUV6dzhCVmh0VWxWazVyK09ZRGpXNmFORWM2Tm9KNkhJaDBQVWlvR1h6Q2dDYlVGNGVST1BHaTRVUUphcEQ4allRMVY0YTZpbFQ0UCtHQzVPbCt4SUtud0FBQUFCSlJVNUVya0pnZ2c9PQovLyBAaW5jbHVkZSAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQGluY2x1ZGUgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBpbmNsdWRlICAgICAgKjovL3Bhbi5iYWlkdS5jb20vcyoKLy8gQGluY2x1ZGUgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zKgovLyBAaW5jbHVkZSAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3NoYXJlLyoKLy8gQGluY2x1ZGUgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zaGFyZS8qCi8vIEBpbmNsdWRlICAgICAgKi55b3VrdS5jb20vdioKLy8gQGluY2x1ZGUgICAgICAqbS55b3VrdS5jb20vKgovLyBAaW5jbHVkZSAgICAgICouaXFpeWkuY29tL3ZfKgovLyBAaW5jbHVkZSAgICAgICouaXFpeWkuY29tL3dfKgovLyBAaW5jbHVkZSAgICAgICouaXFpeWkuY29tL2FfKgovLyBAaW5jbHVkZSAgICAgICouaXEuY29tL3BsYXkvKgovLyBAaW5jbHVkZSAgICAgICoubGUuY29tL3B0di92cGxheS8qCi8vIEBpbmNsdWRlICAgICAgKnYucXEuY29tL3gqCi8vIEBpbmNsdWRlICAgICAgKnYucXEuY29tL3AqCi8vIEBpbmNsdWRlICAgICAgKnYucXEuY29tL2NvdmVyKgovLyBAaW5jbHVkZSAgICAgICp2LnFxLmNvbS90di8qCi8vIEBpbmNsdWRlICAgICAgKi50dWRvdS5jb20vbGlzdHBsYXkvKgovLyBAaW5jbHVkZSAgICAgICoudHVkb3UuY29tL2FsYnVtcGxheS8qCi8vIEBpbmNsdWRlICAgICAgKi50dWRvdS5jb20vcHJvZ3JhbXMvdmlldy8qCi8vIEBpbmNsdWRlICAgICAgKi50dWRvdS5jb20vdioKLy8gQGluY2x1ZGUgICAgICAqLm1ndHYuY29tL2IvKgovLyBAaW5jbHVkZSAgICAgICp0di5zb2h1LmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKmZpbG0uc29odS5jb20vYWxidW0vKgovLyBAaW5jbHVkZSAgICAgICouYmlsaWJpbGkuY29tL3ZpZGVvLyoKLy8gQGluY2x1ZGUgICAgICAqLmJpbGliaWxpLmNvbS9hbmltZS8qCi8vIEBpbmNsdWRlICAgICAgKi5iaWxpYmlsaS5jb20vYmFuZ3VtaS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAqLmJpbGliaWxpLmNvbS9zLyoKLy8gQGluY2x1ZGUgICAgICAqLnBwdHYuY29tL3Nob3cvKgovLyBAaW5jbHVkZSAgICAgICoud2FzdS5jbi9QbGF5L3Nob3cqCi8vIEBpbmNsdWRlICAgICAgKnYueWlueXVldGFpLmNvbS92aWRlby8qCi8vIEBpbmNsdWRlICAgICAgKnYueWlueXVldGFpLmNvbS9wbGF5bGlzdC8qCi8vIEBpbmNsdWRlICAgICAgKjovL2l0ZW0udGFvYmFvLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKjovLypkZXRhaWwudG1hbGwuY29tLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKmRldGFpbC50bWFsbC5oay8qCi8vIEBpbmNsdWRlICAgICAgKjovLyppdGVtLmpkLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKjovLyoueWl5YW9qZC5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmxpYW5neGlueWFvLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKm11c2ljLjE2My5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly95LnFxLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKjovL2kueS5xcS5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmt1Z291LmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKjovLyprdXdvLmNuLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi54aWFtaS5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly9tdXNpYy50YWloZS5jb20vc29uZyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi4xdGluZy5jb20vcGxheWVyKgovLyBAaW5jbHVkZSAgICAgICo6Ly9tdXNpYy5taWd1LmNuL3YqCi8vIEBpbmNsdWRlICAgICAgKjovLyoubGl6aGkuZm0vKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLnFpbmd0aW5nLmZtLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi54aW1hbGF5YS5jb20vKgovLyBAZXhjbHVkZSAgICAgICo6Ly8qLmVnZ3ZvZC5jbi8qCi8vIEBjb25uZWN0ICAgICAgZC5wY3MuYmFpZHUuY29tCi8vIEBjb25uZWN0ICAgICAgYmFpZHUuY29tCi8vIEBjb25uZWN0ICAgICAgYmFpZHVwY3MuY29tCi8vIEBjb25uZWN0ICAgICAgYmFpZHV5dW4ud2lraQovLyBAY29ubmVjdCAgICAgIGxvY2FsaG9zdAovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vanF1ZXJ5QDMuMi4xL2Rpc3QvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vc3dlZXRhbGVydDJAMTAuMTYuNi9kaXN0L3N3ZWV0YWxlcnQyLmFsbC5taW4uanMKLy8gQG9yaWdpbmFsLXNjcmlwdCBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzc2MDc4Ci8vIEBvcmlnaW5hbC1hdXRob3IgemhtYWkKLy8gQG9yaWdpbmFsLWxpY2Vuc2UgR1BMIExpY2Vuc2UKLy8gQG9yaWdpbmFsLXNjcmlwdCBodHRwczovL2dpdGh1Yi5jb20vc3loeXoxOTkwL2JhaWR1eXVuL2Jsb2IvbWFzdGVyL2JhaWR1eXVuLnVzZXIuanMKLy8gQG9yaWdpbmFsLWF1dGhvciB5b3V4aWFvaG91Ci8vIEBvcmlnaW5hbC1saWNlbnNlIEFHUEwgTGljZW5zZQovLyBAb3JpZ2luYWwtY2hhbmdlcyAxLOWwhuW8uuWItuWFs+azqOWFrOS8l+WPt+aUueS4uumdnuW8uuWItuOAgjIs5bCG5YWs5LyX5Y+35Zu+54mH5pS55Li65paH5a2X44CCMyzliKDpmaTkuoborr7nva7nmoRpY29u5Zu+5qCH44CCCi8vIEBhbnRpZmVhdHVyZSAgcmVmZXJyYWwtbGluayDmraTmj5DnpLrkuLpHcmVhc3lGb3Jr5Luj56CB6KeE6IyD6KaB5rGC5ZCr5pyJ5p+l5Yi45Yqf6IO955qE6ISa5pys5b+F6aG75re75Yqg77yM5a6e6ZmF5L2/55So5peg5Lu75L2V5by65Yi26Lez6L2s77yM5Luj56CB5Y+v5p+l77yM6K+355+l5oKJ44CCCi8vIEBsaWNlbnNlICAgICAgQUdQTCBMaWNlbnNlCi8vIEBncmFudCAgICAgICAgR01fZG93bmxvYWQKLy8gQGdyYW50ICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgICAgICAgIEdNX2dldFJlc291cmNlVVJMCi8vIEBncmFudCAgICAgICAgR01fZ2V0UmVzb3VyY2VUZXh0Ci8vIEBncmFudCAgICAgICAgR01faW5mbwovLyBAZ3JhbnQgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICBHTV9jb29raWUKLy8gQHJ1bi1hdCAgICAgICBkb2N1bWVudC1pZGxlCi8vID09L1VzZXJTY3JpcHQ9PQoKLy/nmb7luqbnvZHnm5gKKGZ1bmN0aW9uKCkgewp2YXIgcGFuX3RpdGxlPW5ldyBBcnJheSgpCgkJcGFuX3RpdGxlWzBdPSAiaHR0cHM6Ly9wYW4uYmFpZHUuY29tLyIKCQlwYW5fdGl0bGVbMV09ICJodHRwczovL3l1bi5iYWlkdS5jb20vIgogICAgICAgIGxldCBwYW5fbGluayA9IGxvY2F0aW9uLmhyZWY7CgkJZm9yKHZhciBhPTA7YTxwYW5fdGl0bGUubGVuZ3RoO2ErKyl7CgkJCWlmKHBhbl9saW5rLmluZGV4T2YocGFuX3RpdGxlW2FdKSE9IC0xKXsKICAgICAgICAgICAgICAgIHBhbl9saW5rID0gcGFuX2xpbmsucmVwbGFjZSgnYmFpZHUuY29tJywnYmFpZHV3cC5jb20nKTsKCQkJCXZhciBwYW5faHRtbCA9ICI8YSBocmVmPSIrcGFuX2xpbmsrIiB0YXJnZXQ9J19ibGFuaycgc3R5bGU9J2N1cnNvcjpwb2ludGVyO3otaW5kZXg6OTg7ZGlzcGxheTpibG9jazt3aWR0aDozMHB4O2hlaWdodDozMHB4O2xpbmUtaGVpZ2h0OjMwcHg7cG9zaXRpb246Zml4ZWQ7bGVmdDowO3RvcDozMDBweDt0ZXh0LWFsaWduOmNlbnRlcjsnPjxpbWcgc3JjPSdodHRwczovL3d3dy5lZ2d2b2QuY24vaW1hZ2VzL3ZpcC5wbmcnIHN0eWxlPSd3aWR0aDo1MHB4JyA+PC9hPiI7CgkJCQkkKCJib2R5IikuYXBwZW5kKHBhbl9odG1sKTsKCi8v55m+5bqm572R55uY6ISa5pys5byA5aeLCi8vCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IHB0ID0gJycsIHNlbGVjdExpc3QgPSBbXSwgcGFyYW1zID0ge30sIG1vZGUgPSAnJywgd2lkdGggPSA4MDAsIHBhbiA9IHt9LCBjb2xvciA9ICcnLAogICAgICAgIGRvYyA9ICQoZG9jdW1lbnQpLCBwcm9ncmVzcyA9IHt9LCByZXF1ZXN0ID0ge30sIGlucyA9IHt9LCBpZG0gPSB7fTsKICAgIGNvbnN0IHNjcmlwdEluZm8gPSBHTV9pbmZvLnNjcmlwdDsKICAgIGNvbnN0IHZlcnNpb24gPSAnNS4xLjMnOwogICAgY29uc3QgYXV0aG9yID0gJ1lvdVhpYW9Ib3UnOwogICAgY29uc3QgbmFtZSA9ICfnvZHnm5jnm7Tpk77kuIvovb3liqnmiYsnOwogICAgY29uc3QgY3VzdG9tQ2xhc3MgPSB7CiAgICAgICAgY29udGFpbmVyOiAncGwtY29udGFpbmVyJywKICAgICAgICBwb3B1cDogJ3BsLXBvcHVwJywKICAgICAgICBoZWFkZXI6ICdwbC1oZWFkZXInLAogICAgICAgIHRpdGxlOiAncGwtdGl0bGUnLAogICAgICAgIGNsb3NlQnV0dG9uOiAncGwtY2xvc2UnLAogICAgICAgIGljb246ICdwbC1pY29uJywKICAgICAgICBpbWFnZTogJ3BsLWltYWdlJywKICAgICAgICBjb250ZW50OiAncGwtY29udGVudCcsCiAgICAgICAgaHRtbENvbnRhaW5lcjogJ3BsLWh0bWwnLAogICAgICAgIGlucHV0OiAncGwtaW5wdXQnLAogICAgICAgIGlucHV0TGFiZWw6ICdwbC1pbnB1dExhYmVsJywKICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZTogJ3BsLXZhbGlkYXRpb24nLAogICAgICAgIGFjdGlvbnM6ICdwbC1hY3Rpb25zJywKICAgICAgICBjb25maXJtQnV0dG9uOiAncGwtY29uZmlybScsCiAgICAgICAgZGVueUJ1dHRvbjogJ3BsLWRlbnknLAogICAgICAgIGNhbmNlbEJ1dHRvbjogJ3BsLWNhbmNlbCcsCiAgICAgICAgbG9hZGVyOiAncGwtbG9hZGVyJywKICAgICAgICBmb290ZXI6ICdwbC1mb290ZXInCiAgICB9OwoKICAgIGxldCB0b2FzdCA9IFN3YWwubWl4aW4oewogICAgICAgIHRvYXN0OiB0cnVlLAogICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCiAgICAgICAgdGltZXI6IDM1MDAsCiAgICAgICAgdGltZXJQcm9ncmVzc0JhcjogZmFsc2UsCiAgICAgICAgZGlkT3BlbjogKHRvYXN0KSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBTd2FsLnN0b3BUaW1lcik7CiAgICAgICAgICAgIHRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBTd2FsLnJlc3VtZVRpbWVyKTsKICAgICAgICB9CiAgICB9KTsKCiAgICBsZXQgdXRpbCA9IHsKICAgICAgICBjbG9nKGMpIHsKICAgICAgICAgICAgY29uc29sZS5ncm91cChgWyR7bmFtZX1dYCk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGMpOwogICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7CiAgICAgICAgfSwKICAgICAgICBnZXRDb29raWUobmFtZSkgewogICAgICAgICAgICBsZXQgYXJyID0gZG9jdW1lbnQuY29va2llLnJlcGxhY2UoL1xzL2csICIiKS5zcGxpdCgnOycpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCB0ZW1wQXJyID0gYXJyW2ldLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICBpZiAodGVtcEFyclswXSA9PSBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0ZW1wQXJyWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKICAgICAgICBnZXRWYWx1ZShuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBHTV9nZXRWYWx1ZShuYW1lKTsKICAgICAgICB9LAogICAgICAgIHNldFZhbHVlKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKG5hbWUsIHZhbHVlKTsKICAgICAgICB9LAogICAgICAgIGdldFN0b3JhZ2Uoa2V5KSB7CiAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOwogICAgICAgIH0sCiAgICAgICAgc2V0U3RvcmFnZShrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsKICAgICAgICB9LAogICAgICAgIHNldENsaXBib2FyZCh0ZXh0KSB7CiAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh0ZXh0LCAndGV4dCcpOwogICAgICAgIH0sCiAgICAgICAgZShzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpKTsKICAgICAgICB9LAogICAgICAgIGQoc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGF0b2Ioc3RyKSkpOwogICAgICAgIH0sCiAgICAgICAgc2V0QkRVU1MoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBHTV9jb29raWUgJiYgR01fY29va2llKCdsaXN0Jywge25hbWU6ICdCRFVTUyd9LCAoY29va2llcywgZXJyb3IpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcmFnZSgiYmFpZHV5dW5QbHVnaW5fQkRVU1MiLCBKU09OLnN0cmluZ2lmeSh7QkRVU1M6IGNvb2tpZXNbMF0udmFsdWV9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGdldEJEVVNTKCkgewogICAgICAgICAgICBsZXQgYmFpZHV5dW5QbHVnaW5fQkRVU1MgPSB0aGlzLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgPyB0aGlzLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgOiAneyJiYWlkdXl1blBsdWdpbl9CRFVTUyI6IiJ9JzsKICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYmFpZHV5dW5QbHVnaW5fQkRVU1MpLkJEVVNTIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgZ2V0RXh0ZW5zaW9uKG5hbWUpIHsKICAgICAgICAgICAgY29uc3QgcmVnID0gLyg/IVwuKVx3KyQvOwogICAgICAgICAgICBpZiAocmVnLnRlc3QobmFtZSkpIHsKICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG5hbWUubWF0Y2gocmVnKTsKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFswXS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAogICAgICAgIHNpemVGb3JtYXQodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSArdmFsdWUpIHsKICAgICAgICAgICAgICAgIGxldCB1bml0ID0gWyJCIiwgIktCIiwgIk1CIiwgIkdCIiwgIlRCIiwgIlBCIiwgIkVCIiwgIlpCIiwgIllCIl07CiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGgubG9nKDEwMjQpKTsKICAgICAgICAgICAgICAgIGxldCBzaXplID0gdmFsdWUgLyBNYXRoLnBvdygxMDI0LCBpbmRleCk7CiAgICAgICAgICAgICAgICBzaXplID0gc2l6ZS50b0ZpeGVkKDEpOwogICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgKyB1bml0W2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKICAgICAgICBzb3J0QnlOYW1lKGFycikgewogICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gIChhLCBiKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcDEgPSBhLmZpbGVuYW1lID8gYS5maWxlbmFtZSA6IGEuc2VydmVyX2ZpbGVuYW1lOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHAyID0gYi5maWxlbmFtZSA/IGIuZmlsZW5hbWUgOiBiLnNlcnZlcl9maWxlbmFtZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDEubG9jYWxlQ29tcGFyZShwMiwgInpoLUNOIik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICBhcnIuc29ydChoYW5kbGUoKSk7CiAgICAgICAgfSwKICAgICAgICBjb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IEJEVVNTID0gdXRpbC5nZXRCRFVTUygpOwogICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2UoJyAnLCAnXycpOwogICAgICAgICAgICBpZiAoISFCRFVTUykgewogICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJVc2VyLUFnZW50OiAke3VhfSIgLS1oZWFkZXIgIkNvb2tpZTogQkRVU1M9JHtCRFVTU30iYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsCiAgICAgICAgICAgICAgICB0ZXh0OiBwYW4uaW5pdFs1XQogICAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBCRFVTUyA9IHV0aWwuZ2V0QkRVU1MoKTsKICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCcgJywgJ18nKTsKICAgICAgICAgICAgaWYgKCEhQkRVU1MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGN1cmwgLUwgIiR7bGlua30iIC0tb3V0cHV0ICIke2ZpbGVuYW1lfSIgLUEgIiR7dWF9IiAtYiAiQkRVU1M9JHtCRFVTU30iYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsCiAgICAgICAgICAgICAgICB0ZXh0OiBwYW4uaW5pdFs1XQogICAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgYmxvYkRvd25sb2FkKGJsb2IsIGZpbGVuYW1lKSB7CiAgICAgICAgICAgIGlmIChibG9iIGluc3RhbmNlb2YgQmxvYikgewogICAgICAgICAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICBhLmhyZWYgPSB1cmw7CiAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7CiAgICAgICAgICAgICAgICBhLmNsaWNrKCk7CiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHNldEludChuYW1lLCB0aW1lKSB7CiAgICAgICAgICAgIHRpbWUgPSB0aW1lIHx8IDEwMDsKICAgICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgICBpZiAoJChuYW1lKS5sZW5ndGgpIHJldHVybjsKICAgICAgICAgICAgbGV0IGlucyA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIGlmICgkKG5hbWUpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zKTsKICAgICAgICAgICAgICAgICAgICAkKG5hbWUpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGkgPiA2MCkgY2xlYXJJbnRlcnZhbChpbnMpOwogICAgICAgICAgICB9LCB0aW1lKTsKICAgICAgICB9LAogICAgICAgIHNsZWVwKHRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpKTsKICAgICAgICB9LAogICAgICAgIG1lc3NhZ2U6IHsKICAgICAgICAgICAgc3VjY2Vzcyh0ZXh0KSB7CiAgICAgICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3N1Y2Nlc3MnfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVycm9yKHRleHQpIHsKICAgICAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnZXJyb3InfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHdhcm5pbmcodGV4dCkgewogICAgICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICd3YXJuaW5nJ30pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBpbmZvKHRleHQpIHsKICAgICAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnaW5mbyd9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcXVlc3Rpb24odGV4dCkgewogICAgICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdxdWVzdGlvbid9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIHR5cGUpIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLCB1cmwsIGhlYWRlcnMsIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiB0eXBlIHx8ICdqc29uJywKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gJ2Jsb2InID8gcmVzb2x2ZShyZXMpIDogcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBnZXQodXJsLCBoZWFkZXJzLCB0eXBlLCBleHRyYSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJlcXVlc3RPYmogPSBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwgdXJsLCBoZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogdHlwZSB8fCAnanNvbicsCiAgICAgICAgICAgICAgICAgICAgb25sb2FkOiAocmVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RPYmouYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbVtleHRyYS5pbmRleF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnYmxvYicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IDIwMCAmJiB1dGlsLmJsb2JEb3dubG9hZChyZXMucmVzcG9uc2UsIGV4dHJhLmZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzLnJlc3BvbnNlIHx8IHJlcy5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbnByb2dyZXNzOiAocmVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnRvdGFsID4gMCA/IHByb2dyZXNzW2V4dHJhLmluZGV4XSA9IChyZXMubG9hZGVkICogMTAwIC8gcmVzLnRvdGFsKS50b0ZpeGVkKDIpIDogcHJvZ3Jlc3NbZXh0cmEuaW5kZXhdID0gMC4wMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25sb2Fkc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhICYmIGV4dHJhLmZpbGVuYW1lICYmIGV4dHJhLmluZGV4ICYmIChyZXF1ZXN0W2V4dHJhLmluZGV4XSA9IHJlcXVlc3RPYmopOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCiAgICAgICAgYWRkU3R5bGUoaWQsIHRhZywgY3NzKSB7CiAgICAgICAgICAgIHRhZyA9IHRhZyB8fCAnc3R5bGUnOwogICAgICAgICAgICBsZXQgZG9jID0gZG9jdW1lbnQsIHN0eWxlRG9tID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgICAgICAgaWYgKHN0eWxlRG9tKSByZXR1cm47CiAgICAgICAgICAgIGxldCBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgICAgIHN0eWxlLnJlbCA9ICdzdHlsZXNoZWV0JzsKICAgICAgICAgICAgc3R5bGUuaWQgPSBpZDsKICAgICAgICAgICAgdGFnID09PSAnc3R5bGUnID8gc3R5bGUuaW5uZXJIVE1MID0gY3NzIDogc3R5bGUuaHJlZiA9IGNzczsKICAgICAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgIH0KICAgIH07CgogICAgbGV0IHBhbmxpbmtlciA9IHsKICAgICAgICBpbml0VmFsdWUoKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFt7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfZG9tYWluJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnaHR0cDovL2xvY2FsaG9zdCcKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3BvcnQnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcxNjgwMCcKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3Rva2VuJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfZGlyJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnRDonCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3RoZW1lX2NvbG9yJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnIzA5QUFGRicKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfaW5pdF9jb2RlJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2NvZGUnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcnCiAgICAgICAgICAgIH1dOwoKICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgdXRpbC5nZXRWYWx1ZSh2Lm5hbWUpID09PSB1bmRlZmluZWQgJiYgdXRpbC5zZXRWYWx1ZSh2Lm5hbWUsIHYudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBhZGRTdHlsZSgpIHsKICAgICAgICAgICAgY29sb3IgPSB1dGlsLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJyk7CiAgICAgICAgICAgIHV0aWwuc2V0SW50KCcjcGFubGlua2VyLWJ1dHRvbicpOwogICAgICAgICAgICBsZXQgY3NzPWAKICAgICAgICAgICAgYm9keTo6LXdlYmtpdC1zY3JvbGxiYXIgeyBkaXNwbGF5OiBub25lIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiA2cHg7IGhlaWdodDogMTBweCB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgeyBib3JkZXItcmFkaXVzOiAwOyBiYWNrZ3JvdW5kOiBub25lIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoODUsODUsODUsLjQpIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsgYm9yZGVyLXJhZGl1czogNXB4OyAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCA2cHggcmdiYSgwLDAsMCwuMikgfQogICAgICAgICAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg4NSw4NSw4NSwuMykgfQogICAgICAgICAgICAucGwtcG9wdXAgeyBmb250LXNpemU6IDEycHggIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtcG9wdXAgYSB7IGNvbG9yOiAke2NvbG9yfSAhaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5wbC1oZWFkZXIgeyBwYWRkaW5nOiAwIWltcG9ydGFudDthbGlnbi1pdGVtczogZmxleC1zdGFydCFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlIWltcG9ydGFudDsgbWFyZ2luOiAwIDAgMTBweCFpbXBvcnRhbnQ7IHBhZGRpbmc6IDAgMCA1cHghaW1wb3J0YW50O30KICAgICAgICAgICAgLnBsLXRpdGxlIHsgZm9udC1zaXplOiAxNnB4IWltcG9ydGFudDsgbGluZS1oZWlnaHQ6IDEhaW1wb3J0YW50O3doaXRlLXNwYWNlOiBub3dyYXAhaW1wb3J0YW50OyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyFpbXBvcnRhbnQ7fQogICAgICAgICAgICAucGwtY29udGVudCB7IHBhZGRpbmc6IDAgIWltcG9ydGFudDsgZm9udC1zaXplOiAxMnB4IWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtbWFpbiB7IG1heC1oZWlnaHQ6IDQwMHB4O292ZXJmbG93LXk6c2Nyb2xsOyB9CiAgICAgICAgICAgIC5wbC1mb290ZXIge2ZvbnQtc2l6ZTogMTJweCFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0IWltcG9ydGFudDsgbWFyZ2luOiAxMHB4IDAgMCFpbXBvcnRhbnQ7IHBhZGRpbmc6IDVweCAwIDAhaW1wb3J0YW50OyBjb2xvcjogI2Y1NmM2YyFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLnBsLWl0ZW0geyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBsaW5lLWhlaWdodDogMjJweDsgfQogICAgICAgICAgICAucGwtaXRlbS1uYW1lIHsgZmxleDogMCAwIDE1MHB4OyB0ZXh0LWFsaWduOiBsZWZ0O21hcmdpbi1yaWdodDogMTBweDsgb3ZlcmZsb3c6IGhpZGRlbjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IGN1cnNvcjpkZWZhdWx0O30KICAgICAgICAgICAgLnBsLWl0ZW0tbGluayB7IGZsZXg6IDE7IG92ZXJmbG93OiBoaWRkZW47dGV4dC1hbGlnbjogbGVmdDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IH0KICAgICAgICAgICAgLnBsLWl0ZW0tdGlwIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2ZsZXg6IDE7fQogICAgICAgICAgICAucGwtYmFjayB7IHdpZHRoOiA3MHB4OyBiYWNrZ3JvdW5kOiAjZGRkOyBib3JkZXItcmFkaXVzOiAzcHg7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luOjFweCAwO30KICAgICAgICAgICAgLnBsLWV4dCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDQ0cHg7IGJhY2tncm91bmQ6ICM5OTk7IGNvbG9yOiAjZmZmOyBoZWlnaHQ6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxNnB4OyBmb250LXNpemU6IDEycHg7IGJvcmRlci1yYWRpdXM6IDNweDt9CiAgICAgICAgICAgIC5wbC1yZXRyeSB7cGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICNjYzMyMzU7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjt9CiAgICAgICAgICAgIC5wbC1icm93c2VyZG93bmxvYWQge3BhZGRpbmc6IDNweCAxMHB4OyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweDsgY3Vyc29yOiBwb2ludGVyO30KICAgICAgICAgICAgLnBsLWl0ZW0tcHJvZ3Jlc3MgeyBkaXNwbGF5OmZsZXg7ZmxleDogMTthbGlnbi1pdGVtczpjZW50ZXJ9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcyB7IGRpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO3dpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94O2xpbmUtaGVpZ2h0OiAxO3Bvc2l0aW9uOiByZWxhdGl2ZTtoZWlnaHQ6MTVweDsgZmxleDogMX0KICAgICAgICAgICAgLnBsLXByb2dyZXNzLW91dGVyIHsgaGVpZ2h0OiAxNXB4O2JvcmRlci1yYWRpdXM6IDEwMHB4O2JhY2tncm91bmQtY29sb3I6ICNlYmVlZjU7b3ZlcmZsb3c6IGhpZGRlbjtwb3NpdGlvbjogcmVsYXRpdmU7dmVydGljYWwtYWxpZ246IG1pZGRsZTt9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1pbm5lcnsgcG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDA7dG9wOiAwO2JhY2tncm91bmQtY29sb3I6ICM0MDllZmY7dGV4dC1hbGlnbjogcmlnaHQ7Ym9yZGVyLXJhZGl1czogMTAwcHg7bGluZS1oZWlnaHQ6IDE7d2hpdGUtc3BhY2U6IG5vd3JhcDt0cmFuc2l0aW9uOiB3aWR0aCAuNnMgZWFzZTt9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1pbm5lci10ZXh0IHsgZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Y29sb3I6ICNkMWQxZDE7Zm9udC1zaXplOiAxMnB4O21hcmdpbjogMCA1cHg7aGVpZ2h0OiAxNXB4fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MtdGlweyBmbGV4OjE7dGV4dC1hbGlnbjpyaWdodH0KICAgICAgICAgICAgLnBsLXByb2dyZXNzLWhvd3sgZmxleDogMCAwIDkwcHg7IGJhY2tncm91bmQ6ICNkZGQ7IGJvcmRlci1yYWRpdXM6IDNweDsgbWFyZ2luLWxlZnQ6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1hbGlnbjogY2VudGVyO30KICAgICAgICAgICAgLnBsLXByb2dyZXNzLXN0b3B7IGZsZXg6IDAgMCA1MHB4OyBwYWRkaW5nOiAwIDEwcHg7IGJhY2tncm91bmQ6ICNjYzMyMzU7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjttYXJnaW4tbGVmdDoxMHB4O2hlaWdodDoyMHB4fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dDphZnRlciB7IGRpc3BsYXk6IGlubGluZS1ibG9jaztjb250ZW50OiAiIjtoZWlnaHQ6IDEwMCU7dmVydGljYWwtYWxpZ246IG1pZGRsZTt9CiAgICAgICAgICAgIC5wbC1idG4tcHJpbWFyeSB7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICNmZmZmZmY7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxMnB4OyBvdXRsaW5lOiBub25lOyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBtYXJnaW46IDJweCAwOyBwYWRkaW5nOiA2cHggMDt0cmFuc2l0aW9uOiAwLjNzIG9wYWNpdHk7IH0KICAgICAgICAgICAgLnBsLWJ0bi1pbmZvIHsgYmFja2dyb3VuZDogIzYwNjI2NjsgfQogICAgICAgICAgICAucGwtYnV0dG9uLWluaXQgeyBvcGFjaXR5OiAwLjU7IGFuaW1hdGlvbjogZWFzZUluaXRPcGFjaXR5IDEuMnMgMzsgYW5pbWF0aW9uLWZpbGwtbW9kZTpmb3J3YXJkcyB9CiAgICAgICAgICAgIEBrZXlmcmFtZXMgZWFzZUluaXRPcGFjaXR5IHsgZnJvbSB7IG9wYWNpdHk6IDAuNTsgfSA1MCUgeyBvcGFjaXR5OiAxIH0gdG8geyBvcGFjaXR5OiAwLjU7IH0gfQogICAgICAgICAgICAucGwtYnRuLXByaW1hcnk6aG92ZXIgeyBvcGFjaXR5OiAwLjk7dHJhbnNpdGlvbjogMC4zcyBvcGFjaXR5OyB9CiAgICAgICAgICAgIC5wbC1idG4tZGFuZ2VyIHsgYmFja2dyb3VuZDogI2NjMzIzNTsgfQogICAgICAgICAgICAucGwtYnRuLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiAjNTVhZjI4OyBhbmltYXRpb246IGVhc2VPcGFjaXR5IDEuMnMgMjsgYW5pbWF0aW9uLWZpbGwtbW9kZTpmb3J3YXJkcyB9CiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGVhc2VPcGFjaXR5IHsgZnJvbSB7IG9wYWNpdHk6IDE7IH0gNTAlIHsgb3BhY2l0eTogMC4zNSB9IHRvIHsgb3BhY2l0eTogMTsgfSB9CiAgICAgICAgICAgIC5lbGVtZW50LWNsaWNrZWQgeyBvcGFjaXR5OiAwLjU7IH0KICAgICAgICAgICAgLnBsLWV4dHJhIHsgbWFyZ2luLXRvcDogMTBweDtkaXNwbGF5OmZsZXh9CiAgICAgICAgICAgIC5wbC1leHRyYSBidXR0b24geyBmbGV4OiAxfQogICAgICAgICAgICAucG9pbnRlciB7IGN1cnNvcjpwb2ludGVyIH0KICAgICAgICAgICAgLnBsLXNldHRpbmctbGFiZWwgeyBkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO3BhZGRpbmctdG9wOiAxMHB4OyB9CiAgICAgICAgICAgIC5wbC1sYWJlbCB7IGZsZXg6IDAgMCAxMDBweDt0ZXh0LWFsaWduOmxlZnQ7IH0KICAgICAgICAgICAgLnBsLWlucHV0IHsgZmxleDogMTsgcGFkZGluZzogOHB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICNjMmMyYzI7IGJvcmRlci1yYWRpdXM6IDVweDsgZm9udC1zaXplOiAxNHB4IH0KICAgICAgICAgICAgLnBsLWNvbG9yIHsgZmxleDogMTtkaXNwbGF5OiBmbGV4O2ZsZXgtd3JhcDogd3JhcDsgbWFyZ2luLXJpZ2h0OiAtMTBweDt9CiAgICAgICAgICAgIC5wbC1jb2xvci1ib3ggeyB3aWR0aDogMzVweDtoZWlnaHQ6IDM1cHg7bWFyZ2luOjEwcHggMTBweCAwIDA7OyBib3gtc2l6aW5nOiBib3JkZXItYm94O2JvcmRlcjoxcHggc29saWQgI2ZmZjtjdXJzb3I6cG9pbnRlciB9CiAgICAgICAgICAgIC5wbC1jb2xvci1ib3guY2hlY2tlZCB7IGJvcmRlcjozcHggZGFzaGVkICMxMTEhaW1wb3J0YW50IH0KICAgICAgICAgICAgLnBsLWNsb3NlOmZvY3VzIHsgb3V0bGluZTogMDsgYm94LXNoYWRvdzogbm9uZTsgfQogICAgICAgICAgICAudGFnLWRhbmdlciB7Y29sb3I6I2NjMzIzNTttYXJnaW46IDAgNXB4O30KICAgICAgICAgICAgLnBsLXRvb2x0aXAgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGNvbG9yOiAjZmZmZmZmOyBtYXgtd2lkdGg6IDYwMHB4OyBmb250LXNpemU6IDEycHg7IHBhZGRpbmc6IDVweCAxMHB4OyBiYWNrZ3JvdW5kOiAjMzMzOyBib3JkZXItcmFkaXVzOiA1cHg7IHotaW5kZXg6IDk5OTk5OyBsaW5lLWhlaWdodDogMS4zOyBkaXNwbGF5Om5vbmU7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDt9CiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGxvYWQgeyAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpIH0gMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfSB9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdiB7cG9zaXRpb246IGFic29sdXRlO2JvcmRlci1yYWRpdXM6IDUwJTt9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMSkge3RvcDogOXB4O2xlZnQ6IDlweDt3aWR0aDogODJweDtoZWlnaHQ6IDgycHg7YmFja2dyb3VuZDogI2ZmZmZmZjt9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMikge3RvcDogMTRweDtsZWZ0OiAzOHB4O3dpZHRoOiAyNXB4O2hlaWdodDogMjVweDtiYWNrZ3JvdW5kOiAjNjY2NjY2O2FuaW1hdGlvbjogbG9hZCAxcyBsaW5lYXIgaW5maW5pdGU7dHJhbnNmb3JtLW9yaWdpbjogMTJweCAzNnB4O30KICAgICAgICAgICAgLnBsLWxvYWRpbmcge3dpZHRoOiAxNnB4O2hlaWdodDogMTZweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7b3ZlcmZsb3c6IGhpZGRlbjtiYWNrZ3JvdW5kOiBub25lO30KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7cG9zaXRpb246IHJlbGF0aXZlO3RyYW5zZm9ybTogdHJhbnNsYXRlWigwKSBzY2FsZSgwLjE2KTtiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47dHJhbnNmb3JtLW9yaWdpbjogMCAwO30KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94IGRpdiB7IGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyB9CiAgICAgICAgICAgIC5zd2FsMi1jb250YWluZXIgeyB6LWluZGV4OjEwMDAwMCFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgYm9keS5zd2FsMi1oZWlnaHQtYXV0byB7IGhlaWdodDogaW5oZXJpdCFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgYDsKICAgICAgICAgICAgdXRpbC5hZGRTdHlsZSgncGFubGlua2VyLXN0eWxlJywnc3R5bGUnLGNzcyk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkUGFnZUxpc3RlbmVyKCkgewogICAgICAgICAgICBmdW5jdGlvbiBfZmFjdG9yeShlKSB7CiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLnRhcmdldCk7CiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRhcmdldC5wYXJlbnRzKCcucGwtaXRlbScpOwogICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLWxpbmsnKTsKICAgICAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tcHJvZ3Jlc3MnKTsKICAgICAgICAgICAgICAgIGxldCB0aXAgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXRpcCcpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBpdGVtLCBsaW5rLCBwcm9ncmVzcywgdGlwLCB0YXJnZXQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBfcmVzZXQoaSkgewogICAgICAgICAgICAgICAgaW5zW2ldICYmIGNsZWFySW50ZXJ2YWwoaW5zW2ldKTsKICAgICAgICAgICAgICAgIHJlcXVlc3RbaV0gJiYgcmVxdWVzdFtpXS5hYm9ydCgpOwogICAgICAgICAgICAgICAgcHJvZ3Jlc3NbaV0gPSAwOwogICAgICAgICAgICAgICAgaWRtW2ldID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRvYy5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlJywgJy5wbC1idXR0b24nLCAoZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlZW50ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCdidXR0b24tb3BlbicpOwogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCcucGwtbWVudScpLnNob3coKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCdidXR0b24tb3BlbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdtb3VzZWxlYXZlJywgJy5wbC1tZW51JywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5oaWRlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBtb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwogICAgICAgICAgICAgICAgU3dhbC5zaG93TG9hZGluZygpOwogICAgICAgICAgICAgICAgdGhpcy5nZXRQQ1NMaW5rKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgbGV0ICR3aWR0aCA9IG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXInKTsKICAgICAgICAgICAgICAgIGxldCAkdGV4dCA9IG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCcpOwogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gby5saW5rWzBdLmRhdGFzZXQuZmlsZW5hbWU7CiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsKICAgICAgICAgICAgICAgIF9yZXNldChpbmRleCk7CiAgICAgICAgICAgICAgICB1dGlsLmdldChvLmxpbmtbMF0uZGF0YXNldC5saW5rLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9LCAnYmxvYicsIHtmaWxlbmFtZSwgaW5kZXh9KTsKICAgICAgICAgICAgICAgIGluc1tpbmRleF0gPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2cgPSArcHJvZ3Jlc3NbaW5kZXhdIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSURNID0gaWRtW2luZGV4XSB8fCBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNJRE0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgby50aXAuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBvLnByb2dyZXNzLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgby5saW5rLnRleHQoJ+W3suaIkOWKn+WUpOi1t0lETe+8jOivt+afpeeci0lETeS4i+i9veahhu+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkbVtpbmRleF0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBvLmxpbmsuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBvLnRpcC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHJvZ3Jlc3Muc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAkd2lkdGguY3NzKCd3aWR0aCcsIHByb2cgKyAnJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGV4dC50ZXh0KHByb2cgKyAnJScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZyA9PSAxMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1tpbmRleF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1zdG9wJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy10aXAnKS5odG1sKCfkuIvovb3lrozmiJDvvIzmraPlnKjlvLnlh7rmtY/op4jlmajkuIvovb3moYbvvIEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1yZXRyeScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgby50aXAuaGlkZSgpOwogICAgICAgICAgICAgICAgby5saW5rLnNob3coKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWhvdycsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFtpbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0W2luZGV4XS5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgby5wcm9ncmVzcy5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgby50aXAuc2hvdygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXN0b3AnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RbaW5kZXhdKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1tpbmRleF0pOwogICAgICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBvLnByb2dyZXNzLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBvLmxpbmsuc2hvdygwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWJhY2snLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgIG8ubGluay5zaG93KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFyaWEnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgaWYgKCFlLnRhcmdldC5kYXRhc2V0LmxpbmspIHsKICAgICAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS5yZW1vdmVDbGFzcygnbGlzdGVuZXItY29weS1hcmlhJykuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKGAke3Bhbi5pbml0WzVdffCfkYk8YSBocmVmPSIke3Bhbi5hc3Npc3RhbnR9IiB0YXJnZXQ9Il9ibGFuayI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdXRpbC5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwogICAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKn++8jOW/q+WOu+eymOi0tOWQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstcnBjJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LnByZXBlbmQodGhpcy5jcmVhdGVMb2FkaW5nKCkpOwogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZExpbmtUb1JQQyhlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5maWxlbmFtZSwgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CiAgICAgICAgICAgICAgICBpZiAocmVzID09PSAnc3VjY2VzcycpIHsKICAgICAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItcnBjLXRhc2snKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUNsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbCgn5Y+R6YCB5oiQ5Yqf77yM5b+r5Y6755yL55yL5ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT09ICdhc3Npc3RhbnQnKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiPueCueWHu+atpOWkhOWuieijhTwvYT7wn5GIYCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1jb25maWctcnBjJywgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zaG93U2V0dGluZygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgIGRvbWFpbjogdXRpbC5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICAgICAgcG9ydDogdXRpbC5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgfSksIHVybCA9IGBodHRwOi8vZC5iYWlkdXl1bi53aWtpLz9ycGM9JHt1dGlsLmUocnBjKX0jJHt1dGlsLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsICcubGlzdGVuZXItdGlwJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdtb3VzZWVudGVyJykgewogICAgICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IGUuY3VycmVudFRhcmdldC5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5zaXplOwogICAgICAgICAgICAgICAgICAgIGxldCB0aXAgPSBgJHtmaWxlbmFtZX08c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Y29sb3I6ICNmNTZjNmM7Ij4ke3NpemV9PC9zcGFuPmA7CiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmNzcyh7b3BhY2l0eTogJzAuNSd9KTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtdG9vbHRpcCcpLmh0bWwodGlwKS5jc3MoewogICAgICAgICAgICAgICAgICAgICAgICAnbGVmdCc6IGUucGFnZVggKyAxMCArICdweCcsCiAgICAgICAgICAgICAgICAgICAgICAgICd0b3AnOiBlLnBhZ2VZIC0gZS5jdXJyZW50VGFyZ2V0Lm9mZnNldFRvcCA+IDE0ID8gZS5wYWdlWSArICdweCcgOiBlLnBhZ2VZICsgMjAgKyAncHgnCiAgICAgICAgICAgICAgICAgICAgfSkuc2hvdygpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuY3NzKHtvcGFjaXR5OiAnMSd9KTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtdG9vbHRpcCcpLmhpZGUoMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNyZWF0ZVRpcCgpIHsKICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgnPGRpdiBjbGFzcz0icGwtdG9vbHRpcCI+PC9kaXY+Jyk7CiAgICAgICAgfSwKCiAgICAgICAgY3JlYXRlTG9hZGluZygpIHsKICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgY2xhc3M9InBsLWxvYWRpbmciPjxkaXYgY2xhc3M9InBsLWxvYWRpbmctYm94Ij48ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsKICAgICAgICB9LAoKICAgICAgICBhZGRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgaWYgKCgkKCcucGwtYnV0dG9uJykubGVuZ3RoIHx8ICQoJy5wbC1idXR0b24taW5pdCcpLmxlbmd0aCkgJiYgcGFuLm5hbWUgIT09IG5hbWUpIHJldHVybjsKCiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPHNwYW4gY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIHBvaW50ZXIgcGwtYnV0dG9uIj48YSBzdHlsZT0iY29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiAke2NvbG9yfTtib3JkZXItY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbiBnLWJ1dHRvbi1ibHVlIiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+PC9hPjxzcGFuIGNsYXNzPSJtZW51IiBzdHlsZT0id2lkdGg6YXV0bzt6LWluZGV4OjQxO2JvcmRlci1jb2xvcjoke2NvbG9yfSI+PGEgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiIGhyZWY9ImphdmFzY3JpcHQ6OyI+QVBJ5LiL6L29PC9hPjxhIHN0eWxlPSJjb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgaHJlZj0iamF2YXNjcmlwdDo7IiA+QXJpYeS4i+i9vTwvYT48YSBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyIgaHJlZj0iamF2YXNjcmlwdDo7Ij5SUEPkuIvovb08L2E+PGEgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIiBocmVmPSJqYXZhc2NyaXB0OjsiPmNVUkzkuIvovb08L2E+JHtwYW4uY29kZSA9PSAyMDAgJiYgdmVyc2lvbiA8IHBhbi52ZXJzaW9uID8gcGFuLm5ldyA6ICcnfTwvc3Bhbj48L3NwYW4+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ21haW4nKSB7CiAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4ubWFpbik7CiAgICAgICAgICAgICAgICAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0icGwtYnV0dG9uIiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDogOHB4OyI+PGJ1dHRvbiBjbGFzcz0idS1idG4gbmQtZmlsZS1saXN0LXRvb2xiYXItYWN0aW9uLWl0ZW0gdS1idG4tLXByaW1hcnkgdS1idG4tLWRlZmF1bHQgdS1idG4tLXNtYWxsIGlzLXJvdW5kIGlzLWhhcy1pY29uIiAgc3R5bGU9ImJhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjogJHtjb2xvcn0iPjxpIGNsYXNzPSJpY29uZm9udCBpbmxpbmUtYmxvY2stdi1taWRkbGUgbmQtZmlsZS1saXN0LXRvb2xiYXJfX2FjdGlvbi1pdGVtLWljb24gaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuIGNsYXNzPSJpbmxpbmUtYmxvY2stdi1taWRkbGUgbmQtZmlsZS1saXN0LXRvb2xiYXItYWN0aW9uLWl0ZW0tdGV4dCI+5LiL6L295Yqp5omLPC9zcGFuPjwvYnV0dG9uPjx1bCBjbGFzcz0iZHJvcGRvd24tbGlzdCBuZC1jb21tb24tZmxvYXQtbWVudSBwbC1tZW51IiAgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSI+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0ic3ViIGN1cnNvci1wIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPiR7cGFuLmNvZGUgPT0gMjAwICYmIHZlcnNpb24gPCBwYW4udmVyc2lvbiA/IHBhbi5uZXdYIDogJyd9PC91bD48L2Rpdj5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICB1dGlsLmNsb2coYOWKqeaJi+WKoOi9veaIkOWKn++8geeJiOacrO+8miR7dmVyc2lvbn1gKTsKICAgICAgICAgICAgdXRpbC5zZXRCRFVTUygpOwogICAgICAgICAgICB0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwogICAgICAgIH0sCgogICAgICAgIGFkZEluaXRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgaWYgKCQoJy5wbC1idXR0b24taW5pdCcpLmxlbmd0aCAmJiBwYW4ubmFtZSAhPT0gbmFtZSkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICB1dGlsLnNldEludCgnLnBsLWJ1dHRvbicpOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxzcGFuIGNsYXNzPSJnLWRyb3Bkb3duLWJ1dHRvbiBwb2ludGVyIHBsLWJ1dHRvbi1pbml0IiBzdHlsZT0ib3BhY2l0eTouNSI+PGEgc3R5bGU9ImNvbG9yOiNmZmY7YmFja2dyb3VuZDogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSIgaHJlZj0iamF2YXNjcmlwdDo7Ij48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRvd25sb2FkIj48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDYwcHg7Ij7kuIvovb3liqnmiYs8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2E+PC9zcGFuPmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwogICAgICAgICAgICBpZiAocHQgPT09ICdtYWluJykgewogICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLm1haW4pOwogICAgICAgICAgICAgICAgJGJ1dHRvbiA9ICQoYDxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9InBsLWJ1dHRvbi1pbml0IiBzdHlsZT0ib3BhY2l0eTouNTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tcmlnaHQ6IDhweDsiPjxidXR0b24gY2xhc3M9InUtYnRuIG5kLWZpbGUtbGlzdC10b29sYmFyLWFjdGlvbi1pdGVtIHUtYnRuLS1wcmltYXJ5IHUtYnRuLS1kZWZhdWx0IHUtYnRuLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiIgc3R5bGU9ImJhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjogJHtjb2xvcn0iPjxpIGNsYXNzPSJpY29uZm9udCBpbmxpbmUtYmxvY2stdi1taWRkbGUgbmQtZmlsZS1saXN0LXRvb2xiYXJfX2FjdGlvbi1pdGVtLWljb24gaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuIGNsYXNzPSJpbmxpbmUtYmxvY2stdi1taWRkbGUgbmQtZmlsZS1saXN0LXRvb2xiYXItYWN0aW9uLWl0ZW0tdGV4dCI+5LiL6L295Yqp5omLPC9zcGFuPjwvYnV0dG9uPjwvYT5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAkYnV0dG9uLmNsaWNrKCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXREaWFsb2coKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0UENTTGluaygpIHsKICAgICAgICAgICAgc2VsZWN0TGlzdCA9IHRoaXMuc2VsZWN0ZWRMaXN0KCk7CiAgICAgICAgICAgIGxldCBmaWRMaXN0ID0gdGhpcy5fZ2V0RmlkTGlzdCgpLCB1cmwsIHJlczsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScgfHwgcHQgPT09ICdtYWluJykgewogICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwubWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5tZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpZExpc3QgPSBlbmNvZGVVUklDb21wb25lbnQoZmlkTGlzdCk7CiAgICAgICAgICAgICAgICB1cmwgPSBgJHtwYW4ucGNzWzBdfSZmc2lkcz0ke2ZpZExpc3R9YDsKICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IHV0aWwuZ2V0KHVybCwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldFNoYXJlRGF0YSgpOwogICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwubWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5tZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLnNpZ24pIHsKICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7cGFuLnBjc1syXX0mc3VybD0ke3BhcmFtcy5zdXJsfSZsb2dpZD0ke3BhcmFtcy5sb2dpZH1gOwogICAgICAgICAgICAgICAgICAgIGxldCByID0gYXdhaXQgdXRpbC5nZXQodXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAoci5lcnJubyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2lnbiA9IHIuZGF0YS5zaWduOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudGltZXN0YW1wID0gci5kYXRhLnRpbWVzdGFtcDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlhbG9nID0gYXdhaXQgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0OiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGDmj5DnpLrvvJror7flsIbmlofku7Y8c3BhbiBjbGFzcz0idGFnLWRhbmdlciI+W+S/neWtmOWIsOe9keebmF08L3NwYW4+8J+RieWcqDxzcGFuIGNsYXNzPSJ0YWctZGFuZ2VyIj5b5oiR55qE572R55uYXTwvc3Bhbj7kuK3kuIvovb3vvIFgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+eCueWHu+S/neWtmCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcudG9vbHMtc2hhcmUtc2F2ZS1oYicpWzBdLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLmJkc3Rva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwubWVzc2FnZS5lcnJvcign5o+Q56S677ya55m75b2V572R55uY5ZCO5omN6IO95L2/55So5q2k5Yqf6IO95ZOm77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZW5jcnlwdCcsIHBhcmFtcy5lbmNyeXB0KTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncHJvZHVjdCcsIHBhcmFtcy5wcm9kdWN0KTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgndWsnLCBwYXJhbXMudWspOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdwcmltYXJ5aWQnLCBwYXJhbXMucHJpbWFyeWlkKTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlkX2xpc3QnLCBmaWRMaXN0KTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbG9naWQnLCBwYXJhbXMubG9naWQpOwogICAgICAgICAgICAgICAgcGFyYW1zLnNoYXJlVHlwZSA9PT0gJ3NlY3JldCcgPyBmb3JtRGF0YS5hcHBlbmQoJ2V4dHJhJywgcGFyYW1zLmV4dHJhKSA6ICcnOwogICAgICAgICAgICAgICAgdXJsID0gYCR7cGFuLnBjc1sxXX0mc2lnbj0ke3BhcmFtcy5zaWdufSZ0aW1lc3RhbXA9JHtwYXJhbXMudGltZXN0YW1wfWA7CiAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCB1dGlsLnBvc3QodXJsLCBmb3JtRGF0YSwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlcy5lcnJubyA9PT0gMCkgewogICAgICAgICAgICAgICAgbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHJlcy5saXN0KTsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5lcnJubyA9PT0gMTEyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5tZXNzYWdlLmVycm9yKCfmj5DnpLrvvJrpobXpnaLov4fmnJ/vvIzor7fliLfmlrDph43or5XvvIEnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHV0aWwubWVzc2FnZS5lcnJvcign5o+Q56S677ya6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yB6K+35Yi35paw572R6aG15ZCO6YeN6K+V77yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZW5lcmF0ZURvbShsaXN0KSB7CiAgICAgICAgICAgIGxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CiAgICAgICAgICAgIGxldCBhbGlua0FsbFRleHQgPSAnJzsKICAgICAgICAgICAgdXRpbC5zb3J0QnlOYW1lKGxpc3QpOwogICAgICAgICAgICBsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2LmlzZGlyID09PSAxKSByZXR1cm47CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2LnNlcnZlcl9maWxlbmFtZSB8fCB2LmZpbGVuYW1lOwogICAgICAgICAgICAgICAgbGV0IGV4dCA9IHV0aWwuZ2V0RXh0ZW5zaW9uKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIGxldCBzaXplID0gdXRpbC5zaXplRm9ybWF0KHYuc2l6ZSk7CiAgICAgICAgICAgICAgICBsZXQgZGxpbmsgPSB2LmRsaW5rOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcGknKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGhyZWY9IiR7ZGxpbmt9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS10aXAiIHN0eWxlPSJkaXNwbGF5OiBub25lIj48c3Bhbj7oi6XmsqHmnInlvLnlh7pJRE3kuIvovb3moYbvvIzmib7liLBJRE0gPGI+6YCJ6aG5PC9iPiAtPiA8Yj7mlofku7bnsbvlnos8L2I+IC0+IDxiPuesrOS4gOS4quahhjwvYj4g5Lit5re75Yqg5ZCO57yAIDxzcGFuIGNsYXNzPSJwbC1leHQiPiR7ZXh0fTwvc3Bhbj7vvIw8YSBocmVmPSJodHRwczovL3d3dy5iYWlkdXl1bi53aWtpL3poLWNuL2lkbS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+6K+m6KeB5q2k5aSEPC9hPjwvc3Bhbj4gPHNwYW4gY2xhc3M9InBsLWJhY2sgbGlzdGVuZXItYmFjayI+6L+U5ZuePC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tcHJvZ3Jlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3Mtb3V0ZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXIiIHN0eWxlPSJ3aWR0aDo1JSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyLXRleHQiPjAlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1zdG9wIGxpc3RlbmVyLXN0b3AiPuWPlua2iOS4i+i9vTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXRpcCI+5pyq5Y+R546wSURN77yM5L2/55So6Ieq5bim5rWP6KeI5Zmo5LiL6L29PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyI+5aaC5L2V5ZSk6LW3SURN77yfPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PjwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdXRpbC5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLBSUEPkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB1dGlsLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJHthbGluay5saW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250ZW50ICs9ICc8L2Rpdj4nOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKQogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYXJpYSIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJzxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSAgbGlzdGVuZXItc2VuZC1ycGMiPuWPkemAgeWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvbmZpZy1ycGMiIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPumFjee9rlJQQ+acjeWKoTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1zdWNjZXNzIGxpc3RlbmVyLXJwYy10YXNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7ZGlzcGxheTogbm9uZSI+5p+l55yL5LiL6L295Lu75YqhPC9idXR0b24+PC9kaXY+JzsKICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgc2VuZExpbmtUb1JQQyhmaWxlbmFtZSwgbGluaykgewogICAgICAgICAgICBsZXQgcnBjID0gewogICAgICAgICAgICAgICAgZG9tYWluOiB1dGlsLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgIHBvcnQ6IHV0aWwuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIHRva2VuOiB1dGlsLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpLAogICAgICAgICAgICAgICAgZGlyOiB1dGlsLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgbGV0IEJEVVNTID0gdXRpbC5nZXRCRFVTUygpOwogICAgICAgICAgICBpZiAoIUJEVVNTKSByZXR1cm4gJ2Fzc2lzdGFudCc7CgogICAgICAgICAgICBsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0vanNvbnJwY2A7CiAgICAgICAgICAgIGxldCBycGNEYXRhID0gewogICAgICAgICAgICAgICAgaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAganNvbnJwYzogJzIuMCcsCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdhcmlhMi5hZGRVcmknLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewogICAgICAgICAgICAgICAgICAgIGRpcjogcnBjLmRpciwKICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcjogW2BVc2VyLUFnZW50OiAke3Bhbi51YX1gLCBgQ29va2llOiBCRFVTUz0ke0JEVVNTfWBdCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHV0aWwucG9zdCh1cmwsIHJwY0RhdGEsIHsiVXNlci1BZ2VudCI6IHBhbi51YX0sICcnKTsKICAgICAgICAgICAgICAgIGlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNlbGVjdGVkTGlzdCgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiByZXF1aXJlKCdzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMnKS5pbnN0YW5jZUZvclN5c3RlbS5saXN0LmdldFNlbGVjdGVkKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubmQtbWFpbi1sYXlvdXQnKS5fX3Z1ZV9fLiRjaGlsZHJlblsyXS5zZWxlY3RlZExpc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRMb2dpZCgpIHsKICAgICAgICAgICAgbGV0IHV0ID0gcmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikuaW5zdGFuY2VGb3JTeXN0ZW0udG9vbHMuYmFzZVNlcnZpY2U7CiAgICAgICAgICAgIHJldHVybiB1dC5iYXNlNjRFbmNvZGUodXRpbC5nZXRDb29raWUoIkJBSURVSUQiKSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2hhcmVEYXRhKCkgewogICAgICAgICAgICBsZXQgcmVzID0gbG9jYWxzLmR1bXAoKQogICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID0gJ3NlY3JldCc7CiAgICAgICAgICAgIHBhcmFtcy5zaWduID0gJyc7CiAgICAgICAgICAgIHBhcmFtcy50aW1lc3RhbXAgPSAnJzsKICAgICAgICAgICAgcGFyYW1zLmJkc3Rva2VuID0gcmVzLmJkc3Rva2VuLnZhbHVlOwogICAgICAgICAgICBwYXJhbXMuY2hhbm5lbCA9ICdjaHVubGVpJzsKICAgICAgICAgICAgcGFyYW1zLmNsaWVudHR5cGUgPSAwOwogICAgICAgICAgICBwYXJhbXMud2ViID0gMTsKICAgICAgICAgICAgcGFyYW1zLmFwcF9pZCA9IDI1MDUyODsKICAgICAgICAgICAgcGFyYW1zLmVuY3J5cHQgPSAwOwogICAgICAgICAgICBwYXJhbXMucHJvZHVjdCA9ICdzaGFyZSc7CiAgICAgICAgICAgIHBhcmFtcy5sb2dpZCA9IHRoaXMuZ2V0TG9naWQoKTsKICAgICAgICAgICAgcGFyYW1zLnByaW1hcnlpZCA9IHJlcy5zaGFyZWlkLnZhbHVlOwogICAgICAgICAgICBwYXJhbXMudWsgPSByZXMuc2hhcmVfdWsudmFsdWU7CiAgICAgICAgICAgIHBhcmFtcy5zaGFyZVR5cGUgPT09ICdzZWNyZXQnICYmIChwYXJhbXMuZXh0cmEgPSB0aGlzLl9nZXRFeHRyYSgpKTsKICAgICAgICAgICAgcGFyYW1zLnN1cmwgPSB0aGlzLl9nZXRTdXJsKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2RldGVjdFBhZ2UoKSB7CiAgICAgICAgICAgIGxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgnL2Rpc2svJywgJycpOwogICAgICAgICAgICBpZiAocGF0aCA9PT0gJ2hvbWUnKSByZXR1cm4gJ2hvbWUnOwogICAgICAgICAgICBpZiAocGF0aCA9PT0gJ21haW4nKSByZXR1cm4gJ21haW4nOwogICAgICAgICAgICBpZiAoL15cLyhzfHNoYXJlKVwvLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIF9nZXRFeHRyYSgpIHsKICAgICAgICAgICAgbGV0IHNlS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHV0aWwuZ2V0Q29va2llKCdCRENMTkQnKSk7CiAgICAgICAgICAgIHJldHVybiAneycgKyAnInNla2V5IjoiJyArIHNlS2V5ICsgJyInICsgIn0iOwogICAgICAgIH0sCgogICAgICAgIF9nZXRTdXJsKCkgewogICAgICAgICAgICBsZXQgcmVnID0gLyg/PD1zXC98c3VybD0pKFthLXpBLVowLTlfLV0rKS9nOwogICAgICAgICAgICBpZiAocmVnLnRlc3QobG9jYXRpb24uaHJlZikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKHJlZylbMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGaWRMaXN0KCkgewogICAgICAgICAgICBsZXQgZmlkbGlzdCA9IFtdOwogICAgICAgICAgICBzZWxlY3RMaXN0LmZvckVhY2godiA9PiB7CiAgICAgICAgICAgICAgICBpZiAoK3YuaXNkaXIgPT0gMSkgcmV0dXJuOwogICAgICAgICAgICAgICAgZmlkbGlzdC5wdXNoKHYuZnNfaWQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuICdbJyArIGZpZGxpc3QgKyAnXSc7CiAgICAgICAgfSwKICAgICAgICBfcmVzZXREYXRhKCkgewogICAgICAgICAgICBwcm9ncmVzcyA9IHt9OwogICAgICAgICAgICAkLmVhY2gocmVxdWVzdCwgKGtleSkgPT4gewogICAgICAgICAgICAgICAgKHJlcXVlc3Rba2V5XSkuYWJvcnQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQuZWFjaChpbnMsIChrZXkpID0+IHsKICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2tleV0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWRtID0ge307CiAgICAgICAgICAgIGlucyA9IHt9OwogICAgICAgICAgICByZXF1ZXN0ID0ge307CiAgICAgICAgfSwKCiAgICAgICAgc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewogICAgICAgICAgICBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGUsCiAgICAgICAgICAgICAgICBodG1sLAogICAgICAgICAgICAgICAgZm9vdGVyLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTVweCAyMHB4IDVweCcsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcywKICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldERhdGEoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsKICAgICAgICAgICAgcHQgPSB0aGlzLl9kZXRlY3RQYWdlKCk7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB1dGlsLnBvc3QKICAgICAgICAgICAgKGBodHRwczovL2FwaS5iYWlkdXl1bi53aWtpL2NvbmZpZz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKICAgICAgICAgICAgcGFuID0gSlNPTi5wYXJzZSh1dGlsLmQocmVzKSk7CiAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwogICAgICAgICAgICBwYW4ubnVtID09PSB1dGlsLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8IHBhbi5udW0gPT09IHV0aWwuZ2V0VmFsdWUoJ3Njb2RlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgX2luaXREaWFsb2coKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGU6ICfmlK/mjIHljp/liJsnLAogICAgICAgICAgICAgICAgaHRtbDogYDxkaXY+5aaC5oKo5Zac5qyiPGJyPuivt+WFs+azqOW+ruS/oeWPtzxicj7pm7flsI/njLQnPC9kaXY+YCwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Rpc21pc3NlZCAmJiByZXN1bHQuZGlzbWlzcyA9PT0gJ2Nsb3NlJykgcmV0dXJuOwogICAgICAgICAgICBpZiAocGFuLm51bSA9PT0gcGFuLm51bSkgewogICAgICAgICAgICAgICAgdXRpbC5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKICAgICAgICAgICAgICAgIHV0aWwubWVzc2FnZS5zdWNjZXNzKHBhbi5pbml0WzJdKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7CiAgICAgICAgICAgICAgICB9LCAxNTAwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGF3YWl0IFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmlK/mjIHljp/liJsnLAogICAgICAgICAgICAgICAgICAgIGh0bWw6IGA8ZGl2PuWmguaCqOWWnOasojxicj7or7flhbPms6jlvq7kv6Hlj7c8YnI+6Zu35bCP54y0JzwvZGl2PmAsCiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfph43mlrDovpPlhaUnCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2luaXREaWFsb2coKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHJlZ2lzdGVyTWVudUNvbW1hbmQoKSB7CiAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ+iuvue9ricsICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NldHRpbmcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd1NldHRpbmcoKSB7CiAgICAgICAgICAgIGxldCBkb20gPSAnJywgYnRuID0gJycsCiAgICAgICAgICAgICAgICBjb2xvckxpc3QgPSBbJyMwOUFBRkYnLCAnI2NjMzIzNScsICcjNTc0YWI4JywgJyM1MThjMTcnLCAnI2VkOTQ0YicsICcjZjk2OWE1JywgJyNiY2EyODAnXTsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPkuLvmnLo8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgIHBsYWNlaG9sZGVyPSLkuLvmnLrlnLDlnYDvvIzpnIDluKbkuIpodHRwKHMpOi8vIiBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItZG9tYWluIiB2YWx1ZT0iJHt1dGlsLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKX0iPjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPnq6/lj6M8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iuerr+WPo+WPt++8jOS+i+Wmgu+8mk1vdHJpeOS4ujE2ODAwIiBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItcG9ydCIgdmFsdWU9IiR7dXRpbC5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpfSI+PC9sYWJlbD5gOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+WvhumSpTwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i5peg5a+G6ZKl5peg6ZyA5aGr5YaZIiBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItdG9rZW4iIHZhbHVlPSIke3V0aWwuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9Ij48L2xhYmVsPmA7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5L+d5a2Y6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLmlofku7bkuIvovb3lkI7kv53lrZjot6/lvoTvvIzkvovlpoLvvJpEOiIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLWRpciIgdmFsdWU9IiR7dXRpbC5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyl9Ij48L2xhYmVsPmA7CgogICAgICAgICAgICBjb2xvckxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgYnRuICs9IGA8ZGl2IGRhdGEtY29sb3I9IiR7dn0iIHN0eWxlPSJiYWNrZ3JvdW5kOiAke3Z9O2JvcmRlcjogMXB4IHNvbGlkICR7dn0iIGNsYXNzPSJwbC1jb2xvci1ib3ggbGlzdGVuZXItY29sb3IgJHt2ID09IHV0aWwuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKSA/ICdjaGVja2VkJyA6ICcnfSI+PC9kaXY+YDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Li76aKY6aKc6ImyPC9kaXY+IDxkaXYgY2xhc3M9InBsLWNvbG9yIj4ke2J0bn08ZGl2PjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tID0gJzxkaXY+JyArIGRvbSArICc8L2Rpdj4nOwoKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yqp5omL6YWN572uJywKICAgICAgICAgICAgICAgIGh0bWw6IGRvbSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIGZvb3RlcjogcGFuLmZvb3RlciwKICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB1dGlsLm1lc3NhZ2Uuc3VjY2Vzcygn6K6+572u5oiQ5Yqf77yBJyk7CiAgICAgICAgICAgICAgICBoaXN0b3J5LmdvKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWNvbG9yJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIHV0aWwuc2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InLCBlLnRhcmdldC5kYXRhc2V0LmNvbG9yKTsKICAgICAgICAgICAgICAgIHV0aWwubWVzc2FnZS5zdWNjZXNzKCforr7nva7miJDlip/vvIEnKTsKICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kb21haW4nLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgdXRpbC5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItcG9ydCcsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICB1dGlsLnNldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItdG9rZW4nLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgdXRpbC5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kaXInLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgdXRpbC5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0KCkgewogICAgICAgICAgICB0aGlzLmluaXRWYWx1ZSgpOwogICAgICAgICAgICB0aGlzLmFkZFN0eWxlKCk7CiAgICAgICAgICAgIHRoaXMuaW5pdFBhbkxpbmtlcigpOwogICAgICAgICAgICB0aGlzLmNyZWF0ZVRpcCgpOwogICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIHBhbmxpbmtlci5pbml0KCk7Cn0pKCk7Ci8v55m+5bqm572R55uY6ISa5pys57uT5p2fCgkJCX0KCQl9Cn0pKCk7Ci8v55m+5bqm572R55uY57uT5p2fCi8vCihmdW5jdGlvbigpIHsKCiAgICB2YXIgY291cG9uVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICBpZihjb3Vwb25VcmwuaW5kZXhPZigndGFvYmFvJykgIT0gLTEgfHwgY291cG9uVXJsLmluZGV4T2YoJ3RtYWxsJykgIT0gLTEpewoKICAgICQuZ2V0KCdodHRwczovL3d3dy56dWlodWltYWkubmV0L3ZyaHIvbG9hZGluZy5waHAnLGZ1bmN0aW9uKGxvYWRpbmdfaHRtbCl7CiAgICBpZihsb2FkaW5nX2h0bWwpewogICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLAoJY3NzVVJMID0gJ2h0dHBzOi8vd3d3Lnp1aWh1aW1haS5uZXQvdG0vc3R5bGUuY3NzJywKCWxpbmtUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CglsaW5rVGFnLmlkID0gJ2R5bmFtaWMtc3R5bGUnOwoJbGlua1RhZy5ocmVmID0gY3NzVVJMOwoJbGlua1RhZy5zZXRBdHRyaWJ1dGUoJ3JlbCcsJ3N0eWxlc2hlZXQnKTsKCWxpbmtUYWcuc2V0QXR0cmlidXRlKCdtZWRpYScsJ2FsbCcpOwoJbGlua1RhZy5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCd0ZXh0L2NzcycpOwoJaGVhZC5hcHBlbmRDaGlsZChsaW5rVGFnKTsKCXZhciBnb29kc19pZCA9IGdldFF1ZXJ5U3RyaW5nKCdpZCcpOwoJdmFyIHpobV91cmwgPSAnaHR0cHM6Ly93d3cuenVpaHVpbWFpLm5ldC92cmhyL2luZGV4LnBocCc7CglpZihnb29kc19pZCl7CgoJCSQoJyNKX0xpbmtCYXNrZXQnKS5wYXJlbnQoKS5hZnRlcihsb2FkaW5nX2h0bWwpOwoJCSQoJy5KX0xpbmtBZGQnKS5wYXJlbnQoKS5hZnRlcihsb2FkaW5nX2h0bWwpOwoJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0LnNlYXJjaCgndGFvYmFvLmNvbScpICE9IC0xKXsKCQkJJCgnI3pobV90YWJsZScpLmFkZENsYXNzKCd6aG1fdGFiX3Rhb2JhbycpOwoJCX1lbHNlewoJCQkkKCcjemhtX3RhYmxlJykuYWRkQ2xhc3MoJ3pobV90YWJfdG1hbGwnKTsKCQl9CgoJCSQuZ2V0KHpobV91cmwse2dvb2RzX2lkOmdvb2RzX2lkfSxmdW5jdGlvbihkYXRhKXsKCQkJJCgnI3pobV9kaXZfcycpLmh0bWwoZGF0YSk7CgkJCSQoJyN6aG1fZGl2X3MnKS5odG1sKGRhdGEpOwoJCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdC5zZWFyY2goJ3Rhb2Jhby5jb20nKSAhPSAtMSl7CgkJCQkkKCcjemhtX3RhYmxlJykuYWRkQ2xhc3MoJ3pobV90YWJfdGFvYmFvJyk7CgkJCX1lbHNlewoJCQkJJCgnI3pobV90YWJsZScpLmFkZENsYXNzKCd6aG1fdGFiX3RtYWxsJyk7CgkJCX0KCQl9KTsKCX0KICAgIH0KICAgIH0pOwogICAgfQoKICAgIGlmKGNvdXBvblVybC5pbmRleE9mKCdqZCcpICE9IC0xKXsKICAgICAgICQuZ2V0KCdodHRwczovL3d3dy56dWlodWltYWkubmV0L3ZyaHIvbG9hZGluZy5waHAnLGZ1bmN0aW9uKGxvYWRpbmdfaHRtbCl7CiAgICAgICAgIGlmKGxvYWRpbmdfaHRtbCl7CiAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLAogICAgICAgIGNzc1VSTCA9ICdodHRwczovL3d3dy56dWlodWltYWkubmV0L3RtL3N0eWxlLmNzcycsCiAgICAgICAgbGlua1RhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICBsaW5rVGFnLmlkID0gJ2R5bmFtaWMtc3R5bGUnOwogICAgICAgIGxpbmtUYWcuaHJlZiA9IGNzc1VSTDsKICAgICAgICBsaW5rVGFnLnNldEF0dHJpYnV0ZSgncmVsJywnc3R5bGVzaGVldCcpOwogICAgICAgIGxpbmtUYWcuc2V0QXR0cmlidXRlKCdtZWRpYScsJ2FsbCcpOwogICAgICAgIGxpbmtUYWcuc2V0QXR0cmlidXRlKCd0eXBlJywndGV4dC9jc3MnKTsKICAgICAgICBoZWFkLmFwcGVuZENoaWxkKGxpbmtUYWcpOwoKICAgICAgICB2YXIgamRVcmxBcnIgPSBjb3Vwb25Vcmwuc3BsaXQoIi4iKTsKCiAgICAgICAgdmFyIGpkR29vZHNJZCA9IGpkVXJsQXJyW2pkVXJsQXJyLmxlbmd0aC0yXS5zcGxpdCgnLycpOwoKCiAgICAgICAgJC5nZXQoJ2h0dHBzOi8venVpaHVpbWFpLm5ldC92cmhyL2luZGV4X2pkLnBocCcse2dvb2RzX2lkOmpkR29vZHNJZFsxXX0sZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgICAgIGlmKGRhdGEgIT0gJycpewogICAgICAgICAgICAgICAgdmFyIGpkX2h0bWwgPSBkYXRhOwogICAgICAgICAgICAgICAgJCgnI2Nob29zZS1idG5zJykuYXBwZW5kKGpkX2h0bWwpOwogICAgICAgICAgICB9CgkJfSk7CiAgICAgICAgIH0KICAgICAgIH0pCgogICAgfQoKICAgIHZhciBpZF9yYW5kb20gPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDApOwoJdmFyIHBsYXlfdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7Cgl2YXIgYXJyID0gbmV3IEFycmF5KCk7CglhcnIgPSBwbGF5X3VybC5zcGxpdCgnPycpCgl2YXIgZ2V0X3VybCA9IGFyclswXTsKCglpZihnZXRfdXJsLmluZGV4T2YoJ2VnZ3ZvZC5jbicpID09IC0xKXsKCQl2YXIganhfdGl0bGU9bmV3IEFycmF5KCkKCQlqeF90aXRsZVswXT0ieW91a3UuY29tIgoJCWp4X3RpdGxlWzFdPSJpcWl5aS5jb20iCgkJanhfdGl0bGVbMl09ImxlLmNvbSIKCQlqeF90aXRsZVszXT0idi5xcS5jb20iCgkJanhfdGl0bGVbNF09InR1ZG91LmNvbSIKCQlqeF90aXRsZVs1XT0ibWd0di5jb20iCgkJanhfdGl0bGVbNl09InNvaHUuY29tIgoJCWp4X3RpdGxlWzddPSJhY2Z1bi5jbiIKCQlqeF90aXRsZVs4XT0iYmlsaWJpbGkuY29tIgoJCWp4X3RpdGxlWzldPSJwcHR2LmNvbSIKCQlqeF90aXRsZVsxMF09ImJhb2ZlbmcuY29tIgoJCWp4X3RpdGxlWzExXT0ieWlueXVldGFpLmNvbSIKCQlqeF90aXRsZVsxMl09Indhc3UuY24iCgkJanhfdGl0bGVbMTNdPSJpcS5jb20iCgkJanhfdGl0bGVbMTRdPSJtLnYucXEuY29tIgoJCWp4X3RpdGxlWzE1XT0ibS5pcWl5aS5jb20iCgkJdmFyIHRpdGxlX3Jlc3VsdCA9IGZhbHNlOwoJCWZvcih2YXIgbj0wO248anhfdGl0bGUubGVuZ3RoO24rKyl7CgkJCWlmKGdldF91cmwuaW5kZXhPZihqeF90aXRsZVtuXSkhPSAtMSl7CiAgICAgICAgICAgICAgICB2YXIgcGxheV9saW5lX2pzb24gPSAgWwogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6Iue6r+WHgDEiLCJ1cmwiOiJodHRwczovL3oxLm0xOTA3LmNuLz9qeD0iLCJ0IjoibSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IkLnq5kxIiwidXJsIjoiaHR0cHM6Ly92aXAucGFyd2l4LmNvbTo0NDMzL3BsYXllci8/dXJsPSIsInQiOiJtIn0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi54ix6LefIiwidXJsIjoiaHR0cHM6Ly92aXAuMmt0dmIuY29tL3BsYXllci8/dXJsPSIsInQiOiJtIn0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi54ix6LGGIiwidXJsIjoiaHR0cHM6Ly9qeC5haWRvdWVyLm5ldC8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IkJMIiwidXJsIjoiaHR0cHM6Ly92aXAuYmxqaWV4LmNvbS8/dj0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLlhrDosYYiLCJ1cmwiOiJodHRwczovL2FwaS5xaWFucWkubmV0L3ZpcC8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IueZvuWfnyIsInVybCI6Imh0dHBzOi8vanguNjE4Zy5jb20vP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSyIsInVybCI6Imh0dHBzOi8vd3d3LmNrcGxheWVyLnZpcC9qaWV4aS8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IkNIb2siLCJ1cmwiOiJodHRwczovL3d3dy5nYWk0LmNvbS8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ImNrbW92IiwidXJsIjoiaHR0cHM6Ly93d3cuY2ttb3YudmlwL2FwaS5waHA/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuWkp+eZvSIsInVybCI6Imh0dHBzOi8vYXBpLm15emNoLmNuLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5aSn5bmVIiwidXJsIjoiaHR0cHM6Ly9qeC41MmRhbXUuY29tL2RtangvamlleGkucGhwP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLlpKfmoJEiLCJ1cmwiOiJodHRwczovL2p4Lndsc3N5cy54eXovdmlwLnBocD91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi6L+q5aWlIiwidXJsIjoiaHR0cHM6Ly8xMjMuMWRpb3IuY24vP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLnpo/mmJ8iLCJ1cmwiOiJodHRwczovL2p4LnBvcG81MjAuY24vamlleGkvP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLot5/liaciLCJ1cmwiOiJodHRwczovL3d3dy41aWdlbi5jb20vZG1wbGF5ZXIvcGxheWVyLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiSDgiLCJ1cmwiOiJodHRwczovL3d3dy5oOGp4LmNvbS9qaWV4aS5waHA/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6Iuaxn+a5liIsInVybCI6Imh0dHBzOi8vYXBpLmpoZHl3LnZpcC8/dXJsPSIsInQiOiJtIn0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi6Kej5p6QIiwidXJsIjoiaHR0cHM6Ly9ja21vdi5jY3lqamQuY29tL2NrbW92Lz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi6Kej5p6QbGEiLCJ1cmwiOiJodHRwczovL2FwaS5qaWV4aS5sYS8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuS5heaSrSIsInVybCI6Imh0dHBzOi8vanguaml1Ym9qeC5jb20vdmlwLnBocD91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5Lmd5YWrIiwidXJsIjoiaHR0cHM6Ly9qeC55b3V5aXR2LmNvbS8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuWPr+S5kCIsInVybCI6Imh0dHBzOi8vangua2VsZWFwaS5jb20vP3VybD0iLCJ0IjoibSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IkxFIiwidXJsIjoiaHR0cHM6Ly9sZWN1cmwuY24vP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLmh5LnjKsiLCJ1cmwiOiJodHRwczovL2FwaS5sYW5tYW9keS5jb20vZG0vP3VybD0iLCJ0IjoibSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuiAgeadvyIsInVybCI6Imh0dHBzOi8vdmlwLmxhb2JhbmRxLmNvbS9qaWV4aS5waHA/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuS5kOWkmiIsInVybCI6Imh0dHBzOi8vYXBpLmxlZHVvdHYuY29tL3dwLWFwaS9pZnIucGhwP2lzRHA9MSZ2aWQ9IiwidCI6Im0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLkuZDllrUiLCJ1cmwiOiJodHRwczovL2p4Lmhhby16c2ouY24vdmlwLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiTWFvIiwidXJsIjoiaHR0cHM6Ly9xZC5oeHlzLnR2L20zdTgucGhwP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiJNM1U4IiwidXJsIjoiaHR0cHM6Ly9qeC5tM3U4LnR2L2ppZXhpLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiTVVUViIsInVybCI6Imh0dHBzOi8vamlleGkuamFuYW4ubmV0L2ppZXhpLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5piO5pelIiwidXJsIjoiaHR0cHM6Ly9qeC55aW5neGlhbmdiYW8uY24vdmlwLnBocD91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5rKQ55m9IiwidXJsIjoiaHR0cHM6Ly93d3cubWllZGUudG9wL2ppZXhpLz91cmw9IiwidCI6Im0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLno6joj4ciLCJ1cmwiOiJodHRwczovL2p4Lnd6c2x3LmNuLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi6K+66K+6IiwidXJsIjoiaHR0cHM6Ly93d3cuY2ttb3YuY29tLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi6K+66K6vIiwidXJsIjoiaHR0cHM6Ly93d3cubnhmbHYuY29tLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiT0siLCJ1cmwiOiJodHRwczovL29ranguY2MvP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiJQTSIsInVybCI6Imh0dHBzOi8vd3d3LnBsYXltM3U4LmNuL2ppZXhpLnBocD91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi55uY5Y+kIiwidXJsIjoiaHR0cHM6Ly93d3cucGFuZ3VqaWV4aS5jYy9qaWV4aS5waHA/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuWlh+exsyIsInVybCI6Imh0dHBzOi8vcWltaWhlLmNvbS8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuS4g+WTpSIsInVybCI6Imh0dHBzOi8vangubW1rdi5jbi90di5waHA/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuWFqOawkSIsInVybCI6Imh0dHBzOi8vangucXVhbm1pbmdqaWV4aS5jb20vP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiJSREhLIiwidXJsIjoiaHR0cHM6Ly9qeC5yZGhrLm5ldC8/dj0iLCJ0IjoibSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IlNTQU1BTyIsInVybCI6Imh0dHBzOi8vd3d3LnNzYW1hby5jb20vangvP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiJTTVlTIiwidXJsIjoiaHR0cHM6Ly9qeHguc215czguY24vaW5kZXgucGhwP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLmgJ3kupEiLCJ1cmwiOiJodHRwczovL2p4LmFwMnAuY24vP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLmgJ3lj6QiLCJ1cmwiOiJodHRwczovL2FwaS5zaWd1anguY29tLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5oCd5Y+kMiIsInVybCI6Imh0dHBzOi8vYXBpLmJiYmJiYi5tZS9qeC8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuaAneWPpDMiLCJ1cmwiOiJodHRwczovL2pzYXAuYXR0YWtpZHMuY29tLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5reY55S15b2xIiwidXJsIjoiaHR0cHM6Ly9qeC52b2RqeC50b3AvdmlwLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5ZCs5LmQIiwidXJsIjoiaHR0cHM6Ly9qeC5kajZ1LmNvbS8/dXJsPSIsInQiOiJtIn0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi57u05aSaIiwidXJsIjoiaHR0cHM6Ly9qeC5pdml0by5jbi8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuiZvuexsyIsInVybCI6Imh0dHBzOi8vangueG1mbHYuY29tLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5bCP6JKLIiwidXJsIjoiaHR0cHM6Ly93d3cua3BlenAuY24vamxleGkucGhwP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLlsI/ni7wiLCJ1cmwiOiJodHRwczovL2p4Lnlhb2h1YXh1YW4uY29tLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoi5pif6amwIiwidXJsIjoiaHR0cHM6Ly92aXAuY2p5cy50b3AvP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLmnIjkuq4iLCJ1cmwiOiJodHRwczovL2FwaS55dWVsaWFuZ2p4LmNvbS8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuS6keeCueaSrSIsInVybCI6Imh0dHBzOi8vYXBpLmlvcGVueXVuLmNvbTo4OC92aXAvP3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiLkupHnq68iLCJ1cmwiOiJodHRwczovL2p4LmVyZ2FuLnRvcC8/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IuS6keaekCIsInVybCI6Imh0dHBzOi8vangueXBhcnNlLmNvbS9pbmRleC5waHA/dXJsPSJ9LAogICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IjA1MjMiLCJ1cmwiOiJodHRwczovL2dvLnloMDUyMy5jbi95LmN5P3VybD0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiIxN+S6kSIsInVybCI6Imh0dHBzOi8vd3d3LjE3MTd5dW4uY29tL2p4L3R5LnBocD91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiNEsiLCJ1cmwiOiJodHRwczovL2p4LjRrZHYuY29tLz91cmw9IiwidCI6Im0ifSwKICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiI2NiIsInVybCI6Imh0dHBzOi8vYXBpLjNqeC50b3AvdmlwLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiMTE2IiwidXJsIjoiaHR0cHM6Ly9qeC4xMTZrYW4uY29tLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiMjAwIiwidXJsIjoiaHR0cHM6Ly92aXAuNjZwYXJzZS5jbHViLz91cmw9In0sCiAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjoiODA5MCIsInVybCI6Imh0dHBzOi8vd3d3LjgwOTBnLmNuLz91cmw9In0KICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB2YXIgcGxheUxpbmVNb2JpbGUgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBubm49MDsKICAgICAgICAgICAgICAgIGZvcih2YXIgcGxheUxpbmVJbmRleE1vYmlsZT0wIDtwbGF5TGluZUluZGV4TW9iaWxlIDwgcGxheV9saW5lX2pzb24ubGVuZ3RoO3BsYXlMaW5lSW5kZXhNb2JpbGUrKyl7CiAgICAgICAgICAgICAgICAgICAgaWYocGxheV9saW5lX2pzb25bcGxheUxpbmVJbmRleE1vYmlsZV0udCA9PSAnbScpewoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVNb2JpbGVbbm5uXSA9IHBsYXlfbGluZV9qc29uW3BsYXlMaW5lSW5kZXhNb2JpbGVdOwogICAgICAgICAgICAgICAgICAgICAgICBubm4rKwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZigvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBvZHxCbGFja0JlcnJ5L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgICAgICBwbGF5X2xpbmVfanNvbiA9IHBsYXlMaW5lTW9iaWxlOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgcGxheV93cmFwX2h0bWwgPSAiPGRpdiBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIHRhcmdldD0nX2JsYW5rJyBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7ei1pbmRleDo4ODg4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtsaW5lLWhlaWdodDozMHB4O3Bvc2l0aW9uOmZpeGVkO2xlZnQ6MDt0b3A6MjYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6dmlzaWJsZScgY2xhc3M9J3BsYXlCdXR0b24nPjxpbWcgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhaQUNXQVBjQUFQSkVRL3Y3K2ZuTHlQakN3ZlJuWmZuVDBQSktTZmpHeFB2MjlQblkxL05iV3Z2MTgvYVVrL3JsNC9ydzd2bkt5UGFKaVBycjZmYWFtUFJ5Y2ZhTGl2djU5L0pKU1BydjdmTlZWUG5lM2ZydDYvTlFUL3Y2K1BlbHBQYWdudlIzZHZpNnVQdno4ZmV4ci9uT3pQZWdudnJrNHZSMWMvSkdSZnJxNlBuUXp2akN3UG5TMFBuWjEvdnc3dm5hMmZlb3AvZW1wZnJjMnZOVVUvaXhyL1I0ZHZXSmgvZXNxdkpIUnZ2eDcvcnk4Zk5TVWZOV1ZQakJ3UFY2ZWZhTWl2bmYzZmk4dXZXRGd2djQ5dnJwNlByeThQSlBUdmFZbC9uVDBmblcxUGVycWZSc2EvUnZidldBZi9WOWZQbms0dmkydGZSallmUmhYL3Z1N1BOWVYvSkZSUG5rNGZhSGhmYVhsdnYzOWZyaDMvaTd1dm5OeS9uT3kvcnM2dmVycXZSZ1h2bmQyL2FHaFBXUmtQVi9mZnJpNFByajRQaXdyZm5MeWZhVWt2UmZYZkpOVFBqRncvZXlzZlJsWS9SeGNQdnY3ZmV6c3ZpMHN2djI4L2FibXZlcXFQZXBxUEpNUy9leXNQV09qZk5kWFBSemN2djA4dlJ1YmZybzV2ZWlvZmVsby9OWldQbloyUE5wYVBuVTB2UmZYdm5IeGZpdXJQakF2L25RemZybjVmbmMyL2Uwc3ZhZG5QZTR0L2FTa2ZOWFZ2Um1aUGV0cXZuWTF2aTh1L2Vpb1BpdHEvaS92ZlJ3Yi9SMWRQbmUzUGFlbmZhY212ZTN0dm5Sei9yajRmYVhsZlYrZlBXRmhQSkxTdmFOaS9XTWpQUjBjL2FWay9XUGovYWRtL3JwNS9uSXh2Um9adlJpWWZqRHd2YVZsUEpPVGZlMnRmTnFhZkpSVVBla292YWFtZk5hV2ZWOGV2bmQzUG5OelBuVjFQZXNxL2pFdy9WNmVQUjNkL25nM3ZydzdmYVdsUGVucGZhZm5mV1Bqdml3cnZOV1Zmbk15dmk2dWZWL2Z2VjllL25iMnZydTYvUmtZdmpBdnZuSXhmUmlZUGk5dlBlZ24vVjdlZmVqb2ZlMXRQV0NnZnJtNVBKSVIvbmMydk5jVy9KUVQvakZ4UHZ5OFBXRGdmV0JmL1JzYlBWNWQvTnBhZk5jWFBuZjN2YUlodlJ2Yi9pdnJmblgxdk5SVWZhS2lmUnRiUGFabC9OZVhQZTV1UFdDZ1BScmF2YUloL05vWi9uSngvV0ZnL2k5dS9SMmRmakh4dmpJeHZOVFV2aS92dmUxcy9OZVhRQUFBQUFBQUFBQUFBQUFBQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRRWxnQUFBQ3dBQUFBQVpBQ1dBQUFJL2dBQkNCeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGlseElZRVNBQUNNSWpGeHBVSVdEQUE1VWVGakk0dVRKQkN4ekNzeGhrOGlRaFRadDZzeXB3YWFHREFzSEJPVXhsT1VMSkNXUXZLaXhjQU9EQVFNWWJHaTZVa0dQR2owVUdPQkt0cXpaczJqVHFsM0x0cU1DRTAxTWlLMUtZc1FJRWxzN2ZtRkNhOUVXRjRrUWhDaVRRb1VJVFV6U2ZPeVFna1dLRGtHU0x0V29BOWl1WlVFemF3NGdCWnFWSWh0UjJFU0JVNkZtakRRT0Nkbk1lak1DTFJNeUxyQzU0QUxOb0tVcGpuSFJ1bmZyVHZVdW5wbTk0TUVma2dNY1hCaWdjdUlsM3I2anN6NmpvS0lKQ1I0a21OZ3hFa01qM3lYby9ta0NKYWlXQlRWZjlGaVpNNmxFYndTb1RyUTl5RXNLNndxcVNPVnhLTU5Xa2plc3VkRGNmQUJjUXdkcmZWd2hBMFVXaElISVprTDBRcUFhSzJ6bWlRODNaQVRGRVpvVk1oOEd5bWlHQUNVV2NFVEZGUWdFOVVCRUJtQ2dBQVpqTVVRQUNTUU1xSkFNWldqbWdtSWZmWkhBU1F1VUVoRUVJandoQWdRMkhtUkRVRFlzcEFaMFFkMVJZa2duaU1GQUZCTEZZRk1NUUN6MGtrMjJKWFRDZzVtaFFaWWRWcEJqeDBKeTBCWm1RazRFVllWQ2RXVEdRVHBrRVZKVUFDNkFsdEFQTm1XaXdrSVFmSGtCQkFuMVlxY1ZaZmtScFVJK3hBRkVIRDRvMFJBQlNSYWtBNEJCaldKV0I1bkZocEFCVTBReFJZd1kzWkdaTG1mbHNacE4vbVZNdVZJYkhBU1ZoYXhsTVpMWktUbWxFQlFIc2FSMVFvZzI5U0hmU0tWa1pzWmE2bVJHZ1VZVGlHcFFBVUc5NGVkQ09wZ1VnaGV2Z0xSRlVDNGN0QVFESGpDd0JIY0tGWHFTQTRnU3hFZVpEdWtUMURLT0hNdVJIa0ZwY0pCTE1NbTBVSncyelVrUUhFRjFnZXBDZTJqbVN6SWVOV05UT3dmeGRKSlBYZ2IxSmdBV2hCQVVNQSsxbGdJekhKMVF4eGFickduUW5nRWN0ZENTTmlWQmtEZEJWWEF0UTdXeXhnRW5qK1QwVkZSVHljZ0FBMGtTYkZNckVGWGcyeDZVbUN5U1YyRE5SVkVXUVRINmtOSFJwVElLRlFRYWhFRm1HQlFkVkNHNXRBYUdHeGo5c1VBRmpIeUVURkJsUlBUcVNTOEFFRVlmclJWQ1NFVnVCTVdIL2tlYkJBV0MyMEhWSVpBb3dtaThXUVVpNEROUm5UYjU0ZEYzTnFVTkVSWkIwVUhRSTV6VXJCa09jK0RhVU44MkhVUFFXMHpRNEhSQ0JDZ1ZBSE1ERFJLVU94R2xhSlBsQmNYRElXc05oQUZSS0VFTlFoQmoyQndCMlcwMjVRYTFUWlpDSlB0SkxoOVVqVFd0U2ZLT1ErL2ExQUJCb3AxRUdsQ1pEUlJCVUt6RUhwUVhDVmt3aCtHYkhWTGRRbEVFSlFWQkVnZEFzVUtxbjhTVVFMUFpWRXRFK1o5RXZrSVlXSVRtTW9PRkRtQXRJWUNJR1VIdVFSeDd6RVFoVnNHS1ZnWkN0Wk1zQ0NJSnN3bXJHQUlKWDdFbUVqZjZGVUd1azUzdFVBUUhRY2xHUk5BWEFCQTZCQm51MFV3SUZKS0hvT0RBSTlrN1NSdFdHQlFYTnFRSi9tVFlUQVFVUW9DZ0pNSWppZ2hLT1hob2swbzBCQXBjYU0yekVvS0pvSURCSTJ1SVdrU1NhQk5hTEVRR2Q2aGdac2hBZzRXSUlTaXE4RWdsZ2tLQ2lEakNKaUVvUnZtTWdNTE40TUFJR1ZxSUlZTGl4SUcwNkVVSFE0aFY3REpCZ1p3aUtFU0xTQ2dzWVlpN0lXUU1NZFJNQmRpZ0E0ZDh5eVppSUFpUmpJUWt5ZGprZmdBUVJGQzRjVUNOZExBMVhJRENRMDZ3dkFCSUN3QmFPZ21YdUJlVWdkeUFjallSUkVTNllRbHpxSklnTW9EREFJTkNoakZFNUJKQlFRQ3UyZ1NraXgya0pzVWp5Q1ZQMHNhSDRNRW1DSkFqeGlUQVFodmlVU0tPc29rOENoTExBTXlTaUtwajNVQStnUnVJU0NJb3dnQUFFeUtabVVsV2NpSjAvclBKRlFxeXlTTmw2aUh0Q3dxV0hJS3lBQmpEZzV0SlpVVW04S3VjRWVTUE1Mb0lsQUt3TElkMFFUckZ2TWdoZ3NJRmtWd1RqdHF3cUcvdW1NZUtRQ0l6UGhDSktGajRQNFo4N3o2VXpFZ1diV0t3a1lES0poVUluMHRabzlDTTBDQXpSc2pJakdwMEVCMzBMd0FwYUVpT3htaE1qVmlnQVVGcFFTQUZNb0VyZU9BS0UwQlhRbGgya2lZWlpCYVorUVJEMk9ETmttWWtHSm5KNUVIV3dKTWNyT0dCQ2ZuU1Nad3BFQU1rSXBrN1ZJZ2FkaEdBQmNEaG5odFJ3Z0J2WWErQ3hHOStjSklUUXFvWWxCTE1iQ2l5OEVSbTlvYVFIRzR2WFlacTEwSElHcFJ0a0tVSWdjZ01NUlRTZ1NQOFFIaVJZVWkwRm1LQmNXU0dGMDBwL2tMWWdxSUl6eFZFQVRRSWd1bW1XaEZtWkFZUFE1SEJMVElUQWg1eEpSYVpZWWRPMG5BOG5PckJMQWV5eVRsMHdvUnVCa0IzWnNsaEFOYkJFblRBUWpNY21PSkhWcXNRWkFZRkVBTVJCeXlrRUFFR21OVWlKNkFBcDRLQ0JZWTVCTGU2UFIxQzFBVVR6UnJFREwwVHlBM20wRXBmTk9FaUZoZ0dWRFhUaFZjeTVBV21QVUxQRkFLd2t3ak1JQ2V3ajAxY0FRQWxnSUUxSzhDRExDVHlEVE5vV0RPSXVPQkRVS1l5aGNnMUFIUVZDR050OGdWaURGT1NBbUNBRzlRZ3BtZkFneE9wYUEwQ05GSEtoeHoySndyaGFnQ2FaNUJGUlBXbDBqa0pCN0xnakVuTW9BUEJvTVlhQW9ITDNsQ0hJdno2aGI5SVFxTi9BdUFHZGV4Ti9qTXlFT1UyODhrV0ZobVhCOUJ3TG94SXd6ZWVlQzRBYUdBTU4vY21CVDBnRUFpRVRLS0NFR0FXSC9ielNUU1FoQzlrelFBWjFNd0k5cE9RTkh4aUVtQVFvMllXNElKamlHRVZoWjBQS0RhREF1dzZ4QUxoQU1jOGhvRUtDWkNDQ1c1QWI5WU9nb1o2bXFGYnN5NElSSGxyNkhSbXFnMFZETVFxY24wUUh4UkpCSlVpM2swTzRnZ2hDTUVWUlNiMlFBQjFFa0hSVWlqU2pnZ3oreHBqZ3RRdkFLRE10a1BLZWM2RURISUVoUlMzUS9yWlNYVi9aTmZ1anJlODUwM3Zlay9rM09tMmQwRklxQjJ0SXVUYjRkYjNRSWJUVndFY3h6VGRNNGdBSHNEd0I0aFhJUlJvK0FNR0lKQm9hT0hpV2docVFXQWdjWW1yb0FNZ2wwai8vbXFqN0FEa2hpQlFYbDFEdm8wVUFGRExKZ2RRdUhRaTBJbUhLOFN5Sno5STZrNml6b0o4KzNvN3RjbmZYQjZVbUJkRUFHN3V4QWNZd2hqSERPOGlGTWpNMGhYeUFha0w1T1VuTVRwQmtPN21DRXc5SVcrSmkzNHIwZ0svTFdUUU5tazUwV0V1Y3o4UHNTa1ZpcVpDZmlUMGdXQTlBRm9mQ05kUElvQ0NVR0FHQ1dobEFJYXVFd2trY3lHdC9QcmQ4eTZRdlFlZzd3ZjVRQ3ZmUHBTeTJ3UUdDWUZCVUNpLzlxeTNuZThKTVh4UXZvNlJvWnBaSUhFL3lRb1NrbnFWMjczb24zKzhRbHFKZVlRd0xTeThIb2lTdlhvUXpkdWtCUW14L0VrZXZ2allReDRoQ3o1SjdRK3lNNmxReGNVV20zMVFiQzZRcU51RTg1M0h1L0VWL3BMOEFDei9aRVpSTzBJcUhJQUxINFR1UEQvSXR5bE9rT0lmUFNqSFB3anRFM0prUW1WV0lUTUlDdEFMd21hYlNLQWc3cmQxOEJkNnpwSVFZVFptQzBGZWlEZDZCVkYxdnpjdHNQZCtOaEYvQlpGeTJGY1Fja1puL29ZUjZEZDRCWkYvTnJGNkFCaUJBamlCQnpFRDlDUjdaQUdDeTBZUUhmaC9JOGgyRW5nU0pTQnhrbEFDd29kTnBEY1VEbmdTQ0ZBUXl3TjhFQ2lESmVobU1GZ1cvYWQ4QXlGNkxSaURuamVEMG9FQU16QmVEcFlRYUtkNkE5RjZVemlFVDFpRXZvRUFLN0NEbzFJcXA4SVEvTVV1RE5HREFVQjVVUGFEQnhHQWVoZFZEVENIZEpnQkF2QjlEQkVwazVKc0ZLWllESkdFQWZBczF0ZUVUcWg5VUVpQi9oUkJiUUZnYmRBSEpnMXhoU29IaVZ2SWhZYm9oWWc0RWR0R2Nra1dGRXdHY1VHQkZJQ1lFSERZZUFPSUVlVFdKV1JHVkE2UmNnQ3dQT0pYaUl3SEFJNTNpUkxCYnFkbkVkL1dlb1JIaWJFNGl4a0JieDh4aUpvaGhxOUhoSEZvZ3VxV2NtbW5FS01vaTZVb2JvNVhkNkpJZ3NjSWV1ckdoTlBIak5SSWlzZzRGS256RWozWEVEbTRoZ3ZSakw2SUVmeG1RZ29CVFlUSUVLM25ldE5vak54b2pjSkJIQVozYlNjQkVSSkFoM05JZlFYUkNBa1FrQWxnQ0FZQkF2eTRpeFV4Y3QwMkVBQW5jQWFCYzFYQkFJU1VGdzQ1RU5PQUN5eUFDMzZRV2hVNUVWTXdBVTB3QVdYWWtTUlpraVo1a2g0UlFWbEJrUjI1RDAzUU5Ma25QQkFOV1pKZXdBSTg4M3dKY1JvbHlXS3ZhQkRzYUhJbVdYL294SE8zU0cvNVVCUWFZQWx3aFpJTVlRcUE4Z09tVUpSTU9aVlVXWlZXYVpVQkFRQWgrUVFCbGdBQUFDd0dBQVlBV1FDTEFJY3l6VEx4MFVYeHBVVHlYMFB5U0VQeVZrUHllVVR5Z2tUd3lFVHpUVVB4eWtYeWlrVHd4MFR4dGtYeVVVUHh0MFR4cmtYeHhrWHd2MFR5bUVUeWkwUHh1VVR5YWtQeHlFWHh4RVh5YUVQeHUwVHh6RVh4elVYeWtVVHhsRVR5VWtQeWowVHhoa1R4cEVUeWJrVHh0RVh4dzBYeW5FVHhna1R5VkVQeWUwVHlaVVB4b0VUeHNFVHllVVB5YkVQeHNrVHh1MFh5ZEVUeHJFVHljRVB5WjBQeHYwWHhlVVR4elVUeW1rVHhqMFR4azBQeVkwUHhya1R5alVUeHAwVHlXa1B5YVVQeGhFVHhvMFR4ZFVQeW9VVHlXRVB5Y2tQeHFVVHhxMFR4cWtUeWswUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJL2dBSFFBZ1FBTUlBQUFnVEtseklzS0hEaHhBalJoUndJY0FGQVFzZUVDVFlRS0xIanlCRE5sU3dVVUdKalJ0RnFsekpNbUdFalJGZ0NFQXBvcVhObXhFN2tLaEJva09MQkFjRUNEaVFBS2ZSb3dnTGpMQXhvZ0FCcEZDalNwMUt0YXJWcTFpemF0MEtzWUNGR1JhY0pxQUFBUUtGb2x5eGdtRHhnQVdJR0RNMzFreDdGY05HREExUUVxUjdsY1BHRFJjMGJ1ekl0Nm9Ndnh1UTVCZ2dBQUVEQVFjTFU3VVFZa0VJSUI4a2E5N011YlBuejZBL0UzQlF3TUZUQUFNb1VJZ2MrcWFCQ1NZbUdCamdBYVdIMWpjcmJLeXdBZ0ZLQnJodDN2akxRQUpLQ2NGYmF0aW9RWUFCM3dFWUdFak9NZ1VPSWpoUzdFQTRnRFYxbFFSUS92eEFjZnE3K2ZQbzA0UE9rRUU5U0JVbkZweFE4ZUU1UVFUVDNVK3NlSEdCOFkzSTZRY1JTUVNaQkIxQndBbjQwRXNFeFZUYlJqb28rSkJPUFBtRTJnRUhlQ2ZoUWtveDVkU0dJSVlvNG9na0t1U1ZFUzQ0eFJoQmtKVUl3Rm9WdlBDV1lCeTVhQmRCZU9rVmdJc0VCbUJTWEFUTlJXSVNpQjJ4QUZCQ0VlVWlaWlpoNXVLVFVFWXBaV0dqbGZZVVVHVXBXZUpyc2MwR1pBQkNqcWdiUWJ6cDZPSndCRzNBQUkwQkVFYmltQUh3dG1JQUxXNEptMndhUGxtbGFWUDI2ZWVmT0tXMjJwTTBCTEZBRURSODhDQkJ0NVhvQTBrSytMREFnZEh4V0ZJSi94RVVJSWszQm9DWGZkSGxSeUlJTDJnZ1l3d0lzUWRsQVM0TWtXSjUvb0RHS3V1c0M2bjZKS3V1T2dVcWZpNTJVT29MUG1VYXdLWWpNaGhBVEpRbVNHS1BKaTBhUUlRbFVtUVJScWlwbG1lSThNbEhINjNjZHV1dGlIcytOV2VkSktad3AzWnN1am5pY2dRMVoyYUphQWFnNXBkaGlnZ25iMWhDb0NXSlhPTFpaN2pmQml4d2lQbnVPeUtUSVZqd0FiMHVIaFlBQnpMazhDNkpmcVVaR0VycWl0Z3BYdU5ldStGYWJiM1ZwMWRnZlRqd3lTaWpKNmpIRzNiWUZBSE9Oa29paFQyMWtLeUx4c1lrTExFaU1sc0NxTks1S0cxL3FiYjNaTGJ6WlpieTBreTNacXVMNFkzMzFLNmlqbWdkZHRydDdDSzdBVFIzTTd6RU9RdnRtN3V0VU8yZ0x2WTcyNytrOGRuMDIzQVh4cGh2NUI1Y1djSWZwTnV3VVY4UVM2eVhpeFhMZXhGTk50N1ZRTUZva2RnRER3L3cwQU9xVTZKQXd3dzBrQmYzNVpoZmhlUlFpWTlZeEF3ZUVzQndpVW84VUdFTEV4Y0xFd3g2bCtoenh5NEs4VklFUWl6UTV3SExhWkJoUUFBaC9oVk5ZV1JsSUhkcGRHZ2dVMk55WldWdVZHOUhhV1lBT3c9PScgdGl0bGU9J+eCueWHu+S4u+Wbvuagh+W8ueWHuuino+aekO+8jOeCueWHu+WPs+S+p+WIl+ihqOermeWGheino+aekCcgc3R5bGU9J3dpZHRoOjUwcHgnaWQ9IitpZF9yYW5kb20rIj4iOwoJCQkJcGxheV93cmFwX2h0bWwgKz0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmZpeGVkO2xlZnQ6NTBweDt0b3A6MjU1cHg7ei1pbmRleDo5OTk5OTk5OTk5O292ZXJmbG93OiBoaWRkZW47d2lkdGg6MzAwcHg7ZGlzcGxheTpub25lJ2NsYXNzPSdwbGF5TGluZURpdic+IgoJCQkJcGxheV93cmFwX2h0bWwgKz0gIjxkaXYgc3R5bGU9J3dpZHRoOjMyMHB4O2hlaWdodDozMTZweDtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbic+IjsKICAgICAgICAgICAgICAgIHBsYXlfd3JhcF9odG1sICs9ICI8dGFibGUgY2xhc3M9J3BsYXlMaW5lVGFiZWwnIHN0eWxlPSd3aWR0aDozMDBweDtib3JkZXItc3BhY2luZzo1cHg7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlJz48dHI+IjsKICAgICAgICAgICAgICAgIGZvcih2YXIgcGxheUxpbmVJbmRleD0wIDtwbGF5TGluZUluZGV4IDwgcGxheV9saW5lX2pzb24ubGVuZ3RoO3BsYXlMaW5lSW5kZXgrKyl7CgogICAgICAgICAgICAgICAgICAgIGlmKCgvKF5bMS05XVxkKiQpLy50ZXN0KHBsYXlMaW5lSW5kZXgvMykpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlfd3JhcF9odG1sICs9Ijx0cj4iOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheV93cmFwX2h0bWwgKz0gIjx0ZCBjbGFzcz0ncGxheUxpbmVUZCcgaWQ9JyIrcGxheV9saW5lX2pzb25bcGxheUxpbmVJbmRleF0udXJsKyInIHN0eWxlPSd3aWR0aDozMyU7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7Ym94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjtmb250LXNpemU6MTRweDsnPiIrcGxheV9saW5lX2pzb25bcGxheUxpbmVJbmRleF1bJ25hbWUnXSsiPC90ZD4iOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcGxheV93cmFwX2h0bWwgKz0gIjx0ZCBjbGFzcz0ncGxheUxpbmVUZCcgaWQ9JyIrcGxheV9saW5lX2pzb25bcGxheUxpbmVJbmRleF0udXJsKyInIHN0eWxlPSd3aWR0aDozMyU7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7Ym94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjtmb250LXNpemU6MTRweCc+IitwbGF5X2xpbmVfanNvbltwbGF5TGluZUluZGV4XVsnbmFtZSddKyI8L3RkPiI7CgogICAgICAgICAgICAgICAgICAgIGlmKCgvKF5bMS05XVxkKiQpLy50ZXN0KChwbGF5TGluZUluZGV4KzEpLzMpKSl7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5X3dyYXBfaHRtbCArPSI8L3RyPiI7CgogICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHBsYXlfd3JhcF9odG1sICs9ICI8L3RyPjwvdGFibGU+IjsKCiAgICAgICAgICAgICAgICBwbGF5X3dyYXBfaHRtbCArPSI8L2Rpdj48L2Rpdj48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAkKCJib2R5IikuYXBwZW5kKHBsYXlfd3JhcF9odG1sKTsKICAgICAgICAgICAgICAgICAgICAkKCIucGxheUJ1dHRvbiIpLm9uKCJtb3VzZW92ZXIiLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoIi5wbGF5TGluZURpdiIpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAkKCIucGxheUJ1dHRvbiIpLm9uKCJtb3VzZW91dCIsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiLnBsYXlMaW5lRGl2IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICQoIi5wbGF5TGluZVRkIikuaG92ZXIoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoImNvbG9yIiwiIzI2MDAzMyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiYmFja2dyb3VuZC1jb2xvciIsIiNmY2MwYzAiKTsKICAgICAgICAgICAgICAgICAgICB9LGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihnZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJykhPSAkKHRoaXMpLmF0dHIoJ2lkJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY3NzKCJjb2xvciIsIiNmZmYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiwiI2YyNDQ0MyIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQoIi5wbGF5TGluZVRkIikuZWFjaChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZ2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicpPT0gJCh0aGlzKS5hdHRyKCdpZCcpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY29sb3IiLCIjMjYwMDMzIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCIjZmNjMGMwIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAkKCIucGxheUJ1dHRvbiIpLm9uKHsKICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0RXZlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiLnBsYXlMaW5lRGl2Iikuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSw1MDApOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZU91dEV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXRFdmVudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhvc3QgPSBsb2NhdGlvbi5ob3N0OwogICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gIiI7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXllcl9ub2RlcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6InYucXEuY29tIiwgbm9kZToiI21vZF9wbGF5ZXIifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6Im0udi5xcS5jb20iLCBub2RlOiIjcGxheWVyIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJ3d3cuaXFpeWkuY29tIiwgbm9kZToiI2ZsYXNoYm94In0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJtLmlxaXlpLmNvbSIsIG5vZGU6Ii5tLXZpZGVvLXBsYXllciJ9LAogICAgICAgICAgICAgICAgICAgICAgICB7IHVybDoidi55b3VrdS5jb20iLCBub2RlOiIjcGxheWVyIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJtLnlvdWt1LmNvbSIsIG5vZGU6IiNwbGF5ZXIifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6IncubWd0di5jb20iLCBub2RlOiIjbWd0di1wbGF5ZXItd3JhcCJ9LAogICAgICAgICAgICAgICAgICAgICAgICB7IHVybDoid3d3Lm1ndHYuY29tIiwgbm9kZToiI21ndHYtcGxheWVyLXdyYXAifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6Im0ubWd0di5jb20iLG5vZGU6Ii52aWRlby1wb3N0ZXIifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6InR2LnNvaHUuY29tIiwgbm9kZToiI3BsYXllciJ9LAogICAgICAgICAgICAgICAgICAgICAgICB7IHVybDoibS50di5zb2h1LmNvbSIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCJ9LAogICAgICAgICAgICAgICAgICAgICAgICB7IHVybDoiZmlsbS5zb2h1LmNvbSIsIG5vZGU6IiNwbGF5ZXJXcmFwIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJ3d3cubGUuY29tIiwgbm9kZToiI2xlX3BsYXlib3gifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6InZpZGVvLnR1ZG91LmNvbSIsIG5vZGU6Ii50ZC1wbGF5Ym94In0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJ2LnBwdHYuY29tIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94In0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJ2aXAucHB0di5jb20iLCBub2RlOiIudy12aWRlbyJ9LAogICAgICAgICAgICAgICAgICAgICAgICB7IHVybDoid3d3Lndhc3UuY24iLCBub2RlOiIjZmxhc2hDb250ZW50In0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJ3d3cuYWNmdW4uY24iLCBub2RlOiIjQUNQbGF5ZXIifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6InZpcC4xOTA1LmNvbSIsIG5vZGU6IiNwbGF5ZXIifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6InBsYXkudHVkb3UuY29tIixub2RlOiIjcGxheWVyIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsgdXJsOiJ3d3cuYmlsaWJpbGkuY29tL3ZpZGVvIixub2RlOiIjYmlsaWJpbGlQbGF5ZXIifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6Ind3dy5iaWxpYmlsaS5jb20vYmFuZ3VtaSIsbm9kZToiI3BsYXllcl9tb2R1bGUifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyB1cmw6Ind3dy5pcS5jb20iLCBub2RlOiIjZmxhc2hib3gifSwKCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBmb3IodmFyIG0gaW4gcGxheWVyX25vZGVzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihnZXRfdXJsLmluZGV4T2YocGxheWVyX25vZGVzW21dLnVybCkhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBsYXllcl9ub2Rlc1ttXS5ub2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2Rlc1tpXSAmJiBub2Rlc1tpXS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVtb3ZlT2JqKHRhcmdldFNlbGVjdG9yLCByb290U2VsZWN0b3IgPSAnYm9keScsIHdhaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHJvb3RTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldFNlbGVjdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFyZ2V0RWxlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBmdW5jdGlvbihtYXRhdGlvbkxpc3QsIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGFyZ2V0RWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUocm9vdEVsZW1lbnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHdhaXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGwodGFyZ2V0U2VsZWN0b3IsIHJvb3RTZWxlY3Rvciwgbm93ID0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobm93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHJvb3RTZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iocm9vdFNlbGVjdG9yKSA6IGRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBwYXJlbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHJlbW92ZU9iaih0YXJnZXRTZWxlY3Rvciwgcm9vdFNlbGVjdG9yKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlKCkKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmKHBsYXlfdXJsLmluZGV4T2YoJ2lxaXlpLmNvbS92XycpICE9IC0xKXsKCgkJCQkJCWZ1bmN0aW9uIGlxaXlpUmVtb3ZlKCkgewoKCQkJCQkJCXJlbW92ZSgnZGl2I3Njcm9sbFRpcCwucXktZ2xpZGUsI3F5LWdsaWRlLFtjbGFzc149InF5LWdsaWRlIl0sW2lkXj0icXktZ2xpZGUiXSxzdmdbZGlzcGxheT0ibm9uZSJdW2FyaWEtaGlkZGVuPSJ0cnVlIl0sZGl2W2NsYXNzKj0icGxheWVyLXNpZGUtZWFyIl0sZGl2W2NsYXNzXj0icGxheWVyLW1uYiJdW2RhdGEtYXN5bi1wYl0nKTsKCQkJCQkJCXJlbW92ZUFsbCgnZGl2W3N0eWxlKj0idmlzaWJpbGl0eSJdW3N0eWxlKj0idmlzaWJsZSJdOm5vdChbY2xhc3NdKTpub3QoW2lkXSk6bm90KFtzdHlsZSo9ImZpeGVkIl0pJywgdW5kZWZpbmVkLCBmYWxzZSk7CgoJCQkJCQl9OwoJCQkJCQlzZXRUaW1lb3V0KGlxaXlpUmVtb3ZlLCAxMjM0KTsKCQkJCQkJJCgnZGl2W3N0eWxlKj0idmlzaWJpbGl0eSJdW3N0eWxlKj0idmlzaWJsZSJdOm5vdChbY2xhc3NdKTpub3QoW2lkXSk6bm90KFtzdHlsZSo9ImZpeGVkIl0pJykuaGlkZSgpOwoJCQkJCQkoZnVuY3Rpb24oKSB7CgkJCQkJCQkkKCJib2R5Iikub24oJ21vdXNlb3ZlcicsICd1bCBsaSBbaHJlZio9Ii92XyJdW2hyZWYqPSIuaHRtbCJdOm5vdChbaHJlZio9Ij1odHRwIl0pOm5vdChbaHJlZio9Ij9odHRwIl0pOm5vdChbaHJlZio9IiNodHRwIl0pJywgZnVuY3Rpb24oZSkgewoJCQkJCQkJCWxldCBvYmpmaiA9ICQodGhpcyksIGhyZWYgPSBvYmpmai5hdHRyKCdocmVmJykgfHwgb2JqZmouZGF0YSgiaHJlZiIpOwoJCQkJCQkJCW9iamZqLm9mZignY2xpY2suY2hyb21lJyk7CgoJCQkJCQkJCW9iamZqLm9uKCdjbGljay5jaHJvbWUnLCBmdW5jdGlvbigpIHsKCQkJCQkJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmCgkJCQkJCQkJfSkuYXR0cignZGF0YS1ocmVmJywgaHJlZikuY3NzKHsKCQkJCQkJCQkJY3Vyc29yOiAncG9pbnRlcicKCQkJCQkJCQl9KS5yZW1vdmVBdHRyKCdocmVmJykKCQkJCQkJCX0pCgkJCQkJCX0pKCk7CgkJCQkJfQoKCiAgICAgICAgICAgICAgICAgICAgaWYocGxheV91cmwuaW5kZXhPZigndi5xcS5jb20veC9jb3ZlcicpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCJib2R5Iikub24oJ21vdXNlb3ZlcicsICcuaXRlbSBhJywgZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmpmaiA9ICQodGhpcyksIGhyZWYgPSBvYmpmai5hdHRyKCdocmVmJykgfHwgb2JqZmouZGF0YSgiaHJlZiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZmoub2ZmKCdjbGljay5jaHJvbWUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpmai5vbignY2xpY2suY2hyb21lJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5hdHRyKCdkYXRhLWhyZWYnLCBocmVmKS5jc3MoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZW1vdmVBdHRyKCdocmVmJykKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKCIucGxheUxpbmVUZCIpLmNsaWNrKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAkKCcucGxheUxpbmVUZCcpLmNzcygiY29sb3IiLCIjZmZmIik7CgogICAgICAgICAgICAgICAgICAgICAgICAkKCcucGxheUxpbmVUZCcpLmNzcygiYmFja2dyb3VuZC1jb2xvciIsIiNmMjQ0NDMiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY3NzKCJjb2xvciIsIiMyNjAwMzMiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiwiI2ZjYzBjMCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9HTV9zZXRWYWx1ZSgncGxheUxpbmVBY3Rpb24nLCQodGhpcykuYXR0cigiaWQiKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJywkKHRoaXMpLmF0dHIoImlkIiksMzApCgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxheV9odG1sID0gIjxkaXYgc3R5bGU9J3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Jz48aWZyYW1lIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgZnJhbWVib3JkZXI9JzAnIHNjcm9sbGluZz0nbm8nIGFsbG93ZnVsbHNjcmVlbj10cnVlIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgbmFtZT0nanhfcGxheScgc3R5bGU9J2hlaWdodDoxMDAlO3dpZHRoOjEwMCUnIGlkPSdwbGF5SWZyYW1lJz48L2lmcmFtZT48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChub2RlKS5odG1sKHBsYXlfaHRtbCk7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWZyYW1lX3NyYz0gdGhpcy5pZCtwbGF5X3VybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoIiNwbGF5SWZyYW1lIikuYXR0cigic3JjIixpZnJhbWVfc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQoIiMiK2lkX3JhbmRvbSkuY2xpY2soZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlfanhfdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUG9kfEJsYWNrQmVycnkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9iaWxlX2h0bWwgPSAiPGRpdiBzdHlsZT0nbWFyZ2luOjAgYXV0bztwYWRkaW5nOjEwcHg7Jz4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlX2h0bWwgKz0iPGJ1dHRvbiB0eXBlPSdidXR0b24nIHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDozMHB4O2ZvbnQtc2l6ZTozMHB4O2xpbmUtaGVpZ2h0OiAxO2NvbG9yOiAjMDAwO3RleHQtc2hhZG93OiAwIDFweCAwICNmZmY7Y3Vyc29yOiBwb2ludGVyO2JvcmRlcjowO2JhY2tncm91bmQ6MCAwOycgb25jbGljaz0nbG9jYXRpb24ucmVsb2FkKCk7Jz7DlzwvYnV0dG9uPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGVfaHRtbCArPSAiPGRpdj48aWZyYW1lIHNyYz0naHR0cHM6Ly93d3cuZWdndm9kLmNuL21vYmlsZS5waHA/emhtX2p4PSIrcGxheV9qeF91cmwgKyInIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgZnJhbWVib3JkZXI9JzAnIHNjcm9sbGluZz0nbm8nIGFsbG93ZnVsbHNjcmVlbj10cnVlIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgbmFtZT0nanhfcGxheSdzdHlsZT0naGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCUnPjwvaWZyYW1lPjwvZGl2PiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vYmlsZV9odG1sICs9ICI8L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiYm9keSIpLmh0bWwobW9iaWxlX2h0bWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5nZXQoJ2h0dHBzOi8vd3d3LmVnZ3ZvZC5jbi9qeGNvZGUucGhwJyx7aW46ODE1MTY2OTksY29kZTo0fSxmdW5jdGlvbihkYXRhKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPSdodHRwczovL3d3dy5lZ2d2b2QuY24vanhqeC5waHA/bHJzcG09JytkYXRhKycmemhtX2p4PScrcGxheV9qeF91cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgMzAwMCk7CgoKCiAgICAgICAgICAgIH0KICAgICAgICB9CgkJLy/pn7PkuZDop6PmnpAKICAgICAgICB2YXIgbXVzaWNfaWQgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDApOwoJCXZhciBtdXNpY190aXRsZT1uZXcgQXJyYXkoKQoJCW11c2ljX3RpdGxlWzBdPSIxNjMuY29tIgoJCW11c2ljX3RpdGxlWzFdPSAieS5xcS5jb20iCgkJbXVzaWNfdGl0bGVbMl09ICJrdWdvdS5jb20iCgkJbXVzaWNfdGl0bGVbM109ICJrdXdvLmNuIgoJCW11c2ljX3RpdGxlWzRdPSAieGlhbWkuY29tIgoJCW11c2ljX3RpdGxlWzVdPSAidGFpaGUuY29tIgoJCW11c2ljX3RpdGxlWzZdPSAiMXRpbmcuY29tIgoJCW11c2ljX3RpdGxlWzddPSAibWlndS5jbiIKCQltdXNpY190aXRsZVs4XT0gInFpbmd0aW5nLmZtIgoJCW11c2ljX3RpdGxlWzldPSAibGl6aGkuZm0iCgkJbXVzaWNfdGl0bGVbMTBdPSAieGltYWxheWEuY29tIgoKCQlmb3IodmFyIGk9MDtpPG11c2ljX3RpdGxlLmxlbmd0aDtpKyspewoJCQlpZihnZXRfdXJsLmluZGV4T2YobXVzaWNfdGl0bGVbaV0pIT0gLTEpewoJCQkJdmFyIG11c2ljX2h0bWwgPSAiPGRpdiBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIGlkPSIrbXVzaWNfaWQrIiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7ei1pbmRleDo5ODtkaXNwbGF5OmJsb2NrO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweDtwb3NpdGlvbjpmaXhlZDtsZWZ0OjA7dG9wOjMwMHB4O3RleHQtYWxpZ246Y2VudGVyOyc+PGltZyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQ1dBUGNBQVBKRVEvdjcrZm5MeVBqQ3dmUm5aZm5UMFBKS1Nmakd4UHYyOVBuWTEvTmJXdnYxOC9hVWsvcmw0L3J3N3ZuS3lQYUppUHJyNmZhYW1QUnljZmFMaXZ2NTkvSkpTUHJ2N2ZOVlZQbmUzZnJ0Ni9OUVQvdjYrUGVscFBhZ252UjNkdmk2dVB2ejhmZXhyL25PelBlZ252cms0dlIxYy9KR1JmcnE2UG5RenZqQ3dQblMwUG5aMS92dzd2bmEyZmVvcC9lbXBmcmMydk5VVS9peHIvUjRkdldKaC9lc3F2SkhSdnZ4Ny9yeThmTlNVZk5XVlBqQndQVjZlZmFNaXZuZjNmaTh1dldEZ3Z2NDl2cnA2UHJ5OFBKUFR2YVlsL25UMGZuVzFQZXJxZlJzYS9SdmJ2V0FmL1Y5ZlBuazR2aTJ0ZlJqWWZSaFgvdnU3UE5ZVi9KRlJQbms0ZmFIaGZhWGx2djM5ZnJoMy9pN3V2bk55L25PeS9yczZ2ZXJxdlJnWHZuZDIvYUdoUFdSa1BWL2Zmcmk0UHJqNFBpd3Jmbkx5ZmFVa3ZSZlhmSk5UUGpGdy9leXNmUmxZL1J4Y1B2djdmZXpzdmkwc3Z2MjgvYWJtdmVxcVBlcHFQSk1TL2V5c1BXT2pmTmRYUFJ6Y3Z2MDh2UnViZnJvNXZlaW9mZWxvL05aV1BuWjJQTnBhUG5VMHZSZlh2bkh4Zml1clBqQXYvblF6ZnJuNWZuYzIvZTBzdmFkblBlNHQvYVNrZk5YVnZSbVpQZXRxdm5ZMXZpOHUvZWlvUGl0cS9pL3ZmUndiL1IxZFBuZTNQYWVuZmFjbXZlM3R2blJ6L3JqNGZhWGxmVitmUFdGaFBKTFN2YU5pL1dNalBSMGMvYVZrL1dQai9hZG0vcnA1L25JeHZSb1p2UmlZZmpEd3ZhVmxQSk9UZmUydGZOcWFmSlJVUGVrb3ZhYW1mTmFXZlY4ZXZuZDNQbk56UG5WMVBlc3EvakV3L1Y2ZVBSM2QvbmczdnJ3N2ZhV2xQZW5wZmFmbmZXUGp2aXdydk5XVmZuTXl2aTZ1ZlYvZnZWOWUvbmIydnJ1Ni9Sa1l2akF2dm5JeGZSaVlQaTl2UGVnbi9WN2VmZWpvZmUxdFBXQ2dmcm01UEpJUi9uYzJ2TmNXL0pRVC9qRnhQdnk4UFdEZ2ZXQmYvUnNiUFY1ZC9OcGFmTmNYUG5mM3ZhSWh2UnZiL2l2cmZuWDF2TlJVZmFLaWZSdGJQYVpsL05lWFBlNXVQV0NnUFJyYXZhSWgvTm9aL25KeC9XRmcvaTl1L1IyZGZqSHh2akl4dk5UVXZpL3Z2ZTFzL05lWFFBQUFBQUFBQUFBQUFBQUFDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFFbGdBQUFDd0FBQUFBWkFDV0FBQUkvZ0FCQ0J4SXNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWx4SVlFU0FBQ01JakZ4cFVJV0RBQTVVZUZqSTR1VEpCQ3h6Q3N4aGs4aVFoVFp0NnN5cHdhYUdEQXNIQk9VeGxPVUxKQ1dRdktpeGNBT0RBUU1ZYkdpNlVrR1BHajBVR09CS3RxelpzMmpUcWwzTHRxTUNFMDFNaUsxS1lzUUlFbHM3Zm1GQ2E5RVdGNGtRaENpVFFvVUlUVXpTZk95UWdrV0tEa0dTTHRXb0E5aXVaVUV6YXc0Z0JacVZJaHRSMkVTQlU2Rm1qRFFPQ2RuTWVqTUNMUk15THJDNTRBTE5vS1Vwam5IUnVuZnJUdlV1bnBtOTRNRWZrZ01jWEJpZ2N1SWwzcjZqc3o2am9LSUpDUjRrbU5neEVrTWozeVhvL21rQ0phaVdCVFZmOUZpWk02bEVid1NvVHJROXlFc0s2d3FxU09WeEtNTldramVzdWREY2ZBQmNRd2RyZlZ3aEEwVVdoSUhJWmtMMFFxQWFLMnptaVE4M1pBVEZFWm9WTWg4R3ltaUdBQ1VXY0VURkZRZ0U5VUJFQm1DZ0FBWmpNVVFBQ1NRTXFKQU1aV2ptZ21JZmZaSEFTUXVVRWhFRUlqd2hBZ1EySG1SRFVEWXNwQVowUWQxUllrZ25pTUZBRkJMRllGTU1RQ3owa2syMkpYVENnNW1oUVpZZFZwQmp4MEp5MEJabVFrNEVWWVZDZFdUR1FUcGtFVkpVQUM2QWx0QVBObVdpd2tJUWZIa0JCQW4xWXFjVlpma1JwVUkreEFGRUhENG8wUkFCU1Jha0E0QkJqV0pXQjVuRmhwQUJVMFF4Ull3WTNaR1pMbWZsc1pwTi9tVk11VkliSEFTVmhheGxNWkxaS1RtbEVCUUhzYVIxUW9nMjlTSGZTS1ZrWnNaYTZtUkdnVVlUaUdwUUFVRzk0ZWRDT3BnVWdoZXZnTFJGVUM0Y3RBUURIakN3QkhjS0ZYcVNBNGdTeEVlWkR1a1QxREtPSE11UkhrRnBjSkJMTU1tMFVKdzJ6VWtRSEVGMWdlcENlMmptU3pJZU5XTlRPd2Z4ZEpKUFhnYjFKZ0FXaEJBVU1BKzFsZ0l6SEoxUXh4YWJyR25RbmdFY3RkQ1NOaVZCa0RkQlZYQXRRN1d5eGdFbmorVDBWRlJUeWNnQUEwa1NiRk1yRUZYZzJ4NlVtQ3lTVjJETlJWRVdRVEg2a05IUnBUSUtGUVFhaEVGbUdCUWRWQ0c1dEFhR0d4ajlzVUFGakh5RVRGQmxSUFRxU1M4QUVFWWZyUlZDU0VWdUJNV0gva2ViQkFXQzIwSFZJWkFvd21pOFdRVWk0RE5SblRiNTRkRjNOcVVORVJaQjBVSFFJNXpVckJrT2MrRGFVTjgySFVQUVcwelE0SFJDQkNnVkFITUREUktVT3hHbGFKUGxCY1hESVdzTmhBRlJLRUVOUWhCajJCd0IyVzAyNVFhMVRaWkNKUHRKTGg5VWpUV3RTZktPUSsvYTFBQkJvcDFFR2xDWkRSUkJVS3pFSHBRWENWa3doK0diSFZMZFFsRUVKUVZCRWdkQXNVS3FuOFNVUUxQWlZFdEUrWjlFdmtJWVdJVG1Nb09GRG1BdElZQ0lHVUh1UVJ4N3pFUWhWc0dLVmdaQ3RaTXNDQ0lKc3dtckdBSUpYN0VtRWpmNkZVR3VrNTN0VUFRSFFjbEdSTkFYQUJBNkJCbnUwVXdJRkpLSG9PREFJOWs3U1J0V0dCUVhOcVFKL21UWVRBUVVRb0NnSk1JamlnaEtPWGhvazBvMEJBcGNhTTJ6RW9LSm9JREJJMnVJV2tTU2FCTmFMRVFHZDZoZ1pzaEFnNFdJSVNpcThFZ2xna0tDaURqQ0ppRW9Sdm1NZ01MTjRNQUlHVnFJSVlMaXhJRzA2RVVIUTRoVjdESkJnWndpS0VTTFNDZ3NZWWk3SVdRTU1kUk1CZGlnQTRkOHl5WmlJQWlSaklRa3lkamtmZ0FRUkZDNGNVQ05kTEExWElEQ1EwNnd2QUJJQ3dCYU9nbVh1QmVVZ2R5QWNqWVJSRVM2WVFsenFKSWdNb0REQUlOQ2hqRkU1QkpCUVFDdTJnU2tpeDJrSnNVanlDVlAwc2FINE1FbUNKQWp4aVRBUWh2aVVTS09zb2s4Q2hMTEFNeVNpS3BqM1VBK2dSdUlTQ0lvd2dBQUV5S1ptVWxXY2lKMC9yUEpGUXF5eVNObDZpSHRDd3FXSElLeUFCakRnNXRKWlVVbThLdWNFZVNQTUxvSWxBS3dMSWQwUVRyRnZNZ2hnc0lGa1Z3VGp0cXdxRy91bU1lS1FDSXpQaENKS0ZqNFA0Wjg3ejZVekVnV2JXS3drWURLSmhVSW4wdFpvOUNNMENBelJzaklqR3AwRUIzMEx3QXBhRWlPeG1oTWpWaWdBVUZwUVNBRk1vRXJlT0FLRTBCWFFsaDJraVlaWkJhWitRUkQyT0ROa21Za0dKbko1RUhXd0pNY3JPR0JDZm5TU1p3cEVBTWtJcGs3VklnYWRoR0FCY0Robmh0UndnQnZZYStDeEc5K2NKSVRRcW9ZbEJMTWJDaXk4RVJtOW9hUUhHNHZYWVpxMTBISUdwUnRrS1VJZ2NnTU1SVFNnU1A4UUhpUllVaTBGbUtCY1dTR0YwMHAva0xZZ3FJSXp4VkVBVFFJZ3VtbVdoRm1aQVlQUTVIQkxUSVRBaDV4SlJhWllZZE8wbkE4bk9yQkxBZXl5VGwwd29SdUJrQjNac2xoQU5iQkVuVEFRak1jbU9KSFZxc1FaQVlGRUFNUkJ5eWtFQUVHbU5VaUo2QUFwNEtDQllZNUJMZTZQUjFDMUFVVHpSckVETDBUeUEzbTBFcGZOT0VpRmhnR1ZEWFRoVmN5NUFXbVBVTFBGQUt3a3dqTUlDZXdqMDFjQVFBbGdJRTFLOENETENUeURUTm9XRE9JdU9CRFVLWXloY2cxQUhRVkNHTnQ4Z1ZpREZPU0FtQ0FHOVFncG1mQWd4T3BhQTBDTkZIS2h4ejJKd3JoYWdDYVo1QkZSUFdsMGprSkI3TGdqRW5Nb0FQQm9NWWFBb0hMM2xDSEl2ejZoYjlJUXFOL0F1QUdkZXhOL2pNeUVPVTI4OGtXRmhtWEI5QndMb3hJd3plZWVDNEFhR0FNTi9jbUJUMGdFQWlFVEtLQ0VHQVdIL2J6U1RTUWhDOWt6UUFaMU13STlwT1FOSHhpRW1BUW8yWVc0SUpqaUdFVmhaMFBLRGFEQXV3NnhBTGhBTWM4aG9FS0NaQ0NDVzVBYjlZT2dvWjZtcUZic3k0SVJIbHI2SFJtcWcwVkRNUXFjbjBRSHhSSkJKVWkzazBPNGdnaENNRVZSU2IyUUFCMUVrSFJVaWpTamdneit4cGpndFF2QUtETXRrUEtlYzZFREhJRWhSUzNRL3JaU1hWL1pOZnVqcmU4NTAzdmVrL2szT20yZDBGSXFCMnRJdVRiNGRiM1FJYlRWd0VjeHpUZE00Z0FIc0R3QjRoWElSUm8rQU1HSUpCb2FPSGlXZ2hxUVdBZ2NZbXJvQU1nbDBqLy9tcWo3QURraGlCUVhsMUR2bzBVQUZETEpnZFF1SFFpMEltSEs4U3lKejlJNms2aXpvSjgrM283dGNuZlhCNlVtQmRFQUc3dXhBY1l3aGpIRE84aUZNak0waFh5QWFrTDVPVW5NVHBCa083bUNFdzlJVytKaTM0cjBnSy9MV1RRTm1rNTBXRXVjejhQc1NrVmlxWkNmaVQwZ1dBOUFGb2ZDTmRQSW9DQ1VHQUdDV2hsQUlhdUV3a2tjeUd0L1ByZDh5NlF2UWVnN3dmNVFDdmZQcFN5MndRR0NZRkJVQ2kvOXF5M25lOEpNWHhRdm82Um9acFpJSEUveVFvU2tucVYyNzNvbjMrOFFscUplWVF3TFN5OEhvaVN2WG9RemR1a0JRbXgvRWtldnZqWVF4NGhDejVKN1EreU02bFF4Y1VXbTMxUWJDNlFxTnVFODUzSHUvRVYvcEw4QUN6L1pFWlJPMElxSElBTEg0VHVQRC9JdHlsT2tPSWZQU2pIUHdqdEUzSmtRbVZXSVRNSUN0QUx3bWFiU0tBZzdyZDE4QmQ2enBJUVlUWm1DMEZlaURkNkJWRjF2emN0c1BkK05oRi9CWkZ5MkZjUWNrWm4vb1lSNkRkNEJaRi9OckY2QUJpQkFqaUJCekVEOUNSN1pBR0N5MFlRSGZoL0k4aDJFbmdTSlNCeGtsQUN3b2ROcERjVURuZ1NDRkFReXdOOEVDaURKZWhtTUZnVy9hZDhBeUY2TFJpRG5qZUQwb0VBTXpCZURwWVFhS2Q2QTlGNlV6aUVUMWlFdm9FQUs3Q0RvMUlxcDhJUS9NVXVETkdEQVVCNVVQYURCeEdBZWhkVkRUQ0hkSmdCQXZCOURCRXBrNUpzRktaWURKR0VBZkFzMXRlRVRxaDlVRWlCL2hSQmJRRmdiZEFISmcxeGhTb0hpVnZJaFlib2hZZzRFZHRHY2trV0ZFd0djVUdCRklDWUVIRFllQU9JRWVUV0pXUkdWQTZSY2dDd1BPSlhpSXdIQUk1M2lSTEJicWRuRWQvV2VvUkhpYkU0aXhrQmJ4OHhpSm9oaHE5SGhIRm9ndXFXY21tbkVLTW9pNlVvYm81WGQ2Sklnc2NJZXVyR2hOUEhqTlJJaXNnNEZLbnpFajNYRURtNGhndlJqTDZJRWZ4bVFnb0JUWVRJRUszbmV0Tm9qTnhvamNKQkhBWjNiU2NCRVJKQWgzTklmUVhSQ0FrUWtBbGdDQVlCQXZ5NGl4VXhjdDAyRUFBbmNBYUJjMVhCQUlTVUZ3NDVFTk9BQ3l5QUMzNlFXaFU1RVZNd0FVMHdBV1hZa1NSWmtpWjVraDRSUVZsQmtSMjVEMDNRTkxrblBCQU5XWkpld0FJODgzd0pjUm9seVdLdmFCRHNhSEltV1gvb3hITzNTRy81VUJRYVlBbHdoWklNWVFxQThnT21VSlJNT1pWVVdaVldhWlVCQVFBaCtRUUJsZ0FBQUN3R0FBWUFXUUNMQUljeXpUTHgwVVh4cFVUeVgwUHlTRVB5VmtQeWVVVHlna1R3eUVUelRVUHh5a1h5aWtUd3gwVHh0a1h5VVVQeHQwVHhya1h4eGtYd3YwVHltRVR5aTBQeHVVVHlha1B4eUVYeHhFWHlhRVB4dTBUeHpFWHh6VVh5a1VUeGxFVHlVa1B5ajBUeGhrVHhwRVR5YmtUeHRFWHh3MFh5bkVUeGdrVHlWRVB5ZTBUeVpVUHhvRVR4c0VUeWVVUHliRVB4c2tUeHUwWHlkRVR4ckVUeWNFUHlaMFB4djBYeGVVVHh6VVR5bWtUeGowVHhrMFB5WTBQeHJrVHlqVVR4cDBUeVdrUHlhVVB4aEVUeG8wVHhkVVB5b1VUeVdFUHlja1B4cVVUeHEwVHhxa1R5azBRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvZ0FIUUFnUUFNSUFBQWdUS2x6SXNLSERoeEFqUmhSd0ljQUZBUXNlRUNUWVFLTEhqeUJETmxTd1VVR0pqUnRGcWx6Sk1tR0VqUkZnQ0VBcG9xWE5teEU3a0toQm9rT0xCQWNFQ0RpUUFLZlJvd2dMakxBeG9nQUJwRkNqU3AxS3RhclZxMWl6YXQwS3NZQ0ZHUmFjSnFBQUFRS0ZvbHl4Z21EeGdBV0lHRE0zMWt4N0ZjTkdEQTFRRXFSN2xjUEdEUmMwYnV6SXQ2b012eHVRNUJnZ0FBRURBUWNMVTdVUVlrRUlJQjhrYTk3TXViUG56NkEvRTNCUXdNRlRBQU1vVUlnYytxYUJDU1ltR0JqZ0FhV0gxamNyYkt5d0FnRktCcmh0M3ZqTFFBSktDY0ZiYXRpb1FZQUIzd0VZR0VqT01nVU9JamhTN0VBNGdEVjFsUVJRL3Z4QWNmcTcrZlBvMDRQT2tFRTlTQlVuRnB4UThlRTVRUVRUM1Urc2VIR0I4WTNJNlFjUlNRU1pCQjFCd0FuNDBFc0V4VlRiUmpvbytKQk9QUG1FMmdFSGVDZmhRa294NWRTR0lJWW80b2drS3VTVkVTNDR4UmhCa0pVSXdGb1Z2UENXWUJ5NWFCZEJlT2tWZ0lzRUJtQlNYQVROUldJU2lCMnhBRkJDRWVVaVpaWmg1dUtUVUVZcFpXR2psZllVVUdVcFdlSnJzYzBHWkFCQ2pxZ2JRYnpwNk9Kd0JHM0FBSTBCRUViaW1BSHd0bUlBTFc0Sm0yd2FQbG1sYVZQMjZlZWZPS1cyMnBNMEJMRkFFRFI4OENCQnQ1WG9BMGtLK0xEQWdkSHhXRklKL3hFVUlJazNCb0NYZmRIbFJ5SUlMMmdnWXd3SXNRZGxBUzRNa1dKNS9vREdLdXVzQzZuNkpLdXVPZ1VxZmk1MlVPb0xQbVVhd0tZak1oaEFUSlFtU0dLUEppMGFRSVFsVW1RUlJxaXBsbWVJOE1sSEg2M2NkdXV0aUhzK05XZWRKS1p3cDNac3VqbmljZ1ExWjJhSmFBYWc1cGRoaWdnbmIxaENvQ1dKWE9MWlo3amZCaXh3aVBudU95S1RJVmp3QWIwdUhoWUFCekxrOEM2SmZxVVpHRXJxaXRncFh1TmV1K0ZhYmIzVnAxZGdmVGp3eVNpako2akhHM2JZRkFIT05rb2loVDIxa0t5THhzWWtMTEVpTWxzQ3FOSzVLRzEvcWJiM1pMYnpaWmJ5MGt5M1pxdUw0WTMzMUs2aWptZ2RkdHJ0N0NLN0FUUjNNN3pFT1F2dG03dXRVTzJnTHZZNzI3K2s4ZG4wMjNBWHhwaHY1QjVjV2NJZnBOdXdVVjhRUzZ5WGl4WExleEZOTnQ3VlFNRm9rZGdERHcvdzBBT3FVNkpBd3d3MGtCZjM1WmhmaGVSUWlZOVl4QXdlRXNCd2lVbzhVR0VMRXhjTEV3eDZsK2h6eHk0SzhWSUVRaXpRNXdITGFaQmhRQUFoL2hWTllXUmxJSGRwZEdnZ1UyTnlaV1Z1Vkc5SGFXWUFPdz09JyB0aXRsZT0n5Zyo6Z+z5LmQ5Y2V5puy5pKt5pS+6aG16Z2i54K55Ye75Zu+5qCH5LiL6L29JyBzdHlsZT0nd2lkdGg6NTBweCcgPjwvZGl2PiI7CgkJCQkkKCJib2R5IikuYXBwZW5kKG11c2ljX2h0bWwpOwoJCQl9CgoJCX0KCgkJJCgiIyIrbXVzaWNfaWQpLmNsaWNrKGZ1bmN0aW9uKCl7CgoKICAgICAgICAgICAgdmFyIGhvc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgIGlmKGhvc3RVcmwubWF0Y2goL211c2ljXC4xNjNcLi8pKXsKCgogICAgICAgICAgICAgICAgaWYoaG9zdFVybC5tYXRjaCgvXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8jXC8oPzpzb25nfGRqKVw/aWQvKSkgewoKICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbignaHR0cDovL3d3dy5lZ2d2b2QuY24vbmV3bXVzaWMvP3VybD0nK2VuY29kZVVSSUNvbXBvbmVudChob3N0VXJsLnJlcGxhY2UoJy8jJywnJykpKTsKCiAgICAgICAgICAgICAgICB9ZWxzZSBpZihob3N0VXJsLm1hdGNoKC9eaHR0cHM/OlwvXC95XC5tdXNpY1wuMTYzXC5jb21cL21cLyg/OnNvbmd8ZGopXD9pZC8pKSB7CgogICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbignaHR0cDovL3d3dy5lZ2d2b2QuY24vbmV3bXVzaWMvP2lkPScrZW5jb2RlVVJJQ29tcG9uZW50KCdodHRwczovL211c2ljLjE2My5jb20vc29uZz9pZD0nK2dldFF1ZXJ5U3RyaW5nKCdpZCcpKSk7CgogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNvbmdJZCA9IGhvc3RVcmwuc3BsaXQoJz9pZD0nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoc29uZ0lkWzFdKXsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJ2h0dHA6Ly93d3cuZWdndm9kLmNuL25ld211c2ljLz91cmw9JytlbmNvZGVVUklDb21wb25lbnQoJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zb25nP2lkPScrc29uZ0lkWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1lbHNlIGlmKGhvc3RVcmwubWF0Y2goL3lcLnFxXC5jb20vKSl7CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnBhdXNlKCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1FR6Z+z5LmQ6K+35Zyo5Y2V5puy5pKt5pS+6aG16Z2i54K55Ye7VklQ5Zu+5qCH6Kej5p6Q77yM5Zyo5YiX6KGo5ZKM5Y2V5puy6K+m5oOF6aG16Z2i5Lit54K55Ye7VklQ5Zu+5qCH5peg5pWIJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYoJCgnI3NpbV9zb25nX2luZm8nKS5jaGlsZHJlbigiYSIpLmF0dHIoImhyZWYiKSl7CgogICAgICAgICAgICAgICAgICAgdmFyIHFxU29uZyA9ICQoJyNzaW1fc29uZ19pbmZvJykuY2hpbGRyZW4oImEiKS5hdHRyKCJocmVmIikubWF0Y2goL3NvbmdcLyhcUyopLmh0bWwvKTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgIHFxU29uZyA9ICQoJy5wbGF5ZXJfbXVzaWNfX2luZm8nKS5jaGlsZHJlbigiYSIpLmF0dHIoImhyZWYiKS5tYXRjaCgvc29uZ0RldGFpbFwvKFxTKilcPy8pOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbignaHR0cDovL3d3dy5lZ2d2b2QuY24vbmV3bXVzaWMvP2lkPScrcXFTb25nWzFdKycmdHlwZT1xcSZwbGF5VXJsPScrZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjKSk7CgogICAgICAgICAgICB9ZWxzZSBpZihob3N0VXJsLm1hdGNoKC9rdWdvdVwuY29tLykpewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnBhdXNlKCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgdmFyIGtnU29uZyA9IGhvc3RVcmwubWF0Y2goL2hhc2g9KFxTKikmYWxidW0vKTsKICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCdodHRwOi8vd3d3LmVnZ3ZvZC5jbi9uZXdtdXNpYy8/aWQ9JytrZ1NvbmdbMV0rJyZ0eXBlPWt1Z291JnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpKTsKICAgICAgICAgICAgfWVsc2UgaWYoaG9zdFVybC5tYXRjaCgva3V3b1wuY24vKSl7CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnBhdXNlKCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgdmFyIGt3U29uZyA9IGhvc3RVcmwubWF0Y2goL3BsYXlfZGV0YWlsXC8oXFMqKS8pOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coa3dTb25nKTsKICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCdodHRwOi8vd3d3LmVnZ3ZvZC5jbi9uZXdtdXNpYy8/aWQ9Jytrd1NvbmdbMV0rJyZ0eXBlPWt1d28mcGxheVVybD0nK2VuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYykpOwoKICAgICAgICAgICAgfWVsc2UgaWYoaG9zdFVybC5tYXRjaCgvd3d3XC54aWFtaVwuY29tLykpewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnBhdXNlKCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgdmFyIHhtU29uZyA9IGhvc3RVcmwubWF0Y2goL3NvbmdcLyhcUyopLyk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4bVNvbmcpOwogICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJ2h0dHA6Ly93d3cuZWdndm9kLmNuL25ld211c2ljLz9pZD0nK3htU29uZ1sxXSsnJnR5cGU9eGlhbWkmcGxheVVybD0nK2VuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYykpOwoKICAgICAgICAgICAgfWVsc2UgaWYoaG9zdFVybC5tYXRjaCgvd3d3XC54aW1hbGF5YVwuY29tLykpewoKICAgICAgICAgICAgICAgIHZhciB4bWx5VXJsQXJyID0gaG9zdFVybC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIGZvcih2YXIgeHVhSW5kZXggPTA7eHVhSW5kZXg8eG1seVVybEFyci5sZW5ndGg7eHVhSW5kZXgrKyl7CgogICAgICAgICAgICAgICAgICAgIGlmKHh1YUluZGV4PT14bWx5VXJsQXJyLmxlbmd0aC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHhtbHlVcmxBcnJbeHVhSW5kZXhdICE9ICIiKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbignaHR0cDovL3d3dy5lZ2d2b2QuY24vbmV3bXVzaWMvP2lkPScreG1seVVybEFyclt4dWFJbmRleF0rJyZ0eXBlPXhpbWFsYXlhJnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQoaG9zdFVybCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ+ivt+WcqOWNleabsumhtemdoueCueWHu1ZJUOWbvuagh+ino+aekO+8jOWcqOWIl+ihqOS4reeCueWHu1ZJUOWbvuagh+aXoOaViCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1lbHNlIGlmKGhvc3RVcmwubWF0Y2goL211c2ljXC50YWloZVwuY29tLykpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICB9CgoJCX0pOwoKCgl9CiAgICBmdW5jdGlvbiBzZXRDb29raWUoY25hbWUsY3ZhbHVlLGV4ZGF5cyl7CiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwogICAgICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSsoZXhkYXlzKjI0KjYwKjYwKjEwMDApKTsKICAgICAgICB2YXIgZXhwaXJlcyA9ICJleHBpcmVzPSIrZC50b0dNVFN0cmluZygpOwogICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lKyI9IitjdmFsdWUrIjsgIitleHBpcmVzOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q29va2llKGNuYW1lKXsKICAgICAgICB2YXIgbmFtZSA9IGNuYW1lICsgIj0iOwogICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgIGZvcih2YXIgaT0wOyBpPGNhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjID0gY2FbaV0udHJpbSgpOwogICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWUpPT0wKSB7IHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCxjLmxlbmd0aCk7IH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICIiOwogICAgfQoJLy/ojrflj5Z1cmzlj4LmlbA7CglmdW5jdGlvbiBnZXRRdWVyeVN0cmluZyhlKSB7CgkJdmFyIHQgPSBuZXcgUmVnRXhwKCIoXnwmKSIgKyBlICsgIj0oW14mXSopKCZ8JCkiKTsKCQl2YXIgYSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLm1hdGNoKHQpOwoJCWlmIChhICE9IG51bGwpIHJldHVybiBhWzJdOwoJCXJldHVybiAiIjsKCX0KCn0pKCk7","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js","ts":1637743449427,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My4yLjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO3ZhciBjPVtdLGQ9YS5kb2N1bWVudCxlPU9iamVjdC5nZXRQcm90b3R5cGVPZixmPWMuc2xpY2UsZz1jLmNvbmNhdCxoPWMucHVzaCxpPWMuaW5kZXhPZixqPXt9LGs9ai50b1N0cmluZyxsPWouaGFzT3duUHJvcGVydHksbT1sLnRvU3RyaW5nLG49bS5jYWxsKE9iamVjdCksbz17fTtmdW5jdGlvbiBwKGEsYil7Yj1ifHxkO3ZhciBjPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50ZXh0PWEsYi5oZWFkLmFwcGVuZENoaWxkKGMpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9dmFyIHE9IjMuMi4xIixyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyByLmZuLmluaXQoYSxiKX0scz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csdD0vXi1tcy0vLHU9Ly0oW2Etel0pL2csdj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O3IuZm49ci5wcm90b3R5cGU9e2pxdWVyeTpxLGNvbnN0cnVjdG9yOnIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBmLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9mLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPXIubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiByLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhyLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoYTwwP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmM8Yj9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aCxzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LHIuZXh0ZW5kPXIuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxyLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2g8aTtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYoci5pc1BsYWluT2JqZWN0KGQpfHwoZT1BcnJheS5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZBcnJheS5pc0FycmF5KGMpP2M6W10pOmY9YyYmci5pc1BsYWluT2JqZWN0KGMpP2M6e30sZ1tiXT1yLmV4dGVuZChqLGYsZCkpOnZvaWQgMCE9PWQmJihnW2JdPWQpKTtyZXR1cm4gZ30sci5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKHErTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PXIudHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3ZhciBiPXIudHlwZShhKTtyZXR1cm4oIm51bWJlciI9PT1ifHwic3RyaW5nIj09PWIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiEoIWF8fCJbb2JqZWN0IE9iamVjdF0iIT09ay5jYWxsKGEpKSYmKCEoYj1lKGEpKXx8KGM9bC5jYWxsKGIsImNvbnN0cnVjdG9yIikmJmIuY29uc3RydWN0b3IsImZ1bmN0aW9uIj09dHlwZW9mIGMmJm0uY2FsbChjKT09PW4pKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2ErIiI6Im9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYT9qW2suY2FsbChhKV18fCJvYmplY3QiOnR5cGVvZiBhfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe3AoYSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHQsIm1zLSIpLnJlcGxhY2UodSx2KX0sZWFjaDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtpZih3KGEpKXtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVha31lbHNlIGZvcihkIGluIGEpaWYoYi5jYWxsKGFbZF0sZCxhW2RdKT09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOihhKyIiKS5yZXBsYWNlKHMsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHcoT2JqZWN0KGEpKT9yLm1lcmdlKGMsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKTpoLmNhbGwoYyxhKSksY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/LTE6aS5jYWxsKGIsYSxjKX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO2Q8YztkKyspYVtlKytdPWJbZF07cmV0dXJuIGEubGVuZ3RoPWUsYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkLGU9W10sZj0wLGc9YS5sZW5ndGgsaD0hYztmPGc7ZisrKWQ9IWIoYVtmXSxmKSxkIT09aCYmZS5wdXNoKGFbZl0pO3JldHVybiBlfSxtYXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj0wLGg9W107aWYodyhhKSlmb3IoZD1hLmxlbmd0aDtmPGQ7ZisrKWU9YihhW2ZdLGYsYyksbnVsbCE9ZSYmaC5wdXNoKGUpO2Vsc2UgZm9yKGYgaW4gYSllPWIoYVtmXSxmLGMpLG51bGwhPWUmJmgucHVzaChlKTtyZXR1cm4gZy5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2lmKCJzdHJpbmciPT10eXBlb2YgYiYmKGM9YVtiXSxiPWEsYT1jKSxyLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGQ9Zi5jYWxsKGFyZ3VtZW50cywyKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYnx8dGhpcyxkLmNvbmNhdChmLmNhbGwoYXJndW1lbnRzKSkpfSxlLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8ci5ndWlkKyssZX0sbm93OkRhdGUubm93LHN1cHBvcnQ6b30pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihyLmZuW1N5bWJvbC5pdGVyYXRvcl09Y1tTeW1ib2wuaXRlcmF0b3JdKSxyLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7alsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiB3KGEpe3ZhciBiPSEhYSYmImxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPXIudHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iIT09YyYmIXIuaXNXaW5kb3coYSkmJigiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYSl9dmFyIHg9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEQ9W10sRT1ELnBvcCxGPUQucHVzaCxHPUQucHVzaCxIPUQuc2xpY2UsST1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0sSj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLEs9IltcXHgyMFxcdFxcclxcblxcZl0iLEw9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixNPSJcXFsiK0srIiooIitMKyIpKD86IitLKyIqKFsqXiR8IX5dPz0pIitLKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTCsiKSl8KSIrSysiKlxcXSIsTj0iOigiK0wrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK00rIikqKXwuKilcXCl8KSIsTz1uZXcgUmVnRXhwKEsrIisiLCJnIiksUD1uZXcgUmVnRXhwKCJeIitLKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0srIiskIiwiZyIpLFE9bmV3IFJlZ0V4cCgiXiIrSysiKiwiK0srIioiKSxSPW5ldyBSZWdFeHAoIl4iK0srIiooWz4rfl18IitLKyIpIitLKyIqIiksUz1uZXcgUmVnRXhwKCI9IitLKyIqKFteXFxdJ1wiXSo/KSIrSysiKlxcXSIsImciKSxUPW5ldyBSZWdFeHAoTiksVT1uZXcgUmVnRXhwKCJeIitMKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitMKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK0wrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK0wrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitNKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitLKyI/fCgiK0srIil8LikiLCJpZyIpLGFhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6ZDwwP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxiYT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxjYT1mdW5jdGlvbihhLGIpe3JldHVybiBiPyJcMCI9PT1hPyJcdWZmZmQiOmEuc2xpY2UoMCwtMSkrIlxcIithLmNoYXJDb2RlQXQoYS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2F9LGRhPWZ1bmN0aW9uKCl7bSgpfSxlYT10YShmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwJiYoImZvcm0iaW4gYXx8ImxhYmVsImluIGEpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0cuYXBwbHkoRD1ILmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLERbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0c9e2FwcGx5OkQubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ri5hcHBseShhLEguY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHM9YiYmYi5vd25lckRvY3VtZW50LHc9Yj9iLm5vZGVUeXBlOjk7aWYoZD1kfHxbXSwic3RyaW5nIiE9dHlwZW9mIGF8fCFhfHwxIT09dyYmOSE9PXcmJjExIT09dylyZXR1cm4gZDtpZighZSYmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLHApKXtpZigxMSE9PXcmJihsPVouZXhlYyhhKSkpaWYoZj1sWzFdKXtpZig5PT09dyl7aWYoIShqPWIuZ2V0RWxlbWVudEJ5SWQoZikpKXJldHVybiBkO2lmKGouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNlIGlmKHMmJihqPXMuZ2V0RWxlbWVudEJ5SWQoZikpJiZ0KGIsaikmJmouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNle2lmKGxbMl0pcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChmPWxbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gRy5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSksZH1pZihjLnFzYSYmIUFbYSsiICJdJiYoIXF8fCFxLnRlc3QoYSkpKXtpZigxIT09dylzPWIscj1hO2Vsc2UgaWYoIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhrPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9rPWsucmVwbGFjZShiYSxjYSk6Yi5zZXRBdHRyaWJ1dGUoImlkIixrPXUpLG89ZyhhKSxoPW8ubGVuZ3RoO3doaWxlKGgtLSlvW2hdPSIjIitrKyIgIitzYShvW2hdKTtyPW8uam9pbigiLCIpLHM9JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxifWlmKHIpdHJ5e3JldHVybiBHLmFwcGx5KGQscy5xdWVyeVNlbGVjdG9yQWxsKHIpKSxkfWNhdGNoKHgpe31maW5hbGx5e2s9PT11JiZiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShQLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1jLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiZhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImZvcm0iaW4gYj9iLnBhcmVudE5vZGUmJmIuZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gYj8ibGFiZWwiaW4gYi5wYXJlbnROb2RlP2IucGFyZW50Tm9kZS5kaXNhYmxlZD09PWE6Yi5kaXNhYmxlZD09PWE6Yi5pc0Rpc2FibGVkPT09YXx8Yi5pc0Rpc2FibGVkIT09IWEmJmVhKGIpPT09YTpiLmRpc2FibGVkPT09YToibGFiZWwiaW4gYiYmYi5kaXNhYmxlZD09PWF9fWZ1bmN0aW9uIHBhKGEpe3JldHVybiBpYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixpYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1nYS5zdXBwb3J0PXt9LGY9Z2EuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhYiYmIkhUTUwiIT09Yi5ub2RlTmFtZX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89bi5kb2N1bWVudEVsZW1lbnQscD0hZihuKSx2IT09biYmKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVkudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19LGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjLGQsZSxmPWIuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZil7aWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdO2U9Yi5nZXRFbGVtZW50c0J5TmFtZShhKSxkPTA7d2hpbGUoZj1lW2QrK10paWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdfXJldHVybltdfX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnApcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKX0scj1bXSxxPVtdLChjLnFzYT1ZLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrSysiKlsqXiR8IX5dPz0iKSwyIT09YS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmcS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLG8uYXBwZW5kQ2hpbGQoYSkuZGlzYWJsZWQ9ITAsMiE9PWEucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVkudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiKiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixOKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9WS50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8WS50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09bnx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1ufHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0koayxhKS1JKGssYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgYyxkPTAsZT1hLnBhcmVudE5vZGUsZj1iLnBhcmVudE5vZGUsZz1bYV0saD1bYl07aWYoIWV8fCFmKXJldHVybiBhPT09bj8tMTpiPT09bj8xOmU/LTE6Zj8xOms/SShrLGEpLUkoayxiKTowO2lmKGU9PT1mKXJldHVybiBsYShhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSlnLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTt3aGlsZShnW2RdPT09aFtkXSlkKys7cmV0dXJuIGQ/bGEoZ1tkXSxoW2RdKTpnW2RdPT09dj8tMTpoW2RdPT09dj8xOjB9LG4pOm59LGdhLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ2EoYSxudWxsLG51bGwsYil9LGdhLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShTLCI9JyQxJ10iKSxjLm1hdGNoZXNTZWxlY3RvciYmcCYmIUFbYisiICJdJiYoIXJ8fCFyLnRlc3QoYikpJiYoIXF8fCFxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZDLmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lc2NhcGU9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoYmEsY2EpfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6VixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKF8sYWEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKF8sYWEpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxnYS5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZnYS5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gVi5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZULnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0srIikiK2ErIigiK0srInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjohYnx8KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShPLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iJiYoZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxnYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2lhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1JKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmlhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFt1XT9pYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZ2EoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczppYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoXyxhYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFUudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6b2EoITEpLGRpc2FibGVkOm9hKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6cGEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnBhKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpwYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuW2M8MD9jK2I6Y119KSxldmVuOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6cGEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1jPDA/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpwYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWM8MD9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bWEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bmEoYik7ZnVuY3Rpb24gcmEoKXt9cmEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyByYSxnPWdhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1RLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1SLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFAsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1WW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBzYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7YjxjO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHRhKGEsYixjKXt2YXIgZD1iLmRpcixlPWIubmV4dCxmPWV8fGQsZz1jJiYicGFyZW50Tm9kZSI9PT1mLGg9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxlKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGcpcmV0dXJuIGEoYixjLGUpO3JldHVybiExfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG09W3csaF07aWYoaSl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZykmJmEoYixjLGkpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxnKWlmKGw9Ylt1XXx8KGJbdV09e30pLGs9bFtiLnVuaXF1ZUlEXXx8KGxbYi51bmlxdWVJRF09e30pLGUmJmU9PT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpYj1iW2RdfHxiO2Vsc2V7aWYoKGo9a1tmXSkmJmpbMF09PT13JiZqWzFdPT09aClyZXR1cm4gbVsyXT1qWzJdO2lmKGtbZl09bSxtWzJdPWEoYixjLGkpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB1YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB2YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB3YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtoPGk7aCsrKShmPWFbaF0pJiYoYyYmIWMoZixkLGUpfHwoZy5wdXNoKGYpLGomJmIucHVzaChoKSkpO3JldHVybiBnfWZ1bmN0aW9uIHhhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXhhKGQpKSxlJiYhZVt1XSYmKGU9eGEoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dmEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6d2EocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXdhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj13YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6Ry5hcHBseShnLHIpfSl9ZnVuY3Rpb24geWEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz10YShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9dGEoZnVuY3Rpb24oYSl7cmV0dXJuIEkoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2k8ZjtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bdGEodWEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7ZTxmO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHhhKGk+MSYmdWEobSksaT4xJiZzYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxpPGUmJnlhKGEuc2xpY2UoaSxlKSksZTxmJiZ5YShhPWEuc2xpY2UoZSkpLGU8ZiYmc2EoYSkpfW0ucHVzaChjKX1yZXR1cm4gdWEobSl9ZnVuY3Rpb24gemEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbyxxLHI9MCxzPSIwIix0PWYmJltdLHU9W10sdj1qLHg9Znx8ZSYmZC5maW5kLlRBRygiKiIsaykseT13Kz1udWxsPT12PzE6TWF0aC5yYW5kb20oKXx8LjEsej14Lmxlbmd0aDtmb3IoayYmKGo9Zz09PW58fGd8fGspO3MhPT16JiZudWxsIT0obD14W3NdKTtzKyspe2lmKGUmJmwpe289MCxnfHxsLm93bmVyRG9jdW1lbnQ9PT1ufHwobShsKSxoPSFwKTt3aGlsZShxPWFbbysrXSlpZihxKGwsZ3x8bixoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXkpfWMmJigobD0hcSYmbCkmJnItLSxmJiZ0LnB1c2gobCkpfWlmKHIrPXMsYyYmcyE9PXIpe289MDt3aGlsZShxPWJbbysrXSlxKHQsdSxnLGgpO2lmKGYpe2lmKHI+MCl3aGlsZShzLS0pdFtzXXx8dVtzXXx8KHVbc109RS5jYWxsKGkpKTt1PXdhKHUpfUcuYXBwbHkoaSx1KSxrJiYhZiYmdS5sZW5ndGg+MCYmcitiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz15LGo9diksdH07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eWEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHphKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsaSxqLGssbCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG49IWUmJmcoYT1tLnNlbGVjdG9yfHxhKTtpZihjPWN8fFtdLDE9PT1uLmxlbmd0aCl7aWYoaT1uWzBdPW5bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2lbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChqLm1hdGNoZXNbMF0ucmVwbGFjZShfLGFhKSxiKXx8W10pWzBdLCFiKXJldHVybiBjO20mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGkuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWY9Vi5uZWVkc0NvbnRleHQudGVzdChhKT8wOmkubGVuZ3RoO3doaWxlKGYtLSl7aWYoaj1pW2ZdLGQucmVsYXRpdmVbaz1qLnR5cGVdKWJyZWFrO2lmKChsPWQuZmluZFtrXSkmJihlPWwoai5tYXRjaGVzWzBdLnJlcGxhY2UoXyxhYSksJC50ZXN0KGlbMF0udHlwZSkmJnFhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoaS5zcGxpY2UoZiwxKSxhPWUubGVuZ3RoJiZzYShpKSwhYSlyZXR1cm4gRy5hcHBseShjLGUpLGM7YnJlYWt9fX1yZXR1cm4obXx8aChhLG4pKShlLGIsIXAsYywhYnx8JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxiKSxjfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtpZighYylyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7aWYoIWMmJiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEosZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFjKXJldHVybiBhW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTtyLmZpbmQ9eCxyLmV4cHI9eC5zZWxlY3RvcnMsci5leHByWyI6Il09ci5leHByLnBzZXVkb3Msci51bmlxdWVTb3J0PXIudW5pcXVlPXgudW5pcXVlU29ydCxyLnRleHQ9eC5nZXRUZXh0LHIuaXNYTUxEb2M9eC5pc1hNTCxyLmNvbnRhaW5zPXguY29udGFpbnMsci5lc2NhcGVTZWxlY3Rvcj14LmVzY2FwZTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmcihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9LEE9ci5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBCKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudG9Mb3dlckNhc2UoKX12YXIgQz0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaSxEPS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gRShhLGIsYyl7cmV0dXJuIHIuaXNGdW5jdGlvbihiKT9yLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTpiLm5vZGVUeXBlP3IuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KToic3RyaW5nIiE9dHlwZW9mIGI/ci5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGkuY2FsbChiLGEpPi0xIT09Y30pOkQudGVzdChiKT9yLmZpbHRlcihiLGEsYyk6KGI9ci5maWx0ZXIoYixhKSxyLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gaS5jYWxsKGIsYSk+LTEhPT1jJiYxPT09YS5ub2RlVHlwZX0pKX1yLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9yLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOnIuZmluZC5tYXRjaGVzKGEsci5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxyLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjLGQ9dGhpcy5sZW5ndGgsZT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2socihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYoci5jb250YWlucyhlW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihjPXRoaXMucHVzaFN0YWNrKFtdKSxiPTA7YjxkO2IrKylyLmZpbmQoYSxlW2JdLGMpO3JldHVybiBkPjE/ci51bmlxdWVTb3J0KGMpOmN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhRSh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmQS50ZXN0KGEpP3IoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgRixHPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC8sSD1yLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxGLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hWzBdJiYiPiI9PT1hW2EubGVuZ3RoLTFdJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOkcuZXhlYyhhKSwhZXx8IWVbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxjKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihlWzFdKXtpZihiPWIgaW5zdGFuY2VvZiByP2JbMF06YixyLm1lcmdlKHRoaXMsci5wYXJzZUhUTUwoZVsxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpkLCEwKSksQy50ZXN0KGVbMV0pJiZyLmlzUGxhaW5PYmplY3QoYikpZm9yKGUgaW4gYilyLmlzRnVuY3Rpb24odGhpc1tlXSk/dGhpc1tlXShiW2VdKTp0aGlzLmF0dHIoZSxiW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gZj1kLmdldEVsZW1lbnRCeUlkKGVbMl0pLGYmJih0aGlzWzBdPWYsdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6ci5pc0Z1bmN0aW9uKGEpP3ZvaWQgMCE9PWMucmVhZHk/Yy5yZWFkeShhKTphKHIpOnIubWFrZUFycmF5KGEsdGhpcyl9O0gucHJvdG90eXBlPXIuZm4sRj1yKGQpO3ZhciBJPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEo9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ci5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1yKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGM7YSsrKWlmKHIuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPSJzdHJpbmciIT10eXBlb2YgYSYmcihhKTtpZighQS50ZXN0KGEpKWZvcig7ZDxlO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJnIuZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9yLnVuaXF1ZVNvcnQoZik6Zil9LGluZGV4OmZ1bmN0aW9uKGEpe3JldHVybiBhPyJzdHJpbmciPT10eXBlb2YgYT9pLmNhbGwocihhKSx0aGlzWzBdKTppLmNhbGwodGhpcyxhLmpxdWVyeT9hWzBdOmEpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIudW5pcXVlU29ydChyLm1lcmdlKHRoaXMuZ2V0KCkscihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBLKGEsYil7d2hpbGUoKGE9YVtiXSkmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1yLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB5KGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEsoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4geShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4geShhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHkoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHooKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiB6KGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBCKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50OihCKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksci5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsYil7ci5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXIubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9ci5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKEpbYV18fHIudW5pcXVlU29ydChlKSxJLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgTD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE0oYSl7dmFyIGI9e307cmV0dXJuIHIuZWFjaChhLm1hdGNoKEwpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifXIuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP00oYSk6ci5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZj1bXSxnPVtdLGg9LTEsaT1mdW5jdGlvbigpe2ZvcihlPWV8fGEub25jZSxkPWI9ITA7Zy5sZW5ndGg7aD0tMSl7Yz1nLnNoaWZ0KCk7d2hpbGUoKytoPGYubGVuZ3RoKWZbaF0uYXBwbHkoY1swXSxjWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlJiYoaD1mLmxlbmd0aCxjPSExKX1hLm1lbW9yeXx8KGM9ITEpLGI9ITEsZSYmKGY9Yz9bXToiIil9LGo9e2FkZDpmdW5jdGlvbigpe3JldHVybiBmJiYoYyYmIWImJihoPWYubGVuZ3RoLTEsZy5wdXNoKGMpKSxmdW5jdGlvbiBkKGIpe3IuZWFjaChiLGZ1bmN0aW9uKGIsYyl7ci5pc0Z1bmN0aW9uKGMpP2EudW5pcXVlJiZqLmhhcyhjKXx8Zi5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PXIudHlwZShjKSYmZChjKX0pfShhcmd1bWVudHMpLGMmJiFiJiZpKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiByLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9ci5pbkFycmF5KGIsZixjKSk+LTEpZi5zcGxpY2UoYywxKSxjPD1oJiZoLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ci5pbkFycmF5KGEsZik+LTE6Zi5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gZiYmKGY9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGY9Yz0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFmfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGU9Zz1bXSxjfHxifHwoZj1jPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfTtmdW5jdGlvbiBOKGEpe3JldHVybiBhfWZ1bmN0aW9uIE8oYSl7dGhyb3cgYX1mdW5jdGlvbiBQKGEsYixjLGQpe3ZhciBlO3RyeXthJiZyLmlzRnVuY3Rpb24oZT1hLnByb21pc2UpP2UuY2FsbChhKS5kb25lKGIpLmZhaWwoYyk6YSYmci5pc0Z1bmN0aW9uKGU9YS50aGVuKT9lLmNhbGwoYSxiLGMpOmIuYXBwbHkodm9pZCAwLFthXS5zbGljZShkKSl9Y2F0Y2goYSl7Yy5hcHBseSh2b2lkIDAsW2FdKX19ci5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGIpe3ZhciBjPVtbIm5vdGlmeSIsInByb2dyZXNzIixyLkNhbGxiYWNrcygibWVtb3J5Iiksci5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxkPSJwZW5kaW5nIixlPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBkfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZi5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oYSl7cmV0dXJuIGUudGhlbihudWxsLGEpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGIpe3IuZWFjaChjLGZ1bmN0aW9uKGMsZCl7dmFyIGU9ci5pc0Z1bmN0aW9uKGFbZFs0XV0pJiZhW2RbNF1dO2ZbZFsxXV0oZnVuY3Rpb24oKXt2YXIgYT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZyLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhiLm5vdGlmeSkuZG9uZShiLnJlc29sdmUpLmZhaWwoYi5yZWplY3QpOmJbZFswXSsiV2l0aCJdKHRoaXMsZT9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKGIsZCxlKXt2YXIgZj0wO2Z1bmN0aW9uIGcoYixjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxpPWFyZ3VtZW50cyxqPWZ1bmN0aW9uKCl7dmFyIGEsajtpZighKGI8Zikpe2lmKGE9ZC5hcHBseShoLGkpLGE9PT1jLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtqPWEmJigib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhKSYmYS50aGVuLHIuaXNGdW5jdGlvbihqKT9lP2ouY2FsbChhLGcoZixjLE4sZSksZyhmLGMsTyxlKSk6KGYrKyxqLmNhbGwoYSxnKGYsYyxOLGUpLGcoZixjLE8sZSksZyhmLGMsTixjLm5vdGlmeVdpdGgpKSk6KGQhPT1OJiYoaD12b2lkIDAsaT1bYV0pLChlfHxjLnJlc29sdmVXaXRoKShoLGkpKX19LGs9ZT9qOmZ1bmN0aW9uKCl7dHJ5e2ooKX1jYXRjaChhKXtyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJnIuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhhLGsuc3RhY2tUcmFjZSksYisxPj1mJiYoZCE9PU8mJihoPXZvaWQgMCxpPVthXSksYy5yZWplY3RXaXRoKGgsaSkpfX07Yj9rKCk6KHIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoay5zdGFja1RyYWNlPXIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLGEuc2V0VGltZW91dChrKSl9fXJldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGEpe2NbMF1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihlKT9lOk4sYS5ub3RpZnlXaXRoKSksY1sxXVszXS5hZGQoZygwLGEsci5pc0Z1bmN0aW9uKGIpP2I6TikpLGNbMl1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihkKT9kOk8pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9yLmV4dGVuZChhLGUpOmV9fSxmPXt9O3JldHVybiByLmVhY2goYyxmdW5jdGlvbihhLGIpe3ZhciBnPWJbMl0saD1iWzVdO2VbYlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtkPWh9LGNbMy1hXVsyXS5kaXNhYmxlLGNbMF1bMl0ubG9jayksZy5hZGQoYlszXS5maXJlKSxmW2JbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGZbYlswXSsiV2l0aCJdKHRoaXM9PT1mP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZltiWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGUucHJvbWlzZShmKSxiJiZiLmNhbGwoZixmKSxmfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cy5sZW5ndGgsYz1iLGQ9QXJyYXkoYyksZT1mLmNhbGwoYXJndW1lbnRzKSxnPXIuRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtkW2FdPXRoaXMsZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/Zi5jYWxsKGFyZ3VtZW50cyk6YywtLWJ8fGcucmVzb2x2ZVdpdGgoZCxlKX19O2lmKGI8PTEmJihQKGEsZy5kb25lKGgoYykpLnJlc29sdmUsZy5yZWplY3QsIWIpLCJwZW5kaW5nIj09PWcuc3RhdGUoKXx8ci5pc0Z1bmN0aW9uKGVbY10mJmVbY10udGhlbikpKXJldHVybiBnLnRoZW4oKTt3aGlsZShjLS0pUChlW2NdLGgoYyksZy5yZWplY3QpO3JldHVybiBnLnByb21pc2UoKX19KTt2YXIgUT0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oYixjKXthLmNvbnNvbGUmJmEuY29uc29sZS53YXJuJiZiJiZRLnRlc3QoYi5uYW1lKSYmYS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrYi5tZXNzYWdlLGIuc3RhY2ssYyl9LHIucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oYil7YS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYn0pfTt2YXIgUj1yLkRlZmVycmVkKCk7ci5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gUi50aGVuKGEpWyJjYXRjaCJdKGZ1bmN0aW9uKGEpe3IucmVhZHlFeGNlcHRpb24oYSl9KSx0aGlzfSxyLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tci5yZWFkeVdhaXQ6ci5pc1JlYWR5KXx8KHIuaXNSZWFkeT0hMCxhIT09ITAmJi0tci5yZWFkeVdhaXQ+MHx8Ui5yZXNvbHZlV2l0aChkLFtyXSkpfX0pLHIucmVhZHkudGhlbj1SLnRoZW47ZnVuY3Rpb24gUygpe2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsUyksCmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsUyksci5yZWFkeSgpfSJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWQucmVhZHlTdGF0ZSYmIWQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Euc2V0VGltZW91dChyLnJlYWR5KTooZC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixTKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFMpKTt2YXIgVD1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09ci50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpVChhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxyLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwocihhKSxjKX0pKSxiKSlmb3IoO2g8aTtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxVPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gVigpe3RoaXMuZXhwYW5kbz1yLmV4cGFuZG8rVi51aWQrK31WLnVpZD0xLFYucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihhKXt2YXIgYj1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGJ8fChiPXt9LFUoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1iOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KSkpLGJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzLmNhY2hlKGEpO2lmKCJzdHJpbmciPT10eXBlb2YgYillW3IuY2FtZWxDYXNlKGIpXT1jO2Vsc2UgZm9yKGQgaW4gYillW3IuY2FtZWxDYXNlKGQpXT1iW2RdO3JldHVybiBlfSxnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW3IuY2FtZWxDYXNlKGIpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmInN0cmluZyI9PXR5cGVvZiBiJiZ2b2lkIDA9PT1jP3RoaXMuZ2V0KGEsYik6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9YVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PWQpe2lmKHZvaWQgMCE9PWIpe0FycmF5LmlzQXJyYXkoYik/Yj1iLm1hcChyLmNhbWVsQ2FzZSk6KGI9ci5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIubWF0Y2goTCl8fFtdKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlkZWxldGUgZFtiW2NdXX0odm9pZCAwPT09Ynx8ci5pc0VtcHR5T2JqZWN0KGQpKSYmKGEubm9kZVR5cGU/YVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgYVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9YVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1iJiYhci5pc0VtcHR5T2JqZWN0KGIpfX07dmFyIFc9bmV3IFYsWD1uZXcgVixZPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sWj0vW0EtWl0vZztmdW5jdGlvbiAkKGEpe3JldHVybiJ0cnVlIj09PWF8fCJmYWxzZSIhPT1hJiYoIm51bGwiPT09YT9udWxsOmE9PT0rYSsiIj8rYTpZLnRlc3QoYSk/SlNPTi5wYXJzZShhKTphKX1mdW5jdGlvbiBfKGEsYixjKXt2YXIgZDtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKFosIi0kJiIpLnRvTG93ZXJDYXNlKCksYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSQoYyl9Y2F0Y2goZSl7fVguc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfXIuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBYLmhhc0RhdGEoYSl8fFcuaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFguYWNjZXNzKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1gucmVtb3ZlKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gVy5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1cucmVtb3ZlKGEsYil9fSksci5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1YLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIVcuZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPXIuY2FtZWxDYXNlKGQuc2xpY2UoNSkpLF8oZixkLGVbZF0pKSk7Vy5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSl9KTpUKHRoaXMsZnVuY3Rpb24oYil7dmFyIGM7aWYoZiYmdm9pZCAwPT09Yil7aWYoYz1YLmdldChmLGEpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1fKGYsYSksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtYLnJlbW92ZSh0aGlzLGEpfSl9fSksci5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXJldHVybiBiPShifHwiZngiKSsicXVldWUiLGQ9Vy5nZXQoYSxiKSxjJiYoIWR8fEFycmF5LmlzQXJyYXkoYyk/ZD1XLmFjY2VzcyhhLGIsci5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W119LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9ci5xdWV1ZShhLGIpLGQ9Yy5sZW5ndGgsZT1jLnNoaWZ0KCksZj1yLl9xdWV1ZUhvb2tzKGEsYiksZz1mdW5jdGlvbigpe3IuZGVxdWV1ZShhLGIpfTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoImZ4Ij09PWImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBmLnN0b3AsZS5jYWxsKGEsZyxmKSksIWQmJmYmJmYuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihhLGIpe3ZhciBjPWIrInF1ZXVlSG9va3MiO3JldHVybiBXLmdldChhLGMpfHxXLmFjY2VzcyhhLGMse2VtcHR5OnIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1cucmVtb3ZlKGEsW2IrInF1ZXVlIixjXSl9KX0pfX0pLHIuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9ImZ4IixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9yLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPXIucXVldWUodGhpcyxhLGIpO3IuX3F1ZXVlSG9va3ModGhpcyxhKSwiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09Y1swXSYmci5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPXIuRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fCJmeCI7d2hpbGUoZy0tKWM9Vy5nZXQoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIGFhPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGJhPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIithYSsiKShbYS16JV0qKSQiLCJpIiksY2E9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxkYT1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09YS5zdHlsZS5kaXNwbGF5fHwiIj09PWEuc3R5bGUuZGlzcGxheSYmci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSkmJiJub25lIj09PXIuY3NzKGEsImRpc3BsYXkiKX0sZWE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O2Z1bmN0aW9uIGZhKGEsYixjLGQpe3ZhciBlLGY9MSxnPTIwLGg9ZD9mdW5jdGlvbigpe3JldHVybiBkLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiByLmNzcyhhLGIsIiIpfSxpPWgoKSxqPWMmJmNbM118fChyLmNzc051bWJlcltiXT8iIjoicHgiKSxrPShyLmNzc051bWJlcltiXXx8InB4IiE9PWomJitpKSYmYmEuZXhlYyhyLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixyLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBnYT17fTtmdW5jdGlvbiBoYShhKXt2YXIgYixjPWEub3duZXJEb2N1bWVudCxkPWEubm9kZU5hbWUsZT1nYVtkXTtyZXR1cm4gZT9lOihiPWMuYm9keS5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoZCkpLGU9ci5jc3MoYiwiZGlzcGxheSIpLGIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSwibm9uZSI9PT1lJiYoZT0iYmxvY2siKSxnYVtkXT1lLGUpfWZ1bmN0aW9uIGlhKGEsYil7Zm9yKHZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWQ9YVtmXSxkLnN0eWxlJiYoYz1kLnN0eWxlLmRpc3BsYXksYj8oIm5vbmUiPT09YyYmKGVbZl09Vy5nZXQoZCwiZGlzcGxheSIpfHxudWxsLGVbZl18fChkLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmZGEoZCkmJihlW2ZdPWhhKGQpKSk6Im5vbmUiIT09YyYmKGVbZl09Im5vbmUiLFcuc2V0KGQsImRpc3BsYXkiLGMpKSk7Zm9yKGY9MDtmPGc7ZisrKW51bGwhPWVbZl0mJihhW2ZdLnN0eWxlLmRpc3BsYXk9ZVtmXSk7cmV0dXJuIGF9ci5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGEodGhpcyk/cih0aGlzKS5zaG93KCk6cih0aGlzKS5oaWRlKCl9KX19KTt2YXIgamE9L14oPzpjaGVja2JveHxyYWRpbykkL2ksa2E9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSspL2ksbGE9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG1hPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07bWEub3B0Z3JvdXA9bWEub3B0aW9uLG1hLnRib2R5PW1hLnRmb290PW1hLmNvbGdyb3VwPW1hLmNhcHRpb249bWEudGhlYWQsbWEudGg9bWEudGQ7ZnVuY3Rpb24gbmEoYSxiKXt2YXIgYztyZXR1cm4gYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOltdLHZvaWQgMD09PWJ8fGImJkIoYSxiKT9yLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIG9hKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKVcuc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxXLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfXZhciBwYT0vPHwmIz9cdys7LztmdW5jdGlvbiBxYShhLGIsYyxkLGUpe2Zvcih2YXIgZixnLGgsaSxqLGssbD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPVtdLG49MCxvPWEubGVuZ3RoO248bztuKyspaWYoZj1hW25dLGZ8fDA9PT1mKWlmKCJvYmplY3QiPT09ci50eXBlKGYpKXIubWVyZ2UobSxmLm5vZGVUeXBlP1tmXTpmKTtlbHNlIGlmKHBhLnRlc3QoZikpe2c9Z3x8bC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxoPShrYS5leGVjKGYpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGk9bWFbaF18fG1hLl9kZWZhdWx0LGcuaW5uZXJIVE1MPWlbMV0rci5odG1sUHJlZmlsdGVyKGYpK2lbMl0saz1pWzBdO3doaWxlKGstLSlnPWcubGFzdENoaWxkO3IubWVyZ2UobSxnLmNoaWxkTm9kZXMpLGc9bC5maXJzdENoaWxkLGcudGV4dENvbnRlbnQ9IiJ9ZWxzZSBtLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7bC50ZXh0Q29udGVudD0iIixuPTA7d2hpbGUoZj1tW24rK10paWYoZCYmci5pbkFycmF5KGYsZCk+LTEpZSYmZS5wdXNoKGYpO2Vsc2UgaWYoaj1yLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxnPW5hKGwuYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGomJm9hKGcpLGMpe2s9MDt3aGlsZShmPWdbaysrXSlsYS50ZXN0KGYudHlwZXx8IiIpJiZjLnB1c2goZil9cmV0dXJuIGx9IWZ1bmN0aW9uKCl7dmFyIGE9ZC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYj1hLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGM9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Muc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxjLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxjLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxiLmFwcGVuZENoaWxkKGMpLG8uY2hlY2tDbG9uZT1iLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsby5ub0Nsb25lQ2hlY2tlZD0hIWIuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciByYT1kLmRvY3VtZW50RWxlbWVudCxzYT0vXmtleS8sdGE9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLHVhPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiB2YSgpe3JldHVybiEwfWZ1bmN0aW9uIHdhKCl7cmV0dXJuITF9ZnVuY3Rpb24geGEoKXt0cnl7cmV0dXJuIGQuYWN0aXZlRWxlbWVudH1jYXRjaChhKXt9fWZ1bmN0aW9uIHlhKGEsYixjLGQsZSxmKXt2YXIgZyxoO2lmKCJvYmplY3QiPT10eXBlb2YgYil7InN0cmluZyIhPXR5cGVvZiBjJiYoZD1kfHxjLGM9dm9pZCAwKTtmb3IoaCBpbiBiKXlhKGEsaCxjLGQsYltoXSxmKTtyZXR1cm4gYX1pZihudWxsPT1kJiZudWxsPT1lPyhlPWMsZD1jPXZvaWQgMCk6bnVsbD09ZSYmKCJzdHJpbmciPT10eXBlb2YgYz8oZT1kLGQ9dm9pZCAwKTooZT1kLGQ9YyxjPXZvaWQgMCkpLGU9PT0hMSllPXdhO2Vsc2UgaWYoIWUpcmV0dXJuIGE7cmV0dXJuIDE9PT1mJiYoZz1lLGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9ci5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LmFkZCh0aGlzLGIsZSxkLGMpfSl9ci5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbixvLHAscT1XLmdldChhKTtpZihxKXtjLmhhbmRsZXImJihmPWMsYz1mLmhhbmRsZXIsZT1mLnNlbGVjdG9yKSxlJiZyLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJhLGUpLGMuZ3VpZHx8KGMuZ3VpZD1yLmd1aWQrKyksKGk9cS5ldmVudHMpfHwoaT1xLmV2ZW50cz17fSksKGc9cS5oYW5kbGUpfHwoZz1xLmhhbmRsZT1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHImJnIuZXZlbnQudHJpZ2dlcmVkIT09Yi50eXBlP3IuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGI9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSloPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuJiYobD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LG49KGU/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG4sbD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LGs9ci5leHRlbmQoe3R5cGU6bixvcmlnVHlwZTpwLGRhdGE6ZCxoYW5kbGVyOmMsZ3VpZDpjLmd1aWQsc2VsZWN0b3I6ZSxuZWVkc0NvbnRleHQ6ZSYmci5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGUpLG5hbWVzcGFjZTpvLmpvaW4oIi4iKX0sZiksKG09aVtuXSl8fChtPWlbbl09W10sbS5kZWxlZ2F0ZUNvdW50PTAsbC5zZXR1cCYmbC5zZXR1cC5jYWxsKGEsZCxvLGcpIT09ITF8fGEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hZGRFdmVudExpc3RlbmVyKG4sZykpLGwuYWRkJiYobC5hZGQuY2FsbChhLGspLGsuaGFuZGxlci5ndWlkfHwoay5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGspOm0ucHVzaChrKSxyLmV2ZW50Lmdsb2JhbFtuXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG4sbyxwLHE9Vy5oYXNEYXRhKGEpJiZXLmdldChhKTtpZihxJiYoaT1xLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuKXtsPXIuZXZlbnQuc3BlY2lhbFtuXXx8e30sbj0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8bixtPWlbbl18fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrby5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcCE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEsbyxxLmhhbmRsZSkhPT0hMXx8ci5yZW1vdmVFdmVudChhLG4scS5oYW5kbGUpLGRlbGV0ZSBpW25dKX1lbHNlIGZvcihuIGluIGkpci5ldmVudC5yZW1vdmUoYSxuK2Jbal0sYyxkLCEwKTtyLmlzRW1wdHlPYmplY3QoaSkmJlcucmVtb3ZlKGEsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZhciBiPXIuZXZlbnQuZml4KGEpLGMsZCxlLGYsZyxoLGk9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGo9KFcuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYi50eXBlXXx8W10saz1yLmV2ZW50LnNwZWNpYWxbYi50eXBlXXx8e307Zm9yKGlbMF09YixjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKylpW2NdPWFyZ3VtZW50c1tjXTtpZihiLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGIpIT09ITEpe2g9ci5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYixqKSxjPTA7d2hpbGUoKGY9aFtjKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7Yi5jdXJyZW50VGFyZ2V0PWYuZWxlbSxkPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tkKytdKSYmIWIuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSliLnJuYW1lc3BhY2UmJiFiLnJuYW1lc3BhY2UudGVzdChnLm5hbWVzcGFjZSl8fChiLmhhbmRsZU9iaj1nLGIuZGF0YT1nLmRhdGEsZT0oKHIuZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGIucmVzdWx0PWUpPT09ITEmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGIpLGIucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg9W10saT1iLmRlbGVnYXRlQ291bnQsaj1hLnRhcmdldDtpZihpJiZqLm5vZGVUeXBlJiYhKCJjbGljayI9PT1hLnR5cGUmJmEuYnV0dG9uPj0xKSlmb3IoO2ohPT10aGlzO2o9ai5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1qLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8ai5kaXNhYmxlZCE9PSEwKSl7Zm9yKGY9W10sZz17fSxjPTA7YzxpO2MrKylkPWJbY10sZT1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1nW2VdJiYoZ1tlXT1kLm5lZWRzQ29udGV4dD9yKGUsdGhpcykuaW5kZXgoaik+LTE6ci5maW5kKGUsdGhpcyxudWxsLFtqXSkubGVuZ3RoKSxnW2VdJiZmLnB1c2goZCk7Zi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmZ9KX1yZXR1cm4gaj10aGlzLGk8Yi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmIuc2xpY2UoaSl9KSxofSxhZGRQcm9wOmZ1bmN0aW9uKGEsYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIuRXZlbnQucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpyLmlzRnVuY3Rpb24oYik/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGIodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFthXX0sc2V0OmZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19KX0sZml4OmZ1bmN0aW9uKGEpe3JldHVybiBhW3IuZXhwYW5kb10/YTpuZXcgci5FdmVudChhKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcyE9PXhhKCkmJnRoaXMuZm9jdXMpcmV0dXJuIHRoaXMuZm9jdXMoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXM9PT14YSgpJiZ0aGlzLmJsdXIpcmV0dXJuIHRoaXMuYmx1cigpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZigiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZCKHRoaXMsImlucHV0IikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fSxyLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMpfSxyLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiByLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT92YTp3YSx0aGlzLnRhcmdldD1hLnRhcmdldCYmMz09PWEudGFyZ2V0Lm5vZGVUeXBlP2EudGFyZ2V0LnBhcmVudE5vZGU6YS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWEuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9YS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9YSxiJiZyLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxyLm5vdygpLHZvaWQodGhpc1tyLmV4cGFuZG9dPSEwKSk6bmV3IHIuRXZlbnQoYSxiKX0sci5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOndhLGlzUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD12YSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sci5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihhKXt2YXIgYj1hLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS53aGljaCYmc2EudGVzdChhLnR5cGUpP251bGwhPWEuY2hhckNvZGU/YS5jaGFyQ29kZTphLmtleUNvZGU6IWEud2hpY2gmJnZvaWQgMCE9PWImJnRhLnRlc3QoYS50eXBlKT8xJmI/MToyJmI/Mzo0JmI/MjowOmEud2hpY2h9fSxyLmV2ZW50LmFkZFByb3ApLHIuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtyLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fHIuY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLHIuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4geWEodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB5YSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixyKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9d2EpLHRoaXMuZWFjaChmdW5jdGlvbigpe3IuZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9fSk7dmFyIHphPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxBYT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxCYT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxDYT0vXnRydWVcLyguKikvLERhPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBFYShhLGIpe3JldHVybiBCKGEsInRhYmxlIikmJkIoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP3IoIj50Ym9keSIsYSlbMF18fGE6YX1mdW5jdGlvbiBGYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIEdhKGEpe3ZhciBiPUNhLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gSGEoYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihXLmhhc0RhdGEoYSkmJihmPVcuYWNjZXNzKGEpLGc9Vy5zZXQoYixmKSxqPWYuZXZlbnRzKSl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihlIGluIGopZm9yKGM9MCxkPWpbZV0ubGVuZ3RoO2M8ZDtjKyspci5ldmVudC5hZGQoYixlLGpbZV1bY10pfVguaGFzRGF0YShhKSYmKGg9WC5hY2Nlc3MoYSksaT1yLmV4dGVuZCh7fSxoKSxYLnNldChiLGkpKX19ZnVuY3Rpb24gSWEoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PWMmJmphLnRlc3QoYS50eXBlKT9iLmNoZWNrZWQ9YS5jaGVja2VkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBKYShhLGIsYyxkKXtiPWcuYXBwbHkoW10sYik7dmFyIGUsZixoLGksaixrLGw9MCxtPWEubGVuZ3RoLG49bS0xLHE9YlswXSxzPXIuaXNGdW5jdGlvbihxKTtpZihzfHxtPjEmJiJzdHJpbmciPT10eXBlb2YgcSYmIW8uY2hlY2tDbG9uZSYmQmEudGVzdChxKSlyZXR1cm4gYS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWEuZXEoZSk7cyYmKGJbMF09cS5jYWxsKHRoaXMsZSxmLmh0bWwoKSkpLEphKGYsYixjLGQpfSk7aWYobSYmKGU9cWEoYixhWzBdLm93bmVyRG9jdW1lbnQsITEsYSxkKSxmPWUuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9ZiksZnx8ZCkpe2ZvcihoPXIubWFwKG5hKGUsInNjcmlwdCIpLEZhKSxpPWgubGVuZ3RoO2w8bTtsKyspaj1lLGwhPT1uJiYoaj1yLmNsb25lKGosITAsITApLGkmJnIubWVyZ2UoaCxuYShqLCJzY3JpcHQiKSkpLGMuY2FsbChhW2xdLGosbCk7aWYoaSlmb3Ioaz1oW2gubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsci5tYXAoaCxHYSksbD0wO2w8aTtsKyspaj1oW2xdLGxhLnRlc3Qoai50eXBlfHwiIikmJiFXLmFjY2VzcyhqLCJnbG9iYWxFdmFsIikmJnIuY29udGFpbnMoayxqKSYmKGouc3JjP3IuX2V2YWxVcmwmJnIuX2V2YWxVcmwoai5zcmMpOnAoai50ZXh0Q29udGVudC5yZXBsYWNlKERhLCIiKSxrKSl9cmV0dXJuIGF9ZnVuY3Rpb24gS2EoYSxiLGMpe2Zvcih2YXIgZCxlPWI/ci5maWx0ZXIoYixhKTphLGY9MDtudWxsIT0oZD1lW2ZdKTtmKyspY3x8MSE9PWQubm9kZVR5cGV8fHIuY2xlYW5EYXRhKG5hKGQpKSxkLnBhcmVudE5vZGUmJihjJiZyLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudCxkKSYmb2EobmEoZCwic2NyaXB0IikpLGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSk7cmV0dXJuIGF9ci5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh6YSwiPCQxPjwvJDI+Iil9LGNsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY2xvbmVOb2RlKCEwKSxpPXIuY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKCEoby5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8ci5pc1hNTERvYyhhKSkpZm9yKGc9bmEoaCksZj1uYShhKSxkPTAsZT1mLmxlbmd0aDtkPGU7ZCsrKUlhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fG5hKGEpLGc9Z3x8bmEoaCksZD0wLGU9Zi5sZW5ndGg7ZDxlO2QrKylIYShmW2RdLGdbZF0pO2Vsc2UgSGEoYSxoKTtyZXR1cm4gZz1uYShoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZvYShnLCFpJiZuYShhLCJzY3JpcHQiKSksaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZT1yLmV2ZW50LnNwZWNpYWwsZj0wO3ZvaWQgMCE9PShjPWFbZl0pO2YrKylpZihVKGMpKXtpZihiPWNbVy5leHBhbmRvXSl7aWYoYi5ldmVudHMpZm9yKGQgaW4gYi5ldmVudHMpZVtkXT9yLmV2ZW50LnJlbW92ZShjLGQpOnIucmVtb3ZlRXZlbnQoYyxkLGIuaGFuZGxlKTtjW1cuZXhwYW5kb109dm9pZCAwfWNbWC5leHBhbmRvXSYmKGNbWC5leHBhbmRvXT12b2lkIDApfX19KSxyLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBLYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIEthKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9yLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSmEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUVhKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9RWEodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKTE9PT1hLm5vZGVUeXBlJiYoci5jbGVhbkRhdGEobmEoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGwhPWEmJmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiByLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIUFhLnRlc3QoYSkmJiFtYVsoa2EuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9ci5odG1sUHJlZmlsdGVyKGEpO3RyeXtmb3IoO2M8ZDtjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKHIuY2xlYW5EYXRhKG5hKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIEphKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMucGFyZW50Tm9kZTtyLmluQXJyYXkodGhpcyxhKTwwJiYoci5jbGVhbkRhdGEobmEodGhpcykpLGMmJmMucmVwbGFjZUNoaWxkKGIsdGhpcykpfSxhKX19KSxyLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W10sZT1yKGEpLGY9ZS5sZW5ndGgtMSxnPTA7Zzw9ZjtnKyspYz1nPT09Zj90aGlzOnRoaXMuY2xvbmUoITApLHIoZVtnXSlbYl0oYyksaC5hcHBseShkLGMuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhkKX19KTt2YXIgTGE9L15tYXJnaW4vLE1hPW5ldyBSZWdFeHAoIl4oIithYSsiKSg/IXB4KVthLXolXSskIiwiaSIpLE5hPWZ1bmN0aW9uKGIpe3ZhciBjPWIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gYyYmYy5vcGVuZXJ8fChjPWEpLGMuZ2V0Q29tcHV0ZWRTdHlsZShiKX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2lmKGkpe2kuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt0b3A6MSU7d2lkdGg6NTAlIixpLmlubmVySFRNTD0iIixyYS5hcHBlbmRDaGlsZChoKTt2YXIgYj1hLmdldENvbXB1dGVkU3R5bGUoaSk7Yz0iMSUiIT09Yi50b3AsZz0iMnB4Ij09PWIubWFyZ2luTGVmdCxlPSI0cHgiPT09Yi53aWR0aCxpLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGY9IjRweCI9PT1iLm1hcmdpblJpZ2h0LHJhLnJlbW92ZUNoaWxkKGgpLGk9bnVsbH19dmFyIGMsZSxmLGcsaD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlJiYoaS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGkuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixvLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxoLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixoLmFwcGVuZENoaWxkKGkpLHIuZXh0ZW5kKG8se3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGN9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxlfSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxmfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGd9fSkpfSgpO2Z1bmN0aW9uIE9hKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8TmEoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdLCIiIT09Z3x8ci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fChnPXIuc3R5bGUoYSxiKSksIW8ucGl4ZWxNYXJnaW5SaWdodCgpJiZNYS50ZXN0KGcpJiZMYS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiBQYShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgUWE9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFJhPS9eLS0vLFNhPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sVWE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFZhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gV2EoYSl7aWYoYSBpbiBWYSlyZXR1cm4gYTt2YXIgYj1hWzBdLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPVVhLmxlbmd0aDt3aGlsZShjLS0paWYoYT1VYVtjXStiLGEgaW4gVmEpcmV0dXJuIGF9ZnVuY3Rpb24gWGEoYSl7dmFyIGI9ci5jc3NQcm9wc1thXTtyZXR1cm4gYnx8KGI9ci5jc3NQcm9wc1thXT1XYShhKXx8YSksYn1mdW5jdGlvbiBZYShhLGIsYyl7dmFyIGQ9YmEuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMl0tKGN8fDApKSsoZFszXXx8InB4Iik6Yn1mdW5jdGlvbiBaYShhLGIsYyxkLGUpe3ZhciBmLGc9MDtmb3IoZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MDtmPDQ7Zis9MikibWFyZ2luIj09PWMmJihnKz1yLmNzcyhhLGMrY2FbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1yLmNzcyhhLCJwYWRkaW5nIitjYVtmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09ci5jc3MoYSwiYm9yZGVyIitjYVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPXIuY3NzKGEsInBhZGRpbmciK2NhW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1yLmNzcyhhLCJib3JkZXIiK2NhW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiAkYShhLGIsYyl7dmFyIGQsZT1OYShhKSxmPU9hKGEsYixlKSxnPSJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZSk7cmV0dXJuIE1hLnRlc3QoZik/ZjooZD1nJiYoby5ib3hTaXppbmdSZWxpYWJsZSgpfHxmPT09YS5zdHlsZVtiXSksImF1dG8iPT09ZiYmKGY9YVsib2Zmc2V0IitiWzBdLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKV0pLGY9cGFyc2VGbG9hdChmKXx8MCxmK1phKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZSkrInB4Iil9ci5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1PYShhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpLGo9YS5zdHlsZTtyZXR1cm4gaXx8KGI9WGEoaCkpLGc9ci5jc3NIb29rc1tiXXx8ci5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTpqW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9YmEuZXhlYyhjKSkmJmVbMV0mJihjPWZhKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChyLmNzc051bWJlcltoXT8iIjoicHgiKSksby5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaltiXT0iaW5oZXJpdCIpLGcmJiJzZXQiaW4gZyYmdm9pZCAwPT09KGM9Zy5zZXQoYSxjLGQpKXx8KGk/ai5zZXRQcm9wZXJ0eShiLGMpOmpbYl09YykpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpO3JldHVybiBpfHwoYj1YYShoKSksZz1yLmNzc0hvb2tzW2JdfHxyLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZSYmKGU9T2EoYSxiLGQpKSwibm9ybWFsIj09PWUmJmIgaW4gVGEmJihlPVRhW2JdKSwiIj09PWN8fGM/KGY9cGFyc2VGbG9hdChlKSxjPT09ITB8fGlzRmluaXRlKGYpP2Z8fDA6ZSk6ZX19KSxyLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7ci5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiFRYS50ZXN0KHIuY3NzKGEsImRpc3BsYXkiKSl8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/JGEoYSxiLGQpOmVhKGEsU2EsZnVuY3Rpb24oKXtyZXR1cm4gJGEoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj1kJiZOYShhKSxnPWQmJlphKGEsYixkLCJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZiksZik7cmV0dXJuIGcmJihlPWJhLmV4ZWMoYykpJiYicHgiIT09KGVbM118fCJweCIpJiYoYS5zdHlsZVtiXT1jLGM9ci5jc3MoYSxiKSksWWEoYSxjLGcpfX19KSxyLmNzc0hvb2tzLm1hcmdpbkxlZnQ9UGEoby5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxiKXtpZihiKXJldHVybihwYXJzZUZsb2F0KE9hKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1lYShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksci5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ZDw0O2QrKyllW2ErY2FbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sTGEudGVzdChhKXx8KHIuY3NzSG9va3NbYStiXS5zZXQ9WWEpfSksci5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKGQ9TmEoYSksZT1iLmxlbmd0aDtnPGU7ZysrKWZbYltnXV09ci5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP3Iuc3R5bGUoYSxiLGMpOnIuY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIF9hKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBfYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfXIuVHdlZW49X2EsX2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHxyLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9Yix0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9ZCx0aGlzLnVuaXQ9Znx8KHIuY3NzTnVtYmVyW2NdPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1fYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6X2EucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9X2EucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1iPXIuZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWI9YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpfYS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxfYS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9X2EucHJvdG90eXBlLF9hLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gMSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbCE9YS5lbGVtW2EucHJvcF0mJm51bGw9PWEuZWxlbS5zdHlsZVthLnByb3BdP2EuZWxlbVthLnByb3BdOihiPXIuY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKX0sc2V0OmZ1bmN0aW9uKGEpe3IuZnguc3RlcFthLnByb3BdP3IuZnguc3RlcFthLnByb3BdKGEpOjEhPT1hLmVsZW0ubm9kZVR5cGV8fG51bGw9PWEuZWxlbS5zdHlsZVtyLmNzc1Byb3BzW2EucHJvcF1dJiYhci5jc3NIb29rc1thLnByb3BdP2EuZWxlbVthLnByb3BdPWEubm93OnIuc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpfX19LF9hLnByb3BIb29rcy5zY3JvbGxUb3A9X2EucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sci5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxyLmZ4PV9hLnByb3RvdHlwZS5pbml0LHIuZnguc3RlcD17fTt2YXIgYWIsYmIsY2I9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGRiPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZWIoKXtiYiYmKGQuaGlkZGVuPT09ITEmJmEucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2EucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGViKTphLnNldFRpbWVvdXQoZWIsci5meC5pbnRlcnZhbCksci5meC50aWNrKCkpfWZ1bmN0aW9uIGZiKCl7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe2FiPXZvaWQgMH0pLGFiPXIubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowO2Q8NDtkKz0yLWIpYz1jYVtkXSxlWyJtYXJnaW4iK2NdPWVbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIGhiKGEsYixjKXtmb3IodmFyIGQsZT0oa2IudHdlZW5lcnNbYl18fFtdKS5jb25jYXQoa2IudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7ZjxnO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gaWIoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD0id2lkdGgiaW4gYnx8ImhlaWdodCJpbiBiLG09dGhpcyxuPXt9LG89YS5zdHlsZSxwPWEubm9kZVR5cGUmJmRhKGEpLHE9Vy5nZXQoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGc9ci5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWcudW5xdWV1ZWQmJihnLnVucXVldWVkPTAsaD1nLmVtcHR5LmZpcmUsZy5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7Zy51bnF1ZXVlZHx8aCgpfSksZy51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtnLnVucXVldWVkLS0sci5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8Zy5lbXB0eS5maXJlKCl9KX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxjYi50ZXN0KGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHA/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFxfHx2b2lkIDA9PT1xW2RdKWNvbnRpbnVlO3A9ITB9bltkXT1xJiZxW2RdfHxyLnN0eWxlKGEsZCl9aWYoaT0hci5pc0VtcHR5T2JqZWN0KGIpLGl8fCFyLmlzRW1wdHlPYmplY3Qobikpe2wmJjE9PT1hLm5vZGVUeXBlJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1xJiZxLmRpc3BsYXksbnVsbD09aiYmKGo9Vy5nZXQoYSwiZGlzcGxheSIpKSxrPXIuY3NzKGEsImRpc3BsYXkiKSwibm9uZSI9PT1rJiYoaj9rPWo6KGlhKFthXSwhMCksaj1hLnN0eWxlLmRpc3BsYXl8fGosaz1yLmNzcyhhLCJkaXNwbGF5IiksaWEoW2FdKSkpLCgiaW5saW5lIj09PWt8fCJpbmxpbmUtYmxvY2siPT09ayYmbnVsbCE9aikmJiJub25lIj09PXIuY3NzKGEsImZsb2F0IikmJihpfHwobS5kb25lKGZ1bmN0aW9uKCl7by5kaXNwbGF5PWp9KSxudWxsPT1qJiYoaz1vLmRpc3BsYXksaj0ibm9uZSI9PT1rPyIiOmspKSxvLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz0iaGlkZGVuIixtLmFsd2F5cyhmdW5jdGlvbigpe28ub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxvLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLG8ub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSksaT0hMTtmb3IoZCBpbiBuKWl8fChxPyJoaWRkZW4iaW4gcSYmKHA9cS5oaWRkZW4pOnE9Vy5hY2Nlc3MoYSwiZnhzaG93Iix7ZGlzcGxheTpqfSksZiYmKHEuaGlkZGVuPSFwKSxwJiZpYShbYV0sITApLG0uZG9uZShmdW5jdGlvbigpe3B8fGlhKFthXSksVy5yZW1vdmUoYSwiZnhzaG93Iik7Zm9yKGQgaW4gbilyLnN0eWxlKGEsZCxuW2RdKX0pKSxpPWhiKHA/cVtkXTowLGQsbSksZCBpbiBxfHwocVtkXT1pLnN0YXJ0LHAmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPXIuY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sQXJyYXkuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9ci5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBrYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1rYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPXIuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWFifHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtnPGk7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksZjwxJiZpP2M6KGl8fGgubm90aWZ5V2l0aChhLFtqLDEsMF0pLGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpyLmV4dGVuZCh7fSxiKSxvcHRzOnIuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpyLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmFifHxmYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9ci5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmPGc7ZisrKWlmKGQ9a2IucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIHIuaXNGdW5jdGlvbihkLnN0b3ApJiYoci5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPXIucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiByLm1hcChrLGhiLGopLHIuaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLGoucHJvZ3Jlc3Moai5vcHRzLnByb2dyZXNzKS5kb25lKGoub3B0cy5kb25lLGoub3B0cy5jb21wbGV0ZSkuZmFpbChqLm9wdHMuZmFpbCkuYWx3YXlzKGoub3B0cy5hbHdheXMpLHIuZngudGltZXIoci5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksan1yLkFuaW1hdGlvbj1yLmV4dGVuZChrYix7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYik7cmV0dXJuIGZhKGMuZWxlbSxhLGJhLmV4ZWMoYiksYyksY31dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsYil7ci5pc0Z1bmN0aW9uKGEpPyhiPWEsYT1bIioiXSk6YT1hLm1hdGNoKEwpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWM9YVtkXSxrYi50d2VlbmVyc1tjXT1rYi50d2VlbmVyc1tjXXx8W10sa2IudHdlZW5lcnNbY10udW5zaGlmdChiKX0scHJlZmlsdGVyczpbaWJdLHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/a2IucHJlZmlsdGVycy51bnNoaWZ0KGEpOmtiLnByZWZpbHRlcnMucHVzaChhKX19KSxyLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiYib2JqZWN0Ij09dHlwZW9mIGE/ci5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxyLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIXIuaXNGdW5jdGlvbihiKSYmYn07cmV0dXJuIHIuZngub2ZmP2QuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIGQuZHVyYXRpb24mJihkLmR1cmF0aW9uIGluIHIuZnguc3BlZWRzP2QuZHVyYXRpb249ci5meC5zcGVlZHNbZC5kdXJhdGlvbl06ZC5kdXJhdGlvbj1yLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtyLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJnIuZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxyLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihkYSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ci5pc0VtcHR5T2JqZWN0KGEpLGY9ci5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsci5leHRlbmQoe30sYSksZik7KGV8fFcuZ2V0KHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9ci50aW1lcnMsZz1XLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZkYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxyLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1XLmdldCh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9ci50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLHIucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2I8ZztiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksci5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPXIuZm5bYl07ci5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxyLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksci50aW1lcnM9W10sci5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj0wLGM9ci50aW1lcnM7Zm9yKGFiPXIubm93KCk7YjxjLmxlbmd0aDtiKyspYT1jW2JdLGEoKXx8Y1tiXSE9PWF8fGMuc3BsaWNlKGItLSwxKTtjLmxlbmd0aHx8ci5meC5zdG9wKCksYWI9dm9pZCAwfSxyLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe3IudGltZXJzLnB1c2goYSksci5meC5zdGFydCgpfSxyLmZ4LmludGVydmFsPTEzLHIuZnguc3RhcnQ9ZnVuY3Rpb24oKXtiYnx8KGJiPSEwLGViKCkpfSxyLmZ4LnN0b3A9ZnVuY3Rpb24oKXtiYj1udWxsfSxyLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxyLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9ci5meD9yLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYT1kLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYj1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGM9Yi5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTthLnR5cGU9ImNoZWNrYm94IixvLmNoZWNrT249IiIhPT1hLnZhbHVlLG8ub3B0U2VsZWN0ZWQ9Yy5zZWxlY3RlZCxhPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnZhbHVlPSJ0IixhLnR5cGU9InJhZGlvIixvLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGIsbWI9ci5leHByLmF0dHJIYW5kbGU7ci5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVCh0aGlzLHIuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxyLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuZ2V0QXR0cmlidXRlP3IucHJvcChhLGIsYyk6KDE9PT1mJiZyLmlzWE1MRG9jKGEpfHwoZT1yLmF0dHJIb29rc1tiLnRvTG93ZXJDYXNlKCldfHwoci5leHByLm1hdGNoLmJvb2wudGVzdChiKT9sYjp2b2lkIDApKSx2b2lkIDAhPT1jP251bGw9PT1jP3ZvaWQgci5yZW1vdmVBdHRyKGEsYik6ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDooZD1yLmZpbmQuYXR0cihhLGIpLApudWxsPT1kP3ZvaWQgMDpkKSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIW8ucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJkIoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTAsZT1iJiZiLm1hdGNoKEwpO2lmKGUmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZVtkKytdKWEucmVtb3ZlQXR0cmlidXRlKGMpfX0pLGxiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/ci5yZW1vdmVBdHRyKGEsYyk6YS5zZXRBdHRyaWJ1dGUoYyxjKSxjfX0sci5lYWNoKHIuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9bWJbYl18fHIuZmluZC5hdHRyO21iW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGc9Yi50b0xvd2VyQ2FzZSgpO3JldHVybiBkfHwoZj1tYltnXSxtYltnXT1lLGU9bnVsbCE9YyhhLGIsZCk/ZzpudWxsLG1iW2ddPWYpLGV9fSk7dmFyIG5iPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksb2I9L14oPzphfGFyZWEpJC9pO3IuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFQodGhpcyxyLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3IucHJvcEZpeFthXXx8YV19KX19KSxyLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gMT09PWYmJnIuaXNYTUxEb2MoYSl8fChiPXIucHJvcEZpeFtiXXx8YixlPXIucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1yLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOm5iLnRlc3QoYS5ub2RlTmFtZSl8fG9iLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLG8ub3B0U2VsZWN0ZWR8fChyLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksci5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtyLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7ZnVuY3Rpb24gcGIoYSl7dmFyIGI9YS5tYXRjaChMKXx8W107cmV0dXJuIGIuam9pbigiICIpfWZ1bmN0aW9uIHFiKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifXIuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYoci5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7cih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHFiKHRoaXMpKSl9KTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pZC5pbmRleE9mKCIgIitmKyIgIik8MCYmKGQrPWYrIiAiKTtoPXBiKGQpLGUhPT1oJiZjLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaT0wO2lmKHIuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYixxYih0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pd2hpbGUoZC5pbmRleE9mKCIgIitmKyIgIik+LTEpZD1kLnJlcGxhY2UoIiAiK2YrIiAiLCIgIik7aD1wYihkKSxlIT09aCYmYy5zZXRBdHRyaWJ1dGUoImNsYXNzIixoKX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnIuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHFiKHRoaXMpLGIpLGIpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsZCxlLGY7aWYoInN0cmluZyI9PT1jKXtkPTAsZT1yKHRoaXMpLGY9YS5tYXRjaChMKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZSB2b2lkIDAhPT1hJiYiYm9vbGVhbiIhPT1jfHwoYj1xYih0aGlzKSxiJiZXLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixiKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixifHxhPT09ITE/IiI6Vy5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD0wO2I9IiAiK2ErIiAiO3doaWxlKGM9dGhpc1tkKytdKWlmKDE9PT1jLm5vZGVUeXBlJiYoIiAiK3BiKHFiKGMpKSsiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHJiPS9cci9nO3IuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1yLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMscih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOkFycmF5LmlzQXJyYXkoZSkmJihlPXIubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPXIudmFsSG9va3NbdGhpcy50eXBlXXx8ci52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPXIudmFsSG9va3NbZS50eXBlXXx8ci52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UocmIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLHIuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ci5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOnBiKHIudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1hLm9wdGlvbnMsZj1hLnNlbGVjdGVkSW5kZXgsZz0ic2VsZWN0LW9uZSI9PT1hLnR5cGUsaD1nP251bGw6W10saT1nP2YrMTplLmxlbmd0aDtmb3IoZD1mPDA/aTpnP2Y6MDtkPGk7ZCsrKWlmKGM9ZVtkXSwoYy5zZWxlY3RlZHx8ZD09PWYpJiYhYy5kaXNhYmxlZCYmKCFjLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFCKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9cihjKS52YWwoKSxnKXJldHVybiBiO2gucHVzaChiKX1yZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPXIubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWQ9ZVtnXSwoZC5zZWxlY3RlZD1yLmluQXJyYXkoci52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPi0xKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksci5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7ci52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7aWYoQXJyYXkuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPXIuaW5BcnJheShyKGEpLnZhbCgpLGIpPi0xfX0sby5jaGVja09ufHwoci52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBzYj0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87ci5leHRlbmQoci5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihiLGMsZSxmKXt2YXIgZyxoLGksaixrLG0sbixvPVtlfHxkXSxwPWwuY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1sLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWk9ZT1lfHxkLDMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmIXNiLnRlc3QocCtyLmV2ZW50LnRyaWdnZXJlZCkmJihwLmluZGV4T2YoIi4iKT4tMSYmKHE9cC5zcGxpdCgiLiIpLHA9cS5zaGlmdCgpLHEuc29ydCgpKSxrPXAuaW5kZXhPZigiOiIpPDAmJiJvbiIrcCxiPWJbci5leHBhbmRvXT9iOm5ldyByLkV2ZW50KHAsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1mPzI6MyxiLm5hbWVzcGFjZT1xLmpvaW4oIi4iKSxiLnJuYW1lc3BhY2U9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWUpLGM9bnVsbD09Yz9bYl06ci5tYWtlQXJyYXkoYyxbYl0pLG49ci5ldmVudC5zcGVjaWFsW3BdfHx7fSxmfHwhbi50cmlnZ2VyfHxuLnRyaWdnZXIuYXBwbHkoZSxjKSE9PSExKSl7aWYoIWYmJiFuLm5vQnViYmxlJiYhci5pc1dpbmRvdyhlKSl7Zm9yKGo9bi5kZWxlZ2F0ZVR5cGV8fHAsc2IudGVzdChqK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGk9aDtpPT09KGUub3duZXJEb2N1bWVudHx8ZCkmJm8ucHVzaChpLmRlZmF1bHRWaWV3fHxpLnBhcmVudFdpbmRvd3x8YSl9Zz0wO3doaWxlKChoPW9bZysrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWc+MT9qOm4uYmluZFR5cGV8fHAsbT0oVy5nZXQoaCwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZXLmdldChoLCJoYW5kbGUiKSxtJiZtLmFwcGx5KGgsYyksbT1rJiZoW2tdLG0mJm0uYXBwbHkmJlUoaCkmJihiLnJlc3VsdD1tLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gYi50eXBlPXAsZnx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8bi5fZGVmYXVsdCYmbi5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpIT09ITF8fCFVKGUpfHxrJiZyLmlzRnVuY3Rpb24oZVtwXSkmJiFyLmlzV2luZG93KGUpJiYoaT1lW2tdLGkmJihlW2tdPW51bGwpLHIuZXZlbnQudHJpZ2dlcmVkPXAsZVtwXSgpLHIuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxpJiYoZVtrXT1pKSksYi5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ci5leHRlbmQobmV3IHIuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7ci5ldmVudC50cmlnZ2VyKGQsbnVsbCxiKX19KSxyLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtpZihjKXJldHVybiByLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApfX0pLHIuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3IuZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLHIuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxvLmZvY3VzaW49Im9uZm9jdXNpbiJpbiBhLG8uZm9jdXNpbnx8ci5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe3IuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxyLmV2ZW50LmZpeChhKSl9O3IuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1XLmFjY2VzcyhkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLFcuYWNjZXNzKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9Vy5hY2Nlc3MoZCxiKS0xO2U/Vy5hY2Nlc3MoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxXLnJlbW92ZShkLGIpKX19fSk7dmFyIHRiPWEubG9jYXRpb24sdWI9ci5ub3coKSx2Yj0vXD8vO3IucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGM7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7Yz0obmV3IGEuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKX1jYXRjaChkKXtjPXZvaWQgMH1yZXR1cm4gYyYmIWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxyLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKSxjfTt2YXIgd2I9L1xbXF0kLyx4Yj0vXHI/XG4vZyx5Yj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEFiKGEsYixjLGQpe3ZhciBlO2lmKEFycmF5LmlzQXJyYXkoYikpci5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHx3Yi50ZXN0KGEpP2QoYSxlKTpBYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09ci50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpQWIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfXIucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1yLmlzRnVuY3Rpb24oYik/YigpOmI7ZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09Yz8iIjpjKX07aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFyLmlzUGxhaW5PYmplY3QoYSkpci5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlBYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIil9LHIuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gci5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXIucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP3IubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXIodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ6Yi50ZXN0KHRoaXMubm9kZU5hbWUpJiYheWIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IWphLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9cih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOkFycmF5LmlzQXJyYXkoYyk/ci5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHhiLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YiwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBCYj0vJTIwL2csQ2I9LyMuKiQvLERiPS8oWz8mXSlfPVteJl0qLyxFYj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEZiPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLEdiPS9eKD86R0VUfEhFQUQpJC8sSGI9L15cL1wvLyxJYj17fSxKYj17fSxLYj0iKi8iLmNvbmNhdCgiKiIpLExiPWQuY3JlYXRlRWxlbWVudCgiYSIpO0xiLmhyZWY9dGIuaHJlZjtmdW5jdGlvbiBNYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8W107aWYoci5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWRbMF0/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxyLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYihhLGIpe3ZhciBjLGQsZT1yLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZyLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihkKWZvcihlIGluIGgpaWYoaFtlXSYmaFtlXS50ZXN0KGQpKXtpLnVuc2hpZnQoZSk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGUgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tlKyIgIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31pZihmKXJldHVybiBmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl19ZnVuY3Rpb24gUWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1yLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6dGIuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6RmIudGVzdCh0Yi5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpLYix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6ci5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/T2IoT2IoYSxyLmFqYXhTZXR0aW5ncyksYik6T2Ioci5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6TWIoSWIpLGFqYXhUcmFuc3BvcnQ6TWIoSmIpLGFqYXg6ZnVuY3Rpb24oYixjKXsib2JqZWN0Ij09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGM9Y3x8e307dmFyIGUsZixnLGgsaSxqLGssbCxtLG4sbz1yLmFqYXhTZXR1cCh7fSxjKSxwPW8uY29udGV4dHx8byxxPW8uY29udGV4dCYmKHAubm9kZVR5cGV8fHAuanF1ZXJ5KT9yKHApOnIuZXZlbnQscz1yLkRlZmVycmVkKCksdD1yLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1PW8uc3RhdHVzQ29kZXx8e30sdj17fSx3PXt9LHg9ImNhbmNlbGVkIix5PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoayl7aWYoIWgpe2g9e307d2hpbGUoYj1FYi5leGVjKGcpKWhbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9aFthLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGs/ZzpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWsmJihhPXdbYS50b0xvd2VyQ2FzZSgpXT13W2EudG9Mb3dlckNhc2UoKV18fGEsdlthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1rJiYoby5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoayl5LmFsd2F5cyhhW3kuc3RhdHVzXSk7ZWxzZSBmb3IoYiBpbiBhKXVbYl09W3VbYl0sYVtiXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHg7cmV0dXJuIGUmJmUuYWJvcnQoYiksQSgwLGIpLHRoaXN9fTtpZihzLnByb21pc2UoeSksby51cmw9KChifHxvLnVybHx8dGIuaHJlZikrIiIpLnJlcGxhY2UoSGIsdGIucHJvdG9jb2wrIi8vIiksby50eXBlPWMubWV0aG9kfHxjLnR5cGV8fG8ubWV0aG9kfHxvLnR5cGUsby5kYXRhVHlwZXM9KG8uZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8WyIiXSxudWxsPT1vLmNyb3NzRG9tYWluKXtqPWQuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtqLmhyZWY9by51cmwsai5ocmVmPWouaHJlZixvLmNyb3NzRG9tYWluPUxiLnByb3RvY29sKyIvLyIrTGIuaG9zdCE9ai5wcm90b2NvbCsiLy8iK2ouaG9zdH1jYXRjaCh6KXtvLmNyb3NzRG9tYWluPSEwfX1pZihvLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygby5kYXRhJiYoby5kYXRhPXIucGFyYW0oby5kYXRhLG8udHJhZGl0aW9uYWwpKSxOYihJYixvLGMseSksaylyZXR1cm4geTtsPXIuZXZlbnQmJm8uZ2xvYmFsLGwmJjA9PT1yLmFjdGl2ZSsrJiZyLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLG8udHlwZT1vLnR5cGUudG9VcHBlckNhc2UoKSxvLmhhc0NvbnRlbnQ9IUdiLnRlc3Qoby50eXBlKSxmPW8udXJsLnJlcGxhY2UoQ2IsIiIpLG8uaGFzQ29udGVudD9vLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJjA9PT0oby5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoby5kYXRhPW8uZGF0YS5yZXBsYWNlKEJiLCIrIikpOihuPW8udXJsLnNsaWNlKGYubGVuZ3RoKSxvLmRhdGEmJihmKz0odmIudGVzdChmKT8iJiI6Ij8iKStvLmRhdGEsZGVsZXRlIG8uZGF0YSksby5jYWNoZT09PSExJiYoZj1mLnJlcGxhY2UoRGIsIiQxIiksbj0odmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK3ViKysgK24pLG8udXJsPWYrbiksby5pZk1vZGlmaWVkJiYoci5sYXN0TW9kaWZpZWRbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHIubGFzdE1vZGlmaWVkW2ZdKSxyLmV0YWdbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsci5ldGFnW2ZdKSksKG8uZGF0YSYmby5oYXNDb250ZW50JiZvLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsby5jb250ZW50VHlwZSkseS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLG8uZGF0YVR5cGVzWzBdJiZvLmFjY2VwdHNbby5kYXRhVHlwZXNbMF1dP28uYWNjZXB0c1tvLmRhdGFUeXBlc1swXV0rKCIqIiE9PW8uZGF0YVR5cGVzWzBdPyIsICIrS2IrIjsgcT0wLjAxIjoiIik6by5hY2NlcHRzWyIqIl0pO2ZvcihtIGluIG8uaGVhZGVycyl5LnNldFJlcXVlc3RIZWFkZXIobSxvLmhlYWRlcnNbbV0pO2lmKG8uYmVmb3JlU2VuZCYmKG8uYmVmb3JlU2VuZC5jYWxsKHAseSxvKT09PSExfHxrKSlyZXR1cm4geS5hYm9ydCgpO2lmKHg9ImFib3J0Iix0LmFkZChvLmNvbXBsZXRlKSx5LmRvbmUoby5zdWNjZXNzKSx5LmZhaWwoby5lcnJvciksZT1OYihKYixvLGMseSkpe2lmKHkucmVhZHlTdGF0ZT0xLGwmJnEudHJpZ2dlcigiYWpheFNlbmQiLFt5LG9dKSxrKXJldHVybiB5O28uYXN5bmMmJm8udGltZW91dD4wJiYoaT1hLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt5LmFib3J0KCJ0aW1lb3V0Iil9LG8udGltZW91dCkpO3RyeXtrPSExLGUuc2VuZCh2LEEpfWNhdGNoKHope2lmKGspdGhyb3cgejtBKC0xLHopfX1lbHNlIEEoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIEEoYixjLGQsaCl7dmFyIGosbSxuLHYsdyx4PWM7a3x8KGs9ITAsaSYmYS5jbGVhclRpbWVvdXQoaSksZT12b2lkIDAsZz1ofHwiIix5LnJlYWR5U3RhdGU9Yj4wPzQ6MCxqPWI+PTIwMCYmYjwzMDB8fDMwND09PWIsZCYmKHY9UGIobyx5LGQpKSx2PVFiKG8sdix5LGopLGo/KG8uaWZNb2RpZmllZCYmKHc9eS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihyLmxhc3RNb2RpZmllZFtmXT13KSx3PXkuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoci5ldGFnW2ZdPXcpKSwyMDQ9PT1ifHwiSEVBRCI9PT1vLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1iP3g9Im5vdG1vZGlmaWVkIjooeD12LnN0YXRlLG09di5kYXRhLG49di5lcnJvcixqPSFuKSk6KG49eCwhYiYmeHx8KHg9ImVycm9yIixiPDAmJihiPTApKSkseS5zdGF0dXM9Yix5LnN0YXR1c1RleHQ9KGN8fHgpKyIiLGo/cy5yZXNvbHZlV2l0aChwLFttLHgseV0pOnMucmVqZWN0V2l0aChwLFt5LHgsbl0pLHkuc3RhdHVzQ29kZSh1KSx1PXZvaWQgMCxsJiZxLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt5LG8saj9tOm5dKSx0LmZpcmVXaXRoKHAsW3kseF0pLGwmJihxLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3ksb10pLC0tci5hY3RpdmV8fHIuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB5fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gci5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHIuZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLHIuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe3JbYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHIuaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLHIuYWpheChyLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sci5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksci5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gci5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxyLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gdGhpc1swXSYmKHIuaXNGdW5jdGlvbihhKSYmKGE9YS5jYWxsKHRoaXNbMF0pKSxiPXIoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiByLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXIodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9ci5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7cih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxyLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIXIuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LHIuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxyLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319O3ZhciBSYj17MDoyMDAsMTIyMzoyMDR9LFNiPXIuYWpheFNldHRpbmdzLnhocigpO28uY29ycz0hIVNiJiYid2l0aENyZWRlbnRpYWxzImluIFNiLG8uYWpheD1TYj0hIVNiLHIuYWpheFRyYW5zcG9ydChmdW5jdGlvbihiKXt2YXIgYyxkO2lmKG8uY29yc3x8U2ImJiFiLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7dmFyIGcsaD1iLnhocigpO2lmKGgub3BlbihiLnR5cGUsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpLGIueGhyRmllbGRzKWZvcihnIGluIGIueGhyRmllbGRzKWhbZ109Yi54aHJGaWVsZHNbZ107Yi5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYi5taW1lVHlwZSksYi5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihnIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGcsZVtnXSk7Yz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtjJiYoYz1kPWgub25sb2FkPWgub25lcnJvcj1oLm9uYWJvcnQ9aC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09YT9oLmFib3J0KCk6ImVycm9yIj09PWE/Im51bWJlciIhPXR5cGVvZiBoLnN0YXR1cz9mKDAsImVycm9yIik6ZihoLnN0YXR1cyxoLnN0YXR1c1RleHQpOmYoUmJbaC5zdGF0dXNdfHxoLnN0YXR1cyxoLnN0YXR1c1RleHQsInRleHQiIT09KGgucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIGgucmVzcG9uc2VUZXh0P3tiaW5hcnk6aC5yZXNwb25zZX06e3RleHQ6aC5yZXNwb25zZVRleHR9LGguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LGgub25sb2FkPWMoKSxkPWgub25lcnJvcj1jKCJlcnJvciIpLHZvaWQgMCE9PWgub25hYm9ydD9oLm9uYWJvcnQ9ZDpoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1oLnJlYWR5U3RhdGUmJmEuc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmQoKX0pfSxjPWMoImFib3J0Iik7dHJ5e2guc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCl9Y2F0Y2goaSl7aWYoYyl0aHJvdyBpfX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX0pLHIuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXthLmNyb3NzRG9tYWluJiYoYS5jb250ZW50cy5zY3JpcHQ9ITEpfSksci5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ2xvYmFsRXZhbChhKSxhfX19KSxyLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksci5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXtiPXIoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZigiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGQuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgVGI9W10sVWI9Lyg9KVw/KD89JnwkKXxcP1w/LztyLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9VGIucG9wKCl8fHIuZXhwYW5kbysiXyIrdWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLHIuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKFViLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVWIudGVzdChiLmRhdGEpJiYiZGF0YSIpO2lmKGh8fCJqc29ucCI9PT1iLmRhdGFUeXBlc1swXSlyZXR1cm4gZT1iLmpzb25wQ2FsbGJhY2s9ci5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGg/YltoXT1iW2hdLnJlcGxhY2UoVWIsIiQxIitlKTpiLmpzb25wIT09ITEmJihiLnVybCs9KHZiLnRlc3QoYi51cmwpPyImIjoiPyIpK2IuanNvbnArIj0iK2UpLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBnfHxyLmVycm9yKGUrIiB3YXMgbm90IGNhbGxlZCIpLGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIixmPWFbZV0sYVtlXT1mdW5jdGlvbigpe2c9YXJndW1lbnRzfSxkLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWY/cihhKS5yZW1vdmVQcm9wKGUpOmFbZV09ZixiW2VdJiYoYi5qc29ucENhbGxiYWNrPWMuanNvbnBDYWxsYmFjayxUYi5wdXNoKGUpKSxnJiZyLmlzRnVuY3Rpb24oZikmJmYoZ1swXSksZz1mPXZvaWQgMH0pLCJzY3JpcHQifSksby5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1kLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09YS5jaGlsZE5vZGVzLmxlbmd0aH0oKSxyLnBhcnNlSFRNTD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybltdOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSk7dmFyIGUsZixnO3JldHVybiBifHwoby5jcmVhdGVIVE1MRG9jdW1lbnQ/KGI9ZC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLGU9Yi5jcmVhdGVFbGVtZW50KCJiYXNlIiksZS5ocmVmPWQubG9jYXRpb24uaHJlZixiLmhlYWQuYXBwZW5kQ2hpbGQoZSkpOmI9ZCksZj1DLmV4ZWMoYSksZz0hYyYmW10sZj9bYi5jcmVhdGVFbGVtZW50KGZbMV0pXTooZj1xYShbYV0sYixnKSxnJiZnLmxlbmd0aCYmcihnKS5yZW1vdmUoKSxyLm1lcmdlKFtdLGYuY2hpbGROb2RlcykpfSxyLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD4tMSYmKGQ9cGIoYS5zbGljZShoKSksYT1hLnNsaWNlKDAsaCkpLHIuaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmci5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP3IoIjxkaXY+IikuYXBwZW5kKHIucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sci5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtyLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksci5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ3JlcChyLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0sci5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1yLmNzcyhhLCJwb3NpdGlvbiIpLGw9cihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9ci5jc3MoYSwidG9wIiksaT1yLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmKGYraSkuaW5kZXhPZigiYXV0byIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxyLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsci5leHRlbmQoe30saCkpKSxudWxsIT1iLnRvcCYmKG0udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG0ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG0pOmwuY3NzKG0pfX0sci5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3Iub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQsZSxmPXRoaXNbMF07aWYoZilyZXR1cm4gZi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGI9Zi5vd25lckRvY3VtZW50LGM9Yi5kb2N1bWVudEVsZW1lbnQsZT1iLmRlZmF1bHRWaWV3LHt0b3A6ZC50b3ArZS5wYWdlWU9mZnNldC1jLmNsaWVudFRvcCxsZWZ0OmQubGVmdCtlLnBhZ2VYT2Zmc2V0LWMuY2xpZW50TGVmdH0pOnt0b3A6MCxsZWZ0OjB9fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXIuY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLEIoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkPXt0b3A6ZC50b3Arci5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxsZWZ0OmQubGVmdCtyLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKX0pLHt0b3A6Yi50b3AtZC50b3Atci5jc3MoYywibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtZC5sZWZ0LXIuY3NzKGMsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYic3RhdGljIj09PXIuY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8cmF9KX19KSxyLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0icGFnZVlPZmZzZXQiPT09YjtyLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmO3JldHVybiByLmlzV2luZG93KGEpP2Y9YTo5PT09YS5ub2RlVHlwZSYmKGY9YS5kZWZhdWx0Vmlldyksdm9pZCAwPT09ZT9mP2ZbYl06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP2YucGFnZVhPZmZzZXQ6ZSxjP2U6Zi5wYWdlWU9mZnNldCk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgpfX0pLHIuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe3IuY3NzSG9va3NbYl09UGEoby5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7aWYoYylyZXR1cm4gYz1PYShhLGIpLE1hLnRlc3QoYyk/cihhKS5wb3NpdGlvbigpW2JdKyJweCI6Y30pfSksci5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7ci5mbltkXT1mdW5jdGlvbihlLGYpe3ZhciBnPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxoPWN8fChlPT09ITB8fGY9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihiLGMsZSl7dmFyIGY7cmV0dXJuIHIuaXNXaW5kb3coYik/MD09PWQuaW5kZXhPZigib3V0ZXIiKT9iWyJpbm5lciIrYV06Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGY9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGZbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGZbIm9mZnNldCIrYV0sZlsiY2xpZW50IithXSkpOnZvaWQgMD09PWU/ci5jc3MoYixjLGgpOnIuc3R5bGUoYixjLGUsaCl9LGIsZz9lOnZvaWQgMCxnKX19KX0pLHIuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KSxyLmhvbGRSZWFkeT1mdW5jdGlvbihhKXthP3IucmVhZHlXYWl0Kys6ci5yZWFkeSghMCl9LHIuaXNBcnJheT1BcnJheS5pc0FycmF5LHIucGFyc2VKU09OPUpTT04ucGFyc2Usci5ub2RlTmFtZT1CLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIFZiPWEualF1ZXJ5LFdiPWEuJDtyZXR1cm4gci5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1yJiYoYS4kPVdiKSxiJiZhLmpRdWVyeT09PXImJihhLmpRdWVyeT1WYikscn0sYnx8KGEualF1ZXJ5PWEuJD1yKSxyfSk7Cg=="},{"meta":{"name":"sweetalert2.all.min.js","url":"https://cdn.jsdelivr.net/npm/sweetalert2@10.16.6/dist/sweetalert2.all.min.js","ts":1637743449453,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9dHx8c2VsZikuU3dlZXRhbGVydDI9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuKHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBhKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fWZ1bmN0aW9uIHModCxlLG4pe3JldHVybiBlJiZvKHQucHJvdG90eXBlLGUpLG4mJm8odCxuKSx0fWZ1bmN0aW9uIHUoKXtyZXR1cm4odT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbixvPWFyZ3VtZW50c1tlXTtmb3IobiBpbiBvKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLG4pJiYodFtuXT1vW25dKX1yZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBjKHQpe3JldHVybihjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuKGw9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIGQoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4oaT1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlLG4pe3ZhciBvPVtudWxsXTtvLnB1c2guYXBwbHkobyxlKTtvPW5ldyhGdW5jdGlvbi5iaW5kLmFwcGx5KHQsbykpO3JldHVybiBuJiZsKG8sbi5wcm90b3R5cGUpLG99KS5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP2Z1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH0odCk6ZX1mdW5jdGlvbiBmKHQsZSxuKXtyZXR1cm4oZj0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0P1JlZmxlY3QuZ2V0OmZ1bmN0aW9uKHQsZSxuKXt0PWZ1bmN0aW9uKHQsZSl7Zm9yKDshT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJm51bGwhPT0odD1jKHQpKTspO3JldHVybiB0fSh0LGUpO2lmKHQpe2U9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpO3JldHVybiBlLmdldD9lLmdldC5jYWxsKG4pOmUudmFsdWV9fSkodCxlLG58fHQpfWZ1bmN0aW9uIG0odCl7cmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX1mdW5jdGlvbiBoKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KX1mdW5jdGlvbiBnKHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KX1mdW5jdGlvbiB2KHQsZSl7ZT0nIicuY29uY2F0KHQsJyIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFBsZWFzZSB1c2UgIicpLmNvbmNhdChlLCciIGluc3RlYWQuJyksLTE9PT1ZLmluZGV4T2YoZSkmJihZLnB1c2goZSksVyhlKSl9ZnVuY3Rpb24gYih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9Qcm9taXNlfWZ1bmN0aW9uIHkodCl7cmV0dXJuIGIodCk/dC50b1Byb21pc2UoKTpQcm9taXNlLnJlc29sdmUodCl9ZnVuY3Rpb24gdyh0KXtyZXR1cm4gdCYmUHJvbWlzZS5yZXNvbHZlKHQpPT09dH1mdW5jdGlvbiBDKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRWxlbWVudHx8Im9iamVjdCI9PT1yKHQ9dCkmJnQuanF1ZXJ5fWZ1bmN0aW9uIGsoKXtyZXR1cm4gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoJC5jb250YWluZXIpKX1mdW5jdGlvbiBlKHQpe3ZhciBlPWsoKTtyZXR1cm4gZT9lLnF1ZXJ5U2VsZWN0b3IodCk6bnVsbH1mdW5jdGlvbiB0KHQpe3JldHVybiBlKCIuIi5jb25jYXQodCkpfWZ1bmN0aW9uIEEoKXtyZXR1cm4gdCgkLnBvcHVwKX1mdW5jdGlvbiB4KCl7cmV0dXJuIHQoJC5pY29uKX1mdW5jdGlvbiBCKCl7cmV0dXJuIHQoJC50aXRsZSl9ZnVuY3Rpb24gUCgpe3JldHVybiB0KCQuY29udGVudCl9ZnVuY3Rpb24gTygpe3JldHVybiB0KCRbImh0bWwtY29udGFpbmVyIl0pfWZ1bmN0aW9uIEUoKXtyZXR1cm4gdCgkLmltYWdlKX1mdW5jdGlvbiBuKCl7cmV0dXJuIHQoJFsicHJvZ3Jlc3Mtc3RlcHMiXSl9ZnVuY3Rpb24gUygpe3JldHVybiB0KCRbInZhbGlkYXRpb24tbWVzc2FnZSJdKX1mdW5jdGlvbiBUKCl7cmV0dXJuIGUoIi4iLmNvbmNhdCgkLmFjdGlvbnMsIiAuIikuY29uY2F0KCQuY29uZmlybSkpfWZ1bmN0aW9uIEwoKXtyZXR1cm4gZSgiLiIuY29uY2F0KCQuYWN0aW9ucywiIC4iKS5jb25jYXQoJC5kZW55KSl9ZnVuY3Rpb24gRCgpe3JldHVybiBlKCIuIi5jb25jYXQoJC5sb2FkZXIpKX1mdW5jdGlvbiBxKCl7cmV0dXJuIGUoIi4iLmNvbmNhdCgkLmFjdGlvbnMsIiAuIikuY29uY2F0KCQuY2FuY2VsKSl9ZnVuY3Rpb24gaigpe3JldHVybiB0KCQuYWN0aW9ucyl9ZnVuY3Rpb24gTSgpe3JldHVybiB0KCQuaGVhZGVyKX1mdW5jdGlvbiBJKCl7cmV0dXJuIHQoJC5mb290ZXIpfWZ1bmN0aW9uIEgoKXtyZXR1cm4gdCgkWyJ0aW1lci1wcm9ncmVzcy1iYXIiXSl9ZnVuY3Rpb24gVigpe3JldHVybiB0KCQuY2xvc2UpfWZ1bmN0aW9uIFIoKXt2YXIgdD1nKEEoKS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pOm5vdChbdGFiaW5kZXg9IjAiXSknKSkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0PXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKSwoZT1wYXJzZUludChlLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkpPHQ/MTp0PGU/LTE6MH0pLGU9ZyhBKCkucXVlcnlTZWxlY3RvckFsbCgnXG4gIGFbaHJlZl0sXG4gIGFyZWFbaHJlZl0sXG4gIGlucHV0Om5vdChbZGlzYWJsZWRdKSxcbiAgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSxcbiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFxuICBidXR0b246bm90KFtkaXNhYmxlZF0pLFxuICBpZnJhbWUsXG4gIG9iamVjdCxcbiAgZW1iZWQsXG4gIFt0YWJpbmRleD0iMCJdLFxuICBbY29udGVudGVkaXRhYmxlXSxcbiAgYXVkaW9bY29udHJvbHNdLFxuICB2aWRlb1tjb250cm9sc10sXG4gIHN1bW1hcnlcbicpKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIi0xIiE9PXQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspLTE9PT1lLmluZGV4T2YodFtuXSkmJmUucHVzaCh0W25dKTtyZXR1cm4gZX0odC5jb25jYXQoZSkpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gd3QodCl9KX1mdW5jdGlvbiBOKCl7cmV0dXJuIUcoKSYmIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCRbIm5vLWJhY2tkcm9wIl0pfWZ1bmN0aW9uIFUoZSx0KXtlLnRleHRDb250ZW50PSIiLHQmJih0PShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC9odG1sIiksZyh0LnF1ZXJ5U2VsZWN0b3IoImhlYWQiKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYXBwZW5kQ2hpbGQodCl9KSxnKHQucXVlcnlTZWxlY3RvcigiYm9keSIpLmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5hcHBlbmRDaGlsZCh0KX0pKX1mdW5jdGlvbiBGKHQsZSl7aWYoZSl7Zm9yKHZhciBuPWUuc3BsaXQoL1xzKy8pLG89MDtvPG4ubGVuZ3RoO28rKylpZighdC5jbGFzc0xpc3QuY29udGFpbnMobltvXSkpcmV0dXJuO3JldHVybiAxfX1mdW5jdGlvbiBfKHQsZSxuKXt2YXIgbyxpO2lmKGk9ZSxnKChvPXQpLmNsYXNzTGlzdCkuZm9yRWFjaChmdW5jdGlvbih0KXstMT09PWgoJCkuaW5kZXhPZih0KSYmLTE9PT1oKFgpLmluZGV4T2YodCkmJi0xPT09aChpLnNob3dDbGFzcykuaW5kZXhPZih0KSYmby5jbGFzc0xpc3QucmVtb3ZlKHQpfSksZS5jdXN0b21DbGFzcyYmZS5jdXN0b21DbGFzc1tuXSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmN1c3RvbUNsYXNzW25dJiYhZS5jdXN0b21DbGFzc1tuXS5mb3JFYWNoKXJldHVybiBXKCJJbnZhbGlkIHR5cGUgb2YgY3VzdG9tQ2xhc3MuIi5jb25jYXQobiwnISBFeHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUgb2JqZWN0LCBnb3QgIicpLmNvbmNhdChyKGUuY3VzdG9tQ2xhc3Nbbl0pLCciJykpO3Z0KHQsZS5jdXN0b21DbGFzc1tuXSl9fXZhciB6PSJTd2VldEFsZXJ0MjoiLFc9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCIiLmNvbmNhdCh6LCIgIikuY29uY2F0KCJvYmplY3QiPT09cih0KT90LmpvaW4oIiAiKTp0KSl9LEs9ZnVuY3Rpb24odCl7Y29uc29sZS5lcnJvcigiIi5jb25jYXQoeiwiICIpLmNvbmNhdCh0KSl9LFk9W10sWj1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90KCk6dH0sUT1PYmplY3QuZnJlZXplKHtjYW5jZWw6ImNhbmNlbCIsYmFja2Ryb3A6ImJhY2tkcm9wIixjbG9zZToiY2xvc2UiLGVzYzoiZXNjIix0aW1lcjoidGltZXIifSksSj1mdW5jdGlvbih0KXt2YXIgZSxuPXt9O2ZvcihlIGluIHQpblt0W2VdXT0ic3dhbDItIit0W2VdO3JldHVybiBufSwkPUooWyJjb250YWluZXIiLCJzaG93biIsImhlaWdodC1hdXRvIiwiaW9zZml4IiwicG9wdXAiLCJtb2RhbCIsIm5vLWJhY2tkcm9wIiwibm8tdHJhbnNpdGlvbiIsInRvYXN0IiwidG9hc3Qtc2hvd24iLCJzaG93IiwiaGlkZSIsImNsb3NlIiwidGl0bGUiLCJoZWFkZXIiLCJjb250ZW50IiwiaHRtbC1jb250YWluZXIiLCJhY3Rpb25zIiwiY29uZmlybSIsImRlbnkiLCJjYW5jZWwiLCJmb290ZXIiLCJpY29uIiwiaWNvbi1jb250ZW50IiwiaW1hZ2UiLCJpbnB1dCIsImZpbGUiLCJyYW5nZSIsInNlbGVjdCIsInJhZGlvIiwiY2hlY2tib3giLCJsYWJlbCIsInRleHRhcmVhIiwiaW5wdXRlcnJvciIsImlucHV0LWxhYmVsIiwidmFsaWRhdGlvbi1tZXNzYWdlIiwicHJvZ3Jlc3Mtc3RlcHMiLCJhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCIsInByb2dyZXNzLXN0ZXAiLCJwcm9ncmVzcy1zdGVwLWxpbmUiLCJsb2FkZXIiLCJsb2FkaW5nIiwic3R5bGVkIiwidG9wIiwidG9wLXN0YXJ0IiwidG9wLWVuZCIsInRvcC1sZWZ0IiwidG9wLXJpZ2h0IiwiY2VudGVyIiwiY2VudGVyLXN0YXJ0IiwiY2VudGVyLWVuZCIsImNlbnRlci1sZWZ0IiwiY2VudGVyLXJpZ2h0IiwiYm90dG9tIiwiYm90dG9tLXN0YXJ0IiwiYm90dG9tLWVuZCIsImJvdHRvbS1sZWZ0IiwiYm90dG9tLXJpZ2h0IiwiZ3Jvdy1yb3ciLCJncm93LWNvbHVtbiIsImdyb3ctZnVsbHNjcmVlbiIsInJ0bCIsInRpbWVyLXByb2dyZXNzLWJhciIsInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXIiLCJzY3JvbGxiYXItbWVhc3VyZSIsImljb24tc3VjY2VzcyIsImljb24td2FybmluZyIsImljb24taW5mbyIsImljb24tcXVlc3Rpb24iLCJpY29uLWVycm9yIl0pLFg9SihbInN1Y2Nlc3MiLCJ3YXJuaW5nIiwiaW5mbyIsInF1ZXN0aW9uIiwiZXJyb3IiXSksRz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygkWyJ0b2FzdC1zaG93biJdKX0sdHQ9e3ByZXZpb3VzQm9keVBhZGRpbmc6bnVsbH07ZnVuY3Rpb24gZXQodCxlKXtpZighZSlyZXR1cm4gbnVsbDtzd2l0Y2goZSl7Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmNhc2UiZmlsZSI6cmV0dXJuIHl0KHQsJFtlXSk7Y2FzZSJjaGVja2JveCI6cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KCQuY2hlY2tib3gsIiBpbnB1dCIpKTtjYXNlInJhZGlvIjpyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoJC5yYWRpbywiIGlucHV0OmNoZWNrZWQiKSl8fHQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KCQucmFkaW8sIiBpbnB1dDpmaXJzdC1jaGlsZCIpKTtjYXNlInJhbmdlIjpyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoJC5yYW5nZSwiIGlucHV0IikpO2RlZmF1bHQ6cmV0dXJuIHl0KHQsJC5pbnB1dCl9fWZ1bmN0aW9uIG50KHQpe3ZhciBlO3QuZm9jdXMoKSwiZmlsZSIhPT10LnR5cGUmJihlPXQudmFsdWUsdC52YWx1ZT0iIix0LnZhbHVlPWUpfWZ1bmN0aW9uIG90KHQsZSxuKXt0JiZlJiYoZT0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pOmUpLmZvckVhY2goZnVuY3Rpb24oZSl7dC5mb3JFYWNoP3QuZm9yRWFjaChmdW5jdGlvbih0KXtuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KTpuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KX1mdW5jdGlvbiBpdCh0LGUsbil7KG49bj09PSIiLmNvbmNhdChwYXJzZUludChuKSk/cGFyc2VJbnQobik6bil8fDA9PT1wYXJzZUludChuKT90LnN0eWxlW2VdPSJudW1iZXIiPT10eXBlb2Ygbj8iIi5jb25jYXQobiwicHgiKTpuOnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoZSl9ZnVuY3Rpb24gcnQodCl7dC5zdHlsZS5kaXNwbGF5PTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiZmxleCJ9ZnVuY3Rpb24gYXQodCl7dC5zdHlsZS5kaXNwbGF5PSJub25lIn1mdW5jdGlvbiBzdCh0LGUsbixvKXsoZT10LnF1ZXJ5U2VsZWN0b3IoZSkpJiYoZS5zdHlsZVtuXT1vKX1mdW5jdGlvbiB1dCh0LGUsbil7ZT9ydCh0LG4pOmF0KHQpfWZ1bmN0aW9uIGN0KHQpe3JldHVybiEhKHQuc2Nyb2xsSGVpZ2h0PnQuY2xpZW50SGVpZ2h0KX1mdW5jdGlvbiBsdCh0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KSx0PXBhcnNlRmxvYXQoZS5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tZHVyYXRpb24iKXx8IjAiKSxlPXBhcnNlRmxvYXQoZS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIil8fCIwIik7cmV0dXJuIDA8dHx8MDxlfWZ1bmN0aW9uIGR0KHQpe3ZhciBlPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbj1IKCk7d3QobikmJihlJiYobi5zdHlsZS50cmFuc2l0aW9uPSJub25lIixuLnN0eWxlLndpZHRoPSIxMDAlIiksc2V0VGltZW91dChmdW5jdGlvbigpe24uc3R5bGUudHJhbnNpdGlvbj0id2lkdGggIi5jb25jYXQodC8xZTMsInMgbGluZWFyIiksbi5zdHlsZS53aWR0aD0iMCUifSwxMCkpfWZ1bmN0aW9uIHB0KCl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnR9ZnVuY3Rpb24gZnQodCl7TW4uaXNWaXNpYmxlKCkmJmd0IT09dC50YXJnZXQudmFsdWUmJk1uLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxndD10LnRhcmdldC52YWx1ZX1mdW5jdGlvbiBtdCh0LGUpe3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD9lLmFwcGVuZENoaWxkKHQpOiJvYmplY3QiPT09cih0KT9BdCh0LGUpOnQmJlUoZSx0KX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPWooKSxvPUQoKSxpPVQoKSxyPUwoKSxhPXEoKTtlLnNob3dDb25maXJtQnV0dG9ufHxlLnNob3dEZW55QnV0dG9ufHxlLnNob3dDYW5jZWxCdXR0b258fGF0KG4pLF8obixlLCJhY3Rpb25zIiksUHQoaSwiY29uZmlybSIsZSksUHQociwiZGVueSIsZSksUHQoYSwiY2FuY2VsIixlKSxmdW5jdGlvbih0LGUsbixvKXtpZighby5idXR0b25zU3R5bGluZylyZXR1cm4gYnQoW3QsZSxuXSwkLnN0eWxlZCk7dnQoW3QsZSxuXSwkLnN0eWxlZCksby5jb25maXJtQnV0dG9uQ29sb3ImJih0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmNvbmZpcm1CdXR0b25Db2xvcik7by5kZW55QnV0dG9uQ29sb3ImJihlLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmRlbnlCdXR0b25Db2xvcik7by5jYW5jZWxCdXR0b25Db2xvciYmKG4uc3R5bGUuYmFja2dyb3VuZENvbG9yPW8uY2FuY2VsQnV0dG9uQ29sb3IpfShpLHIsYSxlKSxlLnJldmVyc2VCdXR0b25zJiYobi5pbnNlcnRCZWZvcmUoYSxvKSxuLmluc2VydEJlZm9yZShyLG8pLG4uaW5zZXJ0QmVmb3JlKGksbykpLFUobyxlLmxvYWRlckh0bWwpLF8obyxlLCJsb2FkZXIiKX12YXIgZ3QsdnQ9ZnVuY3Rpb24odCxlKXtvdCh0LGUsITApfSxidD1mdW5jdGlvbih0LGUpe290KHQsZSwhMSl9LHl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNoaWxkTm9kZXMubGVuZ3RoO24rKylpZihGKHQuY2hpbGROb2Rlc1tuXSxlKSlyZXR1cm4gdC5jaGlsZE5vZGVzW25dfSx3dD1mdW5jdGlvbih0KXtyZXR1cm4hKCF0fHwhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSl9LEN0PSdcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT0iJy5jb25jYXQoJC50aXRsZSwnIiBhcmlhLWRlc2NyaWJlZGJ5PSInKS5jb25jYXQoJC5jb250ZW50LCciIGNsYXNzPSInKS5jb25jYXQoJC5wb3B1cCwnIiB0YWJpbmRleD0iLTEiPlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQuaGVhZGVyLCciPlxuICAgICA8dWwgY2xhc3M9IicpLmNvbmNhdCgkWyJwcm9ncmVzcy1zdGVwcyJdLCciPjwvdWw+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkLmljb24sJyI+PC9kaXY+XG4gICAgIDxpbWcgY2xhc3M9IicpLmNvbmNhdCgkLmltYWdlLCciIC8+XG4gICAgIDxoMiBjbGFzcz0iJykuY29uY2F0KCQudGl0bGUsJyIgaWQ9IicpLmNvbmNhdCgkLnRpdGxlLCciPjwvaDI+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJykuY29uY2F0KCQuY2xvc2UsJyI+PC9idXR0b24+XG4gICA8L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkLmNvbnRlbnQsJyI+XG4gICAgIDxkaXYgaWQ9IicpLmNvbmNhdCgkLmNvbnRlbnQsJyIgY2xhc3M9IicpLmNvbmNhdCgkWyJodG1sLWNvbnRhaW5lciJdLCciPjwvZGl2PlxuICAgICA8aW5wdXQgY2xhc3M9IicpLmNvbmNhdCgkLmlucHV0LCciIC8+XG4gICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBjbGFzcz0iJykuY29uY2F0KCQuZmlsZSwnIiAvPlxuICAgICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoJC5yYW5nZSwnIj5cbiAgICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIC8+XG4gICAgICAgPG91dHB1dD48L291dHB1dD5cbiAgICAgPC9kaXY+XG4gICAgIDxzZWxlY3QgY2xhc3M9IicpLmNvbmNhdCgkLnNlbGVjdCwnIj48L3NlbGVjdD5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQucmFkaW8sJyI+PC9kaXY+XG4gICAgIDxsYWJlbCBmb3I9IicpLmNvbmNhdCgkLmNoZWNrYm94LCciIGNsYXNzPSInKS5jb25jYXQoJC5jaGVja2JveCwnIj5cbiAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+XG4gICAgICAgPHNwYW4gY2xhc3M9IicpLmNvbmNhdCgkLmxhYmVsLCciPjwvc3Bhbj5cbiAgICAgPC9sYWJlbD5cbiAgICAgPHRleHRhcmVhIGNsYXNzPSInKS5jb25jYXQoJC50ZXh0YXJlYSwnIj48L3RleHRhcmVhPlxuICAgICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoJFsidmFsaWRhdGlvbi1tZXNzYWdlIl0sJyIgaWQ9IicpLmNvbmNhdCgkWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSwnIj48L2Rpdj5cbiAgIDwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQuYWN0aW9ucywnIj5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQubG9hZGVyLCciPjwvZGl2PlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicpLmNvbmNhdCgkLmNvbmZpcm0sJyI+PC9idXR0b24+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJykuY29uY2F0KCQuZGVueSwnIj48L2J1dHRvbj5cbiAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInKS5jb25jYXQoJC5jYW5jZWwsJyI+PC9idXR0b24+XG4gICA8L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkLmZvb3RlciwnIj48L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkWyJ0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyIl0sJyI+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkWyJ0aW1lci1wcm9ncmVzcy1iYXIiXSwnIj48L2Rpdj5cbiAgIDwvZGl2PlxuIDwvZGl2PlxuJykucmVwbGFjZSgvKF58XG4pXHMqL2csIiIpLGt0PWZ1bmN0aW9uKHQpe3ZhciBlLG4sbyxpLHIsYT0hIShpPWsoKSkmJihpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSksYnQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxbJFsibm8tYmFja2Ryb3AiXSwkWyJ0b2FzdC1zaG93biJdLCRbImhhcy1jb2x1bW4iXV0pLCEwKTtwdCgpP0soIlN3ZWV0QWxlcnQyIHJlcXVpcmVzIGRvY3VtZW50IHRvIGluaXRpYWxpemUiKTooKHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmNsYXNzTmFtZT0kLmNvbnRhaW5lcixhJiZ2dChyLCRbIm5vLXRyYW5zaXRpb24iXSksVShyLEN0KSwoaT0ic3RyaW5nIj09dHlwZW9mKGU9dC50YXJnZXQpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6ZSkuYXBwZW5kQ2hpbGQociksYT10LChlPUEoKSkuc2V0QXR0cmlidXRlKCJyb2xlIixhLnRvYXN0PyJhbGVydCI6ImRpYWxvZyIpLGUuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLGEudG9hc3Q/InBvbGl0ZSI6ImFzc2VydGl2ZSIpLGEudG9hc3R8fGUuc2V0QXR0cmlidXRlKCJhcmlhLW1vZGFsIiwidHJ1ZSIpLHI9aSwicnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHIpLmRpcmVjdGlvbiYmdnQoaygpLCQucnRsKSx0PVAoKSxhPXl0KHQsJC5pbnB1dCksZT15dCh0LCQuZmlsZSksbj10LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdCgkLnJhbmdlLCIgaW5wdXQiKSksbz10LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdCgkLnJhbmdlLCIgb3V0cHV0IikpLGk9eXQodCwkLnNlbGVjdCkscj10LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdCgkLmNoZWNrYm94LCIgaW5wdXQiKSksdD15dCh0LCQudGV4dGFyZWEpLGEub25pbnB1dD1mdCxlLm9uY2hhbmdlPWZ0LGkub25jaGFuZ2U9ZnQsci5vbmNoYW5nZT1mdCx0Lm9uaW5wdXQ9ZnQsbi5vbmlucHV0PWZ1bmN0aW9uKHQpe2Z0KHQpLG8udmFsdWU9bi52YWx1ZX0sbi5vbmNoYW5nZT1mdW5jdGlvbih0KXtmdCh0KSxuLm5leHRTaWJsaW5nLnZhbHVlPW4udmFsdWV9KX0sQXQ9ZnVuY3Rpb24odCxlKXt0LmpxdWVyeT94dChlLHQpOlUoZSx0LnRvU3RyaW5nKCkpfSx4dD1mdW5jdGlvbih0LGUpe2lmKHQudGV4dENvbnRlbnQ9IiIsMCBpbiBlKWZvcih2YXIgbj0wO24gaW4gZTtuKyspdC5hcHBlbmRDaGlsZChlW25dLmNsb25lTm9kZSghMCkpO2Vsc2UgdC5hcHBlbmRDaGlsZChlLmNsb25lTm9kZSghMCkpfSxCdD1mdW5jdGlvbigpe2lmKHB0KCkpcmV0dXJuITE7dmFyIHQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXtXZWJraXRBbmltYXRpb246IndlYmtpdEFuaW1hdGlvbkVuZCIsT0FuaW1hdGlvbjoib0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kIixhbmltYXRpb246ImFuaW1hdGlvbmVuZCJ9O2Zvcih0IGluIG4paWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sdCkmJnZvaWQgMCE9PWUuc3R5bGVbdF0pcmV0dXJuIG5bdF07cmV0dXJuITF9KCk7ZnVuY3Rpb24gUHQodCxlLG4pe3V0KHQsblsic2hvdyIuY29uY2F0KG0oZSksIkJ1dHRvbiIpXSwiaW5saW5lLWJsb2NrIiksVSh0LG5bIiIuY29uY2F0KGUsIkJ1dHRvblRleHQiKV0pLHQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixuWyIiLmNvbmNhdChlLCJCdXR0b25BcmlhTGFiZWwiKV0pLHQuY2xhc3NOYW1lPSRbZV0sXyh0LG4sIiIuY29uY2F0KGUsIkJ1dHRvbiIpKSx2dCh0LG5bIiIuY29uY2F0KGUsIkJ1dHRvbkNsYXNzIildKX1mdW5jdGlvbiBPdCh0LGUpe3ZhciBuLG8saT1rKCk7aSYmKG89aSwic3RyaW5nIj09dHlwZW9mKG49ZS5iYWNrZHJvcCk/by5zdHlsZS5iYWNrZ3JvdW5kPW46bnx8dnQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSwkWyJuby1iYWNrZHJvcCJdKSwhZS5iYWNrZHJvcCYmZS5hbGxvd091dHNpZGVDbGljayYmVygnImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpLG89aSwobj1lLnBvc2l0aW9uKWluICQ/dnQobywkW25dKTooVygnVGhlICJwb3NpdGlvbiIgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiY2VudGVyIicpLHZ0KG8sJC5jZW50ZXIpKSxuPWksIShvPWUuZ3Jvdyl8fCJzdHJpbmciIT10eXBlb2Ygb3x8KG89Imdyb3ctIi5jb25jYXQobykpaW4gJCYmdnQobiwkW29dKSxfKGksZSwiY29udGFpbmVyIiksKGU9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtc3dhbDItcXVldWUtc3RlcCIpKSYmKGkuc2V0QXR0cmlidXRlKCJkYXRhLXF1ZXVlLXN0ZXAiLGUpLGRvY3VtZW50LmJvZHkucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAiKSkpfWZ1bmN0aW9uIEV0KHQsZSl7dC5wbGFjZWhvbGRlciYmIWUuaW5wdXRQbGFjZWhvbGRlcnx8KHQucGxhY2Vob2xkZXI9ZS5pbnB1dFBsYWNlaG9sZGVyKX1mdW5jdGlvbiBTdCh0LGUsbil7dmFyIG8saTtuLmlucHV0TGFiZWwmJih0LmlkPSQuaW5wdXQsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLGk9JFsiaW5wdXQtbGFiZWwiXSxvLnNldEF0dHJpYnV0ZSgiZm9yIix0LmlkKSxvLmNsYXNzTmFtZT1pLHZ0KG8sbi5jdXN0b21DbGFzcy5pbnB1dExhYmVsKSxvLmlubmVyVGV4dD1uLmlucHV0TGFiZWwsZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWJlZ2luIixvKSl9dmFyIFR0PXtwcm9taXNlOm5ldyBXZWFrTWFwLGlubmVyUGFyYW1zOm5ldyBXZWFrTWFwLGRvbUNhY2hlOm5ldyBXZWFrTWFwfSxMdD1bImlucHV0IiwiZmlsZSIsInJhbmdlIiwic2VsZWN0IiwicmFkaW8iLCJjaGVja2JveCIsInRleHRhcmVhIl0sRHQ9ZnVuY3Rpb24odCl7aWYoIUl0W3QuaW5wdXRdKXJldHVybiBLKCdVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXQhIEV4cGVjdGVkICJ0ZXh0IiwgImVtYWlsIiwgInBhc3N3b3JkIiwgIm51bWJlciIsICJ0ZWwiLCAic2VsZWN0IiwgInJhZGlvIiwgImNoZWNrYm94IiwgInRleHRhcmVhIiwgImZpbGUiIG9yICJ1cmwiLCBnb3QgIicuY29uY2F0KHQuaW5wdXQsJyInKSk7dmFyIGU9TXQodC5pbnB1dCksbj1JdFt0LmlucHV0XShlLHQpO3J0KG4pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtudChuKX0pfSxxdD1mdW5jdGlvbih0LGUpe3ZhciBuPWV0KFAoKSx0KTtpZihuKWZvcih2YXIgbyBpbiFmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXt2YXIgbj10LmF0dHJpYnV0ZXNbZV0ubmFtZTstMT09PVsidHlwZSIsInZhbHVlIiwic3R5bGUiXS5pbmRleE9mKG4pJiZ0LnJlbW92ZUF0dHJpYnV0ZShuKX19KG4pLGUpInJhbmdlIj09PXQmJiJwbGFjZWhvbGRlciI9PT1vfHxuLnNldEF0dHJpYnV0ZShvLGVbb10pfSxqdD1mdW5jdGlvbih0KXt2YXIgZT1NdCh0LmlucHV0KTt0LmN1c3RvbUNsYXNzJiZ2dChlLHQuY3VzdG9tQ2xhc3MuaW5wdXQpfSxNdD1mdW5jdGlvbih0KXt0PSRbdF18fCQuaW5wdXQ7cmV0dXJuIHl0KFAoKSx0KX0sSXQ9e307SXQudGV4dD1JdC5lbWFpbD1JdC5wYXNzd29yZD1JdC5udW1iZXI9SXQudGVsPUl0LnVybD1mdW5jdGlvbih0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZS5pbnB1dFZhbHVlfHwibnVtYmVyIj09dHlwZW9mIGUuaW5wdXRWYWx1ZT90LnZhbHVlPWUuaW5wdXRWYWx1ZTp3KGUuaW5wdXRWYWx1ZSl8fFcoJ1VuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCAic3RyaW5nIiwgIm51bWJlciIgb3IgIlByb21pc2UiLCBnb3QgIicuY29uY2F0KHIoZS5pbnB1dFZhbHVlKSwnIicpKSxTdCh0LHQsZSksRXQodCxlKSx0LnR5cGU9ZS5pbnB1dCx0fSxJdC5maWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN0KHQsdCxlKSxFdCh0LGUpLHR9LEl0LnJhbmdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpLG89dC5xdWVyeVNlbGVjdG9yKCJvdXRwdXQiKTtyZXR1cm4gbi52YWx1ZT1lLmlucHV0VmFsdWUsbi50eXBlPWUuaW5wdXQsby52YWx1ZT1lLmlucHV0VmFsdWUsU3Qobix0LGUpLHR9LEl0LnNlbGVjdD1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiB0LnRleHRDb250ZW50PSIiLGUuaW5wdXRQbGFjZWhvbGRlciYmKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIiksVShuLGUuaW5wdXRQbGFjZWhvbGRlciksbi52YWx1ZT0iIixuLmRpc2FibGVkPSEwLG4uc2VsZWN0ZWQ9ITAsdC5hcHBlbmRDaGlsZChuKSksU3QodCx0LGUpLHR9LEl0LnJhZGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRleHRDb250ZW50PSIiLHR9LEl0LmNoZWNrYm94PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZXQoUCgpLCJjaGVja2JveCIpO24udmFsdWU9MSxuLmlkPSQuY2hlY2tib3gsbi5jaGVja2VkPUJvb2xlYW4oZS5pbnB1dFZhbHVlKTtuPXQucXVlcnlTZWxlY3Rvcigic3BhbiIpO3JldHVybiBVKG4sZS5pbnB1dFBsYWNlaG9sZGVyKSx0fSxJdC50ZXh0YXJlYT1mdW5jdGlvbihlLHQpe2UudmFsdWU9dC5pbnB1dFZhbHVlLEV0KGUsdCksU3QoZSxlLHQpO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLnBhZGRpbmdMZWZ0KStwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5wYWRkaW5nUmlnaHQpfXZhciBvO3JldHVybiJNdXRhdGlvbk9ic2VydmVyImluIHdpbmRvdyYmKG89cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoQSgpKS53aWR0aCksbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt2YXIgdD1lLm9mZnNldFdpZHRoK24oQSgpKStuKFAoKSk7QSgpLnN0eWxlLndpZHRoPW88dD8iIi5jb25jYXQodCwicHgiKTpudWxsfSkub2JzZXJ2ZShlLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbInN0eWxlIl19KSksZX07ZnVuY3Rpb24gSHQodCxlKXt2YXIgbyxpLHIsbj1PKCk7XyhuLGUsImh0bWxDb250YWluZXIiKSxlLmh0bWw/KG10KGUuaHRtbCxuKSxydChuLCJibG9jayIpKTplLnRleHQ/KG4udGV4dENvbnRlbnQ9ZS50ZXh0LHJ0KG4sImJsb2NrIikpOmF0KG4pLHQ9dCxvPWUsaT1QKCksdD1UdC5pbm5lclBhcmFtcy5nZXQodCkscj0hdHx8by5pbnB1dCE9PXQuaW5wdXQsTHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT0kW3RdLG49eXQoaSxlKTtxdCh0LG8uaW5wdXRBdHRyaWJ1dGVzKSxuLmNsYXNzTmFtZT1lLHImJmF0KG4pfSksby5pbnB1dCYmKHImJkR0KG8pLGp0KG8pKSxfKFAoKSxlLCJjb250ZW50Iil9ZnVuY3Rpb24gVnQoKXtyZXR1cm4gaygpJiZrKCkuZ2V0QXR0cmlidXRlKCJkYXRhLXF1ZXVlLXN0ZXAiKX1mdW5jdGlvbiBSdCh0LG8pe3ZhciBpPW4oKTtpZighby5wcm9ncmVzc1N0ZXBzfHwwPT09by5wcm9ncmVzc1N0ZXBzLmxlbmd0aClyZXR1cm4gYXQoaSksMDtydChpKSxpLnRleHRDb250ZW50PSIiO3ZhciByPXBhcnNlSW50KHZvaWQgMD09PW8uY3VycmVudFByb2dyZXNzU3RlcD9WdCgpOm8uY3VycmVudFByb2dyZXNzU3RlcCk7cj49by5wcm9ncmVzc1N0ZXBzLmxlbmd0aCYmVygiSW52YWxpZCBjdXJyZW50UHJvZ3Jlc3NTdGVwIHBhcmFtZXRlciwgaXQgc2hvdWxkIGJlIGxlc3MgdGhhbiBwcm9ncmVzc1N0ZXBzLmxlbmd0aCAoY3VycmVudFByb2dyZXNzU3RlcCBsaWtlIEpTIGFycmF5cyBzdGFydHMgZnJvbSAwKSIpLG8ucHJvZ3Jlc3NTdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG4sdD0obj10LHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSx2dCh0LCRbInByb2dyZXNzLXN0ZXAiXSksVSh0LG4pLHQpO2kuYXBwZW5kQ2hpbGQodCksZT09PXImJnZ0KHQsJFsiYWN0aXZlLXByb2dyZXNzLXN0ZXAiXSksZSE9PW8ucHJvZ3Jlc3NTdGVwcy5sZW5ndGgtMSYmKHQ9byxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIiksdnQoZSwkWyJwcm9ncmVzcy1zdGVwLWxpbmUiXSksdC5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UmJihlLnN0eWxlLndpZHRoPXQucHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlKSxpLmFwcGVuZENoaWxkKGUpKX0pfWZ1bmN0aW9uIE50KHQsZSl7dmFyIG4sbz1NKCk7XyhvLGUsImhlYWRlciIpLFJ0KDAsZSksbj10LG89ZSx0PVR0LmlubmVyUGFyYW1zLmdldChuKSxuPXgoKSx0JiZvLmljb249PT10Lmljb24/KFd0KG4sbyksX3QobixvKSk6by5pY29ufHxvLmljb25IdG1sP28uaWNvbiYmLTE9PT1PYmplY3Qua2V5cyhYKS5pbmRleE9mKG8uaWNvbik/KEsoJ1Vua25vd24gaWNvbiEgRXhwZWN0ZWQgInN1Y2Nlc3MiLCAiZXJyb3IiLCAid2FybmluZyIsICJpbmZvIiBvciAicXVlc3Rpb24iLCBnb3QgIicuY29uY2F0KG8uaWNvbiwnIicpKSxhdChuKSk6KHJ0KG4pLFd0KG4sbyksX3QobixvKSx2dChuLG8uc2hvd0NsYXNzLmljb24pKTphdChuKSxmdW5jdGlvbih0KXt2YXIgZT1FKCk7aWYoIXQuaW1hZ2VVcmwpcmV0dXJuIGF0KGUpO3J0KGUsIiIpLGUuc2V0QXR0cmlidXRlKCJzcmMiLHQuaW1hZ2VVcmwpLGUuc2V0QXR0cmlidXRlKCJhbHQiLHQuaW1hZ2VBbHQpLGl0KGUsIndpZHRoIix0LmltYWdlV2lkdGgpLGl0KGUsImhlaWdodCIsdC5pbWFnZUhlaWdodCksZS5jbGFzc05hbWU9JC5pbWFnZSxfKGUsdCwiaW1hZ2UiKX0oZSksbz1lLG49QigpLHV0KG4sby50aXRsZXx8by50aXRsZVRleHQsImJsb2NrIiksby50aXRsZSYmbXQoby50aXRsZSxuKSxvLnRpdGxlVGV4dCYmKG4uaW5uZXJUZXh0PW8udGl0bGVUZXh0KSxfKG4sbywidGl0bGUiKSxvPWUsZT1WKCksVShlLG8uY2xvc2VCdXR0b25IdG1sKSxfKGUsbywiY2xvc2VCdXR0b24iKSx1dChlLG8uc2hvd0Nsb3NlQnV0dG9uKSxlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsby5jbG9zZUJ1dHRvbkFyaWFMYWJlbCl9ZnVuY3Rpb24gVXQodCxlKXt2YXIgbixvLGk7aT1lLG49aygpLG89QSgpLGkudG9hc3Q/KGl0KG4sIndpZHRoIixpLndpZHRoKSxvLnN0eWxlLndpZHRoPSIxMDAlIik6aXQobywid2lkdGgiLGkud2lkdGgpLGl0KG8sInBhZGRpbmciLGkucGFkZGluZyksaS5iYWNrZ3JvdW5kJiYoby5zdHlsZS5iYWNrZ3JvdW5kPWkuYmFja2dyb3VuZCksYXQoUygpKSxRdChvLGkpLE90KDAsZSksTnQodCxlKSxIdCh0LGUpLGh0KDAsZSksaT1lLHQ9SSgpLHV0KHQsaS5mb290ZXIpLGkuZm9vdGVyJiZtdChpLmZvb3Rlcix0KSxfKHQsaSwiZm9vdGVyIiksImZ1bmN0aW9uIj09dHlwZW9mIGUuZGlkUmVuZGVyP2UuZGlkUmVuZGVyKEEoKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGUub25SZW5kZXImJmUub25SZW5kZXIoQSgpKX1mdW5jdGlvbiBGdCgpe3JldHVybiBUKCkmJlQoKS5jbGljaygpfXZhciBfdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBYKWUuaWNvbiE9PW4mJmJ0KHQsWFtuXSk7dnQodCxYW2UuaWNvbl0pLEt0KHQsZSksenQoKSxfKHQsZSwiaWNvbiIpfSx6dD1mdW5jdGlvbigpe2Zvcih2YXIgdD1BKCksZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIiksbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIltjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXSwgLnN3YWwyLXN1Y2Nlc3MtZml4Iiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uc3R5bGUuYmFja2dyb3VuZENvbG9yPWV9LFd0PWZ1bmN0aW9uKHQsZSl7dC50ZXh0Q29udGVudD0iIixlLmljb25IdG1sP1UodCxZdChlLmljb25IdG1sKSk6InN1Y2Nlc3MiPT09ZS5pY29uP1UodCwnXG4gICAgICA8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLXRpcCI+PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLWxvbmciPjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtcmluZyI+PC9kaXY+IDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtZml4Ij48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodCI+PC9kaXY+XG4gICAgJyk6ImVycm9yIj09PWUuaWNvbj9VKHQsJ1xuICAgICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyayI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1sZWZ0Ij48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1yaWdodCI+PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICcpOlUodCxZdCh7cXVlc3Rpb246Ij8iLHdhcm5pbmc6IiEiLGluZm86ImkifVtlLmljb25dKSl9LEt0PWZ1bmN0aW9uKHQsZSl7aWYoZS5pY29uQ29sb3Ipe3Quc3R5bGUuY29sb3I9ZS5pY29uQ29sb3IsdC5zdHlsZS5ib3JkZXJDb2xvcj1lLmljb25Db2xvcjtmb3IodmFyIG49MCxvPVsiLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiLCIuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmciLCIuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCIsIi5zd2FsMi14LW1hcmstbGluZS1yaWdodCJdO248by5sZW5ndGg7bisrKXN0KHQsb1tuXSwiYmFja2dyb3VuZENvbG9yIixlLmljb25Db2xvcik7c3QodCwiLnN3YWwyLXN1Y2Nlc3MtcmluZyIsImJvcmRlckNvbG9yIixlLmljb25Db2xvcil9fSxZdD1mdW5jdGlvbih0KXtyZXR1cm4nPGRpdiBjbGFzcz0iJy5jb25jYXQoJFsiaWNvbi1jb250ZW50Il0sJyI+JykuY29uY2F0KHQsIjwvZGl2PiIpfSxadD1bXSxRdD1mdW5jdGlvbih0LGUpe3QuY2xhc3NOYW1lPSIiLmNvbmNhdCgkLnBvcHVwLCIgIikuY29uY2F0KHd0KHQpP2Uuc2hvd0NsYXNzLnBvcHVwOiIiKSxlLnRvYXN0Pyh2dChbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLCRbInRvYXN0LXNob3duIl0pLHZ0KHQsJC50b2FzdCkpOnZ0KHQsJC5tb2RhbCksXyh0LGUsInBvcHVwIiksInN0cmluZyI9PXR5cGVvZiBlLmN1c3RvbUNsYXNzJiZ2dCh0LGUuY3VzdG9tQ2xhc3MpLGUuaWNvbiYmdnQodCwkWyJpY29uLSIuY29uY2F0KGUuaWNvbildKX07ZnVuY3Rpb24gSnQodCl7KGU9QSgpKXx8TW4uZmlyZSgpO3ZhciBlPUEoKSxuPWooKSxvPUQoKTshdCYmd3QoVCgpKSYmKHQ9VCgpKSxydChuKSx0JiYoYXQodCksby5zZXRBdHRyaWJ1dGUoImRhdGEtYnV0dG9uLXRvLXJlcGxhY2UiLHQuY2xhc3NOYW1lKSksby5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvLHQpLHZ0KFtlLG5dLCQubG9hZGluZykscnQobyksZS5zZXRBdHRyaWJ1dGUoImRhdGEtbG9hZGluZyIsITApLGUuc2V0QXR0cmlidXRlKCJhcmlhLWJ1c3kiLCEwKSxlLmZvY3VzKCl9ZnVuY3Rpb24gJHQobyl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQpe2lmKCFvKXJldHVybiB0KCk7dmFyIGU9d2luZG93LnNjcm9sbFgsbj13aW5kb3cuc2Nyb2xsWTt0ZS5yZXN0b3JlRm9jdXNUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0ZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQmJnRlLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cz8odGUucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCksdGUucHJldmlvdXNBY3RpdmVFbGVtZW50PW51bGwpOmRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuZm9jdXMoKSx0KCl9LDEwMCksdm9pZCAwIT09ZSYmdm9pZCAwIT09biYmd2luZG93LnNjcm9sbFRvKGUsbil9KX1mdW5jdGlvbiBYdCgpe2lmKHRlLnRpbWVvdXQpcmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9SCgpLGU9cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodCkud2lkdGgpO3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKSx0LnN0eWxlLndpZHRoPSIxMDAlIjt2YXIgbj1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS53aWR0aCksbj1wYXJzZUludChlL24qMTAwKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2l0aW9uIiksdC5zdHlsZS53aWR0aD0iIi5jb25jYXQobiwiJSIpfSgpLHRlLnRpbWVvdXQuc3RvcCgpfWZ1bmN0aW9uIEd0KCl7aWYodGUudGltZW91dCl7dmFyIHQ9dGUudGltZW91dC5zdGFydCgpO3JldHVybiBkdCh0KSx0fX12YXIgdGU9e30sZWU9ITEsbmU9e307ZnVuY3Rpb24gb2UodCl7Zm9yKHZhciBlPXQudGFyZ2V0O2UmJmUhPT1kb2N1bWVudDtlPWUucGFyZW50Tm9kZSlmb3IodmFyIG4gaW4gbmUpe3ZhciBvPWUuZ2V0QXR0cmlidXRlKG4pO2lmKG8pcmV0dXJuIHZvaWQgbmVbbl0uZmlyZSh7dGVtcGxhdGU6b30pfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlLHQpfWZ1bmN0aW9uIHJlKHQpe3JldHVybiBjZVt0XX1mdW5jdGlvbiBhZSh0KXtmb3IodmFyIGUgaW4gdClpZShuPWUpfHxXKCdVbmtub3duIHBhcmFtZXRlciAiJy5jb25jYXQobiwnIicpKSx0LnRvYXN0JiYobj1lLC0xIT09bGUuaW5kZXhPZihuKSYmVygnVGhlIHBhcmFtZXRlciAiJy5jb25jYXQobiwnIiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHMnKSkpLHJlKGU9ZSkmJnYoZSxyZShlKSk7dmFyIG59dmFyIHNlPXt0aXRsZToiIix0aXRsZVRleHQ6IiIsdGV4dDoiIixodG1sOiIiLGZvb3RlcjoiIixpY29uOnZvaWQgMCxpY29uQ29sb3I6dm9pZCAwLGljb25IdG1sOnZvaWQgMCx0ZW1wbGF0ZTp2b2lkIDAsdG9hc3Q6ITEsYW5pbWF0aW9uOiEwLHNob3dDbGFzczp7cG9wdXA6InN3YWwyLXNob3ciLGJhY2tkcm9wOiJzd2FsMi1iYWNrZHJvcC1zaG93IixpY29uOiJzd2FsMi1pY29uLXNob3cifSxoaWRlQ2xhc3M6e3BvcHVwOiJzd2FsMi1oaWRlIixiYWNrZHJvcDoic3dhbDItYmFja2Ryb3AtaGlkZSIsaWNvbjoic3dhbDItaWNvbi1oaWRlIn0sY3VzdG9tQ2xhc3M6e30sdGFyZ2V0OiJib2R5IixiYWNrZHJvcDohMCxoZWlnaHRBdXRvOiEwLGFsbG93T3V0c2lkZUNsaWNrOiEwLGFsbG93RXNjYXBlS2V5OiEwLGFsbG93RW50ZXJLZXk6ITAsc3RvcEtleWRvd25Qcm9wYWdhdGlvbjohMCxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiExLHNob3dDb25maXJtQnV0dG9uOiEwLHNob3dEZW55QnV0dG9uOiExLHNob3dDYW5jZWxCdXR0b246ITEscHJlQ29uZmlybTp2b2lkIDAscHJlRGVueTp2b2lkIDAsY29uZmlybUJ1dHRvblRleHQ6Ik9LIixjb25maXJtQnV0dG9uQXJpYUxhYmVsOiIiLGNvbmZpcm1CdXR0b25Db2xvcjp2b2lkIDAsZGVueUJ1dHRvblRleHQ6Ik5vIixkZW55QnV0dG9uQXJpYUxhYmVsOiIiLGRlbnlCdXR0b25Db2xvcjp2b2lkIDAsY2FuY2VsQnV0dG9uVGV4dDoiQ2FuY2VsIixjYW5jZWxCdXR0b25BcmlhTGFiZWw6IiIsY2FuY2VsQnV0dG9uQ29sb3I6dm9pZCAwLGJ1dHRvbnNTdHlsaW5nOiEwLHJldmVyc2VCdXR0b25zOiExLGZvY3VzQ29uZmlybTohMCxmb2N1c0Rlbnk6ITEsZm9jdXNDYW5jZWw6ITEscmV0dXJuRm9jdXM6ITAsc2hvd0Nsb3NlQnV0dG9uOiExLGNsb3NlQnV0dG9uSHRtbDoiJnRpbWVzOyIsY2xvc2VCdXR0b25BcmlhTGFiZWw6IkNsb3NlIHRoaXMgZGlhbG9nIixsb2FkZXJIdG1sOiIiLHNob3dMb2FkZXJPbkNvbmZpcm06ITEsc2hvd0xvYWRlck9uRGVueTohMSxpbWFnZVVybDp2b2lkIDAsaW1hZ2VXaWR0aDp2b2lkIDAsaW1hZ2VIZWlnaHQ6dm9pZCAwLGltYWdlQWx0OiIiLHRpbWVyOnZvaWQgMCx0aW1lclByb2dyZXNzQmFyOiExLHdpZHRoOnZvaWQgMCxwYWRkaW5nOnZvaWQgMCxiYWNrZ3JvdW5kOnZvaWQgMCxpbnB1dDp2b2lkIDAsaW5wdXRQbGFjZWhvbGRlcjoiIixpbnB1dExhYmVsOiIiLGlucHV0VmFsdWU6IiIsaW5wdXRPcHRpb25zOnt9LGlucHV0QXV0b1RyaW06ITAsaW5wdXRBdHRyaWJ1dGVzOnt9LGlucHV0VmFsaWRhdG9yOnZvaWQgMCxyZXR1cm5JbnB1dFZhbHVlT25EZW55OiExLHZhbGlkYXRpb25NZXNzYWdlOnZvaWQgMCxncm93OiExLHBvc2l0aW9uOiJjZW50ZXIiLHByb2dyZXNzU3RlcHM6W10sY3VycmVudFByb2dyZXNzU3RlcDp2b2lkIDAscHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlOnZvaWQgMCxvbkJlZm9yZU9wZW46dm9pZCAwLG9uT3Blbjp2b2lkIDAsd2lsbE9wZW46dm9pZCAwLGRpZE9wZW46dm9pZCAwLG9uUmVuZGVyOnZvaWQgMCxkaWRSZW5kZXI6dm9pZCAwLG9uQ2xvc2U6dm9pZCAwLG9uQWZ0ZXJDbG9zZTp2b2lkIDAsd2lsbENsb3NlOnZvaWQgMCxkaWRDbG9zZTp2b2lkIDAsb25EZXN0cm95OnZvaWQgMCxkaWREZXN0cm95OnZvaWQgMCxzY3JvbGxiYXJQYWRkaW5nOiEwfSx1ZT1bImFsbG93RXNjYXBlS2V5IiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJiYWNrZ3JvdW5kIiwiYnV0dG9uc1N0eWxpbmciLCJjYW5jZWxCdXR0b25BcmlhTGFiZWwiLCJjYW5jZWxCdXR0b25Db2xvciIsImNhbmNlbEJ1dHRvblRleHQiLCJjbG9zZUJ1dHRvbkFyaWFMYWJlbCIsImNsb3NlQnV0dG9uSHRtbCIsImNvbmZpcm1CdXR0b25BcmlhTGFiZWwiLCJjb25maXJtQnV0dG9uQ29sb3IiLCJjb25maXJtQnV0dG9uVGV4dCIsImN1cnJlbnRQcm9ncmVzc1N0ZXAiLCJjdXN0b21DbGFzcyIsImRlbnlCdXR0b25BcmlhTGFiZWwiLCJkZW55QnV0dG9uQ29sb3IiLCJkZW55QnV0dG9uVGV4dCIsImRpZENsb3NlIiwiZGlkRGVzdHJveSIsImZvb3RlciIsImhpZGVDbGFzcyIsImh0bWwiLCJpY29uIiwiaWNvbkNvbG9yIiwiaWNvbkh0bWwiLCJpbWFnZUFsdCIsImltYWdlSGVpZ2h0IiwiaW1hZ2VVcmwiLCJpbWFnZVdpZHRoIiwib25BZnRlckNsb3NlIiwib25DbG9zZSIsIm9uRGVzdHJveSIsInByb2dyZXNzU3RlcHMiLCJyZXR1cm5Gb2N1cyIsInJldmVyc2VCdXR0b25zIiwic2hvd0NhbmNlbEJ1dHRvbiIsInNob3dDbG9zZUJ1dHRvbiIsInNob3dDb25maXJtQnV0dG9uIiwic2hvd0RlbnlCdXR0b24iLCJ0ZXh0IiwidGl0bGUiLCJ0aXRsZVRleHQiLCJ3aWxsQ2xvc2UiXSxjZT17YW5pbWF0aW9uOidzaG93Q2xhc3MiIGFuZCAiaGlkZUNsYXNzJyxvbkJlZm9yZU9wZW46IndpbGxPcGVuIixvbk9wZW46ImRpZE9wZW4iLG9uUmVuZGVyOiJkaWRSZW5kZXIiLG9uQ2xvc2U6IndpbGxDbG9zZSIsb25BZnRlckNsb3NlOiJkaWRDbG9zZSIsb25EZXN0cm95OiJkaWREZXN0cm95In0sbGU9WyJhbGxvd091dHNpZGVDbGljayIsImFsbG93RW50ZXJLZXkiLCJiYWNrZHJvcCIsImZvY3VzQ29uZmlybSIsImZvY3VzRGVueSIsImZvY3VzQ2FuY2VsIiwicmV0dXJuRm9jdXMiLCJoZWlnaHRBdXRvIiwia2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSJdLGRlPU9iamVjdC5mcmVlemUoe2lzVmFsaWRQYXJhbWV0ZXI6aWUsaXNVcGRhdGFibGVQYXJhbWV0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuLTEhPT11ZS5pbmRleE9mKHQpfSxpc0RlcHJlY2F0ZWRQYXJhbWV0ZXI6cmUsYXJnc1RvUGFyYW1zOmZ1bmN0aW9uKG4pe3ZhciBvPXt9O3JldHVybiJvYmplY3QiIT09cihuWzBdKXx8QyhuWzBdKT9bInRpdGxlIiwiaHRtbCIsImljb24iXS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ZT1uW2VdOyJzdHJpbmciPT10eXBlb2YgZXx8QyhlKT9vW3RdPWU6dm9pZCAwIT09ZSYmSygiVW5leHBlY3RlZCB0eXBlIG9mICIuY29uY2F0KHQsJyEgRXhwZWN0ZWQgInN0cmluZyIgb3IgIkVsZW1lbnQiLCBnb3QgJykuY29uY2F0KHIoZSkpKX0pOnUobyxuWzBdKSxvfSxpc1Zpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4gd3QoQSgpKX0sY2xpY2tDb25maXJtOkZ0LGNsaWNrRGVueTpmdW5jdGlvbigpe3JldHVybiBMKCkmJkwoKS5jbGljaygpfSxjbGlja0NhbmNlbDpmdW5jdGlvbigpe3JldHVybiBxKCkmJnEoKS5jbGljaygpfSxnZXRDb250YWluZXI6ayxnZXRQb3B1cDpBLGdldFRpdGxlOkIsZ2V0Q29udGVudDpQLGdldEh0bWxDb250YWluZXI6TyxnZXRJbWFnZTpFLGdldEljb246eCxnZXRJbnB1dExhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuIHQoJFsiaW5wdXQtbGFiZWwiXSl9LGdldENsb3NlQnV0dG9uOlYsZ2V0QWN0aW9uczpqLGdldENvbmZpcm1CdXR0b246VCxnZXREZW55QnV0dG9uOkwsZ2V0Q2FuY2VsQnV0dG9uOnEsZ2V0TG9hZGVyOkQsZ2V0SGVhZGVyOk0sZ2V0Rm9vdGVyOkksZ2V0VGltZXJQcm9ncmVzc0JhcjpILGdldEZvY3VzYWJsZUVsZW1lbnRzOlIsZ2V0VmFsaWRhdGlvbk1lc3NhZ2U6Uyxpc0xvYWRpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gQSgpLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIil9LGZpcmU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gaSh0aGlzLGUpfSxtaXhpbjpmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJmwodCxlKX0oaSx0KTt2YXIgbixvLGU9KG49aSxvPWQoKSxmdW5jdGlvbigpe3ZhciB0LGU9YyhuKTtyZXR1cm4gcCh0aGlzLG8/KHQ9Yyh0aGlzKS5jb25zdHJ1Y3RvcixSZWZsZWN0LmNvbnN0cnVjdChlLGFyZ3VtZW50cyx0KSk6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSk7ZnVuY3Rpb24gaSgpe3JldHVybiBhKHRoaXMsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHMoaSxbe2tleToiX21haW4iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGYoYyhpLnByb3RvdHlwZSksIl9tYWluIix0aGlzKS5jYWxsKHRoaXMsdCx1KHt9LHIsZSkpfX1dKSxpfSh0aGlzKX0scXVldWU6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcztadD10O2Z1bmN0aW9uIGEodCxlKXtadD1bXSx0KGUpfXZhciBzPVtdO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpKXshZnVuY3Rpb24gZShuLG8pe248WnQubGVuZ3RoPyhkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgiZGF0YS1zd2FsMi1xdWV1ZS1zdGVwIixuKSxyLmZpcmUoWnRbbl0pLnRoZW4oZnVuY3Rpb24odCl7dm9pZCAwIT09dC52YWx1ZT8ocy5wdXNoKHQudmFsdWUpLGUobisxLG8pKTphKGkse2Rpc21pc3M6dC5kaXNtaXNzfSl9KSk6YShpLHt2YWx1ZTpzfSl9KDApfSl9LGdldFF1ZXVlU3RlcDpWdCxpbnNlcnRRdWV1ZVN0ZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSYmZTxadC5sZW5ndGg/WnQuc3BsaWNlKGUsMCx0KTpadC5wdXNoKHQpfSxkZWxldGVRdWV1ZVN0ZXA6ZnVuY3Rpb24odCl7dm9pZCAwIT09WnRbdF0mJlp0LnNwbGljZSh0LDEpfSxzaG93TG9hZGluZzpKdCxlbmFibGVMb2FkaW5nOkp0LGdldFRpbWVyTGVmdDpmdW5jdGlvbigpe3JldHVybiB0ZS50aW1lb3V0JiZ0ZS50aW1lb3V0LmdldFRpbWVyTGVmdCgpfSxzdG9wVGltZXI6WHQscmVzdW1lVGltZXI6R3QsdG9nZ2xlVGltZXI6ZnVuY3Rpb24oKXt2YXIgdD10ZS50aW1lb3V0O3JldHVybiB0JiYodC5ydW5uaW5nP1h0Okd0KSgpfSxpbmNyZWFzZVRpbWVyOmZ1bmN0aW9uKHQpe2lmKHRlLnRpbWVvdXQpe3Q9dGUudGltZW91dC5pbmNyZWFzZSh0KTtyZXR1cm4gZHQodCwhMCksdH19LGlzVGltZXJSdW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRlLnRpbWVvdXQmJnRlLnRpbWVvdXQuaXNSdW5uaW5nKCl9LGJpbmRDbGlja0hhbmRsZXI6ZnVuY3Rpb24oKXtuZVswPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ImRhdGEtc3dhbC10ZW1wbGF0ZSJdPXRoaXMsZWV8fChkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixvZSksZWU9ITApfX0pO2Z1bmN0aW9uIHBlKCl7dmFyIHQsZTtUdC5pbm5lclBhcmFtcy5nZXQodGhpcykmJih0PVR0LmRvbUNhY2hlLmdldCh0aGlzKSxhdCh0LmxvYWRlciksKGU9dC5wb3B1cC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQubG9hZGVyLmdldEF0dHJpYnV0ZSgiZGF0YS1idXR0b24tdG8tcmVwbGFjZSIpKSkubGVuZ3RoP3J0KGVbMF0sImlubGluZS1ibG9jayIpOnd0KFQoKSl8fHd0KEwoKSl8fHd0KHEoKSl8fGF0KHQuYWN0aW9ucyksYnQoW3QucG9wdXAsdC5hY3Rpb25zXSwkLmxvYWRpbmcpLHQucG9wdXAucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWJ1c3kiKSx0LnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiksdC5jb25maXJtQnV0dG9uLmRpc2FibGVkPSExLHQuZGVueUJ1dHRvbi5kaXNhYmxlZD0hMSx0LmNhbmNlbEJ1dHRvbi5kaXNhYmxlZD0hMSl9ZnVuY3Rpb24gZmUoKXtudWxsPT09dHQucHJldmlvdXNCb2R5UGFkZGluZyYmZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0JiYodHQucHJldmlvdXNCb2R5UGFkZGluZz1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLXJpZ2h0IikpLGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PSIiLmNvbmNhdCh0dC5wcmV2aW91c0JvZHlQYWRkaW5nK2Z1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc05hbWU9JFsic2Nyb2xsYmFyLW1lYXN1cmUiXSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxlfSgpLCJweCIpKX1mdW5jdGlvbiBtZSgpe3JldHVybiEhd2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0JiYhIWRvY3VtZW50LmRvY3VtZW50TW9kZX1mdW5jdGlvbiBoZSgpe3ZhciB0PWsoKSxlPUEoKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJhbGlnbi1pdGVtcyIpLGUub2Zmc2V0VG9wPDAmJih0LnN0eWxlLmFsaWduSXRlbXM9ImZsZXgtc3RhcnQiKX12YXIgZ2U9ZnVuY3Rpb24oKXtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oQ3JpT1N8RnhpT1N8RWRnaU9TfFlhQnJvd3NlcnxVQ0Jyb3dzZXIpL2kpfHxBKCkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodC00NCYmKGsoKS5zdHlsZS5wYWRkaW5nQm90dG9tPSIiLmNvbmNhdCg0NCwicHgiKSl9LHZlPWZ1bmN0aW9uKCl7dmFyIGUsdD1rKCk7dC5vbnRvdWNoc3RhcnQ9ZnVuY3Rpb24odCl7ZT1iZSh0KX0sdC5vbnRvdWNobW92ZT1mdW5jdGlvbih0KXtlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfX0sYmU9ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQsbj1rKCk7cmV0dXJuIXllKHQpJiYhd2UodCkmJihlPT09bnx8IShjdChuKXx8IklOUFVUIj09PWUudGFnTmFtZXx8Y3QoUCgpKSYmUCgpLmNvbnRhaW5zKGUpKSl9LHllPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvdWNoZXMmJnQudG91Y2hlcy5sZW5ndGgmJiJzdHlsdXMiPT09dC50b3VjaGVzWzBdLnRvdWNoVHlwZX0sd2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG91Y2hlcyYmMTx0LnRvdWNoZXMubGVuZ3RofSxDZT17c3dhbFByb21pc2VSZXNvbHZlOm5ldyBXZWFrTWFwfTtmdW5jdGlvbiBrZSh0LGUsbixvKXtHKCk/RWUodCxvKTooJHQobikudGhlbihmdW5jdGlvbigpe3JldHVybiBFZSh0LG8pfSksdGUua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0ZS5rZXlkb3duSGFuZGxlcix7Y2FwdHVyZTp0ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksdGUua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksZS5wYXJlbnROb2RlJiYhZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtc3dhbDItcXVldWUtc3RlcCIpJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksTigpJiYobnVsbCE9PXR0LnByZXZpb3VzQm9keVBhZGRpbmcmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD0iIi5jb25jYXQodHQucHJldmlvdXNCb2R5UGFkZGluZywicHgiKSx0dC5wcmV2aW91c0JvZHlQYWRkaW5nPW51bGwpLEYoZG9jdW1lbnQuYm9keSwkLmlvc2ZpeCkmJihlPXBhcnNlSW50KGRvY3VtZW50LmJvZHkuc3R5bGUudG9wLDEwKSxidChkb2N1bWVudC5ib2R5LCQuaW9zZml4KSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD0tMSplKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmbWUoKSYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsaGUpLGcoZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih0KXt0Lmhhc0F0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpPyh0LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLHQuZ2V0QXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpOnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSkpLGJ0KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sWyQuc2hvd24sJFsiaGVpZ2h0LWF1dG8iXSwkWyJuby1iYWNrZHJvcCJdLCRbInRvYXN0LXNob3duIl1dKX1mdW5jdGlvbiBBZSh0KXt2YXIgZSxuLG8saT1BKCk7aSYmKHQ9eGUodCksKGU9VHQuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpKSYmIUYoaSxlLmhpZGVDbGFzcy5wb3B1cCkmJihuPUNlLnN3YWxQcm9taXNlUmVzb2x2ZS5nZXQodGhpcyksYnQoaSxlLnNob3dDbGFzcy5wb3B1cCksdnQoaSxlLmhpZGVDbGFzcy5wb3B1cCksbz1rKCksYnQobyxlLnNob3dDbGFzcy5iYWNrZHJvcCksdnQobyxlLmhpZGVDbGFzcy5iYWNrZHJvcCksQmUodGhpcyxpLGUpLG4odCkpKX1mdW5jdGlvbiB4ZSh0KXtyZXR1cm4gdm9pZCAwPT09dD97aXNDb25maXJtZWQ6ITEsaXNEZW5pZWQ6ITEsaXNEaXNtaXNzZWQ6ITB9OnUoe2lzQ29uZmlybWVkOiExLGlzRGVuaWVkOiExLGlzRGlzbWlzc2VkOiExfSx0KX1mdW5jdGlvbiBCZSh0LGUsbil7dmFyIG89aygpLGk9QnQmJmx0KGUpLHI9bi5vbkNsb3NlLGE9bi5vbkFmdGVyQ2xvc2Uscz1uLndpbGxDbG9zZSx1PW4uZGlkQ2xvc2U7UGUoZSxzLHIpLGk/T2UodCxlLG8sbi5yZXR1cm5Gb2N1cyx1fHxhKTprZSh0LG8sbi5yZXR1cm5Gb2N1cyx1fHxhKX12YXIgUGU9ZnVuY3Rpb24odCxlLG4pe251bGwhPT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgZT9lKHQpOm51bGwhPT1uJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih0KX0sT2U9ZnVuY3Rpb24odCxlLG4sbyxpKXt0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2s9a2UuYmluZChudWxsLHQsbixvLGkpLGUuYWRkRXZlbnRMaXN0ZW5lcihCdCxmdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJih0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKSxkZWxldGUgdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKX0pfSxFZT1mdW5jdGlvbih0LGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgpLHQuX2Rlc3Ryb3koKX0pfTtmdW5jdGlvbiBTZSh0LGUsbil7dmFyIG89VHQuZG9tQ2FjaGUuZ2V0KHQpO2UuZm9yRWFjaChmdW5jdGlvbih0KXtvW3RdLmRpc2FibGVkPW59KX1mdW5jdGlvbiBUZSh0LGUpe2lmKCF0KXJldHVybiExO2lmKCJyYWRpbyI9PT10LnR5cGUpZm9yKHZhciBuPXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0Iiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uZGlzYWJsZWQ9ZTtlbHNlIHQuZGlzYWJsZWQ9ZX12YXIgTGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSl7YSh0aGlzLG4pLHRoaXMuY2FsbGJhY2s9dCx0aGlzLnJlbWFpbmluZz1lLHRoaXMucnVubmluZz0hMSx0aGlzLnN0YXJ0KCl9cmV0dXJuIHMobixbe2tleToic3RhcnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZ3x8KHRoaXMucnVubmluZz0hMCx0aGlzLnN0YXJ0ZWQ9bmV3IERhdGUsdGhpcy5pZD1zZXRUaW1lb3V0KHRoaXMuY2FsbGJhY2ssdGhpcy5yZW1haW5pbmcpKSx0aGlzLnJlbWFpbmluZ319LHtrZXk6InN0b3AiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMucnVubmluZz0hMSxjbGVhclRpbWVvdXQodGhpcy5pZCksdGhpcy5yZW1haW5pbmctPW5ldyBEYXRlLXRoaXMuc3RhcnRlZCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJpbmNyZWFzZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ydW5uaW5nO3JldHVybiBlJiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9dCxlJiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJnZXRUaW1lckxlZnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMuc3RvcCgpLHRoaXMuc3RhcnQoKSksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJpc1J1bm5pbmciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZ319XSksbn0oKSxEZT17ZW1haWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4vXlthLXpBLVowLTkuK18tXStAW2EtekEtWjAtOS4tXStcLlthLXpBLVowLTktXXsyLDI0fSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fCJJbnZhbGlkIGVtYWlsIGFkZHJlc3MiKX0sdXJsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuL15odHRwcz86XC9cLyh3d3dcLik/Wy1hLXpBLVowLTlAOiUuXyt+Iz1dezEsMjU2fVwuW2Etel17Miw2M31cYihbLWEtekEtWjAtOUA6JV8rLn4jPyYvPV0qKSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fCJJbnZhbGlkIFVSTCIpfX07ZnVuY3Rpb24gcWUodCl7dmFyIGUsbjsoZT10KS5pbnB1dFZhbGlkYXRvcnx8T2JqZWN0LmtleXMoRGUpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5pbnB1dD09PXQmJihlLmlucHV0VmFsaWRhdG9yPURlW3RdKX0pLHQuc2hvd0xvYWRlck9uQ29uZmlybSYmIXQucHJlQ29uZmlybSYmVygic2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXG5zaG93TG9hZGVyT25Db25maXJtIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggcHJlQ29uZmlybSwgc2VlIHVzYWdlIGV4YW1wbGU6XG5odHRwczovL3N3ZWV0YWxlcnQyLmdpdGh1Yi5pby8jYWpheC1yZXF1ZXN0IiksdC5hbmltYXRpb249Wih0LmFuaW1hdGlvbiksKG49dCkudGFyZ2V0JiYoInN0cmluZyIhPXR5cGVvZiBuLnRhcmdldHx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuLnRhcmdldCkpJiYoInN0cmluZyI9PXR5cGVvZiBuLnRhcmdldHx8bi50YXJnZXQuYXBwZW5kQ2hpbGQpfHwoVygnVGFyZ2V0IHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImJvZHkiJyksbi50YXJnZXQ9ImJvZHkiKSwic3RyaW5nIj09dHlwZW9mIHQudGl0bGUmJih0LnRpdGxlPXQudGl0bGUuc3BsaXQoIlxuIikuam9pbigiPGJyIC8+IikpLGt0KHQpfWZ1bmN0aW9uIGplKHQpe3ZhciBlPWsoKSxuPUEoKTsiZnVuY3Rpb24iPT10eXBlb2YgdC53aWxsT3Blbj90LndpbGxPcGVuKG4pOiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uQmVmb3JlT3BlbiYmdC5vbkJlZm9yZU9wZW4obik7dmFyIG89d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkub3ZlcmZsb3dZO0plKGUsbix0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WmUoZSxuKX0sMTApLE4oKSYmKFFlKGUsdC5zY3JvbGxiYXJQYWRkaW5nLG8pLGcoZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih0KXt0PT09aygpfHxmdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnRhaW5zKXJldHVybiB0LmNvbnRhaW5zKGUpfSh0LGsoKSl8fCh0Lmhhc0F0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSYmdC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4iLHQuZ2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIikpfSkpLEcoKXx8dGUucHJldmlvdXNBY3RpdmVFbGVtZW50fHwodGUucHJldmlvdXNBY3RpdmVFbGVtZW50PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLFllKG4sdCksYnQoZSwkWyJuby10cmFuc2l0aW9uIl0pfWZ1bmN0aW9uIE1lKHQpe3ZhciBlPUEoKTt0LnRhcmdldD09PWUmJih0PWsoKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoQnQsTWUpLHQuc3R5bGUub3ZlcmZsb3dZPSJhdXRvIil9ZnVuY3Rpb24gSWUodCxlKXt0LmNsb3NlUG9wdXAoe2lzQ29uZmlybWVkOiEwLHZhbHVlOmV9KX1mdW5jdGlvbiBIZSh0LGUsbil7dmFyIG89UigpO2lmKG8ubGVuZ3RoKXJldHVybihlKz1uKT09PW8ubGVuZ3RoP2U9MDotMT09PWUmJihlPW8ubGVuZ3RoLTEpLG9bZV0uZm9jdXMoKTtBKCkuZm9jdXMoKX12YXIgVmU9WyJzd2FsLXRpdGxlIiwic3dhbC1odG1sIiwic3dhbC1mb290ZXIiXSxSZT1mdW5jdGlvbih0KXt2YXIgbj17fTtyZXR1cm4gZyh0LnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtcGFyYW0iKSkuZm9yRWFjaChmdW5jdGlvbih0KXtLZSh0LFsibmFtZSIsInZhbHVlIl0pO3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJuYW1lIiksdD10LmdldEF0dHJpYnV0ZSgidmFsdWUiKTsiYm9vbGVhbiI9PXR5cGVvZiBzZVtlXSYmImZhbHNlIj09PXQmJih0PSExKSwib2JqZWN0Ij09PXIoc2VbZV0pJiYodD1KU09OLnBhcnNlKHQpKSxuW2VdPXR9KSxufSxOZT1mdW5jdGlvbih0KXt2YXIgbj17fTtyZXR1cm4gZyh0LnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtYnV0dG9uIikpLmZvckVhY2goZnVuY3Rpb24odCl7S2UodCxbInR5cGUiLCJjb2xvciIsImFyaWEtbGFiZWwiXSk7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInR5cGUiKTtuWyIiLmNvbmNhdChlLCJCdXR0b25UZXh0IildPXQuaW5uZXJIVE1MLG5bInNob3ciLmNvbmNhdChtKGUpLCJCdXR0b24iKV09ITAsdC5oYXNBdHRyaWJ1dGUoImNvbG9yIikmJihuWyIiLmNvbmNhdChlLCJCdXR0b25Db2xvciIpXT10LmdldEF0dHJpYnV0ZSgiY29sb3IiKSksdC5oYXNBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKSYmKG5bIiIuY29uY2F0KGUsIkJ1dHRvbkFyaWFMYWJlbCIpXT10LmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpKX0pLG59LFVlPWZ1bmN0aW9uKHQpe3ZhciBlPXt9LHQ9dC5xdWVyeVNlbGVjdG9yKCJzd2FsLWltYWdlIik7cmV0dXJuIHQmJihLZSh0LFsic3JjIiwid2lkdGgiLCJoZWlnaHQiLCJhbHQiXSksdC5oYXNBdHRyaWJ1dGUoInNyYyIpJiYoZS5pbWFnZVVybD10LmdldEF0dHJpYnV0ZSgic3JjIikpLHQuaGFzQXR0cmlidXRlKCJ3aWR0aCIpJiYoZS5pbWFnZVdpZHRoPXQuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpKSx0Lmhhc0F0dHJpYnV0ZSgiaGVpZ2h0IikmJihlLmltYWdlSGVpZ2h0PXQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSksdC5oYXNBdHRyaWJ1dGUoImFsdCIpJiYoZS5pbWFnZUFsdD10LmdldEF0dHJpYnV0ZSgiYWx0IikpKSxlfSxGZT1mdW5jdGlvbih0KXt2YXIgZT17fSx0PXQucXVlcnlTZWxlY3Rvcigic3dhbC1pY29uIik7cmV0dXJuIHQmJihLZSh0LFsidHlwZSIsImNvbG9yIl0pLHQuaGFzQXR0cmlidXRlKCJ0eXBlIikmJihlLmljb249dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSksdC5oYXNBdHRyaWJ1dGUoImNvbG9yIikmJihlLmljb25Db2xvcj10LmdldEF0dHJpYnV0ZSgiY29sb3IiKSksZS5pY29uSHRtbD10LmlubmVySFRNTCksZX0sX2U9ZnVuY3Rpb24odCl7dmFyIG49e30sZT10LnF1ZXJ5U2VsZWN0b3IoInN3YWwtaW5wdXQiKTtlJiYoS2UoZSxbInR5cGUiLCJsYWJlbCIsInBsYWNlaG9sZGVyIiwidmFsdWUiXSksbi5pbnB1dD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpfHwidGV4dCIsZS5oYXNBdHRyaWJ1dGUoImxhYmVsIikmJihuLmlucHV0TGFiZWw9ZS5nZXRBdHRyaWJ1dGUoImxhYmVsIikpLGUuaGFzQXR0cmlidXRlKCJwbGFjZWhvbGRlciIpJiYobi5pbnB1dFBsYWNlaG9sZGVyPWUuZ2V0QXR0cmlidXRlKCJwbGFjZWhvbGRlciIpKSxlLmhhc0F0dHJpYnV0ZSgidmFsdWUiKSYmKG4uaW5wdXRWYWx1ZT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKSkpO3Q9dC5xdWVyeVNlbGVjdG9yQWxsKCJzd2FsLWlucHV0LW9wdGlvbiIpO3JldHVybiB0Lmxlbmd0aCYmKG4uaW5wdXRPcHRpb25zPXt9LGcodCkuZm9yRWFjaChmdW5jdGlvbih0KXtLZSh0LFsidmFsdWUiXSk7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInZhbHVlIiksdD10LmlubmVySFRNTDtuLmlucHV0T3B0aW9uc1tlXT10fSkpLG59LHplPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz17fTtmb3IobiBpbiBlKXt2YXIgaT1lW25dLHI9dC5xdWVyeVNlbGVjdG9yKGkpO3ImJihLZShyLFtdKSxvW2kucmVwbGFjZSgvXnN3YWwtLywiIildPXIuaW5uZXJIVE1MLnRyaW0oKSl9cmV0dXJuIG99LFdlPWZ1bmN0aW9uKGUpe3ZhciBuPVZlLmNvbmNhdChbInN3YWwtcGFyYW0iLCJzd2FsLWJ1dHRvbiIsInN3YWwtaW1hZ2UiLCJzd2FsLWljb24iLCJzd2FsLWlucHV0Iiwic3dhbC1pbnB1dC1vcHRpb24iXSk7ZyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSkuZm9yRWFjaChmdW5jdGlvbih0KXt0LnBhcmVudE5vZGU9PT1lJiYodD10LnRhZ05hbWUudG9Mb3dlckNhc2UoKSwtMT09PW4uaW5kZXhPZih0KSYmVygiVW5yZWNvZ25pemVkIGVsZW1lbnQgPCIuY29uY2F0KHQsIj4iKSkpfSl9LEtlPWZ1bmN0aW9uKGUsbil7ZyhlLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24odCl7LTE9PT1uLmluZGV4T2YodC5uYW1lKSYmVyhbJ1VucmVjb2duaXplZCBhdHRyaWJ1dGUgIicuY29uY2F0KHQubmFtZSwnIiBvbiA8JykuY29uY2F0KGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpLCI+LiIpLCIiLmNvbmNhdChuLmxlbmd0aD8iQWxsb3dlZCBhdHRyaWJ1dGVzIGFyZTogIi5jb25jYXQobi5qb2luKCIsICIpKToiVG8gc2V0IHRoZSB2YWx1ZSwgdXNlIEhUTUwgd2l0aGluIHRoZSBlbGVtZW50LiIpXSl9KX0sWWU9ZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgZS5kaWRPcGVuP3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5kaWRPcGVuKHQpfSk6ImZ1bmN0aW9uIj09dHlwZW9mIGUub25PcGVuJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGUub25PcGVuKHQpfSl9LFplPWZ1bmN0aW9uKHQsZSl7QnQmJmx0KGUpPyh0LnN0eWxlLm92ZXJmbG93WT0iaGlkZGVuIixlLmFkZEV2ZW50TGlzdGVuZXIoQnQsTWUpKTp0LnN0eWxlLm92ZXJmbG93WT0iYXV0byJ9LFFlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbzsoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW18fCJNYWNJbnRlbCI9PT1uYXZpZ2F0b3IucGxhdGZvcm0mJjE8bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzKSYmIUYoZG9jdW1lbnQuYm9keSwkLmlvc2ZpeCkmJihvPWRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPSIiLmNvbmNhdCgtMSpvLCJweCIpLHZ0KGRvY3VtZW50LmJvZHksJC5pb3NmaXgpLHZlKCksZ2UoKSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJm1lKCkmJihoZSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGhlKSksZSYmImhpZGRlbiIhPT1uJiZmZSgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNjcm9sbFRvcD0wfSl9LEplPWZ1bmN0aW9uKHQsZSxuKXt2dCh0LG4uc2hvd0NsYXNzLmJhY2tkcm9wKSxlLnN0eWxlLnNldFByb3BlcnR5KCJvcGFjaXR5IiwiMCIsImltcG9ydGFudCIpLHJ0KGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt2dChlLG4uc2hvd0NsYXNzLnBvcHVwKSxlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvcGFjaXR5Iil9LDEwKSx2dChbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLCQuc2hvd24pLG4uaGVpZ2h0QXV0byYmbi5iYWNrZHJvcCYmIW4udG9hc3QmJnZ0KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sJFsiaGVpZ2h0LWF1dG8iXSl9LCRlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNoZWNrZWQ/MTowfSxYZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jaGVja2VkP3QudmFsdWU6bnVsbH0sR2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZmlsZXMubGVuZ3RoP251bGwhPT10LmdldEF0dHJpYnV0ZSgibXVsdGlwbGUiKT90LmZpbGVzOnQuZmlsZXNbMF06bnVsbH0sdG49ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBvKHQpe3JldHVybiBubltuLmlucHV0XShpLG9uKHQpLG4pfXZhciBpPVAoKTtiKG4uaW5wdXRPcHRpb25zKXx8dyhuLmlucHV0T3B0aW9ucyk/KEp0KFQoKSkseShuLmlucHV0T3B0aW9ucykudGhlbihmdW5jdGlvbih0KXtlLmhpZGVMb2FkaW5nKCksbyh0KX0pKToib2JqZWN0Ij09PXIobi5pbnB1dE9wdGlvbnMpP28obi5pbnB1dE9wdGlvbnMpOksoIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCAiLmNvbmNhdChyKG4uaW5wdXRPcHRpb25zKSkpfSxlbj1mdW5jdGlvbihlLG4pe3ZhciBvPWUuZ2V0SW5wdXQoKTthdChvKSx5KG4uaW5wdXRWYWx1ZSkudGhlbihmdW5jdGlvbih0KXtvLnZhbHVlPSJudW1iZXIiPT09bi5pbnB1dD9wYXJzZUZsb2F0KHQpfHwwOiIiLmNvbmNhdCh0KSxydChvKSxvLmZvY3VzKCksZS5oaWRlTG9hZGluZygpfSkuY2F0Y2goZnVuY3Rpb24odCl7SygiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiAiLmNvbmNhdCh0KSksby52YWx1ZT0iIixydChvKSxvLmZvY3VzKCksZS5oaWRlTG9hZGluZygpfSl9LG5uPXtzZWxlY3Q6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLG4pe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO28udmFsdWU9bixVKG8sZSksby5zZWxlY3RlZD1ybihuLGkuaW5wdXRWYWx1ZSksdC5hcHBlbmRDaGlsZChvKX12YXIgcj15dCh0LCQuc2VsZWN0KTtlLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGUsbj10WzBdLHQ9dFsxXTtBcnJheS5pc0FycmF5KHQpPygoZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRncm91cCIpKS5sYWJlbD1uLGUuZGlzYWJsZWQ9ITEsci5hcHBlbmRDaGlsZChlKSx0LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIG8oZSx0WzFdLHRbMF0pfSkpOm8ocix0LG4pfSksci5mb2N1cygpfSxyYWRpbzpmdW5jdGlvbih0LGUsaSl7dmFyIHI9eXQodCwkLnJhZGlvKTtlLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtvLnR5cGU9InJhZGlvIixvLm5hbWU9JC5yYWRpbyxvLnZhbHVlPWUscm4oZSxpLmlucHV0VmFsdWUpJiYoby5jaGVja2VkPSEwKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtVKGUsbiksZS5jbGFzc05hbWU9JC5sYWJlbCx0LmFwcGVuZENoaWxkKG8pLHQuYXBwZW5kQ2hpbGQoZSksci5hcHBlbmRDaGlsZCh0KX0pO2U9ci5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dCIpO2UubGVuZ3RoJiZlWzBdLmZvY3VzKCl9fSxvbj1mdW5jdGlvbiBuKG8pe3ZhciBpPVtdO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTWFwJiZvIGluc3RhbmNlb2YgTWFwP28uZm9yRWFjaChmdW5jdGlvbih0LGUpeyJvYmplY3QiPT09cih0KSYmKHQ9bih0KSksaS5wdXNoKFtlLHRdKX0pOk9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9b1t0XTsib2JqZWN0Ij09PXIoZSkmJihlPW4oZSkpLGkucHVzaChbdCxlXSl9KSxpfSxybj1mdW5jdGlvbih0LGUpe3JldHVybiBlJiZlLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCl9LGFuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0SW5wdXQoKTtpZighbilyZXR1cm4gbnVsbDtzd2l0Y2goZS5pbnB1dCl7Y2FzZSJjaGVja2JveCI6cmV0dXJuICRlKG4pO2Nhc2UicmFkaW8iOnJldHVybiBYZShuKTtjYXNlImZpbGUiOnJldHVybiBHZShuKTtkZWZhdWx0OnJldHVybiBlLmlucHV0QXV0b1RyaW0/bi52YWx1ZS50cmltKCk6bi52YWx1ZX19KHQsZSk7ZS5pbnB1dFZhbGlkYXRvcj9zbih0LGUsbyk6dC5nZXRJbnB1dCgpLmNoZWNrVmFsaWRpdHkoKT8oImRlbnkiPT09bj91bjpjbikodCxlLG8pOih0LmVuYWJsZUJ1dHRvbnMoKSx0LnNob3dWYWxpZGF0aW9uTWVzc2FnZShlLnZhbGlkYXRpb25NZXNzYWdlKSl9LHNuPWZ1bmN0aW9uKGUsbixvKXtlLmRpc2FibGVJbnB1dCgpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4geShuLmlucHV0VmFsaWRhdG9yKG8sbi52YWxpZGF0aW9uTWVzc2FnZSkpfSkudGhlbihmdW5jdGlvbih0KXtlLmVuYWJsZUJ1dHRvbnMoKSxlLmVuYWJsZUlucHV0KCksdD9lLnNob3dWYWxpZGF0aW9uTWVzc2FnZSh0KTpjbihlLG4sbyl9KX0sdW49ZnVuY3Rpb24oZSx0LG4pe3Quc2hvd0xvYWRlck9uRGVueSYmSnQoTCgpKSx0LnByZURlbnk/UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiB5KHQucHJlRGVueShuLHQudmFsaWRhdGlvbk1lc3NhZ2UpKX0pLnRoZW4oZnVuY3Rpb24odCl7ITE9PT10P2UuaGlkZUxvYWRpbmcoKTplLmNsb3NlUG9wdXAoe2lzRGVuaWVkOiEwLHZhbHVlOnZvaWQgMD09PXQ/bjp0fSl9KTplLmNsb3NlUG9wdXAoe2lzRGVuaWVkOiEwLHZhbHVlOm59KX0sY249ZnVuY3Rpb24oZSx0LG4pe3Quc2hvd0xvYWRlck9uQ29uZmlybSYmSnQoKSx0LnByZUNvbmZpcm0/KGUucmVzZXRWYWxpZGF0aW9uTWVzc2FnZSgpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4geSh0LnByZUNvbmZpcm0obix0LnZhbGlkYXRpb25NZXNzYWdlKSl9KS50aGVuKGZ1bmN0aW9uKHQpe3d0KFMoKSl8fCExPT09dD9lLmhpZGVMb2FkaW5nKCk6SWUoZSx2b2lkIDA9PT10P246dCl9KSk6SWUoZSxuKX0sbG49WyJBcnJvd1JpZ2h0IiwiQXJyb3dEb3duIiwiUmlnaHQiLCJEb3duIl0sZG49WyJBcnJvd0xlZnQiLCJBcnJvd1VwIiwiTGVmdCIsIlVwIl0scG49WyJFc2NhcGUiLCJFc2MiXSxmbj1mdW5jdGlvbih0LGUsbil7dmFyIG89VHQuaW5uZXJQYXJhbXMuZ2V0KHQpO28mJihvLnN0b3BLZXlkb3duUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksIkVudGVyIj09PWUua2V5P21uKHQsZSxvKToiVGFiIj09PWUua2V5P2huKGUsbyk6LTEhPT1bXS5jb25jYXQobG4sZG4pLmluZGV4T2YoZS5rZXkpP2duKGUua2V5KTotMSE9PXBuLmluZGV4T2YoZS5rZXkpJiZ2bihlLG8sbikpfSxtbj1mdW5jdGlvbih0LGUsbil7ZS5pc0NvbXBvc2luZ3x8ZS50YXJnZXQmJnQuZ2V0SW5wdXQoKSYmZS50YXJnZXQub3V0ZXJIVE1MPT09dC5nZXRJbnB1dCgpLm91dGVySFRNTCYmLTE9PT1bInRleHRhcmVhIiwiZmlsZSJdLmluZGV4T2Yobi5pbnB1dCkmJihGdCgpLGUucHJldmVudERlZmF1bHQoKSl9LGhuPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQudGFyZ2V0LG89UigpLGk9LTEscj0wO3I8by5sZW5ndGg7cisrKWlmKG49PT1vW3JdKXtpPXI7YnJlYWt9dC5zaGlmdEtleT9IZSgwLGksLTEpOkhlKDAsaSwxKSx0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKX0sZ249ZnVuY3Rpb24odCl7LTEhPT1bVCgpLEwoKSxxKCldLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkmJih0PS0xIT09bG4uaW5kZXhPZih0KT8ibmV4dEVsZW1lbnRTaWJsaW5nIjoicHJldmlvdXNFbGVtZW50U2libGluZyIsKHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudFt0XSkmJnQuZm9jdXMoKSl9LHZuPWZ1bmN0aW9uKHQsZSxuKXtaKGUuYWxsb3dFc2NhcGVLZXkpJiYodC5wcmV2ZW50RGVmYXVsdCgpLG4oUS5lc2MpKX0sYm49ZnVuY3Rpb24oZSx0LG4pe3QucG9wdXAub25jbGljaz1mdW5jdGlvbigpe3ZhciB0PVR0LmlubmVyUGFyYW1zLmdldChlKTt0LnNob3dDb25maXJtQnV0dG9ufHx0LnNob3dEZW55QnV0dG9ufHx0LnNob3dDYW5jZWxCdXR0b258fHQuc2hvd0Nsb3NlQnV0dG9ufHx0LnRpbWVyfHx0LmlucHV0fHxuKFEuY2xvc2UpfX0seW49ITEsd249ZnVuY3Rpb24oZSl7ZS5wb3B1cC5vbm1vdXNlZG93bj1mdW5jdGlvbigpe2UuY29udGFpbmVyLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLmNvbnRhaW5lci5vbm1vdXNldXA9dm9pZCAwLHQudGFyZ2V0PT09ZS5jb250YWluZXImJih5bj0hMCl9fX0sQ249ZnVuY3Rpb24oZSl7ZS5jb250YWluZXIub25tb3VzZWRvd249ZnVuY3Rpb24oKXtlLnBvcHVwLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLnBvcHVwLm9ubW91c2V1cD12b2lkIDAsdC50YXJnZXQhPT1lLnBvcHVwJiYhZS5wb3B1cC5jb250YWlucyh0LnRhcmdldCl8fCh5bj0hMCl9fX0sa249ZnVuY3Rpb24obixvLGkpe28uY29udGFpbmVyLm9uY2xpY2s9ZnVuY3Rpb24odCl7dmFyIGU9VHQuaW5uZXJQYXJhbXMuZ2V0KG4pO3luP3luPSExOnQudGFyZ2V0PT09by5jb250YWluZXImJlooZS5hbGxvd091dHNpZGVDbGljaykmJmkoUS5iYWNrZHJvcCl9fTtmdW5jdGlvbiBBbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3Q9InN0cmluZyI9PXR5cGVvZiB0LnRlbXBsYXRlP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodC50ZW1wbGF0ZSk6dC50ZW1wbGF0ZTtpZighdClyZXR1cm57fTt0PXQuY29udGVudHx8dDtyZXR1cm4gV2UodCksdShSZSh0KSxOZSh0KSxVZSh0KSxGZSh0KSxfZSh0KSx6ZSh0LFZlKSl9KHQpO3JldHVybihuPXUoe30sc2UsZSxuLHQpKS5zaG93Q2xhc3M9dSh7fSxzZS5zaG93Q2xhc3Msbi5zaG93Q2xhc3MpLG4uaGlkZUNsYXNzPXUoe30sc2UuaGlkZUNsYXNzLG4uaGlkZUNsYXNzKSwhMT09PXQuYW5pbWF0aW9uJiYobi5zaG93Q2xhc3M9e3BvcHVwOiJzd2FsMi1ub2FuaW1hdGlvbiIsYmFja2Ryb3A6InN3YWwyLW5vYW5pbWF0aW9uIn0sbi5oaWRlQ2xhc3M9e30pLG59ZnVuY3Rpb24geG4oYSxzLHUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe2EuY2xvc2VQb3B1cCh7aXNEaXNtaXNzZWQ6ITAsZGlzbWlzczp0fSl9dmFyIG4sbyxpLHI7Q2Uuc3dhbFByb21pc2VSZXNvbHZlLnNldChhLHQpLHMuY29uZmlybUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGU9dSwodD1hKS5kaXNhYmxlQnV0dG9ucygpLHZvaWQoZS5pbnB1dD9hbih0LGUsImNvbmZpcm0iKTpjbih0LGUsITApKTt2YXIgdCxlfSxzLmRlbnlCdXR0b24ub25jbGljaz1mdW5jdGlvbigpe3JldHVybiBlPXUsKHQ9YSkuZGlzYWJsZUJ1dHRvbnMoKSx2b2lkKGUucmV0dXJuSW5wdXRWYWx1ZU9uRGVueT9hbih0LGUsImRlbnkiKTp1bih0LGUsITEpKTt2YXIgdCxlfSxzLmNhbmNlbEJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHQ9ZSxhLmRpc2FibGVCdXR0b25zKCksdm9pZCB0KFEuY2FuY2VsKTt2YXIgdH0scy5jbG9zZUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGUoUS5jbG9zZSl9LG49YSxyPXMsdD1lLFR0LmlubmVyUGFyYW1zLmdldChuKS50b2FzdD9ibihuLHIsdCk6KHduKHIpLENuKHIpLGtuKG4scix0KSksbz1hLHI9dSxpPWUsKHQ9dGUpLmtleWRvd25UYXJnZXQmJnQua2V5ZG93bkhhbmRsZXJBZGRlZCYmKHQua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0LmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOnQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLHQua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksci50b2FzdHx8KHQua2V5ZG93bkhhbmRsZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGZuKG8sdCxpKX0sdC5rZXlkb3duVGFyZ2V0PXIua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT93aW5kb3c6QSgpLHQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT1yLmtleWRvd25MaXN0ZW5lckNhcHR1cmUsdC5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHQua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6dC5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksdC5rZXlkb3duSGFuZGxlckFkZGVkPSEwKSxyPWEsInNlbGVjdCI9PT0odD11KS5pbnB1dHx8InJhZGlvIj09PXQuaW5wdXQ/dG4ocix0KTotMSE9PVsidGV4dCIsImVtYWlsIiwibnVtYmVyIiwidGVsIiwidGV4dGFyZWEiXS5pbmRleE9mKHQuaW5wdXQpJiYoYih0LmlucHV0VmFsdWUpfHx3KHQuaW5wdXRWYWx1ZSkpJiZlbihyLHQpLGplKHUpLFBuKHRlLHUsZSksT24ocyx1KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5jb250YWluZXIuc2Nyb2xsVG9wPTB9KX0pfWZ1bmN0aW9uIEJuKHQpe3ZhciBlPXtwb3B1cDpBKCksY29udGFpbmVyOmsoKSxjb250ZW50OlAoKSxhY3Rpb25zOmooKSxjb25maXJtQnV0dG9uOlQoKSxkZW55QnV0dG9uOkwoKSxjYW5jZWxCdXR0b246cSgpLGxvYWRlcjpEKCksY2xvc2VCdXR0b246VigpLHZhbGlkYXRpb25NZXNzYWdlOlMoKSxwcm9ncmVzc1N0ZXBzOm4oKX07cmV0dXJuIFR0LmRvbUNhY2hlLnNldCh0LGUpLGV9dmFyIFBuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1IKCk7YXQobyksZS50aW1lciYmKHQudGltZW91dD1uZXcgTGUoZnVuY3Rpb24oKXtuKCJ0aW1lciIpLGRlbGV0ZSB0LnRpbWVvdXR9LGUudGltZXIpLGUudGltZXJQcm9ncmVzc0JhciYmKHJ0KG8pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnRpbWVvdXQmJnQudGltZW91dC5ydW5uaW5nJiZkdChlLnRpbWVyKX0pKSl9LE9uPWZ1bmN0aW9uKHQsZSl7aWYoIWUudG9hc3QpcmV0dXJuIFooZS5hbGxvd0VudGVyS2V5KT92b2lkKEVuKHQsZSl8fEhlKDAsLTEsMSkpOlNuKCl9LEVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZm9jdXNEZW55JiZ3dCh0LmRlbnlCdXR0b24pPyh0LmRlbnlCdXR0b24uZm9jdXMoKSwhMCk6ZS5mb2N1c0NhbmNlbCYmd3QodC5jYW5jZWxCdXR0b24pPyh0LmNhbmNlbEJ1dHRvbi5mb2N1cygpLCEwKTohKCFlLmZvY3VzQ29uZmlybXx8IXd0KHQuY29uZmlybUJ1dHRvbikpJiYodC5jb25maXJtQnV0dG9uLmZvY3VzKCksITApfSxTbj1mdW5jdGlvbigpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXImJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpfTtmdW5jdGlvbiBUbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdC5kaWREZXN0cm95P3QuZGlkRGVzdHJveSgpOiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uRGVzdHJveSYmdC5vbkRlc3Ryb3koKX1mdW5jdGlvbiBMbih0KXtkZWxldGUgdC5wYXJhbXMsZGVsZXRlIHRlLmtleWRvd25IYW5kbGVyLGRlbGV0ZSB0ZS5rZXlkb3duVGFyZ2V0LHFuKFR0KSxxbihDZSl9dmFyIERuLHFuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KXRbZV09bmV3IFdlYWtNYXB9LEo9T2JqZWN0LmZyZWV6ZSh7aGlkZUxvYWRpbmc6cGUsZGlzYWJsZUxvYWRpbmc6cGUsZ2V0SW5wdXQ6ZnVuY3Rpb24odCl7dmFyIGU9VHQuaW5uZXJQYXJhbXMuZ2V0KHR8fHRoaXMpO3JldHVybih0PVR0LmRvbUNhY2hlLmdldCh0fHx0aGlzKSk/ZXQodC5jb250ZW50LGUuaW5wdXQpOm51bGx9LGNsb3NlOkFlLGNsb3NlUG9wdXA6QWUsY2xvc2VNb2RhbDpBZSxjbG9zZVRvYXN0OkFlLGVuYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtTZSh0aGlzLFsiY29uZmlybUJ1dHRvbiIsImRlbnlCdXR0b24iLCJjYW5jZWxCdXR0b24iXSwhMSl9LGRpc2FibGVCdXR0b25zOmZ1bmN0aW9uKCl7U2UodGhpcyxbImNvbmZpcm1CdXR0b24iLCJkZW55QnV0dG9uIiwiY2FuY2VsQnV0dG9uIl0sITApfSxlbmFibGVJbnB1dDpmdW5jdGlvbigpe3JldHVybiBUZSh0aGlzLmdldElucHV0KCksITEpfSxkaXNhYmxlSW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVGUodGhpcy5nZXRJbnB1dCgpLCEwKX0sc2hvd1ZhbGlkYXRpb25NZXNzYWdlOmZ1bmN0aW9uKHQpe3ZhciBlPVR0LmRvbUNhY2hlLmdldCh0aGlzKSxuPVR0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtVKGUudmFsaWRhdGlvbk1lc3NhZ2UsdCksZS52YWxpZGF0aW9uTWVzc2FnZS5jbGFzc05hbWU9JFsidmFsaWRhdGlvbi1tZXNzYWdlIl0sbi5jdXN0b21DbGFzcyYmbi5jdXN0b21DbGFzcy52YWxpZGF0aW9uTWVzc2FnZSYmdnQoZS52YWxpZGF0aW9uTWVzc2FnZSxuLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSxydChlLnZhbGlkYXRpb25NZXNzYWdlKSwoZT10aGlzLmdldElucHV0KCkpJiYoZS5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsITApLGUuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZEJ5IiwkWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksbnQoZSksdnQoZSwkLmlucHV0ZXJyb3IpKX0scmVzZXRWYWxpZGF0aW9uTWVzc2FnZTpmdW5jdGlvbigpe3ZhciB0PVR0LmRvbUNhY2hlLmdldCh0aGlzKTt0LnZhbGlkYXRpb25NZXNzYWdlJiZhdCh0LnZhbGlkYXRpb25NZXNzYWdlKSwodD10aGlzLmdldElucHV0KCkpJiYodC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIpLHQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZEJ5IiksYnQodCwkLmlucHV0ZXJyb3IpKX0sZ2V0UHJvZ3Jlc3NTdGVwczpmdW5jdGlvbigpe3JldHVybiBUdC5kb21DYWNoZS5nZXQodGhpcykucHJvZ3Jlc3NTdGVwc30sX21haW46ZnVuY3Rpb24odCl7dmFyIGU9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiBhZSh1KHt9LGUsdCkpLHRlLmN1cnJlbnRJbnN0YW5jZSYmdGUuY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCksdGUuY3VycmVudEluc3RhbmNlPXRoaXMscWUodD1Bbih0LGUpKSxPYmplY3QuZnJlZXplKHQpLHRlLnRpbWVvdXQmJih0ZS50aW1lb3V0LnN0b3AoKSxkZWxldGUgdGUudGltZW91dCksY2xlYXJUaW1lb3V0KHRlLnJlc3RvcmVGb2N1c1RpbWVvdXQpLGU9Qm4odGhpcyksVXQodGhpcyx0KSxUdC5pbm5lclBhcmFtcy5zZXQodGhpcyx0KSx4bih0aGlzLGUsdCl9LHVwZGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1BKCksbj1UdC5pbm5lclBhcmFtcy5nZXQodGhpcyk7aWYoIXR8fEYodCxuLmhpZGVDbGFzcy5wb3B1cCkpcmV0dXJuIFcoIllvdSdyZSB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjbG9zZWQgb3IgY2xvc2luZyBwb3B1cCwgdGhhdCB3b24ndCB3b3JrLiBVc2UgdGhlIHVwZGF0ZSgpIG1ldGhvZCBpbiBwcmVDb25maXJtIHBhcmFtZXRlciBvciBzaG93IGEgbmV3IHBvcHVwLiIpO3ZhciBvPXt9O09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7TW4uaXNVcGRhdGFibGVQYXJhbWV0ZXIodCk/b1t0XT1lW3RdOlcoJ0ludmFsaWQgcGFyYW1ldGVyIHRvIHVwZGF0ZTogIicuY29uY2F0KHQsJyIuIFVwZGF0YWJsZSBwYXJhbXMgYXJlIGxpc3RlZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvYmxvYi9tYXN0ZXIvc3JjL3V0aWxzL3BhcmFtcy5qc1xuXG5JZiB5b3UgdGhpbmsgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVwZGF0YWJsZSwgcmVxdWVzdCBpdCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzL25ldz90ZW1wbGF0ZT0wMl9mZWF0dXJlX3JlcXVlc3QubWQnKSl9KSxuPXUoe30sbixvKSxVdCh0aGlzLG4pLFR0LmlubmVyUGFyYW1zLnNldCh0aGlzLG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6dSh7fSx0aGlzLnBhcmFtcyxlKSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PVR0LmRvbUNhY2hlLmdldCh0aGlzKSxlPVR0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtlJiYodC5wb3B1cCYmdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrJiYodGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIHRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayksdGUuZGVmZXJEaXNwb3NhbFRpbWVyJiYoY2xlYXJUaW1lb3V0KHRlLmRlZmVyRGlzcG9zYWxUaW1lciksZGVsZXRlIHRlLmRlZmVyRGlzcG9zYWxUaW1lciksVG4oZSksTG4odGhpcykpfX0pLGpuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSgpe2lmKGEodGhpcyxpKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7InVuZGVmaW5lZCI9PXR5cGVvZiBQcm9taXNlJiZLKCJUaGlzIHBhY2thZ2UgcmVxdWlyZXMgYSBQcm9taXNlIGxpYnJhcnksIHBsZWFzZSBpbmNsdWRlIGEgc2hpbSB0byBlbmFibGUgaXQgaW4gdGhpcyBicm93c2VyIChTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi93aWtpL01pZ3JhdGlvbi1mcm9tLVN3ZWV0QWxlcnQtdG8tU3dlZXRBbGVydDIjMS1pZS1zdXBwb3J0KSIpLERuPXRoaXM7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07dmFyIG89T2JqZWN0LmZyZWV6ZSh0aGlzLmNvbnN0cnVjdG9yLmFyZ3NUb1BhcmFtcyhlKSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cGFyYW1zOnt2YWx1ZTpvLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pO289dGhpcy5fbWFpbih0aGlzLnBhcmFtcyk7VHQucHJvbWlzZS5zZXQodGhpcyxvKX19cmV0dXJuIHMoaSxbe2tleToidGhlbiIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIFR0LnByb21pc2UuZ2V0KHRoaXMpLnRoZW4odCl9fSx7a2V5OiJmaW5hbGx5Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gVHQucHJvbWlzZS5nZXQodGhpcykuZmluYWxseSh0KX19XSksaX0oKTt1KGpuLnByb3RvdHlwZSxKKSx1KGpuLGRlKSxPYmplY3Qua2V5cyhKKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2puW3RdPWZ1bmN0aW9uKCl7aWYoRG4pcmV0dXJuIERuW3RdLmFwcGx5KERuLGFyZ3VtZW50cyl9fSksam4uRGlzbWlzc1JlYXNvbj1RLGpuLnZlcnNpb249IjEwLjE2LjYiO3ZhciBNbj1qbjtyZXR1cm4gTW4uZGVmYXVsdD1Nbn0pLHZvaWQgMCE9PXRoaXMmJnRoaXMuU3dlZXRhbGVydDImJih0aGlzLnN3YWw9dGhpcy5zd2VldEFsZXJ0PXRoaXMuU3dhbD10aGlzLlN3ZWV0QWxlcnQ9dGhpcy5Td2VldGFsZXJ0Mik7CiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2lmKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChuKSxuLnN0eWxlU2hlZXQpbi5zdHlsZVNoZWV0LmRpc2FibGVkfHwobi5zdHlsZVNoZWV0LmNzc1RleHQ9dCk7ZWxzZSB0cnl7bi5pbm5lckhUTUw9dH1jYXRjaChlKXtuLmlubmVyVGV4dD10fX0oZG9jdW1lbnQsIi5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdHtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6c3RyZXRjaDt3aWR0aDphdXRvO3BhZGRpbmc6MS4yNWVtO292ZXJmbG93LXk6aGlkZGVuO2JhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAuNjI1ZW0gI2Q5ZDlkOX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWhlYWRlcntmbGV4LWRpcmVjdGlvbjpyb3c7cGFkZGluZzowfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItdGl0bGV7ZmxleC1ncm93OjE7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7bWFyZ2luOjAgLjYyNWVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1sb2FkaW5ne2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pbnB1dHtoZWlnaHQ6MmVtO21hcmdpbjouMzEyNWVtIGF1dG87Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItZm9vdGVye21hcmdpbjouNWVtIDAgMDtwYWRkaW5nOi41ZW0gMCAwO2ZvbnQtc2l6ZTouOGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItY2xvc2V7cG9zaXRpb246c3RhdGljO3dpZHRoOi44ZW07aGVpZ2h0Oi44ZW07bGluZS1oZWlnaHQ6Ljh9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1jb250ZW50e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O21hcmdpbjowIC42MjVlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1odG1sLWNvbnRhaW5lcntwYWRkaW5nOi42MjVlbSAwIDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1odG1sLWNvbnRhaW5lcjplbXB0eXtwYWRkaW5nOjB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29ue3dpZHRoOjJlbTttaW4td2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOjAgLjVlbSAwIDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MS44ZW07Zm9udC13ZWlnaHQ6NzAwfUBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDpub25lKSwoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtmb250LXNpemU6LjI1ZW19fS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7d2lkdGg6MmVtO2hlaWdodDoyZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde3RvcDouODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6LjMxMjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItYWN0aW9uc3tmbGV4OjE7ZmxleC1iYXNpczphdXRvIWltcG9ydGFudDthbGlnbi1zZWxmOnN0cmV0Y2g7d2lkdGg6YXV0bztoZWlnaHQ6Mi4yZW07aGVpZ2h0OmF1dG87bWFyZ2luOjAgLjMxMjVlbTttYXJnaW4tdG9wOi4zMTI1ZW07cGFkZGluZzowfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3R5bGVke21hcmdpbjouMTI1ZW0gLjMxMjVlbTtwYWRkaW5nOi4zMTI1ZW0gLjYyNWVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdHlsZWQ6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSgxMDAsMTUwLDIwMCwuNSl9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNze2JvcmRlci1jb2xvcjojYTVkYzg2fS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MS42ZW07aGVpZ2h0OjNlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LS44ZW07bGVmdDotLjVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjoyZW0gMmVtO2JvcmRlci1yYWRpdXM6NGVtIDAgMCA0ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotLjI1ZW07bGVmdDouOTM3NWVtO3RyYW5zZm9ybS1vcmlnaW46MCAxLjVlbTtib3JkZXItcmFkaXVzOjAgNGVtIDRlbSAwfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3dpZHRoOjJlbTtoZWlnaHQ6MmVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXh7dG9wOjA7bGVmdDouNDM3NWVtO3dpZHRoOi40Mzc1ZW07aGVpZ2h0OjIuNjg3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV17aGVpZ2h0Oi4zMTI1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXB7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS1sb25ney13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1czthbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdC5zd2FsMi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LXNob3cgLjVzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1zaG93IC41c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItaGlkZXstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1oaWRlIC4xcyBmb3J3YXJkczthbmltYXRpb246c3dhbDItdG9hc3QtaGlkZSAuMXMgZm9yd2FyZHN9LnN3YWwyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDYwO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdy14OmhpZGRlbjt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5zd2FsMi1jb250YWluZXIuc3dhbDItYmFja2Ryb3Atc2hvdywuc3dhbDItY29udGFpbmVyLnN3YWwyLW5vYW5pbWF0aW9ue2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNCl9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1iYWNrZHJvcC1oaWRle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudH0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnR7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXJ7YWxpZ24taXRlbXM6Y2VudGVyfS5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnR7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodHthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te2FsaWduLWl0ZW1zOmZsZXgtZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnR7YWxpZ24taXRlbXM6ZmxleC1lbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e2FsaWduLWl0ZW1zOmZsZXgtZW5kO2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1lbmQ+OmZpcnN0LWNoaWxkLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQ+OmZpcnN0LWNoaWxkLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0PjpmaXJzdC1jaGlsZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1zdGFydD46Zmlyc3QtY2hpbGQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20+OmZpcnN0LWNoaWxke21hcmdpbi10b3A6YXV0b30uc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctZnVsbHNjcmVlbj4uc3dhbDItbW9kYWx7ZGlzcGxheTpmbGV4IWltcG9ydGFudDtmbGV4OjE7YWxpZ24tc2VsZjpzdHJldGNoO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LXJvdz4uc3dhbDItbW9kYWx7ZGlzcGxheTpmbGV4IWltcG9ydGFudDtmbGV4OjE7YWxpZ24tY29udGVudDpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1ue2ZsZXg6MTtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20sLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXIsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi10b3B7YWxpZ24taXRlbXM6Y2VudGVyfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20tc3RhcnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXItbGVmdCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWNlbnRlci1zdGFydCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLXRvcC1sZWZ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9wLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20tZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLXJpZ2h0LC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItY2VudGVyLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWNlbnRlci1yaWdodCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLXRvcC1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi10b3AtcmlnaHR7YWxpZ24taXRlbXM6ZmxleC1lbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbj4uc3dhbDItbW9kYWx7ZGlzcGxheTpmbGV4IWltcG9ydGFudDtmbGV4OjE7YWxpZ24tY29udGVudDpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLW5vLXRyYW5zaXRpb257dHJhbnNpdGlvbjpub25lIWltcG9ydGFudH0uc3dhbDItY29udGFpbmVyOm5vdCguc3dhbDItdG9wKTpub3QoLnN3YWwyLXRvcC1zdGFydCk6bm90KC5zd2FsMi10b3AtZW5kKTpub3QoLnN3YWwyLXRvcC1sZWZ0KTpub3QoLnN3YWwyLXRvcC1yaWdodCk6bm90KC5zd2FsMi1jZW50ZXItc3RhcnQpOm5vdCguc3dhbDItY2VudGVyLWVuZCk6bm90KC5zd2FsMi1jZW50ZXItbGVmdCk6bm90KC5zd2FsMi1jZW50ZXItcmlnaHQpOm5vdCguc3dhbDItYm90dG9tKTpub3QoLnN3YWwyLWJvdHRvbS1zdGFydCk6bm90KC5zd2FsMi1ib3R0b20tZW5kKTpub3QoLnN3YWwyLWJvdHRvbS1sZWZ0KTpub3QoLnN3YWwyLWJvdHRvbS1yaWdodCk6bm90KC5zd2FsMi1ncm93LWZ1bGxzY3JlZW4pPi5zd2FsMi1tb2RhbHttYXJnaW46YXV0b31AbWVkaWEgYWxsIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6bm9uZSksKC1tcy1oaWdoLWNvbnRyYXN0OmFjdGl2ZSl7LnN3YWwyLWNvbnRhaW5lciAuc3dhbDItbW9kYWx7bWFyZ2luOjAhaW1wb3J0YW50fX0uc3dhbDItcG9wdXB7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDozMmVtO21heC13aWR0aDoxMDAlO3BhZGRpbmc6MS4yNWVtO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQ6I2ZmZjtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZToxcmVtfS5zd2FsMi1wb3B1cDpmb2N1c3tvdXRsaW5lOjB9LnN3YWwyLXBvcHVwLnN3YWwyLWxvYWRpbmd7b3ZlcmZsb3cteTpoaWRkZW59LnN3YWwyLWhlYWRlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjAgMS44ZW19LnN3YWwyLXRpdGxle3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO21hcmdpbjowIDAgLjRlbTtwYWRkaW5nOjA7Y29sb3I6IzU5NTk1OTtmb250LXNpemU6MS44NzVlbTtmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC10cmFuc2Zvcm06bm9uZTt3b3JkLXdyYXA6YnJlYWstd29yZH0uc3dhbDItYWN0aW9uc3tkaXNwbGF5OmZsZXg7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxMDAlO21hcmdpbjoxLjI1ZW0gYXV0byAwO3BhZGRpbmc6MH0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWRbZGlzYWJsZWRde29wYWNpdHk6LjR9LnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkOmhvdmVye2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjEpLHJnYmEoMCwwLDAsLjEpKX0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWQ6YWN0aXZle2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjIpLHJnYmEoMCwwLDAsLjIpKX0uc3dhbDItbG9hZGVye2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyLjJlbTtoZWlnaHQ6Mi4yZW07bWFyZ2luOjAgMS44NzVlbTstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDtib3JkZXItd2lkdGg6LjI1ZW07Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXItY29sb3I6IzI3NzhjNCB0cmFuc3BhcmVudCAjMjc3OGM0IHRyYW5zcGFyZW50fS5zd2FsMi1zdHlsZWR7bWFyZ2luOi4zMTI1ZW07cGFkZGluZzouNjI1ZW0gMS4xZW07Ym94LXNoYWRvdzpub25lO2ZvbnQtd2VpZ2h0OjUwMH0uc3dhbDItc3R5bGVkOm5vdChbZGlzYWJsZWRdKXtjdXJzb3I6cG9pbnRlcn0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm17Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojMjc3OGM0O2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWRlbnl7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojZDE0NTI5O2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbHtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiM3NTc1NzU7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfS5zd2FsMi1zdHlsZWQ6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1zdHlsZWQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9LnN3YWwyLWZvb3RlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxLjI1ZW0gMCAwO3BhZGRpbmc6MWVtIDAgMDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO2NvbG9yOiM1NDU0NTQ7Zm9udC1zaXplOjFlbX0uc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtoZWlnaHQ6LjI1ZW07b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjVweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjVweH0uc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFye3dpZHRoOjEwMCU7aGVpZ2h0Oi4yNWVtO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMil9LnN3YWwyLWltYWdle21heC13aWR0aDoxMDAlO21hcmdpbjoxLjI1ZW0gYXV0b30uc3dhbDItY2xvc2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO3RvcDowO3JpZ2h0OjA7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MS4yZW07aGVpZ2h0OjEuMmVtO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZS1vdXQ7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDowIDA7Y29sb3I6I2NjYztmb250LWZhbWlseTpzZXJpZjtmb250LXNpemU6Mi41ZW07bGluZS1oZWlnaHQ6MS4yO2N1cnNvcjpwb2ludGVyfS5zd2FsMi1jbG9zZTpob3Zlcnt0cmFuc2Zvcm06bm9uZTtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojZjI3NDc0fS5zd2FsMi1jbG9zZTpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAzcHggcmdiYSgxMDAsMTUwLDIwMCwuNSl9LnN3YWwyLWNsb3NlOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5zd2FsMi1jb250ZW50e3otaW5kZXg6MTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowO3BhZGRpbmc6MCAxLjZlbTtjb2xvcjojNTQ1NDU0O2ZvbnQtc2l6ZToxLjEyNWVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDpub3JtYWw7dGV4dC1hbGlnbjpjZW50ZXI7d29yZC13cmFwOmJyZWFrLXdvcmR9LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItcmFkaW8sLnN3YWwyLXNlbGVjdCwuc3dhbDItdGV4dGFyZWF7bWFyZ2luOjFlbSBhdXRvfS5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItdGV4dGFyZWF7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjNzLGJveC1zaGFkb3cgLjNzO2JvcmRlcjoxcHggc29saWQgI2Q5ZDlkOTtib3JkZXItcmFkaXVzOi4xODc1ZW07YmFja2dyb3VuZDppbmhlcml0O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA2KTtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi1maWxlLnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLWlucHV0LnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLXRleHRhcmVhLnN3YWwyLWlucHV0ZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDJweCAjZjI3NDc0IWltcG9ydGFudH0uc3dhbDItZmlsZTpmb2N1cywuc3dhbDItaW5wdXQ6Zm9jdXMsLnN3YWwyLXRleHRhcmVhOmZvY3Vze2JvcmRlcjoxcHggc29saWQgI2I0ZGJlZDtvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAzcHggcmdiYSgxMDAsMTUwLDIwMCwuNSl9LnN3YWwyLWZpbGU6Oi1tb3otcGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0OjotbW96LXBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1maWxlOi1tcy1pbnB1dC1wbGFjZWhvbGRlciwuc3dhbDItaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItZmlsZTo6cGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0OjpwbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6OnBsYWNlaG9sZGVye2NvbG9yOiNjY2N9LnN3YWwyLXJhbmdle21hcmdpbjoxZW0gYXV0bztiYWNrZ3JvdW5kOiNmZmZ9LnN3YWwyLXJhbmdlIGlucHV0e3dpZHRoOjgwJX0uc3dhbDItcmFuZ2Ugb3V0cHV0e3dpZHRoOjIwJTtjb2xvcjppbmhlcml0O2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LWFsaWduOmNlbnRlcn0uc3dhbDItcmFuZ2UgaW5wdXQsLnN3YWwyLXJhbmdlIG91dHB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjEuMTI1ZW07bGluZS1oZWlnaHQ6Mi42MjVlbX0uc3dhbDItaW5wdXR7aGVpZ2h0OjIuNjI1ZW07cGFkZGluZzowIC43NWVtfS5zd2FsMi1pbnB1dFt0eXBlPW51bWJlcl17bWF4LXdpZHRoOjEwZW19LnN3YWwyLWZpbGV7YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi10ZXh0YXJlYXtoZWlnaHQ6Ni43NWVtO3BhZGRpbmc6Ljc1ZW19LnN3YWwyLXNlbGVjdHttaW4td2lkdGg6NTAlO21heC13aWR0aDoxMDAlO3BhZGRpbmc6LjM3NWVtIC42MjVlbTtiYWNrZ3JvdW5kOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3gsLnN3YWwyLXJhZGlve2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjppbmhlcml0fS5zd2FsMi1jaGVja2JveCBsYWJlbCwuc3dhbDItcmFkaW8gbGFiZWx7bWFyZ2luOjAgLjZlbTtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3ggaW5wdXQsLnN3YWwyLXJhZGlvIGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX0uc3dhbDItaW5wdXQtbGFiZWx7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSBhdXRvfS5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2V7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjAgLTIuN2VtO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOiNmMGYwZjA7Y29sb3I6IzY2Njtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjMwMH0uc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdlOjpiZWZvcmV7Y29udGVudDpcIiFcIjtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxLjVlbTttaW4td2lkdGg6MS41ZW07aGVpZ2h0OjEuNWVtO21hcmdpbjowIC42MjVlbTtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MS41ZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLWljb257cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpjb250ZW50LWJveDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjVlbTtoZWlnaHQ6NWVtO21hcmdpbjoxLjI1ZW0gYXV0byAxLjg3NWVtO2JvcmRlcjouMjVlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXItY29sb3I6IzAwMDtmb250LWZhbWlseTppbmhlcml0O2xpbmUtaGVpZ2h0OjVlbTtjdXJzb3I6ZGVmYXVsdDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTozLjc1ZW19LnN3YWwyLWljb24uc3dhbDItZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciAuc3dhbDIteC1tYXJre3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtZ3JvdzoxfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjIuMzEyNWVtO3dpZHRoOjIuOTM3NWVtO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDoxLjA2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0OjFlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93IC5zd2FsMi14LW1hcmt7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItd2FybmluZ3tib3JkZXItY29sb3I6I2ZhY2VhODtjb2xvcjojZjhiYjg2fS5zd2FsMi1pY29uLnN3YWwyLWluZm97Ym9yZGVyLWNvbG9yOiM5ZGUwZjY7Y29sb3I6IzNmYzNlZX0uc3dhbDItaWNvbi5zd2FsMi1xdWVzdGlvbntib3JkZXItY29sb3I6I2M5ZGFlMTtjb2xvcjojODdhZGJkfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3N7Ym9yZGVyLWNvbG9yOiNhNWRjODY7Y29sb3I6I2E1ZGM4Nn0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDozLjc1ZW07aGVpZ2h0OjcuNWVtO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO2JvcmRlci1yYWRpdXM6NTAlfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LS40Mzc1ZW07bGVmdDotMi4wNjM1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46My43NWVtIDMuNzVlbTtib3JkZXItcmFkaXVzOjcuNWVtIDAgMCA3LjVlbX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotLjY4NzVlbTtsZWZ0OjEuODc1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MCAzLjc1ZW07Ym9yZGVyLXJhZGl1czowIDcuNWVtIDcuNWVtIDB9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6LS4yNWVtO2xlZnQ6LS4yNWVtO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXI6LjI1ZW0gc29saWQgcmdiYSgxNjUsMjIwLDEzNCwuMyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXh7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDouNWVtO2xlZnQ6MS42MjVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDo1LjYyNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNhNWRjODZ9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjIuODc1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVdW2NsYXNzJD1sb25nXXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXN9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS1sb25ney13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHR7LXdlYmtpdC1hbmltYXRpb246c3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWluO2FuaW1hdGlvbjpzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lIDQuMjVzIGVhc2UtaW59LnN3YWwyLXByb2dyZXNzLXN0ZXBze2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjttYXgtd2lkdGg6MTAwJTttYXJnaW46MCAwIDEuMjVlbTtwYWRkaW5nOjA7YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtd2VpZ2h0OjYwMH0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwe3otaW5kZXg6MjA7ZmxleC1zaHJpbms6MDt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjJlbTtiYWNrZ3JvdW5kOiMyNzc4YzQ7Y29sb3I6I2ZmZjtsaW5lLWhlaWdodDoyZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwe2JhY2tncm91bmQ6IzI3NzhjNH0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB+LnN3YWwyLXByb2dyZXNzLXN0ZXB7YmFja2dyb3VuZDojYWRkOGU2O2NvbG9yOiNmZmZ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7YmFja2dyb3VuZDojYWRkOGU2fS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC1saW5le3otaW5kZXg6MTA7ZmxleC1zaHJpbms6MDt3aWR0aDoyLjVlbTtoZWlnaHQ6LjRlbTttYXJnaW46MCAtMXB4O2JhY2tncm91bmQ6IzI3NzhjNH1bY2xhc3NePXN3YWwyXXstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LnN3YWwyLXNob3d7LXdlYmtpdC1hbmltYXRpb246c3dhbDItc2hvdyAuM3M7YW5pbWF0aW9uOnN3YWwyLXNob3cgLjNzfS5zd2FsMi1oaWRley13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWhpZGUgLjE1cyBmb3J3YXJkczthbmltYXRpb246c3dhbDItaGlkZSAuMTVzIGZvcndhcmRzfS5zd2FsMi1ub2FuaW1hdGlvbnt0cmFuc2l0aW9uOm5vbmV9LnN3YWwyLXNjcm9sbGJhci1tZWFzdXJle3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6c2Nyb2xsfS5zd2FsMi1ydGwgLnN3YWwyLWNsb3Nle3JpZ2h0OmF1dG87bGVmdDowfS5zd2FsMi1ydGwgLnN3YWwyLXRpbWVyLXByb2dyZXNzLWJhcntyaWdodDowO2xlZnQ6YXV0b31Ac3VwcG9ydHMgKC1tcy1hY2NlbGVyYXRvcjp0cnVlKXsuc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnN3YWwyLXJhbmdlIG91dHB1dHtkaXNwbGF5Om5vbmV9fUBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDpub25lKSwoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsuc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnN3YWwyLXJhbmdlIG91dHB1dHtkaXNwbGF5Om5vbmV9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtaGlkZXsxMDAle3RyYW5zZm9ybTpyb3RhdGVaKDFkZWcpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6LjU2MjVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOi4xMjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6LjYyNWVtO2xlZnQ6LS4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotLjI1ZW07d2lkdGg6MS42MjVlbX04NCV7dG9wOjEuMDYyNWVtO2xlZnQ6Ljc1ZW07d2lkdGg6LjVlbX0xMDAle3RvcDoxLjEyNWVtO2xlZnQ6LjE4NzVlbTt3aWR0aDouNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06c2NhbGUoLjcpfTQ1JXt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9ODAle3RyYW5zZm9ybTpzY2FsZSguOTUpfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHN3YWwyLXNob3d7MCV7dHJhbnNmb3JtOnNjYWxlKC43KX00NSV7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXt0cmFuc2Zvcm06c2NhbGUoLjk1KX0xMDAle3RyYW5zZm9ybTpzY2FsZSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDoxLjE4NzVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOjEuMDYyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDoyLjE4NzVlbTtsZWZ0Oi0uMzc1ZW07d2lkdGg6My4xMjVlbX04NCV7dG9wOjNlbTtsZWZ0OjEuMzEyNWVtO3dpZHRoOjEuMDYyNWVtfTEwMCV7dG9wOjIuODEyNWVtO2xlZnQ6LjgxMjVlbTt3aWR0aDoxLjU2MjVlbX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOjEuMTg3NWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6MS4wNjI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOjIuMTg3NWVtO2xlZnQ6LS4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9NjUle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH04NCV7dG9wOjIuMTg3NWVtO3JpZ2h0OjA7d2lkdGg6My40Mzc1ZW19MTAwJXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTUle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0xMiV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9fUBrZXlmcmFtZXMgc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZXswJXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH01MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTgwJXttYXJnaW4tdG9wOi0uMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmt7MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTUwJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LS4zNzVlbTt0cmFuc2Zvcm06c2NhbGUoMS4xNSl9MTAwJXttYXJnaW4tdG9wOjA7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbnswJXt0cmFuc2Zvcm06cm90YXRlWCgxMDBkZWcpO29wYWNpdHk6MH0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLWljb257MCV7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9MTAwJXt0cmFuc2Zvcm06cm90YXRlWCgwKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1yb3RhdGUtbG9hZGluZ3swJXt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bil7b3ZlcmZsb3c6aGlkZGVufWJvZHkuc3dhbDItaGVpZ2h0LWF1dG97aGVpZ2h0OmF1dG8haW1wb3J0YW50fWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lcnt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6YXV0bzttYXgtd2lkdGg6Y2FsYygxMDAlIC0gLjYyNWVtICogMik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyPi5zd2FsMi1tb2RhbHtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsLjQpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7dG9wOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1sZWZ0LGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnR7dG9wOjA7bGVmdDowfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7dG9wOjA7cmlnaHQ6MH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItbGVmdCxib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0e3RvcDo1MCU7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kLGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHR7dG9wOjUwJTtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b217Ym90dG9tOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1sZWZ0LGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnR7Ym90dG9tOjA7bGVmdDowfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tcmlnaHR7cmlnaHQ6MDtib3R0b206MH1AbWVkaWEgcHJpbnR7Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKXtvdmVyZmxvdy15OnNjcm9sbCFpbXBvcnRhbnR9Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKT5bYXJpYS1oaWRkZW49dHJ1ZV17ZGlzcGxheTpub25lfWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bikgLnN3YWwyLWNvbnRhaW5lcntwb3NpdGlvbjpzdGF0aWMhaW1wb3J0YW50fX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9we3RvcDowO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1yaWdodHt0b3A6MDtyaWdodDowO2JvdHRvbTphdXRvO2xlZnQ6YXV0b31ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWxlZnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1zdGFydHt0b3A6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6MH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWxlZnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydHt0b3A6NTAlO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXJ7dG9wOjUwJTtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXJpZ2h0e3RvcDo1MCU7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG87dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnR7dG9wOmF1dG87cmlnaHQ6YXV0bztib3R0b206MDtsZWZ0OjB9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbXt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTowO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tcmlnaHR7dG9wOmF1dG87cmlnaHQ6MDtib3R0b206MDtsZWZ0OmF1dG99Iik7"}]},{"name":"解锁B站大会员番剧、B站视频解析下载;全网VIP视频免费破解去广告;全网音乐直接下载;油管、Facebook等国外视频解析下载;网盘搜索引擎破解无限下载等","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["*://*.youku.com/v_*","*://*.iqiyi.com/v_*","*://*.iqiyi.com/w_*","*://*.iqiyi.com/a_*","*://*.le.com/ptv/vplay/*","*://v.qq.com/x/cover/*","*://v.qq.com/x/page/*","*://v.qq.com/tv/*","*://*.tudou.com/listplay/*","*://*.tudou.com/albumplay/*","*://*.tudou.com/programs/view/*","*://*.mgtv.com/b/*","*://film.sohu.com/album/*","*://tv.sohu.com/v/*","*://*.bilibili.com/video/*","*://*.bilibili.com/bangumi/play/*","*://*.baofeng.com/play/*","*://vip.pptv.com/show/*","*://v.pptv.com/show/*","*://www.le.com/ptv/vplay/*","*://www.wasu.cn/Play/show/*","*://m.v.qq.com/x/cover/*","*://m.v.qq.com/x/page/*","*://m.v.qq.com/*","*://m.iqiyi.com/*","*://m.iqiyi.com/kszt/*","*://m.youku.com/alipay_video/*","*://m.mgtv.com/b/*","*://m.tv.sohu.com/v/*","*://m.film.sohu.com/album/*","*://m.le.com/ptv/vplay/*","*://m.pptv.com/show/*","*://m.acfun.cn/v/*","*://m.bilibili.com/video/*","*://m.bilibili.com/anime/*","*://m.bilibili.com/bangumi/play/*","*://m.wasu.cn/Play/show/*","*://www.youtube.com","*://www.youtube.com/","*://www.youtube.com/watch*","*://www.facebook.com/*","*://yt1s.com/facebook-downloader","*music.163.com*","*://y.qq.com*","*://www.kugou.com*","*://www.kuwo.cn*","*://www.lizhi.fm*","*://*.ximalaya.com*","*://music.migu.cn*","*://*.taobao.com/*","*://*detail.tmall.com/*","*://*detail.tmall.hk/*","*://*item.jd.com/*","*://item.yiyaojd.com/*","*://npcitem.jd.hk/*","*://www.laisoyixia.com/download/detail**"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["tt.shuqiandiqiu.com","api.bilibili.com"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1637743499578,"data":{}},"enabled":true,"position":5,"file_url":"https://greasyfork.org/scripts/418804-%E8%A7%A3%E9%94%81b%E7%AB%99%E5%A4%A7%E4%BC%9A%E5%91%98%E7%95%AA%E5%89%A7-b%E7%AB%99%E8%A7%86%E9%A2%91%E8%A7%A3%E6%9E%90%E4%B8%8B%E8%BD%BD-%E5%85%A8%E7%BD%91vip%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A-%E5%85%A8%E7%BD%91%E9%9F%B3%E4%B9%90%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD-%E6%B2%B9%E7%AE%A1-facebook%E7%AD%89%E5%9B%BD%E5%A4%96%E8%A7%86%E9%A2%91%E8%A7%A3%E6%9E%90%E4%B8%8B%E8%BD%BD-%E7%BD%91%E7%9B%98%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E7%A0%B4%E8%A7%A3%E6%97%A0%E9%99%90%E4%B8%8B%E8%BD%BD%E7%AD%89/code/%E8%A7%A3%E9%94%81B%E7%AB%99%E5%A4%A7%E4%BC%9A%E5%91%98%E7%95%AA%E5%89%A7%E3%80%81B%E7%AB%99%E8%A7%86%E9%A2%91%E8%A7%A3%E6%9E%90%E4%B8%8B%E8%BD%BD%EF%BC%9B%E5%85%A8%E7%BD%91VIP%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A%EF%BC%9B%E5%85%A8%E7%BD%91%E9%9F%B3%E4%B9%90%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD%EF%BC%9B%E6%B2%B9%E7%AE%A1%E3%80%81Facebook%E7%AD%89%E5%9B%BD%E5%A4%96%E8%A7%86%E9%A2%91%E8%A7%A3%E6%9E%90%E4%B8%8B%E8%BD%BD%EF%BC%9B%E7%BD%91%E7%9B%98%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E7%A0%B4%E8%A7%A3%E6%97%A0%E9%99%90%E4%B8%8B%E8%BD%BD%E7%AD%89.user.js","uuid":"337bf3d7-77c9-4b14-9f16-f4ebe3733afa","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIOino+mUgULnq5nlpKfkvJrlkZjnlarliafjgIFC56uZ6KeG6aKR6Kej5p6Q5LiL6L2977yb5YWo572RVklQ6KeG6aKR5YWN6LS556C06Kej5Y675bm/5ZGK77yb5YWo572R6Z+z5LmQ55u05o6l5LiL6L2977yb5rK5566h44CBRmFjZWJvb2vnrYnlm73lpJbop4bpopHop6PmnpDkuIvovb3vvJvnvZHnm5jmkJzntKLlvJXmk47noLTop6Pml6DpmZDkuIvovb3nrYkKLy8gQG5hbWVzcGFjZSAgICAgICAgIHN1cGVyX3ZpZGVvX2hlbHBlcl9jYXQKLy8gQHZlcnNpb24gICAgICAgICAgIDMuMi41Ci8vIEBkZXNjcmlwdGlvbiAgICAgICDjgJDinaTvuI8g6KeG6aKR6Ieq5Yqo6Kej5p6Q77yM5L2T5Lya5oul5pyJVklQ55qE5oSf6KeJ4p2k77iPIOOAkeWKn+iDveacie+8mjHjgIHop6PplIFC56uZ5aSn5Lya5ZGY55Wq5Ymn44CBQuermeinhumikeino+aekOS4i+i9ve+8mzLjgIHniLHlpYfoibrjgIHohb7orq/jgIHkvJjphbfjgIHoipLmnpznrYnlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYoo5YWN6Lez5Ye66KeC5b2x54m55pa55L6/44CQUEPnq68r56e75Yqo56uv44CRKe+8mzPjgIHnvZHmmJPkupHpn7PkuZDjgIFRUemfs+S5kOOAgemFt+eLl+OAgeicu+ick0ZN44CB6I2U5p6dRk3jgIHllpzpqazmi4npm4XnrYnpn7PkuZDlkozmnInlo7Dkuabpn7PpopHlhY3lrqLmiLfnq6/kuIvovb3vvJs044CB5rK5566h44CBRmFjZWJvb2vnrYnlm73lpJbop4bpopHop6PmnpDkuIvovb3vvJs144CB572R55uY5pCc57Si5byV5pOOKOadpeaQnOS4gOS4iyB3d3cubGFpc295aXhpYS5jb20p56C06Kej5peg6ZmQ5LiL6L2977ybNuOAgeS8mOaDoOWIuOafpeivouetieOAkOiEmuacrOmVv+acn+e7tOaKpOabtOaWsO+8jOWujOWFqOWFjei0ue+8jOaXoOW5v+WRiuOAkQovLyBAYXV0aG9yICAgICAgICAgICAg54ix55S755S755qE54yrCi8vIEBpY29uICAgICAgICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFDUzBsRVFWUllSOFdYejJvVFVSVEd2M01ucHFoTkt5MVVXbXhSVEdkYWlMU1FSS2tLSW9LNEZWclJQb0h1N0JNWW4wQjMrZ1FxdXVpdWlDNmthRlZzQWhHRVprS3FHLytWcnRwMFlXc3lSMjdLbEV3ejB4bm5UM0xnd2pCMzd2bCs5N3R6ejl3aGREaW93L3B3QkNqb2ZOMEFKb2h3S1Fna014WUY4RG10MGJ4ZG5oYUFRb1dUWE1jekVOSkJoRnZHTWdxazRHWTZTWlhtUGd2QW15L2NuWWlqR3Fyd3ZtVFZIU1F1cDJqTHZHMEJ5SmY1RVlEYlVRSUFlSnhSNlU0TFFIR1YxVm9kZXNUaWpmUXhCZHJrYVNyTDZ6MEhsc3Q4aTRBbjdRQmdZRGFyMGxNcmdNNDVJdHhyQ3dEamZsYWpuQytBdFI4R3ZuOHpHcHo5eHdWT2pvci9abWEvQU50L0dJc0xOV3h0OHA3bzRJaUFtbExRUCtDOXB2a0crRm95VVB4WXM1MnhoRkRQS0loM3VSdmlHMkNsV0lkc1RwSG9KWXltRk5kbGlRekFCQnNhRVpnNHArRHdVZnRsaVJ4QWdnd09DMHhkaWRtYTFSYUFJOTJFYTlPSE9nY3dQcWxBTnJ1STFBRWxoc2EyZEJLWFFKRUJuRGdsR2x2eFdOL0JOY0UzZ0t5Q1M2OWI2NEFVbE1JU3dFdjRCcERKMzc3OGkvWGZ1NVhRdEZ0YUxxKzlSaUNBNmdaai9kY3VRTjhBdWRvZDZrdm9kWVp1ejlrN1VPSzdKUERBYlhBWS9XeGdManRHRHkyZjQwOFZQaThNTElVaDRKYkRFTGh3TmtudkxRRHlRTm9UaDg3QWtGdUNJUDBFL056Y2dXWWVUQzBiZHJrTnA2TG05YmM0WU00cXIvTnpFR2FDek5KeExPTkZScU1iemYyMkpTdS93bGNwaGh3enBzSUFJY0lIcmlHWEdhZFgrL01kV0RQZmxUalJ4Y0gra0xZSmhZdGo1UGl6NC8wZ0Y0WVZOams2RHZBUERiMGFNRXI4L25FQUFBQUFTVVZPUks1Q1lJST0KLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnlvdWt1LmNvbS92XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmlxaXlpLmNvbS92XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmlxaXlpLmNvbS93XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmlxaXlpLmNvbS9hXyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmxlLmNvbS9wdHYvdnBsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3YucXEuY29tL3gvY292ZXIvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3YucXEuY29tL3gvcGFnZS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vdi5xcS5jb20vdHYvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyoudHVkb3UuY29tL2xpc3RwbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnR1ZG91LmNvbS9hbGJ1bXBsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyoudHVkb3UuY29tL3Byb2dyYW1zL3ZpZXcvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyoubWd0di5jb20vYi8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vZmlsbS5zb2h1LmNvbS9hbGJ1bS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vdHYuc29odS5jb20vdi8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5iaWxpYmlsaS5jb20vdmlkZW8vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyouYmlsaWJpbGkuY29tL2Jhbmd1bWkvcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5iYW9mZW5nLmNvbS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly92aXAucHB0di5jb20vc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vdi5wcHR2LmNvbS9zaG93LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cubGUuY29tL3B0di92cGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3Lndhc3UuY24vUGxheS9zaG93LyoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnYucXEuY29tL3gvY292ZXIvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20udi5xcS5jb20veC9wYWdlLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnYucXEuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLmlxaXlpLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5pcWl5aS5jb20va3N6dC8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS55b3VrdS5jb20vYWxpcGF5X3ZpZGVvLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLm1ndHYuY29tL2IvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20udHYuc29odS5jb20vdi8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5maWxtLnNvaHUuY29tL2FsYnVtLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLmxlLmNvbS9wdHYvdnBsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20ucHB0di5jb20vc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5hY2Z1bi5jbi92LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLmJpbGliaWxpLmNvbS92aWRlby8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5iaWxpYmlsaS5jb20vYW5pbWUvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20uYmlsaWJpbGkuY29tL2Jhbmd1bWkvcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS53YXN1LmNuL1BsYXkvc2hvdy8qCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnlvdXR1YmUuY29tCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnlvdXR1YmUuY29tLwovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy55b3V0dWJlLmNvbS93YXRjaCoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuZmFjZWJvb2suY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly95dDFzLmNvbS9mYWNlYm9vay1kb3dubG9hZGVyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEBpbmNsdWRlICAgICAgCSAgKm11c2ljLjE2My5jb20qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8veS5xcS5jb20qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3Lmt1Z291LmNvbSoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cua3V3by5jbioKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cubGl6aGkuZm0qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi54aW1hbGF5YS5jb20qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbXVzaWMubWlndS5jbioKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnRhb2Jhby5jb20vKgovLyBAaW5jbHVkZSAgICAgIAkgICo6Ly8qZGV0YWlsLnRtYWxsLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgCSAgKjovLypkZXRhaWwudG1hbGwuaGsvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyppdGVtLmpkLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vaXRlbS55aXlhb2pkLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbnBjaXRlbS5qZC5oay8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LmxhaXNveWl4aWEuY29tL2Rvd25sb2FkL2RldGFpbCoqCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2pxdWVyeUAzLjIuMS9kaXN0L2pxdWVyeS5taW4uanMKLy8gQGNvbm5lY3QJCQkgIHR0LnNodXFpYW5kaXFpdS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGFwaS5iaWxpYmlsaS5jb20KLy8gQGdyYW50ICAgICAgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgICAgICAgR01fb3BlbkluVGFiCi8vIEBncmFudCAgICAgICAgICAgICBHTS5vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTS5nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNLnNldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgICAgR00ueG1sSHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGxpY2Vuc2UgICAgICAgICAgIEdQTCBMaWNlbnNlCi8vIEBjaGFyc2V0CQkgICAgICBVVEYtOAovLyBAYW50aWZlYXR1cmUgIAkgIHJlZmVycmFsLWxpbmsg44CQ5bqUR3JlYXN5Rm9ya+S7o+eggeinhOiMg+imgeaxgu+8muWQq+acieS8mOaDoOWIuOWKn+iDveeahOiEmuacrOW/hemhu+a3u+WKoOatpOaPkOekuu+8jOaPkuS7tuS7heaPkOS+m+S8mOaDoOWIuOaPkOmGkuWSjOinguW9seebuOWFs+WKn+iDve+8jOaXoOS7u+S9leW8uuWItuihjOS4uuOAkQovLyBAb3JpZ2luYWwtYXV0aG9yICAg5qmY5a2Q54ix5ZOtCi8vIEBvcmlnaW5hbC1saWNlbnNlICBBR1BMIExpY2Vuc2UKLy8gQG9yaWdpbmFsLXNjcmlwdCAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8zOTA5NTIKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoJdmFyICQgPSAkIHx8IHdpbmRvdy4kOwoJCgkvL+WmguaenOacrOWcsOWAvOS4jeiDvea7oei2s+mcgOaxgu+8jOWPr+iHquWumuS5iea3u+WKoOaOpeWPo+WIsOatpOWkhAoJLy/ms6jmhI/mlbDmja7moLzlvI8KCS8vY2F0ZWdvcnk9MTrlhajnvZFWSVDop6PmnpDlhoXltYzpobXmkq3mlL4KCS8vY2F0ZWdvcnk9MjrlhajnvZFWSVDop6PmnpDmlrDlu7rpobXpnaLmkq3mlL4KCWNvbnN0IGN1c3RvbWl6ZUludGVyZmFjZUxpc3Q9WwoJCS8veyBuYW1lOiLlsLHmmK/lkI3lrZfogIzlt7IiLCBjYXRlZ29yeToiMSIsIHVybDoiaHR0cHM6Ly9qeC5pZGMxMjYubmV0L2p4Lz91cmw9In0sCgkJLy97IG5hbWU6IuWwseaYr+WQjeWtl+iAjOW3siIsIGNhdGVnb3J5OiIyIiwgdXJsOiJodHRwczovL2p4LmlkYzEyNi5uZXQvangvP3VybD0ifSwKCV07CgkKCS8v6KeG6aKRdmlw6Kej5p6Q5pS26ZuG6Ieq6ISa5pys77yaCgkvL2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8zOTA5NTIKCS8vaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM5ODE5NQoJCgkvL+m7mOiupOiHquWKqOino+aekOaOpeWPo+W6j+WPt++8jOWPr+iHquWumuS5ieS/ruaUuQoJY29uc3QgZGVmYXVsdFZpcEludGVyZmFjZUluZGV4ID0gMzsKCQoJLy/pu5jorqRWSVDop6PmnpDmjqXlj6MKCWNvbnN0IG9yaWdpbmFsSW50ZXJmYWNlTGlzdCA9IFsKCQl7Im5hbWUiOiLnuq/lh4AvQuermSIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vejEubTE5MDcuY24vP2p4PSJ9LAoJCXsibmFtZSI6IumrmOmAn+aOpeWPoyIsImNhdGVnb3J5IjoiMSIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vanNhcC5hdHRha2lkcy5jb20vP3VybD0ifSwKCQl7Im5hbWUiOiLnu7zlkIgvQuermTEiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL3ZpcC5wYXJ3aXguY29tOjQ0MzMvcGxheWVyLz91cmw9In0sCgkJeyJuYW1lIjoiT0vop6PmnpAiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL29ranguY2MvP3VybD0ifSwKCQl7Im5hbWUiOiLkuZDlpJrotYTmupAiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2FwaS5sZWR1b3R2LmNvbS93cC1hcGkvaWZyLnBocD9pc0RwPTEmdmlkPSJ9LAoJCXsibmFtZSI6IkJMIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly92aXAuYmxqaWV4LmNvbS8/dj0ifSwKCQl7Im5hbWUiOiJjY3lqamQiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2NrbW92LmNjeWpqZC5jb20vY2ttb3YvP3VybD0ifSwKCQl7Im5hbWUiOiJNM1U4IiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9qeC5tM3U4LnR2L2ppZXhpLz91cmw9In0sCgkJeyJuYW1lIjoi5LiD5ZOlIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9qeC5tbWt2LmNuL3R2LnBocD91cmw9In0sCgkJeyJuYW1lIjoi6ICB5p2/IiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly92aXAubGFvYmFuZHEuY29tL2ppZXhpLnBocD91cmw9In0sCgkJeyJuYW1lIjoi55uY5Y+kIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly93d3cucGFuZ3VqaWV4aS5jYy9qaWV4aS5waHA/dXJsPSJ9LAoJCXsibmFtZSI6IuWkp+eZvSIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vYXBpLm15emNoLmNuLz91cmw9In0sCgkJeyJuYW1lIjoiQ0siLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL3d3dy5ja3BsYXllci52aXAvamlleGkvP3VybD0ifSwKCQl7Im5hbWUiOiJDSG9rIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0ifSwKCQl7Im5hbWUiOiLkupHngrnmkq0iLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2FwaS5pb3Blbnl1bi5jb206ODgvdmlwLz91cmw9In0sCgkJeyJuYW1lIjoi6Jm+57GzIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9qeC54bWZsdi5jb20vP3VybD0ifSwKCQl7Im5hbWUiOiI2MThHIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9qeC42MThnLmNvbS8/dXJsPSJ9LAoJCXsibmFtZSI6ImNrbW92IiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly93d3cuY2ttb3YudmlwL2FwaS5waHA/dXJsPSJ9LAoJCXsibmFtZSI6IuaykOeZvSIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vd3d3Lm1pZWRlLnRvcC9qaWV4aS8/dXJsPSJ9LAoJCXsibmFtZSI6IlJESEsiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2p4LnJkaGsubmV0Lz92PSJ9LAoJCXsibmFtZSI6IueIseixhiIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vanguYWlkb3Vlci5uZXQvP3VybD0ifSwKCQl7Im5hbWUiOiJIOCIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vd3d3Lmg4anguY29tL2ppZXhpLnBocD91cmw9In0sCgkJeyJuYW1lIjoi6Kej5p6QbGEiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2FwaS5qaWV4aS5sYS8/dXJsPSJ9LAoJCXsibmFtZSI6IuS5heaSrSIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vanguaml1Ym9qeC5jb20vdmlwLnBocD91cmw9In0sCgkJeyJuYW1lIjoi5Lmd5YWrIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9qeC55b3V5aXR2LmNvbS8/dXJsPSJ9LAoJCXsibmFtZSI6IuiAgeadvyIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vdmlwLmxhb2JhbmRxLmNvbS9qaWV4aS5waHA/dXJsPSJ9LAoJCXsibmFtZSI6IlNNWVMiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2p4eC5zbXlzOC5jbi9pbmRleC5waHA/dXJsPSJ9LAoJCXsibmFtZSI6Ik1VVFYiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2ppZXhpLmphbmFuLm5ldC9qaWV4aS8/dXJsPSJ9LAoJCXsibmFtZSI6IuaYjuaXpSIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vangueWluZ3hpYW5nYmFvLmNuL3ZpcC5waHA/dXJsPSJ9LAoJCXsibmFtZSI6Ik9LIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9va2p4LmNjLz91cmw9In0sCgkJeyJuYW1lIjoi57u05aSaIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9qeC5pdml0by5jbi8/dXJsPSJ9LAoJCXsibmFtZSI6IuWwj+iSiyIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vd3d3LmtwZXpwLmNuL2psZXhpLnBocD91cmw9In0sCgkJeyJuYW1lIjoi5pif6amwIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly92aXAuY2p5cy50b3AvP3VybD0ifSwKCQl7Im5hbWUiOiLmmJ/nqboiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwOi8vNjBqeC5jb20vP3VybD0ifSwKCQl7Im5hbWUiOiIwNTIzIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9nby55aDA1MjMuY24veS5jeT91cmw9In0sCgkJeyJuYW1lIjoiMTfkupEiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL3d3dy4xNzE3eXVuLmNvbS9qeC90eS5waHA/dXJsPSJ9LAoJCXsibmFtZSI6IjRLIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly9qeC40a2R2LmNvbS8/dXJsPSIsInQiOiJtIn0sCgkJeyJuYW1lIjoiNjYiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2FwaS4zangudG9wL3ZpcC8/dXJsPSJ9LAoJCXsibmFtZSI6IjExNiIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vanguMTE2a2FuLmNvbS8/dXJsPSJ9LAoJCXsibmFtZSI6IjIwMCIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vdmlwLjY2cGFyc2UuY2x1Yi8/dXJsPSJ9LAoJCXsibmFtZSI6IuS6keaekCIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vangueXBhcnNlLmNvbS9pbmRleC5waHA/dXJsPSJ9LAoJCXsibmFtZSI6IjgwOTAiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL3d3dy44MDkwZy5jbi8/dXJsPSJ9LAoJCXsibmFtZSI6IuaciOS6riIsImNhdGVnb3J5IjoiMSIsInVybCI6Imh0dHBzOi8vYXBpLnl1ZWxpYW5nanguY29tLz91cmw9In0sCgkJeyJuYW1lIjoi6L+q5aWlIiwiY2F0ZWdvcnkiOiIxIiwidXJsIjoiaHR0cHM6Ly8xMjMuMWRpb3IuY24vP3VybD0ifSwKCQl7Im5hbWUiOiLlsI/ni7wiLCJjYXRlZ29yeSI6IjEiLCJ1cmwiOiJodHRwczovL2p4Lnlhb2h1YXh1YW4uY29tLz91cmw9In0sCgkJeyJuYW1lIjoi57u85ZCI57q/6Lev6Kej5p6QIiwiY2F0ZWdvcnkiOiIyIiwidXJsIjoiaHR0cHM6Ly93d3cuc2hvd3hpLnh5ei9tb3Yvcy8/c3Y9MyZ1cmw9In0sCgkJeyJuYW1lIjoi57qv5YeA6Kej5p6QIiwiY2F0ZWdvcnkiOiIyIiwidXJsIjoiaHR0cHM6Ly96MS5tMTkwNy5jbi8/ang9In0sCgkJeyJuYW1lIjoi6auY6YCf5o6l5Y+jMSIsImNhdGVnb3J5IjoiMiIsInVybCI6Imh0dHBzOi8vanNhcC5hdHRha2lkcy5jb20vP3VybD0ifSwKCQl7Im5hbWUiOiLpq5jpgJ/mjqXlj6MyIiwiY2F0ZWdvcnkiOiIyIiwidXJsIjoiaHR0cHM6Ly9hcGkuc2lndWp4LmNvbS8/dXJsPSJ9LAoJCXsibmFtZSI6IkLnq5nop6PmnpAxIiwiY2F0ZWdvcnkiOiIyIiwidXJsIjoiaHR0cHM6Ly92aXAucGFyd2l4LmNvbTo0NDMzL3BsYXllci8/dXJsPSJ9LAoJCXsibmFtZSI6IkLnq5nop6PmnpAyIiwiY2F0ZWdvcnkiOiIyIiwidXJsIjoiaHR0cHM6Ly93d3cuY3Vhbi5sYS9tM3U4LnBocD91cmw9In0sCgkJeyJuYW1lIjoiQ2twbGF5ZXIiLCJjYXRlZ29yeSI6IjIiLCJ1cmwiOiJodHRwczovL3d3dy5ja3BsYXllci52aXAvamlleGkvP3VybD0ifSwKCQl7Im5hbWUiOiLkuZDlpJrotYTmupAiLCJjYXRlZ29yeSI6IjIiLCJ1cmwiOiJodHRwczovL2FwaS5sZWR1b3R2LmNvbS93cC1hcGkvaWZyLnBocD9pc0RwPTEmdmlkPSJ9LAoJCXsibmFtZSI6ImNjeWpqZCIsImNhdGVnb3J5IjoiMiIsInVybCI6Imh0dHBzOi8vY2ttb3YuY2N5ampkLmNvbS9ja21vdi8/dXJsPSJ9LAoJCXsibmFtZSI6Ik0zVTgiLCJjYXRlZ29yeSI6IjIiLCJ1cmwiOiJodHRwczovL2p4Lm0zdTgudHYvamlleGkvP3VybD0ifSwKCQl7Im5hbWUiOiJCTCIsImNhdGVnb3J5IjoiMiIsInVybCI6Imh0dHBzOi8vdmlwLmJsamlleC5jb20vP3Y9In0sCgkJeyJuYW1lIjoiTWFv6Kej5p6QIiwiY2F0ZWdvcnkiOiIyIiwidXJsIjoiaHR0cHM6Ly9xZC5oeHlzLnR2L20zdTgucGhwP3VybD0ifQoJXTsKCWNvbnN0IHBsYXllck5vZGVzID0gWwoJCXsgdXJsOiJ2LnFxLmNvbSIsIG5vZGU6IiNtb2RfcGxheWVyIn0sCgkJeyB1cmw6Ind3dy5pcWl5aS5jb20iLCBub2RlOiIjZmxhc2hib3gifSwKCQl7IHVybDoidi55b3VrdS5jb20iLCBub2RlOiIjcGxheWVyIn0sCgkJeyB1cmw6IncubWd0di5jb20iLCBub2RlOiIjbWd0di1wbGF5ZXItd3JhcCJ9LAoJCXsgdXJsOiJ3d3cubWd0di5jb20iLCBub2RlOiIjbWd0di1wbGF5ZXItd3JhcCJ9LAoJCXsgdXJsOiJ0di5zb2h1LmNvbSIsIG5vZGU6IiNwbGF5ZXIifSwKCQl7IHVybDoiZmlsbS5zb2h1LmNvbSIsIG5vZGU6IiNwbGF5ZXJXcmFwIn0sCgkJeyB1cmw6Ind3dy5sZS5jb20iLCBub2RlOiIjbGVfcGxheWJveCJ9LAoJCXsgdXJsOiJ2aWRlby50dWRvdS5jb20iLCBub2RlOiIudGQtcGxheWJveCJ9LAoJCXsgdXJsOiJ2LnBwdHYuY29tIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94In0sCgkJeyB1cmw6InZpcC5wcHR2LmNvbSIsIG5vZGU6Ii53LXZpZGVvIn0sCgkJeyB1cmw6Ind3dy53YXN1LmNuIiwgbm9kZToiI2ZsYXNoQ29udGVudCJ9LAoJCXsgdXJsOiJ3d3cuYWNmdW4uY24iLCBub2RlOiIjcGxheWVyIn0sCgkJeyB1cmw6Ind3dy5iaWxpYmlsaS5jb20iLCBub2RlOiIjcGxheWVyX21vZHVsZSJ9LAoJCXsgdXJsOiJ2aXAuMTkwNS5jb20iLCBub2RlOiIjcGxheWVyIn0sCgldOwoJCgkvL+iHquWumuS5ieaOpeWPo+WSjOm7mOiupOaOpeWPo+e7keWumgoJbGV0IG5ld09yaWdpbmFsSW50ZXJmYWNlTGlzdCA9IG9yaWdpbmFsSW50ZXJmYWNlTGlzdDsKCXRyeXsKCQluZXdPcmlnaW5hbEludGVyZmFjZUxpc3QgPSBjdXN0b21pemVJbnRlcmZhY2VMaXN0LmNvbmNhdChvcmlnaW5hbEludGVyZmFjZUxpc3QpOwoJfWNhdGNoKGUpewoJCWNvbnNvbGUubG9nKCLoh6rlrprkuYnop6PmnpDmjqXlj6PplJnor6/vvIzms6jmhI/mlbDmja7moLzlvI8uLi4uIik7Cgl9CgkKCS8qKgoJICog5YWx5pyJ5pa55rOV77yM5YWo5bGA5YWx5LqrCgkgKi8KCWZ1bmN0aW9uIGNvbW1vbkZ1bmN0aW9uKCl7CgkJdGhpcy5HTWdldFZhbHVlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IC8v5b6X5Yiw5a2Y5Zyo5pys5Zyw55qE5pWw5o2uCgkJCWlmICh0eXBlb2YgR01fZ2V0VmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKCQkJCXJldHVybiBHTV9nZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gR00uZ2V0VmFsdWUobmFtZSwgdmFsdWUpOwoJCQl9CgkJfTsKCQl0aGlzLkdNc2V0VmFsdWUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSl7CgkJCWlmICh0eXBlb2YgR01fc2V0VmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKCQkJCXJldHVybiBHTV9zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gR00uc2V0VmFsdWUobmFtZSwgdmFsdWUpOwoJCQl9CgkJfTsKCQl0aGlzLkdNYWRkU3R5bGUgPSBmdW5jdGlvbihjc3MpewoJCQl2YXIgbXlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgkJCW15U3R5bGUudGV4dENvbnRlbnQgPSBjc3M7CgkJCXZhciBkb2MgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCQkJZG9jLmFwcGVuZENoaWxkKG15U3R5bGUpOwoJCX07CgkJdGhpcy5HTW9wZW5JblRhYiA9IGZ1bmN0aW9uKHVybCwgb3Blbl9pbl9iYWNrZ3JvdW5kKXsKCQkJaWYgKHR5cGVvZiBHTV9vcGVuSW5UYWIgPT09ICJmdW5jdGlvbiIpIHsKCQkJCUdNX29wZW5JblRhYih1cmwsIG9wZW5faW5fYmFja2dyb3VuZCk7CgkJCX0gZWxzZSB7CgkJCQlHTS5vcGVuSW5UYWIodXJsLCBvcGVuX2luX2JhY2tncm91bmQpOwoJCQl9CgkJfTsKCQl0aGlzLmFkZFNjcmlwdCA9IGZ1bmN0aW9uKHVybCl7CgkJCXZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CgkJCXMuc2V0QXR0cmlidXRlKCdzcmMnLHVybCk7CgkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocyk7CgkJfTsKCQl0aGlzLnJhbmRvbU51bWJlciA9IGZ1bmN0aW9uKCl7CgkJCXJldHVybiBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDApOwoJCX07CgkJdGhpcy5yZXF1ZXN0ID0gZnVuY3Rpb24obW90aGVkLCB1cmwsIHBhcmFtKXsgICAvL+e9kee7nOivt+axggoJCQlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKCQkJCUdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCQl1cmw6IHVybCwKCQkJCQltZXRob2Q6IG1vdGhlZCwKCQkJCQlkYXRhOnBhcmFtLAoJCQkJCW9ubG9hZDogZnVuY3Rpb24ocmVzcG9uc2UpIHsKCQkJCQkJdmFyIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1czsKCQkJCQkJdmFyIHBsYXl1cmwgPSAiIjsKCQkJCQkJaWYoc3RhdHVzPT0yMDB8fHN0YXR1cz09JzIwMCcpewoJCQkJCQkJdmFyIHJlc3BvbnNlVGV4dCA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsKCQkJCQkJCXJlc29sdmUoeyJyZXN1bHQiOiJzdWNjZXNzIiwgImRhdGEiOnJlc3BvbnNlVGV4dH0pOwoJCQkJCQl9ZWxzZXsKCQkJCQkJCXJlamVjdCh7InJlc3VsdCI6ImVycm9yIiwgImRhdGEiOm51bGx9KTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9KQoJCX07CgkJdGhpcy53ZWJUb2FzdCA9IGZ1bmN0aW9uKHBhcmFtcykgewkvL+Wwj+aPkOekuuahhgoJCSAgICB2YXIgdGltZSA9IHBhcmFtcy50aW1lOwoJCSAgICB2YXIgYmFja2dyb3VuZCA9IHBhcmFtcy5iYWNrZ3JvdW5kOwoJCSAgICB2YXIgY29sb3IgPSBwYXJhbXMuY29sb3I7CgkJICAgIHZhciBwb3NpdGlvbiA9IHBhcmFtcy5wb3NpdGlvbjsgIC8vY2VudGVyLXRvcCwgY2VudGVyLWJvdHRvbQoJCSAgICB2YXIgZGVmYXVsdE1hcmdpblZhbHVlID0gNTA7CgkJICAgIAoJCSAgICBpZih0aW1lID09IHVuZGVmaW5lZCB8fCB0aW1lID09ICcnKXsKCQkgICAgICAgIHRpbWUgPSAxNTAwOwoJCSAgICB9CgkJICAgIAoJCSAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQkgICAgZWwuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJ3ZWItdG9hc3Qta2tsaTkiKTsKCQkgICAgZWwuaW5uZXJIVE1MID0gcGFyYW1zLm1lc3NhZ2U7CgkJICAgIC8v6IOM5pmv6aKc6ImyCgkJICAgIGlmKGJhY2tncm91bmQ9PXVuZGVmaW5lZCB8fCBiYWNrZ3JvdW5kPT0nJyl7CgkJICAgIAllbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9YmFja2dyb3VuZDsKCQkgICAgfQoJCSAgICAvL+Wtl+S9k+minOiJsgoJCSAgICBpZihjb2xvcj09dW5kZWZpbmVkIHx8IGNvbG9yPT0nJyl7CgkJICAgIAllbC5zdHlsZS5jb2xvcj1jb2xvcjsKCQkgICAgfQoJCSAgICAKCQkgICAgLy/mmL7npLrkvY3nva4KCQkgICAgaWYocG9zaXRpb249PXVuZGVmaW5lZCB8fCBwb3NpdGlvbj09JycpewoJCSAgICAJcG9zaXRpb24gPSAiY2VudGVyLWJvdHRvbSI7CgkJICAgIH0KCQkgICAgCgkJICAgIC8v6K6+572u5pi+56S65L2N572u77yM5b2T5YmN5pyJ56eN5Lik56eN5b2i5byPCgkJICAgIGlmKHBvc2l0aW9uPT09ImNlbnRlci1ib3R0b20iKXsKCQkgICAgCWVsLnN0eWxlLmJvdHRvbSA9IGRlZmF1bHRNYXJnaW5WYWx1ZSsicHgiOyAKCQkgICAgfWVsc2V7CgkJICAgIAllbC5zdHlsZS50b3AgPSBkZWZhdWx0TWFyZ2luVmFsdWUrInB4IjsgCgkJICAgIH0KCQkJZWwuc3R5bGUuekluZGV4PTk5OTk5OTsKCQkgICAgCgkJICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpOwoJCSAgICBlbC5jbGFzc0xpc3QuYWRkKCJmYWRlSW4iKTsKCQkgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CgkJICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCJmYWRlSW4iKTsKCQkgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoImZhZGVPdXQiKTsKCQkgICAgICAgIC8q55uR5ZCs5Yqo55S757uT5p2f77yM56e76Zmk5o+Q56S65L+h5oGv5YWD57SgKi8KCQkgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsIGZ1bmN0aW9uICgpIHsKCQkgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsKTsKCQkgICAgICAgIH0pOwoJCSAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigid2Via2l0QW5pbWF0aW9uRW5kIiwgZnVuY3Rpb24gKCkgewoJCSAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpOwoJCSAgICAgICAgfSk7CgkJICAgIH0sIHRpbWUpOwoJCX0KCX0KCWNvbnN0IGNvbW1vbkZ1bmN0aW9uT2JqZWN0ID0gbmV3IGNvbW1vbkZ1bmN0aW9uKCk7ICAvL+WFqOWxgOe7n+S4gOWPmOmHjwoJCgkvKioKCSAqIOi2hee6p+ino+aekOWKqeaJiwoJICogQHBhcmFtIHtPYmplY3R9IG9yaWdpbmFsSW50ZXJmYWNlTGlzdAoJICogQHBhcmFtIHtPYmplY3R9IHBsYXllck5vZGVzCgkgKi8KCWZ1bmN0aW9uIHN1cGVyVmlkZW9IZWxwZXIob3JpZ2luYWxJbnRlcmZhY2VMaXN0LCBwbGF5ZXJOb2Rlcyl7CgkJdGhpcy5vcmlnaW5hbEludGVyZmFjZUxpc3QgPSBvcmlnaW5hbEludGVyZmFjZUxpc3Q7CgkJdGhpcy5jaGVja2JveF90cnVlX2ltYWdlID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0NBWUFBQUJYQXZtSEFBQUFBWE5TUjBJQXJzNGM2UUFBQTJ0SlJFRlVhRVB0bWt2b1RWMFl4bi9QVUNaaVJQSzVEUTFJekh3VG9VeElyaVc1NUZvR1JNaUVjaStYZ1Z5ajNIS1B6eTJSRkVxSlVBWVNoVWdwdnBKU1VxOWVyZlB2MkoyOTk5cjdmNXl6eWFwemRxZjlYcDVudld1OTZ6MXJMWkZvWnRZYkdBVU1EODhCU1prVy8zNEJYQWZ1K1ZQU20zci9xdjloWnR1QUdVQ1BGb09NZGZjQk9DeHBhVTJoZzRDWldheVZLc2hKK29IOXg1ZVpUUVdPVndGWUFRelRKSjJRbVhVSEhnQjlDeWhYUWZRbE1OUUp6QVAyVmdGUkNRenpuY0FSWUhvSjVTcW9ISFVDSG9wL3FvQ21CSVpYVHVDM3lqNUprbjhKbEFoN25vcVBpQ2xCNkZTZWNOVWk4QTJZS3Vsc1dKOG1BWmtrcWtUZ3EvZThwUE9KOGlhVFJGVUlmQWs5ZjZGQmNla0xyZGRBRFZzVkNId080QzgzUW1obXE0RjFWU1h3S1F5YnF5bmdGd0s3c2laeU95UHdmK2o1YXluZ293ck1kaEh3TWUwVDlrWUsrTkdBVCtZdVZVeWo3MFBQMzB3QlB5eUE3NVVIM3QrM09nTHZBdmhiS2VEN0EvOEJnMkxBRnlFd1B4aGNBL1NNTlo2UWV4dkEzMGtCM3kyQS83ZUkvWmdJVEpaME9xeU0zak9iZ2JGRm5BQ3ZBL2k3YVhwbTVtTitYRUc3dVVPb0EzeGlkZlM4N1BrNXBubTU3aFBXZHhVYU5qTTdDTXlLTVphVXlZckFTMG45TXB4T0NORVltT0hZdDBTOHRybWZZV2NyMExITFVKUkUzaEE2SVdsYWhuTW42RVBLNjVWa2V4YkFQOHpRejF4bFk4amtFWEFiaHlUTnpESm1acXVBRFhVeVR3UDR4eG5nYzFmWlpoRndPL3NsK1ovLzFHWm1ZNEQxUVdDbXBDY1o0Q2NESjJNQTVzbkVSS0JtWTZla3hYa0c4OTZiMlVqZ1lzd3FtMmZMM3hjaDRQSmJKUzJMTWR4SXhzeUdBSmVBcUZVMnhrOVJBbTV6ZzZUWUZOcUJ3Y3o2QUY0eVI2K3l2NHFBMjEwamFXMk1BNWN4czY3QUZhRFFLaHRqdjB3RWFuWlhTdklVbXR2TTdCd3dQbGV3aEVCbkNMaTdKWkoyNUdTbkE4RHNFdGlpVkRwTHdKMHNrclE3WmRKdUFaWkhJU2twMUF3QzducU9KSzluNmlmdENtQlRTVnpSYXMwaTRBNm5Tem9XSnUxY1lGODBpazRJTnBPQXc2Z1ZaWDVVMVpMV2JBSXRBVjN2NUMrQmxuZDV3cUZINERuUTdyUGdzdjN3d2dsNERsOVExa0tiOWZZNEFmOHYrbE1PYnpPb0l1NW5Pd0cvV3ZDb3dxZnphWVI4ZDI5dzdhRGI4L2FTSXRRcklMdmRyeHo4R1ZjTmFyMFpyaHhzclBDcHZlOHhyZklyQmpYTVA5MVdDWFdNbjRoTUJFYUVUN3ZQa0Y4QnQ4UG5qS1NQOWNQM093Y3lnWk8zd0VzQ0FBQUFBRWxGVGtTdVFtQ0MiOwoJCXRoaXMuY2hlY2tib3hfZmFsc2VfaW1hZ2UgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3Q0FZQUFBQlhBdm1IQUFBQUFYTlNSMElBcnM0YzZRQUFBYVpKUkVGVWFFUHRtazFPQWtFVWhMODZpSDliUFlEUnFKR1ZKekRSSytqZXJiQjE1NFlyNkY0WDdpVGl6d1ZjdVJIeElNOU13cENoQVFQMFl4aElkekloRFBPcVgxVjF6NklMc2VSRFM5NC9xMG5Bek02QUMyQU4yRnl3U3gzZ0YyaEt1Zzk3R1hMQXpLNkIrb0tiSGpkOVhWS2orT01BQVRQYkE5NHIybnplMXI2a2oveExTS0FOSEZTY3dLdWt3M0VFZm9EMWdNQUQ4QWg4bFV4c0d6Z0Zqb041dTVJMnhoR3c0T0UzU1F0MXhNeWVReEtTK2lzblhFSWhnYUZOVTdJTG1Gbm1RRWFpUDZZaFVKUFVLcnZwY0Q0ekd4QTJFU2pia2VSQTJZcW5QVkJRSUwyRlBKWmYyc1FlS3NaZ0pBZGkxUE9vVFE1NHFCaURrUnlJVWMrak5qbmdvV0lNUm5JZ1JqMlAydVNBaDRveEdNbUJHUFU4YXBNREhpckdZQ1FIWXRUenFJMXg0RkpTMDZPSldUSE03QVI0S3RaUGN6YmFrbFNiZFhLUE9qUDdCSFltSmZBOUl0VExUcWNiWlo5U205a3VjQXRrbjhYUmtiU1Yzd2p6Z1JlZ0g5OTRLRGdIakxha28zRUVzbmoxYmc2VGVrS2VGK1BXMVlwWmM1bDZjZXROTC9BTFF6OVBOU2ZCNmdMWmRWV01WMGN1b1VuUXF2Yk1hdjVYb21vcS85ZlBIMEk0WDBDdStGT2lBQUFBQUVsRlRrU3VRbUNDIjsKCQl0aGlzLmVsZW1lbnRJZCA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMCk7CgkJdGhpcy5sb2NhdGlvblNhdmVLZXkgPSAiYXV0b2xheWVkX2lzb3Blbl8iK3dpbmRvdy5sb2NhdGlvbi5ob3N0OwoJCXRoaXMuaXNSdW4gPSBmdW5jdGlvbigpeyAvL+WIpOaWreaYr+WQpui/kOihjAoJCQl2YXIgdXJscyA9IFsiaXFpeWkuY29tIiwidi5xcS5jb20iLCJ5b3VrdS5jb20iLCAibGUuY29tIiwidHVkb3UuY29tIiwibWd0di5jb20iLCJzb2h1LmNvbSIsICJhY2Z1bi5jbiIsImJpbGliaWxpLmNvbSIsImJhb2ZlbmcuY29tIiwicHB0di5jb20iXTsKCQkJZm9yKHZhciBpPTA7IGk8dXJscy5sZW5ndGg7aSsrKXsKCQkJCWlmKCh3aW5kb3cubG9jYXRpb24uaG9zdCE9PSJiaWxpYmlsaS5jb20iICYmIHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YodXJsc1tpXSkhPS0xKSAKCQkJCQl8fCAod2luZG93LmxvY2F0aW9uLmhvc3Q9PT0iYmlsaWJpbGkuY29tIiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJiYW5ndW1pL3BsYXkiKSE9LTEpKXsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfTsKCQl0aGlzLmlubmVyUGFyc2UgPSBmdW5jdGlvbih1cmwpIHsgLy/lhoXltYzop6PmnpAKCQkJJCgiI2lmcmFtZS1wbGF5ZXItOTkwODdsa2oiKS5hdHRyKCJzcmMiLCB1cmwpOwoJCX07CgkJdGhpcy5zaG93UGxheVdpbmRvdyA9IGZ1bmN0aW9uKHBsYXlPYmplY3QpewoJCQl2YXIgbm9kZSA9IG51bGw7CgkJCWZvcih2YXIgaSBpbiBwbGF5ZXJOb2RlcykgeyAvL+iOt+W+l+eql+WPo0lECgkJCQlpZiAocGxheWVyTm9kZXNbaV0udXJsID09IHdpbmRvdy5sb2NhdGlvbi5ob3N0KSB7CgkJCQkJbm9kZSA9IHBsYXllck5vZGVzW2ldLm5vZGU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJaWYoIW5vZGUpewoJCQkJY29uc29sZS5sb2coIuaSreaUvm5vZGXmn6Xmib7lpLHotKUuLi4uIik7CgkJCQlyZXR1cm47CgkJCX0KCQkJdmFyIHZpZGVvUGxheWVyID0gJCgiPGRpdiBzdHlsZT0nd2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjEwMDA7Jz48aWZyYW1lIGlkPSdpZnJhbWUtcGxheWVyLTk5MDg3bGtqJyBmcmFtZWJvcmRlcj0nMCcgYWxsb3dmdWxsc2NyZWVuPSd0cnVlJyB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJz48L2lmcmFtZT48L2Rpdj4iKTsKCQkJdmFyIGNhdGVnb3J5ID0gcGxheU9iamVjdC5jYXRlZ29yeTsKCQkJdmFyIHVybCA9IHBsYXlPYmplY3QudXJsICsgd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCWlmIChjYXRlZ29yeT09PSIxIikgeyAvL+WGheW1jOaSreaUvi4uLi4KCQkJCS8v5rKh5pyJ5re75Yqg5YiZ5Yib5bu65LiA5LiqZGl25pS+6Kej5p6QSFRNTAoJCQkJaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpZnJhbWUtcGxheWVyLTk5MDg3bGtqIikgPT0gbnVsbCkgewoJCQkJCXZhciBwbGF5ZXIgPSAkKG5vZGUpOwoJCQkJCXBsYXllci5lbXB0eSgpOwoJCQkJCXBsYXllci5hcHBlbmQodmlkZW9QbGF5ZXIpOwoJCQkJfQoJCQkJdGhpcy5pbm5lclBhcnNlKHVybCk7ICAvL+aKiuaSreaUvumTvuaOpeWKoOWFpeWIsOiHquWumuS5ieeahGRpdgoJCQl9CgkJCWlmIChjYXRlZ29yeT09PSIyIil7ICAvL+W8ueeql+aSreaUvi4uLi4KCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNb3BlbkluVGFiKHVybCwgZmFsc2UpOwoJCQl9CgkJfTsKCQl0aGlzLmFkZEh0bWxFbGVtZW50cyA9IGZ1bmN0aW9uKCl7CgkJCXZhciB2aXBWaWRlb0ltYWdlQmFzZTY0ID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0NBWUFBQUJYQXZtSEFBQUM5a2xFUVZSb1ErMlpQV2dWUVJESC83L0NXcU9JWU9GSEZiUlNqSmhHTUdEcEJ5b0lhZ283MGNxdlV0UWdkaXBXRnFhd01XZ2hHSWlkaGNIS1FBSnFFVVJCUmZFRDFDQ0NqYzNJUHU0ZW0zMTc3NUo3ZDNtOGNBdFgzTzdzelA3blB6c3p4NkVlSC9UNCtWVUQ2RGFEVFFiTWJFKzNEN01ZKzhDa2t3OEJQRnVNa2k3S0R0VUF1dWg5WjNvWk10QmxqeFkyWDllQndxNHJhV1BOUUVtT0xLeG0rVEJnWnFza25RMWRBVnpOY28rWmhXc202WmFrSFpMQzFtUXlyWjVPWDJSdnpNeG5TYThselFKL1l3THpHREN6ZTVKT2VvSS9nYlZ0QU14SjZ2UFc3d0tua3I0cWJFdWF4Y2NEY0dXQnNmTlYwbWpNbVNHQWc1TEdBNlhiZ0ZlaElUUGJMZWw1TU44NFpBVUFVak1QZ1dPK3paWTdZR2J2SlcwT3ZSb0I4RWpTRVc5K0JoaEl2T3ZDcDB3R2ZQUGJnWmZwUkF6QVRVbm41NkdFbUp5TGQzOWNCTnhlRjk5RkFEVGE0MkJza3VRZWY0d0RoOW9CMkNYcFJiRHBNUEE0blRPejA1THVCRExyZ1crZEFBQ0dJa3hma0hURG0vOERyTXdFa0J4Z09za2txZHdFY01BRDRHTGYzWUYwUEFDT2UrdUZHTWdBNEJqNEVBQWJBR2JjWExRT21Oa2xTZGVDVFJ1QlQyYldMK2xOc0xZZmVGSVJnSDJTSmdKN0d3Q1hZak1CckpiMEs5alVpSEV6RzVGMDJWdWJBOWI0c2tYdlFNaUFtVzJWZEZTU24yNC9BczBrazFtSnpleXBwTDNld2FhQm5XWTJLMm1MTno4UzV1ZUNBTUx3ejNxL0RaeHJld2VTZTNCQzB2MUFpN3RrWVhyc0I5Nld3TUJDQWZRQnYzTUJKQ0QrU1ZyaGFYYVo1NHozUGdVTWhwWXJaS0NGN2JiTm5KazVCaHdUNmZnaHlXOHRob0d4aWdFNG15NnRYd2VtUWx0NUFHSTFvYW1EU0lGTG1DdVVSaVc1Qk9HUEw4QzdkckdWMjA2YjJYZEo2eUpLeG9EaG1QS0NJZVM2MVpaQ2xuY3hGZ0xBdGN5eHJuRXdSbWtuREZRRklGWVRXbkovQ1Ztb0dnWVNqN1o4MU9SODZMZzdzT2dQbW5ZNnMwSXBONFR5WXJEYjZ6V0Ftb0VPUFZDSFVJY083SGg3L1llbVl4Y1dVN0FNZjNCa05HREYvRlA5cmt3R3FqZGRrb1dXdjVRbDZWMXlOWFVkV0hLWEJ3Wjdub0gvZFArSFFOcWhlVG9BQUFBQVNVVk9SSzVDWUlJPSI7CgkJCXZhciBwbGF5ZWRJbWFnZUJhc2U2NCA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFBQVhOU1IwSUFyczRjNlFBQUJNaEpSRUZVYUVQdFdVdW9IVVVRUGNlOW55UzQwL2hCRWNIUHdpK2lvQ0NLbjRoQkRhTGl3b1ZCSmJ1QWlTNk1McUpSZ2lMNFN3UTNpcEFnQm1PTWlCaURBWlhvd2tRUTR3ZU5vcUlZalhIalFvNmMyUDNvMTIvbVRzMjljNUVITmd5UGQ2ZXI2cHp1NnVxcUdtS2VEODV6L1BpZlFONUJTY2NEV0FMZ0RBQ0xpK2NJQUQ4QytLSDR1NFBrdGlGMmY2SWRrSFFPZ0N2U2MybFBRUHNCUEE5Z0M4bTlQV1ZucG85RklBRy9FNENmSWNaV0FDdEo3dXVyckRjQlNjK05BTDRMd05zQXZrelBGd0Qrcmx6cVRBQzNBRGk2QW1zQzY2ZEtRTko3QUM2dWpIajFOaHM0U2Z0NmFFaTZDVUIrTExPQTVPOGg0V0pTZUFja2ZadFdNb3NiK0FhU3IvYzFXczZYZENMSmI3cCthN01SSWlCSmxZTFZKQitaQkhpYnJLUnJBWGh4UUxJVFgrY0VTWjhBT0tzd3VKVGtsbW1BdDA1Sm01SnIrZCtUNnQycDdZNGtVQ2tMcmNnUXhGS2cyQnB4ejFZQ0RkSG1YSklmRHdGd1NCMk5CRktjLzZnd3RKemtoaUVOUjNWSk9nYkFEUUEya1R3VWNxRnE5YjJWMTBVTkRqMnZDQ0M3U1o3ZlNhQmg5WmRFZkhGbzRPbEFId2ZndTBMM2xTVGZLbTNOY1NGSkR3QllreWFGVjcrUXMrd1RKQThPUVVyU2F5bEp0THFOSkdlbEwwMEVQZ0J3UVRKK0I4a1hJa0NxdStMelJPTFppT3lvT1pJTTJPbUx4d0dTaTFwM1FOTEpBTDRxSml3bVdXNWhxNjJHeTg1emR3SjRsT1Fia3hDUjlBZUFJNU9PRzBtK2t2WE4yZ0ZKS3dBOG1WNDJIcG8ySUMwRThuUmZUcmVUL0dzY0lsVlFXVTl5WlJ1QnB3SGNsVjZ1SWZsZzFHQUhnYXhtTGNuN296cnpQRW5HWkd3ZUw1TjBObnQ0MUR2Z3hPeWE5TzQya2k5RmpRVUpXTjB2QUc0bStVNFAzY2FVazhaM1NWN1dSbUFQQU9mckhoZVMvTENIa1RyaDZ4TGRTVEpVeFVreUptUHoyRWZ5dERZQ3pzZHpvYkdJNUlFdUZNVTI5eVZnMGMwa2wzWFprR1JNdVZZNFJQS29DSUdGSkgvclVqNGhnZmRKWHRSbFE5SUNoOUEwN3lCSnB4ZU5aNkIwb1Y3Slc0OHprRzAvQnVBaGtuOEdDTGg1a0hPenZTUm4wdnRSaDNnWlNaZUtvZEdEZ0Evak9wS3VuME1qbFo4T3hSN2JTTHJvYWR5Qk1veXVJcmt1Wk9IZlFxVHJEUGlDTlBDTlVaMkZlOTRMSUZlQXo1Qzh1NDJBWHp5VlhtNG5lWFhVV0FlQng5T04vRk5VWHpsUGttL3lxOUp2OTVETWQ4S2NlOERkTlRlYzhnaEhvaFlDYnliZ084WUJiaGxKQ3dIOFdzalBTbStha2prYnkvRTVmSmxKK2huQXNjbVFPeGpPZ1daV2FnSUN0d0o0TWNuUHVzVDhXeE9CMVFEV0pvRys2YlNKZjVwOC9mdHhRVmZ1VTZiVDk1Rjh1SHpmUktBTVdaNzdYeFkwTXkyV0JIcE9hRytyaWN2MllYZ1hobGp4RWF2dkp0cnkya2EwcUo5YUk2dU50S1JWQUVwM2FieFkrN1JWcHRyUXFsYitlZ0N2RnI4MXJuN2pJYTRVeldybVJscDlRN2hSRlpKM2tieWtUVytrdFZnM2RYdmxTSDBJTlhSRTlwTThZWlNPVGdMcE1xblRoTUViWFZYeGZoaHpaTWREQkJLSnVzazdWSHZkb2RLZEIzOWZ5Mk1QeWJNanV4Y21rRWlVbmVPczMwUjg0UHlCSTlyQmNNcHlPWUNsRlhEckRCVTUyWGd2QW9uRXFFOU11NTN1VnArWUxIWXFnRlBTNC9yMnZKYlZiWTAyWXgvaUpzRXBmT1J6NDlqZ2UzZS9lKzlBRldhZGR0aUhuZXJtYmw3RWRUM0hEWVB0N2phTUEzeHNGeHB4YzdxclovYzR2Zm9xYVJHbjZQbjVMRlZWWDBlWlRoeEdoekEwTFIwVHVkQzBRUFhSTys4Si9BT25ZdkZBdEdoS3ZBQUFBQUJKUlU1RXJrSmdnZz09IjsKCQkJdmFyIGNhdGVnb3J5XzFfaHRtbCA9ICIiOwoJCQl2YXIgY2F0ZWdvcnlfMl9odG1sID0gIiI7CgkJCXRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQlpZiAoaXRlbS5jYXRlZ29yeSA9PT0gIjEiKSB7CgkJCQkJY2F0ZWdvcnlfMV9odG1sICs9ICI8bGkgdGl0bGU9JyIraXRlbS5uYW1lKyInIGRhdGEtaW5kZXg9JyIraW5kZXgrIic+IiArIGl0ZW0ubmFtZSArICI8L2xpPiI7CgkJCQl9CgkJCQlpZiAoaXRlbS5jYXRlZ29yeSA9PT0gIjIiKSB7CgkJCQkJY2F0ZWdvcnlfMl9odG1sICs9ICI8bGkgdGl0bGU9JyIraXRlbS5uYW1lKyInIGRhdGEtaW5kZXg9JyIraW5kZXgrIic+IiArIGl0ZW0ubmFtZSArICI8L2xpPiI7CgkJCQl9CgkJCX0pOwkKCQkJCgkJCS8v6I635b6X6Ieq5a6a5LmJ5L2N572uCgkJCXZhciBsZWZ0ID0gMDsKCQkJdmFyIHRvcCA9IDEzMDsKCQkJdmFyIFBvc2l0aW9uID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgiUG9zaXRpb25fIiArIHdpbmRvdy5sb2NhdGlvbi5ob3N0KTsKCQkJaWYoISFQb3NpdGlvbil7CgkJCQlsZWZ0ID0gUG9zaXRpb24ubGVmdDsKCQkJCXRvcCA9IFBvc2l0aW9uLnRvcDsKCQkJfQoJCQl2YXIgY3NzTW91bGQgPSBgI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2Age2N1cnNvcjpwb2ludGVyOyBwb3NpdGlvbjpmaXhlZDsgdG9wOmAgKyB0b3AgKyBgcHg7IGxlZnQ6YCArIGxlZnQgKyBgcHg7IHdpZHRoOjBweDsgei1pbmRleDo5OTk7IGZvbnQtc2l6ZToxNnB4OyB0ZXh0LWFsaWduOmxlZnQ7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmltZ19ib3h7d2lkdGg6MjZweDsgaGVpZ2h0OjMycHg7bGluZS1oZWlnaHQ6MzJweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNFNTIxMkU7bWFyZ2luOjVweCAwcHg7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmltZ19ib3ggPmltZyB7d2lkdGg6MjBweDsgZGlzcGxheTppbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTt9CgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uIHtkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OjI2cHg7IHRvcDowOyB0ZXh0LWFsaWduOmNlbnRlcjsgYmFja2dyb3VuZC1jb2xvcjojMjcyOTMwOyBib3JkZXI6MXB4IHNvbGlkIGdyYXk7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbiBsaXtib3JkZXItcmFkaXVzOjJweDsgZm9udC1zaXplOjEycHg7IGNvbG9yOiNEQ0RDREM7IHRleHQtYWxpZ246Y2VudGVyOyB3aWR0aDo2MHB4OyBsaW5lLWhlaWdodDoyMXB4OyBmbG9hdDpsZWZ0OyBib3JkZXI6MXB4IHNvbGlkIGdyYXk7IHBhZGRpbmc6MCA0cHg7IG1hcmdpbjo0cHggMnB4O292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTogbm93cmFwO3RleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOy1vLXRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbiBsaTpob3Zlcntjb2xvcjojRTUyMTJFOyBib3JkZXI6MXB4IHNvbGlkICNFNTIxMkU7fQoJCQkJCQkJCgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCBsaS5zZWxlY3RlZHtjb2xvcjojRTUyMTJFOyBib3JkZXI6MXB4IHNvbGlkICNFNTIxMkU7fQoJCQkJCQkJCgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAuc2VsZWN0ZWRfdGV4dCB7bWFyZ2luLXRvcDo1cHg7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnNlbGVjdGVkX3RleHQgLmltZ19ib3h7d2lkdGg6MjZweDsgaGVpZ2h0OjM1cHg7bGluZS1oZWlnaHQ6MzVweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNFNTIxMkU7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnNlbGVjdGVkX3RleHQgLmltZ19ib3ggPmltZyB7d2lkdGg6MjBweDsgaGVpZ2h0OjIwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTt9CgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfc2VsZWN0ZWQge2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDoyNnB4OyB0b3A6MDsgdGV4dC1hbGlnbjpjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6I0Y1RjZDRTsgYm9yZGVyOjFweCBzb2xpZCBncmF5O30KCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC52aXBfbW9kX2JveF9zZWxlY3RlZCB1bHtvdmVyZmxvdy15OiBhdXRvO30KCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC52aXBfbW9kX2JveF9zZWxlY3RlZCBsaXtib3JkZXItcmFkaXVzOjJweDsgZm9udC1zaXplOjEycHg7IGNvbG9yOiMzOTNBRTY7IHRleHQtYWxpZ246Y2VudGVyOyB3aWR0aDo5NXB4OyBsaW5lLWhlaWdodDoyN3B4OyBmbG9hdDpsZWZ0OyBib3JkZXI6MXB4IGRhc2hlZCBncmF5OyBwYWRkaW5nOjAgNHB4OyBtYXJnaW46NHB4IDJweDtkaXNwbGF5OmJsb2NrO3doaXRlLXNwYWNlOiBub3dyYXA7b3ZlcmZsb3c6IGhpZGRlbjt0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczt9CgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfc2VsZWN0ZWQgbGk6aG92ZXJ7Y29sb3I6I0U1MjEyRTsgYm9yZGVyOjFweCBzb2xpZCAjRTUyMTJFO30KCQkJCQkJCQkJCQkJCQkKCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC5kZWZhdWx0LXNjcm9sbGJhci01NTY3ODo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6NXB4OyBoZWlnaHQ6MXB4O30KCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC5kZWZhdWx0LXNjcm9sbGJhci01NTY3ODo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7Ym94LXNoYWRvdzppbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsgYmFja2dyb3VuZDojQThBOEE4O30KCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC5kZWZhdWx0LXNjcm9sbGJhci01NTY3ODo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7Ym94LXNoYWRvdzppbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsgYmFja2dyb3VuZDojRjFGMUYxO30KCQkJCQkJCQoJCQkJCQkJQGtleWZyYW1lcyBmYWRlSW4gewoJCQkJCQkJICAgIDAlICAgIHtvcGFjaXR5OiAwfQoJCQkJCQkJICAgIDEwMCUgIHtvcGFjaXR5OiAxfQoJCQkJCQkJfQoJCQkJCQkJQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbiB7CgkJCQkJCQkgICAgMCUgICAge29wYWNpdHk6IDB9CgkJCQkJCQkgICAgMTAwJSAge29wYWNpdHk6IDF9CgkJCQkJCQl9CgkJCQkJCQlALW1vei1rZXlmcmFtZXMgZmFkZUluIHsKCQkJCQkJCSAgICAwJSAgICB7b3BhY2l0eTogMH0KCQkJCQkJCSAgICAxMDAlICB7b3BhY2l0eTogMX0KCQkJCQkJCX0KCQkJCQkJCUAtby1rZXlmcmFtZXMgZmFkZUluIHsKCQkJCQkJCSAgICAwJSAgICB7b3BhY2l0eTogMH0KCQkJCQkJCSAgICAxMDAlICB7b3BhY2l0eTogMX0KCQkJCQkJCX0KCQkJCQkJCUAtbXMta2V5ZnJhbWVzIGZhZGVJbiB7CgkJCQkJCQkgICAgMCUgICAge29wYWNpdHk6IDB9CgkJCQkJCQkgICAgMTAwJSAge29wYWNpdHk6IDF9CgkJCQkJCQl9CgkJCQkJCQlAa2V5ZnJhbWVzIGZhZGVPdXQgewoJCQkJCQkJICAgIDAlICAgIHtvcGFjaXR5OiAxfQoJCQkJCQkJICAgIDEwMCUgIHtvcGFjaXR5OiAwfQoJCQkJCQkJfQoJCQkJCQkJQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXQgewoJCQkJCQkJICAgIDAlICAgIHtvcGFjaXR5OiAxfQoJCQkJCQkJICAgIDEwMCUgIHtvcGFjaXR5OiAwfQoJCQkJCQkJfQoJCQkJCQkJQC1tb3ota2V5ZnJhbWVzIGZhZGVPdXQgewoJCQkJCQkJICAgIDAlICAgIHtvcGFjaXR5OiAxfQoJCQkJCQkJICAgIDEwMCUgIHtvcGFjaXR5OiAwfQoJCQkJCQkJfQoJCQkJCQkJQC1vLWtleWZyYW1lcyBmYWRlT3V0IHsKCQkJCQkJCSAgICAwJSAgICB7b3BhY2l0eTogMX0KCQkJCQkJCSAgICAxMDAlICB7b3BhY2l0eTogMH0KCQkJCQkJCX0KCQkJCQkJCUAtbXMta2V5ZnJhbWVzIGZhZGVPdXQgewoJCQkJCQkJICAgIDAlICAgIHtvcGFjaXR5OiAxfQoJCQkJCQkJICAgIDEwMCUgIHtvcGFjaXR5OiAwfQoJCQkJCQkJfQoJCQkJCQkJLndlYi10b2FzdC1ra2xpOXsKCQkJCQkJCSAgICBwb3NpdGlvbjogZml4ZWQ7CgkJCQkJCQkgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpOwoJCQkJCQkJICAgIGNvbG9yOiAjZmZmOwoJCQkJCQkJICAgIGZvbnQtc2l6ZTogMTRweDsKCQkJCQkJCSAgICBsaW5lLWhlaWdodDogMTsKCQkJCQkJCSAgICBwYWRkaW5nOjEwcHg7CgkJCQkJCQkgICAgYm9yZGVyLXJhZGl1czogM3B4OwoJCQkJCQkJICAgIGxlZnQ6IDUwJTsKCQkJCQkJCSAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQkJCQkgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQkJCQkgICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQkJCQkgICAgLW8tdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwoJCQkJCQkJICAgIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQkJCQkgICAgei1pbmRleDogOTk5OTsKCQkJCQkJCSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQkJCQkJfQoJCQkJCQkJLmZhZGVPdXR7CgkJCQkJCQkgICAgYW5pbWF0aW9uOiBmYWRlT3V0IC41czsKCQkJCQkJCX0KCQkJCQkJCS5mYWRlSW57CgkJCQkJCQkgICAgYW5pbWF0aW9uOmZhZGVJbiAuNXM7CgkJCQkJCQl9CgkJCQkJCQlgCgkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNYWRkU3R5bGUoY3NzTW91bGQpOwoJCQkKCQkJLy/liKTmlq3oh6rliqjop6PmnpDnirbmgIEKCQkJdmFyIGNoZWNrYm94SW1hZ2UgPSAiIjsKCQkJaWYoISFjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHRoaXMubG9jYXRpb25TYXZlS2V5LCBudWxsKSl7CgkJCQljaGVja2JveEltYWdlID0gdGhpcy5jaGVja2JveF90cnVlX2ltYWdlOwoJCQl9ZWxzZXsKCQkJCWNoZWNrYm94SW1hZ2UgPSB0aGlzLmNoZWNrYm94X2ZhbHNlX2ltYWdlOwoJCQl9CgkJCQoJCQkvL+WKoOWFpUhUTUwKCQkJdmFyIGh0bWxNb3VsZCA9IGA8ZGl2IGlkPSd2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgJz4KCQkJCQkJCQk8ZGl2IGNsYXNzPSdwbHVnaW5faW5uZXJfYCt0aGlzLmVsZW1lbnRJZCtgJz4KCQkJCQkJCQkJPGRpdiBjbGFzcz0iaW1nX2JveCIgaWQ9ImltZ19ib3hfanVtcF82NjY3ODk3aWlvIj48aW1nIHNyYz0nYCsgdmlwVmlkZW9JbWFnZUJhc2U2NCArYCcgdGl0bGU9J+mAieaLqeino+aekOe6v+i3rycvPjwvZGl2PgoJCQkJCQkJCQk8ZGl2IGNsYXNzPSd2aXBfbW9kX2JveF9hY3Rpb24nID4KCQkJCQkJCQkJCTxkaXYgc3R5bGU9J2Rpc3BsYXk6ZmxleDsnPgoJCQkJCQkJCQkJCTxkaXYgc3R5bGU9J3BhZGRpbmc6MTBweCAwcHg7IHdpZHRoOjM4MHB4OyBtYXgtaGVpZ2h0OjQwMHB4OyBvdmVyZmxvdy15OmF1dG87JyAgY2xhc3M9ImRlZmF1bHQtc2Nyb2xsYmFyLTU1Njc4Ij4KCQkJCQkJCQkJCQkJPGRpdj4KCQkJCQkJCQkJCQkJCTxkaXYgc3R5bGU9J2ZvbnQtc2l6ZToxNnB4OyB0ZXh0LWFsaWduOmNlbnRlcjsgY29sb3I6I0U1MjEyRTsgcGFkZGluZzo1cHggMHB4Oyc+PGI+5YWo572RVklQ6KeG6aKR6Kej5p6QW+WGheW1jOaSreaUvl08L2I+PC9kaXY+CgkJCQkJCQkJCQkJCQk8dWw+CgkJCQkJCQkJCQkJCQkJYCArIGNhdGVnb3J5XzFfaHRtbCArIGAKCQkJCQkJCQkJCQkJCQk8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+CgkJCQkJCQkJCQkJCQk8L3VsPgoJCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCQkJPGRpdj4JCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCQk8ZGl2IHN0eWxlPSdmb250LXNpemU6MTZweDsgdGV4dC1hbGlnbjpjZW50ZXI7IGNvbG9yOiNFNTIxMkU7IHBhZGRpbmc6NXB4IDBweDsnPjxiPuWFqOe9kVZJUOinhumikeino+aekFvlvLnnqpfmkq3mlL5dPC9iPjwvZGl2PgoJCQkJCQkJCQkJCQkJPHVsPgoJCQkJCQkJCQkJCQkJYCArIGNhdGVnb3J5XzJfaHRtbCArIGAKCQkJCQkJCQkJCQkJCTxkaXYgc3R5bGU9J2NsZWFyOmJvdGg7Jz48L2Rpdj4KCQkJCQkJCQkJCQkJCTwvdWw+CgkJCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJCQk8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6I0ZGRjtmb250LXNpemU6MTBweDtwYWRkaW5nOjBweCAxMHB4O21hcmdpbi10b3A6MTBweDsiPgoJCQkJCQkJCQkJCQkJPGI+6Ieq5Yqo6Kej5p6Q6K+05piO77yaPC9iPgoJCQkJCQkJCQkJCQkJCTxicj4mbmJzcDsmbmJzcDsx44CB5byA5ZCv6Ieq5Yqo5byA5ZCv5ZCO77yM572R6aG15omT5byAMlPlkI7ohJrmnKzlsIboh6rliqjop6PmnpDop4bpopHjgILlpoLmnpzoh6rliqjop6PmnpDlpLHotKXvvIzor7fmiYvliqjpgInmi6nkuI3lkIznmoTop6PmnpDmjqXlj6PlsJ3or5XjgILvvIhQU++8muino+aekOaOpeWPo+acrOacieS6m+inhumikeayoei1hOa6kO+8jOi/meS4quS5n+ayoeWKnuazle+8iQoJCQkJCQkJCQkJCQkJCTxicj4mbmJzcDsmbmJzcDsy44CBPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPuWmguaenOafkOS6m+e9keermeacieS8muWRmOWPr+S7peWFs+mXreino+aekO+8jOWFs+mXreWKn+iDveebuOS6kueLrOeri++8jOS6kuS4jeW9seWTjTwvc3Bhbj4KCQkJCQkJCQkJCQkJCQk8YnI+Jm5ic3A7Jm5ic3A7M+OAgeiHquWKqOino+aekOm7mOiupOWFs+mXrQoJCQkJCQkJCQkJCQkJCTxicj4mbmJzcDsmbmJzcDs044CB5b2T5YmN5L2/55So55qE5piv56ysM+S4quaOpeWPo+S9nOS4uuiHquWKqOino+aekOm7mOiupOaOpeWPo++8jOW+gOWQjueJiOacrOWwhuWKoOWFpeiHquWumuS5ieiHquWKqOino+aekOaOpeWPowoJCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJpbWdfYm94IiBpZD0iaW1nX2JveF82NjY3ODk3aWlvIj48aW1nIHNyYz0nYCsgY2hlY2tib3hJbWFnZSArYCcgdGl0bGU9J+aYr+WQpuaJk+W8gOiHquWKqOino+aekOOAguiLpeiHquWKqOino+aekOWksei0pe+8jOivt+aJi+WKqOmAieaLqeWFtuWug+aOpeWPo+Wwneivle+8ge+8gScvPjwvZGl2PgoJCQkJCQkJPC9kaXY+CgkJCQkJCQlgOwoJCQkkKCJib2R5IikuYXBwZW5kKGh0bWxNb3VsZCk7CgkJfTsKCQl0aGlzLnJ1bkV2ZW50ID0gZnVuY3Rpb24oKXsJIC8v5LqL5Lu26L+Q6KGMCgkJCXZhciB0aGF0ID0gdGhpczsKCQkJCgkJCSQoIi5wbHVnaW5faW5uZXJfIit0aGlzLmVsZW1lbnRJZCkub24oIm1vdXNlb3ZlciIsICgpID0+IHsKCQkJCSQoIi52aXBfbW9kX2JveF9hY3Rpb24iKS5zaG93KCk7CgkJCX0pOwoJCQkkKCIucGx1Z2luX2lubmVyXyIrdGhpcy5lbGVtZW50SWQpLm9uKCJtb3VzZW91dCIsICgpID0+IHsKCQkJCSQoIi52aXBfbW9kX2JveF9hY3Rpb24iKS5oaWRlKCk7CgkJCX0pOwoJCQkkKCIudmlwX21vZF9ib3hfYWN0aW9uIGxpIikuZWFjaCgobGlJbmRleCwgaXRlbSkgPT4gewoJCQkJaXRlbS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKCQkJCQl2YXIgaW5kZXggPSBwYXJzZUludCgkKGl0ZW0pLmF0dHIoImRhdGEtaW5kZXgiKSk7CgkJCQkJdmFyIHBsYXlPYmplY3QgPSB0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdFtpbmRleF07CgkJCQkJdGhhdC5zaG93UGxheVdpbmRvdyhwbGF5T2JqZWN0KTsKCQkJCQkKCQkJCQkvL+aKiueCueWHu+i/h+eahOagh+e6ogoJCQkJCSQoIi52aXBfbW9kX2JveF9hY3Rpb24gbGkiKS5yZW1vdmVDbGFzcygic2VsZWN0ZWQiKTsKCQkJCQkkKGl0ZW0pLmFkZENsYXNzKCJzZWxlY3RlZCIpOwoJCQkJfSk7CgkJCX0pOwoJCQkKCQkJLy/pobXpnaLliqDovb0yc+WQjuiHquWumui/kOihjOino+aekAoJCQlzZXRUaW1lb3V0KCgpPT57CgkJCQlpZihjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHRoYXQubG9jYXRpb25TYXZlS2V5LCBudWxsKT09PSJ0cnVlIil7CgkJCQkJdGhhdC5zaG93UGxheVdpbmRvdyh0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdFtkZWZhdWx0VmlwSW50ZXJmYWNlSW5kZXgtMV0pOwoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuiHquWKqOino+aekOaIkOWKnyIsICJiYWNrZ3JvdW5kIjoiI0ZGRkZGRiJ9KTsKCQkJCX0KCQkJfSwyMDAwKTsKCQkJCgkJCS8v54K55Ye76KeG6aKR5pKt5pS+55WM6Z2iCgkJCSQoIiNpbWdfYm94X2p1bXBfNjY2Nzg5N2lpbyIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYigiaHR0cHM6Ly93d3cueGl4aWNhaS50b3AvbW92L3MvP3N2PTMmdXJsPSIrd2luZG93LmxvY2F0aW9uLmhyZWYsIGZhbHNlKTsKCQkJfSk7CgkJCQoJCQkvL+eCueWHu+WIh+aNouaYr+WQpuiHquWKqOino+aekAoJCQkkKCIjaW1nX2JveF82NjY3ODk3aWlvIikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCXZhciAkaW1hZ2UgPSAkKHRoaXMpLmZpbmQoImltZyIpOwoJCQkJaWYoY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSh0aGF0LmxvY2F0aW9uU2F2ZUtleSwgbnVsbCk9PT0idHJ1ZSIpewoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUodGhhdC5sb2NhdGlvblNhdmVLZXksIG51bGwpOwoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuiHquWKqOino+aekO+8muWFs+mXrSIsICJiYWNrZ3JvdW5kIjoiI0ZGRTAwOSJ9KTsKCQkJCQkkaW1hZ2UuYXR0cigic3JjIiwgdGhhdC5jaGVja2JveF9mYWxzZV9pbWFnZSk7CgkJCQl9ZWxzZXsKCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKHRoYXQubG9jYXRpb25TYXZlS2V5LCAidHJ1ZSIpOwoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuiHquWKqOino+aekO+8muaJk+W8gCIsICJiYWNrZ3JvdW5kIjoiI0ZGRTAwOSJ9KTsKCQkJCQkkaW1hZ2UuYXR0cigic3JjIiwgdGhhdC5jaGVja2JveF90cnVlX2ltYWdlKTsKCQkJCX0KCQkJfSk7CgkJCQoJCQkvL+WPs+mUruenu+WKqOS9jee9rgoJCQl2YXIgbW92aWVfYm94ID0gJCgiI3ZpcF9tb3ZpZV9ib3giK3RoaXMuZWxlbWVudElkKTsKCQkJbW92aWVfYm94Lm1vdXNlZG93bihmdW5jdGlvbihlKSB7CgkJCQlpZiAoZS53aGljaCA9PSAzKSB7CgkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpCgkJCQkJbW92aWVfYm94LmNzcygiY3Vyc29yIiwgIm1vdmUiKTsKCQkJCQl2YXIgcG9zaXRpb25EaXYgPSAkKHRoaXMpLm9mZnNldCgpOwoJCQkJCXZhciBkaXN0ZW5jZVggPSBlLnBhZ2VYIC0gcG9zaXRpb25EaXYubGVmdDsKCQkJCQl2YXIgZGlzdGVuY2VZID0gZS5wYWdlWSAtIHBvc2l0aW9uRGl2LnRvcDsKCQkJCQkKCQkJCQkkKGRvY3VtZW50KS5tb3VzZW1vdmUoZnVuY3Rpb24oZSkgewoJCQkJCQl2YXIgeCA9IGUucGFnZVggLSBkaXN0ZW5jZVg7CgkJCQkJCXZhciB5ID0gZS5wYWdlWSAtIGRpc3RlbmNlWTsKCQkJCQkJdmFyIHdpbmRvd1dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CgkJCQkJCXZhciB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7CgkJCQkJCQoJCQkJCQlpZiAoeCA8IDApIHsKCQkJCQkJCXggPSAwOwoJCQkJCQl9IGVsc2UgaWYgKHggPiAgd2luZG93V2lkdGgtIG1vdmllX2JveC5vdXRlcldpZHRoKHRydWUpIC0gMTAwKSB7CgkJCQkJCQl4ID0gd2luZG93V2lkdGggLSBtb3ZpZV9ib3gub3V0ZXJXaWR0aCh0cnVlKSAtIDEwMDsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJaWYgKHkgPCAwKSB7CgkJCQkJCQl5ID0gMDsKCQkJCQkJfSBlbHNlIGlmICh5ID4gd2luZG93SGVpZ2h0IC0gbW92aWVfYm94Lm91dGVySGVpZ2h0KHRydWUpKSB7CgkJCQkJCQl5ID0gd2luZG93SGVpZ2h0IC0gbW92aWVfYm94Lm91dGVySGVpZ2h0KHRydWUpOwoJCQkJCQl9CgkJCQkJCW1vdmllX2JveC5jc3MoImxlZnQiLCB4KTsKCQkJCQkJbW92aWVfYm94LmNzcygidG9wIiwgeSk7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoIlBvc2l0aW9uXyIgKyB3aW5kb3cubG9jYXRpb24uaG9zdCx7ICJsZWZ0Ijp4LCAidG9wIjp5fSk7CgkJCQkJfSk7CgkJCQkJJChkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbigpIHsKCQkJCQkJJChkb2N1bWVudCkub2ZmKCdtb3VzZW1vdmUnKTsKCQkJCQkJbW92aWVfYm94LmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKCQkJCQl9KTsKCQkJCQkkKGRvY3VtZW50KS5jb250ZXh0bWVudShmdW5jdGlvbihlKSB7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQl9KQoJCQkJfQoJCQl9KTsKCQl9OwoJCXRoaXMudmlkZUFkZW1vdmUgPSBmdW5jdGlvbigpewoJCQkvL+inhumikeW5v+WRiui/h+a7pOebuOWFs+S7o+eggeWAn+mJtOiHquWFtuWug+iEmuacrO+8jOivpemDqOWIhuS7o+eggeeJiOadg+W9kuWOn+S9nOiAheaJgOacie+8geWcqOatpOaEn+iwogoJCQkvL+WAn+mJtOiEmuacrOS9nOiAhe+8mnNpZ24KCQkJLy/lnLDlnYDvvJpodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDA2ODQ5CgkJCS8v5L+u5pS577ya5LyY5YyW5LqG6K+l5q615Luj56CB55qE6YC76L6R77yM5L2/5Y+v6K+75oCn5pu06auYCgkJCXN3aXRjaCAod2luZG93LmxvY2F0aW9uLmhvc3QpIHsKCQkJCWNhc2UgJ3d3dy5pcWl5aS5jb20nOgoJCQkJCXRyeXsKCQkJCQkJdW5zYWZlV2luZG93LnJhdGUgPSAwOwoJCQkJCQl1bnNhZmVXaW5kb3cuRGF0ZS5ub3cgPSAoKSA9PiB7CgkJCQkJCQlyZXR1cm4gbmV3IHVuc2FmZVdpbmRvdy5EYXRlKCkuZ2V0VGltZSgpICsgKHVuc2FmZVdpbmRvdy5yYXRlICs9IDEwMDApOwoJCQkJCQl9CgkJCQkJCXNldEludGVydmFsKCgpID0+IHsKCQkJCQkJCXVuc2FmZVdpbmRvdy5yYXRlID0gMDsKCQkJCQkJfSwgNjAwMDAwKTsKCQkJCQl9Y2F0Y2goZSl7fQoJCQkJCQoJCQkJCS8v5bm/5ZGK6L+H5rukaXFpeWnmnInngrnpl67popjvvIwxMHPlkI7lvqrnjq/nu5PmnZ8KCQkJCQlsZXQgaXFpeWlEZWxheSA9IDA7CgkJCQkJbGV0IGlxaXlpSW50ZXJ2YWwgPSAgc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJCQl0cnl7CgkJCQkJCQlsZXQgY3VwaWRQdWJsaWNUaW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiY3VwaWQtcHVibGljLXRpbWUiKTsKCQkJCQkJCWlmKGN1cGlkUHVibGljVGltZS5sZW5ndGghPTAgJiYgISFjdXBpZFB1YmxpY1RpbWVbMF0pewoJCQkJCQkJCSQoIi5za2lwcGFibGUtYWZ0ZXIiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKCQkJCQkJCQlsZXQgc2tpcHBhYmxlQWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJza2lwcGFibGUtYWZ0ZXIiKTsKCQkJCQkJCQlpZihza2lwcGFibGVBZnRlci5sZW5ndGghPTAgJiYgISFza2lwcGFibGVBZnRlclswXSl7CgkJCQkJCQkJCXNraXBwYWJsZUFmdGVyWzBdLmNsaWNrKCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJJCgiLnF5LXBsYXllci12aXBwYXktcG9wdXAiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoJCQkJCQkJJCgiLmJsYWNrLXNjcmVlbiIpLmNzcygiZGlzcGxheSIsICJub25lIik7CgkJCQkJCX1jYXRjaChlKXt9CgkJCQkJCWlmKGlxaXlpRGVsYXk+PTEwMDAwKXsKCQkJCQkJCWNsZWFySW50ZXJ2YWwoaXFpeWlJbnRlcnZhbCk7CgkJCQkJCX0KCQkJCQkJaXFpeWlEZWxheSArPSA1MDA7CgkJCQkJfSwgNTAwKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YucXEuY29tJzoKCQkJCQkvLyBzZXRJbnRlcnZhbCgoKSA9PiB7IC8v6KeG6aKR5bm/5ZGK5Yqg6YCfCgkJCQkJLy8gCXRyeXsKCQkJCQkvLyAJCSQoIi50eHBfYWQiKS5maW5kKCJ0eHBkaXYiKS5maW5kKCJ2aWRlbyIpWzBdLmN1cnJlbnRUaW1lID0gMTAwMDsKCQkJCQkvLyAJCSQoIi50eHBfYWQiKS5maW5kKCJ0eHBkaXYiKS5maW5kKCJ2aWRlbyIpWzFdLmN1cnJlbnRUaW1lID0gMTAwMDsKCQkJCQkvLyAJfWNhdGNoKGUpe30KCQkJCQkvLyB9LCAxMDAwKQoJCQkJCS8vIHNldEludGVydmFsKCgpID0+IHsKCQkJCQkvLyAJdHJ5ewoJCQkJCS8vIAkJdmFyIHR4cF9idG5fdm9sdW1lID0gJCgiLnR4cF9idG5fdm9sdW1lIik7CgkJCQkJLy8gCQlpZiAodHhwX2J0bl92b2x1bWUuYXR0cigiZGF0YS1zdGF0dXMiKSA9PT0gIm11dGUiKSB7CgkJCQkJLy8gCQkJJCgiLnR4cF9wb3B1cF92b2x1bWUiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKCQkJCQkvLyAJCQl0eHBfYnRuX3ZvbHVtZS5jbGljaygpOwoJCQkJCS8vIAkJCSQoIi50eHBfcG9wdXBfdm9sdW1lIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKCQkJCQkvLyAJCX0KCQkJCQkvLyAJCS8vJCgidHhwZGl2W2RhdGEtcm9sZT0naGQtYWQtYWRhcHRlci1hZGxheWVyJ10iKS5hdHRyKCJjbGFzcyIsICJ0eHBfbm9uZSIpOwoJCQkJCS8vIAkJJCgiLm1vZF92aXBfcG9wdXAiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoJCQkJCS8vIAkJJCgiLnR2aXBfbGF5ZXIiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoJCQkJCS8vIAkJJCgiI21hc2tfbGF5ZXIiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoJCQkJCS8vIAl9Y2F0Y2goZSl7fQoJCQkJCS8vIH0sIDUwMCk7CgkJCQkJCgkJCQkJYnJlYWsKCQkJCWNhc2UgJ3YueW91a3UuY29tJzoKCQkJCQl0cnl7CgkJCQkJCXdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJCQlpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3ZpZGVvJylbMF0pIHsKCQkJCQkJCQlzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkJCQkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3ZpZGVvJylbMV0ucGxheWJhY2tSYXRlID0gMTY7CgkJCQkJCQkJfSwgMTAwKQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfWNhdGNoKGUpe30KCQkJCQlzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkJCXRyeXsKCQkJCQkJCXZhciBINSA9ICQoIi5oNS1leHQtbGF5ZXIiKS5maW5kKCJkaXYiKQoJCQkJCQkJaWYoSDUubGVuZ3RoICE9IDApewoJCQkJCQkJCSQoIi5oNS1leHQtbGF5ZXIgZGl2IikucmVtb3ZlKCk7CgkJCQkJCQkJdmFyIGNvbnRyb2xfYnRuX3BsYXkgPSAkKCIuY29udHJvbC1sZWZ0LWdyaWQgLmNvbnRyb2wtcGxheS1pY29uIik7CgkJCQkJCQkJaWYgKGNvbnRyb2xfYnRuX3BsYXkuYXR0cigiZGF0YS10aXAiKSA9PT0gIuaSreaUviIpIHsKCQkJCQkJCQkJJCgiLmg1cGxheWVyLWRhc2hib2FyZCIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwoJCQkJCQkJCQljb250cm9sX2J0bl9wbGF5LmNsaWNrKCk7CgkJCQkJCQkJCSQoIi5oNXBsYXllci1kYXNoYm9hcmQiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCSQoIi5pbmZvcm1hdGlvbi10aXBzIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKCQkJCQkJfWNhdGNoKGUpe30KCQkJCQl9LCA1MDApOwoJCQkJCQoJCQkJCWJyZWFrCgkJCQljYXNlICd3d3cubWd0di5jb20nOgoJCQkJCQoJCQkJCWJyZWFrCgkJCQljYXNlICd0di5zb2h1LmNvbSc6CgkJCQkJc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQkJCQl0cnl7CgkJCQkJCQkkKCIueC12aWRlby1hZHYiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoJCQkJCQkJJCgiLngtcGxheWVyLW1hc2siKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoJCQkJCQkJJCgiI3BsYXllcl92aXBUaXBzIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKCQkJCQkJfWNhdGNoKGUpe30KCQkJCQl9LCA1MDApOwoJCQkJCQoJCQkJCWJyZWFrCgkJCQljYXNlICd3d3cuYmlsaWJpbGkuY29tJzoKCQkJCQlicmVhawoJCQl9CgkJfTsKCQkvL+WAn+mJtOiEmuacrOS9nOiAhe+8mmxhbmhhaGEgLCDniYjmnYPlvZLljp/kvZzogIXmiYDmnIkKCQkvL+WcsOWdgO+8mmh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8zNzA2MzQKCQkvL+S/ruaUue+8muS8mOWMluS6huivpeauteS7o+eggeeahOmAu+i+ke+8jOS9v+WPr+ivu+aAp+abtOmrmAoJCXRoaXMucGFnZUV2ZW50RXh0ZW5kID0gZnVuY3Rpb24oKXsKCQkJdmFyIHdpbmRvd191cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKCQkJaWYod2luZG93X3VybC5pbmRleE9mKCd2LnFxLmNvbS94L2NvdmVyJykgIT0gLTEpewoJCQkJJCgiYm9keSIpLm9uKCdtb3VzZW92ZXInLCAnLml0ZW0gYScsIGZ1bmN0aW9uKGUpIHsKCQkJCQlsZXQgJHBsYXllckl0ZW0gPSAkKHRoaXMpLCBocmVmID0gJHBsYXllckl0ZW0uYXR0cignaHJlZicpIHx8ICRwbGF5ZXJJdGVtLmRhdGEoImhyZWYiKTsKCQkJCQkkcGxheWVySXRlbS5vZmYoJ2NsaWNrLmNocm9tZScpOwoJCQkJCSRwbGF5ZXJJdGVtLm9uKCdjbGljay5jaHJvbWUnLCBmdW5jdGlvbigpIHsKCQkJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmCgkJCQkJfSkuYXR0cignZGF0YS1ocmVmJywgaHJlZikuY3NzKHsKCQkJCQkJY3Vyc29yOiAncG9pbnRlcicKCQkJCQl9KS5yZW1vdmVBdHRyKCdocmVmJykKCQkJCX0pCgkJCX1lbHNlIGlmKHdpbmRvd191cmwuaW5kZXhPZignaXFpeWkuY29tL3ZfJykgIT0gLTEpewoJCQkJCgkJCQlmdW5jdGlvbiByZW1vdmUoc2VsZWN0b3IpIHsKCQkJCQlpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQl2YXIgbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKCQkJCQlpZiAobm9kZXMpIHsKCQkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewoJCQkJCQkJaWYgKG5vZGVzW2ldICYmIG5vZGVzW2ldLnBhcmVudE5vZGUpIHsKCQkJCQkJCQlub2Rlc1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGVzW2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX07CgkJCQkKCQkJCWZ1bmN0aW9uIHJlbW92ZU9iaih0YXJnZXRTZWxlY3Rvciwgcm9vdFNlbGVjdG9yID0gJ2JvZHknLCB3YWl0KSB7CgkJCQkJY29uc3Qgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHJvb3RTZWxlY3Rvcik7CgkJCQkJY29uc3QgdGFyZ2V0RWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpOwoJCQkJCWlmICh0YXJnZXRFbGVtZW50KSB7CgkJCQkJCXJldHVybiBQcm9taXNlLnJlc29sdmUodGFyZ2V0RWxlbWVudCkKCQkJCQl9CgkJCQkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJCQkJY29uc3QgY2FsbGJhY2sgPSBmdW5jdGlvbihtYXRhdGlvbkxpc3QsIG9ic2VydmVyKSB7CgkJCQkJCQljb25zdCB0YXJnZXRFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7CgkJCQkJCQlpZiAodGFyZ2V0RWxlbWVudCkgewoJCQkJCQkJCXJlc29sdmUodGFyZ2V0RWxlbWVudCk7CgkJCQkJCQkJb2JzZXJ2ZXIuZGlzY29ubmVjdCgpCgkJCQkJCQl9CgkJCQkJCX07CgkJCQkJCWNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spOwoJCQkJCQlvYnNlcnZlci5vYnNlcnZlKHJvb3RFbGVtZW50LCB7CgkJCQkJCQlzdWJ0cmVlOiB0cnVlLAoJCQkJCQkJY2hpbGRMaXN0OiB0cnVlCgkJCQkJCX0pOwoJCQkJCQlpZiAod2FpdCAhPT0gdW5kZWZpbmVkKSB7CgkJCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJCQlvYnNlcnZlci5kaXNjb25uZWN0KCkKCQkJCQkJCX0sIHdhaXQpCgkJCQkJCX0KCQkJCQl9KQoJCQkJfTsKCQkJCQkJCQkJCgkJCQlhc3luYyBmdW5jdGlvbiByZW1vdmVBbGwodGFyZ2V0U2VsZWN0b3IsIHJvb3RTZWxlY3Rvciwgbm93ID0gZmFsc2UpIHsKCQkJCQlpZiAobm93KSB7CgkJCQkJCWNvbnN0IHBhcmVudCA9IHJvb3RTZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iocm9vdFNlbGVjdG9yKSA6IGRvY3VtZW50OwoJCQkJCQlpZiAocGFyZW50KSB7CgkJCQkJCQljb25zdCB0YXJnZXQgPSBwYXJlbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7CgkJCQkJCQlpZiAodGFyZ2V0KSB7CgkJCQkJCQkJdGFyZ2V0LnJlbW92ZSgpOwoJCQkJCQkJCXJldHVybiB0cnVlCgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcmV0dXJuIGZhbHNlCgkJCQkJfQoJCQkJCWNvbnN0IHRhcmdldCA9IGF3YWl0IHJlbW92ZU9iaih0YXJnZXRTZWxlY3Rvciwgcm9vdFNlbGVjdG9yKTsKCQkJCQl0YXJnZXQucmVtb3ZlKCkKCQkJCX07CgkJCQkKCQkJCXNldFRpbWVvdXQoKCk9PnsKCQkJCQlyZW1vdmUoJ2RpdiNzY3JvbGxUaXAsLnF5LWdsaWRlLCNxeS1nbGlkZSxbY2xhc3NePSJxeS1nbGlkZSJdLFtpZF49InF5LWdsaWRlIl0sc3ZnW2Rpc3BsYXk9Im5vbmUiXVthcmlhLWhpZGRlbj0idHJ1ZSJdLGRpdltjbGFzcyo9InBsYXllci1zaWRlLWVhciJdLGRpdltjbGFzc149InBsYXllci1tbmIiXVtkYXRhLWFzeW4tcGJdJyk7CgkJCQkJcmVtb3ZlQWxsKCdkaXZbc3R5bGUqPSJ2aXNpYmlsaXR5Il1bc3R5bGUqPSJ2aXNpYmxlIl06bm90KFtjbGFzc10pOm5vdChbaWRdKTpub3QoW3N0eWxlKj0iZml4ZWQiXSknLCB1bmRlZmluZWQsIGZhbHNlKTsKCQkJCX0sMTAwMCk7CgkJCQkKCQkJCSQoJ2RpdltzdHlsZSo9InZpc2liaWxpdHkiXVtzdHlsZSo9InZpc2libGUiXTpub3QoW2NsYXNzXSk6bm90KFtpZF0pOm5vdChbc3R5bGUqPSJmaXhlZCJdKScpLmhpZGUoKTsKCQkJCQoJCQkJJCgiYm9keSIpLm9uKCdtb3VzZW92ZXInLCAndWwgbGkgW2hyZWYqPSIvdl8iXVtocmVmKj0iLmh0bWwiXTpub3QoW2hyZWYqPSI9aHR0cCJdKTpub3QoW2hyZWYqPSI/aHR0cCJdKTpub3QoW2hyZWYqPSIjaHR0cCJdKScsIGZ1bmN0aW9uKGUpIHsKCQkJCQlsZXQgJHBsYXllckl0ZW0gPSAkKHRoaXMpLCBocmVmID0gJHBsYXllckl0ZW0uYXR0cignaHJlZicpIHx8ICRwbGF5ZXJJdGVtLmRhdGEoImhyZWYiKTsKCQkJCQkkcGxheWVySXRlbS5vZmYoJ2NsaWNrLmNocm9tZScpOwoJCQkJCSRwbGF5ZXJJdGVtLm9uKCdjbGljay5jaHJvbWUnLCBmdW5jdGlvbigpIHsKCQkJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmCgkJCQkJfSkuYXR0cignZGF0YS1ocmVmJywgaHJlZikuY3NzKHsKCQkJCQkJY3Vyc29yOiAncG9pbnRlcicKCQkJCQl9KS5yZW1vdmVBdHRyKCdocmVmJykKCQkJCX0pOwoJCQl9CgkJfTsKCQl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKXsKCQkJaWYodGhpcy5pc1J1bigpKXsKCQkJCS8v5omn6KGM5Y+v54K55Ye75pON5L2cCgkJCQl0aGlzLnBhZ2VFdmVudEV4dGVuZCgpOwoJCQkJbGV0IGRlbGF5VGltZU1zID0gMDsKCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoInd3dy5iaWxpYmlsaS5jb20iKSE9LTEpey8v5aaC5p6c5piv5ZOU5ZOp5ZOU5ZOp77yM5YiZ6ZyA6KaB5bu26L+f5Yqg6L29CgkJCQkJZGVsYXlUaW1lTXMgPSAyMDAwOwoJCQkJfWVsc2V7ICAvL+WFtuWug+W5s+WPsOW7tui/nzMwMG1zCgkJCQkJZGVsYXlUaW1lTXMgPSAzMDA7CgkJCQl9CgkJCQlzZXRUaW1lb3V0KCgpPT57CgkJCQkJdHJ5ewoJCQkJCQl0aGlzLnZpZGVBZGVtb3ZlKCk7CgkJCQkJfWNhdGNoKGUpe30KCQkJCQl0cnl7CgkJCQkJCXRoaXMuYWRkSHRtbEVsZW1lbnRzKCk7CgkJCQkJCXRoaXMucnVuRXZlbnQoKTsKCQkJCQl9Y2F0Y2goZSl7fQoJCQkJfSwgZGVsYXlUaW1lTXMpOwoJCQl9CgkJfTsKCX07CgkKCS8vQuermeebuOWFs+WKn+iDvQoJZnVuY3Rpb24gaHVhaHVhY2F0X2JpbGliaWxpKHRvb2xPYmplY3QpewoJCXRoaXMudG9vbE9iamVjdD10b29sT2JqZWN0OwoJCXRoaXMuZG93bmxvYWRSZXN1dEVycm9yPWZ1bmN0aW9uKCRidG4pewoJCQkkYnRuLnRleHQoIuS4i+i9veinhumike+8iOacgOmrmOivt++8iSIpOwoJCQkkYnRuLnJlbW92ZUF0dHIoImRpc2FibGVkIik7CgkJfTsKCQl0aGlzLmRvd25sb2FkUmVzdXRTdWNjZXNzPWZ1bmN0aW9uKCRidG4pewoJCQkkYnRuLnRleHQoIuS4i+i9veinhumike+8iOacgOmrmOivt++8iSIpOwoJCQkkYnRuLnJlbW92ZUF0dHIoImRpc2FibGVkIik7CgkJfTsKCQl0aGlzLmRvd25sb2FkVmlkZW89ZnVuY3Rpb24oJGJ0bil7CgkJCXZhciBwYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKCQkJdmFyIGJ2ID0gcGF0aG5hbWUucmVwbGFjZSgiL3ZpZGVvLyIsIiIpLnJlcGxhY2UoIi8iLCIiKTsKCQkJaWYoIWJ2KXsKCQkJCXRoaXMuZG93bmxvYWRSZXN1dEVycm9yKCk7CgkJCX1lbHNlewkJCQkKCQkJCS8vYnbovaxhdgoJCQkJdG9vbE9iamVjdC5yZXF1ZXN0KCJnZXQiLCAiaHR0cDovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL2FyY2hpdmUvc3RhdD9idmlkPSIrYnYsIG51bGwpLnRoZW4oKHJlc3VsdERhdGEpPT57CgkJCQkJbGV0IGRhdGFKc29uID0gSlNPTi5wYXJzZShyZXN1bHREYXRhLmRhdGEpOwoJCQkJCWlmKCEhZGF0YUpzb24gJiYgZGF0YUpzb24uY29kZT09PTAgJiYgISFkYXRhSnNvbi5kYXRhKXsKCQkJCQkJbGV0IGFpZCA9IGRhdGFKc29uLmRhdGEuYWlkOwoJCQkJCQlpZighYWlkKXsKCQkJCQkJCXRoaXMuZG93bmxvYWRSZXN1dEVycm9yKCRidG4pOwoJCQkJCQl9ZWxzZXsKCQkJCQkJCS8v6I635Y+WY2lkCgkJCQkJCQl0b29sT2JqZWN0LnJlcXVlc3QoImdldCIsICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXc/YWlkPSIrYWlkLCBudWxsKS50aGVuKChyZXN1bHREYXRhMik9PnsKCQkJCQkJCQlsZXQgZGF0YUpzb24yID0gSlNPTi5wYXJzZShyZXN1bHREYXRhMi5kYXRhKTsKCQkJCQkJCQlpZighIWRhdGFKc29uMiAmJiBkYXRhSnNvbjIuY29kZT09PTAgJiYgISFkYXRhSnNvbjIuZGF0YSl7CgkJCQkJCQkJCWxldCBhaWQgPSBkYXRhSnNvbjIuZGF0YS5haWQ7CgkJCQkJCQkJCWxldCBidmlkID0gZGF0YUpzb24yLmRhdGEuYnZpZDsKCQkJCQkJCQkJbGV0IGNpZCA9IGRhdGFKc29uMi5kYXRhLmNpZDsKCQkJCQkJCQkJaWYoIWFpZCB8fCAhYnZpZCB8fCAhY2lkKXsKCQkJCQkJCQkJCXRoaXMuZG93bmxvYWRSZXN1dEVycm9yKCRidG4pOwoJCQkJCQkJCQl9ZWxzZXsKCQkJCQkJCQkJCS8v6I635Y+W5pKt5pS+6ZO+5o6lCgkJCQkJCQkJCQl0b29sT2JqZWN0LnJlcXVlc3QoImdldCIsICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybD9hdmlkPSIrYWlkKyImY2lkPSIrY2lkKyImcW49MTEyIiwgbnVsbCkudGhlbigocmVzdWx0RGF0YTMpPT57CgkJCQkJCQkJCQkJbGV0IGRhdGFKc29uMyA9IEpTT04ucGFyc2UocmVzdWx0RGF0YTMuZGF0YSk7CgkJCQkJCQkJCQkJaWYoISFkYXRhSnNvbjMgJiYgZGF0YUpzb24zLmNvZGU9PT0wICYmICEhZGF0YUpzb24zLmRhdGEpewoJCQkJCQkJCQkJCQl0aGlzLmRvd25sb2FkUmVzdXRTdWNjZXNzKCRidG4pOwoJCQkJCQkJCQkJCQl3aW5kb3cub3BlbihkYXRhSnNvbjMuZGF0YS5kdXJsWzBdLnVybCk7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfSkuY2F0Y2goKGVycm9yRGF0YSk9PnsKCQkJCQkJCQkJCQl0aGlzLmRvd25sb2FkUmVzdXRFcnJvcigkYnRuKTsKCQkJCQkJCQkJCX0pOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfSkuY2F0Y2goKGVycm9yRGF0YSk9PnsKCQkJCQkJCQl0aGlzLmRvd25sb2FkUmVzdXRFcnJvcigkYnRuKTsKCQkJCQkJCX0pOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSkuY2F0Y2goKGVycm9yRGF0YSk9PnsKCQkJCQl0aGlzLmRvd25sb2FkUmVzdXRFcnJvcigpOwoJCQkJfSk7CgkJCX0KCQl9CgkJdGhpcy5jcmVhdGVFbGVtZW50SHRtbCA9IGZ1bmN0aW9uKCl7CgkJCWxldCByYW5kb21OdW1iZXIgPSB0aGlzLnRvb2xPYmplY3QucmFuZG9tTnVtYmVyKCk7CgkJCWxldCBjc3NUZXh0ID0gCgkJCWAKCQkJCSNiaWxpYmlsaV9leHRpX2ArcmFuZG9tTnVtYmVyK2B7cGFkZGluZzoxMHB4O30KCQkJCSNiaWxpYmlsaV9leHRpX2ArcmFuZG9tTnVtYmVyK2AgPi5zZWxmX3NfYnRue2JhY2tncm91bmQtY29sb3I6I0ZCNzI5OTsgY29sb3I6I0ZGRjsgZm9udC1zaXplOjEwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDoxNXB4O3BhZGRpbmc6MnB4IDRweDtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9pbnRlcjt9CgkJCWA7CgkJCWxldCBodG1sVGV4dD0KCQkJYAoJCQkJPGRpdiBpZD0iYmlsaWJpbGlfZXh0aV9gK3JhbmRvbU51bWJlcitgIj4KCQkJCQk8c3BhbiBjbGFzcz0ic2VsZl9zX2J0biIgaWQ9ImRvd25sb2FkX3NfYCtyYW5kb21OdW1iZXIrYCI+5LiL6L296KeG6aKR77yI5pyA6auY6K+377yJPC9zcGFuPgoJCQkJCTxzcGFuIGNsYXNzPSJzZWxmX3NfYnRuIiBpZD0iZm9jdXNfc19gK3JhbmRvbU51bWJlcitgIj7kuIDplK7kuInogZQ8L3NwYW4+CgkJCQk8L2Rpdj4KCQkJYDsKCQkJc2V0VGltZW91dCgoKT0+ewoJCQkJaWYoJCgiI2JpbGliaWxpLXBsYXllciIpLmh0bWwoKS5sZW5ndGggPj0gMTApewoJCQkJCSQoImJvZHkiKS5wcmVwZW5kKCI8c3R5bGU+Iitjc3NUZXh0KyI8L3N0eWxlPiIpOwoJCQkJCSQoIiN2aWV3Ym94X3JlcG9ydCBkaXYudmlkZW8tZGF0YSIpLmFwcGVuZChodG1sVGV4dCk7CgkJCQkJbGV0ICR0aGF0ID0gdGhpczsKCQkJCQkkKCIjZG93bmxvYWRfc18iK3JhbmRvbU51bWJlcikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQkJJCh0aGlzKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoJCQkJCQkkKHRoaXMpLnRleHQoIuS4i+i9veinhumike+8iOWHhuWkh+S4re+8iSIpCgkJCQkJCSR0aGF0LmRvd25sb2FkVmlkZW8oJCh0aGlzKSk7CgkJCQkJfSk7CgkJCQkJJCgiI2ZvY3VzX3NfIityYW5kb21OdW1iZXIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQkJCSQoIiNhcmNfdG9vbGJhcl9yZXBvcnQgLmxpa2UiKS5jbGljaygpOwoJCQkJCQkkKCIjYXJjX3Rvb2xiYXJfcmVwb3J0IC5jb2luIikuY2xpY2soKTsKCQkJCQl9KTsKCQkJCX0KCQkJfSwgMjUwMCk7CgkJfQoJCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdD09PSJ3d3cuYmlsaWJpbGkuY29tIiAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZigiL3ZpZGVvIikhPS0xKXsKCQkJCXRoaXMuY3JlYXRlRWxlbWVudEh0bWwoKTsKCQkJfQoJCX0KCX0KCQoJLy/lm73lpJbnmoTkuIDkupvop6PmnpAKCWZ1bmN0aW9uIGFicm9hZFZpZGVvSGVscGVyKCl7CgkJdGhpcy5pc1J1biA9IGZ1bmN0aW9uKCl7CgkJCXZhciB1cmxzPVsieW91dHViZS5jb20iLCAiZmFjZWJvb2suY29tIl07CgkJCWZvcih2YXIgaT0wOyBpPHVybHMubGVuZ3RoO2krKyl7CgkJCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKHVybHNbaV0pIT0tMSl7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgkJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CgkJCWlmKCF0aGlzLmlzUnVuKCkpewoJCQkJcmV0dXJuOwoJCQl9CgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQljb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7CgkJCQljb25zdCBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCQljb25zdCBlbGVJZCA9ICJmcmVlLXh4MS1wbGF5ZXItc2NyaXB0LTk5OTkiOwoJCQkJCgkJCQkvL3lvdXR1YmXop6PmnpAKCQkJCWlmKGhvc3QuaW5kZXhPZigieW91dHViZS5jb20iKSE9LTEpewoJCQkJCWlmKGhyZWYuaW5kZXhPZigieW91dHViZS5jb20vd2F0Y2giKSE9LTEpewoJCQkJCQlpZigkKCIjIitlbGVJZCkubGVuZ3RoICE9IDApewoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCXZhciBpY29uVmlkZW8gPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3Q0FZQUFBQlhBdm1IQUFBRE9VbEVRVlJvUSsyWno0dU5VUmpIUDkrRjhnOGd5a0tKTkpNVVVtek1ES1ptWVZZc0xCUmhPYUVtRmhSUkxDWkRZNFBCckpSUkVrVU1tWTNVUkNrL3M2R01oUjlaV05rOU92WE83YjEzM3ZlKzU3dy83c3pVbkxxYmU1OWZuL09jODV6bm5Ddm0rTkFjajU5NWdIZ0d6V3dEc0JaWURhd0VGZ0kvZ1QvQVIwbkRaV2U4bEF5WVdUZXdGOWlURWVBNE1DVHBibGtnaFFITTdCeHdQRENnQVVuOWdUcUo0b1VBek93S2NDaG5JQ09TOXVYVXJhbmxCakN6YThDQmdnRmNsSFNraUkxY0FHYldCVHd0NGppbTJ5M3BTVjVid1FCbXRncTRCYXpQNjdSQjd3M2dzdkFYK0NicFY0aGRMNENvUEc0SDNLY2p4RUVPV1ZkeUh3UGprcTVtNldjQ21ObUZhSWF5YkZYeCsydmdzcVNSTk9PcEFHYTJHSGhZNGxJcEFuaGEwcWtrQTRrQVp1Wk8wazlGUEZhZzJ5SEpIWVIxSXczZ083Q3NnaUNLbVB3TWRFbWFqQnVaQm1CbWJ1TWNMT0twUXQxQlNVZFRBY3pNVlptUW1qd3RwVG1DM3hxbzB5YnB3NVJPWFFiTXJBKzQ1R3RRVW1ZVnk3SmxacFlsMC9CNzNZWnVCQWpxYldZSTRLV2t6V2taZUJWU051TUFadWExRkJvclNZNE1URXBhbmdZUWxNNEVnT2RaeTZFeGF6a0FpTnRvWEVMdmdMYXNJR3Iwc1QwUVphQVZBTzhsdGFkbFlCVFlOY3NCN2tqYW5RWndIamcyeXdHYVZpSFhJcnVON0RWbVlBKzRsbnVkcEMrSkdYQmZobHdUWndEQVBRaTRzNm8ya2xvSjl5enl5S2NYYWpHQTY0RjZKTDF0Q2hCbHdkWDBvSXJTZ2lyVUsrbCs0OXB1ZGgvSWhHaGhCdm9sRFNSdHpLYTlqSmt0QmR4cldrK2ljdlhud08zb0lleEZXbFhKYk1iTWJBR3dKUVdnMW8wV1dFS3BMVWpTQmNaN0NYblYwWmhRWG9CUVAvTUFVek5nWnU1WjhFYlJHUVQyUzdxWjEwN21IbWhtdUlRbmwybFh4RkNRUWdEUm1URUdiQXQxREl4SjJwRkRyMDZsRElCRmdEc2Rsd1FFOHdOb2wvUTdRQ2RSdERCQWxJVk80RmxBTUoyU01rOTZIM3VsQUVRUWg0RkJENmQ5a29ZODVMeEVTZ09JSUs2N3F0TEU4N0NrVXQrY1NnV0lJQ2FBalFrUUU1STJlVTFyZ0ZBVkFDc0E5L0RrL3FHY0d2K0FOWksrQnNUbUpWbzZRSlNGWHVCZUxJS2RraDU0UlJRb1ZBbEFCSEVDT0FPY2xIUTJNQzV2OGNvQUlvalIrQXVDZDFRQmdwVUNCTVNSVzNRZUlQZlVsYVQ0SDAvN1JVQWkyYS9OQUFBQUFFbEZUa1N1UW1DQyI7CgkJCQkJCXZhciBodG1sPSc8ZGl2IGlkPSInK2VsZUlkKyciIHN0eWxlPSJ3aWR0aDoyNXB4O3BhZGRpbmc6MTBweCAwcHg7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojRTUyMTJFO3Bvc2l0aW9uOmZpeGVkO3RvcDoyNTBweDtsZWZ0OjBweDtjb2xvcjojRkZGO2ZvbnQtc2l6ZTowcHg7ei1pbmRleDo5OTk5OTk5OTk5OTk5O2N1cnNvcjpwb2ludGVyO21hcmdpbjowcHggYXV0bzt0ZXh0LWFsaWduOmNlbnRlcjsiPicrCgkJCQkJCQknPGltZyBzcmM9IicraWNvblZpZGVvKyciIHN0eWxlPSJ3aWR0aDoyMHB4OyI+JysKCQkJCQkJCSc8L2Rpdj4nOwoJCQkJCQkkKCJib2R5IikuYXBwZW5kKGh0bWwpOwoJCQkJCQkkKCJib2R5Iikub24oImNsaWNrIiwgIiMiK2VsZUlkLCBmdW5jdGlvbigpewoJCQkJCQkJdmFyIGxvY2F0aW9uX3VybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQkJCQkJdmFyIHZpZGVvdXJsID0gImh0dHBzOi8veXQxcy5jb20vP3E9Iitsb2NhdGlvbl91cmw7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYih2aWRlb3VybCwgZmFsc2UpOwoJCQkJCQl9KTsKCQkJCQl9ZWxzZXsKCQkJCQkJJCgiIyIrZWxlSWQpLnJlbW92ZSgpOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJLy9mYWNlYm9va+ino+aekAoJCQkJaWYoaG9zdC5pbmRleE9mKCJmYWNlYm9vay5jb20iKSE9LTEpewoJCQkJCWlmKGhyZWYuaW5kZXhPZigiZmFjZWJvb2suY29tL3dhdGNoIikhPS0xIHx8IGhyZWYuaW5kZXhPZigiL3ZpZGVvcy8iKSE9LTEpewoJCQkJCQlpZigkKCIjIitlbGVJZCkubGVuZ3RoICE9IDApewoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCXZhciBpY29uVmlkZW8gPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3Q0FZQUFBQlhBdm1IQUFBRE9VbEVRVlJvUSsyWno0dU5VUmpIUDkrRjhnOGd5a0tKTkpNVVVtek1ES1ptWVZZc0xCUmhPYUVtRmhSUkxDWkRZNFBCckpSUkVrVU1tWTNVUkNrL3M2R01oUjlaV05rOU92WE83YjEzM3ZlKzU3dy83c3pVbkxxYmU1OWZuL09jODV6bm5Ddm0rTkFjajU5NWdIZ0d6V3dEc0JaWURhd0VGZ0kvZ1QvQVIwbkRaV2U4bEF5WVdUZXdGOWlURWVBNE1DVHBibGtnaFFITTdCeHdQRENnQVVuOWdUcUo0b1VBek93S2NDaG5JQ09TOXVYVXJhbmxCakN6YThDQmdnRmNsSFNraUkxY0FHYldCVHd0NGppbTJ5M3BTVjVid1FCbXRncTRCYXpQNjdSQjd3M2dzdkFYK0NicFY0aGRMNENvUEc0SDNLY2p4RUVPV1ZkeUh3UGprcTVtNldjQ21ObUZhSWF5YkZYeCsydmdzcVNSTk9PcEFHYTJHSGhZNGxJcEFuaGEwcWtrQTRrQVp1Wk8wazlGUEZhZzJ5SEpIWVIxSXczZ083Q3NnaUNLbVB3TWRFbWFqQnVaQm1CbWJ1TWNMT0twUXQxQlNVZFRBY3pNVlptUW1qd3RwVG1DM3hxbzB5YnB3NVJPWFFiTXJBKzQ1R3RRVW1ZVnk3SmxacFlsMC9CNzNZWnVCQWpxYldZSTRLV2t6V2taZUJWU051TUFadWExRkJvclNZNE1URXBhbmdZUWxNNEVnT2RaeTZFeGF6a0FpTnRvWEVMdmdMYXNJR3Iwc1QwUVphQVZBTzhsdGFkbFlCVFlOY3NCN2tqYW5RWndIamcyeXdHYVZpSFhJcnVON0RWbVlBKzRsbnVkcEMrSkdYQmZobHdUWndEQVBRaTRzNm8ya2xvSjl5enl5S2NYYWpHQTY0RjZKTDF0Q2hCbHdkWDBvSXJTZ2lyVUsrbCs0OXB1ZGgvSWhHaGhCdm9sRFNSdHpLYTlqSmt0QmR4cldrK2ljdlhud08zb0lleEZXbFhKYk1iTWJBR3dKUVdnMW8wV1dFS3BMVWpTQmNaN0NYblYwWmhRWG9CUVAvTUFVek5nWnU1WjhFYlJHUVQyUzdxWjEwN21IbWhtdUlRbmwybFh4RkNRUWdEUm1URUdiQXQxREl4SjJwRkRyMDZsRElCRmdEc2Rsd1FFOHdOb2wvUTdRQ2RSdERCQWxJVk80RmxBTUoyU01rOTZIM3VsQUVRUWg0RkJENmQ5a29ZODVMeEVTZ09JSUs2N3F0TEU4N0NrVXQrY1NnV0lJQ2FBalFrUUU1STJlVTFyZ0ZBVkFDc0E5L0RrL3FHY0d2K0FOWksrQnNUbUpWbzZRSlNGWHVCZUxJS2RraDU0UlJRb1ZBbEFCSEVDT0FPY2xIUTJNQzV2OGNvQUlvalIrQXVDZDFRQmdwVUNCTVNSVzNRZUlQZlVsYVQ0SDAvN1JVQWkyYS9OQUFBQUFFbEZUa1N1UW1DQyI7CgkJCQkJCXZhciBodG1sPSc8ZGl2IGlkPSInK2VsZUlkKyciIHN0eWxlPSJ3aWR0aDoyNXB4O3BhZGRpbmc6MTBweCAwcHg7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojRTUyMTJFO3Bvc2l0aW9uOmZpeGVkO3RvcDoyNTBweDtsZWZ0OjBweDtjb2xvcjojRkZGO2ZvbnQtc2l6ZTowcHg7ei1pbmRleDo5OTk5OTk5OTk5OTk5O2N1cnNvcjpwb2ludGVyO21hcmdpbjowcHggYXV0bzt0ZXh0LWFsaWduOmNlbnRlcjsiPicrCgkJCQkJCQknPGltZyBzcmM9IicraWNvblZpZGVvKyciIHN0eWxlPSJ3aWR0aDoyMHB4OyI+JysKCQkJCQkJCSc8L2Rpdj4nOwoJCQkJCQkkKCJib2R5IikuYXBwZW5kKGh0bWwpOwoJCQkJCQkkKCJib2R5Iikub24oImNsaWNrIiwgIiMiK2VsZUlkLCBmdW5jdGlvbigpewoJCQkJCQkJdmFyIGxvY2F0aW9uX3VybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZSgiZmFjZWJvb2tfZG93bmxvYWRlcl9vYmoiLCB7ImZhY2Vib29rX3VybCI6bG9jYXRpb25fdXJsfSk7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYigiaHR0cHM6Ly95dDFzLmNvbS9mYWNlYm9vay1kb3dubG9hZGVyIiwgZmFsc2UpOwoJCQkJCQl9KTsKCQkJCQl9ZWxzZXsKCQkJCQkJJCgiIyIrZWxlSWQpLnJlbW92ZSgpOwoJCQkJCX0KCQkJCX0KCQkJfSwgNTAwKTsKCQkJCgkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInl0MXMuY29tL2ZhY2Vib29rLWRvd25sb2FkZXIiKSE9LTEpeyAvL2ZhY2Vib29r5LiL6L29CgkJCQl2YXIgZmFjZWJvb2tPYmplY3QgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKCJmYWNlYm9va19kb3dubG9hZGVyX29iaiIpOwoJCQkJaWYoISFmYWNlYm9va09iamVjdCl7CgkJCQkJJCgiI3NfaW5wdXQiKS52YWwoZmFjZWJvb2tPYmplY3QuZmFjZWJvb2tfdXJsKTsKCQkJCX0KCQkJfQoJCX0KCX0KCQoJLy/kvJjmg6DliLjmn6Xor6IKCWZ1bmN0aW9uIHF1ZXJ5Q291cG9uKCl7CgkJdGhpcy5pc1J1biA9IGZ1bmN0aW9uKCl7CgkJCXZhciB1cmxzPVsiZGV0YWlsLnRtYWxsLmNvbSIsICJpdGVtLnRhb2Jhby5jb20iLCAiaXRlbS5qZC5jb20iLCAiaXRlbS55aXlhb2pkLmNvbSIsICJucGNpdGVtLmpkLmhrIiwgImRldGFpbC50bWFsbC5oayJdOwoJCQlmb3IodmFyIGk9MDsgaTx1cmxzLmxlbmd0aDtpKyspewoJCQkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZih1cmxzW2ldKSE9LTEpewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJdGhpcy5nZXRQbGF0Zm9ybSA9IGZ1bmN0aW9uKCl7CgkJCWxldCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7CgkJCWxldCBwbGF0Zm9ybSA9ICIiOwoJCQlpZihob3N0LmluZGV4T2YoImRldGFpbC50bWFsbCIpIT0tMSl7CgkJCQlwbGF0Zm9ybSA9ICJ0bWFsbCI7CgkJCX1lbHNlIGlmKGhvc3QuaW5kZXhPZigiaXRlbS50YW9iYW8uY29tIikhPS0xKXsKCQkJCXBsYXRmb3JtID0gInRhb2JhbyI7CgkJCX1lbHNlIGlmKGhvc3QuaW5kZXhPZigiamQuY29tIikhPS0xIHx8IGhvc3QuaW5kZXhPZigibnBjaXRlbS5qZC5oayIpIT0tMSl7CgkJCQlwbGF0Zm9ybSA9ICJqZCI7CgkJCX0KCQkJcmV0dXJuIHBsYXRmb3JtOwoJCX07CgkJdGhpcy5maWx0ZXJTdHIgPSBmdW5jdGlvbihzdHIpewoJCQlpZighc3RyKSByZXR1cm4gIiI7CgkJCXN0ciA9IHN0ci5yZXBsYWNlKC9cdC9nLCIiKTsKCQkJc3RyID0gc3RyLnJlcGxhY2UoL1xyL2csIiIpOwoJCQlzdHIgPSBzdHIucmVwbGFjZSgvXG4vZywiIik7CgkJCXN0ciA9IHN0ci5yZXBsYWNlKC9cKy9nLCIlMkIiKTsvLyIrIgoJCQlzdHIgPSBzdHIucmVwbGFjZSgvXCYvZywiJTI2Iik7Ly8iJiIKCQkJc3RyID0gc3RyLnJlcGxhY2UoL1wjL2csIiUyMyIpOy8vIiMiCgkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKQoJCX07CgkJdGhpcy5nZXRQYXJhbXRlclF1ZXJ5VXJsID0gZnVuY3Rpb24odGFnKSB7IC8v5p+l6K+iR0VU6K+35rGCdXJs5Lit55qE5Y+C5pWwCgkJCXZhciB0ID0gbmV3IFJlZ0V4cCgiKF58JikiICsgdGFnICsgIj0oW14mXSopKCZ8JCkiKTsKCQkJdmFyIGEgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5tYXRjaCh0KTsKCQkJaWYgKGEgIT0gbnVsbCl7CgkJCQlyZXR1cm4gYVsyXTsKCQkJfQoJCQlyZXR1cm4gIiI7CgkJfTsKCQl0aGlzLmdldEVuZEh0bWxJZEJ5VXJsID0gZnVuY3Rpb24odXJsKSB7IC8v6I635b6X5LulaHRtbOe7k+adn+eahElECgkJCWlmKHVybC5pbmRleE9mKCI/IikhPS0xKXsKCQkJCXVybCA9IHVybC5zcGxpdCgiPyIpWzBdCgkJCX0KCQkJaWYodXJsLmluZGV4T2YoIiMiKSE9LTEpewoJCQkJdXJsID0gdXJsLnNwbGl0KCIjIilbMF0KCQkJfQoJCQl2YXIgc3BsaXRUZXh0ID0gdXJsLnNwbGl0KCIvIik7CgkJCXZhciBpZFRleHQgPSBzcGxpdFRleHRbc3BsaXRUZXh0Lmxlbmd0aC0xXTsKCQkJaWRUZXh0ID0gaWRUZXh0LnJlcGxhY2UoIi5odG1sIiwiIik7CgkJCXJldHVybiBpZFRleHQ7CgkJfTsKCQl0aGlzLmdldEdvb2RzRGF0YSA9IGZ1bmN0aW9uKHBsYXRmb3JtKXsKCQkJdmFyIGdvb2RzSWQgPSAiIjsKCQkJdmFyIGdvb2RzTmFtZSA9ICIiOwoJCQl2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQlpZihwbGF0Zm9ybT09InRhb2JhbyIpewoJCQkJZ29vZHNJZCA9IHRoaXMuZ2V0UGFyYW10ZXJRdWVyeVVybCgiaWQiKTsKCQkJCWdvb2RzTmFtZT0kKCIudGItbWFpbi10aXRsZSIpLnRleHQoKTsKCgkJCX1lbHNlIGlmKHBsYXRmb3JtPT0idG1hbGwiKXsKCQkJCWdvb2RzSWQgPSB0aGlzLmdldFBhcmFtdGVyUXVlcnlVcmwoImlkIik7CgkJCQlnb29kc05hbWU9JCgiLnRiLWRldGFpbC1oZCIpLnRleHQoKTsKCgkJCX1lbHNlIGlmKHBsYXRmb3JtPT0iamQiKXsKCQkJCWdvb2RzTmFtZT0kKCJkaXYuc2t1LW5hbWUiKS50ZXh0KCk7CgkJCQlnb29kc0lkID0gdGhpcy5nZXRFbmRIdG1sSWRCeVVybChocmVmKTsKCgkJCX0KCQkJdmFyIGRhdGE9eyJnb29kc0lkIjpnb29kc0lkLCAiZ29vZHNOYW1lIjp0aGlzLmZpbHRlclN0cihnb29kc05hbWUpfQoJCQlyZXR1cm4gZGF0YTsKCQl9OwoJCXRoaXMucmFuZG9tU3BtVmFsdWU9ZnVuY3Rpb24oKXsKCQkJJCgibWV0YVtuYW1lPSdkYXRhLXNwbSddIikuZWFjaChmdW5jdGlvbigpewoJCQkJdmFyIG1heCA9IDUwMDA7CgkJCQl2YXIgbWluID0gMTAwMDsKCQkJCXZhciByYW5kb21WYWx1ZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSApICsgbWluOwoJCQkJdmFyIHJhbmRvbUxldHRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqIDI2KSArICJhIi5jaGFyQ29kZUF0KDApKTsKCQkJCSQodGhpcykuYXR0cigiY29udGVudCIsIHJhbmRvbVZhbHVlK3JhbmRvbUxldHRlcik7CgkJCX0pOwoJCQkkKCJtZXRhW25hbWU9J3NwbS1pZCddIikuZWFjaChmdW5jdGlvbigpewoJCQkJdmFyIG1heCA9IDUwMDA7CgkJCQl2YXIgbWluID0gMTAwMDsKCQkJCXZhciByYW5kb21WYWx1ZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSApICsgbWluOwoJCQkJdmFyIHJhbmRvbUxldHRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqIDI2KSArICJhIi5jaGFyQ29kZUF0KDApKTsKCQkJCSQodGhpcykuYXR0cigiY29udGVudCIsIHJhbmRvbVZhbHVlK3JhbmRvbUxldHRlcik7CgkJCX0pOwoJCX07CgkJdGhpcy5ydW5BbGlEZWNlcHRpb25TcG09ZnVuY3Rpb24oKSB7CgkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoImFsaXl1bi5jb20iKSE9LTEgfHwgd2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZigidGFvYmFvLmNvbSIpIT0tMSB8fCB3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKCJ0bWFsbC5jb20iKSE9LTEpewoJCQkJdGhpcy5yYW5kb21TcG1WYWx1ZSgpOwoJCQkJc2V0SW50ZXJ2YWwoKCk9PnsKCQkJCQl0aGlzLnJhbmRvbVNwbVZhbHVlKCk7CgkJCQl9LCA0MDAwKTsKCQkJfQoJCX07CgkJdGhpcy5yZXF1ZXN0ID0gZnVuY3Rpb24obW90aGVkLCB1cmwsIHBhcmFtKXsKCQkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CgkJCQlHTV94bWxodHRwUmVxdWVzdCh7CgkJCQkJdXJsOiB1cmwsCgkJCQkJbWV0aG9kOiBtb3RoZWQsCgkJCQkJZGF0YTpwYXJhbSwKCQkJCQlvbmxvYWQ6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CgkJCQkJCXZhciBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7CgkJCQkJCXZhciBwbGF5dXJsID0gIiI7CgkJCQkJCWlmKHN0YXR1cz09MjAwfHxzdGF0dXM9PScyMDAnKXsKCQkJCQkJCXZhciByZXNwb25zZVRleHQgPSByZXNwb25zZS5yZXNwb25zZVRleHQ7CgkJCQkJCQlyZXNvbHZlKHsicmVzdWx0Ijoic3VjY2VzcyIsICJqc29uIjpyZXNwb25zZVRleHR9KTsKCQkJCQkJfWVsc2V7CgkJCQkJCQlyZWplY3QoeyJyZXN1bHQiOiJlcnJvciIsICJqc29uIjpudWxsfSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KTsKCQkJfSkKCQl9OwoJCXRoaXMuY3JlYXRlQ291cG9uSHRtbCA9IGZ1bmN0aW9uKHBsYXRmb3JtLCBnb29kc0lkLCBnb29kc05hbWUpewoJCQlpZighcGxhdGZvcm0gfHwgIWdvb2RzSWQpIHJldHVybjsKCQkJdmFyIGdvb2RzQ291cG9uVXJsID0gImh0dHA6Ly90dC5zaHVxaWFuZGlxaXUuY29tL2FwaS9jb3Vwb24vZGlzY292ZXI/bm89NSZ2PTEuMC4yJnBsPSIrcGxhdGZvcm0rIiZpZD0iK2dvb2RzSWQrIiZxdT0iK2dvb2RzTmFtZTsKCQkJdmFyIGdvb2RzUHJpdmF0ZVVybCA9ICJodHRwOi8vdHQuc2h1cWlhbmRpcWl1LmNvbS9hcGkvcHJpdmF0ZS9jaGFuZ2UvY291cG9uP25vPTUmdj0xLjAuMiZwbGF0Zm9ybT0iK3BsYXRmb3JtKyImaWQ9IjsKCQkJdGhpcy5yZXF1ZXN0KCJHRVQiLCBnb29kc0NvdXBvblVybCwgbnVsbCkudGhlbigocmVzdXREYXRhKT0+ewoJCQkJaWYocmVzdXREYXRhLnJlc3VsdD09PSJzdWNjZXNzIiAmJiAhIXJlc3V0RGF0YS5qc29uKXsKCQkJCQl2YXIgZGF0YSA9IEpTT04ucGFyc2UocmVzdXREYXRhLmpzb24pLmRhdGE7CgkJCQkJaWYoIWRhdGEgfHwgZGF0YT09PSJudWxsIiB8fCAhZGF0YS5jc3MgfHwgIWRhdGEuaHRtbCB8fCAhZGF0YS5oYW5kbGVyKXsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQl2YXIgY3NzVGV4dCA9IGRhdGEuY3NzOwoJCQkJCXZhciBodG1sVGV4dCA9IGRhdGEuaHRtbDsKCQkJCQl2YXIgaGFuZGxlciA9IGRhdGEuaGFuZGxlcjsKCQkJCQl2YXIgdGVtcGxhdGVJZCA9IGRhdGEudGVtcGxhdGVJZDsKCQkJCQlpZighY3NzVGV4dCB8fCAhaHRtbFRleHQgfHwgIWhhbmRsZXIpewoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCSQoImJvZHkiKS5wcmVwZW5kKCI8c3R5bGU+Iitjc3NUZXh0KyI8L3N0eWxlPiIpOwoJCQkJCQoJCQkJCXZhciBoYW5kbGVycyA9IGhhbmRsZXIuc3BsaXQoIkAiKTsKCQkJCQlmb3IodmFyIGk9MDsgaTxoYW5kbGVycy5sZW5ndGg7IGkrKyl7CgkJCQkJCXZhciAkaGFuZGxlciA9ICQoIiIraGFuZGxlcnNbaV0rIiIpOwoJCQkJCQlpZihwbGF0Zm9ybT09InRhb2JhbyIpewoJCQkJCQkJJGhhbmRsZXIucGFyZW50KCkuYWZ0ZXIoaHRtbFRleHQpOwoJCQkJCQl9ZWxzZSBpZihwbGF0Zm9ybT09InRtYWxsIil7CgkJCQkJCQkkaGFuZGxlci5wYXJlbnQoKS5hZnRlcihodG1sVGV4dCk7CgkJCQkJCX1lbHNlIGlmKHBsYXRmb3JtPT0iamQiKXsKCQkJCQkJCSRoYW5kbGVyLmFmdGVyKGh0bWxUZXh0KTsKCQkJCQkJfQoJCQkJCX0KCQkJCQl2YXIgJGxsa2sgPSAkKCIjIit0ZW1wbGF0ZUlkKTsKCQkJCQlpZigkbGxray5sZW5ndGggIT0gMCl7CgkJCQkJCWxldCBjb3Vwb25FbGVtZW50QSA9ICRsbGtrLmZpbmQoImFbbmFtZT0nY3BTaFVybCddIik7CgkJCQkJCWNvdXBvbkVsZW1lbnRBLnVuYmluZCgiY2xpY2siKS5iaW5kKCJjbGljayIsICgpPT57CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlsZXQgY291cG9uSWQgPSAkbGxray5kYXRhKCJpZCIpOwoJCQkJCQkJaWYoISFjb3Vwb25JZCl7CgkJCQkJCQkJdGhpcy5yZXF1ZXN0KCJHRVQiLCBnb29kc1ByaXZhdGVVcmwrY291cG9uSWQsIG51bGwpLnRoZW4oKHJlc3V0RGF0YTIpPT57CgkJCQkJCQkJCWlmKHJlc3V0RGF0YTIucmVzdWx0PT09InN1Y2Nlc3MiICYmICEhcmVzdXREYXRhMi5qc29uKXsKCQkJCQkJCQkJCWxldCB1cmwgPSBKU09OLnBhcnNlKHJlc3V0RGF0YTIuanNvbikudXJsOwoJCQkJCQkJCQkJaWYoISF1cmwpIEdNX29wZW5JblRhYih1cmwsIHthY3RpdmU6dHJ1ZX0pOwoJCQkJCQkJCQl9CgkJCQkJCQkJfSk7CgkJCQkJCQl9CgkJCQkJCX0pOwoJCQkJCQlzZXRJbnRlcnZhbCgoKT0+ewoJCQkJCQkJJGxsa2suZmluZCgiKiIpLmVhY2goZnVuY3Rpb24oKXsKCQkJCQkJCQkkKHRoaXMpLnJlbW92ZUF0dHIoImRhdGEtc3BtLWFuY2hvci1pZCIpCgkJCQkJCQl9KTsKCQkJCQkJfSwxMDApOwoJCQkJCQkKCQkJCQkJLy9jYW52YXPnlLvkuoznu7TnoIEKCQkJCQkJdmFyICRjYW52YXNFbGVtZW50ID0gJCgiI2NhIit0ZW1wbGF0ZUlkKTsKCQkJCQkJaWYoJGNhbnZhc0VsZW1lbnQubGVuZ3RoICE9IDApewoJCQkJCQkJbGV0IGNvdXBvbklkID0gJGxsa2suZGF0YSgiaWQiKTsKCQkJCQkJCXRoaXMucmVxdWVzdCgiR0VUIiwgZ29vZHNQcml2YXRlVXJsK2NvdXBvbklkLCBudWxsKS50aGVuKChyZXN1dERhdGEyKT0+ewoJCQkJCQkJCWlmKHJlc3V0RGF0YTIucmVzdWx0PT09InN1Y2Nlc3MiICYmICEhcmVzdXREYXRhMi5qc29uKXsKCQkJCQkJCQkJbGV0IGltZyA9IEpTT04ucGFyc2UocmVzdXREYXRhMi5qc29uKS5pbWc7CgkJCQkJCQkJCWlmKCEhaW1nKXsKCQkJCQkJCQkJCXZhciBjYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhIit0ZW1wbGF0ZUlkKTsKCQkJCQkJCQkJCXZhciBjeHQgPSBjYW52YXNFbGVtZW50LmdldENvbnRleHQoIjJkIik7CgkJCQkJCQkJCQl2YXIgaW1nRGF0YSA9IG5ldyBJbWFnZSgpOwoJCQkJCQkJCQkJaW1nRGF0YS5zcmMgPSBpbWc7CgkJCQkJCQkJCQlpbWdEYXRhLm9ubG9hZD1mdW5jdGlvbigpewoJCQkJCQkJCQkJCWN4dC5kcmF3SW1hZ2UoaW1nRGF0YSwgMCwgMCwgaW1nRGF0YS53aWR0aCwgaW1nRGF0YS5oZWlnaHQpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9OwoJCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCQlpZih0aGlzLmlzUnVuKCkpewkJCQkKCQkJCXZhciBwbGF0Zm9ybSA9IHRoaXMuZ2V0UGxhdGZvcm0oKTsKCQkJCWlmKCEhcGxhdGZvcm0pewoJCQkJCXZhciBnb29kc0RhdGEgPSB0aGlzLmdldEdvb2RzRGF0YShwbGF0Zm9ybSk7CgkJCQkJdGhpcy5jcmVhdGVDb3Vwb25IdG1sKHBsYXRmb3JtLCBnb29kc0RhdGEuZ29vZHNJZCwgZ29vZHNEYXRhLmdvb2RzTmFtZSk7CgkJCQl9CgkJCX0KCQkJdGhpcy5ydW5BbGlEZWNlcHRpb25TcG0oKTsKCQl9OwoJfQoJCgkvKioKCSAqIOWFqOe9kemfs+S5kOino+aekOS4i+i9vQoJICovCglmdW5jdGlvbiBzdXBlck11c2ljSGVscGVyKCl7CgkJdGhpcy5lbGVJZCA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMCk7CgkJdGhpcy5pc1J1biA9IGZ1bmN0aW9uKCl7CgkJCXZhciB1cmxzPVsibXVzaWMuMTYzLmNvbSIsInkucXEuY29tIiwid3d3Lmt1Z291LmNvbSIsInd3dy5rdXdvLmNuIiwid3d3LnhpYW1pLmNvbSIsIm11c2ljLnRhaWhlLmNvbSIsIm11c2ljLm1pZ3UuY24iLCJsaXpoaS5mbSIsInFpbmd0aW5nLmZtIiwieGltYWxheWEuY29tIl07CgkJCWZvcih2YXIgaT0wOyBpPHVybHMubGVuZ3RoO2krKyl7CgkJCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKHVybHNbaV0pIT0tMSl7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgkJdGhpcy5nZXRQbGF5VXJsID0gZnVuY3Rpb24oKXsKCQkJdmFyIGN1cnJlbnRIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7CgkJCXZhciBjdXJyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCXZhciBwbGF5VXJsID0gbnVsbDsKCQkJaWYoY3VycmVudFVybC5tYXRjaCgvbXVzaWNcLjE2M1wuLykpeyAvL+e9keaYk+S6kemfs+S5kAoJCQkJaWYoY3VycmVudFVybC5tYXRjaCgvXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8jXC8oPzpzb25nfGRqKVw/aWQvKSkgewoJCQkJCXBsYXlVcmwgPSAnaHR0cHM6Ly9tdXNpYy5saXV6aGlqaW4uY24vP3VybD0nK2VuY29kZVVSSUNvbXBvbmVudChjdXJyZW50VXJsKTsKCQkJCX1lbHNlIGlmKGN1cnJlbnRVcmwubWF0Y2goL15odHRwcz86XC9cL3lcLm11c2ljXC4xNjNcLmNvbVwvbVwvKD86c29uZ3xkailcP2lkLykpIHsKCQkJCQlwbGF5VXJsID0gJ2h0dHBzOi8vbXVzaWMubGl1emhpamluLmNuLz91cmw9JytlbmNvZGVVUklDb21wb25lbnQoJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zb25nP2lkPScrZ2V0UXVlcnlTdHJpbmcoJ2lkJykpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoY3VycmVudFVybC5tYXRjaCgveVwucXFcLmNvbS8pKXsgLy9RUemfs+S5kAoJCQkJaWYoY3VycmVudFVybC5pbmRleE9mKCI/IikpIGN1cnJlbnRVcmwgPSBjdXJyZW50VXJsLnNwbGl0KCI/IilbMF07CgkJCQlpZihjdXJyZW50VXJsLmluZGV4T2YoIiMiKSkgY3VycmVudFVybCA9IGN1cnJlbnRVcmwuc3BsaXQoIiMiKVswXTsKCQkJCXZhciBtdXNpY01hdGNoID0gY3VycmVudFVybC5tYXRjaCgvXmh0dHBzPzpcL1wveVwucXFcLmNvbVwvblwvcnlxcVwvc29uZ0RldGFpbFwvKFxTKikvKTsKCQkJCWlmKG11c2ljTWF0Y2gpewoJCQkJCXBsYXlVcmwgPSAnaHR0cHM6Ly9tdXNpYy5saXV6aGlqaW4uY24vP2lkPScrbXVzaWNNYXRjaFsxXSsnJnR5cGU9cXEnCgkJCQl9CgkJCQl2YXIgbXVzaWNNYXRjaDIgPSBjdXJyZW50VXJsLm1hdGNoKC9eaHR0cHM/OlwvXC95XC5xcVwuY29tXC9uXC95cXFcL3NvbmdcLyhcUyopLmh0bWwvKTsKCQkJCWlmKG11c2ljTWF0Y2gyKXsKCQkJCQlwbGF5VXJsID0gJ2h0dHBzOi8vbXVzaWMubGl1emhpamluLmNuLz9pZD0nK211c2ljTWF0Y2gyWzFdKycmdHlwZT1xcSc7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZihjdXJyZW50VXJsLm1hdGNoKC9rdWdvdVwuY29tLykpeyAvL+mFt+eLlwoJCQkJdmFyIG11c2ljTWF0Y2ggPSBjdXJyZW50VXJsLm1hdGNoKC9oYXNoPShcUyopJmFsYnVtLyk7CgkJCQlpZihtdXNpY01hdGNoKXsKCQkJCQlwbGF5VXJsID0gJ2h0dHBzOi8vbXVzaWMubGl1emhpamluLmNuLz9pZD0nK211c2ljTWF0Y2hbMV0rJyZ0eXBlPWt1Z291JzsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKGN1cnJlbnRVcmwubWF0Y2goL2t1d29cLmNuLykpeyAgLy/phbfmiJEKCQkJCWlmKGN1cnJlbnRVcmwuaW5kZXhPZigiPyIpKSBjdXJyZW50VXJsID0gY3VycmVudFVybC5zcGxpdCgiPyIpWzBdOwoJCQkJaWYoY3VycmVudFVybC5pbmRleE9mKCIjIikpIGN1cnJlbnRVcmwgPSBjdXJyZW50VXJsLnNwbGl0KCIjIilbMF07CgkJCQl2YXIgbXVzaWNNYXRjaCA9IGN1cnJlbnRVcmwubWF0Y2goL3BsYXlfZGV0YWlsXC8oXFMqKS8pOwoJCQkJaWYobXVzaWNNYXRjaCl7CgkJCQkJcGxheVVybCA9ICdodHRwczovL211c2ljLmxpdXpoaWppbi5jbi8/aWQ9JyttdXNpY01hdGNoWzFdKycmdHlwZT1rdXdvJzsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKGN1cnJlbnRVcmwubWF0Y2goL3d3d1wueGltYWxheWFcLmNvbS8pKXsgLy/llpzpqazmi4npm4UKCQkJICAgIHZhciB4bWx5VXJsQXJyID0gY3VycmVudFVybC5zcGxpdCgiLyIpOwoJCQkgICAgZm9yKHZhciB4dWFJbmRleCA9MDt4dWFJbmRleDx4bWx5VXJsQXJyLmxlbmd0aDt4dWFJbmRleCsrKXsKCQkJICAgICAgICBpZih4dWFJbmRleD09eG1seVVybEFyci5sZW5ndGgtMSl7CgkJCQkJCXBsYXlVcmwgPSAnaHR0cHM6Ly9tdXNpYy5saXV6aGlqaW4uY24vP2lkPScreG1seVVybEFyclt4dWFJbmRleF0rJyZ0eXBlPXhpbWFsYXlhJnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQoY3VycmVudFVybCk7CgkJCSAgICAgICAgfQoJCQkgICAgfQoJCQl9CgkJCWVsc2UgaWYoY3VycmVudFVybC5tYXRjaCgvd3d3XC5saXpoaVwuZm0vKSl7IC8v6I2U5p6d6Z+z5LmQCgkJCQlpZihjdXJyZW50VXJsLmluZGV4T2YoIj8iKSkgY3VycmVudFVybCA9IGN1cnJlbnRVcmwuc3BsaXQoIj8iKVswXTsKCQkJCWlmKGN1cnJlbnRVcmwuaW5kZXhPZigiIyIpKSBjdXJyZW50VXJsID0gY3VycmVudFVybC5zcGxpdCgiIyIpWzBdOwoJCQkJdmFyIG11c2ljTWF0Y2ggPSBjdXJyZW50VXJsLm1hdGNoKC9eaHR0cHM/OlwvXC93d3dcLmxpemhpXC5mbVwvKFxkKilcLyhcZCopLyk7CgkJCQlpZihtdXNpY01hdGNoKXsKCQkJCQlwbGF5VXJsID0gJ2h0dHBzOi8vbXVzaWMubGl1emhpamluLmNuLz9pZD0nK211c2ljTWF0Y2hbMl0rJyZ0eXBlPWxpemhpJzsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKGN1cnJlbnRVcmwubWF0Y2goL211c2ljXC5taWd1XC5jbi8pKXsgLy/lkqrlkpXpn7PkuZAKCQkJCWlmKGN1cnJlbnRVcmwuaW5kZXhPZigiPyIpKSBjdXJyZW50VXJsID0gY3VycmVudFVybC5zcGxpdCgiPyIpWzBdOwoJCQkJaWYoY3VycmVudFVybC5pbmRleE9mKCIjIikpIGN1cnJlbnRVcmwgPSBjdXJyZW50VXJsLnNwbGl0KCIjIilbMF07CgkJCQl2YXIgbXVzaWNNYXRjaCA9IGN1cnJlbnRVcmwubWF0Y2goL15odHRwcz86XC9cL211c2ljXC5taWd1XC5jblwvdjNcL211c2ljXC9zb25nXC8oXFMqKS8pOwoJCQkJaWYobXVzaWNNYXRjaCl7CgkJCQkJcGxheVVybCA9ICdodHRwczovL211c2ljLmxpdXpoaWppbi5jbi8/aWQ9JyttdXNpY01hdGNoWzFdKycmdHlwZT1taWd1JzsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gcGxheVVybDsKCQl9OwoJCXRoaXMuYWRkU3R5bGU9ZnVuY3Rpb24oKXsKCQkJdmFyIGlubm5lckNzcyA9IAoJCQkiQGtleWZyYW1lcyB0dXJuYXJvdW5kezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwZGVnKTt9MjUley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7fTUwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTt9NzUley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpO30xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO319IisKCQkJIiNwbHVnaW5fa2l3aV9hbmFseXNpc192aXBfbXVzaWNfYm94XyIrdGhpcy5lbGVJZCsiIHtwb3NpdGlvbjpmaXhlZDsgdG9wOjE1MHB4OyBsZWZ0OjBweDsgd2lkdGg6MjZweDsgYmFja2dyb3VuZC1jb2xvcjojRTUyMTJFO3otaW5kZXg6OTk5OTk5OTg5OTk5OTt9IisKCQkJIiNwbHVnaW5fa2l3aV9hbmFseXNpc192aXBfbXVzaWNfYm94XyIrdGhpcy5lbGVJZCsiID4ucGx1Z2luX2l0ZW17Y3Vyc29yOnBvaW50ZXI7IHdpZHRoOjEwMCU7IHBhZGRpbmc6MTBweCAwcHg7IHRleHQtYWxpZ246Y2VudGVyO30iKwoJCQkiI3BsdWdpbl9raXdpX2FuYWx5c2lzX3ZpcF9tdXNpY19ib3hfIit0aGlzLmVsZUlkKyIgPi5wbHVnaW5faXRlbSA+aW1ne3dpZHRoOjIwcHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YW5pbWF0aW9uOnR1cm5hcm91bmQgNHMgbGluZWFyIGluZmluaXRlO30iOwoJCQkkKCJib2R5IikucHJlcGVuZCgiPHN0eWxlPiIraW5ubmVyQ3NzKyI8L3N0eWxlPiIpOwoJCX07CgkJdGhpcy5nZW5lcmF0ZUh0bWw9ZnVuY3Rpb24oKXsKCQkJdmFyICR0aGF0ID0gdGhpczsKCQkJdmFyIGh0bWw9IiI7CgkJCXZhciB2aXBJbWdCYXNlNjQgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBREprbEVRVlJZUjZXWFM2aE9VUlRIZi84d3V4NFRNWkNCeHdBcEpSU0tYRzh1R2JpZUtRWUdYcEVNS0xrR0dGQ1VSeUVESkhGTDZjcjF1RjREbERKQVREd0dCbktWdHpKQVMwdjd1NTN2ZlB2Y2M3NWoxZTU3bkwzWCt1MjE5M29jVVZETXJCOHdGWmdDakFjR2hPRWFPc040Qk53RDdrcjZVa1MxaWt3eXMyWmdIekNreUh6Z0RiQmQwc1c4K2QwQ21GbVBZSGhibnFLTTUvc0R5SitzOVprQVpqWU51RlhTY0hwWm82VGJNVjFSZ09EeUN5V04zd0d1aFBFVm1BZWNBcGJFanFRR3dNeDZBci9xTVA0NUdMc08zSlQwSWIzV3pDejgxMHZTNytUekdNQlZZRTRPd0hmZ2pCc0Via2o2MmQzOEJFQzdwTG1aQUdhMkRqaWFZL3dHc0UzUzA2SmVTZ0Q0a3ZXU2psWFdkbm5BelBvQXo0REJPWXFiSlBrWkY1WVV3RnRndEtSdnJpQUpNQXU0bHFkVlVsN29EZ2Vhd2pnbXFUVUY0Q1ptUy9JN1V3V3cxMk8yRElDWlRRYm1BNzZKTVFrZHV5VzFSQUQyU2RxUkJyZ1BUQ3dLWUdaK1VXY0dveU15MW1VQlBKQTBLUTN3Q2hoYUJNRE0xZ0xIOCtZQ1dRQ3ZKUTFMQTNob05lUXA5VHRnWmkzQXJyeTVRSXVrM1pFaitDR3BkeHJnZmFLNlplcXVFeURMQTUyU0JxWUJQS2xNejl0VkRvQW5wSmZBcDZESHkzTE1BeDJTWnFRQkRnS2Ivd1BnT2RBczZVVkZoNWsxU1BvUk9ZSkRrcmFrQVlwa1FUSThVR004dVpFSVFGYzJUQ1lpZDc4ZlExSzgwOWtEZUE3M0tQa25rVXU0VWRLUm1QZk1yRCtRTGxBekpIVlVlU0FvUGdjc0Q0cDhWOHRqT1Q4QzRLNXZ6UURZQUJ4T1BHdVR0S0R5dXlxdG10azQ0Q0hnbmRCa1NaNmNhaVFDMEE1c1Nub3BiR2d4a0c3THFtcEpyQndmQUxaMmwvUE43RExRdFl0QStBNDRHYjczRGYxamVrN1Y3bXVPSUZBUEFyeFFySTE1d015V0F1ZnpvaVh5M0J1UlJlbEttdFdTalFRdWVVTXE2WFFBR3d0NHBLd3BZZndqc0ZKU1RiWHRyaWwxQ0QrL1VTVU1KcGQ0aTc0cTZ6N2wxWGFIOERLOXNDUkVHN0JUMHBPczlVVmZUQnFCMWNDS2dpQnUrRVNSenFrUVFDSUJUZkFJQVR5OFl2STRWTURDTFZ0ZEFBa1E3d1c4SjBqS1dVbXJDbnFvYTFvcGdCQVZma0Vybm1pVjVPK1BkY3YvQUhoRFVhbDhJeVY1UTFPM2xBWUlYbGptbjVMS0pLWi9zSDhCOGpkWE1EdXRrNjRBQUFBQVNVVk9SSzVDWUlJPSI7CgkJCWh0bWwrPSAiPGRpdiBpZD0ncGx1Z2luX2tpd2lfYW5hbHlzaXNfdmlwX211c2ljX2JveF8iK3RoaXMuZWxlSWQrIic+IjsKCQkJaHRtbCs9ICI8ZGl2IGNsYXNzPSdwbHVnaW5faXRlbSBqdW1wX2FuYWx5c2lzX3dlYnNpdGUnIHRpdGxlPSfngrnmiJFWSVDpn7PkuZDnoLTop6PvvIzlhY3lrqLmiLfnq6/kuIvovb3vvIEnPjxpbWcgc3JjPSciK3ZpcEltZ0Jhc2U2NCsiJz48L2Rpdj4iOwoJCQlodG1sKz0gIjwvZGl2PiI7CgkJCSQoImJvZHkiKS5hcHBlbmQoaHRtbCk7CgkJCQoJCQkkKCIjcGx1Z2luX2tpd2lfYW5hbHlzaXNfdmlwX211c2ljX2JveF8iK3RoaXMuZWxlSWQrIiIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQl2YXIgcGxheVVybCA9ICR0aGF0LmdldFBsYXlVcmwoKTsKCQkJCWlmKCEhcGxheVVybCkgR01fb3BlbkluVGFiKHBsYXlVcmwsIGZhbHNlKTsKCQkJfSkKCQl9OwoJCXRoaXMub3BlcmF0aW9uPWZ1bmN0aW9uKCl7CgkJCXZhciAkdGhhdCA9IHRoaXM7CgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQl2YXIgcGxheVVybCA9ICR0aGF0LmdldFBsYXlVcmwoKTsKCQkJCXZhciAkdmlwTXVzaWNCb3ggPSAkKCIjcGx1Z2luX2tpd2lfYW5hbHlzaXNfdmlwX211c2ljX2JveF8iKyR0aGF0LmVsZUlkKyIiKTsKCQkJCWlmKCEhcGxheVVybCl7CgkJCQkJaWYoJHZpcE11c2ljQm94Lmxlbmd0aD09MCl7CgkJCQkJCSR0aGF0LmdlbmVyYXRlSHRtbCgpOwoJCQkJCX0KCQkJCX1lbHNlewoJCQkJCSR2aXBNdXNpY0JveC5yZW1vdmUoKTsKCQkJCX0KCQkJfSwgMTAwKTsKCQl9OwoJCXRoaXMuc3RhcnQ9ZnVuY3Rpb24oKXsKCQkJaWYodGhpcy5pc1J1bigpKXsKCQkJCXRoaXMuYWRkU3R5bGUoKTsKCQkJCXRoaXMub3BlcmF0aW9uKCk7CgkJCX0KCQl9OwoJfQoJCgkvKioKCSAqIOadpeaQnOS4gOS4i++8jOe9keebmOaQnOe0ouW8leaTjuaXoOe6v+S4i+i9vQoJICogQHBhcmFtIHtPYmplY3R9IHRvb2xPYmplY3QKCSAqLwoJZnVuY3Rpb24gd2FuZ3BhblNlYXJjaEVuZ2luZXNIZWxwZXIodG9vbE9iamVjdCl7CgkJdGhpcy50b29sT2JqZWN0PXRvb2xPYmplY3Q7CgkJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CgkJCWxldCAkdGhhdCA9IHRoaXM7CgkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0PT09Ind3dy5sYWlzb3lpeGlhLmNvbSIgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiL2Rvd25sb2FkL2RldGFpbCIpIT0tMSl7CgkJCQl2YXIgJGRvd25sb2FkQnRuID0gJCgiI2Rvd25sb2FkSGFuZGxlciIpOwoJCQkJdmFyIGRvd25sb2FkdXJsID0gJGRvd25sb2FkQnRuLmRhdGEoImRvd25sb2FkdXJsIik7CgkJCQlpZighIWRvd25sb2FkdXJsKXsKCQkJCQl2YXIgd2FuZ3BhblVybCA9IHdpbmRvdy5hdG9iKGRvd25sb2FkdXJsKTsKCQkJCQkkZG93bmxvYWRCdG4uYWZ0ZXIoIjxkaXYgc3R5bGU9J3BhZGRpbmc6MTVweDtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7bWFyZ2luLXRvcDoxNXB4Oyc+5o+S5Lu25o+Q5Y+W5omA5b6X77yaPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JyIrd2FuZ3BhblVybCsiJz4iK3dhbmdwYW5VcmwrIjwvYT48L2Rpdj4iKQoJCQkJfQoJCQl9CgkJfQoJfQoJCQoJLy/mnIDlkI7nu5/kuIDosIPnlKgKCXRyeXsKCQkobmV3IHN1cGVyVmlkZW9IZWxwZXIobmV3T3JpZ2luYWxJbnRlcmZhY2VMaXN0LCBwbGF5ZXJOb2RlcykpLnN0YXJ0KCk7Cgl9Y2F0Y2goZSl7CgkJY29uc29sZS5sb2coIuWFqOe9kVZJUOino+aekO+8mmVycm9y77yaIitlKTsKCX0KCQoJdHJ5ewoJCShuZXcgYWJyb2FkVmlkZW9IZWxwZXIoKSkuc3RhcnQoKTsKCX1jYXRjaChlKXsKCQljb25zb2xlLmxvZygi5Zu95aSW6KeG6aKR6Kej5p6Q77yaZXJyb3LvvJoiK2UpOwoJfQoJCgl0cnl7CgkJKG5ldyBxdWVyeUNvdXBvbigpKS5zdGFydCgpOwoJfWNhdGNoKGUpewoJCWNvbnNvbGUubG9nKCLkvJjmg6DliLjmn6Xor6LvvJplcnJvcu+8miIrZSk7Cgl9CgkKCXRyeXsKCQkobmV3IHN1cGVyTXVzaWNIZWxwZXIoKSkuc3RhcnQoKTsKCX1jYXRjaChlKXsKCQljb25zb2xlLmxvZygi5YWo572R6Z+z5LmQ5LiL6L2977yaZXJyb3LvvJoiK2UpOwoJfQoJCgl0cnl7CgkJbmV3IGh1YWh1YWNhdF9iaWxpYmlsaShjb21tb25GdW5jdGlvbk9iamVjdCkuc3RhcnQoKTsKCX1jYXRjaChlKXsKCQljb25zb2xlLmxvZygiQuermeinhumikeS4i+i9ve+8mmVycm9y77yaIitlKTsKCX0KCQoJdHJ5ewoJCW5ldyB3YW5ncGFuU2VhcmNoRW5naW5lc0hlbHBlcihjb21tb25GdW5jdGlvbk9iamVjdCkuc3RhcnQoKTsKCX1jYXRjaChlKXsKCQljb25zb2xlLmxvZygi5pCc57Si5byV5pOO56C06Kej77yaZXJyb3LvvJoiK2UpOwoJfQp9KSgpOw==","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js","ts":1637743499698,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My4yLjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO3ZhciBjPVtdLGQ9YS5kb2N1bWVudCxlPU9iamVjdC5nZXRQcm90b3R5cGVPZixmPWMuc2xpY2UsZz1jLmNvbmNhdCxoPWMucHVzaCxpPWMuaW5kZXhPZixqPXt9LGs9ai50b1N0cmluZyxsPWouaGFzT3duUHJvcGVydHksbT1sLnRvU3RyaW5nLG49bS5jYWxsKE9iamVjdCksbz17fTtmdW5jdGlvbiBwKGEsYil7Yj1ifHxkO3ZhciBjPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50ZXh0PWEsYi5oZWFkLmFwcGVuZENoaWxkKGMpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9dmFyIHE9IjMuMi4xIixyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyByLmZuLmluaXQoYSxiKX0scz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csdD0vXi1tcy0vLHU9Ly0oW2Etel0pL2csdj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O3IuZm49ci5wcm90b3R5cGU9e2pxdWVyeTpxLGNvbnN0cnVjdG9yOnIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBmLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9mLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPXIubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiByLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhyLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoYTwwP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmM8Yj9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aCxzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LHIuZXh0ZW5kPXIuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxyLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2g8aTtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYoci5pc1BsYWluT2JqZWN0KGQpfHwoZT1BcnJheS5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZBcnJheS5pc0FycmF5KGMpP2M6W10pOmY9YyYmci5pc1BsYWluT2JqZWN0KGMpP2M6e30sZ1tiXT1yLmV4dGVuZChqLGYsZCkpOnZvaWQgMCE9PWQmJihnW2JdPWQpKTtyZXR1cm4gZ30sci5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKHErTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PXIudHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3ZhciBiPXIudHlwZShhKTtyZXR1cm4oIm51bWJlciI9PT1ifHwic3RyaW5nIj09PWIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiEoIWF8fCJbb2JqZWN0IE9iamVjdF0iIT09ay5jYWxsKGEpKSYmKCEoYj1lKGEpKXx8KGM9bC5jYWxsKGIsImNvbnN0cnVjdG9yIikmJmIuY29uc3RydWN0b3IsImZ1bmN0aW9uIj09dHlwZW9mIGMmJm0uY2FsbChjKT09PW4pKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2ErIiI6Im9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYT9qW2suY2FsbChhKV18fCJvYmplY3QiOnR5cGVvZiBhfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe3AoYSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHQsIm1zLSIpLnJlcGxhY2UodSx2KX0sZWFjaDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtpZih3KGEpKXtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVha31lbHNlIGZvcihkIGluIGEpaWYoYi5jYWxsKGFbZF0sZCxhW2RdKT09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOihhKyIiKS5yZXBsYWNlKHMsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHcoT2JqZWN0KGEpKT9yLm1lcmdlKGMsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKTpoLmNhbGwoYyxhKSksY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/LTE6aS5jYWxsKGIsYSxjKX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO2Q8YztkKyspYVtlKytdPWJbZF07cmV0dXJuIGEubGVuZ3RoPWUsYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkLGU9W10sZj0wLGc9YS5sZW5ndGgsaD0hYztmPGc7ZisrKWQ9IWIoYVtmXSxmKSxkIT09aCYmZS5wdXNoKGFbZl0pO3JldHVybiBlfSxtYXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj0wLGg9W107aWYodyhhKSlmb3IoZD1hLmxlbmd0aDtmPGQ7ZisrKWU9YihhW2ZdLGYsYyksbnVsbCE9ZSYmaC5wdXNoKGUpO2Vsc2UgZm9yKGYgaW4gYSllPWIoYVtmXSxmLGMpLG51bGwhPWUmJmgucHVzaChlKTtyZXR1cm4gZy5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2lmKCJzdHJpbmciPT10eXBlb2YgYiYmKGM9YVtiXSxiPWEsYT1jKSxyLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGQ9Zi5jYWxsKGFyZ3VtZW50cywyKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYnx8dGhpcyxkLmNvbmNhdChmLmNhbGwoYXJndW1lbnRzKSkpfSxlLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8ci5ndWlkKyssZX0sbm93OkRhdGUubm93LHN1cHBvcnQ6b30pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihyLmZuW1N5bWJvbC5pdGVyYXRvcl09Y1tTeW1ib2wuaXRlcmF0b3JdKSxyLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7alsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiB3KGEpe3ZhciBiPSEhYSYmImxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPXIudHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iIT09YyYmIXIuaXNXaW5kb3coYSkmJigiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYSl9dmFyIHg9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEQ9W10sRT1ELnBvcCxGPUQucHVzaCxHPUQucHVzaCxIPUQuc2xpY2UsST1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0sSj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLEs9IltcXHgyMFxcdFxcclxcblxcZl0iLEw9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixNPSJcXFsiK0srIiooIitMKyIpKD86IitLKyIqKFsqXiR8IX5dPz0pIitLKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTCsiKSl8KSIrSysiKlxcXSIsTj0iOigiK0wrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK00rIikqKXwuKilcXCl8KSIsTz1uZXcgUmVnRXhwKEsrIisiLCJnIiksUD1uZXcgUmVnRXhwKCJeIitLKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0srIiskIiwiZyIpLFE9bmV3IFJlZ0V4cCgiXiIrSysiKiwiK0srIioiKSxSPW5ldyBSZWdFeHAoIl4iK0srIiooWz4rfl18IitLKyIpIitLKyIqIiksUz1uZXcgUmVnRXhwKCI9IitLKyIqKFteXFxdJ1wiXSo/KSIrSysiKlxcXSIsImciKSxUPW5ldyBSZWdFeHAoTiksVT1uZXcgUmVnRXhwKCJeIitMKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitMKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK0wrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK0wrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitNKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitLKyI/fCgiK0srIil8LikiLCJpZyIpLGFhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6ZDwwP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxiYT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxjYT1mdW5jdGlvbihhLGIpe3JldHVybiBiPyJcMCI9PT1hPyJcdWZmZmQiOmEuc2xpY2UoMCwtMSkrIlxcIithLmNoYXJDb2RlQXQoYS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2F9LGRhPWZ1bmN0aW9uKCl7bSgpfSxlYT10YShmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwJiYoImZvcm0iaW4gYXx8ImxhYmVsImluIGEpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0cuYXBwbHkoRD1ILmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLERbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0c9e2FwcGx5OkQubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ri5hcHBseShhLEguY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHM9YiYmYi5vd25lckRvY3VtZW50LHc9Yj9iLm5vZGVUeXBlOjk7aWYoZD1kfHxbXSwic3RyaW5nIiE9dHlwZW9mIGF8fCFhfHwxIT09dyYmOSE9PXcmJjExIT09dylyZXR1cm4gZDtpZighZSYmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLHApKXtpZigxMSE9PXcmJihsPVouZXhlYyhhKSkpaWYoZj1sWzFdKXtpZig5PT09dyl7aWYoIShqPWIuZ2V0RWxlbWVudEJ5SWQoZikpKXJldHVybiBkO2lmKGouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNlIGlmKHMmJihqPXMuZ2V0RWxlbWVudEJ5SWQoZikpJiZ0KGIsaikmJmouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNle2lmKGxbMl0pcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChmPWxbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gRy5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSksZH1pZihjLnFzYSYmIUFbYSsiICJdJiYoIXF8fCFxLnRlc3QoYSkpKXtpZigxIT09dylzPWIscj1hO2Vsc2UgaWYoIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhrPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9rPWsucmVwbGFjZShiYSxjYSk6Yi5zZXRBdHRyaWJ1dGUoImlkIixrPXUpLG89ZyhhKSxoPW8ubGVuZ3RoO3doaWxlKGgtLSlvW2hdPSIjIitrKyIgIitzYShvW2hdKTtyPW8uam9pbigiLCIpLHM9JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxifWlmKHIpdHJ5e3JldHVybiBHLmFwcGx5KGQscy5xdWVyeVNlbGVjdG9yQWxsKHIpKSxkfWNhdGNoKHgpe31maW5hbGx5e2s9PT11JiZiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShQLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1jLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiZhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImZvcm0iaW4gYj9iLnBhcmVudE5vZGUmJmIuZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gYj8ibGFiZWwiaW4gYi5wYXJlbnROb2RlP2IucGFyZW50Tm9kZS5kaXNhYmxlZD09PWE6Yi5kaXNhYmxlZD09PWE6Yi5pc0Rpc2FibGVkPT09YXx8Yi5pc0Rpc2FibGVkIT09IWEmJmVhKGIpPT09YTpiLmRpc2FibGVkPT09YToibGFiZWwiaW4gYiYmYi5kaXNhYmxlZD09PWF9fWZ1bmN0aW9uIHBhKGEpe3JldHVybiBpYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixpYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1nYS5zdXBwb3J0PXt9LGY9Z2EuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhYiYmIkhUTUwiIT09Yi5ub2RlTmFtZX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89bi5kb2N1bWVudEVsZW1lbnQscD0hZihuKSx2IT09biYmKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVkudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19LGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjLGQsZSxmPWIuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZil7aWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdO2U9Yi5nZXRFbGVtZW50c0J5TmFtZShhKSxkPTA7d2hpbGUoZj1lW2QrK10paWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdfXJldHVybltdfX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnApcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKX0scj1bXSxxPVtdLChjLnFzYT1ZLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrSysiKlsqXiR8IX5dPz0iKSwyIT09YS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmcS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLG8uYXBwZW5kQ2hpbGQoYSkuZGlzYWJsZWQ9ITAsMiE9PWEucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVkudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiKiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixOKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9WS50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8WS50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09bnx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1ufHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0koayxhKS1JKGssYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgYyxkPTAsZT1hLnBhcmVudE5vZGUsZj1iLnBhcmVudE5vZGUsZz1bYV0saD1bYl07aWYoIWV8fCFmKXJldHVybiBhPT09bj8tMTpiPT09bj8xOmU/LTE6Zj8xOms/SShrLGEpLUkoayxiKTowO2lmKGU9PT1mKXJldHVybiBsYShhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSlnLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTt3aGlsZShnW2RdPT09aFtkXSlkKys7cmV0dXJuIGQ/bGEoZ1tkXSxoW2RdKTpnW2RdPT09dj8tMTpoW2RdPT09dj8xOjB9LG4pOm59LGdhLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ2EoYSxudWxsLG51bGwsYil9LGdhLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShTLCI9JyQxJ10iKSxjLm1hdGNoZXNTZWxlY3RvciYmcCYmIUFbYisiICJdJiYoIXJ8fCFyLnRlc3QoYikpJiYoIXF8fCFxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZDLmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lc2NhcGU9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoYmEsY2EpfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6VixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKF8sYWEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKF8sYWEpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxnYS5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZnYS5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gVi5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZULnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0srIikiK2ErIigiK0srInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjohYnx8KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShPLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iJiYoZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxnYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2lhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1JKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmlhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFt1XT9pYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZ2EoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczppYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoXyxhYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFUudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6b2EoITEpLGRpc2FibGVkOm9hKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6cGEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnBhKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpwYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuW2M8MD9jK2I6Y119KSxldmVuOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6cGEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1jPDA/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpwYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWM8MD9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bWEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bmEoYik7ZnVuY3Rpb24gcmEoKXt9cmEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyByYSxnPWdhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1RLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1SLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFAsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1WW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBzYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7YjxjO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHRhKGEsYixjKXt2YXIgZD1iLmRpcixlPWIubmV4dCxmPWV8fGQsZz1jJiYicGFyZW50Tm9kZSI9PT1mLGg9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxlKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGcpcmV0dXJuIGEoYixjLGUpO3JldHVybiExfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG09W3csaF07aWYoaSl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZykmJmEoYixjLGkpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxnKWlmKGw9Ylt1XXx8KGJbdV09e30pLGs9bFtiLnVuaXF1ZUlEXXx8KGxbYi51bmlxdWVJRF09e30pLGUmJmU9PT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpYj1iW2RdfHxiO2Vsc2V7aWYoKGo9a1tmXSkmJmpbMF09PT13JiZqWzFdPT09aClyZXR1cm4gbVsyXT1qWzJdO2lmKGtbZl09bSxtWzJdPWEoYixjLGkpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB1YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB2YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB3YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtoPGk7aCsrKShmPWFbaF0pJiYoYyYmIWMoZixkLGUpfHwoZy5wdXNoKGYpLGomJmIucHVzaChoKSkpO3JldHVybiBnfWZ1bmN0aW9uIHhhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXhhKGQpKSxlJiYhZVt1XSYmKGU9eGEoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dmEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6d2EocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXdhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj13YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6Ry5hcHBseShnLHIpfSl9ZnVuY3Rpb24geWEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz10YShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9dGEoZnVuY3Rpb24oYSl7cmV0dXJuIEkoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2k8ZjtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bdGEodWEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7ZTxmO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHhhKGk+MSYmdWEobSksaT4xJiZzYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxpPGUmJnlhKGEuc2xpY2UoaSxlKSksZTxmJiZ5YShhPWEuc2xpY2UoZSkpLGU8ZiYmc2EoYSkpfW0ucHVzaChjKX1yZXR1cm4gdWEobSl9ZnVuY3Rpb24gemEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbyxxLHI9MCxzPSIwIix0PWYmJltdLHU9W10sdj1qLHg9Znx8ZSYmZC5maW5kLlRBRygiKiIsaykseT13Kz1udWxsPT12PzE6TWF0aC5yYW5kb20oKXx8LjEsej14Lmxlbmd0aDtmb3IoayYmKGo9Zz09PW58fGd8fGspO3MhPT16JiZudWxsIT0obD14W3NdKTtzKyspe2lmKGUmJmwpe289MCxnfHxsLm93bmVyRG9jdW1lbnQ9PT1ufHwobShsKSxoPSFwKTt3aGlsZShxPWFbbysrXSlpZihxKGwsZ3x8bixoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXkpfWMmJigobD0hcSYmbCkmJnItLSxmJiZ0LnB1c2gobCkpfWlmKHIrPXMsYyYmcyE9PXIpe289MDt3aGlsZShxPWJbbysrXSlxKHQsdSxnLGgpO2lmKGYpe2lmKHI+MCl3aGlsZShzLS0pdFtzXXx8dVtzXXx8KHVbc109RS5jYWxsKGkpKTt1PXdhKHUpfUcuYXBwbHkoaSx1KSxrJiYhZiYmdS5sZW5ndGg+MCYmcitiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz15LGo9diksdH07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eWEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHphKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsaSxqLGssbCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG49IWUmJmcoYT1tLnNlbGVjdG9yfHxhKTtpZihjPWN8fFtdLDE9PT1uLmxlbmd0aCl7aWYoaT1uWzBdPW5bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2lbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChqLm1hdGNoZXNbMF0ucmVwbGFjZShfLGFhKSxiKXx8W10pWzBdLCFiKXJldHVybiBjO20mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGkuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWY9Vi5uZWVkc0NvbnRleHQudGVzdChhKT8wOmkubGVuZ3RoO3doaWxlKGYtLSl7aWYoaj1pW2ZdLGQucmVsYXRpdmVbaz1qLnR5cGVdKWJyZWFrO2lmKChsPWQuZmluZFtrXSkmJihlPWwoai5tYXRjaGVzWzBdLnJlcGxhY2UoXyxhYSksJC50ZXN0KGlbMF0udHlwZSkmJnFhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoaS5zcGxpY2UoZiwxKSxhPWUubGVuZ3RoJiZzYShpKSwhYSlyZXR1cm4gRy5hcHBseShjLGUpLGM7YnJlYWt9fX1yZXR1cm4obXx8aChhLG4pKShlLGIsIXAsYywhYnx8JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxiKSxjfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtpZighYylyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7aWYoIWMmJiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEosZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFjKXJldHVybiBhW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTtyLmZpbmQ9eCxyLmV4cHI9eC5zZWxlY3RvcnMsci5leHByWyI6Il09ci5leHByLnBzZXVkb3Msci51bmlxdWVTb3J0PXIudW5pcXVlPXgudW5pcXVlU29ydCxyLnRleHQ9eC5nZXRUZXh0LHIuaXNYTUxEb2M9eC5pc1hNTCxyLmNvbnRhaW5zPXguY29udGFpbnMsci5lc2NhcGVTZWxlY3Rvcj14LmVzY2FwZTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmcihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9LEE9ci5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBCKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudG9Mb3dlckNhc2UoKX12YXIgQz0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaSxEPS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gRShhLGIsYyl7cmV0dXJuIHIuaXNGdW5jdGlvbihiKT9yLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTpiLm5vZGVUeXBlP3IuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KToic3RyaW5nIiE9dHlwZW9mIGI/ci5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGkuY2FsbChiLGEpPi0xIT09Y30pOkQudGVzdChiKT9yLmZpbHRlcihiLGEsYyk6KGI9ci5maWx0ZXIoYixhKSxyLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gaS5jYWxsKGIsYSk+LTEhPT1jJiYxPT09YS5ub2RlVHlwZX0pKX1yLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9yLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOnIuZmluZC5tYXRjaGVzKGEsci5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxyLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjLGQ9dGhpcy5sZW5ndGgsZT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2socihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYoci5jb250YWlucyhlW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihjPXRoaXMucHVzaFN0YWNrKFtdKSxiPTA7YjxkO2IrKylyLmZpbmQoYSxlW2JdLGMpO3JldHVybiBkPjE/ci51bmlxdWVTb3J0KGMpOmN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhRSh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmQS50ZXN0KGEpP3IoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgRixHPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC8sSD1yLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxGLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hWzBdJiYiPiI9PT1hW2EubGVuZ3RoLTFdJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOkcuZXhlYyhhKSwhZXx8IWVbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxjKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihlWzFdKXtpZihiPWIgaW5zdGFuY2VvZiByP2JbMF06YixyLm1lcmdlKHRoaXMsci5wYXJzZUhUTUwoZVsxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpkLCEwKSksQy50ZXN0KGVbMV0pJiZyLmlzUGxhaW5PYmplY3QoYikpZm9yKGUgaW4gYilyLmlzRnVuY3Rpb24odGhpc1tlXSk/dGhpc1tlXShiW2VdKTp0aGlzLmF0dHIoZSxiW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gZj1kLmdldEVsZW1lbnRCeUlkKGVbMl0pLGYmJih0aGlzWzBdPWYsdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6ci5pc0Z1bmN0aW9uKGEpP3ZvaWQgMCE9PWMucmVhZHk/Yy5yZWFkeShhKTphKHIpOnIubWFrZUFycmF5KGEsdGhpcyl9O0gucHJvdG90eXBlPXIuZm4sRj1yKGQpO3ZhciBJPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEo9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ci5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1yKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGM7YSsrKWlmKHIuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPSJzdHJpbmciIT10eXBlb2YgYSYmcihhKTtpZighQS50ZXN0KGEpKWZvcig7ZDxlO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJnIuZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9yLnVuaXF1ZVNvcnQoZik6Zil9LGluZGV4OmZ1bmN0aW9uKGEpe3JldHVybiBhPyJzdHJpbmciPT10eXBlb2YgYT9pLmNhbGwocihhKSx0aGlzWzBdKTppLmNhbGwodGhpcyxhLmpxdWVyeT9hWzBdOmEpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIudW5pcXVlU29ydChyLm1lcmdlKHRoaXMuZ2V0KCkscihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBLKGEsYil7d2hpbGUoKGE9YVtiXSkmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1yLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB5KGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEsoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4geShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4geShhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHkoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHooKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiB6KGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBCKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50OihCKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksci5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsYil7ci5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXIubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9ci5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKEpbYV18fHIudW5pcXVlU29ydChlKSxJLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgTD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE0oYSl7dmFyIGI9e307cmV0dXJuIHIuZWFjaChhLm1hdGNoKEwpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifXIuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP00oYSk6ci5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZj1bXSxnPVtdLGg9LTEsaT1mdW5jdGlvbigpe2ZvcihlPWV8fGEub25jZSxkPWI9ITA7Zy5sZW5ndGg7aD0tMSl7Yz1nLnNoaWZ0KCk7d2hpbGUoKytoPGYubGVuZ3RoKWZbaF0uYXBwbHkoY1swXSxjWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlJiYoaD1mLmxlbmd0aCxjPSExKX1hLm1lbW9yeXx8KGM9ITEpLGI9ITEsZSYmKGY9Yz9bXToiIil9LGo9e2FkZDpmdW5jdGlvbigpe3JldHVybiBmJiYoYyYmIWImJihoPWYubGVuZ3RoLTEsZy5wdXNoKGMpKSxmdW5jdGlvbiBkKGIpe3IuZWFjaChiLGZ1bmN0aW9uKGIsYyl7ci5pc0Z1bmN0aW9uKGMpP2EudW5pcXVlJiZqLmhhcyhjKXx8Zi5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PXIudHlwZShjKSYmZChjKX0pfShhcmd1bWVudHMpLGMmJiFiJiZpKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiByLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9ci5pbkFycmF5KGIsZixjKSk+LTEpZi5zcGxpY2UoYywxKSxjPD1oJiZoLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ci5pbkFycmF5KGEsZik+LTE6Zi5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gZiYmKGY9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGY9Yz0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFmfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGU9Zz1bXSxjfHxifHwoZj1jPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfTtmdW5jdGlvbiBOKGEpe3JldHVybiBhfWZ1bmN0aW9uIE8oYSl7dGhyb3cgYX1mdW5jdGlvbiBQKGEsYixjLGQpe3ZhciBlO3RyeXthJiZyLmlzRnVuY3Rpb24oZT1hLnByb21pc2UpP2UuY2FsbChhKS5kb25lKGIpLmZhaWwoYyk6YSYmci5pc0Z1bmN0aW9uKGU9YS50aGVuKT9lLmNhbGwoYSxiLGMpOmIuYXBwbHkodm9pZCAwLFthXS5zbGljZShkKSl9Y2F0Y2goYSl7Yy5hcHBseSh2b2lkIDAsW2FdKX19ci5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGIpe3ZhciBjPVtbIm5vdGlmeSIsInByb2dyZXNzIixyLkNhbGxiYWNrcygibWVtb3J5Iiksci5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxkPSJwZW5kaW5nIixlPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBkfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZi5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oYSl7cmV0dXJuIGUudGhlbihudWxsLGEpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGIpe3IuZWFjaChjLGZ1bmN0aW9uKGMsZCl7dmFyIGU9ci5pc0Z1bmN0aW9uKGFbZFs0XV0pJiZhW2RbNF1dO2ZbZFsxXV0oZnVuY3Rpb24oKXt2YXIgYT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZyLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhiLm5vdGlmeSkuZG9uZShiLnJlc29sdmUpLmZhaWwoYi5yZWplY3QpOmJbZFswXSsiV2l0aCJdKHRoaXMsZT9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKGIsZCxlKXt2YXIgZj0wO2Z1bmN0aW9uIGcoYixjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxpPWFyZ3VtZW50cyxqPWZ1bmN0aW9uKCl7dmFyIGEsajtpZighKGI8Zikpe2lmKGE9ZC5hcHBseShoLGkpLGE9PT1jLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtqPWEmJigib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhKSYmYS50aGVuLHIuaXNGdW5jdGlvbihqKT9lP2ouY2FsbChhLGcoZixjLE4sZSksZyhmLGMsTyxlKSk6KGYrKyxqLmNhbGwoYSxnKGYsYyxOLGUpLGcoZixjLE8sZSksZyhmLGMsTixjLm5vdGlmeVdpdGgpKSk6KGQhPT1OJiYoaD12b2lkIDAsaT1bYV0pLChlfHxjLnJlc29sdmVXaXRoKShoLGkpKX19LGs9ZT9qOmZ1bmN0aW9uKCl7dHJ5e2ooKX1jYXRjaChhKXtyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJnIuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhhLGsuc3RhY2tUcmFjZSksYisxPj1mJiYoZCE9PU8mJihoPXZvaWQgMCxpPVthXSksYy5yZWplY3RXaXRoKGgsaSkpfX07Yj9rKCk6KHIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoay5zdGFja1RyYWNlPXIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLGEuc2V0VGltZW91dChrKSl9fXJldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGEpe2NbMF1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihlKT9lOk4sYS5ub3RpZnlXaXRoKSksY1sxXVszXS5hZGQoZygwLGEsci5pc0Z1bmN0aW9uKGIpP2I6TikpLGNbMl1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihkKT9kOk8pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9yLmV4dGVuZChhLGUpOmV9fSxmPXt9O3JldHVybiByLmVhY2goYyxmdW5jdGlvbihhLGIpe3ZhciBnPWJbMl0saD1iWzVdO2VbYlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtkPWh9LGNbMy1hXVsyXS5kaXNhYmxlLGNbMF1bMl0ubG9jayksZy5hZGQoYlszXS5maXJlKSxmW2JbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGZbYlswXSsiV2l0aCJdKHRoaXM9PT1mP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZltiWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGUucHJvbWlzZShmKSxiJiZiLmNhbGwoZixmKSxmfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cy5sZW5ndGgsYz1iLGQ9QXJyYXkoYyksZT1mLmNhbGwoYXJndW1lbnRzKSxnPXIuRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtkW2FdPXRoaXMsZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/Zi5jYWxsKGFyZ3VtZW50cyk6YywtLWJ8fGcucmVzb2x2ZVdpdGgoZCxlKX19O2lmKGI8PTEmJihQKGEsZy5kb25lKGgoYykpLnJlc29sdmUsZy5yZWplY3QsIWIpLCJwZW5kaW5nIj09PWcuc3RhdGUoKXx8ci5pc0Z1bmN0aW9uKGVbY10mJmVbY10udGhlbikpKXJldHVybiBnLnRoZW4oKTt3aGlsZShjLS0pUChlW2NdLGgoYyksZy5yZWplY3QpO3JldHVybiBnLnByb21pc2UoKX19KTt2YXIgUT0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oYixjKXthLmNvbnNvbGUmJmEuY29uc29sZS53YXJuJiZiJiZRLnRlc3QoYi5uYW1lKSYmYS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrYi5tZXNzYWdlLGIuc3RhY2ssYyl9LHIucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oYil7YS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYn0pfTt2YXIgUj1yLkRlZmVycmVkKCk7ci5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gUi50aGVuKGEpWyJjYXRjaCJdKGZ1bmN0aW9uKGEpe3IucmVhZHlFeGNlcHRpb24oYSl9KSx0aGlzfSxyLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tci5yZWFkeVdhaXQ6ci5pc1JlYWR5KXx8KHIuaXNSZWFkeT0hMCxhIT09ITAmJi0tci5yZWFkeVdhaXQ+MHx8Ui5yZXNvbHZlV2l0aChkLFtyXSkpfX0pLHIucmVhZHkudGhlbj1SLnRoZW47ZnVuY3Rpb24gUygpe2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsUyksCmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsUyksci5yZWFkeSgpfSJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWQucmVhZHlTdGF0ZSYmIWQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Euc2V0VGltZW91dChyLnJlYWR5KTooZC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixTKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFMpKTt2YXIgVD1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09ci50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpVChhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxyLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwocihhKSxjKX0pKSxiKSlmb3IoO2g8aTtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxVPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gVigpe3RoaXMuZXhwYW5kbz1yLmV4cGFuZG8rVi51aWQrK31WLnVpZD0xLFYucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihhKXt2YXIgYj1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGJ8fChiPXt9LFUoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1iOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KSkpLGJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzLmNhY2hlKGEpO2lmKCJzdHJpbmciPT10eXBlb2YgYillW3IuY2FtZWxDYXNlKGIpXT1jO2Vsc2UgZm9yKGQgaW4gYillW3IuY2FtZWxDYXNlKGQpXT1iW2RdO3JldHVybiBlfSxnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW3IuY2FtZWxDYXNlKGIpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmInN0cmluZyI9PXR5cGVvZiBiJiZ2b2lkIDA9PT1jP3RoaXMuZ2V0KGEsYik6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9YVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PWQpe2lmKHZvaWQgMCE9PWIpe0FycmF5LmlzQXJyYXkoYik/Yj1iLm1hcChyLmNhbWVsQ2FzZSk6KGI9ci5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIubWF0Y2goTCl8fFtdKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlkZWxldGUgZFtiW2NdXX0odm9pZCAwPT09Ynx8ci5pc0VtcHR5T2JqZWN0KGQpKSYmKGEubm9kZVR5cGU/YVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgYVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9YVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1iJiYhci5pc0VtcHR5T2JqZWN0KGIpfX07dmFyIFc9bmV3IFYsWD1uZXcgVixZPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sWj0vW0EtWl0vZztmdW5jdGlvbiAkKGEpe3JldHVybiJ0cnVlIj09PWF8fCJmYWxzZSIhPT1hJiYoIm51bGwiPT09YT9udWxsOmE9PT0rYSsiIj8rYTpZLnRlc3QoYSk/SlNPTi5wYXJzZShhKTphKX1mdW5jdGlvbiBfKGEsYixjKXt2YXIgZDtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKFosIi0kJiIpLnRvTG93ZXJDYXNlKCksYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSQoYyl9Y2F0Y2goZSl7fVguc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfXIuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBYLmhhc0RhdGEoYSl8fFcuaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFguYWNjZXNzKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1gucmVtb3ZlKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gVy5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1cucmVtb3ZlKGEsYil9fSksci5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1YLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIVcuZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPXIuY2FtZWxDYXNlKGQuc2xpY2UoNSkpLF8oZixkLGVbZF0pKSk7Vy5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSl9KTpUKHRoaXMsZnVuY3Rpb24oYil7dmFyIGM7aWYoZiYmdm9pZCAwPT09Yil7aWYoYz1YLmdldChmLGEpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1fKGYsYSksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtYLnJlbW92ZSh0aGlzLGEpfSl9fSksci5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXJldHVybiBiPShifHwiZngiKSsicXVldWUiLGQ9Vy5nZXQoYSxiKSxjJiYoIWR8fEFycmF5LmlzQXJyYXkoYyk/ZD1XLmFjY2VzcyhhLGIsci5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W119LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9ci5xdWV1ZShhLGIpLGQ9Yy5sZW5ndGgsZT1jLnNoaWZ0KCksZj1yLl9xdWV1ZUhvb2tzKGEsYiksZz1mdW5jdGlvbigpe3IuZGVxdWV1ZShhLGIpfTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoImZ4Ij09PWImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBmLnN0b3AsZS5jYWxsKGEsZyxmKSksIWQmJmYmJmYuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihhLGIpe3ZhciBjPWIrInF1ZXVlSG9va3MiO3JldHVybiBXLmdldChhLGMpfHxXLmFjY2VzcyhhLGMse2VtcHR5OnIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1cucmVtb3ZlKGEsW2IrInF1ZXVlIixjXSl9KX0pfX0pLHIuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9ImZ4IixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9yLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPXIucXVldWUodGhpcyxhLGIpO3IuX3F1ZXVlSG9va3ModGhpcyxhKSwiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09Y1swXSYmci5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPXIuRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fCJmeCI7d2hpbGUoZy0tKWM9Vy5nZXQoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIGFhPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGJhPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIithYSsiKShbYS16JV0qKSQiLCJpIiksY2E9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxkYT1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09YS5zdHlsZS5kaXNwbGF5fHwiIj09PWEuc3R5bGUuZGlzcGxheSYmci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSkmJiJub25lIj09PXIuY3NzKGEsImRpc3BsYXkiKX0sZWE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O2Z1bmN0aW9uIGZhKGEsYixjLGQpe3ZhciBlLGY9MSxnPTIwLGg9ZD9mdW5jdGlvbigpe3JldHVybiBkLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiByLmNzcyhhLGIsIiIpfSxpPWgoKSxqPWMmJmNbM118fChyLmNzc051bWJlcltiXT8iIjoicHgiKSxrPShyLmNzc051bWJlcltiXXx8InB4IiE9PWomJitpKSYmYmEuZXhlYyhyLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixyLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBnYT17fTtmdW5jdGlvbiBoYShhKXt2YXIgYixjPWEub3duZXJEb2N1bWVudCxkPWEubm9kZU5hbWUsZT1nYVtkXTtyZXR1cm4gZT9lOihiPWMuYm9keS5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoZCkpLGU9ci5jc3MoYiwiZGlzcGxheSIpLGIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSwibm9uZSI9PT1lJiYoZT0iYmxvY2siKSxnYVtkXT1lLGUpfWZ1bmN0aW9uIGlhKGEsYil7Zm9yKHZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWQ9YVtmXSxkLnN0eWxlJiYoYz1kLnN0eWxlLmRpc3BsYXksYj8oIm5vbmUiPT09YyYmKGVbZl09Vy5nZXQoZCwiZGlzcGxheSIpfHxudWxsLGVbZl18fChkLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmZGEoZCkmJihlW2ZdPWhhKGQpKSk6Im5vbmUiIT09YyYmKGVbZl09Im5vbmUiLFcuc2V0KGQsImRpc3BsYXkiLGMpKSk7Zm9yKGY9MDtmPGc7ZisrKW51bGwhPWVbZl0mJihhW2ZdLnN0eWxlLmRpc3BsYXk9ZVtmXSk7cmV0dXJuIGF9ci5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGEodGhpcyk/cih0aGlzKS5zaG93KCk6cih0aGlzKS5oaWRlKCl9KX19KTt2YXIgamE9L14oPzpjaGVja2JveHxyYWRpbykkL2ksa2E9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSspL2ksbGE9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG1hPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07bWEub3B0Z3JvdXA9bWEub3B0aW9uLG1hLnRib2R5PW1hLnRmb290PW1hLmNvbGdyb3VwPW1hLmNhcHRpb249bWEudGhlYWQsbWEudGg9bWEudGQ7ZnVuY3Rpb24gbmEoYSxiKXt2YXIgYztyZXR1cm4gYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOltdLHZvaWQgMD09PWJ8fGImJkIoYSxiKT9yLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIG9hKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKVcuc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxXLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfXZhciBwYT0vPHwmIz9cdys7LztmdW5jdGlvbiBxYShhLGIsYyxkLGUpe2Zvcih2YXIgZixnLGgsaSxqLGssbD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPVtdLG49MCxvPWEubGVuZ3RoO248bztuKyspaWYoZj1hW25dLGZ8fDA9PT1mKWlmKCJvYmplY3QiPT09ci50eXBlKGYpKXIubWVyZ2UobSxmLm5vZGVUeXBlP1tmXTpmKTtlbHNlIGlmKHBhLnRlc3QoZikpe2c9Z3x8bC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxoPShrYS5leGVjKGYpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGk9bWFbaF18fG1hLl9kZWZhdWx0LGcuaW5uZXJIVE1MPWlbMV0rci5odG1sUHJlZmlsdGVyKGYpK2lbMl0saz1pWzBdO3doaWxlKGstLSlnPWcubGFzdENoaWxkO3IubWVyZ2UobSxnLmNoaWxkTm9kZXMpLGc9bC5maXJzdENoaWxkLGcudGV4dENvbnRlbnQ9IiJ9ZWxzZSBtLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7bC50ZXh0Q29udGVudD0iIixuPTA7d2hpbGUoZj1tW24rK10paWYoZCYmci5pbkFycmF5KGYsZCk+LTEpZSYmZS5wdXNoKGYpO2Vsc2UgaWYoaj1yLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxnPW5hKGwuYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGomJm9hKGcpLGMpe2s9MDt3aGlsZShmPWdbaysrXSlsYS50ZXN0KGYudHlwZXx8IiIpJiZjLnB1c2goZil9cmV0dXJuIGx9IWZ1bmN0aW9uKCl7dmFyIGE9ZC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYj1hLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGM9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Muc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxjLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxjLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxiLmFwcGVuZENoaWxkKGMpLG8uY2hlY2tDbG9uZT1iLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsby5ub0Nsb25lQ2hlY2tlZD0hIWIuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciByYT1kLmRvY3VtZW50RWxlbWVudCxzYT0vXmtleS8sdGE9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLHVhPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiB2YSgpe3JldHVybiEwfWZ1bmN0aW9uIHdhKCl7cmV0dXJuITF9ZnVuY3Rpb24geGEoKXt0cnl7cmV0dXJuIGQuYWN0aXZlRWxlbWVudH1jYXRjaChhKXt9fWZ1bmN0aW9uIHlhKGEsYixjLGQsZSxmKXt2YXIgZyxoO2lmKCJvYmplY3QiPT10eXBlb2YgYil7InN0cmluZyIhPXR5cGVvZiBjJiYoZD1kfHxjLGM9dm9pZCAwKTtmb3IoaCBpbiBiKXlhKGEsaCxjLGQsYltoXSxmKTtyZXR1cm4gYX1pZihudWxsPT1kJiZudWxsPT1lPyhlPWMsZD1jPXZvaWQgMCk6bnVsbD09ZSYmKCJzdHJpbmciPT10eXBlb2YgYz8oZT1kLGQ9dm9pZCAwKTooZT1kLGQ9YyxjPXZvaWQgMCkpLGU9PT0hMSllPXdhO2Vsc2UgaWYoIWUpcmV0dXJuIGE7cmV0dXJuIDE9PT1mJiYoZz1lLGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9ci5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LmFkZCh0aGlzLGIsZSxkLGMpfSl9ci5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbixvLHAscT1XLmdldChhKTtpZihxKXtjLmhhbmRsZXImJihmPWMsYz1mLmhhbmRsZXIsZT1mLnNlbGVjdG9yKSxlJiZyLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJhLGUpLGMuZ3VpZHx8KGMuZ3VpZD1yLmd1aWQrKyksKGk9cS5ldmVudHMpfHwoaT1xLmV2ZW50cz17fSksKGc9cS5oYW5kbGUpfHwoZz1xLmhhbmRsZT1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHImJnIuZXZlbnQudHJpZ2dlcmVkIT09Yi50eXBlP3IuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGI9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSloPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuJiYobD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LG49KGU/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG4sbD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LGs9ci5leHRlbmQoe3R5cGU6bixvcmlnVHlwZTpwLGRhdGE6ZCxoYW5kbGVyOmMsZ3VpZDpjLmd1aWQsc2VsZWN0b3I6ZSxuZWVkc0NvbnRleHQ6ZSYmci5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGUpLG5hbWVzcGFjZTpvLmpvaW4oIi4iKX0sZiksKG09aVtuXSl8fChtPWlbbl09W10sbS5kZWxlZ2F0ZUNvdW50PTAsbC5zZXR1cCYmbC5zZXR1cC5jYWxsKGEsZCxvLGcpIT09ITF8fGEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hZGRFdmVudExpc3RlbmVyKG4sZykpLGwuYWRkJiYobC5hZGQuY2FsbChhLGspLGsuaGFuZGxlci5ndWlkfHwoay5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGspOm0ucHVzaChrKSxyLmV2ZW50Lmdsb2JhbFtuXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG4sbyxwLHE9Vy5oYXNEYXRhKGEpJiZXLmdldChhKTtpZihxJiYoaT1xLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuKXtsPXIuZXZlbnQuc3BlY2lhbFtuXXx8e30sbj0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8bixtPWlbbl18fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrby5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcCE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEsbyxxLmhhbmRsZSkhPT0hMXx8ci5yZW1vdmVFdmVudChhLG4scS5oYW5kbGUpLGRlbGV0ZSBpW25dKX1lbHNlIGZvcihuIGluIGkpci5ldmVudC5yZW1vdmUoYSxuK2Jbal0sYyxkLCEwKTtyLmlzRW1wdHlPYmplY3QoaSkmJlcucmVtb3ZlKGEsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZhciBiPXIuZXZlbnQuZml4KGEpLGMsZCxlLGYsZyxoLGk9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGo9KFcuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYi50eXBlXXx8W10saz1yLmV2ZW50LnNwZWNpYWxbYi50eXBlXXx8e307Zm9yKGlbMF09YixjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKylpW2NdPWFyZ3VtZW50c1tjXTtpZihiLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGIpIT09ITEpe2g9ci5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYixqKSxjPTA7d2hpbGUoKGY9aFtjKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7Yi5jdXJyZW50VGFyZ2V0PWYuZWxlbSxkPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tkKytdKSYmIWIuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSliLnJuYW1lc3BhY2UmJiFiLnJuYW1lc3BhY2UudGVzdChnLm5hbWVzcGFjZSl8fChiLmhhbmRsZU9iaj1nLGIuZGF0YT1nLmRhdGEsZT0oKHIuZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGIucmVzdWx0PWUpPT09ITEmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGIpLGIucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg9W10saT1iLmRlbGVnYXRlQ291bnQsaj1hLnRhcmdldDtpZihpJiZqLm5vZGVUeXBlJiYhKCJjbGljayI9PT1hLnR5cGUmJmEuYnV0dG9uPj0xKSlmb3IoO2ohPT10aGlzO2o9ai5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1qLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8ai5kaXNhYmxlZCE9PSEwKSl7Zm9yKGY9W10sZz17fSxjPTA7YzxpO2MrKylkPWJbY10sZT1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1nW2VdJiYoZ1tlXT1kLm5lZWRzQ29udGV4dD9yKGUsdGhpcykuaW5kZXgoaik+LTE6ci5maW5kKGUsdGhpcyxudWxsLFtqXSkubGVuZ3RoKSxnW2VdJiZmLnB1c2goZCk7Zi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmZ9KX1yZXR1cm4gaj10aGlzLGk8Yi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmIuc2xpY2UoaSl9KSxofSxhZGRQcm9wOmZ1bmN0aW9uKGEsYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIuRXZlbnQucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpyLmlzRnVuY3Rpb24oYik/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGIodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFthXX0sc2V0OmZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19KX0sZml4OmZ1bmN0aW9uKGEpe3JldHVybiBhW3IuZXhwYW5kb10/YTpuZXcgci5FdmVudChhKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcyE9PXhhKCkmJnRoaXMuZm9jdXMpcmV0dXJuIHRoaXMuZm9jdXMoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXM9PT14YSgpJiZ0aGlzLmJsdXIpcmV0dXJuIHRoaXMuYmx1cigpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZigiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZCKHRoaXMsImlucHV0IikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fSxyLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMpfSxyLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiByLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT92YTp3YSx0aGlzLnRhcmdldD1hLnRhcmdldCYmMz09PWEudGFyZ2V0Lm5vZGVUeXBlP2EudGFyZ2V0LnBhcmVudE5vZGU6YS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWEuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9YS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9YSxiJiZyLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxyLm5vdygpLHZvaWQodGhpc1tyLmV4cGFuZG9dPSEwKSk6bmV3IHIuRXZlbnQoYSxiKX0sci5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOndhLGlzUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD12YSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sci5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihhKXt2YXIgYj1hLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS53aGljaCYmc2EudGVzdChhLnR5cGUpP251bGwhPWEuY2hhckNvZGU/YS5jaGFyQ29kZTphLmtleUNvZGU6IWEud2hpY2gmJnZvaWQgMCE9PWImJnRhLnRlc3QoYS50eXBlKT8xJmI/MToyJmI/Mzo0JmI/MjowOmEud2hpY2h9fSxyLmV2ZW50LmFkZFByb3ApLHIuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtyLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fHIuY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLHIuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4geWEodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB5YSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixyKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9d2EpLHRoaXMuZWFjaChmdW5jdGlvbigpe3IuZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9fSk7dmFyIHphPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxBYT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxCYT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxDYT0vXnRydWVcLyguKikvLERhPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBFYShhLGIpe3JldHVybiBCKGEsInRhYmxlIikmJkIoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP3IoIj50Ym9keSIsYSlbMF18fGE6YX1mdW5jdGlvbiBGYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIEdhKGEpe3ZhciBiPUNhLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gSGEoYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihXLmhhc0RhdGEoYSkmJihmPVcuYWNjZXNzKGEpLGc9Vy5zZXQoYixmKSxqPWYuZXZlbnRzKSl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihlIGluIGopZm9yKGM9MCxkPWpbZV0ubGVuZ3RoO2M8ZDtjKyspci5ldmVudC5hZGQoYixlLGpbZV1bY10pfVguaGFzRGF0YShhKSYmKGg9WC5hY2Nlc3MoYSksaT1yLmV4dGVuZCh7fSxoKSxYLnNldChiLGkpKX19ZnVuY3Rpb24gSWEoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PWMmJmphLnRlc3QoYS50eXBlKT9iLmNoZWNrZWQ9YS5jaGVja2VkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBKYShhLGIsYyxkKXtiPWcuYXBwbHkoW10sYik7dmFyIGUsZixoLGksaixrLGw9MCxtPWEubGVuZ3RoLG49bS0xLHE9YlswXSxzPXIuaXNGdW5jdGlvbihxKTtpZihzfHxtPjEmJiJzdHJpbmciPT10eXBlb2YgcSYmIW8uY2hlY2tDbG9uZSYmQmEudGVzdChxKSlyZXR1cm4gYS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWEuZXEoZSk7cyYmKGJbMF09cS5jYWxsKHRoaXMsZSxmLmh0bWwoKSkpLEphKGYsYixjLGQpfSk7aWYobSYmKGU9cWEoYixhWzBdLm93bmVyRG9jdW1lbnQsITEsYSxkKSxmPWUuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9ZiksZnx8ZCkpe2ZvcihoPXIubWFwKG5hKGUsInNjcmlwdCIpLEZhKSxpPWgubGVuZ3RoO2w8bTtsKyspaj1lLGwhPT1uJiYoaj1yLmNsb25lKGosITAsITApLGkmJnIubWVyZ2UoaCxuYShqLCJzY3JpcHQiKSkpLGMuY2FsbChhW2xdLGosbCk7aWYoaSlmb3Ioaz1oW2gubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsci5tYXAoaCxHYSksbD0wO2w8aTtsKyspaj1oW2xdLGxhLnRlc3Qoai50eXBlfHwiIikmJiFXLmFjY2VzcyhqLCJnbG9iYWxFdmFsIikmJnIuY29udGFpbnMoayxqKSYmKGouc3JjP3IuX2V2YWxVcmwmJnIuX2V2YWxVcmwoai5zcmMpOnAoai50ZXh0Q29udGVudC5yZXBsYWNlKERhLCIiKSxrKSl9cmV0dXJuIGF9ZnVuY3Rpb24gS2EoYSxiLGMpe2Zvcih2YXIgZCxlPWI/ci5maWx0ZXIoYixhKTphLGY9MDtudWxsIT0oZD1lW2ZdKTtmKyspY3x8MSE9PWQubm9kZVR5cGV8fHIuY2xlYW5EYXRhKG5hKGQpKSxkLnBhcmVudE5vZGUmJihjJiZyLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudCxkKSYmb2EobmEoZCwic2NyaXB0IikpLGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSk7cmV0dXJuIGF9ci5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh6YSwiPCQxPjwvJDI+Iil9LGNsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY2xvbmVOb2RlKCEwKSxpPXIuY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKCEoby5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8ci5pc1hNTERvYyhhKSkpZm9yKGc9bmEoaCksZj1uYShhKSxkPTAsZT1mLmxlbmd0aDtkPGU7ZCsrKUlhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fG5hKGEpLGc9Z3x8bmEoaCksZD0wLGU9Zi5sZW5ndGg7ZDxlO2QrKylIYShmW2RdLGdbZF0pO2Vsc2UgSGEoYSxoKTtyZXR1cm4gZz1uYShoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZvYShnLCFpJiZuYShhLCJzY3JpcHQiKSksaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZT1yLmV2ZW50LnNwZWNpYWwsZj0wO3ZvaWQgMCE9PShjPWFbZl0pO2YrKylpZihVKGMpKXtpZihiPWNbVy5leHBhbmRvXSl7aWYoYi5ldmVudHMpZm9yKGQgaW4gYi5ldmVudHMpZVtkXT9yLmV2ZW50LnJlbW92ZShjLGQpOnIucmVtb3ZlRXZlbnQoYyxkLGIuaGFuZGxlKTtjW1cuZXhwYW5kb109dm9pZCAwfWNbWC5leHBhbmRvXSYmKGNbWC5leHBhbmRvXT12b2lkIDApfX19KSxyLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBLYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIEthKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9yLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSmEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUVhKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9RWEodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKTE9PT1hLm5vZGVUeXBlJiYoci5jbGVhbkRhdGEobmEoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGwhPWEmJmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiByLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIUFhLnRlc3QoYSkmJiFtYVsoa2EuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9ci5odG1sUHJlZmlsdGVyKGEpO3RyeXtmb3IoO2M8ZDtjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKHIuY2xlYW5EYXRhKG5hKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIEphKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMucGFyZW50Tm9kZTtyLmluQXJyYXkodGhpcyxhKTwwJiYoci5jbGVhbkRhdGEobmEodGhpcykpLGMmJmMucmVwbGFjZUNoaWxkKGIsdGhpcykpfSxhKX19KSxyLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W10sZT1yKGEpLGY9ZS5sZW5ndGgtMSxnPTA7Zzw9ZjtnKyspYz1nPT09Zj90aGlzOnRoaXMuY2xvbmUoITApLHIoZVtnXSlbYl0oYyksaC5hcHBseShkLGMuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhkKX19KTt2YXIgTGE9L15tYXJnaW4vLE1hPW5ldyBSZWdFeHAoIl4oIithYSsiKSg/IXB4KVthLXolXSskIiwiaSIpLE5hPWZ1bmN0aW9uKGIpe3ZhciBjPWIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gYyYmYy5vcGVuZXJ8fChjPWEpLGMuZ2V0Q29tcHV0ZWRTdHlsZShiKX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2lmKGkpe2kuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt0b3A6MSU7d2lkdGg6NTAlIixpLmlubmVySFRNTD0iIixyYS5hcHBlbmRDaGlsZChoKTt2YXIgYj1hLmdldENvbXB1dGVkU3R5bGUoaSk7Yz0iMSUiIT09Yi50b3AsZz0iMnB4Ij09PWIubWFyZ2luTGVmdCxlPSI0cHgiPT09Yi53aWR0aCxpLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGY9IjRweCI9PT1iLm1hcmdpblJpZ2h0LHJhLnJlbW92ZUNoaWxkKGgpLGk9bnVsbH19dmFyIGMsZSxmLGcsaD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlJiYoaS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGkuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixvLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxoLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixoLmFwcGVuZENoaWxkKGkpLHIuZXh0ZW5kKG8se3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGN9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxlfSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxmfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGd9fSkpfSgpO2Z1bmN0aW9uIE9hKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8TmEoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdLCIiIT09Z3x8ci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fChnPXIuc3R5bGUoYSxiKSksIW8ucGl4ZWxNYXJnaW5SaWdodCgpJiZNYS50ZXN0KGcpJiZMYS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiBQYShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgUWE9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFJhPS9eLS0vLFNhPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sVWE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFZhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gV2EoYSl7aWYoYSBpbiBWYSlyZXR1cm4gYTt2YXIgYj1hWzBdLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPVVhLmxlbmd0aDt3aGlsZShjLS0paWYoYT1VYVtjXStiLGEgaW4gVmEpcmV0dXJuIGF9ZnVuY3Rpb24gWGEoYSl7dmFyIGI9ci5jc3NQcm9wc1thXTtyZXR1cm4gYnx8KGI9ci5jc3NQcm9wc1thXT1XYShhKXx8YSksYn1mdW5jdGlvbiBZYShhLGIsYyl7dmFyIGQ9YmEuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMl0tKGN8fDApKSsoZFszXXx8InB4Iik6Yn1mdW5jdGlvbiBaYShhLGIsYyxkLGUpe3ZhciBmLGc9MDtmb3IoZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MDtmPDQ7Zis9MikibWFyZ2luIj09PWMmJihnKz1yLmNzcyhhLGMrY2FbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1yLmNzcyhhLCJwYWRkaW5nIitjYVtmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09ci5jc3MoYSwiYm9yZGVyIitjYVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPXIuY3NzKGEsInBhZGRpbmciK2NhW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1yLmNzcyhhLCJib3JkZXIiK2NhW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiAkYShhLGIsYyl7dmFyIGQsZT1OYShhKSxmPU9hKGEsYixlKSxnPSJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZSk7cmV0dXJuIE1hLnRlc3QoZik/ZjooZD1nJiYoby5ib3hTaXppbmdSZWxpYWJsZSgpfHxmPT09YS5zdHlsZVtiXSksImF1dG8iPT09ZiYmKGY9YVsib2Zmc2V0IitiWzBdLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKV0pLGY9cGFyc2VGbG9hdChmKXx8MCxmK1phKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZSkrInB4Iil9ci5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1PYShhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpLGo9YS5zdHlsZTtyZXR1cm4gaXx8KGI9WGEoaCkpLGc9ci5jc3NIb29rc1tiXXx8ci5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTpqW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9YmEuZXhlYyhjKSkmJmVbMV0mJihjPWZhKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChyLmNzc051bWJlcltoXT8iIjoicHgiKSksby5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaltiXT0iaW5oZXJpdCIpLGcmJiJzZXQiaW4gZyYmdm9pZCAwPT09KGM9Zy5zZXQoYSxjLGQpKXx8KGk/ai5zZXRQcm9wZXJ0eShiLGMpOmpbYl09YykpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpO3JldHVybiBpfHwoYj1YYShoKSksZz1yLmNzc0hvb2tzW2JdfHxyLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZSYmKGU9T2EoYSxiLGQpKSwibm9ybWFsIj09PWUmJmIgaW4gVGEmJihlPVRhW2JdKSwiIj09PWN8fGM/KGY9cGFyc2VGbG9hdChlKSxjPT09ITB8fGlzRmluaXRlKGYpP2Z8fDA6ZSk6ZX19KSxyLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7ci5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiFRYS50ZXN0KHIuY3NzKGEsImRpc3BsYXkiKSl8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/JGEoYSxiLGQpOmVhKGEsU2EsZnVuY3Rpb24oKXtyZXR1cm4gJGEoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj1kJiZOYShhKSxnPWQmJlphKGEsYixkLCJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZiksZik7cmV0dXJuIGcmJihlPWJhLmV4ZWMoYykpJiYicHgiIT09KGVbM118fCJweCIpJiYoYS5zdHlsZVtiXT1jLGM9ci5jc3MoYSxiKSksWWEoYSxjLGcpfX19KSxyLmNzc0hvb2tzLm1hcmdpbkxlZnQ9UGEoby5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxiKXtpZihiKXJldHVybihwYXJzZUZsb2F0KE9hKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1lYShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksci5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ZDw0O2QrKyllW2ErY2FbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sTGEudGVzdChhKXx8KHIuY3NzSG9va3NbYStiXS5zZXQ9WWEpfSksci5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKGQ9TmEoYSksZT1iLmxlbmd0aDtnPGU7ZysrKWZbYltnXV09ci5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP3Iuc3R5bGUoYSxiLGMpOnIuY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIF9hKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBfYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfXIuVHdlZW49X2EsX2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHxyLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9Yix0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9ZCx0aGlzLnVuaXQ9Znx8KHIuY3NzTnVtYmVyW2NdPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1fYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6X2EucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9X2EucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1iPXIuZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWI9YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpfYS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxfYS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9X2EucHJvdG90eXBlLF9hLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gMSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbCE9YS5lbGVtW2EucHJvcF0mJm51bGw9PWEuZWxlbS5zdHlsZVthLnByb3BdP2EuZWxlbVthLnByb3BdOihiPXIuY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKX0sc2V0OmZ1bmN0aW9uKGEpe3IuZnguc3RlcFthLnByb3BdP3IuZnguc3RlcFthLnByb3BdKGEpOjEhPT1hLmVsZW0ubm9kZVR5cGV8fG51bGw9PWEuZWxlbS5zdHlsZVtyLmNzc1Byb3BzW2EucHJvcF1dJiYhci5jc3NIb29rc1thLnByb3BdP2EuZWxlbVthLnByb3BdPWEubm93OnIuc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpfX19LF9hLnByb3BIb29rcy5zY3JvbGxUb3A9X2EucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sci5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxyLmZ4PV9hLnByb3RvdHlwZS5pbml0LHIuZnguc3RlcD17fTt2YXIgYWIsYmIsY2I9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGRiPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZWIoKXtiYiYmKGQuaGlkZGVuPT09ITEmJmEucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2EucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGViKTphLnNldFRpbWVvdXQoZWIsci5meC5pbnRlcnZhbCksci5meC50aWNrKCkpfWZ1bmN0aW9uIGZiKCl7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe2FiPXZvaWQgMH0pLGFiPXIubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowO2Q8NDtkKz0yLWIpYz1jYVtkXSxlWyJtYXJnaW4iK2NdPWVbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIGhiKGEsYixjKXtmb3IodmFyIGQsZT0oa2IudHdlZW5lcnNbYl18fFtdKS5jb25jYXQoa2IudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7ZjxnO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gaWIoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD0id2lkdGgiaW4gYnx8ImhlaWdodCJpbiBiLG09dGhpcyxuPXt9LG89YS5zdHlsZSxwPWEubm9kZVR5cGUmJmRhKGEpLHE9Vy5nZXQoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGc9ci5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWcudW5xdWV1ZWQmJihnLnVucXVldWVkPTAsaD1nLmVtcHR5LmZpcmUsZy5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7Zy51bnF1ZXVlZHx8aCgpfSksZy51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtnLnVucXVldWVkLS0sci5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8Zy5lbXB0eS5maXJlKCl9KX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxjYi50ZXN0KGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHA/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFxfHx2b2lkIDA9PT1xW2RdKWNvbnRpbnVlO3A9ITB9bltkXT1xJiZxW2RdfHxyLnN0eWxlKGEsZCl9aWYoaT0hci5pc0VtcHR5T2JqZWN0KGIpLGl8fCFyLmlzRW1wdHlPYmplY3Qobikpe2wmJjE9PT1hLm5vZGVUeXBlJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1xJiZxLmRpc3BsYXksbnVsbD09aiYmKGo9Vy5nZXQoYSwiZGlzcGxheSIpKSxrPXIuY3NzKGEsImRpc3BsYXkiKSwibm9uZSI9PT1rJiYoaj9rPWo6KGlhKFthXSwhMCksaj1hLnN0eWxlLmRpc3BsYXl8fGosaz1yLmNzcyhhLCJkaXNwbGF5IiksaWEoW2FdKSkpLCgiaW5saW5lIj09PWt8fCJpbmxpbmUtYmxvY2siPT09ayYmbnVsbCE9aikmJiJub25lIj09PXIuY3NzKGEsImZsb2F0IikmJihpfHwobS5kb25lKGZ1bmN0aW9uKCl7by5kaXNwbGF5PWp9KSxudWxsPT1qJiYoaz1vLmRpc3BsYXksaj0ibm9uZSI9PT1rPyIiOmspKSxvLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz0iaGlkZGVuIixtLmFsd2F5cyhmdW5jdGlvbigpe28ub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxvLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLG8ub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSksaT0hMTtmb3IoZCBpbiBuKWl8fChxPyJoaWRkZW4iaW4gcSYmKHA9cS5oaWRkZW4pOnE9Vy5hY2Nlc3MoYSwiZnhzaG93Iix7ZGlzcGxheTpqfSksZiYmKHEuaGlkZGVuPSFwKSxwJiZpYShbYV0sITApLG0uZG9uZShmdW5jdGlvbigpe3B8fGlhKFthXSksVy5yZW1vdmUoYSwiZnhzaG93Iik7Zm9yKGQgaW4gbilyLnN0eWxlKGEsZCxuW2RdKX0pKSxpPWhiKHA/cVtkXTowLGQsbSksZCBpbiBxfHwocVtkXT1pLnN0YXJ0LHAmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPXIuY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sQXJyYXkuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9ci5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBrYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1rYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPXIuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWFifHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtnPGk7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksZjwxJiZpP2M6KGl8fGgubm90aWZ5V2l0aChhLFtqLDEsMF0pLGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpyLmV4dGVuZCh7fSxiKSxvcHRzOnIuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpyLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmFifHxmYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9ci5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmPGc7ZisrKWlmKGQ9a2IucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIHIuaXNGdW5jdGlvbihkLnN0b3ApJiYoci5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPXIucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiByLm1hcChrLGhiLGopLHIuaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLGoucHJvZ3Jlc3Moai5vcHRzLnByb2dyZXNzKS5kb25lKGoub3B0cy5kb25lLGoub3B0cy5jb21wbGV0ZSkuZmFpbChqLm9wdHMuZmFpbCkuYWx3YXlzKGoub3B0cy5hbHdheXMpLHIuZngudGltZXIoci5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksan1yLkFuaW1hdGlvbj1yLmV4dGVuZChrYix7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYik7cmV0dXJuIGZhKGMuZWxlbSxhLGJhLmV4ZWMoYiksYyksY31dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsYil7ci5pc0Z1bmN0aW9uKGEpPyhiPWEsYT1bIioiXSk6YT1hLm1hdGNoKEwpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWM9YVtkXSxrYi50d2VlbmVyc1tjXT1rYi50d2VlbmVyc1tjXXx8W10sa2IudHdlZW5lcnNbY10udW5zaGlmdChiKX0scHJlZmlsdGVyczpbaWJdLHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/a2IucHJlZmlsdGVycy51bnNoaWZ0KGEpOmtiLnByZWZpbHRlcnMucHVzaChhKX19KSxyLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiYib2JqZWN0Ij09dHlwZW9mIGE/ci5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxyLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIXIuaXNGdW5jdGlvbihiKSYmYn07cmV0dXJuIHIuZngub2ZmP2QuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIGQuZHVyYXRpb24mJihkLmR1cmF0aW9uIGluIHIuZnguc3BlZWRzP2QuZHVyYXRpb249ci5meC5zcGVlZHNbZC5kdXJhdGlvbl06ZC5kdXJhdGlvbj1yLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtyLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJnIuZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxyLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihkYSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ci5pc0VtcHR5T2JqZWN0KGEpLGY9ci5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsci5leHRlbmQoe30sYSksZik7KGV8fFcuZ2V0KHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9ci50aW1lcnMsZz1XLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZkYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxyLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1XLmdldCh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9ci50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLHIucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2I8ZztiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksci5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPXIuZm5bYl07ci5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxyLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksci50aW1lcnM9W10sci5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj0wLGM9ci50aW1lcnM7Zm9yKGFiPXIubm93KCk7YjxjLmxlbmd0aDtiKyspYT1jW2JdLGEoKXx8Y1tiXSE9PWF8fGMuc3BsaWNlKGItLSwxKTtjLmxlbmd0aHx8ci5meC5zdG9wKCksYWI9dm9pZCAwfSxyLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe3IudGltZXJzLnB1c2goYSksci5meC5zdGFydCgpfSxyLmZ4LmludGVydmFsPTEzLHIuZnguc3RhcnQ9ZnVuY3Rpb24oKXtiYnx8KGJiPSEwLGViKCkpfSxyLmZ4LnN0b3A9ZnVuY3Rpb24oKXtiYj1udWxsfSxyLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxyLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9ci5meD9yLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYT1kLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYj1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGM9Yi5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTthLnR5cGU9ImNoZWNrYm94IixvLmNoZWNrT249IiIhPT1hLnZhbHVlLG8ub3B0U2VsZWN0ZWQ9Yy5zZWxlY3RlZCxhPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnZhbHVlPSJ0IixhLnR5cGU9InJhZGlvIixvLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGIsbWI9ci5leHByLmF0dHJIYW5kbGU7ci5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVCh0aGlzLHIuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxyLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuZ2V0QXR0cmlidXRlP3IucHJvcChhLGIsYyk6KDE9PT1mJiZyLmlzWE1MRG9jKGEpfHwoZT1yLmF0dHJIb29rc1tiLnRvTG93ZXJDYXNlKCldfHwoci5leHByLm1hdGNoLmJvb2wudGVzdChiKT9sYjp2b2lkIDApKSx2b2lkIDAhPT1jP251bGw9PT1jP3ZvaWQgci5yZW1vdmVBdHRyKGEsYik6ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDooZD1yLmZpbmQuYXR0cihhLGIpLApudWxsPT1kP3ZvaWQgMDpkKSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIW8ucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJkIoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTAsZT1iJiZiLm1hdGNoKEwpO2lmKGUmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZVtkKytdKWEucmVtb3ZlQXR0cmlidXRlKGMpfX0pLGxiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/ci5yZW1vdmVBdHRyKGEsYyk6YS5zZXRBdHRyaWJ1dGUoYyxjKSxjfX0sci5lYWNoKHIuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9bWJbYl18fHIuZmluZC5hdHRyO21iW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGc9Yi50b0xvd2VyQ2FzZSgpO3JldHVybiBkfHwoZj1tYltnXSxtYltnXT1lLGU9bnVsbCE9YyhhLGIsZCk/ZzpudWxsLG1iW2ddPWYpLGV9fSk7dmFyIG5iPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksb2I9L14oPzphfGFyZWEpJC9pO3IuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFQodGhpcyxyLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3IucHJvcEZpeFthXXx8YV19KX19KSxyLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gMT09PWYmJnIuaXNYTUxEb2MoYSl8fChiPXIucHJvcEZpeFtiXXx8YixlPXIucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1yLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOm5iLnRlc3QoYS5ub2RlTmFtZSl8fG9iLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLG8ub3B0U2VsZWN0ZWR8fChyLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksci5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtyLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7ZnVuY3Rpb24gcGIoYSl7dmFyIGI9YS5tYXRjaChMKXx8W107cmV0dXJuIGIuam9pbigiICIpfWZ1bmN0aW9uIHFiKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifXIuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYoci5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7cih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHFiKHRoaXMpKSl9KTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pZC5pbmRleE9mKCIgIitmKyIgIik8MCYmKGQrPWYrIiAiKTtoPXBiKGQpLGUhPT1oJiZjLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaT0wO2lmKHIuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYixxYih0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pd2hpbGUoZC5pbmRleE9mKCIgIitmKyIgIik+LTEpZD1kLnJlcGxhY2UoIiAiK2YrIiAiLCIgIik7aD1wYihkKSxlIT09aCYmYy5zZXRBdHRyaWJ1dGUoImNsYXNzIixoKX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnIuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHFiKHRoaXMpLGIpLGIpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsZCxlLGY7aWYoInN0cmluZyI9PT1jKXtkPTAsZT1yKHRoaXMpLGY9YS5tYXRjaChMKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZSB2b2lkIDAhPT1hJiYiYm9vbGVhbiIhPT1jfHwoYj1xYih0aGlzKSxiJiZXLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixiKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixifHxhPT09ITE/IiI6Vy5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD0wO2I9IiAiK2ErIiAiO3doaWxlKGM9dGhpc1tkKytdKWlmKDE9PT1jLm5vZGVUeXBlJiYoIiAiK3BiKHFiKGMpKSsiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHJiPS9cci9nO3IuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1yLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMscih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOkFycmF5LmlzQXJyYXkoZSkmJihlPXIubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPXIudmFsSG9va3NbdGhpcy50eXBlXXx8ci52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPXIudmFsSG9va3NbZS50eXBlXXx8ci52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UocmIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLHIuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ci5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOnBiKHIudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1hLm9wdGlvbnMsZj1hLnNlbGVjdGVkSW5kZXgsZz0ic2VsZWN0LW9uZSI9PT1hLnR5cGUsaD1nP251bGw6W10saT1nP2YrMTplLmxlbmd0aDtmb3IoZD1mPDA/aTpnP2Y6MDtkPGk7ZCsrKWlmKGM9ZVtkXSwoYy5zZWxlY3RlZHx8ZD09PWYpJiYhYy5kaXNhYmxlZCYmKCFjLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFCKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9cihjKS52YWwoKSxnKXJldHVybiBiO2gucHVzaChiKX1yZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPXIubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWQ9ZVtnXSwoZC5zZWxlY3RlZD1yLmluQXJyYXkoci52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPi0xKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksci5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7ci52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7aWYoQXJyYXkuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPXIuaW5BcnJheShyKGEpLnZhbCgpLGIpPi0xfX0sby5jaGVja09ufHwoci52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBzYj0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87ci5leHRlbmQoci5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihiLGMsZSxmKXt2YXIgZyxoLGksaixrLG0sbixvPVtlfHxkXSxwPWwuY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1sLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWk9ZT1lfHxkLDMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmIXNiLnRlc3QocCtyLmV2ZW50LnRyaWdnZXJlZCkmJihwLmluZGV4T2YoIi4iKT4tMSYmKHE9cC5zcGxpdCgiLiIpLHA9cS5zaGlmdCgpLHEuc29ydCgpKSxrPXAuaW5kZXhPZigiOiIpPDAmJiJvbiIrcCxiPWJbci5leHBhbmRvXT9iOm5ldyByLkV2ZW50KHAsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1mPzI6MyxiLm5hbWVzcGFjZT1xLmpvaW4oIi4iKSxiLnJuYW1lc3BhY2U9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWUpLGM9bnVsbD09Yz9bYl06ci5tYWtlQXJyYXkoYyxbYl0pLG49ci5ldmVudC5zcGVjaWFsW3BdfHx7fSxmfHwhbi50cmlnZ2VyfHxuLnRyaWdnZXIuYXBwbHkoZSxjKSE9PSExKSl7aWYoIWYmJiFuLm5vQnViYmxlJiYhci5pc1dpbmRvdyhlKSl7Zm9yKGo9bi5kZWxlZ2F0ZVR5cGV8fHAsc2IudGVzdChqK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGk9aDtpPT09KGUub3duZXJEb2N1bWVudHx8ZCkmJm8ucHVzaChpLmRlZmF1bHRWaWV3fHxpLnBhcmVudFdpbmRvd3x8YSl9Zz0wO3doaWxlKChoPW9bZysrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWc+MT9qOm4uYmluZFR5cGV8fHAsbT0oVy5nZXQoaCwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZXLmdldChoLCJoYW5kbGUiKSxtJiZtLmFwcGx5KGgsYyksbT1rJiZoW2tdLG0mJm0uYXBwbHkmJlUoaCkmJihiLnJlc3VsdD1tLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gYi50eXBlPXAsZnx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8bi5fZGVmYXVsdCYmbi5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpIT09ITF8fCFVKGUpfHxrJiZyLmlzRnVuY3Rpb24oZVtwXSkmJiFyLmlzV2luZG93KGUpJiYoaT1lW2tdLGkmJihlW2tdPW51bGwpLHIuZXZlbnQudHJpZ2dlcmVkPXAsZVtwXSgpLHIuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxpJiYoZVtrXT1pKSksYi5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ci5leHRlbmQobmV3IHIuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7ci5ldmVudC50cmlnZ2VyKGQsbnVsbCxiKX19KSxyLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtpZihjKXJldHVybiByLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApfX0pLHIuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3IuZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLHIuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxvLmZvY3VzaW49Im9uZm9jdXNpbiJpbiBhLG8uZm9jdXNpbnx8ci5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe3IuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxyLmV2ZW50LmZpeChhKSl9O3IuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1XLmFjY2VzcyhkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLFcuYWNjZXNzKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9Vy5hY2Nlc3MoZCxiKS0xO2U/Vy5hY2Nlc3MoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxXLnJlbW92ZShkLGIpKX19fSk7dmFyIHRiPWEubG9jYXRpb24sdWI9ci5ub3coKSx2Yj0vXD8vO3IucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGM7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7Yz0obmV3IGEuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKX1jYXRjaChkKXtjPXZvaWQgMH1yZXR1cm4gYyYmIWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxyLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKSxjfTt2YXIgd2I9L1xbXF0kLyx4Yj0vXHI/XG4vZyx5Yj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEFiKGEsYixjLGQpe3ZhciBlO2lmKEFycmF5LmlzQXJyYXkoYikpci5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHx3Yi50ZXN0KGEpP2QoYSxlKTpBYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09ci50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpQWIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfXIucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1yLmlzRnVuY3Rpb24oYik/YigpOmI7ZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09Yz8iIjpjKX07aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFyLmlzUGxhaW5PYmplY3QoYSkpci5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlBYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIil9LHIuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gci5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXIucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP3IubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXIodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ6Yi50ZXN0KHRoaXMubm9kZU5hbWUpJiYheWIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IWphLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9cih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOkFycmF5LmlzQXJyYXkoYyk/ci5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHhiLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YiwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBCYj0vJTIwL2csQ2I9LyMuKiQvLERiPS8oWz8mXSlfPVteJl0qLyxFYj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEZiPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLEdiPS9eKD86R0VUfEhFQUQpJC8sSGI9L15cL1wvLyxJYj17fSxKYj17fSxLYj0iKi8iLmNvbmNhdCgiKiIpLExiPWQuY3JlYXRlRWxlbWVudCgiYSIpO0xiLmhyZWY9dGIuaHJlZjtmdW5jdGlvbiBNYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8W107aWYoci5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWRbMF0/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxyLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYihhLGIpe3ZhciBjLGQsZT1yLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZyLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihkKWZvcihlIGluIGgpaWYoaFtlXSYmaFtlXS50ZXN0KGQpKXtpLnVuc2hpZnQoZSk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGUgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tlKyIgIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31pZihmKXJldHVybiBmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl19ZnVuY3Rpb24gUWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1yLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6dGIuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6RmIudGVzdCh0Yi5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpLYix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6ci5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/T2IoT2IoYSxyLmFqYXhTZXR0aW5ncyksYik6T2Ioci5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6TWIoSWIpLGFqYXhUcmFuc3BvcnQ6TWIoSmIpLGFqYXg6ZnVuY3Rpb24oYixjKXsib2JqZWN0Ij09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGM9Y3x8e307dmFyIGUsZixnLGgsaSxqLGssbCxtLG4sbz1yLmFqYXhTZXR1cCh7fSxjKSxwPW8uY29udGV4dHx8byxxPW8uY29udGV4dCYmKHAubm9kZVR5cGV8fHAuanF1ZXJ5KT9yKHApOnIuZXZlbnQscz1yLkRlZmVycmVkKCksdD1yLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1PW8uc3RhdHVzQ29kZXx8e30sdj17fSx3PXt9LHg9ImNhbmNlbGVkIix5PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoayl7aWYoIWgpe2g9e307d2hpbGUoYj1FYi5leGVjKGcpKWhbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9aFthLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGs/ZzpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWsmJihhPXdbYS50b0xvd2VyQ2FzZSgpXT13W2EudG9Mb3dlckNhc2UoKV18fGEsdlthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1rJiYoby5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoayl5LmFsd2F5cyhhW3kuc3RhdHVzXSk7ZWxzZSBmb3IoYiBpbiBhKXVbYl09W3VbYl0sYVtiXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHg7cmV0dXJuIGUmJmUuYWJvcnQoYiksQSgwLGIpLHRoaXN9fTtpZihzLnByb21pc2UoeSksby51cmw9KChifHxvLnVybHx8dGIuaHJlZikrIiIpLnJlcGxhY2UoSGIsdGIucHJvdG9jb2wrIi8vIiksby50eXBlPWMubWV0aG9kfHxjLnR5cGV8fG8ubWV0aG9kfHxvLnR5cGUsby5kYXRhVHlwZXM9KG8uZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8WyIiXSxudWxsPT1vLmNyb3NzRG9tYWluKXtqPWQuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtqLmhyZWY9by51cmwsai5ocmVmPWouaHJlZixvLmNyb3NzRG9tYWluPUxiLnByb3RvY29sKyIvLyIrTGIuaG9zdCE9ai5wcm90b2NvbCsiLy8iK2ouaG9zdH1jYXRjaCh6KXtvLmNyb3NzRG9tYWluPSEwfX1pZihvLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygby5kYXRhJiYoby5kYXRhPXIucGFyYW0oby5kYXRhLG8udHJhZGl0aW9uYWwpKSxOYihJYixvLGMseSksaylyZXR1cm4geTtsPXIuZXZlbnQmJm8uZ2xvYmFsLGwmJjA9PT1yLmFjdGl2ZSsrJiZyLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLG8udHlwZT1vLnR5cGUudG9VcHBlckNhc2UoKSxvLmhhc0NvbnRlbnQ9IUdiLnRlc3Qoby50eXBlKSxmPW8udXJsLnJlcGxhY2UoQ2IsIiIpLG8uaGFzQ29udGVudD9vLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJjA9PT0oby5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoby5kYXRhPW8uZGF0YS5yZXBsYWNlKEJiLCIrIikpOihuPW8udXJsLnNsaWNlKGYubGVuZ3RoKSxvLmRhdGEmJihmKz0odmIudGVzdChmKT8iJiI6Ij8iKStvLmRhdGEsZGVsZXRlIG8uZGF0YSksby5jYWNoZT09PSExJiYoZj1mLnJlcGxhY2UoRGIsIiQxIiksbj0odmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK3ViKysgK24pLG8udXJsPWYrbiksby5pZk1vZGlmaWVkJiYoci5sYXN0TW9kaWZpZWRbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHIubGFzdE1vZGlmaWVkW2ZdKSxyLmV0YWdbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsci5ldGFnW2ZdKSksKG8uZGF0YSYmby5oYXNDb250ZW50JiZvLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsby5jb250ZW50VHlwZSkseS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLG8uZGF0YVR5cGVzWzBdJiZvLmFjY2VwdHNbby5kYXRhVHlwZXNbMF1dP28uYWNjZXB0c1tvLmRhdGFUeXBlc1swXV0rKCIqIiE9PW8uZGF0YVR5cGVzWzBdPyIsICIrS2IrIjsgcT0wLjAxIjoiIik6by5hY2NlcHRzWyIqIl0pO2ZvcihtIGluIG8uaGVhZGVycyl5LnNldFJlcXVlc3RIZWFkZXIobSxvLmhlYWRlcnNbbV0pO2lmKG8uYmVmb3JlU2VuZCYmKG8uYmVmb3JlU2VuZC5jYWxsKHAseSxvKT09PSExfHxrKSlyZXR1cm4geS5hYm9ydCgpO2lmKHg9ImFib3J0Iix0LmFkZChvLmNvbXBsZXRlKSx5LmRvbmUoby5zdWNjZXNzKSx5LmZhaWwoby5lcnJvciksZT1OYihKYixvLGMseSkpe2lmKHkucmVhZHlTdGF0ZT0xLGwmJnEudHJpZ2dlcigiYWpheFNlbmQiLFt5LG9dKSxrKXJldHVybiB5O28uYXN5bmMmJm8udGltZW91dD4wJiYoaT1hLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt5LmFib3J0KCJ0aW1lb3V0Iil9LG8udGltZW91dCkpO3RyeXtrPSExLGUuc2VuZCh2LEEpfWNhdGNoKHope2lmKGspdGhyb3cgejtBKC0xLHopfX1lbHNlIEEoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIEEoYixjLGQsaCl7dmFyIGosbSxuLHYsdyx4PWM7a3x8KGs9ITAsaSYmYS5jbGVhclRpbWVvdXQoaSksZT12b2lkIDAsZz1ofHwiIix5LnJlYWR5U3RhdGU9Yj4wPzQ6MCxqPWI+PTIwMCYmYjwzMDB8fDMwND09PWIsZCYmKHY9UGIobyx5LGQpKSx2PVFiKG8sdix5LGopLGo/KG8uaWZNb2RpZmllZCYmKHc9eS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihyLmxhc3RNb2RpZmllZFtmXT13KSx3PXkuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoci5ldGFnW2ZdPXcpKSwyMDQ9PT1ifHwiSEVBRCI9PT1vLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1iP3g9Im5vdG1vZGlmaWVkIjooeD12LnN0YXRlLG09di5kYXRhLG49di5lcnJvcixqPSFuKSk6KG49eCwhYiYmeHx8KHg9ImVycm9yIixiPDAmJihiPTApKSkseS5zdGF0dXM9Yix5LnN0YXR1c1RleHQ9KGN8fHgpKyIiLGo/cy5yZXNvbHZlV2l0aChwLFttLHgseV0pOnMucmVqZWN0V2l0aChwLFt5LHgsbl0pLHkuc3RhdHVzQ29kZSh1KSx1PXZvaWQgMCxsJiZxLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt5LG8saj9tOm5dKSx0LmZpcmVXaXRoKHAsW3kseF0pLGwmJihxLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3ksb10pLC0tci5hY3RpdmV8fHIuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB5fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gci5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHIuZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLHIuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe3JbYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHIuaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLHIuYWpheChyLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sci5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksci5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gci5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxyLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gdGhpc1swXSYmKHIuaXNGdW5jdGlvbihhKSYmKGE9YS5jYWxsKHRoaXNbMF0pKSxiPXIoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiByLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXIodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9ci5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7cih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxyLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIXIuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LHIuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxyLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319O3ZhciBSYj17MDoyMDAsMTIyMzoyMDR9LFNiPXIuYWpheFNldHRpbmdzLnhocigpO28uY29ycz0hIVNiJiYid2l0aENyZWRlbnRpYWxzImluIFNiLG8uYWpheD1TYj0hIVNiLHIuYWpheFRyYW5zcG9ydChmdW5jdGlvbihiKXt2YXIgYyxkO2lmKG8uY29yc3x8U2ImJiFiLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7dmFyIGcsaD1iLnhocigpO2lmKGgub3BlbihiLnR5cGUsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpLGIueGhyRmllbGRzKWZvcihnIGluIGIueGhyRmllbGRzKWhbZ109Yi54aHJGaWVsZHNbZ107Yi5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYi5taW1lVHlwZSksYi5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihnIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGcsZVtnXSk7Yz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtjJiYoYz1kPWgub25sb2FkPWgub25lcnJvcj1oLm9uYWJvcnQ9aC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09YT9oLmFib3J0KCk6ImVycm9yIj09PWE/Im51bWJlciIhPXR5cGVvZiBoLnN0YXR1cz9mKDAsImVycm9yIik6ZihoLnN0YXR1cyxoLnN0YXR1c1RleHQpOmYoUmJbaC5zdGF0dXNdfHxoLnN0YXR1cyxoLnN0YXR1c1RleHQsInRleHQiIT09KGgucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIGgucmVzcG9uc2VUZXh0P3tiaW5hcnk6aC5yZXNwb25zZX06e3RleHQ6aC5yZXNwb25zZVRleHR9LGguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LGgub25sb2FkPWMoKSxkPWgub25lcnJvcj1jKCJlcnJvciIpLHZvaWQgMCE9PWgub25hYm9ydD9oLm9uYWJvcnQ9ZDpoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1oLnJlYWR5U3RhdGUmJmEuc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmQoKX0pfSxjPWMoImFib3J0Iik7dHJ5e2guc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCl9Y2F0Y2goaSl7aWYoYyl0aHJvdyBpfX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX0pLHIuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXthLmNyb3NzRG9tYWluJiYoYS5jb250ZW50cy5zY3JpcHQ9ITEpfSksci5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ2xvYmFsRXZhbChhKSxhfX19KSxyLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksci5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXtiPXIoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZigiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGQuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgVGI9W10sVWI9Lyg9KVw/KD89JnwkKXxcP1w/LztyLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9VGIucG9wKCl8fHIuZXhwYW5kbysiXyIrdWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLHIuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKFViLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVWIudGVzdChiLmRhdGEpJiYiZGF0YSIpO2lmKGh8fCJqc29ucCI9PT1iLmRhdGFUeXBlc1swXSlyZXR1cm4gZT1iLmpzb25wQ2FsbGJhY2s9ci5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGg/YltoXT1iW2hdLnJlcGxhY2UoVWIsIiQxIitlKTpiLmpzb25wIT09ITEmJihiLnVybCs9KHZiLnRlc3QoYi51cmwpPyImIjoiPyIpK2IuanNvbnArIj0iK2UpLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBnfHxyLmVycm9yKGUrIiB3YXMgbm90IGNhbGxlZCIpLGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIixmPWFbZV0sYVtlXT1mdW5jdGlvbigpe2c9YXJndW1lbnRzfSxkLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWY/cihhKS5yZW1vdmVQcm9wKGUpOmFbZV09ZixiW2VdJiYoYi5qc29ucENhbGxiYWNrPWMuanNvbnBDYWxsYmFjayxUYi5wdXNoKGUpKSxnJiZyLmlzRnVuY3Rpb24oZikmJmYoZ1swXSksZz1mPXZvaWQgMH0pLCJzY3JpcHQifSksby5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1kLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09YS5jaGlsZE5vZGVzLmxlbmd0aH0oKSxyLnBhcnNlSFRNTD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybltdOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSk7dmFyIGUsZixnO3JldHVybiBifHwoby5jcmVhdGVIVE1MRG9jdW1lbnQ/KGI9ZC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLGU9Yi5jcmVhdGVFbGVtZW50KCJiYXNlIiksZS5ocmVmPWQubG9jYXRpb24uaHJlZixiLmhlYWQuYXBwZW5kQ2hpbGQoZSkpOmI9ZCksZj1DLmV4ZWMoYSksZz0hYyYmW10sZj9bYi5jcmVhdGVFbGVtZW50KGZbMV0pXTooZj1xYShbYV0sYixnKSxnJiZnLmxlbmd0aCYmcihnKS5yZW1vdmUoKSxyLm1lcmdlKFtdLGYuY2hpbGROb2RlcykpfSxyLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD4tMSYmKGQ9cGIoYS5zbGljZShoKSksYT1hLnNsaWNlKDAsaCkpLHIuaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmci5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP3IoIjxkaXY+IikuYXBwZW5kKHIucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sci5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtyLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksci5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ3JlcChyLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0sci5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1yLmNzcyhhLCJwb3NpdGlvbiIpLGw9cihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9ci5jc3MoYSwidG9wIiksaT1yLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmKGYraSkuaW5kZXhPZigiYXV0byIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxyLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsci5leHRlbmQoe30saCkpKSxudWxsIT1iLnRvcCYmKG0udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG0ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG0pOmwuY3NzKG0pfX0sci5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3Iub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQsZSxmPXRoaXNbMF07aWYoZilyZXR1cm4gZi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGI9Zi5vd25lckRvY3VtZW50LGM9Yi5kb2N1bWVudEVsZW1lbnQsZT1iLmRlZmF1bHRWaWV3LHt0b3A6ZC50b3ArZS5wYWdlWU9mZnNldC1jLmNsaWVudFRvcCxsZWZ0OmQubGVmdCtlLnBhZ2VYT2Zmc2V0LWMuY2xpZW50TGVmdH0pOnt0b3A6MCxsZWZ0OjB9fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXIuY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLEIoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkPXt0b3A6ZC50b3Arci5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxsZWZ0OmQubGVmdCtyLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKX0pLHt0b3A6Yi50b3AtZC50b3Atci5jc3MoYywibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtZC5sZWZ0LXIuY3NzKGMsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYic3RhdGljIj09PXIuY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8cmF9KX19KSxyLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0icGFnZVlPZmZzZXQiPT09YjtyLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmO3JldHVybiByLmlzV2luZG93KGEpP2Y9YTo5PT09YS5ub2RlVHlwZSYmKGY9YS5kZWZhdWx0Vmlldyksdm9pZCAwPT09ZT9mP2ZbYl06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP2YucGFnZVhPZmZzZXQ6ZSxjP2U6Zi5wYWdlWU9mZnNldCk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgpfX0pLHIuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe3IuY3NzSG9va3NbYl09UGEoby5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7aWYoYylyZXR1cm4gYz1PYShhLGIpLE1hLnRlc3QoYyk/cihhKS5wb3NpdGlvbigpW2JdKyJweCI6Y30pfSksci5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7ci5mbltkXT1mdW5jdGlvbihlLGYpe3ZhciBnPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxoPWN8fChlPT09ITB8fGY9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihiLGMsZSl7dmFyIGY7cmV0dXJuIHIuaXNXaW5kb3coYik/MD09PWQuaW5kZXhPZigib3V0ZXIiKT9iWyJpbm5lciIrYV06Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGY9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGZbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGZbIm9mZnNldCIrYV0sZlsiY2xpZW50IithXSkpOnZvaWQgMD09PWU/ci5jc3MoYixjLGgpOnIuc3R5bGUoYixjLGUsaCl9LGIsZz9lOnZvaWQgMCxnKX19KX0pLHIuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KSxyLmhvbGRSZWFkeT1mdW5jdGlvbihhKXthP3IucmVhZHlXYWl0Kys6ci5yZWFkeSghMCl9LHIuaXNBcnJheT1BcnJheS5pc0FycmF5LHIucGFyc2VKU09OPUpTT04ucGFyc2Usci5ub2RlTmFtZT1CLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIFZiPWEualF1ZXJ5LFdiPWEuJDtyZXR1cm4gci5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1yJiYoYS4kPVdiKSxiJiZhLmpRdWVyeT09PXImJihhLmpRdWVyeT1WYikscn0sYnx8KGEualF1ZXJ5PWEuJD1yKSxyfSk7Cg=="}]},{"name":"秒传链接提取","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["*://pan.baidu.com/disk/home*","*://pan.baidu.com/disk/main*","*://yun.baidu.com/disk/home*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["baidu.com","baidupcs.com","cdn.jsdelivr.net"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null}},"storage":{"ts":1637743635288,"data":{}},"enabled":true,"position":6,"file_url":"https://greasyfork.org/scripts/424574-%E7%A7%92%E4%BC%A0%E9%93%BE%E6%8E%A5%E6%8F%90%E5%8F%96/code/%E7%A7%92%E4%BC%A0%E9%93%BE%E6%8E%A5%E6%8F%90%E5%8F%96.user.js","uuid":"54239eb4-91da-4093-90f8-5ba2914bd5a6","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUg56eS5Lyg6ZO+5o6l5o+Q5Y+WCi8vIEB2ZXJzaW9uIDIuMC4xNAovLyBAYXV0aG9yIG1lbmd6b25lZmlyZQovLyBAZGVzY3JpcHRpb24g55So5LqO5o+Q5Y+W5ZKM55Sf5oiQ55m+5bqm572R55uY56eS5Lyg6ZO+5o6lCi8vIEBob21lcGFnZSBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDI0NTc0Ci8vIEBzdXBwb3J0VVJMIGh0dHBzOi8vZ2l0aHViLmNvbS9tZW5nem9uZWZpcmUvcmFwaWQtdXBsb2FkLXVzZXJzY3JpcHQvaXNzdWVzCi8vIEBtYXRjaCAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBuYW1lOmVuIHJhcGlkdXBsb2FkLXVzZXJzY3JpcHQKLy8gQGxpY2Vuc2UgR1BMdjMKLy8gQGljb24gZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQkJVbEVRVlI0QVpUVEpSQlVVUlRINFR0RHdYdVBkUHJnYmhIWGlrc2YzQ1B1Y1JOU2NIZDNkM2QzdU85YktldTdiNzkrZnVuOFExN0NOSHlNTVVxYWlQRTRmRXlZVmpqR05Lbk53UTRscGdWOGxNYW5FZndmb3NMSEVHUFUxTjNabkF2NHFsVCtOaVE1NnVQV1NqS0JyenRVU25JYUI2NnNZMXZneGd4b01YQjVOYnNDQjlyeGNCNWZOMk01LzE2bkNGeGVTNllUZXpwenNCMVB1L0MyTzcvNzgvOTllWUJZSFhoK2dxZEhPYkdJSzRHSGdldmpWSXQxQWdBbmh2RTRjR2U4ZXVvSGJpemdZdUQyUkdneDhPMFJwd0lQUm1zbUpER3FjckFOZDNwTG8vcVZyMDNoVWxjcGZTd2YwL3ZEM0p3a1BkUEs1L3poa096Ky9mMUZJRHYvUmNuT0FFanl3SC9EaGdBREFBQUFBRWxGVGtTdVFtQ0MKLy8gQG5hbWVzcGFjZSBtb2UuY2FuZ2t1Lm1lbmd6b25lZmlyZQovLyBAaG9tZXBhZ2VVUkwgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQyNDU3NAovLyBAY29udHJpYnV0aW9uVVJMIGh0dHBzOi8vYWZkaWFuLm5ldC9AbWVuZ3pvbmVmaXJlCi8vIEBkZXNjcmlwdGlvbjplbiBpbnB1dCBiZGxpbmsgdG8gZ2V0IGZpbGVzIG9yIGdldCBiZGxpbmsgZm9yIEJhaWR14oSiIFdlYkRpc2suCi8vIEBjb21wYXRpYmxlIGZpcmVmb3ggVmlvbGVudG1vbmtleQovLyBAY29tcGF0aWJsZSBmaXJlZm94IFRhbXBlcm1vbmtleQovLyBAY29tcGF0aWJsZSBjaHJvbWUgVmlvbGVudG1vbmtleQovLyBAY29tcGF0aWJsZSBjaHJvbWUgVGFtcGVybW9ua2V5Ci8vIEBncmFudCBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgR01fZ2V0VmFsdWUKLy8gQGdyYW50IEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCBHTV9zZXRDbGlwYm9hcmQKLy8gQGdyYW50IEdNX2dldFJlc291cmNlVGV4dAovLyBAZ3JhbnQgR01fYWRkU3R5bGUKLy8gQGdyYW50IEdNX3htbGh0dHBSZXF1ZXN0Ci8vIEByZXNvdXJjZSBzd2FsQ3NzIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vc3dlZXRhbGVydDJAMTEvZGlzdC9zd2VldGFsZXJ0Mi5taW4uY3NzCi8vIEByZXF1aXJlIGh0dHBzOi8vY2RuLnN0YXRpY2ZpbGUub3JnL2pxdWVyeS8zLjYuMC9qcXVlcnkubWluLmpzCi8vIEByZXF1aXJlIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vc3dlZXRhbGVydDJAMTEvZGlzdC9zd2VldGFsZXJ0Mi5taW4uanMKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG4uc3RhdGljZmlsZS5vcmcvc3BhcmstbWQ1LzMuMC4wL3NwYXJrLW1kNS5taW4uanMKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9qcy1iYXNlNjQKLy8gQHJ1bi1hdCBkb2N1bWVudC1zdGFydAovLyBAY29ubmVjdCBiYWlkdS5jb20KLy8gQGNvbm5lY3QgYmFpZHVwY3MuY29tCi8vIEBjb25uZWN0IGNkbi5qc2RlbGl2ci5uZXQKLy8gPT0vVXNlclNjcmlwdD09CgooKCkgPT4gewogICAgdmFyIF9fd2VicGFja19tb2R1bGVzX18gPSB7CiAgICAgICAgNDE5OiBtb2R1bGUgPT4gewogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9ICcvKuaMiemSruagt+W8jyovXHJcbi5temZfYnRuIHtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgZm9udC1zaXplOiAwLjg1ZW07XHJcbiAgY29sb3I6ICMwOWFhZmY7XHJcbiAgYm9yZGVyOiAycHggc29saWQgI2MzZWFmZjtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgbWFyZ2luOiAwIDVweDtcclxuICBwYWRkaW5nOiAxMHB4O1xyXG4gIHBhZGRpbmctdG9wOiA1cHg7XHJcbiAgcGFkZGluZy1ib3R0b206IDVweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi8q6LaF6ZO+5o6l5qC35byPKi9cclxuLm16Zl9saW5rIHtcclxuICBmb250LWZhbWlseTogaW5oZXJpdDtcclxuICBjb2xvcjogIzA5YWFmZjtcclxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbn1cclxuXHJcbi8q6KGM5qC35byPKi9cclxuLm16Zl90ZXh0IHtcclxuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6ICJsbnVtIjtcclxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcclxuICBmb250LWZhbWlseTogaW5oZXJpdDtcclxuICBjb2xvcjogIzU0NTQ1NDtcclxuICBmb250LXdlaWdodDogNDAwO1xyXG4gIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XHJcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcclxuICBtYXJnaW46IDA7XHJcbiAgcGFkZGluZzogMDtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDM0cHg7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcbic7CiAgICAgICAgfSwKICAgICAgICA3MjI6IG1vZHVsZSA9PiB7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0sXHJcbmlucHV0W3R5cGU9InJhZGlvIl0ge1xyXG4gIC0tYWN0aXZlOiAjMjc1ZWZlO1xyXG4gIC0tYWN0aXZlLWlubmVyOiAjZmZmO1xyXG4gIC0tZm9jdXM6IDJweCByZ2JhKDM5LCA5NCwgMjU0LCAwLjMpO1xyXG4gIC0tYm9yZGVyOiAjYmJjMWUxO1xyXG4gIC0tYm9yZGVyLWhvdmVyOiAjMjc1ZWZlO1xyXG4gIC0tYmFja2dyb3VuZDogI2ZmZjtcclxuICAtLWRpc2FibGVkOiAjZjZmOGZmO1xyXG4gIC0tZGlzYWJsZWQtaW5uZXI6ICNlMWU2Zjk7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcclxuICBoZWlnaHQ6IDIxcHg7XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYywgdmFyKC0tYm9yZGVyKSk7XHJcbiAgYmFja2dyb3VuZDogdmFyKC0tYiwgdmFyKC0tYmFja2dyb3VuZCkpO1xyXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzLCBib3JkZXItY29sb3IgMC4zcywgYm94LXNoYWRvdyAwLjJzO1xyXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4zcywgYm9yZGVyLWNvbG9yIDAuM3MsIGJveC1zaGFkb3cgMC4ycztcclxufVxyXG5pbnB1dFt0eXBlPSJjaGVja2JveCJdOmFmdGVyLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdOmFmdGVyIHtcclxuICBjb250ZW50OiAiIjtcclxuICBkaXNwbGF5OiBibG9jaztcclxuICBsZWZ0OiAwO1xyXG4gIHRvcDogMDtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWQtbywgMC4ycyksXHJcbiAgICAtd2Via2l0LXRyYW5zZm9ybSB2YXIoLS1kLXQsIDAuM3MpIHZhcigtLWQtdC1lLCBlYXNlKTtcclxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWQtbywgMC4ycyksXHJcbiAgICAtd2Via2l0LXRyYW5zZm9ybSB2YXIoLS1kLXQsIDAuM3MpIHZhcigtLWQtdC1lLCBlYXNlKTtcclxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tZC10LCAwLjNzKSB2YXIoLS1kLXQtZSwgZWFzZSksXHJcbiAgICBvcGFjaXR5IHZhcigtLWQtbywgMC4ycyk7XHJcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWQtdCwgMC4zcykgdmFyKC0tZC10LWUsIGVhc2UpLFxyXG4gICAgb3BhY2l0eSB2YXIoLS1kLW8sIDAuMnMpLFxyXG4gICAgLXdlYmtpdC10cmFuc2Zvcm0gdmFyKC0tZC10LCAwLjNzKSB2YXIoLS1kLXQtZSwgZWFzZSk7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdOmNoZWNrZWQge1xyXG4gIC0tYjogdmFyKC0tYWN0aXZlKTtcclxuICAtLWJjOiB2YXIoLS1hY3RpdmUpO1xyXG4gIC0tZC1vOiAwLjNzO1xyXG4gIC0tZC10OiAwLjZzO1xyXG4gIC0tZC10LWU6IGN1YmljLWJlemllcigwLjIsIDAuODUsIDAuMzIsIDEuMik7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpkaXNhYmxlZCxcclxuaW5wdXRbdHlwZT0icmFkaW8iXTpkaXNhYmxlZCB7XHJcbiAgLS1iOiB2YXIoLS1kaXNhYmxlZCk7XHJcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICBvcGFjaXR5OiAwLjk7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpkaXNhYmxlZDpjaGVja2VkLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdOmRpc2FibGVkOmNoZWNrZWQge1xyXG4gIC0tYjogdmFyKC0tZGlzYWJsZWQtaW5uZXIpO1xyXG4gIC0tYmM6IHZhcigtLWJvcmRlcik7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpkaXNhYmxlZCArIGxhYmVsLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdOmRpc2FibGVkICsgbGFiZWwge1xyXG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpob3Zlcjpub3QoOmNoZWNrZWQpOm5vdCg6ZGlzYWJsZWQpLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdOmhvdmVyOm5vdCg6Y2hlY2tlZCk6bm90KDpkaXNhYmxlZCkge1xyXG4gIC0tYmM6IHZhcigtLWJvcmRlci1ob3Zlcik7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpmb2N1cyxcclxuaW5wdXRbdHlwZT0icmFkaW8iXTpmb2N1cyB7XHJcbiAgYm94LXNoYWRvdzogMCAwIDAgdmFyKC0tZm9jdXMpO1xyXG59XHJcbmlucHV0W3R5cGU9ImNoZWNrYm94Il06bm90KC5zd2l0Y2gpLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdOm5vdCguc3dpdGNoKSB7XHJcbiAgd2lkdGg6IDIxcHg7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpub3QoLnN3aXRjaCk6YWZ0ZXIsXHJcbmlucHV0W3R5cGU9InJhZGlvIl06bm90KC5zd2l0Y2gpOmFmdGVyIHtcclxuICBvcGFjaXR5OiB2YXIoLS1vLCAwKTtcclxufVxyXG5pbnB1dFt0eXBlPSJjaGVja2JveCJdOm5vdCguc3dpdGNoKTpjaGVja2VkLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdOm5vdCguc3dpdGNoKTpjaGVja2VkIHtcclxuICAtLW86IDE7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXSArIGxhYmVsLFxyXG5pbnB1dFt0eXBlPSJyYWRpbyJdICsgbGFiZWwge1xyXG4gIGZvbnQtc2l6ZTogMThweDtcclxuICBsaW5lLWhlaWdodDogMjFweDtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgbWFyZ2luLWxlZnQ6IDRweDtcclxufVxyXG5cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXTpub3QoLnN3aXRjaCkge1xyXG4gIGJvcmRlci1yYWRpdXM6IDdweDtcclxufVxyXG5pbnB1dFt0eXBlPSJjaGVja2JveCJdOm5vdCguc3dpdGNoKTphZnRlciB7XHJcbiAgd2lkdGg6IDVweDtcclxuICBoZWlnaHQ6IDlweDtcclxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1hY3RpdmUtaW5uZXIpO1xyXG4gIGJvcmRlci10b3A6IDA7XHJcbiAgYm9yZGVyLWxlZnQ6IDA7XHJcbiAgbGVmdDogN3B4O1xyXG4gIHRvcDogNHB4O1xyXG4gIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUodmFyKC0tciwgMjBkZWcpKTtcclxuICB0cmFuc2Zvcm06IHJvdGF0ZSh2YXIoLS1yLCAyMGRlZykpO1xyXG59XHJcbmlucHV0W3R5cGU9ImNoZWNrYm94Il06bm90KC5zd2l0Y2gpOmNoZWNrZWQge1xyXG4gIC0tcjogNDNkZWc7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXS5zd2l0Y2gge1xyXG4gIHdpZHRoOiAzOHB4O1xyXG4gIGJvcmRlci1yYWRpdXM6IDExcHg7XHJcbn1cclxuaW5wdXRbdHlwZT0iY2hlY2tib3giXS5zd2l0Y2g6YWZ0ZXIge1xyXG4gIGxlZnQ6IDJweDtcclxuICB0b3A6IDJweDtcclxuICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgd2lkdGg6IDE1cHg7XHJcbiAgaGVpZ2h0OiAxNXB4O1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLWFiLCB2YXIoLS1ib3JkZXIpKTtcclxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS14LCAwKSk7XHJcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLXgsIDApKTtcclxufVxyXG5pbnB1dFt0eXBlPSJjaGVja2JveCJdLnN3aXRjaDpjaGVja2VkIHtcclxuICAtLWFiOiB2YXIoLS1hY3RpdmUtaW5uZXIpO1xyXG4gIC0teDogMTdweDtcclxufVxyXG5pbnB1dFt0eXBlPSJjaGVja2JveCJdLnN3aXRjaDpkaXNhYmxlZDpub3QoOmNoZWNrZWQpOmFmdGVyIHtcclxuICBvcGFjaXR5OiAwLjY7XHJcbn1cclxuJzsKICAgICAgICB9LAogICAgICAgIDQ1MTogbW9kdWxlID0+IHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSAnPGRpdiBjbGFzcz0icGFuZWwtYm9keSIgc3R5bGU9ImhlaWdodDogMjUwcHg7IG92ZXJmbG93LXk6IHNjcm9sbCI+XHJcbiAgPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggIzAwMDAwMDsgd2lkdGg6IDEwMCU7IG1hcmdpbjogMCBhdXRvIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICA8cD7ov5HmnJ/pgJrnn6U6PC9wPlxyXG5cclxuICAgICAgPHA+XHJcbiAgICAgICAg5bey5bCG5a6M5pW055qE56eS5Lyg6L2s5a2Y5Yqf6IO956e75qSN5YiwXHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIGhyZWY9Imh0dHBzOi8vcmFwaWRhY2cuZ21nYXJkLm1vZS8iXHJcbiAgICAgICAgICBjbGFzcz0ibXpmX2xpbmsiXHJcbiAgICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiXHJcbiAgICAgICAgICB0YXJnZXQ9Il9ibGFuayJcclxuICAgICAgICAgID7np5LkvKDnvZHpobXniYjlt6Xlhbc8L2FcclxuICAgICAgICA+XHJcbiAgICAgIDwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgICog5peg6ZyA5a6J6KOF5o+S5Lu2LCA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+5pSv5oyB5omA5pyJ5bmz5Y+wPC9zcGFuPiwg5by654OI5o6o6I2QXHJcbiAgICAgIDwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOW3peWFt+a6kOeggeaJmOeuoeWcqFxyXG4gICAgICAgIDxpbWdcclxuICAgICAgICAgIHNyYz0iaHR0cHM6Ly9naXRodWIuZ2l0aHViYXNzZXRzLmNvbS9mYXZpY29ucy9mYXZpY29uLnBuZyJcclxuICAgICAgICAgIHdpZHRoPSIxNiJcclxuICAgICAgICAvPjxhXHJcbiAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWVuZ3pvbmVmaXJlL2JhaWR1cGFuLXJhcGlkdXBsb2FkIlxyXG4gICAgICAgICAgY2xhc3M9Im16Zl9saW5rIlxyXG4gICAgICAgICAgcmVsPSJub29wZW5lciBub3JlZmVycmVyIlxyXG4gICAgICAgICAgdGFyZ2V0PSJfYmxhbmsiXHJcbiAgICAgICAgICA+R2l0aHViPC9hXHJcbiAgICAgICAgPiwg5qyi6L+O5pCt5bu65YiG5rWBXHJcbiAgICAgIDwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOiLpeWWnOasouivpeiEmuacrOWPr+WJjeW+gFxyXG4gICAgICAgIDxhXHJcbiAgICAgICAgICBocmVmPSJodHRwczovL2FmZGlhbi5uZXQvQG1lbmd6b25lZmlyZSJcclxuICAgICAgICAgIGNsYXNzPSJtemZfbGluayJcclxuICAgICAgICAgIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciJcclxuICAgICAgICAgIHRhcmdldD0iX2JsYW5rIlxyXG4gICAgICAgICAgPui1nuWKqemhtTwvYVxyXG4gICAgICAgID5cclxuICAgICAgICDmlK/mjIHkvZzogIVcclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPHA+XHJcbiAgICAgICAg6Iul5Ye6546w5Lu75L2V6Zeu6aKY6K+35YmN5b6AXHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MjQ1NzQiXHJcbiAgICAgICAgICBjbGFzcz0ibXpmX2xpbmsiXHJcbiAgICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiXHJcbiAgICAgICAgICB0YXJnZXQ9Il9ibGFuayJcclxuICAgICAgICAgID7ohJrmnKzkuLvpobU8L2FcclxuICAgICAgICA+XHJcbiAgICAgICAg5Y+N6aaIXHJcbiAgICAgIDwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOiEmuacrOa6kOeggeaJmOeuoeWcqFxyXG4gICAgICAgIDxpbWdcclxuICAgICAgICAgIHNyYz0iaHR0cHM6Ly9naXRodWIuZ2l0aHViYXNzZXRzLmNvbS9mYXZpY29ucy9mYXZpY29uLnBuZyJcclxuICAgICAgICAgIHdpZHRoPSIxNiJcclxuICAgICAgICAvPjxhXHJcbiAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWVuZ3pvbmVmaXJlL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0IlxyXG4gICAgICAgICAgY2xhc3M9Im16Zl9saW5rIlxyXG4gICAgICAgICAgcmVsPSJub29wZW5lciBub3JlZmVycmVyIlxyXG4gICAgICAgICAgdGFyZ2V0PSJfYmxhbmsiXHJcbiAgICAgICAgICA+R2l0aHViPC9hXHJcbiAgICAgICAgPiwg6Iul5Zac5qyi5Y+v5Lul57uZ5LiqU3RhclxyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD4yLjAuMTIg5pu05paw5YaF5a65KDIxLjExLjkpOjwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOS/ruWkjeaJgOacieWkseaViOeahOaWh+aho+mTvuaOpSwg6KeBXHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIGhyZWY9Imh0dHBzOi8vbWVuZ3pvbmVmaXJlLmNvZGUubWlzYWthbmV0LmNuL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvYyJcclxuICAgICAgICAgIGNsYXNzPSJtemZfbGluayJcclxuICAgICAgICAgIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciJcclxuICAgICAgICAgIHRhcmdldD0iX2JsYW5rIlxyXG4gICAgICAgICAgPuaWh+aho+ebruW9lTwvYVxyXG4gICAgICAgID5cclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPHA+5L+u5aSN5Zyo55uu5qCH55uu5b2V5LiL54K55Ye7IuaJk+W8gOebruW9lSLmjInpkq4sIOaWh+S7tuWIl+ihqOS4jeWIt+aWsOeahOmXrumimDwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjIuMC4xMSDmm7TmlrDlhoXlrrkoMjEuMTAuMTgpOjwvcD5cclxuXHJcbiAgICAgIDxwPuenu+mZpOS4gOWkhOWPr+iDveWvvOiHtOeUn+aIkOmUmeivr+enkuS8oOeahOS7o+eggTwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjIuMC4xMCDmm7TmlrDlhoXlrrkoMjEuMTAuMSk6PC9wPlxyXG5cclxuICAgICAgPHA+5L+u5aSN5aSx5pWI55qE5pWZ56iL5paH5qGj5Zyw5Z2APC9wPlxyXG5cclxuICAgICAgPHA+KumDqOWIhuWcsOWMuuaJk+W8gOaYvuekuuefs+WiqOaWh+aho+ato+WcqOWNh+e6pzwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjIuMC41IOabtOaWsOWGheWuuSgyMS45LjEpOjwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOi9rOWtmOi3r+W+hOeVmeepuueOsOaUueS4uum7mOiupOi9rOWtmOWIsCA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+5b2T5YmN55uu5b2VPC9zcGFuPlxyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD48c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+Mi4wLjA8L3NwYW4+IOabtOaWsOWGheWuuSgyMS44LjMwKTo8L3A+XHJcblxyXG4gICAgICA8cD4xLuenu+mZpOa4uOS+oOenkuS8oOagvOW8j+eahOaUr+aMgTwvcD5cclxuXHJcbiAgICAgIDxwPjIu6YeN5p6E5Luj56CBLCDlhajpnaLkvJjljJYsIOaPkOWNh+S9v+eUqOS9k+mqjDwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjEuOC41IOabtOaWsOWGheWuuSgyMS43LjMwKTo8L3A+XHJcblxyXG4gICAgICA8cD5cclxuICAgICAgICDkv67lpI3kuobpg6jliIbovazlrZjmj5DnpLogIjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj7ovazlrZjlpLHotKUo5bCd6K+VLi4uKSgjMik8L3NwYW5cclxuICAgICAgICA+IiDnmoTpl67pophcclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS44LjQg5pu05paw5YaF5a65KDIxLjcuMTgpOjwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOS/ruWkjeS6humDqOWIhueUn+aIkOaPkOekuiAiPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPm1kNeiOt+WPluWksei0pTwvc3Bhbj4iIOeahOmXrumimFxyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD4xLjguMSDmm7TmlrDlhoXlrrkoMjEuNy42KTo8L3A+XHJcblxyXG4gICAgICA8cD7mlK/mjIHovazlrZjkuI7nlJ/miJAgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPjIwR+S7peS4ijwvc3Bhbj4g5paH5Lu255qE56eS5LygPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS43Ljkg5pu05paw5YaF5a65KDIxLjYuMjgpOjwvcD5cclxuXHJcbiAgICAgIDxwPjEu5aSn5bmF5o+Q5Y2H6Z2e5Lya5ZGY6LSm5Y+355Sf5oiQ56eS5Lyg55qE6YCf5bqmPC9wPlxyXG5cclxuICAgICAgPHA+XHJcbiAgICAgICAgMi7kv67lpI3nlJ/miJA0R+S7peS4iuaWh+S7tuaPkOekuiI8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+5pyN5Yqh5Zmo6ZSZ6K+vKCM1MDApPC9zcGFuXHJcbiAgICAgICAgPiLnmoTpl67pophcclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS43Ljgg5pu05paw5YaF5a65KDIxLjYuMjUpOjwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOS/ruWkjeS6hue7neWkp+mDqOWIhui9rOWtmOaPkOekuiAiPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiXHJcbiAgICAgICAgICA+5paH5Lu25LiN5a2Y5ZyoKOenkuS8oOacqueUn+aViCkoIzQwNCk8L3NwYW5cclxuICAgICAgICA+IiDnmoTpl67pophcclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS43LjMg5pu05paw5YaF5a65KDIxLjYuMjMpOjwvcD5cclxuXHJcbiAgICAgIDxwPuWNh+e6p+agt+W8jybkuLvpopgsIOaPkOWNh+inguaEnywg5L+u5aSN5LqG6K6+572u5YaF55qE5Li76aKY6YCC6YWNPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS42Ljgg5pu05paw5YaF5a65KDIxLjYuMTgpPC9wPlxyXG5cclxuICAgICAgPHA+XHJcbiAgICAgICAg56e76ZmkIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj7kv67lpI3kuIvovb08L3NwYW4+IOWKn+iDvSjlt7LlnKgyMeW5tDTmnIjkuIrml6zlpLHmlYgpLFxyXG4gICAgICAgIOWQjue7reS4jeS8muWGjeiAg+iZkeS/ruWkjeivpeWKn+iDvVxyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD4xLjYuNyDmm7TmlrDlhoXlrrkoMjEuMy4zMCk8L3A+XHJcblxyXG4gICAgICA8cD7kv67lpI3pg6jliIbnp5LkvKDovazlrZjml7bmj5DnpLogIuaWh+S7tuS4jeWtmOWcqCjnp5LkvKDml6DmlYgpIjwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjEuNi4xIOabtOaWsOWGheWuuSgyMS4zLjI5KTwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOaWsOWiniA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+55u05o6l5L+u5aSN5LiL6L29PC9zcGFuPiDnmoTlip/og70sXHJcbiAgICAgICAg6YCJ5Lit572R55uY5YaF5paH5Lu2LCDlho3ngrnlh7vkuIrmlrlcclxuICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+5L+u5aSN5LiL6L29PC9zcGFuPiDmjInpkq7ljbPlj6/nlJ/miJDlj6/mraPluLjkuIvovb3nmoTmlrDmlofku7ZcclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPGltZ1xyXG4gICAgICAgIHNyYz0iaHR0cHM6Ly9waWMucm1iLmJkc3RhdGljLmNvbS9iamgvNWUwNWY3YzFmNzcyNDUxYjhlZmNlOTM4MjgwYmNhZWUucG5nIlxyXG4gICAgICAvPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS41Ljcg5pu05paw5YaF5a65KDIxLjMuOSk8L3A+XHJcblxyXG4gICAgICA8cD5cclxuICAgICAgICDkv67lpI3pg6jliIbmlofku7bovazlrZjlkI4gPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPuaXoOazleS4i+i9vTwvc3Bhbj4g55qE6Zeu6aKYLFxyXG4gICAgICAgIOWPr+WwneivlSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+6YeN5paw6L2s5a2YPC9zcGFuPiDkuYvliY3ml6Dms5XkuIvovb3mlofku7YuXHJcbiAgICAgICAg5LiU6L2s5a2Y5paw5aKe5LqGIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj7kv67lpI3kuIvovb08L3NwYW4+IOWKn+iDvVxyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD4xLjUuNCDmm7TmlrDlhoXlrrkoMjEuMi4xMSk8L3A+XHJcblxyXG4gICAgICA8cD5cclxuICAgICAgICDpnaLlkJHliIbkuqvogIXnmoRcclxuICAgICAgICA8YVxyXG4gICAgICAgICAgaHJlZj0iaHR0cHM6Ly9tZW5nem9uZWZpcmUuY29kZS5taXNha2FuZXQuY24vcmFwaWQtdXBsb2FkLXVzZXJzY3JpcHQtZG9jL2dlbmVyYXRlLWJkY29kZS8iXHJcbiAgICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiXHJcbiAgICAgICAgICB0YXJnZXQ9Il9ibGFuayJcclxuICAgICAgICAgID7liIbkuqvmlZnnqIs8L2FcclxuICAgICAgICA+XHJcbiAgICAgICAg55qE6Ziy5ZKM6LCQ5pa55rOV5pu05pawOlxyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD5cclxuICAgICAgICDnu4/mtYvor5UsIOWOn+aVmeeoi+eahCAi5Zu65a6e5Y6L57ypK+WKoOWvhuaWh+S7tuWQjSJcclxuICAgICAgICDlt7Lml6Dms5Xlho3pmLLlkozosJAo5Zyo5bqm55uY56e75Yqo56uv5L6d5pen5Y+v5Lul5Zyo57q/6Kej5Y6LKSxcclxuICAgICAgICDnm67liY3mnInmlYjnmoTpmLLlkozosJDmlrnms5Xor7flj4LogIPmlZnnqIvlhoXnmoRcclxuICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IuWPjOWxguWOi+e8qSI8L3NwYW4+XHJcbiAgICAgIDwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjEuNC4zIOabtOaWsOWGheWuuSgyMS4yLjYpOjwvcD5cclxuXHJcbiAgICAgIDxwPuS/ruWkjeS6hueUn+aIkOenkuS8oOaXtiwg56eS5Lyg5pyJ5pWILCDku43mj5DnpLoibWQ16I635Y+W5aSx6LSlKCM5OTYpIueahOmXrumimDwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjEuNC45IOabtOaWsOWGheWuuSgyMS4xLjI4KTo8L3A+XHJcblxyXG4gICAgICA8cD4xLiDph43mlrDlhbzlrrnkuobmmrTlipvnjLTmj5Lku7YsIOaEn+iwolRyZW5keW1lbuaPkOS+m+eahOS7o+eggTwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIDIuIOaWsOWinuabtOaNouS4u+mimOeahOWKn+iDvSwg5Zyo56eS5Lyg6L6T5YWl5qGG5Lit6L6T5YWlc2V0dGluZ+i/m+WFpeiuvue9rumhtSxcclxuICAgICAgICDmm7TmjaLkuLrlhbbku5bkuLvpopgsIOWNs+WPr+mBv+WFjeW8ueeql+aXtueahOiDjOaZr+WPmOaal1xyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD4zLiDkv67mlLnkuobpg6jliIbku6PnoIHpgLvovpEsIOenkuS8oOaMiemSruS4jeS8muWGjeWHuueOsOWcqOacgOW3pui+ueS6hjwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjEuNC42IOabtOaWsOWGheWuuSgyMS4xLjE0KTo8L3A+XHJcblxyXG4gICAgICA8cD7mnKzmrKHmm7TmlrDpkojlr7nnlJ/miJDlip/og73lgZrkuobkvJjljJY6PC9wPlxyXG5cclxuICAgICAgPHA+XHJcbiAgICAgICAgMS4g5L2/55So6LaF5Lya6LSm5Y+36L+b6KGMMTDkuKrku6XkuIrnmoTmibnph4/np5LkvKDnlJ/miJDml7YsIOS8muW8ueeql+aPkOekuuiuvue9rueUn+aIkOmXtOmalCxcclxuICAgICAgICDpmLLmraLnlJ/miJDov4flv6vlr7zoh7TmjqXlj6PooqvpmZDliLYoIzQwMylcclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPHA+XHJcbiAgICAgICAgMi4g5Li656eS5Lyg5YiG5Lqr6ICF5o+Q5L6b5LqG5LiA5Lu9PGFcclxuICAgICAgICAgIGhyZWY9Imh0dHBzOi8vbWVuZ3pvbmVmaXJlLmNvZGUubWlzYWthbmV0LmNuL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvYy9nZW5lcmF0ZS1iZGNvZGUvIlxyXG4gICAgICAgICAgcmVsPSJub29wZW5lciBub3JlZmVycmVyIlxyXG4gICAgICAgICAgdGFyZ2V0PSJfYmxhbmsiXHJcbiAgICAgICAgICA+5YiG5Lqr5pWZ56iLPC9hXHJcbiAgICAgICAgPueUqOS6juWPguiAg1xyXG4gICAgICA8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD4xLjQuNSDmm7TmlrDlhoXlrrkoMjEuMS4xMik6PC9wPlxyXG5cclxuICAgICAgPHA+5L+u5aSN5LqGMS40LjDlkI7lj6/og73lh7rnjrDnmoTnp5LkvKDmjInpkq7ml6DmlYjjgIHmmL7npLrlpJrkuKrnp5LkvKDmjInpkq7nmoTpl67popg8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD4xLjMuNyDmm7TmlrDlhoXlrrkoMjEuMS4zKTo8L3A+XHJcblxyXG4gICAgICA8cD7kv67lpI3kuobkvJrlkZjotKblj7fnlJ/miJA1ME3ku6XkuIvmlofku7bml7bmj5DnpLogIm1kNeiOt+WPluWksei0pSIg55qE6Zeu6aKYPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS4zLjMg5pu05paw5YaF5a65KDIwLjEyLjEpOjwvcD5cclxuXHJcbiAgICAgIDxwPlxyXG4gICAgICAgIOenkuS8oOeUn+aIkOWujOaIkOWQjueCueWHu+WkjeWItuaMiemSruS5i+WJjemDveWPr+S7pee7p+e7reS7u+WKoSzpmLLmraLor6/mk43kvZzlhbPpl63pobXpnaLlr7zoh7TnlJ/miJDnu5PmnpzkuKLlpLFcclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPHA+5L+u5pS55Luj56CB5omn6KGM6aG65bqP6Ziy5q2i56eS5Lyg5oyJ6ZKu5Ye6546w5Zyo5pyA5bem56uvPC9wPlxyXG5cclxuICAgICAgPHA+5L+u5aSN5LqG6Leo5Z+f5o+Q56S65Lit5aSx5pWI55qE6K+05piO5Zu+54mHPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS4yLjkg5pu05paw5YaF5a65KDIwLjExLjExKTo8L3A+XHJcblxyXG4gICAgICA8cD7nlJ/miJDnp5LkvKDnmoTlvLnnqpfmt7vliqDkuoblhbPpl63mjInpkq48L3A+XHJcblxyXG4gICAgICA8cD7liKDpmaTkuoblhajpg6jnlJ/miJDlpLHotKXml7bnmoTlpI3liLblkozmtYvor5XmjInpkq48L3A+XHJcblxyXG4gICAgICA8cD7np5LkvKDnlJ/miJDlkI7liqDkuobkuIDkuKrlr7zlh7rmlofku7bot6/lvoTnmoTpgInpobko6buY6K6k5LiN5a+85Ye6KTwvcD5cclxuXHJcbiAgICAgIDxwPuWcqOi+k+WFpeS/neWtmOi3r+W+hOeahOW8ueeql+a3u+WKoOS6huagoemqjCwg6Ziy5q2i6L6T5YWl6ZSZ6K+v6Lev5b6EPC9wPlxyXG5cclxuICAgICAgPHA+PGJyIC8+PC9wPlxyXG5cclxuICAgICAgPHA+MS4yLjUg5pu05paw5YaF5a65KDIwLjExLjQpOjwvcD5cclxuXHJcbiAgICAgIDxwPuS8mOWMluaMiemSruagt+W8jywg5re75Yqg5LqGbWQ16I635Y+W5aSx6LSl55qE5oql6ZSZPC9wPlxyXG5cclxuICAgICAgPHA+5L+u5aSN5LuOcGFuLmJhaWR1LmNvbei/m+WFpeWQjuS4jeaYvuekuueUn+aIkOaMiemSrueahOmXrumimDwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPjEuMi40IOabtOaWsOWGheWuuSgyMC4xMS4yKTo8L3A+XHJcblxyXG4gICAgICA8cD7mlrDlop7nlJ/miJDnp5LkvKA6PC9wPlxyXG5cclxuICAgICAgPHA+6YCJ5oup5paH5Lu25oiW5paH5Lu25aS55ZCO54K55Ye7ICLnlJ/miJDnp5LkvKAiIOWNs+WPr+W8gOWni+eUn+aIkDwvcD5cclxuXHJcbiAgICAgIDxwPjxiciAvPjwvcD5cclxuXHJcbiAgICAgIDxwPue7p+e7reacquWujOaIkOS7u+WKoTo8L3A+XHJcblxyXG4gICAgICA8cD7oi6XnlJ/miJDnp5LkvKDmnJ/pl7TlhbPpl63kuobnvZHpobUsIOWGjeasoeeCueWHuyAi55Sf5oiQ56eS5LygIiDljbPlj6/nu6fnu63ku7vliqE8L3A+XHJcblxyXG4gICAgICA8cD48YnIgLz48L3A+XHJcblxyXG4gICAgICA8cD7mtYvor5Xnp5LkvKDlip/og706PC9wPlxyXG5cclxuICAgICAgPHA+XHJcbiAgICAgICAg55Sf5oiQ5a6M5oiQ5ZCOLCDngrnlh7si5rWL6K+VIuaMiemSriwg5Lya6Ieq5Yqo6L2s5a2Y5bm26KaG55uW5paH5Lu2KOaWh+S7tuWGheWuueS4jeWPmCksXHJcbiAgICAgICAg5Lul5qOA5rWL56eS5Lyg5pyJ5pWI5oCnLCDku6Xlj4rkv67lpI1tZDXplJnor6/pmLLmraLnp5LkvKDlpLHmlYhcclxuICAgICAgPC9wPlxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuJzsKICAgICAgICB9CiAgICB9OwogICAgdmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9OwogICAgZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgewogICAgICAgIHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdOwogICAgICAgIGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7CiAgICAgICAgfQogICAgICAgIHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0gewogICAgICAgICAgICBleHBvcnRzOiB7fQogICAgICAgIH07CiAgICAgICAgX193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7CiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgfQogICAgKCgpID0+IHsKICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBtb2R1bGUgPT4gewogICAgICAgICAgICB2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8gKCkgPT4gbW9kdWxlWyJkZWZhdWx0Il0gOiAoKSA9PiBtb2R1bGU7CiAgICAgICAgICAgIF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsKICAgICAgICAgICAgICAgIGE6IGdldHRlcgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGdldHRlcjsKICAgICAgICB9OwogICAgfSkoKTsKICAgICgoKSA9PiB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHsKICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHsKICAgICAgICAgICAgICAgIGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZGVmaW5pdGlvbltrZXldCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoKTsKICAgICgoKSA9PiB7CiAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7CiAgICB9KSgpOwogICAgdmFyIF9fd2VicGFja19leHBvcnRzX18gPSB7fTsKICAgICgoKSA9PiB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIHZhciB1cGRhdGVJbmZvVmVyID0gIjIuMC4xMiI7CiAgICAgICAgdmFyIHN3YWxDc3NWZXIgPSAiMS43LjQiOwogICAgICAgIHZhciBkb25hdGVWZXIgPSAiMi4wLjAiOwogICAgICAgIHZhciBmZWVkYmFja1ZlciA9ICIyLjAuMCI7CiAgICAgICAgdmFyIGxvY1VybCA9IGxvY2F0aW9uLmhyZWY7CiAgICAgICAgdmFyIGJhaWR1TmV3UGFnZSA9ICJwYW4uYmFpZHUuY29tL2Rpc2svbWFpbiI7CiAgICAgICAgdmFyIFRBRyA9ICJb56eS5Lyg6ZO+5o6l5o+Q5Y+WIGJ5IG1lbmd6b25lZmlyZV0iOwogICAgICAgIHZhciBob21lUGFnZSA9ICJodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDI0NTc0IjsKICAgICAgICB2YXIgZG9uYXRlUGFnZSA9ICJodHRwczovL2FmZGlhbi5uZXQvQG1lbmd6b25lZmlyZSI7CiAgICAgICAgdmFyIGFqYXhFcnJvciA9IDUxNDsKICAgICAgICB2YXIgZXh0Q3NzVXJsID0gewogICAgICAgICAgICBEZWZhdWx0OiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9zd2VldGFsZXJ0MkAxMS9kaXN0L3N3ZWV0YWxlcnQyLm1pbi5jc3MiLAogICAgICAgICAgICBEYXJrOiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3dlZXRhbGVydDIvdGhlbWUtZGFya0A1L2RhcmsubWluLmNzcyIsCiAgICAgICAgICAgICJXb3JkUHJlc3MgQWRtaW4iOiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3dlZXRhbGVydDIvdGhlbWUtd29yZHByZXNzLWFkbWluQDUvd29yZHByZXNzLWFkbWluLm1pbi5jc3MiLAogICAgICAgICAgICAiTWF0ZXJpYWwgVUkiOiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3dlZXRhbGVydDIvdGhlbWUtbWF0ZXJpYWwtdWlANS9tYXRlcmlhbC11aS5taW4uY3NzIiwKICAgICAgICAgICAgQnVsbWE6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bzd2VldGFsZXJ0Mi90aGVtZS1idWxtYUA1L2J1bG1hLm1pbi5jc3MiLAogICAgICAgICAgICAiQm9vdHN0cmFwIDQiOiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3dlZXRhbGVydDIvdGhlbWUtYm9vdHN0cmFwLTQvYm9vdHN0cmFwLTQubWluLmNzcyIKICAgICAgICB9OwogICAgICAgIHZhciBhcHBFcnJvciA9IHsKICAgICAgICAgICAgbWlzc0RlcGVuZDogIuWklumDqOi1hOa6kOWKoOi9veWksei0pSwg6ISa5pys5peg5rOV6L+Q6KGMLCDor7fmo4Dmn6XnvZHnu5zmiJbmm7TmjaJETlMiLAogICAgICAgICAgICBTd2FsQ3NzSW52YWxpZDogIuagt+W8j+WMheWKoOi9vemUmeivrywg6K+35YmN5b6A6ISa5pys6aG15Y+N6aaIRjEy5o6n5Yi25Y+w5oiq5Zu+XG4iICsgaG9tZVBhZ2UsCiAgICAgICAgICAgIFN3YWxDc3NFcnJSZXE6ICLmoLflvI/ljIXliqDovb3lpLHotKUiCiAgICAgICAgfTsKICAgICAgICB2YXIgZG9jID0gewogICAgICAgICAgICBzaGFyZURvYzogImh0dHBzOi8vbWVuZ3pvbmVmaXJlLmNvZGUubWlzYWthbmV0LmNuL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvYy9nZW5lcmF0ZS1iZGNvZGUvIiwKICAgICAgICAgICAgbGlua1R5cGVEb2M6ICJodHRwczovL21lbmd6b25lZmlyZS5jb2RlLm1pc2FrYW5ldC5jbi9yYXBpZC11cGxvYWQtdXNlcnNjcmlwdC1kb2MvZm9ybWF0LXN1cHBvcnQvIgogICAgICAgIH07CiAgICAgICAgdmFyIGxpbmtTdHlsZSA9ICdjbGFzcz0ibXpmX2xpbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiJzsKICAgICAgICB2YXIgYnRuU3R5bGUgPSAnY2xhc3M9Im16Zl9idG4iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiJzsKICAgICAgICB2YXIgYmRsaW5rUGF0dGVybiA9IC9bXD8jXWJkbGluaz0oW1xkYS16QS1aKy89XSspLzsKICAgICAgICB2YXIgaHRtbENoZWNrTWQ1ID0gJzxwIGNsYXNzPSJtemZfdGV4dCI+5rWL6K+V56eS5LygIOWPr+mYsuatouenkuS8oOWkseaViDxhIGlkPSJjaGVja19tZDVfYnRuIiBjbGFzcz0ibXpmX2J0biI+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogYXV0bzsiPua1i+ivlTwvc3Bhbj48L2E+PC9wPic7CiAgICAgICAgdmFyIGh0bWxEb2N1bWVudCA9ICc8cCBjbGFzcz0ibXpmX3RleHQiPuenkuS8oOaXoOaViC9tZDXojrflj5blpLHotKUv6Ziy5ZKM6LCQ562JIOWPr+WPguiAgzxhIGhyZWY9IicgKyBkb2Muc2hhcmVEb2MgKyAnIiAnICsgYnRuU3R5bGUgKyAnPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IGF1dG87Ij7liIbkuqvmlZnnqIs8L3NwYW4+PC9hPjwvcD4nOwogICAgICAgIHZhciBodG1sRG9uYXRlID0gJzxwIGlkPSJtemZfZG9uYXRlIiBjbGFzcz0ibXpmX3RleHQiPuiLpeWWnOasouivpeiEmuacrCwg5Y+v5YmN5b6AIDxhIGhyZWY9IicgKyBkb25hdGVQYWdlICsgJyIgJyArIGxpbmtTdHlsZSArICc+6LWe5Yqp6aG1PC9hPiDmlK/mjIHkvZzogIU8YSBpZD0ia2lsbF9kb25hdGUiIGNsYXNzPSJtemZfYnRuIj7kuI3lho3mmL7npLo8L2E+PC9wPic7CiAgICAgICAgdmFyIGh0bWxGZWVkYmFjayA9ICc8cCBpZD0ibXpmX2ZlZWRiYWNrIiBjbGFzcz0ibXpmX3RleHQiPuiLpeacieS7u+S9leeWkemXriwg5Y+v5YmN5b6AIDxhIGhyZWY9IicgKyBob21lUGFnZSArICciICcgKyBsaW5rU3R5bGUgKyAnPuiEmuacrOS4u+mhtTwvYT4g5Y+N6aaIPGEgaWQ9ImtpbGxfZmVlZGJhY2siIGNsYXNzPSJtemZfYnRuIj7kuI3lho3mmL7npLo8L2E+PC9wPic7CiAgICAgICAgZnVuY3Rpb24gaW5pdFF1ZXJ5TGluaygpIHsKICAgICAgICAgICAgdmFyIGJkbGlua0I2NCA9IGxvY1VybC5tYXRjaChiZGxpbmtQYXR0ZXJuKTsKICAgICAgICAgICAgcmV0dXJuIGJkbGlua0I2NCA/IGJkbGlua0I2NFsxXS5mcm9tQmFzZTY0KCkgOiAiIjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gRHVQYXJzZXIoKSB7fQogICAgICAgIER1UGFyc2VyLnBhcnNlID0gZnVuY3Rpb24gZ2VuZXJhbER1Q29kZVBhcnNlKHN6VXJsKSB7CiAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICBpZiAoc3pVcmwuaW5kZXhPZigiYmRwYW4iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgciA9IER1UGFyc2VyLnBhcnNlRHVfdjEoc3pVcmwpOwogICAgICAgICAgICAgICAgci52ZXIgPSAiUGFuREwiOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN6VXJsLmluZGV4T2YoIkJhaWR1UENTLUdvIikgPT09IDApIHsKICAgICAgICAgICAgICAgIHIgPSBEdVBhcnNlci5wYXJzZUR1X3YyKHN6VXJsKTsKICAgICAgICAgICAgICAgIHIudmVyID0gIlBDUy1HbyI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByID0gRHVQYXJzZXIucGFyc2VEdV92MyhzelVybCk7CiAgICAgICAgICAgICAgICByLnZlciA9ICLmoqblp6zmoIflh4YiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByOwogICAgICAgIH07CiAgICAgICAgRHVQYXJzZXIucGFyc2VEdV92MSA9IGZ1bmN0aW9uIHBhcnNlRHVfdjEoc3pVcmwpIHsKICAgICAgICAgICAgcmV0dXJuIHN6VXJsLnJlcGxhY2UoL1xzKmJkcGFuOlwvXC8vZywgIiAiKS50cmltKCkuc3BsaXQoIiAiKS5tYXAoKGZ1bmN0aW9uKHopIHsKICAgICAgICAgICAgICAgIHJldHVybiB6LnRyaW0oKS5mcm9tQmFzZTY0KCkubWF0Y2goLyhbXHNcU10rKVx8KFtcZF17MSwyMH0pXHwoW1xkQS1GYS1mXXszMn0pXHwoW1xkQS1GYS1mXXszMn0pLyk7CiAgICAgICAgICAgIH0pKS5maWx0ZXIoKGZ1bmN0aW9uKHopIHsKICAgICAgICAgICAgICAgIHJldHVybiB6OwogICAgICAgICAgICB9KSkubWFwKChmdW5jdGlvbihpbmZvKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIG1kNTogaW5mb1szXSwKICAgICAgICAgICAgICAgICAgICBtZDVzOiBpbmZvWzRdLAogICAgICAgICAgICAgICAgICAgIHNpemU6IGluZm9bMl0sCiAgICAgICAgICAgICAgICAgICAgcGF0aDogaW5mb1sxXQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH07CiAgICAgICAgRHVQYXJzZXIucGFyc2VEdV92MiA9IGZ1bmN0aW9uIHBhcnNlRHVfdjIoc3pVcmwpIHsKICAgICAgICAgICAgcmV0dXJuIHN6VXJsLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24oeikgewogICAgICAgICAgICAgICAgcmV0dXJuIHoudHJpbSgpLm1hdGNoKC8tbGVuZ3RoPShbXGRdezEsMjB9KSAtbWQ1PShbXGRBLUZhLWZdezMyfSkgLXNsaWNlbWQ1PShbXGRBLUZhLWZdezMyfSlbXHNcU10rIihbXHNcU10rKSIvKTsKICAgICAgICAgICAgfSkpLmZpbHRlcigoZnVuY3Rpb24oeikgewogICAgICAgICAgICAgICAgcmV0dXJuIHo7CiAgICAgICAgICAgIH0pKS5tYXAoKGZ1bmN0aW9uKGluZm8pIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgbWQ1OiBpbmZvWzJdLAogICAgICAgICAgICAgICAgICAgIG1kNXM6IGluZm9bM10sCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogaW5mb1sxXSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiBpbmZvWzRdCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSk7CiAgICAgICAgfTsKICAgICAgICBEdVBhcnNlci5wYXJzZUR1X3YzID0gZnVuY3Rpb24gcGFyc2VEdV92MyhzelVybCkgewogICAgICAgICAgICByZXR1cm4gc3pVcmwuc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih6KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gei50cmltKCkubWF0Y2goL14oW1xkQS1GYS1mXXszMn0pIyg/OihbXGRBLUZhLWZdezMyfSkjKT8oW1xkXXsxLDIwfSkjKFtcc1xTXSspLyk7CiAgICAgICAgICAgIH0pKS5maWx0ZXIoKGZ1bmN0aW9uKHopIHsKICAgICAgICAgICAgICAgIHJldHVybiB6OwogICAgICAgICAgICB9KSkubWFwKChmdW5jdGlvbihpbmZvKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIG1kNTogaW5mb1sxXSwKICAgICAgICAgICAgICAgICAgICBtZDVzOiBpbmZvWzJdIHx8ICIiLAogICAgICAgICAgICAgICAgICAgIHNpemU6IGluZm9bM10sCiAgICAgICAgICAgICAgICAgICAgcGF0aDogaW5mb1s0XQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH07CiAgICAgICAgdmFyIHVwZGF0ZUluZm8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7CiAgICAgICAgdmFyIHVwZGF0ZUluZm9fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubih1cGRhdGVJbmZvKTsKICAgICAgICB2YXIgU3dhbENvbmZpZyA9IHsKICAgICAgICAgICAgaW5wdXRWaWV3OiB7CiAgICAgICAgICAgICAgICB0aXRsZTogIuivt+i+k+WFpeenkuS8oCIsCiAgICAgICAgICAgICAgICBpbnB1dDogInRleHRhcmVhIiwKICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBpbnB1dFBsYWNlaG9sZGVyOiAiW+aUr+aMgVBhbkRML+agh+WHhueggS9HT+agvOW8j11b5pSv5oyB5om56YePKOaNouihjOWIhumalCldXG5b6L6T5YWlc2V06L+b5YWl6K6+572u6aG1XVvovpPlhaVnZW7ov5vlhaXnlJ/miJDpobVdIiwKICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi56Gu5a6aIiwKICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICLlj5bmtogiLAogICAgICAgICAgICAgICAgaW5wdXRWYWxpZGF0b3I6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIumTvuaOpeS4jeiDveS4uuepuiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gInNldCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICJnZW4iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFEdVBhcnNlci5wYXJzZSh2YWx1ZSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHA+5pyq6K+G5Yir5Yiw5q2j56Gu55qE6ZO+5o6lIDxhIGhyZWY9IicgKyBkb2MubGlua1R5cGVEb2MgKyAnIiAnICsgbGlua1N0eWxlICsgIj7mn6XnnIvmlK/mjIHmoLzlvI88L2E+PC9wPiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBpbnB1dFBhdGhWaWV3OiB7CiAgICAgICAgICAgICAgICB0aXRsZTogIuivt+i+k+WFpeS/neWtmOi3r+W+hCIsCiAgICAgICAgICAgICAgICBpbnB1dDogInRleHQiLAogICAgICAgICAgICAgICAgaW5wdXRQbGFjZWhvbGRlcjogIuagvOW8j+ekuuS+i++8mi9HVEE1Lywg55WZ56m65L+d5a2Y5Zyo5b2T5YmN55uu5b2VIiwKICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuehruWumiIsCiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICAgICAgICAgIGlucHV0VmFsaWRhdG9yOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5tYXRjaChpbGxlZ2FsUGF0aFBhdHRlcm4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAn5LiN6IO95ZCr5pyJ5a2X56ymXFwiOio/PD58LCDmoLzlvI/npLrkvovvvJovR1RBNS8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc1ZpZXc6IHsKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZQogICAgICAgICAgICB9LAogICAgICAgICAgICBmaW5pc2hWaWV3OiB7CiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2VuVW5maW5pc2g6IHsKICAgICAgICAgICAgICAgIHRpdGxlOiAi5qOA5rWL5Yiw5pyq5a6M5oiQ55qE56eS5Lyg5Lu75YqhIiwKICAgICAgICAgICAgICAgIHRleHQ6ICLmmK/lkKbnu6fnu63ov5vooYw/IiwKICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuaYryIsCiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5ZCmIgogICAgICAgICAgICB9LAogICAgICAgICAgICBnZW5WaWV3OiB7CiAgICAgICAgICAgICAgICB0aXRsZTogIuivt+i+k+WFpemcgOimgeeUn+aIkOeahOaWh+S7tui3r+W+hCIsCiAgICAgICAgICAgICAgICBpbnB1dDogInRleHRhcmVhIiwKICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBpbnB1dFBsYWNlaG9sZGVyOiAiW+aUr+aMgeaJuemHjyjmjaLooYzliIbpmpQpXSIsCiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuehruWumiIsCiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICAgICAgICAgIGlucHV0VmFsaWRhdG9yOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICLmlofku7bot6/lvoTkuI3og73kuLrnqboiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgdXBkYXRlSW5mbzogewogICAgICAgICAgICAgICAgdGl0bGU6ICLnp5LkvKDpk77mjqXmj5Dlj5Yg5pu05paw5YaF5a65IiwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi55+l6YGT5LqGIiwKICAgICAgICAgICAgICAgIGh0bWw6IHVwZGF0ZUluZm9fZGVmYXVsdCgpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNoZWNrUmVjdXJzaXZlOiB7CiAgICAgICAgICAgICAgICBpY29uOiAiaW5mbyIsCiAgICAgICAgICAgICAgICB0aXRsZTogIuWMheWQq+aWh+S7tuWkuSwg5piv5ZCm6YCS5b2S55Sf5oiQPyIsCiAgICAgICAgICAgICAgICB0ZXh0OiAi6Iul6YCJ5pivLCDlsIblkIzml7bnlJ/miJDlkITnuqflrZDmlofku7blpLnkuIvnmoTmlofku7YiLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgZm9jdXNDYW5jZWw6IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuaYryIsCiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5ZCmIgogICAgICAgICAgICB9LAogICAgICAgICAgICBjaGVja01kNVdhcm5pbmc6IHsKICAgICAgICAgICAgICAgIHRpdGxlOiAi5L2/55So5YmN6K+35rOo5oSPIiwKICAgICAgICAgICAgICAgIHRleHQ6ICLmtYvor5Xnp5LkvKDkvJrovazlrZjlubbopobnm5bmlofku7Ys6Iul5Zyo55Sf5oiQ5pyf6Ze05L+u5pS56L+H5ZCM5ZCN5paH5Lu2LOS4uumBv+WFjeS/ruaUueeahOaWh+S7tuS4ouWksSzor7fkuI3opoHkvb/nlKjmraTlip/og70hIiwKICAgICAgICAgICAgICAgIGlucHV0OiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgaW5wdXRQbGFjZWhvbGRlcjogIuS4jeWGjeaYvuekuiIsCiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnoa7lrpoiLAogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIui/lOWbniIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0dGluZ1ZpZXc6IHsKICAgICAgICAgICAgICAgIHRpdGxlOiAi56eS5Lyg6ZO+5o6l5o+Q5Y+WIOiuvue9rumhtSIsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnoa7lrpoiLAogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIuWPlua2iCIsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICBpbnB1dDogInNlbGVjdCIsCiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBHTV9nZXRWYWx1ZSgic3dhbFRoZW1lcyIpIHx8ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgIGlucHV0T3B0aW9uczogewogICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICJEZWZhdWx0IOeZveiJsuS4u+mimCjpu5jorqQpIiwKICAgICAgICAgICAgICAgICAgICBCdWxtYTogIkJ1bG1hIOeZveiJsueugOe6piIsCiAgICAgICAgICAgICAgICAgICAgIkJvb3RzdHJhcCA0IjogIkJvb3RzdHJhcDQg55m96Imy566A57qmIiwKICAgICAgICAgICAgICAgICAgICAiTWF0ZXJpYWwgVUkiOiAiTWF0ZXJpYWxVSSDnmb3oibLkuLvpopgiLAogICAgICAgICAgICAgICAgICAgIERhcms6ICJEYXJrIOm7keiJsuS4u+mimCIsCiAgICAgICAgICAgICAgICAgICAgIldvcmRQcmVzcyBBZG1pbiI6ICJXb3JkUHJlc3NBZG1pbiDngbDoibLkuLvpopgiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldHRpbmdXYXJuaW5nOiB7CiAgICAgICAgICAgICAgICB0aXRsZTogIuiuvue9ruaIkOWKnyDliLfmlrDpobXpnaLnlJ/mlYgiLAogICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnn6XpgZPkuoYiCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBfX2Fzc2lnbiA9IHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24gfHwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBhamF4KGNvbmZpZywgY2FsbGJhY2ssIGZhaWxiYWNrKSB7CiAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb25maWcpLCB7CiAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihyLnN0YXR1cyAvIDEwMCkgPT09IDIpIGNhbGxiYWNrKHIpOyBlbHNlIGZhaWxiYWNrKHIuc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmYWlsYmFjayhhamF4RXJyb3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNob3dBbGVydCh0ZXh0KSB7CiAgICAgICAgICAgIGFsZXJ0KFRBRyArICI6XG4iICsgdGV4dCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHJhbmRvbVN0cmluZ1RyYW5zZm9ybShzdHJpbmcpIHsKICAgICAgICAgICAgdmFyIHRlbXBTdHJpbmcgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBzdHJpbmdfMSA9IHN0cmluZzsgX2kgPCBzdHJpbmdfMS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICAgIHZhciBpID0gc3RyaW5nXzFbX2ldOwogICAgICAgICAgICAgICAgaWYgKCFNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcFN0cmluZy5wdXNoKGkudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRlbXBTdHJpbmcucHVzaChpLnRvVXBwZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0ZW1wU3RyaW5nLmpvaW4oIiIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwYXJzZWZpbGVJbmZvKGZpbGVJbmZvTGlzdCkgewogICAgICAgICAgICB2YXIgYmRjb2RlID0gIiI7CiAgICAgICAgICAgIHZhciBmYWlsZWRJbmZvID0gIiI7CiAgICAgICAgICAgIHZhciBmYWlsZWRDb3VudCA9IDA7CiAgICAgICAgICAgIHZhciBzdWNjZXNzTGlzdCA9IFtdOwogICAgICAgICAgICBmaWxlSW5mb0xpc3QuZm9yRWFjaCgoZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZXJybm8pIHsKICAgICAgICAgICAgICAgICAgICBmYWlsZWRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGZhaWxlZEluZm8gKz0gIjxwPuaWh+S7tu+8miIgKyBpdGVtLnBhdGggKyAiPC9wPjxwPuWksei0peWOn+WboO+8miIgKyBiYWlkdUVycm5vKGl0ZW0uZXJybm8pICsgIigjIiArIGl0ZW0uZXJybm8gKyAiKTwvcD4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBiZGNvZGUgKz0gaXRlbS5tZDUgKyAiIyIgKyBpdGVtLm1kNXMgKyAiIyIgKyBpdGVtLnNpemUgKyAiIyIgKyBpdGVtLnBhdGggKyAiXG4iOwogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NMaXN0LnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKGZhaWxlZEluZm8pIGZhaWxlZEluZm8gPSAiPHA+5aSx6LSl5paH5Lu25YiX6KGoOjwvcD4iICsgZmFpbGVkSW5mbzsKICAgICAgICAgICAgYmRjb2RlID0gYmRjb2RlLnRyaW0oKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGh0bWxJbmZvOiBmYWlsZWRJbmZvLAogICAgICAgICAgICAgICAgZmFpbGVkQ291bnQsCiAgICAgICAgICAgICAgICBiZGNvZGUsCiAgICAgICAgICAgICAgICBzdWNjZXNzTGlzdAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXRiZHN0b2tlbigpIHsKICAgICAgICAgICAgYWpheCh7CiAgICAgICAgICAgICAgICB1cmw6IGJkc3Rva2VuX3VybCwKICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIsCiAgICAgICAgICAgICAgICBkYXRhOiBjb252ZXJ0RGF0YSh7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBKU09OLnN0cmluZ2lmeShbICJiZHN0b2tlbiIgXSkKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0sIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgICAgIGlmICghZGF0YS5lcnJubyAmJiBkYXRhLnJlc3VsdC5iZHN0b2tlbikgc2V0YmRzdG9rZW4oZGF0YS5yZXN1bHQuYmRzdG9rZW4pOyBlbHNlIHNob3dBbGVydCgi6I635Y+WYmRzdG9rZW7lpLHotKUoIiArIGRhdGEuZXJybm8gKyAiKSwg5Y+v6IO95a+86Ie06L2s5a2Y5aSx6LSlKCMyKSwg6K+35bCd6K+V5Yi35paw6aG16Z2iLCDmiJbph43mlrDnmbvlvZUiKTsKICAgICAgICAgICAgfSksIChmdW5jdGlvbihzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgICAgICBzaG93QWxlcnQoIuiOt+WPlmJkc3Rva2Vu5aSx6LSlKCIgKyBzdGF0dXNDb2RlICsgIiksIOWPr+iDveWvvOiHtOi9rOWtmOWksei0pSgjMiksIOivt+WwneivleWIt+aWsOmhtemdoiwg5oiW6YeN5paw55m75b2VIik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRGaWxlTGlzdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHVuc2FmZVdpbmRvdy5yZXF1aXJlKCJzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMiKS5pbnN0YW5jZUZvclN5c3RlbS5saXN0LmdldFNlbGVjdGVkKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbnZlcnREYXRhKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gIiI7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSBxdWVyeSArPSAiJiIgKyBrZXkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoZGF0YVtrZXldKTsKICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5OwogICAgICAgIH0KICAgICAgICB2YXIgU3dhbEJhc2VfYXNzaWduID0gdW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2Fzc2lnbiB8fCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgU3dhbEJhc2VfYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIFN3YWxCYXNlX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICAgICAgdmFyIF9fc3ByZWFkQXJyYXkgPSB1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24odG8sIGZyb20sIHBhY2spIHsKICAgICAgICAgICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpOwogICAgICAgICAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTsKICAgICAgICB9OwogICAgICAgIHZhciBTd2FsYmFzZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmdW5jdGlvbiBTd2FsYmFzZShyYXBpZHVwbG9hZFRhc2ssIGdlbmVyYXRlYmRsaW5rVGFzaykgewogICAgICAgICAgICAgICAgdGhpcy5yYXBpZHVwbG9hZFRhc2sgPSByYXBpZHVwbG9hZFRhc2s7CiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzayA9IGdlbmVyYXRlYmRsaW5rVGFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBTd2FsYmFzZS5wcm90b3R5cGUubWVyZ2VBcmcgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBpbnB1dEFyZ3MgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXRBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0ge307CiAgICAgICAgICAgICAgICAkLmV4dGVuZC5hcHBseSgkLCBfX3NwcmVhZEFycmF5KFsgb3V0cHV0LCB0aGlzLnN3YWxBcmdzIF0sIGlucHV0QXJncywgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFN3YWxiYXNlLnByb3RvdHlwZS5pbnB1dFZpZXcgPSBmdW5jdGlvbihzd2FsQXJnKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgU3dhbC5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5pbnB1dFZpZXcsIHN3YWxBcmcpKS50aGVuKChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWUgPT09ICJzZXQiKSBfdGhpcy5zZXR0aW5nVmlldygpOyBlbHNlIGlmIChyZXN1bHQudmFsdWUgPT09ICJnZW4iKSBfdGhpcy5nZW5WaWV3KCk7IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmFwaWR1cGxvYWRUYXNrLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yYXBpZHVwbG9hZFRhc2suZmlsZUluZm9MaXN0ID0gRHVQYXJzZXIucGFyc2UocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmlucHV0UGF0aFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmlucHV0UGF0aFZpZXcgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICBTd2FsLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLmlucHV0UGF0aFZpZXcsIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBHTV9nZXRWYWx1ZSgibGFzdF9kaXIiKSB8fCAiIgogICAgICAgICAgICAgICAgfSkpLnRoZW4oKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSByZXN1bHQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJsYXN0X2RpciIsIHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJhcGlkdXBsb2FkVGFzay5pc0RlZmF1bHRQYXRoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3dQYXRoID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvcGF0aD0oLis/KSg/OiZ8JCkvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3dQYXRoKSBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KG5vd1BhdGhbMV0pOyBlbHNlIHBhdGggPSAiLyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguY2hhckF0KHBhdGgubGVuZ3RoIC0gMSkgIT09ICIvIikgcGF0aCArPSAiLyI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLnp5LkvKDmlofku7bkv53lrZjliLA6ICIgKyBwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmFwaWR1cGxvYWRUYXNrLnNhdmVQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucHJvY2Vzc1ZpZXcoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLnByb2Nlc3NWaWV3ID0gZnVuY3Rpb24oaXNHZW4pIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgc3dhbEFyZyA9IHsKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXNHZW4gPyAi56eS5Lyg55Sf5oiQ5LitIiA6ICLmlofku7YiICsgKHRoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSA/ICLmtYvor5UiIDogIuaPkOWPliIpICsgIuS4rSIsCiAgICAgICAgICAgICAgICAgICAgaHRtbDogaXNHZW4gPyAiPHA+5q2j5Zyo55Sf5oiQ56ysIDxmaWxlX251bT4wPC9maWxlX251bT4g5LiqPC9wPjxwPjxnZW5fcHJvZz7mraPlnKjojrflj5bmlofku7bliJfooaguLi48L2dlbl9wcm9nPjwvcD4iIDogIuato+WcqCIgKyAodGhpcy5yYXBpZHVwbG9hZFRhc2suY2hlY2tNb2RlID8gIua1i+ivlSIgOiAi6L2s5a2YIikgKyAi56ysIDxmaWxlX251bT4wPC9maWxlX251bT4g5LiqIiwKICAgICAgICAgICAgICAgICAgICB3aWxsT3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuc2hvd0xvYWRpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW4gfHwgX3RoaXMuc2F2ZUZpbGVXb3JrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcucHJvY2Vzc1ZpZXcsIHN3YWxBcmcpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmZpbmlzaFZpZXcgPSBmdW5jdGlvbihpc0dlbikgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBpc0dlbiA/ICLnlJ/miJAiIDogdGhpcy5yYXBpZHVwbG9hZFRhc2suY2hlY2tNb2RlID8gIua1i+ivlSIgOiAi6L2s5a2YIjsKICAgICAgICAgICAgICAgIHZhciBmaWxlSW5mb0xpc3QgPSBpc0dlbiA/IHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmZpbGVJbmZvTGlzdCA6IHRoaXMucmFwaWR1cGxvYWRUYXNrLmZpbGVJbmZvTGlzdDsKICAgICAgICAgICAgICAgIHZhciBwYXJzZVJlc3VsdCA9IHBhcnNlZmlsZUluZm8oZmlsZUluZm9MaXN0KTsKICAgICAgICAgICAgICAgIGlmIChpc0dlbikgdGhpcy5yYXBpZHVwbG9hZFRhc2suZmlsZUluZm9MaXN0ID0gcGFyc2VSZXN1bHQuc3VjY2Vzc0xpc3Q7CiAgICAgICAgICAgICAgICB2YXIgY2hlY2tib3hBcmcgPSBwYXJzZVJlc3VsdC5mYWlsZWRDb3VudCA9PT0gZmlsZUluZm9MaXN0Lmxlbmd0aCA/IHt9IDogewogICAgICAgICAgICAgICAgICAgIGlucHV0OiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWU6IEdNX2dldFZhbHVlKCJ3aXRoX3BhdGgiKSwKICAgICAgICAgICAgICAgICAgICBpbnB1dFBsYWNlaG9sZGVyOiAi5a+85Ye65paH5Lu25aS555uu5b2V57uT5p6EIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gKGlzR2VuID8gKHBhcnNlUmVzdWx0LmZhaWxlZENvdW50ID09PSBmaWxlSW5mb0xpc3QubGVuZ3RoID8gIiIgOiBodG1sQ2hlY2tNZDUpICsgaHRtbERvY3VtZW50IDogIiIpICsgKHBhcnNlUmVzdWx0Lmh0bWxJbmZvICYmIGlzR2VuID8gIjxwPjxicj48L3A+IiA6ICIiKSArIHBhcnNlUmVzdWx0Lmh0bWxJbmZvOwogICAgICAgICAgICAgICAgdmFyIGh0bWxGb290ZXIgPSAiIjsKICAgICAgICAgICAgICAgIGlmICghR01fZ2V0VmFsdWUoZG9uYXRlVmVyICsgIl9raWxsX2RvbmF0ZSIpKSBodG1sRm9vdGVyICs9IGh0bWxEb25hdGU7CiAgICAgICAgICAgICAgICBpZiAoIUdNX2dldFZhbHVlKGZlZWRiYWNrVmVyICsgIl9raWxsX2RvbmF0ZSIpKSBodG1sRm9vdGVyICs9IGh0bWxGZWVkYmFjazsKICAgICAgICAgICAgICAgIGlmIChodG1sRm9vdGVyKSBodG1sRm9vdGVyID0gIjxwPjxicj48L3A+IiArIGh0bWxGb290ZXI7CiAgICAgICAgICAgICAgICB2YXIgc3dhbEFyZyA9IFN3YWxCYXNlX2Fzc2lnbihTd2FsQmFzZV9hc3NpZ24oewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBhY3Rpb24gKyAi5a6M5q+VIOWFsSIgKyBmaWxlSW5mb0xpc3QubGVuZ3RoICsgIuS4qiwg5aSx6LSlIiArIHBhcnNlUmVzdWx0LmZhaWxlZENvdW50ICsgIuS4qiEiLAogICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBwYXJzZVJlc3VsdC5mYWlsZWRDb3VudCAhPT0gZmlsZUluZm9MaXN0Lmxlbmd0aCAmJiAoaXNHZW4gfHwgdGhpcy5yYXBpZHVwbG9hZFRhc2suY2hlY2tNb2RlKSA/ICLlpI3liLbnp5LkvKDku6PnoIEiIDogIuehruiupCIsCiAgICAgICAgICAgICAgICAgICAgaHRtbDogaHRtbCArIGh0bWxGb290ZXIKICAgICAgICAgICAgICAgIH0sIChpc0dlbiB8fCB0aGlzLnJhcGlkdXBsb2FkVGFzay5jaGVja01vZGUpICYmIGNoZWNrYm94QXJnKSwgewogICAgICAgICAgICAgICAgICAgIHdpbGxPcGVuOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0dlbiAmJiAhX3RoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSkgX3RoaXMuYWRkT3BlbkRpckJ0bigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgU3dhbC5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5maW5pc2hWaWV3LCBzd2FsQXJnKSkudGhlbigoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW4gfHwgX3RoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoIndpdGhfcGF0aCIsIHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC52YWx1ZSkgR01fc2V0Q2xpcGJvYXJkKHBhcnNlUmVzdWx0LmJkY29kZS5yZXBsYWNlKC9cLy4rXC8vZywgIiIpKTsgZWxzZSBHTV9zZXRDbGlwYm9hcmQocGFyc2VSZXN1bHQuYmRjb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJ1bmZpbmlzaCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaExpc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrUmVjdXJzaXZlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgU3dhbC5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5jaGVja1JlY3Vyc2l2ZSkpLnRoZW4oKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnJlY3Vyc2l2ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZGlzbWlzcyA9PT0gU3dhbC5EaXNtaXNzUmVhc29uLmNhbmNlbCkgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnJlY3Vyc2l2ZSA9IGZhbHNlOyBlbHNlIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc2NhbkZpbGUoMCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFN3YWxiYXNlLnByb3RvdHlwZS5zZXR0aW5nVmlldyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuc2V0dGluZ1ZpZXcpKS50aGVuKChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJzd2FsVGhlbWVzIiwgcmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgU3dhbC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoX3RoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5zZXR0aW5nV2FybmluZykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmdlblZpZXcgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICBTd2FsLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLmdlblZpZXcpKS50aGVuKChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFsdWUuc3BsaXQoIlxuIikuZm9yRWFjaCgoZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY2hhckF0KDApICE9PSAiLyIpIGl0ZW0gPSAiLyIgKyBpdGVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5GaWxlV29yayhmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBTd2FsYmFzZS5wcm90b3R5cGUuZ2VuVW5maW5pc2hpID0gZnVuY3Rpb24ob25Db25maXJtLCBvbkNhbmNlbCkgewogICAgICAgICAgICAgICAgU3dhbC5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5nZW5VbmZpbmlzaCkpLnRoZW4oKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIG9uQ29uZmlybSgpOyBlbHNlIGlmIChyZXN1bHQuZGlzbWlzcyA9PT0gU3dhbC5EaXNtaXNzUmVhc29uLmNhbmNlbCkgb25DYW5jZWwoKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrTWQ1V2FybmluZyA9IGZ1bmN0aW9uKG9uQ29uZmlybSwgb25DYW5jZWwpIHsKICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuY2hlY2tNZDVXYXJuaW5nKSkudGhlbigoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiY2hlY2tfbWQ1X3dhcm5pbmciLCByZXN1bHQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm0oKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5kaXNtaXNzID09PSBTd2FsLkRpc21pc3NSZWFzb24uY2FuY2VsKSBvbkNhbmNlbCgpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBTd2FsYmFzZS5wcm90b3R5cGUudXBkYXRlSW5mbyA9IGZ1bmN0aW9uKG9uQ29uZmlybSkgewogICAgICAgICAgICAgICAgU3dhbC5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy51cGRhdGVJbmZvKSkudGhlbigoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkgb25Db25maXJtKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFN3YWxiYXNlLnByb3RvdHlwZS5zYXZlRmlsZVdvcmsgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICB0aGlzLnJhcGlkdXBsb2FkVGFzay5vbkZpbmlzaCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLmZpbmlzaFZpZXcoZmFsc2UpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMucmFwaWR1cGxvYWRUYXNrLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKGksIGZpbGVJbmZvTGlzdCkgewogICAgICAgICAgICAgICAgICAgIFN3YWwuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImZpbGVfbnVtIikudGV4dENvbnRlbnQgPSBpICsgMSArICIgLyAiICsgZmlsZUluZm9MaXN0Lmxlbmd0aDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0aGlzLnJhcGlkdXBsb2FkVGFzay5zdGFydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBTd2FsYmFzZS5wcm90b3R5cGUuZ2VuRmlsZVdvcmsgPSBmdW5jdGlvbihpc1VuZmluaXNoLCBpc0dlblZpZXcpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoIWlzR2VuVmlldykgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc2VsZWN0TGlzdCA9IGdldFNlbGVjdGVkRmlsZUxpc3QoKTsKICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKGksIGZpbGVJbmZvTGlzdCkgewogICAgICAgICAgICAgICAgICAgIFN3YWwuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImZpbGVfbnVtIikudGV4dENvbnRlbnQgPSBpICsgMSArICIgLyAiICsgZmlsZUluZm9MaXN0Lmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBTd2FsLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJnZW5fcHJvZyIpLnRleHRDb250ZW50ID0gIjAlIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5vblByb2dyZXNzID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS50b3RhbCAhPT0gIm51bWJlciIpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBTd2FsLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJnZW5fcHJvZyIpLnRleHRDb250ZW50ID0gKGUubG9hZGVkIC8gZS50b3RhbCAqIDEwMCkudG9GaXhlZCgpICsgIiUiOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uSGFzTm9EaXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suZ2VuZXJhdGVCZGxpbmsoMCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sub25IYXNEaXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5jaGVja1JlY3Vyc2l2ZSgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uRmluaXNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmluaXNoVmlldyh0cnVlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAoIWlzVW5maW5pc2ggJiYgIWlzR2VuVmlldykgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc3RhcnQoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrVW5maW5pc2ggPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoR01fZ2V0VmFsdWUoInVuZmluaXNoIikpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmdlblVuZmluaXNoaSgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnByb2Nlc3NWaWV3KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5GaWxlV29yayh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmZpbmlzaEluZm8gPSBHTV9nZXRWYWx1ZSgidW5maW5pc2giKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmZpbGVJbmZvTGlzdCA9IHVuZmluaXNoSW5mby5maWxlX2luZm9fbGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmdlbmVyYXRlQmRsaW5rKHVuZmluaXNoSW5mby5maWxlX2lkKTsKICAgICAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBHTV9kZWxldGVWYWx1ZSgidW5maW5pc2giKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuRmlsZVdvcmsoZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuRmlsZVdvcmsoZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrTWQ1ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5yYXBpZHVwbG9hZFRhc2suY2hlY2tNb2RlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICghR01fZ2V0VmFsdWUoImNoZWNrX21kNV93YXJuaW5nIikpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTWQ1V2FybmluZygoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnByb2Nlc3NWaWV3KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maW5pc2hWaWV3KHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLnByb2Nlc3NWaWV3KGZhbHNlKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3dhbGJhc2UucHJvdG90eXBlLmFkZE9wZW5EaXJCdG4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5yYXBpZHVwbG9hZFRhc2suaXNEZWZhdWx0UGF0aCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfZGlyXzEgPSAodGhpcy5yYXBpZHVwbG9hZFRhc2suc2F2ZVBhdGggfHwgIiIpLnJlcGxhY2UoL1wvJC8sICIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoX2Rpcl8xLmNoYXJBdCgwKSAhPT0gIi8iKSBfZGlyXzEgPSAiLyIgKyBfZGlyXzE7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNCdG4gPSBTd2FsLmdldENvbmZpcm1CdXR0b24oKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYnRuID0gY0J0bi5jbG9uZU5vZGUoKTsKICAgICAgICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAi5omT5byA55uu5b2VIjsKICAgICAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNlY2FlM2MiOwogICAgICAgICAgICAgICAgICAgIGJ0bi5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvKHBhdGg9KC4rPykpKD86JnwkKS8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAmJiBwYXRoWzJdICE9PSBlbmNvZGVVUklDb21wb25lbnQoX2Rpcl8xKSkgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZShwYXRoWzFdLCAicGF0aD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KF9kaXJfMSkpOyBlbHNlIHJlZnJlc2hMaXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNCdG4uYmVmb3JlKGJ0bik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBTd2FsYmFzZTsKICAgICAgICB9KCk7CiAgICAgICAgY29uc3QgU3dhbEJhc2UgPSBTd2FsYmFzZTsKICAgICAgICB2YXIgR2VuZXJhdGViZGxpbmtUYXNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIEdlbmVyYXRlYmRsaW5rVGFzaygpIHt9CiAgICAgICAgICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmRpckxpc3QgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TGlzdCA9IFtdOwogICAgICAgICAgICAgICAgdGhpcy5maWxlSW5mb0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMub25GaW5pc2ggPSBmdW5jdGlvbigpIHt9OwogICAgICAgICAgICAgICAgdGhpcy5vblByb2Nlc3MgPSBmdW5jdGlvbigpIHt9OwogICAgICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICAgICAgICAgIHRoaXMub25IYXNEaXIgPSBmdW5jdGlvbigpIHt9OwogICAgICAgICAgICAgICAgdGhpcy5vbkhhc05vRGlyID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TGlzdC5mb3JFYWNoKChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNkaXIpIF90aGlzLmRpckxpc3QucHVzaChpdGVtLnBhdGgpOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbS5zaXplCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpckxpc3QubGVuZ3RoKSB0aGlzLm9uSGFzRGlyKCk7IGVsc2UgdGhpcy5vbkhhc05vRGlyKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuc2NhbkZpbGUgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5kaXJMaXN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWpheCh7CiAgICAgICAgICAgICAgICAgICAgdXJsOiBsaXN0X3VybCArICImcGF0aD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZGlyTGlzdFtpXSkgKyAiJnJlY3Vyc2lvbj0iICsgKHRoaXMucmVjdXJzaXZlID8gMSA6IDApLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIKICAgICAgICAgICAgICAgIH0sIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubGlzdC5mb3JFYWNoKChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmlzZGlyIHx8IF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogX3RoaXMuZGlyTGlzdFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJybm86IGRhdGEuZXJybm8KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5zY2FuRmlsZShpICsgMSk7CiAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWxlSW5mb0xpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IF90aGlzLmRpckxpc3RbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vOiBzdGF0dXNDb2RlID09PSA1MDAgPyA5MDEgOiBzdGF0dXNDb2RlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2NhbkZpbGUoaSArIDEpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLmdlbmVyYXRlQmRsaW5rID0gZnVuY3Rpb24oaSkgewogICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInVuZmluaXNoIiwgewogICAgICAgICAgICAgICAgICAgIGZpbGVfaW5mb19saXN0OiB0aGlzLmZpbGVJbmZvTGlzdCwKICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiBpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChpID49IHRoaXMuZmlsZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub25GaW5pc2godGhpcy5maWxlSW5mb0xpc3QpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMub25Qcm9jZXNzKGksIHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlSW5mb0xpc3RbaV07CiAgICAgICAgICAgICAgICBpZiAoZmlsZS5lcnJubykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZ2V0RmlsZUluZm8oaSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuZ2V0RmlsZUluZm8gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICAgICAgICAgIGFqYXgoewogICAgICAgICAgICAgICAgICAgIHVybDogbWV0YV91cmwgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZS5wYXRoKSwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiCiAgICAgICAgICAgICAgICB9LCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLmxpc3RbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5saXN0WzBdLmlzZGlyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gOTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGRhdGEubGlzdFswXS5zaXplOwogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmZzX2lkID0gZGF0YS5saXN0WzBdLmZzX2lkOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5saXN0WzBdLmJsb2NrX2xpc3QubGVuZ3RoID09PSAxKSBmaWxlLm1kNSA9IGRhdGEubGlzdFswXS5ibG9ja19saXN0WzBdLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmdldERsaW5rKGkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSBkYXRhLmVycm5vOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGUgPT09IDQwNCA/IDkwOSA6IHN0YXR1c0NvZGU7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLmdldERsaW5rID0gZnVuY3Rpb24oaSkgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlSW5mb0xpc3RbaV07CiAgICAgICAgICAgICAgICBhamF4KHsKICAgICAgICAgICAgICAgICAgICB1cmw6IG1ldGFfdXJsMiArIEpTT04uc3RyaW5naWZ5KFsgZmlsZS5mc19pZCBdKSwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiCiAgICAgICAgICAgICAgICB9LCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLmxpc3RbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kb3dubG9hZEZpbGVEYXRhKGksIGRhdGEubGlzdFswXS5kbGluayk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IGRhdGEuZXJybm87CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gc3RhdHVzQ29kZTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuZG93bmxvYWRGaWxlRGF0YSA9IGZ1bmN0aW9uKGksIGRsaW5rKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICAgICAgICAgIHZhciBkbFNpemUgPSBmaWxlLnNpemUgPCAyNjIxNDQgPyBmaWxlLnNpemUgLSAxIDogMjYyMTQzOwogICAgICAgICAgICAgICAgYWpheCh7CiAgICAgICAgICAgICAgICAgICAgdXJsOiBkbGluaywKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImFycmF5YnVmZmVyIiwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlOiAiYnl0ZXM9MC0iICsgZGxTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAiVXNlci1BZ2VudCI6IFVBCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbnByb2dyZXNzOiB0aGlzLm9uUHJvZ3Jlc3MKICAgICAgICAgICAgICAgIH0sIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Qcm9ncmVzcyh7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogMTAwCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMucGFyc2VEb3dubG9hZERhdGEoaSwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDA0KSBmaWxlLmVycm5vID0gOTA5OyBlbHNlIGZpbGUuZXJybm8gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5wYXJzZURvd25sb2FkRGF0YSA9IGZ1bmN0aW9uKGksIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiZGxfdXJsOiAiICsgZGF0YS5maW5hbFVybCk7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuZmluYWxVcmwuaW5kZXhPZigiaXNzdWVjZG4uYmFpZHVwY3MuY29tIikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IDE5MTk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZU1kNSA9IGRhdGEucmVzcG9uc2VIZWFkZXJzLm1hdGNoKC9jb250ZW50LW1kNTogKFtcZGEtZl17MzJ9KS9pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU1kNSkgZmlsZS5tZDUgPSBmaWxlTWQ1WzFdLnRvTG93ZXJDYXNlKCk7IGVsc2UgaWYgKCFmaWxlLm1kNSAmJiBmaWxlLnNpemUgPD0gMzllOCAmJiAhZmlsZS5yZXRyeV85OTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5yZXRyeV85OTYgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkRmlsZURhdGEoaSwgcGNzX3VybCArICgiJnBhdGg9IiArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlLnBhdGgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWxlLm1kNSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gOTk2OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3BhcmsgPSBuZXcgU3BhcmtNRDUuQXJyYXlCdWZmZXI7CiAgICAgICAgICAgICAgICAgICAgc3BhcmsuYXBwZW5kKGRhdGEucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIHZhciBzbGljZU1kNSA9IHNwYXJrLmVuZCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGUubWQ1cyA9IHNsaWNlTWQ1OwogICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnZhbCA9IHRoaXMuZmlsZUluZm9MaXN0Lmxlbmd0aCA+IDEgPyAyZTMgOiAxZTM7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICB9KSwgaW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gR2VuZXJhdGViZGxpbmtUYXNrOwogICAgICAgIH0oKTsKICAgICAgICBjb25zdCBjb21tb25fR2VuZXJhdGViZGxpbmtUYXNrID0gR2VuZXJhdGViZGxpbmtUYXNrOwogICAgICAgIHZhciBSYXBpZHVwbG9hZFRhc2sgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gUmFwaWR1cGxvYWRUYXNrKCkge30KICAgICAgICAgICAgUmFwaWR1cGxvYWRUYXNrLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdGhpcy5maWxlSW5mb0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVBhdGggPSAiIjsKICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tNb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmlzRGVmYXVsdFBhdGggPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMub25GaW5pc2ggPSBmdW5jdGlvbigpIHt9OwogICAgICAgICAgICAgICAgdGhpcy5vblByb2Nlc3MgPSBmdW5jdGlvbigpIHt9OwogICAgICAgICAgICB9OwogICAgICAgICAgICBSYXBpZHVwbG9hZFRhc2sucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja01vZGUpIHRoaXMuc2F2ZVBhdGggPSAiIjsKICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZpbGUoMCwgMCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFJhcGlkdXBsb2FkVGFzay5wcm90b3R5cGUuc2F2ZUZpbGUgPSBmdW5jdGlvbihpLCB0cnlGbGFnKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5maWxlSW5mb0xpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbmlzaCh0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5vblByb2Nlc3MoaSwgdGhpcy5maWxlSW5mb0xpc3QpOwogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICAgICAgICAgIGlmIChmaWxlLnBhdGgubWF0Y2goL1siXFxcOio/PD58XS8pIHx8IGZpbGUucGF0aCA9PT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IDIzMzM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRmlsZShpICsgMSwgMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFmaWxlLm1kNXMgfHwgZmlsZS5zaXplID4gMjE0NzQ4MzY0ODApIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm1kNSA9IGZpbGUubWQ1LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRmlsZVYyKGkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ5RmxhZykgewogICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInVzZSBVcHBlckNhc2UgbWQ1Iik7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5tZDUgPSBmaWxlLm1kNS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ1c2UgTG93ZXJDYXNlIG1kNSIpOwogICAgICAgICAgICAgICAgICAgIGZpbGUubWQ1ID0gZmlsZS5tZDUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygidXNlIHJhbmRvbUNhc2UgbWQ1Iik7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5tZDUgPSByYW5kb21TdHJpbmdUcmFuc2Zvcm0oZmlsZS5tZDUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ1c2Ugc2F2ZUZpbGUgdjIiKTsKICAgICAgICAgICAgICAgICAgICBmaWxlLm1kNSA9IGZpbGUubWQ1LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRmlsZVYyKGkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRmlsZShpICsgMSwgMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWpheCh7CiAgICAgICAgICAgICAgICAgICAgdXJsOiAiIiArIHJhcGlkX3VybCArIChiZHN0b2tlbiAmJiAiP2Jkc3Rva2VuPSIgKyBiZHN0b2tlbiksCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgZGF0YTogY29udmVydERhdGEoewogICAgICAgICAgICAgICAgICAgICAgICBydHlwZTogdGhpcy5jaGVja01vZGUgPyAzIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogdGhpcy5zYXZlUGF0aCArIGZpbGUucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQtbWQ1IjogZmlsZS5tZDUsCiAgICAgICAgICAgICAgICAgICAgICAgICJzbGljZS1tZDUiOiBmaWxlLm1kNXMudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQtbGVuZ3RoIjogZmlsZS5zaXplCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0sIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJybm8gPT09IDQwNCkgX3RoaXMuc2F2ZUZpbGUoaSwgdHJ5RmxhZyArIDEpOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IGRhdGEuZXJybm87CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNhdmVGaWxlKGkgKyAxLCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gc3RhdHVzQ29kZTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5zYXZlRmlsZShpICsgMSwgMCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFJhcGlkdXBsb2FkVGFzay5wcm90b3R5cGUuc2F2ZUZpbGVWMiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgICAgICAgICAgYWpheCh7CiAgICAgICAgICAgICAgICAgICAgdXJsOiAiIiArIGNyZWF0ZV91cmwgKyAoYmRzdG9rZW4gJiYgIiZiZHN0b2tlbj0iICsgYmRzdG9rZW4pLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgIGRhdGE6IGNvbnZlcnREYXRhKHsKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfbGlzdDogSlNPTi5zdHJpbmdpZnkoWyBmaWxlLm1kNSBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogdGhpcy5zYXZlUGF0aCArIGZpbGUucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBpc2RpcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgcnR5cGU6IHRoaXMuY2hlY2tNb2RlID8gMyA6IDAKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSwgKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gZGF0YS5lcnJubyA9PT0gMiA/IDQwNCA6IGRhdGEuZXJybm87CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGUoaSArIDEsIDApOwogICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGU7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGUoaSArIDEsIDApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gUmFwaWR1cGxvYWRUYXNrOwogICAgICAgIH0oKTsKICAgICAgICBjb25zdCBjb21tb25fUmFwaWR1cGxvYWRUYXNrID0gUmFwaWR1cGxvYWRUYXNrOwogICAgICAgIHZhciByYXBpZF91cmwgPSAiL2FwaS9yYXBpZHVwbG9hZCI7CiAgICAgICAgdmFyIGJkc3Rva2VuX3VybCA9ICIvYXBpL2dldHRlbXBsYXRldmFyaWFibGUiOwogICAgICAgIHZhciBjcmVhdGVfdXJsID0gIi9yZXN0LzIuMC94cGFuL2ZpbGU/bWV0aG9kPWNyZWF0ZSI7CiAgICAgICAgdmFyIGxpc3RfdXJsID0gIi9yZXN0LzIuMC94cGFuL211bHRpbWVkaWE/bWV0aG9kPWxpc3RhbGwmb3JkZXI9bmFtZSZsaW1pdD0xMDAwMCI7CiAgICAgICAgdmFyIG1ldGFfdXJsID0gIi9yZXN0LzIuMC94cGFuL2ZpbGU/YXBwX2lkPTc3ODc1MCZtZXRob2Q9bWV0YSZwYXRoPSI7CiAgICAgICAgdmFyIG1ldGFfdXJsMiA9ICIvcmVzdC8yLjAveHBhbi9tdWx0aW1lZGlhP21ldGhvZD1maWxlbWV0YXMmZGxpbms9MSZmc2lkcz0iOwogICAgICAgIHZhciBwY3NfdXJsID0gImh0dHBzOi8vcGNzLmJhaWR1LmNvbS9yZXN0LzIuMC9wY3MvZmlsZT9hcHBfaWQ9Nzc4NzUwJm1ldGhvZD1kb3dubG9hZCI7CiAgICAgICAgdmFyIFVBID0gIm5ldGRpc2s7Mi4yLjUxLjY7bmV0ZGlzazsxMC4wLjYzO1BDO2FuZHJvaWQtYW5kcm9pZDtRVFAvMS4wLjMyLjIiOwogICAgICAgIHZhciBpbGxlZ2FsUGF0aFBhdHRlcm4gPSAvW1xcIjoqPzw+fF0vOwogICAgICAgIHZhciBiZHN0b2tlbiA9ICIiOwogICAgICAgIGZ1bmN0aW9uIHNldGJkc3Rva2VuKG15YmRzdG9rZW4pIHsKICAgICAgICAgICAgYmRzdG9rZW4gPSBteWJkc3Rva2VuOwogICAgICAgIH0KICAgICAgICB2YXIgcmVmcmVzaExpc3QgPSBmdW5jdGlvbigpIHt9OwogICAgICAgIGZ1bmN0aW9uIHNldHJlZnJlc2hMaXN0KGZ1bmMpIHsKICAgICAgICAgICAgcmVmcmVzaExpc3QgPSBmdW5jOwogICAgICAgIH0KICAgICAgICB2YXIgc3dhbEluc3RhbmNlID0gbmV3IFN3YWxCYXNlKG5ldyBjb21tb25fUmFwaWR1cGxvYWRUYXNrLCBuZXcgY29tbW9uX0dlbmVyYXRlYmRsaW5rVGFzayk7CiAgICAgICAgdmFyIGh0bWxUYWdOZXcgPSAiZGl2Lm5kLWZpbGUtbGlzdC10b29sYmFyX19hY3Rpb25zIjsKICAgICAgICB2YXIgaHRtbFRhZ2xlZ2FjeSA9ICJkaXYudGN1TEF1IjsKICAgICAgICB2YXIgaHRtbFRhZzJsZWdhY3kgPSAiI2g1SW5wdXQwIjsKICAgICAgICB2YXIgaHRtbEJ0blJhcGlkTmV3ID0gJzxidXR0b24gaWQ9ImJkbGlua19idG4iIHN0eWxlPSJtYXJnaW4tbGVmdDogOHB4OyIgY2xhc3M9InUtYnRuIG5kLWZpbGUtbGlzdC10b29sYmFyLWFjdGlvbi1pdGVtIHUtYnRuLS1wcmltYXJ5IHUtYnRuLS1kZWZhdWx0IHUtYnRuLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiI+PGkgY2xhc3M9Imljb25mb250IGljb24tY29weSI+PC9pPjxzcGFuPuenkuS8oDwvc3Bhbj48L2J1dHRvbj4nOwogICAgICAgIHZhciBodG1sQnRuUmFwaWRsZWdhY3kgPSAnPGEgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUiIGlkPSJiZGxpbmtfYnRuIiB0aXRsZT0i56eS5Lyg6ZO+5o6lIiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyIiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZGlzayIgdGl0bGU9IuenkuS8oOmTvuaOpeaPkOWPliI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiBhdXRvOyI+56eS5Lyg6ZO+5o6lPC9zcGFuPjwvc3Bhbj48L2E+JzsKICAgICAgICB2YXIgaHRtbEJ0bkdlbmxlZ2FjeSA9ICc8YSBjbGFzcz0iZy1idXR0b24iIGlkPSJnZW5fYmRsaW5rX2J0biI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1zaGFyZSI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiBhdXRvOyI+55Sf5oiQ56eS5LygPC9zcGFuPjwvc3Bhbj48L2E+JzsKICAgICAgICBmdW5jdGlvbiBiYWlkdUVycm5vKGVycm5vKSB7CiAgICAgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKICAgICAgICAgICAgICBjYXNlIC02OgogICAgICAgICAgICAgICAgcmV0dXJuICLorqTor4HlpLHotKUo5bCd6K+V5Yi35paw6aG16Z2iKSI7CgogICAgICAgICAgICAgIGNhc2UgLTc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ+aWh+S7tuWQjemUmeivrywg5LiN6IO95ZCr5pyJ5a2X56ymXFwiOio/PD58JzsKCiAgICAgICAgICAgICAgY2FzZSAtODoKICAgICAgICAgICAgICAgIHJldHVybiAi6Lev5b6E5LiL5a2Y5Zyo5ZCM5ZCN5paH5Lu2IjsKCiAgICAgICAgICAgICAgY2FzZSA0MDA6CiAgICAgICAgICAgICAgICByZXR1cm4gIuivt+axgumUmeivryjlsJ3or5Xkvb/nlKjmnIDmlrDniYhDaHJvbWXmtY/op4jlmagv5pu05paw5rK554y05o+S5Lu2KSI7CgogICAgICAgICAgICAgIGNhc2UgNDAzOgogICAgICAgICAgICAgICAgcmV0dXJuICfmjqXlj6PpmZDliLborr/pl64o6K+35Y+C6ICDPGEgaHJlZj0iJyArIGRvYy5zaGFyZURvYyArICciICcgKyBsaW5rU3R5bGUgKyAiPuWIhuS6q+aVmeeoizwvYT4pIjsKCiAgICAgICAgICAgICAgY2FzZSA0MDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJ+enkuS8oOacqueUn+aViCjor7flj4LogIM8YSBocmVmPSInICsgZG9jLnNoYXJlRG9jICsgJyIgJyArIGxpbmtTdHlsZSArICI+5YiG5Lqr5pWZ56iLPC9hPikiOwoKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICByZXR1cm4gIui9rOWtmOWksei0pSjlsJ3or5XliLfmlrDpobXpnaIv5L+u5pS55paH5Lu25ZCN5oiW6L2s5a2Y6Lev5b6EKSI7CgogICAgICAgICAgICAgIGNhc2UgMjMzMzoKICAgICAgICAgICAgICAgIHJldHVybiAn5paH5Lu25ZCN6ZSZ6K+vLCDkuI3og73lkKvmnInlrZfnrKZcXCI6Kj88PnwsIOS4lOS4jeiDveaYryIvIijnqbrmlofku7blkI0pJzsKCiAgICAgICAgICAgICAgY2FzZSAtMTA6CiAgICAgICAgICAgICAgICByZXR1cm4gIue9keebmOWuuemHj+W3sua7oSI7CgogICAgICAgICAgICAgIGNhc2UgNTE0OgogICAgICAgICAgICAgICAgcmV0dXJuICLor7fmsYLlpLHotKUo5bCd6K+V5L2/55So5pyA5paw54mIQ2hyb21l5rWP6KeI5ZmoL+abtOaWsOayueeMtOaPkuS7tikiOwoKICAgICAgICAgICAgICBjYXNlIDE5MTk6CiAgICAgICAgICAgICAgICByZXR1cm4gJ+aWh+S7tuW3suiiq+WSjOiwkCjor7flj4LogIM8YSBocmVmPSInICsgZG9jLnNoYXJlRG9jICsgJyIgJyArIGxpbmtTdHlsZSArICI+5YiG5Lqr5pWZ56iLPC9hPikiOwoKICAgICAgICAgICAgICBjYXNlIDk5NjoKICAgICAgICAgICAgICAgIHJldHVybiAnbWQ16I635Y+W5aSx6LSlKOivt+WPguiAgzxhIGhyZWY9IicgKyBkb2Muc2hhcmVEb2MgKyAnIiAnICsgbGlua1N0eWxlICsgIj7liIbkuqvmlZnnqIs8L2E+KSI7CgogICAgICAgICAgICAgIGNhc2UgNTAwOgogICAgICAgICAgICAgIGNhc2UgNTAyOgogICAgICAgICAgICAgIGNhc2UgNTAzOgogICAgICAgICAgICAgICAgcmV0dXJuICfmnI3liqHlmajplJnor68o6K+35Y+C6ICDPGEgaHJlZj0iJyArIGRvYy5zaGFyZURvYyArICciICcgKyBsaW5rU3R5bGUgKyAiPuWIhuS6q+aVmeeoizwvYT4pIjsKCiAgICAgICAgICAgICAgY2FzZSA5MDk6CiAgICAgICAgICAgICAgICByZXR1cm4gIui3r+W+hOS4jeWtmOWcqCI7CgogICAgICAgICAgICAgIGNhc2UgOTAwOgogICAgICAgICAgICAgICAgcmV0dXJuICLot6/lvoTkuLrmlofku7blpLksIOS4jeaUr+aMgeeUn+aIkOenkuS8oCI7CgogICAgICAgICAgICAgIGNhc2UgOTAxOgogICAgICAgICAgICAgICAgcmV0dXJuICLljIXlkKvnmoTmlofku7bmlbDph4/otoXlh7rpmZDliLYoMXfkuKopIjsKCiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAi5pyq55+l6ZSZ6K+vIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpbnN0YWxsTmV3KCkgewogICAgICAgICAgICBqUXVlcnkoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCIlcyBET03mlrnlvI/lronoo4XvvIzoi6XlpLHmlYjor7fmiqXlkYrjgIIiLCBUQUcpOwogICAgICAgICAgICAgICAgJChodG1sVGFnTmV3KS5hcHBlbmQoaHRtbEJ0blJhcGlkTmV3KTsKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjYmRsaW5rX2J0biIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzd2FsSW5zdGFuY2UuaW5wdXRWaWV3KCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0U3lzdGVtQ29udGV4dCgpIHsKICAgICAgICAgICAgcmV0dXJuIHVuc2FmZVdpbmRvdy5yZXF1aXJlKCJzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMiKS5pbnN0YW5jZUZvclN5c3RlbTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYWRkR2VuQnRuKCkgewogICAgICAgICAgICB2YXIgbGlzdFRvb2xzID0gZ2V0U3lzdGVtQ29udGV4dCgpLkJyb2tlci5nZXRCdXR0b25Ccm9rZXIoImxpc3RUb29scyIpOwogICAgICAgICAgICBpZiAobGlzdFRvb2xzICYmIGxpc3RUb29scy4kYm94KSAkKGxpc3RUb29scy4kYm94KS5jaGlsZHJlbigiZGl2IikuYWZ0ZXIoaHRtbEJ0bkdlbmxlZ2FjeSk7IGVsc2Ugc2V0VGltZW91dChhZGRHZW5CdG4sIDMwMCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFkZEJ0bigpIHsKICAgICAgICAgICAgaWYgKCQoaHRtbFRhZ2xlZ2FjeSkubGVuZ3RoICYmICQoaHRtbFRhZzJsZWdhY3kpLmxlbmd0aCkgJChodG1sVGFnbGVnYWN5KS5hcHBlbmQoaHRtbEJ0blJhcGlkbGVnYWN5KTsgZWxzZSBzZXRUaW1lb3V0KGFkZEJ0biwgMTAwKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5zdGFsbGxlZ2FjeSgpIHsKICAgICAgICAgICAgalF1ZXJ5KChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygiJXMgRE9N5pa55byP5a6J6KOF77yM6Iul5aSx5pWI6K+35oql5ZGK44CCIiwgVEFHKTsKICAgICAgICAgICAgICAgIGFkZEJ0bigpOwogICAgICAgICAgICAgICAgYWRkR2VuQnRuKCk7CiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2JkbGlua19idG4iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgc3dhbEluc3RhbmNlLmlucHV0VmlldygpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNnZW5fYmRsaW5rX2J0biIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzd2FsSW5zdGFuY2UuZ2VuZXJhdGViZGxpbmtUYXNrLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgc3dhbEluc3RhbmNlLmNoZWNrVW5maW5pc2goKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBsb2FkZXJCYWlkdSgpIHsKICAgICAgICAgICAgZ2V0YmRzdG9rZW4oKTsKICAgICAgICAgICAgaWYgKGxvY1VybC5pbmRleE9mKGJhaWR1TmV3UGFnZSkgIT09IC0xKSB7CiAgICAgICAgICAgICAgICBzd2FsSW5zdGFuY2Uuc3dhbEFyZ3MgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0QXV0bzogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzZXRyZWZyZXNoTGlzdCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICBpbnN0YWxsTmV3KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRyZWZyZXNoTGlzdCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zYWZlV2luZG93LnJlcXVpcmUoInN5c3RlbS1jb3JlOnN5c3RlbS9iYXNlU2VydmljZS9tZXNzYWdlL21lc3NhZ2UuanMiKS50cmlnZ2VyKCJzeXN0ZW0tcmVmcmVzaCIpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgaW5zdGFsbGxlZ2FjeSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBiZGxpbmsgPSBpbml0UXVlcnlMaW5rKCk7CiAgICAgICAgICAgIGlmIChiZGxpbmspIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoewogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBiZGxpbmsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghR01fZ2V0VmFsdWUodXBkYXRlSW5mb1ZlciArICJfbm9fZmlyc3QiKSkgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBzd2FsSW5zdGFuY2UudXBkYXRlSW5mbygoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUodXBkYXRlSW5mb1ZlciArICJfbm9fZmlyc3QiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2tpbGxfZG9uYXRlIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoZmVlZGJhY2tWZXIgKyAiX2tpbGxfZG9uYXRlIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkKCIjbXpmX2RvbmF0ZSIpLnJlbW92ZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIja2lsbF9mZWVkYmFjayIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKGRvbmF0ZVZlciArICJfa2lsbF9mZWVkYmFjayIsIHRydWUpOwogICAgICAgICAgICAgICAgJCgiI216Zl9mZWVkYmFjayIpLnJlbW92ZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY2hlY2tfbWQ1X2J0biIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHN3YWxJbnN0YW5jZS5jaGVja01kNSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHZhciBjaGVja0JveCA9IF9fd2VicGFja19yZXF1aXJlX18oNzIyKTsKICAgICAgICB2YXIgY2hlY2tCb3hfZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihjaGVja0JveCk7CiAgICAgICAgdmFyIGFwcCA9IF9fd2VicGFja19yZXF1aXJlX18oNDE5KTsKICAgICAgICB2YXIgYXBwX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oYXBwKTsKICAgICAgICBmdW5jdGlvbiBpbmplY3RTdHlsZSgpIHsKICAgICAgICAgICAgR01fYWRkU3R5bGUoYXBwX2RlZmF1bHQoKSk7CiAgICAgICAgICAgIEdNX2FkZFN0eWxlKGNoZWNrQm94X2RlZmF1bHQoKSk7CiAgICAgICAgICAgIHZhciBzd2FsVGhlbWVzID0gR01fZ2V0VmFsdWUoInN3YWxUaGVtZXMiKSB8fCAiRGVmYXVsdCI7CiAgICAgICAgICAgIHZhciBkZWZhdWx0VGhlbWVzID0gR01fZ2V0UmVzb3VyY2VUZXh0KCJzd2FsQ3NzIik7CiAgICAgICAgICAgIGlmIChzd2FsVGhlbWVzID09PSAiRGVmYXVsdCIpIHsKICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VGhlbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgR01fYWRkU3R5bGUoZGVmYXVsdFRoZW1lcyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdldFRoZW1lc0Nzcyhzd2FsVGhlbWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgVGhlbWVzQ3NzID0gR01fZ2V0VmFsdWUoIiIgKyBzd2FsQ3NzVmVyICsgc3dhbFRoZW1lcyk7CiAgICAgICAgICAgIGlmIChUaGVtZXNDc3MpIHsKICAgICAgICAgICAgICAgIEdNX2FkZFN0eWxlKFRoZW1lc0Nzcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBnZXRUaGVtZXNDc3Moc3dhbFRoZW1lcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXRUaGVtZXNDc3Moc3dhbFRoZW1lcykgewogICAgICAgICAgICBhamF4KHsKICAgICAgICAgICAgICAgIHVybDogZXh0Q3NzVXJsW3N3YWxUaGVtZXNdLAogICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIgogICAgICAgICAgICB9LCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgdmFyIFRoZW1lc0NzcyA9IGRhdGEucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgaWYgKFRoZW1lc0Nzcy5sZW5ndGggPCAxMDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzd2FsVGhlbWVzICsgIiBJbnZhbGlkQ3NzOlxuIiArIFRoZW1lc0Nzcyk7CiAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0KGFwcEVycm9yLlN3YWxDc3NJbnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiIiArIHN3YWxDc3NWZXIgKyBzd2FsVGhlbWVzLCBUaGVtZXNDc3MpOwogICAgICAgICAgICAgICAgR01fYWRkU3R5bGUoVGhlbWVzQ3NzKTsKICAgICAgICAgICAgfSksIChmdW5jdGlvbihzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgICAgICBzaG93QWxlcnQoYXBwRXJyb3IuU3dhbENzc0VyclJlcSArICgiKGh0dHAjIiArIHN0YXR1c0NvZGUgKyAiKSIpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhcHBfYXBwKCkgewogICAgICAgICAgICBpZiAoWyB0eXBlb2YgQmFzZTY0LCB0eXBlb2YgJCwgdHlwZW9mIFNwYXJrTUQ1LCB0eXBlb2YgU3dhbCBdLmluZGV4T2YoInVuZGVmaW5lZCIpICE9PSAtMSkgc2hvd0FsZXJ0KGFwcEVycm9yLm1pc3NEZXBlbmQpOyBlbHNlIHsKICAgICAgICAgICAgICAgIEJhc2U2NC5leHRlbmRTdHJpbmcoKTsKICAgICAgICAgICAgICAgIGluamVjdFN0eWxlKCk7CiAgICAgICAgICAgICAgICBsb2FkZXJCYWlkdSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGFwcF9hcHAoKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CiAgICAgICAgfQogICAgfSkoKTsKfSkoKTs=","resources":[{"meta":{"name":"sweetalert2.min.css","url":"https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css","ts":1637743635602,"mimetype":"text/css"},"source":"LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLWNvbHVtbjoxLzQhaW1wb3J0YW50O2dyaWQtcm93OjEvNCFpbXBvcnRhbnQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciA5OWZyIDFmcjtwYWRkaW5nOjFlbTtvdmVyZmxvdy15OmhpZGRlbjtiYWNrZ3JvdW5kOiNmZmY7Ym94LXNoYWRvdzowIDAgMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAxcHggMnB4IHJnYmEoMCwwLDAsLjA3NSksMXB4IDJweCA0cHggcmdiYSgwLDAsMCwuMDc1KSwxcHggM3B4IDhweCByZ2JhKDAsMCwwLC4wNzUpLDJweCA0cHggMTZweCByZ2JhKDAsMCwwLC4wNzUpO3BvaW50ZXItZXZlbnRzOmFsbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Q+KntncmlkLWNvbHVtbjoyfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItdGl0bGV7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtmb250LXNpemU6MWVtO3RleHQtYWxpZ246aW5pdGlhbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRpbmd7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWlucHV0e2hlaWdodDoyZW07bWFyZ2luOi41ZW07Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItZm9vdGVye21hcmdpbjouNWVtIDAgMDtwYWRkaW5nOi41ZW0gMCAwO2ZvbnQtc2l6ZTouOGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItY2xvc2V7Z3JpZC1jb2x1bW46My8zO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6LjhlbTtoZWlnaHQ6LjhlbTttYXJnaW46MDtmb250LXNpemU6MmVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaHRtbC1jb250YWluZXJ7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtmb250LXNpemU6MWVtO3RleHQtYWxpZ246aW5pdGlhbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWh0bWwtY29udGFpbmVyOmVtcHR5e3BhZGRpbmc6MH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRlcntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOi4yNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO21pbi13aWR0aDoyZW07aGVpZ2h0OjJlbTttYXJnaW46MCAuNWVtIDAgMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZToxLjhlbTtmb250LXdlaWdodDo3MDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV17dG9wOi44NzVlbTt3aWR0aDoxLjM3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0Oi4zMTI1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1hY3Rpb25ze2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2hlaWdodDphdXRvO21hcmdpbjowO21hcmdpbi10b3A6LjVlbTtwYWRkaW5nOjAgLjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN0eWxlZHttYXJnaW46LjI1ZW0gLjVlbTtwYWRkaW5nOi40ZW0gLjZlbTtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Nn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEuNmVtO2hlaWdodDozZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0uOGVtO2xlZnQ6LS41ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MmVtIDJlbTtib3JkZXItcmFkaXVzOjRlbSAwIDAgNGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPXJpZ2h0XXt0b3A6LS4yNWVtO2xlZnQ6LjkzNzVlbTt0cmFuc2Zvcm0tb3JpZ2luOjAgMS41ZW07Ym9yZGVyLXJhZGl1czowIDRlbSA0ZW0gMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3RvcDowO2xlZnQ6LjQzNzVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDoyLjY4NzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2hlaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDouOTM3NWVtO3JpZ2h0Oi4xODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1zaG93IC41czthbmltYXRpb246c3dhbDItdG9hc3Qtc2hvdyAuNXN9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0LnN3YWwyLWhpZGV7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3QtaGlkZSAuMXMgZm9yd2FyZHM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWhpZGUgLjFzIGZvcndhcmRzfS5zd2FsMi1jb250YWluZXJ7ZGlzcGxheTpncmlkO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTA2MDt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Z3JpZC10ZW1wbGF0ZS1hcmVhczoidG9wLXN0YXJ0ICAgICB0b3AgICAgICAgICAgICB0b3AtZW5kIiAiY2VudGVyLXN0YXJ0ICBjZW50ZXIgICAgICAgICBjZW50ZXItZW5kIiAiYm90dG9tLXN0YXJ0ICBib3R0b20tY2VudGVyICBib3R0b20tZW5kIjtncmlkLXRlbXBsYXRlLXJvd3M6bWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0bykgbWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0bykgbWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0byk7Z3JpZC10ZW1wbGF0ZS1yb3dzOm1pbm1heChtaW4tY29udGVudCxhdXRvKSBtaW5tYXgobWluLWNvbnRlbnQsYXV0bykgbWlubWF4KG1pbi1jb250ZW50LGF1dG8pO2hlaWdodDoxMDAlO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93LXg6aGlkZGVuO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXM7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1iYWNrZHJvcC1zaG93LC5zd2FsMi1jb250YWluZXIuc3dhbDItbm9hbmltYXRpb257YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC40KX0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJhY2tkcm9wLWhpZGV7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50fS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0e2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxZnIpIGF1dG8gYXV0b30uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbSwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlciwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6YXV0byBtaW5tYXgoMCwxZnIpIGF1dG99LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gYXV0byBtaW5tYXgoMCwxZnIpfS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0Pi5zd2FsMi1wb3B1cHthbGlnbi1zZWxmOnN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wPi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoyO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQ+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjozO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0Pi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydD4uc3dhbDItcG9wdXB7Z3JpZC1yb3c6MjthbGlnbi1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlcj4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdD4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjE7Z3JpZC1yb3c6MzthbGlnbi1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbT4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzozO2p1c3RpZnktc2VsZjpjZW50ZXI7YWxpZ24tc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzozO2FsaWduLXNlbGY6ZW5kO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWZ1bGxzY3JlZW4+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1yb3c+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjEvNDt3aWR0aDoxMDAlfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1mdWxsc2NyZWVuPi5zd2FsMi1wb3B1cHtncmlkLXJvdzoxLzQ7YWxpZ24tc2VsZjpzdHJldGNofS5zd2FsMi1jb250YWluZXIuc3dhbDItbm8tdHJhbnNpdGlvbnt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50fS5zd2FsMi1wb3B1cHtkaXNwbGF5Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxMDAlKTt3aWR0aDozMmVtO21heC13aWR0aDoxMDAlO3BhZGRpbmc6MCAwIDEuMjVlbTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzU0NTQ1NDtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZToxcmVtfS5zd2FsMi1wb3B1cDpmb2N1c3tvdXRsaW5lOjB9LnN3YWwyLXBvcHVwLnN3YWwyLWxvYWRpbmd7b3ZlcmZsb3cteTpoaWRkZW59LnN3YWwyLXRpdGxle3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO21hcmdpbjowO3BhZGRpbmc6LjhlbSAxZW0gMDtjb2xvcjojNTk1OTU5O2ZvbnQtc2l6ZToxLjg3NWVtO2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXRyYW5zZm9ybTpub25lO3dvcmQtd3JhcDpicmVhay13b3JkfS5zd2FsMi1hY3Rpb25ze2Rpc3BsYXk6ZmxleDt6LWluZGV4OjE7Ym94LXNpemluZzpib3JkZXItYm94O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOmF1dG87bWFyZ2luOjEuMjVlbSBhdXRvIDA7cGFkZGluZzowfS5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZFtkaXNhYmxlZF17b3BhY2l0eTouNH0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWQ6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwuMSkscmdiYSgwLDAsMCwuMSkpfS5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZDphY3RpdmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwuMikscmdiYSgwLDAsMCwuMikpfS5zd2FsMi1sb2FkZXJ7ZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjIuMmVtO2hlaWdodDoyLjJlbTttYXJnaW46MCAxLjg3NWVtOy13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDthbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2JvcmRlci13aWR0aDouMjVlbTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czoxMDAlO2JvcmRlci1jb2xvcjojMjc3OGM0IHRyYW5zcGFyZW50ICMyNzc4YzQgdHJhbnNwYXJlbnR9LnN3YWwyLXN0eWxlZHttYXJnaW46LjMxMjVlbTtwYWRkaW5nOi42MjVlbSAxLjFlbTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzO2JveC1zaGFkb3c6MCAwIDAgM3B4IHRyYW5zcGFyZW50O2ZvbnQtd2VpZ2h0OjUwMH0uc3dhbDItc3R5bGVkOm5vdChbZGlzYWJsZWRdKXtjdXJzb3I6cG9pbnRlcn0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm17Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojNzM2N2YwO2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm06Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAzcHggcmdiYSgxMTUsMTAzLDI0MCwuNSl9LnN3YWwyLXN0eWxlZC5zd2FsMi1kZW55e2JvcmRlcjowO2JvcmRlci1yYWRpdXM6LjI1ZW07YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6I2VhNTQ1NTtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXN0eWxlZC5zd2FsMi1kZW55OmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMjM0LDg0LDg1LC41KX0uc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbHtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiM2ZTdkODg7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfS5zd2FsMi1zdHlsZWQuc3dhbDItY2FuY2VsOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTEwLDEyNSwxMzYsLjUpfS5zd2FsMi1zdHlsZWQuc3dhbDItZGVmYXVsdC1vdXRsaW5lOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1zdHlsZWQ6Zm9jdXN7b3V0bGluZTowfS5zd2FsMi1zdHlsZWQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9LnN3YWwyLWZvb3RlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxZW0gMCAwO3BhZGRpbmc6MWVtIDFlbSAwO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWU7Y29sb3I6IzU0NTQ1NDtmb250LXNpemU6MWVtfS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2dyaWQtY29sdW1uOmF1dG8haW1wb3J0YW50O2hlaWdodDouMjVlbTtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NXB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NXB4fS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7d2lkdGg6MTAwJTtoZWlnaHQ6LjI1ZW07YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4yKX0uc3dhbDItaW1hZ2V7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjJlbSBhdXRvIDFlbX0uc3dhbDItY2xvc2V7ei1pbmRleDoyO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjEuMmVtO2hlaWdodDoxLjJlbTttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWJvdHRvbTotMS4yZW07cGFkZGluZzowO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOmNvbG9yIC4xcyxib3gtc2hhZG93IC4xcztib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojY2NjO2ZvbnQtZmFtaWx5OnNlcmlmO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6Mi41ZW07Y3Vyc29yOnBvaW50ZXI7anVzdGlmeS1zZWxmOmVuZH0uc3dhbDItY2xvc2U6aG92ZXJ7dHJhbnNmb3JtOm5vbmU7YmFja2dyb3VuZDowIDA7Y29sb3I6I2YyNzQ3NH0uc3dhbDItY2xvc2U6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1jbG9zZTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uc3dhbDItaHRtbC1jb250YWluZXJ7ei1pbmRleDoxO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSAxLjZlbSAuM2VtO3BhZGRpbmc6MDtvdmVyZmxvdzphdXRvO2NvbG9yOiM1NDU0NTQ7Zm9udC1zaXplOjEuMTI1ZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcjt3b3JkLXdyYXA6YnJlYWstd29yZDt3b3JkLWJyZWFrOmJyZWFrLXdvcmR9LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItcmFkaW8sLnN3YWwyLXNlbGVjdCwuc3dhbDItdGV4dGFyZWF7bWFyZ2luOjFlbSAyZW0gMH0uc3dhbDItZmlsZSwuc3dhbDItaW5wdXQsLnN3YWwyLXRleHRhcmVhe2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDphdXRvO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyxib3gtc2hhZG93IC4xcztib3JkZXI6MXB4IHNvbGlkICNkOWQ5ZDk7Ym9yZGVyLXJhZGl1czouMTg3NWVtO2JhY2tncm91bmQ6aW5oZXJpdDtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNiksMCAwIDAgM3B4IHRyYW5zcGFyZW50O2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLWZpbGUuc3dhbDItaW5wdXRlcnJvciwuc3dhbDItaW5wdXQuc3dhbDItaW5wdXRlcnJvciwuc3dhbDItdGV4dGFyZWEuc3dhbDItaW5wdXRlcnJvcntib3JkZXItY29sb3I6I2YyNzQ3NCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMnB4ICNmMjc0NzQhaW1wb3J0YW50fS5zd2FsMi1maWxlOmZvY3VzLC5zd2FsMi1pbnB1dDpmb2N1cywuc3dhbDItdGV4dGFyZWE6Zm9jdXN7Ym9yZGVyOjFweCBzb2xpZCAjYjRkYmVkO291dGxpbmU6MDtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNiksMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1maWxlOjotbW96LXBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6LW1vei1wbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItZmlsZTotbXMtaW5wdXQtcGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNjY2N9LnN3YWwyLWZpbGU6OnBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6cGxhY2Vob2xkZXIsLnN3YWwyLXRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1yYW5nZXttYXJnaW46MWVtIDJlbSAwO2JhY2tncm91bmQ6I2ZmZn0uc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6ODAlfS5zd2FsMi1yYW5nZSBvdXRwdXR7d2lkdGg6MjAlO2NvbG9yOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1yYW5nZSBpbnB1dCwuc3dhbDItcmFuZ2Ugb3V0cHV0e2hlaWdodDoyLjYyNWVtO3BhZGRpbmc6MDtmb250LXNpemU6MS4xMjVlbTtsaW5lLWhlaWdodDoyLjYyNWVtfS5zd2FsMi1pbnB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjAgLjc1ZW19LnN3YWwyLWZpbGV7d2lkdGg6NzUlO21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG87YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi10ZXh0YXJlYXtoZWlnaHQ6Ni43NWVtO3BhZGRpbmc6Ljc1ZW19LnN3YWwyLXNlbGVjdHttaW4td2lkdGg6NTAlO21heC13aWR0aDoxMDAlO3BhZGRpbmc6LjM3NWVtIC42MjVlbTtiYWNrZ3JvdW5kOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3gsLnN3YWwyLXJhZGlve2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjppbmhlcml0fS5zd2FsMi1jaGVja2JveCBsYWJlbCwuc3dhbDItcmFkaW8gbGFiZWx7bWFyZ2luOjAgLjZlbTtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3ggaW5wdXQsLnN3YWwyLXJhZGlvIGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX0uc3dhbDItaW5wdXQtbGFiZWx7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSBhdXRvIDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIDAgMDtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojZjBmMGYwO2NvbG9yOiM2NjY7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDozMDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZTo6YmVmb3Jle2NvbnRlbnQ6IiEiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEuNWVtO21pbi13aWR0aDoxLjVlbTtoZWlnaHQ6MS41ZW07bWFyZ2luOjAgLjYyNWVtO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NDtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjYwMDtsaW5lLWhlaWdodDoxLjVlbTt0ZXh0LWFsaWduOmNlbnRlcn0uc3dhbDItaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6NWVtO2hlaWdodDo1ZW07bWFyZ2luOjIuNWVtIGF1dG8gLjZlbTtib3JkZXI6LjI1ZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyLWNvbG9yOiMwMDA7Zm9udC1mYW1pbHk6aW5oZXJpdDtsaW5lLWhlaWdodDo1ZW07Y3Vyc29yOmRlZmF1bHQ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lfS5zd2FsMi1pY29uIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6My43NWVtfS5zd2FsMi1pY29uLnN3YWwyLWVycm9ye2JvcmRlci1jb2xvcjojZjI3NDc0O2NvbG9yOiNmMjc0NzR9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgLnN3YWwyLXgtbWFya3twb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LWdyb3c6MX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoyLjMxMjVlbTt3aWR0aDoyLjkzNzVlbTtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzR9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6MS4wNjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDoxZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yLnN3YWwyLWljb24tc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yLnN3YWwyLWljb24tc2hvdyAuc3dhbDIteC1tYXJrey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrIC41czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzfS5zd2FsMi1pY29uLnN3YWwyLXdhcm5pbmd7Ym9yZGVyLWNvbG9yOiNmYWNlYTg7Y29sb3I6I2Y4YmI4Nn0uc3dhbDItaWNvbi5zd2FsMi13YXJuaW5nLnN3YWwyLWljb24tc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfS5zd2FsMi1pY29uLnN3YWwyLXdhcm5pbmcuc3dhbDItaWNvbi1zaG93IC5zd2FsMi1pY29uLWNvbnRlbnR7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1pLW1hcmsgLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItaW5mb3tib3JkZXItY29sb3I6IzlkZTBmNjtjb2xvcjojM2ZjM2VlfS5zd2FsMi1pY29uLnN3YWwyLWluZm8uc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItaW5mby5zd2FsMi1pY29uLXNob3cgLnN3YWwyLWljb24tY29udGVudHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuOHM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtaS1tYXJrIC44c30uc3dhbDItaWNvbi5zd2FsMi1xdWVzdGlvbntib3JkZXItY29sb3I6I2M5ZGFlMTtjb2xvcjojODdhZGJkfS5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9uLnN3YWwyLWljb24tc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfS5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9uLnN3YWwyLWljb24tc2hvdyAuc3dhbDItaWNvbi1jb250ZW50ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFyayAuOHM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFyayAuOHN9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Njtjb2xvcjojYTVkYzg2fS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjMuNzVlbTtoZWlnaHQ6Ny41ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPWxlZnRde3RvcDotLjQzNzVlbTtsZWZ0Oi0yLjA2MzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjozLjc1ZW0gMy43NWVtO2JvcmRlci1yYWRpdXM6Ny41ZW0gMCAwIDcuNWVtfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1yaWdodF17dG9wOi0uNjg3NWVtO2xlZnQ6MS44NzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjowIDMuNzVlbTtib3JkZXItcmFkaXVzOjAgNy41ZW0gNy41ZW0gMH0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO3RvcDotLjI1ZW07bGVmdDotLjI1ZW07Ym94LXNpemluZzpjb250ZW50LWJveDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjouMjVlbSBzb2xpZCByZ2JhKDE2NSwyMjAsMTM0LC4zKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLWZpeHtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7dG9wOi41ZW07bGVmdDoxLjYyNWVtO3dpZHRoOi40Mzc1ZW07aGVpZ2h0OjUuNjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2E1ZGM4Nn0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6Mi44NzVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDoyLjM3NWVtO3JpZ2h0Oi41ZW07d2lkdGg6Mi45Mzc1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmd7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXN9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lIDQuMjVzIGVhc2UtaW47YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmUgNC4yNXMgZWFzZS1pbn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHN7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO21heC13aWR0aDoxMDAlO21hcmdpbjoxLjI1ZW0gYXV0bztwYWRkaW5nOjA7YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtd2VpZ2h0OjYwMH0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwe3otaW5kZXg6MjA7ZmxleC1zaHJpbms6MDt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjJlbTtiYWNrZ3JvdW5kOiMyNzc4YzQ7Y29sb3I6I2ZmZjtsaW5lLWhlaWdodDoyZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwe2JhY2tncm91bmQ6IzI3NzhjNH0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB+LnN3YWwyLXByb2dyZXNzLXN0ZXB7YmFja2dyb3VuZDojYWRkOGU2O2NvbG9yOiNmZmZ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7YmFja2dyb3VuZDojYWRkOGU2fS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC1saW5le3otaW5kZXg6MTA7ZmxleC1zaHJpbms6MDt3aWR0aDoyLjVlbTtoZWlnaHQ6LjRlbTttYXJnaW46MCAtMXB4O2JhY2tncm91bmQ6IzI3NzhjNH1bY2xhc3NePXN3YWwyXXstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LnN3YWwyLXNob3d7LXdlYmtpdC1hbmltYXRpb246c3dhbDItc2hvdyAuM3M7YW5pbWF0aW9uOnN3YWwyLXNob3cgLjNzfS5zd2FsMi1oaWRley13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWhpZGUgLjE1cyBmb3J3YXJkczthbmltYXRpb246c3dhbDItaGlkZSAuMTVzIGZvcndhcmRzfS5zd2FsMi1ub2FuaW1hdGlvbnt0cmFuc2l0aW9uOm5vbmV9LnN3YWwyLXNjcm9sbGJhci1tZWFzdXJle3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6c2Nyb2xsfS5zd2FsMi1ydGwgLnN3YWwyLWNsb3Nle21hcmdpbi1yaWdodDppbml0aWFsO21hcmdpbi1sZWZ0OjB9LnN3YWwyLXJ0bCAuc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFye3JpZ2h0OjA7bGVmdDphdXRvfUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtaGlkZXsxMDAle3RyYW5zZm9ybTpyb3RhdGVaKDFkZWcpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6LjU2MjVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOi4xMjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6LjYyNWVtO2xlZnQ6LS4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotLjI1ZW07d2lkdGg6MS42MjVlbX04NCV7dG9wOjEuMDYyNWVtO2xlZnQ6Ljc1ZW07d2lkdGg6LjVlbX0xMDAle3RvcDoxLjEyNWVtO2xlZnQ6LjE4NzVlbTt3aWR0aDouNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06c2NhbGUoLjcpfTQ1JXt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9ODAle3RyYW5zZm9ybTpzY2FsZSguOTUpfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHN3YWwyLXNob3d7MCV7dHJhbnNmb3JtOnNjYWxlKC43KX00NSV7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXt0cmFuc2Zvcm06c2NhbGUoLjk1KX0xMDAle3RyYW5zZm9ybTpzY2FsZSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDoxLjE4NzVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOjEuMDYyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDoyLjE4NzVlbTtsZWZ0Oi0uMzc1ZW07d2lkdGg6My4xMjVlbX04NCV7dG9wOjNlbTtsZWZ0OjEuMzEyNWVtO3dpZHRoOjEuMDYyNWVtfTEwMCV7dG9wOjIuODEyNWVtO2xlZnQ6LjgxMjVlbTt3aWR0aDoxLjU2MjVlbX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOjEuMTg3NWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6MS4wNjI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOjIuMTg3NWVtO2xlZnQ6LS4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9NjUle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH04NCV7dG9wOjIuMTg3NWVtO3JpZ2h0OjA7d2lkdGg6My40Mzc1ZW19MTAwJXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTUle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0xMiV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9fUBrZXlmcmFtZXMgc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZXswJXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH01MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTgwJXttYXJnaW4tdG9wOi0uMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmt7MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTUwJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LS4zNzVlbTt0cmFuc2Zvcm06c2NhbGUoMS4xNSl9MTAwJXttYXJnaW4tdG9wOjA7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbnswJXt0cmFuc2Zvcm06cm90YXRlWCgxMDBkZWcpO29wYWNpdHk6MH0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLWljb257MCV7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9MTAwJXt0cmFuc2Zvcm06cm90YXRlWCgwKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1yb3RhdGUtbG9hZGluZ3swJXt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXF1ZXN0aW9uLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVkoLTM2MGRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlWSgwKX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXF1ZXN0aW9uLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVkoLTM2MGRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlWSgwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtaS1tYXJrezAle3RyYW5zZm9ybTpyb3RhdGVaKDQ1ZGVnKTtvcGFjaXR5OjB9MjUle3RyYW5zZm9ybTpyb3RhdGVaKC0yNWRlZyk7b3BhY2l0eTouNH01MCV7dHJhbnNmb3JtOnJvdGF0ZVooMTVkZWcpO29wYWNpdHk6Ljh9NzUle3RyYW5zZm9ybTpyb3RhdGVaKC01ZGVnKTtvcGFjaXR5OjF9MTAwJXt0cmFuc2Zvcm06cm90YXRlWCgwKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1pLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpO29wYWNpdHk6MH0yNSV7dHJhbnNmb3JtOnJvdGF0ZVooLTI1ZGVnKTtvcGFjaXR5Oi40fTUwJXt0cmFuc2Zvcm06cm90YXRlWigxNWRlZyk7b3BhY2l0eTouOH03NSV7dHJhbnNmb3JtOnJvdGF0ZVooLTVkZWcpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKXtvdmVyZmxvdzpoaWRkZW59Ym9keS5zd2FsMi1oZWlnaHQtYXV0b3toZWlnaHQ6YXV0byFpbXBvcnRhbnR9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOm5vbmV9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyIC5zd2FsMi1wb3B1cHtwb2ludGVyLWV2ZW50czphbGx9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyIC5zd2FsMi1tb2RhbHtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsLjQpfUBtZWRpYSBwcmludHtib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pe292ZXJmbG93LXk6c2Nyb2xsIWltcG9ydGFudH1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pPlthcmlhLWhpZGRlbj10cnVlXXtkaXNwbGF5Om5vbmV9Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKSAuc3dhbDItY29udGFpbmVye3Bvc2l0aW9uOnN0YXRpYyFpbXBvcnRhbnR9fWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lcntib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MzYwcHg7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtwb2ludGVyLWV2ZW50czpub25lfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7dG9wOjA7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0e3RvcDowO3JpZ2h0OjA7Ym90dG9tOmF1dG87bGVmdDphdXRvfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtbGVmdCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0e3RvcDowO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDowfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItbGVmdCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0e3RvcDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlcnt0b3A6NTAlO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHR7dG9wOjUwJTtyaWdodDowO2JvdHRvbTphdXRvO2xlZnQ6YXV0bzt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1zdGFydHt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTowO2xlZnQ6MH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodHt0b3A6YXV0bztyaWdodDowO2JvdHRvbTowO2xlZnQ6YXV0b30="}],"requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js","ts":1637743635893,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My42LjAgfCAoYykgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiB0KGUpfTp0KGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihDLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPXQuc2xpY2UsZz10LmZsYXQ/ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25jYXQuYXBwbHkoW10sZSl9LHU9dC5wdXNoLGk9dC5pbmRleE9mLG49e30sbz1uLnRvU3RyaW5nLHY9bi5oYXNPd25Qcm9wZXJ0eSxhPXYudG9TdHJpbmcsbD1hLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJudW1iZXIiIT10eXBlb2YgZS5ub2RlVHlwZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUuaXRlbX0seD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxFPUMuZG9jdW1lbnQsYz17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIGIoZSx0LG4pe3ZhciByLGksbz0obj1ufHxFKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSx0KWZvcihyIGluIGMpKGk9dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmby5zZXRBdHRyaWJ1dGUocixpKTtuLmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB3KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9uW28uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBmPSIzLjYuMCIsUz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUy5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIHAoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dyhlKTtyZXR1cm4hbShlKSYmIXgoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3MuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxldmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrMSklMn0pKX0sb2RkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6dSxzb3J0OnQuc29ydCxzcGxpY2U6dC5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSlyPWVbdF0sIl9fcHJvdG9fXyIhPT10JiZhIT09ciYmKGwmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8obj1hW3RdLG89aSYmIUFycmF5LmlzQXJyYXkobik/W106aXx8Uy5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPVMuZXh0ZW5kKGwsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoZitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09by5jYWxsKGUpKSYmKCEodD1yKGUpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49di5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZhLmNhbGwobik9PT1sKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUsdCxuKXtiKGUse25vbmNlOnQmJnQubm9uY2V9LG4pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKHAoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYocChPYmplY3QoZSkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnUuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTppLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9W10saT0wLG89ZS5sZW5ndGgsYT0hbjtpPG87aSsrKSF0KGVbaV0saSkhPT1hJiZyLnB1c2goZVtpXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAsYT1bXTtpZihwKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO3JldHVybiBnKGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT10W1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBkPWZ1bmN0aW9uKG4pe3ZhciBlLGQsYixvLGksaCxmLGcsdyx1LGwsVCxDLGEsRSx2LHMsYyx5LFM9InNpenpsZSIrMSpuZXcgRGF0ZSxwPW4uZG9jdW1lbnQsaz0wLHI9MCxtPXVlKCkseD11ZSgpLEE9dWUoKSxOPXVlKCksaj1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dCYmKGw9ITApLDB9LEQ9e30uaGFzT3duUHJvcGVydHksdD1bXSxxPXQucG9wLEw9dC5wdXNoLEg9dC5wdXNoLE89dC5zbGljZSxQPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWlmKGVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxSPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsST0iKD86XFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXFteXFxyXFxuXFxmXXxbXFx3LV18W15cMC1cXHg3Zl0pKyIsVz0iXFxbIitNKyIqKCIrSSsiKSg/OiIrTSsiKihbKl4kfCF+XT89KSIrTSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK0krIikpfCkiK00rIipcXF0iLEY9IjooIitJKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitXKyIpKil8LiopXFwpfCkiLEI9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLCQ9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksej1uZXcgUmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLFU9bmV3IFJlZ0V4cChNKyJ8PiIpLFg9bmV3IFJlZ0V4cChGKSxWPW5ldyBSZWdFeHAoIl4iK0krIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK0krIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrSSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrSSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1cpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitGKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitSKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9IVE1MJC9pLFE9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxlZT0vWyt+XS8sdGU9bmV3IFJlZ0V4cCgiXFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXChbXlxcclxcblxcZl0pIiwiZyIpLG5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49IjB4IitlLnNsaWNlKDEpLTY1NTM2O3JldHVybiB0fHwobjwwP1N0cmluZy5mcm9tQ2hhckNvZGUobis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShuPj4xMHw1NTI5NiwxMDIzJm58NTYzMjApKX0scmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csaWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxvZT1mdW5jdGlvbigpe1QoKX0sYWU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYiZmllbGRzZXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0guYXBwbHkodD1PLmNhbGwocC5jaGlsZE5vZGVzKSxwLmNoaWxkTm9kZXMpLHRbcC5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7SD17YXBwbHk6dC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtMLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc2UodCxlLG4scil7dmFyIGksbyxhLHMsdSxsLGMsZj1lJiZlLm93bmVyRG9jdW1lbnQscD1lP2Uubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoVChlKSxlPWV8fEMsRSkpe2lmKDExIT09cCYmKHU9Wi5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJnkoZSxhKSYmYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKGQucXNhJiYhTlt0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09cHx8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoVS50ZXN0KHQpfHx6LnRlc3QodCkpKXsoZj1lZS50ZXN0KHQpJiZ5ZShlLnBhcmVudE5vZGUpfHxlKT09PWUmJmQuc2NvcGV8fCgocz1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2UocmUsaWUpOmUuc2V0QXR0cmlidXRlKCJpZCIscz1TKSksbz0obD1oKHQpKS5sZW5ndGg7d2hpbGUoby0tKWxbb109KHM/IiMiK3M6IjpzY29wZSIpKyIgIit4ZShsW29dKTtjPWwuam9pbigiLCIpfXRyeXtyZXR1cm4gSC5hcHBseShuLGYucXVlcnlTZWxlY3RvckFsbChjKSksbn1jYXRjaChlKXtOKHQsITApfWZpbmFsbHl7cz09PVMmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGcodC5yZXBsYWNlKCQsIiQxIiksZSxuLHIpfWZ1bmN0aW9uIHVlKCl7dmFyIHI9W107cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gci5wdXNoKHQrIiAiKT5iLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVtyLnNoaWZ0KCldLGVbdCsiICJdPW59fWZ1bmN0aW9uIGxlKGUpe3JldHVybiBlW1NdPSEwLGV9ZnVuY3Rpb24gY2UoZSl7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGZlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9bi5sZW5ndGg7d2hpbGUoci0tKWIuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHBlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gaGUobil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PXR8fCJidXR0b24iPT09dCkmJmUudHlwZT09PW59fWZ1bmN0aW9uIGdlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYWUoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdmUoYSl7cmV0dXJuIGxlKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLGxlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKFtdLGUubGVuZ3RoLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1yW2ldXSYmKGVbbl09ISh0W25dPWVbbl0pKX0pfSl9ZnVuY3Rpb24geWUoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mb3IoZSBpbiBkPXNlLnN1cHBvcnQ9e30saT1zZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLm5hbWVzcGFjZVVSSSxuPWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hWS50ZXN0KHR8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LFQ9c2Uuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWU/ZS5vd25lckRvY3VtZW50fHxlOnA7cmV0dXJuIHIhPUMmJjk9PT1yLm5vZGVUeXBlJiZyLmRvY3VtZW50RWxlbWVudCYmKGE9KEM9cikuZG9jdW1lbnRFbGVtZW50LEU9IWkoQykscCE9QyYmKG49Qy5kZWZhdWx0VmlldykmJm4udG9wIT09biYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLGQuc2NvcGU9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KCJkaXYiKSksInVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwmJiFlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSBmaWVsZHNldCBkaXYiKS5sZW5ndGh9KSxkLmF0dHJpYnV0ZXM9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChDLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1LLnRlc3QoQy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxkLmdldEJ5SWQ9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuaWQ9UywhQy5nZXRFbGVtZW50c0J5TmFtZXx8IUMuZ2V0RWxlbWVudHNCeU5hbWUoUykubGVuZ3RofSksZC5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZFKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdCYmdC52YWx1ZT09PW59fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLGIuZmluZC5UQUc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOmQucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGIuZmluZC5DTEFTUz1kLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0scz1bXSx2PVtdLChkLnFzYT1LLnRlc3QoQy5xdWVyeVNlbGVjdG9yQWxsKSkmJihjZShmdW5jdGlvbihlKXt2YXIgdDthLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIrUysiJz48L2E+PHNlbGVjdCBpZD0nIitTKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrUysiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSwodD1DLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgibmFtZSIsIiIpLGUuYXBwZW5kQ2hpbGQodCksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT0nJ10iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqbmFtZSIrTSsiKj0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitTKyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpLGUucXVlcnlTZWxlY3RvckFsbCgiXFxcZiIpLHYucHVzaCgiW1xcclxcblxcZl0iKX0pLGNlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEuYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKGQubWF0Y2hlc1NlbGVjdG9yPUsudGVzdChjPWEubWF0Y2hlc3x8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3IpKSYmY2UoZnVuY3Rpb24oZSl7ZC5kaXNjb25uZWN0ZWRNYXRjaD1jLmNhbGwoZSwiKiIpLGMuY2FsbChlLCJbcyE9JyddOngiKSxzLnB1c2goIiE9IixGKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHM9cy5sZW5ndGgmJm5ldyBSZWdFeHAocy5qb2luKCJ8IikpLHQ9Sy50ZXN0KGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9dHx8Sy50ZXN0KGEuY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0saj10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gbnx8KDEmKG49KGUub3duZXJEb2N1bWVudHx8ZSk9PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFkLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09Q3x8ZS5vd25lckRvY3VtZW50PT1wJiZ5KHAsZSk/LTE6dD09Q3x8dC5vd25lckRvY3VtZW50PT1wJiZ5KHAsdCk/MTp1P1AodSxlKS1QKHUsdCk6MDo0Jm4/LTE6MSl9OmZ1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbixyPTAsaT1lLnBhcmVudE5vZGUsbz10LnBhcmVudE5vZGUsYT1bZV0scz1bdF07aWYoIWl8fCFvKXJldHVybiBlPT1DPy0xOnQ9PUM/MTppPy0xOm8/MTp1P1AodSxlKS1QKHUsdCk6MDtpZihpPT09bylyZXR1cm4gcGUoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP3BlKGFbcl0sc1tyXSk6YVtyXT09cD8tMTpzW3JdPT1wPzE6MH0pLEN9LHNlLm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc2UoZSxudWxsLG51bGwsdCl9LHNlLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFQoZSksZC5tYXRjaGVzU2VsZWN0b3ImJkUmJiFOW3QrIiAiXSYmKCFzfHwhcy50ZXN0KHQpKSYmKCF2fHwhdi50ZXN0KHQpKSl0cnl7dmFyIG49Yy5jYWxsKGUsdCk7aWYobnx8ZC5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBufWNhdGNoKGUpe04odCwhMCl9cmV0dXJuIDA8c2UodCxDLG51bGwsW2VdKS5sZW5ndGh9LHNlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSkseShlLHQpfSxzZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZELmNhbGwoYi5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/bihlLHQsIUUpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09cj9yOmQuYXR0cmlidXRlc3x8IUU/ZS5nZXRBdHRyaWJ1dGUodCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSxzZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UocmUsaWUpfSxzZS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGw9IWQuZGV0ZWN0RHVwbGljYXRlcyx1PSFkLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KGopLGwpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSllLnNwbGljZShuW3JdLDEpfXJldHVybiB1PW51bGwsZX0sbz1zZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKHQ9ZVtyKytdKW4rPW8odCk7cmV0dXJuIG59LChiPXNlLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmxlLG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh0ZSxuZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UodGUsbmUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxzZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZzZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWgobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1tW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJm0oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1zZS5hdHRyKGUsbik7cmV0dXJuIG51bGw9PXQ/IiE9Ij09PXI6IXJ8fCh0Kz0iIiwiPSI9PT1yP3Q9PT1pOiIhPSI9PT1yP3QhPT1pOiJePSI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6Iio9Ij09PXI/aSYmLTE8dC5pbmRleE9mKGkpOiIkPSI9PT1yP2kmJnQuc2xpY2UoLWkubGVuZ3RoKT09PWk6In49Ij09PXI/LTE8KCIgIit0LnJlcGxhY2UoQiwiICIpKyIgIikuaW5kZXhPZihpKToifD0iPT09ciYmKHQ9PT1pfHx0LnNsaWNlKDAsaS5sZW5ndGgrMSk9PT1pKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oaCxlLHQsZyx2KXt2YXIgeT0ibnRoIiE9PWguc2xpY2UoMCwzKSxtPSJsYXN0IiE9PWguc2xpY2UoLTQpLHg9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PWcmJjA9PT12P2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9eSE9PW0/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixjPWUucGFyZW50Tm9kZSxmPXgmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxwPSFuJiYheCxkPSExO2lmKGMpe2lmKHkpe3doaWxlKGwpe2E9ZTt3aGlsZShhPWFbbF0paWYoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKXJldHVybiExO3U9bD0ib25seSI9PT1oJiYhdSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih1PVttP2MuZmlyc3RDaGlsZDpjLmxhc3RDaGlsZF0sbSYmcCl7ZD0ocz0ocj0oaT0obz0oYT1jKVtTXXx8KGFbU109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09ayYmclsxXSkmJnJbMl0sYT1zJiZjLmNoaWxkTm9kZXNbc107d2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoMT09PWEubm9kZVR5cGUmJisrZCYmYT09PWUpe2lbaF09W2sscyxkXTticmVha319ZWxzZSBpZihwJiYoZD1zPShyPShpPShvPShhPWUpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSwhMT09PWQpd2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSkmJisrZCYmKHAmJigoaT0obz1hW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdPVtrLGRdKSxhPT09ZSkpYnJlYWs7cmV0dXJuKGQtPXYpPT09Z3x8ZCVnPT0wJiYwPD1kL2d9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT1iLnBzZXVkb3NbZV18fGIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKGUsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPVAoZSxyW2ldKV09ISh0W25dPXJbaV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSwwLHQpfSk6YX19LHBzZXVkb3M6e25vdDpsZShmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9ZihlLnJlcGxhY2UoJCwiJDEiKSk7cmV0dXJuIHNbU10/bGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpsZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8c2UodCxlKS5sZW5ndGh9fSksY29udGFpbnM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHRlLG5lKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KX19KSxsYW5nOmxlKGZ1bmN0aW9uKG4pe3JldHVybiBWLnRlc3Qobnx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgdDtkb3tpZih0PUU/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybih0PXQudG9Mb3dlckNhc2UoKSk9PT1ufHwwPT09dC5pbmRleE9mKG4rIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4ubG9jYXRpb24mJm4ubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUMuYWN0aXZlRWxlbWVudCYmKCFDLmhhc0ZvY3VzfHxDLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmdlKCExKSxkaXNhYmxlZDpnZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBKLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBRLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2ZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dmUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPWRlKGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pYi5wc2V1ZG9zW2VdPWhlKGUpO2Z1bmN0aW9uIG1lKCl7fWZ1bmN0aW9uIHhlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gYmUocyxlLHQpe3ZhciB1PWUuZGlyLGw9ZS5uZXh0LGM9bHx8dSxmPXQmJiJwYXJlbnROb2RlIj09PWMscD1yKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilyZXR1cm4gcyhlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1bayxwXTtpZihuKXt3aGlsZShlPWVbdV0paWYoKDE9PT1lLm5vZGVUeXBlfHxmKSYmcyhlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpaWYoaT0obz1lW1NdfHwoZVtTXT17fSkpW2UudW5pcXVlSURdfHwob1tlLnVuaXF1ZUlEXT17fSksbCYmbD09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbdV18fGU7ZWxzZXtpZigocj1pW2NdKSYmclswXT09PWsmJnJbMV09PT1wKXJldHVybiBhWzJdPXJbMl07aWYoKGlbY109YSlbMl09cyhlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gQ2UoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltTXSYmKHY9Q2UodikpLHkmJiF5W1NdJiYoeT1DZSh5LGUpKSxsZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1bXSx1PVtdLGw9dC5sZW5ndGgsYz1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8IioiLG4ubm9kZVR5cGU/W25dOm4sW10pLGY9IWR8fCFlJiZoP2M6VGUoYyxzLGQsbixyKSxwPWc/eXx8KGU/ZDpsfHx2KT9bXTp0OmY7aWYoZyYmZyhmLHAsbixyKSx2KXtpPVRlKHAsdSksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihwW3Vbb11dPSEoZlt1W29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmaS5wdXNoKGZbb109YSk7eShudWxsLHA9W10saSxyKX1vPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmLTE8KGk9eT9QKGUsYSk6c1tvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2UgcD1UZShwPT09dD9wLnNwbGljZShsLHAubGVuZ3RoKTpwKSx5P3kobnVsbCx0LHAscik6SC5hcHBseSh0LHApfSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciBpLHQsbixyPWUubGVuZ3RoLG89Yi5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9b3x8Yi5yZWxhdGl2ZVsiICJdLHM9bz8xOjAsdT1iZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9YmUoZnVuY3Rpb24oZSl7cmV0dXJuLTE8UChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT09dyl8fCgoaT10KS5ub2RlVHlwZT91KGUsdCxuKTpsKGUsdCxuKSk7cmV0dXJuIGk9bnVsbCxyfV07czxyO3MrKylpZih0PWIucmVsYXRpdmVbZVtzXS50eXBlXSljPVtiZSh3ZShjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlbU10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gQ2UoMTxzJiZ3ZShjKSwxPHMmJnhlKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoJCwiJDEiKSx0LHM8biYmRWUoZS5zbGljZShzLG4pKSxuPHImJkVlKGU9ZS5zbGljZShuKSksbjxyJiZ4ZShlKSl9Yy5wdXNoKHQpfXJldHVybiB3ZShjKX1yZXR1cm4gbWUucHJvdG90eXBlPWIuZmlsdGVycz1iLnBzZXVkb3MsYi5zZXRGaWx0ZXJzPW5ldyBtZSxoPXNlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbD14W2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj1fLmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj16LmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKCQsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1HW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/c2UuZXJyb3IoZSk6eChlLHMpLnNsaWNlKDApfSxmPXNlLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9QVtlKyIgIl07aWYoIWEpe3R8fCh0PWgoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShhPUVlKHRbbl0pKVtTXT9pLnB1c2goYSk6by5wdXNoKGEpOyhhPUEoZSwodj1vLG09MDwoeT1pKS5sZW5ndGgseD0wPHYubGVuZ3RoLHI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdT0wLGw9IjAiLGM9ZSYmW10sZj1bXSxwPXcsZD1lfHx4JiZiLmZpbmQuVEFHKCIqIixpKSxoPWsrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT1DfHx0fHxpKTtsIT09ZyYmbnVsbCE9KG89ZFtsXSk7bCsrKXtpZih4JiZvKXthPTAsdHx8by5vd25lckRvY3VtZW50PT1DfHwoVChvKSxuPSFFKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8QyxuKSl7ci5wdXNoKG8pO2JyZWFrfWkmJihrPWgpfW0mJigobz0hcyYmbykmJnUtLSxlJiZjLnB1c2gobykpfWlmKHUrPWwsbSYmbCE9PXUpe2E9MDt3aGlsZShzPXlbYSsrXSlzKGMsZix0LG4pO2lmKGUpe2lmKDA8dSl3aGlsZShsLS0pY1tsXXx8ZltsXXx8KGZbbF09cS5jYWxsKHIpKTtmPVRlKGYpfUguYXBwbHkocixmKSxpJiYhZSYmMDxmLmxlbmd0aCYmMTx1K3kubGVuZ3RoJiZzZS51bmlxdWVTb3J0KHIpfXJldHVybiBpJiYoaz1oLHc9cCksY30sbT9sZShyKTpyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIGF9LGc9c2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxjPSFyJiZoKGU9bC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09Yy5sZW5ndGgpe2lmKDI8KG89Y1swXT1jWzBdLnNsaWNlKDApKS5sZW5ndGgmJiJJRCI9PT0oYT1vWzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmRSYmYi5yZWxhdGl2ZVtvWzFdLnR5cGVdKXtpZighKHQ9KGIuZmluZC5JRChhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksdCl8fFtdKVswXSkpcmV0dXJuIG47bCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1HLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6by5sZW5ndGg7d2hpbGUoaS0tKXtpZihhPW9baV0sYi5yZWxhdGl2ZVtzPWEudHlwZV0pYnJlYWs7aWYoKHU9Yi5maW5kW3NdKSYmKHI9dShhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksZWUudGVzdChvWzBdLnR5cGUpJiZ5ZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKG8uc3BsaWNlKGksMSksIShlPXIubGVuZ3RoJiZ4ZShvKSkpcmV0dXJuIEguYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fGYoZSxjKSkocix0LCFFLG4sIXR8fGVlLnRlc3QoZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpLG59LGQuc29ydFN0YWJsZT1TLnNwbGl0KCIiKS5zb3J0KGopLmpvaW4oIiIpPT09UyxkLmRldGVjdER1cGxpY2F0ZXM9ISFsLFQoKSxkLnNvcnREZXRhY2hlZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuKXJldHVybiBlLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksZC5hdHRyaWJ1dGVzJiZjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmZSgidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtpZighbiYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZmUoUixmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT1lW3RdP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzZX0oQyk7Uy5maW5kPWQsUy5leHByPWQuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1kLnVuaXF1ZVNvcnQsUy50ZXh0PWQuZ2V0VGV4dCxTLmlzWE1MRG9jPWQuaXNYTUwsUy5jb250YWlucz1kLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9ZC5lc2NhcGU7dmFyIGg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJlMoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxUPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxrPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gQShlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9dmFyIE49L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gaihlLG4scil7cmV0dXJuIG0obik/Uy5ncmVwKGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4hIW4uY2FsbChlLHQsZSkhPT1yfSk6bi5ub2RlVHlwZT9TLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybi0xPGkuY2FsbChuLGUpIT09cn0pOlMuZmlsdGVyKG4sZSxyKX1TLmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOlMuZmluZC5tYXRjaGVzKGUsUy5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsaT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoUy5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKylTLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/Uy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhaih0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmay50ZXN0KGUpP1MoZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgRCxxPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fEQsInN0cmluZyI9PXR5cGVvZiBlKXtpZighKHI9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpxLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIFM/dFswXTp0LFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkUsITApKSxOLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KW0odGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1FLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTptKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKFMpOlMubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixEPVMoRSk7dmFyIEw9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sSD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBPKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PVMoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoUy5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZTKGUpO2lmKCFrLnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/LTE8YS5pbmRleChuKToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP1MudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2kuY2FsbChTKGUpLHRoaXNbMF0pOmkuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gVCgoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFQoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuY29udGVudERvY3VtZW50JiZyKGUuY29udGVudERvY3VtZW50KT9lLmNvbnRlbnREb2N1bWVudDooQShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLFMubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe1MuZm5bcl09ZnVuY3Rpb24oZSx0KXt2YXIgbj1TLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPVMuZmlsdGVyKHQsbikpLDE8dGhpcy5sZW5ndGgmJihIW3JdfHxTLnVuaXF1ZVNvcnQobiksTC50ZXN0KHIpJiZuLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIFA9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3JldHVybiBlfWZ1bmN0aW9uIE0oZSl7dGhyb3cgZX1mdW5jdGlvbiBJKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZtKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJm0oaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxTLmVhY2goZS5tYXRjaChQKXx8W10sZnVuY3Rpb24oZSx0KXtuW3RdPSEwfSksbik6Uy5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXToiIil9LGY9e2FkZDpmdW5jdGlvbigpe3JldHVybiBzJiYodCYmIWkmJihsPXMubGVuZ3RoLTEsdS5wdXNoKHQpKSxmdW5jdGlvbiBuKGUpe1MuZWFjaChlLGZ1bmN0aW9uKGUsdCl7bSh0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT13KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1TLmluQXJyYXkodCxzLG4pKSlzLnNwbGljZShuLDEpLG48PWwmJmwtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT8tMTxTLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgbz1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0saT0icGVuZGluZyIsYT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHMuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSwiY2F0Y2giOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihyKXtTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPW0oaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJm0oZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLG0odCk/cz90LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scykpOih1KyssdC5jYWxsKGUsbCh1LG8sUixzKSxsKHUsbyxNLHMpLGwodSxvLFIsby5ub3RpZnlXaXRoKSkpOihhIT09UiYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LnN0YWNrVHJhY2UpLHU8PWkrMSYmKGEhPT1NJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHQuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxDLnNldFRpbWVvdXQodCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSxtKHIpP3I6UixlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSxtKHQpP3Q6UikpLG9bMl1bM10uYWRkKGwoMCxlLG0obik/bjpNKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Uy5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gUy5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzJdLHI9dFs1XTthW3RbMV1dPW4uYWRkLHImJm4uYWRkKGZ1bmN0aW9uKCl7aT1yfSxvWzMtZV1bMl0uZGlzYWJsZSxvWzMtZV1bM10uZGlzYWJsZSxvWzBdWzJdLmxvY2ssb1swXVszXS5sb2NrKSxuLmFkZCh0WzNdLmZpcmUpLHNbdFswXV09ZnVuY3Rpb24oKXtyZXR1cm4gc1t0WzBdKyJXaXRoIl0odGhpcz09PXM/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxzW3RbMF0rIldpdGgiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPXMuY2FsbChhcmd1bWVudHMpLG89Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9zLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKEkoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksInBlbmRpbmciPT09by5zdGF0ZSgpfHxtKGlbdF0mJmlbdF0udGhlbikpKXJldHVybiBvLnRoZW4oKTt3aGlsZSh0LS0pSShpW3RdLGEodCksby5yZWplY3QpO3JldHVybiBvLnByb21pc2UoKX19KTt2YXIgVz0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtDLmNvbnNvbGUmJkMuY29uc29sZS53YXJuJiZlJiZXLnRlc3QoZS5uYW1lKSYmQy5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrZS5tZXNzYWdlLGUuc3RhY2ssdCl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfTt2YXIgRj1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gQigpe0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixCKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe1MucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCkhPT1lJiYwPC0tUy5yZWFkeVdhaXR8fEYucmVzb2x2ZVdpdGgoRSxbU10pfX0pLFMucmVhZHkudGhlbj1GLnRoZW4sImNvbXBsZXRlIj09PUUucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09RS5yZWFkeVN0YXRlJiYhRS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/Qy5zZXRUaW1lb3V0KFMucmVhZHkpOihFLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIpLEMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsQikpO3ZhciAkPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT13KG4pKWZvcihzIGluIGk9ITAsbikkKGUsdCxzLG5bc10sITAsbyxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLG0ocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoUyhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxfPS9eLW1zLS8sej0vLShbYS16XSkvZztmdW5jdGlvbiBVKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBYKGUpe3JldHVybiBlLnJlcGxhY2UoXywibXMtIikucmVwbGFjZSh6LFUpfXZhciBWPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07ZnVuY3Rpb24gRygpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rRy51aWQrK31HLnVpZD0xLEcucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LFYoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW1godCldPW47ZWxzZSBmb3IociBpbiB0KWlbWChyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtYKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChYKToodD1YKHQpKWluIHI/W3RdOnQubWF0Y2goUCl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxTLmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiFTLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgWT1uZXcgRyxRPW5ldyBHLEo9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxLPS9bQS1aXS9nO2Z1bmN0aW9uIFooZSx0LG4pe3ZhciByLGk7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShLLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPSJ0cnVlIj09PShpPW4pfHwiZmFsc2UiIT09aSYmKCJudWxsIj09PWk/bnVsbDppPT09K2krIiI/K2k6Si50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aSl9Y2F0Y2goZSl7fVEuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBRLmhhc0RhdGEoZSl8fFkuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFEuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1EucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gWS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1kucmVtb3ZlKGUsdCl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT1RLmdldChvKSwxPT09by5ub2RlVHlwZSYmIVkuZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7dD1hLmxlbmd0aDt3aGlsZSh0LS0pYVt0XSYmMD09PShyPWFbdF0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9WChyLnNsaWNlKDUpKSxaKG8scixpW3JdKSk7WS5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBuP3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbil9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ7aWYobyYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KHQ9US5nZXQobyxuKSk/dDp2b2lkIDAhPT0odD1aKG8sbikpP3Q6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbixlKX0pfSxudWxsLGUsMTxhcmd1bWVudHMubGVuZ3RoLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnJlbW92ZSh0aGlzLGUpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9WS5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1ZLmFjY2VzcyhlLHQsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49Uy5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz1TLl9xdWV1ZUhvb2tzKGUsdCk7ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIFkuZ2V0KGUsbil8fFkuYWNjZXNzKGUsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7WS5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iZngiLGUtLSksYXJndW1lbnRzLmxlbmd0aDxlP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uy5xdWV1ZSh0aGlzLHQsbik7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1lWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9Uy5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4Ijt3aGlsZShhLS0pKG49WS5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgZWU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsdGU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK2VlKyIpKFthLXolXSopJCIsImkiKSxuZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLHJlPUUuZG9jdW1lbnRFbGVtZW50LGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sb2U9e2NvbXBvc2VkOiEwfTtyZS5nZXRSb290Tm9kZSYmKGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShvZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmaWUoZSkmJiJub25lIj09PVMuY3NzKGUsImRpc3BsYXkiKX07ZnVuY3Rpb24gc2UoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChTLmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihTLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmdGUuZXhlYyhTLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pUy5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLFMuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgdWU9e307ZnVuY3Rpb24gbGUoZSx0KXtmb3IodmFyIG4scixpLG8sYSxzLHUsbD1bXSxjPTAsZj1lLmxlbmd0aDtjPGY7YysrKShyPWVbY10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oIm5vbmUiPT09biYmKGxbY109WS5nZXQociwiZGlzcGxheSIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmYWUocikmJihsW2NdPSh1PWE9bz12b2lkIDAsYT0oaT1yKS5vd25lckRvY3VtZW50LHM9aS5ub2RlTmFtZSwodT11ZVtzXSl8fChvPWEuYm9keS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQocykpLHU9Uy5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSx1ZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsWS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthZSh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBjZSxmZSxwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7Y2U9RS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGZlPUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxmZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksZmUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGNlLmFwcGVuZENoaWxkKGZlKSx5LmNoZWNrQ2xvbmU9Y2UuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGNlLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIWNlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxjZS5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWNlLmxhc3RDaGlsZDt2YXIgZ2U9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiB2ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmQShlLHQpP1MubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geWUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspWS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFkuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9Z2UudGJvZHk9Z2UudGZvb3Q9Z2UuY29sZ3JvdXA9Z2UuY2FwdGlvbj1nZS50aGVhZCxnZS50aD1nZS50ZCx5Lm9wdGlvbnx8KGdlLm9wdGdyb3VwPWdlLm9wdGlvbj1bMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdKTt2YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXcobykpUy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxTLmluQXJyYXkobyxyKSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPWllKG8pLGE9dmUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmeWUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn12YXIgYmU9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHdlKCl7cmV0dXJuITB9ZnVuY3Rpb24gVGUoKXtyZXR1cm4hMX1mdW5jdGlvbiBDZShlLHQpe3JldHVybiBlPT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIEUuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fSgpPT0oImZvY3VzIj09PXQpfWZ1bmN0aW9uIEVlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLHQpRWUoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9VGU7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIFMoKS5vZmYoZSksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1TLmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX1mdW5jdGlvbiBTZShlLGksbyl7bz8oWS5zZXQoZSxpLCExKSxTLmV2ZW50LmFkZChlLGkse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1ZLmdldCh0aGlzLGkpO2lmKDEmZS5pc1RyaWdnZXImJnRoaXNbaV0pe2lmKHIubGVuZ3RoKShTLmV2ZW50LnNwZWNpYWxbaV18fHt9KS5kZWxlZ2F0ZVR5cGUmJmUuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihyPXMuY2FsbChhcmd1bWVudHMpLFkuc2V0KHRoaXMsaSxyKSx0PW8odGhpcyxpKSx0aGlzW2ldKCksciE9PShuPVkuZ2V0KHRoaXMsaSkpfHx0P1kuc2V0KHRoaXMsaSwhMSk6bj17fSxyIT09bilyZXR1cm4gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksbiYmbi52YWx1ZX1lbHNlIHIubGVuZ3RoJiYoWS5zZXQodGhpcyxpLHt2YWx1ZTpTLmV2ZW50LnRyaWdnZXIoUy5leHRlbmQoclswXSxTLkV2ZW50LnByb3RvdHlwZSksci5zbGljZSgxKSx0aGlzKX0pLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1ZLmdldChlLGkpJiZTLmV2ZW50LmFkZChlLGksd2UpfVMuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9WS5nZXQodCk7aWYoVih0KSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihyZSxpKSxuLmd1aWR8fChuLmd1aWQ9Uy5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFMmJlMuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP1MuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGw9KGU9KGV8fCIiKS5tYXRjaChQKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9YmUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkJiYoZj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KGk/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGQsZj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9Uy5leHRlbmQoe3R5cGU6ZCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmUy5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGkpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sbyksKHA9dVtkXSl8fCgocD11W2RdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGgsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGQsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGMpLGMuaGFuZGxlci5ndWlkfHwoYy5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksaT9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGMpOnAucHVzaChjKSxTLmV2ZW50Lmdsb2JhbFtkXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9WS5oYXNEYXRhKGUpJiZZLmdldChlKTtpZih2JiYodT12LmV2ZW50cykpe2w9KHQ9KHR8fCIiKS5tYXRjaChQKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9YmUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkKXtmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scD11W2Q9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGRdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1vPXAubGVuZ3RoO3doaWxlKG8tLSljPXBbb10sIWkmJmchPT1jLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1jLmd1aWR8fHMmJiFzLnRlc3QoYy5uYW1lc3BhY2UpfHxyJiZyIT09Yy5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fFMucmVtb3ZlRXZlbnQoZSxkLHYuaGFuZGxlKSxkZWxldGUgdVtkXSl9ZWxzZSBmb3IoZCBpbiB1KVMuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7Uy5pc0VtcHR5T2JqZWN0KHUpJiZZLnJlbW92ZShlLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksdT1TLmV2ZW50LmZpeChlKSxsPShZLmdldCh0aGlzLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbdS50eXBlXXx8W10sYz1TLmV2ZW50LnNwZWNpYWxbdS50eXBlXXx8e307Zm9yKHNbMF09dSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylzW3RdPWFyZ3VtZW50c1t0XTtpZih1LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdSkpe2E9Uy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdSxsKSx0PTA7d2hpbGUoKGk9YVt0KytdKSYmIXUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7dS5jdXJyZW50VGFyZ2V0PWkuZWxlbSxuPTA7d2hpbGUoKG89aS5oYW5kbGVyc1tuKytdKSYmIXUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSl1LnJuYW1lc3BhY2UmJiExIT09by5uYW1lc3BhY2UmJiF1LnJuYW1lc3BhY2UudGVzdChvLm5hbWVzcGFjZSl8fCh1LmhhbmRsZU9iaj1vLHUuZGF0YT1vLmRhdGEsdm9pZCAwIT09KHI9KChTLmV2ZW50LnNwZWNpYWxbby5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fG8uaGFuZGxlcikuYXBwbHkoaS5lbGVtLHMpKSYmITE9PT0odS5yZXN1bHQ9cikmJih1LnByZXZlbnREZWZhdWx0KCksdS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBjLnBvc3REaXNwYXRjaCYmYy5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHUpLHUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHM9W10sdT10LmRlbGVnYXRlQ291bnQsbD1lLnRhcmdldDtpZih1JiZsLm5vZGVUeXBlJiYhKCJjbGljayI9PT1lLnR5cGUmJjE8PWUuYnV0dG9uKSlmb3IoO2whPT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1sLm5vZGVUeXBlJiYoImNsaWNrIiE9PWUudHlwZXx8ITAhPT1sLmRpc2FibGVkKSl7Zm9yKG89W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW2k9KHI9dFtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbaV09ci5uZWVkc0NvbnRleHQ/LTE8UyhpLHRoaXMpLmluZGV4KGwpOlMuZmluZChpLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCksYVtpXSYmby5wdXNoKHIpO28ubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczpvfSl9cmV0dXJuIGw9dGhpcyx1PHQubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczp0LnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6bShlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbUy5leHBhbmRvXT9lOm5ldyBTLkV2ZW50KGUpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZTZSh0LCJjbGljayIsd2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZTZSh0LCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldDtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJlkuZ2V0KHQsImNsaWNrIil8fEEodCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5yZXN1bHQmJmUub3JpZ2luYWxFdmVudCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX19LFMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbil9LFMuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBTLkV2ZW50KSlyZXR1cm4gbmV3IFMuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1lLmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09ZS5yZXR1cm5WYWx1ZT93ZTpUZSx0aGlzLnRhcmdldD1lLnRhcmdldCYmMz09PWUudGFyZ2V0Lm5vZGVUeXBlP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9ZSx0JiZTLmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbUy5leHBhbmRvXT0hMH0sUy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOlRlLGlzUHJvcGFnYXRpb25TdG9wcGVkOlRlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOlRlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXdlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXdlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD13ZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sUy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOiEwfSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFNlKHRoaXMsZSxDZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gU2UodGhpcyxlKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZGVsZWdhdGVUeXBlOnR9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe1MuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOmksYmluZFR5cGU6aSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnJlbGF0ZWRUYXJnZXQscj1lLmhhbmRsZU9iajtyZXR1cm4gbiYmKG49PT10aGlzfHxTLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEVlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gRWUodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosUyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49VGUpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIGtlPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLEFlPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLE5lPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBqZShlLHQpe3JldHVybiBBKGUsInRhYmxlIikmJkEoMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpJiZTKGUpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxlfWZ1bmN0aW9uIERlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gcWUoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIExlKGUsdCl7dmFyIG4scixpLG8sYSxzO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihZLmhhc0RhdGEoZSkmJihzPVkuZ2V0KGUpLmV2ZW50cykpZm9yKGkgaW4gWS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQodCxpLHNbaV1bbl0pO1EuaGFzRGF0YShlKSYmKG89US5hY2Nlc3MoZSksYT1TLmV4dGVuZCh7fSxvKSxRLnNldCh0LGEpKX19ZnVuY3Rpb24gSGUobixyLGksbyl7cj1nKHIpO3ZhciBlLHQsYSxzLHUsbCxjPTAsZj1uLmxlbmd0aCxwPWYtMSxkPXJbMF0saD1tKGQpO2lmKGh8fDE8ZiYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZBZS50ZXN0KGQpKXJldHVybiBuLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bi5lcShlKTtoJiYoclswXT1kLmNhbGwodGhpcyxlLHQuaHRtbCgpKSksSGUodCxyLGksbyl9KTtpZihmJiYodD0oZT14ZShyLG5bMF0ub3duZXJEb2N1bWVudCwhMSxuLG8pKS5maXJzdENoaWxkLDE9PT1lLmNoaWxkTm9kZXMubGVuZ3RoJiYoZT10KSx0fHxvKSl7Zm9yKHM9KGE9Uy5tYXAodmUoZSwic2NyaXB0IiksRGUpKS5sZW5ndGg7YzxmO2MrKyl1PWUsYyE9PXAmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLHZlKHUsInNjcmlwdCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLHFlKSxjPTA7YzxzO2MrKyl1PWFbY10saGUudGVzdCh1LnR5cGV8fCIiKSYmIVkuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxsKTpiKHUudGV4dENvbnRlbnQucmVwbGFjZShOZSwiIiksdSxsKSl9cmV0dXJuIG59ZnVuY3Rpb24gT2UoZSx0LG4pe2Zvcih2YXIgcixpPXQ/Uy5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKHZlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZpZShyKSYmeWUodmUociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPWUuY2xvbmVOb2RlKCEwKSxmPWllKGUpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8Uy5pc1hNTERvYyhlKSkpZm9yKGE9dmUoYykscj0wLGk9KG89dmUoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLCJpbnB1dCI9PT0obD11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZwZS50ZXN0KHMudHlwZSk/dS5jaGVja2VkPXMuY2hlY2tlZDoiaW5wdXQiIT09bCYmInRleHRhcmVhIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fHZlKGUpLGE9YXx8dmUoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylMZShvW3JdLGFbcl0pO2Vsc2UgTGUoZSxjKTtyZXR1cm4gMDwoYT12ZShjLCJzY3JpcHQiKSkubGVuZ3RoJiZ5ZShhLCFmJiZ2ZShlLCJzY3JpcHQiKSksY30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT1TLmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihWKG4pKXtpZih0PW5bWS5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW1kuZXhwYW5kb109dm9pZCAwfW5bUS5leHBhbmRvXSYmKG5bUS5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBPZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIE9lKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fGplKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBIZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9amUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBIZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBIZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEodmUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIWtlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9Uy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIEhlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyxuKTwwJiYoUy5jbGVhbkRhdGEodmUodGhpcykpLHQmJnQucmVwbGFjZUNoaWxkKGUsdGhpcykpfSxuKX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLGEpe1MuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj1TKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMocltvXSlbYV0odCksdS5hcHBseShuLHQuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUGU9bmV3IFJlZ0V4cCgiXigiK2VlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksUmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9QyksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxNZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihpIGluIHQpb1tpXT1lLnN0eWxlW2ldLGUuc3R5bGVbaV09dFtpXTtmb3IoaSBpbiByPW4uY2FsbChlKSx0KWUuc3R5bGVbaV09b1tpXTtyZXR1cm4gcn0sSWU9bmV3IFJlZ0V4cChuZS5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBXZShlLHQsbil7dmFyIHIsaSxvLGEscz1lLnN0eWxlO3JldHVybihuPW58fFJlKGUpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxuW3RdKXx8aWUoZSl8fChhPVMuc3R5bGUoZSx0KSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmUGUudGVzdChhKSYmSWUudGVzdCh0KSYmKHI9cy53aWR0aCxpPXMubWluV2lkdGgsbz1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPWkscy5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gRmUoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIWUoKSlyZXR1cm4odGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihsKXt1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIscmUuYXBwZW5kQ2hpbGQodSkuYXBwZW5kQ2hpbGQobCk7dmFyIGU9Qy5nZXRDb21wdXRlZFN0eWxlKGwpO249IjElIiE9PWUudG9wLHM9MTI9PT10KGUubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PXQobC5vZmZzZXRXaWR0aC8zKSxyZS5yZW1vdmVDaGlsZCh1KSxsPW51bGx9fWZ1bmN0aW9uIHQoZSl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChlKSl9dmFyIG4scixpLG8sYSxzLHU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPUUuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxufSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHN9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGl9LHJlbGlhYmxlVHJEaW1lbnNpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7cmV0dXJuIG51bGw9PWEmJihlPUUuY3JlYXRlRWxlbWVudCgidGFibGUiKSx0PUUuY3JlYXRlRWxlbWVudCgidHIiKSxuPUUuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZSIsdC5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MXB4IHNvbGlkIix0LnN0eWxlLmhlaWdodD0iMXB4IixuLnN0eWxlLmhlaWdodD0iOXB4IixuLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixyZS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZCh0KS5hcHBlbmRDaGlsZChuKSxyPUMuZ2V0Q29tcHV0ZWRTdHlsZSh0KSxhPXBhcnNlSW50KHIuaGVpZ2h0LDEwKStwYXJzZUludChyLmJvcmRlclRvcFdpZHRoLDEwKStwYXJzZUludChyLmJvcmRlckJvdHRvbVdpZHRoLDEwKT09PXQub2Zmc2V0SGVpZ2h0LHJlLnJlbW92ZUNoaWxkKGUpKSxhfX0pKX0oKTt2YXIgQmU9WyJXZWJraXQiLCJNb3oiLCJtcyJdLCRlPUUuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsX2U9e307ZnVuY3Rpb24gemUoZSl7dmFyIHQ9Uy5jc3NQcm9wc1tlXXx8X2VbZV07cmV0dXJuIHR8fChlIGluICRlP2U6X2VbZV09ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1CZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPUJlW25dK3QpaW4gJGUpcmV0dXJuIGV9KGUpfHxlKX12YXIgVWU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFZlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxHZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gWWUoZSx0LG4pe3ZhciByPXRlLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOnR9ZnVuY3Rpb24gUWUoZSx0LG4scixpLG8pe3ZhciBhPSJ3aWR0aCI9PT10PzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3MoZSxuK25lW2FdLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSkpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKSkpOih1Kz1TLmNzcyhlLCJwYWRkaW5nIituZVthXSwhMCxpKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKTpzKz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpO3JldHVybiFyJiYwPD1vJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBKZShlLHQsbil7dmFyIHI9UmUoZSksaT0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsciksbz1pLGE9V2UoZSx0LHIpLHM9Im9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7aWYoUGUudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJml8fCF5LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJkEoZSwidHIiKXx8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT0iYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLChvPXMgaW4gZSkmJihhPWVbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStRZShlLHQsbnx8KGk/ImJvcmRlciI6ImNvbnRlbnQiKSxvLHIsYSkrInB4In1mdW5jdGlvbiBLZShlLHQsbixyLGkpe3JldHVybiBuZXcgS2UucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPVdlKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9WCh0KSx1PVhlLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PXplKHMpKSxhPVMuY3NzSG9va3NbdF18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLHIpKT9pOmxbdF07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihpPXRlLmV4ZWMobikpJiZpWzFdJiYobj1zZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwobFt0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVgodCk7cmV0dXJuIFhlLnRlc3QodCl8fCh0PXplKHMpKSwoYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYoaT1hLmdldChlLCEwLG4pKSx2b2lkIDA9PT1pJiYoaT1XZShlLHQscikpLCJub3JtYWwiPT09aSYmdCBpbiBHZSYmKGk9R2VbdF0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KGkpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDppKTppfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx1KXtTLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIVVlLnRlc3QoUy5jc3MoZSwiZGlzcGxheSIpKXx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9KZShlLHUsbik6TWUoZSxWZSxmdW5jdGlvbigpe3JldHVybiBKZShlLHUsbil9KX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVJlKGUpLG89IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixhPShvfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/UWUoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktUWUoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9dGUuZXhlYyh0KSkmJiJweCIhPT0oclszXXx8InB4IikmJihlLnN0eWxlW3VdPXQsdD1TLmNzcyhlLHUpKSxZZSgwLHQscyl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD1GZSh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoV2UoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LU1lKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe1MuY3NzSG9va3NbaStvXT17ZXhwYW5kOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49e30scj0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiICIpOltlXTt0PDQ7dCsrKW5baStuZVt0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihTLmNzc0hvb2tzW2krb10uc2V0PVllKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPVJlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPVMuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKGUsdCxuKTpTLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKFMuVHdlZW49S2UpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S2UsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9S2UucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOktlLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPUtlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD1TLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6S2UucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0pLmluaXQucHJvdG90eXBlPUtlLnByb3RvdHlwZSwoS2UucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9Uy5jc3MoZS5lbGVtLGUucHJvcCwiIikpJiYiYXV0byIhPT10P3Q6MH0sc2V0OmZ1bmN0aW9uKGUpe1MuZnguc3RlcFtlLnByb3BdP1MuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVt6ZShlLnByb3ApXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzpTLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSkuc2Nyb2xsVG9wPUtlLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1LZS5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIFplLGV0LHR0LG50LHJ0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxpdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIG90KCl7ZXQmJighMT09PUUuaGlkZGVuJiZDLnJlcXVlc3RBbmltYXRpb25GcmFtZT9DLnJlcXVlc3RBbmltYXRpb25GcmFtZShvdCk6Qy5zZXRUaW1lb3V0KG90LFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiBhdCgpe3JldHVybiBDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtaZT12b2lkIDB9KSxaZT1EYXRlLm5vdygpfWZ1bmN0aW9uIHN0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49bmVbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiB1dChlLHQsbil7Zm9yKHZhciByLGk9KGx0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KGx0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGx0KG8sZSx0KXt2YXIgbixhLHI9MCxpPWx0LnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoYSlyZXR1cm4hMTtmb3IodmFyIGU9WmV8fGF0KCksdD1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tZSksbj0xLSh0L2wuZHVyYXRpb258fDApLHI9MCxpPWwudHdlZW5zLmxlbmd0aDtyPGk7cisrKWwudHdlZW5zW3JdLnJ1bihuKTtyZXR1cm4gcy5ub3RpZnlXaXRoKG8sW2wsbix0XSksbjwxJiZpP3Q6KGl8fHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06byxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sdCksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOnQsc3RhcnRUaW1lOlplfHxhdCgpLGR1cmF0aW9uOnQuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49Uy5Ud2VlbihvLGwub3B0cyxlLHQsbC5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKG4pLG59LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWU/bC50d2VlbnMubGVuZ3RoOjA7aWYoYSlyZXR1cm4gdGhpcztmb3IoYT0hMDt0PG47dCsrKWwudHdlZW5zW3RdLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsLGVdKSk6cy5yZWplY3RXaXRoKG8sW2wsZV0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcighZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYoaT10W3I9WChuKV0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIG89YS5leHBhbmQobyksZGVsZXRlIGVbcl0sbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKTtlbHNlIHRbcl09aX0oYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7cjxpO3IrKylpZihuPWx0LnByZWZpbHRlcnNbcl0uY2FsbChsLG8sYyxsLm9wdHMpKXJldHVybiBtKG4uc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIFMubWFwKGMsdXQsbCksbShsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChvLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1TLkFuaW1hdGlvbj1TLmV4dGVuZChsdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHNlKG4uZWxlbSxlLHRlLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7bShlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChQKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0sbHQudHdlZW5lcnNbbl09bHQudHdlZW5lcnNbbl18fFtdLGx0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx2PVkuZ2V0KGUsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksdClpZihpPXRbcl0scnQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWRbcl09diYmdltyXXx8Uy5zdHlsZShlLHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QodCkpfHwhUy5pc0VtcHR5T2JqZWN0KGQpKWZvcihyIGluIGYmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sbnVsbD09KGw9diYmdi5kaXNwbGF5KSYmKGw9WS5nZXQoZSwiZGlzcGxheSIpKSwibm9uZSI9PT0oYz1TLmNzcyhlLCJkaXNwbGF5IikpJiYobD9jPWw6KGxlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz1TLmNzcyhlLCJkaXNwbGF5IiksbGUoW2VdKSkpLCgiaW5saW5lIj09PWN8fCJpbmxpbmUtYmxvY2siPT09YyYmbnVsbCE9bCkmJiJub25lIj09PVMuY3NzKGUsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7aC5kaXNwbGF5PWx9KSxudWxsPT1sJiYoYz1oLmRpc3BsYXksbD0ibm9uZSI9PT1jPyIiOmMpKSxoLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxkKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9WS5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpsfSksbyYmKHYuaGlkZGVuPSFnKSxnJiZsZShbZV0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGxlKFtlXSksWS5yZW1vdmUoZSwiZnhzaG93IiksZClTLnN0eWxlKGUscixkW3JdKX0pKSx1PXV0KGc/dltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9sdC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6bHQucHJlZmlsdGVycy5wdXNoKGUpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT9TLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fG0oZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIW0odCkmJnR9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGFlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1TLmlzRW1wdHlPYmplY3QodCksbz1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9bHQodGhpcyxTLmV4dGVuZCh7fSx0KSxvKTsoaXx8WS5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihpLGUsbyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChvKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpJiYobz1lLGU9aSxpPXZvaWQgMCksZSYmdGhpcy5xdWV1ZShpfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCx0PW51bGwhPWkmJmkrInF1ZXVlSG9va3MiLG49Uy50aW1lcnMscj1ZLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZpdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxTLmRlcXVldWUodGhpcyxpKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuITEhPT1hJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0PVkuZ2V0KHRoaXMpLG49dFthKyJxdWV1ZSJdLHI9dFthKyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxvPW4/bi5sZW5ndGg6MDtmb3IodC5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUscil7dmFyIGk9Uy5mbltyXTtTLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoc3QociwhMCksZSx0LG4pfX0pLFMuZWFjaCh7c2xpZGVEb3duOnN0KCJzaG93Iiksc2xpZGVVcDpzdCgiaGlkZSIpLHNsaWRlVG9nZ2xlOnN0KCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGUscil7Uy5mbltlXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYW5pbWF0ZShyLGUsdCxuKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1TLnRpbWVycztmb3IoWmU9RGF0ZS5ub3coKTt0PG4ubGVuZ3RoO3QrKykoZT1uW3RdKSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSxaZT12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24oZSl7Uy50aW1lcnMucHVzaChlKSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe2V0fHwoZXQ9ITAsb3QoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe2V0PW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24ocixlKXtyZXR1cm4gcj1TLmZ4JiZTLmZ4LnNwZWVkc1tyXXx8cixlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUsdCl7dmFyIG49Qy5zZXRUaW1lb3V0KGUscik7dC5zdG9wPWZ1bmN0aW9uKCl7Qy5jbGVhclRpbWVvdXQobil9fSl9LHR0PUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxudD1FLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLHR0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT10dC52YWx1ZSx5Lm9wdFNlbGVjdGVkPW50LnNlbGVjdGVkLCh0dD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0Iix0dC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXR0LnZhbHVlO3ZhciBjdCxmdD1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiAkKHRoaXMsUy5hdHRyLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/Uy5wcm9wKGUsdCxuKTooMT09PW8mJlMuaXNYTUxEb2MoZSl8fChpPVMuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2N0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmQShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goUCk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksY3Q9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P1MucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBhPWZ0W3RdfHxTLmZpbmQuYXR0cjtmdFt0XT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbnx8KGk9ZnRbb10sZnRbb109cixyPW51bGwhPWEoZSx0LG4pP286bnVsbCxmdFtvXT1pKSxyfX0pO3ZhciBwdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGR0PS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiBodChlKXtyZXR1cm4oZS5tYXRjaChQKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiBndChlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiB2dChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOiJzdHJpbmciPT10eXBlb2YgZSYmZS5tYXRjaChQKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMucHJvcCxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W2VdfHxlXX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmUy5pc1hNTERvYyhlKXx8KHQ9Uy5wcm9wRml4W3RdfHx0LGk9Uy5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6cHQudGVzdChlLm5vZGVOYW1lKXx8ZHQudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsZ3QodGhpcykpKX0pO2lmKChlPXZ0KHQpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1ndChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIraHQoaSkrIiAiKXthPTA7d2hpbGUobz1lW2ErK10pci5pbmRleE9mKCIgIitvKyIgIik8MCYmKHIrPW8rIiAiKTtpIT09KHM9aHQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSxndCh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT12dCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9Z3Qobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK2h0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXdoaWxlKC0xPHIuaW5kZXhPZigiICIrbysiICIpKXI9ci5yZXBsYWNlKCIgIitvKyIgIiwiICIpO2khPT0ocz1odChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGksdCl7dmFyIG89dHlwZW9mIGksYT0ic3RyaW5nIj09PW98fEFycmF5LmlzQXJyYXkoaSk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmYT90P3RoaXMuYWRkQ2xhc3MoaSk6dGhpcy5yZW1vdmVDbGFzcyhpKTptKGkpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKGkuY2FsbCh0aGlzLGUsZ3QodGhpcyksdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtpZihhKXt0PTAsbj1TKHRoaXMpLHI9dnQoaSk7d2hpbGUoZT1yW3QrK10pbi5oYXNDbGFzcyhlKT9uLnJlbW92ZUNsYXNzKGUpOm4uYWRkQ2xhc3MoZSl9ZWxzZSB2b2lkIDAhPT1pJiYiYm9vbGVhbiIhPT1vfHwoKGU9Z3QodGhpcykpJiZZLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PWk/IiI6WS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9IiAiK2UrIiAiO3doaWxlKG49dGhpc1tyKytdKWlmKDE9PT1uLm5vZGVUeXBlJiYtMTwoIiAiK2h0KGd0KG4pKSsiICIpLmluZGV4T2YodCkpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHl0PS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24obil7dmFyIHIsZSxpLHQ9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1tKG4pLHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgdDsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PSh0PWk/bi5jYWxsKHRoaXMsZSxTKHRoaXMpLnZhbCgpKTpuKT90PSIiOiJudW1iZXIiPT10eXBlb2YgdD90Kz0iIjpBcnJheS5pc0FycmF5KHQpJiYodD1TLm1hcCh0LGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksKHI9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIHImJnZvaWQgMCE9PXIuc2V0KHRoaXMsdCwidmFsdWUiKXx8KHRoaXMudmFsdWU9dCkpfSkpOnQ/KHI9Uy52YWxIb29rc1t0LnR5cGVdfHxTLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHImJnZvaWQgMCE9PShlPXIuZ2V0KHQsInZhbHVlIikpP2U6InN0cmluZyI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZSh5dCwiIik6bnVsbD09ZT8iIjplOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDpodChTLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhQShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PVMobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz1TLm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSkoKHI9aVthXSkuc2VsZWN0ZWQ9LTE8Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxTLmluQXJyYXkoUyhlKS52YWwoKSx0KX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBDO3ZhciBtdD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8seHQ9ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmLHA9W258fEVdLGQ9di5jYWxsKGUsInR5cGUiKT9lLnR5cGU6ZSxoPXYuY2FsbChlLCJuYW1lc3BhY2UiKT9lLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKG89Zj1hPW49bnx8RSwzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFtdC50ZXN0KGQrUy5ldmVudC50cmlnZ2VyZWQpJiYoLTE8ZC5pbmRleE9mKCIuIikmJihkPShoPWQuc3BsaXQoIi4iKSkuc2hpZnQoKSxoLnNvcnQoKSksdT1kLmluZGV4T2YoIjoiKTwwJiYib24iK2QsKGU9ZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZCwib2JqZWN0Ij09dHlwZW9mIGUmJmUpKS5pc1RyaWdnZXI9cj8yOjMsZS5uYW1lc3BhY2U9aC5qb2luKCIuIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxlLnJlc3VsdD12b2lkIDAsZS50YXJnZXR8fChlLnRhcmdldD1uKSx0PW51bGw9PXQ/W2VdOlMubWFrZUFycmF5KHQsW2VdKSxjPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scnx8IWMudHJpZ2dlcnx8ITEhPT1jLnRyaWdnZXIuYXBwbHkobix0KSkpe2lmKCFyJiYhYy5ub0J1YmJsZSYmIXgobikpe2ZvcihzPWMuZGVsZWdhdGVUeXBlfHxkLG10LnRlc3QocytkKXx8KG89by5wYXJlbnROb2RlKTtvO289by5wYXJlbnROb2RlKXAucHVzaChvKSxhPW87YT09PShuLm93bmVyRG9jdW1lbnR8fEUpJiZwLnB1c2goYS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3d8fEMpfWk9MDt3aGlsZSgobz1wW2krK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWY9byxlLnR5cGU9MTxpP3M6Yy5iaW5kVHlwZXx8ZCwobD0oWS5nZXQobywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2UudHlwZV0mJlkuZ2V0KG8sImhhbmRsZSIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiZWKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhVihuKXx8dSYmbShuW2RdKSYmIXgobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9ZCxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihkLHh0KSxuW2RdKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx4dCksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGEmJihuW3VdPWEpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7Uy5ldmVudC5zaW11bGF0ZShyLGUudGFyZ2V0LFMuZXZlbnQuZml4KGUpKX07Uy5ldmVudC5zcGVjaWFsW3JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PVkuYWNjZXNzKGUscik7dHx8ZS5hZGRFdmVudExpc3RlbmVyKG4saSwhMCksWS5hY2Nlc3MoZSxyLCh0fHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpLTE7dD9ZLmFjY2VzcyhlLHIsdCk6KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGksITApLFkucmVtb3ZlKGUscikpfX19KTt2YXIgYnQ9Qy5sb2NhdGlvbix3dD17Z3VpZDpEYXRlLm5vdygpfSxUdD0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24oZSl7dmFyIHQsbjtpZighZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3RyeXt0PShuZXcgQy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKGUpe31yZXR1cm4gbj10JiZ0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpWzBdLHQmJiFufHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIisobj9TLm1hcChuLmNoaWxkTm9kZXMsZnVuY3Rpb24oZSl7cmV0dXJuIGUudGV4dENvbnRlbnR9KS5qb2luKCJcbiIpOmUpKSx0fTt2YXIgQ3Q9L1xbXF0kLyxFdD0vXHI/XG4vZyxTdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksa3Q9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEF0KG4sZSxyLGkpe3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSx0KXtyfHxDdC50ZXN0KG4pP2kobix0KTpBdChuKyJbIisoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10P2U6IiIpKyJdIix0LHIsaSl9KTtlbHNlIGlmKHJ8fCJvYmplY3QiIT09dyhlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKUF0KG4rIlsiK3QrIl0iLGVbdF0scixpKX1TLnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49bSh0KT90KCk6dDtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT1lKXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KGUpKVMuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpQXQobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9TLm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYma3QudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVN0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFwZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShFdCwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoRXQsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgTnQ9LyUyMC9nLGp0PS8jLiokLyxEdD0vKFs/Jl0pXz1bXiZdKi8scXQ9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxMdD0vXig/OkdFVHxIRUFEKSQvLEh0PS9eXC9cLy8sT3Q9e30sUHQ9e30sUnQ9IiovIi5jb25jYXQoIioiKSxNdD1FLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBJdChvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iKiIpO3ZhciBuLHI9MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8W107aWYobSh0KSl3aGlsZShuPWlbcisrXSkiKyI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fCIqIiwob1tuXT1vW25dfHxbXSkudW5zaGlmdCh0KSk6KG9bbl09b1tuXXx8W10pLnB1c2godCl9fWZ1bmN0aW9uIFd0KHQsaSxvLGEpe3ZhciBzPXt9LHU9dD09PVB0O2Z1bmN0aW9uIGwoZSl7dmFyIHI7cmV0dXJuIHNbZV09ITAsUy5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBufHx1fHxzW25dP3U/IShyPW4pOnZvaWQgMDooaS5kYXRhVHlwZXMudW5zaGlmdChuKSxsKG4pLCExKX0pLHJ9cmV0dXJuIGwoaS5kYXRhVHlwZXNbMF0pfHwhc1siKiJdJiZsKCIqIil9ZnVuY3Rpb24gRnQoZSx0KXt2YXIgbixyLGk9Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsZSxyKSxlfU10LmhyZWY9YnQuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6YnQuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChidC5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpSdCx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/RnQoRnQoZSxTLmFqYXhTZXR0aW5ncyksdCk6RnQoUy5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6SXQoT3QpLGFqYXhUcmFuc3BvcnQ6SXQoUHQpLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLHQ9dHx8e307dmFyIGMsZixwLG4sZCxyLGgsZyxpLG8sdj1TLmFqYXhTZXR1cCh7fSx0KSx5PXYuY29udGV4dHx8dixtPXYuY29udGV4dCYmKHkubm9kZVR5cGV8fHkuanF1ZXJ5KT9TKHkpOlMuZXZlbnQseD1TLkRlZmVycmVkKCksYj1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx3PXYuc3RhdHVzQ29kZXx8e30sYT17fSxzPXt9LHU9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoaCl7aWYoIW4pe249e307d2hpbGUodD1xdC5leGVjKHApKW5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KG5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQodFsyXSl9dD1uW2UudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT10P251bGw6dC5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gaD9wOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09aCYmKGU9c1tlLnRvTG93ZXJDYXNlKCldPXNbZS50b0xvd2VyQ2FzZSgpXXx8ZSxhW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWgmJih2Lm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihoKVQuYWx3YXlzKGVbVC5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpd1t0XT1bd1t0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8dTtyZXR1cm4gYyYmYy5hYm9ydCh0KSxsKDAsdCksdGhpc319O2lmKHgucHJvbWlzZShUKSx2LnVybD0oKGV8fHYudXJsfHxidC5ocmVmKSsiIikucmVwbGFjZShIdCxidC5wcm90b2NvbCsiLy8iKSx2LnR5cGU9dC5tZXRob2R8fHQudHlwZXx8di5tZXRob2R8fHYudHlwZSx2LmRhdGFUeXBlcz0odi5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFApfHxbIiJdLG51bGw9PXYuY3Jvc3NEb21haW4pe3I9RS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e3IuaHJlZj12LnVybCxyLmhyZWY9ci5ocmVmLHYuY3Jvc3NEb21haW49TXQucHJvdG9jb2wrIi8vIitNdC5ob3N0IT1yLnByb3RvY29sKyIvLyIrci5ob3N0fWNhdGNoKGUpe3YuY3Jvc3NEb21haW49ITB9fWlmKHYuZGF0YSYmdi5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiB2LmRhdGEmJih2LmRhdGE9Uy5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLFd0KE90LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Uy5ldmVudCYmdi5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHYudHlwZT12LnR5cGUudG9VcHBlckNhc2UoKSx2Lmhhc0NvbnRlbnQ9IUx0LnRlc3Qodi50eXBlKSxmPXYudXJsLnJlcGxhY2UoanQsIiIpLHYuaGFzQ29udGVudD92LmRhdGEmJnYucHJvY2Vzc0RhdGEmJjA9PT0odi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYodi5kYXRhPXYuZGF0YS5yZXBsYWNlKE50LCIrIikpOihvPXYudXJsLnNsaWNlKGYubGVuZ3RoKSx2LmRhdGEmJih2LnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oVHQudGVzdChmKT8iJiI6Ij8iKSt2LmRhdGEsZGVsZXRlIHYuZGF0YSksITE9PT12LmNhY2hlJiYoZj1mLnJlcGxhY2UoRHQsIiQxIiksbz0oVHQudGVzdChmKT8iJiI6Ij8iKSsiXz0iK3d0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtmXSksUy5ldGFnW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tmXSkpLCh2LmRhdGEmJnYuaGFzQ29udGVudCYmITEhPT12LmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHYuY29udGVudFR5cGUpLFQuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKygiKiIhPT12LmRhdGFUeXBlc1swXT8iLCAiK1J0KyI7IHE9MC4wMSI6IiIpOnYuYWNjZXB0c1siKiJdKSx2LmhlYWRlcnMpVC5zZXRSZXF1ZXN0SGVhZGVyKGksdi5oZWFkZXJzW2ldKTtpZih2LmJlZm9yZVNlbmQmJighMT09PXYuYmVmb3JlU2VuZC5jYWxsKHksVCx2KXx8aCkpcmV0dXJuIFQuYWJvcnQoKTtpZih1PSJhYm9ydCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9V3QoUHQsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbVCx2XSksaClyZXR1cm4gVDt2LmFzeW5jJiYwPHYudGltZW91dCYmKGQ9Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSx2LnRpbWVvdXQpKTt0cnl7aD0hMSxjLnNlbmQoYSxsKX1jYXRjaChlKXtpZihoKXRocm93IGU7bCgtMSxlKX19ZWxzZSBsKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD10O2h8fChoPSEwLGQmJkMuY2xlYXJUaW1lb3V0KGQpLGM9dm9pZCAwLHA9cnx8IiIsVC5yZWFkeVN0YXRlPTA8ZT80OjAsaT0yMDA8PWUmJmU8MzAwfHwzMDQ9PT1lLG4mJihzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfSh2LFQsbikpLCFpJiYtMTxTLmluQXJyYXkoInNjcmlwdCIsdi5kYXRhVHlwZXMpJiZTLmluQXJyYXkoImpzb24iLHYuZGF0YVR5cGVzKTwwJiYodi5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tmXT11KSksMjA0PT09ZXx8IkhFQUQiPT09di50eXBlP2w9Im5vY29udGVudCI6MzA0PT09ZT9sPSJub3Rtb2RpZmllZCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPSJlcnJvciIsZTwwJiYoZT0wKSkpLFQuc3RhdHVzPWUsVC5zdGF0dXNUZXh0PSh0fHxsKSsiIixpP3gucmVzb2x2ZVdpdGgoeSxbbyxsLFRdKTp4LnJlamVjdFdpdGgoeSxbVCxsLGFdKSxULnN0YXR1c0NvZGUodyksdz12b2lkIDAsZyYmbS50cmlnZ2VyKGk/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbVCx2LGk/bzphXSksYi5maXJlV2l0aCh5LFtULGxdKSxnJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtULHZdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFMuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBTLmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtTW2ldPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBtKHQpJiYocj1yfHxuLG49dCx0PXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxTLmlzUGxhaW5PYmplY3QoZSkmJmUpKX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKSJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpJiYoZS5jb250ZW50VHlwZT1lLmhlYWRlcnNbdF18fCIiKX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe1MuZ2xvYmFsRXZhbChlLHQsbil9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYobShlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PVMoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiBtKG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcihuLmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZShlKX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEMuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIEJ0PXswOjIwMCwxMjIzOjIwNH0sJHQ9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhJHQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gJHQseS5hamF4PSR0PSEhJHQsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBvLGE7aWYoeS5jb3JzfHwkdCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChCdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byYmYSgpfSl9LG89bygiYWJvcnQiKTt0cnl7ci5zZW5kKGkuaGFzQ29udGVudCYmaS5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihvKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe28mJm8oKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gUy5nbG9iYWxFdmFsKGUpLGV9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1TKCI8c2NyaXB0PiIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKCJsb2FkIGVycm9yIixpPWZ1bmN0aW9uKGUpe3IucmVtb3ZlKCksaT1udWxsLGUmJnQoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxFLmhlYWQuYXBwZW5kQ2hpbGQoclswXSl9LGFib3J0OmZ1bmN0aW9uKCl7aSYmaSgpfX19KTt2YXIgX3QsenQ9W10sVXQ9Lyg9KVw/KD89JnwkKXxcP1w/LztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9enQucG9wKCl8fFMuZXhwYW5kbysiXyIrd3QuZ3VpZCsrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9ITEhPT1lLmpzb25wJiYoVXQudGVzdChlLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT0oZS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZVdC50ZXN0KGUuZGF0YSkmJiJkYXRhIik7aWYoYXx8Impzb25wIj09PWUuZGF0YVR5cGVzWzBdKXJldHVybiByPWUuanNvbnBDYWxsYmFjaz1tKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLGE/ZVthXT1lW2FdLnJlcGxhY2UoVXQsIiQxIityKTohMSE9PWUuanNvbnAmJihlLnVybCs9KFR0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK3IpLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBvfHxTLmVycm9yKHIrIiB3YXMgbm90IGNhbGxlZCIpLG9bMF19LGUuZGF0YVR5cGVzWzBdPSJqc29uIixpPUNbcl0sQ1tyXT1mdW5jdGlvbigpe289YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhDKS5yZW1vdmVQcm9wKHIpOkNbcl09aSxlW3JdJiYoZS5qc29ucENhbGxiYWNrPXQuanNvbnBDYWxsYmFjayx6dC5wdXNoKHIpKSxvJiZtKGkpJiZpKG9bMF0pLG89aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoX3Q9RS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1fdC5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9bXTooImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPSh0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPUUubG9jYXRpb24uaHJlZix0LmhlYWQuYXBwZW5kQ2hpbGQocikpOnQ9RSksbz0hbiYmW10sKGk9Ti5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KGlbMV0pXTooaT14ZShbZV0sdCxvKSxvJiZvLmxlbmd0aCYmUyhvKS5yZW1vdmUoKSxTLm1lcmdlKFtdLGkuY2hpbGROb2RlcykpKTt2YXIgcixpLG99LFMuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybi0xPHMmJihyPWh0KGUuc2xpY2UocykpLGU9ZS5zbGljZSgwLHMpKSxtKHQpPyhuPXQsdD12b2lkIDApOnQmJiJvYmplY3QiPT10eXBlb2YgdCYmKGk9IlBPU1QiKSwwPGEubGVuZ3RoJiZTLmFqYXgoe3VybDplLHR5cGU6aXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5hbHdheXMobiYmZnVuY3Rpb24oZSx0KXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSl9KSx0aGlzfSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD1TLmNzcyhlLCJwb3NpdGlvbiIpLGM9UyhlKSxmPXt9OyJzdGF0aWMiPT09bCYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1jLm9mZnNldCgpLG89Uy5jc3MoZSwidG9wIiksdT1TLmNzcyhlLCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1sfHwiZml4ZWQiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoImF1dG8iKT8oYT0ocj1jLnBvc2l0aW9uKCkpLnRvcCxpPXIubGVmdCk6KGE9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLG0odCkmJih0PXQuY2FsbChlLG4sUy5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOmMuY3NzKGYpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPVMoZSkub2Zmc2V0KCkpLnRvcCs9Uy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPVMuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fHJlfSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsaSl7dmFyIG89InBhZ2VZT2Zmc2V0Ij09PWk7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih4KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSxuKXtTLmNzc0hvb2tzW25dPUZlKHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIHQ9V2UoZSxuKSxQZS50ZXN0KHQpP1MoZSkucG9zaXRpb24oKVtuXSsicHgiOnR9KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEscyl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OnMsIiI6Im91dGVyIithfSxmdW5jdGlvbihyLG8pe1MuZm5bb109ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgZSksaT1yfHwoITA9PT1lfHwhMD09PXQ/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB4KGUpPzA9PT1vLmluZGV4T2YoIm91dGVyIik/ZVsiaW5uZXIiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1lLm5vZGVUeXBlPyhyPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIithXSxyWyJzY3JvbGwiK2FdLGUuYm9keVsib2Zmc2V0IithXSxyWyJvZmZzZXQiK2FdLHJbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1uP1MuY3NzKGUsdCxpKTpTLnN0eWxlKGUsdCxuLGkpfSxzLG4/ZTp2b2lkIDAsbil9fSl9KSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe1MuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLG4pe1MuZm5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMub24obixudWxsLGUsdCk6dGhpcy50cmlnZ2VyKG4pfX0pO3ZhciBYdD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7Uy5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksbShlKSlyZXR1cm4gcj1zLmNhbGwoYXJndW1lbnRzLDIpLChpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxTLmd1aWQrKyxpfSxTLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1BLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9eCxTLmNhbWVsQ2FzZT1YLFMudHlwZT13LFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PVMudHlwZShlKTtyZXR1cm4oIm51bWJlciI9PT10fHwic3RyaW5nIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sUy50cmltPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKFh0LCIiKX0sImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KTt2YXIgVnQ9Qy5qUXVlcnksR3Q9Qy4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIEMuJD09PVMmJihDLiQ9R3QpLGUmJkMualF1ZXJ5PT09UyYmKEMualF1ZXJ5PVZ0KSxTfSwidW5kZWZpbmVkIj09dHlwZW9mIGUmJihDLmpRdWVyeT1DLiQ9UyksU30pOwo="},{"meta":{"name":"sweetalert2.min.js","url":"https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.js","ts":1637743635750,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuU3dlZXRhbGVydDI9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IHU9T2JqZWN0LmZyZWV6ZSh7Y2FuY2VsOiJjYW5jZWwiLGJhY2tkcm9wOiJiYWNrZHJvcCIsY2xvc2U6ImNsb3NlIixlc2M6ImVzYyIsdGltZXI6InRpbWVyIn0pLHQ9IlN3ZWV0QWxlcnQyOiIsbz1lPT5lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkscz1lPT5BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSxhPWU9Pntjb25zb2xlLndhcm4oIiIuY29uY2F0KHQsIiAiKS5jb25jYXQoIm9iamVjdCI9PXR5cGVvZiBlP2Uuam9pbigiICIpOmUpKX0scj1lPT57Y29uc29sZS5lcnJvcigiIi5jb25jYXQodCwiICIpLmNvbmNhdChlKSl9LG49W10saT0oZSx0KT0+e3Q9JyInLmNvbmNhdChlLCciIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBQbGVhc2UgdXNlICInKS5jb25jYXQodCwnIiBpbnN0ZWFkLicpLG4uaW5jbHVkZXModCl8fChuLnB1c2godCksYSh0KSl9LGQ9ZT0+ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSgpOmUsYz1lPT5lJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b1Byb21pc2UsbD1lPT5jKGUpP2UudG9Qcm9taXNlKCk6UHJvbWlzZS5yZXNvbHZlKGUpLHA9ZT0+ZSYmUHJvbWlzZS5yZXNvbHZlKGUpPT09ZSxtPWU9PiJvYmplY3QiPT10eXBlb2YgZSYmZS5qcXVlcnksZz1lPT5lIGluc3RhbmNlb2YgRWxlbWVudHx8bShlKTt2YXIgZT1lPT57Y29uc3QgdD17fTtmb3IoY29uc3QgbiBpbiBlKXRbZVtuXV09InN3YWwyLSIrZVtuXTtyZXR1cm4gdH07Y29uc3QgaD1lKFsiY29udGFpbmVyIiwic2hvd24iLCJoZWlnaHQtYXV0byIsImlvc2ZpeCIsInBvcHVwIiwibW9kYWwiLCJuby1iYWNrZHJvcCIsIm5vLXRyYW5zaXRpb24iLCJ0b2FzdCIsInRvYXN0LXNob3duIiwic2hvdyIsImhpZGUiLCJjbG9zZSIsInRpdGxlIiwiaHRtbC1jb250YWluZXIiLCJhY3Rpb25zIiwiY29uZmlybSIsImRlbnkiLCJjYW5jZWwiLCJkZWZhdWx0LW91dGxpbmUiLCJmb290ZXIiLCJpY29uIiwiaWNvbi1jb250ZW50IiwiaW1hZ2UiLCJpbnB1dCIsImZpbGUiLCJyYW5nZSIsInNlbGVjdCIsInJhZGlvIiwiY2hlY2tib3giLCJsYWJlbCIsInRleHRhcmVhIiwiaW5wdXRlcnJvciIsImlucHV0LWxhYmVsIiwidmFsaWRhdGlvbi1tZXNzYWdlIiwicHJvZ3Jlc3Mtc3RlcHMiLCJhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCIsInByb2dyZXNzLXN0ZXAiLCJwcm9ncmVzcy1zdGVwLWxpbmUiLCJsb2FkZXIiLCJsb2FkaW5nIiwic3R5bGVkIiwidG9wIiwidG9wLXN0YXJ0IiwidG9wLWVuZCIsInRvcC1sZWZ0IiwidG9wLXJpZ2h0IiwiY2VudGVyIiwiY2VudGVyLXN0YXJ0IiwiY2VudGVyLWVuZCIsImNlbnRlci1sZWZ0IiwiY2VudGVyLXJpZ2h0IiwiYm90dG9tIiwiYm90dG9tLXN0YXJ0IiwiYm90dG9tLWVuZCIsImJvdHRvbS1sZWZ0IiwiYm90dG9tLXJpZ2h0IiwiZ3Jvdy1yb3ciLCJncm93LWNvbHVtbiIsImdyb3ctZnVsbHNjcmVlbiIsInJ0bCIsInRpbWVyLXByb2dyZXNzLWJhciIsInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXIiLCJzY3JvbGxiYXItbWVhc3VyZSIsImljb24tc3VjY2VzcyIsImljb24td2FybmluZyIsImljb24taW5mbyIsImljb24tcXVlc3Rpb24iLCJpY29uLWVycm9yIl0pLGY9ZShbInN1Y2Nlc3MiLCJ3YXJuaW5nIiwiaW5mbyIsInF1ZXN0aW9uIiwiZXJyb3IiXSksYj0oKT0+ZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5jb250YWluZXIpKSx5PWU9Pntjb25zdCB0PWIoKTtyZXR1cm4gdD90LnF1ZXJ5U2VsZWN0b3IoZSk6bnVsbH0sdj1lPT55KCIuIi5jb25jYXQoZSkpLHc9KCk9PnYoaC5wb3B1cCksQz0oKT0+dihoLmljb24pLGs9KCk9PnYoaC50aXRsZSksQT0oKT0+dihoWyJodG1sLWNvbnRhaW5lciJdKSxQPSgpPT52KGguaW1hZ2UpLEI9KCk9PnYoaFsicHJvZ3Jlc3Mtc3RlcHMiXSkseD0oKT0+dihoWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksRT0oKT0+eSgiLiIuY29uY2F0KGguYWN0aW9ucywiIC4iKS5jb25jYXQoaC5jb25maXJtKSksUz0oKT0+eSgiLiIuY29uY2F0KGguYWN0aW9ucywiIC4iKS5jb25jYXQoaC5kZW55KSk7Y29uc3QgVD0oKT0+eSgiLiIuY29uY2F0KGgubG9hZGVyKSksTD0oKT0+eSgiLiIuY29uY2F0KGguYWN0aW9ucywiIC4iKS5jb25jYXQoaC5jYW5jZWwpKSxPPSgpPT52KGguYWN0aW9ucyksaj0oKT0+dihoLmZvb3RlciksRD0oKT0+dihoWyJ0aW1lci1wcm9ncmVzcy1iYXIiXSksTT0oKT0+dihoLmNsb3NlKSxJPSgpPT57Y29uc3QgZT1zKHcoKS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pOm5vdChbdGFiaW5kZXg9IjAiXSknKSkuc29ydCgoZSx0KT0+KGU9cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoInRhYmluZGV4IikpLCh0PXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKSk8ZT8xOmU8dD8tMTowKSk7dmFyIHQ9cyh3KCkucXVlcnlTZWxlY3RvckFsbCgnXG4gIGFbaHJlZl0sXG4gIGFyZWFbaHJlZl0sXG4gIGlucHV0Om5vdChbZGlzYWJsZWRdKSxcbiAgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSxcbiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFxuICBidXR0b246bm90KFtkaXNhYmxlZF0pLFxuICBpZnJhbWUsXG4gIG9iamVjdCxcbiAgZW1iZWQsXG4gIFt0YWJpbmRleD0iMCJdLFxuICBbY29udGVudGVkaXRhYmxlXSxcbiAgYXVkaW9bY29udHJvbHNdLFxuICB2aWRlb1tjb250cm9sc10sXG4gIHN1bW1hcnlcbicpKS5maWx0ZXIoZT0+Ii0xIiE9PWUuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKTtyZXR1cm4odD0+e2NvbnN0IG49W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspLTE9PT1uLmluZGV4T2YodFtlXSkmJm4ucHVzaCh0W2VdKTtyZXR1cm4gbn0pKGUuY29uY2F0KHQpKS5maWx0ZXIoZT0+ZWUoZSkpfSxIPSgpPT4hcSgpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoaFsibm8tYmFja2Ryb3AiXSkscT0oKT0+ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoaFsidG9hc3Qtc2hvd24iXSk7ZnVuY3Rpb24gVihlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2NvbnN0IG49RCgpO2VlKG4pJiYodCYmKG4uc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsbi5zdHlsZS53aWR0aD0iMTAwJSIpLHNldFRpbWVvdXQoKCk9PntuLnN0eWxlLnRyYW5zaXRpb249IndpZHRoICIuY29uY2F0KGUvMWUzLCJzIGxpbmVhciIpLG4uc3R5bGUud2lkdGg9IjAlIn0sMTApKX1jb25zdCBOPXtwcmV2aW91c0JvZHlQYWRkaW5nOm51bGx9LFU9KHQsZSk9PntpZih0LnRleHRDb250ZW50PSIiLGUpe2NvbnN0IG49bmV3IERPTVBhcnNlcixvPW4ucGFyc2VGcm9tU3RyaW5nKGUsInRleHQvaHRtbCIpO3Moby5xdWVyeVNlbGVjdG9yKCJoZWFkIikuY2hpbGROb2RlcykuZm9yRWFjaChlPT57dC5hcHBlbmRDaGlsZChlKX0pLHMoby5xdWVyeVNlbGVjdG9yKCJib2R5IikuY2hpbGROb2RlcykuZm9yRWFjaChlPT57dC5hcHBlbmRDaGlsZChlKX0pfX0sRj0odCxlKT0+e2lmKCFlKXJldHVybiExO3ZhciBuPWUuc3BsaXQoL1xzKy8pO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKWlmKCF0LmNsYXNzTGlzdC5jb250YWlucyhuW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH0sUj0oZSx0LG4pPT57dmFyIG8saTtpZihvPWUsaT10LHMoby5jbGFzc0xpc3QpLmZvckVhY2goZT0+e09iamVjdC52YWx1ZXMoaCkuaW5jbHVkZXMoZSl8fE9iamVjdC52YWx1ZXMoZikuaW5jbHVkZXMoZSl8fE9iamVjdC52YWx1ZXMoaS5zaG93Q2xhc3MpLmluY2x1ZGVzKGUpfHxvLmNsYXNzTGlzdC5yZW1vdmUoZSl9KSx0LmN1c3RvbUNsYXNzJiZ0LmN1c3RvbUNsYXNzW25dKXtpZigic3RyaW5nIiE9dHlwZW9mIHQuY3VzdG9tQ2xhc3Nbbl0mJiF0LmN1c3RvbUNsYXNzW25dLmZvckVhY2gpcmV0dXJuIGEoIkludmFsaWQgdHlwZSBvZiBjdXN0b21DbGFzcy4iLmNvbmNhdChuLCchIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCAiJykuY29uY2F0KHR5cGVvZiB0LmN1c3RvbUNsYXNzW25dLCciJykpO0soZSx0LmN1c3RvbUNsYXNzW25dKX19LHo9KGUsdCk9PntpZighdClyZXR1cm4gbnVsbDtzd2l0Y2godCl7Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmNhc2UiZmlsZSI6cmV0dXJuIFooZSxoW3RdKTtjYXNlImNoZWNrYm94IjpyZXR1cm4gZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5jaGVja2JveCwiIGlucHV0IikpO2Nhc2UicmFkaW8iOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChoLnJhZGlvLCIgaW5wdXQ6Y2hlY2tlZCIpKXx8ZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5yYWRpbywiIGlucHV0OmZpcnN0LWNoaWxkIikpO2Nhc2UicmFuZ2UiOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChoLnJhbmdlLCIgaW5wdXQiKSk7ZGVmYXVsdDpyZXR1cm4gWihlLGguaW5wdXQpfX0sVz1lPT57dmFyIHQ7ZS5mb2N1cygpLCJmaWxlIiE9PWUudHlwZSYmKHQ9ZS52YWx1ZSxlLnZhbHVlPSIiLGUudmFsdWU9dCl9LF89KGUsdCxuKT0+e2UmJnQmJih0PSJzdHJpbmciPT10eXBlb2YgdD90LnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbik6dCkuZm9yRWFjaCh0PT57ZS5mb3JFYWNoP2UuZm9yRWFjaChlPT57bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSl9LEs9KGUsdCk9PntfKGUsdCwhMCl9LFk9KGUsdCk9PntfKGUsdCwhMSl9LFo9KHQsbik9Pntmb3IobGV0IGU9MDtlPHQuY2hpbGROb2Rlcy5sZW5ndGg7ZSsrKWlmKEYodC5jaGlsZE5vZGVzW2VdLG4pKXJldHVybiB0LmNoaWxkTm9kZXNbZV19LEo9KGUsdCxuKT0+eyhuPW49PT0iIi5jb25jYXQocGFyc2VJbnQobikpP3BhcnNlSW50KG4pOm4pfHwwPT09cGFyc2VJbnQobik/ZS5zdHlsZVt0XT0ibnVtYmVyIj09dHlwZW9mIG4/IiIuY29uY2F0KG4sInB4Iik6bjplLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSxYPWZ1bmN0aW9uKGUpe2Uuc3R5bGUuZGlzcGxheT0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImZsZXgifSwkPWU9PntlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxHPShlLHQsbixvKT0+e2NvbnN0IGk9ZS5xdWVyeVNlbGVjdG9yKHQpO2kmJihpLnN0eWxlW25dPW8pfSxRPShlLHQsbik9Pnt0P1goZSxuKTokKGUpfSxlZT1lPT4hKCFlfHwhKGUub2Zmc2V0V2lkdGh8fGUub2Zmc2V0SGVpZ2h0fHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSksdGU9KCk9PiFlZShFKCkpJiYhZWUoUygpKSYmIWVlKEwoKSksbmU9ZT0+ISEoZS5zY3JvbGxIZWlnaHQ+ZS5jbGllbnRIZWlnaHQpLG9lPWU9Pntjb25zdCB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpO3ZhciBuPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tZHVyYXRpb24iKXx8IjAiKSxlPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIil8fCIwIik7cmV0dXJuIDA8bnx8MDxlfSxpZT0oKT0+InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQsc2U9J1xuIDxkaXYgYXJpYS1sYWJlbGxlZGJ5PSInLmNvbmNhdChoLnRpdGxlLCciIGFyaWEtZGVzY3JpYmVkYnk9IicpLmNvbmNhdChoWyJodG1sLWNvbnRhaW5lciJdLCciIGNsYXNzPSInKS5jb25jYXQoaC5wb3B1cCwnIiB0YWJpbmRleD0iLTEiPlxuICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInKS5jb25jYXQoaC5jbG9zZSwnIj48L2J1dHRvbj5cbiAgIDx1bCBjbGFzcz0iJykuY29uY2F0KGhbInByb2dyZXNzLXN0ZXBzIl0sJyI+PC91bD5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoLmljb24sJyI+PC9kaXY+XG4gICA8aW1nIGNsYXNzPSInKS5jb25jYXQoaC5pbWFnZSwnIiAvPlxuICAgPGgyIGNsYXNzPSInKS5jb25jYXQoaC50aXRsZSwnIiBpZD0iJykuY29uY2F0KGgudGl0bGUsJyI+PC9oMj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoWyJodG1sLWNvbnRhaW5lciJdLCciIGlkPSInKS5jb25jYXQoaFsiaHRtbC1jb250YWluZXIiXSwnIj48L2Rpdj5cbiAgIDxpbnB1dCBjbGFzcz0iJykuY29uY2F0KGguaW5wdXQsJyIgLz5cbiAgIDxpbnB1dCB0eXBlPSJmaWxlIiBjbGFzcz0iJykuY29uY2F0KGguZmlsZSwnIiAvPlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KGgucmFuZ2UsJyI+XG4gICAgIDxpbnB1dCB0eXBlPSJyYW5nZSIgLz5cbiAgICAgPG91dHB1dD48L291dHB1dD5cbiAgIDwvZGl2PlxuICAgPHNlbGVjdCBjbGFzcz0iJykuY29uY2F0KGguc2VsZWN0LCciPjwvc2VsZWN0PlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KGgucmFkaW8sJyI+PC9kaXY+XG4gICA8bGFiZWwgZm9yPSInKS5jb25jYXQoaC5jaGVja2JveCwnIiBjbGFzcz0iJykuY29uY2F0KGguY2hlY2tib3gsJyI+XG4gICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz5cbiAgICAgPHNwYW4gY2xhc3M9IicpLmNvbmNhdChoLmxhYmVsLCciPjwvc3Bhbj5cbiAgIDwvbGFiZWw+XG4gICA8dGV4dGFyZWEgY2xhc3M9IicpLmNvbmNhdChoLnRleHRhcmVhLCciPjwvdGV4dGFyZWE+XG4gICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaFsidmFsaWRhdGlvbi1tZXNzYWdlIl0sJyIgaWQ9IicpLmNvbmNhdChoWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSwnIj48L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoLmFjdGlvbnMsJyI+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoLmxvYWRlciwnIj48L2Rpdj5cbiAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInKS5jb25jYXQoaC5jb25maXJtLCciPjwvYnV0dG9uPlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicpLmNvbmNhdChoLmRlbnksJyI+PC9idXR0b24+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJykuY29uY2F0KGguY2FuY2VsLCciPjwvYnV0dG9uPlxuICAgPC9kaXY+XG4gICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaC5mb290ZXIsJyI+PC9kaXY+XG4gICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaFsidGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lciJdLCciPlxuICAgICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaFsidGltZXItcHJvZ3Jlc3MtYmFyIl0sJyI+PC9kaXY+XG4gICA8L2Rpdj5cbiA8L2Rpdj5cbicpLnJlcGxhY2UoLyhefFxuKVxzKi9nLCIiKSxhZT0oKT0+e29uLmlzVmlzaWJsZSgpJiZvbi5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCl9LHJlPWU9Pnt2YXIgdD0oKCk9Pntjb25zdCBlPWIoKTtyZXR1cm4hIWUmJihlLnJlbW92ZSgpLFkoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxbaFsibm8tYmFja2Ryb3AiXSxoWyJ0b2FzdC1zaG93biJdLGhbImhhcy1jb2x1bW4iXV0pLCEwKX0pKCk7aWYoaWUoKSlyKCJTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplIik7ZWxzZXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NOYW1lPWguY29udGFpbmVyLHQmJksobixoWyJuby10cmFuc2l0aW9uIl0pLFUobixzZSk7Y29uc3Qgbz0ic3RyaW5nIj09dHlwZW9mKHQ9ZS50YXJnZXQpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk6dDtvLmFwcGVuZENoaWxkKG4pLChlPT57Y29uc3QgdD13KCk7dC5zZXRBdHRyaWJ1dGUoInJvbGUiLGUudG9hc3Q/ImFsZXJ0IjoiZGlhbG9nIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtbGl2ZSIsZS50b2FzdD8icG9saXRlIjoiYXNzZXJ0aXZlIiksZS50b2FzdHx8dC5zZXRBdHRyaWJ1dGUoImFyaWEtbW9kYWwiLCJ0cnVlIil9KShlKSxlPW8sInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5kaXJlY3Rpb24mJksoYigpLGgucnRsKSwoKCk9Pntjb25zdCBlPXcoKSx0PVooZSxoLmlucHV0KSxuPVooZSxoLmZpbGUpLG89ZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5yYW5nZSwiIGlucHV0IikpLGk9ZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5yYW5nZSwiIG91dHB1dCIpKSxzPVooZSxoLnNlbGVjdCksYT1lLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChoLmNoZWNrYm94LCIgaW5wdXQiKSkscj1aKGUsaC50ZXh0YXJlYSk7dC5vbmlucHV0PWFlLG4ub25jaGFuZ2U9YWUscy5vbmNoYW5nZT1hZSxhLm9uY2hhbmdlPWFlLHIub25pbnB1dD1hZSxvLm9uaW5wdXQ9KCk9PnthZSgpLGkudmFsdWU9by52YWx1ZX0sby5vbmNoYW5nZT0oKT0+e2FlKCksby5uZXh0U2libGluZy52YWx1ZT1vLnZhbHVlfX0pKCl9fSxjZT0oZSx0KT0+e2UgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD90LmFwcGVuZENoaWxkKGUpOiJvYmplY3QiPT10eXBlb2YgZT8oKGUsdCk9PntpZihlLmpxdWVyeSlsZSh0LGUpO2Vsc2UgVSh0LGUudG9TdHJpbmcoKSl9KShlLHQpOmUmJlUodCxlKX0sbGU9KHQsbik9PntpZih0LnRleHRDb250ZW50PSIiLDAgaW4gbilmb3IobGV0IGU9MDtlIGluIG47ZSsrKXQuYXBwZW5kQ2hpbGQobltlXS5jbG9uZU5vZGUoITApKTtlbHNlIHQuYXBwZW5kQ2hpbGQobi5jbG9uZU5vZGUoITApKX0sdWU9KCgpPT57aWYoaWUoKSlyZXR1cm4hMTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0PXtXZWJraXRBbmltYXRpb246IndlYmtpdEFuaW1hdGlvbkVuZCIsT0FuaW1hdGlvbjoib0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kIixhbmltYXRpb246ImFuaW1hdGlvbmVuZCJ9O2Zvcihjb25zdCBuIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJnZvaWQgMCE9PWUuc3R5bGVbbl0pcmV0dXJuIHRbbl07cmV0dXJuITF9KSgpLGRlPShlLHQpPT57dmFyIG4sbyxpLHMsYSxyPU8oKSxjPVQoKTsodC5zaG93Q29uZmlybUJ1dHRvbnx8dC5zaG93RGVueUJ1dHRvbnx8dC5zaG93Q2FuY2VsQnV0dG9uP1g6JCkociksUihyLHQsImFjdGlvbnMiKSxuPXIsbz1jLGk9dCxzPUUoKSxhPVMoKSxyPUwoKSxwZShzLCJjb25maXJtIixpKSxwZShhLCJkZW55IixpKSxwZShyLCJjYW5jZWwiLGkpLGZ1bmN0aW9uKGUsdCxuLG8pe2lmKCFvLmJ1dHRvbnNTdHlsaW5nKXJldHVybiBZKFtlLHQsbl0saC5zdHlsZWQpO0soW2UsdCxuXSxoLnN0eWxlZCksby5jb25maXJtQnV0dG9uQ29sb3ImJihlLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmNvbmZpcm1CdXR0b25Db2xvcixLKGUsaFsiZGVmYXVsdC1vdXRsaW5lIl0pKTtvLmRlbnlCdXR0b25Db2xvciYmKHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPW8uZGVueUJ1dHRvbkNvbG9yLEsodCxoWyJkZWZhdWx0LW91dGxpbmUiXSkpO28uY2FuY2VsQnV0dG9uQ29sb3ImJihuLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmNhbmNlbEJ1dHRvbkNvbG9yLEsobixoWyJkZWZhdWx0LW91dGxpbmUiXSkpfShzLGEscixpKSxpLnJldmVyc2VCdXR0b25zJiYoaS50b2FzdD8obi5pbnNlcnRCZWZvcmUocixzKSxuLmluc2VydEJlZm9yZShhLHMpKToobi5pbnNlcnRCZWZvcmUocixvKSxuLmluc2VydEJlZm9yZShhLG8pLG4uaW5zZXJ0QmVmb3JlKHMsbykpKSxVKGMsdC5sb2FkZXJIdG1sKSxSKGMsdCwibG9hZGVyIil9O2Z1bmN0aW9uIHBlKGUsdCxuKXtRKGUsblsic2hvdyIuY29uY2F0KG8odCksIkJ1dHRvbiIpXSwiaW5saW5lLWJsb2NrIiksVShlLG5bIiIuY29uY2F0KHQsIkJ1dHRvblRleHQiKV0pLGUuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixuWyIiLmNvbmNhdCh0LCJCdXR0b25BcmlhTGFiZWwiKV0pLGUuY2xhc3NOYW1lPWhbdF0sUihlLG4sIiIuY29uY2F0KHQsIkJ1dHRvbiIpKSxLKGUsblsiIi5jb25jYXQodCwiQnV0dG9uQ2xhc3MiKV0pfWNvbnN0IG1lPShlLHQpPT57dmFyIG4sbyxpPWIoKTtpJiYobz1pLCJzdHJpbmciPT10eXBlb2Yobj10LmJhY2tkcm9wKT9vLnN0eWxlLmJhY2tncm91bmQ9bjpufHxLKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0saFsibm8tYmFja2Ryb3AiXSksbz1pLChuPXQucG9zaXRpb24paW4gaD9LKG8saFtuXSk6KGEoJ1RoZSAicG9zaXRpb24iIHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImNlbnRlciInKSxLKG8saC5jZW50ZXIpKSxuPWksIShvPXQuZ3Jvdyl8fCJzdHJpbmciIT10eXBlb2Ygb3x8KG89Imdyb3ctIi5jb25jYXQobykpaW4gaCYmSyhuLGhbb10pLFIoaSx0LCJjb250YWluZXIiKSl9O3ZhciBnZT17YXdhaXRpbmdQcm9taXNlOm5ldyBXZWFrTWFwLHByb21pc2U6bmV3IFdlYWtNYXAsaW5uZXJQYXJhbXM6bmV3IFdlYWtNYXAsZG9tQ2FjaGU6bmV3IFdlYWtNYXB9O2NvbnN0IGhlPVsiaW5wdXQiLCJmaWxlIiwicmFuZ2UiLCJzZWxlY3QiLCJyYWRpbyIsImNoZWNrYm94IiwidGV4dGFyZWEiXSxmZT0oZSxvKT0+e2NvbnN0IGk9dygpO2U9Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpO2NvbnN0IHM9IWV8fG8uaW5wdXQhPT1lLmlucHV0O2hlLmZvckVhY2goZT0+e3ZhciB0PWhbZV07Y29uc3Qgbj1aKGksdCk7KChlLHQpPT57Y29uc3Qgbj16KHcoKSxlKTtpZihuKXtiZShuKTtmb3IoY29uc3QgbyBpbiB0KW4uc2V0QXR0cmlidXRlKG8sdFtvXSl9fSkoZSxvLmlucHV0QXR0cmlidXRlcyksbi5jbGFzc05hbWU9dCxzJiYkKG4pfSksby5pbnB1dCYmKHMmJihlPT57aWYoIUNlW2UuaW5wdXRdKXJldHVybiByKCdVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXQhIEV4cGVjdGVkICJ0ZXh0IiwgImVtYWlsIiwgInBhc3N3b3JkIiwgIm51bWJlciIsICJ0ZWwiLCAic2VsZWN0IiwgInJhZGlvIiwgImNoZWNrYm94IiwgInRleHRhcmVhIiwgImZpbGUiIG9yICJ1cmwiLCBnb3QgIicuY29uY2F0KGUuaW5wdXQsJyInKSk7Y29uc3QgdD13ZShlLmlucHV0KSxuPUNlW2UuaW5wdXRdKHQsZSk7WChuKSxzZXRUaW1lb3V0KCgpPT57VyhuKX0pfSkobyksKGU9Pntjb25zdCB0PXdlKGUuaW5wdXQpO2lmKGUuY3VzdG9tQ2xhc3MpSyh0LGUuY3VzdG9tQ2xhc3MuaW5wdXQpfSkobykpfSxiZT10PT57Zm9yKGxldCBlPTA7ZTx0LmF0dHJpYnV0ZXMubGVuZ3RoO2UrKyl7dmFyIG49dC5hdHRyaWJ1dGVzW2VdLm5hbWU7WyJ0eXBlIiwidmFsdWUiLCJzdHlsZSJdLmluY2x1ZGVzKG4pfHx0LnJlbW92ZUF0dHJpYnV0ZShuKX19LHllPShlLHQpPT57ZS5wbGFjZWhvbGRlciYmIXQuaW5wdXRQbGFjZWhvbGRlcnx8KGUucGxhY2Vob2xkZXI9dC5pbnB1dFBsYWNlaG9sZGVyKX0sdmU9KGUsdCxuKT0+e2lmKG4uaW5wdXRMYWJlbCl7ZS5pZD1oLmlucHV0O2NvbnN0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTt2YXIgbz1oWyJpbnB1dC1sYWJlbCJdO2kuc2V0QXR0cmlidXRlKCJmb3IiLGUuaWQpLGkuY2xhc3NOYW1lPW8sSyhpLG4uY3VzdG9tQ2xhc3MuaW5wdXRMYWJlbCksaS5pbm5lclRleHQ9bi5pbnB1dExhYmVsLHQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmViZWdpbiIsaSl9fSx3ZT1lPT57ZT1oW2VdfHxoLmlucHV0O3JldHVybiBaKHcoKSxlKX0sQ2U9e307Q2UudGV4dD1DZS5lbWFpbD1DZS5wYXNzd29yZD1DZS5udW1iZXI9Q2UudGVsPUNlLnVybD0oZSx0KT0+KCJzdHJpbmciPT10eXBlb2YgdC5pbnB1dFZhbHVlfHwibnVtYmVyIj09dHlwZW9mIHQuaW5wdXRWYWx1ZT9lLnZhbHVlPXQuaW5wdXRWYWx1ZTpwKHQuaW5wdXRWYWx1ZSl8fGEoJ1VuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCAic3RyaW5nIiwgIm51bWJlciIgb3IgIlByb21pc2UiLCBnb3QgIicuY29uY2F0KHR5cGVvZiB0LmlucHV0VmFsdWUsJyInKSksdmUoZSxlLHQpLHllKGUsdCksZS50eXBlPXQuaW5wdXQsZSksQ2UuZmlsZT0oZSx0KT0+KHZlKGUsZSx0KSx5ZShlLHQpLGUpLENlLnJhbmdlPShlLHQpPT57Y29uc3Qgbj1lLnF1ZXJ5U2VsZWN0b3IoImlucHV0Iiksbz1lLnF1ZXJ5U2VsZWN0b3IoIm91dHB1dCIpO3JldHVybiBuLnZhbHVlPXQuaW5wdXRWYWx1ZSxuLnR5cGU9dC5pbnB1dCxvLnZhbHVlPXQuaW5wdXRWYWx1ZSx2ZShuLGUsdCksZX0sQ2Uuc2VsZWN0PShlLHQpPT57aWYoZS50ZXh0Q29udGVudD0iIix0LmlucHV0UGxhY2Vob2xkZXIpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7VShuLHQuaW5wdXRQbGFjZWhvbGRlciksbi52YWx1ZT0iIixuLmRpc2FibGVkPSEwLG4uc2VsZWN0ZWQ9ITAsZS5hcHBlbmRDaGlsZChuKX1yZXR1cm4gdmUoZSxlLHQpLGV9LENlLnJhZGlvPWU9PihlLnRleHRDb250ZW50PSIiLGUpLENlLmNoZWNrYm94PShlLHQpPT57Y29uc3Qgbj16KHcoKSwiY2hlY2tib3giKTtuLnZhbHVlPTEsbi5pZD1oLmNoZWNrYm94LG4uY2hlY2tlZD1Cb29sZWFuKHQuaW5wdXRWYWx1ZSk7dmFyIG89ZS5xdWVyeVNlbGVjdG9yKCJzcGFuIik7cmV0dXJuIFUobyx0LmlucHV0UGxhY2Vob2xkZXIpLGV9LENlLnRleHRhcmVhPShuLGUpPT57bi52YWx1ZT1lLmlucHV0VmFsdWUseWUobixlKSx2ZShuLG4sZSk7cmV0dXJuIHNldFRpbWVvdXQoKCk9PntpZigiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe2NvbnN0IHQ9cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodygpKS53aWR0aCk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9Pnt2YXIgZSxlPW4ub2Zmc2V0V2lkdGgrKGU9bixwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5tYXJnaW5MZWZ0KStwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5tYXJnaW5SaWdodCkpO2U+dD93KCkuc3R5bGUud2lkdGg9IiIuY29uY2F0KGUsInB4Iik6dygpLnN0eWxlLndpZHRoPW51bGx9KS5vYnNlcnZlKG4se2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsic3R5bGUiXX0pfX0pLG59O2NvbnN0IGtlPShlLHQpPT57Y29uc3Qgbj1BKCk7UihuLHQsImh0bWxDb250YWluZXIiKSx0Lmh0bWw/KGNlKHQuaHRtbCxuKSxYKG4sImJsb2NrIikpOnQudGV4dD8obi50ZXh0Q29udGVudD10LnRleHQsWChuLCJibG9jayIpKTokKG4pLGZlKGUsdCl9LEFlPShlLHQpPT57dmFyIG49aigpO1Eobix0LmZvb3RlciksdC5mb290ZXImJmNlKHQuZm9vdGVyLG4pLFIobix0LCJmb290ZXIiKX0sUGU9KGUsdCk9Pntjb25zdCBuPU0oKTtVKG4sdC5jbG9zZUJ1dHRvbkh0bWwpLFIobix0LCJjbG9zZUJ1dHRvbiIpLFEobix0LnNob3dDbG9zZUJ1dHRvbiksbi5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQuY2xvc2VCdXR0b25BcmlhTGFiZWwpfSxCZT0oZSx0KT0+e3ZhciBuPWdlLmlubmVyUGFyYW1zLmdldChlKSxlPUMoKTtyZXR1cm4gbiYmdC5pY29uPT09bi5pY29uPyhTZShlLHQpLHZvaWQgeGUoZSx0KSk6dC5pY29ufHx0Lmljb25IdG1sP3QuaWNvbiYmLTE9PT1PYmplY3Qua2V5cyhmKS5pbmRleE9mKHQuaWNvbik/KHIoJ1Vua25vd24gaWNvbiEgRXhwZWN0ZWQgInN1Y2Nlc3MiLCAiZXJyb3IiLCAid2FybmluZyIsICJpbmZvIiBvciAicXVlc3Rpb24iLCBnb3QgIicuY29uY2F0KHQuaWNvbiwnIicpKSwkKGUpKTooWChlKSxTZShlLHQpLHhlKGUsdCksdm9pZCBLKGUsdC5zaG93Q2xhc3MuaWNvbikpOiQoZSl9LHhlPShlLHQpPT57Zm9yKGNvbnN0IG4gaW4gZil0Lmljb24hPT1uJiZZKGUsZltuXSk7SyhlLGZbdC5pY29uXSksVGUoZSx0KSxFZSgpLFIoZSx0LCJpY29uIil9LEVlPSgpPT57Y29uc3QgZT13KCk7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiYmFja2dyb3VuZC1jb2xvciIpO2NvbnN0IG49ZS5xdWVyeVNlbGVjdG9yQWxsKCJbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV0sIC5zd2FsMi1zdWNjZXNzLWZpeCIpO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKW5bZV0uc3R5bGUuYmFja2dyb3VuZENvbG9yPXR9LFNlPShlLHQpPT57dmFyIG47ZS50ZXh0Q29udGVudD0iIix0Lmljb25IdG1sP1UoZSxMZSh0Lmljb25IdG1sKSk6InN1Y2Nlc3MiPT09dC5pY29uP1UoZSwnXG4gICAgICA8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLXRpcCI+PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLWxvbmciPjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtcmluZyI+PC9kaXY+IDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtZml4Ij48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodCI+PC9kaXY+XG4gICAgJyk6ImVycm9yIj09PXQuaWNvbj9VKGUsJ1xuICAgICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyayI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1sZWZ0Ij48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1yaWdodCI+PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICcpOihuPXtxdWVzdGlvbjoiPyIsd2FybmluZzoiISIsaW5mbzoiaSJ9LFUoZSxMZShuW3QuaWNvbl0pKSl9LFRlPShlLHQpPT57aWYodC5pY29uQ29sb3Ipe2Uuc3R5bGUuY29sb3I9dC5pY29uQ29sb3IsZS5zdHlsZS5ib3JkZXJDb2xvcj10Lmljb25Db2xvcjtmb3IoY29uc3QgbiBvZlsiLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiLCIuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmciLCIuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCIsIi5zd2FsMi14LW1hcmstbGluZS1yaWdodCJdKUcoZSxuLCJiYWNrZ3JvdW5kQ29sb3IiLHQuaWNvbkNvbG9yKTtHKGUsIi5zd2FsMi1zdWNjZXNzLXJpbmciLCJib3JkZXJDb2xvciIsdC5pY29uQ29sb3IpfX0sTGU9ZT0+JzxkaXYgY2xhc3M9IicuY29uY2F0KGhbImljb24tY29udGVudCJdLCciPicpLmNvbmNhdChlLCI8L2Rpdj4iKSxPZT0oZSx0KT0+e2NvbnN0IG49UCgpO2lmKCF0LmltYWdlVXJsKXJldHVybiAkKG4pO1gobiwiIiksbi5zZXRBdHRyaWJ1dGUoInNyYyIsdC5pbWFnZVVybCksbi5zZXRBdHRyaWJ1dGUoImFsdCIsdC5pbWFnZUFsdCksSihuLCJ3aWR0aCIsdC5pbWFnZVdpZHRoKSxKKG4sImhlaWdodCIsdC5pbWFnZUhlaWdodCksbi5jbGFzc05hbWU9aC5pbWFnZSxSKG4sdCwiaW1hZ2UiKX0samU9KGUsbyk9Pntjb25zdCBpPUIoKTtpZighby5wcm9ncmVzc1N0ZXBzfHwwPT09by5wcm9ncmVzc1N0ZXBzLmxlbmd0aClyZXR1cm4gJChpKTtYKGkpLGkudGV4dENvbnRlbnQ9IiIsby5jdXJyZW50UHJvZ3Jlc3NTdGVwPj1vLnByb2dyZXNzU3RlcHMubGVuZ3RoJiZhKCJJbnZhbGlkIGN1cnJlbnRQcm9ncmVzc1N0ZXAgcGFyYW1ldGVyLCBpdCBzaG91bGQgYmUgbGVzcyB0aGFuIHByb2dyZXNzU3RlcHMubGVuZ3RoIChjdXJyZW50UHJvZ3Jlc3NTdGVwIGxpa2UgSlMgYXJyYXlzIHN0YXJ0cyBmcm9tIDApIiksby5wcm9ncmVzc1N0ZXBzLmZvckVhY2goKGUsdCk9Pnt2YXIgbixlPShuPWUsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpLEsoZSxoWyJwcm9ncmVzcy1zdGVwIl0pLFUoZSxuKSxlKTtpLmFwcGVuZENoaWxkKGUpLHQ9PT1vLmN1cnJlbnRQcm9ncmVzc1N0ZXAmJksoZSxoWyJhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCJdKSx0IT09by5wcm9ncmVzc1N0ZXBzLmxlbmd0aC0xJiYodD0oZT0+e2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtyZXR1cm4gSyh0LGhbInByb2dyZXNzLXN0ZXAtbGluZSJdKSxlLnByb2dyZXNzU3RlcHNEaXN0YW5jZSYmKHQuc3R5bGUud2lkdGg9ZS5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UpLHR9KShvKSxpLmFwcGVuZENoaWxkKHQpKX0pfSxEZT0oZSx0KT0+e2NvbnN0IG49aygpO1Eobix0LnRpdGxlfHx0LnRpdGxlVGV4dCwiYmxvY2siKSx0LnRpdGxlJiZjZSh0LnRpdGxlLG4pLHQudGl0bGVUZXh0JiYobi5pbm5lclRleHQ9dC50aXRsZVRleHQpLFIobix0LCJ0aXRsZSIpfSxNZT0oZSx0KT0+e3ZhciBuPWIoKTtjb25zdCBvPXcoKTt0LnRvYXN0PyhKKG4sIndpZHRoIix0LndpZHRoKSxvLnN0eWxlLndpZHRoPSIxMDAlIixvLmluc2VydEJlZm9yZShUKCksQygpKSk6SihvLCJ3aWR0aCIsdC53aWR0aCksSihvLCJwYWRkaW5nIix0LnBhZGRpbmcpLHQuYmFja2dyb3VuZCYmKG8uc3R5bGUuYmFja2dyb3VuZD10LmJhY2tncm91bmQpLCQoeCgpKSwoKGUsdCk9PntpZihlLmNsYXNzTmFtZT0iIi5jb25jYXQoaC5wb3B1cCwiICIpLmNvbmNhdChlZShlKT90LnNob3dDbGFzcy5wb3B1cDoiIiksdC50b2FzdCl7SyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLGhbInRvYXN0LXNob3duIl0pO0soZSxoLnRvYXN0KX1lbHNlIEsoZSxoLm1vZGFsKTtpZihSKGUsdCwicG9wdXAiKSx0eXBlb2YgdC5jdXN0b21DbGFzcz09PSJzdHJpbmciKUsoZSx0LmN1c3RvbUNsYXNzKTtpZih0Lmljb24pSyhlLGhbImljb24tIi5jb25jYXQodC5pY29uKV0pfSkobyx0KX0sSWU9KGUsdCk9PntNZShlLHQpLG1lKGUsdCksamUoZSx0KSxCZShlLHQpLE9lKGUsdCksRGUoZSx0KSxQZShlLHQpLGtlKGUsdCksZGUoZSx0KSxBZShlLHQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpZFJlbmRlciYmdC5kaWRSZW5kZXIodygpKX07Y29uc3QgSGU9KCk9PkUoKSYmRSgpLmNsaWNrKCk7Y29uc3QgcWU9ZT0+e2xldCB0PXcoKTt0fHxvbi5maXJlKCksdD13KCk7dmFyIG49VCgpO3EoKT8kKEMoKSk6KChlLHQpPT57Y29uc3Qgbj1PKCksbz1UKCk7aWYoIXQmJmVlKEUoKSkpdD1FKCk7aWYoWChuKSx0KXskKHQpO28uc2V0QXR0cmlidXRlKCJkYXRhLWJ1dHRvbi10by1yZXBsYWNlIix0LmNsYXNzTmFtZSl9by5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvLHQpLEsoW2Usbl0saC5sb2FkaW5nKX0pKHQsZSksWChuKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiwhMCksdC5zZXRBdHRyaWJ1dGUoImFyaWEtYnVzeSIsITApLHQuZm9jdXMoKX0sVmU9MTAwLE5lPXt9LFVlPSgpPT57TmUucHJldmlvdXNBY3RpdmVFbGVtZW50JiZOZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXM/KE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cygpLE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudD1udWxsKTpkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5LmZvY3VzKCl9LEZlPW89Pm5ldyBQcm9taXNlKGU9PntpZighbylyZXR1cm4gZSgpO3ZhciB0PXdpbmRvdy5zY3JvbGxYLG49d2luZG93LnNjcm9sbFk7TmUucmVzdG9yZUZvY3VzVGltZW91dD1zZXRUaW1lb3V0KCgpPT57VWUoKSxlKCl9LFZlKSx3aW5kb3cuc2Nyb2xsVG8odCxuKX0pO2NvbnN0IFJlPSgpPT57aWYoTmUudGltZW91dClyZXR1cm4oKCk9Pntjb25zdCBlPUQoKTt2YXIgdD1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCk7ZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpLGUuc3R5bGUud2lkdGg9IjEwMCUiO3ZhciBuPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLndpZHRoKSxuPXBhcnNlSW50KHQvbioxMDApO2Uuc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKSxlLnN0eWxlLndpZHRoPSIiLmNvbmNhdChuLCIlIil9KSgpLE5lLnRpbWVvdXQuc3RvcCgpfSx6ZT0oKT0+e2lmKE5lLnRpbWVvdXQpe3ZhciBlPU5lLnRpbWVvdXQuc3RhcnQoKTtyZXR1cm4gVihlKSxlfX07bGV0IFdlPSExO2NvbnN0IF9lPXt9O2NvbnN0IEtlPXQ9Pntmb3IobGV0IGU9dC50YXJnZXQ7ZSYmZSE9PWRvY3VtZW50O2U9ZS5wYXJlbnROb2RlKWZvcihjb25zdCBvIGluIF9lKXt2YXIgbj1lLmdldEF0dHJpYnV0ZShvKTtpZihuKXJldHVybiB2b2lkIF9lW29dLmZpcmUoe3RlbXBsYXRlOm59KX19LFllPXt0aXRsZToiIix0aXRsZVRleHQ6IiIsdGV4dDoiIixodG1sOiIiLGZvb3RlcjoiIixpY29uOnZvaWQgMCxpY29uQ29sb3I6dm9pZCAwLGljb25IdG1sOnZvaWQgMCx0ZW1wbGF0ZTp2b2lkIDAsdG9hc3Q6ITEsc2hvd0NsYXNzOntwb3B1cDoic3dhbDItc2hvdyIsYmFja2Ryb3A6InN3YWwyLWJhY2tkcm9wLXNob3ciLGljb246InN3YWwyLWljb24tc2hvdyJ9LGhpZGVDbGFzczp7cG9wdXA6InN3YWwyLWhpZGUiLGJhY2tkcm9wOiJzd2FsMi1iYWNrZHJvcC1oaWRlIixpY29uOiJzd2FsMi1pY29uLWhpZGUifSxjdXN0b21DbGFzczp7fSx0YXJnZXQ6ImJvZHkiLGJhY2tkcm9wOiEwLGhlaWdodEF1dG86ITAsYWxsb3dPdXRzaWRlQ2xpY2s6ITAsYWxsb3dFc2NhcGVLZXk6ITAsYWxsb3dFbnRlcktleTohMCxzdG9wS2V5ZG93blByb3BhZ2F0aW9uOiEwLGtleWRvd25MaXN0ZW5lckNhcHR1cmU6ITEsc2hvd0NvbmZpcm1CdXR0b246ITAsc2hvd0RlbnlCdXR0b246ITEsc2hvd0NhbmNlbEJ1dHRvbjohMSxwcmVDb25maXJtOnZvaWQgMCxwcmVEZW55OnZvaWQgMCxjb25maXJtQnV0dG9uVGV4dDoiT0siLGNvbmZpcm1CdXR0b25BcmlhTGFiZWw6IiIsY29uZmlybUJ1dHRvbkNvbG9yOnZvaWQgMCxkZW55QnV0dG9uVGV4dDoiTm8iLGRlbnlCdXR0b25BcmlhTGFiZWw6IiIsZGVueUJ1dHRvbkNvbG9yOnZvaWQgMCxjYW5jZWxCdXR0b25UZXh0OiJDYW5jZWwiLGNhbmNlbEJ1dHRvbkFyaWFMYWJlbDoiIixjYW5jZWxCdXR0b25Db2xvcjp2b2lkIDAsYnV0dG9uc1N0eWxpbmc6ITAscmV2ZXJzZUJ1dHRvbnM6ITEsZm9jdXNDb25maXJtOiEwLGZvY3VzRGVueTohMSxmb2N1c0NhbmNlbDohMSxyZXR1cm5Gb2N1czohMCxzaG93Q2xvc2VCdXR0b246ITEsY2xvc2VCdXR0b25IdG1sOiImdGltZXM7IixjbG9zZUJ1dHRvbkFyaWFMYWJlbDoiQ2xvc2UgdGhpcyBkaWFsb2ciLGxvYWRlckh0bWw6IiIsc2hvd0xvYWRlck9uQ29uZmlybTohMSxzaG93TG9hZGVyT25EZW55OiExLGltYWdlVXJsOnZvaWQgMCxpbWFnZVdpZHRoOnZvaWQgMCxpbWFnZUhlaWdodDp2b2lkIDAsaW1hZ2VBbHQ6IiIsdGltZXI6dm9pZCAwLHRpbWVyUHJvZ3Jlc3NCYXI6ITEsd2lkdGg6dm9pZCAwLHBhZGRpbmc6dm9pZCAwLGJhY2tncm91bmQ6dm9pZCAwLGlucHV0OnZvaWQgMCxpbnB1dFBsYWNlaG9sZGVyOiIiLGlucHV0TGFiZWw6IiIsaW5wdXRWYWx1ZToiIixpbnB1dE9wdGlvbnM6e30saW5wdXRBdXRvVHJpbTohMCxpbnB1dEF0dHJpYnV0ZXM6e30saW5wdXRWYWxpZGF0b3I6dm9pZCAwLHJldHVybklucHV0VmFsdWVPbkRlbnk6ITEsdmFsaWRhdGlvbk1lc3NhZ2U6dm9pZCAwLGdyb3c6ITEscG9zaXRpb246ImNlbnRlciIscHJvZ3Jlc3NTdGVwczpbXSxjdXJyZW50UHJvZ3Jlc3NTdGVwOnZvaWQgMCxwcm9ncmVzc1N0ZXBzRGlzdGFuY2U6dm9pZCAwLHdpbGxPcGVuOnZvaWQgMCxkaWRPcGVuOnZvaWQgMCxkaWRSZW5kZXI6dm9pZCAwLHdpbGxDbG9zZTp2b2lkIDAsZGlkQ2xvc2U6dm9pZCAwLGRpZERlc3Ryb3k6dm9pZCAwLHNjcm9sbGJhclBhZGRpbmc6ITB9LFplPVsiYWxsb3dFc2NhcGVLZXkiLCJhbGxvd091dHNpZGVDbGljayIsImJhY2tncm91bmQiLCJidXR0b25zU3R5bGluZyIsImNhbmNlbEJ1dHRvbkFyaWFMYWJlbCIsImNhbmNlbEJ1dHRvbkNvbG9yIiwiY2FuY2VsQnV0dG9uVGV4dCIsImNsb3NlQnV0dG9uQXJpYUxhYmVsIiwiY2xvc2VCdXR0b25IdG1sIiwiY29uZmlybUJ1dHRvbkFyaWFMYWJlbCIsImNvbmZpcm1CdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwiY3VycmVudFByb2dyZXNzU3RlcCIsImN1c3RvbUNsYXNzIiwiZGVueUJ1dHRvbkFyaWFMYWJlbCIsImRlbnlCdXR0b25Db2xvciIsImRlbnlCdXR0b25UZXh0IiwiZGlkQ2xvc2UiLCJkaWREZXN0cm95IiwiZm9vdGVyIiwiaGlkZUNsYXNzIiwiaHRtbCIsImljb24iLCJpY29uQ29sb3IiLCJpY29uSHRtbCIsImltYWdlQWx0IiwiaW1hZ2VIZWlnaHQiLCJpbWFnZVVybCIsImltYWdlV2lkdGgiLCJwcmVDb25maXJtIiwicHJlRGVueSIsInByb2dyZXNzU3RlcHMiLCJyZXR1cm5Gb2N1cyIsInJldmVyc2VCdXR0b25zIiwic2hvd0NhbmNlbEJ1dHRvbiIsInNob3dDbG9zZUJ1dHRvbiIsInNob3dDb25maXJtQnV0dG9uIiwic2hvd0RlbnlCdXR0b24iLCJ0ZXh0IiwidGl0bGUiLCJ0aXRsZVRleHQiLCJ3aWxsQ2xvc2UiXSxKZT17fSxYZT1bImFsbG93T3V0c2lkZUNsaWNrIiwiYWxsb3dFbnRlcktleSIsImJhY2tkcm9wIiwiZm9jdXNDb25maXJtIiwiZm9jdXNEZW55IiwiZm9jdXNDYW5jZWwiLCJyZXR1cm5Gb2N1cyIsImhlaWdodEF1dG8iLCJrZXlkb3duTGlzdGVuZXJDYXB0dXJlIl0sJGU9ZT0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFllLGUpO2NvbnN0IEdlPWU9PkplW2VdLFFlPWU9PnskZShlKXx8YSgnVW5rbm93biBwYXJhbWV0ZXIgIicuY29uY2F0KGUsJyInKSl9LGV0PWU9PntYZS5pbmNsdWRlcyhlKSYmYSgnVGhlIHBhcmFtZXRlciAiJy5jb25jYXQoZSwnIiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHMnKSl9LHR0PWU9PntHZShlKSYmaShlLEdlKGUpKX07dmFyIG50PU9iamVjdC5mcmVlemUoe2lzVmFsaWRQYXJhbWV0ZXI6JGUsaXNVcGRhdGFibGVQYXJhbWV0ZXI6ZT0+LTEhPT1aZS5pbmRleE9mKGUpLGlzRGVwcmVjYXRlZFBhcmFtZXRlcjpHZSxhcmdzVG9QYXJhbXM6bj0+e2NvbnN0IG89e307cmV0dXJuIm9iamVjdCIhPXR5cGVvZiBuWzBdfHxnKG5bMF0pP1sidGl0bGUiLCJodG1sIiwiaWNvbiJdLmZvckVhY2goKGUsdCk9Pnt0PW5bdF07InN0cmluZyI9PXR5cGVvZiB0fHxnKHQpP29bZV09dDp2b2lkIDAhPT10JiZyKCJVbmV4cGVjdGVkIHR5cGUgb2YgIi5jb25jYXQoZSwnISBFeHBlY3RlZCAic3RyaW5nIiBvciAiRWxlbWVudCIsIGdvdCAnKS5jb25jYXQodHlwZW9mIHQpKX0pOk9iamVjdC5hc3NpZ24obyxuWzBdKSxvfSxpc1Zpc2libGU6KCk9PmVlKHcoKSksY2xpY2tDb25maXJtOkhlLGNsaWNrRGVueTooKT0+UygpJiZTKCkuY2xpY2soKSxjbGlja0NhbmNlbDooKT0+TCgpJiZMKCkuY2xpY2soKSxnZXRDb250YWluZXI6YixnZXRQb3B1cDp3LGdldFRpdGxlOmssZ2V0SHRtbENvbnRhaW5lcjpBLGdldEltYWdlOlAsZ2V0SWNvbjpDLGdldElucHV0TGFiZWw6KCk9PnYoaFsiaW5wdXQtbGFiZWwiXSksZ2V0Q2xvc2VCdXR0b246TSxnZXRBY3Rpb25zOk8sZ2V0Q29uZmlybUJ1dHRvbjpFLGdldERlbnlCdXR0b246UyxnZXRDYW5jZWxCdXR0b246TCxnZXRMb2FkZXI6VCxnZXRGb290ZXI6aixnZXRUaW1lclByb2dyZXNzQmFyOkQsZ2V0Rm9jdXNhYmxlRWxlbWVudHM6SSxnZXRWYWxpZGF0aW9uTWVzc2FnZTp4LGlzTG9hZGluZzooKT0+dygpLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiksZmlyZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBuZXcgdGhpcyguLi50KX0sbWl4aW46ZnVuY3Rpb24obil7Y2xhc3MgZSBleHRlbmRzIHRoaXN7X21haW4oZSx0KXtyZXR1cm4gc3VwZXIuX21haW4oZSxPYmplY3QuYXNzaWduKHt9LG4sdCkpfX1yZXR1cm4gZX0sc2hvd0xvYWRpbmc6cWUsZW5hYmxlTG9hZGluZzpxZSxnZXRUaW1lckxlZnQ6KCk9Pk5lLnRpbWVvdXQmJk5lLnRpbWVvdXQuZ2V0VGltZXJMZWZ0KCksc3RvcFRpbWVyOlJlLHJlc3VtZVRpbWVyOnplLHRvZ2dsZVRpbWVyOigpPT57dmFyIGU9TmUudGltZW91dDtyZXR1cm4gZSYmKGUucnVubmluZz9SZTp6ZSkoKX0saW5jcmVhc2VUaW1lcjplPT57aWYoTmUudGltZW91dCl7ZT1OZS50aW1lb3V0LmluY3JlYXNlKGUpO3JldHVybiBWKGUsITApLGV9fSxpc1RpbWVyUnVubmluZzooKT0+TmUudGltZW91dCYmTmUudGltZW91dC5pc1J1bm5pbmcoKSxiaW5kQ2xpY2tIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGU9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJkYXRhLXN3YWwtdGVtcGxhdGUiO19lW2VdPXRoaXMsV2V8fChkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixLZSksV2U9ITApfX0pO2Z1bmN0aW9uIG90KCl7dmFyIGU9Z2UuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO2lmKGUpe2NvbnN0IHQ9Z2UuZG9tQ2FjaGUuZ2V0KHRoaXMpOyQodC5sb2FkZXIpLHEoKT9lLmljb24mJlgoQygpKTooZT0+e2NvbnN0IHQ9ZS5wb3B1cC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUubG9hZGVyLmdldEF0dHJpYnV0ZSgiZGF0YS1idXR0b24tdG8tcmVwbGFjZSIpKTtpZih0Lmxlbmd0aClYKHRbMF0sImlubGluZS1ibG9jayIpO2Vsc2UgaWYodGUoKSkkKGUuYWN0aW9ucyl9KSh0KSxZKFt0LnBvcHVwLHQuYWN0aW9uc10saC5sb2FkaW5nKSx0LnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1idXN5IiksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbG9hZGluZyIpLHQuY29uZmlybUJ1dHRvbi5kaXNhYmxlZD0hMSx0LmRlbnlCdXR0b24uZGlzYWJsZWQ9ITEsdC5jYW5jZWxCdXR0b24uZGlzYWJsZWQ9ITF9fWNvbnN0IGl0PSgpPT57bnVsbD09PU4ucHJldmlvdXNCb2R5UGFkZGluZyYmZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0JiYoTi5wcmV2aW91c0JvZHlQYWRkaW5nPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKSksZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIuY29uY2F0KE4ucHJldmlvdXNCb2R5UGFkZGluZysoKCk9Pntjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPWhbInNjcm9sbGJhci1tZWFzdXJlIl0sZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLWUuY2xpZW50V2lkdGg7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksdH0pKCksInB4IikpfSxzdD0oKT0+e251bGwhPT1OLnByZXZpb3VzQm9keVBhZGRpbmcmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD0iIi5jb25jYXQoTi5wcmV2aW91c0JvZHlQYWRkaW5nLCJweCIpLE4ucHJldmlvdXNCb2R5UGFkZGluZz1udWxsKX0sYXQ9KCk9Pnt2YXIgZTsoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW18fCJNYWNJbnRlbCI9PT1uYXZpZ2F0b3IucGxhdGZvcm0mJjE8bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzKSYmIUYoZG9jdW1lbnQuYm9keSxoLmlvc2ZpeCkmJihlPWRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPSIiLmNvbmNhdCgtMSplLCJweCIpLEsoZG9jdW1lbnQuYm9keSxoLmlvc2ZpeCksKCgpPT57Y29uc3QgZT1iKCk7bGV0IHQ7ZS5vbnRvdWNoc3RhcnQ9ZT0+e3Q9cnQoZSl9LGUub250b3VjaG1vdmU9ZT0+e2lmKHQpe2UucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpfX19KSgpLCgoKT0+e2NvbnN0IGU9IW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhDcmlPU3xGeGlPU3xFZGdpT1N8WWFCcm93c2VyfFVDQnJvd3NlcikvaSk7aWYoZSl7Y29uc3QgdD00NDtpZih3KCkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodC10KWIoKS5zdHlsZS5wYWRkaW5nQm90dG9tPSIiLmNvbmNhdCh0LCJweCIpfX0pKCkpfSxydD1lPT57dmFyIHQsbj1lLnRhcmdldCxvPWIoKTtyZXR1cm4hKCh0PWUpLnRvdWNoZXMmJnQudG91Y2hlcy5sZW5ndGgmJiJzdHlsdXMiPT09dC50b3VjaGVzWzBdLnRvdWNoVHlwZXx8KGU9ZSkudG91Y2hlcyYmMTxlLnRvdWNoZXMubGVuZ3RoKSYmKG49PT1vfHwhKG5lKG8pfHwiSU5QVVQiPT09bi50YWdOYW1lfHwiVEVYVEFSRUEiPT09bi50YWdOYW1lfHxuZShBKCkpJiZBKCkuY29udGFpbnMobikpKX0sY3Q9KCk9Pnt2YXIgZTtGKGRvY3VtZW50LmJvZHksaC5pb3NmaXgpJiYoZT1wYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCwxMCksWShkb2N1bWVudC5ib2R5LGguaW9zZml4KSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD0tMSplKX0sbHQ9KCk9Pntjb25zdCBlPXMoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7ZS5mb3JFYWNoKGU9PntlLmhhc0F0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpPyhlLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLGUuZ2V0QXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpLGUucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpOmUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSl9O3ZhciB1dD17c3dhbFByb21pc2VSZXNvbHZlOm5ldyBXZWFrTWFwLHN3YWxQcm9taXNlUmVqZWN0Om5ldyBXZWFrTWFwfTtmdW5jdGlvbiBkdChlLHQsbixvKXtxKCk/aHQoZSxvKTooRmUobikudGhlbigoKT0+aHQoZSxvKSksTmUua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixOZS5rZXlkb3duSGFuZGxlcix7Y2FwdHVyZTpOZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksTmUua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KT8odC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTpub25lICFpbXBvcnRhbnQiKSx0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSx0LmlubmVySFRNTD0iIik6dC5yZW1vdmUoKSxIKCkmJihzdCgpLGN0KCksbHQoKSksWShbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFtoLnNob3duLGhbImhlaWdodC1hdXRvIl0saFsibm8tYmFja2Ryb3AiXSxoWyJ0b2FzdC1zaG93biJdXSl9ZnVuY3Rpb24gcHQoZSl7ZT12b2lkIDAhPT0obj1lKT9PYmplY3QuYXNzaWduKHtpc0NvbmZpcm1lZDohMSxpc0RlbmllZDohMSxpc0Rpc21pc3NlZDohMX0sbik6e2lzQ29uZmlybWVkOiExLGlzRGVuaWVkOiExLGlzRGlzbWlzc2VkOiEwfTtjb25zdCB0PXV0LnN3YWxQcm9taXNlUmVzb2x2ZS5nZXQodGhpcyk7dmFyIG49KGU9Pntjb25zdCB0PXcoKTtpZighdClyZXR1cm4gZmFsc2U7Y29uc3Qgbj1nZS5pbm5lclBhcmFtcy5nZXQoZSk7aWYoIW58fEYodCxuLmhpZGVDbGFzcy5wb3B1cCkpcmV0dXJuIGZhbHNlO1kodCxuLnNob3dDbGFzcy5wb3B1cCksSyh0LG4uaGlkZUNsYXNzLnBvcHVwKTtjb25zdCBvPWIoKTtyZXR1cm4gWShvLG4uc2hvd0NsYXNzLmJhY2tkcm9wKSxLKG8sbi5oaWRlQ2xhc3MuYmFja2Ryb3ApLGd0KGUsdCxuKSx0cnVlfSkodGhpcyk7dGhpcy5pc0F3YWl0aW5nUHJvbWlzZSgpP2UuaXNEaXNtaXNzZWR8fChtdCh0aGlzKSx0KGUpKTpuJiZ0KGUpfWNvbnN0IG10PWU9PntlLmlzQXdhaXRpbmdQcm9taXNlKCkmJihnZS5hd2FpdGluZ1Byb21pc2UuZGVsZXRlKGUpLGdlLmlubmVyUGFyYW1zLmdldChlKXx8ZS5fZGVzdHJveSgpKX0sZ3Q9KGUsdCxuKT0+e3ZhciBvLGkscyxhPWIoKSxyPXVlJiZvZSh0KTsiZnVuY3Rpb24iPT10eXBlb2Ygbi53aWxsQ2xvc2UmJm4ud2lsbENsb3NlKHQpLHI/KG89ZSxpPXQscz1hLHI9bi5yZXR1cm5Gb2N1cyx0PW4uZGlkQ2xvc2UsTmUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrPWR0LmJpbmQobnVsbCxvLHMscix0KSxpLmFkZEV2ZW50TGlzdGVuZXIodWUsZnVuY3Rpb24oZSl7ZS50YXJnZXQ9PT1pJiYoTmUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIE5lLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayl9KSk6ZHQoZSxhLG4ucmV0dXJuRm9jdXMsbi5kaWRDbG9zZSl9LGh0PShlLHQpPT57c2V0VGltZW91dCgoKT0+eyJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmJpbmQoZS5wYXJhbXMpKCksZS5fZGVzdHJveSgpfSl9O2Z1bmN0aW9uIGZ0KGUsdCxuKXtjb25zdCBvPWdlLmRvbUNhY2hlLmdldChlKTt0LmZvckVhY2goZT0+e29bZV0uZGlzYWJsZWQ9bn0pfWZ1bmN0aW9uIGJ0KGUsdCl7aWYoIWUpcmV0dXJuITE7aWYoInJhZGlvIj09PWUudHlwZSl7Y29uc3Qgbj1lLnBhcmVudE5vZGUucGFyZW50Tm9kZSxvPW4ucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQiKTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKylvW2VdLmRpc2FibGVkPXR9ZWxzZSBlLmRpc2FibGVkPXR9Y2xhc3MgeXR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNhbGxiYWNrPWUsdGhpcy5yZW1haW5pbmc9dCx0aGlzLnJ1bm5pbmc9ITEsdGhpcy5zdGFydCgpfXN0YXJ0KCl7cmV0dXJuIHRoaXMucnVubmluZ3x8KHRoaXMucnVubmluZz0hMCx0aGlzLnN0YXJ0ZWQ9bmV3IERhdGUsdGhpcy5pZD1zZXRUaW1lb3V0KHRoaXMuY2FsbGJhY2ssdGhpcy5yZW1haW5pbmcpKSx0aGlzLnJlbWFpbmluZ31zdG9wKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMucnVubmluZz0hMSxjbGVhclRpbWVvdXQodGhpcy5pZCksdGhpcy5yZW1haW5pbmctPW5ldyBEYXRlLXRoaXMuc3RhcnRlZCksdGhpcy5yZW1haW5pbmd9aW5jcmVhc2UoZSl7dmFyIHQ9dGhpcy5ydW5uaW5nO3JldHVybiB0JiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9ZSx0JiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9Z2V0VGltZXJMZWZ0KCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMuc3RvcCgpLHRoaXMuc3RhcnQoKSksdGhpcy5yZW1haW5pbmd9aXNSdW5uaW5nKCl7cmV0dXJuIHRoaXMucnVubmluZ319dmFyIHZ0PXtlbWFpbDooZSx0KT0+L15bYS16QS1aMC05LitfLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aMC05LV17MiwyNH0kLy50ZXN0KGUpP1Byb21pc2UucmVzb2x2ZSgpOlByb21pc2UucmVzb2x2ZSh0fHwiSW52YWxpZCBlbWFpbCBhZGRyZXNzIiksdXJsOihlLHQpPT4vXmh0dHBzPzpcL1wvKHd3d1wuKT9bLWEtekEtWjAtOUA6JS5fK34jPV17MSwyNTZ9XC5bYS16XXsyLDYzfVxiKFstYS16QS1aMC05QDolXysufiM/Ji89XSopJC8udGVzdChlKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUodHx8IkludmFsaWQgVVJMIil9O2Z1bmN0aW9uIHd0KGUpe3ZhciB0LG47KHQ9ZSkuaW5wdXRWYWxpZGF0b3J8fE9iamVjdC5rZXlzKHZ0KS5mb3JFYWNoKGU9Pnt0LmlucHV0PT09ZSYmKHQuaW5wdXRWYWxpZGF0b3I9dnRbZV0pfSksZS5zaG93TG9hZGVyT25Db25maXJtJiYhZS5wcmVDb25maXJtJiZhKCJzaG93TG9hZGVyT25Db25maXJtIGlzIHNldCB0byB0cnVlLCBidXQgcHJlQ29uZmlybSBpcyBub3QgZGVmaW5lZC5cbnNob3dMb2FkZXJPbkNvbmZpcm0gc2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBwcmVDb25maXJtLCBzZWUgdXNhZ2UgZXhhbXBsZTpcbmh0dHBzOi8vc3dlZXRhbGVydDIuZ2l0aHViLmlvLyNhamF4LXJlcXVlc3QiKSwobj1lKS50YXJnZXQmJigic3RyaW5nIiE9dHlwZW9mIG4udGFyZ2V0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4udGFyZ2V0KSkmJigic3RyaW5nIj09dHlwZW9mIG4udGFyZ2V0fHxuLnRhcmdldC5hcHBlbmRDaGlsZCl8fChhKCdUYXJnZXQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiYm9keSInKSxuLnRhcmdldD0iYm9keSIpLCJzdHJpbmciPT10eXBlb2YgZS50aXRsZSYmKGUudGl0bGU9ZS50aXRsZS5zcGxpdCgiXG4iKS5qb2luKCI8YnIgLz4iKSkscmUoZSl9Y29uc3QgQ3Q9WyJzd2FsLXRpdGxlIiwic3dhbC1odG1sIiwic3dhbC1mb290ZXIiXSxrdD1lPT57ZT0ic3RyaW5nIj09dHlwZW9mIGUudGVtcGxhdGU/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnRlbXBsYXRlKTplLnRlbXBsYXRlO2lmKCFlKXJldHVybnt9O2U9ZS5jb250ZW50O3JldHVybihlPT57Y29uc3Qgbj1DdC5jb25jYXQoWyJzd2FsLXBhcmFtIiwic3dhbC1idXR0b24iLCJzd2FsLWltYWdlIiwic3dhbC1pY29uIiwic3dhbC1pbnB1dCIsInN3YWwtaW5wdXQtb3B0aW9uIl0pO3MoZS5jaGlsZHJlbikuZm9yRWFjaChlPT57Y29uc3QgdD1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtpZihuLmluZGV4T2YodCk9PT0tMSlhKCJVbnJlY29nbml6ZWQgZWxlbWVudCA8Ii5jb25jYXQodCwiPiIpKX0pfSkoZSksT2JqZWN0LmFzc2lnbigoZT0+e2NvbnN0IG89e307cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJzd2FsLXBhcmFtIikpLmZvckVhY2goZT0+e0F0KGUsWyJuYW1lIiwidmFsdWUiXSk7Y29uc3QgdD1lLmdldEF0dHJpYnV0ZSgibmFtZSIpO2xldCBuPWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpO2lmKHR5cGVvZiBZZVt0XT09PSJib29sZWFuIiYmbj09PSJmYWxzZSIpbj1mYWxzZTtpZih0eXBlb2YgWWVbdF09PT0ib2JqZWN0IiluPUpTT04ucGFyc2Uobik7b1t0XT1ufSksb30pKGUpLChlPT57Y29uc3Qgbj17fTtyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtYnV0dG9uIikpLmZvckVhY2goZT0+e0F0KGUsWyJ0eXBlIiwiY29sb3IiLCJhcmlhLWxhYmVsIl0pO2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKTtuWyIiLmNvbmNhdCh0LCJCdXR0b25UZXh0IildPWUuaW5uZXJIVE1MO25bInNob3ciLmNvbmNhdChvKHQpLCJCdXR0b24iKV09dHJ1ZTtpZihlLmhhc0F0dHJpYnV0ZSgiY29sb3IiKSluWyIiLmNvbmNhdCh0LCJCdXR0b25Db2xvciIpXT1lLmdldEF0dHJpYnV0ZSgiY29sb3IiKTtpZihlLmhhc0F0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpKW5bIiIuY29uY2F0KHQsIkJ1dHRvbkFyaWFMYWJlbCIpXT1lLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfSksbn0pKGUpLChlPT57Y29uc3QgdD17fSxuPWUucXVlcnlTZWxlY3Rvcigic3dhbC1pbWFnZSIpO2lmKG4pe0F0KG4sWyJzcmMiLCJ3aWR0aCIsImhlaWdodCIsImFsdCJdKTtpZihuLmhhc0F0dHJpYnV0ZSgic3JjIikpdC5pbWFnZVVybD1uLmdldEF0dHJpYnV0ZSgic3JjIik7aWYobi5oYXNBdHRyaWJ1dGUoIndpZHRoIikpdC5pbWFnZVdpZHRoPW4uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpO2lmKG4uaGFzQXR0cmlidXRlKCJoZWlnaHQiKSl0LmltYWdlSGVpZ2h0PW4uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTtpZihuLmhhc0F0dHJpYnV0ZSgiYWx0IikpdC5pbWFnZUFsdD1uLmdldEF0dHJpYnV0ZSgiYWx0Iil9cmV0dXJuIHR9KShlKSwoZT0+e2NvbnN0IHQ9e30sbj1lLnF1ZXJ5U2VsZWN0b3IoInN3YWwtaWNvbiIpO2lmKG4pe0F0KG4sWyJ0eXBlIiwiY29sb3IiXSk7aWYobi5oYXNBdHRyaWJ1dGUoInR5cGUiKSl0Lmljb249bi5nZXRBdHRyaWJ1dGUoInR5cGUiKTtpZihuLmhhc0F0dHJpYnV0ZSgiY29sb3IiKSl0Lmljb25Db2xvcj1uLmdldEF0dHJpYnV0ZSgiY29sb3IiKTt0Lmljb25IdG1sPW4uaW5uZXJIVE1MfXJldHVybiB0fSkoZSksKGU9Pntjb25zdCBvPXt9LHQ9ZS5xdWVyeVNlbGVjdG9yKCJzd2FsLWlucHV0Iik7aWYodCl7QXQodCxbInR5cGUiLCJsYWJlbCIsInBsYWNlaG9sZGVyIiwidmFsdWUiXSk7by5pbnB1dD10LmdldEF0dHJpYnV0ZSgidHlwZSIpfHwidGV4dCI7aWYodC5oYXNBdHRyaWJ1dGUoImxhYmVsIikpby5pbnB1dExhYmVsPXQuZ2V0QXR0cmlidXRlKCJsYWJlbCIpO2lmKHQuaGFzQXR0cmlidXRlKCJwbGFjZWhvbGRlciIpKW8uaW5wdXRQbGFjZWhvbGRlcj10LmdldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiKTtpZih0Lmhhc0F0dHJpYnV0ZSgidmFsdWUiKSlvLmlucHV0VmFsdWU9dC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9Y29uc3Qgbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtaW5wdXQtb3B0aW9uIik7aWYobi5sZW5ndGgpe28uaW5wdXRPcHRpb25zPXt9O3MobikuZm9yRWFjaChlPT57QXQoZSxbInZhbHVlIl0pO2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Y29uc3Qgbj1lLmlubmVySFRNTDtvLmlucHV0T3B0aW9uc1t0XT1ufSl9cmV0dXJuIG99KShlKSwoKGUsdCk9Pntjb25zdCBuPXt9O2Zvcihjb25zdCBvIGluIHQpe2NvbnN0IGk9dFtvXTtjb25zdCBzPWUucXVlcnlTZWxlY3RvcihpKTtpZihzKXtBdChzLFtdKTtuW2kucmVwbGFjZSgvXnN3YWwtLywiIildPXMuaW5uZXJIVE1MLnRyaW0oKX19cmV0dXJuIG59KShlLEN0KSl9LEF0PSh0LG4pPT57cyh0LmF0dHJpYnV0ZXMpLmZvckVhY2goZT0+ey0xPT09bi5pbmRleE9mKGUubmFtZSkmJmEoWydVbnJlY29nbml6ZWQgYXR0cmlidXRlICInLmNvbmNhdChlLm5hbWUsJyIgb24gPCcpLmNvbmNhdCh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSwiPi4iKSwiIi5jb25jYXQobi5sZW5ndGg/IkFsbG93ZWQgYXR0cmlidXRlcyBhcmU6ICIuY29uY2F0KG4uam9pbigiLCAiKSk6IlRvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4iKV0pfSl9LFB0PTEwLEJ0PWU9Pntjb25zdCB0PWIoKSxuPXcoKTsiZnVuY3Rpb24iPT10eXBlb2YgZS53aWxsT3BlbiYmZS53aWxsT3BlbihuKTt2YXIgbz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5vdmVyZmxvd1k7KChlLHQsbik9PntpZihLKGUsbi5zaG93Q2xhc3MuYmFja2Ryb3ApLHQuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLCIwIiwiaW1wb3J0YW50IiksWCh0LCJncmlkIiksc2V0VGltZW91dCgoKT0+e0sodCxuLnNob3dDbGFzcy5wb3B1cCk7dC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgib3BhY2l0eSIpfSxQdCksSyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLGguc2hvd24pLG4uaGVpZ2h0QXV0byYmbi5iYWNrZHJvcCYmIW4udG9hc3QpSyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLGhbImhlaWdodC1hdXRvIl0pfSkodCxuLGUpLHNldFRpbWVvdXQoKCk9PnsoKGUsdCk9PntpZih1ZSYmb2UodCkpe2Uuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iO3QuYWRkRXZlbnRMaXN0ZW5lcih1ZSx4dCl9ZWxzZSBlLnN0eWxlLm92ZXJmbG93WT0iYXV0byJ9KSh0LG4pfSxQdCksSCgpJiYoKChlLHQsbik9PntpZihhdCgpLHQmJm4hPT0iaGlkZGVuIilpdCgpO3NldFRpbWVvdXQoKCk9PntlLnNjcm9sbFRvcD0wfSl9KSh0LGUuc2Nyb2xsYmFyUGFkZGluZyxvKSwoKCk9Pntjb25zdCBlPXMoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7ZS5mb3JFYWNoKGU9PntlPT09YigpfHxlLmNvbnRhaW5zKGIoKSl8fChlLmhhc0F0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSYmZS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4iLGUuZ2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpKSxlLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIikpfSl9KSgpKSxxKCl8fE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudHx8KE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudD1kb2N1bWVudC5hY3RpdmVFbGVtZW50KSwiZnVuY3Rpb24iPT10eXBlb2YgZS5kaWRPcGVuJiZzZXRUaW1lb3V0KCgpPT5lLmRpZE9wZW4obikpLFkodCxoWyJuby10cmFuc2l0aW9uIl0pfSx4dD1lPT57Y29uc3QgdD13KCk7aWYoZS50YXJnZXQ9PT10KXtjb25zdCBuPWIoKTt0LnJlbW92ZUV2ZW50TGlzdGVuZXIodWUseHQpLG4uc3R5bGUub3ZlcmZsb3dZPSJhdXRvIn19LEV0PShlLHQpPT57InNlbGVjdCI9PT10LmlucHV0fHwicmFkaW8iPT09dC5pbnB1dD8oKHQsbik9Pntjb25zdCBvPXcoKSxpPWU9PlR0W24uaW5wdXRdKG8sTHQoZSksbik7aWYoYyhuLmlucHV0T3B0aW9ucyl8fHAobi5pbnB1dE9wdGlvbnMpKXtxZShFKCkpO2wobi5pbnB1dE9wdGlvbnMpLnRoZW4oZT0+e3QuaGlkZUxvYWRpbmcoKTtpKGUpfSl9ZWxzZSBpZih0eXBlb2Ygbi5pbnB1dE9wdGlvbnM9PT0ib2JqZWN0IilpKG4uaW5wdXRPcHRpb25zKTtlbHNlIHIoIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCAiLmNvbmNhdCh0eXBlb2Ygbi5pbnB1dE9wdGlvbnMpKX0pKGUsdCk6WyJ0ZXh0IiwiZW1haWwiLCJudW1iZXIiLCJ0ZWwiLCJ0ZXh0YXJlYSJdLmluY2x1ZGVzKHQuaW5wdXQpJiYoYyh0LmlucHV0VmFsdWUpfHxwKHQuaW5wdXRWYWx1ZSkpJiYocWUoRSgpKSwoKHQsbik9Pntjb25zdCBvPXQuZ2V0SW5wdXQoKTskKG8pLGwobi5pbnB1dFZhbHVlKS50aGVuKGU9PntvLnZhbHVlPW4uaW5wdXQ9PT0ibnVtYmVyIj9wYXJzZUZsb2F0KGUpfHwwOiIiLmNvbmNhdChlKTtYKG8pO28uZm9jdXMoKTt0LmhpZGVMb2FkaW5nKCl9KS5jYXRjaChlPT57cigiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiAiLmNvbmNhdChlKSk7by52YWx1ZT0iIjtYKG8pO28uZm9jdXMoKTt0LmhpZGVMb2FkaW5nKCl9KX0pKGUsdCkpfSxTdD0oZSx0KT0+e2NvbnN0IG49ZS5nZXRJbnB1dCgpO2lmKCFuKXJldHVybiBudWxsO3N3aXRjaCh0LmlucHV0KXtjYXNlImNoZWNrYm94IjpyZXR1cm4gbi5jaGVja2VkPzE6MDtjYXNlInJhZGlvIjpyZXR1cm4obz1uKS5jaGVja2VkP28udmFsdWU6bnVsbDtjYXNlImZpbGUiOnJldHVybihvPW4pLmZpbGVzLmxlbmd0aD9udWxsIT09by5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik/by5maWxlczpvLmZpbGVzWzBdOm51bGw7ZGVmYXVsdDpyZXR1cm4gdC5pbnB1dEF1dG9UcmltP24udmFsdWUudHJpbSgpOm4udmFsdWV9dmFyIG99LFR0PXtzZWxlY3Q6KGUsdCxpKT0+e2NvbnN0IHM9WihlLGguc2VsZWN0KSxhPShlLHQsbik9Pntjb25zdCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO28udmFsdWU9bixVKG8sdCksby5zZWxlY3RlZD1PdChuLGkuaW5wdXRWYWx1ZSksZS5hcHBlbmRDaGlsZChvKX07dC5mb3JFYWNoKGU9Pnt2YXIgdD1lWzBdO2NvbnN0IG49ZVsxXTtpZihBcnJheS5pc0FycmF5KG4pKXtjb25zdCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGdyb3VwIik7by5sYWJlbD10LG8uZGlzYWJsZWQ9ITEscy5hcHBlbmRDaGlsZChvKSxuLmZvckVhY2goZT0+YShvLGVbMV0sZVswXSkpfWVsc2UgYShzLG4sdCl9KSxzLmZvY3VzKCl9LHJhZGlvOihlLHQscyk9Pntjb25zdCBhPVooZSxoLnJhZGlvKTt0LmZvckVhY2goZT0+e3ZhciB0PWVbMF0sZT1lWzFdO2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7bi50eXBlPSJyYWRpbyIsbi5uYW1lPWgucmFkaW8sbi52YWx1ZT10LE90KHQscy5pbnB1dFZhbHVlKSYmKG4uY2hlY2tlZD0hMCk7Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7VShpLGUpLGkuY2xhc3NOYW1lPWgubGFiZWwsby5hcHBlbmRDaGlsZChuKSxvLmFwcGVuZENoaWxkKGkpLGEuYXBwZW5kQ2hpbGQobyl9KTtjb25zdCBuPWEucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQiKTtuLmxlbmd0aCYmblswXS5mb2N1cygpfX0sTHQ9bj0+e2NvbnN0IG89W107cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBNYXAmJm4gaW5zdGFuY2VvZiBNYXA/bi5mb3JFYWNoKChlLHQpPT57bGV0IG49ZTsib2JqZWN0Ij09dHlwZW9mIG4mJihuPUx0KG4pKSxvLnB1c2goW3Qsbl0pfSk6T2JqZWN0LmtleXMobikuZm9yRWFjaChlPT57bGV0IHQ9bltlXTsib2JqZWN0Ij09dHlwZW9mIHQmJih0PUx0KHQpKSxvLnB1c2goW2UsdF0pfSksb30sT3Q9KGUsdCk9PnQmJnQudG9TdHJpbmcoKT09PWUudG9TdHJpbmcoKSxqdD1lPT57dmFyIHQ9Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpO2UuZGlzYWJsZUJ1dHRvbnMoKSx0LmlucHV0P0l0KGUsImNvbmZpcm0iKTpVdChlLCEwKX0sRHQ9ZT0+e3ZhciB0PWdlLmlubmVyUGFyYW1zLmdldChlKTtlLmRpc2FibGVCdXR0b25zKCksdC5yZXR1cm5JbnB1dFZhbHVlT25EZW55P0l0KGUsImRlbnkiKTpxdChlLCExKX0sTXQ9KGUsdCk9PntlLmRpc2FibGVCdXR0b25zKCksdCh1LmNhbmNlbCl9LEl0PShlLHQpPT57dmFyIG49Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpLG89U3QoZSxuKTtuLmlucHV0VmFsaWRhdG9yP0h0KGUsbyx0KTplLmdldElucHV0KCkuY2hlY2tWYWxpZGl0eSgpPygiZGVueSI9PT10P3F0OlV0KShlLG8pOihlLmVuYWJsZUJ1dHRvbnMoKSxlLnNob3dWYWxpZGF0aW9uTWVzc2FnZShuLnZhbGlkYXRpb25NZXNzYWdlKSl9LEh0PSh0LG4sbyk9Pntjb25zdCBlPWdlLmlubmVyUGFyYW1zLmdldCh0KTt0LmRpc2FibGVJbnB1dCgpO2NvbnN0IGk9UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+bChlLmlucHV0VmFsaWRhdG9yKG4sZS52YWxpZGF0aW9uTWVzc2FnZSkpKTtpLnRoZW4oZT0+e3QuZW5hYmxlQnV0dG9ucygpLHQuZW5hYmxlSW5wdXQoKSxlP3Quc2hvd1ZhbGlkYXRpb25NZXNzYWdlKGUpOigiZGVueSI9PT1vP3F0OlV0KSh0LG4pfSl9LHF0PSh0LG4pPT57Y29uc3QgZT1nZS5pbm5lclBhcmFtcy5nZXQodHx8dm9pZCAwKTtpZihlLnNob3dMb2FkZXJPbkRlbnkmJnFlKFMoKSksZS5wcmVEZW55KXtnZS5hd2FpdGluZ1Byb21pc2Uuc2V0KHR8fHZvaWQgMCwhMCk7Y29uc3Qgbz1Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5sKGUucHJlRGVueShuLGUudmFsaWRhdGlvbk1lc3NhZ2UpKSk7by50aGVuKGU9PnshMT09PWU/dC5oaWRlTG9hZGluZygpOnQuY2xvc2VQb3B1cCh7aXNEZW5pZWQ6ITAsdmFsdWU6dm9pZCAwPT09ZT9uOmV9KX0pLmNhdGNoKGU9Pk50KHR8fHZvaWQgMCxlKSl9ZWxzZSB0LmNsb3NlUG9wdXAoe2lzRGVuaWVkOiEwLHZhbHVlOm59KX0sVnQ9KGUsdCk9PntlLmNsb3NlUG9wdXAoe2lzQ29uZmlybWVkOiEwLHZhbHVlOnR9KX0sTnQ9KGUsdCk9PntlLnJlamVjdFByb21pc2UodCl9LFV0PSh0LG4pPT57Y29uc3QgZT1nZS5pbm5lclBhcmFtcy5nZXQodHx8dm9pZCAwKTtpZihlLnNob3dMb2FkZXJPbkNvbmZpcm0mJnFlKCksZS5wcmVDb25maXJtKXt0LnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxnZS5hd2FpdGluZ1Byb21pc2Uuc2V0KHR8fHZvaWQgMCwhMCk7Y29uc3Qgbz1Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5sKGUucHJlQ29uZmlybShuLGUudmFsaWRhdGlvbk1lc3NhZ2UpKSk7by50aGVuKGU9PntlZSh4KCkpfHwhMT09PWU/dC5oaWRlTG9hZGluZygpOlZ0KHQsdm9pZCAwPT09ZT9uOmUpfSkuY2F0Y2goZT0+TnQodHx8dm9pZCAwLGUpKX1lbHNlIFZ0KHQsbil9LEZ0PSh0LGUsbixvKT0+e2Uua2V5ZG93blRhcmdldCYmZS5rZXlkb3duSGFuZGxlckFkZGVkJiYoZS5rZXlkb3duVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGUua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksZS5rZXlkb3duSGFuZGxlckFkZGVkPSExKSxuLnRvYXN0fHwoZS5rZXlkb3duSGFuZGxlcj1lPT4oKGUsdCxuKT0+e2NvbnN0IG89Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpO28mJihvLnN0b3BLZXlkb3duUHJvcGFnYXRpb24mJnQuc3RvcFByb3BhZ2F0aW9uKCksIkVudGVyIj09PXQua2V5P190KGUsdCxvKToiVGFiIj09PXQua2V5P0t0KHQsbyk6Wy4uLnp0LC4uLld0XS5pbmNsdWRlcyh0LmtleSk/WXQodC5rZXkpOiJFc2NhcGUiPT09dC5rZXkmJlp0KHQsbyxuKSl9KSh0LGUsbyksZS5rZXlkb3duVGFyZ2V0PW4ua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT93aW5kb3c6dygpLGUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT1uLmtleWRvd25MaXN0ZW5lckNhcHR1cmUsZS5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGUua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksZS5rZXlkb3duSGFuZGxlckFkZGVkPSEwKX0sUnQ9KGUsdCxuKT0+e2NvbnN0IG89SSgpO2lmKG8ubGVuZ3RoKXJldHVybih0Kz1uKT09PW8ubGVuZ3RoP3Q9MDotMT09PXQmJih0PW8ubGVuZ3RoLTEpLG9bdF0uZm9jdXMoKTt3KCkuZm9jdXMoKX0senQ9WyJBcnJvd1JpZ2h0IiwiQXJyb3dEb3duIl0sV3Q9WyJBcnJvd0xlZnQiLCJBcnJvd1VwIl0sX3Q9KGUsdCxuKT0+e3QuaXNDb21wb3Npbmd8fHQudGFyZ2V0JiZlLmdldElucHV0KCkmJnQudGFyZ2V0Lm91dGVySFRNTD09PWUuZ2V0SW5wdXQoKS5vdXRlckhUTUwmJihbInRleHRhcmVhIiwiZmlsZSJdLmluY2x1ZGVzKG4uaW5wdXQpfHwoSGUoKSx0LnByZXZlbnREZWZhdWx0KCkpKX0sS3Q9KGUsdCk9Pnt2YXIgbj1lLnRhcmdldCxvPUkoKTtsZXQgaT0tMTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKylpZihuPT09b1tlXSl7aT1lO2JyZWFrfWUuc2hpZnRLZXk/UnQoMCxpLC0xKTpSdCgwLGksMSksZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCl9LFl0PWU9Pntjb25zdCB0PUUoKSxuPVMoKSxvPUwoKTtpZihbdCxuLG9dLmluY2x1ZGVzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXtlPXp0LmluY2x1ZGVzKGUpPyJuZXh0RWxlbWVudFNpYmxpbmciOiJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIjtjb25zdCBpPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnRbZV07aSYmaS5mb2N1cygpfX0sWnQ9KGUsdCxuKT0+e2QodC5hbGxvd0VzY2FwZUtleSkmJihlLnByZXZlbnREZWZhdWx0KCksbih1LmVzYykpfSxKdD0oZSx0LG4pPT57dmFyIG8saSxzLGEscixjLGw7Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpLnRvYXN0PyhjPWUsbD1uLHQucG9wdXAub25jbGljaz0oKT0+e3ZhciBlPWdlLmlubmVyUGFyYW1zLmdldChjKTtlLnNob3dDb25maXJtQnV0dG9ufHxlLnNob3dEZW55QnV0dG9ufHxlLnNob3dDYW5jZWxCdXR0b258fGUuc2hvd0Nsb3NlQnV0dG9ufHxlLnRpbWVyfHxlLmlucHV0fHxsKHUuY2xvc2UpfSk6KChyPXQpLnBvcHVwLm9ubW91c2Vkb3duPSgpPT57ci5jb250YWluZXIub25tb3VzZXVwPWZ1bmN0aW9uKGUpe3IuY29udGFpbmVyLm9ubW91c2V1cD12b2lkIDAsZS50YXJnZXQ9PT1yLmNvbnRhaW5lciYmKFh0PSEwKX19LChhPXQpLmNvbnRhaW5lci5vbm1vdXNlZG93bj0oKT0+e2EucG9wdXAub25tb3VzZXVwPWZ1bmN0aW9uKGUpe2EucG9wdXAub25tb3VzZXVwPXZvaWQgMCxlLnRhcmdldCE9PWEucG9wdXAmJiFhLnBvcHVwLmNvbnRhaW5zKGUudGFyZ2V0KXx8KFh0PSEwKX19LG89ZSxzPW4sKGk9dCkuY29udGFpbmVyLm9uY2xpY2s9ZT0+e3ZhciB0PWdlLmlubmVyUGFyYW1zLmdldChvKTtYdD9YdD0hMTplLnRhcmdldD09PWkuY29udGFpbmVyJiZkKHQuYWxsb3dPdXRzaWRlQ2xpY2spJiZzKHUuYmFja2Ryb3ApfSl9O2xldCBYdD0hMTtjb25zdCAkdD0oZSx0LG4pPT57dmFyIG89RCgpOyQobyksdC50aW1lciYmKGUudGltZW91dD1uZXcgeXQoKCk9PntuKCJ0aW1lciIpLGRlbGV0ZSBlLnRpbWVvdXR9LHQudGltZXIpLHQudGltZXJQcm9ncmVzc0JhciYmKFgobyksc2V0VGltZW91dCgoKT0+e2UudGltZW91dCYmZS50aW1lb3V0LnJ1bm5pbmcmJlYodC50aW1lcil9KSkpfSxHdD0oZSx0KT0+e2lmKCF0LnRvYXN0KXJldHVybiBkKHQuYWxsb3dFbnRlcktleSk/dm9pZCgoKGUsdCk9PntpZih0LmZvY3VzRGVueSYmZWUoZS5kZW55QnV0dG9uKSl7ZS5kZW55QnV0dG9uLmZvY3VzKCk7cmV0dXJuIHRydWV9aWYodC5mb2N1c0NhbmNlbCYmZWUoZS5jYW5jZWxCdXR0b24pKXtlLmNhbmNlbEJ1dHRvbi5mb2N1cygpO3JldHVybiB0cnVlfWlmKHQuZm9jdXNDb25maXJtJiZlZShlLmNvbmZpcm1CdXR0b24pKXtlLmNvbmZpcm1CdXR0b24uZm9jdXMoKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KShlLHQpfHxSdCgwLC0xLDEpKTooKCk9PntpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZ0eXBlb2YgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyPT09ImZ1bmN0aW9uIilkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKX0pKCl9O2NvbnN0IFF0PWU9PntlLmlzQXdhaXRpbmdQcm9taXNlKCk/KGVuKGdlLGUpLGdlLmF3YWl0aW5nUHJvbWlzZS5zZXQoZSwhMCkpOihlbih1dCxlKSxlbihnZSxlKSl9LGVuPShlLHQpPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmRlbGV0ZSh0KX07ZT1PYmplY3QuZnJlZXplKHtoaWRlTG9hZGluZzpvdCxkaXNhYmxlTG9hZGluZzpvdCxnZXRJbnB1dDpmdW5jdGlvbihlKXt2YXIgdD1nZS5pbm5lclBhcmFtcy5nZXQoZXx8dGhpcyk7cmV0dXJuKGU9Z2UuZG9tQ2FjaGUuZ2V0KGV8fHRoaXMpKT96KGUucG9wdXAsdC5pbnB1dCk6bnVsbH0sY2xvc2U6cHQsaXNBd2FpdGluZ1Byb21pc2U6ZnVuY3Rpb24oKXtyZXR1cm4hIWdlLmF3YWl0aW5nUHJvbWlzZS5nZXQodGhpcyl9LHJlamVjdFByb21pc2U6ZnVuY3Rpb24oZSl7Y29uc3QgdD11dC5zd2FsUHJvbWlzZVJlamVjdC5nZXQodGhpcyk7bXQodGhpcyksdCYmdChlKX0sY2xvc2VQb3B1cDpwdCxjbG9zZU1vZGFsOnB0LGNsb3NlVG9hc3Q6cHQsZW5hYmxlQnV0dG9uczpmdW5jdGlvbigpe2Z0KHRoaXMsWyJjb25maXJtQnV0dG9uIiwiZGVueUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiJdLCExKX0sZGlzYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtmdCh0aGlzLFsiY29uZmlybUJ1dHRvbiIsImRlbnlCdXR0b24iLCJjYW5jZWxCdXR0b24iXSwhMCl9LGVuYWJsZUlucHV0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ0KHRoaXMuZ2V0SW5wdXQoKSwhMSl9LGRpc2FibGVJbnB1dDpmdW5jdGlvbigpe3JldHVybiBidCh0aGlzLmdldElucHV0KCksITApfSxzaG93VmFsaWRhdGlvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7Y29uc3QgdD1nZS5kb21DYWNoZS5nZXQodGhpcyk7dmFyIG49Z2UuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO1UodC52YWxpZGF0aW9uTWVzc2FnZSxlKSx0LnZhbGlkYXRpb25NZXNzYWdlLmNsYXNzTmFtZT1oWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSxuLmN1c3RvbUNsYXNzJiZuLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlJiZLKHQudmFsaWRhdGlvbk1lc3NhZ2Usbi5jdXN0b21DbGFzcy52YWxpZGF0aW9uTWVzc2FnZSksWCh0LnZhbGlkYXRpb25NZXNzYWdlKTtjb25zdCBvPXRoaXMuZ2V0SW5wdXQoKTtvJiYoby5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsITApLG8uc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixoWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksVyhvKSxLKG8saC5pbnB1dGVycm9yKSl9LHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U6ZnVuY3Rpb24oKXt2YXIgZT1nZS5kb21DYWNoZS5nZXQodGhpcyk7ZS52YWxpZGF0aW9uTWVzc2FnZSYmJChlLnZhbGlkYXRpb25NZXNzYWdlKTtjb25zdCB0PXRoaXMuZ2V0SW5wdXQoKTt0JiYodC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIpLHQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IiksWSh0LGguaW5wdXRlcnJvcikpfSxnZXRQcm9ncmVzc1N0ZXBzOmZ1bmN0aW9uKCl7cmV0dXJuIGdlLmRvbUNhY2hlLmdldCh0aGlzKS5wcm9ncmVzc1N0ZXBzfSxfbWFpbjpmdW5jdGlvbihlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307KGU9PnshZS5iYWNrZHJvcCYmZS5hbGxvd091dHNpZGVDbGljayYmYSgnImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpO2Zvcihjb25zdCB0IGluIGUpUWUodCksZS50b2FzdCYmZXQodCksdHQodCl9KShPYmplY3QuYXNzaWduKHt9LHQsZSkpLE5lLmN1cnJlbnRJbnN0YW5jZSYmKE5lLmN1cnJlbnRJbnN0YW5jZS5fZGVzdHJveSgpLEgoKSYmbHQoKSksTmUuY3VycmVudEluc3RhbmNlPXRoaXMsd3QoZT0oKGUsdCk9Pntjb25zdCBuPWt0KGUpLG89T2JqZWN0LmFzc2lnbih7fSxZZSx0LG4sZSk7cmV0dXJuIG8uc2hvd0NsYXNzPU9iamVjdC5hc3NpZ24oe30sWWUuc2hvd0NsYXNzLG8uc2hvd0NsYXNzKSxvLmhpZGVDbGFzcz1PYmplY3QuYXNzaWduKHt9LFllLmhpZGVDbGFzcyxvLmhpZGVDbGFzcyksb30pKGUsdCkpLE9iamVjdC5mcmVlemUoZSksTmUudGltZW91dCYmKE5lLnRpbWVvdXQuc3RvcCgpLGRlbGV0ZSBOZS50aW1lb3V0KSxjbGVhclRpbWVvdXQoTmUucmVzdG9yZUZvY3VzVGltZW91dCk7dmFyIG8saSxzLHQ9KGU9Pntjb25zdCB0PXtwb3B1cDp3KCksY29udGFpbmVyOmIoKSxhY3Rpb25zOk8oKSxjb25maXJtQnV0dG9uOkUoKSxkZW55QnV0dG9uOlMoKSxjYW5jZWxCdXR0b246TCgpLGxvYWRlcjpUKCksY2xvc2VCdXR0b246TSgpLHZhbGlkYXRpb25NZXNzYWdlOngoKSxwcm9ncmVzc1N0ZXBzOkIoKX07cmV0dXJuIGdlLmRvbUNhY2hlLnNldChlLHQpLHR9KSh0aGlzKTtyZXR1cm4gSWUodGhpcyxlKSxnZS5pbm5lclBhcmFtcy5zZXQodGhpcyxlKSxvPXRoaXMsaT10LHM9ZSxuZXcgUHJvbWlzZSgoZSx0KT0+e2NvbnN0IG49ZT0+e28uY2xvc2VQb3B1cCh7aXNEaXNtaXNzZWQ6ITAsZGlzbWlzczplfSl9O3V0LnN3YWxQcm9taXNlUmVzb2x2ZS5zZXQobyxlKSx1dC5zd2FsUHJvbWlzZVJlamVjdC5zZXQobyx0KSxpLmNvbmZpcm1CdXR0b24ub25jbGljaz0oKT0+anQobyksaS5kZW55QnV0dG9uLm9uY2xpY2s9KCk9PkR0KG8pLGkuY2FuY2VsQnV0dG9uLm9uY2xpY2s9KCk9Pk10KG8sbiksaS5jbG9zZUJ1dHRvbi5vbmNsaWNrPSgpPT5uKHUuY2xvc2UpLEp0KG8saSxuKSxGdChvLE5lLHMsbiksRXQobyxzKSxCdChzKSwkdChOZSxzLG4pLEd0KGkscyksc2V0VGltZW91dCgoKT0+e2kuY29udGFpbmVyLnNjcm9sbFRvcD0wfSl9KX0sdXBkYXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXcoKSxuPWdlLmlubmVyUGFyYW1zLmdldCh0aGlzKTtpZighZXx8RihlLG4uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4gYSgiWW91J3JlIHRyeWluZyB0byB1cGRhdGUgdGhlIGNsb3NlZCBvciBjbG9zaW5nIHBvcHVwLCB0aGF0IHdvbid0IHdvcmsuIFVzZSB0aGUgdXBkYXRlKCkgbWV0aG9kIGluIHByZUNvbmZpcm0gcGFyYW1ldGVyIG9yIHNob3cgYSBuZXcgcG9wdXAuIik7Y29uc3Qgbz17fTtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGU9Pntvbi5pc1VwZGF0YWJsZVBhcmFtZXRlcihlKT9vW2VdPXRbZV06YSgnSW52YWxpZCBwYXJhbWV0ZXIgdG8gdXBkYXRlOiAiJy5jb25jYXQoZSwnIi4gVXBkYXRhYmxlIHBhcmFtcyBhcmUgbGlzdGVkIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9ibG9iL21hc3Rlci9zcmMvdXRpbHMvcGFyYW1zLmpzXG5cbklmIHlvdSB0aGluayB0aGlzIHBhcmFtZXRlciBzaG91bGQgYmUgdXBkYXRhYmxlLCByZXF1ZXN0IGl0IGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvbmV3P3RlbXBsYXRlPTAyX2ZlYXR1cmVfcmVxdWVzdC5tZCcpKX0pLG49T2JqZWN0LmFzc2lnbih7fSxuLG8pLEllKHRoaXMsbiksZ2UuaW5uZXJQYXJhbXMuc2V0KHRoaXMsbiksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cGFyYW1zOnt2YWx1ZTpPYmplY3QuYXNzaWduKHt9LHRoaXMucGFyYW1zLHQpLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITB9fSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9Z2UuZG9tQ2FjaGUuZ2V0KHRoaXMpO2NvbnN0IHQ9Z2UuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO3Q/KGUucG9wdXAmJk5lLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayYmKE5lLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjaygpLGRlbGV0ZSBOZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2spLE5lLmRlZmVyRGlzcG9zYWxUaW1lciYmKGNsZWFyVGltZW91dChOZS5kZWZlckRpc3Bvc2FsVGltZXIpLGRlbGV0ZSBOZS5kZWZlckRpc3Bvc2FsVGltZXIpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpZERlc3Ryb3kmJnQuZGlkRGVzdHJveSgpLGU9dGhpcyxRdChlKSxkZWxldGUgZS5wYXJhbXMsZGVsZXRlIE5lLmtleWRvd25IYW5kbGVyLGRlbGV0ZSBOZS5rZXlkb3duVGFyZ2V0LGRlbGV0ZSBOZS5jdXJyZW50SW5zdGFuY2UpOlF0KHRoaXMpfX0pO2xldCB0bjtjbGFzcyBubntjb25zdHJ1Y3Rvcigpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt0bj10aGlzO2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3ZhciBvPU9iamVjdC5mcmVlemUodGhpcy5jb25zdHJ1Y3Rvci5hcmdzVG9QYXJhbXModCkpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6byx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtvPXRoaXMuX21haW4odGhpcy5wYXJhbXMpO2dlLnByb21pc2Uuc2V0KHRoaXMsbyl9fXRoZW4oZSl7Y29uc3QgdD1nZS5wcm9taXNlLmdldCh0aGlzKTtyZXR1cm4gdC50aGVuKGUpfWZpbmFsbHkoZSl7Y29uc3QgdD1nZS5wcm9taXNlLmdldCh0aGlzKTtyZXR1cm4gdC5maW5hbGx5KGUpfX1PYmplY3QuYXNzaWduKG5uLnByb3RvdHlwZSxlKSxPYmplY3QuYXNzaWduKG5uLG50KSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGU9PntubltlXT1mdW5jdGlvbigpe2lmKHRuKXJldHVybiB0bltlXSguLi5hcmd1bWVudHMpfX0pLG5uLkRpc21pc3NSZWFzb249dSxubi52ZXJzaW9uPSIxMS4yLjAiO2NvbnN0IG9uPW5uO3JldHVybiBvbi5kZWZhdWx0PW9uLG9ufSksdm9pZCAwIT09dGhpcyYmdGhpcy5Td2VldGFsZXJ0MiYmKHRoaXMuc3dhbD10aGlzLnN3ZWV0QWxlcnQ9dGhpcy5Td2FsPXRoaXMuU3dlZXRBbGVydD10aGlzLlN3ZWV0YWxlcnQyKTs="},{"meta":{"name":"spark-md5.min.js","url":"https://cdn.staticfile.org/spark-md5/3.0.0/spark-md5.min.js","ts":1637743635881,"mimetype":"text/javascript"},"source":"KGZ1bmN0aW9uKGZhY3Rvcnkpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCIpe21vZHVsZS5leHBvcnRzPWZhY3RvcnkoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoZmFjdG9yeSl9ZWxzZXt2YXIgZ2xvYjt0cnl7Z2xvYj13aW5kb3d9Y2F0Y2goZSl7Z2xvYj1zZWxmfWdsb2IuU3BhcmtNRDU9ZmFjdG9yeSgpfX0pKGZ1bmN0aW9uKHVuZGVmaW5lZCl7InVzZSBzdHJpY3QiO3ZhciBhZGQzMj1mdW5jdGlvbihhLGIpe3JldHVybiBhK2ImNDI5NDk2NzI5NX0saGV4X2Nocj1bIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiXTtmdW5jdGlvbiBjbW4ocSxhLGIseCxzLHQpe2E9YWRkMzIoYWRkMzIoYSxxKSxhZGQzMih4LHQpKTtyZXR1cm4gYWRkMzIoYTw8c3xhPj4+MzItcyxiKX1mdW5jdGlvbiBtZDVjeWNsZSh4LGspe3ZhciBhPXhbMF0sYj14WzFdLGM9eFsyXSxkPXhbM107YSs9KGImY3x+YiZkKStrWzBdLTY4MDg3NjkzNnwwO2E9KGE8PDd8YT4+PjI1KStifDA7ZCs9KGEmYnx+YSZjKStrWzFdLTM4OTU2NDU4NnwwO2Q9KGQ8PDEyfGQ+Pj4yMCkrYXwwO2MrPShkJmF8fmQmYikra1syXSs2MDYxMDU4MTl8MDtjPShjPDwxN3xjPj4+MTUpK2R8MDtiKz0oYyZkfH5jJmEpK2tbM10tMTA0NDUyNTMzMHwwO2I9KGI8PDIyfGI+Pj4xMCkrY3wwO2ErPShiJmN8fmImZCkra1s0XS0xNzY0MTg4OTd8MDthPShhPDw3fGE+Pj4yNSkrYnwwO2QrPShhJmJ8fmEmYykra1s1XSsxMjAwMDgwNDI2fDA7ZD0oZDw8MTJ8ZD4+PjIwKSthfDA7Yys9KGQmYXx+ZCZiKStrWzZdLTE0NzMyMzEzNDF8MDtjPShjPDwxN3xjPj4+MTUpK2R8MDtiKz0oYyZkfH5jJmEpK2tbN10tNDU3MDU5ODN8MDtiPShiPDwyMnxiPj4+MTApK2N8MDthKz0oYiZjfH5iJmQpK2tbOF0rMTc3MDAzNTQxNnwwO2E9KGE8PDd8YT4+PjI1KStifDA7ZCs9KGEmYnx+YSZjKStrWzldLTE5NTg0MTQ0MTd8MDtkPShkPDwxMnxkPj4+MjApK2F8MDtjKz0oZCZhfH5kJmIpK2tbMTBdLTQyMDYzfDA7Yz0oYzw8MTd8Yz4+PjE1KStkfDA7Yis9KGMmZHx+YyZhKStrWzExXS0xOTkwNDA0MTYyfDA7Yj0oYjw8MjJ8Yj4+PjEwKStjfDA7YSs9KGImY3x+YiZkKStrWzEyXSsxODA0NjAzNjgyfDA7YT0oYTw8N3xhPj4+MjUpK2J8MDtkKz0oYSZifH5hJmMpK2tbMTNdLTQwMzQxMTAxfDA7ZD0oZDw8MTJ8ZD4+PjIwKSthfDA7Yys9KGQmYXx+ZCZiKStrWzE0XS0xNTAyMDAyMjkwfDA7Yz0oYzw8MTd8Yz4+PjE1KStkfDA7Yis9KGMmZHx+YyZhKStrWzE1XSsxMjM2NTM1MzI5fDA7Yj0oYjw8MjJ8Yj4+PjEwKStjfDA7YSs9KGImZHxjJn5kKStrWzFdLTE2NTc5NjUxMHwwO2E9KGE8PDV8YT4+PjI3KStifDA7ZCs9KGEmY3xiJn5jKStrWzZdLTEwNjk1MDE2MzJ8MDtkPShkPDw5fGQ+Pj4yMykrYXwwO2MrPShkJmJ8YSZ+Yikra1sxMV0rNjQzNzE3NzEzfDA7Yz0oYzw8MTR8Yz4+PjE4KStkfDA7Yis9KGMmYXxkJn5hKStrWzBdLTM3Mzg5NzMwMnwwO2I9KGI8PDIwfGI+Pj4xMikrY3wwO2ErPShiJmR8YyZ+ZCkra1s1XS03MDE1NTg2OTF8MDthPShhPDw1fGE+Pj4yNykrYnwwO2QrPShhJmN8YiZ+Yykra1sxMF0rMzgwMTYwODN8MDtkPShkPDw5fGQ+Pj4yMykrYXwwO2MrPShkJmJ8YSZ+Yikra1sxNV0tNjYwNDc4MzM1fDA7Yz0oYzw8MTR8Yz4+PjE4KStkfDA7Yis9KGMmYXxkJn5hKStrWzRdLTQwNTUzNzg0OHwwO2I9KGI8PDIwfGI+Pj4xMikrY3wwO2ErPShiJmR8YyZ+ZCkra1s5XSs1Njg0NDY0Mzh8MDthPShhPDw1fGE+Pj4yNykrYnwwO2QrPShhJmN8YiZ+Yykra1sxNF0tMTAxOTgwMzY5MHwwO2Q9KGQ8PDl8ZD4+PjIzKSthfDA7Yys9KGQmYnxhJn5iKStrWzNdLTE4NzM2Mzk2MXwwO2M9KGM8PDE0fGM+Pj4xOCkrZHwwO2IrPShjJmF8ZCZ+YSkra1s4XSsxMTYzNTMxNTAxfDA7Yj0oYjw8MjB8Yj4+PjEyKStjfDA7YSs9KGImZHxjJn5kKStrWzEzXS0xNDQ0NjgxNDY3fDA7YT0oYTw8NXxhPj4+MjcpK2J8MDtkKz0oYSZjfGImfmMpK2tbMl0tNTE0MDM3ODR8MDtkPShkPDw5fGQ+Pj4yMykrYXwwO2MrPShkJmJ8YSZ+Yikra1s3XSsxNzM1MzI4NDczfDA7Yz0oYzw8MTR8Yz4+PjE4KStkfDA7Yis9KGMmYXxkJn5hKStrWzEyXS0xOTI2NjA3NzM0fDA7Yj0oYjw8MjB8Yj4+PjEyKStjfDA7YSs9KGJeY15kKStrWzVdLTM3ODU1OHwwO2E9KGE8PDR8YT4+PjI4KStifDA7ZCs9KGFeYl5jKStrWzhdLTIwMjI1NzQ0NjN8MDtkPShkPDwxMXxkPj4+MjEpK2F8MDtjKz0oZF5hXmIpK2tbMTFdKzE4MzkwMzA1NjJ8MDtjPShjPDwxNnxjPj4+MTYpK2R8MDtiKz0oY15kXmEpK2tbMTRdLTM1MzA5NTU2fDA7Yj0oYjw8MjN8Yj4+PjkpK2N8MDthKz0oYl5jXmQpK2tbMV0tMTUzMDk5MjA2MHwwO2E9KGE8PDR8YT4+PjI4KStifDA7ZCs9KGFeYl5jKStrWzRdKzEyNzI4OTMzNTN8MDtkPShkPDwxMXxkPj4+MjEpK2F8MDtjKz0oZF5hXmIpK2tbN10tMTU1NDk3NjMyfDA7Yz0oYzw8MTZ8Yz4+PjE2KStkfDA7Yis9KGNeZF5hKStrWzEwXS0xMDk0NzMwNjQwfDA7Yj0oYjw8MjN8Yj4+PjkpK2N8MDthKz0oYl5jXmQpK2tbMTNdKzY4MTI3OTE3NHwwO2E9KGE8PDR8YT4+PjI4KStifDA7ZCs9KGFeYl5jKStrWzBdLTM1ODUzNzIyMnwwO2Q9KGQ8PDExfGQ+Pj4yMSkrYXwwO2MrPShkXmFeYikra1szXS03MjI1MjE5Nzl8MDtjPShjPDwxNnxjPj4+MTYpK2R8MDtiKz0oY15kXmEpK2tbNl0rNzYwMjkxODl8MDtiPShiPDwyM3xiPj4+OSkrY3wwO2ErPShiXmNeZCkra1s5XS02NDAzNjQ0ODd8MDthPShhPDw0fGE+Pj4yOCkrYnwwO2QrPShhXmJeYykra1sxMl0tNDIxODE1ODM1fDA7ZD0oZDw8MTF8ZD4+PjIxKSthfDA7Yys9KGReYV5iKStrWzE1XSs1MzA3NDI1MjB8MDtjPShjPDwxNnxjPj4+MTYpK2R8MDtiKz0oY15kXmEpK2tbMl0tOTk1MzM4NjUxfDA7Yj0oYjw8MjN8Yj4+PjkpK2N8MDthKz0oY14oYnx+ZCkpK2tbMF0tMTk4NjMwODQ0fDA7YT0oYTw8NnxhPj4+MjYpK2J8MDtkKz0oYl4oYXx+YykpK2tbN10rMTEyNjg5MTQxNXwwO2Q9KGQ8PDEwfGQ+Pj4yMikrYXwwO2MrPShhXihkfH5iKSkra1sxNF0tMTQxNjM1NDkwNXwwO2M9KGM8PDE1fGM+Pj4xNykrZHwwO2IrPShkXihjfH5hKSkra1s1XS01NzQzNDA1NXwwO2I9KGI8PDIxfGI+Pj4xMSkrY3wwO2ErPShjXihifH5kKSkra1sxMl0rMTcwMDQ4NTU3MXwwO2E9KGE8PDZ8YT4+PjI2KStifDA7ZCs9KGJeKGF8fmMpKStrWzNdLTE4OTQ5ODY2MDZ8MDtkPShkPDwxMHxkPj4+MjIpK2F8MDtjKz0oYV4oZHx+YikpK2tbMTBdLTEwNTE1MjN8MDtjPShjPDwxNXxjPj4+MTcpK2R8MDtiKz0oZF4oY3x+YSkpK2tbMV0tMjA1NDkyMjc5OXwwO2I9KGI8PDIxfGI+Pj4xMSkrY3wwO2ErPShjXihifH5kKSkra1s4XSsxODczMzEzMzU5fDA7YT0oYTw8NnxhPj4+MjYpK2J8MDtkKz0oYl4oYXx+YykpK2tbMTVdLTMwNjExNzQ0fDA7ZD0oZDw8MTB8ZD4+PjIyKSthfDA7Yys9KGFeKGR8fmIpKStrWzZdLTE1NjAxOTgzODB8MDtjPShjPDwxNXxjPj4+MTcpK2R8MDtiKz0oZF4oY3x+YSkpK2tbMTNdKzEzMDkxNTE2NDl8MDtiPShiPDwyMXxiPj4+MTEpK2N8MDthKz0oY14oYnx+ZCkpK2tbNF0tMTQ1NTIzMDcwfDA7YT0oYTw8NnxhPj4+MjYpK2J8MDtkKz0oYl4oYXx+YykpK2tbMTFdLTExMjAyMTAzNzl8MDtkPShkPDwxMHxkPj4+MjIpK2F8MDtjKz0oYV4oZHx+YikpK2tbMl0rNzE4Nzg3MjU5fDA7Yz0oYzw8MTV8Yz4+PjE3KStkfDA7Yis9KGReKGN8fmEpKStrWzldLTM0MzQ4NTU1MXwwO2I9KGI8PDIxfGI+Pj4xMSkrY3wwO3hbMF09YSt4WzBdfDA7eFsxXT1iK3hbMV18MDt4WzJdPWMreFsyXXwwO3hbM109ZCt4WzNdfDB9ZnVuY3Rpb24gbWQ1YmxrKHMpe3ZhciBtZDVibGtzPVtdLGk7Zm9yKGk9MDtpPDY0O2krPTQpe21kNWJsa3NbaT4+Ml09cy5jaGFyQ29kZUF0KGkpKyhzLmNoYXJDb2RlQXQoaSsxKTw8OCkrKHMuY2hhckNvZGVBdChpKzIpPDwxNikrKHMuY2hhckNvZGVBdChpKzMpPDwyNCl9cmV0dXJuIG1kNWJsa3N9ZnVuY3Rpb24gbWQ1YmxrX2FycmF5KGEpe3ZhciBtZDVibGtzPVtdLGk7Zm9yKGk9MDtpPDY0O2krPTQpe21kNWJsa3NbaT4+Ml09YVtpXSsoYVtpKzFdPDw4KSsoYVtpKzJdPDwxNikrKGFbaSszXTw8MjQpfXJldHVybiBtZDVibGtzfWZ1bmN0aW9uIG1kNTEocyl7dmFyIG49cy5sZW5ndGgsc3RhdGU9WzE3MzI1ODQxOTMsLTI3MTczMzg3OSwtMTczMjU4NDE5NCwyNzE3MzM4NzhdLGksbGVuZ3RoLHRhaWwsdG1wLGxvLGhpO2ZvcihpPTY0O2k8PW47aSs9NjQpe21kNWN5Y2xlKHN0YXRlLG1kNWJsayhzLnN1YnN0cmluZyhpLTY0LGkpKSl9cz1zLnN1YnN0cmluZyhpLTY0KTtsZW5ndGg9cy5sZW5ndGg7dGFpbD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF07Zm9yKGk9MDtpPGxlbmd0aDtpKz0xKXt0YWlsW2k+PjJdfD1zLmNoYXJDb2RlQXQoaSk8PChpJTQ8PDMpfXRhaWxbaT4+Ml18PTEyODw8KGklNDw8Myk7aWYoaT41NSl7bWQ1Y3ljbGUoc3RhdGUsdGFpbCk7Zm9yKGk9MDtpPDE2O2krPTEpe3RhaWxbaV09MH19dG1wPW4qODt0bXA9dG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtsbz1wYXJzZUludCh0bXBbMl0sMTYpO2hpPXBhcnNlSW50KHRtcFsxXSwxNil8fDA7dGFpbFsxNF09bG87dGFpbFsxNV09aGk7bWQ1Y3ljbGUoc3RhdGUsdGFpbCk7cmV0dXJuIHN0YXRlfWZ1bmN0aW9uIG1kNTFfYXJyYXkoYSl7dmFyIG49YS5sZW5ndGgsc3RhdGU9WzE3MzI1ODQxOTMsLTI3MTczMzg3OSwtMTczMjU4NDE5NCwyNzE3MzM4NzhdLGksbGVuZ3RoLHRhaWwsdG1wLGxvLGhpO2ZvcihpPTY0O2k8PW47aSs9NjQpe21kNWN5Y2xlKHN0YXRlLG1kNWJsa19hcnJheShhLnN1YmFycmF5KGktNjQsaSkpKX1hPWktNjQ8bj9hLnN1YmFycmF5KGktNjQpOm5ldyBVaW50OEFycmF5KDApO2xlbmd0aD1hLmxlbmd0aDt0YWlsPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTtmb3IoaT0wO2k8bGVuZ3RoO2krPTEpe3RhaWxbaT4+Ml18PWFbaV08PChpJTQ8PDMpfXRhaWxbaT4+Ml18PTEyODw8KGklNDw8Myk7aWYoaT41NSl7bWQ1Y3ljbGUoc3RhdGUsdGFpbCk7Zm9yKGk9MDtpPDE2O2krPTEpe3RhaWxbaV09MH19dG1wPW4qODt0bXA9dG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtsbz1wYXJzZUludCh0bXBbMl0sMTYpO2hpPXBhcnNlSW50KHRtcFsxXSwxNil8fDA7dGFpbFsxNF09bG87dGFpbFsxNV09aGk7bWQ1Y3ljbGUoc3RhdGUsdGFpbCk7cmV0dXJuIHN0YXRlfWZ1bmN0aW9uIHJoZXgobil7dmFyIHM9IiIsajtmb3Ioaj0wO2o8NDtqKz0xKXtzKz1oZXhfY2hyW24+PmoqOCs0JjE1XStoZXhfY2hyW24+PmoqOCYxNV19cmV0dXJuIHN9ZnVuY3Rpb24gaGV4KHgpe3ZhciBpO2ZvcihpPTA7aTx4Lmxlbmd0aDtpKz0xKXt4W2ldPXJoZXgoeFtpXSl9cmV0dXJuIHguam9pbigiIil9aWYoaGV4KG1kNTEoImhlbGxvIikpIT09IjVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyIil7YWRkMzI9ZnVuY3Rpb24oeCx5KXt2YXIgbHN3PSh4JjY1NTM1KSsoeSY2NTUzNSksbXN3PSh4Pj4xNikrKHk+PjE2KSsobHN3Pj4xNik7cmV0dXJuIG1zdzw8MTZ8bHN3JjY1NTM1fX1pZih0eXBlb2YgQXJyYXlCdWZmZXIhPT0idW5kZWZpbmVkIiYmIUFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSl7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2xhbXAodmFsLGxlbmd0aCl7dmFsPXZhbHwwfHwwO2lmKHZhbDwwKXtyZXR1cm4gTWF0aC5tYXgodmFsK2xlbmd0aCwwKX1yZXR1cm4gTWF0aC5taW4odmFsLGxlbmd0aCl9QXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGZyb20sdG8pe3ZhciBsZW5ndGg9dGhpcy5ieXRlTGVuZ3RoLGJlZ2luPWNsYW1wKGZyb20sbGVuZ3RoKSxlbmQ9bGVuZ3RoLG51bSx0YXJnZXQsdGFyZ2V0QXJyYXksc291cmNlQXJyYXk7aWYodG8hPT11bmRlZmluZWQpe2VuZD1jbGFtcCh0byxsZW5ndGgpfWlmKGJlZ2luPmVuZCl7cmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKX1udW09ZW5kLWJlZ2luO3RhcmdldD1uZXcgQXJyYXlCdWZmZXIobnVtKTt0YXJnZXRBcnJheT1uZXcgVWludDhBcnJheSh0YXJnZXQpO3NvdXJjZUFycmF5PW5ldyBVaW50OEFycmF5KHRoaXMsYmVnaW4sbnVtKTt0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXkpO3JldHVybiB0YXJnZXR9fSkoKX1mdW5jdGlvbiB0b1V0Zjgoc3RyKXtpZigvW1x1MDA4MC1cdUZGRkZdLy50ZXN0KHN0cikpe3N0cj11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSl9cmV0dXJuIHN0cn1mdW5jdGlvbiB1dGY4U3RyMkFycmF5QnVmZmVyKHN0cixyZXR1cm5VSW50OEFycmF5KXt2YXIgbGVuZ3RoPXN0ci5sZW5ndGgsYnVmZj1uZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSxhcnI9bmV3IFVpbnQ4QXJyYXkoYnVmZiksaTtmb3IoaT0wO2k8bGVuZ3RoO2krPTEpe2FycltpXT1zdHIuY2hhckNvZGVBdChpKX1yZXR1cm4gcmV0dXJuVUludDhBcnJheT9hcnI6YnVmZn1mdW5jdGlvbiBhcnJheUJ1ZmZlcjJVdGY4U3RyKGJ1ZmYpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoYnVmZikpfWZ1bmN0aW9uIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGZpcnN0LHNlY29uZCxyZXR1cm5VSW50OEFycmF5KXt2YXIgcmVzdWx0PW5ldyBVaW50OEFycmF5KGZpcnN0LmJ5dGVMZW5ndGgrc2Vjb25kLmJ5dGVMZW5ndGgpO3Jlc3VsdC5zZXQobmV3IFVpbnQ4QXJyYXkoZmlyc3QpKTtyZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KHNlY29uZCksZmlyc3QuYnl0ZUxlbmd0aCk7cmV0dXJuIHJldHVyblVJbnQ4QXJyYXk/cmVzdWx0OnJlc3VsdC5idWZmZXJ9ZnVuY3Rpb24gaGV4VG9CaW5hcnlTdHJpbmcoaGV4KXt2YXIgYnl0ZXM9W10sbGVuZ3RoPWhleC5sZW5ndGgseDtmb3IoeD0wO3g8bGVuZ3RoLTE7eCs9Mil7Ynl0ZXMucHVzaChwYXJzZUludChoZXguc3Vic3RyKHgsMiksMTYpKX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYnl0ZXMpfWZ1bmN0aW9uIFNwYXJrTUQ1KCl7dGhpcy5yZXNldCgpfVNwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24oc3RyKXt0aGlzLmFwcGVuZEJpbmFyeSh0b1V0Zjgoc3RyKSk7cmV0dXJuIHRoaXN9O1NwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmRCaW5hcnk9ZnVuY3Rpb24oY29udGVudHMpe3RoaXMuX2J1ZmYrPWNvbnRlbnRzO3RoaXMuX2xlbmd0aCs9Y29udGVudHMubGVuZ3RoO3ZhciBsZW5ndGg9dGhpcy5fYnVmZi5sZW5ndGgsaTtmb3IoaT02NDtpPD1sZW5ndGg7aSs9NjQpe21kNWN5Y2xlKHRoaXMuX2hhc2gsbWQ1YmxrKHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGktNjQsaSkpKX10aGlzLl9idWZmPXRoaXMuX2J1ZmYuc3Vic3RyaW5nKGktNjQpO3JldHVybiB0aGlzfTtTcGFya01ENS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHJhdyl7dmFyIGJ1ZmY9dGhpcy5fYnVmZixsZW5ndGg9YnVmZi5sZW5ndGgsaSx0YWlsPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSxyZXQ7Zm9yKGk9MDtpPGxlbmd0aDtpKz0xKXt0YWlsW2k+PjJdfD1idWZmLmNoYXJDb2RlQXQoaSk8PChpJTQ8PDMpfXRoaXMuX2ZpbmlzaCh0YWlsLGxlbmd0aCk7cmV0PWhleCh0aGlzLl9oYXNoKTtpZihyYXcpe3JldD1oZXhUb0JpbmFyeVN0cmluZyhyZXQpfXRoaXMucmVzZXQoKTtyZXR1cm4gcmV0fTtTcGFya01ENS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9idWZmPSIiO3RoaXMuX2xlbmd0aD0wO3RoaXMuX2hhc2g9WzE3MzI1ODQxOTMsLTI3MTczMzg3OSwtMTczMjU4NDE5NCwyNzE3MzM4NzhdO3JldHVybiB0aGlzfTtTcGFya01ENS5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm57YnVmZjp0aGlzLl9idWZmLGxlbmd0aDp0aGlzLl9sZW5ndGgsaGFzaDp0aGlzLl9oYXNofX07U3BhcmtNRDUucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKHN0YXRlKXt0aGlzLl9idWZmPXN0YXRlLmJ1ZmY7dGhpcy5fbGVuZ3RoPXN0YXRlLmxlbmd0aDt0aGlzLl9oYXNoPXN0YXRlLmhhc2g7cmV0dXJuIHRoaXN9O1NwYXJrTUQ1LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuX2hhc2g7ZGVsZXRlIHRoaXMuX2J1ZmY7ZGVsZXRlIHRoaXMuX2xlbmd0aH07U3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2g9ZnVuY3Rpb24odGFpbCxsZW5ndGgpe3ZhciBpPWxlbmd0aCx0bXAsbG8saGk7dGFpbFtpPj4yXXw9MTI4PDwoaSU0PDwzKTtpZihpPjU1KXttZDVjeWNsZSh0aGlzLl9oYXNoLHRhaWwpO2ZvcihpPTA7aTwxNjtpKz0xKXt0YWlsW2ldPTB9fXRtcD10aGlzLl9sZW5ndGgqODt0bXA9dG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtsbz1wYXJzZUludCh0bXBbMl0sMTYpO2hpPXBhcnNlSW50KHRtcFsxXSwxNil8fDA7dGFpbFsxNF09bG87dGFpbFsxNV09aGk7bWQ1Y3ljbGUodGhpcy5faGFzaCx0YWlsKX07U3BhcmtNRDUuaGFzaD1mdW5jdGlvbihzdHIscmF3KXtyZXR1cm4gU3BhcmtNRDUuaGFzaEJpbmFyeSh0b1V0Zjgoc3RyKSxyYXcpfTtTcGFya01ENS5oYXNoQmluYXJ5PWZ1bmN0aW9uKGNvbnRlbnQscmF3KXt2YXIgaGFzaD1tZDUxKGNvbnRlbnQpLHJldD1oZXgoaGFzaCk7cmV0dXJuIHJhdz9oZXhUb0JpbmFyeVN0cmluZyhyZXQpOnJldH07U3BhcmtNRDUuQXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCl9O1NwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24oYXJyKXt2YXIgYnVmZj1jb25jYXRlbmF0ZUFycmF5QnVmZmVycyh0aGlzLl9idWZmLmJ1ZmZlcixhcnIsdHJ1ZSksbGVuZ3RoPWJ1ZmYubGVuZ3RoLGk7dGhpcy5fbGVuZ3RoKz1hcnIuYnl0ZUxlbmd0aDtmb3IoaT02NDtpPD1sZW5ndGg7aSs9NjQpe21kNWN5Y2xlKHRoaXMuX2hhc2gsbWQ1YmxrX2FycmF5KGJ1ZmYuc3ViYXJyYXkoaS02NCxpKSkpfXRoaXMuX2J1ZmY9aS02NDxsZW5ndGg/bmV3IFVpbnQ4QXJyYXkoYnVmZi5idWZmZXIuc2xpY2UoaS02NCkpOm5ldyBVaW50OEFycmF5KDApO3JldHVybiB0aGlzfTtTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHJhdyl7dmFyIGJ1ZmY9dGhpcy5fYnVmZixsZW5ndGg9YnVmZi5sZW5ndGgsdGFpbD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0saSxyZXQ7Zm9yKGk9MDtpPGxlbmd0aDtpKz0xKXt0YWlsW2k+PjJdfD1idWZmW2ldPDwoaSU0PDwzKX10aGlzLl9maW5pc2godGFpbCxsZW5ndGgpO3JldD1oZXgodGhpcy5faGFzaCk7aWYocmF3KXtyZXQ9aGV4VG9CaW5hcnlTdHJpbmcocmV0KX10aGlzLnJlc2V0KCk7cmV0dXJuIHJldH07U3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fYnVmZj1uZXcgVWludDhBcnJheSgwKTt0aGlzLl9sZW5ndGg9MDt0aGlzLl9oYXNoPVsxNzMyNTg0MTkzLC0yNzE3MzM4NzksLTE3MzI1ODQxOTQsMjcxNzMzODc4XTtyZXR1cm4gdGhpc307U3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIHN0YXRlPVNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZS5jYWxsKHRoaXMpO3N0YXRlLmJ1ZmY9YXJyYXlCdWZmZXIyVXRmOFN0cihzdGF0ZS5idWZmKTtyZXR1cm4gc3RhdGV9O1NwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihzdGF0ZSl7c3RhdGUuYnVmZj11dGY4U3RyMkFycmF5QnVmZmVyKHN0YXRlLmJ1ZmYsdHJ1ZSk7cmV0dXJuIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZS5jYWxsKHRoaXMsc3RhdGUpfTtTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZGVzdHJveT1TcGFya01ENS5wcm90b3R5cGUuZGVzdHJveTtTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuX2ZpbmlzaD1TcGFya01ENS5wcm90b3R5cGUuX2ZpbmlzaDtTcGFya01ENS5BcnJheUJ1ZmZlci5oYXNoPWZ1bmN0aW9uKGFycixyYXcpe3ZhciBoYXNoPW1kNTFfYXJyYXkobmV3IFVpbnQ4QXJyYXkoYXJyKSkscmV0PWhleChoYXNoKTtyZXR1cm4gcmF3P2hleFRvQmluYXJ5U3RyaW5nKHJldCk6cmV0fTtyZXR1cm4gU3BhcmtNRDV9KTsK"},{"meta":{"name":"js-base64","url":"https://cdn.jsdelivr.net/npm/js-base64","ts":1637743635751,"mimetype":"text/plain"},"source":"LyoqCiAqIE1pbmlmaWVkIGJ5IGpzRGVsaXZyIHVzaW5nIFRlcnNlciB2NS43LjEuCiAqIE9yaWdpbmFsIGZpbGU6IC9ucG0vanMtYmFzZTY0QDMuNy4yL2Jhc2U2NC5qcwogKgogKiBEbyBOT1QgdXNlIFNSSSB3aXRoIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBmaWxlcyEgTW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly93d3cuanNkZWxpdnIuY29tL3VzaW5nLXNyaS13aXRoLWR5bmFtaWMtZmlsZXMKICovCiFmdW5jdGlvbih0LG4pe3ZhciByLGU7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1uKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUobik6KHI9dC5CYXNlNjQsKGU9bigpKS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuQmFzZTY0PXIsZX0sdC5NZXRlb3ImJihCYXNlNjQ9ZSksdC5CYXNlNjQ9ZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6dGhpcywoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsbj0iMy43LjIiLHI9ImZ1bmN0aW9uIj09dHlwZW9mIGF0b2IsZT0iZnVuY3Rpb24iPT10eXBlb2YgYnRvYSxvPSJmdW5jdGlvbiI9PXR5cGVvZiBCdWZmZXIsdT0iZnVuY3Rpb24iPT10eXBlb2YgVGV4dERlY29kZXI/bmV3IFRleHREZWNvZGVyOnZvaWQgMCxpPSJmdW5jdGlvbiI9PXR5cGVvZiBUZXh0RW5jb2Rlcj9uZXcgVGV4dEVuY29kZXI6dm9pZCAwLGY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IiksYz0odD17fSxmLmZvckVhY2goKGZ1bmN0aW9uKG4scil7cmV0dXJuIHRbbl09cn0pKSx0KSxhPS9eKD86W0EtWmEtelxkK1wvXXs0fSkqPyg/OltBLVphLXpcZCtcL117Mn0oPzo9PSk/fFtBLVphLXpcZCtcL117M309Pyk/JC8sZD1TdHJpbmcuZnJvbUNoYXJDb2RlLmJpbmQoU3RyaW5nKSxzPSJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LmZyb20/VWludDhBcnJheS5mcm9tLmJpbmQoVWludDhBcnJheSk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ZnVuY3Rpb24odCl7cmV0dXJuIHR9KSxuZXcgVWludDhBcnJheShBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDApLm1hcChuKSl9LGw9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvPS9nLCIiKS5yZXBsYWNlKC9bK1wvXS9nLChmdW5jdGlvbih0KXtyZXR1cm4iKyI9PXQ/Ii0iOiJfIn0pKX0saD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9dL2csIiIpfSxwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixyLGUsbyx1PSIiLGk9dC5sZW5ndGglMyxjPTA7Yzx0Lmxlbmd0aDspe2lmKChyPXQuY2hhckNvZGVBdChjKyspKT4yNTV8fChlPXQuY2hhckNvZGVBdChjKyspKT4yNTV8fChvPXQuY2hhckNvZGVBdChjKyspKT4yNTUpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBjaGFyYWN0ZXIgZm91bmQiKTt1Kz1mWyhuPXI8PDE2fGU8PDh8byk+PjE4JjYzXStmW24+PjEyJjYzXStmW24+PjYmNjNdK2ZbNjMmbl19cmV0dXJuIGk/dS5zbGljZSgwLGktMykrIj09PSIuc3Vic3RyaW5nKGkpOnV9LHk9ZT9mdW5jdGlvbih0KXtyZXR1cm4gYnRvYSh0KX06bz9mdW5jdGlvbih0KXtyZXR1cm4gQnVmZmVyLmZyb20odCwiYmluYXJ5IikudG9TdHJpbmcoImJhc2U2NCIpfTpwLEE9bz9mdW5jdGlvbih0KXtyZXR1cm4gQnVmZmVyLmZyb20odCkudG9TdHJpbmcoImJhc2U2NCIpfTpmdW5jdGlvbih0KXtmb3IodmFyIG49W10scj0wLGU9dC5sZW5ndGg7cjxlO3IrPTQwOTYpbi5wdXNoKGQuYXBwbHkobnVsbCx0LnN1YmFycmF5KHIscis0MDk2KSkpO3JldHVybiB5KG4uam9pbigiIikpfSxiPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSExKSxuP2woQSh0KSk6QSh0KX0sZz1mdW5jdGlvbih0KXtpZih0Lmxlbmd0aDwyKXJldHVybihuPXQuY2hhckNvZGVBdCgwKSk8MTI4P3Q6bjwyMDQ4P2QoMTkyfG4+Pj42KStkKDEyOHw2MyZuKTpkKDIyNHxuPj4+MTImMTUpK2QoMTI4fG4+Pj42JjYzKStkKDEyOHw2MyZuKTt2YXIgbj02NTUzNisxMDI0Kih0LmNoYXJDb2RlQXQoMCktNTUyOTYpKyh0LmNoYXJDb2RlQXQoMSktNTYzMjApO3JldHVybiBkKDI0MHxuPj4+MTgmNykrZCgxMjh8bj4+PjEyJjYzKStkKDEyOHxuPj4+NiY2MykrZCgxMjh8NjMmbil9LEI9L1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2cseD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKEIsZyl9LEM9bz9mdW5jdGlvbih0KXtyZXR1cm4gQnVmZmVyLmZyb20odCwidXRmOCIpLnRvU3RyaW5nKCJiYXNlNjQiKX06aT9mdW5jdGlvbih0KXtyZXR1cm4gQShpLmVuY29kZSh0KSl9OmZ1bmN0aW9uKHQpe3JldHVybiB5KHgodCkpfSxtPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSExKSxuP2woQyh0KSk6Qyh0KX0sdj1mdW5jdGlvbih0KXtyZXR1cm4gbSh0LCEwKX0sVT0vW1x4QzAtXHhERl1bXHg4MC1ceEJGXXxbXHhFMC1ceEVGXVtceDgwLVx4QkZdezJ9fFtceEYwLVx4RjddW1x4ODAtXHhCRl17M30vZyxGPWZ1bmN0aW9uKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSA0OnZhciBuPSgoNyZ0LmNoYXJDb2RlQXQoMCkpPDwxOHwoNjMmdC5jaGFyQ29kZUF0KDEpKTw8MTJ8KDYzJnQuY2hhckNvZGVBdCgyKSk8PDZ8NjMmdC5jaGFyQ29kZUF0KDMpKS02NTUzNjtyZXR1cm4gZCg1NTI5Nisobj4+PjEwKSkrZCg1NjMyMCsoMTAyMyZuKSk7Y2FzZSAzOnJldHVybiBkKCgxNSZ0LmNoYXJDb2RlQXQoMCkpPDwxMnwoNjMmdC5jaGFyQ29kZUF0KDEpKTw8Nnw2MyZ0LmNoYXJDb2RlQXQoMikpO2RlZmF1bHQ6cmV0dXJuIGQoKDMxJnQuY2hhckNvZGVBdCgwKSk8PDZ8NjMmdC5jaGFyQ29kZUF0KDEpKX19LHc9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShVLEYpfSxTPWZ1bmN0aW9uKHQpe2lmKHQ9dC5yZXBsYWNlKC9ccysvZywiIiksIWEudGVzdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYWxmb3JtZWQgYmFzZTY0LiIpO3QrPSI9PSIuc2xpY2UoMi0oMyZ0Lmxlbmd0aCkpO2Zvcih2YXIgbixyLGUsbz0iIix1PTA7dTx0Lmxlbmd0aDspbj1jW3QuY2hhckF0KHUrKyldPDwxOHxjW3QuY2hhckF0KHUrKyldPDwxMnwocj1jW3QuY2hhckF0KHUrKyldKTw8NnwoZT1jW3QuY2hhckF0KHUrKyldKSxvKz02ND09PXI/ZChuPj4xNiYyNTUpOjY0PT09ZT9kKG4+PjE2JjI1NSxuPj44JjI1NSk6ZChuPj4xNiYyNTUsbj4+OCYyNTUsMjU1Jm4pO3JldHVybiBvfSxFPXI/ZnVuY3Rpb24odCl7cmV0dXJuIGF0b2IoaCh0KSl9Om8/ZnVuY3Rpb24odCl7cmV0dXJuIEJ1ZmZlci5mcm9tKHQsImJhc2U2NCIpLnRvU3RyaW5nKCJiaW5hcnkiKX06UyxEPW8/ZnVuY3Rpb24odCl7cmV0dXJuIHMoQnVmZmVyLmZyb20odCwiYmFzZTY0IikpfTpmdW5jdGlvbih0KXtyZXR1cm4gcyhFKHQpLChmdW5jdGlvbih0KXtyZXR1cm4gdC5jaGFyQ29kZUF0KDApfSkpfSxSPWZ1bmN0aW9uKHQpe3JldHVybiBEKFQodCkpfSx6PW8/ZnVuY3Rpb24odCl7cmV0dXJuIEJ1ZmZlci5mcm9tKHQsImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGY4Iil9OnU/ZnVuY3Rpb24odCl7cmV0dXJuIHUuZGVjb2RlKEQodCkpfTpmdW5jdGlvbih0KXtyZXR1cm4gdyhFKHQpKX0sVD1mdW5jdGlvbih0KXtyZXR1cm4gaCh0LnJlcGxhY2UoL1stX10vZywoZnVuY3Rpb24odCl7cmV0dXJuIi0iPT10PyIrIjoiLyJ9KSkpfSxaPWZ1bmN0aW9uKHQpe3JldHVybiB6KFQodCkpfSxqPWZ1bmN0aW9uKHQpe3JldHVybnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0sST1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLHQsaihuKSl9O3QoImZyb21CYXNlNjQiLChmdW5jdGlvbigpe3JldHVybiBaKHRoaXMpfSkpLHQoInRvQmFzZTY0IiwoZnVuY3Rpb24odCl7cmV0dXJuIG0odGhpcyx0KX0pKSx0KCJ0b0Jhc2U2NFVSSSIsKGZ1bmN0aW9uKCl7cmV0dXJuIG0odGhpcywhMCl9KSksdCgidG9CYXNlNjRVUkwiLChmdW5jdGlvbigpe3JldHVybiBtKHRoaXMsITApfSkpLHQoInRvVWludDhBcnJheSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFIodGhpcyl9KSl9LE89ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbih0LG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDhBcnJheS5wcm90b3R5cGUsdCxqKG4pKX07dCgidG9CYXNlNjQiLChmdW5jdGlvbih0KXtyZXR1cm4gYih0aGlzLHQpfSkpLHQoInRvQmFzZTY0VVJJIiwoZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLCEwKX0pKSx0KCJ0b0Jhc2U2NFVSTCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGIodGhpcywhMCl9KSl9LFA9e3ZlcnNpb246bixWRVJTSU9OOiIzLjcuMiIsYXRvYjpFLGF0b2JQb2x5ZmlsbDpTLGJ0b2E6eSxidG9hUG9seWZpbGw6cCxmcm9tQmFzZTY0OlosdG9CYXNlNjQ6bSxlbmNvZGU6bSxlbmNvZGVVUkk6dixlbmNvZGVVUkw6dix1dG9iOngsYnRvdTp3LGRlY29kZTpaLGlzVmFsaWQ6ZnVuY3Rpb24odCl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiExO3ZhciBuPXQucmVwbGFjZSgvXHMrL2csIiIpLnJlcGxhY2UoLz17MCwyfSQvLCIiKTtyZXR1cm4hL1teXHMwLTlhLXpBLVpcKy9dLy50ZXN0KG4pfHwhL1teXHMwLTlhLXpBLVpcLV9dLy50ZXN0KG4pfSxmcm9tVWludDhBcnJheTpiLHRvVWludDhBcnJheTpSLGV4dGVuZFN0cmluZzpJLGV4dGVuZFVpbnQ4QXJyYXk6TyxleHRlbmRCdWlsdGluczpmdW5jdGlvbigpe0koKSxPKCl9LEJhc2U2NDp7fX07cmV0dXJuIE9iamVjdC5rZXlzKFApLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBQLkJhc2U2NFt0XT1QW3RdfSkpLFB9KSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPS9zbS83OWRlNzhlZGNmYTk0MjM2ZTRjODM1NGY5MTI2Mjk3MWUxODVjMzYzM2JiODY1YjZmYzE3OTQyZTkzYTQwMjA3Lm1hcA=="}]},{"name":"阿里云盘","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["https://www.aliyundrive.com/s/*","https://www.aliyundrive.com/drive*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null}},"storage":{"ts":1637743647344,"data":{}},"enabled":true,"position":7,"file_url":"https://greasyfork.org/scripts/425955-%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98/code/%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98.user.js","uuid":"ee3cfb7e-4c17-4c84-a79e-a10a57348f27","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDpmL/ph4zkupHnm5gKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAxLjEKLy8gQGRlc2NyaXB0aW9uICDmlK/mjIHnlJ/miJDmlofku7bkuIvovb3pk77mjqXvvIzmlK/mjIHop4bpopHmkq3mlL7pobXpnaLmiZPlvIDoh6rliqjmkq3mlL4v5pKt5pS+5Yy654K55Ye75pqC5YGc57un57utL+aSreaUvuaOp+WItuWZqOaLluaLveiwg+aVtOS9jee9ru+8jOaUr+aMgeiHquWumuS5ieWIhuS6q+Wvhuegge+8jOeqgeegtOinhumikTLliIbpkp/pmZDliLbvvIwuLi4KLy8gQGF1dGhvciAgICAgICBZb3UKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2pxdWVyeUAzL2Rpc3QvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vdW5wa2cuY29tL2FqYXgtaG9va0AyLjAuMy9kaXN0L2FqYXhob29rLm1pbi5qcwovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vZHJpdmUqCi8vIEBydW4tYXQgICAgICAgZG9jdW1lbnQtc3RhcnQKLy8gQGljb24gICAgICAgICBodHRwczovL2d3LmFsaWNkbi5jb20vaW1nZXh0cmEvaTMvTzFDTjAxYWo5cmREMUdTMEU4aW8xMXRfISE2MDAwMDAwMDAwNjIwLTczLXRwcy0xNi0xNi5pY28KLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgdmFyICQgPSAkIHx8IHdpbmRvdy4kOwogICAgdmFyIG9iaiA9IHsKICAgICAgICBmaWxlX3BhZ2U6IHsKICAgICAgICAgICAgcGFyZW50X2ZpbGVfaWQ6ICJyb290IiwKICAgICAgICAgICAgdG9rZW5fdHlwZTogIiIsCiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogIiIsCiAgICAgICAgICAgIGl0ZW1zOiBbXQogICAgICAgIH0sCiAgICB9OwoKICAgIG9iai5jdXN0b21TaGFyZVB3ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKGRvY3VtZW50KS5vbigiRE9NTm9kZUluc2VydGVkIiwgIi5hbnQtbW9kYWwtcm9vdCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoJCgiLmlucHV0LXNoYXJlLXB3ZCIpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICB2YXIgc2hhcmVQd2QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgic2hhcmVfcHdkIik7CiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IGNsYXNzPSJwaWNrLXdyYXBwZXItLTNwTnhWIj48ZGl2IGNsYXNzPSJhbnQtZHJvcGRvd24tdHJpZ2dlciBzaGFyZS1leHBpcmUtd3JhcHBlci0tM3lfTm4iIGRhdGEtc3BtLWFuY2hvci1pZD0iYWxpeXVuZHJpdmUuZHJpdmUuMC5pNC42YWY3NmM3NVhNRDFyRiI+6Ieq5a6a5LmJ5o+Q5Y+W56CBPC9kaXY+PC9kaXY+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iYW50LWlucHV0IGlucHV0LXNoYXJlLXB3ZCIgdmFsdWU9IicgKyAoc2hhcmVQd2QgPyBzaGFyZVB3ZCA6ICIiKSArICciIHBsYWNlaG9sZGVyPSIiIHN0eWxlPSJtYXJnaW4tbGVmdDogMTJweDt3aWR0aDogOTlweDtoZWlnaHQ6IDI4cHg7bGluZS1oZWlnaHQ6IG5vcm1hbDtib3JkZXI6IDFweCBzb2xpZCAjRDREN0RFO3RleHQtYWxpZ246IGNlbnRlcjsiPjwvZGl2PicKICAgICAgICAgICAgICAgICQoIi5zaGFyZS1ieS11cmwtLUxmY05nIikuYXBwZW5kKGh0bWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHdpbmRvdy5haC5wcm94eSh7CiAgICAgICAgICAgIG9uUmVxdWVzdDogKGNvbmZpZywgaGFuZGxlcikgPT4gewogICAgICAgICAgICAgICAgaWYgKGNvbmZpZy51cmwuaW5jbHVkZXMoIi9zaGFyZV9saW5rL2NyZWF0ZSIpIHx8IGNvbmZpZy51cmwuaW5jbHVkZXMoIi9zaGFyZV9saW5rL3VwZGF0ZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlUHdkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInNoYXJlX3B3ZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzaGFyZVB3ZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9keSA9IEpTT04ucGFyc2UoY29uZmlnLmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBib2R5LnNoYXJlX3B3ZCA9IHNoYXJlUHdkOwogICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYm9keSA9IEpTT04uc3RyaW5naWZ5KGJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhbmRsZXIubmV4dChjb25maWcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblJlc3BvbnNlOiAocmVzcG9uc2UsIGhhbmRsZXIpID0+IHsKICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UuY29uZmlnLnVybCkuaW5jbHVkZXMoIi9zaGFyZV9saW5rL2NyZWF0ZSIpIHx8IChyZXNwb25zZS5jb25maWcudXJsKS5pbmNsdWRlcygiL3NoYXJlX2xpbmsvdXBkYXRlIikpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVQd2QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgic2hhcmVfcHdkIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJlUHdkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UuY29uZmlnLmJvZHkpLmluY2x1ZGVzKHNoYXJlUHdkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dUaXBTdWNjZXNzKCLoh6rlrprkuYnliIbkuqvlr4bnoIEg5oiQ5YqfIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgic2hhcmVfcHdkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouc2hvd1RpcEVycm9yKCLoh6rlrprkuYnliIbkuqvlr4bnoIEg5aSx6LSl77yM6K+35L+u5pS55YiG5Lqr5a+G56CB5ZCO6YeN6K+VIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYW5kbGVyLm5leHQocmVzcG9uc2UpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkVycm9yOiAoZXJyLCBoYW5kbGVyKSA9PiB7CiAgICAgICAgICAgICAgICBoYW5kbGVyLm5leHQoZXJyKQogICAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgJChkb2N1bWVudCkub24oImNoYW5nZSIsICIuaW5wdXQtc2hhcmUtcHdkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgic2hhcmVfcHdkIiwgdmFsdWUpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBvYmoudW5sb2NrVmlkZW9MaW1pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB3aW5kb3cuYWgucHJveHkoewogICAgICAgICAgICBvblJlcXVlc3Q6IChjb25maWcsIGhhbmRsZXIpID0+IHsKICAgICAgICAgICAgICAgIGhhbmRsZXIubmV4dChjb25maWcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblJlc3BvbnNlOiAocmVzcG9uc2UsIGhhbmRsZXIpID0+IHsKICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UuY29uZmlnLnVybCkuaW5jbHVkZXMoIi9maWxlL2dldF9zaGFyZV9saW5rX3ZpZGVvX3ByZXZpZXdfcGxheV9pbmZvIikpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2VKc29uID0gSlNPTi5wYXJzZShyZXNwb25zZS5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VKc29uLnZpZGVvX3ByZXZpZXdfcGxheV9pbmZvLmxpdmVfdHJhbnNjb2RpbmdfdGFza19saXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wcmV2aWV3X3VybCA9IGl0ZW0udXJsOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2VKc29uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhbmRsZXIubmV4dChyZXNwb25zZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uRXJyb3I6IChlcnIsIGhhbmRsZXIpID0+IHsKICAgICAgICAgICAgICAgIGhhbmRsZXIubmV4dChlcnIpCiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfTsKCiAgICBvYmoudmlkZW9QYWdlT3B0aW1pemF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICQoZG9jdW1lbnQpLm9uKCJET01Ob2RlSW5zZXJ0ZWQiLCAiLnZpZGVvLXBsYXllci0tMjlfNzIgLmJ0bi0tMWNaZkEiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGVsZXZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidmlkZW8iKTsKICAgICAgICAgICAgaWYgKGVsZXZpZGVvLnBhdXNlZCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlbGV2aWRlby5wYXVzZWQgJiYgZWxldmlkZW8ucGxheSgpOwogICAgICAgICAgICAgICAgICAgICQoIi52aWRlby1wbGF5ZXItLTI5XzcyIikuY3NzKHtvcGFjaXR5OiAwfSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7fTsKICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICB9KTsKCiAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgInZpZGVvIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgdmFyIGVsZXZpZGVvID0gJCh0aGlzKS5nZXQoMCk7CiAgICAgICAgICAgIGVsZXZpZGVvLnBhdXNlZCAmJiBlbGV2aWRlby5wbGF5KCkgfHwgZWxldmlkZW8ucGF1c2UoKTsKCiAgICAgICAgICAgIHZhciBvcGFjaXR5ID0gZWxldmlkZW8ucGF1c2VkID8gLjkgOiAwOwogICAgICAgICAgICAkKCIudmlkZW8tcGxheWVyLS0yOV83MiIpLmNzcyh7b3BhY2l0eTogb3BhY2l0eX0pOwogICAgICAgIH0pOwoKICAgICAgICAkKGRvY3VtZW50KS5vbigibW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZG93biIsICIudmlkZW8tcGxheWVyLS0yOV83MiIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gIm1vdXNlb3ZlciIgfHwgZXZlbnQudHlwZSA9PSAibW91c2VvdXQiKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BhY2l0eSA9IGV2ZW50LnR5cGUgPT0gIm1vdXNlb3ZlciIgPyAuOSA6IDA7CiAgICAgICAgICAgICAgICAkKHRoYXQpLmNzcyh7b3BhY2l0eTogb3BhY2l0eX0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcG9zaXRpb25EaXYgPSAkKHRoYXQpLmNoaWxkcmVuKCJkaXY6Zmlyc3QiKS5vZmZzZXQoKTsKICAgICAgICAgICAgdmFyIGRpc3RlbmNlWCA9IGV2ZW50LnBhZ2VYIC0gcG9zaXRpb25EaXYubGVmdDsKICAgICAgICAgICAgdmFyIGRpc3RlbmNlWSA9IGV2ZW50LnBhZ2VZIC0gcG9zaXRpb25EaXYudG9wOwoKICAgICAgICAgICAgJChkb2N1bWVudCkubW91c2Vtb3ZlKGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgICAgICQodGhhdCkuY3NzKHtjdXJzb3I6ICJtb3ZlIn0pOwogICAgICAgICAgICAgICAgdmFyICR0aGF0ID0gJCh0aGF0KS5jaGlsZHJlbigiZGl2OmZpcnN0Iik7CiAgICAgICAgICAgICAgICB2YXIgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7CgogICAgICAgICAgICAgICAgdmFyIG9mZnNldFggPSBldmVudC5wYWdlWCAtIGRpc3RlbmNlWDsKICAgICAgICAgICAgICAgIHZhciBvZmZzZXRZID0gZXZlbnQucGFnZVkgLSBkaXN0ZW5jZVk7CiAgICAgICAgICAgICAgICBpZihvZmZzZXRYIDwgMCkgewogICAgICAgICAgICAgICAgICAgIG9mZnNldFggPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoRGlmZmVyZW5jZSA9ICRkb2N1bWVudC53aWR0aCgpIC0gJHRoYXQub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0WCA+IHdpZHRoRGlmZmVyZW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRYID0gd2lkdGhEaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZihvZmZzZXRZIDwgMCl7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0RGlmZmVyZW5jZSA9ICRkb2N1bWVudC5oZWlnaHQoKSAtICR0aGF0Lm91dGVySGVpZ2h0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmKG9mZnNldFkgPiBoZWlnaHREaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFkgPSBoZWlnaHREaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhhdC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgIGxlZnQ6IG9mZnNldFgsCiAgICAgICAgICAgICAgICAgICAgdG9wOiBvZmZzZXRZCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KQoKICAgICAgICAgICAgJChkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICQodGhhdCkuY3NzKHtjdXJzb3I6ICIifSk7CiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoIm1vdXNlbW92ZSIpOwogICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgfTsKCiAgICBvYmouaW5pdERvd25sb2FkU2hhcmVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICgkKCIuYnV0dG9uLWRvd25sb2FkLS1iYXRjaCIpLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICgkKCIuYWN0aW9uLS05LXFCYiIpLmxlbmd0aCkgewogICAgICAgICAgICBvYmouZmlsZV9wYWdlLmFjY2Vzc190b2tlbiB8fCBvYmoudG9rZW5SZWZyZXNoKCk7CgogICAgICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IGNsYXNzPSJidXR0b24td3JhcHBlci0tMVVrRzYgYnV0dG9uLWRvd25sb2FkLS1iYXRjaCIgZGF0YS10eXBlPSJwcmltYXJ5Ij7mmL7npLrpk77mjqU8L2Rpdj4nOwogICAgICAgICAgICAkKCIuYWN0aW9uLS05LXFCYiIpLmFwcGVuZChodG1sKTsKICAgICAgICAgICAgJCgiLmJ1dHRvbi1kb3dubG9hZC0tYmF0Y2giKS5vbigiY2xpY2siLCBvYmouc2hvd0Rvd25sb2FkU2hhcmVQYWdlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQob2JqLmluaXREb3dubG9hZFNoYXJlUGFnZSwgNTAwKQogICAgICAgIH0KICAgIH07CgogICAgb2JqLmluaXREb3dubG9hZEhvbWVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICgkKCIuYnV0dG9uLWRvd25sb2FkLS1iYXRjaCIpLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICgkKCIuYWN0aW9ucy0tMnF2SUQiKS5sZW5ndGgpIHsKICAgICAgICAgICAgb2JqLmZpbGVfcGFnZS5hY2Nlc3NfdG9rZW4gfHwgb2JqLnRva2VuUmVmcmVzaCgpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT0ibWFyZ2luOjBweCA4cHg7Ij48L2Rpdj48YnV0dG9uIGNsYXNzPSJidXR0b24tLTJBYTR1IHByaW1hcnktLTNBSmU1IGJ1dHRvbi1kb3dubG9hZC0tYmF0Y2giPuaYvuekuumTvuaOpTwvYnV0dG9uPic7CiAgICAgICAgICAgICQoIi5hY3Rpb25zLS0ycXZJRCIpLmFwcGVuZChodG1sKTsKICAgICAgICAgICAgJCgiLmJ1dHRvbi1kb3dubG9hZC0tYmF0Y2giKS5vbigiY2xpY2siLCBvYmouc2hvd0Rvd25sb2FkSG9tZVBhZ2UpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChvYmouaW5pdERvd25sb2FkSG9tZVBhZ2UsIDEwMDApCiAgICAgICAgfQogICAgfTsKCiAgICBvYmouc2hvd0Rvd25sb2FkU2hhcmVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChvYmouZmlsZV9wYWdlLmFjY2Vzc190b2tlbikgewogICAgICAgICAgICBvYmouc2hvd1RpcExvYWRpbmcoIuato+WcqOiOt+WPlumTvuaOpS4uLiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb2JqLnNob3dUaXBFcnJvcigi57y65bCR5b+F6KaB5Y+C5pWw77yM6K+355m76ZmG5ZCO5Yi35paw5q2k6aG16Z2i6YeN6K+V77yBIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBmaWxlTGlzdCA9IG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0KCk7CiAgICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIuiHtOWRvemUmeivr++8muiOt+WPluWIhuS6q+aWh+S7tuWIl+ihqOWksei0pSIpOwogICAgICAgICAgICBvYmouc2hvd1RpcEVycm9yKCLoh7Tlkb3plJnor6/vvJrojrflj5bliIbkuqvmlofku7bliJfooajlpLHotKUiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIHNoYXJlX2lkID0gb2JqLmdldFNoYXJlSWQoKTsKICAgICAgICBvYmouc2hvd0JveCgnPGRpdiBjbGFzcz0iaXRlbS1saXN0IiBzdHlsZT0icGFkZGluZzogMjBweDsgaGVpZ2h0OiA0MTBweDsgb3ZlcmZsb3cteTogYXV0bzsiPjwvZGl2PicpOwogICAgICAgIHZhciByb3dTdHlsZSA9ICJtYXJnaW46MTBweCAwcHg7IG92ZXJmbG93OmhpZGRlbjsgd2hpdGUtc3BhY2U6bm93cmFwOyB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOyI7CgogICAgICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIHZhciBhcmNoaXZlX25hbWUgPSBmaWxlTGlzdFswXS5uYW1lICsgIuetiSIgKyBmaWxlTGlzdC5sZW5ndGggKyAi5Liq5paH5Lu2IjsKICAgICAgICAgICAgdmFyIGZpbGVJZExpc3QgPSBbXTsKICAgICAgICAgICAgZmlsZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKICAgICAgICAgICAgICAgIGZpbGVJZExpc3QucHVzaCh7ZmlsZV9pZDogaXRlbS5maWxlX2lkfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYmouZ2V0U2hhcmVNdWx0aURvd25sb2FkVXJsKGZpbGVJZExpc3QsIHNoYXJlX2lkLCBhcmNoaXZlX25hbWUsIGZ1bmN0aW9uIChkb3dubG9hZF91cmwpIHsKICAgICAgICAgICAgICAgIGlmIChkb3dubG9hZF91cmwpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9ICc8cD7ljovnvKnljIXvvJonICsgYXJjaGl2ZV9uYW1lICsgJzwvcD4nOwogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxwIHN0eWxlPSInICsgcm93U3R5bGUgKyAnIj48YSB0aXRsZT0iJyArIGRvd25sb2FkX3VybCArICciIGhyZWY9IicgKyBkb3dubG9hZF91cmwgKyAnIiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4nICsgZG93bmxvYWRfdXJsICsgJzwvYT48L3A+JzsKICAgICAgICAgICAgICAgICAgICAkKCIuaXRlbS1saXN0IikuYXBwZW5kKGh0bWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5kb3dubG9hZF91cmwpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9ICc8cD4nICsgKCsraW5kZXgpICsgJ++8micgKyBpdGVtLm5hbWUgKyAnPC9wPic7CiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPHAgc3R5bGU9IicgKyByb3dTdHlsZSArICciPjxhIHRpdGxlPSInICsgaXRlbS5kb3dubG9hZF91cmwgKyAnIiBocmVmPSInICsgaXRlbS5kb3dubG9hZF91cmwgKyAnIiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4nICsgaXRlbS5kb3dubG9hZF91cmwgKyAnPC9hPjwvcD4nOwogICAgICAgICAgICAgICAgICAgICQoIi5pdGVtLWxpc3QiKS5hcHBlbmQoaHRtbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09ICJmb2xkZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZ2V0U2hhcmVNdWx0aURvd25sb2FkVXJsKFt7ZmlsZV9pZDogaXRlbS5maWxlX2lkfV0sIHNoYXJlX2lkLCBpdGVtLm5hbWUsIGZ1bmN0aW9uIChkb3dubG9hZF91cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvd25sb2FkX3VybCA9IGRvd25sb2FkX3VybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9ICc8cD4nICsgKCsraW5kZXgpICsgJ++8micgKyBpdGVtLm5hbWUgKyAnPC9wPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPHAgc3R5bGU9IicgKyByb3dTdHlsZSArICciPjxhIHRpdGxlPSInICsgaXRlbS5kb3dubG9hZF91cmwgKyAnIiBocmVmPSInICsgaXRlbS5kb3dubG9hZF91cmwgKyAnIiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4nICsgaXRlbS5kb3dubG9hZF91cmwgKyAnPC9hPjwvcD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIi5pdGVtLWxpc3QiKS5hcHBlbmQoaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5nZXRTaGFyZUxpbmtEb3dubG9hZFVybChpdGVtLmZpbGVfaWQsIHNoYXJlX2lkLCBmdW5jdGlvbiAoZG93bmxvYWRfdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb3dubG9hZF91cmwgPSBkb3dubG9hZF91cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHA+JyArICgrK2luZGV4KSArICfvvJonICsgaXRlbS5uYW1lICsgJzwvcD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxwIHN0eWxlPSInICsgcm93U3R5bGUgKyAnIj48YSB0aXRsZT0iJyArIGl0ZW0uZG93bmxvYWRfdXJsICsgJyIgaHJlZj0iJyArIGl0ZW0uZG93bmxvYWRfdXJsICsgJyIgc3R5bGU9ImNvbG9yOiBibHVlOyI+JyArIGl0ZW0uZG93bmxvYWRfdXJsICsgJzwvYT48L3A+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIuaXRlbS1saXN0IikuYXBwZW5kKGh0bWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCA2NiAqIGluZGV4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9iai5oaWRlVGlwKCk7CiAgICAgICAgfSwgNTAwKTsKICAgIH07CgogICAgb2JqLnNob3dEb3dubG9hZEhvbWVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChvYmouZmlsZV9wYWdlLmFjY2Vzc190b2tlbikgewogICAgICAgICAgICBvYmouc2hvd1RpcExvYWRpbmcoIuato+WcqOiOt+WPlumTvuaOpS4uLiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb2JqLnNob3dUaXBFcnJvcigi57y65bCR5b+F6KaB5Y+C5pWw77yM6K+355m76ZmG5ZCO5Yi35paw5q2k6aG16Z2i6YeN6K+V77yBIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBmaWxlTGlzdCA9IG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0KCk7CiAgICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIuiHtOWRvemUmeivr++8muiOt+WPluS4quS6uuaWh+S7tuWIl+ihqOWksei0pSIpOwogICAgICAgICAgICBvYmouc2hvd1RpcEVycm9yKCLoh7Tlkb3plJnor6/vvJrojrflj5bkuKrkurrmlofku7bliJfooajlpLHotKUiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIFJlID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgICAgICAgICAgdC5yZWwgPSAibm9vcGVuZXIiOwogICAgICAgICAgICB0LmhyZWYgPSBlOwogICAgICAgICAgICB0LmRvd25sb2FkID0gImRvd25sb2FkIjsKICAgICAgICAgICAgLy90LnRhcmdldCA9ICJfYmxhbmsiOwogICAgICAgICAgICAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoImNsaWNrIikpCiAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTsKICAgICAgICAgICAgICAgICAgICB0LmluaXRNb3VzZUV2ZW50KCJjbGljayIsICEwLCAhMCwgd2luZG93LCAwLCAwLCAwLCA4MCwgMjAsICExLCAhMSwgITEsICExLCAwLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0odCkpOwogICAgICAgICAgICB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dCb3goJzxkaXYgY2xhc3M9Iml0ZW0tbGlzdCIgc3R5bGU9InBhZGRpbmc6IDIwcHg7IGhlaWdodDogNDEwcHg7IG92ZXJmbG93LXk6IGF1dG87Ij48L2Rpdj4nKTsKICAgICAgICB2YXIgcm93U3R5bGUgPSAibWFyZ2luOjEwcHggMHB4OyBvdmVyZmxvdzpoaWRkZW47IHdoaXRlLXNwYWNlOm5vd3JhcDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsiOwoKICAgICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gMSkgewogICAgICAgICAgICB2YXIgYXJjaGl2ZV9uYW1lID0gIiIuY29uY2F0KGZpbGVMaXN0WzBdLm5hbWUsICLnrYkiKS5jb25jYXQoZmlsZUxpc3QubGVuZ3RoLCAi5Liq5paH5Lu2Iik7CiAgICAgICAgICAgIHZhciBmaWxlSWRMaXN0ID0gW107CiAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgICAgICAgICBmaWxlSWRMaXN0LnB1c2goe2ZpbGVfaWQ6IGl0ZW0uZmlsZV9pZH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGRyaXZlX2lkID0gZmlsZUxpc3RbMF0uZHJpdmVfaWQ7CiAgICAgICAgICAgIG9iai5nZXRIb21lTXVsdGlEb3dubG9hZFVybChmaWxlSWRMaXN0LCBkcml2ZV9pZCwgYXJjaGl2ZV9uYW1lLCBmdW5jdGlvbiAoZG93bmxvYWRfdXJsKSB7CiAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRfdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHA+5Y6L57yp5YyF77yaJyArIGFyY2hpdmVfbmFtZSArICc8L3A+JzsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8cCBzdHlsZT0iJyArIHJvd1N0eWxlICsgJyI+PGEgdGl0bGU9IicgKyBkb3dubG9hZF91cmwgKyAnIiBocmVmPSInICsgZG93bmxvYWRfdXJsICsgJyIgc3R5bGU9ImNvbG9yOiBibHVlOyI+JyArIGRvd25sb2FkX3VybCArICc8L2E+PC9wPic7CiAgICAgICAgICAgICAgICAgICAgJCgiLml0ZW0tbGlzdCIpLmFwcGVuZChodG1sKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZG93bmxvYWRfdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHA+JyArICgrK2luZGV4KSArICfvvJonICsgaXRlbS5uYW1lICsgJzwvcD4nOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT0gImZvbGRlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPHAgc3R5bGU9IicgKyByb3dTdHlsZSArICciPjxhIHRpdGxlPSInICsgaXRlbS5kb3dubG9hZF91cmwgKyAnIiBocmVmPSInICsgaXRlbS5kb3dubG9hZF91cmwgKyAnIiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4nICsgaXRlbS5kb3dubG9hZF91cmwgKyAnPC9hPjwvcD4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPHAgc3R5bGU9IicgKyByb3dTdHlsZSArICciPjxhIHRpdGxlPSInICsgaXRlbS5kb3dubG9hZF91cmwgKyAnIiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4nICsgaXRlbS5kb3dubG9hZF91cmwgKyAnPC9hPjwvcD4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKCIuaXRlbS1saXN0IikuYXBwZW5kKGh0bWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PSAiZm9sZGVyIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdldEhvbWVNdWx0aURvd25sb2FkVXJsKFt7ZmlsZV9pZDogaXRlbS5maWxlX2lkfV0sIGl0ZW0uZHJpdmVfaWQsIGl0ZW0ubmFtZSwgZnVuY3Rpb24gKGRvd25sb2FkX3VybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZG93bmxvYWRfdXJsID0gZG93bmxvYWRfdXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gJzxwPicgKyAoKytpbmRleCkgKyAn77yaJyArIGl0ZW0ubmFtZSArICc8L3A+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8cCBzdHlsZT0iJyArIHJvd1N0eWxlICsgJyI+PGEgdGl0bGU9IicgKyBpdGVtLmRvd25sb2FkX3VybCArICciIGhyZWY9IicgKyBpdGVtLmRvd25sb2FkX3VybCArICciIHN0eWxlPSJjb2xvcjogYmx1ZTsiPicgKyBpdGVtLmRvd25sb2FkX3VybCArICc8L2E+PC9wPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiLml0ZW0tbGlzdCIpLmFwcGVuZChodG1sKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdldEhvbWVMaW5rRG93bmxvYWRVcmwoaXRlbS5maWxlX2lkLCBpdGVtLmRyaXZlX2lkLCBmdW5jdGlvbiAoZG93bmxvYWRfdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb3dubG9hZF91cmwgPSBkb3dubG9hZF91cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHA+JyArICgrK2luZGV4KSArICfvvJonICsgaXRlbS5uYW1lICsgJzwvcD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxwIHN0eWxlPSInICsgcm93U3R5bGUgKyAnIj48YSB0aXRsZT0iJyArIGl0ZW0uZG93bmxvYWRfdXJsICsgJyIgc3R5bGU9ImNvbG9yOiBibHVlOyI+JyArIGl0ZW0uZG93bmxvYWRfdXJsICsgJzwvYT48L3A+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIuaXRlbS1saXN0IikuYXBwZW5kKGh0bWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCA2NiAqIGluZGV4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBvYmouaGlkZVRpcCgpOwoKICAgICAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIi5pdGVtLWxpc3QgYSIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gJCh0aGlzKS5hdHRyKCJocmVmIik7CiAgICAgICAgICAgICAgICBpZiAoIXVybCkgewogICAgICAgICAgICAgICAgICAgIHVybCA9ICQodGhpcykuYXR0cigidGl0bGUiKTsKICAgICAgICAgICAgICAgICAgICBSZSh1cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LCA1MDApOwogICAgfTsKCiAgICBvYmouc2hvd0JveCA9IGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgdmFyIHRlbXBsYXRlID0gJzxkaXYgY2xhc3M9ImFudC1tb2RhbC1yb290IGFudC1tb2RhbC1teSI+PGRpdiBjbGFzcz0iYW50LW1vZGFsLW1hc2siPjwvZGl2PjxkaXYgdGFiaW5kZXg9Ii0xIiBjbGFzcz0iYW50LW1vZGFsLXdyYXAiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJyY0RpYWxvZ1RpdGxlMSIgc3R5bGU9IiI+PGRpdiByb2xlPSJkb2N1bWVudCIgY2xhc3M9ImFudC1tb2RhbCBtb2RhbC13cmFwcGVyLS0yeUpLTyIgc3R5bGU9IndpZHRoOiA0NDBweDsgdHJhbnNmb3JtLW9yaWdpbjogMzI1LjVweCAyNDNweDsiPjxkaXYgdGFiaW5kZXg9IjAiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0id2lkdGg6IDBweDsgaGVpZ2h0OiAwcHg7IG92ZXJmbG93OiBoaWRkZW47IG91dGxpbmU6IG5vbmU7Ij48L2Rpdj48ZGl2IGNsYXNzPSJhbnQtbW9kYWwtY29udGVudCI+PGRpdiBjbGFzcz0iYW50LW1vZGFsLWhlYWRlciI+PGRpdiBjbGFzcz0iYW50LW1vZGFsLXRpdGxlIiBpZD0icmNEaWFsb2dUaXRsZTEiIGRhdGEtc3BtLWFuY2hvci1pZD0iMC4wLjAuaTEyLjM1Njc2Yzc1M0ZQd2h1Ij7mlofku7bkuIvovb08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJhbnQtbW9kYWwtYm9keSI+PGRpdiBjbGFzcz0iaWNvbi13cmFwcGVyLS0zZGJibyI+PHNwYW4gZGF0YS1yb2xlPSJpY29uIiBkYXRhLXJlbmRlci1hcz0ic3ZnIiBkYXRhLWljb24tdHlwZT0iUERTQ2xvc2UiIGNsYXNzPSJjbG9zZS1pY29uLS0zM2JQMCBpY29uLS1kLWVqQSAiPjxzdmcgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgZGF0YS1zcG0tYW5jaG9yLWlkPSIwLjAuMC5pMTEuMzU2NzZjNzUzRlB3aHUiPjx1c2UgeGxpbms6aHJlZj0iI1BEU0Nsb3NlIiBkYXRhLXNwbS1hbmNob3ItaWQ9IjAuMC4wLmk0LjM1Njc2Yzc1M0ZQd2h1Ij48L3VzZT48L3N2Zz48L3NwYW4+PC9kaXY+JzsKICAgICAgICB0ZW1wbGF0ZSArPSBib2R5OwogICAgICAgIHRlbXBsYXRlICs9ICc8L2Rpdj48ZGl2IGNsYXNzPSJhbnQtbW9kYWwtZm9vdGVyIiBkYXRhLXNwbS1hbmNob3ItaWQ9IjAuMC4wLmkxMC4zNTY3NmM3NTNGUHdodSI+PC9kaXY+PC9kaXY+PGRpdiB0YWJpbmRleD0iMCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJ3aWR0aDogMHB4OyBoZWlnaHQ6IDBweDsgb3ZlcmZsb3c6IGhpZGRlbjsgb3V0bGluZTogbm9uZTsiPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pic7CiAgICAgICAgJCgiYm9keSIpLmFwcGVuZCh0ZW1wbGF0ZSk7CiAgICAgICAgJCgiLmljb24td3JhcHBlci0tM2RiYm8iKS5vbmUoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKCIuYW50LW1vZGFsLW15IikucmVtb3ZlKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBzZWxlY3RlZEZpbGVMaXN0ID0gW10sIGZpbGVMaXN0ID0gb2JqLmZpbGVfcGFnZS5pdGVtczsKICAgICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigi6Ie05ZG96ZSZ6K+v77ya5Yqr5oyB5paH5Lu25YiX6KGo5aSx6LSlIik7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgICAgIHZhciAkbm9kZSA9ICIiOwogICAgICAgIGlmICgkKCIudGJvZHktLTNZNEZuICAudHItLTVOLTFxLnRyLS0zWXBpbSIpLmxlbmd0aCkgewogICAgICAgICAgICAkbm9kZSA9ICQoIi50Ym9keS0tM1k0Rm4gIC50ci0tNU4tMXEudHItLTNZcGltIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCQoIi5vdXRlci13cmFwcGVyLS0yNXlZQSIpLmxlbmd0aCkgewogICAgICAgICAgICAkbm9kZSA9ICQoIi5vdXRlci13cmFwcGVyLS0yNXlZQSIpOwogICAgICAgIH0KICAgICAgICAkbm9kZS5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICBpZiAoJHRoaXMuYXR0cigiZGF0YS1pcy1zZWxlY3RlZCIpID09ICJ0cnVlIikgewogICAgICAgICAgICAgICAgdmFyIGRhdGFfaW5kZXggPSAkdGhpcy5jbG9zZXN0KCJbZGF0YS1pbmRleF0iKS5hdHRyKCJkYXRhLWluZGV4Iik7CiAgICAgICAgICAgICAgICBkYXRhX2luZGV4ICYmIHNlbGVjdGVkRmlsZUxpc3QucHVzaChmaWxlTGlzdFtkYXRhX2luZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIHNlbGVjdGVkRmlsZUxpc3QubGVuZ3RoID8gc2VsZWN0ZWRGaWxlTGlzdCA6IGZpbGVMaXN0OwogICAgfTsKCiAgICBvYmouYWRkUGFnZUZpbGVMaXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBvcGVuID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW47CiAgICAgICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IDQgJiYgdGhpcy5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlLCByZXNwb25zZVVSTCA9IHRoaXMucmVzcG9uc2VVUkw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVVJMLmluZGV4T2YoIi90b2tlbi9yZWZyZXNoIikgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFjY2Vzc190b2tlbiAmJiByZXNwb25zZS50b2tlbl90eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZmlsZV9wYWdlLmFjY2Vzc190b2tlbiA9IHJlc3BvbnNlLmFjY2Vzc190b2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5maWxlX3BhZ2UudG9rZW5fdHlwZSA9IHJlc3BvbnNlLnRva2VuX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VVUkwuaW5kZXhPZigiL2ZpbGUvbGlzdCIpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL+aOkumZpOOAkOS/neWtmCDnp7vliqgg562J6KGM5Li66Kem5Y+R44CRCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1Nob3cgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiLmFudC1tb2RhbC1yb290IikuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkKHRoaXMpLmNzcygnZGlzcGxheScpID09ICJibG9jayIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3cgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2hvdykgeyByZXR1cm47IH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRfZmlsZV9pZCA9ICgobG9jYXRpb24uaHJlZi5tYXRjaCgvXC9mb2xkZXJcLyhcdyspLykgfHwgW10pWzFdKSB8fCAicm9vdCI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfZmlsZV9pZCAhPSBvYmouZmlsZV9wYWdlLnBhZ2VfaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5Y+Y5o2i6aG16Z2iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZmlsZV9wYWdlLnBhZ2VfaWQgPSBwYXJlbnRfZmlsZV9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5maWxlX3BhZ2UuaXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHRoaXMucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBvYmouZmlsZV9wYWdlLml0ZW1zID0gb2JqLmZpbGVfcGFnZS5pdGVtcy5jb25jYXQocmVzcG9uc2UuaXRlbXMpOwogICAgICAgICAgICAgICAgICAgICAgICBvYmouc2hvd1RpcFN1Y2Nlc3MoIuaWh+S7tuWIl+ihqOiOt+WPluWujOaIkCDlhbHvvJoiICsgb2JqLmZpbGVfcGFnZS5pdGVtcy5sZW5ndGggKyAi6aG5Iik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgICAgIG9wZW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgfTsKCiAgICBvYmoudG9rZW5SZWZyZXNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIHRva2VuID0gb2JqLmdldEl0ZW0oInRva2VuIiksIHJlZnJlc2hfdG9rZW4gPSB0b2tlbi5yZWZyZXNoX3Rva2VuOwogICAgICAgIGlmICghcmVmcmVzaF90b2tlbikgewogICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygiIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICQuYWpheCh7CiAgICAgICAgICAgIHR5cGU6ICJwb3N0IiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL3Rva2VuL3JlZnJlc2giLAogICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoX3Rva2VuCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAiQ29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmFjY2Vzc190b2tlbikgewogICAgICAgICAgICAgICAgICAgIG9iai5maWxlX3BhZ2UudG9rZW5fdHlwZSA9IHJlc3BvbnNlLnRva2VuX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgb2JqLmZpbGVfcGFnZS5hY2Nlc3NfdG9rZW4gPSByZXNwb25zZS5hY2Nlc3NfdG9rZW47CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soIiIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgIG9iai5nZXRTaGFyZU11bHRpRG93bmxvYWRVcmwgPSBmdW5jdGlvbiAoZmlsZXMsIHNoYXJlX2lkLCBhcmNoaXZlX25hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgdHlwZTogInBvc3QiLAogICAgICAgICAgICB1cmw6ICJodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20vYWRyaXZlL3YxL2ZpbGUvbXVsdGlEb3dubG9hZFVybCIsCiAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgIGFyY2hpdmVfbmFtZTogYXJjaGl2ZV9uYW1lLAogICAgICAgICAgICAgICAgZG93bmxvYWRfaW5mb3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgICAgIHNoYXJlX2lkOiBzaGFyZV9pZAogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgfSksCiAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICJhdXRob3JpemF0aW9uIjogIiIuY29uY2F0KG9iai5maWxlX3BhZ2UudG9rZW5fdHlwZSB8fCAiIiwgIiAiKS5jb25jYXQob2JqLmZpbGVfcGFnZS5hY2Nlc3NfdG9rZW4gfHwgIiIpLAogICAgICAgICAgICAgICAgImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFzeW5jOiB0cnVlLAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kb3dubG9hZF91cmwpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZS5kb3dubG9hZF91cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiZ2V0U2hhcmVNdWx0aURvd25sb2FkVXJsIOWksei0pSIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoImdldFNoYXJlTXVsdGlEb3dubG9hZFVybCDplJnor68iLCBlcnJvcik7CiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgb2JqLmdldFNoYXJlTGlua0Rvd25sb2FkVXJsID0gZnVuY3Rpb24gKGZpbGVfaWQsIHNoYXJlX2lkLCBjYWxsYmFjaykgewogICAgICAgICQuYWpheCh7CiAgICAgICAgICAgIHR5cGU6ICJwb3N0IiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL3YyL2ZpbGUvZ2V0X3NoYXJlX2xpbmtfZG93bmxvYWRfdXJsIiwKICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgZXhwaXJlX3NlYzogNjAwLAogICAgICAgICAgICAgICAgZmlsZV9pZDogZmlsZV9pZCwKICAgICAgICAgICAgICAgIHNoYXJlX2lkOiBzaGFyZV9pZAogICAgICAgICAgICB9KSwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgImF1dGhvcml6YXRpb24iOiAiIi5jb25jYXQob2JqLmZpbGVfcGFnZS50b2tlbl90eXBlIHx8ICIiLCAiICIpLmNvbmNhdChvYmouZmlsZV9wYWdlLmFjY2Vzc190b2tlbiB8fCAiIiksCiAgICAgICAgICAgICAgICAiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsCiAgICAgICAgICAgICAgICAieC1zaGFyZS10b2tlbiI6IG9iai5nZXRJdGVtKCJzaGFyZVRva2VuIikuc2hhcmVfdG9rZW4KICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXN5bmM6IHRydWUsCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRvd25sb2FkX3VybCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3BvbnNlLmRvd25sb2FkX3VybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJnZXRTaGFyZUxpbmtEb3dubG9hZFVybCDlpLHotKUiLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJnZXRTaGFyZUxpbmtEb3dubG9hZFVybCDplJnor68iLCBlcnJvcik7CiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgb2JqLmdldEhvbWVNdWx0aURvd25sb2FkVXJsID0gZnVuY3Rpb24gKGZpbGVzLCBkcml2ZV9pZCwgYXJjaGl2ZV9uYW1lLCBjYWxsYmFjaykgewogICAgICAgICQuYWpheCh7CiAgICAgICAgICAgIHR5cGU6ICJwb3N0IiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL2Fkcml2ZS92MS9maWxlL211bHRpRG93bmxvYWRVcmwiLAogICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICBhcmNoaXZlX25hbWU6IGFyY2hpdmVfbmFtZSwKICAgICAgICAgICAgICAgIGRvd25sb2FkX2luZm9zOiBbewogICAgICAgICAgICAgICAgICAgIGRyaXZlX2lkOiBkcml2ZV9pZCwKICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMKICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAiYXV0aG9yaXphdGlvbiI6ICIiLmNvbmNhdChvYmouZmlsZV9wYWdlLnRva2VuX3R5cGUgfHwgIiIsICIgIikuY29uY2F0KG9iai5maWxlX3BhZ2UuYWNjZXNzX3Rva2VuIHx8ICIiKSwKICAgICAgICAgICAgICAgICJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICB9LAogICAgICAgICAgICBhc3luYzogdHJ1ZSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZG93bmxvYWRfdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcG9uc2UuZG93bmxvYWRfdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoImdldFNoYXJlTXVsdGlEb3dubG9hZFVybCDlpLHotKUiLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJnZXRTaGFyZU11bHRpRG93bmxvYWRVcmwg6ZSZ6K+vIiwgZXJyb3IpOwogICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soIiIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgIG9iai5nZXRIb21lTGlua0Rvd25sb2FkVXJsID0gZnVuY3Rpb24gKGZpbGVfaWQsIGRyaXZlX2lkLCBjYWxsYmFjaykgewogICAgICAgICQuYWpheCh7CiAgICAgICAgICAgIHR5cGU6ICJwb3N0IiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL3YyL2ZpbGUvZ2V0X2Rvd25sb2FkX3VybCIsCiAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgIGRyaXZlX2lkOiBkcml2ZV9pZCwKICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGZpbGVfaWQKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICJhdXRob3JpemF0aW9uIjogIiIuY29uY2F0KG9iai5maWxlX3BhZ2UudG9rZW5fdHlwZSB8fCAiIiwgIiAiKS5jb25jYXQob2JqLmZpbGVfcGFnZS5hY2Nlc3NfdG9rZW4gfHwgIiIpLAogICAgICAgICAgICAgICAgImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFzeW5jOiB0cnVlLAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS51cmwpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZS51cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiZ2V0SG9tZUxpbmtEb3dubG9hZFVybCDlpLHotKUiLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJnZXRIb21lTGlua0Rvd25sb2FkVXJsIOmUmeivryIsIGVycm9yKTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCIiKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKCiAgICBvYmouZ2V0U2hhcmVJZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdXJsID0gbG9jYXRpb24uaHJlZjsKICAgICAgICB2YXIgbWF0Y2ggPSB1cmwubWF0Y2goL2FsaXl1bmRyaXZlXC5jb21cL3NcLyhbYS16QS1aXGRdKykvKTsKICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7CiAgICB9OwoKICAgIG9iai5nZXRJdGVtID0gZnVuY3Rpb24obikgewogICAgICAgIG4gPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0obik7CiAgICAgICAgaWYgKCFuKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uobik7CiAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgfTsKCiAgICBvYmouc2hvd1RpcFN1Y2Nlc3MgPSBmdW5jdGlvbiAobXNnLCB0aW1lb3V0KSB7CiAgICAgICAgb2JqLmhpZGVUaXAoKTsKCiAgICAgICAgdmFyICRlbGVtZW50ID0gJCgiLmFEcml2ZSBkaXYiKTsKICAgICAgICBpZiAoJGVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgICRlbGVtZW50LmFwcGVuZCgnPGRpdiBjbGFzcz0iYURyaXZlLW5vdGljZSI+PGRpdiBjbGFzcz0iYURyaXZlLW5vdGljZS1jb250ZW50Ij48ZGl2IGNsYXNzPSJhRHJpdmUtY3VzdG9tLWNvbnRlbnQgYURyaXZlLXN1Y2Nlc3MiPjxzcGFuIGRhdGEtcm9sZT0iaWNvbiIgZGF0YS1yZW5kZXItYXM9InN2ZyIgZGF0YS1pY29uLXR5cGU9IlBEU0NoZWNrbWFya0NpcmNsZUZpbGwiIGNsYXNzPSJzdWNjZXNzLWljb24tLTJadmN5IGljb24tLWQtZWpBICI+PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0Ij48dXNlIHhsaW5rOmhyZWY9IiNQRFNDaGVja21hcmtDaXJjbGVGaWxsIj48L3VzZT48L3N2Zz48L3NwYW4+PHNwYW4+PGRpdiBjbGFzcz0iY29udGVudC13cmFwcGVyLS1CN21BRyIgZGF0YS1kZXNjPSJmYWxzZSIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0NHB4OyBwYWRkaW5nLXJpZ2h0OiAyMHB4OyI+PGRpdiBjbGFzcz0idGl0bGUtd3JhcHBlci0tM2JRUTIiPicgKyBtc2cgKyAnPGRpdiBjbGFzcz0iZGVzYy13cmFwcGVyLS0yMTh4MCI+PC9kaXY+PC9kaXY+PC9kaXY+PC9zcGFuPjwvZGl2PjwvZGl2PicpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS5hcHBlbmQoJzxkaXYgY2xhc3M9ImFEcml2ZSI+PGRpdj48ZGl2IGNsYXNzPSJhRHJpdmUtbm90aWNlIj48ZGl2IGNsYXNzPSJhRHJpdmUtbm90aWNlLWNvbnRlbnQiPjxkaXYgY2xhc3M9ImFEcml2ZS1jdXN0b20tY29udGVudCBhRHJpdmUtc3VjY2VzcyI+PHNwYW4gZGF0YS1yb2xlPSJpY29uIiBkYXRhLXJlbmRlci1hcz0ic3ZnIiBkYXRhLWljb24tdHlwZT0iUERTQ2hlY2ttYXJrQ2lyY2xlRmlsbCIgY2xhc3M9InN1Y2Nlc3MtaWNvbi0tMlp2Y3kgaWNvbi0tZC1lakEgIj48c3ZnIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjx1c2UgeGxpbms6aHJlZj0iI1BEU0NoZWNrbWFya0NpcmNsZUZpbGwiPjwvdXNlPjwvc3ZnPjwvc3Bhbj48c3Bhbj48ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXItLUI3bUFHIiBkYXRhLWRlc2M9ImZhbHNlIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQ0cHg7IHBhZGRpbmctcmlnaHQ6IDIwcHg7Ij48ZGl2IGNsYXNzPSJ0aXRsZS13cmFwcGVyLS0zYlFRMiI+JyArIG1zZyArICc8ZGl2IGNsYXNzPSJkZXNjLXdyYXBwZXItLTIxOHgwIj48L2Rpdj48L2Rpdj48L2Rpdj48L3NwYW4+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7CiAgICAgICAgfQoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLmhpZGVUaXAoKTsKICAgICAgICB9LCB0aW1lb3V0IHx8IDMwMDApOwogICAgfTsKCiAgICBvYmouc2hvd1RpcEVycm9yID0gZnVuY3Rpb24gKG1zZywgdGltZW91dCkgewogICAgICAgIG9iai5oaWRlVGlwKCk7CgogICAgICAgIHZhciAkZWxlbWVudCA9ICQoIi5hRHJpdmUgZGl2Iik7CiAgICAgICAgaWYgKCRlbGVtZW50Lmxlbmd0aCkgewogICAgICAgICAgICAkZWxlbWVudC5hcHBlbmQoJzxkaXYgY2xhc3M9ImFEcml2ZS1ub3RpY2UiPjxkaXYgY2xhc3M9ImFEcml2ZS1ub3RpY2UtY29udGVudCI+PGRpdiBjbGFzcz0iYURyaXZlLWN1c3RvbS1jb250ZW50IGFEcml2ZS1lcnJvciI+PHNwYW4gZGF0YS1yb2xlPSJpY29uIiBkYXRhLXJlbmRlci1hcz0ic3ZnIiBkYXRhLWljb24tdHlwZT0iUERTQ2xvc2VDaXJjbGVGaWxsIiBjbGFzcz0iZXJyb3ItaWNvbi0tMU92NEkgaWNvbi0tZC1lakEgIj48c3ZnIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjx1c2UgeGxpbms6aHJlZj0iI1BEU0Nsb3NlQ2lyY2xlRmlsbCI+PC91c2U+PC9zdmc+PC9zcGFuPjxzcGFuPjxkaXYgY2xhc3M9ImNvbnRlbnQtd3JhcHBlci0tQjdtQUciIGRhdGEtZGVzYz0iZmFsc2UiIHN0eWxlPSJtYXJnaW4tbGVmdDogNDRweDsgcGFkZGluZy1yaWdodDogMjBweDsiPjxkaXYgY2xhc3M9InRpdGxlLXdyYXBwZXItLTNiUVEyIiBkYXRhLXNwbS1hbmNob3ItaWQ9IjAuMC4wLmk0MS4zNTY3NmM3NXlCWk5QaCI+JyArIG1zZyArICc8ZGl2IGNsYXNzPSJkZXNjLXdyYXBwZXItLTIxOHgwIj48L2Rpdj48L2Rpdj48L2Rpdj48L3NwYW4+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgnPGRpdj48ZGl2IGNsYXNzPSJhRHJpdmUiPjxkaXY+PGRpdiBjbGFzcz0iYURyaXZlLW5vdGljZSI+PGRpdiBjbGFzcz0iYURyaXZlLW5vdGljZS1jb250ZW50Ij48ZGl2IGNsYXNzPSJhRHJpdmUtY3VzdG9tLWNvbnRlbnQgYURyaXZlLWVycm9yIj48c3BhbiBkYXRhLXJvbGU9Imljb24iIGRhdGEtcmVuZGVyLWFzPSJzdmciIGRhdGEtaWNvbi10eXBlPSJQRFNDbG9zZUNpcmNsZUZpbGwiIGNsYXNzPSJlcnJvci1pY29uLS0xT3Y0SSBpY29uLS1kLWVqQSAiPjxzdmcgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHVzZSB4bGluazpocmVmPSIjUERTQ2xvc2VDaXJjbGVGaWxsIj48L3VzZT48L3N2Zz48L3NwYW4+PHNwYW4+PGRpdiBjbGFzcz0iY29udGVudC13cmFwcGVyLS1CN21BRyIgZGF0YS1kZXNjPSJmYWxzZSIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0NHB4OyBwYWRkaW5nLXJpZ2h0OiAyMHB4OyI+PGRpdiBjbGFzcz0idGl0bGUtd3JhcHBlci0tM2JRUTIiIGRhdGEtc3BtLWFuY2hvci1pZD0iMC4wLjAuaTQxLjM1Njc2Yzc1eUJaTlBoIj4nICsgbXNnICsgJzxkaXYgY2xhc3M9ImRlc2Mtd3JhcHBlci0tMjE4eDAiPjwvZGl2PjwvZGl2PjwvZGl2Pjwvc3Bhbj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsKICAgICAgICB9CgogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBvYmouaGlkZVRpcCgpCiAgICAgICAgfSwgdGltZW91dCB8fCAzMDAwKTsKICAgIH07CgogICAgb2JqLnNob3dUaXBMb2FkaW5nID0gZnVuY3Rpb24gKG1zZywgdGltZW91dCkgewogICAgICAgIG9iai5oaWRlVGlwKCk7CgogICAgICAgIHZhciAkZWxlbWVudCA9ICQoIi5hRHJpdmUgZGl2Iik7CiAgICAgICAgaWYgKCRlbGVtZW50Lmxlbmd0aCkgewogICAgICAgICAgICAkZWxlbWVudC5hcHBlbmQoJzxkaXYgY2xhc3M9ImFEcml2ZS1ub3RpY2UiPjxkaXYgY2xhc3M9ImFEcml2ZS1ub3RpY2UtY29udGVudCI+PGRpdiBjbGFzcz0iYURyaXZlLWN1c3RvbS1jb250ZW50IGFEcml2ZS1sb2FkaW5nIj48ZGl2PjwvZGl2PjxzcGFuPjxkaXYgY2xhc3M9ImNvbnRlbnQtd3JhcHBlci0tQjdtQUciIGRhdGEtZGVzYz0iZmFsc2UiIHN0eWxlPSJtYXJnaW4tbGVmdDogMjBweDsgcGFkZGluZy1yaWdodDogMjBweDsiPjxkaXYgY2xhc3M9InRpdGxlLXdyYXBwZXItLTNiUVEyIj4nICsgbXNnICsgJzxkaXYgY2xhc3M9ImRlc2Mtd3JhcHBlci0tMjE4eDAiPjwvZGl2PjwvZGl2PjwvZGl2Pjwvc3Bhbj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICQoZG9jdW1lbnQuYm9keSkuYXBwZW5kKCc8ZGl2PjxkaXYgY2xhc3M9ImFEcml2ZSI+PGRpdj48ZGl2IGNsYXNzPSJhRHJpdmUtbm90aWNlIj48ZGl2IGNsYXNzPSJhRHJpdmUtbm90aWNlLWNvbnRlbnQiPjxkaXYgY2xhc3M9ImFEcml2ZS1jdXN0b20tY29udGVudCBhRHJpdmUtbG9hZGluZyI+PGRpdj48L2Rpdj48c3Bhbj48ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXItLUI3bUFHIiBkYXRhLWRlc2M9ImZhbHNlIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDIwcHg7IHBhZGRpbmctcmlnaHQ6IDIwcHg7Ij48ZGl2IGNsYXNzPSJ0aXRsZS13cmFwcGVyLS0zYlFRMiI+JyArIG1zZyArICc8ZGl2IGNsYXNzPSJkZXNjLXdyYXBwZXItLTIxOHgwIj48L2Rpdj48L2Rpdj48L2Rpdj48L3NwYW4+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7CiAgICAgICAgfQoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLmhpZGVUaXAoKQogICAgICAgIH0sIHRpbWVvdXQgfHwgNTAwMCk7CiAgICB9OwoKICAgIG9iai5oaWRlVGlwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHQgPSAkKCIuYURyaXZlLW5vdGljZSIpOwogICAgICAgIHQubGVuZ3RoICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQucmVtb3ZlID8gdC5yZW1vdmUoKSA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQucmVtb3ZlTm9kZSAmJiB0LnJlbW92ZU5vZGUoITApOwogICAgfTsKCiAgICB2YXIgdXJsID0gbG9jYXRpb24uaHJlZjsKICAgIGlmICh1cmwuaW5kZXhPZigiLmFsaXl1bmRyaXZlLmNvbS9zLyIpID4gMCkgewogICAgICAgIG9iai5hZGRQYWdlRmlsZUxpc3QoKTsKICAgICAgICBvYmouaW5pdERvd25sb2FkU2hhcmVQYWdlKCk7CgogICAgICAgIG9iai51bmxvY2tWaWRlb0xpbWl0KCk7CiAgICAgICAgb2JqLnZpZGVvUGFnZU9wdGltaXphdGlvbigpOwogICAgfQogICAgZWxzZSBpZiAodXJsLmluZGV4T2YoIi5hbGl5dW5kcml2ZS5jb20vZHJpdmUiKSA+IDApIHsKICAgICAgICBvYmouYWRkUGFnZUZpbGVMaXN0KCk7CiAgICAgICAgb2JqLmluaXREb3dubG9hZEhvbWVQYWdlKCk7CgogICAgICAgIG9iai5jdXN0b21TaGFyZVB3ZCgpOwoKICAgICAgICBvYmoudmlkZW9QYWdlT3B0aW1pemF0aW9uKCk7CiAgICB9CiAgICBjb25zb2xlLmxvZygiPT09IOmYv+mHjOS6keebmCA9PT0iKTsKCiAgICAvLyBZb3VyIGNvZGUgaGVyZS4uLgp9KSgpOw==","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js","ts":1637743647487,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My42LjAgfCAoYykgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiB0KGUpfTp0KGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihDLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPXQuc2xpY2UsZz10LmZsYXQ/ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25jYXQuYXBwbHkoW10sZSl9LHU9dC5wdXNoLGk9dC5pbmRleE9mLG49e30sbz1uLnRvU3RyaW5nLHY9bi5oYXNPd25Qcm9wZXJ0eSxhPXYudG9TdHJpbmcsbD1hLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJudW1iZXIiIT10eXBlb2YgZS5ub2RlVHlwZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUuaXRlbX0seD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxFPUMuZG9jdW1lbnQsYz17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIGIoZSx0LG4pe3ZhciByLGksbz0obj1ufHxFKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSx0KWZvcihyIGluIGMpKGk9dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmby5zZXRBdHRyaWJ1dGUocixpKTtuLmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB3KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9uW28uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBmPSIzLjYuMCIsUz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUy5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIHAoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dyhlKTtyZXR1cm4hbShlKSYmIXgoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3MuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxldmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrMSklMn0pKX0sb2RkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6dSxzb3J0OnQuc29ydCxzcGxpY2U6dC5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSlyPWVbdF0sIl9fcHJvdG9fXyIhPT10JiZhIT09ciYmKGwmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8obj1hW3RdLG89aSYmIUFycmF5LmlzQXJyYXkobik/W106aXx8Uy5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPVMuZXh0ZW5kKGwsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoZitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09by5jYWxsKGUpKSYmKCEodD1yKGUpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49di5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZhLmNhbGwobik9PT1sKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUsdCxuKXtiKGUse25vbmNlOnQmJnQubm9uY2V9LG4pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKHAoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYocChPYmplY3QoZSkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnUuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTppLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9W10saT0wLG89ZS5sZW5ndGgsYT0hbjtpPG87aSsrKSF0KGVbaV0saSkhPT1hJiZyLnB1c2goZVtpXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAsYT1bXTtpZihwKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO3JldHVybiBnKGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT10W1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBkPWZ1bmN0aW9uKG4pe3ZhciBlLGQsYixvLGksaCxmLGcsdyx1LGwsVCxDLGEsRSx2LHMsYyx5LFM9InNpenpsZSIrMSpuZXcgRGF0ZSxwPW4uZG9jdW1lbnQsaz0wLHI9MCxtPXVlKCkseD11ZSgpLEE9dWUoKSxOPXVlKCksaj1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dCYmKGw9ITApLDB9LEQ9e30uaGFzT3duUHJvcGVydHksdD1bXSxxPXQucG9wLEw9dC5wdXNoLEg9dC5wdXNoLE89dC5zbGljZSxQPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWlmKGVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxSPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsST0iKD86XFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXFteXFxyXFxuXFxmXXxbXFx3LV18W15cMC1cXHg3Zl0pKyIsVz0iXFxbIitNKyIqKCIrSSsiKSg/OiIrTSsiKihbKl4kfCF+XT89KSIrTSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK0krIikpfCkiK00rIipcXF0iLEY9IjooIitJKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitXKyIpKil8LiopXFwpfCkiLEI9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLCQ9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksej1uZXcgUmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLFU9bmV3IFJlZ0V4cChNKyJ8PiIpLFg9bmV3IFJlZ0V4cChGKSxWPW5ldyBSZWdFeHAoIl4iK0krIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK0krIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrSSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrSSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1cpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitGKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitSKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9IVE1MJC9pLFE9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxlZT0vWyt+XS8sdGU9bmV3IFJlZ0V4cCgiXFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXChbXlxcclxcblxcZl0pIiwiZyIpLG5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49IjB4IitlLnNsaWNlKDEpLTY1NTM2O3JldHVybiB0fHwobjwwP1N0cmluZy5mcm9tQ2hhckNvZGUobis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShuPj4xMHw1NTI5NiwxMDIzJm58NTYzMjApKX0scmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csaWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxvZT1mdW5jdGlvbigpe1QoKX0sYWU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYiZmllbGRzZXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0guYXBwbHkodD1PLmNhbGwocC5jaGlsZE5vZGVzKSxwLmNoaWxkTm9kZXMpLHRbcC5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7SD17YXBwbHk6dC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtMLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc2UodCxlLG4scil7dmFyIGksbyxhLHMsdSxsLGMsZj1lJiZlLm93bmVyRG9jdW1lbnQscD1lP2Uubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoVChlKSxlPWV8fEMsRSkpe2lmKDExIT09cCYmKHU9Wi5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJnkoZSxhKSYmYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKGQucXNhJiYhTlt0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09cHx8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoVS50ZXN0KHQpfHx6LnRlc3QodCkpKXsoZj1lZS50ZXN0KHQpJiZ5ZShlLnBhcmVudE5vZGUpfHxlKT09PWUmJmQuc2NvcGV8fCgocz1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2UocmUsaWUpOmUuc2V0QXR0cmlidXRlKCJpZCIscz1TKSksbz0obD1oKHQpKS5sZW5ndGg7d2hpbGUoby0tKWxbb109KHM/IiMiK3M6IjpzY29wZSIpKyIgIit4ZShsW29dKTtjPWwuam9pbigiLCIpfXRyeXtyZXR1cm4gSC5hcHBseShuLGYucXVlcnlTZWxlY3RvckFsbChjKSksbn1jYXRjaChlKXtOKHQsITApfWZpbmFsbHl7cz09PVMmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGcodC5yZXBsYWNlKCQsIiQxIiksZSxuLHIpfWZ1bmN0aW9uIHVlKCl7dmFyIHI9W107cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gci5wdXNoKHQrIiAiKT5iLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVtyLnNoaWZ0KCldLGVbdCsiICJdPW59fWZ1bmN0aW9uIGxlKGUpe3JldHVybiBlW1NdPSEwLGV9ZnVuY3Rpb24gY2UoZSl7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGZlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9bi5sZW5ndGg7d2hpbGUoci0tKWIuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHBlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gaGUobil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PXR8fCJidXR0b24iPT09dCkmJmUudHlwZT09PW59fWZ1bmN0aW9uIGdlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYWUoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdmUoYSl7cmV0dXJuIGxlKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLGxlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKFtdLGUubGVuZ3RoLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1yW2ldXSYmKGVbbl09ISh0W25dPWVbbl0pKX0pfSl9ZnVuY3Rpb24geWUoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mb3IoZSBpbiBkPXNlLnN1cHBvcnQ9e30saT1zZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLm5hbWVzcGFjZVVSSSxuPWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hWS50ZXN0KHR8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LFQ9c2Uuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWU/ZS5vd25lckRvY3VtZW50fHxlOnA7cmV0dXJuIHIhPUMmJjk9PT1yLm5vZGVUeXBlJiZyLmRvY3VtZW50RWxlbWVudCYmKGE9KEM9cikuZG9jdW1lbnRFbGVtZW50LEU9IWkoQykscCE9QyYmKG49Qy5kZWZhdWx0VmlldykmJm4udG9wIT09biYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLGQuc2NvcGU9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KCJkaXYiKSksInVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwmJiFlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSBmaWVsZHNldCBkaXYiKS5sZW5ndGh9KSxkLmF0dHJpYnV0ZXM9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChDLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1LLnRlc3QoQy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxkLmdldEJ5SWQ9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuaWQ9UywhQy5nZXRFbGVtZW50c0J5TmFtZXx8IUMuZ2V0RWxlbWVudHNCeU5hbWUoUykubGVuZ3RofSksZC5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZFKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdCYmdC52YWx1ZT09PW59fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLGIuZmluZC5UQUc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOmQucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGIuZmluZC5DTEFTUz1kLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0scz1bXSx2PVtdLChkLnFzYT1LLnRlc3QoQy5xdWVyeVNlbGVjdG9yQWxsKSkmJihjZShmdW5jdGlvbihlKXt2YXIgdDthLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIrUysiJz48L2E+PHNlbGVjdCBpZD0nIitTKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrUysiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSwodD1DLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgibmFtZSIsIiIpLGUuYXBwZW5kQ2hpbGQodCksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT0nJ10iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqbmFtZSIrTSsiKj0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitTKyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpLGUucXVlcnlTZWxlY3RvckFsbCgiXFxcZiIpLHYucHVzaCgiW1xcclxcblxcZl0iKX0pLGNlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEuYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKGQubWF0Y2hlc1NlbGVjdG9yPUsudGVzdChjPWEubWF0Y2hlc3x8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3IpKSYmY2UoZnVuY3Rpb24oZSl7ZC5kaXNjb25uZWN0ZWRNYXRjaD1jLmNhbGwoZSwiKiIpLGMuY2FsbChlLCJbcyE9JyddOngiKSxzLnB1c2goIiE9IixGKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHM9cy5sZW5ndGgmJm5ldyBSZWdFeHAocy5qb2luKCJ8IikpLHQ9Sy50ZXN0KGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9dHx8Sy50ZXN0KGEuY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0saj10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gbnx8KDEmKG49KGUub3duZXJEb2N1bWVudHx8ZSk9PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFkLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09Q3x8ZS5vd25lckRvY3VtZW50PT1wJiZ5KHAsZSk/LTE6dD09Q3x8dC5vd25lckRvY3VtZW50PT1wJiZ5KHAsdCk/MTp1P1AodSxlKS1QKHUsdCk6MDo0Jm4/LTE6MSl9OmZ1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbixyPTAsaT1lLnBhcmVudE5vZGUsbz10LnBhcmVudE5vZGUsYT1bZV0scz1bdF07aWYoIWl8fCFvKXJldHVybiBlPT1DPy0xOnQ9PUM/MTppPy0xOm8/MTp1P1AodSxlKS1QKHUsdCk6MDtpZihpPT09bylyZXR1cm4gcGUoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP3BlKGFbcl0sc1tyXSk6YVtyXT09cD8tMTpzW3JdPT1wPzE6MH0pLEN9LHNlLm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc2UoZSxudWxsLG51bGwsdCl9LHNlLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFQoZSksZC5tYXRjaGVzU2VsZWN0b3ImJkUmJiFOW3QrIiAiXSYmKCFzfHwhcy50ZXN0KHQpKSYmKCF2fHwhdi50ZXN0KHQpKSl0cnl7dmFyIG49Yy5jYWxsKGUsdCk7aWYobnx8ZC5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBufWNhdGNoKGUpe04odCwhMCl9cmV0dXJuIDA8c2UodCxDLG51bGwsW2VdKS5sZW5ndGh9LHNlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSkseShlLHQpfSxzZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZELmNhbGwoYi5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/bihlLHQsIUUpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09cj9yOmQuYXR0cmlidXRlc3x8IUU/ZS5nZXRBdHRyaWJ1dGUodCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSxzZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UocmUsaWUpfSxzZS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGw9IWQuZGV0ZWN0RHVwbGljYXRlcyx1PSFkLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KGopLGwpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSllLnNwbGljZShuW3JdLDEpfXJldHVybiB1PW51bGwsZX0sbz1zZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKHQ9ZVtyKytdKW4rPW8odCk7cmV0dXJuIG59LChiPXNlLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmxlLG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh0ZSxuZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UodGUsbmUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxzZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZzZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWgobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1tW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJm0oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1zZS5hdHRyKGUsbik7cmV0dXJuIG51bGw9PXQ/IiE9Ij09PXI6IXJ8fCh0Kz0iIiwiPSI9PT1yP3Q9PT1pOiIhPSI9PT1yP3QhPT1pOiJePSI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6Iio9Ij09PXI/aSYmLTE8dC5pbmRleE9mKGkpOiIkPSI9PT1yP2kmJnQuc2xpY2UoLWkubGVuZ3RoKT09PWk6In49Ij09PXI/LTE8KCIgIit0LnJlcGxhY2UoQiwiICIpKyIgIikuaW5kZXhPZihpKToifD0iPT09ciYmKHQ9PT1pfHx0LnNsaWNlKDAsaS5sZW5ndGgrMSk9PT1pKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oaCxlLHQsZyx2KXt2YXIgeT0ibnRoIiE9PWguc2xpY2UoMCwzKSxtPSJsYXN0IiE9PWguc2xpY2UoLTQpLHg9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PWcmJjA9PT12P2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9eSE9PW0/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixjPWUucGFyZW50Tm9kZSxmPXgmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxwPSFuJiYheCxkPSExO2lmKGMpe2lmKHkpe3doaWxlKGwpe2E9ZTt3aGlsZShhPWFbbF0paWYoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKXJldHVybiExO3U9bD0ib25seSI9PT1oJiYhdSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih1PVttP2MuZmlyc3RDaGlsZDpjLmxhc3RDaGlsZF0sbSYmcCl7ZD0ocz0ocj0oaT0obz0oYT1jKVtTXXx8KGFbU109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09ayYmclsxXSkmJnJbMl0sYT1zJiZjLmNoaWxkTm9kZXNbc107d2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoMT09PWEubm9kZVR5cGUmJisrZCYmYT09PWUpe2lbaF09W2sscyxkXTticmVha319ZWxzZSBpZihwJiYoZD1zPShyPShpPShvPShhPWUpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSwhMT09PWQpd2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSkmJisrZCYmKHAmJigoaT0obz1hW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdPVtrLGRdKSxhPT09ZSkpYnJlYWs7cmV0dXJuKGQtPXYpPT09Z3x8ZCVnPT0wJiYwPD1kL2d9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT1iLnBzZXVkb3NbZV18fGIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKGUsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPVAoZSxyW2ldKV09ISh0W25dPXJbaV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSwwLHQpfSk6YX19LHBzZXVkb3M6e25vdDpsZShmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9ZihlLnJlcGxhY2UoJCwiJDEiKSk7cmV0dXJuIHNbU10/bGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpsZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8c2UodCxlKS5sZW5ndGh9fSksY29udGFpbnM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHRlLG5lKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KX19KSxsYW5nOmxlKGZ1bmN0aW9uKG4pe3JldHVybiBWLnRlc3Qobnx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgdDtkb3tpZih0PUU/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybih0PXQudG9Mb3dlckNhc2UoKSk9PT1ufHwwPT09dC5pbmRleE9mKG4rIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4ubG9jYXRpb24mJm4ubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUMuYWN0aXZlRWxlbWVudCYmKCFDLmhhc0ZvY3VzfHxDLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmdlKCExKSxkaXNhYmxlZDpnZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBKLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBRLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2ZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dmUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPWRlKGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pYi5wc2V1ZG9zW2VdPWhlKGUpO2Z1bmN0aW9uIG1lKCl7fWZ1bmN0aW9uIHhlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gYmUocyxlLHQpe3ZhciB1PWUuZGlyLGw9ZS5uZXh0LGM9bHx8dSxmPXQmJiJwYXJlbnROb2RlIj09PWMscD1yKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilyZXR1cm4gcyhlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1bayxwXTtpZihuKXt3aGlsZShlPWVbdV0paWYoKDE9PT1lLm5vZGVUeXBlfHxmKSYmcyhlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpaWYoaT0obz1lW1NdfHwoZVtTXT17fSkpW2UudW5pcXVlSURdfHwob1tlLnVuaXF1ZUlEXT17fSksbCYmbD09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbdV18fGU7ZWxzZXtpZigocj1pW2NdKSYmclswXT09PWsmJnJbMV09PT1wKXJldHVybiBhWzJdPXJbMl07aWYoKGlbY109YSlbMl09cyhlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gQ2UoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltTXSYmKHY9Q2UodikpLHkmJiF5W1NdJiYoeT1DZSh5LGUpKSxsZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1bXSx1PVtdLGw9dC5sZW5ndGgsYz1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8IioiLG4ubm9kZVR5cGU/W25dOm4sW10pLGY9IWR8fCFlJiZoP2M6VGUoYyxzLGQsbixyKSxwPWc/eXx8KGU/ZDpsfHx2KT9bXTp0OmY7aWYoZyYmZyhmLHAsbixyKSx2KXtpPVRlKHAsdSksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihwW3Vbb11dPSEoZlt1W29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmaS5wdXNoKGZbb109YSk7eShudWxsLHA9W10saSxyKX1vPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmLTE8KGk9eT9QKGUsYSk6c1tvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2UgcD1UZShwPT09dD9wLnNwbGljZShsLHAubGVuZ3RoKTpwKSx5P3kobnVsbCx0LHAscik6SC5hcHBseSh0LHApfSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciBpLHQsbixyPWUubGVuZ3RoLG89Yi5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9b3x8Yi5yZWxhdGl2ZVsiICJdLHM9bz8xOjAsdT1iZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9YmUoZnVuY3Rpb24oZSl7cmV0dXJuLTE8UChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT09dyl8fCgoaT10KS5ub2RlVHlwZT91KGUsdCxuKTpsKGUsdCxuKSk7cmV0dXJuIGk9bnVsbCxyfV07czxyO3MrKylpZih0PWIucmVsYXRpdmVbZVtzXS50eXBlXSljPVtiZSh3ZShjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlbU10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gQ2UoMTxzJiZ3ZShjKSwxPHMmJnhlKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoJCwiJDEiKSx0LHM8biYmRWUoZS5zbGljZShzLG4pKSxuPHImJkVlKGU9ZS5zbGljZShuKSksbjxyJiZ4ZShlKSl9Yy5wdXNoKHQpfXJldHVybiB3ZShjKX1yZXR1cm4gbWUucHJvdG90eXBlPWIuZmlsdGVycz1iLnBzZXVkb3MsYi5zZXRGaWx0ZXJzPW5ldyBtZSxoPXNlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbD14W2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj1fLmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj16LmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKCQsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1HW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/c2UuZXJyb3IoZSk6eChlLHMpLnNsaWNlKDApfSxmPXNlLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9QVtlKyIgIl07aWYoIWEpe3R8fCh0PWgoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShhPUVlKHRbbl0pKVtTXT9pLnB1c2goYSk6by5wdXNoKGEpOyhhPUEoZSwodj1vLG09MDwoeT1pKS5sZW5ndGgseD0wPHYubGVuZ3RoLHI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdT0wLGw9IjAiLGM9ZSYmW10sZj1bXSxwPXcsZD1lfHx4JiZiLmZpbmQuVEFHKCIqIixpKSxoPWsrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT1DfHx0fHxpKTtsIT09ZyYmbnVsbCE9KG89ZFtsXSk7bCsrKXtpZih4JiZvKXthPTAsdHx8by5vd25lckRvY3VtZW50PT1DfHwoVChvKSxuPSFFKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8QyxuKSl7ci5wdXNoKG8pO2JyZWFrfWkmJihrPWgpfW0mJigobz0hcyYmbykmJnUtLSxlJiZjLnB1c2gobykpfWlmKHUrPWwsbSYmbCE9PXUpe2E9MDt3aGlsZShzPXlbYSsrXSlzKGMsZix0LG4pO2lmKGUpe2lmKDA8dSl3aGlsZShsLS0pY1tsXXx8ZltsXXx8KGZbbF09cS5jYWxsKHIpKTtmPVRlKGYpfUguYXBwbHkocixmKSxpJiYhZSYmMDxmLmxlbmd0aCYmMTx1K3kubGVuZ3RoJiZzZS51bmlxdWVTb3J0KHIpfXJldHVybiBpJiYoaz1oLHc9cCksY30sbT9sZShyKTpyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIGF9LGc9c2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxjPSFyJiZoKGU9bC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09Yy5sZW5ndGgpe2lmKDI8KG89Y1swXT1jWzBdLnNsaWNlKDApKS5sZW5ndGgmJiJJRCI9PT0oYT1vWzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmRSYmYi5yZWxhdGl2ZVtvWzFdLnR5cGVdKXtpZighKHQ9KGIuZmluZC5JRChhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksdCl8fFtdKVswXSkpcmV0dXJuIG47bCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1HLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6by5sZW5ndGg7d2hpbGUoaS0tKXtpZihhPW9baV0sYi5yZWxhdGl2ZVtzPWEudHlwZV0pYnJlYWs7aWYoKHU9Yi5maW5kW3NdKSYmKHI9dShhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksZWUudGVzdChvWzBdLnR5cGUpJiZ5ZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKG8uc3BsaWNlKGksMSksIShlPXIubGVuZ3RoJiZ4ZShvKSkpcmV0dXJuIEguYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fGYoZSxjKSkocix0LCFFLG4sIXR8fGVlLnRlc3QoZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpLG59LGQuc29ydFN0YWJsZT1TLnNwbGl0KCIiKS5zb3J0KGopLmpvaW4oIiIpPT09UyxkLmRldGVjdER1cGxpY2F0ZXM9ISFsLFQoKSxkLnNvcnREZXRhY2hlZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuKXJldHVybiBlLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksZC5hdHRyaWJ1dGVzJiZjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmZSgidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtpZighbiYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZmUoUixmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT1lW3RdP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzZX0oQyk7Uy5maW5kPWQsUy5leHByPWQuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1kLnVuaXF1ZVNvcnQsUy50ZXh0PWQuZ2V0VGV4dCxTLmlzWE1MRG9jPWQuaXNYTUwsUy5jb250YWlucz1kLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9ZC5lc2NhcGU7dmFyIGg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJlMoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxUPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxrPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gQShlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9dmFyIE49L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gaihlLG4scil7cmV0dXJuIG0obik/Uy5ncmVwKGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4hIW4uY2FsbChlLHQsZSkhPT1yfSk6bi5ub2RlVHlwZT9TLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybi0xPGkuY2FsbChuLGUpIT09cn0pOlMuZmlsdGVyKG4sZSxyKX1TLmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOlMuZmluZC5tYXRjaGVzKGUsUy5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsaT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoUy5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKylTLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/Uy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhaih0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmay50ZXN0KGUpP1MoZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgRCxxPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fEQsInN0cmluZyI9PXR5cGVvZiBlKXtpZighKHI9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpxLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIFM/dFswXTp0LFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkUsITApKSxOLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KW0odGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1FLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTptKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKFMpOlMubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixEPVMoRSk7dmFyIEw9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sSD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBPKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PVMoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoUy5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZTKGUpO2lmKCFrLnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/LTE8YS5pbmRleChuKToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP1MudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2kuY2FsbChTKGUpLHRoaXNbMF0pOmkuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gVCgoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFQoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuY29udGVudERvY3VtZW50JiZyKGUuY29udGVudERvY3VtZW50KT9lLmNvbnRlbnREb2N1bWVudDooQShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLFMubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe1MuZm5bcl09ZnVuY3Rpb24oZSx0KXt2YXIgbj1TLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPVMuZmlsdGVyKHQsbikpLDE8dGhpcy5sZW5ndGgmJihIW3JdfHxTLnVuaXF1ZVNvcnQobiksTC50ZXN0KHIpJiZuLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIFA9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3JldHVybiBlfWZ1bmN0aW9uIE0oZSl7dGhyb3cgZX1mdW5jdGlvbiBJKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZtKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJm0oaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxTLmVhY2goZS5tYXRjaChQKXx8W10sZnVuY3Rpb24oZSx0KXtuW3RdPSEwfSksbik6Uy5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXToiIil9LGY9e2FkZDpmdW5jdGlvbigpe3JldHVybiBzJiYodCYmIWkmJihsPXMubGVuZ3RoLTEsdS5wdXNoKHQpKSxmdW5jdGlvbiBuKGUpe1MuZWFjaChlLGZ1bmN0aW9uKGUsdCl7bSh0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT13KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1TLmluQXJyYXkodCxzLG4pKSlzLnNwbGljZShuLDEpLG48PWwmJmwtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT8tMTxTLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgbz1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0saT0icGVuZGluZyIsYT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHMuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSwiY2F0Y2giOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihyKXtTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPW0oaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJm0oZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLG0odCk/cz90LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scykpOih1KyssdC5jYWxsKGUsbCh1LG8sUixzKSxsKHUsbyxNLHMpLGwodSxvLFIsby5ub3RpZnlXaXRoKSkpOihhIT09UiYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LnN0YWNrVHJhY2UpLHU8PWkrMSYmKGEhPT1NJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHQuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxDLnNldFRpbWVvdXQodCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSxtKHIpP3I6UixlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSxtKHQpP3Q6UikpLG9bMl1bM10uYWRkKGwoMCxlLG0obik/bjpNKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Uy5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gUy5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzJdLHI9dFs1XTthW3RbMV1dPW4uYWRkLHImJm4uYWRkKGZ1bmN0aW9uKCl7aT1yfSxvWzMtZV1bMl0uZGlzYWJsZSxvWzMtZV1bM10uZGlzYWJsZSxvWzBdWzJdLmxvY2ssb1swXVszXS5sb2NrKSxuLmFkZCh0WzNdLmZpcmUpLHNbdFswXV09ZnVuY3Rpb24oKXtyZXR1cm4gc1t0WzBdKyJXaXRoIl0odGhpcz09PXM/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxzW3RbMF0rIldpdGgiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPXMuY2FsbChhcmd1bWVudHMpLG89Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9zLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKEkoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksInBlbmRpbmciPT09by5zdGF0ZSgpfHxtKGlbdF0mJmlbdF0udGhlbikpKXJldHVybiBvLnRoZW4oKTt3aGlsZSh0LS0pSShpW3RdLGEodCksby5yZWplY3QpO3JldHVybiBvLnByb21pc2UoKX19KTt2YXIgVz0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtDLmNvbnNvbGUmJkMuY29uc29sZS53YXJuJiZlJiZXLnRlc3QoZS5uYW1lKSYmQy5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrZS5tZXNzYWdlLGUuc3RhY2ssdCl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfTt2YXIgRj1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gQigpe0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixCKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe1MucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCkhPT1lJiYwPC0tUy5yZWFkeVdhaXR8fEYucmVzb2x2ZVdpdGgoRSxbU10pfX0pLFMucmVhZHkudGhlbj1GLnRoZW4sImNvbXBsZXRlIj09PUUucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09RS5yZWFkeVN0YXRlJiYhRS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/Qy5zZXRUaW1lb3V0KFMucmVhZHkpOihFLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIpLEMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsQikpO3ZhciAkPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT13KG4pKWZvcihzIGluIGk9ITAsbikkKGUsdCxzLG5bc10sITAsbyxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLG0ocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoUyhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxfPS9eLW1zLS8sej0vLShbYS16XSkvZztmdW5jdGlvbiBVKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBYKGUpe3JldHVybiBlLnJlcGxhY2UoXywibXMtIikucmVwbGFjZSh6LFUpfXZhciBWPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07ZnVuY3Rpb24gRygpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rRy51aWQrK31HLnVpZD0xLEcucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LFYoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW1godCldPW47ZWxzZSBmb3IociBpbiB0KWlbWChyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtYKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChYKToodD1YKHQpKWluIHI/W3RdOnQubWF0Y2goUCl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxTLmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiFTLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgWT1uZXcgRyxRPW5ldyBHLEo9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxLPS9bQS1aXS9nO2Z1bmN0aW9uIFooZSx0LG4pe3ZhciByLGk7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShLLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPSJ0cnVlIj09PShpPW4pfHwiZmFsc2UiIT09aSYmKCJudWxsIj09PWk/bnVsbDppPT09K2krIiI/K2k6Si50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aSl9Y2F0Y2goZSl7fVEuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBRLmhhc0RhdGEoZSl8fFkuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFEuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1EucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gWS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1kucmVtb3ZlKGUsdCl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT1RLmdldChvKSwxPT09by5ub2RlVHlwZSYmIVkuZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7dD1hLmxlbmd0aDt3aGlsZSh0LS0pYVt0XSYmMD09PShyPWFbdF0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9WChyLnNsaWNlKDUpKSxaKG8scixpW3JdKSk7WS5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBuP3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbil9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ7aWYobyYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KHQ9US5nZXQobyxuKSk/dDp2b2lkIDAhPT0odD1aKG8sbikpP3Q6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbixlKX0pfSxudWxsLGUsMTxhcmd1bWVudHMubGVuZ3RoLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnJlbW92ZSh0aGlzLGUpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9WS5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1ZLmFjY2VzcyhlLHQsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49Uy5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz1TLl9xdWV1ZUhvb2tzKGUsdCk7ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIFkuZ2V0KGUsbil8fFkuYWNjZXNzKGUsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7WS5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iZngiLGUtLSksYXJndW1lbnRzLmxlbmd0aDxlP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uy5xdWV1ZSh0aGlzLHQsbik7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1lWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9Uy5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4Ijt3aGlsZShhLS0pKG49WS5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgZWU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsdGU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK2VlKyIpKFthLXolXSopJCIsImkiKSxuZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLHJlPUUuZG9jdW1lbnRFbGVtZW50LGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sb2U9e2NvbXBvc2VkOiEwfTtyZS5nZXRSb290Tm9kZSYmKGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShvZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmaWUoZSkmJiJub25lIj09PVMuY3NzKGUsImRpc3BsYXkiKX07ZnVuY3Rpb24gc2UoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChTLmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihTLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmdGUuZXhlYyhTLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pUy5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLFMuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgdWU9e307ZnVuY3Rpb24gbGUoZSx0KXtmb3IodmFyIG4scixpLG8sYSxzLHUsbD1bXSxjPTAsZj1lLmxlbmd0aDtjPGY7YysrKShyPWVbY10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oIm5vbmUiPT09biYmKGxbY109WS5nZXQociwiZGlzcGxheSIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmYWUocikmJihsW2NdPSh1PWE9bz12b2lkIDAsYT0oaT1yKS5vd25lckRvY3VtZW50LHM9aS5ub2RlTmFtZSwodT11ZVtzXSl8fChvPWEuYm9keS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQocykpLHU9Uy5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSx1ZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsWS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthZSh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBjZSxmZSxwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7Y2U9RS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGZlPUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxmZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksZmUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGNlLmFwcGVuZENoaWxkKGZlKSx5LmNoZWNrQ2xvbmU9Y2UuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGNlLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIWNlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxjZS5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWNlLmxhc3RDaGlsZDt2YXIgZ2U9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiB2ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmQShlLHQpP1MubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geWUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspWS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFkuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9Z2UudGJvZHk9Z2UudGZvb3Q9Z2UuY29sZ3JvdXA9Z2UuY2FwdGlvbj1nZS50aGVhZCxnZS50aD1nZS50ZCx5Lm9wdGlvbnx8KGdlLm9wdGdyb3VwPWdlLm9wdGlvbj1bMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdKTt2YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXcobykpUy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxTLmluQXJyYXkobyxyKSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPWllKG8pLGE9dmUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmeWUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn12YXIgYmU9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHdlKCl7cmV0dXJuITB9ZnVuY3Rpb24gVGUoKXtyZXR1cm4hMX1mdW5jdGlvbiBDZShlLHQpe3JldHVybiBlPT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIEUuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fSgpPT0oImZvY3VzIj09PXQpfWZ1bmN0aW9uIEVlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLHQpRWUoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9VGU7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIFMoKS5vZmYoZSksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1TLmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX1mdW5jdGlvbiBTZShlLGksbyl7bz8oWS5zZXQoZSxpLCExKSxTLmV2ZW50LmFkZChlLGkse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1ZLmdldCh0aGlzLGkpO2lmKDEmZS5pc1RyaWdnZXImJnRoaXNbaV0pe2lmKHIubGVuZ3RoKShTLmV2ZW50LnNwZWNpYWxbaV18fHt9KS5kZWxlZ2F0ZVR5cGUmJmUuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihyPXMuY2FsbChhcmd1bWVudHMpLFkuc2V0KHRoaXMsaSxyKSx0PW8odGhpcyxpKSx0aGlzW2ldKCksciE9PShuPVkuZ2V0KHRoaXMsaSkpfHx0P1kuc2V0KHRoaXMsaSwhMSk6bj17fSxyIT09bilyZXR1cm4gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksbiYmbi52YWx1ZX1lbHNlIHIubGVuZ3RoJiYoWS5zZXQodGhpcyxpLHt2YWx1ZTpTLmV2ZW50LnRyaWdnZXIoUy5leHRlbmQoclswXSxTLkV2ZW50LnByb3RvdHlwZSksci5zbGljZSgxKSx0aGlzKX0pLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1ZLmdldChlLGkpJiZTLmV2ZW50LmFkZChlLGksd2UpfVMuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9WS5nZXQodCk7aWYoVih0KSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihyZSxpKSxuLmd1aWR8fChuLmd1aWQ9Uy5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFMmJlMuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP1MuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGw9KGU9KGV8fCIiKS5tYXRjaChQKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9YmUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkJiYoZj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KGk/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGQsZj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9Uy5leHRlbmQoe3R5cGU6ZCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmUy5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGkpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sbyksKHA9dVtkXSl8fCgocD11W2RdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGgsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGQsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGMpLGMuaGFuZGxlci5ndWlkfHwoYy5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksaT9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGMpOnAucHVzaChjKSxTLmV2ZW50Lmdsb2JhbFtkXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9WS5oYXNEYXRhKGUpJiZZLmdldChlKTtpZih2JiYodT12LmV2ZW50cykpe2w9KHQ9KHR8fCIiKS5tYXRjaChQKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9YmUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkKXtmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scD11W2Q9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGRdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1vPXAubGVuZ3RoO3doaWxlKG8tLSljPXBbb10sIWkmJmchPT1jLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1jLmd1aWR8fHMmJiFzLnRlc3QoYy5uYW1lc3BhY2UpfHxyJiZyIT09Yy5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fFMucmVtb3ZlRXZlbnQoZSxkLHYuaGFuZGxlKSxkZWxldGUgdVtkXSl9ZWxzZSBmb3IoZCBpbiB1KVMuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7Uy5pc0VtcHR5T2JqZWN0KHUpJiZZLnJlbW92ZShlLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksdT1TLmV2ZW50LmZpeChlKSxsPShZLmdldCh0aGlzLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbdS50eXBlXXx8W10sYz1TLmV2ZW50LnNwZWNpYWxbdS50eXBlXXx8e307Zm9yKHNbMF09dSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylzW3RdPWFyZ3VtZW50c1t0XTtpZih1LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdSkpe2E9Uy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdSxsKSx0PTA7d2hpbGUoKGk9YVt0KytdKSYmIXUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7dS5jdXJyZW50VGFyZ2V0PWkuZWxlbSxuPTA7d2hpbGUoKG89aS5oYW5kbGVyc1tuKytdKSYmIXUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSl1LnJuYW1lc3BhY2UmJiExIT09by5uYW1lc3BhY2UmJiF1LnJuYW1lc3BhY2UudGVzdChvLm5hbWVzcGFjZSl8fCh1LmhhbmRsZU9iaj1vLHUuZGF0YT1vLmRhdGEsdm9pZCAwIT09KHI9KChTLmV2ZW50LnNwZWNpYWxbby5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fG8uaGFuZGxlcikuYXBwbHkoaS5lbGVtLHMpKSYmITE9PT0odS5yZXN1bHQ9cikmJih1LnByZXZlbnREZWZhdWx0KCksdS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBjLnBvc3REaXNwYXRjaCYmYy5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHUpLHUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHM9W10sdT10LmRlbGVnYXRlQ291bnQsbD1lLnRhcmdldDtpZih1JiZsLm5vZGVUeXBlJiYhKCJjbGljayI9PT1lLnR5cGUmJjE8PWUuYnV0dG9uKSlmb3IoO2whPT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1sLm5vZGVUeXBlJiYoImNsaWNrIiE9PWUudHlwZXx8ITAhPT1sLmRpc2FibGVkKSl7Zm9yKG89W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW2k9KHI9dFtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbaV09ci5uZWVkc0NvbnRleHQ/LTE8UyhpLHRoaXMpLmluZGV4KGwpOlMuZmluZChpLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCksYVtpXSYmby5wdXNoKHIpO28ubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczpvfSl9cmV0dXJuIGw9dGhpcyx1PHQubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczp0LnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6bShlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbUy5leHBhbmRvXT9lOm5ldyBTLkV2ZW50KGUpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZTZSh0LCJjbGljayIsd2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZTZSh0LCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldDtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJlkuZ2V0KHQsImNsaWNrIil8fEEodCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5yZXN1bHQmJmUub3JpZ2luYWxFdmVudCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX19LFMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbil9LFMuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBTLkV2ZW50KSlyZXR1cm4gbmV3IFMuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1lLmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09ZS5yZXR1cm5WYWx1ZT93ZTpUZSx0aGlzLnRhcmdldD1lLnRhcmdldCYmMz09PWUudGFyZ2V0Lm5vZGVUeXBlP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9ZSx0JiZTLmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbUy5leHBhbmRvXT0hMH0sUy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOlRlLGlzUHJvcGFnYXRpb25TdG9wcGVkOlRlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOlRlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXdlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXdlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD13ZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sUy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOiEwfSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFNlKHRoaXMsZSxDZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gU2UodGhpcyxlKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZGVsZWdhdGVUeXBlOnR9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe1MuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOmksYmluZFR5cGU6aSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnJlbGF0ZWRUYXJnZXQscj1lLmhhbmRsZU9iajtyZXR1cm4gbiYmKG49PT10aGlzfHxTLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEVlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gRWUodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosUyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49VGUpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIGtlPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLEFlPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLE5lPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBqZShlLHQpe3JldHVybiBBKGUsInRhYmxlIikmJkEoMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpJiZTKGUpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxlfWZ1bmN0aW9uIERlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gcWUoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIExlKGUsdCl7dmFyIG4scixpLG8sYSxzO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihZLmhhc0RhdGEoZSkmJihzPVkuZ2V0KGUpLmV2ZW50cykpZm9yKGkgaW4gWS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQodCxpLHNbaV1bbl0pO1EuaGFzRGF0YShlKSYmKG89US5hY2Nlc3MoZSksYT1TLmV4dGVuZCh7fSxvKSxRLnNldCh0LGEpKX19ZnVuY3Rpb24gSGUobixyLGksbyl7cj1nKHIpO3ZhciBlLHQsYSxzLHUsbCxjPTAsZj1uLmxlbmd0aCxwPWYtMSxkPXJbMF0saD1tKGQpO2lmKGh8fDE8ZiYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZBZS50ZXN0KGQpKXJldHVybiBuLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bi5lcShlKTtoJiYoclswXT1kLmNhbGwodGhpcyxlLHQuaHRtbCgpKSksSGUodCxyLGksbyl9KTtpZihmJiYodD0oZT14ZShyLG5bMF0ub3duZXJEb2N1bWVudCwhMSxuLG8pKS5maXJzdENoaWxkLDE9PT1lLmNoaWxkTm9kZXMubGVuZ3RoJiYoZT10KSx0fHxvKSl7Zm9yKHM9KGE9Uy5tYXAodmUoZSwic2NyaXB0IiksRGUpKS5sZW5ndGg7YzxmO2MrKyl1PWUsYyE9PXAmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLHZlKHUsInNjcmlwdCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLHFlKSxjPTA7YzxzO2MrKyl1PWFbY10saGUudGVzdCh1LnR5cGV8fCIiKSYmIVkuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxsKTpiKHUudGV4dENvbnRlbnQucmVwbGFjZShOZSwiIiksdSxsKSl9cmV0dXJuIG59ZnVuY3Rpb24gT2UoZSx0LG4pe2Zvcih2YXIgcixpPXQ/Uy5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKHZlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZpZShyKSYmeWUodmUociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPWUuY2xvbmVOb2RlKCEwKSxmPWllKGUpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8Uy5pc1hNTERvYyhlKSkpZm9yKGE9dmUoYykscj0wLGk9KG89dmUoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLCJpbnB1dCI9PT0obD11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZwZS50ZXN0KHMudHlwZSk/dS5jaGVja2VkPXMuY2hlY2tlZDoiaW5wdXQiIT09bCYmInRleHRhcmVhIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fHZlKGUpLGE9YXx8dmUoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylMZShvW3JdLGFbcl0pO2Vsc2UgTGUoZSxjKTtyZXR1cm4gMDwoYT12ZShjLCJzY3JpcHQiKSkubGVuZ3RoJiZ5ZShhLCFmJiZ2ZShlLCJzY3JpcHQiKSksY30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT1TLmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihWKG4pKXtpZih0PW5bWS5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW1kuZXhwYW5kb109dm9pZCAwfW5bUS5leHBhbmRvXSYmKG5bUS5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBPZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIE9lKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fGplKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBIZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9amUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBIZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBIZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEodmUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIWtlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9Uy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIEhlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyxuKTwwJiYoUy5jbGVhbkRhdGEodmUodGhpcykpLHQmJnQucmVwbGFjZUNoaWxkKGUsdGhpcykpfSxuKX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLGEpe1MuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj1TKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMocltvXSlbYV0odCksdS5hcHBseShuLHQuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUGU9bmV3IFJlZ0V4cCgiXigiK2VlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksUmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9QyksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxNZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihpIGluIHQpb1tpXT1lLnN0eWxlW2ldLGUuc3R5bGVbaV09dFtpXTtmb3IoaSBpbiByPW4uY2FsbChlKSx0KWUuc3R5bGVbaV09b1tpXTtyZXR1cm4gcn0sSWU9bmV3IFJlZ0V4cChuZS5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBXZShlLHQsbil7dmFyIHIsaSxvLGEscz1lLnN0eWxlO3JldHVybihuPW58fFJlKGUpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxuW3RdKXx8aWUoZSl8fChhPVMuc3R5bGUoZSx0KSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmUGUudGVzdChhKSYmSWUudGVzdCh0KSYmKHI9cy53aWR0aCxpPXMubWluV2lkdGgsbz1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPWkscy5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gRmUoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIWUoKSlyZXR1cm4odGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihsKXt1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIscmUuYXBwZW5kQ2hpbGQodSkuYXBwZW5kQ2hpbGQobCk7dmFyIGU9Qy5nZXRDb21wdXRlZFN0eWxlKGwpO249IjElIiE9PWUudG9wLHM9MTI9PT10KGUubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PXQobC5vZmZzZXRXaWR0aC8zKSxyZS5yZW1vdmVDaGlsZCh1KSxsPW51bGx9fWZ1bmN0aW9uIHQoZSl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChlKSl9dmFyIG4scixpLG8sYSxzLHU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPUUuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxufSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHN9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGl9LHJlbGlhYmxlVHJEaW1lbnNpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7cmV0dXJuIG51bGw9PWEmJihlPUUuY3JlYXRlRWxlbWVudCgidGFibGUiKSx0PUUuY3JlYXRlRWxlbWVudCgidHIiKSxuPUUuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZSIsdC5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MXB4IHNvbGlkIix0LnN0eWxlLmhlaWdodD0iMXB4IixuLnN0eWxlLmhlaWdodD0iOXB4IixuLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixyZS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZCh0KS5hcHBlbmRDaGlsZChuKSxyPUMuZ2V0Q29tcHV0ZWRTdHlsZSh0KSxhPXBhcnNlSW50KHIuaGVpZ2h0LDEwKStwYXJzZUludChyLmJvcmRlclRvcFdpZHRoLDEwKStwYXJzZUludChyLmJvcmRlckJvdHRvbVdpZHRoLDEwKT09PXQub2Zmc2V0SGVpZ2h0LHJlLnJlbW92ZUNoaWxkKGUpKSxhfX0pKX0oKTt2YXIgQmU9WyJXZWJraXQiLCJNb3oiLCJtcyJdLCRlPUUuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsX2U9e307ZnVuY3Rpb24gemUoZSl7dmFyIHQ9Uy5jc3NQcm9wc1tlXXx8X2VbZV07cmV0dXJuIHR8fChlIGluICRlP2U6X2VbZV09ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1CZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPUJlW25dK3QpaW4gJGUpcmV0dXJuIGV9KGUpfHxlKX12YXIgVWU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFZlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxHZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gWWUoZSx0LG4pe3ZhciByPXRlLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOnR9ZnVuY3Rpb24gUWUoZSx0LG4scixpLG8pe3ZhciBhPSJ3aWR0aCI9PT10PzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3MoZSxuK25lW2FdLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSkpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKSkpOih1Kz1TLmNzcyhlLCJwYWRkaW5nIituZVthXSwhMCxpKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKTpzKz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpO3JldHVybiFyJiYwPD1vJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBKZShlLHQsbil7dmFyIHI9UmUoZSksaT0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsciksbz1pLGE9V2UoZSx0LHIpLHM9Im9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7aWYoUGUudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJml8fCF5LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJkEoZSwidHIiKXx8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT0iYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLChvPXMgaW4gZSkmJihhPWVbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStRZShlLHQsbnx8KGk/ImJvcmRlciI6ImNvbnRlbnQiKSxvLHIsYSkrInB4In1mdW5jdGlvbiBLZShlLHQsbixyLGkpe3JldHVybiBuZXcgS2UucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPVdlKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9WCh0KSx1PVhlLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PXplKHMpKSxhPVMuY3NzSG9va3NbdF18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLHIpKT9pOmxbdF07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihpPXRlLmV4ZWMobikpJiZpWzFdJiYobj1zZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwobFt0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVgodCk7cmV0dXJuIFhlLnRlc3QodCl8fCh0PXplKHMpKSwoYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYoaT1hLmdldChlLCEwLG4pKSx2b2lkIDA9PT1pJiYoaT1XZShlLHQscikpLCJub3JtYWwiPT09aSYmdCBpbiBHZSYmKGk9R2VbdF0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KGkpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDppKTppfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx1KXtTLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIVVlLnRlc3QoUy5jc3MoZSwiZGlzcGxheSIpKXx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9KZShlLHUsbik6TWUoZSxWZSxmdW5jdGlvbigpe3JldHVybiBKZShlLHUsbil9KX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVJlKGUpLG89IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixhPShvfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/UWUoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktUWUoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9dGUuZXhlYyh0KSkmJiJweCIhPT0oclszXXx8InB4IikmJihlLnN0eWxlW3VdPXQsdD1TLmNzcyhlLHUpKSxZZSgwLHQscyl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD1GZSh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoV2UoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LU1lKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe1MuY3NzSG9va3NbaStvXT17ZXhwYW5kOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49e30scj0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiICIpOltlXTt0PDQ7dCsrKW5baStuZVt0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihTLmNzc0hvb2tzW2krb10uc2V0PVllKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPVJlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPVMuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKGUsdCxuKTpTLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKFMuVHdlZW49S2UpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S2UsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9S2UucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOktlLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPUtlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD1TLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6S2UucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0pLmluaXQucHJvdG90eXBlPUtlLnByb3RvdHlwZSwoS2UucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9Uy5jc3MoZS5lbGVtLGUucHJvcCwiIikpJiYiYXV0byIhPT10P3Q6MH0sc2V0OmZ1bmN0aW9uKGUpe1MuZnguc3RlcFtlLnByb3BdP1MuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVt6ZShlLnByb3ApXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzpTLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSkuc2Nyb2xsVG9wPUtlLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1LZS5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIFplLGV0LHR0LG50LHJ0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxpdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIG90KCl7ZXQmJighMT09PUUuaGlkZGVuJiZDLnJlcXVlc3RBbmltYXRpb25GcmFtZT9DLnJlcXVlc3RBbmltYXRpb25GcmFtZShvdCk6Qy5zZXRUaW1lb3V0KG90LFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiBhdCgpe3JldHVybiBDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtaZT12b2lkIDB9KSxaZT1EYXRlLm5vdygpfWZ1bmN0aW9uIHN0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49bmVbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiB1dChlLHQsbil7Zm9yKHZhciByLGk9KGx0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KGx0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGx0KG8sZSx0KXt2YXIgbixhLHI9MCxpPWx0LnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoYSlyZXR1cm4hMTtmb3IodmFyIGU9WmV8fGF0KCksdD1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tZSksbj0xLSh0L2wuZHVyYXRpb258fDApLHI9MCxpPWwudHdlZW5zLmxlbmd0aDtyPGk7cisrKWwudHdlZW5zW3JdLnJ1bihuKTtyZXR1cm4gcy5ub3RpZnlXaXRoKG8sW2wsbix0XSksbjwxJiZpP3Q6KGl8fHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06byxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sdCksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOnQsc3RhcnRUaW1lOlplfHxhdCgpLGR1cmF0aW9uOnQuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49Uy5Ud2VlbihvLGwub3B0cyxlLHQsbC5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKG4pLG59LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWU/bC50d2VlbnMubGVuZ3RoOjA7aWYoYSlyZXR1cm4gdGhpcztmb3IoYT0hMDt0PG47dCsrKWwudHdlZW5zW3RdLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsLGVdKSk6cy5yZWplY3RXaXRoKG8sW2wsZV0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcighZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYoaT10W3I9WChuKV0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIG89YS5leHBhbmQobyksZGVsZXRlIGVbcl0sbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKTtlbHNlIHRbcl09aX0oYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7cjxpO3IrKylpZihuPWx0LnByZWZpbHRlcnNbcl0uY2FsbChsLG8sYyxsLm9wdHMpKXJldHVybiBtKG4uc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIFMubWFwKGMsdXQsbCksbShsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChvLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1TLkFuaW1hdGlvbj1TLmV4dGVuZChsdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHNlKG4uZWxlbSxlLHRlLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7bShlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChQKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0sbHQudHdlZW5lcnNbbl09bHQudHdlZW5lcnNbbl18fFtdLGx0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx2PVkuZ2V0KGUsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksdClpZihpPXRbcl0scnQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWRbcl09diYmdltyXXx8Uy5zdHlsZShlLHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QodCkpfHwhUy5pc0VtcHR5T2JqZWN0KGQpKWZvcihyIGluIGYmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sbnVsbD09KGw9diYmdi5kaXNwbGF5KSYmKGw9WS5nZXQoZSwiZGlzcGxheSIpKSwibm9uZSI9PT0oYz1TLmNzcyhlLCJkaXNwbGF5IikpJiYobD9jPWw6KGxlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz1TLmNzcyhlLCJkaXNwbGF5IiksbGUoW2VdKSkpLCgiaW5saW5lIj09PWN8fCJpbmxpbmUtYmxvY2siPT09YyYmbnVsbCE9bCkmJiJub25lIj09PVMuY3NzKGUsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7aC5kaXNwbGF5PWx9KSxudWxsPT1sJiYoYz1oLmRpc3BsYXksbD0ibm9uZSI9PT1jPyIiOmMpKSxoLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxkKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9WS5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpsfSksbyYmKHYuaGlkZGVuPSFnKSxnJiZsZShbZV0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGxlKFtlXSksWS5yZW1vdmUoZSwiZnhzaG93IiksZClTLnN0eWxlKGUscixkW3JdKX0pKSx1PXV0KGc/dltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9sdC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6bHQucHJlZmlsdGVycy5wdXNoKGUpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT9TLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fG0oZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIW0odCkmJnR9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGFlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1TLmlzRW1wdHlPYmplY3QodCksbz1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9bHQodGhpcyxTLmV4dGVuZCh7fSx0KSxvKTsoaXx8WS5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihpLGUsbyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChvKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpJiYobz1lLGU9aSxpPXZvaWQgMCksZSYmdGhpcy5xdWV1ZShpfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCx0PW51bGwhPWkmJmkrInF1ZXVlSG9va3MiLG49Uy50aW1lcnMscj1ZLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZpdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxTLmRlcXVldWUodGhpcyxpKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuITEhPT1hJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0PVkuZ2V0KHRoaXMpLG49dFthKyJxdWV1ZSJdLHI9dFthKyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxvPW4/bi5sZW5ndGg6MDtmb3IodC5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUscil7dmFyIGk9Uy5mbltyXTtTLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoc3QociwhMCksZSx0LG4pfX0pLFMuZWFjaCh7c2xpZGVEb3duOnN0KCJzaG93Iiksc2xpZGVVcDpzdCgiaGlkZSIpLHNsaWRlVG9nZ2xlOnN0KCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGUscil7Uy5mbltlXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYW5pbWF0ZShyLGUsdCxuKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1TLnRpbWVycztmb3IoWmU9RGF0ZS5ub3coKTt0PG4ubGVuZ3RoO3QrKykoZT1uW3RdKSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSxaZT12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24oZSl7Uy50aW1lcnMucHVzaChlKSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe2V0fHwoZXQ9ITAsb3QoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe2V0PW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24ocixlKXtyZXR1cm4gcj1TLmZ4JiZTLmZ4LnNwZWVkc1tyXXx8cixlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUsdCl7dmFyIG49Qy5zZXRUaW1lb3V0KGUscik7dC5zdG9wPWZ1bmN0aW9uKCl7Qy5jbGVhclRpbWVvdXQobil9fSl9LHR0PUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxudD1FLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLHR0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT10dC52YWx1ZSx5Lm9wdFNlbGVjdGVkPW50LnNlbGVjdGVkLCh0dD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0Iix0dC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXR0LnZhbHVlO3ZhciBjdCxmdD1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiAkKHRoaXMsUy5hdHRyLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/Uy5wcm9wKGUsdCxuKTooMT09PW8mJlMuaXNYTUxEb2MoZSl8fChpPVMuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2N0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmQShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goUCk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksY3Q9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P1MucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBhPWZ0W3RdfHxTLmZpbmQuYXR0cjtmdFt0XT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbnx8KGk9ZnRbb10sZnRbb109cixyPW51bGwhPWEoZSx0LG4pP286bnVsbCxmdFtvXT1pKSxyfX0pO3ZhciBwdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGR0PS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiBodChlKXtyZXR1cm4oZS5tYXRjaChQKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiBndChlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiB2dChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOiJzdHJpbmciPT10eXBlb2YgZSYmZS5tYXRjaChQKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMucHJvcCxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W2VdfHxlXX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmUy5pc1hNTERvYyhlKXx8KHQ9Uy5wcm9wRml4W3RdfHx0LGk9Uy5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6cHQudGVzdChlLm5vZGVOYW1lKXx8ZHQudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsZ3QodGhpcykpKX0pO2lmKChlPXZ0KHQpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1ndChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIraHQoaSkrIiAiKXthPTA7d2hpbGUobz1lW2ErK10pci5pbmRleE9mKCIgIitvKyIgIik8MCYmKHIrPW8rIiAiKTtpIT09KHM9aHQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSxndCh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT12dCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9Z3Qobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK2h0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXdoaWxlKC0xPHIuaW5kZXhPZigiICIrbysiICIpKXI9ci5yZXBsYWNlKCIgIitvKyIgIiwiICIpO2khPT0ocz1odChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGksdCl7dmFyIG89dHlwZW9mIGksYT0ic3RyaW5nIj09PW98fEFycmF5LmlzQXJyYXkoaSk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmYT90P3RoaXMuYWRkQ2xhc3MoaSk6dGhpcy5yZW1vdmVDbGFzcyhpKTptKGkpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKGkuY2FsbCh0aGlzLGUsZ3QodGhpcyksdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtpZihhKXt0PTAsbj1TKHRoaXMpLHI9dnQoaSk7d2hpbGUoZT1yW3QrK10pbi5oYXNDbGFzcyhlKT9uLnJlbW92ZUNsYXNzKGUpOm4uYWRkQ2xhc3MoZSl9ZWxzZSB2b2lkIDAhPT1pJiYiYm9vbGVhbiIhPT1vfHwoKGU9Z3QodGhpcykpJiZZLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PWk/IiI6WS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9IiAiK2UrIiAiO3doaWxlKG49dGhpc1tyKytdKWlmKDE9PT1uLm5vZGVUeXBlJiYtMTwoIiAiK2h0KGd0KG4pKSsiICIpLmluZGV4T2YodCkpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHl0PS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24obil7dmFyIHIsZSxpLHQ9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1tKG4pLHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgdDsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PSh0PWk/bi5jYWxsKHRoaXMsZSxTKHRoaXMpLnZhbCgpKTpuKT90PSIiOiJudW1iZXIiPT10eXBlb2YgdD90Kz0iIjpBcnJheS5pc0FycmF5KHQpJiYodD1TLm1hcCh0LGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksKHI9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIHImJnZvaWQgMCE9PXIuc2V0KHRoaXMsdCwidmFsdWUiKXx8KHRoaXMudmFsdWU9dCkpfSkpOnQ/KHI9Uy52YWxIb29rc1t0LnR5cGVdfHxTLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHImJnZvaWQgMCE9PShlPXIuZ2V0KHQsInZhbHVlIikpP2U6InN0cmluZyI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZSh5dCwiIik6bnVsbD09ZT8iIjplOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDpodChTLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhQShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PVMobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz1TLm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSkoKHI9aVthXSkuc2VsZWN0ZWQ9LTE8Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxTLmluQXJyYXkoUyhlKS52YWwoKSx0KX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBDO3ZhciBtdD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8seHQ9ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmLHA9W258fEVdLGQ9di5jYWxsKGUsInR5cGUiKT9lLnR5cGU6ZSxoPXYuY2FsbChlLCJuYW1lc3BhY2UiKT9lLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKG89Zj1hPW49bnx8RSwzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFtdC50ZXN0KGQrUy5ldmVudC50cmlnZ2VyZWQpJiYoLTE8ZC5pbmRleE9mKCIuIikmJihkPShoPWQuc3BsaXQoIi4iKSkuc2hpZnQoKSxoLnNvcnQoKSksdT1kLmluZGV4T2YoIjoiKTwwJiYib24iK2QsKGU9ZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZCwib2JqZWN0Ij09dHlwZW9mIGUmJmUpKS5pc1RyaWdnZXI9cj8yOjMsZS5uYW1lc3BhY2U9aC5qb2luKCIuIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxlLnJlc3VsdD12b2lkIDAsZS50YXJnZXR8fChlLnRhcmdldD1uKSx0PW51bGw9PXQ/W2VdOlMubWFrZUFycmF5KHQsW2VdKSxjPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scnx8IWMudHJpZ2dlcnx8ITEhPT1jLnRyaWdnZXIuYXBwbHkobix0KSkpe2lmKCFyJiYhYy5ub0J1YmJsZSYmIXgobikpe2ZvcihzPWMuZGVsZWdhdGVUeXBlfHxkLG10LnRlc3QocytkKXx8KG89by5wYXJlbnROb2RlKTtvO289by5wYXJlbnROb2RlKXAucHVzaChvKSxhPW87YT09PShuLm93bmVyRG9jdW1lbnR8fEUpJiZwLnB1c2goYS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3d8fEMpfWk9MDt3aGlsZSgobz1wW2krK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWY9byxlLnR5cGU9MTxpP3M6Yy5iaW5kVHlwZXx8ZCwobD0oWS5nZXQobywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2UudHlwZV0mJlkuZ2V0KG8sImhhbmRsZSIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiZWKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhVihuKXx8dSYmbShuW2RdKSYmIXgobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9ZCxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihkLHh0KSxuW2RdKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx4dCksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGEmJihuW3VdPWEpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7Uy5ldmVudC5zaW11bGF0ZShyLGUudGFyZ2V0LFMuZXZlbnQuZml4KGUpKX07Uy5ldmVudC5zcGVjaWFsW3JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PVkuYWNjZXNzKGUscik7dHx8ZS5hZGRFdmVudExpc3RlbmVyKG4saSwhMCksWS5hY2Nlc3MoZSxyLCh0fHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpLTE7dD9ZLmFjY2VzcyhlLHIsdCk6KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGksITApLFkucmVtb3ZlKGUscikpfX19KTt2YXIgYnQ9Qy5sb2NhdGlvbix3dD17Z3VpZDpEYXRlLm5vdygpfSxUdD0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24oZSl7dmFyIHQsbjtpZighZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3RyeXt0PShuZXcgQy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKGUpe31yZXR1cm4gbj10JiZ0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpWzBdLHQmJiFufHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIisobj9TLm1hcChuLmNoaWxkTm9kZXMsZnVuY3Rpb24oZSl7cmV0dXJuIGUudGV4dENvbnRlbnR9KS5qb2luKCJcbiIpOmUpKSx0fTt2YXIgQ3Q9L1xbXF0kLyxFdD0vXHI/XG4vZyxTdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksa3Q9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEF0KG4sZSxyLGkpe3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSx0KXtyfHxDdC50ZXN0KG4pP2kobix0KTpBdChuKyJbIisoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10P2U6IiIpKyJdIix0LHIsaSl9KTtlbHNlIGlmKHJ8fCJvYmplY3QiIT09dyhlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKUF0KG4rIlsiK3QrIl0iLGVbdF0scixpKX1TLnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49bSh0KT90KCk6dDtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT1lKXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KGUpKVMuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpQXQobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9TLm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYma3QudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVN0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFwZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShFdCwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoRXQsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgTnQ9LyUyMC9nLGp0PS8jLiokLyxEdD0vKFs/Jl0pXz1bXiZdKi8scXQ9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxMdD0vXig/OkdFVHxIRUFEKSQvLEh0PS9eXC9cLy8sT3Q9e30sUHQ9e30sUnQ9IiovIi5jb25jYXQoIioiKSxNdD1FLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBJdChvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iKiIpO3ZhciBuLHI9MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8W107aWYobSh0KSl3aGlsZShuPWlbcisrXSkiKyI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fCIqIiwob1tuXT1vW25dfHxbXSkudW5zaGlmdCh0KSk6KG9bbl09b1tuXXx8W10pLnB1c2godCl9fWZ1bmN0aW9uIFd0KHQsaSxvLGEpe3ZhciBzPXt9LHU9dD09PVB0O2Z1bmN0aW9uIGwoZSl7dmFyIHI7cmV0dXJuIHNbZV09ITAsUy5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBufHx1fHxzW25dP3U/IShyPW4pOnZvaWQgMDooaS5kYXRhVHlwZXMudW5zaGlmdChuKSxsKG4pLCExKX0pLHJ9cmV0dXJuIGwoaS5kYXRhVHlwZXNbMF0pfHwhc1siKiJdJiZsKCIqIil9ZnVuY3Rpb24gRnQoZSx0KXt2YXIgbixyLGk9Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsZSxyKSxlfU10LmhyZWY9YnQuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6YnQuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChidC5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpSdCx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/RnQoRnQoZSxTLmFqYXhTZXR0aW5ncyksdCk6RnQoUy5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6SXQoT3QpLGFqYXhUcmFuc3BvcnQ6SXQoUHQpLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLHQ9dHx8e307dmFyIGMsZixwLG4sZCxyLGgsZyxpLG8sdj1TLmFqYXhTZXR1cCh7fSx0KSx5PXYuY29udGV4dHx8dixtPXYuY29udGV4dCYmKHkubm9kZVR5cGV8fHkuanF1ZXJ5KT9TKHkpOlMuZXZlbnQseD1TLkRlZmVycmVkKCksYj1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx3PXYuc3RhdHVzQ29kZXx8e30sYT17fSxzPXt9LHU9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoaCl7aWYoIW4pe249e307d2hpbGUodD1xdC5leGVjKHApKW5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KG5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQodFsyXSl9dD1uW2UudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT10P251bGw6dC5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gaD9wOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09aCYmKGU9c1tlLnRvTG93ZXJDYXNlKCldPXNbZS50b0xvd2VyQ2FzZSgpXXx8ZSxhW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWgmJih2Lm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihoKVQuYWx3YXlzKGVbVC5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpd1t0XT1bd1t0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8dTtyZXR1cm4gYyYmYy5hYm9ydCh0KSxsKDAsdCksdGhpc319O2lmKHgucHJvbWlzZShUKSx2LnVybD0oKGV8fHYudXJsfHxidC5ocmVmKSsiIikucmVwbGFjZShIdCxidC5wcm90b2NvbCsiLy8iKSx2LnR5cGU9dC5tZXRob2R8fHQudHlwZXx8di5tZXRob2R8fHYudHlwZSx2LmRhdGFUeXBlcz0odi5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFApfHxbIiJdLG51bGw9PXYuY3Jvc3NEb21haW4pe3I9RS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e3IuaHJlZj12LnVybCxyLmhyZWY9ci5ocmVmLHYuY3Jvc3NEb21haW49TXQucHJvdG9jb2wrIi8vIitNdC5ob3N0IT1yLnByb3RvY29sKyIvLyIrci5ob3N0fWNhdGNoKGUpe3YuY3Jvc3NEb21haW49ITB9fWlmKHYuZGF0YSYmdi5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiB2LmRhdGEmJih2LmRhdGE9Uy5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLFd0KE90LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Uy5ldmVudCYmdi5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHYudHlwZT12LnR5cGUudG9VcHBlckNhc2UoKSx2Lmhhc0NvbnRlbnQ9IUx0LnRlc3Qodi50eXBlKSxmPXYudXJsLnJlcGxhY2UoanQsIiIpLHYuaGFzQ29udGVudD92LmRhdGEmJnYucHJvY2Vzc0RhdGEmJjA9PT0odi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYodi5kYXRhPXYuZGF0YS5yZXBsYWNlKE50LCIrIikpOihvPXYudXJsLnNsaWNlKGYubGVuZ3RoKSx2LmRhdGEmJih2LnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oVHQudGVzdChmKT8iJiI6Ij8iKSt2LmRhdGEsZGVsZXRlIHYuZGF0YSksITE9PT12LmNhY2hlJiYoZj1mLnJlcGxhY2UoRHQsIiQxIiksbz0oVHQudGVzdChmKT8iJiI6Ij8iKSsiXz0iK3d0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtmXSksUy5ldGFnW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tmXSkpLCh2LmRhdGEmJnYuaGFzQ29udGVudCYmITEhPT12LmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHYuY29udGVudFR5cGUpLFQuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKygiKiIhPT12LmRhdGFUeXBlc1swXT8iLCAiK1J0KyI7IHE9MC4wMSI6IiIpOnYuYWNjZXB0c1siKiJdKSx2LmhlYWRlcnMpVC5zZXRSZXF1ZXN0SGVhZGVyKGksdi5oZWFkZXJzW2ldKTtpZih2LmJlZm9yZVNlbmQmJighMT09PXYuYmVmb3JlU2VuZC5jYWxsKHksVCx2KXx8aCkpcmV0dXJuIFQuYWJvcnQoKTtpZih1PSJhYm9ydCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9V3QoUHQsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbVCx2XSksaClyZXR1cm4gVDt2LmFzeW5jJiYwPHYudGltZW91dCYmKGQ9Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSx2LnRpbWVvdXQpKTt0cnl7aD0hMSxjLnNlbmQoYSxsKX1jYXRjaChlKXtpZihoKXRocm93IGU7bCgtMSxlKX19ZWxzZSBsKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD10O2h8fChoPSEwLGQmJkMuY2xlYXJUaW1lb3V0KGQpLGM9dm9pZCAwLHA9cnx8IiIsVC5yZWFkeVN0YXRlPTA8ZT80OjAsaT0yMDA8PWUmJmU8MzAwfHwzMDQ9PT1lLG4mJihzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfSh2LFQsbikpLCFpJiYtMTxTLmluQXJyYXkoInNjcmlwdCIsdi5kYXRhVHlwZXMpJiZTLmluQXJyYXkoImpzb24iLHYuZGF0YVR5cGVzKTwwJiYodi5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tmXT11KSksMjA0PT09ZXx8IkhFQUQiPT09di50eXBlP2w9Im5vY29udGVudCI6MzA0PT09ZT9sPSJub3Rtb2RpZmllZCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPSJlcnJvciIsZTwwJiYoZT0wKSkpLFQuc3RhdHVzPWUsVC5zdGF0dXNUZXh0PSh0fHxsKSsiIixpP3gucmVzb2x2ZVdpdGgoeSxbbyxsLFRdKTp4LnJlamVjdFdpdGgoeSxbVCxsLGFdKSxULnN0YXR1c0NvZGUodyksdz12b2lkIDAsZyYmbS50cmlnZ2VyKGk/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbVCx2LGk/bzphXSksYi5maXJlV2l0aCh5LFtULGxdKSxnJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtULHZdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFMuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBTLmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtTW2ldPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBtKHQpJiYocj1yfHxuLG49dCx0PXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxTLmlzUGxhaW5PYmplY3QoZSkmJmUpKX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKSJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpJiYoZS5jb250ZW50VHlwZT1lLmhlYWRlcnNbdF18fCIiKX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe1MuZ2xvYmFsRXZhbChlLHQsbil9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYobShlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PVMoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiBtKG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcihuLmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZShlKX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEMuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIEJ0PXswOjIwMCwxMjIzOjIwNH0sJHQ9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhJHQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gJHQseS5hamF4PSR0PSEhJHQsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBvLGE7aWYoeS5jb3JzfHwkdCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChCdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byYmYSgpfSl9LG89bygiYWJvcnQiKTt0cnl7ci5zZW5kKGkuaGFzQ29udGVudCYmaS5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihvKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe28mJm8oKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gUy5nbG9iYWxFdmFsKGUpLGV9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1TKCI8c2NyaXB0PiIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKCJsb2FkIGVycm9yIixpPWZ1bmN0aW9uKGUpe3IucmVtb3ZlKCksaT1udWxsLGUmJnQoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxFLmhlYWQuYXBwZW5kQ2hpbGQoclswXSl9LGFib3J0OmZ1bmN0aW9uKCl7aSYmaSgpfX19KTt2YXIgX3QsenQ9W10sVXQ9Lyg9KVw/KD89JnwkKXxcP1w/LztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9enQucG9wKCl8fFMuZXhwYW5kbysiXyIrd3QuZ3VpZCsrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9ITEhPT1lLmpzb25wJiYoVXQudGVzdChlLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT0oZS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZVdC50ZXN0KGUuZGF0YSkmJiJkYXRhIik7aWYoYXx8Impzb25wIj09PWUuZGF0YVR5cGVzWzBdKXJldHVybiByPWUuanNvbnBDYWxsYmFjaz1tKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLGE/ZVthXT1lW2FdLnJlcGxhY2UoVXQsIiQxIityKTohMSE9PWUuanNvbnAmJihlLnVybCs9KFR0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK3IpLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBvfHxTLmVycm9yKHIrIiB3YXMgbm90IGNhbGxlZCIpLG9bMF19LGUuZGF0YVR5cGVzWzBdPSJqc29uIixpPUNbcl0sQ1tyXT1mdW5jdGlvbigpe289YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhDKS5yZW1vdmVQcm9wKHIpOkNbcl09aSxlW3JdJiYoZS5qc29ucENhbGxiYWNrPXQuanNvbnBDYWxsYmFjayx6dC5wdXNoKHIpKSxvJiZtKGkpJiZpKG9bMF0pLG89aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoX3Q9RS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1fdC5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9bXTooImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPSh0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPUUubG9jYXRpb24uaHJlZix0LmhlYWQuYXBwZW5kQ2hpbGQocikpOnQ9RSksbz0hbiYmW10sKGk9Ti5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KGlbMV0pXTooaT14ZShbZV0sdCxvKSxvJiZvLmxlbmd0aCYmUyhvKS5yZW1vdmUoKSxTLm1lcmdlKFtdLGkuY2hpbGROb2RlcykpKTt2YXIgcixpLG99LFMuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybi0xPHMmJihyPWh0KGUuc2xpY2UocykpLGU9ZS5zbGljZSgwLHMpKSxtKHQpPyhuPXQsdD12b2lkIDApOnQmJiJvYmplY3QiPT10eXBlb2YgdCYmKGk9IlBPU1QiKSwwPGEubGVuZ3RoJiZTLmFqYXgoe3VybDplLHR5cGU6aXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5hbHdheXMobiYmZnVuY3Rpb24oZSx0KXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSl9KSx0aGlzfSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD1TLmNzcyhlLCJwb3NpdGlvbiIpLGM9UyhlKSxmPXt9OyJzdGF0aWMiPT09bCYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1jLm9mZnNldCgpLG89Uy5jc3MoZSwidG9wIiksdT1TLmNzcyhlLCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1sfHwiZml4ZWQiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoImF1dG8iKT8oYT0ocj1jLnBvc2l0aW9uKCkpLnRvcCxpPXIubGVmdCk6KGE9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLG0odCkmJih0PXQuY2FsbChlLG4sUy5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOmMuY3NzKGYpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPVMoZSkub2Zmc2V0KCkpLnRvcCs9Uy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPVMuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fHJlfSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsaSl7dmFyIG89InBhZ2VZT2Zmc2V0Ij09PWk7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih4KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSxuKXtTLmNzc0hvb2tzW25dPUZlKHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIHQ9V2UoZSxuKSxQZS50ZXN0KHQpP1MoZSkucG9zaXRpb24oKVtuXSsicHgiOnR9KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEscyl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OnMsIiI6Im91dGVyIithfSxmdW5jdGlvbihyLG8pe1MuZm5bb109ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgZSksaT1yfHwoITA9PT1lfHwhMD09PXQ/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB4KGUpPzA9PT1vLmluZGV4T2YoIm91dGVyIik/ZVsiaW5uZXIiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1lLm5vZGVUeXBlPyhyPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIithXSxyWyJzY3JvbGwiK2FdLGUuYm9keVsib2Zmc2V0IithXSxyWyJvZmZzZXQiK2FdLHJbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1uP1MuY3NzKGUsdCxpKTpTLnN0eWxlKGUsdCxuLGkpfSxzLG4/ZTp2b2lkIDAsbil9fSl9KSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe1MuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLG4pe1MuZm5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMub24obixudWxsLGUsdCk6dGhpcy50cmlnZ2VyKG4pfX0pO3ZhciBYdD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7Uy5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksbShlKSlyZXR1cm4gcj1zLmNhbGwoYXJndW1lbnRzLDIpLChpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxTLmd1aWQrKyxpfSxTLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1BLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9eCxTLmNhbWVsQ2FzZT1YLFMudHlwZT13LFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PVMudHlwZShlKTtyZXR1cm4oIm51bWJlciI9PT10fHwic3RyaW5nIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sUy50cmltPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKFh0LCIiKX0sImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KTt2YXIgVnQ9Qy5qUXVlcnksR3Q9Qy4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIEMuJD09PVMmJihDLiQ9R3QpLGUmJkMualF1ZXJ5PT09UyYmKEMualF1ZXJ5PVZ0KSxTfSwidW5kZWZpbmVkIj09dHlwZW9mIGUmJihDLmpRdWVyeT1DLiQ9UyksU30pOwo="},{"meta":{"name":"ajaxhook.min.js","url":"https://unpkg.com/ajax-hook@2.0.3/dist/ajaxhook.min.js","ts":1637743648388,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dfSh3aW5kb3csZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIG89bltyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsZSksby5sPSEwLG8uZXhwb3J0c312YXIgbj17fTtyZXR1cm4gZS5tPXQsZS5jPW4sZS5pPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxlLmQ9ZnVuY3Rpb24odCxuLHIpe2Uubyh0LG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxlLm49ZnVuY3Rpb24odCl7dmFyIG49dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChuLCJhIixuKSxufSxlLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LGUucD0iIixlKGUucz0zKX0oW2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KW5bcl09dFtyXTtyZXR1cm4gbi50YXJnZXQ9bi5jdXJyZW50VGFyZ2V0PWUsbn1mdW5jdGlvbiBvKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5oYXNPd25Qcm9wZXJ0eShlKyJfIik/dGhpc1tlKyJfIl06dGhpcy54aHJbZV0scj0odFtlXXx8e30pLmdldHRlcjtyZXR1cm4gciYmcihuLHRoaXMpfHxufX1mdW5jdGlvbiBuKGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgbz10aGlzLnhocixpPXRoaXMsdT10W2VdO2lmKCJvbiI9PT1lLnN1YnN0cmluZygwLDIpKWlbZSsiXyJdPW4sb1tlXT1mdW5jdGlvbih1KXt1PXIodSxpKSx0W2VdJiZ0W2VdLmNhbGwoaSxvLHUpfHxuLmNhbGwoaSx1KX07ZWxzZXt2YXIgcz0odXx8e30pLnNldHRlcjtuPXMmJnMobixpKXx8bix0aGlzW2UrIl8iXT1uO3RyeXtvW2VdPW59Y2F0Y2godCl7fX19fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2lmKHRbZV0pe3ZhciByPXRbZV0uY2FsbCh0aGlzLG4sdGhpcy54aHIpO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIHRoaXMueGhyW2VdLmFwcGx5KHRoaXMueGhyLG4pfX1yZXR1cm4gd2luZG93W3NdPXdpbmRvd1tzXXx8WE1MSHR0cFJlcXVlc3QsWE1MSHR0cFJlcXVlc3Q9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgd2luZG93W3NdO2Zvcih2YXIgciBpbiB0KXt2YXIgaT0iIjt0cnl7aT11KHRbcl0pfWNhdGNoKHQpe30iZnVuY3Rpb24iPT09aT90aGlzW3JdPW8ocik6T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMscix7Z2V0OmUociksc2V0Om4ociksZW51bWVyYWJsZTohMH0pfXZhciBhPXRoaXM7dC5nZXRQcm94eT1mdW5jdGlvbigpe3JldHVybiBhfSx0aGlzLnhocj10fSx3aW5kb3dbc119ZnVuY3Rpb24gaSgpe3dpbmRvd1tzXSYmKFhNTEh0dHBSZXF1ZXN0PXdpbmRvd1tzXSksd2luZG93W3NdPXZvaWQgMH1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9O2UuY29uZmlnRXZlbnQ9cixlLmhvb2s9byxlLnVuSG9vaz1pO3ZhciBzPSJfcnhociJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtpZihoKXRocm93IlByb3h5IGFscmVhZHkgZXhpc3RzIjtyZXR1cm4gaD1uZXcgZih0KX1mdW5jdGlvbiBvKCl7aD1udWxsLCgwLGQudW5Ib29rKSgpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQud2F0Y2hlcnx8KHQud2F0Y2hlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikpfWZ1bmN0aW9uIHModCxlKXt2YXIgbj10LmdldFByb3h5KCkscj0ib24iK2UrIl8iLG89KDAsZC5jb25maWdFdmVudCkoe3R5cGU6ZX0sbik7bltyXSYmbltyXShvKTt2YXIgaTsiZnVuY3Rpb24iPT10eXBlb2YgRXZlbnQ/aT1uZXcgRXZlbnQoZSx7YnViYmxlczohMX0pOihpPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGkuaW5pdEV2ZW50KGUsITEsITApKSx1KHQpLmRpc3BhdGNoRXZlbnQoaSl9ZnVuY3Rpb24gYSh0KXt0aGlzLnhocj10LHRoaXMueGhyUHJveHk9dC5nZXRQcm94eSgpfWZ1bmN0aW9uIGModCl7ZnVuY3Rpb24gZSh0KXthLmNhbGwodGhpcyx0KX1yZXR1cm4gZVtiXT1PYmplY3QuY3JlYXRlKGFbYl0pLGVbYl0ubmV4dD10LGV9ZnVuY3Rpb24gZih0KXtmdW5jdGlvbiBlKHQsZSl7dmFyIG49bmV3IFAodCk7aWYoIWYpcmV0dXJuIG4ucmVzb2x2ZSgpO3ZhciByPXtyZXNwb25zZTplLnJlc3BvbnNlLHN0YXR1czplLnN0YXR1cyxzdGF0dXNUZXh0OmUuc3RhdHVzVGV4dCxjb25maWc6dC5jb25maWcsaGVhZGVyczp0LnJlc0hlYWRlcnx8dC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgiXHJcbiIpLnJlZHVjZShmdW5jdGlvbih0LGUpe2lmKCIiPT09ZSlyZXR1cm4gdDt2YXIgbj1lLnNwbGl0KCI6Iik7cmV0dXJuIHRbbi5zaGlmdCgpXT1pKG4uam9pbigiOiIpKSx0fSx7fSl9O2YocixuKX1mdW5jdGlvbiBuKHQsZSxuKXt2YXIgcj1uZXcgSCh0KSxvPXtjb25maWc6dC5jb25maWcsZXJyb3I6bn07aD9oKG8scik6ci5uZXh0KG8pfWZ1bmN0aW9uIHIoKXtyZXR1cm4hMH1mdW5jdGlvbiBvKHQsZSl7cmV0dXJuIG4odCx0aGlzLGUpLCEwfWZ1bmN0aW9uIGEodCxuKXtyZXR1cm4gND09PXQucmVhZHlTdGF0ZSYmMCE9PXQuc3RhdHVzP2UodCxuKTo0IT09dC5yZWFkeVN0YXRlJiZzKHQsdyksITB9dmFyIGM9dC5vblJlcXVlc3QsZj10Lm9uUmVzcG9uc2UsaD10Lm9uRXJyb3I7cmV0dXJuKDAsZC5ob29rKSh7b25sb2FkOnIsb25sb2FkZW5kOnIsb25lcnJvcjpvLG9udGltZW91dDpvLG9uYWJvcnQ6byxvbnJlYWR5c3RhdGVjaGFuZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIGEodCx0aGlzKX0sb3BlbjpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbz1lLmNvbmZpZz17aGVhZGVyczp7fX07by5tZXRob2Q9dFswXSxvLnVybD10WzFdLG8uYXN5bmM9dFsyXSxvLnVzZXI9dFszXSxvLnBhc3N3b3JkPXRbNF0sby54aHI9ZTt2YXIgaT0ib24iK3c7ZVtpXXx8KGVbaV09ZnVuY3Rpb24oKXtyZXR1cm4gYShlLHIpfSk7dmFyIHU9ZnVuY3Rpb24odCl7bihlLHIsKDAsZC5jb25maWdFdmVudCkodCxyKSl9O2lmKFt4LHksZ10uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj0ib24iK3Q7ZVtuXXx8KGVbbl09dSl9KSxjKXJldHVybiEwfSxzZW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jb25maWc7aWYobi53aXRoQ3JlZGVudGlhbHM9ZS53aXRoQ3JlZGVudGlhbHMsbi5ib2R5PXRbMF0sYyl7dmFyIHI9ZnVuY3Rpb24oKXtjKG4sbmV3IG0oZSkpfTtyZXR1cm4hMT09PW4uYXN5bmM/cigpOnNldFRpbWVvdXQociksITB9fSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuY29uZmlnLmhlYWRlcnNbdFswXS50b0xvd2VyQ2FzZSgpXT10WzFdLCEwfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigtMSE9PWwuaW5kZXhPZih0WzBdKSl7dmFyIHI9dFsxXTtyZXR1cm4gdShlKS5hZGRFdmVudExpc3RlbmVyKHRbMF0sZnVuY3Rpb24oZSl7dmFyIG89KDAsZC5jb25maWdFdmVudCkoZSxuKTtvLnR5cGU9dFswXSxvLmlzVHJ1c3RlZD0hMCxyLmNhbGwobixvKX0pLCEwfX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5yZXNIZWFkZXI7aWYobil7dmFyIHI9IiI7Zm9yKHZhciBvIGluIG4pcis9bysiOiAiK25bb10rIlxyXG4iO3JldHVybiByfX0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnJlc0hlYWRlcjtpZihuKXJldHVybiBuWyh0WzBdfHwiIikudG9Mb3dlckNhc2UoKV19fSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUucHJveHk9cixlLnVuUHJveHk9bzt2YXIgaCxkPW4oMCksbD1bImxvYWQiLCJsb2FkZW5kIiwidGltZW91dCIsImVycm9yIiwicmVhZHlzdGF0ZWNoYW5nZSIsImFib3J0Il0sdj1sWzBdLHA9bFsxXSx5PWxbMl0seD1sWzNdLHc9bFs0XSxnPWxbNV0sYj0icHJvdG90eXBlIjthW2JdPU9iamVjdC5jcmVhdGUoe3Jlc29sdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54aHJQcm94eSxuPXRoaXMueGhyO2UucmVhZHlTdGF0ZT00LG4ucmVzSGVhZGVyPXQuaGVhZGVycyxlLnJlc3BvbnNlPWUucmVzcG9uc2VUZXh0PXQucmVzcG9uc2UsZS5zdGF0dXNUZXh0PXQuc3RhdHVzVGV4dCxlLnN0YXR1cz10LnN0YXR1cyxzKG4sdykscyhuLHYpLHMobixwKX0scmVqZWN0OmZ1bmN0aW9uKHQpe3RoaXMueGhyUHJveHkuc3RhdHVzPTAscyh0aGlzLnhocix0LnR5cGUpLHModGhpcy54aHIscCl9fSk7dmFyIG09YyhmdW5jdGlvbih0KXt2YXIgZT10aGlzLnhocjt0PXR8fGUuY29uZmlnLGUud2l0aENyZWRlbnRpYWxzPXQud2l0aENyZWRlbnRpYWxzLGUub3Blbih0Lm1ldGhvZCx0LnVybCwhMSE9PXQuYXN5bmMsdC51c2VyLHQucGFzc3dvcmQpO2Zvcih2YXIgbiBpbiB0LmhlYWRlcnMpZS5zZXRSZXF1ZXN0SGVhZGVyKG4sdC5oZWFkZXJzW25dKTtlLnNlbmQodC5ib2R5KX0pLFA9YyhmdW5jdGlvbih0KXt0aGlzLnJlc29sdmUodCl9KSxIPWMoZnVuY3Rpb24odCl7dGhpcy5yZWplY3QodCl9KX0sLGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuYWg9dm9pZCAwO3ZhciByPW4oMCksbz1uKDEpO2UuYWg9e3Byb3h5Om8ucHJveHksdW5Qcm94eTpvLnVuUHJveHksaG9vazpyLmhvb2ssdW5Ib29rOnIudW5Ib29rfX1dKSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWFqYXhob29rLm1pbi5qcy5tYXA="}]},{"name":"【玩的嗨】VIP工具箱,百度文库解析导出,全网VIP视频免费破解去广告,一站式音乐搜索下载,获取B站封面,下载B站视频等众多功能聚合 长期更新,放心使用","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["*://m.youku.com/v*","*://m.youku.com/a*","*://v.youku.com/v_*","*://v.youku.com/pad_show*","*://*.iqiyi.com/v_*","*://*.iqiyi.com/w_*","*://*.iqiyi.com/a_*","*://*.iqiyi.com/adv*","*.iq.com/play/*","*://*.le.com/ptv/vplay/*","*v.qq.com/x/cover/*","*v.qq.com/x/page/*","*v.qq.com/*play*","*v.qq.com/cover*","*://*.tudou.com/listplay/*","*://*.tudou.com/albumplay/*","*://*.tudou.com/programs/view/*","*://*.tudou.com/v*","*://*.mgtv.com/b/*","*://film.sohu.com/album/*","*://tv.sohu.com/v/*","*://*.acfun.cn/v/*","*://*.bilibili.com/video/*","*://*.bilibili.com/anime/*","*://*.bilibili.com/bangumi/play/*","*://*.pptv.com/show/*","*://*.baofeng.com/play/*","*://*.wasu.cn/Play/show*","*://v.yinyuetai.com/video/*","*://v.yinyuetai.com/playlist/*","*://*.wasu.cn/Play/show/*","*://music.taihe.com/song*","*://item.taobao.com/*","*://s.taobao.com/search*","*://list.tmall.com/search_product.htm*","*://detail.tmall.com/*","*://chaoshi.detail.tmall.com/*","*://detail.tmall.hk/*","*://item.yiyaojd.com/*","*://item.jd.com/*","*://item.jd.hk/*","*://detail.vip.com/detail-*","*://product.suning.com/*","*://music.163.com/song*","*://music.163.com/m/song*","*://y.qq.com/*","*://*.kugou.com/*","*://*.kuwo.cn/*","*://*.xiami.com/*","*://music.taihe.com/*","*://*.1ting.com/player*","*://www.qingting.fm/*","*://www.lizhi.fm/*","*://music.migu.cn/*","*://www.shangxueba.com/ask/*.html","*://www.ximalaya.com/*","*://www.shangxueba.com/ask/*.html","*://pan.baidu.com/disk/home*","*://yun.baidu.com/disk/home*","*://pan.baidu.com/s/*","*://yun.baidu.com/s/*","*://pan.baidu.com/share/link*","*://yun.baidu.com/share/link*","*://wenku.baidu.com/view/*","*://blog.csdn.net/*","*://link.csdn.net/*","*://link.zhihu.com/*","*://browser.gwdang.com/*","*www.jianshu.com/go-wild*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":["*://*.wandhi.com/*"],"merge_excludes":true,"use_connects":[],"orig_connects":["shangxueba365.com","api.wandhi.com","cdn.jsdelivr.net","tool.manmanbuy.com","xbeibeix.com","gwdang.com"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-end","orig_noframes":null}},"storage":{"ts":1637743664124,"data":{}},"enabled":true,"position":8,"file_url":"https://greasyfork.org/scripts/384538-%E7%8E%A9%E7%9A%84%E5%97%A8-vip%E5%B7%A5%E5%85%B7%E7%AE%B1-%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93%E8%A7%A3%E6%9E%90%E5%AF%BC%E5%87%BA-%E5%85%A8%E7%BD%91vip%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A-%E4%B8%80%E7%AB%99%E5%BC%8F%E9%9F%B3%E4%B9%90%E6%90%9C%E7%B4%A2%E4%B8%8B%E8%BD%BD-%E8%8E%B7%E5%8F%96b%E7%AB%99%E5%B0%81%E9%9D%A2-%E4%B8%8B%E8%BD%BDb%E7%AB%99%E8%A7%86%E9%A2%91%E7%AD%89%E4%BC%97%E5%A4%9A%E5%8A%9F%E8%83%BD%E8%81%9A%E5%90%88-%E9%95%BF%E6%9C%9F%E6%9B%B4%E6%96%B0-%E6%94%BE%E5%BF%83%E4%BD%BF%E7%94%A8/code/%E3%80%90%E7%8E%A9%E7%9A%84%E5%97%A8%E3%80%91VIP%E5%B7%A5%E5%85%B7%E7%AE%B1,%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93%E8%A7%A3%E6%9E%90%E5%AF%BC%E5%87%BA,%E5%85%A8%E7%BD%91VIP%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A,%E4%B8%80%E7%AB%99%E5%BC%8F%E9%9F%B3%E4%B9%90%E6%90%9C%E7%B4%A2%E4%B8%8B%E8%BD%BD,%E8%8E%B7%E5%8F%96B%E7%AB%99%E5%B0%81%E9%9D%A2,%E4%B8%8B%E8%BD%BDB%E7%AB%99%E8%A7%86%E9%A2%91%E7%AD%89%E4%BC%97%E5%A4%9A%E5%8A%9F%E8%83%BD%E8%81%9A%E5%90%88%20%E9%95%BF%E6%9C%9F%E6%9B%B4%E6%96%B0,%E6%94%BE%E5%BF%83%E4%BD%BF%E7%94%A8.user.js","uuid":"c84e3eaa-8c7a-468a-8983-cc14c58aea6a","source":"Ly8gPT1Vc2VyU2NyaXB0PT0gCi8vIEBuYW1lICAgICAgICAg44CQ546p55qE5Zeo44CRVklQ5bel5YW3566xLOeZvuW6puaWh+W6k+ino+aekOWvvOWHuizlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYos5LiA56uZ5byP6Z+z5LmQ5pCc57Si5LiL6L29LOiOt+WPlkLnq5nlsIHpnaIs5LiL6L29QuermeinhumikeetieS8l+WkmuWKn+iDveiBmuWQiCDplb/mnJ/mm7TmlrAs5pS+5b+D5L2/55SoIAovLyBAbmFtZXNwYWNlICAgIGh0dHBzOi8vd3d3LndhbmRoaS5jb20vCi8vIEB2ZXJzaW9uICAgICAgNC4yLjU1Ci8vIEBob21lcGFnZSAgICAgaHR0cHM6Ly90b29scy53YW5kaGkuY29tL3NjcmlwdHMKLy8gQHN1cHBvcnRVUkwgICBodHRwczovL3dpa2kud2FuZGhpLmNvbS8KLy8gQGRlc2NyaXB0aW9uICDlip/og73ku4vnu43vvJox44CBVmlw6KeG6aKR6Kej5p6Q77ybMuOAgeS4gOermeW8j+mfs+S5kOaQnOe0ouino+WGs+aWueahiO+8mzPjgIFiaWxpYmlsaeinhumikeWwgemdouiOt+WPlu+8mzTjgIFiaWxpYmlsaeinhumikeS4i+i9ve+8mzXjgIHkuIrlrablkKfnrZTmoYjmn6Xor6Io5bey5LiL57q/Ke+8mzbjgIHllYblk4Hljoblj7Lku7fmoLzlsZXnpLoo5LiA5qyh5oCn5ZGK5Yir6Jma5YGH6ZmN5Lu3Ke+8mzfjgIHkvJjmg6DliLjmn6Xor6IKLy8gQGF1dGhvciAgICAgICBNYXhaaGFuZwovLyBAaWNvbiAgICAgICAgIGh0dHBzOi8vd3d3LndhbmRoaS5jb20vL2Zhdmljb24uaWNvIAovLyBAaW5jbHVkZSAgICAgICo6Ly9tLnlvdWt1LmNvbS92KgovLyBAaW5jbHVkZSAgICAgICo6Ly9tLnlvdWt1LmNvbS9hKgovLyBAaW5jbHVkZSAgICAgICo6Ly92LnlvdWt1LmNvbS92XyoKLy8gQGluY2x1ZGUgICAgICAqOi8vdi55b3VrdS5jb20vcGFkX3Nob3cqCi8vIEBpbmNsdWRlICAgICAgKjovLyouaXFpeWkuY29tL3ZfKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmlxaXlpLmNvbS93XyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi5pcWl5aS5jb20vYV8qCi8vIEBpbmNsdWRlICAgICAgKjovLyouaXFpeWkuY29tL2FkdioKLy8gQGluY2x1ZGUgICAgICAqLmlxLmNvbS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi5sZS5jb20vcHR2L3ZwbGF5LyoKLy8gQGluY2x1ZGUgICAgICAqdi5xcS5jb20veC9jb3Zlci8qCi8vIEBpbmNsdWRlICAgICAgKnYucXEuY29tL3gvcGFnZS8qCi8vIEBpbmNsdWRlICAgICAgKnYucXEuY29tLypwbGF5KgovLyBAaW5jbHVkZSAgICAgICp2LnFxLmNvbS9jb3ZlcioKLy8gQGluY2x1ZGUgICAgICAqOi8vKi50dWRvdS5jb20vbGlzdHBsYXkvKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLnR1ZG91LmNvbS9hbGJ1bXBsYXkvKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLnR1ZG91LmNvbS9wcm9ncmFtcy92aWV3LyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi50dWRvdS5jb20vdioKLy8gQGluY2x1ZGUgICAgICAqOi8vKi5tZ3R2LmNvbS9iLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vZmlsbS5zb2h1LmNvbS9hbGJ1bS8qCi8vIEBpbmNsdWRlICAgICAgKjovL3R2LnNvaHUuY29tL3YvKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmFjZnVuLmNuL3YvKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmJpbGliaWxpLmNvbS92aWRlby8qCi8vIEBpbmNsdWRlICAgICAgKjovLyouYmlsaWJpbGkuY29tL2FuaW1lLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi5iaWxpYmlsaS5jb20vYmFuZ3VtaS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi5wcHR2LmNvbS9zaG93LyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi5iYW9mZW5nLmNvbS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi53YXN1LmNuL1BsYXkvc2hvdyoKLy8gQGluY2x1ZGUgICAgICAqOi8vdi55aW55dWV0YWkuY29tL3ZpZGVvLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vdi55aW55dWV0YWkuY29tL3BsYXlsaXN0LyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi53YXN1LmNuL1BsYXkvc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgKjovL211c2ljLnRhaWhlLmNvbS9zb25nKgovLyBAaW5jbHVkZSAgICAgICo6Ly9pdGVtLnRhb2Jhby5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly9zLnRhb2Jhby5jb20vc2VhcmNoKgovLyBAaW5jbHVkZSAgICAgICo6Ly9saXN0LnRtYWxsLmNvbS9zZWFyY2hfcHJvZHVjdC5odG0qCi8vIEBpbmNsdWRlICAgICAgKjovL2RldGFpbC50bWFsbC5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly9jaGFvc2hpLmRldGFpbC50bWFsbC5jb20vKiAgICAgICAgICAgICAgICAgICAgIAovLyBAaW5jbHVkZSAgICAgICo6Ly9kZXRhaWwudG1hbGwuaGsvKgovLyBAaW5jbHVkZSAgICAgICo6Ly9pdGVtLnlpeWFvamQuY29tLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vaXRlbS5qZC5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly9pdGVtLmpkLmhrLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vZGV0YWlsLnZpcC5jb20vZGV0YWlsLSoKLy8gQGluY2x1ZGUgICAgICAqOi8vcHJvZHVjdC5zdW5pbmcuY29tLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vbXVzaWMuMTYzLmNvbS9zb25nKgovLyBAaW5jbHVkZSAgICAgICo6Ly9tdXNpYy4xNjMuY29tL20vc29uZyoKLy8gQGluY2x1ZGUgICAgICAqOi8veS5xcS5jb20vKgovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmt1Z291LmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKjovLyoua3V3by5jbi8qCi8vIEBpbmNsdWRlICAgICAgKjovLyoueGlhbWkuY29tLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vbXVzaWMudGFpaGUuY29tLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vKi4xdGluZy5jb20vcGxheWVyKgovLyBAaW5jbHVkZSAgICAgICo6Ly93d3cucWluZ3RpbmcuZm0vKgovLyBAaW5jbHVkZSAgICAgICo6Ly93d3cubGl6aGkuZm0vKgovLyBAaW5jbHVkZSAgICAgICo6Ly9tdXNpYy5taWd1LmNuLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vd3d3LnNoYW5neHVlYmEuY29tL2Fzay8qLmh0bWwKLy8gQGluY2x1ZGUgICAgICAqOi8vd3d3LnhpbWFsYXlhLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKjovL3d3dy5zaGFuZ3h1ZWJhLmNvbS9hc2svKi5odG1sCi8vIEBpbmNsdWRlICAgICAgKjovL3Bhbi5iYWlkdS5jb20vZGlzay9ob21lKgovLyBAaW5jbHVkZSAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQGluY2x1ZGUgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9zLyoKLy8gQGluY2x1ZGUgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zLyoKLy8gQGluY2x1ZGUgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS9saW5rKgovLyBAaW5jbHVkZSAgICAgICo6Ly95dW4uYmFpZHUuY29tL3NoYXJlL2xpbmsqCi8vIEBpbmNsdWRlICAgICAgKjovL3dlbmt1LmJhaWR1LmNvbS92aWV3LyoKLy8gQGluY2x1ZGUgICAgICAqOi8vYmxvZy5jc2RuLm5ldC8qCi8vIEBpbmNsdWRlICAgICAgKjovL2xpbmsuY3Nkbi5uZXQvKgovLyBAaW5jbHVkZSAgICAgICo6Ly9saW5rLnpoaWh1LmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKjovL2Jyb3dzZXIuZ3dkYW5nLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgKnd3dy5qaWFuc2h1LmNvbS9nby13aWxkKgovLyBAZXhjbHVkZSAgICAgICo6Ly8qLndhbmRoaS5jb20vKgovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vbGliLmJhb21pdHUuY29tL2pxdWVyeS8xLjEyLjQvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vc3dlZXRhbGVydDJAMTEKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2xpYi5iYW9taXR1LmNvbS9lY2hhcnRzLzQuNi4wL2VjaGFydHMubWluLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9saWIuYmFvbWl0dS5jb20vbGF5ZXIvMi4zL2xheWVyLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9saWIuYmFvbWl0dS5jb20vcmVmbGVjdC1tZXRhZGF0YS8wLjEuMTMvUmVmbGVjdC5taW4uanMKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3Z1ZUAyLjYuMTEvZGlzdC92dWUubWluLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS92dWV4QDMuNC4wL2Rpc3QvdnVleC5taW4uanMKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3FyY29kZUAxLjQuNC9idWlsZC9xcmNvZGUubWluLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jcnlwdG8tanNANC4wLjAvY3J5cHRvLWpzLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9maWxlLXNhdmVyQDIuMC41L2Rpc3QvRmlsZVNhdmVyLm1pbi5qcwovLyBAbGljZW5zZSAgICAgIE1JVAovLyBAZ3JhbnQgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LWVuZAovLyBAY29ubmVjdCAgICAgIHNoYW5neHVlYmEzNjUuY29tCi8vIEBjb25uZWN0ICAgICAgYXBpLndhbmRoaS5jb20KLy8gQGNvbm5lY3QgICAgICBjZG4uanNkZWxpdnIubmV0Ci8vIEBjb25uZWN0ICAgICAgdG9vbC5tYW5tYW5idXkuY29tCi8vIEBjb25uZWN0ICAgICAgeGJlaWJlaXguY29tCi8vIEBjb25uZWN0ICAgICAgZ3dkYW5nLmNvbQovLyBAZ3JhbnQgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vIEBncmFudCAgICAgICAgR01faW5mbwovLyBAZ3JhbnQgICAgICAgIEdNLmFkZFN0eWxlCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX25vdGlmaWNhdGlvbgovLyBAZ3JhbnQgICAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgIEdNX3VucmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAY29tcGF0aWJsZSAgIGZpcmVmb3gKLy8gQGNvbXBhdGlibGUgICBjaHJvbWUKLy8gQGNvbXBhdGlibGUgICBvcGVyYSBzYWZhcmkgZWRnZQovLyBAY29tcGF0aWJsZSAgIHNhZmFyaQovLyBAY29tcGF0aWJsZSAgIGVkZ2UKLy8gQGFudGlmZWF0dXJlICByZWZlcnJhbC1saW5rIOatpOaPkOekuuS4ukdyZWFzeUZvcmvku6PnoIHop4TojIPopoHmsYLlkKvmnInmn6XliLjlip/og73nmoTohJrmnKzlv4Xpobvmt7vliqDvvIzlrp7pmYXkvb/nlKjml6Dku7vkvZXlvLrliLbot7PovazvvIzku6PnoIHlj6/mn6XvvIzor7fnn6XmgonjgIIKLy8gPT0vVXNlclNjcmlwdD09CgohZnVuY3Rpb24oZ2xvYmFsLCBmYWN0b3J5KSB7CiAgICAib2JqZWN0IiA9PSB0eXBlb2YgZXhwb3J0cyAmJiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgbW9kdWxlID8gZmFjdG9yeShyZXF1aXJlKCJzd2VldGFsZXJ0MiIpLCByZXF1aXJlKCJ2dWUiKSwgcmVxdWlyZSgicmVmbGVjdC1tZXRhZGF0YSIpLCByZXF1aXJlKCJjcnlwdG8tanMiKSkgOiAiZnVuY3Rpb24iID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbICJzd2VldGFsZXJ0MiIsICJ2dWUiLCAicmVmbGVjdC1tZXRhZGF0YSIsICJjcnlwdG8tanMiIF0sIGZhY3RvcnkpIDogZmFjdG9yeSgoZ2xvYmFsID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIGdsb2JhbFRoaXMgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYpLlN3YWwsIGdsb2JhbC5WdWUsIG51bGwsIGdsb2JhbC5DcnlwdG9KUyk7Cn0odGhpcywgKGZ1bmN0aW9uKFN3YWwsIFZ1ZSwgcmVmbGVjdE1ldGFkYXRhLCBDcnlwdG9KUykgewogICAgInVzZSBzdHJpY3QiOwogICAgZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0TGVnYWN5KGUpIHsKICAgICAgICByZXR1cm4gZSAmJiAib2JqZWN0IiA9PSB0eXBlb2YgZSAmJiAiZGVmYXVsdCIgaW4gZSA/IGUgOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IGUKICAgICAgICB9OwogICAgfQogICAgdmFyIFN3YWxfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHRMZWdhY3koU3dhbCksIFZ1ZV9fZGVmYXVsdCA9IF9pbnRlcm9wRGVmYXVsdExlZ2FjeShWdWUpLCBDcnlwdG9KU19fZGVmYXVsdCA9IF9pbnRlcm9wRGVmYXVsdExlZ2FjeShDcnlwdG9KUyksIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgcmV0dXJuIChleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsKICAgICAgICAgICAgX19wcm90b19fOiBbXQogICAgICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgICAgIGQuX19wcm90b19fID0gYjsKICAgICAgICB9IHx8IGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBiLmhhc093blByb3BlcnR5KHApICYmIChkW3BdID0gYltwXSk7CiAgICAgICAgfSkoZCwgYik7CiAgICB9OwogICAgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHsKICAgICAgICBmdW5jdGlvbiBfXygpIHsKICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYiksIGQucHJvdG90eXBlID0gbnVsbCA9PT0gYiA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIAogICAgICAgIG5ldyBfXyk7CiAgICB9CiAgICBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7CiAgICAgICAgdmFyIGQsIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBudWxsID09PSBkZXNjID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYzsKICAgICAgICBpZiAoIm9iamVjdCIgPT0gdHlwZW9mIFJlZmxlY3QgJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSkgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpOyBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSAoZCA9IGRlY29yYXRvcnNbaV0pICYmIChyID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcik7CiAgICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjsKICAgIH0KICAgIGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHsKICAgICAgICBpZiAoIm9iamVjdCIgPT0gdHlwZW9mIFJlZmxlY3QgJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSkgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpOwogICAgfQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvci50aHJvdyh2YWx1ZSkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgewogICAgICAgICAgICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0ocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgICAgICB9KSk7CiAgICB9CiAgICBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7CiAgICAgICAgdmFyIGYsIHksIHQsIGcsIF8gPSB7CiAgICAgICAgICAgIGxhYmVsOiAwLAogICAgICAgICAgICBzZW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICgxICYgdFswXSkgdGhyb3cgdFsxXTsKICAgICAgICAgICAgICAgIHJldHVybiB0WzFdOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0cnlzOiBbXSwKICAgICAgICAgICAgb3BzOiBbXQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGcgPSB7CiAgICAgICAgICAgIG5leHQ6IHZlcmIoMCksCiAgICAgICAgICAgIHRocm93OiB2ZXJiKDEpLAogICAgICAgICAgICByZXR1cm46IHZlcmIoMikKICAgICAgICB9LCAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9KSwgZzsKICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKDtfOyApIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IDIgJiBvcFswXSA/IHkucmV0dXJuIDogb3BbMF0gPyB5LnRocm93IHx8ICgodCA9IHkucmV0dXJuKSAmJiB0LmNhbGwoeSksIAogICAgICAgICAgICAgICAgICAgICAgICAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoeSA9IDAsIHQgJiYgKG9wID0gWyAyICYgb3BbMF0sIHQudmFsdWUgXSksIG9wWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5sYWJlbCsrLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKyssIHkgPSBvcFsxXSwgb3AgPSBbIDAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpLCBfLnRyeXMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsICh0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgfHwgNiAhPT0gb3BbMF0gJiYgMiAhPT0gb3BbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMyA9PT0gb3BbMF0gJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDYgPT09IG9wWzBdICYmIF8ubGFiZWwgPCB0WzFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV0sIHQgPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl0sIF8ub3BzLnB1c2gob3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFsyXSAmJiBfLm9wcy5wb3AoKSwgXy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcCA9IFsgNiwgZSBdLCB5ID0gMDsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICBmID0gdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICg1ICYgb3BbMF0pIHRocm93IG9wWzFdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KFsgbiwgdiBdKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICB2YXIgdXBkYXRlX2tleSA9ICJpc1VwZGF0ZSIsIE1pbiA9IDYwLCBIb3VyID0gNjAgKiBNaW4sIEIxID0gIlltVnBZbVZwWkc5MWVYVXhNak0wTlE9PSIsIEIyID0gIlltVnBZbVZwTVRJek5EVTJOemc1TUE9PSIsIExvZ2dlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIExvZ2dlcigpIHt9CiAgICAgICAgcmV0dXJuIExvZ2dlci5sb2cgPSBmdW5jdGlvbihtc2csIGxldmVsKSB7fSwgTG9nZ2VyLmRlYnVnID0gZnVuY3Rpb24obXNnKSB7CiAgICAgICAgICAgIHRoaXMubG9nKG1zZywgTG9nTGV2ZWwuZGVidWcpOwogICAgICAgIH0sIExvZ2dlci5pbmZvID0gZnVuY3Rpb24obXNnKSB7CiAgICAgICAgICAgIG51bGwgPT09IGV2ZW50IHx8IHZvaWQgMCA9PT0gZXZlbnQgfHwgZXZlbnQuc3JjRWxlbWVudCwgdGhpcy5sb2cobXNnLCBMb2dMZXZlbC5pbmZvKTsKICAgICAgICB9LCBMb2dnZXIud2FybiA9IGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICB0aGlzLmxvZyhtc2csIExvZ0xldmVsLndhcm4pOwogICAgICAgIH0sIExvZ2dlci5lcnJvciA9IGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICB0aGlzLmxvZyhtc2csIExvZ0xldmVsLmVycm9yKTsKICAgICAgICB9LCBMb2dnZXI7CiAgICB9KCksIExvZ0xldmVsOwogICAgIWZ1bmN0aW9uKExvZ0xldmVsKSB7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWwuZGVidWcgPSAwXSA9ICJkZWJ1ZyIsIExvZ0xldmVsW0xvZ0xldmVsLmluZm8gPSAxXSA9ICJpbmZvIiwgTG9nTGV2ZWxbTG9nTGV2ZWwud2FybiA9IDJdID0gIndhcm4iLCAKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbC5lcnJvciA9IDNdID0gImVycm9yIjsKICAgIH0oTG9nTGV2ZWwgfHwgKExvZ0xldmVsID0ge30pKTsKICAgIHZhciBDb25maWcgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBDb25maWcoKSB7fQogICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uZmlnLCAiZW52IiwgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEdNX2luZm87CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgfSksIENvbmZpZy5nZXQgPSBmdW5jdGlvbihrZXksIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICB2b2lkIDAgPT09IGRlZmF1bHRWYWx1ZSAmJiAoZGVmYXVsdFZhbHVlID0gIiIpOwogICAgICAgICAgICB2YXIgb2JqU3RyID0gR01fZ2V0VmFsdWUodGhpcy5lbmNvZGUoa2V5KSwgZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgaWYgKG9ialN0cikgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2Uob2JqU3RyKTsKICAgICAgICAgICAgICAgIGlmICgtMSA9PSBvYmouZXhwIHx8IG9iai5leHAgPiAobmV3IERhdGUpLmdldFRpbWUoKSkgcmV0dXJuIExvZ2dlci5pbmZvKCJjYWNoZSB0cnVlIiksIAogICAgICAgICAgICAgICAgb2JqLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBMb2dnZXIuaW5mbygiY2FjaGUgZmFsc2UiKSwgZGVmYXVsdFZhbHVlOwogICAgICAgIH0sIENvbmZpZy5zZXQgPSBmdW5jdGlvbihrZXksIHYsIGV4cCkgewogICAgICAgICAgICB2b2lkIDAgPT09IGV4cCAmJiAoZXhwID0gLTEpOwogICAgICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgICAgICB2YWx1ZTogdiwKICAgICAgICAgICAgICAgIGV4cDogLTEgPT0gZXhwID8gZXhwIDogKG5ldyBEYXRlKS5nZXRUaW1lKCkgKyAxZTMgKiBleHAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgR01fc2V0VmFsdWUodGhpcy5lbmNvZGUoa2V5KSwgSlNPTi5zdHJpbmdpZnkob2JqKSk7CiAgICAgICAgfSwgQ29uZmlnLmNsZWFyID0gZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgbnVsbCwgLTEwKTsKICAgICAgICB9LCBDb25maWcuZGVjb2RlID0gZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBhdG9iKHN0cik7CiAgICAgICAgfSwgQ29uZmlnLmVuY29kZSA9IGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICByZXR1cm4gYnRvYShzdHIpOwogICAgICAgIH0sIENvbmZpZzsKICAgIH0oKSwgSGlzdG9yeSA9IGZ1bmN0aW9uIEhpc3RvcnkoKSB7CiAgICAgICAgdGhpcy5tYXggPSAwLCB0aGlzLnByaWNlX2RldGFpbCA9IFtdOwogICAgfSwgUHJpY2VEZXRhaWwgPSBmdW5jdGlvbiBQcmljZURldGFpbCgpIHt9LCBMaXN0UHJpY2VJdGVtID0gZnVuY3Rpb24gTGlzdFByaWNlSXRlbSgpIHt9LCBCcm93ZXJUeXBlOwogICAgIWZ1bmN0aW9uKEJyb3dlclR5cGUpIHsKICAgICAgICBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuRWRnZSA9IDBdID0gIkVkZ2UiLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuRWRnID0gMV0gPSAiRWRnIiwgCiAgICAgICAgQnJvd2VyVHlwZVtCcm93ZXJUeXBlLkNocm9tZSA9IDJdID0gIkNocm9tZSIsIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5GaXJlZm94ID0gM10gPSAiRmlyZWZveCIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5TYWZpcmkgPSA0XSA9ICJTYWZpcmkiLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuU2UzNjAgPSA1XSA9ICJTZTM2MCIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5JZTIzNDUgPSA2XSA9ICJJZTIzNDUiLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuQmFpZHUgPSA3XSA9ICJCYWlkdSIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5MaWViYW8gPSA4XSA9ICJMaWViYW8iLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuVUMgPSA5XSA9ICJVQyIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5RUSA9IDEwXSA9ICJRUSIsIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5Tb2dvdSA9IDExXSA9ICJTb2dvdSIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5PcGVyYSA9IDEyXSA9ICJPcGVyYSIsIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5NYXh0aG9uID0gMTNdID0gIk1heHRob24iOwogICAgfShCcm93ZXJUeXBlIHx8IChCcm93ZXJUeXBlID0ge30pKTsKICAgIHZhciBDb3JlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gQ29yZSgpIHsKICAgICAgICAgICAgdGhpcy51cmwgPSB0aGlzLmN1cnJlbnRVcmwoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENvcmUuYXBwZW5kVG8gPSBmdW5jdGlvbihzZWxlY3RlciwgaHRtbCkgewogICAgICAgICAgICAkKHNlbGVjdGVyKS5hcHBlbmQoaHRtbCk7CiAgICAgICAgfSwgQ29yZS5sYXp5bG9hZCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aW1lKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHRpbWUgJiYgKHRpbWUgPSA1KSwgX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgUHJvbWlzZSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCAoZnVuY3Rpb24oX2EpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAyLCBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgNCwgY2FsbGJhY2soKSBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2Euc2VudCgpLCByZXNvbHZlKCksIFsgMiBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgMWUzICogdGltZSk7CiAgICAgICAgICAgICAgICAgICAgfSkpIF07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBDb3JlLmF1dG9MYXp5bG9hZCA9IGZ1bmN0aW9uKGlzX29rLCBjYWxsYmFjaywgdGltZSkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0aW1lICYmICh0aW1lID0gNSksIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIFByb21pc2UsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCAoZnVuY3Rpb24oX2EpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc19vaygpID8gWyAzLCAxIF0gOiAoc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLmF1dG9MYXp5bG9hZChpc19vaywgY2FsbGJhY2ssIHRpbWUpLnRoZW4oKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAxZTMgKiB0aW1lKSwgWyAzLCAzIF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgNCwgY2FsbGJhY2soKSBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpLCBMb2dnZXIuZGVidWcoIlx1ODFlYVx1NTJhOFx1NWVmNlx1OGZkZlx1NTZkZVx1OGMwM1x1NjI2N1x1ODg0Y1x1NWI4Y1x1NmJkNSxcdTVlZjZcdTY1ZjZcdTY1ZjZcdTk1ZjQ6IiArIHRpbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpLCBfYS5sYWJlbCA9IDM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAyIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSkpIF07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBDb3JlLnNsZWVwID0gZnVuY3Rpb24odGltZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgICAgIH0pLCAxZTMgKiB0aW1lKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIENvcmUucmFuZG9tID0gZnVuY3Rpb24obWluLCBtYXgpIHsKICAgICAgICAgICAgdmFyIHJhbmdlID0gbWF4IC0gbWluLCByYW5kID0gTWF0aC5yYW5kb20oKTsKICAgICAgICAgICAgcmV0dXJuIG1pbiArIE1hdGgucm91bmQocmFuZCAqIHJhbmdlKTsKICAgICAgICB9LCBDb3JlLnByb3RvdHlwZS5iYWNrZ3JvdW5kID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRpbWUpIHsKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lICYmICh0aW1lID0gNSksIHNldEludGVydmFsKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pLCAxZTMgKiB0aW1lKTsKICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZSwgImhlYWQiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5zYWZlV2luZG93LndpbmRvdy5kb2N1bWVudC5oZWFkOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgIH0pLCBDb3JlLmlzTnVtYmVyID0gZnVuY3Rpb24oYSkgewogICAgICAgICAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkoYSkgJiYgYSAtIHBhcnNlRmxvYXQoYSkgPj0gMDsKICAgICAgICB9LCBDb3JlLmFkZFVybCA9IGZ1bmN0aW9uKGtleSwgdXJsKSB7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKGtleSwgdXJsKTsKICAgICAgICB9LCBDb3JlLm9wZW5VcmwgPSBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgdGhpcy5vcGVuKEdNX2dldFZhbHVlKGtleSkpOwogICAgICAgIH0sIENvcmUucHJvdG90eXBlLmdldFBhciA9IGZ1bmN0aW9uKG9wdGlvbiwgdXJsKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdXJsICYmICh1cmwgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAgICAgdmFyIHYgPSB1cmwubWF0Y2gobmV3IFJlZ0V4cCgiWz8mXSIgKyBvcHRpb24gKyAiPShbXiZdKykiLCAiaSIpKTsKICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gdiB8fCB2Lmxlbmd0aCA8IDEgPyAiIiA6IHZbMV07CiAgICAgICAgfSwgQ29yZS5hcHBlbmRDc3MgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgdmFyIGxpbmtDU1MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7CiAgICAgICAgICAgIGxpbmtDU1MudHlwZSA9ICJ0ZXh0L2NzcyIsIGxpbmtDU1MucmVsID0gInN0eWxlc2hlZXQiLCBsaW5rQ1NTLmhyZWYgPSB1cmwsIENvcmUuaGVhZC5hcHBlbmRDaGlsZChsaW5rQ1NTKTsKICAgICAgICB9LCBDb3JlLmFwcGVuZENzc0NvbnRlbnQgPSBmdW5jdGlvbihjb250ZW50KSB7CiAgICAgICAgICAgIHZhciBTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgICAgIFN0eWxlLmlubmVySFRNTCA9IGNvbnRlbnQsIENvcmUuaGVhZC5hcHBlbmRDaGlsZChTdHlsZSk7CiAgICAgICAgfSwgQ29yZS5wcm90b3R5cGUuYm9keUFwcGVuZENzcyA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICAkKCJib2R5IikuYXBwZW5kKCQoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJyArIHVybCArICciPicpKTsKICAgICAgICB9LCBDb3JlLmJvZHlBcHBlbmQgPSBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgICQoImJvZHkiKS5hcHBlbmQoaHRtbCk7CiAgICAgICAgfSwgQ29yZS5hcHBlbmRKcyA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB2YXIgbGlua1NjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgICAgICBsaW5rU2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IiwgbGlua1NjcmlwdC5zcmMgPSB1cmwsIHRoaXMuaGVhZC5hcHBlbmRDaGlsZChsaW5rU2NyaXB0KTsKICAgICAgICB9LCBDb3JlLnByb3RvdHlwZS5ib2R5QXBwZW5kSnMgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZCgkKCc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInICsgdXJsICsgJyI+PFwvc2NyaXB0PicpKTsKICAgICAgICB9LCBDb3JlLnByb3RvdHlwZS5jdXJyZW50VXJsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICB9LCBDb3JlLmluSWZyYW1lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAhKCFzZWxmLmZyYW1lRWxlbWVudCB8fCAiSUZSQU1FIiAhPSBzZWxmLmZyYW1lRWxlbWVudC50YWdOYW1lKSB8fCAod2luZG93LmZyYW1lcy5sZW5ndGggIT0gcGFyZW50LmZyYW1lcy5sZW5ndGggfHwgc2VsZiAhPSB0b3ApOwogICAgICAgIH0sIENvcmUuZm9ybWF0ID0gZnVuY3Rpb24odGltZSwgZm10KSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gZm10ICYmIChmbXQgPSAieXl5eS1NTS1kZCBoaDptbTpzcyIpOwogICAgICAgICAgICB2YXIgbyA9IHsKICAgICAgICAgICAgICAgICJNKyI6IHRpbWUuZ2V0TW9udGgoKSArIDEsCiAgICAgICAgICAgICAgICAiZCsiOiB0aW1lLmdldERhdGUoKSwKICAgICAgICAgICAgICAgICJoKyI6IHRpbWUuZ2V0SG91cnMoKSwKICAgICAgICAgICAgICAgICJtKyI6IHRpbWUuZ2V0TWludXRlcygpLAogICAgICAgICAgICAgICAgInMrIjogdGltZS5nZXRTZWNvbmRzKCksCiAgICAgICAgICAgICAgICAicSsiOiBNYXRoLmZsb29yKCh0aW1lLmdldE1vbnRoKCkgKyAzKSAvIDMpLAogICAgICAgICAgICAgICAgUzogdGltZS5nZXRNaWxsaXNlY29uZHMoKQogICAgICAgICAgICB9OwogICAgICAgICAgICBmb3IgKHZhciBrIGluIC8oeSspLy50ZXN0KGZtdCkgJiYgKGZtdCA9IGZtdC5yZXBsYWNlKFJlZ0V4cC4kMSwgKHRpbWUuZ2V0RnVsbFllYXIoKSArICIiKS5zdWJzdHIoNCAtIFJlZ0V4cC4kMS5sZW5ndGgpKSksIAogICAgICAgICAgICBvKSBuZXcgUmVnRXhwKCIoIiArIGsgKyAiKSIpLnRlc3QoZm10KSAmJiAoZm10ID0gZm10LnJlcGxhY2UoUmVnRXhwLiQxLCAxID09IFJlZ0V4cC4kMS5sZW5ndGggPyBvW2tdIDogKCIwMCIgKyBvW2tdKS5zdWJzdHIoKCIiICsgb1trXSkubGVuZ3RoKSkpOwogICAgICAgICAgICByZXR1cm4gZm10OwogICAgICAgIH0sIENvcmUuZW5jb2RlID0gZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuYnRvYShzdHIpOwogICAgICAgIH0sIENvcmUuZGVjb2RlID0gZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuYXRvYihzdHIpOwogICAgICAgIH0sIENvcmUucHJvdG90eXBlLk1zZyA9IGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICByZXR1cm4gbGF5ZXIubXNnKG1zZywgewogICAgICAgICAgICAgICAgaWNvbjogNQogICAgICAgICAgICB9KTsKICAgICAgICB9LCBDb3JlLnByb3RvdHlwZS5zaG93Q29udGVudCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBsYXllci5vcGVuKHsKICAgICAgICAgICAgICAgIHR5cGU6IDEsCiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsCiAgICAgICAgICAgICAgICBzaGFkZTogMCwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgQ29yZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgbGF5ZXIuY2xvc2Uob2JqKTsKICAgICAgICB9LCBDb3JlLnByb3RvdHlwZS5jbG9zZUFsbCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBsYXllci5jbG9zZUFsbCgpOwogICAgICAgIH0sIENvcmUub3BlbiA9IGZ1bmN0aW9uKHVybCwgbG9hZEluQmFja0dyb3VuZCkgewogICAgICAgICAgICB2b2lkIDAgPT09IGxvYWRJbkJhY2tHcm91bmQgJiYgKGxvYWRJbkJhY2tHcm91bmQgPSAhMSksIEdNX29wZW5JblRhYih1cmwsIGxvYWRJbkJhY2tHcm91bmQpOwogICAgICAgIH0sIENvcmUuY2xpY2sgPSBmdW5jdGlvbihzZWxlY3RvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgJChzZWxlY3Rvcikub24oImNsaWNrIiwgY2FsbGJhY2spOwogICAgICAgIH0sIENvcmUudXVpZCA9IGZ1bmN0aW9uKGxlbiwgc3BsaXQsIHJhZGl4KSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gbGVuICYmIChsZW4gPSAxMCksIHZvaWQgMCA9PT0gc3BsaXQgJiYgKHNwbGl0ID0gITEpLCB2b2lkIDAgPT09IHJhZGl4ICYmIChyYWRpeCA9IDApOwogICAgICAgICAgICB2YXIgaSwgY2hhcnMgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKSwgdXVpZCA9IFtdOwogICAgICAgICAgICBpZiAocmFkaXggPSAwID09IHJhZGl4ID8gcmFkaXggfHwgY2hhcnMubGVuZ3RoIDogcmFkaXgsIHNwbGl0KSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIGZvciAodXVpZFs4XSA9IHV1aWRbMTNdID0gdXVpZFsxOF0gPSB1dWlkWzIzXSA9ICItIiwgdXVpZFsxNF0gPSAiNCIsIGkgPSAwOyBpIDwgMzY7IGkrKykgdXVpZFtpXSB8fCAociA9IDAgfCAxNiAqIE1hdGgucmFuZG9tKCksIAogICAgICAgICAgICAgICAgdXVpZFtpXSA9IGNoYXJzWzE5ID09IGkgPyAzICYgciB8IDggOiByXSk7CiAgICAgICAgICAgIH0gZWxzZSBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHV1aWRbaV0gPSBjaGFyc1swIHwgTWF0aC5yYW5kb20oKSAqIHJhZGl4XTsKICAgICAgICAgICAgcmV0dXJuIHV1aWQuam9pbigiIik7CiAgICAgICAgfSwgQ29yZS5nZXRCcm93c2VyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBicm93c2VyID0gITEsIHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHJldHVybiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveC8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuRmlyZWZveCA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC9lZGdlLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5FZGdlIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL2VkZy8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuRWRnIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL2JpZHVicm93c2VyLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5CYWlkdSA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC9sYmJyb3dzZXIvKSA/IGJyb3dzZXIgPSBCcm93ZXJUeXBlLkxpZWJhbyA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC91YnJvd3Nlci8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuVUMgOiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvcXFicm93c2UvKSA/IGJyb3dzZXIgPSBCcm93ZXJUeXBlLlFRIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL21ldGFzci8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuU29nb3UgOiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvb3ByLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5PcGVyYSA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC9tYXh0aG9uLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5NYXh0aG9uIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goLzIzNDVleHBsb3Jlci8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuSWUyMzQ1IDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL2Nocm9tZS8pID8gYnJvd3NlciA9IG5hdmlnYXRvci5taW1lVHlwZXMubGVuZ3RoID4gMTAgPyBCcm93ZXJUeXBlLlNlMzYwIDogQnJvd2VyVHlwZS5DaHJvbWUgOiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvc2FmYXJpLykgJiYgKGJyb3dzZXIgPSBCcm93ZXJUeXBlLlNhZmlyaSksIAogICAgICAgICAgICBicm93c2VyOwogICAgICAgIH0sIENvcmU7CiAgICB9KCksIFJ1bnRpbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBSdW50aW1lKCkge30KICAgICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFJ1bnRpbWUsICJ1cmwiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgfSksIFJ1bnRpbWU7CiAgICB9KCk7CiAgICAhZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gSHR0cFJlcXVlc3Qob3B0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBNYXAsIHRoaXMudXJsID0gb3B0aW9uLnVybCwgdGhpcy5tZXRob2QgPSBvcHRpb24ubWV0aG9kVHlwZSwgCiAgICAgICAgICAgIHRoaXMuZGF0YVR5cGUgPSBvcHRpb24uZGF0YVR5cGUsIHRoaXMuX29wdGlvbiA9IG9wdGlvbjsKICAgICAgICB9CiAgICAgICAgSHR0cFJlcXVlc3QucHJvdG90eXBlLm9ubG9hZCA9IGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICB0aGlzLl9vcHRpb24ub25TdWNjZXNzKHJlcyk7CiAgICAgICAgfSwgSHR0cFJlcXVlc3QucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5vbmVycm9yKCk7CiAgICAgICAgfSwgSHR0cFJlcXVlc3QucHJvdG90eXBlLnNldFF1ZXJ5RGF0YSA9IGZ1bmN0aW9uKGRhdGFzKSB7CiAgICAgICAgICAgIGlmIChkYXRhcyBpbnN0YW5jZW9mIEZvcm1EYXRhKSB0aGlzLmRhdGEgPSBkYXRhczsgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgZmQgPSBuZXcgRm9ybURhdGE7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGRhdGFzKSBmZC5hcHBlbmQoaSwgZGF0YXNbaV0pOwogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gZmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoSHR0cFJlcXVlc3QucHJvdG90eXBlLCAib25Mb2FkIiwgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub25TdWNjZXNzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgIH0pOwogICAgfSgpOwogICAgdmFyIEFqYXhPcHRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBBamF4T3B0aW9uKF91cmwsIF9tZXRob2RUeXBlLCBfZGF0YSwgX3N1Y2Nlc3MsIF9oZWFkZXIsIHRpbWVPdXQpIHsKICAgICAgICAgICAgdm9pZCAwID09PSBfbWV0aG9kVHlwZSAmJiAoX21ldGhvZFR5cGUgPSAiR0VUIiksIHZvaWQgMCA9PT0gX2hlYWRlciAmJiAoX2hlYWRlciA9IG5ldyBNYXApLCAKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lT3V0ICYmICh0aW1lT3V0ID0gNjApLCB0aGlzLnVybCA9IF91cmwsIHRoaXMubWV0aG9kVHlwZSA9IF9tZXRob2RUeXBlLCAKICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3MgPSBfc3VjY2VzcywgdGhpcy5vbkVycm9yID0gX3N1Y2Nlc3MsIHRoaXMuZGF0YSA9IF9kYXRhLCB0aGlzLmhlYWRlcnMgPSBfaGVhZGVyLCAKICAgICAgICAgICAgdGhpcy50aW1lT3V0ID0gdGltZU91dDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEFqYXhPcHRpb24ucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gdGhpcy5kYXRhOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhIGluc3RhbmNlb2YgTWFwKSB7CiAgICAgICAgICAgICAgICB2YXIgZmRfMSA9IG5ldyBGb3JtRGF0YTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuZm9yRWFjaCgoZnVuY3Rpb24odiwgaykgewogICAgICAgICAgICAgICAgICAgIGZkXzEuYXBwZW5kKGssIHYpOwogICAgICAgICAgICAgICAgfSkpLCBmZF8xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmZCA9IG5ldyBGb3JtRGF0YTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmRhdGEpIGZkLmFwcGVuZChpLCB0aGlzLmRhdGFbaV0pOwogICAgICAgICAgICByZXR1cm4gZmQ7CiAgICAgICAgfSwgQWpheE9wdGlvbjsKICAgIH0oKSwgQWxlcnQgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBBbGVydCgpIHt9CiAgICAgICAgcmV0dXJuIEFsZXJ0Lm9wZW4gPSBmdW5jdGlvbih0aXRscywgY29udGVudCwgYXJlYSwgc2hhZGUsIG9mZnNldCwgbWF4bWluKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGFyZWEgJiYgKGFyZWEgPSBbICI0MDBweCIsICIzMDBweCIgXSksIHZvaWQgMCA9PT0gc2hhZGUgJiYgKHNoYWRlID0gMCksIAogICAgICAgICAgICB2b2lkIDAgPT09IG9mZnNldCAmJiAob2Zmc2V0ID0gImxiIiksIHZvaWQgMCA9PT0gbWF4bWluICYmIChtYXhtaW4gPSAhMCksIGxheWVyLm9wZW4oewogICAgICAgICAgICAgICAgdHlwZTogMSwKICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRscywKICAgICAgICAgICAgICAgIGFyZWE6IGFyZWEsCiAgICAgICAgICAgICAgICBzaGFkZTogc2hhZGUsCiAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKICAgICAgICAgICAgICAgIG1heG1pbjogbWF4bWluLAogICAgICAgICAgICAgICAgY29udGVudDogY29udGVudAogICAgICAgICAgICB9KTsKICAgICAgICB9LCBBbGVydC5pbmZvID0gZnVuY3Rpb24obXNnKSB7CiAgICAgICAgICAgIHJldHVybiBsYXllci5tc2cobXNnLCB7CiAgICAgICAgICAgICAgICB0aW1lOiAyZTMKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgQWxlcnQuZXJyb3IgPSBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgcmV0dXJuIGxheWVyLm1zZyhtc2csIHsKICAgICAgICAgICAgICAgIGljb246IDUsCiAgICAgICAgICAgICAgICB0aW1lOiAyZTMKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgQWxlcnQuY29uZmltID0gZnVuY3Rpb24odGl0bGUsIG1zZywgYnV0dG9ucywgY2FsbGJhY2ssIGF1dG9fY2xvc2UpIHsKICAgICAgICAgICAgdm9pZCAwID09PSBhdXRvX2Nsb3NlICYmIChhdXRvX2Nsb3NlID0gITEpOwogICAgICAgICAgICB2YXIgdGlkID0gbGF5ZXIub3Blbih7CiAgICAgICAgICAgICAgICB0eXBlOiAxLAogICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlIHx8ICExLAogICAgICAgICAgICAgICAgY2xvc2VCdG46IDEsCiAgICAgICAgICAgICAgICBzaGFkZTogLjgsCiAgICAgICAgICAgICAgICBpZDogIkxBWV9sYXl1aXBybyIsCiAgICAgICAgICAgICAgICByZXNpemU6ICExLAogICAgICAgICAgICAgICAgYnRuOiBidXR0b25zLAogICAgICAgICAgICAgICAgYnRuQWxpZ246ICJjIiwKICAgICAgICAgICAgICAgIG1vdmVUeXBlOiAxLAogICAgICAgICAgICAgICAgY29udGVudDogJzxkaXYgc3R5bGU9InBhZGRpbmc6IDIwcHg7IGxpbmUtaGVpZ2h0OiAyMnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjMzkzRDQ5OyBjb2xvcjogI2ZmZjsgZm9udC13ZWlnaHQ6IDMwMDsiPicgKyBtc2cgKyAiPC9kaXY+IiwKICAgICAgICAgICAgICAgIHllczogZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpbmRleCksIGF1dG9fY2xvc2UgJiYgQ29yZS5sYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmNsb3NlKHRpZCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRpZDsKICAgICAgICB9LCBBbGVydC5wcm9tcHQgPSBmdW5jdGlvbih0aXRsZSwgdiwgY2FsbGJhY2ssIHNpemUsIHR5cGUpIHsKICAgICAgICAgICAgdm9pZCAwID09PSB0eXBlICYmICh0eXBlID0gMCksIGxheWVyLnByb21wdCh7CiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsCiAgICAgICAgICAgICAgICB2YWx1ZTogdiwKICAgICAgICAgICAgICAgIGZvcm1UeXBlOiB0eXBlCiAgICAgICAgICAgIH0sIChmdW5jdGlvbih2LCBpLCBlbGUpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHYpLCBsYXllci5jbG9zZShpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEFsZXJ0LmNsb3NlID0gZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgbGF5ZXIuY2xvc2UoaW5kZXgpOwogICAgICAgIH0sIEFsZXJ0LmNsb3NlQWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGxheWVyLmNsb3NlQWxsKCk7CiAgICAgICAgfSwgQWxlcnQubG9hZGluZyA9IGZ1bmN0aW9uKHN0eWxlLCBfdGltZSwgX3NoYWRlKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHN0eWxlICYmIChzdHlsZSA9IDEpLCB2b2lkIDAgPT09IF90aW1lICYmIChfdGltZSA9IDEwKSwgdm9pZCAwID09PSBfc2hhZGUgJiYgKF9zaGFkZSA9IC4zKSwgCiAgICAgICAgICAgIGxheWVyLmxvYWQoc3R5bGUsIHsKICAgICAgICAgICAgICAgIHNoYWRlOiBfc2hhZGUsCiAgICAgICAgICAgICAgICB0aW1lOiAxZTMgKiBfdGltZQogICAgICAgICAgICB9KTsKICAgICAgICB9LCBBbGVydC5sb2FkaW5nUyA9IGZ1bmN0aW9uKG1zZywgdGltZSkgewogICAgICAgICAgICB2b2lkIDAgPT09IHRpbWUgJiYgKHRpbWUgPSAtMSksIFN3YWxfX2RlZmF1bHQuZGVmYXVsdC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBtc2csCiAgICAgICAgICAgICAgICBkaWRPcGVuOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBTd2FsX19kZWZhdWx0LmRlZmF1bHQuc2hvd0xvYWRpbmcoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogITEsCiAgICAgICAgICAgICAgICBhbGxvd0VzY2FwZUtleTogITEsCiAgICAgICAgICAgICAgICB0aW1lcjogLTEgPT0gdGltZSA/IHZvaWQgMCA6IDFlMyAqIHRpbWUKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgQWxlcnQ7CiAgICB9KCksIEh0dHAgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBIdHRwKCkge30KICAgICAgICByZXR1cm4gSHR0cC5hamF4ID0gZnVuY3Rpb24ob3B0aW9uKSB7CiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jOwogICAgICAgICAgICBvcHRpb24uaGVhZGVycy5zZXQoIlVzZXItQWdlbnQiLCBudWxsICE9PSAoX2EgPSB1bnNhZmVXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85Mi4wLjQ1MTUuMTU5IFNhZmFyaS81MzcuMzYiKSwgCiAgICAgICAgICAgIG9wdGlvbi5oZWFkZXJzLnNldCgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL2F0b20reG1sLGFwcGxpY2F0aW9uL3htbCx0ZXh0L3htbCIpOwogICAgICAgICAgICB2YXIgaGVhZCA9IG5ldyBIdHRwSGVhZGVyczsKICAgICAgICAgICAgb3B0aW9uLnVybC5pbmRleE9mKCJ3YW5kaGkiKSA+IDAgJiYgKGhlYWQudmVyc2lvbiA9IENvbmZpZy5lbnYuc2NyaXB0LnZlcnNpb24sIGhlYWQuYXV0aCA9IG51bGwgIT09IChfYiA9IENvbmZpZy5lbnYuc2NyaXB0LmF1dGhvcikgJiYgdm9pZCAwICE9PSBfYiA/IF9iIDogIiIsIAogICAgICAgICAgICBoZWFkLm5hbWVzcGFjZSA9IG51bGwgIT09IChfYyA9IENvbmZpZy5lbnYuc2NyaXB0Lm5hbWVzcGFjZSkgJiYgdm9pZCAwICE9PSBfYyA/IF9jIDogIiIpLCAKICAgICAgICAgICAgb3B0aW9uLmhlYWRlcnMuZm9yRWFjaCgoZnVuY3Rpb24odiwgaykgewogICAgICAgICAgICAgICAgaGVhZFtrXSA9IHY7CiAgICAgICAgICAgIH0pKSwgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgdXJsOiBvcHRpb24udXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiBvcHRpb24ubWV0aG9kVHlwZSwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWQsCiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24uZ2V0RGF0YSgpLAogICAgICAgICAgICAgICAgdGltZW91dDogMWUzICogb3B0aW9uLnRpbWVPdXQsCiAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gKF9hID0gb3B0aW9uLm9uU3VjY2VzcykgfHwgdm9pZCAwID09PSBfYSB8fCBfYS5jYWxsKG9wdGlvbiwgIlBPU1QiID09IG9wdGlvbi5tZXRob2RUeXBlID8gSlNPTi5wYXJzZShyZXMucmVzcG9uc2VUZXh0KSA6IHJlcy5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0LmNvbmZpbSgiIiwgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMT5cdTU0Y2RcdTVlOTRcdTVmMDJcdTVlMzhcdWZmMGNcdThiZjdcdTU5MGRcdTUyMzZcdTRlMGJcdTUyMTdcdTRmZTFcdTYwNmZcdTU0MTFcdTVmMDBcdTUzZDFcdTgwMDVcdTUzY2RcdTk5ODhcdTk1ZWVcdTk4OTg8L2gxPjxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Zm9udC13ZWlnaHQ6IGJvbGQ7Zm9udC1zaXplOiBsYXJnZTsiPlx1OTUxOVx1OGJlZlx1NjVlNVx1NWZkN1x1ZmYxYTwvc3Bhbj48YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD4nICsgZXJyb3IgKyAiKCIgKyByZXMuc3RhdHVzICsgJyk8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6cmVkO2ZvbnQtd2VpZ2h0OiBib2xkO2ZvbnQtc2l6ZTogbGFyZ2U7Ij5cdTk1MTlcdThiZWZcdThiZTZcdTYwYzVcdWZmMWE8L3NwYW4+PGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+JyArIGVzY2FwZShyZXMucmVzcG9uc2VUZXh0KSArICc8L3A+ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6cmVkO2ZvbnQtd2VpZ2h0OiBib2xkO2ZvbnQtc2l6ZTogbGFyZ2U7Ij5cdTczYWZcdTU4ODNcdTRmZTFcdTYwNmZcdWZmMWE8L3NwYW4+PGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHU2Y2I5XHU3MzM0XHU3MjQ4XHU2NzJjXHVmZjFhJyArIENvbmZpZy5lbnYudmVyc2lvbiArICI8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5cdTgxMWFcdTY3MmNcdTcyNDhcdTY3MmNcdWZmMWEiICsgQ29uZmlnLmVudi5zY3JpcHQudmVyc2lvbiArICI8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5VcmxcdWZmMWEiICsgUnVudGltZS51cmwgKyAiPC9wPlxuICAgICAgICAgICAgICAgICAgICAiLCBbICJcdTUzYmJcdTUzY2RcdTk5ODgiLCAiXHU1MTczXHU5NWVkIiBdLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHBzOi8vZ2l0ZWUuY29tL2l4eXN5L09uZUtleVZpcC9pc3N1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBudWxsID09PSAoX2IgPSBvcHRpb24ub25TdWNjZXNzKSB8fCB2b2lkIDAgPT09IF9iIHx8IF9iLmNhbGwob3B0aW9uLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb25lcnJvcjogZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PT0gKF9hID0gcmVzLmZpbmFsVXJsKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EuaW5kZXhPZigiYWRndWFyZC5vcmciKSkgPiAwID8gb3B0aW9uLm9uRXJyb3IobnVsbCkgOiAoQWxlcnQuY29uZmltKCIiLCAnICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMT5cdThiZjdcdTZjNDJcdTU5MzFcdThkMjVcdWZmMGNcdThiZjdcdTU5MGRcdTUyMzZcdTRlMGJcdTUyMTdcdTRmZTFcdTYwNmZcdTU0MTFcdTVmMDBcdTUzZDFcdTgwMDVcdTUzY2RcdTk5ODhcdTk1ZWVcdTk4OTg8L2gxPjxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Zm9udC13ZWlnaHQ6IGJvbGQ7Zm9udC1zaXplOiBsYXJnZTsiPlx1OTUxOVx1OGJlZlx1OGJlNlx1NjBjNVx1ZmYxYTwvc3Bhbj48YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD4nICsgZXNjYXBlKHJlcy5yZXNwb25zZVRleHQpICsgIigiICsgcmVzLnN0YXR1cyArICcpPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDtmb250LXdlaWdodDogYm9sZDtmb250LXNpemU6IGxhcmdlOyI+XHU3M2FmXHU1ODgzXHU0ZmUxXHU2MDZmXHVmZjFhPC9zcGFuPjxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlx1NmNiOVx1NzMzNFx1NzI0OFx1NjcyY1x1ZmYxYScgKyBDb25maWcuZW52LnZlcnNpb24gKyAiPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHU4MTFhXHU2NzJjXHU3MjQ4XHU2NzJjXHVmZjFhIiArIENvbmZpZy5lbnYuc2NyaXB0LnZlcnNpb24gKyAiPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+VXJsXHVmZjFhIiArIFJ1bnRpbWUudXJsICsgIjwvcD4gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAiLCBbICJcdTUzYmJcdTUzY2RcdTk5ODgiLCAiXHU1MTczXHU5NWVkIiBdLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUub3BlbigiaHR0cHM6Ly9naXRlZS5jb20vaXh5c3kvT25lS2V5VmlwL2lzc3VlcyIpOwogICAgICAgICAgICAgICAgICAgIH0pKSwgbnVsbCA9PT0gKF9iID0gb3B0aW9uLm9uRXJyb3IpIHx8IHZvaWQgMCA9PT0gX2IgfHwgX2IuY2FsbChvcHRpb24sIHJlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LCBIdHRwLmdldERhdGEgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICQuZ2V0SlNPTih1cmwsIChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhkKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEh0dHAuSnFHZXQgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIEh0dHAuZ2V0KHVybCwgbmV3IE1hcCkudGhlbigoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIdHRwLnBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIHRpbWVPdXQpIHsKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lT3V0ICYmICh0aW1lT3V0ID0gMTApOwogICAgICAgICAgICB2YXIgaW5kZXggPSBBbGVydC5sb2FkaW5nKCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgSHR0cC5hamF4KG5ldyBBamF4T3B0aW9uKHVybCwgIlBPU1QiLCBkYXRhLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgIEFsZXJ0LmNsb3NlKGluZGV4KSwgcmVzb2x2ZShkYXRhKTsKICAgICAgICAgICAgICAgIH0pLCBuZXcgTWFwLCB0aW1lT3V0KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIdHRwLmdldCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgdGltZV9vdXQpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZGF0YSAmJiAoZGF0YSA9IG5ldyBNYXApLCB2b2lkIDAgPT09IHRpbWVfb3V0ICYmICh0aW1lX291dCA9IDEwKSwgCiAgICAgICAgICAgIEFsZXJ0LmxvYWRpbmcoKSwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgSHR0cC5hamF4KG5ldyBBamF4T3B0aW9uKHVybCwgIkdFVCIsIGRhdGEsIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBudWxsICE9PSAoX2EgPSBKU09OLnBhcnNlKGRhdGEpKSAmJiB2b2lkIDAgIT09IF9hID8gX2EgOiBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKGVycm9yKSwgcmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIG5ldyBNYXAsIHRpbWVfb3V0KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIdHRwLmdldFdpdGhIZWFkID0gZnVuY3Rpb24odXJsLCBkYXRhLCBoZWFkLCB0aW1lX291dCkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBkYXRhICYmIChkYXRhID0gbmV3IE1hcCksIHZvaWQgMCA9PT0gaGVhZCAmJiAoaGVhZCA9IG5ldyBNYXApLCAKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lX291dCAmJiAodGltZV9vdXQgPSAxMCksIEFsZXJ0LmxvYWRpbmcoKSwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgSHR0cC5hamF4KG5ldyBBamF4T3B0aW9uKHVybCwgIkdFVCIsIGRhdGEsIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBudWxsICE9PSAoX2EgPSBKU09OLnBhcnNlKGRhdGEpKSAmJiB2b2lkIDAgIT09IF9hID8gX2EgOiBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKGVycm9yKSwgcmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIGhlYWQsIHRpbWVfb3V0KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIdHRwLnBvc3RXaXRoSGVhZCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgaGVhZCwgdGltZV9vdXQpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZGF0YSAmJiAoZGF0YSA9IG5ldyBNYXApLCB2b2lkIDAgPT09IGhlYWQgJiYgKGhlYWQgPSBuZXcgTWFwKSwgCiAgICAgICAgICAgIHZvaWQgMCA9PT0gdGltZV9vdXQgJiYgKHRpbWVfb3V0ID0gMTApLCBBbGVydC5sb2FkaW5nKCksIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgIEh0dHAuYWpheChuZXcgQWpheE9wdGlvbih1cmwsICJQT1NUIiwgZGF0YSwgKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhbIHVybCwgZXJyb3IgXSksIHJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBoZWFkLCB0aW1lX291dCkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgSHR0cC5nZXRfdGV4dCA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIEh0dHAuYWpheChuZXcgQWpheE9wdGlvbih1cmwsICJHRVQiLCBuZXcgTWFwLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgSHR0cDsKICAgIH0oKSwgSHR0cEhlYWRlcnMgPSBmdW5jdGlvbiBIdHRwSGVhZGVycygpIHt9LCBDb252ZXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gQ29udmVydCgpIHt9CiAgICAgICAgcmV0dXJuIENvbnZlcnQuZ2VudGVyRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIF9kYXRhID0gbmV3IEhpc3Rvcnk7CiAgICAgICAgICAgIGlmIChfZGF0YS5kYXRlID0gQ29yZS5mb3JtYXQobmV3IERhdGUoTnVtYmVyLnBhcnNlSW50KGRhdGEubG93ZXJEYXRlLm1hdGNoKC9bMC05XXsxM30vKVswXSkgKyA4MDApLCAieXl5eS1NTS1kZCIpLCAKICAgICAgICAgICAgX2RhdGEubWluID0gZGF0YS5sb3dlclByaWNlLCBfZGF0YS5tYXggPSBfZGF0YS5taW4sIF9kYXRhLm1heF9kYXRlID0gX2RhdGEuZGF0ZSwgCiAgICAgICAgICAgIF9kYXRhLmN1cnJlbnQgPSBkYXRhLmN1cnJlbnRQcmljZS50b1N0cmluZygpLCBfZGF0YS5tYXJrID0gIiIgPT0gZGF0YS5jaGFuZ1ByaWNlUmVtYXJrID8gIlx1NjY4Mlx1NjVlMCIgOiBkYXRhLmNoYW5nUHJpY2VSZW1hcmssIAogICAgICAgICAgICAwID09IGRhdGEubGlzdFByaWNlLmxlbmd0aCB8fCAhZGF0YS5saXN0UHJpY2UpIHsKICAgICAgICAgICAgICAgIHZhciB0ZW1wXzEgPSBbXTsKICAgICAgICAgICAgICAgIGRhdGEuZGF0ZVByaWNlLnNwbGl0KCJdLFsiKS5mb3JFYWNoKChmdW5jdGlvbih2LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgTGlzdFByaWNlSXRlbSwgdmFsdWVzID0gKHYgPSB2LnJlcGxhY2UoL1xbfCJ8XF0vZywgIiIpKS5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgIHQucHIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWVzWzFdKSwgdC55aCA9IDMgPT0gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1syXSA6IHYuc3Vic3RyaW5nKHYuaW5kZXhPZih2YWx1ZXNbMl0pLCB2Lmxlbmd0aCksIAogICAgICAgICAgICAgICAgICAgIHQuZHQgPSB2YWx1ZXNbMF0sIHRlbXBfMS5wdXNoKHQpOwogICAgICAgICAgICAgICAgfSkpLCBkYXRhLmxpc3RQcmljZSA9IHRlbXBfMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGF0YS5saXN0UHJpY2UuZm9yRWFjaCgoZnVuY3Rpb24odiwgbikgewogICAgICAgICAgICAgICAgdmFyIGRldGFpbCA9IG5ldyBQcmljZURldGFpbDsKICAgICAgICAgICAgICAgIGRldGFpbC50aW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodi5kdC5tYXRjaCgvWzAtOV17MTN9LylbMF0pICsgODAwLCBkZXRhaWwudGltZSA9IENvcmUuZm9ybWF0KG5ldyBEYXRlKGRldGFpbC50aW1lc3RhbXApLCAieXl5eS1NTS1kZCIpLCAKICAgICAgICAgICAgICAgIGRldGFpbC5wcmljZSA9IHYucHIsIGRldGFpbC5tYXJrID0gdi55aCwgX2RhdGEubWF4IDwgdi5wciAmJiAoX2RhdGEubWF4ID0gdi5wciwgCiAgICAgICAgICAgICAgICBfZGF0YS5tYXhfZGF0ZSA9IGRldGFpbC50aW1lKSwgX2RhdGEucHJpY2VfZGV0YWlsLnB1c2goZGV0YWlsKTsKICAgICAgICAgICAgfSkpLCBfZGF0YTsKICAgICAgICB9LCBDb252ZXJ0LmdlbnRlckRhdGFWMiA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIF9kYXRhID0gbmV3IEhpc3Rvcnk7CiAgICAgICAgICAgIF9kYXRhLmRhdGUgPSBDb3JlLmZvcm1hdChuZXcgRGF0ZShkYXRhLmxvd2VyRGF0ZSksICJ5eXl5LU1NLWRkIiksIF9kYXRhLm1pbiA9IGRhdGEubG93ZXJQcmljZSwgCiAgICAgICAgICAgIF9kYXRhLm1heCA9IF9kYXRhLm1pbiwgX2RhdGEubWF4X2RhdGUgPSBfZGF0YS5kYXRlLCBfZGF0YS5jdXJyZW50ID0gZGF0YS5jdXJyZW50UHJpY2UudG9TdHJpbmcoKSwgCiAgICAgICAgICAgIF9kYXRhLm1hcmsgPSAiIiA9PSBkYXRhLmNoYW5nUHJpY2VSZW1hcmsgPyAiXHU2NjgyXHU2NWUwIiA6IGRhdGEuY2hhbmdQcmljZVJlbWFyazsKICAgICAgICAgICAgdmFyIGxpc3RQcmljZSA9IFtdOwogICAgICAgICAgICBpZiAoMCAhPSBkYXRhLmRhdGVQcmljZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHZhciB0ZW1wXzIgPSBbXTsKICAgICAgICAgICAgICAgIGRhdGEuZGF0ZVByaWNlLnNwbGl0KCJdLFsiKS5mb3JFYWNoKChmdW5jdGlvbih2LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgTGlzdFByaWNlSXRlbSwgdmFsdWVzID0gKHYgPSB2LnJlcGxhY2UoL1xbfCJ8XF0vZywgIiIpKS5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgIHQucHIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWVzWzFdKSwgdC55aCA9IDMgPT0gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1syXSA6IHYuc3Vic3RyaW5nKHYuaW5kZXhPZih2YWx1ZXNbMl0pLCB2Lmxlbmd0aCksIAogICAgICAgICAgICAgICAgICAgIHQuZHQgPSB2YWx1ZXNbMF0sIHRlbXBfMi5wdXNoKHQpOwogICAgICAgICAgICAgICAgfSkpLCBsaXN0UHJpY2UgPSB0ZW1wXzI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxpc3RQcmljZS5mb3JFYWNoKChmdW5jdGlvbih2LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgZGV0YWlsID0gbmV3IFByaWNlRGV0YWlsOwogICAgICAgICAgICAgICAgZGV0YWlsLnRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh2LmR0Lm1hdGNoKC9bMC05XXsxM30vKVswXSkgKyA4MDAsIGRldGFpbC50aW1lID0gQ29yZS5mb3JtYXQobmV3IERhdGUoZGV0YWlsLnRpbWVzdGFtcCksICJ5eXl5LU1NLWRkIiksIAogICAgICAgICAgICAgICAgZGV0YWlsLnByaWNlID0gdi5wciwgZGV0YWlsLm1hcmsgPSB2LnloLCBfZGF0YS5tYXggPCB2LnByICYmIChfZGF0YS5tYXggPSB2LnByLCAKICAgICAgICAgICAgICAgIF9kYXRhLm1heF9kYXRlID0gZGV0YWlsLnRpbWUpLCBfZGF0YS5wcmljZV9kZXRhaWwucHVzaChkZXRhaWwpOwogICAgICAgICAgICB9KSksIF9kYXRhOwogICAgICAgIH0sIENvbnZlcnQuZ2VudGVyQXV0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgUHJvbWlzZSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF9hdXRoOwogICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfYXV0aCA9IENvbmZpZy5nZXQoImJhc2VhdXRoIiwgIiIpKSA/IFsgNCwgX2F1dGggXSA6IFsgMywgMiBdOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiwgX2Euc2VudCgpIF07CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyA0LCBIdHRwLmdldF90ZXh0KHRoaXMuYXV0aEFwaSkudGhlbigoZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoUiA9IGh0bWwubWF0Y2goL2lkPVwidGlja2V0XCIgdmFsdWU9XCIoLiopXCIvaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9hdXRoID0gbnVsbCAhPSBtYXRjaFIgPyAiIiArIG1hdGNoUlsxXSA6ICIiKS5sZW5ndGggPiA0ICYmIChfYXV0aCA9ICJCYXNpY0F1dGggIiArIChfYXV0aCA9IF9hdXRoLnN1YnN0cihfYXV0aC5sZW5ndGggLSA0LCA0KSArIF9hdXRoLnN1YnN0cmluZygwLCBfYXV0aC5sZW5ndGggLSA0KSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5zZXQoImJhc2VhdXRoIiwgX2F1dGgsIDYwKSwgX2F1dGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSBdOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiwgX2F1dGggPSBfYS5zZW50KCkgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBDb252ZXJ0LmF1dGhBcGkgPSAiaHR0cHM6Ly90b29sLm1hbm1hbmJ1eS5jb20vSGlzdG9yeUxvd2VzdC5hc3B4IiwgQ29udmVydDsKICAgIH0oKSwgUmVzdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gUmVzdWx0KCkge30KICAgICAgICByZXR1cm4gUmVzdWx0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcnEgPSBmdW5jdGlvbigpIHt9LCBSZXN1bHQ7CiAgICB9KCk7CiAgICAhZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gU3R1UmVzdWx0KCkgewogICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIF9fZXh0ZW5kcyhTdHVSZXN1bHQsIF9zdXBlcik7CiAgICB9KFJlc3VsdCksIGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIFN0clJlc3VsdCgpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICBfX2V4dGVuZHMoU3RyUmVzdWx0LCBfc3VwZXIpOwogICAgfShSZXN1bHQpOwogICAgdmFyIEhpc3RvcnlSZXN1bHQgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBIaXN0b3J5UmVzdWx0KCkgewogICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoSGlzdG9yeVJlc3VsdCwgX3N1cGVyKSwgSGlzdG9yeVJlc3VsdDsKICAgIH0oUmVzdWx0KTsKICAgICFmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBIaXN0b3J5UXVlcnlSZXN1bHQoKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBfc3VwZXIgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICB9CiAgICAgICAgX19leHRlbmRzKEhpc3RvcnlRdWVyeVJlc3VsdCwgX3N1cGVyKTsKICAgIH0oUmVzdWx0KSwgZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gSGlzdG9yeVYxUmVzdWx0KCkgewogICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIF9fZXh0ZW5kcyhIaXN0b3J5VjFSZXN1bHQsIF9zdXBlcik7CiAgICB9KFJlc3VsdCksIGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIEhpc3RvcnlWMlJlc3VsdCgpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICBfX2V4dGVuZHMoSGlzdG9yeVYyUmVzdWx0LCBfc3VwZXIpOwogICAgfShSZXN1bHQpOwogICAgdmFyIFJvdXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gUm91dGUoKSB7CiAgICAgICAgICAgIHRoaXMucXVlcnlUYW8gPSAiIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb3V0ZSwgImFwaVJvb3QiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImh0dHBzOi8vYXBpLndhbmRoaS5jb20vYXBpIjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW51bWVyYWJsZTogITEsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICB9KSwgUm91dGUuYmFzZUFwaSA9IGZ1bmN0aW9uKGFwaSwgZGF0YSwgY2FsbGJhY2ssIHRpbWVPdXQpIHsKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lT3V0ICYmICh0aW1lT3V0ID0gMTApLCBIdHRwLnBvc3QoUm91dGUuYXBpUm9vdCArIGFwaSwgZGF0YSwgdGltZU91dCkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXMpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgUm91dGUucXVlcnlTYnggPSBmdW5jdGlvbihpZCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgIiIgIT09IENvbmZpZy5nZXQodGhpcy5zeGJfa2V5LCAiIikgPyB0aGlzLnF1ZXJ5MzY1KGlkLCBDb25maWcuZ2V0KHRoaXMuc3hiX2tleSksIGNhbGxiYWNrKSA6IHRoaXMucXVlcnlWYWx1ZSgic3hiX2FuaGFvIiwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgX3RoaXMucXVlcnkzNjUoaWQsIHJlcy5kYXRhLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBSb3V0ZS5zYnhGZWVkYmFjayA9IGZ1bmN0aW9uKGlkLCBhbnN3ZXIpIHsKICAgICAgICAgICAgdGhpcy5iYXNlQXBpKCIvdG9vbHMvcmVjb3JkIiwgbmV3IE1hcChbIFsgImlkIiwgaWQgXSwgWyAiZGF0YSIsIGFuc3dlciBdLCBbICJhbmhhbyIsIENvbmZpZy5nZXQodGhpcy5zeGJfa2V5KSBdIF0pLCAoZnVuY3Rpb24oKSB7fSkpOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5MzY1ID0gZnVuY3Rpb24oaWQsIGFuaGFvLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgYXBpID0gQ29uZmlnLmdldCgic3hiX2FwaSIpOwogICAgICAgICAgICBhcGkgPyBIdHRwLnBvc3QoYXBpLCBuZXcgTWFwKFsgWyAiZG9jaW5mbyIsICJodHRwczovL3d3dy5zaGFuZ3h1ZWJhLmNvbS9hc2svIiArIGlkICsgIi5odG1sIiBdLCBbICJhbmhhbyIsIGFuaGFvIF0gXSkpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgY2FsbGJhY2socmVzKTsKICAgICAgICAgICAgfSkpIDogdGhpcy5xdWVyeVZhbHVlKCJzeGJfYXBpIiwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgQ29uZmlnLnNldCgic3hiX2FwaSIsIHJlcy5kYXRhLCA4NjRlNSksIEh0dHAucG9zdChyZXMuZGF0YSwgbmV3IE1hcChbIFsgImRvY2luZm8iLCAiaHR0cHM6Ly93d3cuc2hhbmd4dWViYS5jb20vYXNrLyIgKyBpZCArICIuaHRtbCIgXSwgWyAiYW5oYW8iLCBhbmhhbyBdIF0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5VmFsdWUgPSBmdW5jdGlvbihrZXksIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuYmFzZUFwaShSb3V0ZS5jb25maWcsIG5ldyBNYXAoWyBbICJrZXkiLCBrZXkgXSBdKSwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5SGlzdG9yeSA9IGZ1bmN0aW9uKHVybCwgc2l0ZVR5cGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuYmFzZUFwaSh0aGlzLmhpc3RvcnksIG5ldyBNYXAoWyBbICJ1cmwiLCB1cmwgXSwgWyAidHlwZSIsIHNpdGVUeXBlIF0gXSksIGNhbGxiYWNrKTsKICAgICAgICB9LCBSb3V0ZS5xdWVyeUhpc3Rvcnl2MSA9IGZ1bmN0aW9uKHVybCwgc2l0ZVR5cGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXMsIHRoYXQgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmJhc2VBcGkodGhpcy5oaXN0b3J5djEsIG5ldyBNYXAoWyBbICJ1cmwiLCB1cmwgXSBdKSwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKHJlcyksIHJlcy5jb2RlID8gSHR0cC5nZXQocmVzLmRhdGEpLnRoZW4oKGZ1bmN0aW9uKHByaWNlcykgewogICAgICAgICAgICAgICAgICAgIHZhciBfcmVzID0gbmV3IEhpc3RvcnlSZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgX3Jlcy5jb2RlID0gMSwgX3Jlcy5kYXRhID0gQ29udmVydC5nZW50ZXJEYXRhKHByaWNlcyksIExvZ2dlci5kZWJ1ZyhfcmVzKSwgY2FsbGJhY2soX3Jlcyk7CiAgICAgICAgICAgICAgICB9KSkuY2F0Y2goKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQucXVlcnlIaXN0b3J5KHVybCwgc2l0ZVR5cGUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pKSA6IF90aGlzLnF1ZXJ5SGlzdG9yeSh1cmwsIHNpdGVUeXBlLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pLCA2MCk7CiAgICAgICAgfSwgUm91dGUucXVlcnlIaXN0b3J5djIgPSBmdW5jdGlvbih1cmwsIHNpdGVUeXBlLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzLCB0aGF0ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5iYXNlQXBpKHRoaXMuaGlzdG9yeXYyLCBuZXcgTWFwKFsgWyAidXJsIiwgdXJsIF0gXSksIChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhyZXMpLCByZXMuY29kZSA/IEh0dHAuZ2V0V2l0aEhlYWQocmVzLmRhdGEudXJsLCBuZXcgTWFwLCBuZXcgTWFwKFsgWyAiQXV0aG9yaXphdGlvbiIsIHJlcy5kYXRhLmF1dGggXSBdKSkudGhlbigoZnVuY3Rpb24ocHJpY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9yZXMgPSBuZXcgSGlzdG9yeVJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAwID09IHByaWNlcy5jb2RlID8gX3Jlcy5jb2RlID0gMSA6IF9yZXMuY29kZSA9IC0xLCBfcmVzLmNvZGUgPSAxLCBfcmVzLmRhdGEgPSBDb252ZXJ0LmdlbnRlckRhdGFWMihwcmljZXMuZGF0YSksIAogICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhfcmVzKSwgY2FsbGJhY2soX3Jlcyk7CiAgICAgICAgICAgICAgICB9KSkuY2F0Y2goKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQucXVlcnlIaXN0b3J5KHVybCwgc2l0ZVR5cGUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pKSA6IF90aGlzLnF1ZXJ5SGlzdG9yeSh1cmwsIHNpdGVUeXBlLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pLCA2MCk7CiAgICAgICAgfSwgUm91dGUucXVlcnlIaXN0b3J5djMgPSBmdW5jdGlvbih1cmwsIHNpdGVUeXBlLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzLCB0aGF0ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5iYXNlQXBpKHRoaXMuaGlzdG9yeXYzLCBuZXcgTWFwKFsgWyAidXJsIiwgdXJsIF0gXSksIChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhyZXMpLCByZXMuY29kZSA/IENvbnZlcnQuZ2VudGVyQXV0aCgpLnRoZW4oKGZ1bmN0aW9uKGF1dGgpIHsKICAgICAgICAgICAgICAgICAgICBIdHRwLnBvc3RXaXRoSGVhZChyZXMuZGF0YS51cmwsIG5ldyBNYXAoWyBbICJ0b2tlbiIsIHJlcy5kYXRhLnRva2VuIF0sIFsgInQiLCByZXMuZGF0YS50IF0sIFsgImtleSIsIHJlcy5kYXRhLmtleSBdLCBbICJtZXRob2QiLCByZXMuZGF0YS5tZXRob2QgXSBdKSwgbmV3IE1hcChbIFsgIkF1dGhvcml6YXRpb24iLCBudWxsICE9IGF1dGggPyBhdXRoIDogcmVzLmRhdGEuYXV0aCBdIF0pKS50aGVuKChmdW5jdGlvbihwcmljZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZXMgPSBuZXcgSGlzdG9yeVJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgMCA9PSBwcmljZXMuY29kZSA/IF9yZXMuY29kZSA9IDEgOiAyID09IHByaWNlcy5jb2RlID8gKENvbmZpZy5jbGVhcigiYmFzZWF1dGgiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnF1ZXJ5SGlzdG9yeXYzKHVybCwgc2l0ZVR5cGUsIGNhbGxiYWNrKSkgOiBfcmVzLmNvZGUgPSAtMSwgX3Jlcy5jb2RlID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXMuZGF0YSA9IENvbnZlcnQuZ2VudGVyRGF0YVYyKHByaWNlcy5kYXRhKSwgTG9nZ2VyLmRlYnVnKF9yZXMpLCBjYWxsYmFjayhfcmVzKTsKICAgICAgICAgICAgICAgICAgICB9KSkuY2F0Y2goKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnF1ZXJ5SGlzdG9yeSh1cmwsIHNpdGVUeXBlLCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpIDogX3RoaXMucXVlcnlIaXN0b3J5KHVybCwgc2l0ZVR5cGUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgfSksIDYwKTsKICAgICAgICB9LCBSb3V0ZS5xdWVyeUhpc3RvcnlWNCA9IGZ1bmN0aW9uKHVybCwgc2l0ZVR5cGUsIGZwLCBkZnAsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByb290ID0gImh0dHBzOi8vYnJvd3Nlci5nd2RhbmcuY29tL2V4dGVuc2lvbi9wcmljZV90b3dhcmRzP3VybD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkgKyAiJnZlcj0xJmZvcm1hdD1qc29uJmZwPSIgKyBmcCArICImZGZwPSIgKyBkZnAgKyAiJnVuaW9uPXVuaW9uX2d3ZGFuZyZmcm9tX2RldmljZT1jaHJvbWUmdmVyc2lvbj0iICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7CiAgICAgICAgICAgIEh0dHAuSnFHZXQocm9vdCwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5QmlsaUltZyA9IGZ1bmN0aW9uKGFpZCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgSHR0cC5nZXREYXRhKHRoaXMuYmlsaUluZm8gKyAiP2FpZD0iICsgYWlkLCBjYWxsYmFjayk7CiAgICAgICAgfSwgUm91dGUucXVlcnlCaWxpRG93biA9IGZ1bmN0aW9uKGFpZCwgY2lkLCBjYWxsYmFjaykgewogICAgICAgICAgICBIdHRwLmdldERhdGEodGhpcy5iaWxpZG93biArICI/Y2lkPSIgKyBjaWQgKyAiJmF2aWQ9IiArIGFpZCArICImcW49MTEyIiwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5Q291cG9ucyA9IGZ1bmN0aW9uKGl0ZW1JZCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5iYXNlQXBpKHRoaXMuY291cG9ucywgbmV3IE1hcChbIFsgImlkIiwgaXRlbUlkIF0gXSksIGNhbGxiYWNrKTsKICAgICAgICB9LCBSb3V0ZS5xdWVyeUpkQ291cG9ucyA9IGZ1bmN0aW9uKGl0ZW1JZCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgUm91dGUuYmFzZUFwaShSb3V0ZS5qZF9jb3Vwb25zLCBuZXcgTWFwKFsgWyAiaXRlbV9pZCIsIGl0ZW1JZCBdIF0pLCBjYWxsYmFjayk7CiAgICAgICAgfSwgUm91dGUucXVlcnlTbkNvdXBvbnMgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIFJvdXRlLmJhc2VBcGkoUm91dGUuc25fY291cG9ucywgbmV3IE1hcChbIFsgInVybCIsIHVybCBdIF0pLCBjYWxsYmFjayk7CiAgICAgICAgfSwgUm91dGUucXVlcnlWcENvdXBvbnMgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIFJvdXRlLmJhc2VBcGkoUm91dGUudnBfY291cG9ucywgbmV3IE1hcChbIFsgInVybCIsIHVybCBdIF0pLCBjYWxsYmFjayk7CiAgICAgICAgfSwgUm91dGUuY291cG9uUXVlcnkgPSBmdW5jdGlvbihpdGVtSWQsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIFJvdXRlLmJhc2VBcGkoIi9jb3Vwb25zL2luZm8iLCBuZXcgTWFwKFsgWyAiaWQiLCBpdGVtSWQgXSwgWyAidHlwZSIsIHR5cGUgXSBdKSwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnVwZGF0ZV9hcGkgPSAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL21heHpoYW5nNjY2L09uZUtleVZpcC9PbmVLZXlWaXAudXNlci5qcz90PSIgKyBDb3JlLnV1aWQoKSwgCiAgICAgICAgUm91dGUuaG9tZV91cmwgPSAiaHR0cHM6Ly93aWtpLndhbmRoaS5jb20iLCBSb3V0ZS5pbnN0YWxsX3VybF9vbmUgPSAiaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM4NDUzOCIsIAogICAgICAgIFJvdXRlLmluc3RhbGxfdXJsX3R3byA9ICJodHRwczovL3NjcmlwdGNhdC5vcmcvc2NyaXB0LXNob3ctcGFnZS83MiIsIFJvdXRlLnN4Yl9hbmhhbyA9ICJodHRwOi8vd3d3LmxlbHVud2VuLmNvbS9lL2FjdGlvbi9MaXN0SW5mby8/Y2xhc3NpZD00NSIsIAogICAgICAgIFJvdXRlLnN4Yl9rZXkgPSAic3hiX2FuaGFvIiwgUm91dGUuY29uZmlnID0gIi9jb25maWcvcXVlcnkiLCBSb3V0ZS5oaXN0b3J5ID0gIi9oaXN0b3J5LyIsIAogICAgICAgIFJvdXRlLmhpc3Rvcnl2MSA9ICIvaGlzdG9yeS92MSIsIFJvdXRlLmhpc3Rvcnl2MiA9ICIvaGlzdG9yeS92MiIsIFJvdXRlLmhpc3Rvcnl2MyA9ICIvaGlzdG9yeS92MyIsIAogICAgICAgIFJvdXRlLmJpbGkgPSAiL3Rvb2xzL2JpbGkiLCBSb3V0ZS5iaWxpSW5mbyA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXciLCAKICAgICAgICBSb3V0ZS5iaWxpZG93biA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybCIsIFJvdXRlLmNvdXBvbnMgPSAiL3RiL2luZm9zLyIsIAogICAgICAgIFJvdXRlLmxpa2UgPSAiL3RiL2d1ZXNzbGlrZSIsIFJvdXRlLmpkX2NvdXBvbnMgPSAiL2pkL2luZm8iLCBSb3V0ZS5zbl9jb3Vwb25zID0gIi9zbi9pbmZvIiwgCiAgICAgICAgUm91dGUudnBfY291cG9ucyA9ICIvdnAvaW5mbyIsIFJvdXRlOwogICAgfSgpLCBUb2FzdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIFRvYXN0KG1zZywgdGl0bGUsIHR5cGUpIHsKICAgICAgICAgICAgdGhpcy5jcmVhdGlvblRpbWUgPSBuZXcgRGF0ZSwgdGhpcy5tZXNzYWdlID0gbXNnLCB0aGlzLnR5cGUgPSB0eXBlLCB0aGlzLnRpdGxlID0gdGl0bGUsIAogICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gM2UzLCB0aGlzLnJhbmRvbUtleSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiArIDEpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFRvYXN0LnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIFRvYXN0LmNvbnRhaW5lclZNLmNhcmRzLnNwbGljZSgwLCAwLCB0aGlzKSwgdm9pZCAwICE9PSB0aGlzLmR1cmF0aW9uICYmIC0xICE9IHRoaXMuZHVyYXRpb24gJiYgc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZGlzbWlzcygpOwogICAgICAgICAgICB9KSwgdGhpcy5kdXJhdGlvbik7CiAgICAgICAgfSwgVG9hc3QucHJvdG90eXBlLmRpc21pc3MgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVG9hc3QuY29udGFpbmVyVk0uY2FyZHMuaW5jbHVkZXModGhpcykgJiYgVG9hc3QuY29udGFpbmVyVk0uY2FyZHMuc3BsaWNlKFRvYXN0LmNvbnRhaW5lclZNLmNhcmRzLmluZGV4T2YodGhpcyksIDEpOwogICAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb2FzdC5wcm90b3R5cGUsICJlbGVtZW50IiwgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICQoIi50b2FzdC1jYXJkW2RhdGEta2V5PSciICsgdGhpcy5rZXkgKyAiJ10iKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW51bWVyYWJsZTogITEsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvYXN0LnByb3RvdHlwZSwgImtleSIsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0aW9uVGltZS50b0lTT1N0cmluZygpICsgIlsiICsgdGhpcy5yYW5kb21LZXkgKyAiXSI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb2FzdCwgImNvbnRhaW5lclZNIiwgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudCB8fCBUb2FzdC5jcmVhdGVUb2FzdENvbnRhaW5lcigpLCB0aGlzLmVsZW1lbnQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgfSksIFRvYXN0LmNyZWF0ZVRvYXN0Q29udGFpbmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50b2FzdC1jYXJkLWNvbnRhaW5lciIpIHx8IChkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwgJzx0cmFuc2l0aW9uLWdyb3VwIGNsYXNzPSJ0b2FzdC1jYXJkLWNvbnRhaW5lciIgbmFtZT0idG9hc3QtY2FyZC1jb250YWluZXIiIHRhZz0iZGl2Ij5cbiAgICAgICAgICAgICAgICAgICAgPHRvYXN0LWNhcmQgdi1mb3I9ImNhcmQgb2YgY2FyZHMiIDpkYXRhLWtleT0iY2FyZC5rZXkiIDprZXk9ImNhcmQua2V5IiA6Y2FyZD0iY2FyZCI+PC90b2FzdC1jYXJkPlxuICAgICAgICAgICAgICAgIDwvdHJhbnNpdGlvbi1ncm91cD4nKSwgCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsICc8c3R5bGU+LnRvYXN0LWNhcmQtY29udGFpbmVyey0tY2FyZC1taW4td2lkdGg6MjQwcHg7LS1jYXJkLW1pbi13aWR0aC1uZWdhdGl2ZTotMjQwcHg7cG9zaXRpb246Zml4ZWQ7bGVmdDowO2JvdHRvbTowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZTthbGlnbi1pdGVtczpzdGFydDtwYWRkaW5nLWxlZnQ6MTZweDt6LWluZGV4OjEwMDAwMTtwb2ludGVyLWV2ZW50czpub25lO292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RyYW5zaXRpb246LjJzIGVhc2Utb3V0fS50b2FzdC1jYXJkLWNvbnRhaW5lciAqe3BvaW50ZXItZXZlbnRzOmluaXRpYWw7dHJhbnNpdGlvbjouMnMgZWFzZS1vdXR9LnRvYXN0LWNhcmQudG9hc3QtY2FyZC1jb250YWluZXItZW50ZXIsLnRvYXN0LWNhcmQudG9hc3QtY2FyZC1jb250YWluZXItbGVhdmUtdG97b3BhY2l0eTowO3RyYW5zZm9ybTp0cmFuc2xhdGVYKHZhcigtLWNhcmQtbWluLXdpZHRoLW5lZ2F0aXZlKSl9LnRvYXN0LWNhcmR7YmFja2dyb3VuZDojZmZmO21pbi13aWR0aDp2YXIoLS1jYXJkLW1pbi13aWR0aCk7bWF4LXdpZHRoOjYwdnc7bWluLWhlaWdodDo5NnB4O21hcmdpbjo4cHggMDtib3gtc2hhZG93OnJnYmEoMCwwLDAsLjIpIDAgNHB4IDhweCAwO3RyYW5zZm9ybS1vcmlnaW46bGVmdDtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDt0cmFuc2l0aW9uOi4zcyBjdWJpYy1iZXppZXIoLjE4LC44OSwuMzIsMS4yOCk7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyLWxlZnQtd2lkdGg6MDtwYWRkaW5nLWxlZnQ6dmFyKC0tY29ybmVyLXJhZGl1cyk7Ym9yZGVyLXJhZGl1czp2YXIoLS1jb3JuZXItcmFkaXVzKX0udG9hc3QtY2FyZC50b2FzdC1jYXJkLWNvbnRhaW5lci1sZWF2ZS1hY3RpdmV7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNpdGlvbjouM3MgY3ViaWMtYmV6aWVyKC42LC0uMjgsLjc0LC4wNSl9LnRvYXN0LWNhcmQtaGVhZGVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXJ9LnRvYXN0LWNhcmQtdGl0bGV7Zm9udC1zaXplOjE4cHg7Y29sb3I6IzAwMDtvcGFjaXR5Oi41O21hcmdpbjoxNnB4O2ZvbnQtd2VpZ2h0OjcwMDtmbGV4OjEgMSBhdXRvfS50b2FzdC1jYXJkLWRpc21pc3N7aGVpZ2h0OjI0cHg7d2lkdGg6MjRweDtmbGV4OjAgMCBhdXRvO3BhZGRpbmc6MTZweDtjdXJzb3I6cG9pbnRlcjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjouMnMgZWFzZS1vdXQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7b3BhY2l0eTouNTtib3gtc2l6aW5nOmNvbnRlbnQtYm94fS50b2FzdC1jYXJkLWRpc21pc3M6aG92ZXJ7dHJhbnNmb3JtOnNjYWxlKDEuMil9LnRvYXN0LWNhcmQtZGlzbWlzczphY3RpdmV7dHJhbnNmb3JtOnNjYWxlKDEuMSl9LnRvYXN0LWNhcmQtbWVzc2FnZXtjb2xvcjojMDAwO2ZvbnQtc2l6ZToxNHB4O21hcmdpbjowIDE2cHggMTZweDt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2xpbmUtaGVpZ2h0OjEuNTtmbGV4LXdyYXA6d3JhcDt3b3JkLWJyZWFrOmJyZWFrLWFsbDttYXgtaGVpZ2h0OjIwMHB4O292ZXJmbG93OmF1dG99LnRvYXN0LWNhcmQudG9hc3QtZGVmYXVsdHtib3JkZXItbGVmdC1jb2xvcjojNDQ0fS50b2FzdC1jYXJkLnRvYXN0LWVycm9ye2JvcmRlci1sZWZ0LWNvbG9yOiNmNDQzMzZ9LnRvYXN0LWNhcmQudG9hc3QtaW5mb3tib3JkZXItbGVmdC1jb2xvcjojMjE5NmYzfS50b2FzdC1jYXJkLnRvYXN0LXN1Y2Nlc3N7Ym9yZGVyLWxlZnQtY29sb3I6IzhiYzM0YX0udG9hc3QtY2FyZCAudG9hc3QtY2FyZC1ib3JkZXJ7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6NHB4O2JvcmRlci1yYWRpdXM6dmFyKC0tY29ybmVyLXJhZGl1cyk7aGVpZ2h0OmNhbGMoMTAwJSAtIDEwcHgpO3dpZHRoOnZhcigtLWNvcm5lci1yYWRpdXMpO3RvcDo1cHg7bGVmdDowfS50b2FzdC1jYXJkLnRvYXN0LWRlZmF1bHQgLnRvYXN0LWNhcmQtYm9yZGVye2JhY2tncm91bmQtY29sb3I6IzQ0NH0udG9hc3QtY2FyZC50b2FzdC1lcnJvciAudG9hc3QtY2FyZC1ib3JkZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS50b2FzdC1jYXJkLnRvYXN0LWluZm8gLnRvYXN0LWNhcmQtYm9yZGVye2JhY2tncm91bmQtY29sb3I6IzIxOTZmM30udG9hc3QtY2FyZC50b2FzdC1zdWNjZXNzIC50b2FzdC1jYXJkLWJvcmRlcntiYWNrZ3JvdW5kLWNvbG9yOiM4YmMzNGF9LnRvYXN0LWNhcmQgLmxpbmssLnRvYXN0LWNhcmQgc3BhbntkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjRweCA2cHg7bWFyZ2luOjAgMnB4O2JhY2tncm91bmQtY29sb3I6Izg4ODI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6IzAwMDt0cmFuc2l0aW9uOi4ycyBlYXNlLW91dDtib3JkZXItcmFkaXVzOnZhcigtLWNvcm5lci1yYWRpdXMpfS50b2FzdC1jYXJkIC5saW5rOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izg4ODN9LnRvYXN0LWNhcmQgLmxpbms6YWN0aXZle2JhY2tncm91bmQtY29sb3I6Izg4ODR9LnRvYXN0LWNhcmQgLmRvd25sb2FkLWxpbmt7Y29sb3I6aW5oZXJpdCFpbXBvcnRhbnQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt3b3JkLWJyZWFrOmJyZWFrLWFsbH1Aa2V5ZnJhbWVzIGxvYWRpbmd7MCUsMTAwJXt0b3A6MDtsZWZ0OjUwJX0yNSV7dG9wOjUwJTtsZWZ0OjEwMCV9NTAle3RvcDoxMDAlO2xlZnQ6NTAlfTc1JXt0b3A6NTAlO2xlZnQ6MH19LnRvYXN0LWNhcmQgLmxvYWRpbmd7d2lkdGg6MTRweDtoZWlnaHQ6MTRweDtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6MTRweDtwb3NpdGlvbjpyZWxhdGl2ZX0udG9hc3QtY2FyZCAubG9hZGluZzo6YWZ0ZXJ7Y29udGVudDoiIjt3aWR0aDoxMHB4O2hlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6Izg4ODQ7Ym9yZGVyLXJhZGl1czo1MCU7ZGlzcGxheTpibG9jazt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6NTAlO2FuaW1hdGlvbjoxcyBjdWJpYy1iZXppZXIoLjIyLC42MSwuMzYsMSkgaW5maW5pdGUgbG9hZGluZ308L3N0eWxlPicpLCAKICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IFZ1ZV9fZGVmYXVsdC5kZWZhdWx0KHsKICAgICAgICAgICAgICAgIGVsOiAiLnRvYXN0LWNhcmQtY29udGFpbmVyIiwKICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHsKICAgICAgICAgICAgICAgICAgICAidG9hc3QtY2FyZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsgImNhcmQiIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz0idG9hc3QtY2FyZCBpY29ucy1lbmFibGVkIHZpc2libGUiIDpjbGFzcz0iXCd0b2FzdC1cJyArIGNhcmQudHlwZSI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9hc3QtY2FyZC1ib3JkZXIiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvYXN0LWNhcmQtaGVhZGVyIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPSJ0b2FzdC1jYXJkLXRpdGxlIj57e2NhcmQudGl0bGV9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvYXN0LWNhcmQtZGlzbWlzcyIgQGNsaWNrPSJjYXJkLmRpc21pc3MoKSI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHN0eWxlPSJ3aWR0aDoyMnB4O2hlaWdodDoyMnB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xOSw2LjQxTDE3LjU5LDVMMTIsMTAuNTlMNi40MSw1TDUsNi40MUwxMC41OSwxMkw1LDE3LjU5TDYuNDEsMTlMMTIsMTMuNDFMMTcuNTksMTlMMTksMTcuNTlMMTMuNDEsMTJMMTksNi40MVoiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2FzdC1jYXJkLW1lc3NhZ2UiIHYtaHRtbD0iY2FyZC5tZXNzYWdlIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PicKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgIGNhcmRzOiBbXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgVG9hc3QuaW50ZXJuYWxTaG93ID0gZnVuY3Rpb24obXNnLCB0aXRsZSwgdGltZSwgZSkgewogICAgICAgICAgICB2YXIgbiA9IG5ldyBUb2FzdChtc2csIHRpdGxlLCBlKTsKICAgICAgICAgICAgcmV0dXJuIG4uZHVyYXRpb24gPSB0aW1lLCBuLnNob3coKSwgbjsKICAgICAgICB9LCBUb2FzdC5zaG93ID0gZnVuY3Rpb24obXNnLCB0aXRsZSwgdGltZSkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0aW1lICYmICh0aW1lID0gLTEpLCB0aGlzLmludGVybmFsU2hvdyhtc2csIHRpdGxlLCB0aW1lLCBUb2FzdFR5cGUuRGVmYXVsdCk7CiAgICAgICAgfSwgVG9hc3QuaW5mbyA9IGZ1bmN0aW9uKG1zZywgdGl0bGUsIHRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IC0xKSwgdGhpcy5pbnRlcm5hbFNob3cobXNnLCB0aXRsZSwgdGltZSwgVG9hc3RUeXBlLkluZm8pOwogICAgICAgIH0sIFRvYXN0LnN1Y2Nlc3MgPSBmdW5jdGlvbihtc2csIHRpdGxlLCB0aW1lKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHRpbWUgJiYgKHRpbWUgPSAtMSksIHRoaXMuaW50ZXJuYWxTaG93KG1zZywgdGl0bGUsIHRpbWUsIFRvYXN0VHlwZS5TdWNjZXNzKTsKICAgICAgICB9LCBUb2FzdC5lcnJvciA9IGZ1bmN0aW9uKG1zZywgdGl0bGUsIHRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IC0xKSwgdGhpcy5pbnRlcm5hbFNob3cobXNnLCB0aXRsZSwgdGltZSwgVG9hc3RUeXBlLkVycm9yKTsKICAgICAgICB9LCBUb2FzdDsKICAgIH0oKSwgVG9hc3RUeXBlOwogICAgZnVuY3Rpb24gc3R5bGVJbmplY3QoY3NzLCByZWYpIHsKICAgICAgICB2b2lkIDAgPT09IHJlZiAmJiAocmVmID0ge30pOwogICAgICAgIHZhciBpbnNlcnRBdCA9IHJlZi5pbnNlcnRBdDsKICAgICAgICBpZiAoY3NzICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBkb2N1bWVudCkgewogICAgICAgICAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSwgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgICAgICBzdHlsZS50eXBlID0gInRleHQvY3NzIiwgInRvcCIgPT09IGluc2VydEF0ICYmIGhlYWQuZmlyc3RDaGlsZCA/IGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBoZWFkLmZpcnN0Q2hpbGQpIDogaGVhZC5hcHBlbmRDaGlsZChzdHlsZSksIAogICAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0ID8gc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzIDogc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7CiAgICAgICAgfQogICAgfQogICAgIWZ1bmN0aW9uKFRvYXN0VHlwZSkgewogICAgICAgIFRvYXN0VHlwZS5EZWZhdWx0ID0gImRlZmF1bHQiLCBUb2FzdFR5cGUuSW5mbyA9ICJpbmZvIiwgVG9hc3RUeXBlLlN1Y2Nlc3MgPSAic3VjY2VzcyIsIAogICAgICAgIFRvYXN0VHlwZS5FcnJvciA9ICJlcnJvciI7CiAgICB9KFRvYXN0VHlwZSB8fCAoVG9hc3RUeXBlID0ge30pKTsKICAgIHZhciBjc3NfMjQ4eiQ1ID0gJ2h0bWwgLmFzaWRlLW5hdnstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7Zm9udC1zaXplOjYyLjUlfWJvZHkgLmFzaWRlLW5hdntmb250LWZhbWlseToiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSwiTWljcm9zb2Z0IFlhSGVpIixBcmlhbCxzYW5zLXNlcmlmO21hcmdpbjowO2ZvbnQtc2l6ZToxLjZyZW07Y29sb3I6IzRlNTQ2Yn0uYXNpZGUtbmF2e3Bvc2l0aW9uOmZpeGVkO3RvcDozNTBweDt3aWR0aDoyNjBweDtoZWlnaHQ6MjYwcHg7LXdlYmtpdC1maWx0ZXI6dXJsKCNnb28pO2ZpbHRlcjp1cmwoI2dvbyk7LW1zLXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO29wYWNpdHk6Ljc1O3otaW5kZXg6MjAxODA4MTd9LmFzaWRlLW5hdi5uby1maWx0ZXJ7LXdlYmtpdC1maWx0ZXI6bm9uZTtmaWx0ZXI6bm9uZX0uYXNpZGUtbmF2IC5hc2lkZS1tZW51e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjcwcHg7aGVpZ2h0OjcwcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjUwJTtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiNmMzQ0NDQ7bGVmdDowO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bWFyZ2luOmF1dG87dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6NzBweDtjb2xvcjojZmZmO2ZvbnQtc2l6ZToyMHB4O3otaW5kZXg6MTtjdXJzb3I6bW92ZX0uYXNpZGUtbmF2IC5tZW51LWl0ZW17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NjBweDtoZWlnaHQ6NjBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjc2NzY7bGVmdDowO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bWFyZ2luOmF1dG87bGluZS1oZWlnaHQ6NjBweDt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LWJvcmRlci1yYWRpdXM6NTAlO2JvcmRlci1yYWRpdXM6NTAlO3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiNmZmY7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjVzLC13ZWJraXQtdHJhbnNmb3JtIC42czt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjVzLC13ZWJraXQtdHJhbnNmb3JtIC42czstbW96LXRyYW5zaXRpb246dHJhbnNmb3JtIC42cyxiYWNrZ3JvdW5kIC41cywtbW96LXRyYW5zZm9ybSAuNnM7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjZzLGJhY2tncm91bmQgLjVzO3RyYW5zaXRpb246dHJhbnNmb3JtIC42cyxiYWNrZ3JvdW5kIC41cywtd2Via2l0LXRyYW5zZm9ybSAuNnMsLW1vei10cmFuc2Zvcm0gLjZzO2ZvbnQtc2l6ZToxNHB4Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH0uYXNpZGUtbmF2IC5tZW51LWl0ZW06aG92ZXJ7YmFja2dyb3VuZDojYTljNzM0fS5hc2lkZS1uYXYgLm1lbnUtbGluZXtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmctdG9wOjEwcHh9LmFzaWRlLW5hdjpob3ZlcntvcGFjaXR5OjF9LmFzaWRlLW5hdjpob3ZlciAuYXNpZGUtbWVudXstd2Via2l0LWFuaW1hdGlvbjpqZWxsbyAxczstbW96LWFuaW1hdGlvbjpqZWxsbyAxczthbmltYXRpb246amVsbG8gMXN9LmFzaWRlLW5hdjpob3ZlciAubWVudS1maXJzdHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMzUlLDApOy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEzNSUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEzNSUsMCl9LmFzaWRlLW5hdjpob3ZlciAubWVudS1zZWNvbmR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTIwJSwtNzAlLDApOy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEyMCUsLTcwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTIwJSwtNzAlLDApfS5hc2lkZS1uYXY6aG92ZXIgLm1lbnUtdGhpcmR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTIwJSw3MCUsMCk7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTIwJSw3MCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEyMCUsNzAlLDApfS5hc2lkZS1uYXY6aG92ZXIgLm1lbnUtZm91cnRoey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTM1JSwwKTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEzNSUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTM1JSwwKX1ALXdlYmtpdC1rZXlmcmFtZXMgamVsbG97ZnJvbSwxMS4xJSx0b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTIyLjIley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyl9MzMuMyV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyk7dHJhbnNmb3JtOnNrZXdYKDYuMjVkZWcpIHNrZXdZKDYuMjVkZWcpfTQ0LjQley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0zLjEyNWRlZykgc2tld1koLTMuMTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpfTU1LjUley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpfTY2LjYley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0uNzgxMjVkZWcpIHNrZXdZKC0uNzgxMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKX03Ny43JXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpO3RyYW5zZm9ybTpza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpfTg4Ljgley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLS4xOTUzMTI1ZGVnKSBza2V3WSgtLjE5NTMxMjVkZWcpfX1ALW1vei1rZXlmcmFtZXMgamVsbG97ZnJvbSwxMS4xJSx0b3stbW96LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTIyLjIley1tb3otdHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyl9MzMuMyV7LW1vei10cmFuc2Zvcm06c2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyk7dHJhbnNmb3JtOnNrZXdYKDYuMjVkZWcpIHNrZXdZKDYuMjVkZWcpfTQ0LjQley1tb3otdHJhbnNmb3JtOnNrZXdYKC0zLjEyNWRlZykgc2tld1koLTMuMTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpfTU1LjUley1tb3otdHJhbnNmb3JtOnNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpfTY2LjYley1tb3otdHJhbnNmb3JtOnNrZXdYKC0uNzgxMjVkZWcpIHNrZXdZKC0uNzgxMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKX03Ny43JXstbW96LXRyYW5zZm9ybTpza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpO3RyYW5zZm9ybTpza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpfTg4Ljgley1tb3otdHJhbnNmb3JtOnNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLS4xOTUzMTI1ZGVnKSBza2V3WSgtLjE5NTMxMjVkZWcpfX1Aa2V5ZnJhbWVzIGplbGxve2Zyb20sMTEuMSUsdG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTstbW96LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTIyLjIley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7LW1vei10cmFuc2Zvcm06c2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKTt0cmFuc2Zvcm06c2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKX0zMy4zJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKTstbW96LXRyYW5zZm9ybTpza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyl9NDQuNCV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpOy1tb3otdHJhbnNmb3JtOnNrZXdYKC0zLjEyNWRlZykgc2tld1koLTMuMTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpfTU1LjUley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTstbW96LXRyYW5zZm9ybTpza2V3WCgxLjU2MjVkZWcpIHNrZXdZKDEuNTYyNWRlZyk7dHJhbnNmb3JtOnNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKX02Ni42JXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKTstbW96LXRyYW5zZm9ybTpza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLS43ODEyNWRlZykgc2tld1koLS43ODEyNWRlZyl9NzcuNyV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goMC4zOTA2MjVkZWcpIHNrZXdZKDAuMzkwNjI1ZGVnKTstbW96LXRyYW5zZm9ybTpza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpO3RyYW5zZm9ybTpza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpfTg4Ljgley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKTstbW96LXRyYW5zZm9ybTpza2V3WCgtLjE5NTMxMjVkZWcpIHNrZXdZKC0uMTk1MzEyNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKX19LmFuaW1hdGVkey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjFzOy1tb3otYW5pbWF0aW9uLWR1cmF0aW9uOjFzO2FuaW1hdGlvbi1kdXJhdGlvbjoxczstd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6Ym90aDstbW96LWFuaW1hdGlvbi1maWxsLW1vZGU6Ym90aDthbmltYXRpb24tZmlsbC1tb2RlOmJvdGh9XG5ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5VcHtmcm9tLDYwJSw3NSUsOTAlLHRvey13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSl9ZnJvbXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw4MDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw4MDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19QC1tb3ota2V5ZnJhbWVzIGJvdW5jZUluVXB7ZnJvbSw2MCUsNzUlLDkwJSx0b3stbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfWZyb217b3BhY2l0eTowOy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsODAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsODAwcHgsMCl9NjAle29wYWNpdHk6MTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTc1JXstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCl9dG97LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9fUBrZXlmcmFtZXMgYm91bmNlSW5VcHtmcm9tLDYwJSw3NSUsOTAlLHRvey13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKX1mcm9te29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDgwMHB4LDApOy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsODAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsODAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApOy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApOy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19LmJvdW5jZUluVXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJblVwOy1tb3otYW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5VcDthbmltYXRpb24tbmFtZTpib3VuY2VJblVwOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OjFzOy1tb3otYW5pbWF0aW9uLWRlbGF5OjFzO2FuaW1hdGlvbi1kZWxheToxc31AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjY0MHB4KXt9QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDo2NDFweCkgYW5kIChtYXgtd2lkdGg6MTM2N3B4KXsuYXNpZGUtbmF2e3RvcDo1MHB4fX0nLCBDb21tb247CiAgICBzdHlsZUluamVjdChjc3NfMjQ4eiQ1KSwgZnVuY3Rpb24oQ29tbW9uKSB7CiAgICAgICAgdmFyIE1lbnUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gTWVudSgpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29yZSA9IG5ldyBDb3JlLCB0aGlzLnNpdGUgPSAvdHYud2FuZGhpLmNvbS9pLCB0aGlzLnVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQsIAogICAgICAgICAgICAgICAgdGhpcy5tZW51c0NsYXNzID0gWyAiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIiwgImZvdXJ0aCIsICJmaWZ0aCIgXSwgdGhpcy5tZW51U2VsZWN0ZXIgPSAiI1dhbmRoaS1uYXYiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBNZW51LnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCBNZW51LnByb3RvdHlwZS5nZXRCb2R5ID0gZnVuY3Rpb24ob3B0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzxzdmcgd2lkdGg9IjAiIGhlaWdodD0iMCI+PGRlZnM+PGZpbHRlciBpZD0iZ29vIj48ZmVHYXVzc2lhbkJsdXIgaW49IlNvdXJjZUdyYXBoaWMiIHN0ZERldmlhdGlvbj0iMTAiIHJlc3VsdD0iYmx1ciI+PC9mZUdhdXNzaWFuQmx1cj48ZmVDb2xvck1hdHJpeCBpbj0iYmx1ciIgbW9kZT0ibWF0cml4IiB2YWx1ZXM9IjEgMCAwIDAgMCAgMCAxIDAgMCAwICAwIDAgMSAwIDAgIDAgMCAwIDE5IC05IiByZXN1bHQ9ImdvbyI+PC9mZUNvbG9yTWF0cml4PjxmZUNvbXBvc2l0ZSBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJnb28iIG9wZXJhdG9yPSJhdG9wIj48L2ZlQ29tcG9zaXRlPjwvZmlsdGVyPjwvZGVmcz48L3N2Zz48ZGl2IGNsYXNzPSJhc2lkZS1uYXYgYm91bmNlSW5VcCBhbmltYXRlZCIgaWQ9IldhbmRoaS1uYXYiPjxsYWJlbCBmb3I9IiIgY2xhc3M9ImFzaWRlLW1lbnUiIHRpdGxlPSJcdTYzMDlcdTRmNGZcdTYyZDZcdTUyYTgiPlZJUDwvbGFiZWw+JyArIG9wdGlvbiArICI8L2Rpdj4iOwogICAgICAgICAgICB9LCBNZW51LnByb3RvdHlwZS5Jbml0ID0gZnVuY3Rpb24obWVudXMsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKCFDb3JlLmluSWZyYW1lKCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlcigpOwogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICBtZW51cy5mb3JFYWNoKChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgdGl0bGU9IicgKyBlbGVtZW50LnRpdGxlICsgJyIgZGF0YS1jYXQ9IicgKyBlbGVtZW50LnR5cGUgKyAnIiBjbGFzcz0ibWVudS1pdGVtIG1lbnUtbGluZSBtZW51LScgKyBfdGhpcy5tZW51c0NsYXNzW2luZGV4XSArICciPicgKyBlbGVtZW50LnNob3cgKyAiPC9hPiI7CiAgICAgICAgICAgICAgICAgICAgfSkpLCBDb3JlLmJvZHlBcHBlbmQodGhpcy5nZXRCb2R5KHN0cikpLCAvU2FmYXJpfGlQaG9uZS9pLnRlc3QodGhpcy51c2VyQWdlbnQpICYmIC9jaHJvbWUvaS50ZXN0KHRoaXMudXNlckFnZW50KSAmJiAkKCIjV2FuZGhpLW5hdiIpLmFkZENsYXNzKCJuby1maWx0ZXIiKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZHJhZ3MgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvd246ICExLAogICAgICAgICAgICAgICAgICAgICAgICB4OiAwLAogICAgICAgICAgICAgICAgICAgICAgICB5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICB3aW5XaWQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbkhlaTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50WDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50WTogMAogICAgICAgICAgICAgICAgICAgIH0sIGFzaWRlTmF2ID0gJCh0aGlzLm1lbnVTZWxlY3RlcilbMF07CiAgICAgICAgICAgICAgICAgICAgJCgiYm9keSIpLm9uKCJtb3VzZWRvd24iLCAiIiArIHRoaXMubWVudVNlbGVjdGVyLCAoZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0Q3NzID0gZnVuY3Rpb24oYSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gKF9iID0gbnVsbCA9PT0gKF9hID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5nZXRDb21wdXRlZFN0eWxlKGEsIG51bGwpW2VdKSAmJiB2b2lkIDAgIT09IF9iID8gX2IgOiBudWxsICE9PSAoX2MgPSBhLmN1cnJlbnRTdHlsZSkgJiYgdm9pZCAwICE9PSBfYyA/IF9jIDogYS5jdXJyZW50U3R5bGVbZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdzLmRvd24gPSAhMCwgZHJhZ3MuY2xpZW50WCA9IGEuY2xpZW50WCwgZHJhZ3MuY2xpZW50WSA9IGEuY2xpZW50WSwgZHJhZ3MueCA9IHBhcnNlSW50KGdldENzcyh0aGlzLCAibGVmdCIpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdzLnkgPSBwYXJzZUludChnZXRDc3ModGhpcywgInRvcCIpKSwgZHJhZ3Mud2luSGVpID0gJCh3aW5kb3cpLmhlaWdodCgpLCBkcmFncy53aW5XaWQgPSAkKHdpbmRvdykud2lkdGgoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJtb3VzZW1vdmUiLCAoZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhLmNsaWVudFggLSBkcmFncy5jbGllbnRYLCB0ID0gYS5jbGllbnRZIC0gZHJhZ3MuY2xpZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc2lkZU5hdiA9IGFzaWRlTmF2IHx8ICQoIiNXYW5kaGktbmF2IilbMF0pLnN0eWxlLnRvcCA9IGRyYWdzLnkgKyB0ICsgInB4IiwgYXNpZGVOYXYuc3R5bGUubGVmdCA9IGRyYWdzLnggKyBlICsgInB4IjsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0pKS5vbigibW91c2V1cCIsICIiICsgdGhpcy5tZW51U2VsZWN0ZXIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ3MuZG93biA9ICExLCAkKGRvY3VtZW50KS5vZmYoIm1vdXNlbW92ZSIpOwogICAgICAgICAgICAgICAgICAgIH0pKSwgY2FsbGJhY2suY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgTWVudS5jbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCgiIyIgKyBNZW51Lm1haW5JZCkuaGlkZSgpOwogICAgICAgICAgICB9LCBNZW51Lm1haW5JZCA9ICJXYW5kaGktbmF2IiwgTWVudTsKICAgICAgICB9KCk7CiAgICAgICAgQ29tbW9uLk1lbnUgPSBNZW51OwogICAgfShDb21tb24gfHwgKENvbW1vbiA9IHt9KSk7CiAgICB2YXIgY29udGFpbmVyID0gbmV3IE1hcCwgQ29udGFpbmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gQ29udGFpbmVyKCkge30KICAgICAgICByZXR1cm4gQ29udGFpbmVyLlJlZ2lzdGUgPSBmdW5jdGlvbih0eXBlLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLnByb2Nlc3NOYW1lKHR5cGUubmFtZSk7CiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuc2V0KGNsYXNzTmFtZSwgd2luZG93LlJlZmxlY3QuY29uc3RydWN0KHR5cGUsIHRoaXMuYnVpbGRQYXJhbXMoYXJncykpKSwgCiAgICAgICAgICAgIGNvbnRhaW5lci5nZXQoY2xhc3NOYW1lKTsKICAgICAgICB9LCBDb250YWluZXIuYnVpbGRQYXJhbXMgPSBmdW5jdGlvbihhcmdzKSB7CiAgICAgICAgICAgIHZhciBwYXJhID0gW107CiAgICAgICAgICAgIHJldHVybiBudWxsID09IGFyZ3MgfHwgYXJncy5tYXAoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICAgIHBhcmEucHVzaChpdGVtKTsKICAgICAgICAgICAgfSkpLCBwYXJhOwogICAgICAgIH0sIENvbnRhaW5lci5wcm9jZXNzTmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICB9LCBDb250YWluZXIuUmVxdWlyZSA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcywgbmFtZSA9IHRoaXMucHJvY2Vzc05hbWUodHlwZS5uYW1lKTsKICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5oYXMobmFtZSkpIHJldHVybiBjb250YWluZXIuZ2V0KG5hbWUpOwogICAgICAgICAgICB2YXIgYXJncywgY2xhc3NQYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX1BBUkFNUywgdHlwZSk7CiAgICAgICAgICAgIHJldHVybiAobnVsbCA9PSBjbGFzc1BhcmFtcyA/IHZvaWQgMCA6IGNsYXNzUGFyYW1zLmxlbmd0aCkgJiYgKGFyZ3MgPSBjbGFzc1BhcmFtcy5tYXAoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5SZXF1aXJlKGl0ZW0pOwogICAgICAgICAgICB9KSkpLCB0aGlzLlJlZ2lzdGUodHlwZSwgYXJncyk7CiAgICAgICAgfSwgQ29udGFpbmVyLmRlZmluZSA9IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7CiAgICAgICAgICAgIHZhciBfYSwgY2xhc3NUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9UWVBFLCB0YXJnZXQsIGtleSksIGRlc2MgPSBudWxsICE9PSAoX2EgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSkgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogewogICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICB9OwogICAgICAgICAgICBkZXNjLnZhbHVlID0gdGhpcy5SZXF1aXJlKGNsYXNzVHlwZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzYyk7CiAgICAgICAgfSwgQ29udGFpbmVyOwogICAgfSgpLCBNRVRBREFUQV9UWVBFID0gImRlc2lnbjp0eXBlIiwgTUVUQURBVEFfUEFSQU1TID0gImRlc2lnbjpwYXJhbXR5cGVzIjsKICAgIGZ1bmN0aW9uIFdhbmRoaUF1dG8odGFyZ2V0LCBrZXkpIHsKICAgICAgICBDb250YWluZXIuZGVmaW5lKHRhcmdldCwga2V5KTsKICAgIH0KICAgIHZhciBQbHVnaW5CYXNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gUGx1Z2luQmFzZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fdW5pcXVlID0gITAsIHRoaXMuUHJvY2VzcyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgX3RoaXMubG9hZGVyKCksIF90aGlzLnJ1bigpOwogICAgICAgICAgICB9LCB0aGlzLl9hcHBOYW1lID0gImJhc2UiOwogICAgICAgIH0KICAgICAgICB2YXIgX2EsIF9iOwogICAgICAgIHJldHVybiBQbHVnaW5CYXNlLnByb3RvdHlwZS51bmlxdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VuaXF1ZTsKICAgICAgICB9LCBQbHVnaW5CYXNlLnByb3RvdHlwZS5saW5rVGVzdCA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB1cmwgfHwgKHVybCA9IHRoaXMuY29yZS5jdXJyZW50VXJsKCkpOwogICAgICAgICAgICB2YXIgZmxhZyA9ICExOwogICAgICAgICAgICByZXR1cm4gdGhpcy5ydWxlcy5mb3JFYWNoKChmdW5jdGlvbih2LCBrKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXYudGVzdCh1cmwpIHx8IChmbGFnID0gITAsIF90aGlzLnNpdGUgPSBrLCAhMSk7CiAgICAgICAgICAgIH0pKSwgZmxhZzsKICAgICAgICB9LCBQbHVnaW5CYXNlLnByb3RvdHlwZS5hcHBOYW1lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBOYW1lOwogICAgICAgIH0sIF9fZGVjb3JhdGUoWyBXYW5kaGlBdXRvLCBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsICJmdW5jdGlvbiIgPT0gdHlwZW9mIChfYSA9IHZvaWQgMCAhPT0gQ29yZSAmJiBDb3JlKSA/IF9hIDogT2JqZWN0KSBdLCBQbHVnaW5CYXNlLnByb3RvdHlwZSwgImNvcmUiLCB2b2lkIDApLCAKICAgICAgICBfX2RlY29yYXRlKFsgV2FuZGhpQXV0bywgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCAiZnVuY3Rpb24iID09IHR5cGVvZiAoX2IgPSB2b2lkIDAgIT09IENvbW1vbiAmJiBDb21tb24uTWVudSkgPyBfYiA6IE9iamVjdCkgXSwgUGx1Z2luQmFzZS5wcm90b3R5cGUsICJtZW51Iiwgdm9pZCAwKSwgCiAgICAgICAgUGx1Z2luQmFzZTsKICAgIH0oKSwgU2l0ZUVudW07CiAgICAhZnVuY3Rpb24oU2l0ZUVudW0pIHsKICAgICAgICBTaXRlRW51bS5BbGwgPSAiQWxsIiwgU2l0ZUVudW0uVGFvQmFvID0gIlRhb0JhbyIsIFNpdGVFbnVtLlRNYWxsID0gIlRNYWxsIiwgU2l0ZUVudW0uSmluZ0RvbmcgPSAiSmluZ0RvbmciLCAKICAgICAgICBTaXRlRW51bS5JUWlZaSA9ICJJUWlZaSIsIFNpdGVFbnVtLllvdUt1ID0gIllvdUt1IiwgU2l0ZUVudW0uTGVTaGkgPSAiTGVTaGkiLCBTaXRlRW51bS5UdURvdSA9ICJUdURvdSIsIAogICAgICAgIFNpdGVFbnVtLlRlbmNlbnRfViA9ICJUZW5jZW50X1YiLCBTaXRlRW51bS5NYW5nR3VvID0gIk1hbmdHdW8iLCBTaXRlRW51bS5Tb0h1ID0gIlNvSHUiLCAKICAgICAgICBTaXRlRW51bS5BY2Z1biA9ICJBY2Z1biIsIFNpdGVFbnVtLkJpbGlCaWxpID0gIkJpbGlCaWxpIiwgU2l0ZUVudW0uTTE5MDUgPSAiTTE5MDUiLCAKICAgICAgICBTaXRlRW51bS5QUFRWID0gIlBQVFYiLCBTaXRlRW51bS5ZaW5ZdWVUYWkgPSAiWWluWXVlVGFpIiwgU2l0ZUVudW0uV2FuZ1lpID0gIldhbmdZaSIsIAogICAgICAgIFNpdGVFbnVtLlRlbmNlbnRfTSA9ICJUZW5jZW50X00iLCBTaXRlRW51bS5LdUdvdSA9ICJLdUdvdSIsIFNpdGVFbnVtLkt1V28gPSAiS3VXbyIsIAogICAgICAgIFNpdGVFbnVtLlhpYU1pID0gIlhpYU1pIiwgU2l0ZUVudW0uVGFpSGUgPSAiVGFpSGUiLCBTaXRlRW51bS5RaW5nVGluZyA9ICJRaW5nVGluZyIsIAogICAgICAgIFNpdGVFbnVtLkxpWmhpID0gIkxpWmhpIiwgU2l0ZUVudW0uTWlHdSA9ICJNaUd1IiwgU2l0ZUVudW0uWGlNYUxhWWEgPSAiWGlNYUxhWWEiLCAKICAgICAgICBTaXRlRW51bS5XZW5LdSA9ICJXZW5LdSIsIFNpdGVFbnVtLlNYQiA9ICJTWEIiLCBTaXRlRW51bS5CRFkgPSAiQkRZIiwgU2l0ZUVudW0uQkRZMSA9ICJCRFkxIiwgCiAgICAgICAgU2l0ZUVudW0uTFpZID0gIkxaWSIsIFNpdGVFbnVtLlN1TmluZyA9ICJTdU5pbmciLCBTaXRlRW51bS5TdGVhbSA9ICJTdGVhbSIsIFNpdGVFbnVtLlZwID0gIlZwIiwgCiAgICAgICAgU2l0ZUVudW0uQ1NETiA9ICJDU0ROIiwgU2l0ZUVudW0uWmhpSHUgPSAiWmhpSHUiLCBTaXRlRW51bS5KaWFuU2h1ID0gIkppYW5TaHUiOwogICAgfShTaXRlRW51bSB8fCAoU2l0ZUVudW0gPSB7fSkpOwogICAgdmFyIFVwZGF0ZVNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBVcGRhdGVTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5BbGwsIC8oLiopL2kgXSBdKSwgX3RoaXMuX3VuaXF1ZSA9ICExLCAKICAgICAgICAgICAgX3RoaXMuX2FwcE5hbWUgPSAidXBkYXRlIiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoVXBkYXRlU2VydmljZSwgX3N1cGVyKSwgVXBkYXRlU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7fSwgCiAgICAgICAgVXBkYXRlU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghQ29uZmlnLmdldCh1cGRhdGVfa2V5LCAhMSkpIHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50XzEgPSBuZXcgVmVyc2lvbkNvbXBhcihDb25maWcuZW52LnNjcmlwdC52ZXJzaW9uKTsKICAgICAgICAgICAgICAgIEh0dHAuZ2V0X3RleHQoUm91dGUudXBkYXRlX2FwaSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBuZXcgVmVyc2lvbkNvbXBhcihudWxsID09IHJlcyA/IHZvaWQgMCA6IHJlcy5tYXRjaCgvQHZlcnNpb25bIF0qKFtcZFwuXSspLylbMV0pOwogICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmNvbXBhcmVUbyhjdXJyZW50XzEpID09PSBWZXJzaW9uUmVzdWx0LmdyZWF0ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9ICJcdTY1YjBcdTcyNDhcdTY3MmM8c3Bhbj4iICsgdmVyc2lvbi52ZXJzaW9uU3RyaW5nICsgJzwvc3Bhbj5cdTVkZjJcdTUzZDFcdTVlMDMuPGEgaWQ9Im5ldy12ZXJzaW9uLWxpbmsiIGNsYXNzPSJsaW5rIiBocmVmPSInICsgUm91dGUuaW5zdGFsbF91cmxfb25lICsgJyI+XHU1Yjg5XHU4OGM1KFx1N2ViZlx1OGRlZlx1NGUwMCk8L2E+PGEgaWQ9Im5ldy12ZXJzaW9uLWxpbmsiIGNsYXNzPSJsaW5rIiBocmVmPSInICsgUm91dGUuaW5zdGFsbF91cmxfdHdvICsgJyI+XHU1Yjg5XHU4OGM1KFx1N2ViZlx1OGRlZlx1NGU4Yyk8L2E+PGEgY2xhc3M9ImxpbmsiIHRhcmdldD0iX2JsYW5rIiBocmVmPSInICsgUm91dGUuaG9tZV91cmwgKyAnIj5cdTY3ZTVcdTc3MGI8L2E+JzsKICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuaW5mbyhtc2csICJcdTY4YzBcdTY3ZTVcdTY2ZjRcdTY1YjAiKSwgQ29uZmlnLnNldCh1cGRhdGVfa2V5LCAhMCwgSG91cik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgVXBkYXRlU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIFZlcnNpb25Db21wYXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBWZXJzaW9uQ29tcGFyKGUpIHsKICAgICAgICAgICAgL15bXGRcLl0rJC8udGVzdChlKSB8fCBMb2dnZXIuZXJyb3IoIkludmFsaWQgdmVyc2lvbiBzdHJpbmciKSwgdGhpcy5wYXJ0cyA9IGUuc3BsaXQoIi4iKS5tYXAoKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlKTsKICAgICAgICAgICAgfSkpLCB0aGlzLnZlcnNpb25TdHJpbmcgPSBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gVmVyc2lvbkNvbXBhci5wcm90b3R5cGUuY29tcGFyZVRvID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHRoaXMucGFydHMubGVuZ3RoOyArK3QpIHsKICAgICAgICAgICAgICAgIGlmIChlLnBhcnRzLmxlbmd0aCA9PT0gdCkgcmV0dXJuIFZlcnNpb25SZXN1bHQuZ3JlYXRlcjsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnRzW3RdICE9PSBlLnBhcnRzW3RdKSByZXR1cm4gdGhpcy5wYXJ0c1t0XSA+IGUucGFydHNbdF0gPyBWZXJzaW9uUmVzdWx0LmdyZWF0ZXIgOiBWZXJzaW9uUmVzdWx0Lmxlc3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydHMubGVuZ3RoICE9PSBlLnBhcnRzLmxlbmd0aCA/IFZlcnNpb25SZXN1bHQubGVzcyA6IFZlcnNpb25SZXN1bHQuZXF1YWw7CiAgICAgICAgfSwgVmVyc2lvbkNvbXBhci5wcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVUbyhlKSA9PT0gVmVyc2lvblJlc3VsdC5ncmVhdGVyOwogICAgICAgIH0sIFZlcnNpb25Db21wYXIucHJvdG90eXBlLmxlc3NUaGFuID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlVG8oZSkgPT09IFZlcnNpb25SZXN1bHQubGVzczsKICAgICAgICB9LCBWZXJzaW9uQ29tcGFyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVUbyhlKSA9PT0gVmVyc2lvblJlc3VsdC5lcXVhbDsKICAgICAgICB9LCBWZXJzaW9uQ29tcGFyOwogICAgfSgpLCBWZXJzaW9uUmVzdWx0OwogICAgIWZ1bmN0aW9uKFZlcnNpb25SZXN1bHQpIHsKICAgICAgICBWZXJzaW9uUmVzdWx0W1ZlcnNpb25SZXN1bHQubGVzcyA9IC0xXSA9ICJsZXNzIiwgVmVyc2lvblJlc3VsdFtWZXJzaW9uUmVzdWx0LmVxdWFsID0gMF0gPSAiZXF1YWwiLCAKICAgICAgICBWZXJzaW9uUmVzdWx0W1ZlcnNpb25SZXN1bHQuZ3JlYXRlciA9IDFdID0gImdyZWF0ZXIiLCBWZXJzaW9uUmVzdWx0W1ZlcnNpb25SZXN1bHQuaW5jb21wYXJhYmxlID0gTmFOXSA9ICJpbmNvbXBhcmFibGUiOwogICAgfShWZXJzaW9uUmVzdWx0IHx8IChWZXJzaW9uUmVzdWx0ID0ge30pKTsKICAgIHZhciBFdmVudEhlbHBlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIEV2ZW50SGVscGVyKCkge30KICAgICAgICByZXR1cm4gRXZlbnRIZWxwZXIuYmluZF9jbGljayA9IGZ1bmN0aW9uKHF1ZXJ5LCBhY3QpIHsKICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICBudWxsID09PSAoX2EgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHF1ZXJ5KSkgfHwgdm9pZCAwID09PSBfYSB8fCBfYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBhY3QoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEV2ZW50SGVscGVyOwogICAgfSgpLCBCYXNlQ291cG9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gQmFzZUNvdXBvbigpIHt9CiAgICAgICAgcmV0dXJuIEJhc2VDb3Vwb24ucHJvdG90eXBlLmluaXRfcXJjb2RlID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgUVJDb2RlLnRvQ2FudmFzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUtaW1nIiksIHVybCwgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkxldmVsOiAiSCIsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogImltYWdlL2pwZWciLAogICAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IC4zLAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMSwKICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUwCiAgICAgICAgICAgICAgICB9LCAoZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyIHx8IHJlc29sdmUoITApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQmFzZUNvdXBvbi5wcm90b3R5cGUuaW5pdF9jb3Vwb25faW5mbyA9IGZ1bmN0aW9uKGFmdGVyLCBwcmljZSwgdGltZSwgcV91cmwpIHsKICAgICAgICAgICAgdm9pZCAwID09PSBxX3VybCAmJiAocV91cmwgPSAiIik7CiAgICAgICAgICAgIHZhciBjb3VwX2luZm8gPSAiPHA+XHU3OWZiXHU1MmE4XHU3YWVmPHNwYW4+XHU1ZmViXHU2Mzc3PC9zcGFuPlx1OGQyZFx1NGU3MDwvcD4iLCBhY3QgPSAnPGEgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWJ1dHRvbiBxdWFuLW5vbmUiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSI+XHU2MjUzXHU1ZjAwXHU2MjRiXHU2NzNhXHU2MjZiXHU0ZTAwXHU2MjZiPC9hPicsIHVybCA9IFJ1bnRpbWUudXJsOwogICAgICAgICAgICBpZiAocV91cmwpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZTsKICAgICAgICAgICAgICAgIGNvdXBfaW5mbyA9ICI8cD48c3Bhbj4iICsgcHJpY2UgKyAnPC9zcGFuPiBcdTUxNDNcdTUyMzg8L3A+PHAgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWRhdGUiPlx1ZmYwOCcgKyBDb3JlLmZvcm1hdChub3csICJ5eXl5LU1NLWRkIikgKyAiIH4gIiArIHRpbWUgKyAiXHVmZjA5PC9wPiIsIAogICAgICAgICAgICAgICAgYWN0ID0gJzxhIGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1idXR0b24gcXVhbi1leGl0cyI+XHU2MjZiXHU3ODAxXHU5ODg2JyArIHByaWNlICsgIlx1NTE0M1x1NGYxOFx1NjBlMFx1NTIzODwvYT4iLCAKICAgICAgICAgICAgICAgIHVybCA9IHFfdXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICAkKCIudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtdGl0bGUiKS5odG1sKGNvdXBfaW5mbyksICQoIi52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1hY3Rpb24iKS5odG1sKGFjdCksIAogICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9KSkudGhlbigoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBxX3VybCAmJiBFdmVudEhlbHBlci5iaW5kX2NsaWNrKCIudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYnV0dG9uIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIENvcmUub3Blbih1cmwpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQmFzZUNvdXBvbi5wcm90b3R5cGUuZGVmYXVsdCA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2b2lkIDAgPT09IHVybCAmJiAodXJsID0gIiIpLCBMb2dnZXIuZGVidWcodXJsKSwgdGhpcy5pbml0X3FyY29kZSgiIiA9PSB1cmwgPyBSdW50aW1lLnVybCA6IHVybCkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5pbml0X2NvdXBvbl9pbmZvKDAsIDAsICIiKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJhc2VDb3Vwb247CiAgICB9KCksIFZwQ291cG9uID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gVnBDb3Vwb24oKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBfc3VwZXIgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhWcENvdXBvbiwgX3N1cGVyKSwgVnBDb3Vwb24ucHJvdG90eXBlLmluaXRfaHRtbCA9IGZ1bmN0aW9uKGh0bWwpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICBpZiAoJCgiLkZXLXByb2R1Y3QuY2xlYXJmaXgiKS5sZW5ndGgpIENvcmUuYXBwZW5kVG8oIi5GVy1wcm9kdWN0LmNsZWFyZml4IiwgaHRtbCksIAogICAgICAgICAgICAgICAgcmVzb2x2ZSghMCk7IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGF0XzEgPSBfdGhpczsKICAgICAgICAgICAgICAgICAgICBDb3JlLmxhenlsb2FkKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXRfMS5pbml0X2h0bWwoaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgfSksIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgVnBDb3Vwb24ucHJvdG90eXBlLmluaXRfY291cG9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBSb3V0ZS5xdWVyeVZwQ291cG9ucyhSdW50aW1lLnVybCwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgaWYgKExvZ2dlci5kZWJ1ZyhyZXMpLCByZXMuY29kZSkgaWYgKHJlcy5kYXRhLmhhc19jb3Vwb24pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IHJlcy5kYXRhLCBleHAgPSBuZXcgRGF0ZShxLnF1YW5fdGltZSk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9xcmNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KHEucXVhbl9saW5rKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRfY291cG9uX2luZm8ocS5hZnRlcl9wcmljZSwgcS5xdWFuX3ByaWNlLCAiIiArIENvcmUuZm9ybWF0KGV4cCwgInl5eXktTU0tZGQiKSwgZGVjb2RlVVJJQ29tcG9uZW50KHEucXVhbl9saW5rKSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHJlcy5kYXRhLnF1YW5fbGluayA/IChfdGhpcy5kZWZhdWx0KHJlcy5kYXRhLnF1YW5fbGluayksIEV2ZW50SGVscGVyLmJpbmRfY2xpY2soIiN2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUtaW1nIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIENvcmUub3BlbihyZXMuZGF0YS5xdWFuX2xpbmspOwogICAgICAgICAgICAgICAgfSkpKSA6IF90aGlzLmRlZmF1bHQoKTsgZWxzZSBfdGhpcy5kZWZhdWx0KCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBWcENvdXBvbjsKICAgIH0oQmFzZUNvdXBvbiksIFN1bmluZ0NvdXBvbiA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIFN1bmluZ0NvdXBvbigpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKFN1bmluZ0NvdXBvbiwgX3N1cGVyKSwgU3VuaW5nQ291cG9uLnByb3RvdHlwZS5pbml0X2h0bWwgPSBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgaWYgKCQoIi5wcm9pbmZvLWNvbnRhaW5lciIpLmxlbmd0aCkgQ29yZS5hcHBlbmRUbygiLnByb2luZm8tY29udGFpbmVyIiwgaHRtbCksIHJlc29sdmUoITApOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdF8xID0gX3RoaXM7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5sYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0XzEuaW5pdF9odG1sKGh0bWwpOwogICAgICAgICAgICAgICAgICAgIH0pLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFN1bmluZ0NvdXBvbi5wcm90b3R5cGUuaW5pdF9jb3Vwb25zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIFJvdXRlLnF1ZXJ5U25Db3Vwb25zKFJ1bnRpbWUudXJsLCAoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICBpZiAoTG9nZ2VyLmRlYnVnKHJlcyksIHJlcy5jb2RlKSBpZiAocmVzLmRhdGEuaGFzX2NvdXBvbikgewogICAgICAgICAgICAgICAgICAgIHZhciBxID0gcmVzLmRhdGEsIGV4cCA9IG5ldyBEYXRlKHEucXVhbl90aW1lKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5pbml0X3FyY29kZShkZWNvZGVVUklDb21wb25lbnQocS5xdWFuX2xpbmspKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxLmFmdGVyX3ByaWNlLCBxLnF1YW5fcHJpY2UsICIiICsgQ29yZS5mb3JtYXQoZXhwLCAieXl5eS1NTS1kZCIpLCBkZWNvZGVVUklDb21wb25lbnQocS5xdWFuX2xpbmspKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgcmVzLmRhdGEucXVhbl9saW5rID8gKF90aGlzLmRlZmF1bHQocmVzLmRhdGEucXVhbl9saW5rKSwgRXZlbnRIZWxwZXIuYmluZF9jbGljaygiI3ZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXFyY29kZS1pbWciLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKHJlcy5kYXRhLnF1YW5fbGluayk7CiAgICAgICAgICAgICAgICB9KSkpIDogX3RoaXMuZGVmYXVsdCgpOyBlbHNlIF90aGlzLmRlZmF1bHQoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFN1bmluZ0NvdXBvbjsKICAgIH0oQmFzZUNvdXBvbiksIEpkQ291cG9uID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gSmRDb3Vwb24oKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBfc3VwZXIgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhKZENvdXBvbiwgX3N1cGVyKSwgSmRDb3Vwb24ucHJvdG90eXBlLmluaXRfaHRtbCA9IGZ1bmN0aW9uKGh0bWwpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICAkKCIucHJvZHVjdC1pbnRybyIpLmxlbmd0aCA/IChDb3JlLmFwcGVuZFRvKCIucHJvZHVjdC1pbnRybyIsIGh0bWwpLCByZXNvbHZlKCEwKSkgOiBzZXRUaW1lb3V0KF90aGlzLmluaXRfaHRtbCwgMmUzKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEpkQ291cG9uLnByb3RvdHlwZS5pbml0X2NvdXBvbnMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgX3RoaXMgPSB0aGlzLCBpdGVtX2lkID0gbnVsbCA9PT0gKF9iID0gbnVsbCA9PT0gKF9hID0gdW5zYWZlV2luZG93LnBhZ2VDb25maWcpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5wcm9kdWN0KSB8fCB2b2lkIDAgPT09IF9iID8gdm9pZCAwIDogX2Iuc2t1aWQ7CiAgICAgICAgICAgIGlmIChpdGVtX2lkKSB7CiAgICAgICAgICAgICAgICB2YXIga2V5XzEgPSAiamRfIiArIGl0ZW1faWQsIGNvdXBvbiA9IENvbmZpZy5nZXQoa2V5XzEpOwogICAgICAgICAgICAgICAgaWYgKGNvdXBvbikgaWYgKGNvdXBvbi5oYXNfY291cG9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHFfMSA9IGNvdXBvbiwgZXhwXzEgPSBuZXcgRGF0ZShxXzEucXVhbl90aW1lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRfcXJjb2RlKGRlY29kZVVSSUNvbXBvbmVudChxXzEucXVhbl9saW5rKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRfY291cG9uX2luZm8ocV8xLmFmdGVyX3ByaWNlLCBxXzEucXVhbl9wcmljZSwgIiIgKyBDb3JlLmZvcm1hdChleHBfMSwgInl5eXktTU0tZGQiKSwgZGVjb2RlVVJJQ29tcG9uZW50KHFfMS5xdWFuX2xpbmspKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgY291cG9uLnF1YW5fbGluayA/IHRoaXMuZGVmYXVsdChjb3Vwb24ucXVhbl9saW5rKSA6IHRoaXMuZGVmYXVsdCgpOyBlbHNlIFJvdXRlLnF1ZXJ5SmRDb3Vwb25zKGl0ZW1faWQsIChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoTG9nZ2VyLmRlYnVnKHJlcyksIHJlcy5jb2RlKSBpZiAoQ29uZmlnLnNldChrZXlfMSwgcmVzLmRhdGEsIDQzMjAwKSwgcmVzLmRhdGEuaGFzX2NvdXBvbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcV8yID0gcmVzLmRhdGEsIGV4cF8yID0gbmV3IERhdGUocV8yLnF1YW5fdGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRfcXJjb2RlKGRlY29kZVVSSUNvbXBvbmVudChxXzIucXVhbl9saW5rKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5pbml0X2NvdXBvbl9pbmZvKHFfMi5hZnRlcl9wcmljZSwgcV8yLnF1YW5fcHJpY2UsICIiICsgQ29yZS5mb3JtYXQoZXhwXzIsICJ5eXl5LU1NLWRkIiksIGRlY29kZVVSSUNvbXBvbmVudChxXzIucXVhbl9saW5rKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcmVzLmRhdGEucXVhbl9saW5rID8gX3RoaXMuZGVmYXVsdChyZXMuZGF0YS5xdWFuX2xpbmspIDogX3RoaXMuZGVmYXVsdCgpOyBlbHNlIF90aGlzLmRlZmF1bHQoKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSBlbHNlIHRoaXMuZGVmYXVsdCgpOwogICAgICAgIH0sIEpkQ291cG9uOwogICAgfShCYXNlQ291cG9uKSwgVGFvQ291cG9uID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gVGFvQ291cG9uKCkgewogICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gX19leHRlbmRzKFRhb0NvdXBvbiwgX3N1cGVyKSwgVGFvQ291cG9uLnByb3RvdHlwZS5pbml0X2h0bWwgPSBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgJCgiI0pfRGV0YWlsTWV0YSIpLmxlbmd0aCA/IENvcmUuYXBwZW5kVG8oIiNKX0RldGFpbE1ldGEiLCBodG1sKSA6IENvcmUuYXBwZW5kVG8oIiNkZXRhaWwiLCBodG1sICsgIjxici8+IiksIAogICAgICAgICAgICAgICAgcmVzb2x2ZSghMCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBUYW9Db3Vwb24ucHJvdG90eXBlLmluaXRfY291cG9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzLCBrZXkgPSAibl9pdGVtSWRfIiArIHRoaXMuY29yZS5nZXRQYXIoImlkIiksIGNvdXBvbiA9IENvbmZpZy5nZXQoa2V5LCAhMSk7CiAgICAgICAgICAgIGNvdXBvbiA/IChMb2dnZXIuaW5mbyhjb3Vwb24pLCB0aGlzLnJlbmRlcl9jb3Vwb24oKG51bGwgPT0gY291cG9uID8gdm9pZCAwIDogY291cG9uLmxlbmd0aCkgPiAwICYmICJzdHJpbmciICE9IHR5cGVvZiBjb3Vwb24gPyBjb3Vwb25bMF0gOiB2b2lkIDApKSA6IFJvdXRlLnF1ZXJ5Q291cG9ucyh0aGlzLmNvcmUuZ2V0UGFyKCJpZCIpLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgdmFyIF9hLCBfYjsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvZGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKG51bGwgPT09IChfYSA9IGRhdGEuZGF0YSkgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gZGF0YS5kYXRhWzBdLCBleHAgPSBuZXcgRGF0ZShxLnF1YW5fdGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRfcXJjb2RlKGRlY29kZVVSSUNvbXBvbmVudChxLnF1YW5fbGluaykpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxLmFmdGVyX3ByaWNlLCBxLnF1YW5fcHJpY2UsICIiICsgQ29yZS5mb3JtYXQoZXhwLCAieXl5eS1NTS1kZCIpLCBkZWNvZGVVUklDb21wb25lbnQocS5xdWFuX2xpbmspKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBfdGhpcy5pbml0X3FyY29kZShSdW50aW1lLnVybCkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRfY291cG9uX2luZm8oMCwgMCwgIiIpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICBDb25maWcuc2V0KGtleSwgKG51bGwgPT09IChfYiA9IGRhdGEuZGF0YSkgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLmxlbmd0aCkgPiAwID8gZGF0YS5kYXRhIDogW10sIDQzMjAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBfdGhpcy5pbml0X3FyY29kZShSdW50aW1lLnVybCkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbygwLCAwLCAiIik7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBUYW9Db3Vwb24ucHJvdG90eXBlLnJlbmRlcl9jb3Vwb24gPSBmdW5jdGlvbihxdWFuKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHF1YW4gJiYgKHF1YW4gPSB2b2lkIDApLCBudWxsID09IHF1YW4pIHRoaXMuaW5pdF9xcmNvZGUoUnVudGltZS51cmwpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbygwLCAwLCAiIik7CiAgICAgICAgICAgIH0pKTsgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgcV8xID0gcXVhbiwgZXhwID0gbmV3IERhdGUocV8xLnF1YW5fdGltZSk7CiAgICAgICAgICAgICAgICB0aGlzLmluaXRfcXJjb2RlKGRlY29kZVVSSUNvbXBvbmVudChxXzEucXVhbl9saW5rKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxXzEuYWZ0ZXJfcHJpY2UsIHFfMS5xdWFuX3ByaWNlLCAiIiArIENvcmUuZm9ybWF0KGV4cCwgInl5eXktTU0tZGQiKSwgZGVjb2RlVVJJQ29tcG9uZW50KHFfMS5xdWFuX2xpbmspKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIF9fZGVjb3JhdGUoWyBXYW5kaGlBdXRvLCBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsICJmdW5jdGlvbiIgPT0gdHlwZW9mIChfYSA9IHZvaWQgMCAhPT0gQ29yZSAmJiBDb3JlKSA/IF9hIDogT2JqZWN0KSBdLCBUYW9Db3Vwb24ucHJvdG90eXBlLCAiY29yZSIsIHZvaWQgMCksIAogICAgICAgIFRhb0NvdXBvbjsKICAgIH0oQmFzZUNvdXBvbiksIERlZkNvdXBvbiA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIERlZkNvdXBvbigpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKERlZkNvdXBvbiwgX3N1cGVyKSwgRGVmQ291cG9uLnByb3RvdHlwZS5pbml0X2h0bWwgPSBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgcmVzb2x2ZSghMSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBEZWZDb3Vwb24ucHJvdG90eXBlLmluaXRfY291cG9ucyA9IGZ1bmN0aW9uKCkge30sIERlZkNvdXBvbjsKICAgIH0oQmFzZUNvdXBvbiksIExpbmVzT3B0aW9uID0gZnVuY3Rpb24gTGluZXNPcHRpb24oKSB7fSwgY3NzXzI0OHokNCA9ICIjdmlwLXBsdWdpbi1vdXRzaWRlIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBjbGVhcjogYm90aDtcbiAgICBkaXNwbGF5OiBub25lXG59XG5cbiN2aXAtcGx1Z2luLW91dHNpZGUgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zIHtcbiAgICB3aWR0aDogMjQwcHg7XG4gICAgZmxvYXQ6IGxlZnRcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXFyY29kZSB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1pbi1oZWlnaHQ6IDE1MHB4O1xuICAgIG1hcmdpbi10b3A6IDMwcHhcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXFyY29kZSBjYW52YXMsXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtcXJjb2RlIGltZyB7XG4gICAgbWFyZ2luOiAwIGF1dG9cbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXRpdGxlIHtcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgIGNvbG9yOiAjMDAwO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIHRleHQtYWxpZ246IGNlbnRlclxufVxuXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtdGl0bGUgc3BhbiB7XG4gICAgY29sb3I6ICNmZjAwMzY7XG4gICAgZm9udC13ZWlnaHQ6IDcwMFxufVxuXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYWN0aW9uIHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlclxufVxuXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYWN0aW9uIGEge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZVxufVxuXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYWN0aW9uIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1idXR0b24ge1xuICAgIG1pbi13aWR0aDogMTM1cHg7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gICAgbGluZS1oZWlnaHQ6IDM1cHg7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZDogI2ZmMDAzNjtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsZXR0ZXItc3BhY2luZzogMS41cHg7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGJvcmRlci1yYWRpdXM6IDE1cHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGN1cnNvcjogcG9pbnRlclxufVxuXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYWN0aW9uIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1idXR0b24ucXVhbi1ub25lIHtcbiAgICBjb2xvcjogIzAwMDtcbiAgICBiYWNrZ3JvdW5kOiAjYmVjNWM1XG59XG5cbi52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1kYXRlIHtcbiAgICBjb2xvcjogIzIzM2IzZDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnkgLnZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5LXRpcCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbjogMDtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbGV0dGVyLXNwYWNpbmc6IDFweDtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSlcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnksICN2aXAtcGx1Z2luLW91dHNpZGUtY2hhcnQtYm9keSB7XG4gICAgaGVpZ2h0OiAzMDBweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxufVxuXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtaGlzdG9yeSAudmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lcixcbiN2aXAtcGx1Z2luLW91dHNpZGUtY2hhcnQtY29udGFpbmVyLWxpbmUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJVxufVxuXG4jdmlwLXBsdWdpbi1vdXRzaWRlLXNpbWlsYXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgei1pbmRleDogOTk5OTk5OTk7XG4gICAgaGVpZ2h0OiAyNjhweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGxlZnQ6IC0xcHg7XG4gICAgdG9wOiAzNnB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlZGYxZjIhaW1wb3J0YW50XG59XG5cbi52aXAtcGx1Z2luLW91dHNpZGUtc2ltaWxhci1idXktbGlzdCB7XG4gICAgd2lkdGg6IDMwM3B4O1xuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYigyMzcsIDI0MSwgMjQyKTtcbiAgICBoZWlnaHQ6IDI3MHB4O1xuICAgIHBhZGRpbmc6IDBweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbjogMHB4O1xufVxuLnZpcC1wbHVnaW4tb3V0c2lkZS1zaW1pbGFyLWJ1eS1saXN0LWxpLXN0b3Jle1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWFyZ2luOiA4cHggN3B4IDRweCAxNHB4O1xuICAgIHdpZHRoOiAxNnB4O1xuICAgIGhlaWdodDogMTZweFxufVxuLnZpcC1wbHVnaW4tb3V0c2lkZS1zaW1pbGFyLWJ1eS1saXN0IGxpIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VkZjFmMjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMzNweDtcbiAgICBsaW5lLWhlaWdodDogMzNweFxufVxuLnZpcC1wbHVnaW4tb3V0c2lkZS1zaW1pbGFyLWJ1eS1saXN0IGxpOmZpcnN0LWNoaWxkIGIge1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbWFyZ2luLWxlZnQ6IDE0cHg7XG4gICAgZm9udC13ZWlnaHQ6IDcwMFxufVxuLnZpcC1wbHVnaW4tb3V0c2lkZS1zaW1pbGFyLWJ1eS1saXN0LWxpLWZpcnN0IHtcbiAgICB0b3A6IDE1cHg7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgcmlnaHQ6IDUxcHg7XG4gICAgcGFkZGluZzogMDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBoZWlnaHQ6IGF1dG9cbn1cbi52aXAtcGx1Z2luLW91dHNpZGUtc2ltaWxhci1idXktbGlzdC1saS10aXRsZSB7XG4gICAgaGVpZ2h0OiAzM3B4O1xuICAgIG1hcmdpbjogMDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kOiAwIDA7XG4gICAgbGluZS1oZWlnaHQ6IDMzcHg7XG4gICAgbWF4LXdpZHRoOiAxNzBweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgd2lkdGg6IGF1dG9cbn1cbi52aXAtcGx1Z2luLW91dHNpZGUtc2ltaWxhci1idXktbGlzdC1saS1wcmljZSB7XG4gICAgY29sb3I6ICNFNDM5M0M7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMzNweDtcbiAgICBoZWlnaHQ6IDMzcHg7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZmxvYXQ6IHJpZ2h0O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDE0cHg7XG59XG4iOwogICAgc3R5bGVJbmplY3QoY3NzXzI0OHokNCk7CiAgICB2YXIgTXNnSW5mbyA9IGZ1bmN0aW9uIE1zZ0luZm8oKSB7fSwgUHJvbW9JbmZvID0gZnVuY3Rpb24gUHJvbW9JbmZvKCkgewogICAgICAgIHRoaXMucHJpY2UgPSAwLCB0aGlzLnRpbWUgPSAwOwogICAgfSwgSGlzdG9yeVNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBIaXN0b3J5U2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlRNYWxsLCAvZGV0YWlsLnRtYWxsLmNvbVwvaXRlbS5odG0vaSBdLCBbIFNpdGVFbnVtLlRhb0JhbywgL2l0ZW0udGFvYmFvLmNvbS9pIF0sIFsgU2l0ZUVudW0uSmluZ0RvbmcsIC9pdGVtLmpkLihjb218aGspXC9bMC05XSouaHRtbC9pIF0sIFsgU2l0ZUVudW0uU3VOaW5nLCAvcHJvZHVjdC5zdW5pbmcuY29tL2kgXSwgWyBTaXRlRW51bS5WcCwgL2RldGFpbC52aXAuY29tL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLmZhY3RvcnkgPSBuZXcgRGVmQ291cG9uLCBfdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhIaXN0b3J5U2VydmljZSwgX3N1cGVyKSwgSGlzdG9yeVNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIEhpc3RvcnlTZXJ2aWNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5pbmplY3RIaXN0b3J5KCk7CiAgICAgICAgfSwgSGlzdG9yeVNlcnZpY2UucHJvdG90eXBlLmluamVjdEhpc3RvcnkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgc3dpdGNoIChMb2dnZXIuZGVidWcodGhpcy5zaXRlKSwgdGhpcy5zaXRlKSB7CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5UYW9CYW86CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5UTWFsbDoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBUYW9Db3Vwb247CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5KaW5nRG9uZzoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBKZENvdXBvbjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlN1TmluZzoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBTdW5pbmdDb3Vwb247CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5WcDoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBWcENvdXBvbjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gbmV3IERlZkNvdXBvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZhY3RvcnkuaW5pdF9odG1sKHRoaXMuZ2V0SGlzdG9yeUh0bWwoKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICByZXMgJiYgX3RoaXMuSW5pdFByaWNlSGlzdG9yeSgpLCBfdGhpcy5mYWN0b3J5LmluaXRfY291cG9ucyAmJiBfdGhpcy5mYWN0b3J5LmluaXRfY291cG9ucygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgSGlzdG9yeVNlcnZpY2UucHJvdG90eXBlLkluaXRQcmljZUhpc3RvcnkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgJCgiI3ZpcC1wbHVnaW4tb3V0c2lkZSIpLnNob3coKSwgdGhpcy50aGVtZSgpLCB0aGlzLmNoYXJ0TXNnKCJcdTUzODZcdTUzZjJcdTRlZjdcdTY4M2NcdTY3ZTVcdThiZTJcdTRlMmQiKSwgCiAgICAgICAgICAgIFJvdXRlLnF1ZXJ5SGlzdG9yeXYzKFJ1bnRpbWUudXJsLCB0aGlzLnNpdGUudG9TdHJpbmcoKSwgKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciBtc2cgPSAiIjsKICAgICAgICAgICAgICAgIGRhdGEuY29kZSA/ICgkKCIudmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lciIpLmh0bWwoJzxkaXYgaWQ9InZpcC1wbHVnaW4tb3V0c2lkZS1jaGFydC1jb250YWluZXItbGluZSI+PC9kaXY+JyksIAogICAgICAgICAgICAgICAgZWNoYXJ0cy5pbml0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aXAtcGx1Z2luLW91dHNpZGUtY2hhcnQtY29udGFpbmVyLWxpbmUiKSwgX3RoaXMudGhlbWUoKSkuc2V0T3B0aW9uKF90aGlzLmdldENoYXJ0T3B0aW9uKGRhdGEuZGF0YSkpKSA6IG1zZyA9ICJcdTY3MmFcdTY3ZTVcdTUyMzBcdTUzODZcdTUzZjJcdTY1NzBcdTYzNmUiLCAKICAgICAgICAgICAgICAgIF90aGlzLmNoYXJ0TXNnKG1zZyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIaXN0b3J5U2VydmljZS5wcm90b3R5cGUuZ2V0SGlzdG9yeUh0bWwgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICc8ZGl2IGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUiPjxjYW52YXMgaWQ9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXFyY29kZS1pbWciPjwvY2FudmFzPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtdGl0bGUiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYWN0aW9uIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5IiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnkiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lciI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnktdGlwIj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj4nOwogICAgICAgIH0sIEhpc3RvcnlTZXJ2aWNlLnByb3RvdHlwZS5jaGFydE1zZyA9IGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICAkKCIudmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnktdGlwIikuaHRtbChtc2cpOwogICAgICAgIH0sIEhpc3RvcnlTZXJ2aWNlLnByb3RvdHlwZS5nZXRDaGFydE9wdGlvbiA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgdGV4dCA9ICJcdTUzODZcdTUzZjJcdTRmNGVcdTRlZjdcdWZmMWF7cmVkfFx1ZmZlNSIgKyBkYXRhLm1pbiArICJ9ICgge3JlZHwiICsgZGF0YS5kYXRlICsgIn0gKSBcdTUyMDZcdTY3OTBcdWZmMWEiICsgZGF0YS5tYXJrLCBjaGFydE9wdGlvbiA9IG5ldyBMaW5lc09wdGlvbjsKICAgICAgICAgICAgKGNoYXJ0T3B0aW9uID0gewogICAgICAgICAgICAgICAgdGl0bGU6IHsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgICAgIHN1YnRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICByaWNoOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogInJlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0b29sdGlwOiB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogImF4aXMiLAogICAgICAgICAgICAgICAgICAgIGF4aXNQb2ludGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJjcm9zcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJhbXMubmFtZSksIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMSwgZGF5ID0gZGF0ZS5nZXREYXRlKCksIG1vbnRoU3RyID0gbW9udGgudG9TdHJpbmcoKSwgZGF5U3RyID0gZGF5LnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aCA8IDEwICYmIChtb250aFN0ciA9ICIwIiArIG1vbnRoKSwgZGF5IDwgMTAgJiYgKGRheVN0ciA9ICIwIiArIGRheSksIAogICAgICAgICAgICAgICAgICAgICAgICAiXHU2NWU1XHU2NzFmXHVmZjFhIiArIHllYXIgKyAiLSIgKyBtb250aFN0ciArICItIiArIGRheVN0ciArICI8YnIvPlx1NGVmN1x1NjgzY1x1ZmYxYVx1ZmZlNSIgKyBwYXJhbXMudmFsdWVbMV0udG9GaXhlZCgyKSArICgiIiA9PSBwYXJhbXMudmFsdWVbMl0gPyAiIiA6ICI8YnIvPiIgKyBwYXJhbXMudmFsdWVbMl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBncmlkOiB7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCwKICAgICAgICAgICAgICAgICAgICByaWdodDogMjAsCiAgICAgICAgICAgICAgICAgICAgdG9wOiA1MCwKICAgICAgICAgICAgICAgICAgICBib3R0b206IDEwLAogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5MYWJlbDogITAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB4QXhpczogewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ0aW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHlBeGlzOiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogInZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNlcmllczogWyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICAgICAgICAgIHN0ZXA6ICJlbmQiLAogICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEucHJpY2VfZGV0YWlsLmZvckVhY2goKGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHYudGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWyB2LnRpbWVzdGFtcCwgdi5wcmljZSwgdi5tYXJrIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnB1c2gocCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbDsKICAgICAgICAgICAgICAgICAgICB9KGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHNob3dTeW1ib2w6ICExLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMsCiAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2ZmMDAzNiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IF0KICAgICAgICAgICAgfSkueUF4aXMgPSB7CiAgICAgICAgICAgICAgICBtaW46IDEwICogTWF0aC5mbG9vciguOSAqIGRhdGEubWluIC8gMTApLAogICAgICAgICAgICAgICAgbWF4OiAxMCAqIE1hdGguY2VpbCgxLjEgKiBkYXRhLm1heCAvIDEwKQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgbGluZSA9IG51bGwgPT09IChfYSA9IGNoYXJ0T3B0aW9uLnNlcmllcykgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLnBvcCgpOwogICAgICAgICAgICByZXR1cm4gbGluZS5tYXJrUG9pbnQgPSB7CiAgICAgICAgICAgICAgICBkYXRhOiBbIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YS5taW4sCiAgICAgICAgICAgICAgICAgICAgY29vcmQ6IFsgZGF0YS5kYXRlLCBkYXRhLm1pbiBdLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJcdTY3MDBcdTVjMGZcdTUwM2MiLAogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImdyZWVuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YS5tYXgsCiAgICAgICAgICAgICAgICAgICAgY29vcmQ6IFsgZGF0YS5tYXhfZGF0ZSwgZGF0YS5tYXggXSwKICAgICAgICAgICAgICAgICAgICBuYW1lOiAiXHU2NzAwXHU1OTI3XHU1MDNjIiwKICAgICAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZWQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBdCiAgICAgICAgICAgIH0sIG51bGwgPT09IChfYiA9IGNoYXJ0T3B0aW9uLnNlcmllcykgfHwgdm9pZCAwID09PSBfYiB8fCBfYi5wdXNoKGxpbmUpLCBjaGFydE9wdGlvbi5kYXRhWm9vbSA9IFsgewogICAgICAgICAgICAgICAgdHlwZTogInNsaWRlciIsCiAgICAgICAgICAgICAgICBzaG93OiAhMCwKICAgICAgICAgICAgICAgIHJlYWx0aW1lOiAhMCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAwLAogICAgICAgICAgICAgICAgZW5kOiAxMDAKICAgICAgICAgICAgfSBdLCBjaGFydE9wdGlvbjsKICAgICAgICB9LCBIaXN0b3J5U2VydmljZS5wcm90b3R5cGUudGhlbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNvbG9yOiBbICIjMmVjN2M5IiwgIiNiNmEyZGUiLCAiIzVhYjFlZiIsICIjZmZiOTgwIiwgIiNkODdhODAiLCAiIzhkOThiMyIsICIjZTVjZjBkIiwgIiM5N2I1NTIiLCAiIzk1NzA2ZCIsICIjZGM2OWFhIiwgIiMwN2EyYTQiLCAiIzlhN2ZkMSIsICIjNTg4ZGQ1IiwgIiNmNTk5NGUiLCAiI2MwNTA1MCIsICIjNTk2NzhjIiwgIiNjOWFiMDAiLCAiIzdlYjAwYSIsICIjNmY1NTUzIiwgIiNjMTQwODkiIF0sCiAgICAgICAgICAgICAgICB0aXRsZTogewogICAgICAgICAgICAgICAgICAgIGl0ZW1HYXA6IDgsCiAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICJub3JtYWwiLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDhhY2QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxlZ2VuZDogewogICAgICAgICAgICAgICAgICAgIGl0ZW1HYXA6IDgKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkYXRhUmFuZ2U6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtV2lkdGg6IDE1LAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiBbICIjMmVjN2M5IiwgIiNiNmEyZGUiIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0b29sYm94OiB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgIiMxZTkwZmYiLCAiIzFlOTBmZiIsICIjMWU5MGZmIiwgIiMxZTkwZmYiIF0sCiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlQ29sb3I6ICIjZmY0NTAwIiwKICAgICAgICAgICAgICAgICAgICBpdGVtR2FwOiA4CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdG9vbHRpcDogewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogInJnYmEoNTAsNTAsNTAsMC41KSIsCiAgICAgICAgICAgICAgICAgICAgYXhpc1BvaW50ZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDIwMCwyMDAsMjAwLDAuMikiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGF0YVpvb206IHsKICAgICAgICAgICAgICAgICAgICBkYXRhQmFja2dyb3VuZENvbG9yOiAiI2VmZWZmZiIsCiAgICAgICAgICAgICAgICAgICAgZmlsbGVyQ29sb3I6ICJyZ2JhKDE4MiwxNjIsMjIyLDAuMikiLAogICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBncmlkOiB7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICIjZWVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNhdGVnb3J5QXhpczogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogWyAiI2VlZSIgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHZhbHVlQXhpczogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdEFyZWE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgInJnYmEoMjUwLDI1MCwyNTAsMC4xKSIsICJyZ2JhKDIwMCwyMDAsMjAwLDAuMSkiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3BsaXRMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgIiNlZWUiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwb2xhcjogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZGRkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdEFyZWE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgInJnYmEoMjUwLDI1MCwyNTAsMC4yKSIsICJyZ2JhKDIwMCwyMDAsMjAwLDAuMikiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3BsaXRMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZGRkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2xTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiAiZW1wdHlDaXJjbGUiLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBiYXI6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogNQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxpbmU6IHsKICAgICAgICAgICAgICAgICAgICBzbW9vdGg6ICEwLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbDogImVtcHR5Q2lyY2xlIiwKICAgICAgICAgICAgICAgICAgICBzeW1ib2xTaXplOiAzCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgazogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2Q4N2E4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjA6ICIjMmVjN2M5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2Q4N2E4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IwOiAiIzJlYzdjOSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzY2F0dGVyOiB7CiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiAiY2lyY2xlIiwKICAgICAgICAgICAgICAgICAgICBzeW1ib2xTaXplOiA0CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmFkYXI6IHsKICAgICAgICAgICAgICAgICAgICBzeW1ib2w6ICJlbXB0eUNpcmNsZSIsCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogMwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1hcDogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2RkZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkODdhODAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZmU5OTRlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmdiKDEwMCwwLDApIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmb3JjZTogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiAiIzFlOTBmZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjaG9yZDogewogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDQsCiAgICAgICAgICAgICAgICAgICAgaXRlbVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvcmRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvcmRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdhdWdlOiB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZTogMjI1LAogICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlOiAtNDUsCiAgICAgICAgICAgICAgICAgICAgYXhpc0xpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgWyAuMiwgIiMyZWM3YzkiIF0sIFsgLjgsICIjNWFiMWVmIiBdLCBbIDEsICIjZDg3YTgwIiBdIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXhpc1RpY2s6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXROdW1iZXI6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiYXV0byIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXhpc0xhYmVsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJhdXRvIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHBvaW50ZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiYXV0byIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMzMzIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogIlx1NWZhZVx1OGY2Zlx1OTZjNVx1OWVkMSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSwgSGlzdG9yeVNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBHd2RTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gR3dkU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlRNYWxsLCAvZGV0YWlsXC50bWFsbFwuY29tXC9pdGVtXC5odG0vaSBdLCBbIFNpdGVFbnVtLlRhb0JhbywgL2l0ZW1cLnRhb2Jhb1wuY29tL2kgXSwgWyBTaXRlRW51bS5KaW5nRG9uZywgL2l0ZW1cLih5aXlhb2pkfGpkKVwuKGNvbXxoaylcL1swLTldKlwuaHRtbC9pIF0sIFsgU2l0ZUVudW0uU3VOaW5nLCAvcHJvZHVjdFwuc3VuaW5nXC5jb20vaSBdLCBbIFNpdGVFbnVtLlZwLCAvZGV0YWlsXC52aXBcLmNvbS9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fYXBwTmFtZSA9ICJHd2RTZXJ2aWNlIiwgX3RoaXMuZmFjdG9yeSA9IG5ldyBEZWZDb3Vwb24sIF90aGlzLmRmcCA9ICIwSDg4a1VaZTBDUDgwRHRNMEMwVmtVYzIwejg4a1VaTTZVVE0wVU1pa1VjMjZ6ODJrVVBlMEg4OGtVUDgwSDg4RVYzKzBVWmkwRFoyIiwgCiAgICAgICAgICAgIF90aGlzLmZwID0gIjM3ODQzN2Y1MDc4NDQyYzg3OGU5OWY3ODcyMDI3OGM0IiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gX19leHRlbmRzKEd3ZFNlcnZpY2UsIF9zdXBlciksIEd3ZFNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIEd3ZFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmluamVjdEhpc3RvcnkoKTsKICAgICAgICB9LCBHd2RTZXJ2aWNlLnByb3RvdHlwZS5pbmplY3RIaXN0b3J5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHN3aXRjaCAoTG9nZ2VyLmRlYnVnKHRoaXMuc2l0ZSksIHRoaXMuc2l0ZSkgewogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uVGFvQmFvOgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uVE1hbGw6CiAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgVGFvQ291cG9uOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uSmluZ0Rvbmc6CiAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgSmRDb3Vwb247CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5TdU5pbmc6CiAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgU3VuaW5nQ291cG9uOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uVnA6CiAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgVnBDb3Vwb247CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBEZWZDb3Vwb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5mYWN0b3J5LmluaXRfaHRtbCh0aGlzLmdldEhpc3RvcnlIdG1sKCkpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgcmVzICYmIF90aGlzLkluaXRQcmljZUhpc3RvcnkoKSwgX3RoaXMuZmFjdG9yeS5pbml0X2NvdXBvbnMgJiYgX3RoaXMuZmFjdG9yeS5pbml0X2NvdXBvbnMoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEd3ZFNlcnZpY2UucHJvdG90eXBlLkluaXRQcmljZUhpc3RvcnkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgJCgiI3ZpcC1wbHVnaW4tb3V0c2lkZSIpLnNob3coKSwgdGhpcy50aGVtZSgpLCB0aGlzLmNoYXJ0TXNnKCJcdTUzODZcdTUzZjJcdTRlZjdcdTY4M2NcdTY3ZTVcdThiZTJcdTRlMmQiKTsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBSb3V0ZS5xdWVyeUhpc3RvcnlWNChSdW50aW1lLnVybCwgdGhpcy5zaXRlLnRvU3RyaW5nKCksIHRoYXQuZnAsIHRoYXQuZGZwLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKExvZ2dlci5kZWJ1ZyhkYXRhKSwgInByaWNlX3N0YXR1cyIgaW4gZGF0YSkgJCgiLnZpcC1wbHVnaW4tb3V0c2lkZS1jaGFydC1jb250YWluZXIiKS5odG1sKCc8ZGl2IGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUtY2hhcnQtY29udGFpbmVyLWxpbmUiPjwvZGl2PicpLCAKICAgICAgICAgICAgICAgIGVjaGFydHMuaW5pdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lci1saW5lIiksIF90aGlzLnRoZW1lKCkpLnNldE9wdGlvbihfdGhpcy5nZXRDaGFydE9wdGlvbihkYXRhKSksIAogICAgICAgICAgICAgICAgX3RoaXMuY2hhcnRNc2coIiIpOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoImlzX2JhbiIgaW4gZGF0YSAmJiAxID09IGRhdGEuaXNfYmFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWxfX2RlZmF1bHQuZGVmYXVsdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICJpbmZvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6ICJcdTUzODZcdTUzZjJcdTRlZjdcdTY4M2NcdTY3ZTVcdThiZTJcdTVmMDJcdTVlMzgsXHU2NjJmXHU1NDI2XHU2MjUzXHU1ZjAwXHU5YThjXHU4YmMxXHU5ODc1XHU5NzYyXHU4ZmRiXHU4ODRjXHU5YThjXHU4YmMxPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0NvbmZpcm06ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICJcdTlhOGNcdThiYzFcdThkNzBcdThkNzciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIlx1ODAwMVx1NWI1MFx1NGUwZFx1NzcwYiIKICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuaXNDb25maXJtZWQgJiYgQ29yZS5vcGVuKCJodHRwczovL2Jyb3dzZXIuZ3dkYW5nLmNvbS9zbGlkZXIvdmVyaWZ5Lmh0bWw/ZnJvbVVybD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KFJ1bnRpbWUudXJsKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dhbF9fZGVmYXVsdC5kZWZhdWx0LmNsb3NlKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgIjk5OTk5OTk5OTk5IiAhPSAkKCIuc3dhbDItY29udGFpbmVyIikuY3NzKCJ6LWluZGV4IikgJiYgJCgiLnN3YWwyLWNvbnRhaW5lciIpLmNzcygiei1pbmRleCIsICI5OTk5OTk5OTk5OSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGF0Lmhpc3RvcnlTZXJ2aWNlLlByb2Nlc3MoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEd3ZFNlcnZpY2UucHJvdG90eXBlLmdldEhpc3RvcnlIdG1sID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAnPGRpdiBpZD0idmlwLXBsdWdpbi1vdXRzaWRlIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtcXJjb2RlIj48Y2FudmFzIGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUtaW1nIj48L2NhbnZhcz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXRpdGxlIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWFjdGlvbiI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUtaGlzdG9yeSIgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5Ij5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jaGFydC1jb250YWluZXIiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5LXRpcCI+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwvZGl2Pic7CiAgICAgICAgfSwgR3dkU2VydmljZS5wcm90b3R5cGUuY2hhcnRNc2cgPSBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgJCgiLnZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5LXRpcCIpLmh0bWwobXNnKTsKICAgICAgICB9LCBHd2RTZXJ2aWNlLnByb3RvdHlwZS5nZXRDaGFydE9wdGlvbiA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgYW5hbHlzaXNUeHQgPSBkYXRhLmFuYWx5c2lzLnRpcCwgbWluID0gZGF0YS5hbmFseXNpcy5wcm9tb19kYXlzW2RhdGEuYW5hbHlzaXMucHJvbW9fZGF5cy5sZW5ndGggLSAxXSwgdGV4dCA9IGFuYWx5c2lzVHh0ICsgIlx1ZmYxYXtyZWR8XHVmZmU1IiArIG1pbi5wcmljZSArICJ9ICgge3JlZHwiICsgbWluLmRhdGUgKyAifSApIiwgbWF4RGF0YSA9IG5ldyBQcm9tb0luZm8sIG1pbkRhdGEgPSBuZXcgUHJvbW9JbmZvOwogICAgICAgICAgICBtaW5EYXRhLnByaWNlID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIG1pbkRhdGEuaHVtYW5QcmljZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCAKICAgICAgICAgICAgbWF4RGF0YS5odW1hblByaWNlID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7CiAgICAgICAgICAgIHZhciBjaGFydE9wdGlvbiA9IG5ldyBMaW5lc09wdGlvbjsKICAgICAgICAgICAgKGNoYXJ0T3B0aW9uID0gewogICAgICAgICAgICAgICAgdGl0bGU6IHsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgICAgIHN1YnRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICByaWNoOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogInJlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0b29sdGlwOiB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogImF4aXMiLAogICAgICAgICAgICAgICAgICAgIGF4aXNQb2ludGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJjcm9zcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJhbXMubmFtZSksIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMSwgZGF5ID0gZGF0ZS5nZXREYXRlKCksIG1vbnRoU3RyID0gbW9udGgudG9TdHJpbmcoKSwgZGF5U3RyID0gZGF5LnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aCA8IDEwICYmIChtb250aFN0ciA9ICIwIiArIG1vbnRoKSwgZGF5IDwgMTAgJiYgKGRheVN0ciA9ICIwIiArIGRheSksIAogICAgICAgICAgICAgICAgICAgICAgICAiXHU2NWU1XHU2NzFmXHVmZjFhIiArIHllYXIgKyAiLSIgKyBtb250aFN0ciArICItIiArIGRheVN0ciArICI8YnIvPlx1NGVmN1x1NjgzY1x1ZmYxYVx1ZmZlNSIgKyBwYXJhbXMudmFsdWVbMV0udG9GaXhlZCgyKSArICgiIiA9PSBwYXJhbXMudmFsdWVbMl0gPyAiIiA6ICI8YnIvPiIgKyBwYXJhbXMudmFsdWVbMl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBncmlkOiB7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCwKICAgICAgICAgICAgICAgICAgICByaWdodDogMjAsCiAgICAgICAgICAgICAgICAgICAgdG9wOiA1MCwKICAgICAgICAgICAgICAgICAgICBib3R0b206IDEwLAogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5MYWJlbDogITAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB4QXhpczogewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ0aW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHlBeGlzOiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogInZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNlcmllczogWyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICAgICAgICAgIHN0ZXA6ICJlbmQiLAogICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBsID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0b3JlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZURhdGEgPSBkYXRhLnN0b3JlWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdG9yZS5sZW5ndGggPiAxICYmIChzdG9yZURhdGEgPSBkYXRhLnN0b3JlWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3Vwb25zTWFwXzEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09PSAoX2EgPSBkYXRhLnByb21vKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDAgJiYgZGF0YS5wcm9tby5mb3JFYWNoKChmdW5jdGlvbih2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cG9uc01hcF8xLmhhc093blByb3BlcnR5KDFlMyAqIHYudGltZSkgfHwgKGNvdXBvbnNNYXBfMVsxZTMgKiB2LnRpbWVdID0gdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm93XzEgPSBzdG9yZURhdGEuYWxsX2xpbmVfYmVnaW5fdGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlRGF0YS5hbGxfbGluZS5mb3JFYWNoKChmdW5jdGlvbih2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA+IG1heERhdGEuaHVtYW5QcmljZSAmJiAobWF4RGF0YS5odW1hblByaWNlID0gdiwgbWF4RGF0YS50aW1lID0gbm93XzEgLyAxZTMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2IDwgbWluRGF0YS5odW1hblByaWNlICYmIChtaW5EYXRhLmh1bWFuUHJpY2UgPSB2LCBtaW5EYXRhLnRpbWUgPSBub3dfMSAvIDFlMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21vID0gbmV3IFByb21vSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tby5tc2cgPSBuZXcgTXNnSW5mbywgY291cG9uc01hcF8xLmhhc093blByb3BlcnR5KG5vd18xKSAmJiAoTG9nZ2VyLmRlYnVnKCJ5ZXMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW8gPSBjb3Vwb25zTWFwXzFbbm93XzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbm93XzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbIG5vd18xLCB2LCBjb3Vwb25zTWFwXzEuaGFzT3duUHJvcGVydHkobm93XzEpID8gcHJvbW8ubXNnLmNvdXBvbiA/IHByb21vLm1zZy5wcm9tb3Rpb24gOiBwcm9tby5tc2cuY291cG9uIDogIiIgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5wdXNoKHApLCBub3dfMSArPSA4NjRlNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgTG9nZ2VyLmRlYnVnKGNvdXBvbnNNYXBfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvZ2dlci5kZWJ1ZyhtYXhEYXRhKSwgTG9nZ2VyLmRlYnVnKG1pbkRhdGEpLCBsOwogICAgICAgICAgICAgICAgICAgIH0oZGF0YSksCiAgICAgICAgICAgICAgICAgICAgc2hvd1N5bWJvbDogITEsCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogMywKICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZmYwMDM2IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gXQogICAgICAgICAgICB9KS55QXhpcyA9IHsKICAgICAgICAgICAgICAgIG1pbjogMTAgKiBNYXRoLmZsb29yKC45ICogbWluRGF0YS5odW1hblByaWNlIC8gMTApLAogICAgICAgICAgICAgICAgbWF4OiAxMCAqIE1hdGguY2VpbCgxLjEgKiBtYXhEYXRhLmh1bWFuUHJpY2UgLyAxMCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBudWxsID09PSAoX2EgPSBjaGFydE9wdGlvbi5zZXJpZXMpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5wb3AoKTsKICAgICAgICAgICAgcmV0dXJuIGxpbmUubWFya1BvaW50ID0gewogICAgICAgICAgICAgICAgZGF0YTogWyB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1pbkRhdGEuaHVtYW5QcmljZSwKICAgICAgICAgICAgICAgICAgICBjb29yZDogWyAxZTMgKiBtaW5EYXRhLnRpbWUsIG1pbkRhdGEuaHVtYW5QcmljZSBdLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJcdTY3MDBcdTVjMGZcdTUwM2MiLAogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImdyZWVuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF4RGF0YS5odW1hblByaWNlLAogICAgICAgICAgICAgICAgICAgIGNvb3JkOiBbIDFlMyAqIG1heERhdGEudGltZSwgbWF4RGF0YS5odW1hblByaWNlIF0sCiAgICAgICAgICAgICAgICAgICAgbmFtZTogIlx1NjcwMFx1NTkyN1x1NTAzYyIsCiAgICAgICAgICAgICAgICAgICAgaXRlbVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmVkIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gXQogICAgICAgICAgICB9LCBudWxsID09PSAoX2IgPSBjaGFydE9wdGlvbi5zZXJpZXMpIHx8IHZvaWQgMCA9PT0gX2IgfHwgX2IucHVzaChsaW5lKSwgY2hhcnRPcHRpb24uZGF0YVpvb20gPSBbIHsKICAgICAgICAgICAgICAgIHR5cGU6ICJzbGlkZXIiLAogICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICByZWFsdGltZTogITAsCiAgICAgICAgICAgICAgICBzdGFydDogMCwKICAgICAgICAgICAgICAgIGVuZDogMTAwCiAgICAgICAgICAgIH0gXSwgY2hhcnRPcHRpb247CiAgICAgICAgfSwgR3dkU2VydmljZS5wcm90b3R5cGUudGhlbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNvbG9yOiBbICIjMmVjN2M5IiwgIiNiNmEyZGUiLCAiIzVhYjFlZiIsICIjZmZiOTgwIiwgIiNkODdhODAiLCAiIzhkOThiMyIsICIjZTVjZjBkIiwgIiM5N2I1NTIiLCAiIzk1NzA2ZCIsICIjZGM2OWFhIiwgIiMwN2EyYTQiLCAiIzlhN2ZkMSIsICIjNTg4ZGQ1IiwgIiNmNTk5NGUiLCAiI2MwNTA1MCIsICIjNTk2NzhjIiwgIiNjOWFiMDAiLCAiIzdlYjAwYSIsICIjNmY1NTUzIiwgIiNjMTQwODkiIF0sCiAgICAgICAgICAgICAgICB0aXRsZTogewogICAgICAgICAgICAgICAgICAgIGl0ZW1HYXA6IDgsCiAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICJub3JtYWwiLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDhhY2QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxlZ2VuZDogewogICAgICAgICAgICAgICAgICAgIGl0ZW1HYXA6IDgKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkYXRhUmFuZ2U6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtV2lkdGg6IDE1LAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiBbICIjMmVjN2M5IiwgIiNiNmEyZGUiIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0b29sYm94OiB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgIiMxZTkwZmYiLCAiIzFlOTBmZiIsICIjMWU5MGZmIiwgIiMxZTkwZmYiIF0sCiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlQ29sb3I6ICIjZmY0NTAwIiwKICAgICAgICAgICAgICAgICAgICBpdGVtR2FwOiA4CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdG9vbHRpcDogewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogInJnYmEoNTAsNTAsNTAsMC41KSIsCiAgICAgICAgICAgICAgICAgICAgYXhpc1BvaW50ZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDIwMCwyMDAsMjAwLDAuMikiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGF0YVpvb206IHsKICAgICAgICAgICAgICAgICAgICBkYXRhQmFja2dyb3VuZENvbG9yOiAiI2VmZWZmZiIsCiAgICAgICAgICAgICAgICAgICAgZmlsbGVyQ29sb3I6ICJyZ2JhKDE4MiwxNjIsMjIyLDAuMikiLAogICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBncmlkOiB7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICIjZWVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNhdGVnb3J5QXhpczogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogWyAiI2VlZSIgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHZhbHVlQXhpczogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdEFyZWE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgInJnYmEoMjUwLDI1MCwyNTAsMC4xKSIsICJyZ2JhKDIwMCwyMDAsMjAwLDAuMSkiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3BsaXRMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgIiNlZWUiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwb2xhcjogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZGRkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdEFyZWE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgInJnYmEoMjUwLDI1MCwyNTAsMC4yKSIsICJyZ2JhKDIwMCwyMDAsMjAwLDAuMikiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3BsaXRMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZGRkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2xTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiAiZW1wdHlDaXJjbGUiLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBiYXI6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogNQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxpbmU6IHsKICAgICAgICAgICAgICAgICAgICBzbW9vdGg6ICEwLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbDogImVtcHR5Q2lyY2xlIiwKICAgICAgICAgICAgICAgICAgICBzeW1ib2xTaXplOiAzCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgazogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2Q4N2E4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjA6ICIjMmVjN2M5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2Q4N2E4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IwOiAiIzJlYzdjOSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzY2F0dGVyOiB7CiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiAiY2lyY2xlIiwKICAgICAgICAgICAgICAgICAgICBzeW1ib2xTaXplOiA0CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmFkYXI6IHsKICAgICAgICAgICAgICAgICAgICBzeW1ib2w6ICJlbXB0eUNpcmNsZSIsCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogMwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1hcDogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2RkZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkODdhODAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZmU5OTRlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmdiKDEwMCwwLDApIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmb3JjZTogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiAiIzFlOTBmZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjaG9yZDogewogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDQsCiAgICAgICAgICAgICAgICAgICAgaXRlbVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvcmRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvcmRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdhdWdlOiB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZTogMjI1LAogICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlOiAtNDUsCiAgICAgICAgICAgICAgICAgICAgYXhpc0xpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgWyAuMiwgIiMyZWM3YzkiIF0sIFsgLjgsICIjNWFiMWVmIiBdLCBbIDEsICIjZDg3YTgwIiBdIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXhpc1RpY2s6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXROdW1iZXI6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiYXV0byIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXhpc0xhYmVsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJhdXRvIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHBvaW50ZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiYXV0byIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMzMzIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogIlx1NWZhZVx1OGY2Zlx1OTZjNVx1OWVkMSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSwgX19kZWNvcmF0ZShbIFdhbmRoaUF1dG8sIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgImZ1bmN0aW9uIiA9PSB0eXBlb2YgKF9hID0gdm9pZCAwICE9PSBIaXN0b3J5U2VydmljZSAmJiBIaXN0b3J5U2VydmljZSkgPyBfYSA6IE9iamVjdCkgXSwgR3dkU2VydmljZS5wcm90b3R5cGUsICJoaXN0b3J5U2VydmljZSIsIHZvaWQgMCksIAogICAgICAgIEd3ZFNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBjc3NfMjQ4eiQzID0gIi50Yi1wcm9wIC50Yi1pbWcgbGkgYSB7XG4gICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXg6IDVweCAhaW1wb3J0YW50O1xufVxuXG4udGItcHJvcCAudGItaW1nIGxpIHNwYW4ge1xuICAgIHRleHQtaW5kZW50OiAxZW0gIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgNXB4ICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLWxlZnQ6IDM1cHg7XG59XG4iOwogICAgc3R5bGVJbmplY3QoY3NzXzI0OHokMyk7CiAgICB2YXIgVGFvQmFvU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIFRhb0Jhb1NlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMuX2FwcE5hbWUgPSAiVGFvQmFvU2VydmljZSIsIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uVGFvQmFvLCAvdGFvYmFvXC5jb21cLy9pIF0sIFsgU2l0ZUVudW0uVE1hbGwsIC90bWFsbFwuY29tXC98aGsvaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMuVXJsVGFnID0gIldhbmRoaV9xTGluayIsIF90aGlzOwogICAgICAgIH0KICAgICAgICB2YXIgX2E7CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhUYW9CYW9TZXJ2aWNlLCBfc3VwZXIpLCBUYW9CYW9TZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ29yZS5hcHBlbmRDc3MoIi8vY2RuLndhbmRoaS5jb20vc3R5bGUvZXh0ZW5zdGlvbi9odWkuc3R5bGUuY3NzIik7CiAgICAgICAgfSwgVGFvQmFvU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuaW5pdCgpLCB0aGlzLmhpc3RvcnlTZXJ2aWNlLmxpbmtUZXN0KCkgJiYgdGhpcy5oaXN0b3J5U2VydmljZS5Qcm9jZXNzKCk7CiAgICAgICAgfSwgVGFvQmFvU2VydmljZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2EsIF90aGlzID0gdGhpcywgaW5pdCA9ICI8ZGl2IGlkPSd3YW5kaGlfZGl2Jz48dGFibGUgY2xhc3M9J3dhbmRoaV90YWInIGlkPSd3YW5kaGlfdGFibGUnPjx0aGVhZD48dHI+PHRoPjxiIHN0eWxlPSdjdXJzb3I6cG9pbnRlcic+XHU0ZjE4XHU2MGUwXHU1MjM4PC9iPjwvdGg+PHRoPlx1NTIzOFx1NTQwZTwvdGg+PHRoPlx1NjcwOSBcdTY1NDggXHU2NzFmPC90aD48dGg+XHU2NGNkXHU0ZjVjPC90aD48L3RyPjwvdGhlYWQ+PHRyPjx0ZCBjb2xzcGFuPSc0Jz5cdTZiNjNcdTU3MjhcdTY3ZTVcdThiZTJcdTRmMThcdTYwZTBcdTRmZTFcdTYwNmZcdWZmMGNcdThiZjdcdTdhMGRcdTUwMTkuLi48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj4iOwogICAgICAgICAgICAkKCIjSl9MaW5rQmFza2V0IikucGFyZW50KCkucGFyZW50KCkucHJlcGVuZChpbml0KSwgJCgiLkpfTGlua0FkZCIpLnBhcmVudCgpLnBhcmVudCgpLnByZXBlbmQoaW5pdCksIAogICAgICAgICAgICAobnVsbCA9PT0gKF9hID0gdGhpcy5ydWxlcy5nZXQoU2l0ZUVudW0uVGFvQmFvKSkgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLnRlc3QodGhpcy5jb3JlLmN1cnJlbnRVcmwoKSkpID8gJCgiI3dhbmRoaV90YWJsZSIpLmFkZENsYXNzKCJ3YW5kaGlfdGFiX3Rhb2JhbyIpIDogJCgiI3dhbmRoaV90YWJsZSIpLmFkZENsYXNzKCJ3YW5kaGlfdGFiX3RtYWxsIik7CiAgICAgICAgICAgIHZhciBpdGVtSWQgPSB0aGlzLmNvcmUuZ2V0UGFyKCJpZCIpLCBrZXkgPSAidGRfc18iICsgaXRlbUlkLCBkID0gQ29uZmlnLmdldChrZXksICExKTsKICAgICAgICAgICAgZCA/IHRoaXMuaW5pdEVsZW1lbnQoZCkgOiBSb3V0ZS5xdWVyeUNvdXBvbnMoaXRlbUlkLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgQ29uZmlnLnNldChrZXksIGRhdGEsIDQzMjAwKSwgX3RoaXMuaW5pdEVsZW1lbnQoZGF0YSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBUYW9CYW9TZXJ2aWNlLnByb3RvdHlwZS5pbml0RWxlbWVudCA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICAkKCIjd2FuZGhpX3RhYmxlIHRib2R5IHRyIikucmVtb3ZlKCk7CiAgICAgICAgICAgIHZhciByb3cgPSAiIjsKICAgICAgICAgICAgZGF0YS5jb2RlICYmIChudWxsID09PSAoX2EgPSBkYXRhLmRhdGEpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCAmJiAic3RyaW5nIiAhPSB0eXBlb2YgZGF0YS5kYXRhID8gZGF0YS5kYXRhLmZvckVhY2goKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJvdyArPSAiPHRyPjx0ZD4iICsgZS5xdWFuX2NvbnRleHQgKyAiPC90ZD48dGQ+IiArIGUuYWZ0ZXJfcHJpY2UgKyAiPC90ZD48dGQ+IiArIGUucXVhbl90aW1lICsgIjwvdGQ+PHRkPjxiIG9uY2xpY2s9d2luZG93Lm9wZW4oZGVjb2RlVVJJQ29tcG9uZW50KCciICsgZS5xdWFuX2xpbmsgKyAiJykpIHN0eWxlPSdjdXJzb3I6cG9pbnRlcic+XHU5ODg2XHU1M2Q2PC9iPjwvdGQ+PC90cj4iOwogICAgICAgICAgICB9KSkgOiByb3cgPSAiPHRyPjx0ZCBjb2xzcGFuPSc0Jz5cdThmZDlcdTRlMmFcdTU1NDZcdTU0YzFcdTZjYTFcdTY3MDlcdThkODVcdTUwM2NcdTRmMThcdTYwZTBcdTUyMzg8L3RkPjwvdHI+IiwgCiAgICAgICAgICAgICQoIiN3YW5kaGlfdGFibGUgdGJvZHkiKS5hcHBlbmQocm93KTsKICAgICAgICB9LCBfX2RlY29yYXRlKFsgV2FuZGhpQXV0bywgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCAiZnVuY3Rpb24iID09IHR5cGVvZiAoX2EgPSB2b2lkIDAgIT09IEd3ZFNlcnZpY2UgJiYgR3dkU2VydmljZSkgPyBfYSA6IE9iamVjdCkgXSwgVGFvQmFvU2VydmljZS5wcm90b3R5cGUsICJoaXN0b3J5U2VydmljZSIsIHZvaWQgMCksIAogICAgICAgIFRhb0Jhb1NlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBCaWxpSW1nU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIEJpbGlJbWdTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5CaWxpQmlsaSwgL2JpbGliaWxpXC5jb21cL3ZpZGVvXC9bYXZ8YnZdKi9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fYXBwTmFtZSA9ICJiaWxpYmlsaSIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKEJpbGlJbWdTZXJ2aWNlLCBfc3VwZXIpLCBCaWxpSW1nU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENvcmUuYXBwZW5kQ3NzKCIvL2xpYi5iYW9taXR1LmNvbS9sYXllci8zLjEuMS90aGVtZS9kZWZhdWx0L2xheWVyLmNzcyIpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgfSwgQmlsaUltZ1NlcnZpY2UucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ29yZS5hdXRvTGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKCQoIi52aWRlby1kYXRhIikubGVuZ3RoICYmICQoIi5iaWxpYmlsaS1wbGF5ZXItdmlkZW8taW5mby1wZW9wbGUtbnVtYmVyIikubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvaW4gPSAkKCIuY29pbiIpLnRleHQoKS5yZXBsYWNlKCJcdTRlMDciLCAiIikudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgkLmlzTnVtZXJpYyhjb2luKSB8fCAiXHU2Mjk1XHU1ZTAxIiA9PSBjb2luKSByZXR1cm4gITA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgIH0pLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBCaWxpSW1nU2VydmljZS5hZGRfaW1nX2J0bigpLCBCaWxpSW1nU2VydmljZS5hZGRfZG93bl9idG4oKSwgQmlsaUltZ1NlcnZpY2UuYWRkX3RyaXBsZV9idG4oKTsKICAgICAgICAgICAgfSksIDEpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLmFkZF9pbWdfYnRuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoIi52aWRlby1kYXRhIikubGFzdCgpLmFwcGVuZChCaWxpSW1nU2VydmljZS5idG4pLCAkKCJib2R5Iikub24oImNsaWNrIiwgIiNmaW5kaW1nIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGFpZCA9IHVuc2FmZVdpbmRvdy5fX0lOSVRJQUxfU1RBVEVfXy52aWRlb0RhdGEuYWlkOwogICAgICAgICAgICAgICAgUm91dGUucXVlcnlCaWxpSW1nKGFpZCwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgIDAgPT09IHJlcy5jb2RlID8gQWxlcnQub3BlbigiXHU1YzAxXHU5NzYyXHU5MTcxIiwgJzxpbWcgc3JjPSInICsgcmVzLmRhdGEucGljICsgJyIgc3R5bGU9IndpZHRoOiA3MDVweDtoZWlnaHQ6IDQwMHB4OyIgYWx0PSJcdTVjMDFcdTk3NjIiPicsIFsgIjcyNXB4IiwgIjQwMHB4IiBdKSA6IEFsZXJ0LmVycm9yKCJcdTU0Y2VcdTU0ZGZcdTZjYTFcdTYyN2VcdTUyMzBcdTVjMDFcdTk3NjJcdTU0ZTZcdWZmMGNcdTg5ODFcdTRlMGRcdThkZGZcdTRmNWNcdTgwMDVcdTYyYTVcdTU0NGFcdTRlMDBcdTRlMGJcdWZmMWYiKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLmFkZF9kb3duX2J0biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCIudmlkZW8tZGF0YSIpLmxhc3QoKS5hcHBlbmQoQmlsaUltZ1NlcnZpY2UuZG93biksICQoImJvZHkiKS5vbigiY2xpY2siLCAiI2Rvd252aWRlbyIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIGFpZCA9IHVuc2FmZVdpbmRvdy5fX0lOSVRJQUxfU1RBVEVfXy52aWRlb0RhdGEuYWlkLCBjaWQgPSBudWxsICE9PSAoX2IgPSBudWxsID09PSAoX2EgPSB1bnNhZmVXaW5kb3cuX19JTklUSUFMX1NUQVRFX18uY2lkTWFwW2FpZF0pIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5jaWQpICYmIHZvaWQgMCAhPT0gX2IgPyBfYiA6IHVuc2FmZVdpbmRvdy5fX0lOSVRJQUxfU1RBVEVfXy52aWRlb0RhdGEuY2lkLCBrZXkgPSBhaWQudG9TdHJpbmcoKSArIGNpZC50b1N0cmluZygpICsgIk1ERCI7CiAgICAgICAgICAgICAgICBpZiAoTG9nZ2VyLmRlYnVnKFsgYWlkLCBjaWQgXSksIGFpZCAmJiBjaWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdl8xID0gQ29uZmlnLmdldChrZXksICExKTsKICAgICAgICAgICAgICAgICAgICB2XzEgPyAodl8xID0gdl8xLCBBbGVydC5jb25maW0oIlx1NGUwYlx1OGY3ZFx1NTczMFx1NTc0MCIsICJcdTY3ZTVcdThiZTJcdTUyMzBbIiArIHZfMS5kYXRhLmFjY2VwdF9kZXNjcmlwdGlvblt2XzEuZGF0YS5kdXJsWzBdLm9yZGVyXSArICJdXHVmZjBjXHU2NjJmXHU1NDI2XHU0ZTBiXHU4ZjdkXHVmZjFmIiwgWyAiXHU1OTdkXHU3Njg0XHU4ZDcwXHU4ZDc3IiwgIlx1OGZkOFx1NjYyZlx1N2I5N1x1NGU4NiIgXSwgKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odl8xLmRhdGEuZHVybFswXS51cmwpOwogICAgICAgICAgICAgICAgICAgIH0pLCAhMCkpIDogUm91dGUucXVlcnlCaWxpRG93bihhaWQsIGNpZCwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgICAgICAgICAgICAgICIiICE9IChudWxsID09PSAoX2EgPSByZXMuZGF0YSkgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLmR1cmxbMF0udXJsKSA/IChDb25maWcuc2V0KGtleSwgcmVzLCBNaW4pLCAKICAgICAgICAgICAgICAgICAgICAgICAgQWxlcnQuY29uZmltKCJcdTRlMGJcdThmN2RcdTU3MzBcdTU3NDAiLCAiXHU2N2U1XHU4YmUyXHU1MjMwWyIgKyByZXMuZGF0YS5hY2NlcHRfZGVzY3JpcHRpb25bcmVzLmRhdGEuZHVybFswXS5vcmRlcl0gKyAiXVx1ZmYwY1x1NjYyZlx1NTQyNlx1NGUwYlx1OGY3ZFx1ZmYxZiIsIFsgIlx1NTk3ZFx1NzY4NFx1OGQ3MFx1OGQ3NyIsICJcdThmZDhcdTY2MmZcdTdiOTdcdTRlODYiIF0sIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihyZXMuZGF0YS5kdXJsWzBdLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhMCkpIDogQWxlcnQuZXJyb3IoIlx1NTU2NVx1NGU1Zlx1NmNhMVx1NjdlNVx1Nzc0MCxcdTVlMjZcdTc3NDBcdTg5YzZcdTk4OTFcdTU3MzBcdTU3NDBcdTdlZDlcdTRmNWNcdTgwMDVcdTYyYTVcdTU0NGFcdTRlMDBcdTRlMGJcdTU0Mjd+Iik7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIEFsZXJ0LmVycm9yKCJcdTY2ODJcdTRlMGRcdTY1MmZcdTYzMDFcdTVmNTNcdTUyNGRcdTg5YzZcdTk4OTFcdWZmMGNcdTU5ODJcdTY3MDlcdTc1OTFcdTk1ZWVcdThiZjdcdTVlMjZcdTRlMGFcdTk0ZmVcdTYzYTVcdThiZTJcdTk1ZWVcdTRmNWNcdTgwMDUiKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLmFkZF90cmlwbGVfYnRuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoIi52aWRlby1kYXRhIikubGFzdCgpLmFwcGVuZChCaWxpSW1nU2VydmljZS50cmlwbGVDbGljayksICQoImJvZHkiKS5vbigiY2xpY2siLCAiI3RyaXBsZUNsaWNrIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgWyAiLmxpa2UiLCAiLmNvaW4iLCAiLmNvbGxlY3QiIF0uZm9yRWFjaCgoZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICQoaXRlbSkudHJpZ2dlcigiY2xpY2siKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLmRlY3J5cHQgPSBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIENyeXB0b0pTX19kZWZhdWx0LmRlZmF1bHQuQUVTLmRlY3J5cHQoc3RyLCBDcnlwdG9KU19fZGVmYXVsdC5kZWZhdWx0LmVuYy5MYXRpbjEucGFyc2UoQ29yZS5kZWNvZGUoQjEpKSwgewogICAgICAgICAgICAgICAgaXY6IENyeXB0b0pTX19kZWZhdWx0LmRlZmF1bHQuZW5jLkxhdGluMS5wYXJzZShDb3JlLmRlY29kZShCMikpLAogICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlNfX2RlZmF1bHQuZGVmYXVsdC5tb2RlLkNCQywKICAgICAgICAgICAgICAgIGFkZGluZzogQ3J5cHRvSlNfX2RlZmF1bHQuZGVmYXVsdC5wYWQuWmVyb1BhZGRpbmcKICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlNfX2RlZmF1bHQuZGVmYXVsdC5lbmMuVXRmOCk7CiAgICAgICAgfSwgQmlsaUltZ1NlcnZpY2UuYnRuID0gJ1xuICAgIDxzcGFuIGlkPSJmaW5kaW1nIiBzdHlsZT0iXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZiNzE5OTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgICBwYWRkaW5nOjAuNXJlbTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogMXJlbTtcbiAgICAiPlxuICAgICAgICBcdTgzYjdcdTUzZDZcdTVjMDFcdTk3NjJcbiAgICA8L3NwYW4+JywgCiAgICAgICAgQmlsaUltZ1NlcnZpY2UuZG93biA9ICdcbiAgICA8c3BhbiBpZD0iZG93bnZpZGVvIiBzdHlsZT0iXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZiNzE5OTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgICBwYWRkaW5nOjAuNXJlbTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogMXJlbTtcbiAgICAiPlxuICAgICAgICBcdTRlMGJcdThmN2RcdTg5YzZcdTk4OTFcbiAgICA8L3NwYW4+JywgCiAgICAgICAgQmlsaUltZ1NlcnZpY2UudHJpcGxlQ2xpY2sgPSAnXG4gICAgPHNwYW4gaWQ9InRyaXBsZUNsaWNrIiBzdHlsZT0iXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZiNzE5OTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgICBwYWRkaW5nOjAuNXJlbTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogMXJlbTtcbiAgICAiPlxuICAgICAgICBcdTRlMDBcdTk1MmVcdTRlMDlcdThmZGVcbiAgICA8L3NwYW4+JywgCiAgICAgICAgQmlsaUltZ1NlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBNZW51JDEgPSBDb21tb24uTWVudSwgTW92aWVTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gTW92aWVTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5Zb3VLdSwgL3lvdWt1XC5jb20vaSBdLCBbIFNpdGVFbnVtLklRaVlpLCAvaXFpeWl8aXFcLmNvbS9pIF0sIFsgU2l0ZUVudW0uTGVTaGksIC9cLmxlXC5jb20vaSBdLCBbIFNpdGVFbnVtLlRlbmNlbnRfViwgL3ZcLnFxL2kgXSwgWyBTaXRlRW51bS5UdURvdSwgL3R1ZG91XC5jb20vaSBdLCBbIFNpdGVFbnVtLk1hbmdHdW8sIC9tZ3R2XC5jb20vaSBdLCBbIFNpdGVFbnVtLlNvSHUsIC9zb2h1XC5jb20vaSBdLCBbIFNpdGVFbnVtLkFjZnVuLCAvYWNmdW5cLmNvbS9pIF0sIFsgU2l0ZUVudW0uQmlsaUJpbGksIC9iaWxpYmlsaVwuY29tL2kgXSwgWyBTaXRlRW51bS5NMTkwNSwgLzE5MDVcLmNvbS9pIF0sIFsgU2l0ZUVudW0uUFBUViwgL3BwdHZcLmNvbS9pIF0sIFsgU2l0ZUVudW0uWWluWXVlVGFpLCAveWlueXVldGFpXC5jb20vIF0gXSksIAogICAgICAgICAgICBfdGhpcy5tZW51ID0gbmV3IENvbW1vbi5NZW51LCBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKE1vdmllU2VydmljZSwgX3N1cGVyKSwgTW92aWVTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgInVuZGVmaW5lZCIgPT0gdHlwZW9mICQgJiYgQ29yZS5hcHBlbmRKcygiLy9saWIuYmFvbWl0dS5jb20vanF1ZXJ5LzEuMTIuNC9qcXVlcnkubWluLmpzIik7CiAgICAgICAgfSwgTW92aWVTZXJ2aWNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5tZW51LkluaXQoWyB7CiAgICAgICAgICAgICAgICB0aXRsZTogIlx1NjcyY1x1NmIyMVx1NTE3M1x1OTVlZCIsCiAgICAgICAgICAgICAgICBzaG93OiAiXHU2NzJjXHU2YjIxPGJyPlx1NTE3M1x1OTVlZCIsCiAgICAgICAgICAgICAgICB0eXBlOiAic2VhcmNoIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0aXRsZTogIlx1ODljNlx1OTg5MVx1ODllM1x1Njc5MCIsCiAgICAgICAgICAgICAgICBzaG93OiAiXHU4OWM2XHU5ODkxPGJyPlx1ODllM1x1Njc5MCIsCiAgICAgICAgICAgICAgICB0eXBlOiAicHJvY2VzcyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTdlZGRcdTRlMTZcdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1N2VkZFx1NGUxNjxicj5cdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgdHlwZTogInRiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0aXRsZTogIlx1NGVhY1x1NGUxY1x1NTk3ZFx1NTIzOCIsCiAgICAgICAgICAgICAgICBzaG93OiAiXHU0ZWFjXHU0ZTFjPGJyPlx1NTk3ZFx1NTIzOCIsCiAgICAgICAgICAgICAgICB0eXBlOiAiamQiCiAgICAgICAgICAgIH0gXSwgdGhpcy5fb25DbGljayk7CiAgICAgICAgfSwgTW92aWVTZXJ2aWNlLnByb3RvdHlwZS5fb25DbGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCJib2R5Iikub24oImNsaWNrIiwgIltkYXRhLWNhdD1wcm9jZXNzXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIENvcmUub3BlbigiaHR0cDovL3R2LndhbmRoaS5jb20vZ28uaHRtbD91cmw9IiArIGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZikpOwogICAgICAgICAgICB9KSksICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXNlYXJjaF0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBNZW51JDEuY2xvc2UoKTsKICAgICAgICAgICAgfSkpLCAkKCJib2R5Iikub24oImNsaWNrIiwgIltkYXRhLWNhdD10Yl0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHA6Ly9zaG9wLmh1aXpoZWsuY29tIik7CiAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9amRdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwOi8vamQuaHVpemhlay5jb20iKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIE1vdmllU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIEpkU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIEpkU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9hcHBOYW1lID0gIkpkU2VydmljZSIsIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uSmluZ0RvbmcsIC9pdGVtXC4oeWl5YW9qZHxqZClcLmMvaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gX19leHRlbmRzKEpkU2VydmljZSwgX3N1cGVyKSwgSmRTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5oaXN0b3J5U2VydmljZS5saW5rVGVzdCgpICYmIHRoaXMuaGlzdG9yeVNlcnZpY2UuUHJvY2VzcygpOwogICAgICAgIH0sIEpkU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBrZXl3b3JkcyA9ICQoIi5za3UtbmFtZSIpLnRleHQoKS50cmltKCk7CiAgICAgICAgICAgICQoIiNjaG9vc2UtYnRucyIpLnByZXBlbmQoJzxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9ImJ0bi1zcGVjaWFsMSBidG4tbGcgYnRuLXloaiI+PHNwYW4gY2xhc3M9IiI+XHU2N2U1XHU4YmUyXHU0ZjE4XHU2MGUwXHU1MjM4PC9zcGFuPjwvYT4nKSwgCiAgICAgICAgICAgICQoIi5idG4teWhqIikub24oImNsaWNrIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwOi8vamQuaHVpemhlay5jb20vP2FoPXRvdGFsJmt3PSIgKyBlbmNvZGVVUklDb21wb25lbnQoa2V5d29yZHMpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIF9fZGVjb3JhdGUoWyBXYW5kaGlBdXRvLCBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsICJmdW5jdGlvbiIgPT0gdHlwZW9mIChfYSA9IHZvaWQgMCAhPT0gR3dkU2VydmljZSAmJiBHd2RTZXJ2aWNlKSA/IF9hIDogT2JqZWN0KSBdLCBKZFNlcnZpY2UucHJvdG90eXBlLCAiaGlzdG9yeVNlcnZpY2UiLCB2b2lkIDApLCAKICAgICAgICBKZFNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBVcmxIZWxwZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBVcmxIZWxwZXIoKSB7fQogICAgICAgIHJldHVybiBVcmxIZWxwZXIuQmluZCA9IGZ1bmN0aW9uKENzc1NlbGVjdG9yLCBtZXRob2QsIGRvYykgewogICAgICAgICAgICAkKENzc1NlbGVjdG9yKS5jbGljaygoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW5VcmwoJCh0aGlzKS5kYXRhKCJrZXkiKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBVcmxIZWxwZXIudXJsRW5jb2RlID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodXJsKTsKICAgICAgICB9LCBVcmxIZWxwZXIudXJsRGVjb2RlID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTsKICAgICAgICB9LCBVcmxIZWxwZXI7CiAgICB9KCksIE11c2ljU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIE11c2ljU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uV2FuZ1lpLCAvMTYzKC4qKXNvbmcvaSBdLCBbIFNpdGVFbnVtLlRlbmNlbnRfTSwgL3lcLlFRKC4qKXNvbmcvaSBdLCBbIFNpdGVFbnVtLkt1R291LCAva3Vnb3VcLmNvbVwvc29uZ1wvKi9pIF0sIFsgU2l0ZUVudW0uS3VXbywgL2t1d28oLiopeWlueXVlL2kgXSwgWyBTaXRlRW51bS5YaWFNaSwgL3hpYW1pL2kgXSwgWyBTaXRlRW51bS5UYWlIZSwgL3RhaWhlXC5jb20vaSBdLCBbIFNpdGVFbnVtLlFpbmdUaW5nLCAvcWluZ3RpbmdcLi9pIF0sIFsgU2l0ZUVudW0uTGlaaGksIC9saXpoaVwuL2kgXSwgWyBTaXRlRW51bS5NaUd1LCAvbWlndVwuL2kgXSwgWyBTaXRlRW51bS5YaU1hTGFZYSwgL3hpbWFsYXlhXC4vaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMubWVudSA9IG5ldyBDb21tb24uTWVudSwgX3RoaXMuX2FwcE5hbWUgPSAiTXVzaWNTZXJ2aWNlIiwgX3RoaXMuX3VuaXF1ZSA9ICExLCAKICAgICAgICAgICAgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoTXVzaWNTZXJ2aWNlLCBfc3VwZXIpLCBNdXNpY1NlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDb3JlLmFwcGVuZENzcygiLy9saWIuYmFvbWl0dS5jb20vbGF5ZXIvMy4xLjEvdGhlbWUvZGVmYXVsdC9sYXllci5jc3MiKTsKICAgICAgICB9LCBNdXNpY1NlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLm1lbnUuSW5pdChbIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU3NTM1XHU1ZjcxXHU2NDFjXHU3ZDIyIiwKICAgICAgICAgICAgICAgIHNob3c6ICJcdTc1MzVcdTVmNzE8YnI+XHU2NDFjXHU3ZDIyIiwKICAgICAgICAgICAgICAgIHR5cGU6ICJzZWFyY2giCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU5N2YzXHU0ZTUwXHU0ZTBiXHU4ZjdkIiwKICAgICAgICAgICAgICAgIHNob3c6ICJcdTk3ZjNcdTRlNTA8YnI+XHU0ZTBiXHU4ZjdkIiwKICAgICAgICAgICAgICAgIHR5cGU6ICJwcm9jZXNzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0aXRsZTogIlx1N2VkZFx1NGUxNlx1NTk3ZFx1NTIzOCIsCiAgICAgICAgICAgICAgICBzaG93OiAiXHU3ZWRkXHU0ZTE2PGJyPlx1NTk3ZFx1NTIzOCIsCiAgICAgICAgICAgICAgICB0eXBlOiAidGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU0ZWFjXHU0ZTFjXHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHNob3c6ICJcdTRlYWNcdTRlMWM8YnI+XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHR5cGU6ICJqZCIKICAgICAgICAgICAgfSBdLCB0aGlzLl9PbkNsaWNrKTsKICAgICAgICB9LCBNdXNpY1NlcnZpY2UucHJvdG90eXBlLl9PbkNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucnVsZXMsICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXByb2Nlc3NdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF9hLCBfYjsKICAgICAgICAgICAgICAgIGlmICgveGltYWxheWEvaS50ZXN0KFJ1bnRpbWUudXJsKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5zYWZlV2luZG93LmRvY3VtZW50LnNjcmlwdHMubGVuZ3RoOyBpKyspIC93aW5kb3dcLl9fSU5JVElBTF9TVEFURV9fID0vaS50ZXN0KHVuc2FmZVdpbmRvdy5kb2N1bWVudC5zY3JpcHRzW2ldLmlubmVySFRNTCkgJiYgKExvZ2dlci5kZWJ1Zyh1bnNhZmVXaW5kb3cuZG9jdW1lbnQuc2NyaXB0c1tpXS5pbm5lckhUTUwpLCAKICAgICAgICAgICAgICAgICAgICBldmFsKHVuc2FmZVdpbmRvdy5kb2N1bWVudC5zY3JpcHRzW2ldLmlubmVySFRNTC5yZXBsYWNlKCJ3aW5kb3cuX19JTklUSUFMX1NUQVRFX18iLCAidW5zYWZlV2luZG93Ll9fSU5JVElBTF9TVEFURV9fIikpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoX19JTklUSUFMX1NUQVRFX18gJiYgKG51bGwgPT09IChfYiA9IG51bGwgPT09IChfYSA9IF9fSU5JVElBTF9TVEFURV9fLnN0b3JlKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EuU291bmREZXRhaWxQYWdlKSB8fCB2b2lkIDAgPT09IF9iID8gdm9pZCAwIDogX2IudHJhY2tJZCkpIENvcmUub3BlbigiaHR0cDovL211c2ljLndhbmRoaS5jb20vP2lkPSIgKyBfX0lOSVRJQUxfU1RBVEVfXy5zdG9yZS5Tb3VuZERldGFpbFBhZ2UudHJhY2tJZCArICImdHlwZT14aW1hbGF5YSIpOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuY2xvc2VBbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT0icGFkZGluZzowcHggNTBweCAwcHggNTBweDsiPjx1bCBjbGFzcz0ic291bmQtbGlzdCBkT2kyIj4nOwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goX19JTklUSUFMX1NUQVRFX18uc3RvcmUuQWxidW1EZXRhaWxUcmFja0xpc3QudHJhY2tzSW5mby50cmFja3MsIChmdW5jdGlvbihpbmRleCwgaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGxpIGNsYXNzPSJkMGkyIj48YSBocmVmPSJodHRwOi8vbXVzaWMud2FuZGhpLmNvbS8/aWQ9JyArIGl0ZW0udHJhY2tJZCArICcmdHlwZT14aW1hbGF5YSIgdGFyZ2V0PSJfYmxhbmsiPicgKyBpdGVtLnRpdGxlICsgIjwvYT48L2xpPiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgaHRtbCArPSAiPC91bD48L2Rpdj4iLCBsYXllci5vcGVuKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhOiBbICJhdXRvIiwgIjMwJSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU0ZTNhXHU0ZjYwXHU2MjdlXHU1MjMwXHU0ZTg2XHU4ZmQ5XHU0ZTliXHU2NmYyXHU3NmVlXHU4OWUzXHU2NzkwXHUyMDI2XHUyMDI2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlOiAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heG1pbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogaHRtbAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgL3RhaWhlLmNvbS9pLnRlc3QoUnVudGltZS51cmwpID8gQ29yZS5vcGVuKCJodHRwOi8vbXVzaWMud2FuZGhpLmNvbS8/dXJsPSIgKyBVcmxIZWxwZXIudXJsRW5jb2RlKFJ1bnRpbWUudXJsLnJlcGxhY2UoInRhaWhlIiwgImJhaWR1IikpKSA6IENvcmUub3BlbigiaHR0cDovL211c2ljLndhbmRoaS5jb20vP3VybD0iICsgVXJsSGVscGVyLnVybEVuY29kZShSdW50aW1lLnVybCkpOwogICAgICAgICAgICB9KSksICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXNlYXJjaF0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHA6Ly90di53YW5kaGkuY29tLyIpOwogICAgICAgICAgICB9KSksICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXRiXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIENvcmUub3BlbigiaHR0cHM6Ly90LmNuL0E2TG9Za25XIik7CiAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9amRdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwczovL3QuY24vQTZMb1luSFQiKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIE11c2ljU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIEl0ZW1UeXBlOwogICAgIWZ1bmN0aW9uKEl0ZW1UeXBlKSB7CiAgICAgICAgSXRlbVR5cGUuVGFvQmFvID0gInRiIiwgSXRlbVR5cGUuVE1hbGwgPSAidG0iLCBJdGVtVHlwZS5KaW5nRG9uZyA9ICJqZCIsIEl0ZW1UeXBlLkppbmdEb25nQ2hhb3NoaSA9ICJqZGNzIjsKICAgIH0oSXRlbVR5cGUgfHwgKEl0ZW1UeXBlID0ge30pKTsKICAgIHZhciBUYW8gPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBUYW8oKSB7fQogICAgICAgIHJldHVybiBUYW8uaXNWYWlsaWRJdGVtSWQgPSBmdW5jdGlvbihpdGVtSWQpIHsKICAgICAgICAgICAgaWYgKCFpdGVtSWQpIHJldHVybiAhMTsKICAgICAgICAgICAgdmFyIGl0ZW1JZEludCA9IHBhcnNlSW50KGl0ZW1JZCk7CiAgICAgICAgICAgIHJldHVybiBpdGVtSWRJbnQudG9TdHJpbmcoKSA9PSBpdGVtSWQgJiYgaXRlbUlkSW50ID4gMWU0OwogICAgICAgIH0sIFRhby5pc1ZhbGlkVGFvSWQgPSBmdW5jdGlvbihpdGVtSWQpIHsKICAgICAgICAgICAgcmV0dXJuICEhaXRlbUlkICYmICghIUNvcmUuaXNOdW1iZXIoaXRlbUlkKSB8fCAoIShpdGVtSWQuaW5kZXhPZigiaHR0cCIpID49IDApIHx8ICEoIXRoaXMuaXNUYW9CYW9EZXRhaWxQYWdlKGl0ZW1JZCkgJiYgIWl0ZW1JZC5pbmNsdWRlcygiLy9kZXRhaWwuanUudGFvYmFvLmNvbS9ob21lLmh0bSIpKSkpOwogICAgICAgIH0sIFRhby5pc1Rhb0Jhb0RldGFpbFBhZ2UgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgcmV0dXJuIHVybC5pbmNsdWRlcygiLy9pdGVtLnRhb2Jhby5jb20vaXRlbS5odG0iKSB8fCB1cmwuaW5jbHVkZXMoIi8vZGV0YWlsLnRtYWxsLmNvbS9pdGVtLmh0bSIpIHx8IHVybC5pbmNsdWRlcygiLy9jaGFvc2hpLmRldGFpbC50bWFsbC5jb20vaXRlbS5odG0iKSB8fCB1cmwuaW5jbHVkZXMoIi8vZGV0YWlsLnRtYWxsLmhrL2hrL2l0ZW0uaHRtIik7CiAgICAgICAgfSwgVGFvOwogICAgfSgpLCBMaXN0U2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIExpc3RTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5UYW9CYW8sIC9zXC50YW9iYW9cLmNvbVwvc2VhcmNoL2kgXSwgWyBTaXRlRW51bS5UTWFsbCwgL2xpc3RcLnRtYWxsXC5jb21cL3NlYXJjaF9wcm9kdWN0XC5odG0vaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMuc2VsZWN0b3JMaXN0ID0gW10sIF90aGlzLnNlbGVjdG9yYSA9IFtdLCBfdGhpcy5hdHJhY2sgPSBbXSwgX3RoaXMua2V5ID0gImxpc3Rfc2VydmljZV8iLCAKICAgICAgICAgICAgX3RoaXMuX2FwcE5hbWUgPSAiVGFvTGlzdCIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKExpc3RTZXJ2aWNlLCBfc3VwZXIpLCBMaXN0U2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7fSwgCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExpc3RTZXJ2aWNlLCAic3R5bGUiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIiAgICBcbiAgICAub25la2V5dmlwLXRiLWJveC1hcmVhIHtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAxMHB4O3JpZ2h0OiA1cHg7ei1pbmRleDogOTk5OTt9XG4gICAgLm9uZWtleXZpcC1qZC1ib3gtYXJlYSB7cG9zaXRpb246IGFic29sdXRlO3RvcDogMjM1cHg7bGVmdDogMTBweDt6LWluZGV4OiA5OTk5O30gIFxuICAgIC5vbmVrZXl2aXAtamRjcy1ib3gtYXJlYSB7cG9zaXRpb246IGFic29sdXRlO3RvcDogNXB4O3JpZ2h0OiAwcHg7ei1pbmRleDogOTk5OTt9XG4gICAgLm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudHtvcGFjaXR5OiAuMzM7fVxuICAgIC5vbmVrZXl2aXAtYm94LWluZm8sIC5vbmVrZXl2aXAtYm94LWluZm86aG92ZXIsIC5vbmVrZXl2aXAtYm94LWluZm86dmlzaXRlZCB7dGV4dC1kZWNvcmF0aW9uOiBub25lIWltcG9ydGFudDt9XG4gICAgLm9uZWtleXZpcC1ib3gtd2FpdHtjdXJzb3I6cG9pbnRlcn1cbiAgICAub25la2V5dmlwLWJveC1pbmZvIHt3aWR0aDogYXV0byFpbXBvcnRhbnQ7aGVpZ2h0OiBhdXRvIWltcG9ydGFudDtwYWRkaW5nOiA2cHggOHB4IWltcG9ydGFudDtmb250LXNpemU6IDEycHg7Y29sb3I6ICNmZmYhaW1wb3J0YW50O2JvcmRlci1yYWRpdXM6IDE1cHg7Y3Vyc29yOiBwb2ludGVyO31cbiAgICAub25la2V5dmlwLWpkLWJveC1pbmZvLWRlZmF1bHQsIC5vbmVrZXl2aXAtdGItYm94LWluZm8tZGVmYXVsdCwgLm9uZWtleXZpcC1qZGNzLWJveC1pbmZvLWRlZmF1bHR7YmFja2dyb3VuZDogIzMxODZmZCFpbXBvcnRhbnQ7fVxuICAgIC5vbmVrZXl2aXAtYm94LWluZm8tZW1wdHkge2NvbG9yOiAjMDAwIWltcG9ydGFudDtiYWNrZ3JvdW5kOiAjY2NjIWltcG9ydGFudDt9XG4gICAgLm9uZWtleXZpcC1ib3gtaW5mby1maW5kIHtiYWNrZ3JvdW5kOiAjZmYwMDM2IWltcG9ydGFudDt9XG4gICAgLm9uZWtleXZpcC1ib3gtZG9uZXtwb3NpdGlvbjpyZWxhdGl2ZX1cbiAgICAiOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgIH0pLCBMaXN0U2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zaXRlKSB7CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5UYW9CYW86CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yTGlzdC5wdXNoKCIuaXRlbXMgLml0ZW0iKSwgdGhpcy5hdHJhY2sucHVzaCgiLnBpYyBhIiwgIi50aXRsZSBhIiksIAogICAgICAgICAgICAgICAgdGhpcy5pdGVtVHlwZSA9IEl0ZW1UeXBlLlRhb0JhbzsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlRNYWxsOgogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rvckxpc3QucHVzaCgiLnByb2R1Y3QiKSwgdGhpcy5hdHJhY2sucHVzaCgiLnByb2R1Y3RJbWctd3JhcCBhIiwgIi5wcm9kdWN0VGl0bGUgYSIpLCAKICAgICAgICAgICAgICAgIHRoaXMuaXRlbVR5cGUgPSBJdGVtVHlwZS5UYW9CYW87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmluaXRTdHlsZSgpLCBDb3JlLmF1dG9MYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9ICQgJiYgbnVsbCAhPSBqUXVlcnk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuaW5pdFNlYXJjaEV2ZW50KCk7CiAgICAgICAgICAgIH0pLCAzKSwgdGhpcy5jb3JlLmJhY2tncm91bmQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuaW5pdFNlYXJjaCh0aGF0KTsKICAgICAgICAgICAgfSksIDMpLCB0aGlzLmNvcmUuYmFja2dyb3VuZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5pbml0UXVlcnkoKTsKICAgICAgICAgICAgfSksIDQpOwogICAgICAgIH0sIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5pbml0U3R5bGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ29yZS5hcHBlbmRDc3NDb250ZW50KExpc3RTZXJ2aWNlLnN0eWxlKTsKICAgICAgICB9LCBMaXN0U2VydmljZS5wcm90b3R5cGUuaW5pdFNlYXJjaEV2ZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIub25la2V5dmlwLSIgKyB0aGF0Lml0ZW1UeXBlICsgIi1ib3gtYXJlYSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLmhhc0NsYXNzKCJvbmVrZXl2aXAtYm94LXdhaXQiKSA/IHRoYXQucXVlcnlJbmZvKHRoaXMpIDogJHRoaXMuaGFzQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpID8gJHRoaXMucmVtb3ZlQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpIDogJHRoaXMuYWRkQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvcmUuYmFja2dyb3VuZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiLm9uZWtleXZpcC0iICsgdGhhdC5pdGVtVHlwZSArICItYm94LWFyZWEiKS5jbGljaygoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmhhc0NsYXNzKCJvbmVrZXl2aXAtYm94LXdhaXQiKSA/IHRoYXQucXVlcnlJbmZvKHRoaXMpIDogJHRoaXMuaGFzQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpID8gJHRoaXMucmVtb3ZlQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpIDogJHRoaXMuYWRkQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5pbml0U2VhcmNoID0gZnVuY3Rpb24odGhhdCkgewogICAgICAgICAgICB0aGF0LnNlbGVjdG9yTGlzdC5mb3JFYWNoKChmdW5jdGlvbihlLCBpKSB7CiAgICAgICAgICAgICAgICAkKGUpLmVhY2goKGZ1bmN0aW9uKGluZGV4LCBlbGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0LmluaXRTZWFyY2hJdGVtKGVsZSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBMaXN0U2VydmljZS5wcm90b3R5cGUuaW5pdFNlYXJjaEl0ZW0gPSBmdW5jdGlvbihzZWxlY3RvcikgewogICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgJGRvbSA9ICQoc2VsZWN0b3IpOwogICAgICAgICAgICBpZiAoISRkb20uaGFzQ2xhc3MoIm9uZWtleXZpcC1ib3gtZG9uZSIpKSB7CiAgICAgICAgICAgICAgICAkZG9tLmFkZENsYXNzKCJvbmVrZXl2aXAtYm94LWRvbmUiKTsKICAgICAgICAgICAgICAgIHZhciBpdGVtSWQgPSBudWxsICE9PSAoX2IgPSBudWxsICE9PSAoX2EgPSAkZG9tLmF0dHIoImRhdGEtaWQiKSkgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogJGRvbS5kYXRhKCJza3UiKSkgJiYgdm9pZCAwICE9PSBfYiA/IF9iIDogIiI7CiAgICAgICAgICAgICAgICBpZiAoVGFvLmlzVmFpbGlkSXRlbUlkKGl0ZW1JZCkgfHwgKGl0ZW1JZCA9IG51bGwgIT09IChfZCA9IG51bGwgIT09IChfYyA9ICRkb20uYXR0cigiZGF0YS1pdGVtaWQiKSkgJiYgdm9pZCAwICE9PSBfYyA/IF9jIDogJGRvbS5kYXRhKCJzcHUiKSkgJiYgdm9pZCAwICE9PSBfZCA/IF9kIDogIiIpLCAKICAgICAgICAgICAgICAgICFUYW8uaXNWYWlsaWRJdGVtSWQoaXRlbUlkKSkgaWYgKCRkb20uYXR0cigiaHJlZiIpKSBpdGVtSWQgPSBsb2NhdGlvbi5wcm90b2NvbCArICRkb20uYXR0cigiaHJlZiIpOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJGEgPSAkZG9tLmZpbmQoImEiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRhLmxlbmd0aCkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGl0ZW1JZCA9IG51bGwgIT09IChfZSA9ICRhLmF0dHIoImRhdGEtbmlkIikpICYmIHZvaWQgMCAhPT0gX2UgPyBfZSA6ICIiLCBUYW8uaXNWYWlsaWRJdGVtSWQoaXRlbUlkKSB8fCAoaXRlbUlkID0gJGEuaGFzQ2xhc3MoImpfUmVjZWl2ZUNvdXBvbiIpICYmICRhLmxlbmd0aCA+IDEgPyBsb2NhdGlvbi5wcm90b2NvbCArICQoJGFbMV0pLmF0dHIoImhyZWYiKSA6IGxvY2F0aW9uLnByb3RvY29sICsgJGEuYXR0cigiaHJlZiIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghVGFvLmlzVmFpbGlkSXRlbUlkKGl0ZW1JZCkgJiYgaXRlbUlkLmluZGV4T2YoImh0dHAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IG51bGwgIT09IChfZiA9IC9pdGVtLmpkLmNvbVwvKC4qPykuaHRtbC9pLmV4ZWMoaXRlbUlkKSkgJiYgdm9pZCAwICE9PSBfZiA/IF9mIDogW107CiAgICAgICAgICAgICAgICAgICAgaXRlbUlkID0gcmVzLmxlbmd0aCA+IDAgPyByZXNbMV0gOiAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFRhby5pc1ZhbGlkVGFvSWQoaXRlbUlkKSAmJiAodGhpcy5pbml0Qm94SHRtbCgkZG9tLCBpdGVtSWQpLCB0aGlzLmluaXRUYWdDbGFzcygkZG9tLCBpdGVtSWQpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5pbml0VGFnQ2xhc3MgPSBmdW5jdGlvbih0YXJnZXQsIGl0ZW1JZCkgewogICAgICAgICAgICB0aGlzLmF0cmFjay5mb3JFYWNoKChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZChlKS5oYXNDbGFzcygib25la2V5dmlwLWl0ZW0tIiArIGl0ZW1JZCkgfHwgdGFyZ2V0LmZpbmQoZSkuYWRkQ2xhc3MoIm9uZWtleXZpcC1pdGVtLSIgKyBpdGVtSWQpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLmluaXRCb3hIdG1sID0gZnVuY3Rpb24odGFyZ2V0LCBpdGVtSWQpIHsKICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZCgnPGRpdiBjbGFzcz0ib25la2V5dmlwLScgKyB0aGlzLml0ZW1UeXBlICsgJy1ib3gtYXJlYSBvbmVrZXl2aXAtYm94LXdhaXQiIGRhdGEtaXRlbWlkPSInICsgaXRlbUlkICsgJyI+PGEgY2xhc3M9Im9uZWtleXZpcC1ib3gtaW5mbyBvbmVrZXl2aXAtJyArIHRoaXMuaXRlbVR5cGUgKyAnLWJveC1pbmZvLWRlZmF1bHQiIHRpdGxlPSJcdTcwYjlcdTUxZmJcdTY3ZTVcdThiZTIiPlx1NWY4NVx1NjdlNVx1OGJlMjwvYT48L2Rpdj4nKTsKICAgICAgICB9LCBMaXN0U2VydmljZS5wcm90b3R5cGUuaW5pdFF1ZXJ5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgJCgiLm9uZWtleXZpcC1ib3gtd2FpdCIpLmVhY2goKGZ1bmN0aW9uKGluZGV4LCBlbGUpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gQ29yZS5yYW5kb20oMSwgNSk7CiAgICAgICAgICAgICAgICBDb3JlLnNsZWVwKHMpLnRoZW4oKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQucXVlcnlJbmZvKGVsZSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBMaXN0U2VydmljZS5wcm90b3R5cGUucXVlcnlJbmZvID0gZnVuY3Rpb24odGFyZ2V0KSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCBQcm9taXNlLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdGhhdCwgJHRoaXMsIGl0ZW1JZCwgaywgcmVuZGVyLCBjb3Vwb25JbmZvOwogICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQgPSB0aGlzLCAoJHRoaXMgPSAkKHRhcmdldCkpLnJlbW92ZUNsYXNzKCJvbmVrZXl2aXAtYm94LXdhaXQiKSwgaXRlbUlkID0gJHRoaXMuZGF0YSgiaXRlbWlkIiksIAogICAgICAgICAgICAgICAgICAgICAgICBrID0gdGhhdC5rZXkgKyAiX0FsbF8iICsgaXRlbUlkLCByZW5kZXIgPSBmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9IChudWxsID09IHJlcyA/IHZvaWQgMCA6IHJlcy5jb2RlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3Vwb25JbmZvXzEgPSByZXMuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmluaXRDb3Vwb25JbmZvKGl0ZW1JZCwgY291cG9uSW5mb18xLCB0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHRoYXQuc2hvd1F1ZXJ5RW1wdHkoJHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAoY291cG9uSW5mbyA9IENvbmZpZy5nZXQoaykpID8gKHJlbmRlcihjb3Vwb25JbmZvKSwgWyAzLCAzIF0pIDogWyAzLCAxIF07CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyA0LCBSb3V0ZS5jb3Vwb25RdWVyeShpdGVtSWQsIHRoYXQuaXRlbVR5cGUsIChmdW5jdGlvbihjb3Vwb25JbmZvUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXIoY291cG9uSW5mb1Jlc3VsdCksIENvbmZpZy5zZXQoaywgY291cG9uSW5mbywgNDMyMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgXTsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKSwgX2EubGFiZWwgPSAzOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5pbml0Q291cG9uSW5mbyA9IGZ1bmN0aW9uKGl0ZW1JZCwgY291cG9uSW5mbywgdGFyZ2V0KSB7CiAgICAgICAgICAgIHZhciBfYSwgJHRoaXMgPSAkKHRhcmdldCk7CiAgICAgICAgICAgIGlmICgobnVsbCA9PT0gKF9hID0gbnVsbCA9PSBjb3Vwb25JbmZvID8gdm9pZCAwIDogY291cG9uSW5mby5jb3Vwb25zKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDApIHsKICAgICAgICAgICAgICAgIHZhciBjb3Vwb24gPSBjb3Vwb25JbmZvLmNvdXBvbnNbMF07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dRdWVyeUZpbmQoJHRoaXMsIGNvdXBvbi5jb3Vwb25fcHJpY2UpOwogICAgICAgICAgICB9IGVsc2UgdGhpcy5zaG93UXVlcnlFbXB0eSgkdGhpcyk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnNob3dJdGVtVXJsID0gZnVuY3Rpb24oaXRlbUlkLCBpdGVtVXJsKSB7CiAgICAgICAgICAgIENvcmUuY2xpY2soIi5vbmVrZXl2aXAtaXRlbS0iICsgaXRlbUlkLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIWl0ZW1VcmwgfHwgKENvcmUub3BlbihpdGVtVXJsKSwgITEpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnNob3dRdWVyeUZpbmQgPSBmdW5jdGlvbihzZWxlY3RvciwgY291cG9uTW9uZXkpIHsKICAgICAgICAgICAgc2VsZWN0b3IuaHRtbCgnPGEgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJvbmVrZXl2aXAtYm94LWluZm8gb25la2V5dmlwLWJveC1pbmZvLWZpbmQiIHRpdGxlPSJcdTUyMDdcdTYzNjJcdTkwMGZcdTY2MGVcdTVlYTYiPicgKyBjb3Vwb25Nb25leSArICJcdTUxNDNcdTUyMzg8L2E+Iik7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnNob3dRdWVyeUVtcHR5ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICAgICAgc2VsZWN0b3IuYWRkQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpLCBzZWxlY3Rvci5odG1sKCc8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0ib25la2V5dmlwLWJveC1pbmZvIG9uZWtleXZpcC1ib3gtaW5mby1lbXB0eSIgdGl0bGU9Ilx1NTIwN1x1NjM2Mlx1OTAwZlx1NjYwZVx1NWVhNiI+XHU2NjgyXHU2NWUwXHU0ZjE4XHU2MGUwPC9hPicpOwogICAgICAgIH0sIExpc3RTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgY3NzXzI0OHokMiA9ICIjY29udGVudF92aWV3cyBwcmUge1xuICAgIC13ZWJraXQtdG91Y2gtY2FsbG91dDogYXV0byAhaW1wb3J0YW50O1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAta2h0bWwtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgLW1zLXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbn1cblxuI2NvbnRlbnRfdmlld3MgcHJlIGNvZGUge1xuICAgIC13ZWJraXQtdG91Y2gtY2FsbG91dDogYXV0byAhaW1wb3J0YW50O1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAta2h0bWwtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgLW1zLXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbn1cblxuLnBhc3Nwb3J0LWxvZ2luLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuIjsKICAgIHN0eWxlSW5qZWN0KGNzc18yNDh6JDIpOwogICAgdmFyIENzZG5BZFNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBDc2RuQWRTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5DU0ROLCAvYmxvZ1wuY3NkblwubmV0L2kgXSBdKSwgX3RoaXMuX2FwcE5hbWUgPSAiY3NkbiIsIAogICAgICAgICAgICBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKENzZG5BZFNlcnZpY2UsIF9zdXBlciksIENzZG5BZFNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIENzZG5BZFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmNvcmUuYmFja2dyb3VuZCh0aGlzLnJlbW92ZUFkcywgMyksIHRoaXMuY29tbWVudENsZWFuKCk7CiAgICAgICAgfSwgQ3NkbkFkU2VydmljZS5wcm90b3R5cGUucmVtb3ZlQWRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENzZG5BZFNlcnZpY2UuYWRTZWxlY3RvcnMuZm9yRWFjaCgoZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICQoc2VsZWN0b3IpLnJlbW92ZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQ3NkbkFkU2VydmljZS5wcm90b3R5cGUuY29tbWVudENsZWFuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENvcmUubGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgTG9nZ2VyLmluZm8oIlx1OGJjNFx1OGJiYVx1NTMzYVx1NmUwNVx1NzQwNiIpLCAkKCIuY29tbWVudC1saXN0LWJveCIpLmNzcygib3ZlcmZsb3ciLCAiIikuY3NzKCJtYXgtaGVpZ2h0IiwgIiIpLCAKICAgICAgICAgICAgICAgICQoIiNjb21tZW50UGFnZSIpLnJlbW92ZUNsYXNzKCJkLW5vbmUiKSwgJCgiI2J0bk1vcmVDb21tZW50IikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pLCAzKTsKICAgICAgICB9LCBDc2RuQWRTZXJ2aWNlLmFkU2VsZWN0b3JzID0gWyAiI2Zvb3RlclJpZ2h0QWRzIiwgIi5zaWRlLXF1ZXN0aW9uLWJveCIsICJkaXZbaWRePSdkbXBfYWQnXSIsICJkaXZbY2xhc3NePSdhZF8nXSIsICJkaXZbaWRePSdmbG9vci1hZF8nXSIsICIuYWRzYnlnb29nbGUiIF0sIAogICAgICAgIENzZG5BZFNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBNZW51ID0gQ29tbW9uLk1lbnUsIFdlbkt1U2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIFdlbkt1U2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uV2VuS3UsIC93ZW5rdVwuYmFpZHVcLmNvbVwvdmlldy9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzLm1lbnUgPSBuZXcgQ29tbW9uLk1lbnUsIF90aGlzLl9hcHBOYW1lID0gIldlbkt1IiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoV2VuS3VTZXJ2aWNlLCBfc3VwZXIpLCBXZW5LdVNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAidW5kZWZpbmVkIiA9PSB0eXBlb2YgJCAmJiBDb3JlLmFwcGVuZEpzKCIvL2xpYi5iYW9taXR1LmNvbS9qcXVlcnkvMS4xMi40L2pxdWVyeS5taW4uanMiKSwgCiAgICAgICAgICAgIENvcmUuYXBwZW5kQ3NzKCIvL2xpYi5iYW9taXR1LmNvbS9sYXllci8zLjEuMS90aGVtZS9kZWZhdWx0L2xheWVyLmNzcyIpOwogICAgICAgIH0sIFdlbkt1U2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMubWVudS5Jbml0KFsgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTY3MmNcdTZiMjFcdTUxNzNcdTk1ZWQiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NjcyY1x1NmIyMTxicj5cdTUxNzNcdTk1ZWQiLAogICAgICAgICAgICAgICAgdHlwZTogInNlYXJjaCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTViZmNcdTUxZmFcdTY1ODdcdTY4NjMiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NWJmY1x1NTFmYTxicj5cdTY1ODdcdTY4NjMiLAogICAgICAgICAgICAgICAgdHlwZTogInByb2Nlc3MiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU3ZWRkXHU0ZTE2XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHNob3c6ICJcdTdlZGRcdTRlMTY8YnI+XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHR5cGU6ICJ0YiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTRlYWNcdTRlMWNcdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NGVhY1x1NGUxYzxicj5cdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgdHlwZTogImpkIgogICAgICAgICAgICB9IF0sIHRoaXMuX29uQ2xpY2spOwogICAgICAgIH0sIFdlbkt1U2VydmljZS5wcm90b3R5cGUuX29uQ2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiYm9keSIsICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXByb2Nlc3NdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2cubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ3b3JkIiAhPSAobnVsbCA9PT0gKF9jID0gbnVsbCA9PT0gKF9iID0gbnVsbCA9PT0gKF9hID0gdW5zYWZlV2luZG93LnBhZ2VEYXRhKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2Eudmlld0JpeikgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLmRvY0luZm8pIHx8IHZvaWQgMCA9PT0gX2MgPyB2b2lkIDAgOiBfYy5maWxlVHlwZSkgPyBbIDMsIDQgXSA6IChudWxsID09PSAoX2YgPSBudWxsID09PSAoX2UgPSBudWxsID09PSAoX2QgPSB1bnNhZmVXaW5kb3cucGFnZURhdGEpIHx8IHZvaWQgMCA9PT0gX2QgPyB2b2lkIDAgOiBfZC5taXhWaXBBbmRVc2VySW5mbykgfHwgdm9pZCAwID09PSBfZSA/IHZvaWQgMCA6IF9lLnVzZXJJbmZvKSB8fCB2b2lkIDAgPT09IF9mID8gdm9pZCAwIDogX2YuaXNMb2dpbikgPyAoQWxlcnQubG9hZGluZ1MoIlx1ODllM1x1Njc5MFx1NGUyZFx1OGJmN1x1N2EwZFx1NTQwZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyA0LCBDb3JlLmxhenlsb2FkKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlbkt1U2VydmljZS5sb2FkRnVsbERvYygpLnRoZW4oKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygiXHU4ZjdkXHU1MTY1XHU2NTg3XHU1ZTkzXHU1MTg1XHU1YmI5XHU1YjhjXHU2MjEwIiksIHdpbmRvdy5zY3JvbGxUbygwLCAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2VuS3VTZXJ2aWNlLmV4cG9ydERvYygpLCBTd2FsX19kZWZhdWx0LmRlZmF1bHQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIC41KSBdKSA6IFsgMywgMiBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9nLnNlbnQoKSwgWyAzLCAzIF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGVydC5lcnJvcigiXHU4YmY3XHU1MTQ4XHU3NjdiXHU1ZjU1IiksIF9nLmxhYmVsID0gMzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIDMsIDUgXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0LmVycm9yKCJcdTRlYzVcdTY1MmZcdTYzMDF3b3JkXHU2NTg3XHU2ODYzXHU3Njg0XHU1YmZjXHU1MWZhIiksIF9nLmxhYmVsID0gNTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIDIgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9KSksICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXNlYXJjaF0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1lbnUuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICB9KSksICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXRiXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwOi8vc2hvcC5odWl6aGVrLmNvbSIpOwogICAgICAgICAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9amRdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHA6Ly9qZC5odWl6aGVrLmNvbSIpOwogICAgICAgICAgICAgICAgICAgIH0pKSwgWyAyIF07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBXZW5LdVNlcnZpY2UuZXhwb3J0RG9jID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBkb2MgPSAkKCIucmVhZGVyLXdvcmQtbGF5ZXIiKSwgX2RvYyA9ICQoZG9jKS5jbG9uZSgpOwogICAgICAgICAgICBfZG9jLmVhY2goKGZ1bmN0aW9uKGksIGUpIHsKICAgICAgICAgICAgICAgICQoZSkuaXMoIjpoaWRkZW4iKSAmJiAkKGUpLnJlbW92ZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHZhciBkb2NDb250ZW50ID0gIk1pbWUtVmVyc2lvbjogMS4wXG5Db250ZW50LUJhc2U6ICIgKyBSdW50aW1lLnVybCArICdcbkNvbnRlbnQtVHlwZTogTXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PSJORVhULklURU0tQk9VTkRBUlkiO3R5cGU9InRleHQvaHRtbCJcblxuLS1ORVhULklURU0tQk9VTkRBUllcbkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJ1dGYtOCJcbkNvbnRlbnQtTG9jYXRpb246ICcgKyBSdW50aW1lLnVybCArICdcblxuPCFET0NUWVBFIGh0bWw+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPlxuPHN0eWxlPlxuXG48L3N0eWxlPlxuPC9oZWFkPlxuPGJvZHk+XG4nICsgX2RvYy50ZXh0KCkuc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIjxwPiIgKyB0ICsgIjwvcD4iOwogICAgICAgICAgICB9KSkuam9pbigiIikgKyAiXG48L2JvZHk+XG48L2h0bWw+XG4tLU5FWFQuSVRFTS1CT1VOREFSWS0tIjsKICAgICAgICAgICAgc2F2ZUFzKG5ldyBCbG9iKFsgZG9jQ29udGVudCBdLCB7CiAgICAgICAgICAgICAgICB0eXBlOiAiYXBwbGljYXRpb24vbXN3b3JkO2NoYXJzZXQ9dXRmLTgiCiAgICAgICAgICAgIH0pLCB1bnNhZmVXaW5kb3cucGFnZURhdGEudmlld0Jpei5kb2NJbmZvLnRpdGxlICsgIi5kb2MiKTsKICAgICAgICB9LCBXZW5LdVNlcnZpY2Uuc2Nyb2xsVG9FbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIENvcmUuYXV0b0xhenlsb2FkKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfYSwgZG9jRWxlID0gdW5zYWZlV2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgaGVpZ2h0VG90YWwgPSBkb2NFbGUuc2Nyb2xsSGVpZ2h0LCBzY3JvbGxUb3AgPSBudWxsICE9PSAoX2EgPSBkb2NFbGUuc2Nyb2xsVG9wKSAmJiB2b2lkIDAgIT09IF9hID8gX2EgOiB1bnNhZmVXaW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsIGNsaWVudEhlaWdodCA9IGRvY0VsZS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgICAgICByZXR1cm4gaGVpZ2h0VG90YWwgLSBzY3JvbGxUb3AgPD0gMS4xICogY2xpZW50SGVpZ2h0IHx8ICh3aW5kb3cuc2Nyb2xsKDAsIHNjcm9sbFRvcCArIGNsaWVudEhlaWdodCAvIDQpLCAKICAgICAgICAgICAgICAgICExKTsKICAgICAgICAgICAgfSksIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygiXHU2ZWRhXHU1MmE4XHU3ZWQzXHU2NzVmIik7CiAgICAgICAgICAgIH0pLCAuMSk7CiAgICAgICAgfSwgV2VuS3VTZXJ2aWNlLmxvYWRGdWxsRG9jID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXMsIGZ1bmRlZCA9ICExLCB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIENvcmUuYXV0b0xhenlsb2FkKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfYSwgYnRuID0gbnVsbCAhPT0gKF9hID0gdW5zYWZlV2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5nb0J0biIpKSAmJiB2b2lkIDAgIT09IF9hID8gX2EgOiB1bnNhZmVXaW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnJlYWQtYWxsIik7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuZGVkID0gITAsIG51bGwgIT0gYnRuIHx8IGZ1bmRlZDsKICAgICAgICAgICAgfSksIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJ0biwgX2E7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYikgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChidG4gPSBudWxsICE9PSAoX2EgPSB1bnNhZmVXaW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmdvQnRuIikpICYmIHZvaWQgMCAhPT0gX2EgPyBfYSA6IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucmVhZC1hbGwiKSkgJiYgJChidG4pLmNsaWNrKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKCJcdThmZGJcdTUxNjVcdTZlZGFcdTUyYTgiKSwgWyA0LCB0aGF0LnNjcm9sbFRvRW5kKCkgXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9iLnNlbnQoKSwgTG9nZ2VyLmRlYnVnKCJcdTdlZDNcdTY3NWZcdTZlZGFcdTUyYTgiKSwgWyAyIF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pLCAyKTsKICAgICAgICB9LCBXZW5LdVNlcnZpY2UubG9hZGVkID0gITEsIFdlbkt1U2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIGNzc18yNDh6JDEgPSAiLm9uZS1rZXktdmlwLWNvbnRhaW5lciB7IHotaW5kZXg6IDk5OTk5IWltcG9ydGFudCB9XG4ub25lLWtleS12aXAtcG9wdXAgeyBmb250LXNpemU6IDE0cHggIWltcG9ydGFudCB9XG4ub25lLWtleS12aXAtc2V0dGluZy1sYWJlbCB7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47cGFkZGluZy10b3A6IDIwcHg7IH1cbi5vbmUta2V5LXZpcC1zZXR0aW5nLWNoZWNrYm94IHsgd2lkdGg6IDE2cHg7aGVpZ2h0OiAxNnB4OyB9XG4iOwogICAgc3R5bGVJbmplY3QoY3NzXzI0OHokMSk7CiAgICB2YXIgVG9hc3RBbGVydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIFRvYXN0QWxlcnQoKSB7fQogICAgICAgIHJldHVybiBUb2FzdEFsZXJ0LnNob3dNZXNzYWdlID0gZnVuY3Rpb24odGl0bGUsIGh0bWwsIHRvYXN0LCBwb3NpdGlvbiwgdGltZSkgewogICAgICAgICAgICByZXR1cm4gU3dhbF9fZGVmYXVsdC5kZWZhdWx0LmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICAgICAgaHRtbDogaHRtbCwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICAgICAgICAgIHRvYXN0OiB0b2FzdCwKICAgICAgICAgICAgICAgIHRpbWVyOiBudWxsID09IHRpbWUgPyB2b2lkIDAgOiAxZTMgKiB0aW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIFRvYXN0QWxlcnQudG9hc3QgPSBmdW5jdGlvbih0aXRsZSwgaHRtbCwgdGltZSwgcG9zaXRpb24pIHsKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lICYmICh0aW1lID0gMiksIHZvaWQgMCA9PT0gcG9zaXRpb24gJiYgKHBvc2l0aW9uID0gInRvcCIpLCB0aGlzLnNob3dNZXNzYWdlKHRpdGxlLCBodG1sLCAhMCwgcG9zaXRpb24sIHRpbWUpOwogICAgICAgIH0sIFRvYXN0QWxlcnQuaW5mbyA9IGZ1bmN0aW9uKG1zZywgdGltZSkgewogICAgICAgICAgICB2b2lkIDAgPT09IHRpbWUgJiYgKHRpbWUgPSAyKSwgU3dhbF9fZGVmYXVsdC5kZWZhdWx0LmZpcmUoewogICAgICAgICAgICAgICAgdG9hc3Q6ICEwLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICJ0b3AiLAogICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogITEsCiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogITEsCiAgICAgICAgICAgICAgICB0aXRsZTogbXNnLAogICAgICAgICAgICAgICAgaWNvbjogInN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgdGltZXI6IDFlMyAqIHRpbWUsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzczogdGhpcy5jdXN0b21lQ3NzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIFRvYXN0QWxlcnQuaHRtbCA9IGZ1bmN0aW9uKHRpdGxlLCBodG1sLCBjYW5jZWwsIGNhbmNlbFR4dCwgY29uZmlybSwgY29uZmlybVR4dCkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBjYW5jZWwgJiYgKGNhbmNlbCA9ICExKSwgdm9pZCAwID09PSBjYW5jZWxUeHQgJiYgKGNhbmNlbFR4dCA9ICIiKSwgCiAgICAgICAgICAgIHZvaWQgMCA9PT0gY29uZmlybSAmJiAoY29uZmlybSA9ICExKSwgdm9pZCAwID09PSBjb25maXJtVHh0ICYmIChjb25maXJtVHh0ID0gIiIpLCAKICAgICAgICAgICAgU3dhbF9fZGVmYXVsdC5kZWZhdWx0LmZpcmUoewogICAgICAgICAgICAgICAgdG9hc3Q6ICEwLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICJ0b3AiLAogICAgICAgICAgICAgICAgaHRtbDogaHRtbCwKICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGNhbmNlbCwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBjb25maXJtLAogICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogY2FuY2VsVHh0LAogICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1UeHQsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzczogdGhpcy5jdXN0b21lQ3NzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIFRvYXN0QWxlcnQuY3VzdG9tZUNzcyA9IHsKICAgICAgICAgICAgY29udGFpbmVyOiAib25lLWtleS12aXAtY29udGFpbmVyIiwKICAgICAgICAgICAgcG9wdXA6ICJvbmUta2V5LXZpcC1wb3B1cCIsCiAgICAgICAgICAgIGhlYWRlcjogIm9uZS1rZXktdmlwLWhlYWRlciIsCiAgICAgICAgICAgIHRpdGxlOiAib25lLWtleS12aXAtdGl0bGUiLAogICAgICAgICAgICBjbG9zZUJ1dHRvbjogIm9uZS1rZXktdmlwLWNsb3NlIiwKICAgICAgICAgICAgaWNvbjogIm9uZS1rZXktdmlwLWljb24iLAogICAgICAgICAgICBpbWFnZTogIm9uZS1rZXktdmlwLWltYWdlIiwKICAgICAgICAgICAgY29udGVudDogIm9uZS1rZXktdmlwLWNvbnRlbnQiLAogICAgICAgICAgICBodG1sQ29udGFpbmVyOiAib25lLWtleS12aXAtaHRtbCIsCiAgICAgICAgICAgIGlucHV0OiAib25lLWtleS12aXAtaW5wdXQiLAogICAgICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZTogIm9uZS1rZXktdmlwLXZhbGlkYXRpb24iLAogICAgICAgICAgICBhY3Rpb25zOiAib25lLWtleS12aXAtYWN0aW9ucyIsCiAgICAgICAgICAgIGNvbmZpcm1CdXR0b246ICJvbmUta2V5LXZpcC1jb25maXJtIiwKICAgICAgICAgICAgZGVueUJ1dHRvbjogIm9uZS1rZXktdmlwLWRlbnkiLAogICAgICAgICAgICBjYW5jZWxCdXR0b246ICJvbmUta2V5LXZpcC1jYW5jZWwiLAogICAgICAgICAgICBsb2FkZXI6ICJvbmUta2V5LXZpcC1sb2FkZXIiLAogICAgICAgICAgICBmb290ZXI6ICJvbmUta2V5LXZpcC1mb290ZXIiCiAgICAgICAgfSwgVG9hc3RBbGVydDsKICAgIH0oKSwgTGlua0p1bXBTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gTGlua0p1bXBTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5DU0ROLCAvbGlua1wuY3NkblwubmV0L2kgXSwgWyBTaXRlRW51bS5aaGlIdSwgL2xpbmtcLnpoaWh1XC5jb20vaSBdLCBbIFNpdGVFbnVtLkppYW5TaHUsIC93d3dcLmppYW5zaHVcLmNvbVwvZ28td2lsZC9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5rZXkgPSAiIiwgX3RoaXMuX3VuaXF1ZSA9ICExLCBfdGhpcy5fYXBwTmFtZSA9ICJMaW5rSnVtcCIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKExpbmtKdW1wU2VydmljZSwgX3N1cGVyKSwgTGlua0p1bXBTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCAKICAgICAgICBMaW5rSnVtcFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2l0ZSkgewogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uQ1NETjoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlpoaUh1OgogICAgICAgICAgICAgICAgdGhpcy5rZXkgPSAidGFyZ2V0IjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLkppYW5TaHU6CiAgICAgICAgICAgICAgICB0aGlzLmtleSA9ICJ1cmwiOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aGlzLmtleSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmtleSkgewogICAgICAgICAgICAgICAgdmFyIHUgPSB0aGlzLmNvcmUuZ2V0UGFyKHRoaXMua2V5KTsKICAgICAgICAgICAgICAgIFRvYXN0QWxlcnQuaW5mbygiXHU5NGZlXHU2M2E1XHU1ZGYyXHU4OWUzXHU2NzkwLFx1NmI2M1x1NTcyOFx1OGRmM1x1OGY2Y34iKSwgdSAmJiAodSA9IGRlY29kZVVSSUNvbXBvbmVudCh1KSwgCiAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcodSksIHVuc2FmZVdpbmRvdy53aW5kb3cubG9jYXRpb24uaHJlZiA9IHUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgTGlua0p1bXBTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgY3NzXzI0OHogPSAiLnNsaWRlciArIGRpdiwgLnNsaWRlciArIGRpdiArIGEsXG4udGV4dHMsXG4uaGVhZGVyX25ldzEsXG4uc2xpZGVyX3RpcHMge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbiI7CiAgICBzdHlsZUluamVjdChjc3NfMjQ4eik7CiAgICB2YXIgX0d3ZFNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBfR3dkU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlN1TmluZywgL2Jyb3dzZXJcLmd3ZGFuZ1wuY29tL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLl9hcHBOYW1lID0gInNuX2NsZWFyIiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoX0d3ZFNlcnZpY2UsIF9zdXBlciksIF9Hd2RTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCAKICAgICAgICBfR3dkU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7fSwgX0d3ZFNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBPbmVLZXlWaXBJbmplY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBPbmVLZXlWaXBJbmplY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucyA9IG5ldyBBcnJheSwgdGhpcy5wbHVnaW5zID0gWyBDb250YWluZXIuUmVxdWlyZShVcGRhdGVTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoQmlsaUltZ1NlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShNb3ZpZVNlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShMaXN0U2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKFRhb0Jhb1NlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShKZFNlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShNdXNpY1NlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShHd2RTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoQ3NkbkFkU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKFdlbkt1U2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKExpbmtKdW1wU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKF9Hd2RTZXJ2aWNlKSBdLCAKICAgICAgICAgICAgTG9nZ2VyLmluZm8oImNvbnRhaW5lciBsb2FkZWQiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9uZUtleVZpcEluamVjdGlvbi5wcm90b3R5cGUuSW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLnBsdWdpbnMuZXZlcnkoKGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhZWxlbWVudC5saW5rVGVzdCgpIHx8IChuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoMSk7CiAgICAgICAgICAgICAgICB9KSkudGhlbihlbGVtZW50LlByb2Nlc3MpLCBMb2dnZXIuZGVidWcoImVsZW1lbnQgWyIgKyBlbGVtZW50LmFwcE5hbWUoKSArICJdO3VuaXF1ZTpbIiArIGVsZW1lbnQudW5pcXVlKCkgKyAiXSIpLCAKICAgICAgICAgICAgICAgICFlbGVtZW50LnVuaXF1ZSgpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIE9uZUtleVZpcEluamVjdGlvbjsKICAgIH0oKTsKICAgIExvZ2dlci5sZXZlbCA9IExvZ0xldmVsLmluZm8sIENvbnRhaW5lci5SZXF1aXJlKE9uZUtleVZpcEluamVjdGlvbikuSW5pdCgpOwp9KSk7Cg==","requires":[{"meta":{"name":"jquery.min.js","url":"https://lib.baomitu.com/jquery/1.12.4/jquery.min.js","ts":1637743664560,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMS4xMi40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmUuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZWFjaCh0aGlzLGEpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpnLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihuLmlzUGxhaW5PYmplY3QoYyl8fChiPW4uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbi5pc0FycmF5KGEpP2E6W10pOmY9YSYmbi5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1uLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnRvU3RyaW5nKCk7cmV0dXJuIW4uaXNBcnJheShhKSYmYi1wYXJzZUZsb2F0KGIpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKCFsLm93bkZpcnN0KWZvcihiIGluIGEpcmV0dXJuIGsuY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxrLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGgpcmV0dXJuIGguY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWUuY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGQpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYobi5mbltTeW1ib2wuaXRlcmF0b3JdPWNbU3ltYm9sLml0ZXJhdG9yXSksbi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj0hIWEmJiJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2EoKSx6PWdhKCksQT1nYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitNKyIpKXwpIitMKyIqXFxdIixPPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTisiKSopfC4qKVxcKXwpIixQPW5ldyBSZWdFeHAoTCsiKyIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxUPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFU9bmV3IFJlZ0V4cChPKSxWPW5ldyBSZWdFeHAoIl4iK00rIiQiKSxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK04pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitPKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWT0vXmhcZCQvaSxaPS9eW157XStce1xzKlxbbmF0aXZlIFx3LywkPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sXz0vWyt+XS8sYWE9Lyd8XFwvZyxiYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksY2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGRhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZmEoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3PWImJmIub3duZXJEb2N1bWVudCx4PWI/Yi5ub2RlVHlwZTo5O2lmKGQ9ZHx8W10sInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PXgmJjkhPT14JiYxMSE9PXgpcmV0dXJuIGQ7aWYoIWUmJigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixwKSl7aWYoMTEhPT14JiYobz0kLmV4ZWMoYSkpKWlmKGY9b1sxXSl7aWYoOT09PXgpe2lmKCEoaj1iLmdldEVsZW1lbnRCeUlkKGYpKSlyZXR1cm4gZDtpZihqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZSBpZih3JiYoaj13LmdldEVsZW1lbnRCeUlkKGYpKSYmdChiLGopJiZqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZXtpZihvWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoZj1vWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZikpLGR9aWYoYy5xc2EmJiFBW2ErIiAiXSYmKCFxfHwhcS50ZXN0KGEpKSl7aWYoMSE9PXgpdz1iLHM9YTtlbHNlIGlmKCJvYmplY3QiIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoaz1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/az1rLnJlcGxhY2UoYWEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLGs9dSkscj1nKGEpLGg9ci5sZW5ndGgsbD1WLnRlc3Qoayk/IiMiK2s6IltpZD0nIitrKyInXSI7d2hpbGUoaC0tKXJbaF09bCsiICIrcWEocltoXSk7cz1yLmpvaW4oIiwiKSx3PV8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8Yn1pZihzKXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbChzKSksZH1jYXRjaCh5KXt9ZmluYWxseXtrPT09dSYmYi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gaShhLnJlcGxhY2UoUSwiJDEiKSxiLGQsZSl9ZnVuY3Rpb24gZ2EoKXt2YXIgYT1bXTtmdW5jdGlvbiBiKGMsZSl7cmV0dXJuIGEucHVzaChjKyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIGJbYS5zaGlmdCgpXSxiW2MrIiAiXT1lfXJldHVybiBifWZ1bmN0aW9uIGhhKGEpe3JldHVybiBhW3VdPSEwLGF9ZnVuY3Rpb24gaWEoYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuISFhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuc3BsaXQoInwiKSxlPWMubGVuZ3RoO3doaWxlKGUtLSlkLmF0dHJIYW5kbGVbY1tlXV09Yn1mdW5jdGlvbiBrYShhLGIpe3ZhciBjPWImJmEsZD1jJiYxPT09YS5ub2RlVHlwZSYmMT09PWIubm9kZVR5cGUmJih+Yi5zb3VyY2VJbmRleHx8QyktKH5hLnNvdXJjZUluZGV4fHxDKTtpZihkKXJldHVybiBkO2lmKGMpd2hpbGUoYz1jLm5leHRTaWJsaW5nKWlmKGM9PT1iKXJldHVybi0xO3JldHVybiBhPzE6LTF9ZnVuY3Rpb24gbGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YyYmYi50eXBlPT09YX19ZnVuY3Rpb24gbWEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PWN8fCJidXR0b24iPT09YykmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBoYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixoYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIG9hKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1mYS5zdXBwb3J0PXt9LGY9ZmEuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiPyJIVE1MIiE9PWIubm9kZU5hbWU6ITF9LG09ZmEuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZSxnPWE/YS5vd25lckRvY3VtZW50fHxhOnY7cmV0dXJuIGchPT1uJiY5PT09Zy5ub2RlVHlwZSYmZy5kb2N1bWVudEVsZW1lbnQ/KG49ZyxvPW4uZG9jdW1lbnRFbGVtZW50LHA9IWYobiksKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1pYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVoudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1pYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT1aLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGlhKGZ1bmN0aW9uKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVoudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmaWEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLE8pfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj1aLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHxaLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1ufHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PW58fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxnPVthXSxoPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1uPy0xOmI9PT1uPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGthKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWcudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO3doaWxlKGdbZF09PT1oW2RdKWQrKztyZXR1cm4gZD9rYShnW2RdLGhbZF0pOmdbZF09PT12Py0xOmhbZF09PT12PzE6MH0sbik6bn0sZmEubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYShhLG51bGwsbnVsbCxiKX0sZmEubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFQsIj0nJDEnXSIpLGMubWF0Y2hlc1NlbGVjdG9yJiZwJiYhQVtiKyIgIl0mJighcnx8IXIudGVzdChiKSkmJighcXx8IXEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGZhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGZhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZmEuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGZhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZmEudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWZhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1mYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpoYSxtYXRjaDpXLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYmEsY2EpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGJhLGNhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZmEuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZmEuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFcuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVS50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZmEuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShQLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2hhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1KKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmhhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShRLCIkMSIpKTtyZXR1cm4gZFt1XT9oYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmEoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoYmEsY2EpLGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBWLnRlc3QoYXx8IiIpfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxiLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBjPWMudG9Mb3dlckNhc2UoKSxjPT09YXx8MD09PWMuaW5kZXhPZihhKyItIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFkudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6bmEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om5hKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpuYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6bmEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bGEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bWEoYik7ZnVuY3Rpb24gcGEoKXt9cGEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBwYSxnPWZhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1SLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1TLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFEsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1XW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/ZmEuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBxYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHJhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGosaz1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGo9Ylt1XXx8KGJbdV09e30pLGk9altiLnVuaXF1ZUlEXXx8KGpbYi51bmlxdWVJRF09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGtbMl09aFsyXTtpZihpW2RdPWssa1syXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHRhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZmEoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHVhKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJihjJiYhYyhmLGQsZSl8fChnLnB1c2goZiksaiYmYi5wdXNoKGgpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9dmEoZCkpLGUmJiFlW3VdJiYoZT12YShlLGYpKSxoYShmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx0YShifHwiKiIsaC5ub2RlVHlwZT9baF06aCxbXSkscT0hYXx8IWYmJmI/cDp1YShwLG0sYSxoLGkpLHI9Yz9lfHwoZj9hOm98fGQpP1tdOmc6cTtpZihjJiZjKHEscixoLGkpLGQpe2o9dWEocixuKSxkKGosW10saCxpKSxrPWoubGVuZ3RoO3doaWxlKGstLSkobD1qW2tdKSYmKHJbbltrXV09IShxW25ba11dPWwpKX1pZihmKXtpZihlfHxhKXtpZihlKXtqPVtdLGs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiZqLnB1c2gocVtrXT1sKTtlKG51bGwscj1bXSxqLGkpfWs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiYoaj1lP0ooZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXVhKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpILmFwcGx5KGcscil9KX1mdW5jdGlvbiB3YShhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saD1nfHxkLnJlbGF0aXZlWyIgIl0saT1nPzE6MCxrPXJhKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saCwhMCksbD1yYShmdW5jdGlvbihhKXtyZXR1cm4gSihiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7dmFyIGU9IWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSk7cmV0dXJuIGI9bnVsbCxlfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtyYShzYShtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gdmEoaT4xJiZzYShtKSxpPjEmJnFhKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09YVtpLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoUSwiJDEiKSxjLGU+aSYmd2EoYS5zbGljZShpLGUpKSxmPmUmJndhKGE9YS5zbGljZShlKSksZj5lJiZxYShhKSl9bS5wdXNoKGMpfXJldHVybiBzYShtKX1mdW5jdGlvbiB4YShhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxvLHEscj0wLHM9IjAiLHQ9ZiYmW10sdT1bXSx2PWoseD1mfHxlJiZkLmZpbmQuVEFHKCIqIixrKSx5PXcrPW51bGw9PXY/MTpNYXRoLnJhbmRvbSgpfHwuMSx6PXgubGVuZ3RoO2ZvcihrJiYoaj1nPT09bnx8Z3x8ayk7cyE9PXomJm51bGwhPShsPXhbc10pO3MrKyl7aWYoZSYmbCl7bz0wLGd8fGwub3duZXJEb2N1bWVudD09PW58fChtKGwpLGg9IXApO3doaWxlKHE9YVtvKytdKWlmKHEobCxnfHxuLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9eSl9YyYmKChsPSFxJiZsKSYmci0tLGYmJnQucHVzaChsKSl9aWYocis9cyxjJiZzIT09cil7bz0wO3doaWxlKHE9YltvKytdKXEodCx1LGcsaCk7aWYoZil7aWYocj4wKXdoaWxlKHMtLSl0W3NdfHx1W3NdfHwodVtzXT1GLmNhbGwoaSkpO3U9dWEodSl9SC5hcHBseShpLHUpLGsmJiFmJiZ1Lmxlbmd0aD4wJiZyK2IubGVuZ3RoPjEmJmZhLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXksaj12KSx0fTtyZXR1cm4gYz9oYShmKTpmfXJldHVybiBoPWZhLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErIiAiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj13YShiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseGEoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWZhLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEsbz0hZiYmZyhhPW4uc2VsZWN0b3J8fGEpO2lmKGU9ZXx8W10sMT09PW8ubGVuZ3RoKXtpZihqPW9bMF09b1swXS5zbGljZSgwKSxqLmxlbmd0aD4yJiYiSUQiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1XLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShiYSxjYSksXy50ZXN0KGpbMF0udHlwZSkmJm9hKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSwhYnx8Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGphKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGphKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlU29ydD1uLnVuaXF1ZT10LnVuaXF1ZVNvcnQsbi50ZXh0PXQuZ2V0VGV4dCxuLmlzWE1MRG9jPXQuaXNYTUwsbi5jb250YWlucz10LmNvbnRhaW5zO3ZhciB1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sdj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY30sdz1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHg9L148KFtcdy1dKylccypcLz8+KD86PFwvXDE+fCkkLyx5PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24geihhLGIsYyl7aWYobi5pc0Z1bmN0aW9uKGIpKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih5LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBuLmluQXJyYXkoYSxiKT4tMSE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9uLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm4uZmluZC5tYXRjaGVzKGEsbi5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxuLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobi5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyluLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9uLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheih0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdy50ZXN0KGEpP24oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgQSxCPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQz1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxBLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hLmNoYXJBdCgwKSYmIj4iPT09YS5jaGFyQXQoYS5sZW5ndGgtMSkmJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06Qi5leGVjKGEpLCFlfHwhZVsxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fGMpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGVbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChlWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmQsITApKSx4LnRlc3QoZVsxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoZSBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKGJbZV0pOnRoaXMuYXR0cihlLGJbZV0pO3JldHVybiB0aGlzfWlmKGY9ZC5nZXRFbGVtZW50QnlJZChlWzJdKSxmJiZmLnBhcmVudE5vZGUpe2lmKGYuaWQhPT1lWzJdKXJldHVybiBBLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWZ9cmV0dXJuIHRoaXMuY29udGV4dD1kLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpPyJ1bmRlZmluZWQiIT10eXBlb2YgYy5yZWFkeT9jLnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0MucHJvdG90eXBlPW4uZm4sQT1uKGQpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW4oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihuLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dy50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlU29ydChmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWVTb3J0KG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEYoYSxiKXtkbyBhPWFbYl07d2hpbGUoYSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gdigoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihFW2FdfHwoZT1uLnVuaXF1ZVNvcnQoZSkpLEQudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRz0vXFMrL2c7ZnVuY3Rpb24gSChhKXt2YXIgYj17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRyl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmPVtdLGc9W10saD0tMSxpPWZ1bmN0aW9uKCl7Zm9yKGU9YS5vbmNlLGQ9Yj0hMDtnLmxlbmd0aDtoPS0xKXtjPWcuc2hpZnQoKTt3aGlsZSgrK2g8Zi5sZW5ndGgpZltoXS5hcHBseShjWzBdLGNbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihoPWYubGVuZ3RoLGM9ITEpfWEubWVtb3J5fHwoYz0hMSksYj0hMSxlJiYoZj1jP1tdOiIiKX0saj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGYmJihjJiYhYiYmKGg9Zi5sZW5ndGgtMSxnLnB1c2goYykpLGZ1bmN0aW9uIGQoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXtuLmlzRnVuY3Rpb24oYyk/YS51bmlxdWUmJmouaGFzKGMpfHxmLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09bi50eXBlKGMpJiZkKGMpfSl9KGFyZ3VtZW50cyksYyYmIWImJmkoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixmLGMpKT4tMSlmLnNwbGljZShjLDEpLGg+PWMmJmgtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxmKT4tMTpmLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBmJiYoZj1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBlPWc9W10sZj1jPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZT0hMCxjfHxqLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhjLm5vdGlmeSkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1lLmNhbGwoYXJndW1lbnRzKSxkPWMubGVuZ3RoLGY9MSE9PWR8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2Q6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZS5jYWxsKGFyZ3VtZW50cyk6ZCxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGQ+MSlmb3IoaT1uZXcgQXJyYXkoZCksaj1uZXcgQXJyYXkoZCksaz1uZXcgQXJyYXkoZCk7ZD5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5wcm9ncmVzcyhoKGIsaixpKSkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEkucmVzb2x2ZVdpdGgoZCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4oZCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEooKXtkLmFkZEV2ZW50TGlzdGVuZXI/KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixLKSk6KGQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5kZXRhY2hFdmVudCgib25sb2FkIixLKSl9ZnVuY3Rpb24gSygpeyhkLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWEuZXZlbnQudHlwZXx8ImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZSkmJihKKCksbi5yZWFkeSgpKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIUkpaWYoST1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09ZC5yZWFkeVN0YXRlJiYhZC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwpYS5zZXRUaW1lb3V0KG4ucmVhZHkpO2Vsc2UgaWYoZC5hZGRFdmVudExpc3RlbmVyKWQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixLKTtlbHNle2QuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5hdHRhY2hFdmVudCgib25sb2FkIixLKTt2YXIgYz0hMTt0cnl7Yz1udWxsPT1hLmZyYW1lRWxlbWVudCYmZC5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZSl7fWMmJmMuZG9TY3JvbGwmJiFmdW5jdGlvbiBmKCl7aWYoIW4uaXNSZWFkeSl7dHJ5e2MuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChiKXtyZXR1cm4gYS5zZXRUaW1lb3V0KGYsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBMO2ZvcihMIGluIG4obCkpYnJlYWs7bC5vd25GaXJzdD0iMCI9PT1MLGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxuKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGU7Yz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGIuc3R5bGUuem9vbSYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsbC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChlKSl9KSxmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX1hPW51bGx9KCk7dmFyIE09ZnVuY3Rpb24oYSl7dmFyIGI9bi5ub0RhdGFbKGEubm9kZU5hbWUrIiAiKS50b0xvd2VyQ2FzZSgpXSxjPSthLm5vZGVUeXBlfHwxO3JldHVybiAxIT09YyYmOSE9PWM/ITE6IWJ8fGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9LE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwOwp9cmV0dXJuIGN9ZnVuY3Rpb24gUShhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbi5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFIoYSxiLGQsZSl7aWYoTShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksIm9iamVjdCIhPXR5cGVvZiBiJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGU/altrXT1uLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1uLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbi5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbi5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKE0oYSkpe3ZhciBkLGUsZj1hLm5vZGVUeXBlLGc9Zj9uLmNhY2hlOmEsaD1mP2Fbbi5leHBhbmRvXTpuLmV4cGFuZG87aWYoZ1toXSl7aWYoYiYmKGQ9Yz9nW2hdOmdbaF0uZGF0YSkpe24uaXNBcnJheShiKT9iPWIuY29uY2F0KG4ubWFwKGIsbi5jYW1lbENhc2UpKTpiIGluIGQ/Yj1bYl06KGI9bi5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIuc3BsaXQoIiAiKSksZT1iLmxlbmd0aDt3aGlsZShlLS0pZGVsZXRlIGRbYltlXV07aWYoYz8hUShkKTohbi5pc0VtcHR5T2JqZWN0KGQpKXJldHVybn0oY3x8KGRlbGV0ZSBnW2hdLmRhdGEsUShnW2hdKSkpJiYoZj9uLmNsZWFuRGF0YShbYV0sITApOmwuZGVsZXRlRXhwYW5kb3x8ZyE9Zy53aW5kb3c/ZGVsZXRlIGdbaF06Z1toXT12b2lkIDApfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7bi5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhLGIpfSk6Zj9QKGYsYSxuLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1uLl9kYXRhKGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1uLl9kYXRhKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbi5fZGF0YShhLGMpfHxuLl9kYXRhKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bi5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbi5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW4uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSksZnVuY3Rpb24oKXt2YXIgYTtsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxlO3JldHVybiBjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoYiksInVuZGVmaW5lZCIhPXR5cGVvZiBiLnN0eWxlLnpvb20mJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChlKSxhKTp2b2lkIDB9fSgpO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1QrIikoW2EteiVdKikkIiwiaSIpLFY9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX07ZnVuY3Rpb24gWChhLGIsYyxkKXt2YXIgZSxmPTEsZz0yMCxoPWQ/ZnVuY3Rpb24oKXtyZXR1cm4gZC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbi5jc3MoYSxiLCIiKX0saT1oKCksaj1jJiZjWzNdfHwobi5jc3NOdW1iZXJbYl0/IiI6InB4Iiksaz0obi5jc3NOdW1iZXJbYl18fCJweCIhPT1qJiYraSkmJlUuZXhlYyhuLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixuLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBZPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYylZKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9LFo9L14oPzpjaGVja2JveHxyYWRpbykkL2ksJD0vPChbXHc6LV0rKS8sXz0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksYWE9L15ccysvLGJhPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZGlhbG9nfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1haW58bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHBpY3R1cmV8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRlbXBsYXRlfHRpbWV8dmlkZW8iO2Z1bmN0aW9uIGNhKGEpe3ZhciBiPWJhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ZC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYi5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGEuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYi5hcHBlbmRDaGlsZChhKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYS5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ISFhLmFkZEV2ZW50TGlzdGVuZXIsYVtuLmV4cGFuZG9dPTEsbC5hdHRyaWJ1dGVzPSFhLmdldEF0dHJpYnV0ZShuLmV4cGFuZG8pfSgpO3ZhciBkYT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19O2RhLm9wdGdyb3VwPWRhLm9wdGlvbixkYS50Ym9keT1kYS50Zm9vdD1kYS5jb2xncm91cD1kYS5jYXB0aW9uPWRhLnRoZWFkLGRhLnRoPWRhLnRkO2Z1bmN0aW9uIGVhKGEsYil7dmFyIGMsZCxlPTAsZj0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLGVhKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiBmYShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW4uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG4uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX12YXIgZ2E9Lzx8JiM/XHcrOy8saGE9Lzx0Ym9keS9pO2Z1bmN0aW9uIGlhKGEpe1oudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGphKGEsYixjLGQsZSl7Zm9yKHZhciBmLGcsaCxpLGosayxtLG89YS5sZW5ndGgscD1jYShiKSxxPVtdLHI9MDtvPnI7cisrKWlmKGc9YVtyXSxnfHwwPT09ZylpZigib2JqZWN0Ij09PW4udHlwZShnKSluLm1lcmdlKHEsZy5ub2RlVHlwZT9bZ106Zyk7ZWxzZSBpZihnYS50ZXN0KGcpKXtpPWl8fHAuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaj0oJC5leGVjKGcpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09ZGFbal18fGRhLl9kZWZhdWx0LGkuaW5uZXJIVE1MPW1bMV0rbi5odG1sUHJlZmlsdGVyKGcpK21bMl0sZj1tWzBdO3doaWxlKGYtLSlpPWkubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZhYS50ZXN0KGcpJiZxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShhYS5leGVjKGcpWzBdKSksIWwudGJvZHkpe2c9InRhYmxlIiE9PWp8fGhhLnRlc3QoZyk/Ijx0YWJsZT4iIT09bVsxXXx8aGEudGVzdChnKT8wOmk6aS5maXJzdENoaWxkLGY9ZyYmZy5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShmLS0pbi5ub2RlTmFtZShrPWcuY2hpbGROb2Rlc1tmXSwidGJvZHkiKSYmIWsuY2hpbGROb2Rlcy5sZW5ndGgmJmcucmVtb3ZlQ2hpbGQoayl9bi5tZXJnZShxLGkuY2hpbGROb2RlcyksaS50ZXh0Q29udGVudD0iIjt3aGlsZShpLmZpcnN0Q2hpbGQpaS5yZW1vdmVDaGlsZChpLmZpcnN0Q2hpbGQpO2k9cC5sYXN0Q2hpbGR9ZWxzZSBxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShnKSk7aSYmcC5yZW1vdmVDaGlsZChpKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcChlYShxLCJpbnB1dCIpLGlhKSxyPTA7d2hpbGUoZz1xW3IrK10paWYoZCYmbi5pbkFycmF5KGcsZCk+LTEpZSYmZS5wdXNoKGcpO2Vsc2UgaWYoaD1uLmNvbnRhaW5zKGcub3duZXJEb2N1bWVudCxnKSxpPWVhKHAuYXBwZW5kQ2hpbGQoZyksInNjcmlwdCIpLGgmJmZhKGkpLGMpe2Y9MDt3aGlsZShnPWlbZisrXSlfLnRlc3QoZy50eXBlfHwiIikmJmMucHVzaChnKX1yZXR1cm4gaT1udWxsLHB9IWZ1bmN0aW9uKCl7dmFyIGIsYyxlPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiXT1jIGluIGEpfHwoZS5zZXRBdHRyaWJ1dGUoYywidCIpLGxbYl09ZS5hdHRyaWJ1dGVzW2NdLmV4cGFuZG89PT0hMSk7ZT1udWxsfSgpO3ZhciBrYT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksbGE9L15rZXkvLG1hPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxuYT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sb2E9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHBhKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMX1mdW5jdGlvbiByYSgpe3RyeXtyZXR1cm4gZC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319ZnVuY3Rpb24gc2EoYSxiLGMsZCxlLGYpe3ZhciBnLGg7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXsic3RyaW5nIiE9dHlwZW9mIGMmJihkPWR8fGMsYz12b2lkIDApO2ZvcihoIGluIGIpc2EoYSxoLGMsZCxiW2hdLGYpO3JldHVybiBhfWlmKG51bGw9PWQmJm51bGw9PWU/KGU9YyxkPWM9dm9pZCAwKTpudWxsPT1lJiYoInN0cmluZyI9PXR5cGVvZiBjPyhlPWQsZD12b2lkIDApOihlPWQsZD1jLGM9dm9pZCAwKSksZT09PSExKWU9cWE7ZWxzZSBpZighZSlyZXR1cm4gYTtyZXR1cm4gMT09PWYmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1uLmd1aWQrKykpLGEuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYixlLGQsYyl9KX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygbnx8YSYmbi5ldmVudC50cmlnZ2VyZWQ9PT1hLnR5cGU/dm9pZCAwOm4uZXZlbnQuZGlzcGF0Y2guYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9LGsuZWxlbT1hKSxiPShifHwiIikubWF0Y2goRyl8fFsiIl0saD1iLmxlbmd0aDt3aGlsZShoLS0pZj1vYS5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChtPWdbb10pfHwobT1nW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsbCk6bS5wdXNoKGwpLG4uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9bi5oYXNEYXRhKGEpJiZuLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9b2EuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09a1tvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGk9Zj1tLmxlbmd0aDt3aGlsZShmLS0pZz1tW2ZdLCFlJiZxIT09Zy5vcmlnVHlwZXx8YyYmYy5ndWlkIT09Zy5ndWlkfHxoJiYhaC50ZXN0KGcubmFtZXNwYWNlKXx8ZCYmZCE9PWcuc2VsZWN0b3ImJigiKioiIT09ZHx8IWcuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxnLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGcpKTtpJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGtbb10pfWVsc2UgZm9yKG8gaW4gayluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChrKSYmKGRlbGV0ZSByLmhhbmRsZSxuLl9yZW1vdmVEYXRhKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGUsZil7dmFyIGcsaCxpLGosbCxtLG8scD1bZXx8ZF0scT1rLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ay5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaT1tPWU9ZXx8ZCwzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJiFuYS50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+LTEmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaD1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9Zj8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5ybmFtZXNwYWNlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1lKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxsPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZnx8IWwudHJpZ2dlcnx8bC50cmlnZ2VyLmFwcGx5KGUsYykhPT0hMSkpe2lmKCFmJiYhbC5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZSkpe2ZvcihqPWwuZGVsZWdhdGVUeXBlfHxxLG5hLnRlc3QoaitxKXx8KGk9aS5wYXJlbnROb2RlKTtpO2k9aS5wYXJlbnROb2RlKXAucHVzaChpKSxtPWk7bT09PShlLm93bmVyRG9jdW1lbnR8fGQpJiZwLnB1c2gobS5kZWZhdWx0Vmlld3x8bS5wYXJlbnRXaW5kb3d8fGEpfW89MDt3aGlsZSgoaT1wW28rK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1vPjE/ajpsLmJpbmRUeXBlfHxxLGc9KG4uX2RhdGEoaSwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZuLl9kYXRhKGksImhhbmRsZSIpLGcmJmcuYXBwbHkoaSxjKSxnPWgmJmlbaF0sZyYmZy5hcHBseSYmTShpKSYmKGIucmVzdWx0PWcuYXBwbHkoaSxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1xLCFmJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFsLl9kZWZhdWx0fHxsLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYyk9PT0hMSkmJk0oZSkmJmgmJmVbcV0mJiFuLmlzV2luZG93KGUpKXttPWVbaF0sbSYmKGVbaF09bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cTt0cnl7ZVtxXSgpfWNhdGNoKHMpe31uLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbSYmKGVbaF09bSl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShuLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1uLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1uLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGM9MDt3aGlsZSgoZz1mLmhhbmRsZXJzW2MrK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWEucm5hbWVzcGFjZSYmIWEucm5hbWVzcGFjZS50ZXN0KGcubmFtZXNwYWNlKXx8KGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxkPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1kJiYoYS5yZXN1bHQ9ZCk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8aXNOYU4oYS5idXR0b24pfHxhLmJ1dHRvbjwxKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+LTE6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW24uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxlLGY9YS50eXBlLGc9YSxoPXRoaXMuZml4SG9va3NbZl07aHx8KHRoaXMuZml4SG9va3NbZl09aD1tYS50ZXN0KGYpP3RoaXMubW91c2VIb29rczpsYS50ZXN0KGYpP3RoaXMua2V5SG9va3M6e30pLGU9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZyksYj1lLmxlbmd0aDt3aGlsZShiLS0pYz1lW2JdLGFbY109Z1tjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGQpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBkZXRhaWwgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGc9Yi5idXR0b24saD1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGQsZj1lLmRvY3VtZW50RWxlbWVudCxjPWUuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmgmJihhLnJlbGF0ZWRUYXJnZXQ9aD09PWEudGFyZ2V0P2IudG9FbGVtZW50OmgpLGEud2hpY2h8fHZvaWQgMD09PWd8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09cmEoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1yYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMH0pO24uZXZlbnQudHJpZ2dlcihkLG51bGwsYiksZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1kLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgYVtkXSYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/cGE6cWEpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bi5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6cWEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6cWEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6cWEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGEsYSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wYSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cGEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fG4uY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLGwuc3VibWl0fHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP24ucHJvcChiLCJmb3JtIik6dm9pZCAwO2MmJiFuLl9kYXRhKGMsInN1Ym1pdCIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdEJ1YmJsZT0hMH0pLG4uX2RhdGEoYywic3VibWl0IiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRCdWJibGUmJihkZWxldGUgYS5fc3VibWl0QnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZuLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxsLmNoYW5nZXx8KG4uZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIGthLnRlc3QodGhpcy5ub2RlTmFtZSk/KCJjaGVja2JveCIhPT10aGlzLnR5cGUmJiJyYWRpbyIhPT10aGlzLnR5cGV8fChuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdENoYW5nZWQ9ITApfSksbi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdENoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RDaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7a2EudGVzdChiLm5vZGVOYW1lKSYmIW4uX2RhdGEoYiwiY2hhbmdlIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEpfSksbi5fZGF0YShiLCJjaGFuZ2UiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFrYS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbnx8bi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbi5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW4uX2RhdGEoZCxiKS0xO2U/bi5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gc2EodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBzYSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9cWEpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIHRhPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csdWE9bmV3IFJlZ0V4cCgiPCg/OiIrYmErIilbXFxzLz5dIiwiaSIpLHZhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzotXSspW14+XSopXC8+L2dpLHdhPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLHhhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHlhPS9edHJ1ZVwvKC4qKS8semE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLEFhPWNhKGQpLEJhPUFhLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Z1bmN0aW9uIENhKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBEYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bi5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gRWEoYSl7dmFyIGI9eWEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBGYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZuLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW4uX2RhdGEoYSksZz1uLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyluLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW4uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBHYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWwubm9DbG9uZUV2ZW50JiZiW24uZXhwYW5kb10pe2U9bi5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyluLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobi5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oRGEoYikudGV4dD1hLnRleHQsRWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGwuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFuLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmWi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19ZnVuY3Rpb24gSGEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJnhhLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSxIYShmLGIsYyxkKX0pO2lmKG8mJihrPWphKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZT1rLmZpcnN0Q2hpbGQsMT09PWsuY2hpbGROb2Rlcy5sZW5ndGgmJihrPWUpLGV8fGQpKXtmb3IoaT1uLm1hcChlYShrLCJzY3JpcHQiKSxEYSksaD1pLmxlbmd0aDtvPm07bSsrKWc9ayxtIT09cCYmKGc9bi5jbG9uZShnLCEwLCEwKSxoJiZuLm1lcmdlKGksZWEoZywic2NyaXB0IikpKSxjLmNhbGwoYVttXSxnLG0pO2lmKGgpZm9yKGo9aVtpLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG4ubWFwKGksRWEpLG09MDtoPm07bSsrKWc9aVttXSxfLnRlc3QoZy50eXBlfHwiIikmJiFuLl9kYXRhKGcsImdsb2JhbEV2YWwiKSYmbi5jb250YWlucyhqLGcpJiYoZy5zcmM/bi5fZXZhbFVybCYmbi5fZXZhbFVybChnLnNyYyk6bi5nbG9iYWxFdmFsKChnLnRleHR8fGcudGV4dENvbnRlbnR8fGcuaW5uZXJIVE1MfHwiIikucmVwbGFjZSh6YSwiIikpKTtrPWU9bnVsbH1yZXR1cm4gYX1mdW5jdGlvbiBJYShhLGIsYyl7Zm9yKHZhciBkLGU9Yj9uLmZpbHRlcihiLGEpOmEsZj0wO251bGwhPShkPWVbZl0pO2YrKyljfHwxIT09ZC5ub2RlVHlwZXx8bi5jbGVhbkRhdGEoZWEoZCkpLGQucGFyZW50Tm9kZSYmKGMmJm4uY29udGFpbnMoZC5vd25lckRvY3VtZW50LGQpJiZmYShlYShkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHZhLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihsLmh0bWw1Q2xvbmV8fG4uaXNYTUxEb2MoYSl8fCF1YS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KEJhLmlubmVySFRNTD1hLm91dGVySFRNTCxCYS5yZW1vdmVDaGlsZChmPUJhLmZpcnN0Q2hpbGQpKSwhKGwubm9DbG9uZUV2ZW50JiZsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZD1lYShmKSxoPWVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmR2EoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8ZWEoYSksZD1kfHxlYShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUZhKGUsZFtnXSk7ZWxzZSBGYShhLGYpO3JldHVybiBkPWVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJmZhKGQsIWkmJmVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5hdHRyaWJ1dGVzLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8TShkKSkmJihmPWRbaV0sZz1mJiZqW2ZdKSl7aWYoZy5ldmVudHMpZm9yKGUgaW4gZy5ldmVudHMpbVtlXT9uLmV2ZW50LnJlbW92ZShkLGUpOm4ucmVtb3ZlRXZlbnQoZCxlLGcuaGFuZGxlKTtqW2ZdJiYoZGVsZXRlIGpbZl0sa3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZT9kW2ldPXZvaWQgMDpkLnJlbW92ZUF0dHJpYnV0ZShpKSxjLnB1c2goZikpfX19KSxuLmZuLmV4dGVuZCh7ZG9tTWFuaXA6SGEsZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBJYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIElhKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxkKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEhhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1DYSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUNhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm4uY2xlYW5EYXRhKGVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbi5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UodGEsIiIpOnZvaWQgMDtpZigic3RyaW5nIj09dHlwZW9mIGEmJiF3YS50ZXN0KGEpJiYobC5odG1sU2VyaWFsaXplfHwhdWEudGVzdChhKSkmJihsLmxlYWRpbmdXaGl0ZXNwYWNlfHwhYWEudGVzdChhKSkmJiFkYVsoJC5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1uLmh0bWxQcmVmaWx0ZXIoYSk7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEoZWEoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5wYXJlbnROb2RlO24uaW5BcnJheSh0aGlzLGEpPDAmJihuLmNsZWFuRGF0YShlYSh0aGlzKSksYyYmYy5yZXBsYWNlQ2hpbGQoYix0aGlzKSl9LGEpfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZj1uKGEpLGg9Zi5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihmW2RdKVtiXShjKSxnLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBKYSxLYT17SFRNTDoiYmxvY2siLEJPRFk6ImJsb2NrIn07ZnVuY3Rpb24gTGEoYSxiKXt2YXIgYz1uKGIuY3JlYXRlRWxlbWVudChhKSkuYXBwZW5kVG8oYi5ib2R5KSxkPW4uY3NzKGNbMF0sImRpc3BsYXkiKTtyZXR1cm4gYy5kZXRhY2goKSxkfWZ1bmN0aW9uIE1hKGEpe3ZhciBiPWQsYz1LYVthXTtyZXR1cm4gY3x8KGM9TGEoYSxiKSwibm9uZSIhPT1jJiZjfHwoSmE9KEphfHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPShKYVswXS5jb250ZW50V2luZG93fHxKYVswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1MYShhLGIpLEphLmRldGFjaCgpKSxLYVthXT1jKSxjfXZhciBOYT0vXm1hcmdpbi8sT2E9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxQYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX0sUWE9ZC5kb2N1bWVudEVsZW1lbnQ7IWZ1bmN0aW9uKCl7dmFyIGIsYyxlLGYsZyxoLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxqPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoai5zdHlsZSl7ai5zdHlsZS5jc3NUZXh0PSJmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLGwub3BhY2l0eT0iMC41Ij09PWouc3R5bGUub3BhY2l0eSxsLmNzc0Zsb2F0PSEhai5zdHlsZS5jc3NGbG9hdCxqLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsai5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGwuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1qLnN0eWxlLmJhY2tncm91bmRDbGlwLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixqLmlubmVySFRNTD0iIixpLmFwcGVuZENoaWxkKGopLGwuYm94U2l6aW5nPSIiPT09ai5zdHlsZS5ib3hTaXppbmd8fCIiPT09ai5zdHlsZS5Nb3pCb3hTaXppbmd8fCIiPT09ai5zdHlsZS5XZWJraXRCb3hTaXppbmcsbi5leHRlbmQobCx7cmVsaWFibGVIaWRkZW5PZmZzZXRzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxmfSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZX0scGl4ZWxNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksY30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksYn0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZ30scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxofX0pO2Z1bmN0aW9uIGsoKXt2YXIgayxsLG09ZC5kb2N1bWVudEVsZW1lbnQ7bS5hcHBlbmRDaGlsZChpKSxqLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7dG9wOjElO3dpZHRoOjUwJSIsYj1lPWg9ITEsYz1nPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9YS5nZXRDb21wdXRlZFN0eWxlKGopLGI9IjElIiE9PShsfHx7fSkudG9wLGg9IjJweCI9PT0obHx8e30pLm1hcmdpbkxlZnQsZT0iNHB4Ij09PShsfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxqLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGM9IjRweCI9PT0obHx8e21hcmdpblJpZ2h0OiI0cHgifSkubWFyZ2luUmlnaHQsaz1qLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGsuc3R5bGUuY3NzVGV4dD1qLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsay5zdHlsZS5tYXJnaW5SaWdodD1rLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShrKXx8e30pLm1hcmdpblJpZ2h0KSxqLnJlbW92ZUNoaWxkKGspKSxqLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWouZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsZiYmKGouc3R5bGUuZGlzcGxheT0iIixqLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsai5jaGlsZE5vZGVzWzBdLnN0eWxlLmJvcmRlckNvbGxhcHNlPSJzZXBhcmF0ZSIsaz1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGtbMF0uc3R5bGUuY3NzVGV4dD0ibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZSIsZj0wPT09a1swXS5vZmZzZXRIZWlnaHQsZiYmKGtbMF0uc3R5bGUuZGlzcGxheT0iIixrWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWtbMF0ub2Zmc2V0SGVpZ2h0KSksbS5yZW1vdmVDaGlsZChpKX19fSgpO3ZhciBSYSxTYSxUYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhSYT1mdW5jdGlvbihiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGMmJmMub3BlbmVyfHwoYz1hKSxjLmdldENvbXB1dGVkU3R5bGUoYil9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2MuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXTp2b2lkIDAsIiIhPT1nJiZ2b2lkIDAhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxjJiYhbC5waXhlbE1hcmdpblJpZ2h0KCkmJk9hLnRlc3QoZykmJk5hLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9Ziksdm9pZCAwPT09Zz9nOmcrIiJ9KTpRYS5jdXJyZW50U3R5bGUmJihSYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jdXJyZW50U3R5bGV9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2NbYl06dm9pZCAwLG51bGw9PWcmJmgmJmhbYl0mJihnPWhbYl0pLE9hLnRlc3QoZykmJiFUYS50ZXN0KGIpJiYoZD1oLmxlZnQsZT1hLnJ1bnRpbWVTdHlsZSxmPWUmJmUubGVmdCxmJiYoZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGgubGVmdD0iZm9udFNpemUiPT09Yj8iMWVtIjpnLGc9aC5waXhlbExlZnQrInB4IixoLmxlZnQ9ZCxmJiYoZS5sZWZ0PWYpKSx2b2lkIDA9PT1nP2c6ZysiInx8ImF1dG8ifSk7ZnVuY3Rpb24gVWEoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19dmFyIFZhPS9hbHBoYVwoW14pXSpcKS9pLFdhPS9vcGFjaXR5XHMqPVxzKihbXildKikvaSxYYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sWWE9bmV3IFJlZ0V4cCgiXigiK1QrIikoLiopJCIsImkiKSxaYT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sJGE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LF9hPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sYWI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBiYihhKXtpZihhIGluIGFiKXJldHVybiBhO3ZhciBiPWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPV9hLmxlbmd0aDt3aGlsZShjLS0paWYoYT1fYVtjXStiLGEgaW4gYWIpcmV0dXJuIGF9ZnVuY3Rpb24gY2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlcoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsTWEoZC5ub2RlTmFtZSkpKSk6KGU9VyhkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIGRiKGEsYixjKXt2YXIgZD1ZYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIGViKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVltmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gZmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPVJhKGEpLGc9bC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1TYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLE9hLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYobC5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK2ViKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPVNhKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1iYihoKXx8aCksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWMpcmV0dXJuIGcmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdO2lmKGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1VLmV4ZWMoYykpJiZlWzFdJiYoYz1YKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChuLmNzc051bWJlcltoXT8iIjoicHgiKSksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPWJiKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZj1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1mJiYoZj1TYShhLGIsZCkpLCJub3JtYWwiPT09ZiYmYiBpbiAkYSYmKGY9JGFbYl0pLCIiPT09Y3x8Yz8oZT1wYXJzZUZsb2F0KGYpLGM9PT0hMHx8aXNGaW5pdGUoZSk/ZXx8MDpmKTpmfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP1hhLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/UGEoYSxaYSxmdW5jdGlvbigpe3JldHVybiBmYihhLGIsZCl9KTpmYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJlJhKGEpO3JldHVybiBkYihhLGMsZD9lYihhLGIsZCxsLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbC5vcGFjaXR5fHwobi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gV2EudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW4uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1uLnRyaW0oZi5yZXBsYWNlKFZhLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPVZhLnRlc3QoZik/Zi5yZXBsYWNlKFZhLGUpOmYrIiAiK2UpfX0pLG4uY3NzSG9va3MubWFyZ2luUmlnaHQ9VWEobC5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/UGEoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sU2EsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uY3NzSG9va3MubWFyZ2luTGVmdD1VYShsLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihhLGIpe3JldHVybiBiPyhwYXJzZUZsb2F0KFNhKGEsIm1hcmdpbkxlZnQiKSl8fChuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtUGEoYSx7Cm1hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSk6MCkpKyJweCI6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxOYS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1kYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPVJhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGdiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1nYixnYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fG4uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWdiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpnYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1nYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmdiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGdiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1nYi5wcm90b3R5cGUsZ2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiAxIT09YS5lbGVtLm5vZGVUeXBlfHxudWxsIT1hLmVsZW1bYS5wcm9wXSYmbnVsbD09YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtW2EucHJvcF06KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6MSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbD09YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV0mJiFuLmNzc0hvb2tzW2EucHJvcF0/YS5lbGVtW2EucHJvcF09YS5ub3c6bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCl9fX0sZ2IucHJvcEhvb2tzLnNjcm9sbFRvcD1nYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LG4uZng9Z2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBoYixpYixqYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sa2I9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBsYigpe3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoYj12b2lkIDB9KSxoYj1uLm5vdygpfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VltlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIG5iKGEsYixjKXtmb3IodmFyIGQsZT0ocWIudHdlZW5lcnNbYl18fFtdKS5jb25jYXQocWIudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gb2IoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVyhhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP24uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxNYShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1NYShhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGpiLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP01hKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW4uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP24oYSkuc2hvdygpOm0uZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbS5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bi5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW4uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPW5iKHE/cltkXTowLGQsbSksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBxYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1xYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWhifHxsYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmhifHxsYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihwYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9cWIucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLG5iLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQocWIse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBYKGMuZWxlbSxhLFUuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLHFiLnR3ZWVuZXJzW2NdPXFiLnR3ZWVuZXJzW2NdfHxbXSxxYi50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltvYl0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9xYi5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6cWIucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihXKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9cWIodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8bi5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9bi5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZrYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1uLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobWIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOm1iKCJzaG93Iiksc2xpZGVVcDptYigiaGlkZSIpLHNsaWRlVG9nZ2xlOm1iKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW4udGltZXJzLGM9MDtmb3IoaGI9bi5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxuLmZ4LnN0b3AoKSxoYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpYnx8KGliPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKGliKSxpYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGY9ZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94IiksYy5hcHBlbmRDaGlsZChiKSxhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGwuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWMuY2xhc3NOYW1lLGwuc3R5bGU9L3RvcC8udGVzdChhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksbC5ocmVmTm9ybWFsaXplZD0iL2EiPT09YS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxsLmNoZWNrT249ISFiLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Zi5zZWxlY3RlZCxsLmVuY3R5cGU9ISFkLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGUuZGlzYWJsZWQ9ITAsbC5vcHREaXNhYmxlZD0hZi5kaXNhYmxlZCxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxsLmlucHV0PSIiPT09Yi5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYi52YWx1ZT0idCIsYi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGwucmFkaW9WYWx1ZT0idCI9PT1iLnZhbHVlfSgpO3ZhciByYj0vXHIvZyxzYj0vW1x4MjBcdFxyXG5cZl0rL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKHJiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKS5yZXBsYWNlKHNiLCIgIil9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwoYy5zZWxlY3RlZHx8aT09PWUpJiYobC5vcHREaXNhYmxlZD8hYy5kaXNhYmxlZDpudWxsPT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpJiYoIWMucGFyZW50Tm9kZS5kaXNhYmxlZHx8IW4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG4uaW5BcnJheShuLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+LTEpdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT4tMTp2b2lkIDB9fSxsLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIHRiLHViLHZiPW4uZXhwci5hdHRySGFuZGxlLHdiPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kseGI9bC5nZXRTZXRBdHRyaWJ1dGUseWI9bC5pbnB1dDtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBZKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZigzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxlPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT91Yjp0YikpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/eWImJnhifHwhd2IudGVzdChjKT9hW2RdPSExOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTpuLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh4Yj9jOmQpfX0pLHViPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6eWImJnhifHwhd2IudGVzdChjKT9hLnNldEF0dHJpYnV0ZSgheGImJm4ucHJvcEZpeFtjXXx8YyxjKTphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPXZiW2JdfHxuLmZpbmQuYXR0cjt5YiYmeGJ8fCF3Yi50ZXN0KGIpP3ZiW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj12YltiXSx2YltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsdmJbYl09ZiksZX06dmJbYl09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHliJiZ4Ynx8KG4uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTp0YiYmdGIuc2V0KGEsYixjKX19KSx4Ynx8KHRiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sdmIuaWQ9dmIubmFtZT12Yi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxuLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0OnRiLnNldH0sbi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3RiLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe24uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxsLnN0eWxlfHwobi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksQWI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bi5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTp6Yi50ZXN0KGEubm9kZU5hbWUpfHxBYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGwuZW5jdHlwZXx8KG4ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciBCYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIENiKGEpe3JldHVybiBuLmF0dHIoYSwiY2xhc3MiKXx8IiJ9bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk9MDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsQ2IodGhpcykpKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKWQuaW5kZXhPZigiICIrZisiICIpPDAmJihkKz1mKyIgIik7aD1uLnRyaW0oZCksZSE9PWgmJm4uYXR0cihjLCJjbGFzcyIsaCl9fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLENiKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZisiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitmKyIgIiwiICIpO2g9bi50cmltKGQpLGUhPT1oJiZuLmF0dHIoYywiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6bi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsQ2IodGhpcyksYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixkLGUsZjtpZigic3RyaW5nIj09PWMpe2Q9MCxlPW4odGhpcyksZj1hLm1hdGNoKEcpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlIHZvaWQgMCE9PWEmJiJib29sZWFuIiE9PWN8fChiPUNiKHRoaXMpLGImJm4uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsYiksbi5hdHRyKHRoaXMsImNsYXNzIixifHxhPT09ITE/IiI6bi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPTA7Yj0iICIrYSsiICI7d2hpbGUoYz10aGlzW2QrK10paWYoMT09PWMubm9kZVR5cGUmJigiICIrQ2IoYykrIiAiKS5yZXBsYWNlKEJiLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIERiPWEubG9jYXRpb24sRWI9bi5ub3coKSxGYj0vXD8vLEdiPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bi5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1uLnRyaW0oYisiIik7cmV0dXJuIGUmJiFuLnRyaW0oZS5yZXBsYWNlKEdiLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm4uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBhLkRPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIEhiPS8jLiokLyxJYj0vKFs/Jl0pXz1bXiZdKi8sSmI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxLYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxMYj0vXig/OkdFVHxIRUFEKSQvLE1iPS9eXC9cLy8sTmI9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sT2I9e30sUGI9e30sUWI9IiovIi5jb25jYXQoIioiKSxSYj1EYi5ocmVmLFNiPU5iLmV4ZWMoUmIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIFRiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEcpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gVWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09UGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBWYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gWGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6UmIsdHlwZToiR0VUIixpc0xvY2FsOktiLnRlc3QoU2JbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UWIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bi5wYXJzZUpTT04sInRleHQgeG1sIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9WYihWYihhLG4uYWpheFNldHRpbmdzKSxiKTpWYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpUYihPYiksYWpheFRyYW5zcG9ydDpUYihQYiksYWpheDpmdW5jdGlvbihiLGMpeyJvYmplY3QiPT10eXBlb2YgYiYmKGM9YixiPXZvaWQgMCksYz1jfHx7fTt2YXIgZCxlLGYsZyxoLGksaixrLGw9bi5hamF4U2V0dXAoe30sYyksbT1sLmNvbnRleHR8fGwsbz1sLmNvbnRleHQmJihtLm5vZGVUeXBlfHxtLmpxdWVyeSk/bihtKTpuLmV2ZW50LHA9bi5EZWZlcnJlZCgpLHE9bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHM9e30sdD17fSx1PTAsdj0iY2FuY2VsZWQiLHc9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dSl7aWYoIWspe2s9e307d2hpbGUoYj1KYi5leGVjKGcpKWtbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9a1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT11P2c6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdXx8KGE9dFtjXT10W2NdfHxhLHNbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdXx8KGwubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dSlmb3IoYiBpbiBhKXJbYl09W3JbYl0sYVtiXV07ZWxzZSB3LmFsd2F5cyhhW3cuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHY7cmV0dXJuIGomJmouYWJvcnQoYikseSgwLGIpLHRoaXN9fTtpZihwLnByb21pc2UodykuY29tcGxldGU9cS5hZGQsdy5zdWNjZXNzPXcuZG9uZSx3LmVycm9yPXcuZmFpbCxsLnVybD0oKGJ8fGwudXJsfHxSYikrIiIpLnJlcGxhY2UoSGIsIiIpLnJlcGxhY2UoTWIsU2JbMV0rIi8vIiksbC50eXBlPWMubWV0aG9kfHxjLnR5cGV8fGwubWV0aG9kfHxsLnR5cGUsbC5kYXRhVHlwZXM9bi50cmltKGwuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8WyIiXSxudWxsPT1sLmNyb3NzRG9tYWluJiYoZD1OYi5leGVjKGwudXJsLnRvTG93ZXJDYXNlKCkpLGwuY3Jvc3NEb21haW49ISghZHx8ZFsxXT09PVNiWzFdJiZkWzJdPT09U2JbMl0mJihkWzNdfHwoImh0dHA6Ij09PWRbMV0/IjgwIjoiNDQzIikpPT09KFNiWzNdfHwoImh0dHA6Ij09PVNiWzFdPyI4MCI6IjQ0MyIpKSkpLGwuZGF0YSYmbC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBsLmRhdGEmJihsLmRhdGE9bi5wYXJhbShsLmRhdGEsbC50cmFkaXRpb25hbCkpLFViKE9iLGwsYyx3KSwyPT09dSlyZXR1cm4gdztpPW4uZXZlbnQmJmwuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGwudHlwZT1sLnR5cGUudG9VcHBlckNhc2UoKSxsLmhhc0NvbnRlbnQ9IUxiLnRlc3QobC50eXBlKSxmPWwudXJsLGwuaGFzQ29udGVudHx8KGwuZGF0YSYmKGY9bC51cmwrPShGYi50ZXN0KGYpPyImIjoiPyIpK2wuZGF0YSxkZWxldGUgbC5kYXRhKSxsLmNhY2hlPT09ITEmJihsLnVybD1JYi50ZXN0KGYpP2YucmVwbGFjZShJYiwiJDFfPSIrRWIrKyk6ZisoRmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0ViKyspKSxsLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbi5sYXN0TW9kaWZpZWRbZl0pLG4uZXRhZ1tmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixuLmV0YWdbZl0pKSwobC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJncuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSx3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsbC5kYXRhVHlwZXNbMF0mJmwuYWNjZXB0c1tsLmRhdGFUeXBlc1swXV0/bC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXSsoIioiIT09bC5kYXRhVHlwZXNbMF0/IiwgIitRYisiOyBxPTAuMDEiOiIiKTpsLmFjY2VwdHNbIioiXSk7Zm9yKGUgaW4gbC5oZWFkZXJzKXcuc2V0UmVxdWVzdEhlYWRlcihlLGwuaGVhZGVyc1tlXSk7aWYobC5iZWZvcmVTZW5kJiYobC5iZWZvcmVTZW5kLmNhbGwobSx3LGwpPT09ITF8fDI9PT11KSlyZXR1cm4gdy5hYm9ydCgpO3Y9ImFib3J0Ijtmb3IoZSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl3W2VdKGxbZV0pO2lmKGo9VWIoUGIsbCxjLHcpKXtpZih3LnJlYWR5U3RhdGU9MSxpJiZvLnRyaWdnZXIoImFqYXhTZW5kIixbdyxsXSksMj09PXUpcmV0dXJuIHc7bC5hc3luYyYmbC50aW1lb3V0PjAmJihoPWEuc2V0VGltZW91dChmdW5jdGlvbigpe3cuYWJvcnQoInRpbWVvdXQiKX0sbC50aW1lb3V0KSk7dHJ5e3U9MSxqLnNlbmQocyx5KX1jYXRjaCh4KXtpZighKDI+dSkpdGhyb3cgeDt5KC0xLHgpfX1lbHNlIHkoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHkoYixjLGQsZSl7dmFyIGsscyx0LHYseCx5PWM7MiE9PXUmJih1PTIsaCYmYS5jbGVhclRpbWVvdXQoaCksaj12b2lkIDAsZz1lfHwiIix3LnJlYWR5U3RhdGU9Yj4wPzQ6MCxrPWI+PTIwMCYmMzAwPmJ8fDMwND09PWIsZCYmKHY9V2IobCx3LGQpKSx2PVhiKGwsdix3LGspLGs/KGwuaWZNb2RpZmllZCYmKHg9dy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHgmJihuLmxhc3RNb2RpZmllZFtmXT14KSx4PXcuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx4JiYobi5ldGFnW2ZdPXgpKSwyMDQ9PT1ifHwiSEVBRCI9PT1sLnR5cGU/eT0ibm9jb250ZW50IjozMDQ9PT1iP3k9Im5vdG1vZGlmaWVkIjooeT12LnN0YXRlLHM9di5kYXRhLHQ9di5lcnJvcixrPSF0KSk6KHQ9eSwhYiYmeXx8KHk9ImVycm9yIiwwPmImJihiPTApKSksdy5zdGF0dXM9Yix3LnN0YXR1c1RleHQ9KGN8fHkpKyIiLGs/cC5yZXNvbHZlV2l0aChtLFtzLHksd10pOnAucmVqZWN0V2l0aChtLFt3LHksdF0pLHcuc3RhdHVzQ29kZShyKSxyPXZvaWQgMCxpJiZvLnRyaWdnZXIoaz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt3LGwsaz9zOnRdKSxxLmZpcmVXaXRoKG0sW3cseV0pLGkmJihvLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3csbF0pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB3fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheChuLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sbi5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTtmdW5jdGlvbiBZYihhKXtyZXR1cm4gYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5Iil9ZnVuY3Rpb24gWmIoYSl7aWYoIW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50fHxkLGEpKXJldHVybiEwO3doaWxlKGEmJjE9PT1hLm5vZGVUeXBlKXtpZigibm9uZSI9PT1ZYihhKXx8ImhpZGRlbiI9PT1hLnR5cGUpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9bi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpP2Eub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wJiYhYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDpaYihhKX0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgJGI9LyUyMC9nLF9iPS9cW1xdJC8sYWM9L1xyP1xuL2csYmM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBkYyhhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxfYi50ZXN0KGEpP2QoYSxlKTpkYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpZGMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlkYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSgkYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmY2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIWJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFaLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYWMsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGFjLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWw/aWMoKTpkLmRvY3VtZW50TW9kZT44P2hjKCk6L14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmaGMoKXx8aWMoKX06aGM7dmFyIGVjPTAsZmM9e30sZ2M9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGZjKWZjW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFnYyYmIndpdGhDcmVkZW50aWFscyJpbiBnYyxnYz1sLmFqYXg9ISFnYyxnYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGIpe2lmKCFiLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7dmFyIGYsZz1iLnhocigpLGg9KytlYztpZihnLm9wZW4oYi50eXBlLGIudXJsLGIuYXN5bmMsYi51c2VybmFtZSxiLnBhc3N3b3JkKSxiLnhockZpZWxkcylmb3IoZiBpbiBiLnhockZpZWxkcylnW2ZdPWIueGhyRmllbGRzW2ZdO2IubWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZSYmZy5vdmVycmlkZU1pbWVUeXBlKGIubWltZVR5cGUpLGIuY3Jvc3NEb21haW58fGRbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGRbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZiBpbiBkKXZvaWQgMCE9PWRbZl0mJmcuc2V0UmVxdWVzdEhlYWRlcihmLGRbZl0rIiIpO2cuc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCksYz1mdW5jdGlvbihhLGQpe3ZhciBmLGksajtpZihjJiYoZHx8ND09PWcucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIGZjW2hdLGM9dm9pZCAwLGcub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxkKTQhPT1nLnJlYWR5U3RhdGUmJmcuYWJvcnQoKTtlbHNle2o9e30sZj1nLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGcucmVzcG9uc2VUZXh0JiYoai50ZXh0PWcucmVzcG9uc2VUZXh0KTt0cnl7aT1nLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1mfHwhYi5pc0xvY2FsfHxiLmNyb3NzRG9tYWluPzEyMjM9PT1mJiYoZj0yMDQpOmY9ai50ZXh0PzIwMDo0MDR9aiYmZShmLGksaixnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYi5hc3luYz80PT09Zy5yZWFkeVN0YXRlP2Euc2V0VGltZW91dChjKTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mY1toXT1jOmMoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBoYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBpYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPWQuaGVhZHx8bigiaGVhZCIpWzBdfHxkLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGYpe2I9ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxmKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgamM9W10sa2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9amMucG9wKCl8fG4uZXhwYW5kbysiXyIrRWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGtjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYma2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGtjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShGYi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1mP24oYSkucmVtb3ZlUHJvcChlKTphW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssamMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGQ7dmFyIGU9eC5leGVjKGEpLGY9IWMmJltdO3JldHVybiBlP1tiLmNyZWF0ZUVsZW1lbnQoZVsxXSldOihlPWphKFthXSxiLGYpLGYmJmYubGVuZ3RoJiZuKGYpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9O3ZhciBsYz1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmxjKXJldHVybiBsYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPi0xJiYoZD1uLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG4uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07ZnVuY3Rpb24gbWMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZuLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLG4uZXh0ZW5kKHt9LGgpKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8oInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1tYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxRYX0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO24uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9bWMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bihmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bihmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT1VYShsLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1TYShhLGIpLE9hLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7CnBhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pLG4uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbi5mbi5hbmRTZWxmPW4uZm4uYWRkQmFjaywiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBuYz1hLmpRdWVyeSxvYz1hLiQ7cmV0dXJuIG4ubm9Db25mbGljdD1mdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09biYmKGEuJD1vYyksYiYmYS5qUXVlcnk9PT1uJiYoYS5qUXVlcnk9bmMpLG59LGJ8fChhLmpRdWVyeT1hLiQ9biksbn0pOwo="},{"meta":{"name":"sweetalert2@11","url":"https://cdn.jsdelivr.net/npm/sweetalert2@11","ts":1637743664258,"mimetype":"text/plain"},"source":"IWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuU3dlZXRhbGVydDI9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IHU9T2JqZWN0LmZyZWV6ZSh7Y2FuY2VsOiJjYW5jZWwiLGJhY2tkcm9wOiJiYWNrZHJvcCIsY2xvc2U6ImNsb3NlIixlc2M6ImVzYyIsdGltZXI6InRpbWVyIn0pLHQ9IlN3ZWV0QWxlcnQyOiIsbz1lPT5lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkscz1lPT5BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSxhPWU9Pntjb25zb2xlLndhcm4oIiIuY29uY2F0KHQsIiAiKS5jb25jYXQoIm9iamVjdCI9PXR5cGVvZiBlP2Uuam9pbigiICIpOmUpKX0scj1lPT57Y29uc29sZS5lcnJvcigiIi5jb25jYXQodCwiICIpLmNvbmNhdChlKSl9LG49W10saT0oZSx0KT0+e3Q9JyInLmNvbmNhdChlLCciIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBQbGVhc2UgdXNlICInKS5jb25jYXQodCwnIiBpbnN0ZWFkLicpLG4uaW5jbHVkZXModCl8fChuLnB1c2godCksYSh0KSl9LGQ9ZT0+ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSgpOmUsYz1lPT5lJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b1Byb21pc2UsbD1lPT5jKGUpP2UudG9Qcm9taXNlKCk6UHJvbWlzZS5yZXNvbHZlKGUpLHA9ZT0+ZSYmUHJvbWlzZS5yZXNvbHZlKGUpPT09ZSxtPWU9PiJvYmplY3QiPT10eXBlb2YgZSYmZS5qcXVlcnksZz1lPT5lIGluc3RhbmNlb2YgRWxlbWVudHx8bShlKTt2YXIgZT1lPT57Y29uc3QgdD17fTtmb3IoY29uc3QgbiBpbiBlKXRbZVtuXV09InN3YWwyLSIrZVtuXTtyZXR1cm4gdH07Y29uc3QgaD1lKFsiY29udGFpbmVyIiwic2hvd24iLCJoZWlnaHQtYXV0byIsImlvc2ZpeCIsInBvcHVwIiwibW9kYWwiLCJuby1iYWNrZHJvcCIsIm5vLXRyYW5zaXRpb24iLCJ0b2FzdCIsInRvYXN0LXNob3duIiwic2hvdyIsImhpZGUiLCJjbG9zZSIsInRpdGxlIiwiaHRtbC1jb250YWluZXIiLCJhY3Rpb25zIiwiY29uZmlybSIsImRlbnkiLCJjYW5jZWwiLCJkZWZhdWx0LW91dGxpbmUiLCJmb290ZXIiLCJpY29uIiwiaWNvbi1jb250ZW50IiwiaW1hZ2UiLCJpbnB1dCIsImZpbGUiLCJyYW5nZSIsInNlbGVjdCIsInJhZGlvIiwiY2hlY2tib3giLCJsYWJlbCIsInRleHRhcmVhIiwiaW5wdXRlcnJvciIsImlucHV0LWxhYmVsIiwidmFsaWRhdGlvbi1tZXNzYWdlIiwicHJvZ3Jlc3Mtc3RlcHMiLCJhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCIsInByb2dyZXNzLXN0ZXAiLCJwcm9ncmVzcy1zdGVwLWxpbmUiLCJsb2FkZXIiLCJsb2FkaW5nIiwic3R5bGVkIiwidG9wIiwidG9wLXN0YXJ0IiwidG9wLWVuZCIsInRvcC1sZWZ0IiwidG9wLXJpZ2h0IiwiY2VudGVyIiwiY2VudGVyLXN0YXJ0IiwiY2VudGVyLWVuZCIsImNlbnRlci1sZWZ0IiwiY2VudGVyLXJpZ2h0IiwiYm90dG9tIiwiYm90dG9tLXN0YXJ0IiwiYm90dG9tLWVuZCIsImJvdHRvbS1sZWZ0IiwiYm90dG9tLXJpZ2h0IiwiZ3Jvdy1yb3ciLCJncm93LWNvbHVtbiIsImdyb3ctZnVsbHNjcmVlbiIsInJ0bCIsInRpbWVyLXByb2dyZXNzLWJhciIsInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXIiLCJzY3JvbGxiYXItbWVhc3VyZSIsImljb24tc3VjY2VzcyIsImljb24td2FybmluZyIsImljb24taW5mbyIsImljb24tcXVlc3Rpb24iLCJpY29uLWVycm9yIl0pLGY9ZShbInN1Y2Nlc3MiLCJ3YXJuaW5nIiwiaW5mbyIsInF1ZXN0aW9uIiwiZXJyb3IiXSksYj0oKT0+ZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5jb250YWluZXIpKSx5PWU9Pntjb25zdCB0PWIoKTtyZXR1cm4gdD90LnF1ZXJ5U2VsZWN0b3IoZSk6bnVsbH0sdj1lPT55KCIuIi5jb25jYXQoZSkpLHc9KCk9PnYoaC5wb3B1cCksQz0oKT0+dihoLmljb24pLGs9KCk9PnYoaC50aXRsZSksQT0oKT0+dihoWyJodG1sLWNvbnRhaW5lciJdKSxQPSgpPT52KGguaW1hZ2UpLEI9KCk9PnYoaFsicHJvZ3Jlc3Mtc3RlcHMiXSkseD0oKT0+dihoWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksRT0oKT0+eSgiLiIuY29uY2F0KGguYWN0aW9ucywiIC4iKS5jb25jYXQoaC5jb25maXJtKSksUz0oKT0+eSgiLiIuY29uY2F0KGguYWN0aW9ucywiIC4iKS5jb25jYXQoaC5kZW55KSk7Y29uc3QgVD0oKT0+eSgiLiIuY29uY2F0KGgubG9hZGVyKSksTD0oKT0+eSgiLiIuY29uY2F0KGguYWN0aW9ucywiIC4iKS5jb25jYXQoaC5jYW5jZWwpKSxPPSgpPT52KGguYWN0aW9ucyksaj0oKT0+dihoLmZvb3RlciksRD0oKT0+dihoWyJ0aW1lci1wcm9ncmVzcy1iYXIiXSksTT0oKT0+dihoLmNsb3NlKSxJPSgpPT57Y29uc3QgZT1zKHcoKS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pOm5vdChbdGFiaW5kZXg9IjAiXSknKSkuc29ydCgoZSx0KT0+KGU9cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoInRhYmluZGV4IikpLCh0PXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKSk8ZT8xOmU8dD8tMTowKSk7dmFyIHQ9cyh3KCkucXVlcnlTZWxlY3RvckFsbCgnXG4gIGFbaHJlZl0sXG4gIGFyZWFbaHJlZl0sXG4gIGlucHV0Om5vdChbZGlzYWJsZWRdKSxcbiAgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSxcbiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFxuICBidXR0b246bm90KFtkaXNhYmxlZF0pLFxuICBpZnJhbWUsXG4gIG9iamVjdCxcbiAgZW1iZWQsXG4gIFt0YWJpbmRleD0iMCJdLFxuICBbY29udGVudGVkaXRhYmxlXSxcbiAgYXVkaW9bY29udHJvbHNdLFxuICB2aWRlb1tjb250cm9sc10sXG4gIHN1bW1hcnlcbicpKS5maWx0ZXIoZT0+Ii0xIiE9PWUuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKTtyZXR1cm4odD0+e2NvbnN0IG49W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspLTE9PT1uLmluZGV4T2YodFtlXSkmJm4ucHVzaCh0W2VdKTtyZXR1cm4gbn0pKGUuY29uY2F0KHQpKS5maWx0ZXIoZT0+ZWUoZSkpfSxIPSgpPT4hcSgpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoaFsibm8tYmFja2Ryb3AiXSkscT0oKT0+ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoaFsidG9hc3Qtc2hvd24iXSk7ZnVuY3Rpb24gVihlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2NvbnN0IG49RCgpO2VlKG4pJiYodCYmKG4uc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsbi5zdHlsZS53aWR0aD0iMTAwJSIpLHNldFRpbWVvdXQoKCk9PntuLnN0eWxlLnRyYW5zaXRpb249IndpZHRoICIuY29uY2F0KGUvMWUzLCJzIGxpbmVhciIpLG4uc3R5bGUud2lkdGg9IjAlIn0sMTApKX1jb25zdCBOPXtwcmV2aW91c0JvZHlQYWRkaW5nOm51bGx9LFU9KHQsZSk9PntpZih0LnRleHRDb250ZW50PSIiLGUpe2NvbnN0IG49bmV3IERPTVBhcnNlcixvPW4ucGFyc2VGcm9tU3RyaW5nKGUsInRleHQvaHRtbCIpO3Moby5xdWVyeVNlbGVjdG9yKCJoZWFkIikuY2hpbGROb2RlcykuZm9yRWFjaChlPT57dC5hcHBlbmRDaGlsZChlKX0pLHMoby5xdWVyeVNlbGVjdG9yKCJib2R5IikuY2hpbGROb2RlcykuZm9yRWFjaChlPT57dC5hcHBlbmRDaGlsZChlKX0pfX0sRj0odCxlKT0+e2lmKCFlKXJldHVybiExO3ZhciBuPWUuc3BsaXQoL1xzKy8pO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKWlmKCF0LmNsYXNzTGlzdC5jb250YWlucyhuW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH0sUj0oZSx0LG4pPT57dmFyIG8saTtpZihvPWUsaT10LHMoby5jbGFzc0xpc3QpLmZvckVhY2goZT0+e09iamVjdC52YWx1ZXMoaCkuaW5jbHVkZXMoZSl8fE9iamVjdC52YWx1ZXMoZikuaW5jbHVkZXMoZSl8fE9iamVjdC52YWx1ZXMoaS5zaG93Q2xhc3MpLmluY2x1ZGVzKGUpfHxvLmNsYXNzTGlzdC5yZW1vdmUoZSl9KSx0LmN1c3RvbUNsYXNzJiZ0LmN1c3RvbUNsYXNzW25dKXtpZigic3RyaW5nIiE9dHlwZW9mIHQuY3VzdG9tQ2xhc3Nbbl0mJiF0LmN1c3RvbUNsYXNzW25dLmZvckVhY2gpcmV0dXJuIGEoIkludmFsaWQgdHlwZSBvZiBjdXN0b21DbGFzcy4iLmNvbmNhdChuLCchIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCAiJykuY29uY2F0KHR5cGVvZiB0LmN1c3RvbUNsYXNzW25dLCciJykpO0soZSx0LmN1c3RvbUNsYXNzW25dKX19LHo9KGUsdCk9PntpZighdClyZXR1cm4gbnVsbDtzd2l0Y2godCl7Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmNhc2UiZmlsZSI6cmV0dXJuIFooZSxoW3RdKTtjYXNlImNoZWNrYm94IjpyZXR1cm4gZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5jaGVja2JveCwiIGlucHV0IikpO2Nhc2UicmFkaW8iOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChoLnJhZGlvLCIgaW5wdXQ6Y2hlY2tlZCIpKXx8ZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5yYWRpbywiIGlucHV0OmZpcnN0LWNoaWxkIikpO2Nhc2UicmFuZ2UiOnJldHVybiBlLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChoLnJhbmdlLCIgaW5wdXQiKSk7ZGVmYXVsdDpyZXR1cm4gWihlLGguaW5wdXQpfX0sVz1lPT57dmFyIHQ7ZS5mb2N1cygpLCJmaWxlIiE9PWUudHlwZSYmKHQ9ZS52YWx1ZSxlLnZhbHVlPSIiLGUudmFsdWU9dCl9LF89KGUsdCxuKT0+e2UmJnQmJih0PSJzdHJpbmciPT10eXBlb2YgdD90LnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbik6dCkuZm9yRWFjaCh0PT57ZS5mb3JFYWNoP2UuZm9yRWFjaChlPT57bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6bj9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSl9LEs9KGUsdCk9PntfKGUsdCwhMCl9LFk9KGUsdCk9PntfKGUsdCwhMSl9LFo9KHQsbik9Pntmb3IobGV0IGU9MDtlPHQuY2hpbGROb2Rlcy5sZW5ndGg7ZSsrKWlmKEYodC5jaGlsZE5vZGVzW2VdLG4pKXJldHVybiB0LmNoaWxkTm9kZXNbZV19LEo9KGUsdCxuKT0+eyhuPW49PT0iIi5jb25jYXQocGFyc2VJbnQobikpP3BhcnNlSW50KG4pOm4pfHwwPT09cGFyc2VJbnQobik/ZS5zdHlsZVt0XT0ibnVtYmVyIj09dHlwZW9mIG4/IiIuY29uY2F0KG4sInB4Iik6bjplLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSxYPWZ1bmN0aW9uKGUpe2Uuc3R5bGUuZGlzcGxheT0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImZsZXgifSwkPWU9PntlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxHPShlLHQsbixvKT0+e2NvbnN0IGk9ZS5xdWVyeVNlbGVjdG9yKHQpO2kmJihpLnN0eWxlW25dPW8pfSxRPShlLHQsbik9Pnt0P1goZSxuKTokKGUpfSxlZT1lPT4hKCFlfHwhKGUub2Zmc2V0V2lkdGh8fGUub2Zmc2V0SGVpZ2h0fHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSksdGU9KCk9PiFlZShFKCkpJiYhZWUoUygpKSYmIWVlKEwoKSksbmU9ZT0+ISEoZS5zY3JvbGxIZWlnaHQ+ZS5jbGllbnRIZWlnaHQpLG9lPWU9Pntjb25zdCB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpO3ZhciBuPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tZHVyYXRpb24iKXx8IjAiKSxlPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIil8fCIwIik7cmV0dXJuIDA8bnx8MDxlfSxpZT0oKT0+InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQsc2U9J1xuIDxkaXYgYXJpYS1sYWJlbGxlZGJ5PSInLmNvbmNhdChoLnRpdGxlLCciIGFyaWEtZGVzY3JpYmVkYnk9IicpLmNvbmNhdChoWyJodG1sLWNvbnRhaW5lciJdLCciIGNsYXNzPSInKS5jb25jYXQoaC5wb3B1cCwnIiB0YWJpbmRleD0iLTEiPlxuICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInKS5jb25jYXQoaC5jbG9zZSwnIj48L2J1dHRvbj5cbiAgIDx1bCBjbGFzcz0iJykuY29uY2F0KGhbInByb2dyZXNzLXN0ZXBzIl0sJyI+PC91bD5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoLmljb24sJyI+PC9kaXY+XG4gICA8aW1nIGNsYXNzPSInKS5jb25jYXQoaC5pbWFnZSwnIiAvPlxuICAgPGgyIGNsYXNzPSInKS5jb25jYXQoaC50aXRsZSwnIiBpZD0iJykuY29uY2F0KGgudGl0bGUsJyI+PC9oMj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoWyJodG1sLWNvbnRhaW5lciJdLCciIGlkPSInKS5jb25jYXQoaFsiaHRtbC1jb250YWluZXIiXSwnIj48L2Rpdj5cbiAgIDxpbnB1dCBjbGFzcz0iJykuY29uY2F0KGguaW5wdXQsJyIgLz5cbiAgIDxpbnB1dCB0eXBlPSJmaWxlIiBjbGFzcz0iJykuY29uY2F0KGguZmlsZSwnIiAvPlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KGgucmFuZ2UsJyI+XG4gICAgIDxpbnB1dCB0eXBlPSJyYW5nZSIgLz5cbiAgICAgPG91dHB1dD48L291dHB1dD5cbiAgIDwvZGl2PlxuICAgPHNlbGVjdCBjbGFzcz0iJykuY29uY2F0KGguc2VsZWN0LCciPjwvc2VsZWN0PlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KGgucmFkaW8sJyI+PC9kaXY+XG4gICA8bGFiZWwgZm9yPSInKS5jb25jYXQoaC5jaGVja2JveCwnIiBjbGFzcz0iJykuY29uY2F0KGguY2hlY2tib3gsJyI+XG4gICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz5cbiAgICAgPHNwYW4gY2xhc3M9IicpLmNvbmNhdChoLmxhYmVsLCciPjwvc3Bhbj5cbiAgIDwvbGFiZWw+XG4gICA8dGV4dGFyZWEgY2xhc3M9IicpLmNvbmNhdChoLnRleHRhcmVhLCciPjwvdGV4dGFyZWE+XG4gICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaFsidmFsaWRhdGlvbi1tZXNzYWdlIl0sJyIgaWQ9IicpLmNvbmNhdChoWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSwnIj48L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoLmFjdGlvbnMsJyI+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChoLmxvYWRlciwnIj48L2Rpdj5cbiAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInKS5jb25jYXQoaC5jb25maXJtLCciPjwvYnV0dG9uPlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicpLmNvbmNhdChoLmRlbnksJyI+PC9idXR0b24+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJykuY29uY2F0KGguY2FuY2VsLCciPjwvYnV0dG9uPlxuICAgPC9kaXY+XG4gICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaC5mb290ZXIsJyI+PC9kaXY+XG4gICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaFsidGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lciJdLCciPlxuICAgICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoaFsidGltZXItcHJvZ3Jlc3MtYmFyIl0sJyI+PC9kaXY+XG4gICA8L2Rpdj5cbiA8L2Rpdj5cbicpLnJlcGxhY2UoLyhefFxuKVxzKi9nLCIiKSxhZT0oKT0+e29uLmlzVmlzaWJsZSgpJiZvbi5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCl9LHJlPWU9Pnt2YXIgdD0oKCk9Pntjb25zdCBlPWIoKTtyZXR1cm4hIWUmJihlLnJlbW92ZSgpLFkoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxbaFsibm8tYmFja2Ryb3AiXSxoWyJ0b2FzdC1zaG93biJdLGhbImhhcy1jb2x1bW4iXV0pLCEwKX0pKCk7aWYoaWUoKSlyKCJTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplIik7ZWxzZXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NOYW1lPWguY29udGFpbmVyLHQmJksobixoWyJuby10cmFuc2l0aW9uIl0pLFUobixzZSk7Y29uc3Qgbz0ic3RyaW5nIj09dHlwZW9mKHQ9ZS50YXJnZXQpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk6dDtvLmFwcGVuZENoaWxkKG4pLChlPT57Y29uc3QgdD13KCk7dC5zZXRBdHRyaWJ1dGUoInJvbGUiLGUudG9hc3Q/ImFsZXJ0IjoiZGlhbG9nIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtbGl2ZSIsZS50b2FzdD8icG9saXRlIjoiYXNzZXJ0aXZlIiksZS50b2FzdHx8dC5zZXRBdHRyaWJ1dGUoImFyaWEtbW9kYWwiLCJ0cnVlIil9KShlKSxlPW8sInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5kaXJlY3Rpb24mJksoYigpLGgucnRsKSwoKCk9Pntjb25zdCBlPXcoKSx0PVooZSxoLmlucHV0KSxuPVooZSxoLmZpbGUpLG89ZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5yYW5nZSwiIGlucHV0IikpLGk9ZS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoaC5yYW5nZSwiIG91dHB1dCIpKSxzPVooZSxoLnNlbGVjdCksYT1lLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChoLmNoZWNrYm94LCIgaW5wdXQiKSkscj1aKGUsaC50ZXh0YXJlYSk7dC5vbmlucHV0PWFlLG4ub25jaGFuZ2U9YWUscy5vbmNoYW5nZT1hZSxhLm9uY2hhbmdlPWFlLHIub25pbnB1dD1hZSxvLm9uaW5wdXQ9KCk9PnthZSgpLGkudmFsdWU9by52YWx1ZX0sby5vbmNoYW5nZT0oKT0+e2FlKCksby5uZXh0U2libGluZy52YWx1ZT1vLnZhbHVlfX0pKCl9fSxjZT0oZSx0KT0+e2UgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD90LmFwcGVuZENoaWxkKGUpOiJvYmplY3QiPT10eXBlb2YgZT8oKGUsdCk9PntpZihlLmpxdWVyeSlsZSh0LGUpO2Vsc2UgVSh0LGUudG9TdHJpbmcoKSl9KShlLHQpOmUmJlUodCxlKX0sbGU9KHQsbik9PntpZih0LnRleHRDb250ZW50PSIiLDAgaW4gbilmb3IobGV0IGU9MDtlIGluIG47ZSsrKXQuYXBwZW5kQ2hpbGQobltlXS5jbG9uZU5vZGUoITApKTtlbHNlIHQuYXBwZW5kQ2hpbGQobi5jbG9uZU5vZGUoITApKX0sdWU9KCgpPT57aWYoaWUoKSlyZXR1cm4hMTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0PXtXZWJraXRBbmltYXRpb246IndlYmtpdEFuaW1hdGlvbkVuZCIsT0FuaW1hdGlvbjoib0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kIixhbmltYXRpb246ImFuaW1hdGlvbmVuZCJ9O2Zvcihjb25zdCBuIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJnZvaWQgMCE9PWUuc3R5bGVbbl0pcmV0dXJuIHRbbl07cmV0dXJuITF9KSgpLGRlPShlLHQpPT57dmFyIG4sbyxpLHMsYSxyPU8oKSxjPVQoKTsodC5zaG93Q29uZmlybUJ1dHRvbnx8dC5zaG93RGVueUJ1dHRvbnx8dC5zaG93Q2FuY2VsQnV0dG9uP1g6JCkociksUihyLHQsImFjdGlvbnMiKSxuPXIsbz1jLGk9dCxzPUUoKSxhPVMoKSxyPUwoKSxwZShzLCJjb25maXJtIixpKSxwZShhLCJkZW55IixpKSxwZShyLCJjYW5jZWwiLGkpLGZ1bmN0aW9uKGUsdCxuLG8pe2lmKCFvLmJ1dHRvbnNTdHlsaW5nKXJldHVybiBZKFtlLHQsbl0saC5zdHlsZWQpO0soW2UsdCxuXSxoLnN0eWxlZCksby5jb25maXJtQnV0dG9uQ29sb3ImJihlLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmNvbmZpcm1CdXR0b25Db2xvcixLKGUsaFsiZGVmYXVsdC1vdXRsaW5lIl0pKTtvLmRlbnlCdXR0b25Db2xvciYmKHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPW8uZGVueUJ1dHRvbkNvbG9yLEsodCxoWyJkZWZhdWx0LW91dGxpbmUiXSkpO28uY2FuY2VsQnV0dG9uQ29sb3ImJihuLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmNhbmNlbEJ1dHRvbkNvbG9yLEsobixoWyJkZWZhdWx0LW91dGxpbmUiXSkpfShzLGEscixpKSxpLnJldmVyc2VCdXR0b25zJiYoaS50b2FzdD8obi5pbnNlcnRCZWZvcmUocixzKSxuLmluc2VydEJlZm9yZShhLHMpKToobi5pbnNlcnRCZWZvcmUocixvKSxuLmluc2VydEJlZm9yZShhLG8pLG4uaW5zZXJ0QmVmb3JlKHMsbykpKSxVKGMsdC5sb2FkZXJIdG1sKSxSKGMsdCwibG9hZGVyIil9O2Z1bmN0aW9uIHBlKGUsdCxuKXtRKGUsblsic2hvdyIuY29uY2F0KG8odCksIkJ1dHRvbiIpXSwiaW5saW5lLWJsb2NrIiksVShlLG5bIiIuY29uY2F0KHQsIkJ1dHRvblRleHQiKV0pLGUuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixuWyIiLmNvbmNhdCh0LCJCdXR0b25BcmlhTGFiZWwiKV0pLGUuY2xhc3NOYW1lPWhbdF0sUihlLG4sIiIuY29uY2F0KHQsIkJ1dHRvbiIpKSxLKGUsblsiIi5jb25jYXQodCwiQnV0dG9uQ2xhc3MiKV0pfWNvbnN0IG1lPShlLHQpPT57dmFyIG4sbyxpPWIoKTtpJiYobz1pLCJzdHJpbmciPT10eXBlb2Yobj10LmJhY2tkcm9wKT9vLnN0eWxlLmJhY2tncm91bmQ9bjpufHxLKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0saFsibm8tYmFja2Ryb3AiXSksbz1pLChuPXQucG9zaXRpb24paW4gaD9LKG8saFtuXSk6KGEoJ1RoZSAicG9zaXRpb24iIHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImNlbnRlciInKSxLKG8saC5jZW50ZXIpKSxuPWksIShvPXQuZ3Jvdyl8fCJzdHJpbmciIT10eXBlb2Ygb3x8KG89Imdyb3ctIi5jb25jYXQobykpaW4gaCYmSyhuLGhbb10pLFIoaSx0LCJjb250YWluZXIiKSl9O3ZhciBnZT17YXdhaXRpbmdQcm9taXNlOm5ldyBXZWFrTWFwLHByb21pc2U6bmV3IFdlYWtNYXAsaW5uZXJQYXJhbXM6bmV3IFdlYWtNYXAsZG9tQ2FjaGU6bmV3IFdlYWtNYXB9O2NvbnN0IGhlPVsiaW5wdXQiLCJmaWxlIiwicmFuZ2UiLCJzZWxlY3QiLCJyYWRpbyIsImNoZWNrYm94IiwidGV4dGFyZWEiXSxmZT0oZSxvKT0+e2NvbnN0IGk9dygpO2U9Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpO2NvbnN0IHM9IWV8fG8uaW5wdXQhPT1lLmlucHV0O2hlLmZvckVhY2goZT0+e3ZhciB0PWhbZV07Y29uc3Qgbj1aKGksdCk7KChlLHQpPT57Y29uc3Qgbj16KHcoKSxlKTtpZihuKXtiZShuKTtmb3IoY29uc3QgbyBpbiB0KW4uc2V0QXR0cmlidXRlKG8sdFtvXSl9fSkoZSxvLmlucHV0QXR0cmlidXRlcyksbi5jbGFzc05hbWU9dCxzJiYkKG4pfSksby5pbnB1dCYmKHMmJihlPT57aWYoIUNlW2UuaW5wdXRdKXJldHVybiByKCdVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXQhIEV4cGVjdGVkICJ0ZXh0IiwgImVtYWlsIiwgInBhc3N3b3JkIiwgIm51bWJlciIsICJ0ZWwiLCAic2VsZWN0IiwgInJhZGlvIiwgImNoZWNrYm94IiwgInRleHRhcmVhIiwgImZpbGUiIG9yICJ1cmwiLCBnb3QgIicuY29uY2F0KGUuaW5wdXQsJyInKSk7Y29uc3QgdD13ZShlLmlucHV0KSxuPUNlW2UuaW5wdXRdKHQsZSk7WChuKSxzZXRUaW1lb3V0KCgpPT57VyhuKX0pfSkobyksKGU9Pntjb25zdCB0PXdlKGUuaW5wdXQpO2lmKGUuY3VzdG9tQ2xhc3MpSyh0LGUuY3VzdG9tQ2xhc3MuaW5wdXQpfSkobykpfSxiZT10PT57Zm9yKGxldCBlPTA7ZTx0LmF0dHJpYnV0ZXMubGVuZ3RoO2UrKyl7dmFyIG49dC5hdHRyaWJ1dGVzW2VdLm5hbWU7WyJ0eXBlIiwidmFsdWUiLCJzdHlsZSJdLmluY2x1ZGVzKG4pfHx0LnJlbW92ZUF0dHJpYnV0ZShuKX19LHllPShlLHQpPT57ZS5wbGFjZWhvbGRlciYmIXQuaW5wdXRQbGFjZWhvbGRlcnx8KGUucGxhY2Vob2xkZXI9dC5pbnB1dFBsYWNlaG9sZGVyKX0sdmU9KGUsdCxuKT0+e2lmKG4uaW5wdXRMYWJlbCl7ZS5pZD1oLmlucHV0O2NvbnN0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTt2YXIgbz1oWyJpbnB1dC1sYWJlbCJdO2kuc2V0QXR0cmlidXRlKCJmb3IiLGUuaWQpLGkuY2xhc3NOYW1lPW8sSyhpLG4uY3VzdG9tQ2xhc3MuaW5wdXRMYWJlbCksaS5pbm5lclRleHQ9bi5pbnB1dExhYmVsLHQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmViZWdpbiIsaSl9fSx3ZT1lPT57ZT1oW2VdfHxoLmlucHV0O3JldHVybiBaKHcoKSxlKX0sQ2U9e307Q2UudGV4dD1DZS5lbWFpbD1DZS5wYXNzd29yZD1DZS5udW1iZXI9Q2UudGVsPUNlLnVybD0oZSx0KT0+KCJzdHJpbmciPT10eXBlb2YgdC5pbnB1dFZhbHVlfHwibnVtYmVyIj09dHlwZW9mIHQuaW5wdXRWYWx1ZT9lLnZhbHVlPXQuaW5wdXRWYWx1ZTpwKHQuaW5wdXRWYWx1ZSl8fGEoJ1VuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCAic3RyaW5nIiwgIm51bWJlciIgb3IgIlByb21pc2UiLCBnb3QgIicuY29uY2F0KHR5cGVvZiB0LmlucHV0VmFsdWUsJyInKSksdmUoZSxlLHQpLHllKGUsdCksZS50eXBlPXQuaW5wdXQsZSksQ2UuZmlsZT0oZSx0KT0+KHZlKGUsZSx0KSx5ZShlLHQpLGUpLENlLnJhbmdlPShlLHQpPT57Y29uc3Qgbj1lLnF1ZXJ5U2VsZWN0b3IoImlucHV0Iiksbz1lLnF1ZXJ5U2VsZWN0b3IoIm91dHB1dCIpO3JldHVybiBuLnZhbHVlPXQuaW5wdXRWYWx1ZSxuLnR5cGU9dC5pbnB1dCxvLnZhbHVlPXQuaW5wdXRWYWx1ZSx2ZShuLGUsdCksZX0sQ2Uuc2VsZWN0PShlLHQpPT57aWYoZS50ZXh0Q29udGVudD0iIix0LmlucHV0UGxhY2Vob2xkZXIpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7VShuLHQuaW5wdXRQbGFjZWhvbGRlciksbi52YWx1ZT0iIixuLmRpc2FibGVkPSEwLG4uc2VsZWN0ZWQ9ITAsZS5hcHBlbmRDaGlsZChuKX1yZXR1cm4gdmUoZSxlLHQpLGV9LENlLnJhZGlvPWU9PihlLnRleHRDb250ZW50PSIiLGUpLENlLmNoZWNrYm94PShlLHQpPT57Y29uc3Qgbj16KHcoKSwiY2hlY2tib3giKTtuLnZhbHVlPTEsbi5pZD1oLmNoZWNrYm94LG4uY2hlY2tlZD1Cb29sZWFuKHQuaW5wdXRWYWx1ZSk7dmFyIG89ZS5xdWVyeVNlbGVjdG9yKCJzcGFuIik7cmV0dXJuIFUobyx0LmlucHV0UGxhY2Vob2xkZXIpLGV9LENlLnRleHRhcmVhPShuLGUpPT57bi52YWx1ZT1lLmlucHV0VmFsdWUseWUobixlKSx2ZShuLG4sZSk7cmV0dXJuIHNldFRpbWVvdXQoKCk9PntpZigiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe2NvbnN0IHQ9cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodygpKS53aWR0aCk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9Pnt2YXIgZSxlPW4ub2Zmc2V0V2lkdGgrKGU9bixwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5tYXJnaW5MZWZ0KStwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5tYXJnaW5SaWdodCkpO2U+dD93KCkuc3R5bGUud2lkdGg9IiIuY29uY2F0KGUsInB4Iik6dygpLnN0eWxlLndpZHRoPW51bGx9KS5vYnNlcnZlKG4se2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsic3R5bGUiXX0pfX0pLG59O2NvbnN0IGtlPShlLHQpPT57Y29uc3Qgbj1BKCk7UihuLHQsImh0bWxDb250YWluZXIiKSx0Lmh0bWw/KGNlKHQuaHRtbCxuKSxYKG4sImJsb2NrIikpOnQudGV4dD8obi50ZXh0Q29udGVudD10LnRleHQsWChuLCJibG9jayIpKTokKG4pLGZlKGUsdCl9LEFlPShlLHQpPT57dmFyIG49aigpO1Eobix0LmZvb3RlciksdC5mb290ZXImJmNlKHQuZm9vdGVyLG4pLFIobix0LCJmb290ZXIiKX0sUGU9KGUsdCk9Pntjb25zdCBuPU0oKTtVKG4sdC5jbG9zZUJ1dHRvbkh0bWwpLFIobix0LCJjbG9zZUJ1dHRvbiIpLFEobix0LnNob3dDbG9zZUJ1dHRvbiksbi5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQuY2xvc2VCdXR0b25BcmlhTGFiZWwpfSxCZT0oZSx0KT0+e3ZhciBuPWdlLmlubmVyUGFyYW1zLmdldChlKSxlPUMoKTtyZXR1cm4gbiYmdC5pY29uPT09bi5pY29uPyhTZShlLHQpLHZvaWQgeGUoZSx0KSk6dC5pY29ufHx0Lmljb25IdG1sP3QuaWNvbiYmLTE9PT1PYmplY3Qua2V5cyhmKS5pbmRleE9mKHQuaWNvbik/KHIoJ1Vua25vd24gaWNvbiEgRXhwZWN0ZWQgInN1Y2Nlc3MiLCAiZXJyb3IiLCAid2FybmluZyIsICJpbmZvIiBvciAicXVlc3Rpb24iLCBnb3QgIicuY29uY2F0KHQuaWNvbiwnIicpKSwkKGUpKTooWChlKSxTZShlLHQpLHhlKGUsdCksdm9pZCBLKGUsdC5zaG93Q2xhc3MuaWNvbikpOiQoZSl9LHhlPShlLHQpPT57Zm9yKGNvbnN0IG4gaW4gZil0Lmljb24hPT1uJiZZKGUsZltuXSk7SyhlLGZbdC5pY29uXSksVGUoZSx0KSxFZSgpLFIoZSx0LCJpY29uIil9LEVlPSgpPT57Y29uc3QgZT13KCk7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiYmFja2dyb3VuZC1jb2xvciIpO2NvbnN0IG49ZS5xdWVyeVNlbGVjdG9yQWxsKCJbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV0sIC5zd2FsMi1zdWNjZXNzLWZpeCIpO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKW5bZV0uc3R5bGUuYmFja2dyb3VuZENvbG9yPXR9LFNlPShlLHQpPT57dmFyIG47ZS50ZXh0Q29udGVudD0iIix0Lmljb25IdG1sP1UoZSxMZSh0Lmljb25IdG1sKSk6InN1Y2Nlc3MiPT09dC5pY29uP1UoZSwnXG4gICAgICA8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLXRpcCI+PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLWxvbmciPjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtcmluZyI+PC9kaXY+IDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtZml4Ij48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodCI+PC9kaXY+XG4gICAgJyk6ImVycm9yIj09PXQuaWNvbj9VKGUsJ1xuICAgICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyayI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1sZWZ0Ij48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1yaWdodCI+PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICcpOihuPXtxdWVzdGlvbjoiPyIsd2FybmluZzoiISIsaW5mbzoiaSJ9LFUoZSxMZShuW3QuaWNvbl0pKSl9LFRlPShlLHQpPT57aWYodC5pY29uQ29sb3Ipe2Uuc3R5bGUuY29sb3I9dC5pY29uQ29sb3IsZS5zdHlsZS5ib3JkZXJDb2xvcj10Lmljb25Db2xvcjtmb3IoY29uc3QgbiBvZlsiLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiLCIuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmciLCIuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCIsIi5zd2FsMi14LW1hcmstbGluZS1yaWdodCJdKUcoZSxuLCJiYWNrZ3JvdW5kQ29sb3IiLHQuaWNvbkNvbG9yKTtHKGUsIi5zd2FsMi1zdWNjZXNzLXJpbmciLCJib3JkZXJDb2xvciIsdC5pY29uQ29sb3IpfX0sTGU9ZT0+JzxkaXYgY2xhc3M9IicuY29uY2F0KGhbImljb24tY29udGVudCJdLCciPicpLmNvbmNhdChlLCI8L2Rpdj4iKSxPZT0oZSx0KT0+e2NvbnN0IG49UCgpO2lmKCF0LmltYWdlVXJsKXJldHVybiAkKG4pO1gobiwiIiksbi5zZXRBdHRyaWJ1dGUoInNyYyIsdC5pbWFnZVVybCksbi5zZXRBdHRyaWJ1dGUoImFsdCIsdC5pbWFnZUFsdCksSihuLCJ3aWR0aCIsdC5pbWFnZVdpZHRoKSxKKG4sImhlaWdodCIsdC5pbWFnZUhlaWdodCksbi5jbGFzc05hbWU9aC5pbWFnZSxSKG4sdCwiaW1hZ2UiKX0samU9KGUsbyk9Pntjb25zdCBpPUIoKTtpZighby5wcm9ncmVzc1N0ZXBzfHwwPT09by5wcm9ncmVzc1N0ZXBzLmxlbmd0aClyZXR1cm4gJChpKTtYKGkpLGkudGV4dENvbnRlbnQ9IiIsby5jdXJyZW50UHJvZ3Jlc3NTdGVwPj1vLnByb2dyZXNzU3RlcHMubGVuZ3RoJiZhKCJJbnZhbGlkIGN1cnJlbnRQcm9ncmVzc1N0ZXAgcGFyYW1ldGVyLCBpdCBzaG91bGQgYmUgbGVzcyB0aGFuIHByb2dyZXNzU3RlcHMubGVuZ3RoIChjdXJyZW50UHJvZ3Jlc3NTdGVwIGxpa2UgSlMgYXJyYXlzIHN0YXJ0cyBmcm9tIDApIiksby5wcm9ncmVzc1N0ZXBzLmZvckVhY2goKGUsdCk9Pnt2YXIgbixlPShuPWUsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpLEsoZSxoWyJwcm9ncmVzcy1zdGVwIl0pLFUoZSxuKSxlKTtpLmFwcGVuZENoaWxkKGUpLHQ9PT1vLmN1cnJlbnRQcm9ncmVzc1N0ZXAmJksoZSxoWyJhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCJdKSx0IT09by5wcm9ncmVzc1N0ZXBzLmxlbmd0aC0xJiYodD0oZT0+e2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtyZXR1cm4gSyh0LGhbInByb2dyZXNzLXN0ZXAtbGluZSJdKSxlLnByb2dyZXNzU3RlcHNEaXN0YW5jZSYmKHQuc3R5bGUud2lkdGg9ZS5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UpLHR9KShvKSxpLmFwcGVuZENoaWxkKHQpKX0pfSxEZT0oZSx0KT0+e2NvbnN0IG49aygpO1Eobix0LnRpdGxlfHx0LnRpdGxlVGV4dCwiYmxvY2siKSx0LnRpdGxlJiZjZSh0LnRpdGxlLG4pLHQudGl0bGVUZXh0JiYobi5pbm5lclRleHQ9dC50aXRsZVRleHQpLFIobix0LCJ0aXRsZSIpfSxNZT0oZSx0KT0+e3ZhciBuPWIoKTtjb25zdCBvPXcoKTt0LnRvYXN0PyhKKG4sIndpZHRoIix0LndpZHRoKSxvLnN0eWxlLndpZHRoPSIxMDAlIixvLmluc2VydEJlZm9yZShUKCksQygpKSk6SihvLCJ3aWR0aCIsdC53aWR0aCksSihvLCJwYWRkaW5nIix0LnBhZGRpbmcpLHQuYmFja2dyb3VuZCYmKG8uc3R5bGUuYmFja2dyb3VuZD10LmJhY2tncm91bmQpLCQoeCgpKSwoKGUsdCk9PntpZihlLmNsYXNzTmFtZT0iIi5jb25jYXQoaC5wb3B1cCwiICIpLmNvbmNhdChlZShlKT90LnNob3dDbGFzcy5wb3B1cDoiIiksdC50b2FzdCl7SyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLGhbInRvYXN0LXNob3duIl0pO0soZSxoLnRvYXN0KX1lbHNlIEsoZSxoLm1vZGFsKTtpZihSKGUsdCwicG9wdXAiKSx0eXBlb2YgdC5jdXN0b21DbGFzcz09PSJzdHJpbmciKUsoZSx0LmN1c3RvbUNsYXNzKTtpZih0Lmljb24pSyhlLGhbImljb24tIi5jb25jYXQodC5pY29uKV0pfSkobyx0KX0sSWU9KGUsdCk9PntNZShlLHQpLG1lKGUsdCksamUoZSx0KSxCZShlLHQpLE9lKGUsdCksRGUoZSx0KSxQZShlLHQpLGtlKGUsdCksZGUoZSx0KSxBZShlLHQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpZFJlbmRlciYmdC5kaWRSZW5kZXIodygpKX07Y29uc3QgSGU9KCk9PkUoKSYmRSgpLmNsaWNrKCk7Y29uc3QgcWU9ZT0+e2xldCB0PXcoKTt0fHxvbi5maXJlKCksdD13KCk7dmFyIG49VCgpO3EoKT8kKEMoKSk6KChlLHQpPT57Y29uc3Qgbj1PKCksbz1UKCk7aWYoIXQmJmVlKEUoKSkpdD1FKCk7aWYoWChuKSx0KXskKHQpO28uc2V0QXR0cmlidXRlKCJkYXRhLWJ1dHRvbi10by1yZXBsYWNlIix0LmNsYXNzTmFtZSl9by5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvLHQpLEsoW2Usbl0saC5sb2FkaW5nKX0pKHQsZSksWChuKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiwhMCksdC5zZXRBdHRyaWJ1dGUoImFyaWEtYnVzeSIsITApLHQuZm9jdXMoKX0sVmU9MTAwLE5lPXt9LFVlPSgpPT57TmUucHJldmlvdXNBY3RpdmVFbGVtZW50JiZOZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXM/KE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cygpLE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudD1udWxsKTpkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5LmZvY3VzKCl9LEZlPW89Pm5ldyBQcm9taXNlKGU9PntpZighbylyZXR1cm4gZSgpO3ZhciB0PXdpbmRvdy5zY3JvbGxYLG49d2luZG93LnNjcm9sbFk7TmUucmVzdG9yZUZvY3VzVGltZW91dD1zZXRUaW1lb3V0KCgpPT57VWUoKSxlKCl9LFZlKSx3aW5kb3cuc2Nyb2xsVG8odCxuKX0pO2NvbnN0IFJlPSgpPT57aWYoTmUudGltZW91dClyZXR1cm4oKCk9Pntjb25zdCBlPUQoKTt2YXIgdD1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53aWR0aCk7ZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpLGUuc3R5bGUud2lkdGg9IjEwMCUiO3ZhciBuPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLndpZHRoKSxuPXBhcnNlSW50KHQvbioxMDApO2Uuc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKSxlLnN0eWxlLndpZHRoPSIiLmNvbmNhdChuLCIlIil9KSgpLE5lLnRpbWVvdXQuc3RvcCgpfSx6ZT0oKT0+e2lmKE5lLnRpbWVvdXQpe3ZhciBlPU5lLnRpbWVvdXQuc3RhcnQoKTtyZXR1cm4gVihlKSxlfX07bGV0IFdlPSExO2NvbnN0IF9lPXt9O2NvbnN0IEtlPXQ9Pntmb3IobGV0IGU9dC50YXJnZXQ7ZSYmZSE9PWRvY3VtZW50O2U9ZS5wYXJlbnROb2RlKWZvcihjb25zdCBvIGluIF9lKXt2YXIgbj1lLmdldEF0dHJpYnV0ZShvKTtpZihuKXJldHVybiB2b2lkIF9lW29dLmZpcmUoe3RlbXBsYXRlOm59KX19LFllPXt0aXRsZToiIix0aXRsZVRleHQ6IiIsdGV4dDoiIixodG1sOiIiLGZvb3RlcjoiIixpY29uOnZvaWQgMCxpY29uQ29sb3I6dm9pZCAwLGljb25IdG1sOnZvaWQgMCx0ZW1wbGF0ZTp2b2lkIDAsdG9hc3Q6ITEsc2hvd0NsYXNzOntwb3B1cDoic3dhbDItc2hvdyIsYmFja2Ryb3A6InN3YWwyLWJhY2tkcm9wLXNob3ciLGljb246InN3YWwyLWljb24tc2hvdyJ9LGhpZGVDbGFzczp7cG9wdXA6InN3YWwyLWhpZGUiLGJhY2tkcm9wOiJzd2FsMi1iYWNrZHJvcC1oaWRlIixpY29uOiJzd2FsMi1pY29uLWhpZGUifSxjdXN0b21DbGFzczp7fSx0YXJnZXQ6ImJvZHkiLGJhY2tkcm9wOiEwLGhlaWdodEF1dG86ITAsYWxsb3dPdXRzaWRlQ2xpY2s6ITAsYWxsb3dFc2NhcGVLZXk6ITAsYWxsb3dFbnRlcktleTohMCxzdG9wS2V5ZG93blByb3BhZ2F0aW9uOiEwLGtleWRvd25MaXN0ZW5lckNhcHR1cmU6ITEsc2hvd0NvbmZpcm1CdXR0b246ITAsc2hvd0RlbnlCdXR0b246ITEsc2hvd0NhbmNlbEJ1dHRvbjohMSxwcmVDb25maXJtOnZvaWQgMCxwcmVEZW55OnZvaWQgMCxjb25maXJtQnV0dG9uVGV4dDoiT0siLGNvbmZpcm1CdXR0b25BcmlhTGFiZWw6IiIsY29uZmlybUJ1dHRvbkNvbG9yOnZvaWQgMCxkZW55QnV0dG9uVGV4dDoiTm8iLGRlbnlCdXR0b25BcmlhTGFiZWw6IiIsZGVueUJ1dHRvbkNvbG9yOnZvaWQgMCxjYW5jZWxCdXR0b25UZXh0OiJDYW5jZWwiLGNhbmNlbEJ1dHRvbkFyaWFMYWJlbDoiIixjYW5jZWxCdXR0b25Db2xvcjp2b2lkIDAsYnV0dG9uc1N0eWxpbmc6ITAscmV2ZXJzZUJ1dHRvbnM6ITEsZm9jdXNDb25maXJtOiEwLGZvY3VzRGVueTohMSxmb2N1c0NhbmNlbDohMSxyZXR1cm5Gb2N1czohMCxzaG93Q2xvc2VCdXR0b246ITEsY2xvc2VCdXR0b25IdG1sOiImdGltZXM7IixjbG9zZUJ1dHRvbkFyaWFMYWJlbDoiQ2xvc2UgdGhpcyBkaWFsb2ciLGxvYWRlckh0bWw6IiIsc2hvd0xvYWRlck9uQ29uZmlybTohMSxzaG93TG9hZGVyT25EZW55OiExLGltYWdlVXJsOnZvaWQgMCxpbWFnZVdpZHRoOnZvaWQgMCxpbWFnZUhlaWdodDp2b2lkIDAsaW1hZ2VBbHQ6IiIsdGltZXI6dm9pZCAwLHRpbWVyUHJvZ3Jlc3NCYXI6ITEsd2lkdGg6dm9pZCAwLHBhZGRpbmc6dm9pZCAwLGJhY2tncm91bmQ6dm9pZCAwLGlucHV0OnZvaWQgMCxpbnB1dFBsYWNlaG9sZGVyOiIiLGlucHV0TGFiZWw6IiIsaW5wdXRWYWx1ZToiIixpbnB1dE9wdGlvbnM6e30saW5wdXRBdXRvVHJpbTohMCxpbnB1dEF0dHJpYnV0ZXM6e30saW5wdXRWYWxpZGF0b3I6dm9pZCAwLHJldHVybklucHV0VmFsdWVPbkRlbnk6ITEsdmFsaWRhdGlvbk1lc3NhZ2U6dm9pZCAwLGdyb3c6ITEscG9zaXRpb246ImNlbnRlciIscHJvZ3Jlc3NTdGVwczpbXSxjdXJyZW50UHJvZ3Jlc3NTdGVwOnZvaWQgMCxwcm9ncmVzc1N0ZXBzRGlzdGFuY2U6dm9pZCAwLHdpbGxPcGVuOnZvaWQgMCxkaWRPcGVuOnZvaWQgMCxkaWRSZW5kZXI6dm9pZCAwLHdpbGxDbG9zZTp2b2lkIDAsZGlkQ2xvc2U6dm9pZCAwLGRpZERlc3Ryb3k6dm9pZCAwLHNjcm9sbGJhclBhZGRpbmc6ITB9LFplPVsiYWxsb3dFc2NhcGVLZXkiLCJhbGxvd091dHNpZGVDbGljayIsImJhY2tncm91bmQiLCJidXR0b25zU3R5bGluZyIsImNhbmNlbEJ1dHRvbkFyaWFMYWJlbCIsImNhbmNlbEJ1dHRvbkNvbG9yIiwiY2FuY2VsQnV0dG9uVGV4dCIsImNsb3NlQnV0dG9uQXJpYUxhYmVsIiwiY2xvc2VCdXR0b25IdG1sIiwiY29uZmlybUJ1dHRvbkFyaWFMYWJlbCIsImNvbmZpcm1CdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwiY3VycmVudFByb2dyZXNzU3RlcCIsImN1c3RvbUNsYXNzIiwiZGVueUJ1dHRvbkFyaWFMYWJlbCIsImRlbnlCdXR0b25Db2xvciIsImRlbnlCdXR0b25UZXh0IiwiZGlkQ2xvc2UiLCJkaWREZXN0cm95IiwiZm9vdGVyIiwiaGlkZUNsYXNzIiwiaHRtbCIsImljb24iLCJpY29uQ29sb3IiLCJpY29uSHRtbCIsImltYWdlQWx0IiwiaW1hZ2VIZWlnaHQiLCJpbWFnZVVybCIsImltYWdlV2lkdGgiLCJwcmVDb25maXJtIiwicHJlRGVueSIsInByb2dyZXNzU3RlcHMiLCJyZXR1cm5Gb2N1cyIsInJldmVyc2VCdXR0b25zIiwic2hvd0NhbmNlbEJ1dHRvbiIsInNob3dDbG9zZUJ1dHRvbiIsInNob3dDb25maXJtQnV0dG9uIiwic2hvd0RlbnlCdXR0b24iLCJ0ZXh0IiwidGl0bGUiLCJ0aXRsZVRleHQiLCJ3aWxsQ2xvc2UiXSxKZT17fSxYZT1bImFsbG93T3V0c2lkZUNsaWNrIiwiYWxsb3dFbnRlcktleSIsImJhY2tkcm9wIiwiZm9jdXNDb25maXJtIiwiZm9jdXNEZW55IiwiZm9jdXNDYW5jZWwiLCJyZXR1cm5Gb2N1cyIsImhlaWdodEF1dG8iLCJrZXlkb3duTGlzdGVuZXJDYXB0dXJlIl0sJGU9ZT0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFllLGUpO2NvbnN0IEdlPWU9PkplW2VdLFFlPWU9PnskZShlKXx8YSgnVW5rbm93biBwYXJhbWV0ZXIgIicuY29uY2F0KGUsJyInKSl9LGV0PWU9PntYZS5pbmNsdWRlcyhlKSYmYSgnVGhlIHBhcmFtZXRlciAiJy5jb25jYXQoZSwnIiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHMnKSl9LHR0PWU9PntHZShlKSYmaShlLEdlKGUpKX07dmFyIG50PU9iamVjdC5mcmVlemUoe2lzVmFsaWRQYXJhbWV0ZXI6JGUsaXNVcGRhdGFibGVQYXJhbWV0ZXI6ZT0+LTEhPT1aZS5pbmRleE9mKGUpLGlzRGVwcmVjYXRlZFBhcmFtZXRlcjpHZSxhcmdzVG9QYXJhbXM6bj0+e2NvbnN0IG89e307cmV0dXJuIm9iamVjdCIhPXR5cGVvZiBuWzBdfHxnKG5bMF0pP1sidGl0bGUiLCJodG1sIiwiaWNvbiJdLmZvckVhY2goKGUsdCk9Pnt0PW5bdF07InN0cmluZyI9PXR5cGVvZiB0fHxnKHQpP29bZV09dDp2b2lkIDAhPT10JiZyKCJVbmV4cGVjdGVkIHR5cGUgb2YgIi5jb25jYXQoZSwnISBFeHBlY3RlZCAic3RyaW5nIiBvciAiRWxlbWVudCIsIGdvdCAnKS5jb25jYXQodHlwZW9mIHQpKX0pOk9iamVjdC5hc3NpZ24obyxuWzBdKSxvfSxpc1Zpc2libGU6KCk9PmVlKHcoKSksY2xpY2tDb25maXJtOkhlLGNsaWNrRGVueTooKT0+UygpJiZTKCkuY2xpY2soKSxjbGlja0NhbmNlbDooKT0+TCgpJiZMKCkuY2xpY2soKSxnZXRDb250YWluZXI6YixnZXRQb3B1cDp3LGdldFRpdGxlOmssZ2V0SHRtbENvbnRhaW5lcjpBLGdldEltYWdlOlAsZ2V0SWNvbjpDLGdldElucHV0TGFiZWw6KCk9PnYoaFsiaW5wdXQtbGFiZWwiXSksZ2V0Q2xvc2VCdXR0b246TSxnZXRBY3Rpb25zOk8sZ2V0Q29uZmlybUJ1dHRvbjpFLGdldERlbnlCdXR0b246UyxnZXRDYW5jZWxCdXR0b246TCxnZXRMb2FkZXI6VCxnZXRGb290ZXI6aixnZXRUaW1lclByb2dyZXNzQmFyOkQsZ2V0Rm9jdXNhYmxlRWxlbWVudHM6SSxnZXRWYWxpZGF0aW9uTWVzc2FnZTp4LGlzTG9hZGluZzooKT0+dygpLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiksZmlyZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBuZXcgdGhpcyguLi50KX0sbWl4aW46ZnVuY3Rpb24obil7Y2xhc3MgZSBleHRlbmRzIHRoaXN7X21haW4oZSx0KXtyZXR1cm4gc3VwZXIuX21haW4oZSxPYmplY3QuYXNzaWduKHt9LG4sdCkpfX1yZXR1cm4gZX0sc2hvd0xvYWRpbmc6cWUsZW5hYmxlTG9hZGluZzpxZSxnZXRUaW1lckxlZnQ6KCk9Pk5lLnRpbWVvdXQmJk5lLnRpbWVvdXQuZ2V0VGltZXJMZWZ0KCksc3RvcFRpbWVyOlJlLHJlc3VtZVRpbWVyOnplLHRvZ2dsZVRpbWVyOigpPT57dmFyIGU9TmUudGltZW91dDtyZXR1cm4gZSYmKGUucnVubmluZz9SZTp6ZSkoKX0saW5jcmVhc2VUaW1lcjplPT57aWYoTmUudGltZW91dCl7ZT1OZS50aW1lb3V0LmluY3JlYXNlKGUpO3JldHVybiBWKGUsITApLGV9fSxpc1RpbWVyUnVubmluZzooKT0+TmUudGltZW91dCYmTmUudGltZW91dC5pc1J1bm5pbmcoKSxiaW5kQ2xpY2tIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGU9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJkYXRhLXN3YWwtdGVtcGxhdGUiO19lW2VdPXRoaXMsV2V8fChkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixLZSksV2U9ITApfX0pO2Z1bmN0aW9uIG90KCl7dmFyIGU9Z2UuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO2lmKGUpe2NvbnN0IHQ9Z2UuZG9tQ2FjaGUuZ2V0KHRoaXMpOyQodC5sb2FkZXIpLHEoKT9lLmljb24mJlgoQygpKTooZT0+e2NvbnN0IHQ9ZS5wb3B1cC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUubG9hZGVyLmdldEF0dHJpYnV0ZSgiZGF0YS1idXR0b24tdG8tcmVwbGFjZSIpKTtpZih0Lmxlbmd0aClYKHRbMF0sImlubGluZS1ibG9jayIpO2Vsc2UgaWYodGUoKSkkKGUuYWN0aW9ucyl9KSh0KSxZKFt0LnBvcHVwLHQuYWN0aW9uc10saC5sb2FkaW5nKSx0LnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1idXN5IiksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbG9hZGluZyIpLHQuY29uZmlybUJ1dHRvbi5kaXNhYmxlZD0hMSx0LmRlbnlCdXR0b24uZGlzYWJsZWQ9ITEsdC5jYW5jZWxCdXR0b24uZGlzYWJsZWQ9ITF9fWNvbnN0IGl0PSgpPT57bnVsbD09PU4ucHJldmlvdXNCb2R5UGFkZGluZyYmZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0JiYoTi5wcmV2aW91c0JvZHlQYWRkaW5nPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKSksZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIuY29uY2F0KE4ucHJldmlvdXNCb2R5UGFkZGluZysoKCk9Pntjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPWhbInNjcm9sbGJhci1tZWFzdXJlIl0sZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLWUuY2xpZW50V2lkdGg7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksdH0pKCksInB4IikpfSxzdD0oKT0+e251bGwhPT1OLnByZXZpb3VzQm9keVBhZGRpbmcmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD0iIi5jb25jYXQoTi5wcmV2aW91c0JvZHlQYWRkaW5nLCJweCIpLE4ucHJldmlvdXNCb2R5UGFkZGluZz1udWxsKX0sYXQ9KCk9Pnt2YXIgZTsoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW18fCJNYWNJbnRlbCI9PT1uYXZpZ2F0b3IucGxhdGZvcm0mJjE8bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzKSYmIUYoZG9jdW1lbnQuYm9keSxoLmlvc2ZpeCkmJihlPWRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPSIiLmNvbmNhdCgtMSplLCJweCIpLEsoZG9jdW1lbnQuYm9keSxoLmlvc2ZpeCksKCgpPT57Y29uc3QgZT1iKCk7bGV0IHQ7ZS5vbnRvdWNoc3RhcnQ9ZT0+e3Q9cnQoZSl9LGUub250b3VjaG1vdmU9ZT0+e2lmKHQpe2UucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpfX19KSgpLCgoKT0+e2NvbnN0IGU9IW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhDcmlPU3xGeGlPU3xFZGdpT1N8WWFCcm93c2VyfFVDQnJvd3NlcikvaSk7aWYoZSl7Y29uc3QgdD00NDtpZih3KCkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodC10KWIoKS5zdHlsZS5wYWRkaW5nQm90dG9tPSIiLmNvbmNhdCh0LCJweCIpfX0pKCkpfSxydD1lPT57dmFyIHQsbj1lLnRhcmdldCxvPWIoKTtyZXR1cm4hKCh0PWUpLnRvdWNoZXMmJnQudG91Y2hlcy5sZW5ndGgmJiJzdHlsdXMiPT09dC50b3VjaGVzWzBdLnRvdWNoVHlwZXx8KGU9ZSkudG91Y2hlcyYmMTxlLnRvdWNoZXMubGVuZ3RoKSYmKG49PT1vfHwhKG5lKG8pfHwiSU5QVVQiPT09bi50YWdOYW1lfHwiVEVYVEFSRUEiPT09bi50YWdOYW1lfHxuZShBKCkpJiZBKCkuY29udGFpbnMobikpKX0sY3Q9KCk9Pnt2YXIgZTtGKGRvY3VtZW50LmJvZHksaC5pb3NmaXgpJiYoZT1wYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCwxMCksWShkb2N1bWVudC5ib2R5LGguaW9zZml4KSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD0tMSplKX0sbHQ9KCk9Pntjb25zdCBlPXMoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7ZS5mb3JFYWNoKGU9PntlLmhhc0F0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpPyhlLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLGUuZ2V0QXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpLGUucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpOmUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSl9O3ZhciB1dD17c3dhbFByb21pc2VSZXNvbHZlOm5ldyBXZWFrTWFwLHN3YWxQcm9taXNlUmVqZWN0Om5ldyBXZWFrTWFwfTtmdW5jdGlvbiBkdChlLHQsbixvKXtxKCk/aHQoZSxvKTooRmUobikudGhlbigoKT0+aHQoZSxvKSksTmUua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixOZS5rZXlkb3duSGFuZGxlcix7Y2FwdHVyZTpOZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksTmUua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KT8odC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTpub25lICFpbXBvcnRhbnQiKSx0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSx0LmlubmVySFRNTD0iIik6dC5yZW1vdmUoKSxIKCkmJihzdCgpLGN0KCksbHQoKSksWShbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFtoLnNob3duLGhbImhlaWdodC1hdXRvIl0saFsibm8tYmFja2Ryb3AiXSxoWyJ0b2FzdC1zaG93biJdXSl9ZnVuY3Rpb24gcHQoZSl7ZT12b2lkIDAhPT0obj1lKT9PYmplY3QuYXNzaWduKHtpc0NvbmZpcm1lZDohMSxpc0RlbmllZDohMSxpc0Rpc21pc3NlZDohMX0sbik6e2lzQ29uZmlybWVkOiExLGlzRGVuaWVkOiExLGlzRGlzbWlzc2VkOiEwfTtjb25zdCB0PXV0LnN3YWxQcm9taXNlUmVzb2x2ZS5nZXQodGhpcyk7dmFyIG49KGU9Pntjb25zdCB0PXcoKTtpZighdClyZXR1cm4gZmFsc2U7Y29uc3Qgbj1nZS5pbm5lclBhcmFtcy5nZXQoZSk7aWYoIW58fEYodCxuLmhpZGVDbGFzcy5wb3B1cCkpcmV0dXJuIGZhbHNlO1kodCxuLnNob3dDbGFzcy5wb3B1cCksSyh0LG4uaGlkZUNsYXNzLnBvcHVwKTtjb25zdCBvPWIoKTtyZXR1cm4gWShvLG4uc2hvd0NsYXNzLmJhY2tkcm9wKSxLKG8sbi5oaWRlQ2xhc3MuYmFja2Ryb3ApLGd0KGUsdCxuKSx0cnVlfSkodGhpcyk7dGhpcy5pc0F3YWl0aW5nUHJvbWlzZSgpP2UuaXNEaXNtaXNzZWR8fChtdCh0aGlzKSx0KGUpKTpuJiZ0KGUpfWNvbnN0IG10PWU9PntlLmlzQXdhaXRpbmdQcm9taXNlKCkmJihnZS5hd2FpdGluZ1Byb21pc2UuZGVsZXRlKGUpLGdlLmlubmVyUGFyYW1zLmdldChlKXx8ZS5fZGVzdHJveSgpKX0sZ3Q9KGUsdCxuKT0+e3ZhciBvLGkscyxhPWIoKSxyPXVlJiZvZSh0KTsiZnVuY3Rpb24iPT10eXBlb2Ygbi53aWxsQ2xvc2UmJm4ud2lsbENsb3NlKHQpLHI/KG89ZSxpPXQscz1hLHI9bi5yZXR1cm5Gb2N1cyx0PW4uZGlkQ2xvc2UsTmUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrPWR0LmJpbmQobnVsbCxvLHMscix0KSxpLmFkZEV2ZW50TGlzdGVuZXIodWUsZnVuY3Rpb24oZSl7ZS50YXJnZXQ9PT1pJiYoTmUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIE5lLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayl9KSk6ZHQoZSxhLG4ucmV0dXJuRm9jdXMsbi5kaWRDbG9zZSl9LGh0PShlLHQpPT57c2V0VGltZW91dCgoKT0+eyJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmJpbmQoZS5wYXJhbXMpKCksZS5fZGVzdHJveSgpfSl9O2Z1bmN0aW9uIGZ0KGUsdCxuKXtjb25zdCBvPWdlLmRvbUNhY2hlLmdldChlKTt0LmZvckVhY2goZT0+e29bZV0uZGlzYWJsZWQ9bn0pfWZ1bmN0aW9uIGJ0KGUsdCl7aWYoIWUpcmV0dXJuITE7aWYoInJhZGlvIj09PWUudHlwZSl7Y29uc3Qgbj1lLnBhcmVudE5vZGUucGFyZW50Tm9kZSxvPW4ucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQiKTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKylvW2VdLmRpc2FibGVkPXR9ZWxzZSBlLmRpc2FibGVkPXR9Y2xhc3MgeXR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNhbGxiYWNrPWUsdGhpcy5yZW1haW5pbmc9dCx0aGlzLnJ1bm5pbmc9ITEsdGhpcy5zdGFydCgpfXN0YXJ0KCl7cmV0dXJuIHRoaXMucnVubmluZ3x8KHRoaXMucnVubmluZz0hMCx0aGlzLnN0YXJ0ZWQ9bmV3IERhdGUsdGhpcy5pZD1zZXRUaW1lb3V0KHRoaXMuY2FsbGJhY2ssdGhpcy5yZW1haW5pbmcpKSx0aGlzLnJlbWFpbmluZ31zdG9wKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMucnVubmluZz0hMSxjbGVhclRpbWVvdXQodGhpcy5pZCksdGhpcy5yZW1haW5pbmctPW5ldyBEYXRlLXRoaXMuc3RhcnRlZCksdGhpcy5yZW1haW5pbmd9aW5jcmVhc2UoZSl7dmFyIHQ9dGhpcy5ydW5uaW5nO3JldHVybiB0JiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9ZSx0JiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9Z2V0VGltZXJMZWZ0KCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMuc3RvcCgpLHRoaXMuc3RhcnQoKSksdGhpcy5yZW1haW5pbmd9aXNSdW5uaW5nKCl7cmV0dXJuIHRoaXMucnVubmluZ319dmFyIHZ0PXtlbWFpbDooZSx0KT0+L15bYS16QS1aMC05LitfLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aMC05LV17MiwyNH0kLy50ZXN0KGUpP1Byb21pc2UucmVzb2x2ZSgpOlByb21pc2UucmVzb2x2ZSh0fHwiSW52YWxpZCBlbWFpbCBhZGRyZXNzIiksdXJsOihlLHQpPT4vXmh0dHBzPzpcL1wvKHd3d1wuKT9bLWEtekEtWjAtOUA6JS5fK34jPV17MSwyNTZ9XC5bYS16XXsyLDYzfVxiKFstYS16QS1aMC05QDolXysufiM/Ji89XSopJC8udGVzdChlKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUodHx8IkludmFsaWQgVVJMIil9O2Z1bmN0aW9uIHd0KGUpe3ZhciB0LG47KHQ9ZSkuaW5wdXRWYWxpZGF0b3J8fE9iamVjdC5rZXlzKHZ0KS5mb3JFYWNoKGU9Pnt0LmlucHV0PT09ZSYmKHQuaW5wdXRWYWxpZGF0b3I9dnRbZV0pfSksZS5zaG93TG9hZGVyT25Db25maXJtJiYhZS5wcmVDb25maXJtJiZhKCJzaG93TG9hZGVyT25Db25maXJtIGlzIHNldCB0byB0cnVlLCBidXQgcHJlQ29uZmlybSBpcyBub3QgZGVmaW5lZC5cbnNob3dMb2FkZXJPbkNvbmZpcm0gc2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBwcmVDb25maXJtLCBzZWUgdXNhZ2UgZXhhbXBsZTpcbmh0dHBzOi8vc3dlZXRhbGVydDIuZ2l0aHViLmlvLyNhamF4LXJlcXVlc3QiKSwobj1lKS50YXJnZXQmJigic3RyaW5nIiE9dHlwZW9mIG4udGFyZ2V0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4udGFyZ2V0KSkmJigic3RyaW5nIj09dHlwZW9mIG4udGFyZ2V0fHxuLnRhcmdldC5hcHBlbmRDaGlsZCl8fChhKCdUYXJnZXQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiYm9keSInKSxuLnRhcmdldD0iYm9keSIpLCJzdHJpbmciPT10eXBlb2YgZS50aXRsZSYmKGUudGl0bGU9ZS50aXRsZS5zcGxpdCgiXG4iKS5qb2luKCI8YnIgLz4iKSkscmUoZSl9Y29uc3QgQ3Q9WyJzd2FsLXRpdGxlIiwic3dhbC1odG1sIiwic3dhbC1mb290ZXIiXSxrdD1lPT57ZT0ic3RyaW5nIj09dHlwZW9mIGUudGVtcGxhdGU/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnRlbXBsYXRlKTplLnRlbXBsYXRlO2lmKCFlKXJldHVybnt9O2U9ZS5jb250ZW50O3JldHVybihlPT57Y29uc3Qgbj1DdC5jb25jYXQoWyJzd2FsLXBhcmFtIiwic3dhbC1idXR0b24iLCJzd2FsLWltYWdlIiwic3dhbC1pY29uIiwic3dhbC1pbnB1dCIsInN3YWwtaW5wdXQtb3B0aW9uIl0pO3MoZS5jaGlsZHJlbikuZm9yRWFjaChlPT57Y29uc3QgdD1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtpZihuLmluZGV4T2YodCk9PT0tMSlhKCJVbnJlY29nbml6ZWQgZWxlbWVudCA8Ii5jb25jYXQodCwiPiIpKX0pfSkoZSksT2JqZWN0LmFzc2lnbigoZT0+e2NvbnN0IG89e307cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJzd2FsLXBhcmFtIikpLmZvckVhY2goZT0+e0F0KGUsWyJuYW1lIiwidmFsdWUiXSk7Y29uc3QgdD1lLmdldEF0dHJpYnV0ZSgibmFtZSIpO2xldCBuPWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpO2lmKHR5cGVvZiBZZVt0XT09PSJib29sZWFuIiYmbj09PSJmYWxzZSIpbj1mYWxzZTtpZih0eXBlb2YgWWVbdF09PT0ib2JqZWN0IiluPUpTT04ucGFyc2Uobik7b1t0XT1ufSksb30pKGUpLChlPT57Y29uc3Qgbj17fTtyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtYnV0dG9uIikpLmZvckVhY2goZT0+e0F0KGUsWyJ0eXBlIiwiY29sb3IiLCJhcmlhLWxhYmVsIl0pO2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKTtuWyIiLmNvbmNhdCh0LCJCdXR0b25UZXh0IildPWUuaW5uZXJIVE1MO25bInNob3ciLmNvbmNhdChvKHQpLCJCdXR0b24iKV09dHJ1ZTtpZihlLmhhc0F0dHJpYnV0ZSgiY29sb3IiKSluWyIiLmNvbmNhdCh0LCJCdXR0b25Db2xvciIpXT1lLmdldEF0dHJpYnV0ZSgiY29sb3IiKTtpZihlLmhhc0F0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpKW5bIiIuY29uY2F0KHQsIkJ1dHRvbkFyaWFMYWJlbCIpXT1lLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfSksbn0pKGUpLChlPT57Y29uc3QgdD17fSxuPWUucXVlcnlTZWxlY3Rvcigic3dhbC1pbWFnZSIpO2lmKG4pe0F0KG4sWyJzcmMiLCJ3aWR0aCIsImhlaWdodCIsImFsdCJdKTtpZihuLmhhc0F0dHJpYnV0ZSgic3JjIikpdC5pbWFnZVVybD1uLmdldEF0dHJpYnV0ZSgic3JjIik7aWYobi5oYXNBdHRyaWJ1dGUoIndpZHRoIikpdC5pbWFnZVdpZHRoPW4uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpO2lmKG4uaGFzQXR0cmlidXRlKCJoZWlnaHQiKSl0LmltYWdlSGVpZ2h0PW4uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTtpZihuLmhhc0F0dHJpYnV0ZSgiYWx0IikpdC5pbWFnZUFsdD1uLmdldEF0dHJpYnV0ZSgiYWx0Iil9cmV0dXJuIHR9KShlKSwoZT0+e2NvbnN0IHQ9e30sbj1lLnF1ZXJ5U2VsZWN0b3IoInN3YWwtaWNvbiIpO2lmKG4pe0F0KG4sWyJ0eXBlIiwiY29sb3IiXSk7aWYobi5oYXNBdHRyaWJ1dGUoInR5cGUiKSl0Lmljb249bi5nZXRBdHRyaWJ1dGUoInR5cGUiKTtpZihuLmhhc0F0dHJpYnV0ZSgiY29sb3IiKSl0Lmljb25Db2xvcj1uLmdldEF0dHJpYnV0ZSgiY29sb3IiKTt0Lmljb25IdG1sPW4uaW5uZXJIVE1MfXJldHVybiB0fSkoZSksKGU9Pntjb25zdCBvPXt9LHQ9ZS5xdWVyeVNlbGVjdG9yKCJzd2FsLWlucHV0Iik7aWYodCl7QXQodCxbInR5cGUiLCJsYWJlbCIsInBsYWNlaG9sZGVyIiwidmFsdWUiXSk7by5pbnB1dD10LmdldEF0dHJpYnV0ZSgidHlwZSIpfHwidGV4dCI7aWYodC5oYXNBdHRyaWJ1dGUoImxhYmVsIikpby5pbnB1dExhYmVsPXQuZ2V0QXR0cmlidXRlKCJsYWJlbCIpO2lmKHQuaGFzQXR0cmlidXRlKCJwbGFjZWhvbGRlciIpKW8uaW5wdXRQbGFjZWhvbGRlcj10LmdldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiKTtpZih0Lmhhc0F0dHJpYnV0ZSgidmFsdWUiKSlvLmlucHV0VmFsdWU9dC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9Y29uc3Qgbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtaW5wdXQtb3B0aW9uIik7aWYobi5sZW5ndGgpe28uaW5wdXRPcHRpb25zPXt9O3MobikuZm9yRWFjaChlPT57QXQoZSxbInZhbHVlIl0pO2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Y29uc3Qgbj1lLmlubmVySFRNTDtvLmlucHV0T3B0aW9uc1t0XT1ufSl9cmV0dXJuIG99KShlKSwoKGUsdCk9Pntjb25zdCBuPXt9O2Zvcihjb25zdCBvIGluIHQpe2NvbnN0IGk9dFtvXTtjb25zdCBzPWUucXVlcnlTZWxlY3RvcihpKTtpZihzKXtBdChzLFtdKTtuW2kucmVwbGFjZSgvXnN3YWwtLywiIildPXMuaW5uZXJIVE1MLnRyaW0oKX19cmV0dXJuIG59KShlLEN0KSl9LEF0PSh0LG4pPT57cyh0LmF0dHJpYnV0ZXMpLmZvckVhY2goZT0+ey0xPT09bi5pbmRleE9mKGUubmFtZSkmJmEoWydVbnJlY29nbml6ZWQgYXR0cmlidXRlICInLmNvbmNhdChlLm5hbWUsJyIgb24gPCcpLmNvbmNhdCh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSwiPi4iKSwiIi5jb25jYXQobi5sZW5ndGg/IkFsbG93ZWQgYXR0cmlidXRlcyBhcmU6ICIuY29uY2F0KG4uam9pbigiLCAiKSk6IlRvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4iKV0pfSl9LFB0PTEwLEJ0PWU9Pntjb25zdCB0PWIoKSxuPXcoKTsiZnVuY3Rpb24iPT10eXBlb2YgZS53aWxsT3BlbiYmZS53aWxsT3BlbihuKTt2YXIgbz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5vdmVyZmxvd1k7KChlLHQsbik9PntpZihLKGUsbi5zaG93Q2xhc3MuYmFja2Ryb3ApLHQuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLCIwIiwiaW1wb3J0YW50IiksWCh0LCJncmlkIiksc2V0VGltZW91dCgoKT0+e0sodCxuLnNob3dDbGFzcy5wb3B1cCk7dC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgib3BhY2l0eSIpfSxQdCksSyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLGguc2hvd24pLG4uaGVpZ2h0QXV0byYmbi5iYWNrZHJvcCYmIW4udG9hc3QpSyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLGhbImhlaWdodC1hdXRvIl0pfSkodCxuLGUpLHNldFRpbWVvdXQoKCk9PnsoKGUsdCk9PntpZih1ZSYmb2UodCkpe2Uuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iO3QuYWRkRXZlbnRMaXN0ZW5lcih1ZSx4dCl9ZWxzZSBlLnN0eWxlLm92ZXJmbG93WT0iYXV0byJ9KSh0LG4pfSxQdCksSCgpJiYoKChlLHQsbik9PntpZihhdCgpLHQmJm4hPT0iaGlkZGVuIilpdCgpO3NldFRpbWVvdXQoKCk9PntlLnNjcm9sbFRvcD0wfSl9KSh0LGUuc2Nyb2xsYmFyUGFkZGluZyxvKSwoKCk9Pntjb25zdCBlPXMoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7ZS5mb3JFYWNoKGU9PntlPT09YigpfHxlLmNvbnRhaW5zKGIoKSl8fChlLmhhc0F0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSYmZS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4iLGUuZ2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpKSxlLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIikpfSl9KSgpKSxxKCl8fE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudHx8KE5lLnByZXZpb3VzQWN0aXZlRWxlbWVudD1kb2N1bWVudC5hY3RpdmVFbGVtZW50KSwiZnVuY3Rpb24iPT10eXBlb2YgZS5kaWRPcGVuJiZzZXRUaW1lb3V0KCgpPT5lLmRpZE9wZW4obikpLFkodCxoWyJuby10cmFuc2l0aW9uIl0pfSx4dD1lPT57Y29uc3QgdD13KCk7aWYoZS50YXJnZXQ9PT10KXtjb25zdCBuPWIoKTt0LnJlbW92ZUV2ZW50TGlzdGVuZXIodWUseHQpLG4uc3R5bGUub3ZlcmZsb3dZPSJhdXRvIn19LEV0PShlLHQpPT57InNlbGVjdCI9PT10LmlucHV0fHwicmFkaW8iPT09dC5pbnB1dD8oKHQsbik9Pntjb25zdCBvPXcoKSxpPWU9PlR0W24uaW5wdXRdKG8sTHQoZSksbik7aWYoYyhuLmlucHV0T3B0aW9ucyl8fHAobi5pbnB1dE9wdGlvbnMpKXtxZShFKCkpO2wobi5pbnB1dE9wdGlvbnMpLnRoZW4oZT0+e3QuaGlkZUxvYWRpbmcoKTtpKGUpfSl9ZWxzZSBpZih0eXBlb2Ygbi5pbnB1dE9wdGlvbnM9PT0ib2JqZWN0IilpKG4uaW5wdXRPcHRpb25zKTtlbHNlIHIoIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCAiLmNvbmNhdCh0eXBlb2Ygbi5pbnB1dE9wdGlvbnMpKX0pKGUsdCk6WyJ0ZXh0IiwiZW1haWwiLCJudW1iZXIiLCJ0ZWwiLCJ0ZXh0YXJlYSJdLmluY2x1ZGVzKHQuaW5wdXQpJiYoYyh0LmlucHV0VmFsdWUpfHxwKHQuaW5wdXRWYWx1ZSkpJiYocWUoRSgpKSwoKHQsbik9Pntjb25zdCBvPXQuZ2V0SW5wdXQoKTskKG8pLGwobi5pbnB1dFZhbHVlKS50aGVuKGU9PntvLnZhbHVlPW4uaW5wdXQ9PT0ibnVtYmVyIj9wYXJzZUZsb2F0KGUpfHwwOiIiLmNvbmNhdChlKTtYKG8pO28uZm9jdXMoKTt0LmhpZGVMb2FkaW5nKCl9KS5jYXRjaChlPT57cigiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiAiLmNvbmNhdChlKSk7by52YWx1ZT0iIjtYKG8pO28uZm9jdXMoKTt0LmhpZGVMb2FkaW5nKCl9KX0pKGUsdCkpfSxTdD0oZSx0KT0+e2NvbnN0IG49ZS5nZXRJbnB1dCgpO2lmKCFuKXJldHVybiBudWxsO3N3aXRjaCh0LmlucHV0KXtjYXNlImNoZWNrYm94IjpyZXR1cm4gbi5jaGVja2VkPzE6MDtjYXNlInJhZGlvIjpyZXR1cm4obz1uKS5jaGVja2VkP28udmFsdWU6bnVsbDtjYXNlImZpbGUiOnJldHVybihvPW4pLmZpbGVzLmxlbmd0aD9udWxsIT09by5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik/by5maWxlczpvLmZpbGVzWzBdOm51bGw7ZGVmYXVsdDpyZXR1cm4gdC5pbnB1dEF1dG9UcmltP24udmFsdWUudHJpbSgpOm4udmFsdWV9dmFyIG99LFR0PXtzZWxlY3Q6KGUsdCxpKT0+e2NvbnN0IHM9WihlLGguc2VsZWN0KSxhPShlLHQsbik9Pntjb25zdCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO28udmFsdWU9bixVKG8sdCksby5zZWxlY3RlZD1PdChuLGkuaW5wdXRWYWx1ZSksZS5hcHBlbmRDaGlsZChvKX07dC5mb3JFYWNoKGU9Pnt2YXIgdD1lWzBdO2NvbnN0IG49ZVsxXTtpZihBcnJheS5pc0FycmF5KG4pKXtjb25zdCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGdyb3VwIik7by5sYWJlbD10LG8uZGlzYWJsZWQ9ITEscy5hcHBlbmRDaGlsZChvKSxuLmZvckVhY2goZT0+YShvLGVbMV0sZVswXSkpfWVsc2UgYShzLG4sdCl9KSxzLmZvY3VzKCl9LHJhZGlvOihlLHQscyk9Pntjb25zdCBhPVooZSxoLnJhZGlvKTt0LmZvckVhY2goZT0+e3ZhciB0PWVbMF0sZT1lWzFdO2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7bi50eXBlPSJyYWRpbyIsbi5uYW1lPWgucmFkaW8sbi52YWx1ZT10LE90KHQscy5pbnB1dFZhbHVlKSYmKG4uY2hlY2tlZD0hMCk7Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7VShpLGUpLGkuY2xhc3NOYW1lPWgubGFiZWwsby5hcHBlbmRDaGlsZChuKSxvLmFwcGVuZENoaWxkKGkpLGEuYXBwZW5kQ2hpbGQobyl9KTtjb25zdCBuPWEucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQiKTtuLmxlbmd0aCYmblswXS5mb2N1cygpfX0sTHQ9bj0+e2NvbnN0IG89W107cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBNYXAmJm4gaW5zdGFuY2VvZiBNYXA/bi5mb3JFYWNoKChlLHQpPT57bGV0IG49ZTsib2JqZWN0Ij09dHlwZW9mIG4mJihuPUx0KG4pKSxvLnB1c2goW3Qsbl0pfSk6T2JqZWN0LmtleXMobikuZm9yRWFjaChlPT57bGV0IHQ9bltlXTsib2JqZWN0Ij09dHlwZW9mIHQmJih0PUx0KHQpKSxvLnB1c2goW2UsdF0pfSksb30sT3Q9KGUsdCk9PnQmJnQudG9TdHJpbmcoKT09PWUudG9TdHJpbmcoKSxqdD1lPT57dmFyIHQ9Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpO2UuZGlzYWJsZUJ1dHRvbnMoKSx0LmlucHV0P0l0KGUsImNvbmZpcm0iKTpVdChlLCEwKX0sRHQ9ZT0+e3ZhciB0PWdlLmlubmVyUGFyYW1zLmdldChlKTtlLmRpc2FibGVCdXR0b25zKCksdC5yZXR1cm5JbnB1dFZhbHVlT25EZW55P0l0KGUsImRlbnkiKTpxdChlLCExKX0sTXQ9KGUsdCk9PntlLmRpc2FibGVCdXR0b25zKCksdCh1LmNhbmNlbCl9LEl0PShlLHQpPT57dmFyIG49Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpLG89U3QoZSxuKTtuLmlucHV0VmFsaWRhdG9yP0h0KGUsbyx0KTplLmdldElucHV0KCkuY2hlY2tWYWxpZGl0eSgpPygiZGVueSI9PT10P3F0OlV0KShlLG8pOihlLmVuYWJsZUJ1dHRvbnMoKSxlLnNob3dWYWxpZGF0aW9uTWVzc2FnZShuLnZhbGlkYXRpb25NZXNzYWdlKSl9LEh0PSh0LG4sbyk9Pntjb25zdCBlPWdlLmlubmVyUGFyYW1zLmdldCh0KTt0LmRpc2FibGVJbnB1dCgpO2NvbnN0IGk9UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+bChlLmlucHV0VmFsaWRhdG9yKG4sZS52YWxpZGF0aW9uTWVzc2FnZSkpKTtpLnRoZW4oZT0+e3QuZW5hYmxlQnV0dG9ucygpLHQuZW5hYmxlSW5wdXQoKSxlP3Quc2hvd1ZhbGlkYXRpb25NZXNzYWdlKGUpOigiZGVueSI9PT1vP3F0OlV0KSh0LG4pfSl9LHF0PSh0LG4pPT57Y29uc3QgZT1nZS5pbm5lclBhcmFtcy5nZXQodHx8dm9pZCAwKTtpZihlLnNob3dMb2FkZXJPbkRlbnkmJnFlKFMoKSksZS5wcmVEZW55KXtnZS5hd2FpdGluZ1Byb21pc2Uuc2V0KHR8fHZvaWQgMCwhMCk7Y29uc3Qgbz1Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5sKGUucHJlRGVueShuLGUudmFsaWRhdGlvbk1lc3NhZ2UpKSk7by50aGVuKGU9PnshMT09PWU/dC5oaWRlTG9hZGluZygpOnQuY2xvc2VQb3B1cCh7aXNEZW5pZWQ6ITAsdmFsdWU6dm9pZCAwPT09ZT9uOmV9KX0pLmNhdGNoKGU9Pk50KHR8fHZvaWQgMCxlKSl9ZWxzZSB0LmNsb3NlUG9wdXAoe2lzRGVuaWVkOiEwLHZhbHVlOm59KX0sVnQ9KGUsdCk9PntlLmNsb3NlUG9wdXAoe2lzQ29uZmlybWVkOiEwLHZhbHVlOnR9KX0sTnQ9KGUsdCk9PntlLnJlamVjdFByb21pc2UodCl9LFV0PSh0LG4pPT57Y29uc3QgZT1nZS5pbm5lclBhcmFtcy5nZXQodHx8dm9pZCAwKTtpZihlLnNob3dMb2FkZXJPbkNvbmZpcm0mJnFlKCksZS5wcmVDb25maXJtKXt0LnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxnZS5hd2FpdGluZ1Byb21pc2Uuc2V0KHR8fHZvaWQgMCwhMCk7Y29uc3Qgbz1Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5sKGUucHJlQ29uZmlybShuLGUudmFsaWRhdGlvbk1lc3NhZ2UpKSk7by50aGVuKGU9PntlZSh4KCkpfHwhMT09PWU/dC5oaWRlTG9hZGluZygpOlZ0KHQsdm9pZCAwPT09ZT9uOmUpfSkuY2F0Y2goZT0+TnQodHx8dm9pZCAwLGUpKX1lbHNlIFZ0KHQsbil9LEZ0PSh0LGUsbixvKT0+e2Uua2V5ZG93blRhcmdldCYmZS5rZXlkb3duSGFuZGxlckFkZGVkJiYoZS5rZXlkb3duVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGUua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksZS5rZXlkb3duSGFuZGxlckFkZGVkPSExKSxuLnRvYXN0fHwoZS5rZXlkb3duSGFuZGxlcj1lPT4oKGUsdCxuKT0+e2NvbnN0IG89Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpO28mJihvLnN0b3BLZXlkb3duUHJvcGFnYXRpb24mJnQuc3RvcFByb3BhZ2F0aW9uKCksIkVudGVyIj09PXQua2V5P190KGUsdCxvKToiVGFiIj09PXQua2V5P0t0KHQsbyk6Wy4uLnp0LC4uLld0XS5pbmNsdWRlcyh0LmtleSk/WXQodC5rZXkpOiJFc2NhcGUiPT09dC5rZXkmJlp0KHQsbyxuKSl9KSh0LGUsbyksZS5rZXlkb3duVGFyZ2V0PW4ua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT93aW5kb3c6dygpLGUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT1uLmtleWRvd25MaXN0ZW5lckNhcHR1cmUsZS5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGUua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksZS5rZXlkb3duSGFuZGxlckFkZGVkPSEwKX0sUnQ9KGUsdCxuKT0+e2NvbnN0IG89SSgpO2lmKG8ubGVuZ3RoKXJldHVybih0Kz1uKT09PW8ubGVuZ3RoP3Q9MDotMT09PXQmJih0PW8ubGVuZ3RoLTEpLG9bdF0uZm9jdXMoKTt3KCkuZm9jdXMoKX0senQ9WyJBcnJvd1JpZ2h0IiwiQXJyb3dEb3duIl0sV3Q9WyJBcnJvd0xlZnQiLCJBcnJvd1VwIl0sX3Q9KGUsdCxuKT0+e3QuaXNDb21wb3Npbmd8fHQudGFyZ2V0JiZlLmdldElucHV0KCkmJnQudGFyZ2V0Lm91dGVySFRNTD09PWUuZ2V0SW5wdXQoKS5vdXRlckhUTUwmJihbInRleHRhcmVhIiwiZmlsZSJdLmluY2x1ZGVzKG4uaW5wdXQpfHwoSGUoKSx0LnByZXZlbnREZWZhdWx0KCkpKX0sS3Q9KGUsdCk9Pnt2YXIgbj1lLnRhcmdldCxvPUkoKTtsZXQgaT0tMTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKylpZihuPT09b1tlXSl7aT1lO2JyZWFrfWUuc2hpZnRLZXk/UnQoMCxpLC0xKTpSdCgwLGksMSksZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCl9LFl0PWU9Pntjb25zdCB0PUUoKSxuPVMoKSxvPUwoKTtpZihbdCxuLG9dLmluY2x1ZGVzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXtlPXp0LmluY2x1ZGVzKGUpPyJuZXh0RWxlbWVudFNpYmxpbmciOiJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIjtjb25zdCBpPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnRbZV07aSYmaS5mb2N1cygpfX0sWnQ9KGUsdCxuKT0+e2QodC5hbGxvd0VzY2FwZUtleSkmJihlLnByZXZlbnREZWZhdWx0KCksbih1LmVzYykpfSxKdD0oZSx0LG4pPT57dmFyIG8saSxzLGEscixjLGw7Z2UuaW5uZXJQYXJhbXMuZ2V0KGUpLnRvYXN0PyhjPWUsbD1uLHQucG9wdXAub25jbGljaz0oKT0+e3ZhciBlPWdlLmlubmVyUGFyYW1zLmdldChjKTtlLnNob3dDb25maXJtQnV0dG9ufHxlLnNob3dEZW55QnV0dG9ufHxlLnNob3dDYW5jZWxCdXR0b258fGUuc2hvd0Nsb3NlQnV0dG9ufHxlLnRpbWVyfHxlLmlucHV0fHxsKHUuY2xvc2UpfSk6KChyPXQpLnBvcHVwLm9ubW91c2Vkb3duPSgpPT57ci5jb250YWluZXIub25tb3VzZXVwPWZ1bmN0aW9uKGUpe3IuY29udGFpbmVyLm9ubW91c2V1cD12b2lkIDAsZS50YXJnZXQ9PT1yLmNvbnRhaW5lciYmKFh0PSEwKX19LChhPXQpLmNvbnRhaW5lci5vbm1vdXNlZG93bj0oKT0+e2EucG9wdXAub25tb3VzZXVwPWZ1bmN0aW9uKGUpe2EucG9wdXAub25tb3VzZXVwPXZvaWQgMCxlLnRhcmdldCE9PWEucG9wdXAmJiFhLnBvcHVwLmNvbnRhaW5zKGUudGFyZ2V0KXx8KFh0PSEwKX19LG89ZSxzPW4sKGk9dCkuY29udGFpbmVyLm9uY2xpY2s9ZT0+e3ZhciB0PWdlLmlubmVyUGFyYW1zLmdldChvKTtYdD9YdD0hMTplLnRhcmdldD09PWkuY29udGFpbmVyJiZkKHQuYWxsb3dPdXRzaWRlQ2xpY2spJiZzKHUuYmFja2Ryb3ApfSl9O2xldCBYdD0hMTtjb25zdCAkdD0oZSx0LG4pPT57dmFyIG89RCgpOyQobyksdC50aW1lciYmKGUudGltZW91dD1uZXcgeXQoKCk9PntuKCJ0aW1lciIpLGRlbGV0ZSBlLnRpbWVvdXR9LHQudGltZXIpLHQudGltZXJQcm9ncmVzc0JhciYmKFgobyksc2V0VGltZW91dCgoKT0+e2UudGltZW91dCYmZS50aW1lb3V0LnJ1bm5pbmcmJlYodC50aW1lcil9KSkpfSxHdD0oZSx0KT0+e2lmKCF0LnRvYXN0KXJldHVybiBkKHQuYWxsb3dFbnRlcktleSk/dm9pZCgoKGUsdCk9PntpZih0LmZvY3VzRGVueSYmZWUoZS5kZW55QnV0dG9uKSl7ZS5kZW55QnV0dG9uLmZvY3VzKCk7cmV0dXJuIHRydWV9aWYodC5mb2N1c0NhbmNlbCYmZWUoZS5jYW5jZWxCdXR0b24pKXtlLmNhbmNlbEJ1dHRvbi5mb2N1cygpO3JldHVybiB0cnVlfWlmKHQuZm9jdXNDb25maXJtJiZlZShlLmNvbmZpcm1CdXR0b24pKXtlLmNvbmZpcm1CdXR0b24uZm9jdXMoKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KShlLHQpfHxSdCgwLC0xLDEpKTooKCk9PntpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZ0eXBlb2YgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyPT09ImZ1bmN0aW9uIilkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKX0pKCl9O2NvbnN0IFF0PWU9PntlLmlzQXdhaXRpbmdQcm9taXNlKCk/KGVuKGdlLGUpLGdlLmF3YWl0aW5nUHJvbWlzZS5zZXQoZSwhMCkpOihlbih1dCxlKSxlbihnZSxlKSl9LGVuPShlLHQpPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmRlbGV0ZSh0KX07ZT1PYmplY3QuZnJlZXplKHtoaWRlTG9hZGluZzpvdCxkaXNhYmxlTG9hZGluZzpvdCxnZXRJbnB1dDpmdW5jdGlvbihlKXt2YXIgdD1nZS5pbm5lclBhcmFtcy5nZXQoZXx8dGhpcyk7cmV0dXJuKGU9Z2UuZG9tQ2FjaGUuZ2V0KGV8fHRoaXMpKT96KGUucG9wdXAsdC5pbnB1dCk6bnVsbH0sY2xvc2U6cHQsaXNBd2FpdGluZ1Byb21pc2U6ZnVuY3Rpb24oKXtyZXR1cm4hIWdlLmF3YWl0aW5nUHJvbWlzZS5nZXQodGhpcyl9LHJlamVjdFByb21pc2U6ZnVuY3Rpb24oZSl7Y29uc3QgdD11dC5zd2FsUHJvbWlzZVJlamVjdC5nZXQodGhpcyk7bXQodGhpcyksdCYmdChlKX0sY2xvc2VQb3B1cDpwdCxjbG9zZU1vZGFsOnB0LGNsb3NlVG9hc3Q6cHQsZW5hYmxlQnV0dG9uczpmdW5jdGlvbigpe2Z0KHRoaXMsWyJjb25maXJtQnV0dG9uIiwiZGVueUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiJdLCExKX0sZGlzYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtmdCh0aGlzLFsiY29uZmlybUJ1dHRvbiIsImRlbnlCdXR0b24iLCJjYW5jZWxCdXR0b24iXSwhMCl9LGVuYWJsZUlucHV0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ0KHRoaXMuZ2V0SW5wdXQoKSwhMSl9LGRpc2FibGVJbnB1dDpmdW5jdGlvbigpe3JldHVybiBidCh0aGlzLmdldElucHV0KCksITApfSxzaG93VmFsaWRhdGlvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7Y29uc3QgdD1nZS5kb21DYWNoZS5nZXQodGhpcyk7dmFyIG49Z2UuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO1UodC52YWxpZGF0aW9uTWVzc2FnZSxlKSx0LnZhbGlkYXRpb25NZXNzYWdlLmNsYXNzTmFtZT1oWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSxuLmN1c3RvbUNsYXNzJiZuLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlJiZLKHQudmFsaWRhdGlvbk1lc3NhZ2Usbi5jdXN0b21DbGFzcy52YWxpZGF0aW9uTWVzc2FnZSksWCh0LnZhbGlkYXRpb25NZXNzYWdlKTtjb25zdCBvPXRoaXMuZ2V0SW5wdXQoKTtvJiYoby5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsITApLG8uc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixoWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksVyhvKSxLKG8saC5pbnB1dGVycm9yKSl9LHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U6ZnVuY3Rpb24oKXt2YXIgZT1nZS5kb21DYWNoZS5nZXQodGhpcyk7ZS52YWxpZGF0aW9uTWVzc2FnZSYmJChlLnZhbGlkYXRpb25NZXNzYWdlKTtjb25zdCB0PXRoaXMuZ2V0SW5wdXQoKTt0JiYodC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIpLHQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IiksWSh0LGguaW5wdXRlcnJvcikpfSxnZXRQcm9ncmVzc1N0ZXBzOmZ1bmN0aW9uKCl7cmV0dXJuIGdlLmRvbUNhY2hlLmdldCh0aGlzKS5wcm9ncmVzc1N0ZXBzfSxfbWFpbjpmdW5jdGlvbihlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307KGU9PnshZS5iYWNrZHJvcCYmZS5hbGxvd091dHNpZGVDbGljayYmYSgnImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpO2Zvcihjb25zdCB0IGluIGUpUWUodCksZS50b2FzdCYmZXQodCksdHQodCl9KShPYmplY3QuYXNzaWduKHt9LHQsZSkpLE5lLmN1cnJlbnRJbnN0YW5jZSYmKE5lLmN1cnJlbnRJbnN0YW5jZS5fZGVzdHJveSgpLEgoKSYmbHQoKSksTmUuY3VycmVudEluc3RhbmNlPXRoaXMsd3QoZT0oKGUsdCk9Pntjb25zdCBuPWt0KGUpLG89T2JqZWN0LmFzc2lnbih7fSxZZSx0LG4sZSk7cmV0dXJuIG8uc2hvd0NsYXNzPU9iamVjdC5hc3NpZ24oe30sWWUuc2hvd0NsYXNzLG8uc2hvd0NsYXNzKSxvLmhpZGVDbGFzcz1PYmplY3QuYXNzaWduKHt9LFllLmhpZGVDbGFzcyxvLmhpZGVDbGFzcyksb30pKGUsdCkpLE9iamVjdC5mcmVlemUoZSksTmUudGltZW91dCYmKE5lLnRpbWVvdXQuc3RvcCgpLGRlbGV0ZSBOZS50aW1lb3V0KSxjbGVhclRpbWVvdXQoTmUucmVzdG9yZUZvY3VzVGltZW91dCk7dmFyIG8saSxzLHQ9KGU9Pntjb25zdCB0PXtwb3B1cDp3KCksY29udGFpbmVyOmIoKSxhY3Rpb25zOk8oKSxjb25maXJtQnV0dG9uOkUoKSxkZW55QnV0dG9uOlMoKSxjYW5jZWxCdXR0b246TCgpLGxvYWRlcjpUKCksY2xvc2VCdXR0b246TSgpLHZhbGlkYXRpb25NZXNzYWdlOngoKSxwcm9ncmVzc1N0ZXBzOkIoKX07cmV0dXJuIGdlLmRvbUNhY2hlLnNldChlLHQpLHR9KSh0aGlzKTtyZXR1cm4gSWUodGhpcyxlKSxnZS5pbm5lclBhcmFtcy5zZXQodGhpcyxlKSxvPXRoaXMsaT10LHM9ZSxuZXcgUHJvbWlzZSgoZSx0KT0+e2NvbnN0IG49ZT0+e28uY2xvc2VQb3B1cCh7aXNEaXNtaXNzZWQ6ITAsZGlzbWlzczplfSl9O3V0LnN3YWxQcm9taXNlUmVzb2x2ZS5zZXQobyxlKSx1dC5zd2FsUHJvbWlzZVJlamVjdC5zZXQobyx0KSxpLmNvbmZpcm1CdXR0b24ub25jbGljaz0oKT0+anQobyksaS5kZW55QnV0dG9uLm9uY2xpY2s9KCk9PkR0KG8pLGkuY2FuY2VsQnV0dG9uLm9uY2xpY2s9KCk9Pk10KG8sbiksaS5jbG9zZUJ1dHRvbi5vbmNsaWNrPSgpPT5uKHUuY2xvc2UpLEp0KG8saSxuKSxGdChvLE5lLHMsbiksRXQobyxzKSxCdChzKSwkdChOZSxzLG4pLEd0KGkscyksc2V0VGltZW91dCgoKT0+e2kuY29udGFpbmVyLnNjcm9sbFRvcD0wfSl9KX0sdXBkYXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXcoKSxuPWdlLmlubmVyUGFyYW1zLmdldCh0aGlzKTtpZighZXx8RihlLG4uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4gYSgiWW91J3JlIHRyeWluZyB0byB1cGRhdGUgdGhlIGNsb3NlZCBvciBjbG9zaW5nIHBvcHVwLCB0aGF0IHdvbid0IHdvcmsuIFVzZSB0aGUgdXBkYXRlKCkgbWV0aG9kIGluIHByZUNvbmZpcm0gcGFyYW1ldGVyIG9yIHNob3cgYSBuZXcgcG9wdXAuIik7Y29uc3Qgbz17fTtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGU9Pntvbi5pc1VwZGF0YWJsZVBhcmFtZXRlcihlKT9vW2VdPXRbZV06YSgnSW52YWxpZCBwYXJhbWV0ZXIgdG8gdXBkYXRlOiAiJy5jb25jYXQoZSwnIi4gVXBkYXRhYmxlIHBhcmFtcyBhcmUgbGlzdGVkIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9ibG9iL21hc3Rlci9zcmMvdXRpbHMvcGFyYW1zLmpzXG5cbklmIHlvdSB0aGluayB0aGlzIHBhcmFtZXRlciBzaG91bGQgYmUgdXBkYXRhYmxlLCByZXF1ZXN0IGl0IGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvbmV3P3RlbXBsYXRlPTAyX2ZlYXR1cmVfcmVxdWVzdC5tZCcpKX0pLG49T2JqZWN0LmFzc2lnbih7fSxuLG8pLEllKHRoaXMsbiksZ2UuaW5uZXJQYXJhbXMuc2V0KHRoaXMsbiksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cGFyYW1zOnt2YWx1ZTpPYmplY3QuYXNzaWduKHt9LHRoaXMucGFyYW1zLHQpLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITB9fSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9Z2UuZG9tQ2FjaGUuZ2V0KHRoaXMpO2NvbnN0IHQ9Z2UuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO3Q/KGUucG9wdXAmJk5lLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayYmKE5lLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjaygpLGRlbGV0ZSBOZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2spLE5lLmRlZmVyRGlzcG9zYWxUaW1lciYmKGNsZWFyVGltZW91dChOZS5kZWZlckRpc3Bvc2FsVGltZXIpLGRlbGV0ZSBOZS5kZWZlckRpc3Bvc2FsVGltZXIpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpZERlc3Ryb3kmJnQuZGlkRGVzdHJveSgpLGU9dGhpcyxRdChlKSxkZWxldGUgZS5wYXJhbXMsZGVsZXRlIE5lLmtleWRvd25IYW5kbGVyLGRlbGV0ZSBOZS5rZXlkb3duVGFyZ2V0LGRlbGV0ZSBOZS5jdXJyZW50SW5zdGFuY2UpOlF0KHRoaXMpfX0pO2xldCB0bjtjbGFzcyBubntjb25zdHJ1Y3Rvcigpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt0bj10aGlzO2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3ZhciBvPU9iamVjdC5mcmVlemUodGhpcy5jb25zdHJ1Y3Rvci5hcmdzVG9QYXJhbXModCkpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6byx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtvPXRoaXMuX21haW4odGhpcy5wYXJhbXMpO2dlLnByb21pc2Uuc2V0KHRoaXMsbyl9fXRoZW4oZSl7Y29uc3QgdD1nZS5wcm9taXNlLmdldCh0aGlzKTtyZXR1cm4gdC50aGVuKGUpfWZpbmFsbHkoZSl7Y29uc3QgdD1nZS5wcm9taXNlLmdldCh0aGlzKTtyZXR1cm4gdC5maW5hbGx5KGUpfX1PYmplY3QuYXNzaWduKG5uLnByb3RvdHlwZSxlKSxPYmplY3QuYXNzaWduKG5uLG50KSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGU9PntubltlXT1mdW5jdGlvbigpe2lmKHRuKXJldHVybiB0bltlXSguLi5hcmd1bWVudHMpfX0pLG5uLkRpc21pc3NSZWFzb249dSxubi52ZXJzaW9uPSIxMS4yLjAiO2NvbnN0IG9uPW5uO3JldHVybiBvbi5kZWZhdWx0PW9uLG9ufSksdm9pZCAwIT09dGhpcyYmdGhpcy5Td2VldGFsZXJ0MiYmKHRoaXMuc3dhbD10aGlzLnN3ZWV0QWxlcnQ9dGhpcy5Td2FsPXRoaXMuU3dlZXRBbGVydD10aGlzLlN3ZWV0YWxlcnQyKTsKInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7aWYoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKG4pLG4uc3R5bGVTaGVldCluLnN0eWxlU2hlZXQuZGlzYWJsZWR8fChuLnN0eWxlU2hlZXQuY3NzVGV4dD10KTtlbHNlIHRyeXtuLmlubmVySFRNTD10fWNhdGNoKGUpe24uaW5uZXJUZXh0PXR9fShkb2N1bWVudCwiLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLWNvbHVtbjoxLzQhaW1wb3J0YW50O2dyaWQtcm93OjEvNCFpbXBvcnRhbnQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciA5OWZyIDFmcjtwYWRkaW5nOjFlbTtvdmVyZmxvdy15OmhpZGRlbjtiYWNrZ3JvdW5kOiNmZmY7Ym94LXNoYWRvdzowIDAgMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAxcHggMnB4IHJnYmEoMCwwLDAsLjA3NSksMXB4IDJweCA0cHggcmdiYSgwLDAsMCwuMDc1KSwxcHggM3B4IDhweCByZ2JhKDAsMCwwLC4wNzUpLDJweCA0cHggMTZweCByZ2JhKDAsMCwwLC4wNzUpO3BvaW50ZXItZXZlbnRzOmFsbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Q+KntncmlkLWNvbHVtbjoyfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItdGl0bGV7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtmb250LXNpemU6MWVtO3RleHQtYWxpZ246aW5pdGlhbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRpbmd7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWlucHV0e2hlaWdodDoyZW07bWFyZ2luOi41ZW07Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItZm9vdGVye21hcmdpbjouNWVtIDAgMDtwYWRkaW5nOi41ZW0gMCAwO2ZvbnQtc2l6ZTouOGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItY2xvc2V7Z3JpZC1jb2x1bW46My8zO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6LjhlbTtoZWlnaHQ6LjhlbTttYXJnaW46MDtmb250LXNpemU6MmVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaHRtbC1jb250YWluZXJ7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtmb250LXNpemU6MWVtO3RleHQtYWxpZ246aW5pdGlhbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWh0bWwtY29udGFpbmVyOmVtcHR5e3BhZGRpbmc6MH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRlcntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOi4yNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO21pbi13aWR0aDoyZW07aGVpZ2h0OjJlbTttYXJnaW46MCAuNWVtIDAgMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZToxLjhlbTtmb250LXdlaWdodDo3MDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV17dG9wOi44NzVlbTt3aWR0aDoxLjM3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0Oi4zMTI1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1hY3Rpb25ze2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2hlaWdodDphdXRvO21hcmdpbjowO21hcmdpbi10b3A6LjVlbTtwYWRkaW5nOjAgLjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN0eWxlZHttYXJnaW46LjI1ZW0gLjVlbTtwYWRkaW5nOi40ZW0gLjZlbTtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Nn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEuNmVtO2hlaWdodDozZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0uOGVtO2xlZnQ6LS41ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MmVtIDJlbTtib3JkZXItcmFkaXVzOjRlbSAwIDAgNGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPXJpZ2h0XXt0b3A6LS4yNWVtO2xlZnQ6LjkzNzVlbTt0cmFuc2Zvcm0tb3JpZ2luOjAgMS41ZW07Ym9yZGVyLXJhZGl1czowIDRlbSA0ZW0gMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3RvcDowO2xlZnQ6LjQzNzVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDoyLjY4NzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2hlaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDouOTM3NWVtO3JpZ2h0Oi4xODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1zaG93IC41czthbmltYXRpb246c3dhbDItdG9hc3Qtc2hvdyAuNXN9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0LnN3YWwyLWhpZGV7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3QtaGlkZSAuMXMgZm9yd2FyZHM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWhpZGUgLjFzIGZvcndhcmRzfS5zd2FsMi1jb250YWluZXJ7ZGlzcGxheTpncmlkO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTA2MDt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Z3JpZC10ZW1wbGF0ZS1hcmVhczpcInRvcC1zdGFydCAgICAgdG9wICAgICAgICAgICAgdG9wLWVuZFwiIFwiY2VudGVyLXN0YXJ0ICBjZW50ZXIgICAgICAgICBjZW50ZXItZW5kXCIgXCJib3R0b20tc3RhcnQgIGJvdHRvbS1jZW50ZXIgIGJvdHRvbS1lbmRcIjtncmlkLXRlbXBsYXRlLXJvd3M6bWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0bykgbWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0bykgbWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0byk7Z3JpZC10ZW1wbGF0ZS1yb3dzOm1pbm1heChtaW4tY29udGVudCxhdXRvKSBtaW5tYXgobWluLWNvbnRlbnQsYXV0bykgbWlubWF4KG1pbi1jb250ZW50LGF1dG8pO2hlaWdodDoxMDAlO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93LXg6aGlkZGVuO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXM7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1iYWNrZHJvcC1zaG93LC5zd2FsMi1jb250YWluZXIuc3dhbDItbm9hbmltYXRpb257YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC40KX0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJhY2tkcm9wLWhpZGV7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50fS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0e2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxZnIpIGF1dG8gYXV0b30uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbSwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlciwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6YXV0byBtaW5tYXgoMCwxZnIpIGF1dG99LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gYXV0byBtaW5tYXgoMCwxZnIpfS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0Pi5zd2FsMi1wb3B1cHthbGlnbi1zZWxmOnN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wPi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoyO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQ+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjozO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0Pi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydD4uc3dhbDItcG9wdXB7Z3JpZC1yb3c6MjthbGlnbi1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlcj4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdD4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjE7Z3JpZC1yb3c6MzthbGlnbi1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbT4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzozO2p1c3RpZnktc2VsZjpjZW50ZXI7YWxpZ24tc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzozO2FsaWduLXNlbGY6ZW5kO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWZ1bGxzY3JlZW4+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1yb3c+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjEvNDt3aWR0aDoxMDAlfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1mdWxsc2NyZWVuPi5zd2FsMi1wb3B1cHtncmlkLXJvdzoxLzQ7YWxpZ24tc2VsZjpzdHJldGNofS5zd2FsMi1jb250YWluZXIuc3dhbDItbm8tdHJhbnNpdGlvbnt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50fS5zd2FsMi1wb3B1cHtkaXNwbGF5Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxMDAlKTt3aWR0aDozMmVtO21heC13aWR0aDoxMDAlO3BhZGRpbmc6MCAwIDEuMjVlbTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzU0NTQ1NDtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZToxcmVtfS5zd2FsMi1wb3B1cDpmb2N1c3tvdXRsaW5lOjB9LnN3YWwyLXBvcHVwLnN3YWwyLWxvYWRpbmd7b3ZlcmZsb3cteTpoaWRkZW59LnN3YWwyLXRpdGxle3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO21hcmdpbjowO3BhZGRpbmc6LjhlbSAxZW0gMDtjb2xvcjojNTk1OTU5O2ZvbnQtc2l6ZToxLjg3NWVtO2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXRyYW5zZm9ybTpub25lO3dvcmQtd3JhcDpicmVhay13b3JkfS5zd2FsMi1hY3Rpb25ze2Rpc3BsYXk6ZmxleDt6LWluZGV4OjE7Ym94LXNpemluZzpib3JkZXItYm94O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOmF1dG87bWFyZ2luOjEuMjVlbSBhdXRvIDA7cGFkZGluZzowfS5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZFtkaXNhYmxlZF17b3BhY2l0eTouNH0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWQ6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwuMSkscmdiYSgwLDAsMCwuMSkpfS5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZDphY3RpdmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwuMikscmdiYSgwLDAsMCwuMikpfS5zd2FsMi1sb2FkZXJ7ZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjIuMmVtO2hlaWdodDoyLjJlbTttYXJnaW46MCAxLjg3NWVtOy13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDthbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2JvcmRlci13aWR0aDouMjVlbTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czoxMDAlO2JvcmRlci1jb2xvcjojMjc3OGM0IHRyYW5zcGFyZW50ICMyNzc4YzQgdHJhbnNwYXJlbnR9LnN3YWwyLXN0eWxlZHttYXJnaW46LjMxMjVlbTtwYWRkaW5nOi42MjVlbSAxLjFlbTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzO2JveC1zaGFkb3c6MCAwIDAgM3B4IHRyYW5zcGFyZW50O2ZvbnQtd2VpZ2h0OjUwMH0uc3dhbDItc3R5bGVkOm5vdChbZGlzYWJsZWRdKXtjdXJzb3I6cG9pbnRlcn0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm17Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojNzM2N2YwO2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm06Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAzcHggcmdiYSgxMTUsMTAzLDI0MCwuNSl9LnN3YWwyLXN0eWxlZC5zd2FsMi1kZW55e2JvcmRlcjowO2JvcmRlci1yYWRpdXM6LjI1ZW07YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6I2VhNTQ1NTtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXN0eWxlZC5zd2FsMi1kZW55OmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMjM0LDg0LDg1LC41KX0uc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbHtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiM2ZTdkODg7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfS5zd2FsMi1zdHlsZWQuc3dhbDItY2FuY2VsOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTEwLDEyNSwxMzYsLjUpfS5zd2FsMi1zdHlsZWQuc3dhbDItZGVmYXVsdC1vdXRsaW5lOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1zdHlsZWQ6Zm9jdXN7b3V0bGluZTowfS5zd2FsMi1zdHlsZWQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9LnN3YWwyLWZvb3RlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxZW0gMCAwO3BhZGRpbmc6MWVtIDFlbSAwO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWU7Y29sb3I6IzU0NTQ1NDtmb250LXNpemU6MWVtfS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2dyaWQtY29sdW1uOmF1dG8haW1wb3J0YW50O2hlaWdodDouMjVlbTtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NXB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NXB4fS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7d2lkdGg6MTAwJTtoZWlnaHQ6LjI1ZW07YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4yKX0uc3dhbDItaW1hZ2V7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjJlbSBhdXRvIDFlbX0uc3dhbDItY2xvc2V7ei1pbmRleDoyO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjEuMmVtO2hlaWdodDoxLjJlbTttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWJvdHRvbTotMS4yZW07cGFkZGluZzowO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOmNvbG9yIC4xcyxib3gtc2hhZG93IC4xcztib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojY2NjO2ZvbnQtZmFtaWx5OnNlcmlmO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6Mi41ZW07Y3Vyc29yOnBvaW50ZXI7anVzdGlmeS1zZWxmOmVuZH0uc3dhbDItY2xvc2U6aG92ZXJ7dHJhbnNmb3JtOm5vbmU7YmFja2dyb3VuZDowIDA7Y29sb3I6I2YyNzQ3NH0uc3dhbDItY2xvc2U6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1jbG9zZTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uc3dhbDItaHRtbC1jb250YWluZXJ7ei1pbmRleDoxO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSAxLjZlbSAuM2VtO3BhZGRpbmc6MDtvdmVyZmxvdzphdXRvO2NvbG9yOiM1NDU0NTQ7Zm9udC1zaXplOjEuMTI1ZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcjt3b3JkLXdyYXA6YnJlYWstd29yZDt3b3JkLWJyZWFrOmJyZWFrLXdvcmR9LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItcmFkaW8sLnN3YWwyLXNlbGVjdCwuc3dhbDItdGV4dGFyZWF7bWFyZ2luOjFlbSAyZW0gMH0uc3dhbDItZmlsZSwuc3dhbDItaW5wdXQsLnN3YWwyLXRleHRhcmVhe2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDphdXRvO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyxib3gtc2hhZG93IC4xcztib3JkZXI6MXB4IHNvbGlkICNkOWQ5ZDk7Ym9yZGVyLXJhZGl1czouMTg3NWVtO2JhY2tncm91bmQ6aW5oZXJpdDtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNiksMCAwIDAgM3B4IHRyYW5zcGFyZW50O2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLWZpbGUuc3dhbDItaW5wdXRlcnJvciwuc3dhbDItaW5wdXQuc3dhbDItaW5wdXRlcnJvciwuc3dhbDItdGV4dGFyZWEuc3dhbDItaW5wdXRlcnJvcntib3JkZXItY29sb3I6I2YyNzQ3NCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMnB4ICNmMjc0NzQhaW1wb3J0YW50fS5zd2FsMi1maWxlOmZvY3VzLC5zd2FsMi1pbnB1dDpmb2N1cywuc3dhbDItdGV4dGFyZWE6Zm9jdXN7Ym9yZGVyOjFweCBzb2xpZCAjYjRkYmVkO291dGxpbmU6MDtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNiksMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1maWxlOjotbW96LXBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6LW1vei1wbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItZmlsZTotbXMtaW5wdXQtcGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNjY2N9LnN3YWwyLWZpbGU6OnBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6cGxhY2Vob2xkZXIsLnN3YWwyLXRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1yYW5nZXttYXJnaW46MWVtIDJlbSAwO2JhY2tncm91bmQ6I2ZmZn0uc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6ODAlfS5zd2FsMi1yYW5nZSBvdXRwdXR7d2lkdGg6MjAlO2NvbG9yOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1yYW5nZSBpbnB1dCwuc3dhbDItcmFuZ2Ugb3V0cHV0e2hlaWdodDoyLjYyNWVtO3BhZGRpbmc6MDtmb250LXNpemU6MS4xMjVlbTtsaW5lLWhlaWdodDoyLjYyNWVtfS5zd2FsMi1pbnB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjAgLjc1ZW19LnN3YWwyLWZpbGV7d2lkdGg6NzUlO21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG87YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi10ZXh0YXJlYXtoZWlnaHQ6Ni43NWVtO3BhZGRpbmc6Ljc1ZW19LnN3YWwyLXNlbGVjdHttaW4td2lkdGg6NTAlO21heC13aWR0aDoxMDAlO3BhZGRpbmc6LjM3NWVtIC42MjVlbTtiYWNrZ3JvdW5kOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3gsLnN3YWwyLXJhZGlve2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjppbmhlcml0fS5zd2FsMi1jaGVja2JveCBsYWJlbCwuc3dhbDItcmFkaW8gbGFiZWx7bWFyZ2luOjAgLjZlbTtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3ggaW5wdXQsLnN3YWwyLXJhZGlvIGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX0uc3dhbDItaW5wdXQtbGFiZWx7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSBhdXRvIDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIDAgMDtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojZjBmMGYwO2NvbG9yOiM2NjY7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDozMDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZTo6YmVmb3Jle2NvbnRlbnQ6XCIhXCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MS41ZW07bWluLXdpZHRoOjEuNWVtO2hlaWdodDoxLjVlbTttYXJnaW46MCAuNjI1ZW07Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZC1jb2xvcjojZjI3NDc0O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NjAwO2xpbmUtaGVpZ2h0OjEuNWVtO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1pY29ue3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Y29udGVudC1ib3g7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDo1ZW07aGVpZ2h0OjVlbTttYXJnaW46Mi41ZW0gYXV0byAuNmVtO2JvcmRlcjouMjVlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXItY29sb3I6IzAwMDtmb250LWZhbWlseTppbmhlcml0O2xpbmUtaGVpZ2h0OjVlbTtjdXJzb3I6ZGVmYXVsdDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTozLjc1ZW19LnN3YWwyLWljb24uc3dhbDItZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciAuc3dhbDIteC1tYXJre3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtZ3JvdzoxfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjIuMzEyNWVtO3dpZHRoOjIuOTM3NWVtO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDoxLjA2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0OjFlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93IC5zd2FsMi14LW1hcmt7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItd2FybmluZ3tib3JkZXItY29sb3I6I2ZhY2VhODtjb2xvcjojZjhiYjg2fS5zd2FsMi1pY29uLnN3YWwyLXdhcm5pbmcuc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItd2FybmluZy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLWljb24tY29udGVudHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtaS1tYXJrIC41c30uc3dhbDItaWNvbi5zd2FsMi1pbmZve2JvcmRlci1jb2xvcjojOWRlMGY2O2NvbG9yOiMzZmMzZWV9LnN3YWwyLWljb24uc3dhbDItaW5mby5zd2FsMi1pY29uLXNob3d7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIC41czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIC41c30uc3dhbDItaWNvbi5zd2FsMi1pbmZvLnN3YWwyLWljb24tc2hvdyAuc3dhbDItaWNvbi1jb250ZW50ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtaS1tYXJrIC44czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1pLW1hcmsgLjhzfS5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9ue2JvcmRlci1jb2xvcjojYzlkYWUxO2NvbG9yOiM4N2FkYmR9LnN3YWwyLWljb24uc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93IC5zd2FsMi1pY29uLWNvbnRlbnR7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrIC44czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrIC44c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNze2JvcmRlci1jb2xvcjojYTVkYzg2O2NvbG9yOiNhNWRjODZ9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6My43NWVtO2hlaWdodDo3LjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0uNDM3NWVtO2xlZnQ6LTIuMDYzNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjMuNzVlbSAzLjc1ZW07Ym9yZGVyLXJhZGl1czo3LjVlbSAwIDAgNy41ZW19LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPXJpZ2h0XXt0b3A6LS42ODc1ZW07bGVmdDoxLjg3NWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjAgMy43NWVtO2JvcmRlci1yYWRpdXM6MCA3LjVlbSA3LjVlbSAwfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3twb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7dG9wOi0uMjVlbTtsZWZ0Oi0uMjVlbTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOi4yNWVtIHNvbGlkIHJnYmEoMTY1LDIyMCwxMzQsLjMpO2JvcmRlci1yYWRpdXM6NTAlfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6LjVlbTtsZWZ0OjEuNjI1ZW07d2lkdGg6LjQzNzVlbTtoZWlnaHQ6NS42MjVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV17ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7aGVpZ2h0Oi4zMTI1ZW07Ym9yZGVyLXJhZGl1czouMTI1ZW07YmFja2dyb3VuZC1jb2xvcjojYTVkYzg2fS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVdW2NsYXNzJD10aXBde3RvcDoyLjg3NWVtO2xlZnQ6LjgxMjVlbTt3aWR0aDoxLjU2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXB7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLXJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmUgNC4yNXMgZWFzZS1pbjthbmltYXRpb246c3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWlufS5zd2FsMi1wcm9ncmVzcy1zdGVwc3tmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjEuMjVlbSBhdXRvO3BhZGRpbmc6MDtiYWNrZ3JvdW5kOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NjAwfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyBsaXtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXB7ei1pbmRleDoyMDtmbGV4LXNocmluazowO3dpZHRoOjJlbTtoZWlnaHQ6MmVtO2JvcmRlci1yYWRpdXM6MmVtO2JhY2tncm91bmQ6IzI3NzhjNDtjb2xvcjojZmZmO2xpbmUtaGVpZ2h0OjJlbTt0ZXh0LWFsaWduOmNlbnRlcn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB7YmFja2dyb3VuZDojMjc3OGM0fS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcH4uc3dhbDItcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiNhZGQ4ZTY7Y29sb3I6I2ZmZn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB+LnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXtiYWNrZ3JvdW5kOiNhZGQ4ZTZ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7ei1pbmRleDoxMDtmbGV4LXNocmluazowO3dpZHRoOjIuNWVtO2hlaWdodDouNGVtO21hcmdpbjowIC0xcHg7YmFja2dyb3VuZDojMjc3OGM0fVtjbGFzc149c3dhbDJdey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uc3dhbDItc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1zaG93IC4zczthbmltYXRpb246c3dhbDItc2hvdyAuM3N9LnN3YWwyLWhpZGV7LXdlYmtpdC1hbmltYXRpb246c3dhbDItaGlkZSAuMTVzIGZvcndhcmRzO2FuaW1hdGlvbjpzd2FsMi1oaWRlIC4xNXMgZm9yd2FyZHN9LnN3YWwyLW5vYW5pbWF0aW9ue3RyYW5zaXRpb246bm9uZX0uc3dhbDItc2Nyb2xsYmFyLW1lYXN1cmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5cHg7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpzY3JvbGx9LnN3YWwyLXJ0bCAuc3dhbDItY2xvc2V7bWFyZ2luLXJpZ2h0OmluaXRpYWw7bWFyZ2luLWxlZnQ6MH0uc3dhbDItcnRsIC5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7cmlnaHQ6MDtsZWZ0OmF1dG99QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LXNob3d7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS42MjVlbSkgcm90YXRlWigyZGVnKX0zMyV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigtMmRlZyl9NjYle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKDApfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LXNob3d7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS42MjVlbSkgcm90YXRlWigyZGVnKX0zMyV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigtMmRlZyl9NjYle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItdG9hc3QtaGlkZXsxMDAle3RyYW5zZm9ybTpyb3RhdGVaKDFkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1oaWRlezEwMCV7dHJhbnNmb3JtOnJvdGF0ZVooMWRlZyk7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotLjI1ZW07d2lkdGg6MS42MjVlbX04NCV7dG9wOjEuMDYyNWVtO2xlZnQ6Ljc1ZW07d2lkdGg6LjVlbX0xMDAle3RvcDoxLjEyNWVtO2xlZnQ6LjE4NzVlbTt3aWR0aDouNzVlbX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOi41NjI1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDouMTI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOi42MjVlbTtsZWZ0Oi0uMjVlbTt3aWR0aDoxLjYyNWVtfTg0JXt0b3A6MS4wNjI1ZW07bGVmdDouNzVlbTt3aWR0aDouNWVtfTEwMCV7dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6MS42MjVlbTtyaWdodDoxLjM3NWVtO3dpZHRoOjB9NjUle3RvcDoxLjI1ZW07cmlnaHQ6LjkzNzVlbTt3aWR0aDowfTg0JXt0b3A6LjkzNzVlbTtyaWdodDowO3dpZHRoOjEuMTI1ZW19MTAwJXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6MS42MjVlbTtyaWdodDoxLjM3NWVtO3dpZHRoOjB9NjUle3RvcDoxLjI1ZW07cmlnaHQ6LjkzNzVlbTt3aWR0aDowfTg0JXt0b3A6LjkzNzVlbTtyaWdodDowO3dpZHRoOjEuMTI1ZW19MTAwJXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1zaG93ezAle3RyYW5zZm9ybTpzY2FsZSguNyl9NDUle3RyYW5zZm9ybTpzY2FsZSgxLjA1KX04MCV7dHJhbnNmb3JtOnNjYWxlKC45NSl9MTAwJXt0cmFuc2Zvcm06c2NhbGUoMSl9fUBrZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06c2NhbGUoLjcpfTQ1JXt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9ODAle3RyYW5zZm9ybTpzY2FsZSguOTUpfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDEpfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItaGlkZXswJXt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTEwMCV7dHJhbnNmb3JtOnNjYWxlKC41KTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItaGlkZXswJXt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTEwMCV7dHJhbnNmb3JtOnNjYWxlKC41KTtvcGFjaXR5OjB9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOjEuMTg3NWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6MS4wNjI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOjIuMTg3NWVtO2xlZnQ6LS4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6MS4xODc1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDoxLjA2MjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6Mi4xODc1ZW07bGVmdDotLjM3NWVtO3dpZHRoOjMuMTI1ZW19ODQle3RvcDozZW07bGVmdDoxLjMxMjVlbTt3aWR0aDoxLjA2MjVlbX0xMDAle3RvcDoyLjgxMjVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW19fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nezAle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH02NSV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTg0JXt0b3A6Mi4xODc1ZW07cmlnaHQ6MDt3aWR0aDozLjQzNzVlbX0xMDAle3RvcDoyLjM3NWVtO3JpZ2h0Oi41ZW07d2lkdGg6Mi45Mzc1ZW19fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9NjUle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH04NCV7dG9wOjIuMTg3NWVtO3JpZ2h0OjA7d2lkdGg6My40Mzc1ZW19MTAwJXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZXswJXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QGtleWZyYW1lcyBzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lezAle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX01JXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9MTIle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmt7MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTUwJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LS4zNzVlbTt0cmFuc2Zvcm06c2NhbGUoMS4xNSl9MTAwJXttYXJnaW4tdG9wOjA7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFya3swJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9NTAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH04MCV7bWFyZ2luLXRvcDotLjM3NWVtO3RyYW5zZm9ybTpzY2FsZSgxLjE1KX0xMDAle21hcmdpbi10b3A6MDt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uezAle3RyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMCk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbnswJXt0cmFuc2Zvcm06cm90YXRlWCgxMDBkZWcpO29wYWNpdHk6MH0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgc3dhbDItcm90YXRlLWxvYWRpbmd7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFya3swJXt0cmFuc2Zvcm06cm90YXRlWSgtMzYwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGVZKDApfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFya3swJXt0cmFuc2Zvcm06cm90YXRlWSgtMzYwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGVZKDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1pLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpO29wYWNpdHk6MH0yNSV7dHJhbnNmb3JtOnJvdGF0ZVooLTI1ZGVnKTtvcGFjaXR5Oi40fTUwJXt0cmFuc2Zvcm06cm90YXRlWigxNWRlZyk7b3BhY2l0eTouOH03NSV7dHJhbnNmb3JtOnJvdGF0ZVooLTVkZWcpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWktbWFya3swJXt0cmFuc2Zvcm06cm90YXRlWig0NWRlZyk7b3BhY2l0eTowfTI1JXt0cmFuc2Zvcm06cm90YXRlWigtMjVkZWcpO29wYWNpdHk6LjR9NTAle3RyYW5zZm9ybTpyb3RhdGVaKDE1ZGVnKTtvcGFjaXR5Oi44fTc1JXt0cmFuc2Zvcm06cm90YXRlWigtNWRlZyk7b3BhY2l0eToxfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMCk7b3BhY2l0eToxfX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pe292ZXJmbG93OmhpZGRlbn1ib2R5LnN3YWwyLWhlaWdodC1hdXRve2hlaWdodDphdXRvIWltcG9ydGFudH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIgLnN3YWwyLXBvcHVwe3BvaW50ZXItZXZlbnRzOmFsbH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIgLnN3YWwyLW1vZGFse2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwuNCl9QG1lZGlhIHByaW50e2JvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bil7b3ZlcmZsb3cteTpzY3JvbGwhaW1wb3J0YW50fWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bik+W2FyaWEtaGlkZGVuPXRydWVde2Rpc3BsYXk6bm9uZX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pIC5zd2FsMi1jb250YWluZXJ7cG9zaXRpb246c3RhdGljIWltcG9ydGFudH19Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVye2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDozNjBweDttYXgtd2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3BvaW50ZXItZXZlbnRzOm5vbmV9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHt0b3A6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7dG9wOjA7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG99Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnR7dG9wOjA7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjB9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnR7dG9wOjUwJTtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye3RvcDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodHt0b3A6NTAlO3JpZ2h0OjA7Ym90dG9tOmF1dG87bGVmdDphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0e3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjA7bGVmdDowfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b217dG9wOmF1dG87cmlnaHQ6YXV0bztib3R0b206MDtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e3RvcDphdXRvO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDphdXRvfSIpOw=="},{"meta":{"name":"echarts.min.js","url":"https://lib.baomitu.com/echarts/4.6.0/echarts.min.js","ts":1637743664710,"mimetype":"text/javascript"},"source":"Ci8qCiogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQoqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQoqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQoqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoqCiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKgoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgoqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQoqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQoqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKiB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgohZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP2UoZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sZSk6ZSh0LmVjaGFydHM9e30pfSh0aGlzLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT0yMzExLG49ZnVuY3Rpb24oKXtyZXR1cm4gZSsrfSx2PSJvYmplY3QiPT10eXBlb2Ygd3gmJiJmdW5jdGlvbiI9PXR5cGVvZiB3eC5nZXRTeXN0ZW1JbmZvU3luYz97YnJvd3Nlcjp7fSxvczp7fSxub2RlOiExLHd4YTohMCxjYW52YXNTdXBwb3J0ZWQ6ITAsc3ZnU3VwcG9ydGVkOiExLHRvdWNoRXZlbnRzU3VwcG9ydGVkOiEwLGRvbVN1cHBvcnRlZDohMX06InVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudCYmInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3ticm93c2VyOnt9LG9zOnt9LG5vZGU6ITEsd29ya2VyOiEwLGNhbnZhc1N1cHBvcnRlZDohMCxkb21TdXBwb3J0ZWQ6ITF9OiJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yP3ticm93c2VyOnt9LG9zOnt9LG5vZGU6ITAsd29ya2VyOiExLGNhbnZhc1N1cHBvcnRlZDohMCxzdmdTdXBwb3J0ZWQ6ITAsZG9tU3VwcG9ydGVkOiExfTpmdW5jdGlvbih0KXt2YXIgZT17fSxpPXQubWF0Y2goL0ZpcmVmb3hcLyhbXGQuXSspLyksbj10Lm1hdGNoKC9NU0lFXHMoW1xkLl0rKS8pfHx0Lm1hdGNoKC9UcmlkZW50XC8uKz9ydjooKFtcZC5dKykpLyksbz10Lm1hdGNoKC9FZGdlXC8oW1xkLl0rKS8pLGE9L21pY3JvbWVzc2VuZ2VyL2kudGVzdCh0KTtpJiYoZS5maXJlZm94PSEwLGUudmVyc2lvbj1pWzFdKTtuJiYoZS5pZT0hMCxlLnZlcnNpb249blsxXSk7byYmKGUuZWRnZT0hMCxlLnZlcnNpb249b1sxXSk7YSYmKGUud2VDaGF0PSEwKTtyZXR1cm57YnJvd3NlcjplLG9zOnt9LG5vZGU6ITEsY2FudmFzU3VwcG9ydGVkOiEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCxzdmdTdXBwb3J0ZWQ6InVuZGVmaW5lZCIhPXR5cGVvZiBTVkdSZWN0LHRvdWNoRXZlbnRzU3VwcG9ydGVkOiJvbnRvdWNoc3RhcnQiaW4gd2luZG93JiYhZS5pZSYmIWUuZWRnZSxwb2ludGVyRXZlbnRzU3VwcG9ydGVkOiJvbnBvaW50ZXJkb3duImluIHdpbmRvdyYmKGUuZWRnZXx8ZS5pZSYmMTE8PWUudmVyc2lvbiksZG9tU3VwcG9ydGVkOiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnR9fShuYXZpZ2F0b3IudXNlckFnZW50KTt2YXIgcz17IltvYmplY3QgRnVuY3Rpb25dIjoxLCJbb2JqZWN0IFJlZ0V4cF0iOjEsIltvYmplY3QgRGF0ZV0iOjEsIltvYmplY3QgRXJyb3JdIjoxLCJbb2JqZWN0IENhbnZhc0dyYWRpZW50XSI6MSwiW29iamVjdCBDYW52YXNQYXR0ZXJuXSI6MSwiW29iamVjdCBJbWFnZV0iOjEsIltvYmplY3QgQ2FudmFzXSI6MX0sbD17IltvYmplY3QgSW50OEFycmF5XSI6MSwiW29iamVjdCBVaW50OEFycmF5XSI6MSwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOjEsIltvYmplY3QgSW50MTZBcnJheV0iOjEsIltvYmplY3QgVWludDE2QXJyYXldIjoxLCJbb2JqZWN0IEludDMyQXJyYXldIjoxLCJbb2JqZWN0IFVpbnQzMkFycmF5XSI6MSwiW29iamVjdCBGbG9hdDMyQXJyYXldIjoxLCJbb2JqZWN0IEZsb2F0NjRBcnJheV0iOjF9LHU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpPUFycmF5LnByb3RvdHlwZSxyPWkuZm9yRWFjaCxoPWkuZmlsdGVyLG89aS5zbGljZSxjPWkubWFwLGQ9aS5yZWR1Y2UsYT17fTtmdW5jdGlvbiBmKHQsZSl7ImNyZWF0ZUNhbnZhcyI9PT10JiYoeT1udWxsKSxhW3RdPWV9ZnVuY3Rpb24gRCh0KXtpZihudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuIHQ7dmFyIGU9dCxpPXUuY2FsbCh0KTtpZigiW29iamVjdCBBcnJheV0iPT09aSl7aWYoISQodCkpe2U9W107Zm9yKHZhciBuPTAsbz10Lmxlbmd0aDtuPG87bisrKWVbbl09RCh0W25dKX19ZWxzZSBpZihsW2ldKXtpZighJCh0KSl7dmFyIGE9dC5jb25zdHJ1Y3RvcjtpZih0LmNvbnN0cnVjdG9yLmZyb20pZT1hLmZyb20odCk7ZWxzZXtlPW5ldyBhKHQubGVuZ3RoKTtmb3Iobj0wLG89dC5sZW5ndGg7bjxvO24rKyllW25dPUQodFtuXSl9fX1lbHNlIGlmKCFzW2ldJiYhJCh0KSYmIUcodCkpZm9yKHZhciByIGluIGU9e30sdCl0Lmhhc093blByb3BlcnR5KHIpJiYoZVtyXT1EKHRbcl0pKTtyZXR1cm4gZX1mdW5jdGlvbiBtKHQsZSxpKXtpZighUihlKXx8IVIodCkpcmV0dXJuIGk/RChlKTp0O2Zvcih2YXIgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe3ZhciBvPXRbbl0sYT1lW25dOyFSKGEpfHwhUihvKXx8ayhhKXx8ayhvKXx8RyhhKXx8RyhvKXx8QihhKXx8QihvKXx8JChhKXx8JChvKT8haSYmbiBpbiB0fHwodFtuXT1EKGVbbl0pKTptKG8sYSxpKX1yZXR1cm4gdH1mdW5jdGlvbiBwKHQsZSl7Zm9yKHZhciBpPXRbMF0sbj0xLG89dC5sZW5ndGg7bjxvO24rKylpPW0oaSx0W25dLGUpO3JldHVybiBpfWZ1bmN0aW9uIEwodCxlKXtmb3IodmFyIGkgaW4gZSllLmhhc093blByb3BlcnR5KGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH1mdW5jdGlvbiBDKHQsZSxpKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoaT9udWxsIT1lW25dOm51bGw9PXRbbl0pJiYodFtuXT1lW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBnKCl7cmV0dXJuIGEuY3JlYXRlQ2FudmFzKCl9dmFyIHk7ZnVuY3Rpb24geCgpe3JldHVybiB5PXl8fGcoKS5nZXRDb250ZXh0KCIyZCIpfWZ1bmN0aW9uIF8odCxlKXtpZih0KXtpZih0LmluZGV4T2YpcmV0dXJuIHQuaW5kZXhPZihlKTtmb3IodmFyIGk9MCxuPXQubGVuZ3RoO2k8bjtpKyspaWYodFtpXT09PWUpcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gdyh0LGUpe3ZhciBpPXQucHJvdG90eXBlO2Z1bmN0aW9uIG4oKXt9Zm9yKHZhciBvIGluIG4ucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyBuLGkpaS5oYXNPd25Qcm9wZXJ0eShvKSYmKHQucHJvdG90eXBlW29dPWlbb10pOyh0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10KS5zdXBlckNsYXNzPWV9ZnVuY3Rpb24gYih0LGUsaSl7Qyh0PSJwcm90b3R5cGUiaW4gdD90LnByb3RvdHlwZTp0LGU9InByb3RvdHlwZSJpbiBlP2UucHJvdG90eXBlOmUsaSl9ZnVuY3Rpb24gUCh0KXtpZih0KXJldHVybiJzdHJpbmciIT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aH1mdW5jdGlvbiBFKHQsZSxpKXtpZih0JiZlKWlmKHQuZm9yRWFjaCYmdC5mb3JFYWNoPT09cil0LmZvckVhY2goZSxpKTtlbHNlIGlmKHQubGVuZ3RoPT09K3QubGVuZ3RoKWZvcih2YXIgbj0wLG89dC5sZW5ndGg7bjxvO24rKyllLmNhbGwoaSx0W25dLG4sdCk7ZWxzZSBmb3IodmFyIGEgaW4gdCl0Lmhhc093blByb3BlcnR5KGEpJiZlLmNhbGwoaSx0W2FdLGEsdCl9ZnVuY3Rpb24gTih0LGUsaSl7aWYodCYmZSl7aWYodC5tYXAmJnQubWFwPT09YylyZXR1cm4gdC5tYXAoZSxpKTtmb3IodmFyIG49W10sbz0wLGE9dC5sZW5ndGg7bzxhO28rKyluLnB1c2goZS5jYWxsKGksdFtvXSxvLHQpKTtyZXR1cm4gbn19ZnVuY3Rpb24gUyh0LGUsaSxuKXtpZih0JiZlKXtpZih0LnJlZHVjZSYmdC5yZWR1Y2U9PT1kKXJldHVybiB0LnJlZHVjZShlLGksbik7Zm9yKHZhciBvPTAsYT10Lmxlbmd0aDtvPGE7bysrKWk9ZS5jYWxsKG4saSx0W29dLG8sdCk7cmV0dXJuIGl9fWZ1bmN0aW9uIE0odCxlLGkpe2lmKHQmJmUpe2lmKHQuZmlsdGVyJiZ0LmZpbHRlcj09PWgpcmV0dXJuIHQuZmlsdGVyKGUsaSk7Zm9yKHZhciBuPVtdLG89MCxhPXQubGVuZ3RoO288YTtvKyspZS5jYWxsKGksdFtvXSxvLHQpJiZuLnB1c2godFtvXSk7cmV0dXJuIG59fWZ1bmN0aW9uIEkodCxlLGkpe2lmKHQmJmUpZm9yKHZhciBuPTAsbz10Lmxlbmd0aDtuPG87bisrKWlmKGUuY2FsbChpLHRbbl0sbix0KSlyZXR1cm4gdFtuXX1mdW5jdGlvbiBBKHQsZSl7dmFyIGk9by5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGkuY29uY2F0KG8uY2FsbChhcmd1bWVudHMpKSl9fWZ1bmN0aW9uIFQodCl7dmFyIGU9by5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseSh0aGlzLGUuY29uY2F0KG8uY2FsbChhcmd1bWVudHMpKSl9fWZ1bmN0aW9uIGsodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PXUuY2FsbCh0KX1mdW5jdGlvbiBPKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHoodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT11LmNhbGwodCl9ZnVuY3Rpb24gUih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4iZnVuY3Rpb24iPT1lfHwhIXQmJiJvYmplY3QiPT1lfWZ1bmN0aW9uIEIodCl7cmV0dXJuISFzW3UuY2FsbCh0KV19ZnVuY3Rpb24gVih0KXtyZXR1cm4hIWxbdS5jYWxsKHQpXX1mdW5jdGlvbiBHKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiB0Lm5vZGVUeXBlJiYib2JqZWN0Ij09dHlwZW9mIHQub3duZXJEb2N1bWVudH1mdW5jdGlvbiBGKHQpe3JldHVybiB0IT10fWZ1bmN0aW9uIFcodCl7Zm9yKHZhciBlPTAsaT1hcmd1bWVudHMubGVuZ3RoO2U8aTtlKyspaWYobnVsbCE9YXJndW1lbnRzW2VdKXJldHVybiBhcmd1bWVudHNbZV19ZnVuY3Rpb24gSCh0LGUpe3JldHVybiBudWxsIT10P3Q6ZX1mdW5jdGlvbiBaKHQsZSxpKXtyZXR1cm4gbnVsbCE9dD90Om51bGwhPWU/ZTppfWZ1bmN0aW9uIFUoKXtyZXR1cm4gRnVuY3Rpb24uY2FsbC5hcHBseShvLGFyZ3VtZW50cyl9ZnVuY3Rpb24gWCh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuW3QsdCx0LHRdO3ZhciBlPXQubGVuZ3RoO3JldHVybiAyPT09ZT9bdFswXSx0WzFdLHRbMF0sdFsxXV06Mz09PWU/W3RbMF0sdFsxXSx0WzJdLHRbMV1dOnR9ZnVuY3Rpb24gWSh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcihlKX1mdW5jdGlvbiBqKHQpe3JldHVybiBudWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLCIiKX1hLmNyZWF0ZUNhbnZhcz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKX07dmFyIHE9Il9fZWNfcHJpbWl0aXZlX18iO2Z1bmN0aW9uIEsodCl7dFtxXT0hMH1mdW5jdGlvbiAkKHQpe3JldHVybiB0W3FdfWZ1bmN0aW9uIEoodCl7dmFyIGk9ayh0KTt0aGlzLmRhdGE9e307dmFyIG49dGhpcztmdW5jdGlvbiBlKHQsZSl7aT9uLnNldCh0LGUpOm4uc2V0KGUsdCl9dCBpbnN0YW5jZW9mIEo/dC5lYWNoKGUpOnQmJkUodCxlKX1mdW5jdGlvbiBRKHQpe3JldHVybiBuZXcgSih0KX1mdW5jdGlvbiB0dCh0LGUpe2Zvcih2YXIgaT1uZXcgdC5jb25zdHJ1Y3Rvcih0Lmxlbmd0aCtlLmxlbmd0aCksbj0wO248dC5sZW5ndGg7bisrKWlbbl09dFtuXTt2YXIgbz10Lmxlbmd0aDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKWlbbitvXT1lW25dO3JldHVybiBpfWZ1bmN0aW9uIGV0KCl7fUoucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKLGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhLmhhc093blByb3BlcnR5KHQpP3RoaXMuZGF0YVt0XTpudWxsfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdPWV9LGVhY2g6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gdm9pZCAwIT09ZSYmKHQ9QSh0LGUpKSx0aGlzLmRhdGEpdGhpcy5kYXRhLmhhc093blByb3BlcnR5KGkpJiZ0KHRoaXMuZGF0YVtpXSxpKX0scmVtb3ZlS2V5OmZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLmRhdGFbdF19fTt2YXIgaXQ9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoeyRvdmVycmlkZTpmLGNsb25lOkQsbWVyZ2U6bSxtZXJnZUFsbDpwLGV4dGVuZDpMLGRlZmF1bHRzOkMsY3JlYXRlQ2FudmFzOmcsZ2V0Q29udGV4dDp4LGluZGV4T2Y6Xyxpbmhlcml0czp3LG1peGluOmIsaXNBcnJheUxpa2U6UCxlYWNoOkUsbWFwOk4scmVkdWNlOlMsZmlsdGVyOk0sZmluZDpJLGJpbmQ6QSxjdXJyeTpULGlzQXJyYXk6ayxpc0Z1bmN0aW9uOk8saXNTdHJpbmc6eixpc09iamVjdDpSLGlzQnVpbHRJbk9iamVjdDpCLGlzVHlwZWRBcnJheTpWLGlzRG9tOkcsZXFOYU46RixyZXRyaWV2ZTpXLHJldHJpZXZlMjpILHJldHJpZXZlMzpaLHNsaWNlOlUsbm9ybWFsaXplQ3NzQXJyYXk6WCxhc3NlcnQ6WSx0cmltOmosc2V0QXNQcmltaXRpdmU6Syxpc1ByaW1pdGl2ZTokLGNyZWF0ZUhhc2hNYXA6USxjb25jYXRBcnJheTp0dCxub29wOmV0fSksbnQ9InVuZGVmaW5lZCI9PXR5cGVvZiBGbG9hdDMyQXJyYXk/QXJyYXk6RmxvYXQzMkFycmF5O2Z1bmN0aW9uIG90KHQsZSl7dmFyIGk9bmV3IG50KDIpO3JldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1lJiYoZT0wKSxpWzBdPXQsaVsxXT1lLGl9ZnVuY3Rpb24gYXQodCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0fWZ1bmN0aW9uIHJ0KHQpe3ZhciBlPW5ldyBudCgyKTtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlfWZ1bmN0aW9uIHN0KHQsZSxpKXtyZXR1cm4gdFswXT1lLHRbMV09aSx0fWZ1bmN0aW9uIGx0KHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdK2lbMF0sdFsxXT1lWzFdK2lbMV0sdH1mdW5jdGlvbiB1dCh0LGUsaSxuKXtyZXR1cm4gdFswXT1lWzBdK2lbMF0qbix0WzFdPWVbMV0raVsxXSpuLHR9ZnVuY3Rpb24gaHQodCxlLGkpe3JldHVybiB0WzBdPWVbMF0taVswXSx0WzFdPWVbMV0taVsxXSx0fWZ1bmN0aW9uIGN0KHQpe3JldHVybiBNYXRoLnNxcnQoZnQodCkpfXZhciBkdD1jdDtmdW5jdGlvbiBmdCh0KXtyZXR1cm4gdFswXSp0WzBdK3RbMV0qdFsxXX12YXIgcHQ9ZnQ7ZnVuY3Rpb24gZ3QodCxlLGkpe3JldHVybiB0WzBdPWVbMF0qaSx0WzFdPWVbMV0qaSx0fWZ1bmN0aW9uIG10KHQsZSl7dmFyIGk9Y3QoZSk7cmV0dXJuIDA9PT1pPyh0WzBdPTAsdFsxXT0wKToodFswXT1lWzBdL2ksdFsxXT1lWzFdL2kpLHR9ZnVuY3Rpb24gdnQodCxlKXtyZXR1cm4gTWF0aC5zcXJ0KCh0WzBdLWVbMF0pKih0WzBdLWVbMF0pKyh0WzFdLWVbMV0pKih0WzFdLWVbMV0pKX12YXIgeXQ9dnQ7ZnVuY3Rpb24geHQodCxlKXtyZXR1cm4odFswXS1lWzBdKSoodFswXS1lWzBdKSsodFsxXS1lWzFdKSoodFsxXS1lWzFdKX12YXIgX3Q9eHQ7ZnVuY3Rpb24gd3QodCxlLGksbil7cmV0dXJuIHRbMF09ZVswXStuKihpWzBdLWVbMF0pLHRbMV09ZVsxXStuKihpWzFdLWVbMV0pLHR9ZnVuY3Rpb24gYnQodCxlLGkpe3ZhciBuPWVbMF0sbz1lWzFdO3JldHVybiB0WzBdPWlbMF0qbitpWzJdKm8raVs0XSx0WzFdPWlbMV0qbitpWzNdKm8raVs1XSx0fWZ1bmN0aW9uIFN0KHQsZSxpKXtyZXR1cm4gdFswXT1NYXRoLm1pbihlWzBdLGlbMF0pLHRbMV09TWF0aC5taW4oZVsxXSxpWzFdKSx0fWZ1bmN0aW9uIE10KHQsZSxpKXtyZXR1cm4gdFswXT1NYXRoLm1heChlWzBdLGlbMF0pLHRbMV09TWF0aC5tYXgoZVsxXSxpWzFdKSx0fXZhciBJdD0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7Y3JlYXRlOm90LGNvcHk6YXQsY2xvbmU6cnQsc2V0OnN0LGFkZDpsdCxzY2FsZUFuZEFkZDp1dCxzdWI6aHQsbGVuOmN0LGxlbmd0aDpkdCxsZW5TcXVhcmU6ZnQsbGVuZ3RoU3F1YXJlOnB0LG11bDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbMF09ZVswXSppWzBdLHRbMV09ZVsxXSppWzFdLHR9LGRpdjpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbMF09ZVswXS9pWzBdLHRbMV09ZVsxXS9pWzFdLHR9LGRvdDpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdfSxzY2FsZTpndCxub3JtYWxpemU6bXQsZGlzdGFuY2U6dnQsZGlzdDp5dCxkaXN0YW5jZVNxdWFyZTp4dCxkaXN0U3F1YXJlOl90LG5lZ2F0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdH0sbGVycDp3dCxhcHBseVRyYW5zZm9ybTpidCxtaW46U3QsbWF4Ok10fSk7ZnVuY3Rpb24gVHQoKXt0aGlzLm9uKCJtb3VzZWRvd24iLHRoaXMuX2RyYWdTdGFydCx0aGlzKSx0aGlzLm9uKCJtb3VzZW1vdmUiLHRoaXMuX2RyYWcsdGhpcyksdGhpcy5vbigibW91c2V1cCIsdGhpcy5fZHJhZ0VuZCx0aGlzKX1mdW5jdGlvbiBBdCh0LGUpe3JldHVybnt0YXJnZXQ6dCx0b3BUYXJnZXQ6ZSYmZS50b3BUYXJnZXR9fVR0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6VHQsX2RyYWdTdGFydDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtlJiZlLmRyYWdnYWJsZSYmKCh0aGlzLl9kcmFnZ2luZ1RhcmdldD1lKS5kcmFnZ2luZz0hMCx0aGlzLl94PXQub2Zmc2V0WCx0aGlzLl95PXQub2Zmc2V0WSx0aGlzLmRpc3BhdGNoVG9FbGVtZW50KEF0KGUsdCksImRyYWdzdGFydCIsdC5ldmVudCkpfSxfZHJhZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9kcmFnZ2luZ1RhcmdldDtpZihlKXt2YXIgaT10Lm9mZnNldFgsbj10Lm9mZnNldFksbz1pLXRoaXMuX3gsYT1uLXRoaXMuX3k7dGhpcy5feD1pLHRoaXMuX3k9bixlLmRyaWZ0KG8sYSx0KSx0aGlzLmRpc3BhdGNoVG9FbGVtZW50KEF0KGUsdCksImRyYWciLHQuZXZlbnQpO3ZhciByPXRoaXMuZmluZEhvdmVyKGksbixlKS50YXJnZXQscz10aGlzLl9kcm9wVGFyZ2V0O2UhPT0odGhpcy5fZHJvcFRhcmdldD1yKSYmKHMmJnIhPT1zJiZ0aGlzLmRpc3BhdGNoVG9FbGVtZW50KEF0KHMsdCksImRyYWdsZWF2ZSIsdC5ldmVudCksciYmciE9PXMmJnRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQoQXQocix0KSwiZHJhZ2VudGVyIix0LmV2ZW50KSl9fSxfZHJhZ0VuZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9kcmFnZ2luZ1RhcmdldDtlJiYoZS5kcmFnZ2luZz0hMSksdGhpcy5kaXNwYXRjaFRvRWxlbWVudChBdChlLHQpLCJkcmFnZW5kIix0LmV2ZW50KSx0aGlzLl9kcm9wVGFyZ2V0JiZ0aGlzLmRpc3BhdGNoVG9FbGVtZW50KEF0KHRoaXMuX2Ryb3BUYXJnZXQsdCksImRyb3AiLHQuZXZlbnQpLHRoaXMuX2RyYWdnaW5nVGFyZ2V0PW51bGwsdGhpcy5fZHJvcFRhcmdldD1udWxsfX07dmFyIER0PUFycmF5LnByb3RvdHlwZS5zbGljZSxDdD1mdW5jdGlvbih0KXt0aGlzLl8kaGFuZGxlcnM9e30sdGhpcy5fJGV2ZW50UHJvY2Vzc29yPXR9O2Z1bmN0aW9uIEx0KHQsZSxpLG4sbyxhKXt2YXIgcj10Ll8kaGFuZGxlcnM7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJihvPW4sbj1pLGk9bnVsbCksIW58fCFlKXJldHVybiB0O2k9ZnVuY3Rpb24odCxlKXt2YXIgaT10Ll8kZXZlbnRQcm9jZXNzb3I7cmV0dXJuIG51bGwhPWUmJmkmJmkubm9ybWFsaXplUXVlcnkmJihlPWkubm9ybWFsaXplUXVlcnkoZSkpLGV9KHQsaSkscltlXXx8KHJbZV09W10pO2Zvcih2YXIgcz0wO3M8cltlXS5sZW5ndGg7cysrKWlmKHJbZV1bc10uaD09PW4pcmV0dXJuIHQ7dmFyIGw9e2g6bixvbmU6YSxxdWVyeTppLGN0eDpvfHx0LGNhbGxBdExhc3Q6bi56ckV2ZW50ZnVsQ2FsbEF0TGFzdH0sdT1yW2VdLmxlbmd0aC0xLGg9cltlXVt1XTtyZXR1cm4gaCYmaC5jYWxsQXRMYXN0P3JbZV0uc3BsaWNlKHUsMCxsKTpyW2VdLnB1c2gobCksdH1DdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkN0LG9uZTpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gTHQodGhpcyx0LGUsaSxuLCEwKX0sb246ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIEx0KHRoaXMsdCxlLGksbiwhMSl9LGlzU2lsZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuXyRoYW5kbGVycztyZXR1cm4hZVt0XXx8IWVbdF0ubGVuZ3RofSxvZmY6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl8kaGFuZGxlcnM7aWYoIXQpcmV0dXJuIHRoaXMuXyRoYW5kbGVycz17fSx0aGlzO2lmKGUpe2lmKGlbdF0pe2Zvcih2YXIgbj1bXSxvPTAsYT1pW3RdLmxlbmd0aDtvPGE7bysrKWlbdF1bb10uaCE9PWUmJm4ucHVzaChpW3RdW29dKTtpW3RdPW59aVt0XSYmMD09PWlbdF0ubGVuZ3RoJiZkZWxldGUgaVt0XX1lbHNlIGRlbGV0ZSBpW3RdO3JldHVybiB0aGlzfSx0cmlnZ2VyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuXyRoYW5kbGVyc1t0XSxpPXRoaXMuXyRldmVudFByb2Nlc3NvcjtpZihlKXt2YXIgbj1hcmd1bWVudHMsbz1uLmxlbmd0aDszPG8mJihuPUR0LmNhbGwobiwxKSk7Zm9yKHZhciBhPWUubGVuZ3RoLHI9MDtyPGE7KXt2YXIgcz1lW3JdO2lmKGkmJmkuZmlsdGVyJiZudWxsIT1zLnF1ZXJ5JiYhaS5maWx0ZXIodCxzLnF1ZXJ5KSlyKys7ZWxzZXtzd2l0Y2gobyl7Y2FzZSAxOnMuaC5jYWxsKHMuY3R4KTticmVhaztjYXNlIDI6cy5oLmNhbGwocy5jdHgsblsxXSk7YnJlYWs7Y2FzZSAzOnMuaC5jYWxsKHMuY3R4LG5bMV0sblsyXSk7YnJlYWs7ZGVmYXVsdDpzLmguYXBwbHkocy5jdHgsbil9cy5vbmU/KGUuc3BsaWNlKHIsMSksYS0tKTpyKyt9fX1yZXR1cm4gaSYmaS5hZnRlclRyaWdnZXImJmkuYWZ0ZXJUcmlnZ2VyKHQpLHRoaXN9LHRyaWdnZXJXaXRoQ29udGV4dDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl8kaGFuZGxlcnNbdF0saT10aGlzLl8kZXZlbnRQcm9jZXNzb3I7aWYoZSl7dmFyIG49YXJndW1lbnRzLG89bi5sZW5ndGg7NDxvJiYobj1EdC5jYWxsKG4sMSxuLmxlbmd0aC0xKSk7Zm9yKHZhciBhPW5bbi5sZW5ndGgtMV0scj1lLmxlbmd0aCxzPTA7czxyOyl7dmFyIGw9ZVtzXTtpZihpJiZpLmZpbHRlciYmbnVsbCE9bC5xdWVyeSYmIWkuZmlsdGVyKHQsbC5xdWVyeSkpcysrO2Vsc2V7c3dpdGNoKG8pe2Nhc2UgMTpsLmguY2FsbChhKTticmVhaztjYXNlIDI6bC5oLmNhbGwoYSxuWzFdKTticmVhaztjYXNlIDM6bC5oLmNhbGwoYSxuWzFdLG5bMl0pO2JyZWFrO2RlZmF1bHQ6bC5oLmFwcGx5KGEsbil9bC5vbmU/KGUuc3BsaWNlKHMsMSksci0tKTpzKyt9fX1yZXR1cm4gaSYmaS5hZnRlclRyaWdnZXImJmkuYWZ0ZXJUcmlnZ2VyKHQpLHRoaXN9fTt2YXIga3Q9TWF0aC5sb2coMik7ZnVuY3Rpb24gUHQodCxlLGksbixvLGEpe3ZhciByPW4rIi0iK28scz10Lmxlbmd0aDtpZihhLmhhc093blByb3BlcnR5KHIpKXJldHVybiBhW3JdO2lmKDE9PT1lKXt2YXIgbD1NYXRoLnJvdW5kKE1hdGgubG9nKCgxPDxzKS0xJn5vKS9rdCk7cmV0dXJuIHRbaV1bbF19Zm9yKHZhciB1PW58MTw8aSxoPWkrMTtuJjE8PGg7KWgrKztmb3IodmFyIGM9MCxkPTAsZj0wO2Q8cztkKyspe3ZhciBwPTE8PGQ7cCZvfHwoYys9KGYlMj8tMToxKSp0W2ldW2RdKlB0KHQsZS0xLGgsdSxvfHAsYSksZisrKX1yZXR1cm4gYVtyXT1jfXZhciBOdD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmISF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcixPdD0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sRXQ9Il9fX3pyRVZFTlRTQVZFRCIsenQ9W107ZnVuY3Rpb24gUnQodCxlLGksbil7cmV0dXJuIGk9aXx8e30sbnx8IXYuY2FudmFzU3VwcG9ydGVkP0J0KHQsZSxpKTp2LmJyb3dzZXIuZmlyZWZveCYmbnVsbCE9ZS5sYXllclgmJmUubGF5ZXJYIT09ZS5vZmZzZXRYPyhpLnpyWD1lLmxheWVyWCxpLnpyWT1lLmxheWVyWSk6bnVsbCE9ZS5vZmZzZXRYPyhpLnpyWD1lLm9mZnNldFgsaS56clk9ZS5vZmZzZXRZKTpCdCh0LGUsaSksaX1mdW5jdGlvbiBCdCh0LGUsaSl7aWYodC5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJnYuZG9tU3VwcG9ydGVkKXt2YXIgbj1lLmNsaWVudFgsbz1lLmNsaWVudFk7aWYoIkNBTlZBUyI9PT10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpe3ZhciBhPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIGkuenJYPW4tYS5sZWZ0LHZvaWQoaS56clk9by1hLnRvcCl9dmFyIHI9dFtFdF18fCh0W0V0XT17fSkscz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1lLnRyYW5zZm9ybWVyLG49ZS5zcmNDb29yZHMsbz0hMCxhPVtdLHI9W10scz0wO3M8NDtzKyspe3ZhciBsPXRbc10uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdT0yKnMsaD1sLmxlZnQsYz1sLnRvcDthLnB1c2goaCxjKSxvJj1uJiZoPT09blt1XSYmYz09PW5bMSt1XSxyLnB1c2godFtzXS5vZmZzZXRMZWZ0LHRbc10ub2Zmc2V0VG9wKX1yZXR1cm4gbz9pOihlLnNyY0Nvb3Jkcz1hLGUudHJhbnNmb3JtZXI9ZnVuY3Rpb24odCxlKXt2YXIgaT1bW3RbMF0sdFsxXSwxLDAsMCwwLC1lWzBdKnRbMF0sLWVbMF0qdFsxXV0sWzAsMCwwLHRbMF0sdFsxXSwxLC1lWzFdKnRbMF0sLWVbMV0qdFsxXV0sW3RbMl0sdFszXSwxLDAsMCwwLC1lWzJdKnRbMl0sLWVbMl0qdFszXV0sWzAsMCwwLHRbMl0sdFszXSwxLC1lWzNdKnRbMl0sLWVbM10qdFszXV0sW3RbNF0sdFs1XSwxLDAsMCwwLC1lWzRdKnRbNF0sLWVbNF0qdFs1XV0sWzAsMCwwLHRbNF0sdFs1XSwxLC1lWzVdKnRbNF0sLWVbNV0qdFs1XV0sW3RbNl0sdFs3XSwxLDAsMCwwLC1lWzZdKnRbNl0sLWVbNl0qdFs3XV0sWzAsMCwwLHRbNl0sdFs3XSwxLC1lWzddKnRbNl0sLWVbN10qdFs3XV1dLG49e30sbz1QdChpLDgsMCwwLDAsbik7aWYoMCE9PW8pe2Zvcih2YXIgYT1bXSxyPTA7cjw4O3IrKylmb3IodmFyIHM9MDtzPDg7cysrKW51bGw9PWFbc10mJihhW3NdPTApLGFbc10rPSgocitzKSUyPy0xOjEpKlB0KGksNywwPT09cj8xOjAsMTw8ciwxPDxzLG4pL28qZVtyXTtyZXR1cm4gZnVuY3Rpb24odCxlLGkpe3ZhciBuPWUqYVs2XStpKmFbN10rMTt0WzBdPShlKmFbMF0raSphWzFdK2FbMl0pL24sdFsxXT0oZSphWzNdK2kqYVs0XSthWzVdKS9ufX19KGEscikpfShmdW5jdGlvbih0LGUpe3ZhciBpPWUubWFya2VycztpZihpKXJldHVybiBpO2k9ZS5tYXJrZXJzPVtdO2Zvcih2YXIgbj1bImxlZnQiLCJyaWdodCJdLG89WyJ0b3AiLCJib3R0b20iXSxhPTA7YTw0O2ErKyl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikscz1yLnN0eWxlLGw9YSUyLHU9KGE+PjEpJTI7cy5jc3NUZXh0PVsicG9zaXRpb246YWJzb2x1dGUiLCJ2aXNpYmlsaXR5OiBoaWRkZW4iLCJwYWRkaW5nOiAwIiwibWFyZ2luOiAwIiwiYm9yZGVyLXdpZHRoOiAwIiwid2lkdGg6MCIsImhlaWdodDowIixuW2xdKyI6MCIsb1t1XSsiOjAiLG5bMS1sXSsiOmF1dG8iLG9bMS11XSsiOmF1dG8iLCIiXS5qb2luKCIhaW1wb3J0YW50OyIpLHQuYXBwZW5kQ2hpbGQociksaS5wdXNoKHIpfXJldHVybiBpfSh0LHIpLHIpO2lmKHMpcmV0dXJuIHMoenQsbixvKSxpLnpyWD16dFswXSx2b2lkKGkuenJZPXp0WzFdKX1pLnpyWD1pLnpyWT0wfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiB0fHx3aW5kb3cuZXZlbnR9ZnVuY3Rpb24gR3QodCxlLGkpe2lmKG51bGwhPShlPVZ0KGUpKS56clgpcmV0dXJuIGU7dmFyIG49ZS50eXBlO2lmKG4mJjA8PW4uaW5kZXhPZigidG91Y2giKSl7dmFyIG89InRvdWNoZW5kIiE9PW4/ZS50YXJnZXRUb3VjaGVzWzBdOmUuY2hhbmdlZFRvdWNoZXNbMF07byYmUnQodCxvLGUsaSl9ZWxzZSBSdCh0LGUsZSxpKSxlLnpyRGVsdGE9ZS53aGVlbERlbHRhP2Uud2hlZWxEZWx0YS8xMjA6LShlLmRldGFpbHx8MCkvMzt2YXIgYT1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmdm9pZCAwIT09YSYmT3QudGVzdChlLnR5cGUpJiYoZS53aGljaD0xJmE/MToyJmE/Mzo0JmE/MjowKSxlfWZ1bmN0aW9uIEZ0KHQsZSxpLG4pe050P3QuYWRkRXZlbnRMaXN0ZW5lcihlLGksbik6dC5hdHRhY2hFdmVudCgib24iK2UsaSl9dmFyIFd0PU50P2Z1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHQuY2FuY2VsQnViYmxlPSEwfTpmdW5jdGlvbih0KXt0LnJldHVyblZhbHVlPSExLHQuY2FuY2VsQnViYmxlPSEwfTtmdW5jdGlvbiBIdCh0KXtyZXR1cm4gMj09PXQud2hpY2h8fDM9PT10LndoaWNofWZ1bmN0aW9uIFp0KCl7dGhpcy5fdHJhY2s9W119ZnVuY3Rpb24gVXQodCl7dmFyIGU9dFsxXVswXS10WzBdWzBdLGk9dFsxXVsxXS10WzBdWzFdO3JldHVybiBNYXRoLnNxcnQoZSplK2kqaSl9WnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpadCxyZWNvZ25pemU6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLl9kb1RyYWNrKHQsZSxpKSx0aGlzLl9yZWNvZ25pemUodCl9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RyYWNrLmxlbmd0aD0wLHRoaXN9LF9kb1RyYWNrOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LnRvdWNoZXM7aWYobil7Zm9yKHZhciBvPXtwb2ludHM6W10sdG91Y2hlczpbXSx0YXJnZXQ6ZSxldmVudDp0fSxhPTAscj1uLmxlbmd0aDthPHI7YSsrKXt2YXIgcz1uW2FdLGw9UnQoaSxzLHt9KTtvLnBvaW50cy5wdXNoKFtsLnpyWCxsLnpyWV0pLG8udG91Y2hlcy5wdXNoKHMpfXRoaXMuX3RyYWNrLnB1c2gobyl9fSxfcmVjb2duaXplOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiBYdClpZihYdC5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIGk9WHRbZV0odGhpcy5fdHJhY2ssdCk7aWYoaSlyZXR1cm4gaX19fTt2YXIgWHQ9e3BpbmNoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5sZW5ndGg7aWYoaSl7dmFyIG49KHRbaS0xXXx8e30pLnBvaW50cyxvPSh0W2ktMl18fHt9KS5wb2ludHN8fG47aWYobyYmMTxvLmxlbmd0aCYmbiYmMTxuLmxlbmd0aCl7dmFyIGE9VXQobikvVXQobyk7aXNGaW5pdGUoYSl8fChhPTEpLGUucGluY2hTY2FsZT1hO3ZhciByPWZ1bmN0aW9uKHQpe3JldHVyblsodFswXVswXSt0WzFdWzBdKS8yLCh0WzBdWzFdK3RbMV1bMV0pLzJdfShuKTtyZXR1cm4gZS5waW5jaFg9clswXSxlLnBpbmNoWT1yWzFdLHt0eXBlOiJwaW5jaCIsdGFyZ2V0OnRbMF0udGFyZ2V0LGV2ZW50OmV9fX19fSxZdD0ic2lsZW50IjtmdW5jdGlvbiBqdCgpe1d0KHRoaXMuZXZlbnQpfWZ1bmN0aW9uIHF0KCl7fXF0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBLdCh0LGUsaSxuKXtDdC5jYWxsKHRoaXMpLHRoaXMuc3RvcmFnZT10LHRoaXMucGFpbnRlcj1lLHRoaXMucGFpbnRlclJvb3Q9bixpPWl8fG5ldyBxdCx0aGlzLnByb3h5PW51bGwsdGhpcy5faG92ZXJlZD17fSx0aGlzLl9sYXN0VG91Y2hNb21lbnQsdGhpcy5fbGFzdFgsdGhpcy5fbGFzdFksdGhpcy5fZ2VzdHVyZU1ncixUdC5jYWxsKHRoaXMpLHRoaXMuc2V0SGFuZGxlclByb3h5KGkpfXZhciAkdD1bImNsaWNrIiwiZGJsY2xpY2siLCJtb3VzZXdoZWVsIiwibW91c2VvdXQiLCJtb3VzZXVwIiwibW91c2Vkb3duIiwibW91c2Vtb3ZlIiwiY29udGV4dG1lbnUiXTtmdW5jdGlvbiBKdCh0LGUsaSl7aWYodFt0LnJlY3RIb3Zlcj8icmVjdENvbnRhaW4iOiJjb250YWluIl0oZSxpKSl7Zm9yKHZhciBuLG89dDtvOyl7aWYoby5jbGlwUGF0aCYmIW8uY2xpcFBhdGguY29udGFpbihlLGkpKXJldHVybiExO28uc2lsZW50JiYobj0hMCksbz1vLnBhcmVudH1yZXR1cm4hbnx8WXR9cmV0dXJuITF9ZnVuY3Rpb24gUXQodCxlLGkpe3ZhciBuPXQucGFpbnRlcjtyZXR1cm4gZTwwfHxlPm4uZ2V0V2lkdGgoKXx8aTwwfHxpPm4uZ2V0SGVpZ2h0KCl9S3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpLdCxzZXRIYW5kbGVyUHJveHk6ZnVuY3Rpb24oZSl7dGhpcy5wcm94eSYmdGhpcy5wcm94eS5kaXNwb3NlKCksZSYmKEUoJHQsZnVuY3Rpb24odCl7ZS5vbiYmZS5vbih0LHRoaXNbdF0sdGhpcyl9LHRoaXMpLGUuaGFuZGxlcj10aGlzKSx0aGlzLnByb3h5PWV9LG1vdXNlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10LnpyWCxpPXQuenJZLG49UXQodGhpcyxlLGkpLG89dGhpcy5faG92ZXJlZCxhPW8udGFyZ2V0O2EmJiFhLl9fenImJihhPShvPXRoaXMuZmluZEhvdmVyKG8ueCxvLnkpKS50YXJnZXQpO3ZhciByPXRoaXMuX2hvdmVyZWQ9bj97eDplLHk6aX06dGhpcy5maW5kSG92ZXIoZSxpKSxzPXIudGFyZ2V0LGw9dGhpcy5wcm94eTtsLnNldEN1cnNvciYmbC5zZXRDdXJzb3Iocz9zLmN1cnNvcjoiZGVmYXVsdCIpLGEmJnMhPT1hJiZ0aGlzLmRpc3BhdGNoVG9FbGVtZW50KG8sIm1vdXNlb3V0Iix0KSx0aGlzLmRpc3BhdGNoVG9FbGVtZW50KHIsIm1vdXNlbW92ZSIsdCkscyYmcyE9PWEmJnRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQociwibW91c2VvdmVyIix0KX0sbW91c2VvdXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC56ckV2ZW50Q29udHJvbCxpPXQuenJJc1RvTG9jYWxET007Im9ubHlfZ2xvYmFsb3V0IiE9PWUmJnRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQodGhpcy5faG92ZXJlZCwibW91c2VvdXQiLHQpLCJub19nbG9iYWxvdXQiIT09ZSYmKGl8fHRoaXMudHJpZ2dlcigiZ2xvYmFsb3V0Iix7dHlwZToiZ2xvYmFsb3V0IixldmVudDp0fSkpfSxyZXNpemU6ZnVuY3Rpb24odCl7dGhpcy5faG92ZXJlZD17fX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzW3RdO2kmJmkuY2FsbCh0aGlzLGUpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5wcm94eS5kaXNwb3NlKCksdGhpcy5zdG9yYWdlPXRoaXMucHJveHk9dGhpcy5wYWludGVyPW51bGx9LHNldEN1cnNvclN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJveHk7ZS5zZXRDdXJzb3ImJmUuc2V0Q3Vyc29yKHQpfSxkaXNwYXRjaFRvRWxlbWVudDpmdW5jdGlvbih0LGUsaSl7dmFyIG49KHQ9dHx8e30pLnRhcmdldDtpZighbnx8IW4uc2lsZW50KXtmb3IodmFyIG89Im9uIitlLGE9ZnVuY3Rpb24odCxlLGkpe3JldHVybnt0eXBlOnQsZXZlbnQ6aSx0YXJnZXQ6ZS50YXJnZXQsdG9wVGFyZ2V0OmUudG9wVGFyZ2V0LGNhbmNlbEJ1YmJsZTohMSxvZmZzZXRYOmkuenJYLG9mZnNldFk6aS56clksZ2VzdHVyZUV2ZW50OmkuZ2VzdHVyZUV2ZW50LHBpbmNoWDppLnBpbmNoWCxwaW5jaFk6aS5waW5jaFkscGluY2hTY2FsZTppLnBpbmNoU2NhbGUsd2hlZWxEZWx0YTppLnpyRGVsdGEsenJCeVRvdWNoOmkuenJCeVRvdWNoLHdoaWNoOmkud2hpY2gsc3RvcDpqdH19KGUsdCxpKTtuJiYobltvXSYmKGEuY2FuY2VsQnViYmxlPW5bb10uY2FsbChuLGEpKSxuLnRyaWdnZXIoZSxhKSxuPW4ucGFyZW50LCFhLmNhbmNlbEJ1YmJsZSk7KTthLmNhbmNlbEJ1YmJsZXx8KHRoaXMudHJpZ2dlcihlLGEpLHRoaXMucGFpbnRlciYmdGhpcy5wYWludGVyLmVhY2hPdGhlckxheWVyKGZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0W29dJiZ0W29dLmNhbGwodCxhKSx0LnRyaWdnZXImJnQudHJpZ2dlcihlLGEpfSkpfX0sZmluZEhvdmVyOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG49dGhpcy5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCksbz17eDp0LHk6ZX0sYT1uLmxlbmd0aC0xOzA8PWE7YS0tKXt2YXIgcjtpZihuW2FdIT09aSYmIW5bYV0uaWdub3JlJiYocj1KdChuW2FdLHQsZSkpJiYoby50b3BUYXJnZXR8fChvLnRvcFRhcmdldD1uW2FdKSxyIT09WXQpKXtvLnRhcmdldD1uW2FdO2JyZWFrfX1yZXR1cm4gb30scHJvY2Vzc0dlc3R1cmU6ZnVuY3Rpb24odCxlKXt0aGlzLl9nZXN0dXJlTWdyfHwodGhpcy5fZ2VzdHVyZU1ncj1uZXcgWnQpO3ZhciBpPXRoaXMuX2dlc3R1cmVNZ3I7InN0YXJ0Ij09PWUmJmkuY2xlYXIoKTt2YXIgbj1pLnJlY29nbml6ZSh0LHRoaXMuZmluZEhvdmVyKHQuenJYLHQuenJZLG51bGwpLnRhcmdldCx0aGlzLnByb3h5LmRvbSk7aWYoImVuZCI9PT1lJiZpLmNsZWFyKCksbil7dmFyIG89bi50eXBlO3QuZ2VzdHVyZUV2ZW50PW8sdGhpcy5kaXNwYXRjaFRvRWxlbWVudCh7dGFyZ2V0Om4udGFyZ2V0fSxvLG4uZXZlbnQpfX19LEUoWyJjbGljayIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJtb3VzZXdoZWVsIiwiZGJsY2xpY2siLCJjb250ZXh0bWVudSJdLGZ1bmN0aW9uKHIpe0t0LnByb3RvdHlwZVtyXT1mdW5jdGlvbih0KXt2YXIgZSxpLG49dC56clgsbz10LnpyWSxhPVF0KHRoaXMsbixvKTtpZigibW91c2V1cCI9PT1yJiZhfHwoaT0oZT10aGlzLmZpbmRIb3ZlcihuLG8pKS50YXJnZXQpLCJtb3VzZWRvd24iPT09cil0aGlzLl9kb3duRWw9aSx0aGlzLl9kb3duUG9pbnQ9W3QuenJYLHQuenJZXSx0aGlzLl91cEVsPWk7ZWxzZSBpZigibW91c2V1cCI9PT1yKXRoaXMuX3VwRWw9aTtlbHNlIGlmKCJjbGljayI9PT1yKXtpZih0aGlzLl9kb3duRWwhPT10aGlzLl91cEVsfHwhdGhpcy5fZG93blBvaW50fHw0PHl0KHRoaXMuX2Rvd25Qb2ludCxbdC56clgsdC56clldKSlyZXR1cm47dGhpcy5fZG93blBvaW50PW51bGx9dGhpcy5kaXNwYXRjaFRvRWxlbWVudChlLHIsdCl9fSksYihLdCxDdCksYihLdCxUdCk7dmFyIHRlPSJ1bmRlZmluZWQiPT10eXBlb2YgRmxvYXQzMkFycmF5P0FycmF5OkZsb2F0MzJBcnJheTtmdW5jdGlvbiBlZSgpe3ZhciB0PW5ldyB0ZSg2KTtyZXR1cm4gaWUodCksdH1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdH1mdW5jdGlvbiBuZSh0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdLHRbNV09ZVs1XSx0fWZ1bmN0aW9uIG9lKHQsZSxpKXt2YXIgbj1lWzBdKmlbMF0rZVsyXSppWzFdLG89ZVsxXSppWzBdK2VbM10qaVsxXSxhPWVbMF0qaVsyXStlWzJdKmlbM10scj1lWzFdKmlbMl0rZVszXSppWzNdLHM9ZVswXSppWzRdK2VbMl0qaVs1XStlWzRdLGw9ZVsxXSppWzRdK2VbM10qaVs1XStlWzVdO3JldHVybiB0WzBdPW4sdFsxXT1vLHRbMl09YSx0WzNdPXIsdFs0XT1zLHRbNV09bCx0fWZ1bmN0aW9uIGFlKHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XStpWzBdLHRbNV09ZVs1XStpWzFdLHR9ZnVuY3Rpb24gcmUodCxlLGkpe3ZhciBuPWVbMF0sbz1lWzJdLGE9ZVs0XSxyPWVbMV0scz1lWzNdLGw9ZVs1XSx1PU1hdGguc2luKGkpLGg9TWF0aC5jb3MoaSk7cmV0dXJuIHRbMF09bipoK3IqdSx0WzFdPS1uKnUrcipoLHRbMl09bypoK3MqdSx0WzNdPS1vKnUraCpzLHRbNF09aCphK3UqbCx0WzVdPWgqbC11KmEsdH1mdW5jdGlvbiBzZSh0LGUsaSl7dmFyIG49aVswXSxvPWlbMV07cmV0dXJuIHRbMF09ZVswXSpuLHRbMV09ZVsxXSpvLHRbMl09ZVsyXSpuLHRbM109ZVszXSpvLHRbNF09ZVs0XSpuLHRbNV09ZVs1XSpvLHR9ZnVuY3Rpb24gbGUodCxlKXt2YXIgaT1lWzBdLG49ZVsyXSxvPWVbNF0sYT1lWzFdLHI9ZVszXSxzPWVbNV0sbD1pKnItYSpuO3JldHVybiBsPyhsPTEvbCx0WzBdPXIqbCx0WzFdPS1hKmwsdFsyXT0tbipsLHRbM109aSpsLHRbNF09KG4qcy1yKm8pKmwsdFs1XT0oYSpvLWkqcykqbCx0KTpudWxsfWZ1bmN0aW9uIHVlKHQpe3ZhciBlPWVlKCk7cmV0dXJuIG5lKGUsdCksZX12YXIgaGU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe2NyZWF0ZTplZSxpZGVudGl0eTppZSxjb3B5Om5lLG11bDpvZSx0cmFuc2xhdGU6YWUscm90YXRlOnJlLHNjYWxlOnNlLGludmVydDpsZSxjbG9uZTp1ZX0pLGNlPWllO2Z1bmN0aW9uIGRlKHQpe3JldHVybiA1ZS01PHR8fHQ8LTVlLTV9dmFyIGZlPWZ1bmN0aW9uKHQpeyh0PXR8fHt9KS5wb3NpdGlvbnx8KHRoaXMucG9zaXRpb249WzAsMF0pLG51bGw9PXQucm90YXRpb24mJih0aGlzLnJvdGF0aW9uPTApLHQuc2NhbGV8fCh0aGlzLnNjYWxlPVsxLDFdKSx0aGlzLm9yaWdpbj10aGlzLm9yaWdpbnx8bnVsbH0scGU9ZmUucHJvdG90eXBlO3BlLnRyYW5zZm9ybT1udWxsLHBlLm5lZWRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbigpe3JldHVybiBkZSh0aGlzLnJvdGF0aW9uKXx8ZGUodGhpcy5wb3NpdGlvblswXSl8fGRlKHRoaXMucG9zaXRpb25bMV0pfHxkZSh0aGlzLnNjYWxlWzBdLTEpfHxkZSh0aGlzLnNjYWxlWzFdLTEpfTt2YXIgZ2U9W107cGUudXBkYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wYXJlbnQsZT10JiZ0LnRyYW5zZm9ybSxpPXRoaXMubmVlZExvY2FsVHJhbnNmb3JtKCksbj10aGlzLnRyYW5zZm9ybTtpZihpfHxlKXtuPW58fGVlKCksaT90aGlzLmdldExvY2FsVHJhbnNmb3JtKG4pOmNlKG4pLGUmJihpP29lKG4sdC50cmFuc2Zvcm0sbik6bmUobix0LnRyYW5zZm9ybSkpLHRoaXMudHJhbnNmb3JtPW47dmFyIG89dGhpcy5nbG9iYWxTY2FsZVJhdGlvO2lmKG51bGwhPW8mJjEhPT1vKXt0aGlzLmdldEdsb2JhbFNjYWxlKGdlKTt2YXIgYT1nZVswXTwwPy0xOjEscj1nZVsxXTwwPy0xOjEscz0oKGdlWzBdLWEpKm8rYSkvZ2VbMF18fDAsbD0oKGdlWzFdLXIpKm8rcikvZ2VbMV18fDA7blswXSo9cyxuWzFdKj1zLG5bMl0qPWwsblszXSo9bH10aGlzLmludlRyYW5zZm9ybT10aGlzLmludlRyYW5zZm9ybXx8ZWUoKSxsZSh0aGlzLmludlRyYW5zZm9ybSxuKX1lbHNlIG4mJmNlKG4pfSxwZS5nZXRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm4gZmUuZ2V0TG9jYWxUcmFuc2Zvcm0odGhpcyx0KX0scGUuc2V0VHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudHJhbnNmb3JtLGk9dC5kcHJ8fDE7ZT90LnNldFRyYW5zZm9ybShpKmVbMF0saSplWzFdLGkqZVsyXSxpKmVbM10saSplWzRdLGkqZVs1XSk6dC5zZXRUcmFuc2Zvcm0oaSwwLDAsaSwwLDApfSxwZS5yZXN0b3JlVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZHByfHwxO3Quc2V0VHJhbnNmb3JtKGUsMCwwLGUsMCwwKX07dmFyIG1lPVtdLHZlPWVlKCk7cGUuc2V0TG9jYWxUcmFuc2Zvcm09ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dFswXSp0WzBdK3RbMV0qdFsxXSxpPXRbMl0qdFsyXSt0WzNdKnRbM10sbj10aGlzLnBvc2l0aW9uLG89dGhpcy5zY2FsZTtkZShlLTEpJiYoZT1NYXRoLnNxcnQoZSkpLGRlKGktMSkmJihpPU1hdGguc3FydChpKSksdFswXTwwJiYoZT0tZSksdFszXTwwJiYoaT0taSksblswXT10WzRdLG5bMV09dFs1XSxvWzBdPWUsb1sxXT1pLHRoaXMucm90YXRpb249TWF0aC5hdGFuMigtdFsxXS9pLHRbMF0vZSl9fSxwZS5kZWNvbXBvc2VUcmFuc2Zvcm09ZnVuY3Rpb24oKXtpZih0aGlzLnRyYW5zZm9ybSl7dmFyIHQ9dGhpcy5wYXJlbnQsZT10aGlzLnRyYW5zZm9ybTt0JiZ0LnRyYW5zZm9ybSYmKG9lKG1lLHQuaW52VHJhbnNmb3JtLGUpLGU9bWUpO3ZhciBpPXRoaXMub3JpZ2luO2kmJihpWzBdfHxpWzFdKSYmKHZlWzRdPWlbMF0sdmVbNV09aVsxXSxvZShtZSxlLHZlKSxtZVs0XS09aVswXSxtZVs1XS09aVsxXSxlPW1lKSx0aGlzLnNldExvY2FsVHJhbnNmb3JtKGUpfX0scGUuZ2V0R2xvYmFsU2NhbGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50cmFuc2Zvcm07cmV0dXJuIHQ9dHx8W10sZT8odFswXT1NYXRoLnNxcnQoZVswXSplWzBdK2VbMV0qZVsxXSksdFsxXT1NYXRoLnNxcnQoZVsyXSplWzJdK2VbM10qZVszXSksZVswXTwwJiYodFswXT0tdFswXSksZVszXTwwJiYodFsxXT0tdFsxXSkpOih0WzBdPTEsdFsxXT0xKSx0fSxwZS50cmFuc2Zvcm1Db29yZFRvTG9jYWw9ZnVuY3Rpb24odCxlKXt2YXIgaT1bdCxlXSxuPXRoaXMuaW52VHJhbnNmb3JtO3JldHVybiBuJiZidChpLGksbiksaX0scGUudHJhbnNmb3JtQ29vcmRUb0dsb2JhbD1mdW5jdGlvbih0LGUpe3ZhciBpPVt0LGVdLG49dGhpcy50cmFuc2Zvcm07cmV0dXJuIG4mJmJ0KGksaSxuKSxpfSxmZS5nZXRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbih0LGUpe2NlKGU9ZXx8W10pO3ZhciBpPXQub3JpZ2luLG49dC5zY2FsZXx8WzEsMV0sbz10LnJvdGF0aW9ufHwwLGE9dC5wb3NpdGlvbnx8WzAsMF07cmV0dXJuIGkmJihlWzRdLT1pWzBdLGVbNV0tPWlbMV0pLHNlKGUsZSxuKSxvJiZyZShlLGUsbyksaSYmKGVbNF0rPWlbMF0sZVs1XSs9aVsxXSksZVs0XSs9YVswXSxlWzVdKz1hWzFdLGV9O3ZhciB5ZT17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxxdWFkcmF0aWNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdCp0fSxxdWFkcmF0aWNPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LHF1YWRyYXRpY0luT3V0OmZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy41KnQqdDotLjUqKC0tdCoodC0yKS0xKX0sY3ViaWNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LGN1YmljT3V0OmZ1bmN0aW9uKHQpe3JldHVybi0tdCp0KnQrMX0sY3ViaWNJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSp0KnQqdDouNSooKHQtPTIpKnQqdCsyKX0scXVhcnRpY0luOmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0fSxxdWFydGljT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAxLSAtLXQqdCp0KnR9LHF1YXJ0aWNJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSp0KnQqdCp0Oi0uNSooKHQtPTIpKnQqdCp0LTIpfSxxdWludGljSW46ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0KnQqdH0scXVpbnRpY091dDpmdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KnQqdCsxfSxxdWludGljSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQqPTIpPDE/LjUqdCp0KnQqdCp0Oi41KigodC09MikqdCp0KnQqdCsyKX0sc2ludXNvaWRhbEluOmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqTWF0aC5QSS8yKX0sc2ludXNvaWRhbE91dDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaW4odCpNYXRoLlBJLzIpfSxzaW51c29pZGFsSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuLjUqKDEtTWF0aC5jb3MoTWF0aC5QSSp0KSl9LGV4cG9uZW50aWFsSW46ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10PzA6TWF0aC5wb3coMTAyNCx0LTEpfSxleHBvbmVudGlhbE91dDpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/MToxLU1hdGgucG93KDIsLTEwKnQpfSxleHBvbmVudGlhbEluT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD8wOjE9PT10PzE6KHQqPTIpPDE/LjUqTWF0aC5wb3coMTAyNCx0LTEpOi41KigyLU1hdGgucG93KDIsLTEwKih0LTEpKSl9LGNpcmN1bGFySW46ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX0sY2lyY3VsYXJPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9LGNpcmN1bGFySW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQqPTIpPDE/LS41KihNYXRoLnNxcnQoMS10KnQpLTEpOi41KihNYXRoLnNxcnQoMS0odC09MikqdCkrMSl9LGVsYXN0aWNJbjpmdW5jdGlvbih0KXt2YXIgZSxpPS4xO3JldHVybiAwPT09dD8wOjE9PT10PzE6KGU9IWl8fGk8MT8oaT0xLC4xKTouNCpNYXRoLmFzaW4oMS9pKS8oMipNYXRoLlBJKSwtaSpNYXRoLnBvdygyLDEwKih0LT0xKSkqTWF0aC5zaW4oKHQtZSkqKDIqTWF0aC5QSSkvLjQpKX0sZWxhc3RpY091dDpmdW5jdGlvbih0KXt2YXIgZSxpPS4xO3JldHVybiAwPT09dD8wOjE9PT10PzE6KGU9IWl8fGk8MT8oaT0xLC4xKTouNCpNYXRoLmFzaW4oMS9pKS8oMipNYXRoLlBJKSxpKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpLy40KSsxKX0sZWxhc3RpY0luT3V0OmZ1bmN0aW9uKHQpe3ZhciBlLGk9LjE7cmV0dXJuIDA9PT10PzA6MT09PXQ/MTooZT0haXx8aTwxPyhpPTEsLjEpOi40Kk1hdGguYXNpbigxL2kpLygyKk1hdGguUEkpLCh0Kj0yKTwxP2kqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpLy40KSotLjU6aSpNYXRoLnBvdygyLC0xMCoodC09MSkpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpLy40KSouNSsxKX0sYmFja0luOmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKDIuNzAxNTgqdC0xLjcwMTU4KX0sYmFja091dDpmdW5jdGlvbih0KXtyZXR1cm4tLXQqdCooMi43MDE1OCp0KzEuNzAxNTgpKzF9LGJhY2tJbk91dDpmdW5jdGlvbih0KXt2YXIgZT0yLjU5NDkwOTU7cmV0dXJuKHQqPTIpPDE/dCp0KigoMStlKSp0LWUpKi41Oi41KigodC09MikqdCooKDErZSkqdCtlKSsyKX0sYm91bmNlSW46ZnVuY3Rpb24odCl7cmV0dXJuIDEteWUuYm91bmNlT3V0KDEtdCl9LGJvdW5jZU91dDpmdW5jdGlvbih0KXtyZXR1cm4gdDwxLzIuNzU/Ny41NjI1KnQqdDp0PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1fSxib3VuY2VJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4gdDwuNT8uNSp5ZS5ib3VuY2VJbigyKnQpOi41KnllLmJvdW5jZU91dCgyKnQtMSkrLjV9fTtmdW5jdGlvbiB4ZSh0KXt0aGlzLl90YXJnZXQ9dC50YXJnZXQsdGhpcy5fbGlmZT10LmxpZmV8fDFlMyx0aGlzLl9kZWxheT10LmRlbGF5fHwwLHRoaXMuX2luaXRpYWxpemVkPSExLHRoaXMubG9vcD1udWxsIT10Lmxvb3AmJnQubG9vcCx0aGlzLmdhcD10LmdhcHx8MCx0aGlzLmVhc2luZz10LmVhc2luZ3x8IkxpbmVhciIsdGhpcy5vbmZyYW1lPXQub25mcmFtZSx0aGlzLm9uZGVzdHJveT10Lm9uZGVzdHJveSx0aGlzLm9ucmVzdGFydD10Lm9ucmVzdGFydCx0aGlzLl9wYXVzZWRUaW1lPTAsdGhpcy5fcGF1c2VkPSExfXhlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6eGUsc3RlcDpmdW5jdGlvbih0LGUpe2lmKHRoaXMuX2luaXRpYWxpemVkfHwodGhpcy5fc3RhcnRUaW1lPXQrdGhpcy5fZGVsYXksdGhpcy5faW5pdGlhbGl6ZWQ9ITApLHRoaXMuX3BhdXNlZCl0aGlzLl9wYXVzZWRUaW1lKz1lO2Vsc2V7dmFyIGk9KHQtdGhpcy5fc3RhcnRUaW1lLXRoaXMuX3BhdXNlZFRpbWUpL3RoaXMuX2xpZmU7aWYoIShpPDApKXtpPU1hdGgubWluKGksMSk7dmFyIG49dGhpcy5lYXNpbmcsbz0ic3RyaW5nIj09dHlwZW9mIG4/eWVbbl06bixhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP28oaSk6aTtyZXR1cm4gdGhpcy5maXJlKCJmcmFtZSIsYSksMT09PWk/dGhpcy5sb29wPyh0aGlzLnJlc3RhcnQodCksInJlc3RhcnQiKToodGhpcy5fbmVlZHNSZW1vdmU9ITAsImRlc3Ryb3kiKTpudWxsfX19LHJlc3RhcnQ6ZnVuY3Rpb24odCl7dmFyIGU9KHQtdGhpcy5fc3RhcnRUaW1lLXRoaXMuX3BhdXNlZFRpbWUpJXRoaXMuX2xpZmU7dGhpcy5fc3RhcnRUaW1lPXQtZSt0aGlzLmdhcCx0aGlzLl9wYXVzZWRUaW1lPTAsdGhpcy5fbmVlZHNSZW1vdmU9ITF9LGZpcmU6ZnVuY3Rpb24odCxlKXt0aGlzW3Q9Im9uIit0XSYmdGhpc1t0XSh0aGlzLl90YXJnZXQsZSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSEwfSxyZXN1bWU6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWQ9ITF9fTtmdW5jdGlvbiBfZSgpe3RoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMuX2xlbj0wfXZhciB3ZT1fZS5wcm90b3R5cGU7d2UuaW5zZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBTZSh0KTtyZXR1cm4gdGhpcy5pbnNlcnRFbnRyeShlKSxlfSx3ZS5pbnNlcnRFbnRyeT1mdW5jdGlvbih0KXt0aGlzLmhlYWQ/KCh0aGlzLnRhaWwubmV4dD10KS5wcmV2PXRoaXMudGFpbCx0Lm5leHQ9bnVsbCx0aGlzLnRhaWw9dCk6dGhpcy5oZWFkPXRoaXMudGFpbD10LHRoaXMuX2xlbisrfSx3ZS5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dC5wcmV2LGk9dC5uZXh0O2U/ZS5uZXh0PWk6dGhpcy5oZWFkPWksaT9pLnByZXY9ZTp0aGlzLnRhaWw9ZSx0Lm5leHQ9dC5wcmV2PW51bGwsdGhpcy5fbGVuLS19LHdlLmxlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZW59LHdlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMuX2xlbj0wfTtmdW5jdGlvbiBiZSh0KXt0aGlzLl9saXN0PW5ldyBfZSx0aGlzLl9tYXA9e30sdGhpcy5fbWF4U2l6ZT10fHwxMCx0aGlzLl9sYXN0UmVtb3ZlZEVudHJ5PW51bGx9dmFyIFNlPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dCx0aGlzLm5leHQsdGhpcy5wcmV2fSxNZT1iZS5wcm90b3R5cGU7TWUucHV0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fbGlzdCxuPXRoaXMuX21hcCxvPW51bGw7aWYobnVsbD09blt0XSl7dmFyIGE9aS5sZW4oKSxyPXRoaXMuX2xhc3RSZW1vdmVkRW50cnk7aWYoYT49dGhpcy5fbWF4U2l6ZSYmMDxhKXt2YXIgcz1pLmhlYWQ7aS5yZW1vdmUocyksZGVsZXRlIG5bcy5rZXldLG89cy52YWx1ZSx0aGlzLl9sYXN0UmVtb3ZlZEVudHJ5PXN9cj9yLnZhbHVlPWU6cj1uZXcgU2UoZSksci5rZXk9dCxpLmluc2VydEVudHJ5KHIpLG5bdF09cn1yZXR1cm4gb30sTWUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcFt0XSxpPXRoaXMuX2xpc3Q7aWYobnVsbCE9ZSlyZXR1cm4gZSE9PWkudGFpbCYmKGkucmVtb3ZlKGUpLGkuaW5zZXJ0RW50cnkoZSkpLGUudmFsdWV9LE1lLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fbGlzdC5jbGVhcigpLHRoaXMuX21hcD17fX07dmFyIEllPXt0cmFuc3BhcmVudDpbMCwwLDAsMF0sYWxpY2VibHVlOlsyNDAsMjQ4LDI1NSwxXSxhbnRpcXVld2hpdGU6WzI1MCwyMzUsMjE1LDFdLGFxdWE6WzAsMjU1LDI1NSwxXSxhcXVhbWFyaW5lOlsxMjcsMjU1LDIxMiwxXSxhenVyZTpbMjQwLDI1NSwyNTUsMV0sYmVpZ2U6WzI0NSwyNDUsMjIwLDFdLGJpc3F1ZTpbMjU1LDIyOCwxOTYsMV0sYmxhY2s6WzAsMCwwLDFdLGJsYW5jaGVkYWxtb25kOlsyNTUsMjM1LDIwNSwxXSxibHVlOlswLDAsMjU1LDFdLGJsdWV2aW9sZXQ6WzEzOCw0MywyMjYsMV0sYnJvd246WzE2NSw0Miw0MiwxXSxidXJseXdvb2Q6WzIyMiwxODQsMTM1LDFdLGNhZGV0Ymx1ZTpbOTUsMTU4LDE2MCwxXSxjaGFydHJldXNlOlsxMjcsMjU1LDAsMV0sY2hvY29sYXRlOlsyMTAsMTA1LDMwLDFdLGNvcmFsOlsyNTUsMTI3LDgwLDFdLGNvcm5mbG93ZXJibHVlOlsxMDAsMTQ5LDIzNywxXSxjb3Juc2lsazpbMjU1LDI0OCwyMjAsMV0sY3JpbXNvbjpbMjIwLDIwLDYwLDFdLGN5YW46WzAsMjU1LDI1NSwxXSxkYXJrYmx1ZTpbMCwwLDEzOSwxXSxkYXJrY3lhbjpbMCwxMzksMTM5LDFdLGRhcmtnb2xkZW5yb2Q6WzE4NCwxMzQsMTEsMV0sZGFya2dyYXk6WzE2OSwxNjksMTY5LDFdLGRhcmtncmVlbjpbMCwxMDAsMCwxXSxkYXJrZ3JleTpbMTY5LDE2OSwxNjksMV0sZGFya2toYWtpOlsxODksMTgzLDEwNywxXSxkYXJrbWFnZW50YTpbMTM5LDAsMTM5LDFdLGRhcmtvbGl2ZWdyZWVuOls4NSwxMDcsNDcsMV0sZGFya29yYW5nZTpbMjU1LDE0MCwwLDFdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDQsMV0sZGFya3JlZDpbMTM5LDAsMCwxXSxkYXJrc2FsbW9uOlsyMzMsMTUwLDEyMiwxXSxkYXJrc2VhZ3JlZW46WzE0MywxODgsMTQzLDFdLGRhcmtzbGF0ZWJsdWU6WzcyLDYxLDEzOSwxXSxkYXJrc2xhdGVncmF5Ols0Nyw3OSw3OSwxXSxkYXJrc2xhdGVncmV5Ols0Nyw3OSw3OSwxXSxkYXJrdHVycXVvaXNlOlswLDIwNiwyMDksMV0sZGFya3Zpb2xldDpbMTQ4LDAsMjExLDFdLGRlZXBwaW5rOlsyNTUsMjAsMTQ3LDFdLGRlZXBza3libHVlOlswLDE5MSwyNTUsMV0sZGltZ3JheTpbMTA1LDEwNSwxMDUsMV0sZGltZ3JleTpbMTA1LDEwNSwxMDUsMV0sZG9kZ2VyYmx1ZTpbMzAsMTQ0LDI1NSwxXSxmaXJlYnJpY2s6WzE3OCwzNCwzNCwxXSxmbG9yYWx3aGl0ZTpbMjU1LDI1MCwyNDAsMV0sZm9yZXN0Z3JlZW46WzM0LDEzOSwzNCwxXSxmdWNoc2lhOlsyNTUsMCwyNTUsMV0sZ2FpbnNib3JvOlsyMjAsMjIwLDIyMCwxXSxnaG9zdHdoaXRlOlsyNDgsMjQ4LDI1NSwxXSxnb2xkOlsyNTUsMjE1LDAsMV0sZ29sZGVucm9kOlsyMTgsMTY1LDMyLDFdLGdyYXk6WzEyOCwxMjgsMTI4LDFdLGdyZWVuOlswLDEyOCwwLDFdLGdyZWVueWVsbG93OlsxNzMsMjU1LDQ3LDFdLGdyZXk6WzEyOCwxMjgsMTI4LDFdLGhvbmV5ZGV3OlsyNDAsMjU1LDI0MCwxXSxob3RwaW5rOlsyNTUsMTA1LDE4MCwxXSxpbmRpYW5yZWQ6WzIwNSw5Miw5MiwxXSxpbmRpZ286Wzc1LDAsMTMwLDFdLGl2b3J5OlsyNTUsMjU1LDI0MCwxXSxraGFraTpbMjQwLDIzMCwxNDAsMV0sbGF2ZW5kZXI6WzIzMCwyMzAsMjUwLDFdLGxhdmVuZGVyYmx1c2g6WzI1NSwyNDAsMjQ1LDFdLGxhd25ncmVlbjpbMTI0LDI1MiwwLDFdLGxlbW9uY2hpZmZvbjpbMjU1LDI1MCwyMDUsMV0sbGlnaHRibHVlOlsxNzMsMjE2LDIzMCwxXSxsaWdodGNvcmFsOlsyNDAsMTI4LDEyOCwxXSxsaWdodGN5YW46WzIyNCwyNTUsMjU1LDFdLGxpZ2h0Z29sZGVucm9keWVsbG93OlsyNTAsMjUwLDIxMCwxXSxsaWdodGdyYXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0LDFdLGxpZ2h0Z3JleTpbMjExLDIxMSwyMTEsMV0sbGlnaHRwaW5rOlsyNTUsMTgyLDE5MywxXSxsaWdodHNhbG1vbjpbMjU1LDE2MCwxMjIsMV0sbGlnaHRzZWFncmVlbjpbMzIsMTc4LDE3MCwxXSxsaWdodHNreWJsdWU6WzEzNSwyMDYsMjUwLDFdLGxpZ2h0c2xhdGVncmF5OlsxMTksMTM2LDE1MywxXSxsaWdodHNsYXRlZ3JleTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzdGVlbGJsdWU6WzE3NiwxOTYsMjIyLDFdLGxpZ2h0eWVsbG93OlsyNTUsMjU1LDIyNCwxXSxsaW1lOlswLDI1NSwwLDFdLGxpbWVncmVlbjpbNTAsMjA1LDUwLDFdLGxpbmVuOlsyNTAsMjQwLDIzMCwxXSxtYWdlbnRhOlsyNTUsMCwyNTUsMV0sbWFyb29uOlsxMjgsMCwwLDFdLG1lZGl1bWFxdWFtYXJpbmU6WzEwMiwyMDUsMTcwLDFdLG1lZGl1bWJsdWU6WzAsMCwyMDUsMV0sbWVkaXVtb3JjaGlkOlsxODYsODUsMjExLDFdLG1lZGl1bXB1cnBsZTpbMTQ3LDExMiwyMTksMV0sbWVkaXVtc2VhZ3JlZW46WzYwLDE3OSwxMTMsMV0sbWVkaXVtc2xhdGVibHVlOlsxMjMsMTA0LDIzOCwxXSxtZWRpdW1zcHJpbmdncmVlbjpbMCwyNTAsMTU0LDFdLG1lZGl1bXR1cnF1b2lzZTpbNzIsMjA5LDIwNCwxXSxtZWRpdW12aW9sZXRyZWQ6WzE5OSwyMSwxMzMsMV0sbWlkbmlnaHRibHVlOlsyNSwyNSwxMTIsMV0sbWludGNyZWFtOlsyNDUsMjU1LDI1MCwxXSxtaXN0eXJvc2U6WzI1NSwyMjgsMjI1LDFdLG1vY2Nhc2luOlsyNTUsMjI4LDE4MSwxXSxuYXZham93aGl0ZTpbMjU1LDIyMiwxNzMsMV0sbmF2eTpbMCwwLDEyOCwxXSxvbGRsYWNlOlsyNTMsMjQ1LDIzMCwxXSxvbGl2ZTpbMTI4LDEyOCwwLDFdLG9saXZlZHJhYjpbMTA3LDE0MiwzNSwxXSxvcmFuZ2U6WzI1NSwxNjUsMCwxXSxvcmFuZ2VyZWQ6WzI1NSw2OSwwLDFdLG9yY2hpZDpbMjE4LDExMiwyMTQsMV0scGFsZWdvbGRlbnJvZDpbMjM4LDIzMiwxNzAsMV0scGFsZWdyZWVuOlsxNTIsMjUxLDE1MiwxXSxwYWxldHVycXVvaXNlOlsxNzUsMjM4LDIzOCwxXSxwYWxldmlvbGV0cmVkOlsyMTksMTEyLDE0NywxXSxwYXBheWF3aGlwOlsyNTUsMjM5LDIxMywxXSxwZWFjaHB1ZmY6WzI1NSwyMTgsMTg1LDFdLHBlcnU6WzIwNSwxMzMsNjMsMV0scGluazpbMjU1LDE5MiwyMDMsMV0scGx1bTpbMjIxLDE2MCwyMjEsMV0scG93ZGVyYmx1ZTpbMTc2LDIyNCwyMzAsMV0scHVycGxlOlsxMjgsMCwxMjgsMV0scmVkOlsyNTUsMCwwLDFdLHJvc3licm93bjpbMTg4LDE0MywxNDMsMV0scm95YWxibHVlOls2NSwxMDUsMjI1LDFdLHNhZGRsZWJyb3duOlsxMzksNjksMTksMV0sc2FsbW9uOlsyNTAsMTI4LDExNCwxXSxzYW5keWJyb3duOlsyNDQsMTY0LDk2LDFdLHNlYWdyZWVuOls0NiwxMzksODcsMV0sc2Vhc2hlbGw6WzI1NSwyNDUsMjM4LDFdLHNpZW5uYTpbMTYwLDgyLDQ1LDFdLHNpbHZlcjpbMTkyLDE5MiwxOTIsMV0sc2t5Ymx1ZTpbMTM1LDIwNiwyMzUsMV0sc2xhdGVibHVlOlsxMDYsOTAsMjA1LDFdLHNsYXRlZ3JheTpbMTEyLDEyOCwxNDQsMV0sc2xhdGVncmV5OlsxMTIsMTI4LDE0NCwxXSxzbm93OlsyNTUsMjUwLDI1MCwxXSxzcHJpbmdncmVlbjpbMCwyNTUsMTI3LDFdLHN0ZWVsYmx1ZTpbNzAsMTMwLDE4MCwxXSx0YW46WzIxMCwxODAsMTQwLDFdLHRlYWw6WzAsMTI4LDEyOCwxXSx0aGlzdGxlOlsyMTYsMTkxLDIxNiwxXSx0b21hdG86WzI1NSw5OSw3MSwxXSx0dXJxdW9pc2U6WzY0LDIyNCwyMDgsMV0sdmlvbGV0OlsyMzgsMTMwLDIzOCwxXSx3aGVhdDpbMjQ1LDIyMiwxNzksMV0sd2hpdGU6WzI1NSwyNTUsMjU1LDFdLHdoaXRlc21va2U6WzI0NSwyNDUsMjQ1LDFdLHllbGxvdzpbMjU1LDI1NSwwLDFdLHllbGxvd2dyZWVuOlsxNTQsMjA1LDUwLDFdfTtmdW5jdGlvbiBUZSh0KXtyZXR1cm4odD1NYXRoLnJvdW5kKHQpKTwwPzA6MjU1PHQ/MjU1OnR9ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ8MD8wOjE8dD8xOnR9ZnVuY3Rpb24gRGUodCl7cmV0dXJuIHQubGVuZ3RoJiYiJSI9PT10LmNoYXJBdCh0Lmxlbmd0aC0xKT9UZShwYXJzZUZsb2F0KHQpLzEwMCoyNTUpOlRlKHBhcnNlSW50KHQsMTApKX1mdW5jdGlvbiBDZSh0KXtyZXR1cm4gdC5sZW5ndGgmJiIlIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpP0FlKHBhcnNlRmxvYXQodCkvMTAwKTpBZShwYXJzZUZsb2F0KHQpKX1mdW5jdGlvbiBMZSh0LGUsaSl7cmV0dXJuIGk8MD9pKz0xOjE8aSYmKGktPTEpLDYqaTwxP3QrKGUtdCkqaSo2OjIqaTwxP2U6MyppPDI/dCsoZS10KSooMi8zLWkpKjY6dH1mdW5jdGlvbiBrZSh0LGUsaSl7cmV0dXJuIHQrKGUtdCkqaX1mdW5jdGlvbiBQZSh0LGUsaSxuLG8pe3JldHVybiB0WzBdPWUsdFsxXT1pLHRbMl09bix0WzNdPW8sdH1mdW5jdGlvbiBOZSh0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdH12YXIgT2U9bmV3IGJlKDIwKSxFZT1udWxsO2Z1bmN0aW9uIHplKHQsZSl7RWUmJk5lKEVlLGUpLEVlPU9lLnB1dCh0LEVlfHxlLnNsaWNlKCkpfWZ1bmN0aW9uIFJlKHQsZSl7aWYodCl7ZT1lfHxbXTt2YXIgaT1PZS5nZXQodCk7aWYoaSlyZXR1cm4gTmUoZSxpKTt2YXIgbixvPSh0Kz0iIikucmVwbGFjZSgvIC9nLCIiKS50b0xvd2VyQ2FzZSgpO2lmKG8gaW4gSWUpcmV0dXJuIE5lKGUsSWVbb10pLHplKHQsZSksZTtpZigiIyI9PT1vLmNoYXJBdCgwKSlyZXR1cm4gND09PW8ubGVuZ3RoPzA8PShuPXBhcnNlSW50KG8uc3Vic3RyKDEpLDE2KSkmJm48PTQwOTU/KFBlKGUsKDM4NDAmbik+PjR8KDM4NDAmbik+PjgsMjQwJm58KDI0MCZuKT4+NCwxNSZufCgxNSZuKTw8NCwxKSx6ZSh0LGUpLGUpOnZvaWQgUGUoZSwwLDAsMCwxKTo3PT09by5sZW5ndGg/MDw9KG49cGFyc2VJbnQoby5zdWJzdHIoMSksMTYpKSYmbjw9MTY3NzcyMTU/KFBlKGUsKDE2NzExNjgwJm4pPj4xNiwoNjUyODAmbik+PjgsMjU1Jm4sMSksemUodCxlKSxlKTp2b2lkIFBlKGUsMCwwLDAsMSk6dm9pZCAwO3ZhciBhPW8uaW5kZXhPZigiKCIpLHI9by5pbmRleE9mKCIpIik7aWYoLTEhPT1hJiZyKzE9PT1vLmxlbmd0aCl7dmFyIHM9by5zdWJzdHIoMCxhKSxsPW8uc3Vic3RyKGErMSxyLShhKzEpKS5zcGxpdCgiLCIpLHU9MTtzd2l0Y2gocyl7Y2FzZSJyZ2JhIjppZig0IT09bC5sZW5ndGgpcmV0dXJuIHZvaWQgUGUoZSwwLDAsMCwxKTt1PUNlKGwucG9wKCkpO2Nhc2UicmdiIjpyZXR1cm4gMyE9PWwubGVuZ3RoP3ZvaWQgUGUoZSwwLDAsMCwxKTooUGUoZSxEZShsWzBdKSxEZShsWzFdKSxEZShsWzJdKSx1KSx6ZSh0LGUpLGUpO2Nhc2UiaHNsYSI6cmV0dXJuIDQhPT1sLmxlbmd0aD92b2lkIFBlKGUsMCwwLDAsMSk6KGxbM109Q2UobFszXSksQmUobCxlKSx6ZSh0LGUpLGUpO2Nhc2UiaHNsIjpyZXR1cm4gMyE9PWwubGVuZ3RoP3ZvaWQgUGUoZSwwLDAsMCwxKTooQmUobCxlKSx6ZSh0LGUpLGUpO2RlZmF1bHQ6cmV0dXJufX1QZShlLDAsMCwwLDEpfX1mdW5jdGlvbiBCZSh0LGUpe3ZhciBpPShwYXJzZUZsb2F0KHRbMF0pJTM2MCszNjApJTM2MC8zNjAsbj1DZSh0WzFdKSxvPUNlKHRbMl0pLGE9bzw9LjU/byoobisxKTpvK24tbypuLHI9MipvLWE7cmV0dXJuIFBlKGU9ZXx8W10sVGUoMjU1KkxlKHIsYSxpKzEvMykpLFRlKDI1NSpMZShyLGEsaSkpLFRlKDI1NSpMZShyLGEsaS0xLzMpKSwxKSw0PT09dC5sZW5ndGgmJihlWzNdPXRbM10pLGV9ZnVuY3Rpb24gVmUodCxlKXt2YXIgaT1SZSh0KTtpZihpKXtmb3IodmFyIG49MDtuPDM7bisrKWlbbl09ZTwwP2lbbl0qKDEtZSl8MDooMjU1LWlbbl0pKmUraVtuXXwwLDI1NTxpW25dP2lbbl09MjU1OnRbbl08MCYmKGlbbl09MCk7cmV0dXJuIFllKGksND09PWkubGVuZ3RoPyJyZ2JhIjoicmdiIil9fWZ1bmN0aW9uIEdlKHQpe3ZhciBlPVJlKHQpO2lmKGUpcmV0dXJuKCgxPDwyNCkrKGVbMF08PDE2KSsoZVsxXTw8OCkrICtlWzJdKS50b1N0cmluZygxNikuc2xpY2UoMSl9ZnVuY3Rpb24gRmUodCxlLGkpe2lmKGUmJmUubGVuZ3RoJiYwPD10JiZ0PD0xKXtpPWl8fFtdO3ZhciBuPXQqKGUubGVuZ3RoLTEpLG89TWF0aC5mbG9vcihuKSxhPU1hdGguY2VpbChuKSxyPWVbb10scz1lW2FdLGw9bi1vO3JldHVybiBpWzBdPVRlKGtlKHJbMF0sc1swXSxsKSksaVsxXT1UZShrZShyWzFdLHNbMV0sbCkpLGlbMl09VGUoa2UoclsyXSxzWzJdLGwpKSxpWzNdPUFlKGtlKHJbM10sc1szXSxsKSksaX19dmFyIFdlPUZlO2Z1bmN0aW9uIEhlKHQsZSxpKXtpZihlJiZlLmxlbmd0aCYmMDw9dCYmdDw9MSl7dmFyIG49dCooZS5sZW5ndGgtMSksbz1NYXRoLmZsb29yKG4pLGE9TWF0aC5jZWlsKG4pLHI9UmUoZVtvXSkscz1SZShlW2FdKSxsPW4tbyx1PVllKFtUZShrZShyWzBdLHNbMF0sbCkpLFRlKGtlKHJbMV0sc1sxXSxsKSksVGUoa2UoclsyXSxzWzJdLGwpKSxBZShrZShyWzNdLHNbM10sbCkpXSwicmdiYSIpO3JldHVybiBpP3tjb2xvcjp1LGxlZnRJbmRleDpvLHJpZ2h0SW5kZXg6YSx2YWx1ZTpufTp1fX12YXIgWmU9SGU7ZnVuY3Rpb24gVWUodCxlLGksbil7aWYodD1SZSh0KSlyZXR1cm4gdD1mdW5jdGlvbih0KXtpZih0KXt2YXIgZSxpLG49dFswXS8yNTUsbz10WzFdLzI1NSxhPXRbMl0vMjU1LHI9TWF0aC5taW4obixvLGEpLHM9TWF0aC5tYXgobixvLGEpLGw9cy1yLHU9KHMrcikvMjtpZigwPT1sKWk9ZT0wO2Vsc2V7aT11PC41P2wvKHMrcik6bC8oMi1zLXIpO3ZhciBoPSgocy1uKS82K2wvMikvbCxjPSgocy1vKS82K2wvMikvbCxkPSgocy1hKS82K2wvMikvbDtuPT09cz9lPWQtYzpvPT09cz9lPTEvMytoLWQ6YT09PXMmJihlPTIvMytjLWgpLGU8MCYmKGUrPTEpLDE8ZSYmKGUtPTEpfXZhciBmPVszNjAqZSxpLHVdO3JldHVybiBudWxsIT10WzNdJiZmLnB1c2godFszXSksZn19KHQpLG51bGwhPWUmJih0WzBdPWZ1bmN0aW9uKHQpe3JldHVybih0PU1hdGgucm91bmQodCkpPDA/MDozNjA8dD8zNjA6dH0oZSkpLG51bGwhPWkmJih0WzFdPUNlKGkpKSxudWxsIT1uJiYodFsyXT1DZShuKSksWWUoQmUodCksInJnYmEiKX1mdW5jdGlvbiBYZSh0LGUpe2lmKCh0PVJlKHQpKSYmbnVsbCE9ZSlyZXR1cm4gdFszXT1BZShlKSxZZSh0LCJyZ2JhIil9ZnVuY3Rpb24gWWUodCxlKXtpZih0JiZ0Lmxlbmd0aCl7dmFyIGk9dFswXSsiLCIrdFsxXSsiLCIrdFsyXTtyZXR1cm4icmdiYSIhPT1lJiYiaHN2YSIhPT1lJiYiaHNsYSIhPT1lfHwoaSs9IiwiK3RbM10pLGUrIigiK2krIikifX12YXIgamU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe3BhcnNlOlJlLGxpZnQ6VmUsdG9IZXg6R2UsZmFzdExlcnA6RmUsZmFzdE1hcFRvQ29sb3I6V2UsbGVycDpIZSxtYXBUb0NvbG9yOlplLG1vZGlmeUhTTDpVZSxtb2RpZnlBbHBoYTpYZSxzdHJpbmdpZnk6WWV9KSxxZT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gS2UodCxlKXtyZXR1cm4gdFtlXX1mdW5jdGlvbiAkZSh0LGUsaSl7dFtlXT1pfWZ1bmN0aW9uIEplKHQsZSxpKXtyZXR1cm4oZS10KSppK3R9ZnVuY3Rpb24gUWUodCxlLGkpe3JldHVybi41PGk/ZTp0fWZ1bmN0aW9uIHRpKHQsZSxpLG4sbyl7dmFyIGE9dC5sZW5ndGg7aWYoMT09PW8pZm9yKHZhciByPTA7cjxhO3IrKyluW3JdPUplKHRbcl0sZVtyXSxpKTtlbHNle3ZhciBzPWEmJnRbMF0ubGVuZ3RoO2ZvcihyPTA7cjxhO3IrKylmb3IodmFyIGw9MDtsPHM7bCsrKW5bcl1bbF09SmUodFtyXVtsXSxlW3JdW2xdLGkpfX1mdW5jdGlvbiBlaSh0LGUsaSl7dmFyIG49dC5sZW5ndGgsbz1lLmxlbmd0aDtpZihuIT09bylpZihvPG4pdC5sZW5ndGg9bztlbHNlIGZvcih2YXIgYT1uO2E8bzthKyspdC5wdXNoKDE9PT1pP2VbYV06cWUuY2FsbChlW2FdKSk7dmFyIHI9dFswXSYmdFswXS5sZW5ndGg7Zm9yKGE9MDthPHQubGVuZ3RoO2ErKylpZigxPT09aSlpc05hTih0W2FdKSYmKHRbYV09ZVthXSk7ZWxzZSBmb3IodmFyIHM9MDtzPHI7cysrKWlzTmFOKHRbYV1bc10pJiYodFthXVtzXT1lW2FdW3NdKX1mdW5jdGlvbiBpaSh0LGUsaSl7aWYodD09PWUpcmV0dXJuITA7dmFyIG49dC5sZW5ndGg7aWYobiE9PWUubGVuZ3RoKXJldHVybiExO2lmKDE9PT1pKXtmb3IodmFyIG89MDtvPG47bysrKWlmKHRbb10hPT1lW29dKXJldHVybiExfWVsc2V7dmFyIGE9dFswXS5sZW5ndGg7Zm9yKG89MDtvPG47bysrKWZvcih2YXIgcj0wO3I8YTtyKyspaWYodFtvXVtyXSE9PWVbb11bcl0pcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbmkodCxlLGksbixvLGEscixzLGwpe3ZhciB1PXQubGVuZ3RoO2lmKDE9PT1sKWZvcih2YXIgaD0wO2g8dTtoKyspc1toXT1vaSh0W2hdLGVbaF0saVtoXSxuW2hdLG8sYSxyKTtlbHNle3ZhciBjPXRbMF0ubGVuZ3RoO2ZvcihoPTA7aDx1O2grKylmb3IodmFyIGQ9MDtkPGM7ZCsrKXNbaF1bZF09b2kodFtoXVtkXSxlW2hdW2RdLGlbaF1bZF0sbltoXVtkXSxvLGEscil9fWZ1bmN0aW9uIG9pKHQsZSxpLG4sbyxhLHIpe3ZhciBzPS41KihpLXQpLGw9LjUqKG4tZSk7cmV0dXJuKDIqKGUtaSkrcytsKSpyKygtMyooZS1pKS0yKnMtbCkqYStzKm8rZX1mdW5jdGlvbiBhaSh0KXtpZihQKHQpKXt2YXIgZT10Lmxlbmd0aDtpZihQKHRbMF0pKXtmb3IodmFyIGk9W10sbj0wO248ZTtuKyspaS5wdXNoKHFlLmNhbGwodFtuXSkpO3JldHVybiBpfXJldHVybiBxZS5jYWxsKHQpfXJldHVybiB0fWZ1bmN0aW9uIHJpKHQpe3JldHVybiB0WzBdPU1hdGguZmxvb3IodFswXSksdFsxXT1NYXRoLmZsb29yKHRbMV0pLHRbMl09TWF0aC5mbG9vcih0WzJdKSwicmdiYSgiK3Quam9pbigiLCIpKyIpIn1mdW5jdGlvbiBzaSh0LGUsaSxuLGEsbyl7dmFyIHI9dC5fZ2V0dGVyLHM9dC5fc2V0dGVyLGw9InNwbGluZSI9PT1lLHU9bi5sZW5ndGg7aWYodSl7dmFyIGgsYz1QKG5bMF0udmFsdWUpLGQ9ITEsZj0hMSxwPWM/ZnVuY3Rpb24odCl7dmFyIGU9dFt0Lmxlbmd0aC0xXS52YWx1ZTtyZXR1cm4gUChlJiZlWzBdKT8yOjF9KG4pOjA7bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudGltZS1lLnRpbWV9KSxoPW5bdS0xXS50aW1lO2Zvcih2YXIgZz1bXSxtPVtdLHY9blswXS52YWx1ZSx5PSEwLHg9MDt4PHU7eCsrKXtnLnB1c2goblt4XS50aW1lL2gpO3ZhciBfPW5beF0udmFsdWU7aWYoYyYmaWkoXyx2LHApfHwhYyYmXz09PXZ8fCh5PSExKSwic3RyaW5nIj09dHlwZW9mKHY9Xykpe3ZhciB3PVJlKF8pO3c/KF89dyxkPSEwKTpmPSEwfW0ucHVzaChfKX1pZihvfHwheSl7dmFyIGI9bVt1LTFdO2Zvcih4PTA7eDx1LTE7eCsrKWM/ZWkobVt4XSxiLHApOiFpc05hTihtW3hdKXx8aXNOYU4oYil8fGZ8fGR8fChtW3hdPWIpO2MmJmVpKHIodC5fdGFyZ2V0LGEpLGIscCk7dmFyIFMsTSxJLFQsQSxEPTAsQz0wO2lmKGQpdmFyIEw9WzAsMCwwLDBdO3ZhciBrPW5ldyB4ZSh7dGFyZ2V0OnQuX3RhcmdldCxsaWZlOmgsbG9vcDp0Ll9sb29wLGRlbGF5OnQuX2RlbGF5LG9uZnJhbWU6ZnVuY3Rpb24odCxlKXt2YXIgaTtpZihlPDApaT0wO2Vsc2UgaWYoZTxDKXtmb3IoaT1NYXRoLm1pbihEKzEsdS0xKTswPD1pJiYhKGdbaV08PWUpO2ktLSk7aT1NYXRoLm1pbihpLHUtMil9ZWxzZXtmb3IoaT1EO2k8dSYmIShnW2ldPmUpO2krKyk7aT1NYXRoLm1pbihpLTEsdS0yKX1DPWU7dmFyIG49Z1soRD1pKSsxXS1nW2ldO2lmKDAhPW4paWYoUz0oZS1nW2ldKS9uLGwpaWYoST1tW2ldLE09bVswPT09aT9pOmktMV0sVD1tW3UtMjxpP3UtMTppKzFdLEE9bVt1LTM8aT91LTE6aSsyXSxjKW5pKE0sSSxULEEsUyxTKlMsUypTKlMscih0LGEpLHApO2Vsc2V7aWYoZClvPW5pKE0sSSxULEEsUyxTKlMsUypTKlMsTCwxKSxvPXJpKEwpO2Vsc2V7aWYoZilyZXR1cm4gUWUoSSxULFMpO289b2koTSxJLFQsQSxTLFMqUyxTKlMqUyl9cyh0LGEsbyl9ZWxzZSBpZihjKXRpKG1baV0sbVtpKzFdLFMscih0LGEpLHApO2Vsc2V7dmFyIG87aWYoZCl0aShtW2ldLG1baSsxXSxTLEwsMSksbz1yaShMKTtlbHNle2lmKGYpcmV0dXJuIFFlKG1baV0sbVtpKzFdLFMpO289SmUobVtpXSxtW2krMV0sUyl9cyh0LGEsbyl9fSxvbmRlc3Ryb3k6aX0pO3JldHVybiBlJiYic3BsaW5lIiE9PWUmJihrLmVhc2luZz1lKSxrfX19ZnVuY3Rpb24gbGkodCxlLGksbil7dGhpcy5fdHJhY2tzPXt9LHRoaXMuX3RhcmdldD10LHRoaXMuX2xvb3A9ZXx8ITEsdGhpcy5fZ2V0dGVyPWl8fEtlLHRoaXMuX3NldHRlcj1ufHwkZSx0aGlzLl9jbGlwQ291bnQ9MCx0aGlzLl9kZWxheT0wLHRoaXMuX2RvbmVMaXN0PVtdLHRoaXMuX29uZnJhbWVMaXN0PVtdLHRoaXMuX2NsaXBMaXN0PVtdfWxpLnByb3RvdHlwZT17d2hlbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3RyYWNrcztmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXtpZighaVtuXSl7aVtuXT1bXTt2YXIgbz10aGlzLl9nZXR0ZXIodGhpcy5fdGFyZ2V0LG4pO2lmKG51bGw9PW8pY29udGludWU7MCE9PXQmJmlbbl0ucHVzaCh7dGltZTowLHZhbHVlOmFpKG8pfSl9aVtuXS5wdXNoKHt0aW1lOnQsdmFsdWU6ZVtuXX0pfXJldHVybiB0aGlzfSxkdXJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uZnJhbWVMaXN0LnB1c2godCksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX2NsaXBMaXN0Lmxlbmd0aDt0KyspdGhpcy5fY2xpcExpc3RbdF0ucGF1c2UoKTt0aGlzLl9wYXVzZWQ9ITB9LHJlc3VtZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fY2xpcExpc3QubGVuZ3RoO3QrKyl0aGlzLl9jbGlwTGlzdFt0XS5yZXN1bWUoKTt0aGlzLl9wYXVzZWQ9ITF9LGlzUGF1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9wYXVzZWR9LF9kb25lQ2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLl90cmFja3M9e30sdGhpcy5fY2xpcExpc3QubGVuZ3RoPTA7Zm9yKHZhciB0PXRoaXMuX2RvbmVMaXN0LGU9dC5sZW5ndGgsaT0wO2k8ZTtpKyspdFtpXS5jYWxsKHRoaXMpfSxzdGFydDpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkoKXstLWF8fG8uX2RvbmVDYWxsYmFjaygpfXZhciBuLG89dGhpcyxhPTA7Zm9yKHZhciByIGluIHRoaXMuX3RyYWNrcylpZih0aGlzLl90cmFja3MuaGFzT3duUHJvcGVydHkocikpe3ZhciBzPXNpKHRoaXMsdCxpLHRoaXMuX3RyYWNrc1tyXSxyLGUpO3MmJih0aGlzLl9jbGlwTGlzdC5wdXNoKHMpLGErKyx0aGlzLmFuaW1hdGlvbiYmdGhpcy5hbmltYXRpb24uYWRkQ2xpcChzKSxuPXMpfWlmKG4pe3ZhciBsPW4ub25mcmFtZTtuLm9uZnJhbWU9ZnVuY3Rpb24odCxlKXtsKHQsZSk7Zm9yKHZhciBpPTA7aTxvLl9vbmZyYW1lTGlzdC5sZW5ndGg7aSsrKW8uX29uZnJhbWVMaXN0W2ldKHQsZSl9fXJldHVybiBhfHx0aGlzLl9kb25lQ2FsbGJhY2soKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jbGlwTGlzdCxpPXRoaXMuYW5pbWF0aW9uLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTt0JiZvLm9uZnJhbWUodGhpcy5fdGFyZ2V0LDEpLGkmJmkucmVtb3ZlQ2xpcChvKX1lLmxlbmd0aD0wfSxkZWxheTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVsYXk9dCx0aGlzfSxkb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9kb25lTGlzdC5wdXNoKHQpLHRoaXN9LGdldENsaXBzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NsaXBMaXN0fX07dmFyIHVpPTE7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih1aT1NYXRoLm1heCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSwxKSk7dmFyIGhpPXVpLGNpPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBkaSgpe3RoaXMuYW5pbWF0b3JzPVtdfXZhciBmaT1jaTtmdW5jdGlvbiBwaSh0LGUsaSxuLG8sYSxyLHMpe3oobik/KGE9byxvPW4sbj0wKTpPKG8pPyhhPW8sbz0ibGluZWFyIixuPTApOk8obik/KGE9bixuPTApOmk9TyhpKT8oYT1pLDUwMCk6aXx8NTAwLHQuc3RvcEFuaW1hdGlvbigpLGZ1bmN0aW9uIHQoZSxpLG4sbyxhLHIscyl7dmFyIGw9e307dmFyIHU9MDtmb3IodmFyIGggaW4gbylvLmhhc093blByb3BlcnR5KGgpJiYobnVsbCE9bltoXT9SKG9baF0pJiYhUChvW2hdKT90KGUsaT9pKyIuIitoOmgsbltoXSxvW2hdLGEscixzKToocz8obFtoXT1uW2hdLGdpKGUsaSxoLG9baF0pKTpsW2hdPW9baF0sdSsrKTpudWxsPT1vW2hdfHxzfHxnaShlLGksaCxvW2hdKSk7MDx1JiZlLmFuaW1hdGUoaSwhMSkud2hlbihudWxsPT1hPzUwMDphLGwpLmRlbGF5KHJ8fDApfSh0LCIiLHQsZSxpLG4scyk7dmFyIGw9dC5hbmltYXRvcnMuc2xpY2UoKSx1PWwubGVuZ3RoO2Z1bmN0aW9uIGgoKXstLXV8fGEmJmEoKX11fHxhJiZhKCk7Zm9yKHZhciBjPTA7YzxsLmxlbmd0aDtjKyspbFtjXS5kb25lKGgpLnN0YXJ0KG8scil9ZnVuY3Rpb24gZ2kodCxlLGksbil7aWYoZSl7dmFyIG89e307b1tlXT17fSxvW2VdW2ldPW4sdC5hdHRyKG8pfWVsc2UgdC5hdHRyKGksbil9ZGkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkaSxhbmltYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIGksbj0hMSxvPXRoaXMsYT10aGlzLl9fenI7aWYodCl7dmFyIHI9dC5zcGxpdCgiLiIpLHM9bztuPSJzaGFwZSI9PT1yWzBdO2Zvcih2YXIgbD0wLHU9ci5sZW5ndGg7bDx1O2wrKylzPXMmJnNbcltsXV07cyYmKGk9cyl9ZWxzZSBpPW87aWYoaSl7dmFyIGg9by5hbmltYXRvcnMsYz1uZXcgbGkoaSxlKTtyZXR1cm4gYy5kdXJpbmcoZnVuY3Rpb24odCl7by5kaXJ0eShuKX0pLmRvbmUoZnVuY3Rpb24oKXtoLnNwbGljZShfKGgsYyksMSl9KSxoLnB1c2goYyksYSYmYS5hbmltYXRpb24uYWRkQW5pbWF0b3IoYyksY31maSgnUHJvcGVydHkgIicrdCsnIiBpcyBub3QgZXhpc3RlZCBpbiBlbGVtZW50ICcrby5pZCl9LHN0b3BBbmltYXRpb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYW5pbWF0b3JzLGk9ZS5sZW5ndGgsbj0wO248aTtuKyspZVtuXS5zdG9wKHQpO3JldHVybiBlLmxlbmd0aD0wLHRoaXN9LGFuaW1hdGVUbzpmdW5jdGlvbih0LGUsaSxuLG8sYSl7cGkodGhpcyx0LGUsaSxuLG8sYSl9LGFuaW1hdGVGcm9tOmZ1bmN0aW9uKHQsZSxpLG4sbyxhKXtwaSh0aGlzLHQsZSxpLG4sbyxhLCEwKX19O3ZhciBtaT1mdW5jdGlvbih0KXtmZS5jYWxsKHRoaXMsdCksQ3QuY2FsbCh0aGlzLHQpLGRpLmNhbGwodGhpcyx0KSx0aGlzLmlkPXQuaWR8fG4oKX07bWkucHJvdG90eXBlPXt0eXBlOiJlbGVtZW50IixuYW1lOiIiLF9fenI6bnVsbCxpZ25vcmU6ITEsY2xpcFBhdGg6bnVsbCxpc0dyb3VwOiExLGRyaWZ0OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuZHJhZ2dhYmxlKXtjYXNlImhvcml6b250YWwiOmU9MDticmVhaztjYXNlInZlcnRpY2FsIjp0PTB9dmFyIGk9dGhpcy50cmFuc2Zvcm07KGk9aXx8KHRoaXMudHJhbnNmb3JtPVsxLDAsMCwxLDAsMF0pKVs0XSs9dCxpWzVdKz1lLHRoaXMuZGVjb21wb3NlVHJhbnNmb3JtKCksdGhpcy5kaXJ0eSghMSl9LGJlZm9yZVVwZGF0ZTpmdW5jdGlvbigpe30sYWZ0ZXJVcGRhdGU6ZnVuY3Rpb24oKXt9LHVwZGF0ZTpmdW5jdGlvbigpe3RoaXMudXBkYXRlVHJhbnNmb3JtKCl9LHRyYXZlcnNlOmZ1bmN0aW9uKHQsZSl7fSxhdHRyS1Y6ZnVuY3Rpb24odCxlKXtpZigicG9zaXRpb24iPT09dHx8InNjYWxlIj09PXR8fCJvcmlnaW4iPT09dCl7aWYoZSl7dmFyIGk9dGhpc1t0XTsoaT1pfHwodGhpc1t0XT1bXSkpWzBdPWVbMF0saVsxXT1lWzFdfX1lbHNlIHRoaXNbdF09ZX0saGlkZTpmdW5jdGlvbigpe3RoaXMuaWdub3JlPSEwLHRoaXMuX196ciYmdGhpcy5fX3pyLnJlZnJlc2goKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuaWdub3JlPSExLHRoaXMuX196ciYmdGhpcy5fX3pyLnJlZnJlc2goKX0sYXR0cjpmdW5jdGlvbih0LGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aGlzLmF0dHJLVih0LGUpO2Vsc2UgaWYoUih0KSlmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZ0aGlzLmF0dHJLVihpLHRbaV0pO3JldHVybiB0aGlzLmRpcnR5KCExKSx0aGlzfSxzZXRDbGlwUGF0aDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fenI7ZSYmdC5hZGRTZWxmVG9acihlKSx0aGlzLmNsaXBQYXRoJiZ0aGlzLmNsaXBQYXRoIT09dCYmdGhpcy5yZW1vdmVDbGlwUGF0aCgpLCh0aGlzLmNsaXBQYXRoPXQpLl9fenI9ZSwodC5fX2NsaXBUYXJnZXQ9dGhpcykuZGlydHkoITEpfSxyZW1vdmVDbGlwUGF0aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY2xpcFBhdGg7dCYmKHQuX196ciYmdC5yZW1vdmVTZWxmRnJvbVpyKHQuX196ciksdC5fX3pyPW51bGwsdC5fX2NsaXBUYXJnZXQ9bnVsbCx0aGlzLmNsaXBQYXRoPW51bGwsdGhpcy5kaXJ0eSghMSkpfSxhZGRTZWxmVG9acjpmdW5jdGlvbih0KXt0aGlzLl9fenI9dDt2YXIgZT10aGlzLmFuaW1hdG9ycztpZihlKWZvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXQuYW5pbWF0aW9uLmFkZEFuaW1hdG9yKGVbaV0pO3RoaXMuY2xpcFBhdGgmJnRoaXMuY2xpcFBhdGguYWRkU2VsZlRvWnIodCl9LHJlbW92ZVNlbGZGcm9tWnI6ZnVuY3Rpb24odCl7dGhpcy5fX3pyPW51bGw7dmFyIGU9dGhpcy5hbmltYXRvcnM7aWYoZSlmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl0LmFuaW1hdGlvbi5yZW1vdmVBbmltYXRvcihlW2ldKTt0aGlzLmNsaXBQYXRoJiZ0aGlzLmNsaXBQYXRoLnJlbW92ZVNlbGZGcm9tWnIodCl9fSxiKG1pLGRpKSxiKG1pLGZlKSxiKG1pLEN0KTt2YXIgdmkseWkseGksX2ksd2k9YnQsYmk9TWF0aC5taW4sU2k9TWF0aC5tYXg7ZnVuY3Rpb24gTWkodCxlLGksbil7aTwwJiYodCs9aSxpPS1pKSxuPDAmJihlKz1uLG49LW4pLHRoaXMueD10LHRoaXMueT1lLHRoaXMud2lkdGg9aSx0aGlzLmhlaWdodD1ufU1pLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWksdW5pb246ZnVuY3Rpb24odCl7dmFyIGU9YmkodC54LHRoaXMueCksaT1iaSh0LnksdGhpcy55KTt0aGlzLndpZHRoPVNpKHQueCt0LndpZHRoLHRoaXMueCt0aGlzLndpZHRoKS1lLHRoaXMuaGVpZ2h0PVNpKHQueSt0LmhlaWdodCx0aGlzLnkrdGhpcy5oZWlnaHQpLWksdGhpcy54PWUsdGhpcy55PWl9LGFwcGx5VHJhbnNmb3JtOih2aT1bXSx5aT1bXSx4aT1bXSxfaT1bXSxmdW5jdGlvbih0KXtpZih0KXt2aVswXT14aVswXT10aGlzLngsdmlbMV09X2lbMV09dGhpcy55LHlpWzBdPV9pWzBdPXRoaXMueCt0aGlzLndpZHRoLHlpWzFdPXhpWzFdPXRoaXMueSt0aGlzLmhlaWdodCx3aSh2aSx2aSx0KSx3aSh5aSx5aSx0KSx3aSh4aSx4aSx0KSx3aShfaSxfaSx0KSx0aGlzLng9YmkodmlbMF0seWlbMF0seGlbMF0sX2lbMF0pLHRoaXMueT1iaSh2aVsxXSx5aVsxXSx4aVsxXSxfaVsxXSk7dmFyIGU9U2kodmlbMF0seWlbMF0seGlbMF0sX2lbMF0pLGk9U2kodmlbMV0seWlbMV0seGlbMV0sX2lbMV0pO3RoaXMud2lkdGg9ZS10aGlzLngsdGhpcy5oZWlnaHQ9aS10aGlzLnl9fSksY2FsY3VsYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKHQpe3ZhciBlPXQud2lkdGgvdGhpcy53aWR0aCxpPXQuaGVpZ2h0L3RoaXMuaGVpZ2h0LG49ZWUoKTtyZXR1cm4gYWUobixuLFstdGhpcy54LC10aGlzLnldKSxzZShuLG4sW2UsaV0pLGFlKG4sbixbdC54LHQueV0pLG59LGludGVyc2VjdDpmdW5jdGlvbih0KXtpZighdClyZXR1cm4hMTt0IGluc3RhbmNlb2YgTWl8fCh0PU1pLmNyZWF0ZSh0KSk7dmFyIGU9dGhpcyxpPWUueCxuPWUueCtlLndpZHRoLG89ZS55LGE9ZS55K2UuaGVpZ2h0LHI9dC54LHM9dC54K3Qud2lkdGgsbD10LnksdT10LnkrdC5oZWlnaHQ7cmV0dXJuIShuPHJ8fHM8aXx8YTxsfHx1PG8pfSxjb250YWluOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcztyZXR1cm4gdD49aS54JiZ0PD1pLngraS53aWR0aCYmZT49aS55JiZlPD1pLnkraS5oZWlnaHR9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSh0aGlzLngsdGhpcy55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxjb3B5OmZ1bmN0aW9uKHQpe3RoaXMueD10LngsdGhpcy55PXQueSx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHR9LHBsYWluOmZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy54LHk6dGhpcy55LHdpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0fX19LE1pLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IE1pKHQueCx0LnksdC53aWR0aCx0LmhlaWdodCl9O3ZhciBJaT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdD10fHx7fSxtaS5jYWxsKHRoaXMsdCksdCl0Lmhhc093blByb3BlcnR5KGUpJiYodGhpc1tlXT10W2VdKTt0aGlzLl9jaGlsZHJlbj1bXSx0aGlzLl9fc3RvcmFnZT1udWxsLHRoaXMuX19kaXJ0eT0hMH07SWkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpJaSxpc0dyb3VwOiEwLHR5cGU6Imdyb3VwIixzaWxlbnQ6ITEsY2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4uc2xpY2UoKX0sY2hpbGRBdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2hpbGRyZW5bdF19LGNoaWxkT2ZOYW1lOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jaGlsZHJlbixpPTA7aTxlLmxlbmd0aDtpKyspaWYoZVtpXS5uYW1lPT09dClyZXR1cm4gZVtpXX0sY2hpbGRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5sZW5ndGh9LGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdCE9PXRoaXMmJnQucGFyZW50IT09dGhpcyYmKHRoaXMuX2NoaWxkcmVuLnB1c2godCksdGhpcy5fZG9BZGQodCkpLHRoaXN9LGFkZEJlZm9yZTpmdW5jdGlvbih0LGUpe2lmKHQmJnQhPT10aGlzJiZ0LnBhcmVudCE9PXRoaXMmJmUmJmUucGFyZW50PT09dGhpcyl7dmFyIGk9dGhpcy5fY2hpbGRyZW4sbj1pLmluZGV4T2YoZSk7MDw9biYmKGkuc3BsaWNlKG4sMCx0KSx0aGlzLl9kb0FkZCh0KSl9cmV0dXJuIHRoaXN9LF9kb0FkZDpmdW5jdGlvbih0KXt0LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpO3ZhciBlPSh0LnBhcmVudD10aGlzKS5fX3N0b3JhZ2UsaT10aGlzLl9fenI7ZSYmZSE9PXQuX19zdG9yYWdlJiYoZS5hZGRUb1N0b3JhZ2UodCksdCBpbnN0YW5jZW9mIElpJiZ0LmFkZENoaWxkcmVuVG9TdG9yYWdlKGUpKSxpJiZpLnJlZnJlc2goKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX196cixpPXRoaXMuX19zdG9yYWdlLG49dGhpcy5fY2hpbGRyZW4sbz1fKG4sdCk7cmV0dXJuIG88MHx8KG4uc3BsaWNlKG8sMSksdC5wYXJlbnQ9bnVsbCxpJiYoaS5kZWxGcm9tU3RvcmFnZSh0KSx0IGluc3RhbmNlb2YgSWkmJnQuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZShpKSksZSYmZS5yZWZyZXNoKCkpLHRoaXN9LHJlbW92ZUFsbDpmdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLl9jaGlsZHJlbixuPXRoaXMuX19zdG9yYWdlO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspdD1pW2VdLG4mJihuLmRlbEZyb21TdG9yYWdlKHQpLHQgaW5zdGFuY2VvZiBJaSYmdC5kZWxDaGlsZHJlbkZyb21TdG9yYWdlKG4pKSx0LnBhcmVudD1udWxsO3JldHVybiBpLmxlbmd0aD0wLHRoaXN9LGVhY2hDaGlsZDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLl9jaGlsZHJlbixuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvPWlbbl07dC5jYWxsKGUsbyxuKX1yZXR1cm4gdGhpc30sdHJhdmVyc2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MDtpPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtpKyspe3ZhciBuPXRoaXMuX2NoaWxkcmVuW2ldO3QuY2FsbChlLG4pLCJncm91cCI9PT1uLnR5cGUmJm4udHJhdmVyc2UodCxlKX1yZXR1cm4gdGhpc30sYWRkQ2hpbGRyZW5Ub1N0b3JhZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9jaGlsZHJlbi5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLl9jaGlsZHJlbltlXTt0LmFkZFRvU3RvcmFnZShpKSxpIGluc3RhbmNlb2YgSWkmJmkuYWRkQ2hpbGRyZW5Ub1N0b3JhZ2UodCl9fSxkZWxDaGlsZHJlbkZyb21TdG9yYWdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fY2hpbGRyZW4ubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5fY2hpbGRyZW5bZV07dC5kZWxGcm9tU3RvcmFnZShpKSxpIGluc3RhbmNlb2YgSWkmJmkuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZSh0KX19LGRpcnR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kaXJ0eT0hMCx0aGlzLl9fenImJnRoaXMuX196ci5yZWZyZXNoKCksdGhpc30sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLGk9bmV3IE1pKDAsMCwwLDApLG49dHx8dGhpcy5fY2hpbGRyZW4sbz1bXSxhPTA7YTxuLmxlbmd0aDthKyspe3ZhciByPW5bYV07aWYoIXIuaWdub3JlJiYhci5pbnZpc2libGUpe3ZhciBzPXIuZ2V0Qm91bmRpbmdSZWN0KCksbD1yLmdldExvY2FsVHJhbnNmb3JtKG8pO2w/KGkuY29weShzKSxpLmFwcGx5VHJhbnNmb3JtKGwpLChlPWV8fGkuY2xvbmUoKSkudW5pb24oaSkpOihlPWV8fHMuY2xvbmUoKSkudW5pb24ocyl9fXJldHVybiBlfHxpfX0sdyhJaSxtaSk7dmFyIFRpPTMyLEFpPTc7ZnVuY3Rpb24gRGkodCxlLGksbil7dmFyIG89ZSsxO2lmKG89PT1pKXJldHVybiAxO2lmKG4odFtvKytdLHRbZV0pPDApe2Zvcig7bzxpJiZuKHRbb10sdFtvLTFdKTwwOylvKys7IWZ1bmN0aW9uKHQsZSxpKXtpLS07Zm9yKDtlPGk7KXt2YXIgbj10W2VdO3RbZSsrXT10W2ldLHRbaS0tXT1ufX0odCxlLG8pfWVsc2UgZm9yKDtvPGkmJjA8PW4odFtvXSx0W28tMV0pOylvKys7cmV0dXJuIG8tZX1mdW5jdGlvbiBDaSh0LGUsaSxuLG8pe2ZvcihuPT09ZSYmbisrO248aTtuKyspe2Zvcih2YXIgYSxyPXRbbl0scz1lLGw9bjtzPGw7KW8ocix0W2E9cytsPj4+MV0pPDA/bD1hOnM9MSthO3ZhciB1PW4tcztzd2l0Y2godSl7Y2FzZSAzOnRbcyszXT10W3MrMl07Y2FzZSAyOnRbcysyXT10W3MrMV07Y2FzZSAxOnRbcysxXT10W3NdO2JyZWFrO2RlZmF1bHQ6Zm9yKDswPHU7KXRbcyt1XT10W3MrdS0xXSx1LS19dFtzXT1yfX1mdW5jdGlvbiBMaSh0LGUsaSxuLG8sYSl7dmFyIHI9MCxzPTAsbD0xO2lmKDA8YSh0LGVbaStvXSkpe2ZvcihzPW4tbztsPHMmJjA8YSh0LGVbaStvK2xdKTspKGw9MSsoKHI9bCk8PDEpKTw9MCYmKGw9cyk7czxsJiYobD1zKSxyKz1vLGwrPW99ZWxzZXtmb3Iocz1vKzE7bDxzJiZhKHQsZVtpK28tbF0pPD0wOykobD0xKygocj1sKTw8MSkpPD0wJiYobD1zKTtzPGwmJihsPXMpO3ZhciB1PXI7cj1vLWwsbD1vLXV9Zm9yKHIrKztyPGw7KXt2YXIgaD1yKyhsLXI+Pj4xKTswPGEodCxlW2kraF0pP3I9aCsxOmw9aH1yZXR1cm4gbH1mdW5jdGlvbiBraSh0LGUsaSxuLG8sYSl7dmFyIHI9MCxzPTAsbD0xO2lmKGEodCxlW2krb10pPDApe2ZvcihzPW8rMTtsPHMmJmEodCxlW2krby1sXSk8MDspKGw9MSsoKHI9bCk8PDEpKTw9MCYmKGw9cyk7czxsJiYobD1zKTt2YXIgdT1yO3I9by1sLGw9by11fWVsc2V7Zm9yKHM9bi1vO2w8cyYmMDw9YSh0LGVbaStvK2xdKTspKGw9MSsoKHI9bCk8PDEpKTw9MCYmKGw9cyk7czxsJiYobD1zKSxyKz1vLGwrPW99Zm9yKHIrKztyPGw7KXt2YXIgaD1yKyhsLXI+Pj4xKTthKHQsZVtpK2hdKTwwP2w9aDpyPWgrMX1yZXR1cm4gbH1mdW5jdGlvbiBQaShwLGcpe3ZhciByLHMsbT1BaSxsPTAsdj1bXTtmdW5jdGlvbiBlKHQpe3ZhciBlPXJbdF0saT1zW3RdLG49clt0KzFdLG89c1t0KzFdO3NbdF09aStvLHQ9PT1sLTMmJihyW3QrMV09clt0KzJdLHNbdCsxXT1zW3QrMl0pLGwtLTt2YXIgYT1raShwW25dLHAsZSxpLDAsZyk7ZSs9YSwwIT09KGktPWEpJiYwIT09KG89TGkocFtlK2ktMV0scCxuLG8sby0xLGcpKSYmKGk8PW8/ZnVuY3Rpb24odCxlLGksbil7dmFyIG89MDtmb3Iobz0wO288ZTtvKyspdltvXT1wW3Qrb107dmFyIGE9MCxyPWkscz10O2lmKHBbcysrXT1wW3IrK10sMD09LS1uKXtmb3Iobz0wO288ZTtvKyspcFtzK29dPXZbYStvXTtyZXR1cm59aWYoMT09PWUpe2ZvcihvPTA7bzxuO28rKylwW3Mrb109cFtyK29dO3JldHVybiBwW3Mrbl09dlthXX12YXIgbCx1LGgsYz1tO2Zvcig7Oyl7dT1sPTAsaD0hMTtkb3tpZihnKHBbcl0sdlthXSk8MCl7aWYocFtzKytdPXBbcisrXSx1KyssKGw9MCk9PS0tbil7aD0hMDticmVha319ZWxzZSBpZihwW3MrK109dlthKytdLGwrKyx1PTAsMT09LS1lKXtoPSEwO2JyZWFrfX13aGlsZSgobHx1KTxjKTtpZihoKWJyZWFrO2Rve2lmKDAhPT0obD1raShwW3JdLHYsYSxlLDAsZykpKXtmb3Iobz0wO288bDtvKyspcFtzK29dPXZbYStvXTtpZihzKz1sLGErPWwsKGUtPWwpPD0xKXtoPSEwO2JyZWFrfX1pZihwW3MrK109cFtyKytdLDA9PS0tbil7aD0hMDticmVha31pZigwIT09KHU9TGkodlthXSxwLHIsbiwwLGcpKSl7Zm9yKG89MDtvPHU7bysrKXBbcytvXT1wW3Irb107aWYocys9dSxyKz11LDA9PT0obi09dSkpe2g9ITA7YnJlYWt9fWlmKHBbcysrXT12W2ErK10sMT09LS1lKXtoPSEwO2JyZWFrfWMtLX13aGlsZShBaTw9bHx8QWk8PXUpO2lmKGgpYnJlYWs7YzwwJiYoYz0wKSxjKz0yfWlmKChtPWMpPDEmJihtPTEpLDE9PT1lKXtmb3Iobz0wO288bjtvKyspcFtzK29dPXBbcitvXTtwW3Mrbl09dlthXX1lbHNle2lmKDA9PT1lKXRocm93IG5ldyBFcnJvcjtmb3Iobz0wO288ZTtvKyspcFtzK29dPXZbYStvXX19KGUsaSxuLG8pOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPTA7Zm9yKG89MDtvPG47bysrKXZbb109cFtpK29dO3ZhciBhPXQrZS0xLHI9bi0xLHM9aStuLTEsbD0wLHU9MDtpZihwW3MtLV09cFthLS1dLDA9PS0tZSl7Zm9yKGw9cy0obi0xKSxvPTA7bzxuO28rKylwW2wrb109dltvXTtyZXR1cm59aWYoMT09PW4pe2Zvcih1PShzLT1lKSsxLGw9KGEtPWUpKzEsbz1lLTE7MDw9bztvLS0pcFt1K29dPXBbbCtvXTtyZXR1cm4gcFtzXT12W3JdfXZhciBoPW07Zm9yKDs7KXt2YXIgYz0wLGQ9MCxmPSExO2Rve2lmKGcodltyXSxwW2FdKTwwKXtpZihwW3MtLV09cFthLS1dLGMrKywoZD0wKT09LS1lKXtmPSEwO2JyZWFrfX1lbHNlIGlmKHBbcy0tXT12W3ItLV0sZCsrLGM9MCwxPT0tLW4pe2Y9ITA7YnJlYWt9fXdoaWxlKChjfGQpPGgpO2lmKGYpYnJlYWs7ZG97aWYoMCE9PShjPWUta2kodltyXSxwLHQsZSxlLTEsZykpKXtmb3IoZS09Yyx1PShzLT1jKSsxLGw9KGEtPWMpKzEsbz1jLTE7MDw9bztvLS0pcFt1K29dPXBbbCtvXTtpZigwPT09ZSl7Zj0hMDticmVha319aWYocFtzLS1dPXZbci0tXSwxPT0tLW4pe2Y9ITA7YnJlYWt9aWYoMCE9PShkPW4tTGkocFthXSx2LDAsbixuLTEsZykpKXtmb3Iobi09ZCx1PShzLT1kKSsxLGw9KHItPWQpKzEsbz0wO288ZDtvKyspcFt1K29dPXZbbCtvXTtpZihuPD0xKXtmPSEwO2JyZWFrfX1pZihwW3MtLV09cFthLS1dLDA9PS0tZSl7Zj0hMDticmVha31oLS19d2hpbGUoQWk8PWN8fEFpPD1kKTtpZihmKWJyZWFrO2g8MCYmKGg9MCksaCs9Mn0obT1oKTwxJiYobT0xKTtpZigxPT09bil7Zm9yKHU9KHMtPWUpKzEsbD0oYS09ZSkrMSxvPWUtMTswPD1vO28tLSlwW3Urb109cFtsK29dO3Bbc109dltyXX1lbHNle2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcjtmb3IobD1zLShuLTEpLG89MDtvPG47bysrKXBbbCtvXT12W29dfX0oZSxpLG4sbykpfXI9W10scz1bXSx0aGlzLm1lcmdlUnVucz1mdW5jdGlvbigpe2Zvcig7MTxsOyl7dmFyIHQ9bC0yO2lmKDE8PXQmJnNbdC0xXTw9c1t0XStzW3QrMV18fDI8PXQmJnNbdC0yXTw9c1t0XStzW3QtMV0pc1t0LTFdPHNbdCsxXSYmdC0tO2Vsc2UgaWYoc1t0XT5zW3QrMV0pYnJlYWs7ZSh0KX19LHRoaXMuZm9yY2VNZXJnZVJ1bnM9ZnVuY3Rpb24oKXtmb3IoOzE8bDspe3ZhciB0PWwtMjswPHQmJnNbdC0xXTxzW3QrMV0mJnQtLSxlKHQpfX0sdGhpcy5wdXNoUnVuPWZ1bmN0aW9uKHQsZSl7cltsXT10LHNbbF09ZSxsKz0xfX1mdW5jdGlvbiBOaSh0LGUsaSxuKXtpPWl8fDA7dmFyIG89KG49bnx8dC5sZW5ndGgpLWk7aWYoIShvPDIpKXt2YXIgYT0wO2lmKG88VGkpQ2kodCxpLG4saSsoYT1EaSh0LGksbixlKSksZSk7ZWxzZXt2YXIgcj1uZXcgUGkodCxlKSxzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO1RpPD10OyllfD0xJnQsdD4+PTE7cmV0dXJuIHQrZX0obyk7ZG97aWYoKGE9RGkodCxpLG4sZSkpPHMpe3ZhciBsPW87czxsJiYobD1zKSxDaSh0LGksaStsLGkrYSxlKSxhPWx9ci5wdXNoUnVuKGksYSksci5tZXJnZVJ1bnMoKSxvLT1hLGkrPWF9d2hpbGUoMCE9PW8pO3IuZm9yY2VNZXJnZVJ1bnMoKX19fWZ1bmN0aW9uIE9pKHQsZSl7cmV0dXJuIHQuemxldmVsPT09ZS56bGV2ZWw/dC56PT09ZS56P3QuejItZS56Mjp0LnotZS56OnQuemxldmVsLWUuemxldmVsfWZ1bmN0aW9uIEVpKCl7dGhpcy5fcm9vdHM9W10sdGhpcy5fZGlzcGxheUxpc3Q9W10sdGhpcy5fZGlzcGxheUxpc3RMZW49MH1FaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkVpLHRyYXZlcnNlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTA7aTx0aGlzLl9yb290cy5sZW5ndGg7aSsrKXRoaXMuX3Jvb3RzW2ldLnRyYXZlcnNlKHQsZSl9LGdldERpc3BsYXlMaXN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZXx8ITEsdCYmdGhpcy51cGRhdGVEaXNwbGF5TGlzdChlKSx0aGlzLl9kaXNwbGF5TGlzdH0sdXBkYXRlRGlzcGxheUxpc3Q6ZnVuY3Rpb24odCl7dGhpcy5fZGlzcGxheUxpc3RMZW49MDtmb3IodmFyIGU9dGhpcy5fcm9vdHMsaT10aGlzLl9kaXNwbGF5TGlzdCxuPTAsbz1lLmxlbmd0aDtuPG87bisrKXRoaXMuX3VwZGF0ZUFuZEFkZERpc3BsYXlhYmxlKGVbbl0sbnVsbCx0KTtpLmxlbmd0aD10aGlzLl9kaXNwbGF5TGlzdExlbix2LmNhbnZhc1N1cHBvcnRlZCYmTmkoaSxPaSl9LF91cGRhdGVBbmRBZGREaXNwbGF5YWJsZTpmdW5jdGlvbih0LGUsaSl7aWYoIXQuaWdub3JlfHxpKXt0LmJlZm9yZVVwZGF0ZSgpLHQuX19kaXJ0eSYmdC51cGRhdGUoKSx0LmFmdGVyVXBkYXRlKCk7dmFyIG49dC5jbGlwUGF0aDtpZihuKXtlPWU/ZS5zbGljZSgpOltdO2Zvcih2YXIgbz1uLGE9dDtvOylvLnBhcmVudD1hLG8udXBkYXRlVHJhbnNmb3JtKCksZS5wdXNoKG8pLG89KGE9bykuY2xpcFBhdGh9aWYodC5pc0dyb3VwKXtmb3IodmFyIHI9dC5fY2hpbGRyZW4scz0wO3M8ci5sZW5ndGg7cysrKXt2YXIgbD1yW3NdO3QuX19kaXJ0eSYmKGwuX19kaXJ0eT0hMCksdGhpcy5fdXBkYXRlQW5kQWRkRGlzcGxheWFibGUobCxlLGkpfXQuX19kaXJ0eT0hMX1lbHNlIHQuX19jbGlwUGF0aHM9ZSx0aGlzLl9kaXNwbGF5TGlzdFt0aGlzLl9kaXNwbGF5TGlzdExlbisrXT10fX0sYWRkUm9vdDpmdW5jdGlvbih0KXt0Ll9fc3RvcmFnZSE9PXRoaXMmJih0IGluc3RhbmNlb2YgSWkmJnQuYWRkQ2hpbGRyZW5Ub1N0b3JhZ2UodGhpcyksdGhpcy5hZGRUb1N0b3JhZ2UodCksdGhpcy5fcm9vdHMucHVzaCh0KSl9LGRlbFJvb3Q6ZnVuY3Rpb24odCl7aWYobnVsbD09dCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9yb290cy5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLl9yb290c1tlXTtpIGluc3RhbmNlb2YgSWkmJmkuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZSh0aGlzKX1yZXR1cm4gdGhpcy5fcm9vdHM9W10sdGhpcy5fZGlzcGxheUxpc3Q9W10sdm9pZCh0aGlzLl9kaXNwbGF5TGlzdExlbj0wKX1pZih0IGluc3RhbmNlb2YgQXJyYXkpe2U9MDtmb3IodmFyIG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmRlbFJvb3QodFtlXSl9ZWxzZXt2YXIgbz1fKHRoaXMuX3Jvb3RzLHQpOzA8PW8mJih0aGlzLmRlbEZyb21TdG9yYWdlKHQpLHRoaXMuX3Jvb3RzLnNwbGljZShvLDEpLHQgaW5zdGFuY2VvZiBJaSYmdC5kZWxDaGlsZHJlbkZyb21TdG9yYWdlKHRoaXMpKX19LGFkZFRvU3RvcmFnZTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmKHQuX19zdG9yYWdlPXRoaXMsdC5kaXJ0eSghMSkpLHRoaXN9LGRlbEZyb21TdG9yYWdlOmZ1bmN0aW9uKHQpe3JldHVybiB0JiYodC5fX3N0b3JhZ2U9bnVsbCksdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuX3JlbmRlckxpc3Q9dGhpcy5fcm9vdHM9bnVsbH0sZGlzcGxheWFibGVTb3J0RnVuYzpPaX07dmFyIHppPXtzaGFkb3dCbHVyOjEsc2hhZG93T2Zmc2V0WDoxLHNoYWRvd09mZnNldFk6MSx0ZXh0U2hhZG93Qmx1cjoxLHRleHRTaGFkb3dPZmZzZXRYOjEsdGV4dFNoYWRvd09mZnNldFk6MSx0ZXh0Qm94U2hhZG93Qmx1cjoxLHRleHRCb3hTaGFkb3dPZmZzZXRYOjEsdGV4dEJveFNoYWRvd09mZnNldFk6MX0sUmk9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB6aS5oYXNPd25Qcm9wZXJ0eShlKT9pKnQuZHByOml9LEJpPXtOT05FOjAsU1RZTEVfQklORDoxLFBMQUlOX1RFWFQ6Mn0sVmk9OSxHaT1bWyJzaGFkb3dCbHVyIiwwXSxbInNoYWRvd09mZnNldFgiLDBdLFsic2hhZG93T2Zmc2V0WSIsMF0sWyJzaGFkb3dDb2xvciIsIiMwMDAiXSxbImxpbmVDYXAiLCJidXR0Il0sWyJsaW5lSm9pbiIsIm1pdGVyIl0sWyJtaXRlckxpbWl0IiwxMF1dLEZpPWZ1bmN0aW9uKHQpe3RoaXMuZXh0ZW5kRnJvbSh0LCExKX07ZnVuY3Rpb24gV2kodCxlLGkpe3ZhciBuPW51bGw9PWUueD8wOmUueCxvPW51bGw9PWUueDI/MTplLngyLGE9bnVsbD09ZS55PzA6ZS55LHI9bnVsbD09ZS55Mj8wOmUueTI7cmV0dXJuIGUuZ2xvYmFsfHwobj1uKmkud2lkdGgraS54LG89byppLndpZHRoK2kueCxhPWEqaS5oZWlnaHQraS55LHI9cippLmhlaWdodCtpLnkpLG49aXNOYU4obik/MDpuLG89aXNOYU4obyk/MTpvLGE9aXNOYU4oYSk/MDphLHI9aXNOYU4ocik/MDpyLHQuY3JlYXRlTGluZWFyR3JhZGllbnQobixhLG8scil9ZnVuY3Rpb24gSGkodCxlLGkpe3ZhciBuPWkud2lkdGgsbz1pLmhlaWdodCxhPU1hdGgubWluKG4sbykscj1udWxsPT1lLng/LjU6ZS54LHM9bnVsbD09ZS55Py41OmUueSxsPW51bGw9PWUucj8uNTplLnI7cmV0dXJuIGUuZ2xvYmFsfHwocj1yKm4raS54LHM9cypvK2kueSxsKj1hKSx0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHIscywwLHIscyxsKX1GaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkZpLGZpbGw6IiMwMDAiLHN0cm9rZTpudWxsLG9wYWNpdHk6MSxmaWxsT3BhY2l0eTpudWxsLHN0cm9rZU9wYWNpdHk6bnVsbCxsaW5lRGFzaDpudWxsLGxpbmVEYXNoT2Zmc2V0OjAsc2hhZG93Qmx1cjowLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsbGluZVdpZHRoOjEsc3Ryb2tlTm9TY2FsZTohMSx0ZXh0Om51bGwsZm9udDpudWxsLHRleHRGb250Om51bGwsZm9udFN0eWxlOm51bGwsZm9udFdlaWdodDpudWxsLGZvbnRTaXplOm51bGwsZm9udEZhbWlseTpudWxsLHRleHRUYWc6bnVsbCx0ZXh0RmlsbDoiIzAwMCIsdGV4dFN0cm9rZTpudWxsLHRleHRXaWR0aDpudWxsLHRleHRIZWlnaHQ6bnVsbCx0ZXh0U3Ryb2tlV2lkdGg6MCx0ZXh0TGluZUhlaWdodDpudWxsLHRleHRQb3NpdGlvbjoiaW5zaWRlIix0ZXh0UmVjdDpudWxsLHRleHRPZmZzZXQ6bnVsbCx0ZXh0QWxpZ246bnVsbCx0ZXh0VmVydGljYWxBbGlnbjpudWxsLHRleHREaXN0YW5jZTo1LHRleHRTaGFkb3dDb2xvcjoidHJhbnNwYXJlbnQiLHRleHRTaGFkb3dCbHVyOjAsdGV4dFNoYWRvd09mZnNldFg6MCx0ZXh0U2hhZG93T2Zmc2V0WTowLHRleHRCb3hTaGFkb3dDb2xvcjoidHJhbnNwYXJlbnQiLHRleHRCb3hTaGFkb3dCbHVyOjAsdGV4dEJveFNoYWRvd09mZnNldFg6MCx0ZXh0Qm94U2hhZG93T2Zmc2V0WTowLHRyYW5zZm9ybVRleHQ6ITEsdGV4dFJvdGF0aW9uOjAsdGV4dE9yaWdpbjpudWxsLHRleHRCYWNrZ3JvdW5kQ29sb3I6bnVsbCx0ZXh0Qm9yZGVyQ29sb3I6bnVsbCx0ZXh0Qm9yZGVyV2lkdGg6MCx0ZXh0Qm9yZGVyUmFkaXVzOjAsdGV4dFBhZGRpbmc6bnVsbCxyaWNoOm51bGwsdHJ1bmNhdGU6bnVsbCxibGVuZDpudWxsLGJpbmQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMsbz1pJiZpLnN0eWxlLGE9IW98fHQuX19hdHRyQ2FjaGVkQnkhPT1CaS5TVFlMRV9CSU5EO3QuX19hdHRyQ2FjaGVkQnk9QmkuU1RZTEVfQklORDtmb3IodmFyIHI9MDtyPEdpLmxlbmd0aDtyKyspe3ZhciBzPUdpW3JdLGw9c1swXTshYSYmbltsXT09PW9bbF18fCh0W2xdPVJpKHQsbCxuW2xdfHxzWzFdKSl9aWYoIWEmJm4uZmlsbD09PW8uZmlsbHx8KHQuZmlsbFN0eWxlPW4uZmlsbCksIWEmJm4uc3Ryb2tlPT09by5zdHJva2V8fCh0LnN0cm9rZVN0eWxlPW4uc3Ryb2tlKSwhYSYmbi5vcGFjaXR5PT09by5vcGFjaXR5fHwodC5nbG9iYWxBbHBoYT1udWxsPT1uLm9wYWNpdHk/MTpuLm9wYWNpdHkpLCFhJiZuLmJsZW5kPT09by5ibGVuZHx8KHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPW4uYmxlbmR8fCJzb3VyY2Utb3ZlciIpLHRoaXMuaGFzU3Ryb2tlKCkpe3ZhciB1PW4ubGluZVdpZHRoO3QubGluZVdpZHRoPXUvKHRoaXMuc3Ryb2tlTm9TY2FsZSYmZSYmZS5nZXRMaW5lU2NhbGU/ZS5nZXRMaW5lU2NhbGUoKToxKX19LGhhc0ZpbGw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZpbGw7cmV0dXJuIG51bGwhPXQmJiJub25lIiE9PXR9LGhhc1N0cm9rZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3Ryb2tlO3JldHVybiBudWxsIT10JiYibm9uZSIhPT10JiYwPHRoaXMubGluZVdpZHRofSxleHRlbmRGcm9tOmZ1bmN0aW9uKHQsZSl7aWYodClmb3IodmFyIGkgaW4gdCkhdC5oYXNPd25Qcm9wZXJ0eShpKXx8ITAhPT1lJiYoITE9PT1lP3RoaXMuaGFzT3duUHJvcGVydHkoaSk6bnVsbD09dFtpXSl8fCh0aGlzW2ldPXRbaV0pfSxzZXQ6ZnVuY3Rpb24odCxlKXsic3RyaW5nIj09dHlwZW9mIHQ/dGhpc1t0XT1lOnRoaXMuZXh0ZW5kRnJvbSh0LCEwKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdC5leHRlbmRGcm9tKHRoaXMsITApLHR9LGdldEdyYWRpZW50OmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG49KCJyYWRpYWwiPT09ZS50eXBlP0hpOldpKSh0LGUsaSksbz1lLmNvbG9yU3RvcHMsYT0wO2E8by5sZW5ndGg7YSsrKW4uYWRkQ29sb3JTdG9wKG9bYV0ub2Zmc2V0LG9bYV0uY29sb3IpO3JldHVybiBufX07Zm9yKHZhciBaaT1GaS5wcm90b3R5cGUsVWk9MDtVaTxHaS5sZW5ndGg7VWkrKyl7dmFyIFhpPUdpW1VpXTtYaVswXWluIFppfHwoWmlbWGlbMF1dPVhpWzFdKX1GaS5nZXRHcmFkaWVudD1aaS5nZXRHcmFkaWVudDtmdW5jdGlvbiBZaSh0LGUpe3RoaXMuaW1hZ2U9dCx0aGlzLnJlcGVhdD1lLHRoaXMudHlwZT0icGF0dGVybiJ9ZnVuY3Rpb24gamkoKXtyZXR1cm4hMX1mdW5jdGlvbiBxaSh0LGUsaSl7dmFyIG49ZygpLG89ZS5nZXRXaWR0aCgpLGE9ZS5nZXRIZWlnaHQoKSxyPW4uc3R5bGU7cmV0dXJuIHImJihyLnBvc2l0aW9uPSJhYnNvbHV0ZSIsci5sZWZ0PTAsci50b3A9MCxyLndpZHRoPW8rInB4IixyLmhlaWdodD1hKyJweCIsbi5zZXRBdHRyaWJ1dGUoImRhdGEtenItZG9tLWlkIix0KSksbi53aWR0aD1vKmksbi5oZWlnaHQ9YSppLG59ZnVuY3Rpb24gS2kodCxlLGkpe3ZhciBuO2k9aXx8aGksInN0cmluZyI9PXR5cGVvZiB0P249cWkodCxlLGkpOlIodCkmJih0PShuPXQpLmlkKSx0aGlzLmlkPXQ7dmFyIG89KHRoaXMuZG9tPW4pLnN0eWxlO28mJihuLm9uc2VsZWN0c3RhcnQ9amksb1siLXdlYmtpdC11c2VyLXNlbGVjdCJdPSJub25lIixvWyJ1c2VyLXNlbGVjdCJdPSJub25lIixvWyItd2Via2l0LXRvdWNoLWNhbGxvdXQiXT0ibm9uZSIsb1siLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIl09InJnYmEoMCwwLDAsMCkiLG8ucGFkZGluZz0wLG8ubWFyZ2luPTAsb1siYm9yZGVyLXdpZHRoIl09MCksdGhpcy5kb21CYWNrPW51bGwsdGhpcy5jdHhCYWNrPW51bGwsdGhpcy5wYWludGVyPWUsdGhpcy5jb25maWc9bnVsbCx0aGlzLmNsZWFyQ29sb3I9MCx0aGlzLm1vdGlvbkJsdXI9ITEsdGhpcy5sYXN0RnJhbWVBbHBoYT0uNyx0aGlzLmRwcj1pfUtpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S2ksX19kaXJ0eTohMCxfX3VzZWQ6IShZaS5wcm90b3R5cGUuZ2V0Q2FudmFzUGF0dGVybj1mdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVQYXR0ZXJuKHRoaXMuaW1hZ2UsdGhpcy5yZXBlYXR8fCJyZXBlYXQiKX0pLF9fZHJhd0luZGV4OjAsX19zdGFydEluZGV4OjAsX19lbmRJbmRleDowLGluY3JlbWVudGFsOiExLGdldEVsZW1lbnRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZW5kSW5kZXgtdGhpcy5fX3N0YXJ0SW5kZXh9LGluaXRDb250ZXh0OmZ1bmN0aW9uKCl7dGhpcy5jdHg9dGhpcy5kb20uZ2V0Q29udGV4dCgiMmQiKSx0aGlzLmN0eC5kcHI9dGhpcy5kcHJ9LGNyZWF0ZUJhY2tCdWZmZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRwcjt0aGlzLmRvbUJhY2s9cWkoImJhY2stIit0aGlzLmlkLHRoaXMucGFpbnRlcix0KSx0aGlzLmN0eEJhY2s9dGhpcy5kb21CYWNrLmdldENvbnRleHQoIjJkIiksMSE9PXQmJnRoaXMuY3R4QmFjay5zY2FsZSh0LHQpfSxyZXNpemU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmRwcixuPXRoaXMuZG9tLG89bi5zdHlsZSxhPXRoaXMuZG9tQmFjaztvJiYoby53aWR0aD10KyJweCIsby5oZWlnaHQ9ZSsicHgiKSxuLndpZHRoPXQqaSxuLmhlaWdodD1lKmksYSYmKGEud2lkdGg9dCppLGEuaGVpZ2h0PWUqaSwxIT09aSYmdGhpcy5jdHhCYWNrLnNjYWxlKGksaSkpfSxjbGVhcjpmdW5jdGlvbih0LGUpe3ZhciBpLG49dGhpcy5kb20sbz10aGlzLmN0eCxhPW4ud2lkdGgscj1uLmhlaWdodCxzPShlPWV8fHRoaXMuY2xlYXJDb2xvcix0aGlzLm1vdGlvbkJsdXImJiF0KSxsPXRoaXMubGFzdEZyYW1lQWxwaGEsdT10aGlzLmRwcjtzJiYodGhpcy5kb21CYWNrfHx0aGlzLmNyZWF0ZUJhY2tCdWZmZXIoKSx0aGlzLmN0eEJhY2suZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLmN0eEJhY2suZHJhd0ltYWdlKG4sMCwwLGEvdSxyL3UpKSxvLmNsZWFyUmVjdCgwLDAsYSxyKSxlJiYidHJhbnNwYXJlbnQiIT09ZSYmKGUuY29sb3JTdG9wcz8oaT1lLl9fY2FudmFzR3JhZGllbnR8fEZpLmdldEdyYWRpZW50KG8sZSx7eDowLHk6MCx3aWR0aDphLGhlaWdodDpyfSksZS5fX2NhbnZhc0dyYWRpZW50PWkpOmUuaW1hZ2UmJihpPVlpLnByb3RvdHlwZS5nZXRDYW52YXNQYXR0ZXJuLmNhbGwoZSxvKSksby5zYXZlKCksby5maWxsU3R5bGU9aXx8ZSxvLmZpbGxSZWN0KDAsMCxhLHIpLG8ucmVzdG9yZSgpKTtpZihzKXt2YXIgaD10aGlzLmRvbUJhY2s7by5zYXZlKCksby5nbG9iYWxBbHBoYT1sLG8uZHJhd0ltYWdlKGgsMCwwLGEsciksby5yZXN0b3JlKCl9fX07dmFyICRpPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyl8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSYmd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNil9LEppPW5ldyBiZSg1MCk7ZnVuY3Rpb24gUWkodCl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0O3ZhciBlPUppLmdldCh0KTtyZXR1cm4gZSYmZS5pbWFnZX1mdW5jdGlvbiB0bih0LGUsaSxuLG8pe2lmKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDtpZihlJiZlLl9fenJJbWFnZVNyYz09PXR8fCFpKXJldHVybiBlO3ZhciBhPUppLmdldCh0KSxyPXtob3N0RWw6aSxjYjpuLGNiUGF5bG9hZDpvfTtyZXR1cm4gYT9ubihlPWEuaW1hZ2UpfHxhLnBlbmRpbmcucHVzaChyKTooKGU9bmV3IEltYWdlKS5vbmxvYWQ9ZS5vbmVycm9yPWVuLEppLnB1dCh0LGUuX19jYWNoZWRJbWdPYmo9e2ltYWdlOmUscGVuZGluZzpbcl19KSxlLnNyYz1lLl9fenJJbWFnZVNyYz10KSxlfXJldHVybiBlfWZ1bmN0aW9uIGVuKCl7dmFyIHQ9dGhpcy5fX2NhY2hlZEltZ09iajt0aGlzLm9ubG9hZD10aGlzLm9uZXJyb3I9dGhpcy5fX2NhY2hlZEltZ09iaj1udWxsO2Zvcih2YXIgZT0wO2U8dC5wZW5kaW5nLmxlbmd0aDtlKyspe3ZhciBpPXQucGVuZGluZ1tlXSxuPWkuY2I7biYmbih0aGlzLGkuY2JQYXlsb2FkKSxpLmhvc3RFbC5kaXJ0eSgpfXQucGVuZGluZy5sZW5ndGg9MH1mdW5jdGlvbiBubih0KXtyZXR1cm4gdCYmdC53aWR0aCYmdC5oZWlnaHR9dmFyIG9uPXt9LGFuPTAscm49NWUzLHNuPS9ceyhbYS16QS1aMC05X10rKVx8KFtefV0qKVx9L2csbG49IjEycHggc2Fucy1zZXJpZiIsdW49e307ZnVuY3Rpb24gaG4odCxlKXt2YXIgaT10KyI6IisoZT1lfHxsbik7aWYob25baV0pcmV0dXJuIG9uW2ldO2Zvcih2YXIgbixvLGE9KHQrIiIpLnNwbGl0KCJcbiIpLHI9MCxzPTAsbD1hLmxlbmd0aDtzPGw7cysrKXI9TWF0aC5tYXgoKG49YVtzXSxvPWUsdW4ubWVhc3VyZVRleHQobixvKSkud2lkdGgscik7cmV0dXJuIHJuPGFuJiYoYW49MCxvbj17fSksYW4rKyxvbltpXT1yfWZ1bmN0aW9uIGNuKHQsZSxpLG4sbyxhLHIscyl7cmV0dXJuIHI/ZnVuY3Rpb24odCxlLGksbixvLGEscixzKXt2YXIgbD13bih0LHtyaWNoOnIsdHJ1bmNhdGU6cyxmb250OmUsdGV4dEFsaWduOmksdGV4dFBhZGRpbmc6byx0ZXh0TGluZUhlaWdodDphfSksdT1sLm91dGVyV2lkdGgsaD1sLm91dGVySGVpZ2h0LGM9ZG4oMCx1LGkpLGQ9Zm4oMCxoLG4pO3JldHVybiBuZXcgTWkoYyxkLHUsaCl9KHQsZSxpLG4sbyxhLHIscyk6ZnVuY3Rpb24odCxlLGksbixvLGEscil7dmFyIHM9X24odCxlLG8sYSxyKSxsPWhuKHQsZSk7byYmKGwrPW9bMV0rb1szXSk7dmFyIHU9cy5vdXRlckhlaWdodCxoPWRuKDAsbCxpKSxjPWZuKDAsdSxuKSxkPW5ldyBNaShoLGMsbCx1KTtyZXR1cm4gZC5saW5lSGVpZ2h0PXMubGluZUhlaWdodCxkfSh0LGUsaSxuLG8sYSxzKX1mdW5jdGlvbiBkbih0LGUsaSl7cmV0dXJuInJpZ2h0Ij09PWk/dC09ZToiY2VudGVyIj09PWkmJih0LT1lLzIpLHR9ZnVuY3Rpb24gZm4odCxlLGkpe3JldHVybiJtaWRkbGUiPT09aT90LT1lLzI6ImJvdHRvbSI9PT1pJiYodC09ZSksdH1mdW5jdGlvbiBwbih0LGUsaSl7dmFyIG49ZS50ZXh0UG9zaXRpb24sbz1lLnRleHREaXN0YW5jZSxhPWkueCxyPWkueTtvPW98fDA7dmFyIHM9aS5oZWlnaHQsbD1pLndpZHRoLHU9cy8yLGg9ImxlZnQiLGM9InRvcCI7c3dpdGNoKG4pe2Nhc2UibGVmdCI6YS09byxyKz11LGg9InJpZ2h0IixjPSJtaWRkbGUiO2JyZWFrO2Nhc2UicmlnaHQiOmErPW8rbCxyKz11LGM9Im1pZGRsZSI7YnJlYWs7Y2FzZSJ0b3AiOmErPWwvMixyLT1vLGg9ImNlbnRlciIsYz0iYm90dG9tIjticmVhaztjYXNlImJvdHRvbSI6YSs9bC8yLHIrPXMrbyxoPSJjZW50ZXIiO2JyZWFrO2Nhc2UiaW5zaWRlIjphKz1sLzIscis9dSxoPSJjZW50ZXIiLGM9Im1pZGRsZSI7YnJlYWs7Y2FzZSJpbnNpZGVMZWZ0IjphKz1vLHIrPXUsYz0ibWlkZGxlIjticmVhaztjYXNlImluc2lkZVJpZ2h0IjphKz1sLW8scis9dSxoPSJyaWdodCIsYz0ibWlkZGxlIjticmVhaztjYXNlImluc2lkZVRvcCI6YSs9bC8yLHIrPW8saD0iY2VudGVyIjticmVhaztjYXNlImluc2lkZUJvdHRvbSI6YSs9bC8yLHIrPXMtbyxoPSJjZW50ZXIiLGM9ImJvdHRvbSI7YnJlYWs7Y2FzZSJpbnNpZGVUb3BMZWZ0IjphKz1vLHIrPW87YnJlYWs7Y2FzZSJpbnNpZGVUb3BSaWdodCI6YSs9bC1vLHIrPW8saD0icmlnaHQiO2JyZWFrO2Nhc2UiaW5zaWRlQm90dG9tTGVmdCI6YSs9byxyKz1zLW8sYz0iYm90dG9tIjticmVhaztjYXNlImluc2lkZUJvdHRvbVJpZ2h0IjphKz1sLW8scis9cy1vLGg9InJpZ2h0IixjPSJib3R0b20ifXJldHVybih0PXR8fHt9KS54PWEsdC55PXIsdC50ZXh0QWxpZ249aCx0LnRleHRWZXJ0aWNhbEFsaWduPWMsdH1mdW5jdGlvbiBnbih0LGUsaSxuLG8pe2lmKCFlKXJldHVybiIiO3ZhciBhPSh0KyIiKS5zcGxpdCgiXG4iKTtvPW1uKGUsaSxuLG8pO2Zvcih2YXIgcj0wLHM9YS5sZW5ndGg7cjxzO3IrKylhW3JdPXZuKGFbcl0sbyk7cmV0dXJuIGEuam9pbigiXG4iKX1mdW5jdGlvbiBtbih0LGUsaSxuKXsobj1MKHt9LG4pKS5mb250PWU7aT1IKGksIi4uLiIpO24ubWF4SXRlcmF0aW9ucz1IKG4ubWF4SXRlcmF0aW9ucywyKTt2YXIgbz1uLm1pbkNoYXI9SChuLm1pbkNoYXIsMCk7bi5jbkNoYXJXaWR0aD1obigi5Zu9IixlKTt2YXIgYT1uLmFzY0NoYXJXaWR0aD1obigiYSIsZSk7bi5wbGFjZWhvbGRlcj1IKG4ucGxhY2Vob2xkZXIsIiIpO2Zvcih2YXIgcj10PU1hdGgubWF4KDAsdC0xKSxzPTA7czxvJiZhPD1yO3MrKylyLT1hO3ZhciBsPWhuKGksZSk7cmV0dXJuIHI8bCYmKGk9IiIsbD0wKSxyPXQtbCxuLmVsbGlwc2lzPWksbi5lbGxpcHNpc1dpZHRoPWwsbi5jb250ZW50V2lkdGg9cixuLmNvbnRhaW5lcldpZHRoPXQsbn1mdW5jdGlvbiB2bih0LGUpe3ZhciBpPWUuY29udGFpbmVyV2lkdGgsbj1lLmZvbnQsbz1lLmNvbnRlbnRXaWR0aDtpZighaSlyZXR1cm4iIjt2YXIgYT1obih0LG4pO2lmKGE8PWkpcmV0dXJuIHQ7Zm9yKHZhciByPTA7O3IrKyl7aWYoYTw9b3x8cj49ZS5tYXhJdGVyYXRpb25zKXt0Kz1lLmVsbGlwc2lzO2JyZWFrfXZhciBzPTA9PT1yP3luKHQsbyxlLmFzY0NoYXJXaWR0aCxlLmNuQ2hhcldpZHRoKTowPGE/TWF0aC5mbG9vcih0Lmxlbmd0aCpvL2EpOjA7YT1obih0PXQuc3Vic3RyKDAscyksbil9cmV0dXJuIiI9PT10JiYodD1lLnBsYWNlaG9sZGVyKSx0fWZ1bmN0aW9uIHluKHQsZSxpLG4pe2Zvcih2YXIgbz0wLGE9MCxyPXQubGVuZ3RoO2E8ciYmbzxlO2ErKyl7dmFyIHM9dC5jaGFyQ29kZUF0KGEpO28rPTA8PXMmJnM8PTEyNz9pOm59cmV0dXJuIGF9ZnVuY3Rpb24geG4odCl7cmV0dXJuIGhuKCLlm70iLHQpfWZ1bmN0aW9uIF9uKHQsZSxpLG4sbyl7bnVsbCE9dCYmKHQrPSIiKTt2YXIgYT1IKG4seG4oZSkpLHI9dD90LnNwbGl0KCJcbiIpOltdLHM9ci5sZW5ndGgqYSxsPXMsdT0hMDtpZihpJiYobCs9aVswXStpWzJdKSx0JiZvKXt1PSExO3ZhciBoPW8ub3V0ZXJIZWlnaHQsYz1vLm91dGVyV2lkdGg7aWYobnVsbCE9aCYmaDxsKXQ9IiIscj1bXTtlbHNlIGlmKG51bGwhPWMpZm9yKHZhciBkPW1uKGMtKGk/aVsxXStpWzNdOjApLGUsby5lbGxpcHNpcyx7bWluQ2hhcjpvLm1pbkNoYXIscGxhY2Vob2xkZXI6by5wbGFjZWhvbGRlcn0pLGY9MCxwPXIubGVuZ3RoO2Y8cDtmKyspcltmXT12bihyW2ZdLGQpfXJldHVybntsaW5lczpyLGhlaWdodDpzLG91dGVySGVpZ2h0OmwsbGluZUhlaWdodDphLGNhbkNhY2hlQnlUZXh0U3RyaW5nOnV9fWZ1bmN0aW9uIHduKHQsZSl7dmFyIGk9e2xpbmVzOltdLHdpZHRoOjAsaGVpZ2h0OjB9O2lmKG51bGwhPXQmJih0Kz0iIiksIXQpcmV0dXJuIGk7Zm9yKHZhciBuLG89c24ubGFzdEluZGV4PTA7bnVsbCE9KG49c24uZXhlYyh0KSk7KXt2YXIgYT1uLmluZGV4O288YSYmYm4oaSx0LnN1YnN0cmluZyhvLGEpKSxibihpLG5bMl0sblsxXSksbz1zbi5sYXN0SW5kZXh9bzx0Lmxlbmd0aCYmYm4oaSx0LnN1YnN0cmluZyhvLHQubGVuZ3RoKSk7dmFyIHI9aS5saW5lcyxzPTAsbD0wLHU9W10saD1lLnRleHRQYWRkaW5nLGM9ZS50cnVuY2F0ZSxkPWMmJmMub3V0ZXJXaWR0aCxmPWMmJmMub3V0ZXJIZWlnaHQ7aCYmKG51bGwhPWQmJihkLT1oWzFdK2hbM10pLG51bGwhPWYmJihmLT1oWzBdK2hbMl0pKTtmb3IodmFyIHA9MDtwPHIubGVuZ3RoO3ArKyl7Zm9yKHZhciBnPXJbcF0sbT0wLHY9MCx5PTA7eTxnLnRva2Vucy5sZW5ndGg7eSsrKXt2YXIgeD0oQz1nLnRva2Vuc1t5XSkuc3R5bGVOYW1lJiZlLnJpY2hbQy5zdHlsZU5hbWVdfHx7fSxfPUMudGV4dFBhZGRpbmc9eC50ZXh0UGFkZGluZyx3PUMuZm9udD14LmZvbnR8fGUuZm9udCxiPUMudGV4dEhlaWdodD1IKHgudGV4dEhlaWdodCx4bih3KSk7aWYoXyYmKGIrPV9bMF0rX1syXSksQy5oZWlnaHQ9YixDLmxpbmVIZWlnaHQ9Wih4LnRleHRMaW5lSGVpZ2h0LGUudGV4dExpbmVIZWlnaHQsYiksQy50ZXh0QWxpZ249eCYmeC50ZXh0QWxpZ258fGUudGV4dEFsaWduLEMudGV4dFZlcnRpY2FsQWxpZ249eCYmeC50ZXh0VmVydGljYWxBbGlnbnx8Im1pZGRsZSIsbnVsbCE9ZiYmcytDLmxpbmVIZWlnaHQ+ZilyZXR1cm57bGluZXM6W10sd2lkdGg6MCxoZWlnaHQ6MH07Qy50ZXh0V2lkdGg9aG4oQy50ZXh0LHcpO3ZhciBTPXgudGV4dFdpZHRoLE09bnVsbD09U3x8ImF1dG8iPT09UztpZigic3RyaW5nIj09dHlwZW9mIFMmJiIlIj09PVMuY2hhckF0KFMubGVuZ3RoLTEpKUMucGVyY2VudFdpZHRoPVMsdS5wdXNoKEMpLFM9MDtlbHNle2lmKE0pe1M9Qy50ZXh0V2lkdGg7dmFyIEk9eC50ZXh0QmFja2dyb3VuZENvbG9yLFQ9SSYmSS5pbWFnZTtUJiZubihUPVFpKFQpKSYmKFM9TWF0aC5tYXgoUyxULndpZHRoKmIvVC5oZWlnaHQpKX12YXIgQT1fP19bMV0rX1szXTowO1MrPUE7dmFyIEQ9bnVsbCE9ZD9kLXY6bnVsbDtudWxsIT1EJiZEPFMmJighTXx8RDxBPyhDLnRleHQ9IiIsQy50ZXh0V2lkdGg9Uz0wKTooQy50ZXh0PWduKEMudGV4dCxELUEsdyxjLmVsbGlwc2lzLHttaW5DaGFyOmMubWluQ2hhcn0pLEMudGV4dFdpZHRoPWhuKEMudGV4dCx3KSxTPUMudGV4dFdpZHRoK0EpKX12Kz1DLndpZHRoPVMseCYmKG09TWF0aC5tYXgobSxDLmxpbmVIZWlnaHQpKX1nLndpZHRoPXYscys9Zy5saW5lSGVpZ2h0PW0sbD1NYXRoLm1heChsLHYpfWkub3V0ZXJXaWR0aD1pLndpZHRoPUgoZS50ZXh0V2lkdGgsbCksaS5vdXRlckhlaWdodD1pLmhlaWdodD1IKGUudGV4dEhlaWdodCxzKSxoJiYoaS5vdXRlcldpZHRoKz1oWzFdK2hbM10saS5vdXRlckhlaWdodCs9aFswXStoWzJdKTtmb3IocD0wO3A8dS5sZW5ndGg7cCsrKXt2YXIgQyxMPShDPXVbcF0pLnBlcmNlbnRXaWR0aDtDLndpZHRoPXBhcnNlSW50KEwsMTApLzEwMCpsfXJldHVybiBpfWZ1bmN0aW9uIGJuKHQsZSxpKXtmb3IodmFyIG49IiI9PT1lLG89ZS5zcGxpdCgiXG4iKSxhPXQubGluZXMscj0wO3I8by5sZW5ndGg7cisrKXt2YXIgcz1vW3JdLGw9e3N0eWxlTmFtZTppLHRleHQ6cyxpc0xpbmVIb2xkZXI6IXMmJiFufTtpZihyKWEucHVzaCh7dG9rZW5zOltsXX0pO2Vsc2V7dmFyIHU9KGFbYS5sZW5ndGgtMV18fChhWzBdPXt0b2tlbnM6W119KSkudG9rZW5zLGg9dS5sZW5ndGg7MT09PWgmJnVbMF0uaXNMaW5lSG9sZGVyP3VbMF09bDohcyYmaCYmIW58fHUucHVzaChsKX19fWZ1bmN0aW9uIFNuKHQpe3ZhciBlPSh0LmZvbnRTaXplfHx0LmZvbnRGYW1pbHkpJiZbdC5mb250U3R5bGUsdC5mb250V2VpZ2h0LCh0LmZvbnRTaXplfHwxMikrInB4Iix0LmZvbnRGYW1pbHl8fCJzYW5zLXNlcmlmIl0uam9pbigiICIpO3JldHVybiBlJiZqKGUpfHx0LnRleHRGb250fHx0LmZvbnR9ZnVuY3Rpb24gTW4odCxlKXt2YXIgaSxuLG8sYSxyLHM9ZS54LGw9ZS55LHU9ZS53aWR0aCxoPWUuaGVpZ2h0LGM9ZS5yO3U8MCYmKHMrPXUsdT0tdSksaDwwJiYobCs9aCxoPS1oKSwibnVtYmVyIj09dHlwZW9mIGM/aT1uPW89YT1jOmMgaW5zdGFuY2VvZiBBcnJheT8xPT09Yy5sZW5ndGg/aT1uPW89YT1jWzBdOjI9PT1jLmxlbmd0aD8oaT1vPWNbMF0sbj1hPWNbMV0pOjM9PT1jLmxlbmd0aD8oaT1jWzBdLG49YT1jWzFdLG89Y1syXSk6KGk9Y1swXSxuPWNbMV0sbz1jWzJdLGE9Y1szXSk6aT1uPW89YT0wLHU8aStuJiYoaSo9dS8ocj1pK24pLG4qPXUvciksdTxvK2EmJihvKj11LyhyPW8rYSksYSo9dS9yKSxoPG4rbyYmKG4qPWgvKHI9bitvKSxvKj1oL3IpLGg8aSthJiYoaSo9aC8ocj1pK2EpLGEqPWgvciksdC5tb3ZlVG8ocytpLGwpLHQubGluZVRvKHMrdS1uLGwpLDAhPT1uJiZ0LmFyYyhzK3UtbixsK24sbiwtTWF0aC5QSS8yLDApLHQubGluZVRvKHMrdSxsK2gtbyksMCE9PW8mJnQuYXJjKHMrdS1vLGwraC1vLG8sMCxNYXRoLlBJLzIpLHQubGluZVRvKHMrYSxsK2gpLDAhPT1hJiZ0LmFyYyhzK2EsbCtoLWEsYSxNYXRoLlBJLzIsTWF0aC5QSSksdC5saW5lVG8ocyxsK2kpLDAhPT1pJiZ0LmFyYyhzK2ksbCtpLGksTWF0aC5QSSwxLjUqTWF0aC5QSSl9dW4ubWVhc3VyZVRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT14KCk7cmV0dXJuIGkuZm9udD1lfHxsbixpLm1lYXN1cmVUZXh0KHQpfTt2YXIgSW49bG4sVG49e2xlZnQ6MSxyaWdodDoxLGNlbnRlcjoxfSxBbj17dG9wOjEsYm90dG9tOjEsbWlkZGxlOjF9LERuPVtbInRleHRTaGFkb3dCbHVyIiwic2hhZG93Qmx1ciIsMF0sWyJ0ZXh0U2hhZG93T2Zmc2V0WCIsInNoYWRvd09mZnNldFgiLDBdLFsidGV4dFNoYWRvd09mZnNldFkiLCJzaGFkb3dPZmZzZXRZIiwwXSxbInRleHRTaGFkb3dDb2xvciIsInNoYWRvd0NvbG9yIiwidHJhbnNwYXJlbnQiXV0sQ249e30sTG49e307ZnVuY3Rpb24ga24odCl7cmV0dXJuIFBuKHQpLEUodC5yaWNoLFBuKSx0fWZ1bmN0aW9uIFBuKHQpe2lmKHQpe3QuZm9udD1Tbih0KTt2YXIgZT10LnRleHRBbGlnbjsibWlkZGxlIj09PWUmJihlPSJjZW50ZXIiKSx0LnRleHRBbGlnbj1udWxsPT1lfHxUbltlXT9lOiJsZWZ0Ijt2YXIgaT10LnRleHRWZXJ0aWNhbEFsaWdufHx0LnRleHRCYXNlbGluZTsiY2VudGVyIj09PWkmJihpPSJtaWRkbGUiKSx0LnRleHRWZXJ0aWNhbEFsaWduPW51bGw9PWl8fEFuW2ldP2k6InRvcCIsdC50ZXh0UGFkZGluZyYmKHQudGV4dFBhZGRpbmc9WCh0LnRleHRQYWRkaW5nKSl9fWZ1bmN0aW9uIE5uKHQsZSxpLG4sbyxhKXtuLnJpY2g/ZnVuY3Rpb24odCxlLGksbixvLGEpe2EhPT1WaSYmKGUuX19hdHRyQ2FjaGVkQnk9QmkuTk9ORSk7dmFyIHI9dC5fX3RleHRDb3RlbnRCbG9jaztyJiYhdC5fX2RpcnR5VGV4dHx8KHI9dC5fX3RleHRDb3RlbnRCbG9jaz13bihpLG4pKTshZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1pLndpZHRoLHI9aS5vdXRlcldpZHRoLHM9aS5vdXRlckhlaWdodCxsPW4udGV4dFBhZGRpbmcsdT1WbihMbix0LG4sbyksaD11LmJhc2VYLGM9dS5iYXNlWSxkPXUudGV4dEFsaWduLGY9dS50ZXh0VmVydGljYWxBbGlnbjtPbihlLG4sbyxoLGMpO3ZhciBwPWRuKGgscixkKSxnPWZuKGMscyxmKSxtPXAsdj1nO2wmJihtKz1sWzNdLHYrPWxbMF0pO3ZhciB5PW0rYTt6bihuKSYmUm4odCxlLG4scCxnLHIscyk7Zm9yKHZhciB4PTA7eDxpLmxpbmVzLmxlbmd0aDt4Kyspe2Zvcih2YXIgXyx3PWkubGluZXNbeF0sYj13LnRva2VucyxTPWIubGVuZ3RoLE09dy5saW5lSGVpZ2h0LEk9dy53aWR0aCxUPTAsQT1tLEQ9eSxDPVMtMTtUPFMmJighKF89YltUXSkudGV4dEFsaWdufHwibGVmdCI9PT1fLnRleHRBbGlnbik7KUVuKHQsZSxfLG4sTSx2LEEsImxlZnQiKSxJLT1fLndpZHRoLEErPV8ud2lkdGgsVCsrO2Zvcig7MDw9QyYmInJpZ2h0Ij09PShfPWJbQ10pLnRleHRBbGlnbjspRW4odCxlLF8sbixNLHYsRCwicmlnaHQiKSxJLT1fLndpZHRoLEQtPV8ud2lkdGgsQy0tO2ZvcihBKz0oYS0oQS1tKS0oeS1EKS1JKS8yO1Q8PUM7KV89YltUXSxFbih0LGUsXyxuLE0sdixBK18ud2lkdGgvMiwiY2VudGVyIiksQSs9Xy53aWR0aCxUKys7dis9TX19KHQsZSxyLG4sbyl9KHQsZSxpLG4sbyxhKTpmdW5jdGlvbih0LGUsaSxuLG8sYSl7dmFyIHIscz16bihuKSxsPSExLHU9ZS5fX2F0dHJDYWNoZWRCeT09PUJpLlBMQUlOX1RFWFQ7YSE9PVZpPyhhJiYocj1hLnN0eWxlLGw9IXMmJnUmJnIpLGUuX19hdHRyQ2FjaGVkQnk9cz9CaS5OT05FOkJpLlBMQUlOX1RFWFQpOnUmJihlLl9fYXR0ckNhY2hlZEJ5PUJpLk5PTkUpO3ZhciBoPW4uZm9udHx8SW47bCYmaD09PShyLmZvbnR8fEluKXx8KGUuZm9udD1oKTt2YXIgYz10Ll9fY29tcHV0ZWRGb250O3QuX19zdHlsZUZvbnQhPT1oJiYodC5fX3N0eWxlRm9udD1oLGM9dC5fX2NvbXB1dGVkRm9udD1lLmZvbnQpO3ZhciBkPW4udGV4dFBhZGRpbmcsZj1uLnRleHRMaW5lSGVpZ2h0LHA9dC5fX3RleHRDb3RlbnRCbG9jaztwJiYhdC5fX2RpcnR5VGV4dHx8KHA9dC5fX3RleHRDb3RlbnRCbG9jaz1fbihpLGMsZCxmLG4udHJ1bmNhdGUpKTt2YXIgZz1wLm91dGVySGVpZ2h0LG09cC5saW5lcyx2PXAubGluZUhlaWdodCx5PVZuKExuLHQsbixvKSx4PXkuYmFzZVgsXz15LmJhc2VZLHc9eS50ZXh0QWxpZ258fCJsZWZ0IixiPXkudGV4dFZlcnRpY2FsQWxpZ247T24oZSxuLG8seCxfKTt2YXIgUz1mbihfLGcsYiksTT14LEk9UztpZihzfHxkKXt2YXIgVD1obihpLGMpO2QmJihUKz1kWzFdK2RbM10pO3ZhciBBPWRuKHgsVCx3KTtzJiZSbih0LGUsbixBLFMsVCxnKSxkJiYoTT1abih4LHcsZCksSSs9ZFswXSl9ZS50ZXh0QWxpZ249dyxlLnRleHRCYXNlbGluZT0ibWlkZGxlIixlLmdsb2JhbEFscGhhPW4ub3BhY2l0eXx8MTtmb3IodmFyIEQ9MDtEPERuLmxlbmd0aDtEKyspe3ZhciBDPURuW0RdLEw9Q1swXSxrPUNbMV0sUD1uW0xdO2wmJlA9PT1yW0xdfHwoZVtrXT1SaShlLGssUHx8Q1syXSkpfUkrPXYvMjt2YXIgTj1uLnRleHRTdHJva2VXaWR0aCxPPWw/ci50ZXh0U3Ryb2tlV2lkdGg6bnVsbCxFPSFsfHxOIT09Tyx6PSFsfHxFfHxuLnRleHRTdHJva2UhPT1yLnRleHRTdHJva2UsUj1GbihuLnRleHRTdHJva2UsTiksQj1XbihuLnRleHRGaWxsKTtSJiYoRSYmKGUubGluZVdpZHRoPU4pLHomJihlLnN0cm9rZVN0eWxlPVIpKTtCJiYobCYmbi50ZXh0RmlsbD09PXIudGV4dEZpbGx8fChlLmZpbGxTdHlsZT1CKSk7aWYoMT09PW0ubGVuZ3RoKVImJmUuc3Ryb2tlVGV4dChtWzBdLE0sSSksQiYmZS5maWxsVGV4dChtWzBdLE0sSSk7ZWxzZSBmb3IoRD0wO0Q8bS5sZW5ndGg7RCsrKVImJmUuc3Ryb2tlVGV4dChtW0RdLE0sSSksQiYmZS5maWxsVGV4dChtW0RdLE0sSSksSSs9dn0odCxlLGksbixvLGEpfWZ1bmN0aW9uIE9uKHQsZSxpLG4sbyl7aWYoaSYmZS50ZXh0Um90YXRpb24pe3ZhciBhPWUudGV4dE9yaWdpbjsiY2VudGVyIj09PWE/KG49aS53aWR0aC8yK2kueCxvPWkuaGVpZ2h0LzIraS55KTphJiYobj1hWzBdK2kueCxvPWFbMV0raS55KSx0LnRyYW5zbGF0ZShuLG8pLHQucm90YXRlKC1lLnRleHRSb3RhdGlvbiksdC50cmFuc2xhdGUoLW4sLW8pfX1mdW5jdGlvbiBFbih0LGUsaSxuLG8sYSxyLHMpe3ZhciBsPW4ucmljaFtpLnN0eWxlTmFtZV18fHt9O2wudGV4dD1pLnRleHQ7dmFyIHU9aS50ZXh0VmVydGljYWxBbGlnbixoPWErby8yOyJ0b3AiPT09dT9oPWEraS5oZWlnaHQvMjoiYm90dG9tIj09PXUmJihoPWErby1pLmhlaWdodC8yKSwhaS5pc0xpbmVIb2xkZXImJnpuKGwpJiZSbih0LGUsbCwicmlnaHQiPT09cz9yLWkud2lkdGg6ImNlbnRlciI9PT1zP3ItaS53aWR0aC8yOnIsaC1pLmhlaWdodC8yLGkud2lkdGgsaS5oZWlnaHQpO3ZhciBjPWkudGV4dFBhZGRpbmc7YyYmKHI9Wm4ocixzLGMpLGgtPWkuaGVpZ2h0LzItY1syXS1pLnRleHRIZWlnaHQvMiksR24oZSwic2hhZG93Qmx1ciIsWihsLnRleHRTaGFkb3dCbHVyLG4udGV4dFNoYWRvd0JsdXIsMCkpLEduKGUsInNoYWRvd0NvbG9yIixsLnRleHRTaGFkb3dDb2xvcnx8bi50ZXh0U2hhZG93Q29sb3J8fCJ0cmFuc3BhcmVudCIpLEduKGUsInNoYWRvd09mZnNldFgiLFoobC50ZXh0U2hhZG93T2Zmc2V0WCxuLnRleHRTaGFkb3dPZmZzZXRYLDApKSxHbihlLCJzaGFkb3dPZmZzZXRZIixaKGwudGV4dFNoYWRvd09mZnNldFksbi50ZXh0U2hhZG93T2Zmc2V0WSwwKSksR24oZSwidGV4dEFsaWduIixzKSxHbihlLCJ0ZXh0QmFzZWxpbmUiLCJtaWRkbGUiKSxHbihlLCJmb250IixpLmZvbnR8fEluKTt2YXIgZD1GbihsLnRleHRTdHJva2V8fG4udGV4dFN0cm9rZSxwKSxmPVduKGwudGV4dEZpbGx8fG4udGV4dEZpbGwpLHA9SChsLnRleHRTdHJva2VXaWR0aCxuLnRleHRTdHJva2VXaWR0aCk7ZCYmKEduKGUsImxpbmVXaWR0aCIscCksR24oZSwic3Ryb2tlU3R5bGUiLGQpLGUuc3Ryb2tlVGV4dChpLnRleHQscixoKSksZiYmKEduKGUsImZpbGxTdHlsZSIsZiksZS5maWxsVGV4dChpLnRleHQscixoKSl9ZnVuY3Rpb24gem4odCl7cmV0dXJuISEodC50ZXh0QmFja2dyb3VuZENvbG9yfHx0LnRleHRCb3JkZXJXaWR0aCYmdC50ZXh0Qm9yZGVyQ29sb3IpfWZ1bmN0aW9uIFJuKHQsZSxpLG4sbyxhLHIpe3ZhciBzPWkudGV4dEJhY2tncm91bmRDb2xvcixsPWkudGV4dEJvcmRlcldpZHRoLHU9aS50ZXh0Qm9yZGVyQ29sb3IsaD16KHMpO2lmKEduKGUsInNoYWRvd0JsdXIiLGkudGV4dEJveFNoYWRvd0JsdXJ8fDApLEduKGUsInNoYWRvd0NvbG9yIixpLnRleHRCb3hTaGFkb3dDb2xvcnx8InRyYW5zcGFyZW50IiksR24oZSwic2hhZG93T2Zmc2V0WCIsaS50ZXh0Qm94U2hhZG93T2Zmc2V0WHx8MCksR24oZSwic2hhZG93T2Zmc2V0WSIsaS50ZXh0Qm94U2hhZG93T2Zmc2V0WXx8MCksaHx8bCYmdSl7ZS5iZWdpblBhdGgoKTt2YXIgYz1pLnRleHRCb3JkZXJSYWRpdXM7Yz9NbihlLHt4Om4seTpvLHdpZHRoOmEsaGVpZ2h0OnIscjpjfSk6ZS5yZWN0KG4sbyxhLHIpLGUuY2xvc2VQYXRoKCl9aWYoaClpZihHbihlLCJmaWxsU3R5bGUiLHMpLG51bGwhPWkuZmlsbE9wYWNpdHkpe3ZhciBkPWUuZ2xvYmFsQWxwaGE7ZS5nbG9iYWxBbHBoYT1pLmZpbGxPcGFjaXR5Kmkub3BhY2l0eSxlLmZpbGwoKSxlLmdsb2JhbEFscGhhPWR9ZWxzZSBlLmZpbGwoKTtlbHNlIGlmKFIocykpe3ZhciBmPXMuaW1hZ2U7KGY9dG4oZixudWxsLHQsQm4scykpJiZubihmKSYmZS5kcmF3SW1hZ2UoZixuLG8sYSxyKX1pZihsJiZ1KWlmKEduKGUsImxpbmVXaWR0aCIsbCksR24oZSwic3Ryb2tlU3R5bGUiLHUpLG51bGwhPWkuc3Ryb2tlT3BhY2l0eSl7ZD1lLmdsb2JhbEFscGhhO2UuZ2xvYmFsQWxwaGE9aS5zdHJva2VPcGFjaXR5Kmkub3BhY2l0eSxlLnN0cm9rZSgpLGUuZ2xvYmFsQWxwaGE9ZH1lbHNlIGUuc3Ryb2tlKCl9ZnVuY3Rpb24gQm4odCxlKXtlLmltYWdlPXR9ZnVuY3Rpb24gVm4odCxlLGksbil7dmFyIG89aS54fHwwLGE9aS55fHwwLHI9aS50ZXh0QWxpZ24scz1pLnRleHRWZXJ0aWNhbEFsaWduO2lmKG4pe3ZhciBsPWkudGV4dFBvc2l0aW9uO2lmKGwgaW5zdGFuY2VvZiBBcnJheSlvPW4ueCtIbihsWzBdLG4ud2lkdGgpLGE9bi55K0huKGxbMV0sbi5oZWlnaHQpO2Vsc2V7dmFyIHU9ZSYmZS5jYWxjdWxhdGVUZXh0UG9zaXRpb24/ZS5jYWxjdWxhdGVUZXh0UG9zaXRpb24oQ24saSxuKTpwbihDbixpLG4pO289dS54LGE9dS55LHI9cnx8dS50ZXh0QWxpZ24scz1zfHx1LnRleHRWZXJ0aWNhbEFsaWdufXZhciBoPWkudGV4dE9mZnNldDtoJiYobys9aFswXSxhKz1oWzFdKX1yZXR1cm4odD10fHx7fSkuYmFzZVg9byx0LmJhc2VZPWEsdC50ZXh0QWxpZ249cix0LnRleHRWZXJ0aWNhbEFsaWduPXMsdH1mdW5jdGlvbiBHbih0LGUsaSl7cmV0dXJuIHRbZV09UmkodCxlLGkpLHRbZV19ZnVuY3Rpb24gRm4odCxlKXtyZXR1cm4gbnVsbD09dHx8ZTw9MHx8InRyYW5zcGFyZW50Ij09PXR8fCJub25lIj09PXQ/bnVsbDp0LmltYWdlfHx0LmNvbG9yU3RvcHM/IiMwMDAiOnR9ZnVuY3Rpb24gV24odCl7cmV0dXJuIG51bGw9PXR8fCJub25lIj09PXQ/bnVsbDp0LmltYWdlfHx0LmNvbG9yU3RvcHM/IiMwMDAiOnR9ZnVuY3Rpb24gSG4odCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/MDw9dC5sYXN0SW5kZXhPZigiJSIpP3BhcnNlRmxvYXQodCkvMTAwKmU6cGFyc2VGbG9hdCh0KTp0fWZ1bmN0aW9uIFpuKHQsZSxpKXtyZXR1cm4icmlnaHQiPT09ZT90LWlbMV06ImNlbnRlciI9PT1lP3QraVszXS8yLWlbMV0vMjp0K2lbM119ZnVuY3Rpb24gVW4odCxlKXtyZXR1cm4gbnVsbCE9dCYmKHR8fGUudGV4dEJhY2tncm91bmRDb2xvcnx8ZS50ZXh0Qm9yZGVyV2lkdGgmJmUudGV4dEJvcmRlckNvbG9yfHxlLnRleHRQYWRkaW5nKX1mdW5jdGlvbiBYbigpe312YXIgWW49bmV3IE1pO2Z1bmN0aW9uIGpuKHQpe2Zvcih2YXIgZSBpbiB0PXR8fHt9LG1pLmNhbGwodGhpcyx0KSx0KXQuaGFzT3duUHJvcGVydHkoZSkmJiJzdHlsZSIhPT1lJiYodGhpc1tlXT10W2VdKTt0aGlzLnN0eWxlPW5ldyBGaSh0LnN0eWxlLHRoaXMpLHRoaXMuX3JlY3Q9bnVsbCx0aGlzLl9fY2xpcFBhdGhzPW51bGx9ZnVuY3Rpb24gcW4odCl7am4uY2FsbCh0aGlzLHQpfWpuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6am4sdHlwZToiZGlzcGxheWFibGUiLF9fZGlydHk6ITAsaW52aXNpYmxlOiEoWG4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYbixkcmF3UmVjdFRleHQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnN0eWxlO2U9aS50ZXh0UmVjdHx8ZSx0aGlzLl9fZGlydHkmJmtuKGkpO3ZhciBuPWkudGV4dDtpZihudWxsIT1uJiYobis9IiIpLFVuKG4saSkpe3Quc2F2ZSgpO3ZhciBvPXRoaXMudHJhbnNmb3JtO2kudHJhbnNmb3JtVGV4dD90aGlzLnNldFRyYW5zZm9ybSh0KTpvJiYoWW4uY29weShlKSxZbi5hcHBseVRyYW5zZm9ybShvKSxlPVluKSxObih0aGlzLHQsbixpLGUsVmkpLHQucmVzdG9yZSgpfX19KSx6OjAsejI6MCx6bGV2ZWw6MCxkcmFnZ2FibGU6ITEsZHJhZ2dpbmc6ITEsc2lsZW50OiExLGN1bGxpbmc6ITEsY3Vyc29yOiJwb2ludGVyIixyZWN0SG92ZXI6ITEscHJvZ3Jlc3NpdmU6ITEsaW5jcmVtZW50YWw6ITEsZ2xvYmFsU2NhbGVSYXRpbzoxLGJlZm9yZUJydXNoOmZ1bmN0aW9uKHQpe30sYWZ0ZXJCcnVzaDpmdW5jdGlvbih0KXt9LGJydXNoOmZ1bmN0aW9uKHQsZSl7fSxnZXRCb3VuZGluZ1JlY3Q6ZnVuY3Rpb24oKXt9LGNvbnRhaW46ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWN0Q29udGFpbih0LGUpfSx0cmF2ZXJzZTpmdW5jdGlvbih0LGUpe3QuY2FsbChlLHRoaXMpfSxyZWN0Q29udGFpbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudHJhbnNmb3JtQ29vcmRUb0xvY2FsKHQsZSk7cmV0dXJuIHRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkuY29udGFpbihpWzBdLGlbMV0pfSxkaXJ0eTpmdW5jdGlvbigpe3RoaXMuX19kaXJ0eT10aGlzLl9fZGlydHlUZXh0PSEwLHRoaXMuX3JlY3Q9bnVsbCx0aGlzLl9fenImJnRoaXMuX196ci5yZWZyZXNoKCl9LGFuaW1hdGVTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hbmltYXRlKCJzdHlsZSIsdCl9LGF0dHJLVjpmdW5jdGlvbih0LGUpeyJzdHlsZSIhPT10P21pLnByb3RvdHlwZS5hdHRyS1YuY2FsbCh0aGlzLHQsZSk6dGhpcy5zdHlsZS5zZXQoZSl9LHNldFN0eWxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUuc2V0KHQsZSksdGhpcy5kaXJ0eSghMSksdGhpc30sdXNlU3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3R5bGU9bmV3IEZpKHQsdGhpcyksdGhpcy5kaXJ0eSghMSksdGhpc30sY2FsY3VsYXRlVGV4dFBvc2l0aW9uOm51bGx9LHcoam4sbWkpLGIoam4sWG4pLHFuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cW4sdHlwZToiaW1hZ2UiLGJydXNoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zdHlsZSxuPWkuaW1hZ2U7aS5iaW5kKHQsdGhpcyxlKTt2YXIgbz10aGlzLl9pbWFnZT10bihuLHRoaXMuX2ltYWdlLHRoaXMsdGhpcy5vbmxvYWQpO2lmKG8mJm5uKG8pKXt2YXIgYT1pLnh8fDAscj1pLnl8fDAscz1pLndpZHRoLGw9aS5oZWlnaHQsdT1vLndpZHRoL28uaGVpZ2h0O2lmKG51bGw9PXMmJm51bGwhPWw/cz1sKnU6bnVsbD09bCYmbnVsbCE9cz9sPXMvdTpudWxsPT1zJiZudWxsPT1sJiYocz1vLndpZHRoLGw9by5oZWlnaHQpLHRoaXMuc2V0VHJhbnNmb3JtKHQpLGkuc1dpZHRoJiZpLnNIZWlnaHQpe3ZhciBoPWkuc3h8fDAsYz1pLnN5fHwwO3QuZHJhd0ltYWdlKG8saCxjLGkuc1dpZHRoLGkuc0hlaWdodCxhLHIscyxsKX1lbHNlIGlmKGkuc3gmJmkuc3kpe3ZhciBkPXMtKGg9aS5zeCksZj1sLShjPWkuc3kpO3QuZHJhd0ltYWdlKG8saCxjLGQsZixhLHIscyxsKX1lbHNlIHQuZHJhd0ltYWdlKG8sYSxyLHMsbCk7bnVsbCE9aS50ZXh0JiYodGhpcy5yZXN0b3JlVHJhbnNmb3JtKHQpLHRoaXMuZHJhd1JlY3RUZXh0KHQsdGhpcy5nZXRCb3VuZGluZ1JlY3QoKSkpfX0sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdHlsZTtyZXR1cm4gdGhpcy5fcmVjdHx8KHRoaXMuX3JlY3Q9bmV3IE1pKHQueHx8MCx0Lnl8fDAsdC53aWR0aHx8MCx0LmhlaWdodHx8MCkpLHRoaXMuX3JlY3R9fSx3KHFuLGpuKTt2YXIgS249MzE0MTU5O2Z1bmN0aW9uICRuKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX12YXIgSm49bmV3IE1pKDAsMCwwLDApLFFuPW5ldyBNaSgwLDAsMCwwKTtmdW5jdGlvbiB0byh0LGUsaSl7dGhpcy50eXBlPSJjYW52YXMiO3ZhciBuPSF0Lm5vZGVOYW1lfHwiQ0FOVkFTIj09PXQubm9kZU5hbWUudG9VcHBlckNhc2UoKTt0aGlzLl9vcHRzPWk9TCh7fSxpfHx7fSksdGhpcy5kcHI9aS5kZXZpY2VQaXhlbFJhdGlvfHxoaSx0aGlzLl9zaW5nbGVDYW52YXM9bjt2YXIgbz0odGhpcy5yb290PXQpLnN0eWxlO28mJihvWyItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiXT0idHJhbnNwYXJlbnQiLG9bIi13ZWJraXQtdXNlci1zZWxlY3QiXT1vWyJ1c2VyLXNlbGVjdCJdPW9bIi13ZWJraXQtdG91Y2gtY2FsbG91dCJdPSJub25lIix0LmlubmVySFRNTD0iIiksdGhpcy5zdG9yYWdlPWU7dmFyIGE9dGhpcy5femxldmVsTGlzdD1bXSxyPXRoaXMuX2xheWVycz17fTtpZih0aGlzLl9sYXllckNvbmZpZz17fSx0aGlzLl9uZWVkc01hbnVhbGx5Q29tcG9zaXRpbmc9ITEsbil7dmFyIHM9dC53aWR0aCxsPXQuaGVpZ2h0O251bGwhPWkud2lkdGgmJihzPWkud2lkdGgpLG51bGwhPWkuaGVpZ2h0JiYobD1pLmhlaWdodCksdGhpcy5kcHI9aS5kZXZpY2VQaXhlbFJhdGlvfHwxLHQud2lkdGg9cyp0aGlzLmRwcix0LmhlaWdodD1sKnRoaXMuZHByLHRoaXMuX3dpZHRoPXMsdGhpcy5faGVpZ2h0PWw7dmFyIHU9bmV3IEtpKHQsdGhpcyx0aGlzLmRwcik7dS5fX2J1aWx0aW5fXz0hMCx1LmluaXRDb250ZXh0KCksKHJbS25dPXUpLnpsZXZlbD1LbixhLnB1c2goS24pLHRoaXMuX2RvbVJvb3Q9dH1lbHNle3RoaXMuX3dpZHRoPXRoaXMuX2dldFNpemUoMCksdGhpcy5faGVpZ2h0PXRoaXMuX2dldFNpemUoMSk7dmFyIGg9dGhpcy5fZG9tUm9vdD1mdW5jdGlvbih0LGUpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBpLnN0eWxlLmNzc1RleHQ9WyJwb3NpdGlvbjpyZWxhdGl2ZSIsIndpZHRoOiIrdCsicHgiLCJoZWlnaHQ6IitlKyJweCIsInBhZGRpbmc6MCIsIm1hcmdpbjowIiwiYm9yZGVyLXdpZHRoOjAiXS5qb2luKCI7IikrIjsiLGl9KHRoaXMuX3dpZHRoLHRoaXMuX2hlaWdodCk7dC5hcHBlbmRDaGlsZChoKX10aGlzLl9ob3ZlcmxheWVyPW51bGwsdGhpcy5faG92ZXJFbGVtZW50cz1bXX10by5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnRvLGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4iY2FudmFzIn0saXNTaW5nbGVDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2luZ2xlQ2FudmFzfSxnZXRWaWV3cG9ydFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG9tUm9vdH0sZ2V0Vmlld3BvcnRSb290T2Zmc2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRWaWV3cG9ydFJvb3QoKTtpZih0KXJldHVybntvZmZzZXRMZWZ0OnQub2Zmc2V0TGVmdHx8MCxvZmZzZXRUb3A6dC5vZmZzZXRUb3B8fDB9fSxyZWZyZXNoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCghMCksaT10aGlzLl96bGV2ZWxMaXN0O3RoaXMuX3JlZHJhd0lkPU1hdGgucmFuZG9tKCksdGhpcy5fcGFpbnRMaXN0KGUsdCx0aGlzLl9yZWRyYXdJZCk7Zm9yKHZhciBuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvPWlbbl0sYT10aGlzLl9sYXllcnNbb107aWYoIWEuX19idWlsdGluX18mJmEucmVmcmVzaCl7dmFyIHI9MD09PW4/dGhpcy5fYmFja2dyb3VuZENvbG9yOm51bGw7YS5yZWZyZXNoKHIpfX1yZXR1cm4gdGhpcy5yZWZyZXNoSG92ZXIoKSx0aGlzfSxhZGRIb3ZlcjpmdW5jdGlvbih0LGUpe2lmKCF0Ll9faG92ZXJNaXIpe3ZhciBpPW5ldyB0LmNvbnN0cnVjdG9yKHtzdHlsZTp0LnN0eWxlLHNoYXBlOnQuc2hhcGUsejp0LnosejI6dC56MixzaWxlbnQ6dC5zaWxlbnR9KTtyZXR1cm4oaS5fX2Zyb209dCkuX19ob3Zlck1pcj1pLGUmJmkuc2V0U3R5bGUoZSksdGhpcy5faG92ZXJFbGVtZW50cy5wdXNoKGkpLGl9fSxyZW1vdmVIb3ZlcjpmdW5jdGlvbih0KXt2YXIgZT10Ll9faG92ZXJNaXIsaT10aGlzLl9ob3ZlckVsZW1lbnRzLG49XyhpLGUpOzA8PW4mJmkuc3BsaWNlKG4sMSksdC5fX2hvdmVyTWlyPW51bGx9LGNsZWFySG92ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2hvdmVyRWxlbWVudHMsaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldLl9fZnJvbTtuJiYobi5fX2hvdmVyTWlyPW51bGwpfWUubGVuZ3RoPTB9LHJlZnJlc2hIb3ZlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2hvdmVyRWxlbWVudHMsZT10Lmxlbmd0aCxpPXRoaXMuX2hvdmVybGF5ZXI7aWYoaSYmaS5jbGVhcigpLGUpe05pKHQsdGhpcy5zdG9yYWdlLmRpc3BsYXlhYmxlU29ydEZ1bmMpO3ZhciBuPXt9OyhpPWl8fCh0aGlzLl9ob3ZlcmxheWVyPXRoaXMuZ2V0TGF5ZXIoMWU1KSkpLmN0eC5zYXZlKCk7Zm9yKHZhciBvPTA7bzxlOyl7dmFyIGE9dFtvXSxyPWEuX19mcm9tO3ImJnIuX196cj8obysrLHIuaW52aXNpYmxlfHwoYS50cmFuc2Zvcm09ci50cmFuc2Zvcm0sYS5pbnZUcmFuc2Zvcm09ci5pbnZUcmFuc2Zvcm0sYS5fX2NsaXBQYXRocz1yLl9fY2xpcFBhdGhzLHRoaXMuX2RvUGFpbnRFbChhLGksITAsbikpKToodC5zcGxpY2UobywxKSxyLl9faG92ZXJNaXI9bnVsbCxlLS0pfWkuY3R4LnJlc3RvcmUoKX19LGdldEhvdmVyTGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXllcigxZTUpfSxfcGFpbnRMaXN0OmZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLl9yZWRyYXdJZD09PWkpe2U9ZXx8ITEsdGhpcy5fdXBkYXRlTGF5ZXJTdGF0dXModCk7dmFyIG49dGhpcy5fZG9QYWludExpc3QodCxlKTtpZih0aGlzLl9uZWVkc01hbnVhbGx5Q29tcG9zaXRpbmcmJnRoaXMuX2NvbXBvc2l0ZU1hbnVhbGx5KCksIW4pe3ZhciBvPXRoaXM7JGkoZnVuY3Rpb24oKXtvLl9wYWludExpc3QodCxlLGkpfSl9fX0sX2NvbXBvc2l0ZU1hbnVhbGx5OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRMYXllcihLbikuY3R4LGk9dGhpcy5fZG9tUm9vdC53aWR0aCxuPXRoaXMuX2RvbVJvb3QuaGVpZ2h0O2UuY2xlYXJSZWN0KDAsMCxpLG4pLHRoaXMuZWFjaEJ1aWx0aW5MYXllcihmdW5jdGlvbih0KXt0LnZpcnR1YWwmJmUuZHJhd0ltYWdlKHQuZG9tLDAsMCxpLG4pfSl9LF9kb1BhaW50TGlzdDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxuPTA7bjx0aGlzLl96bGV2ZWxMaXN0Lmxlbmd0aDtuKyspe3ZhciBvPXRoaXMuX3psZXZlbExpc3Rbbl07KHM9dGhpcy5fbGF5ZXJzW29dKS5fX2J1aWx0aW5fXyYmcyE9PXRoaXMuX2hvdmVybGF5ZXImJihzLl9fZGlydHl8fGUpJiZpLnB1c2gocyl9Zm9yKHZhciBhPSEwLHI9MDtyPGkubGVuZ3RoO3IrKyl7dmFyIHMsbD0ocz1pW3JdKS5jdHgsdT17fTtsLnNhdmUoKTt2YXIgaD1lP3MuX19zdGFydEluZGV4OnMuX19kcmF3SW5kZXgsYz0hZSYmcy5pbmNyZW1lbnRhbCYmRGF0ZS5ub3csZD1jJiZEYXRlLm5vdygpLGY9cy56bGV2ZWw9PT10aGlzLl96bGV2ZWxMaXN0WzBdP3RoaXMuX2JhY2tncm91bmRDb2xvcjpudWxsO2lmKHMuX19zdGFydEluZGV4PT09cy5fX2VuZEluZGV4KXMuY2xlYXIoITEsZik7ZWxzZSBpZihoPT09cy5fX3N0YXJ0SW5kZXgpe3ZhciBwPXRbaF07cC5pbmNyZW1lbnRhbCYmcC5ub3RDbGVhciYmIWV8fHMuY2xlYXIoITEsZil9LTE9PT1oJiYoY29uc29sZS5lcnJvcigiRm9yIHNvbWUgdW5rbm93biByZWFzb24uIGRyYXdJbmRleCBpcyAtMSIpLGg9cy5fX3N0YXJ0SW5kZXgpO2Zvcih2YXIgZz1oO2c8cy5fX2VuZEluZGV4O2crKyl7dmFyIG09dFtnXTtpZih0aGlzLl9kb1BhaW50RWwobSxzLGUsdSksbS5fX2RpcnR5PW0uX19kaXJ0eVRleHQ9ITEsYylpZigxNTxEYXRlLm5vdygpLWQpYnJlYWt9cy5fX2RyYXdJbmRleD1nLHMuX19kcmF3SW5kZXg8cy5fX2VuZEluZGV4JiYoYT0hMSksdS5wcmV2RWxDbGlwUGF0aHMmJmwucmVzdG9yZSgpLGwucmVzdG9yZSgpfXJldHVybiB2Lnd4YSYmRSh0aGlzLl9sYXllcnMsZnVuY3Rpb24odCl7dCYmdC5jdHgmJnQuY3R4LmRyYXcmJnQuY3R4LmRyYXcoKX0pLGF9LF9kb1BhaW50RWw6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89ZS5jdHgsYT10LnRyYW5zZm9ybTtpZigoZS5fX2RpcnR5fHxpKSYmIXQuaW52aXNpYmxlJiYwIT09dC5zdHlsZS5vcGFjaXR5JiYoIWF8fGFbMF18fGFbM10pJiYoIXQuY3VsbGluZ3x8IWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gSm4uY29weSh0LmdldEJvdW5kaW5nUmVjdCgpKSx0LnRyYW5zZm9ybSYmSm4uYXBwbHlUcmFuc2Zvcm0odC50cmFuc2Zvcm0pLFFuLndpZHRoPWUsUW4uaGVpZ2h0PWksIUpuLmludGVyc2VjdChRbil9KHQsdGhpcy5fd2lkdGgsdGhpcy5faGVpZ2h0KSkpe3ZhciByPXQuX19jbGlwUGF0aHMscz1uLnByZXZFbENsaXBQYXRocztzJiYhZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4hMTtpZighdHx8IWV8fHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspaWYodFtpXSE9PWVbaV0pcmV0dXJuITA7cmV0dXJuITF9KHIscyl8fChzJiYoby5yZXN0b3JlKCksbi5wcmV2RWxDbGlwUGF0aHM9bnVsbCxuLnByZXZFbD1udWxsKSxyJiYoby5zYXZlKCksZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG49dFtpXTtuLnNldFRyYW5zZm9ybShlKSxlLmJlZ2luUGF0aCgpLG4uYnVpbGRQYXRoKGUsbi5zaGFwZSksZS5jbGlwKCksbi5yZXN0b3JlVHJhbnNmb3JtKGUpfX0ocixvKSxuLnByZXZFbENsaXBQYXRocz1yKSksdC5iZWZvcmVCcnVzaCYmdC5iZWZvcmVCcnVzaChvKSx0LmJydXNoKG8sbi5wcmV2RWx8fG51bGwpLChuLnByZXZFbD10KS5hZnRlckJydXNoJiZ0LmFmdGVyQnJ1c2gobyl9fSxnZXRMYXllcjpmdW5jdGlvbih0LGUpe3RoaXMuX3NpbmdsZUNhbnZhcyYmIXRoaXMuX25lZWRzTWFudWFsbHlDb21wb3NpdGluZyYmKHQ9S24pO3ZhciBpPXRoaXMuX2xheWVyc1t0XTtyZXR1cm4gaXx8KChpPW5ldyBLaSgienJfIit0LHRoaXMsdGhpcy5kcHIpKS56bGV2ZWw9dCxpLl9fYnVpbHRpbl9fPSEwLHRoaXMuX2xheWVyQ29uZmlnW3RdJiZtKGksdGhpcy5fbGF5ZXJDb25maWdbdF0sITApLGUmJihpLnZpcnR1YWw9ZSksdGhpcy5pbnNlcnRMYXllcih0LGkpLGkuaW5pdENvbnRleHQoKSksaX0saW5zZXJ0TGF5ZXI6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9sYXllcnMsbj10aGlzLl96bGV2ZWxMaXN0LG89bi5sZW5ndGgsYT1udWxsLHI9LTEscz10aGlzLl9kb21Sb290O2lmKGlbdF0pZmkoIlpMZXZlbCAiK3QrIiBoYXMgYmVlbiB1c2VkIGFscmVhZHkiKTtlbHNlIGlmKGZ1bmN0aW9uKHQpe3JldHVybiEhdCYmKCEhdC5fX2J1aWx0aW5fX3x8ImZ1bmN0aW9uIj09dHlwZW9mIHQucmVzaXplJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWZyZXNoKX0oZSkpe2lmKDA8byYmdD5uWzBdKXtmb3Iocj0wO3I8by0xJiYhKG5bcl08dCYmbltyKzFdPnQpO3IrKyk7YT1pW25bcl1dfWlmKG4uc3BsaWNlKHIrMSwwLHQpLCEoaVt0XT1lKS52aXJ0dWFsKWlmKGEpe3ZhciBsPWEuZG9tO2wubmV4dFNpYmxpbmc/cy5pbnNlcnRCZWZvcmUoZS5kb20sbC5uZXh0U2libGluZyk6cy5hcHBlbmRDaGlsZChlLmRvbSl9ZWxzZSBzLmZpcnN0Q2hpbGQ/cy5pbnNlcnRCZWZvcmUoZS5kb20scy5maXJzdENoaWxkKTpzLmFwcGVuZENoaWxkKGUuZG9tKX1lbHNlIGZpKCJMYXllciBvZiB6bGV2ZWwgIit0KyIgaXMgbm90IHZhbGlkIil9LGVhY2hMYXllcjpmdW5jdGlvbih0LGUpe3ZhciBpLG4sbz10aGlzLl96bGV2ZWxMaXN0O2ZvcihuPTA7bjxvLmxlbmd0aDtuKyspaT1vW25dLHQuY2FsbChlLHRoaXMuX2xheWVyc1tpXSxpKX0sZWFjaEJ1aWx0aW5MYXllcjpmdW5jdGlvbih0LGUpe3ZhciBpLG4sbyxhPXRoaXMuX3psZXZlbExpc3Q7Zm9yKG89MDtvPGEubGVuZ3RoO28rKyluPWFbb10sKGk9dGhpcy5fbGF5ZXJzW25dKS5fX2J1aWx0aW5fXyYmdC5jYWxsKGUsaSxuKX0sZWFjaE90aGVyTGF5ZXI6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLG8sYT10aGlzLl96bGV2ZWxMaXN0O2ZvcihvPTA7bzxhLmxlbmd0aDtvKyspbj1hW29dLChpPXRoaXMuX2xheWVyc1tuXSkuX19idWlsdGluX198fHQuY2FsbChlLGksbil9LGdldExheWVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXllcnN9LF91cGRhdGVMYXllclN0YXR1czpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe24mJihuLl9fZW5kSW5kZXghPT10JiYobi5fX2RpcnR5PSEwKSxuLl9fZW5kSW5kZXg9dCl9aWYodGhpcy5lYWNoQnVpbHRpbkxheWVyKGZ1bmN0aW9uKHQsZSl7dC5fX2RpcnR5PXQuX191c2VkPSExfSksdGhpcy5fc2luZ2xlQ2FudmFzKWZvcih2YXIgaT0xO2k8dC5sZW5ndGg7aSsrKXtpZigoYT10W2ldKS56bGV2ZWwhPT10W2ktMV0uemxldmVsfHxhLmluY3JlbWVudGFsKXt0aGlzLl9uZWVkc01hbnVhbGx5Q29tcG9zaXRpbmc9ITA7YnJlYWt9fXZhciBuPW51bGwsbz0wO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBhLHIscz0oYT10W2ldKS56bGV2ZWw7YS5pbmNyZW1lbnRhbD8oKHI9dGhpcy5nZXRMYXllcihzKy4wMDEsdGhpcy5fbmVlZHNNYW51YWxseUNvbXBvc2l0aW5nKSkuaW5jcmVtZW50YWw9ITAsbz0xKTpyPXRoaXMuZ2V0TGF5ZXIocysoMDxvPy4wMTowKSx0aGlzLl9uZWVkc01hbnVhbGx5Q29tcG9zaXRpbmcpLHIuX19idWlsdGluX198fGZpKCJaTGV2ZWwgIitzKyIgaGFzIGJlZW4gdXNlZCBieSB1bmtvd24gbGF5ZXIgIityLmlkKSxyIT09biYmKHIuX191c2VkPSEwLHIuX19zdGFydEluZGV4IT09aSYmKHIuX19kaXJ0eT0hMCksci5fX3N0YXJ0SW5kZXg9aSxyLmluY3JlbWVudGFsP3IuX19kcmF3SW5kZXg9LTE6ci5fX2RyYXdJbmRleD1pLGUoaSksbj1yKSxhLl9fZGlydHkmJihyLl9fZGlydHk9ITAsci5pbmNyZW1lbnRhbCYmci5fX2RyYXdJbmRleDwwJiYoci5fX2RyYXdJbmRleD1pKSl9ZShpKSx0aGlzLmVhY2hCdWlsdGluTGF5ZXIoZnVuY3Rpb24odCxlKXshdC5fX3VzZWQmJjA8dC5nZXRFbGVtZW50Q291bnQoKSYmKHQuX19kaXJ0eT0hMCx0Ll9fc3RhcnRJbmRleD10Ll9fZW5kSW5kZXg9dC5fX2RyYXdJbmRleD0wKSx0Ll9fZGlydHkmJnQuX19kcmF3SW5kZXg8MCYmKHQuX19kcmF3SW5kZXg9dC5fX3N0YXJ0SW5kZXgpfSl9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEJ1aWx0aW5MYXllcih0aGlzLl9jbGVhckxheWVyKSx0aGlzfSxfY2xlYXJMYXllcjpmdW5jdGlvbih0KXt0LmNsZWFyKCl9LHNldEJhY2tncm91bmRDb2xvcjpmdW5jdGlvbih0KXt0aGlzLl9iYWNrZ3JvdW5kQ29sb3I9dH0sY29uZmlnTGF5ZXI6ZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgaT10aGlzLl9sYXllckNvbmZpZztpW3RdP20oaVt0XSxlLCEwKTppW3RdPWU7Zm9yKHZhciBuPTA7bjx0aGlzLl96bGV2ZWxMaXN0Lmxlbmd0aDtuKyspe3ZhciBvPXRoaXMuX3psZXZlbExpc3Rbbl07aWYobz09PXR8fG89PT10Ky4wMSltKHRoaXMuX2xheWVyc1tvXSxpW3RdLCEwKX19fSxkZWxMYXllcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXllcnMsaT10aGlzLl96bGV2ZWxMaXN0LG49ZVt0XTtuJiYobi5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuLmRvbSksZGVsZXRlIGVbdF0saS5zcGxpY2UoXyhpLHQpLDEpKX0scmVzaXplOmZ1bmN0aW9uKGUsaSl7aWYodGhpcy5fZG9tUm9vdC5zdHlsZSl7dmFyIHQ9dGhpcy5fZG9tUm9vdDt0LnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBuPXRoaXMuX29wdHM7aWYobnVsbCE9ZSYmKG4ud2lkdGg9ZSksbnVsbCE9aSYmKG4uaGVpZ2h0PWkpLGU9dGhpcy5fZ2V0U2l6ZSgwKSxpPXRoaXMuX2dldFNpemUoMSksdC5zdHlsZS5kaXNwbGF5PSIiLHRoaXMuX3dpZHRoIT09ZXx8aSE9PXRoaXMuX2hlaWdodCl7Zm9yKHZhciBvIGluIHQuc3R5bGUud2lkdGg9ZSsicHgiLHQuc3R5bGUuaGVpZ2h0PWkrInB4Iix0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzLmhhc093blByb3BlcnR5KG8pJiZ0aGlzLl9sYXllcnNbb10ucmVzaXplKGUsaSk7RSh0aGlzLl9wcm9ncmVzc2l2ZUxheWVycyxmdW5jdGlvbih0KXt0LnJlc2l6ZShlLGkpfSksdGhpcy5yZWZyZXNoKCEwKX10aGlzLl93aWR0aD1lLHRoaXMuX2hlaWdodD1pfWVsc2V7aWYobnVsbD09ZXx8bnVsbD09aSlyZXR1cm47dGhpcy5fd2lkdGg9ZSx0aGlzLl9oZWlnaHQ9aSx0aGlzLmdldExheWVyKEtuKS5yZXNpemUoZSxpKX1yZXR1cm4gdGhpc30sY2xlYXJMYXllcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXllcnNbdF07ZSYmZS5jbGVhcigpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5yb290LmlubmVySFRNTD0iIix0aGlzLnJvb3Q9dGhpcy5zdG9yYWdlPXRoaXMuX2RvbVJvb3Q9dGhpcy5fbGF5ZXJzPW51bGx9LGdldFJlbmRlcmVkQ2FudmFzOmZ1bmN0aW9uKHQpe2lmKHQ9dHx8e30sdGhpcy5fc2luZ2xlQ2FudmFzJiYhdGhpcy5fY29tcG9zaXRlTWFudWFsbHkpcmV0dXJuIHRoaXMuX2xheWVyc1tLbl0uZG9tO3ZhciBlPW5ldyBLaSgiaW1hZ2UiLHRoaXMsdC5waXhlbFJhdGlvfHx0aGlzLmRwcik7aWYoZS5pbml0Q29udGV4dCgpLGUuY2xlYXIoITEsdC5iYWNrZ3JvdW5kQ29sb3J8fHRoaXMuX2JhY2tncm91bmRDb2xvciksdC5waXhlbFJhdGlvPD10aGlzLmRwcil7dGhpcy5yZWZyZXNoKCk7dmFyIGk9ZS5kb20ud2lkdGgsbj1lLmRvbS5oZWlnaHQsbz1lLmN0eDt0aGlzLmVhY2hMYXllcihmdW5jdGlvbih0KXt0Ll9fYnVpbHRpbl9fP28uZHJhd0ltYWdlKHQuZG9tLDAsMCxpLG4pOnQucmVuZGVyVG9DYW52YXMmJihlLmN0eC5zYXZlKCksdC5yZW5kZXJUb0NhbnZhcyhlLmN0eCksZS5jdHgucmVzdG9yZSgpKX0pfWVsc2UgZm9yKHZhciBhPXt9LHI9dGhpcy5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCEwKSxzPTA7czxyLmxlbmd0aDtzKyspe3ZhciBsPXJbc107dGhpcy5fZG9QYWludEVsKGwsZSwhMCxhKX1yZXR1cm4gZS5kb219LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofSxnZXRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fSxfZ2V0U2l6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9vcHRzLGk9WyJ3aWR0aCIsImhlaWdodCJdW3RdLG49WyJjbGllbnRXaWR0aCIsImNsaWVudEhlaWdodCJdW3RdLG89WyJwYWRkaW5nTGVmdCIsInBhZGRpbmdUb3AiXVt0XSxhPVsicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSJdW3RdO2lmKG51bGwhPWVbaV0mJiJhdXRvIiE9PWVbaV0pcmV0dXJuIHBhcnNlRmxvYXQoZVtpXSk7dmFyIHI9dGhpcy5yb290LHM9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShyKTtyZXR1cm4ocltuXXx8JG4oc1tpXSl8fCRuKHIuc3R5bGVbaV0pKS0oJG4oc1tvXSl8fDApLSgkbihzW2FdKXx8MCl8MH0scGF0aFRvSW1hZ2U6ZnVuY3Rpb24odCxlKXtlPWV8fHRoaXMuZHByO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLG49aS5nZXRDb250ZXh0KCIyZCIpLG89dC5nZXRCb3VuZGluZ1JlY3QoKSxhPXQuc3R5bGUscj1hLnNoYWRvd0JsdXIqZSxzPWEuc2hhZG93T2Zmc2V0WCplLGw9YS5zaGFkb3dPZmZzZXRZKmUsdT1hLmhhc1N0cm9rZSgpP2EubGluZVdpZHRoOjAsaD1NYXRoLm1heCh1LzIsci1zKSxjPU1hdGgubWF4KHUvMixzK3IpLGQ9TWF0aC5tYXgodS8yLHItbCksZj1NYXRoLm1heCh1LzIsbCtyKSxwPW8ud2lkdGgraCtjLGc9by5oZWlnaHQrZCtmO2kud2lkdGg9cCplLGkuaGVpZ2h0PWcqZSxuLnNjYWxlKGUsZSksbi5jbGVhclJlY3QoMCwwLHAsZyksbi5kcHI9ZTt2YXIgbT17cG9zaXRpb246dC5wb3NpdGlvbixyb3RhdGlvbjp0LnJvdGF0aW9uLHNjYWxlOnQuc2NhbGV9O3QucG9zaXRpb249W2gtby54LGQtby55XSx0LnJvdGF0aW9uPTAsdC5zY2FsZT1bMSwxXSx0LnVwZGF0ZVRyYW5zZm9ybSgpLHQmJnQuYnJ1c2gobik7dmFyIHY9bmV3IHFuKHtzdHlsZTp7eDowLHk6MCxpbWFnZTppfX0pO3JldHVybiBudWxsIT1tLnBvc2l0aW9uJiYodi5wb3NpdGlvbj10LnBvc2l0aW9uPW0ucG9zaXRpb24pLG51bGwhPW0ucm90YXRpb24mJih2LnJvdGF0aW9uPXQucm90YXRpb249bS5yb3RhdGlvbiksbnVsbCE9bS5zY2FsZSYmKHYuc2NhbGU9dC5zY2FsZT1tLnNjYWxlKSx2fX07ZnVuY3Rpb24gZW8odCl7dD10fHx7fSx0aGlzLnN0YWdlPXQuc3RhZ2V8fHt9LHRoaXMub25mcmFtZT10Lm9uZnJhbWV8fGZ1bmN0aW9uKCl7fSx0aGlzLl9jbGlwcz1bXSx0aGlzLl9ydW5uaW5nPSExLHRoaXMuX3RpbWUsdGhpcy5fcGF1c2VkVGltZSx0aGlzLl9wYXVzZVN0YXJ0LHRoaXMuX3BhdXNlZD0hMSxDdC5jYWxsKHRoaXMpfWVvLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZW8sYWRkQ2xpcDpmdW5jdGlvbih0KXt0aGlzLl9jbGlwcy5wdXNoKHQpfSxhZGRBbmltYXRvcjpmdW5jdGlvbih0KXt0LmFuaW1hdGlvbj10aGlzO2Zvcih2YXIgZT10LmdldENsaXBzKCksaT0wO2k8ZS5sZW5ndGg7aSsrKXRoaXMuYWRkQ2xpcChlW2ldKX0scmVtb3ZlQ2xpcDpmdW5jdGlvbih0KXt2YXIgZT1fKHRoaXMuX2NsaXBzLHQpOzA8PWUmJnRoaXMuX2NsaXBzLnNwbGljZShlLDEpfSxyZW1vdmVBbmltYXRvcjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5nZXRDbGlwcygpLGk9MDtpPGUubGVuZ3RoO2krKyl0aGlzLnJlbW92ZUNsaXAoZVtpXSk7dC5hbmltYXRpb249bnVsbH0sX3VwZGF0ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0obmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9wYXVzZWRUaW1lLGU9dC10aGlzLl90aW1lLGk9dGhpcy5fY2xpcHMsbj1pLmxlbmd0aCxvPVtdLGE9W10scj0wO3I8bjtyKyspe3ZhciBzPWlbcl0sbD1zLnN0ZXAodCxlKTtsJiYoby5wdXNoKGwpLGEucHVzaChzKSl9Zm9yKHI9MDtyPG47KWlbcl0uX25lZWRzUmVtb3ZlPyhpW3JdPWlbbi0xXSxpLnBvcCgpLG4tLSk6cisrO249by5sZW5ndGg7Zm9yKHI9MDtyPG47cisrKWFbcl0uZmlyZShvW3JdKTt0aGlzLl90aW1lPXQsdGhpcy5vbmZyYW1lKGUpLHRoaXMudHJpZ2dlcigiZnJhbWUiLGUpLHRoaXMuc3RhZ2UudXBkYXRlJiZ0aGlzLnN0YWdlLnVwZGF0ZSgpfSxfc3RhcnRMb29wOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9ydW5uaW5nPSEwLCRpKGZ1bmN0aW9uIHQoKXtlLl9ydW5uaW5nJiYoJGkodCksZS5fcGF1c2VkfHxlLl91cGRhdGUoKSl9KX0sc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl90aW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX3BhdXNlZFRpbWU9MCx0aGlzLl9zdGFydExvb3AoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX3J1bm5pbmc9ITF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkfHwodGhpcy5fcGF1c2VTdGFydD0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLl9wYXVzZWQ9ITApfSxyZXN1bWU6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWQmJih0aGlzLl9wYXVzZWRUaW1lKz0obmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9wYXVzZVN0YXJ0LHRoaXMuX3BhdXNlZD0hMSl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5fY2xpcHM9W119LGlzRmluaXNoZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fY2xpcHMubGVuZ3RofSxhbmltYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IGxpKHQsKGU9ZXx8e30pLmxvb3AsZS5nZXR0ZXIsZS5zZXR0ZXIpO3JldHVybiB0aGlzLmFkZEFuaW1hdG9yKGkpLGl9fSxiKGVvLEN0KTt2YXIgaW8sbm8sb289di5kb21TdXBwb3J0ZWQsYW89KG5vPXtwb2ludGVyZG93bjoxLHBvaW50ZXJ1cDoxLHBvaW50ZXJtb3ZlOjEscG9pbnRlcm91dDoxfSx7bW91c2U6aW89WyJjbGljayIsImRibGNsaWNrIiwibW91c2V3aGVlbCIsIm1vdXNlb3V0IiwibW91c2V1cCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsImNvbnRleHRtZW51Il0sdG91Y2g6WyJ0b3VjaHN0YXJ0IiwidG91Y2hlbmQiLCJ0b3VjaG1vdmUiXSxwb2ludGVyOk4oaW8sZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKCJtb3VzZSIsInBvaW50ZXIiKTtyZXR1cm4gbm8uaGFzT3duUHJvcGVydHkoZSk/ZTp0fSl9KSxybz17bW91c2U6WyJtb3VzZW1vdmUiLCJtb3VzZXVwIl0scG9pbnRlcjpbInBvaW50ZXJtb3ZlIiwicG9pbnRlcnVwIl19O2Z1bmN0aW9uIHNvKHQpe3JldHVybiJtb3VzZXdoZWVsIj09PXQmJnYuYnJvd3Nlci5maXJlZm94PyJET01Nb3VzZVNjcm9sbCI6dH1mdW5jdGlvbiBsbyh0KXt2YXIgZT10LnBvaW50ZXJUeXBlO3JldHVybiJwZW4iPT09ZXx8InRvdWNoIj09PWV9ZnVuY3Rpb24gdW8odCl7dCYmKHQuenJCeVRvdWNoPSEwKX1mdW5jdGlvbiBobyh0LGUpe2Zvcih2YXIgaT0hMTsoZT1lJiZlLnBhcmVudE5vZGUpJiY5IT09ZS5ub2RlVHlwZSYmIShpPWU9PT10LnBhaW50ZXJSb290KTspO3JldHVybiBpfWZ1bmN0aW9uIGNvKHQsZSl7dGhpcy50eXBlPWUudHlwZSx0aGlzLnRhcmdldD10aGlzLmN1cnJlbnRUYXJnZXQ9dC5kb20sdGhpcy5wb2ludGVyVHlwZT1lLnBvaW50ZXJUeXBlLHRoaXMuY2xpZW50WD1lLmNsaWVudFgsdGhpcy5jbGllbnRZPWUuY2xpZW50WX12YXIgZm89Y28ucHJvdG90eXBlO2ZvLnN0b3BQcm9wYWdhdGlvbj1mby5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb249Zm8ucHJldmVudERlZmF1bHQ9ZXQ7dmFyIHBvPXttb3VzZWRvd246ZnVuY3Rpb24odCl7dD1HdCh0aGlzLmRvbSx0KSx0aGlzLl9tYXlQb2ludGVyQ2FwdHVyZT1bdC56clgsdC56clldLHRoaXMudHJpZ2dlcigibW91c2Vkb3duIix0KX0sbW91c2Vtb3ZlOmZ1bmN0aW9uKHQpe3Q9R3QodGhpcy5kb20sdCk7dmFyIGU9dGhpcy5fbWF5UG9pbnRlckNhcHR1cmU7IWV8fHQuenJYPT09ZVswXSYmdC56clk9PT1lWzFdfHxfbyh0aGlzLCEwKSx0aGlzLnRyaWdnZXIoIm1vdXNlbW92ZSIsdCl9LG1vdXNldXA6ZnVuY3Rpb24odCl7dD1HdCh0aGlzLmRvbSx0KSxfbyh0aGlzLCExKSx0aGlzLnRyaWdnZXIoIm1vdXNldXAiLHQpfSxtb3VzZW91dDpmdW5jdGlvbih0KXt0PUd0KHRoaXMuZG9tLHQpLHRoaXMuX3BvaW50ZXJDYXB0dXJpbmcmJih0LnpyRXZlbnRDb250cm9sPSJub19nbG9iYWxvdXQiKTt2YXIgZT10LnRvRWxlbWVudHx8dC5yZWxhdGVkVGFyZ2V0O3QuenJJc1RvTG9jYWxET009aG8odGhpcyxlKSx0aGlzLnRyaWdnZXIoIm1vdXNlb3V0Iix0KX0sdG91Y2hzdGFydDpmdW5jdGlvbih0KXt1byh0PUd0KHRoaXMuZG9tLHQpKSx0aGlzLl9sYXN0VG91Y2hNb21lbnQ9bmV3IERhdGUsdGhpcy5oYW5kbGVyLnByb2Nlc3NHZXN0dXJlKHQsInN0YXJ0IikscG8ubW91c2Vtb3ZlLmNhbGwodGhpcyx0KSxwby5tb3VzZWRvd24uY2FsbCh0aGlzLHQpfSx0b3VjaG1vdmU6ZnVuY3Rpb24odCl7dW8odD1HdCh0aGlzLmRvbSx0KSksdGhpcy5oYW5kbGVyLnByb2Nlc3NHZXN0dXJlKHQsImNoYW5nZSIpLHBvLm1vdXNlbW92ZS5jYWxsKHRoaXMsdCl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe3VvKHQ9R3QodGhpcy5kb20sdCkpLHRoaXMuaGFuZGxlci5wcm9jZXNzR2VzdHVyZSh0LCJlbmQiKSxwby5tb3VzZXVwLmNhbGwodGhpcyx0KSwrbmV3IERhdGUtdGhpcy5fbGFzdFRvdWNoTW9tZW50PDMwMCYmcG8uY2xpY2suY2FsbCh0aGlzLHQpfSxwb2ludGVyZG93bjpmdW5jdGlvbih0KXtwby5tb3VzZWRvd24uY2FsbCh0aGlzLHQpfSxwb2ludGVybW92ZTpmdW5jdGlvbih0KXtsbyh0KXx8cG8ubW91c2Vtb3ZlLmNhbGwodGhpcyx0KX0scG9pbnRlcnVwOmZ1bmN0aW9uKHQpe3BvLm1vdXNldXAuY2FsbCh0aGlzLHQpfSxwb2ludGVyb3V0OmZ1bmN0aW9uKHQpe2xvKHQpfHxwby5tb3VzZW91dC5jYWxsKHRoaXMsdCl9fTtFKFsiY2xpY2siLCJtb3VzZXdoZWVsIiwiZGJsY2xpY2siLCJjb250ZXh0bWVudSJdLGZ1bmN0aW9uKGUpe3BvW2VdPWZ1bmN0aW9uKHQpe3Q9R3QodGhpcy5kb20sdCksdGhpcy50cmlnZ2VyKGUsdCl9fSk7dmFyIGdvPXtwb2ludGVybW92ZTpmdW5jdGlvbih0KXtsbyh0KXx8Z28ubW91c2Vtb3ZlLmNhbGwodGhpcyx0KX0scG9pbnRlcnVwOmZ1bmN0aW9uKHQpe2dvLm1vdXNldXAuY2FsbCh0aGlzLHQpfSxtb3VzZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKCJtb3VzZW1vdmUiLHQpfSxtb3VzZXVwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BvaW50ZXJDYXB0dXJpbmc7X28odGhpcywhMSksdGhpcy50cmlnZ2VyKCJtb3VzZXVwIix0KSxlJiYodC56ckV2ZW50Q29udHJvbD0ib25seV9nbG9iYWxvdXQiLHRoaXMudHJpZ2dlcigibW91c2VvdXQiLHQpKX19O2Z1bmN0aW9uIG1vKGksbil7dmFyIG89bi5kb21IYW5kbGVyczt2LnBvaW50ZXJFdmVudHNTdXBwb3J0ZWQ/RShhby5wb2ludGVyLGZ1bmN0aW9uKGUpe3lvKG4sZSxmdW5jdGlvbih0KXtvW2VdLmNhbGwoaSx0KX0pfSk6KHYudG91Y2hFdmVudHNTdXBwb3J0ZWQmJkUoYW8udG91Y2gsZnVuY3Rpb24oZSl7eW8obixlLGZ1bmN0aW9uKHQpe29bZV0uY2FsbChpLHQpLGZ1bmN0aW9uKHQpe3QudG91Y2hpbmc9ITAsbnVsbCE9dC50b3VjaFRpbWVyJiYoY2xlYXJUaW1lb3V0KHQudG91Y2hUaW1lciksdC50b3VjaFRpbWVyPW51bGwpLHQudG91Y2hUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC50b3VjaGluZz0hMSx0LnRvdWNoVGltZXI9bnVsbH0sNzAwKX0obil9KX0pLEUoYW8ubW91c2UsZnVuY3Rpb24oZSl7eW8obixlLGZ1bmN0aW9uKHQpe3Q9VnQodCksbi50b3VjaGluZ3x8b1tlXS5jYWxsKGksdCl9KX0pKX1mdW5jdGlvbiB2byhpLG4pe2Z1bmN0aW9uIHQoZSl7eW8obixlLGZ1bmN0aW9uKHQpe3Q9VnQodCksaG8oaSx0LnRhcmdldCl8fCh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZG9tLG5ldyBjbyh0LGUpLCEwKX0oaSx0KSxuLmRvbUhhbmRsZXJzW2VdLmNhbGwoaSx0KSl9LHtjYXB0dXJlOiEwfSl9di5wb2ludGVyRXZlbnRzU3VwcG9ydGVkP0Uocm8ucG9pbnRlcix0KTp2LnRvdWNoRXZlbnRzU3VwcG9ydGVkfHxFKHJvLm1vdXNlLHQpfWZ1bmN0aW9uIHlvKHQsZSxpLG4pe3QubW91bnRlZFtlXT1pLHQubGlzdGVuZXJPcHRzW2VdPW4sRnQodC5kb21UYXJnZXQsc28oZSksaSxuKX1mdW5jdGlvbiB4byh0KXt2YXIgZSxpLG4sbyxhPXQubW91bnRlZDtmb3IodmFyIHIgaW4gYSlhLmhhc093blByb3BlcnR5KHIpJiYoZT10LmRvbVRhcmdldCxpPXNvKHIpLG49YVtyXSxvPXQubGlzdGVuZXJPcHRzW3JdLE50P2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLG4sbyk6ZS5kZXRhY2hFdmVudCgib24iK2ksbikpO3QubW91bnRlZD17fX1mdW5jdGlvbiBfbyh0LGUpe2lmKHQuX21heVBvaW50ZXJDYXB0dXJlPW51bGwsb28mJnQuX3BvaW50ZXJDYXB0dXJpbmdeZSl7dC5fcG9pbnRlckNhcHR1cmluZz1lO3ZhciBpPXQuX2dsb2JhbEhhbmRsZXJTY29wZTtlP3ZvKHQsaSk6eG8oaSl9fWZ1bmN0aW9uIHdvKHQsZSl7dGhpcy5kb21UYXJnZXQ9dCx0aGlzLmRvbUhhbmRsZXJzPWUsdGhpcy5tb3VudGVkPXt9LHRoaXMubGlzdGVuZXJPcHRzPXt9LHRoaXMudG91Y2hUaW1lcj1udWxsLHRoaXMudG91Y2hpbmc9ITF9ZnVuY3Rpb24gYm8odCxlKXtDdC5jYWxsKHRoaXMpLHRoaXMuZG9tPXQsdGhpcy5wYWludGVyUm9vdD1lLHRoaXMuX2xvY2FsSGFuZGxlclNjb3BlPW5ldyB3byh0LHBvKSxvbyYmKHRoaXMuX2dsb2JhbEhhbmRsZXJTY29wZT1uZXcgd28oZG9jdW1lbnQsZ28pKSx0aGlzLl9wb2ludGVyQ2FwdHVyaW5nPSExLHRoaXMuX21heVBvaW50ZXJDYXB0dXJlPW51bGwsbW8odGhpcyx0aGlzLl9sb2NhbEhhbmRsZXJTY29wZSl9dmFyIFNvPWJvLnByb3RvdHlwZTtTby5kaXNwb3NlPWZ1bmN0aW9uKCl7eG8odGhpcy5fbG9jYWxIYW5kbGVyU2NvcGUpLG9vJiZ4byh0aGlzLl9nbG9iYWxIYW5kbGVyU2NvcGUpfSxTby5zZXRDdXJzb3I9ZnVuY3Rpb24odCl7dGhpcy5kb20uc3R5bGUmJih0aGlzLmRvbS5zdHlsZS5jdXJzb3I9dHx8ImRlZmF1bHQiKX0sYihibyxDdCk7dmFyIE1vPSF2LmNhbnZhc1N1cHBvcnRlZCxJbz17Y2FudmFzOnRvfSxUbz17fTtmdW5jdGlvbiBBbyh0LGUpe3ZhciBpPW5ldyBDbyhuKCksdCxlKTtyZXR1cm4gVG9baS5pZF09aX1mdW5jdGlvbiBEbyh0LGUpe0lvW3RdPWV9dmFyIENvPWZ1bmN0aW9uKHQsZSxpKXtpPWl8fHt9LHRoaXMuZG9tPWUsdGhpcy5pZD10O3ZhciBuPXRoaXMsbz1uZXcgRWksYT1pLnJlbmRlcmVyO2lmKE1vKXtpZighSW8udm1sKXRocm93IG5ldyBFcnJvcigiWW91IG5lZWQgdG8gcmVxdWlyZSAnenJlbmRlci92bWwvdm1sJyB0byBzdXBwb3J0IElFOCIpO2E9InZtbCJ9ZWxzZSBhJiZJb1thXXx8KGE9ImNhbnZhcyIpO3ZhciByPW5ldyBJb1thXShlLG8saSx0KTt0aGlzLnN0b3JhZ2U9byx0aGlzLnBhaW50ZXI9cjt2YXIgcz12Lm5vZGV8fHYud29ya2VyP251bGw6bmV3IGJvKHIuZ2V0Vmlld3BvcnRSb290KCksci5yb290KTt0aGlzLmhhbmRsZXI9bmV3IEt0KG8scixzLHIucm9vdCksdGhpcy5hbmltYXRpb249bmV3IGVvKHtzdGFnZTp7dXBkYXRlOkEodGhpcy5mbHVzaCx0aGlzKX19KSx0aGlzLmFuaW1hdGlvbi5zdGFydCgpLHRoaXMuX25lZWRzUmVmcmVzaDt2YXIgbD1vLmRlbEZyb21TdG9yYWdlLHU9by5hZGRUb1N0b3JhZ2U7by5kZWxGcm9tU3RvcmFnZT1mdW5jdGlvbih0KXtsLmNhbGwobyx0KSx0JiZ0LnJlbW92ZVNlbGZGcm9tWnIobil9LG8uYWRkVG9TdG9yYWdlPWZ1bmN0aW9uKHQpe3UuY2FsbChvLHQpLHQuYWRkU2VsZlRvWnIobil9fTtDby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkNvLGdldElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGFkZDpmdW5jdGlvbih0KXt0aGlzLnN0b3JhZ2UuYWRkUm9vdCh0KSx0aGlzLl9uZWVkc1JlZnJlc2g9ITB9LHJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLnN0b3JhZ2UuZGVsUm9vdCh0KSx0aGlzLl9uZWVkc1JlZnJlc2g9ITB9LGNvbmZpZ0xheWVyOmZ1bmN0aW9uKHQsZSl7dGhpcy5wYWludGVyLmNvbmZpZ0xheWVyJiZ0aGlzLnBhaW50ZXIuY29uZmlnTGF5ZXIodCxlKSx0aGlzLl9uZWVkc1JlZnJlc2g9ITB9LHNldEJhY2tncm91bmRDb2xvcjpmdW5jdGlvbih0KXt0aGlzLnBhaW50ZXIuc2V0QmFja2dyb3VuZENvbG9yJiZ0aGlzLnBhaW50ZXIuc2V0QmFja2dyb3VuZENvbG9yKHQpLHRoaXMuX25lZWRzUmVmcmVzaD0hMH0scmVmcmVzaEltbWVkaWF0ZWx5OmZ1bmN0aW9uKCl7dGhpcy5fbmVlZHNSZWZyZXNoPXRoaXMuX25lZWRzUmVmcmVzaEhvdmVyPSExLHRoaXMucGFpbnRlci5yZWZyZXNoKCksdGhpcy5fbmVlZHNSZWZyZXNoPXRoaXMuX25lZWRzUmVmcmVzaEhvdmVyPSExfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fbmVlZHNSZWZyZXNoPSEwfSxmbHVzaDpmdW5jdGlvbigpe3ZhciB0O3RoaXMuX25lZWRzUmVmcmVzaCYmKHQ9ITAsdGhpcy5yZWZyZXNoSW1tZWRpYXRlbHkoKSksdGhpcy5fbmVlZHNSZWZyZXNoSG92ZXImJih0PSEwLHRoaXMucmVmcmVzaEhvdmVySW1tZWRpYXRlbHkoKSksdCYmdGhpcy50cmlnZ2VyKCJyZW5kZXJlZCIpfSxhZGRIb3ZlcjpmdW5jdGlvbih0LGUpe2lmKHRoaXMucGFpbnRlci5hZGRIb3Zlcil7dmFyIGk9dGhpcy5wYWludGVyLmFkZEhvdmVyKHQsZSk7cmV0dXJuIHRoaXMucmVmcmVzaEhvdmVyKCksaX19LHJlbW92ZUhvdmVyOmZ1bmN0aW9uKHQpe3RoaXMucGFpbnRlci5yZW1vdmVIb3ZlciYmKHRoaXMucGFpbnRlci5yZW1vdmVIb3Zlcih0KSx0aGlzLnJlZnJlc2hIb3ZlcigpKX0sY2xlYXJIb3ZlcjpmdW5jdGlvbigpe3RoaXMucGFpbnRlci5jbGVhckhvdmVyJiYodGhpcy5wYWludGVyLmNsZWFySG92ZXIoKSx0aGlzLnJlZnJlc2hIb3ZlcigpKX0scmVmcmVzaEhvdmVyOmZ1bmN0aW9uKCl7dGhpcy5fbmVlZHNSZWZyZXNoSG92ZXI9ITB9LHJlZnJlc2hIb3ZlckltbWVkaWF0ZWx5OmZ1bmN0aW9uKCl7dGhpcy5fbmVlZHNSZWZyZXNoSG92ZXI9ITEsdGhpcy5wYWludGVyLnJlZnJlc2hIb3ZlciYmdGhpcy5wYWludGVyLnJlZnJlc2hIb3ZlcigpfSxyZXNpemU6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLnBhaW50ZXIucmVzaXplKHQud2lkdGgsdC5oZWlnaHQpLHRoaXMuaGFuZGxlci5yZXNpemUoKX0sY2xlYXJBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbi5jbGVhcigpfSxnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhaW50ZXIuZ2V0V2lkdGgoKX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFpbnRlci5nZXRIZWlnaHQoKX0scGF0aFRvSW1hZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wYWludGVyLnBhdGhUb0ltYWdlKHQsZSl9LHNldEN1cnNvclN0eWxlOmZ1bmN0aW9uKHQpe3RoaXMuaGFuZGxlci5zZXRDdXJzb3JTdHlsZSh0KX0sZmluZEhvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaGFuZGxlci5maW5kSG92ZXIodCxlKX0sb246ZnVuY3Rpb24odCxlLGkpe3RoaXMuaGFuZGxlci5vbih0LGUsaSl9LG9mZjpmdW5jdGlvbih0LGUpe3RoaXMuaGFuZGxlci5vZmYodCxlKX0sdHJpZ2dlcjpmdW5jdGlvbih0LGUpe3RoaXMuaGFuZGxlci50cmlnZ2VyKHQsZSl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5zdG9yYWdlLmRlbFJvb3QoKSx0aGlzLnBhaW50ZXIuY2xlYXIoKX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uLnN0b3AoKSx0aGlzLmNsZWFyKCksdGhpcy5zdG9yYWdlLmRpc3Bvc2UoKSx0aGlzLnBhaW50ZXIuZGlzcG9zZSgpLHRoaXMuaGFuZGxlci5kaXNwb3NlKCksdGhpcy5hbmltYXRpb249dGhpcy5zdG9yYWdlPXRoaXMucGFpbnRlcj10aGlzLmhhbmRsZXI9bnVsbCxmdW5jdGlvbih0KXtkZWxldGUgVG9bdF19KHRoaXMuaWQpfX07dmFyIExvPShPYmplY3QuZnJlZXplfHxPYmplY3QpKHt2ZXJzaW9uOiI0LjIuMCIsaW5pdDpBbyxkaXNwb3NlOmZ1bmN0aW9uKHQpe2lmKHQpdC5kaXNwb3NlKCk7ZWxzZXtmb3IodmFyIGUgaW4gVG8pVG8uaGFzT3duUHJvcGVydHkoZSkmJlRvW2VdLmRpc3Bvc2UoKTtUbz17fX1yZXR1cm4gdGhpc30sZ2V0SW5zdGFuY2U6ZnVuY3Rpb24odCl7cmV0dXJuIFRvW3RdfSxyZWdpc3RlclBhaW50ZXI6RG99KSxrbz1FLFBvPVIsTm89ayxPbz0ic2VyaWVzXDAiO2Z1bmN0aW9uIEVvKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXk/dDpudWxsPT10P1tdOlt0XX1mdW5jdGlvbiB6byh0LGUsaSl7aWYodCl7dFtlXT10W2VdfHx7fSx0LmVtcGhhc2lzPXQuZW1waGFzaXN8fHt9LHQuZW1waGFzaXNbZV09dC5lbXBoYXNpc1tlXXx8e307Zm9yKHZhciBuPTAsbz1pLmxlbmd0aDtuPG87bisrKXt2YXIgYT1pW25dOyF0LmVtcGhhc2lzW2VdLmhhc093blByb3BlcnR5KGEpJiZ0W2VdLmhhc093blByb3BlcnR5KGEpJiYodC5lbXBoYXNpc1tlXVthXT10W2VdW2FdKX19fXZhciBSbz1bImZvbnRTdHlsZSIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJyaWNoIiwidGFnIiwiY29sb3IiLCJ0ZXh0Qm9yZGVyQ29sb3IiLCJ0ZXh0Qm9yZGVyV2lkdGgiLCJ3aWR0aCIsImhlaWdodCIsImxpbmVIZWlnaHQiLCJhbGlnbiIsInZlcnRpY2FsQWxpZ24iLCJiYXNlbGluZSIsInNoYWRvd0NvbG9yIiwic2hhZG93Qmx1ciIsInNoYWRvd09mZnNldFgiLCJzaGFkb3dPZmZzZXRZIiwidGV4dFNoYWRvd0NvbG9yIiwidGV4dFNoYWRvd0JsdXIiLCJ0ZXh0U2hhZG93T2Zmc2V0WCIsInRleHRTaGFkb3dPZmZzZXRZIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsImJvcmRlclJhZGl1cyIsInBhZGRpbmciXTtmdW5jdGlvbiBCbyh0KXtyZXR1cm4hUG8odCl8fE5vKHQpfHx0IGluc3RhbmNlb2YgRGF0ZT90OnQudmFsdWV9ZnVuY3Rpb24gVm8odCxvKXtvPShvfHxbXSkuc2xpY2UoKTt2YXIgYT1OKHR8fFtdLGZ1bmN0aW9uKHQsZSl7cmV0dXJue2V4aXN0OnR9fSk7cmV0dXJuIGtvKG8sZnVuY3Rpb24odCxlKXtpZihQbyh0KSl7Zm9yKHZhciBpPTA7aTxhLmxlbmd0aDtpKyspaWYoIWFbaV0ub3B0aW9uJiZudWxsIT10LmlkJiZhW2ldLmV4aXN0LmlkPT09dC5pZCsiIilyZXR1cm4gYVtpXS5vcHRpb249dCx2b2lkKG9bZV09bnVsbCk7Zm9yKGk9MDtpPGEubGVuZ3RoO2krKyl7dmFyIG49YVtpXS5leGlzdDtpZighKGFbaV0ub3B0aW9ufHxudWxsIT1uLmlkJiZudWxsIT10LmlkfHxudWxsPT10Lm5hbWV8fFdvKHQpfHxXbyhuKXx8bi5uYW1lIT09dC5uYW1lKyIiKSlyZXR1cm4gYVtpXS5vcHRpb249dCx2b2lkKG9bZV09bnVsbCl9fX0pLGtvKG8sZnVuY3Rpb24odCxlKXtpZihQbyh0KSl7Zm9yKHZhciBpPTA7aTxhLmxlbmd0aDtpKyspe3ZhciBuPWFbaV0uZXhpc3Q7aWYoIWFbaV0ub3B0aW9uJiYhV28obikmJm51bGw9PXQuaWQpe2FbaV0ub3B0aW9uPXQ7YnJlYWt9fWk+PWEubGVuZ3RoJiZhLnB1c2goe29wdGlvbjp0fSl9fSksYX1mdW5jdGlvbiBHbyh0KXt2YXIgcj1RKCk7a28odCxmdW5jdGlvbih0LGUpe3ZhciBpPXQuZXhpc3Q7aSYmci5zZXQoaS5pZCx0KX0pLGtvKHQsZnVuY3Rpb24odCxlKXt2YXIgaT10Lm9wdGlvbjtZKCFpfHxudWxsPT1pLmlkfHwhci5nZXQoaS5pZCl8fHIuZ2V0KGkuaWQpPT09dCwiaWQgZHVwbGljYXRlczogIisoaSYmaS5pZCkpLGkmJm51bGwhPWkuaWQmJnIuc2V0KGkuaWQsdCksdC5rZXlJbmZvfHwodC5rZXlJbmZvPXt9KX0pLGtvKHQsZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4aXN0LG49dC5vcHRpb24sbz10LmtleUluZm87aWYoUG8obikpe2lmKG8ubmFtZT1udWxsIT1uLm5hbWU/bi5uYW1lKyIiOmk/aS5uYW1lOk9vK2UsaSlvLmlkPWkuaWQ7ZWxzZSBpZihudWxsIT1uLmlkKW8uaWQ9bi5pZCsiIjtlbHNlIGZvcih2YXIgYT0wO28uaWQ9IlwwIitvLm5hbWUrIlwwIithKyssci5nZXQoby5pZCk7KTtyLnNldChvLmlkLHQpfX0pfWZ1bmN0aW9uIEZvKHQpe3ZhciBlPXQubmFtZTtyZXR1cm4hKCFlfHwhZS5pbmRleE9mKE9vKSl9ZnVuY3Rpb24gV28odCl7cmV0dXJuIFBvKHQpJiZ0LmlkJiYwPT09KHQuaWQrIiIpLmluZGV4T2YoIlwwX2VjX1wwIil9ZnVuY3Rpb24gSG8oZSx0KXtyZXR1cm4gbnVsbCE9dC5kYXRhSW5kZXhJbnNpZGU/dC5kYXRhSW5kZXhJbnNpZGU6bnVsbCE9dC5kYXRhSW5kZXg/ayh0LmRhdGFJbmRleCk/Tih0LmRhdGFJbmRleCxmdW5jdGlvbih0KXtyZXR1cm4gZS5pbmRleE9mUmF3SW5kZXgodCl9KTplLmluZGV4T2ZSYXdJbmRleCh0LmRhdGFJbmRleCk6bnVsbCE9dC5uYW1lP2sodC5uYW1lKT9OKHQubmFtZSxmdW5jdGlvbih0KXtyZXR1cm4gZS5pbmRleE9mTmFtZSh0KX0pOmUuaW5kZXhPZk5hbWUodC5uYW1lKTp2b2lkIDB9ZnVuY3Rpb24gWm8oKXt2YXIgZT0iX19cMGVjX2lubmVyXyIrVW8rKysiXyIrTWF0aC5yYW5kb20oKS50b0ZpeGVkKDUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdFtlXXx8KHRbZV09e30pfX12YXIgVW89MDtmdW5jdGlvbiBYbyhzLGwsdSl7aWYoeihsKSl7dmFyIHQ9e307dFtsKyJJbmRleCJdPTAsbD10fXZhciBlPXUmJnUuZGVmYXVsdE1haW5UeXBlOyFlfHxZbyhsLGUrIkluZGV4Iil8fFlvKGwsZSsiSWQiKXx8WW8obCxlKyJOYW1lIil8fChsW2UrIkluZGV4Il09MCk7dmFyIGg9e307cmV0dXJuIGtvKGwsZnVuY3Rpb24odCxlKXt0PWxbZV07aWYoImRhdGFJbmRleCIhPT1lJiYiZGF0YUluZGV4SW5zaWRlIiE9PWUpe3ZhciBpPWUubWF0Y2goL14oXHcrKShJbmRleHxJZHxOYW1lKSQvKXx8W10sbj1pWzFdLG89KGlbMl18fCIiKS50b0xvd2VyQ2FzZSgpO2lmKCEoIW58fCFvfHxudWxsPT10fHwiaW5kZXgiPT09byYmIm5vbmUiPT09dHx8dSYmdS5pbmNsdWRlTWFpblR5cGVzJiZfKHUuaW5jbHVkZU1haW5UeXBlcyxuKTwwKSl7dmFyIGE9e21haW5UeXBlOm59OyJpbmRleCI9PT1vJiYiYWxsIj09PXR8fChhW29dPXQpO3ZhciByPXMucXVlcnlDb21wb25lbnRzKGEpO2hbbisiTW9kZWxzIl09cixoW24rIk1vZGVsIl09clswXX19ZWxzZSBoW2VdPXR9KSxofWZ1bmN0aW9uIFlvKHQsZSl7cmV0dXJuIHQmJnQuaGFzT3duUHJvcGVydHkoZSl9ZnVuY3Rpb24gam8odCxlLGkpe3Quc2V0QXR0cmlidXRlP3Quc2V0QXR0cmlidXRlKGUsaSk6dFtlXT1pfWZ1bmN0aW9uIHFvKHQpe3JldHVybiJhdXRvIj09PXQ/di5kb21TdXBwb3J0ZWQ/Imh0bWwiOiJyaWNoVGV4dCI6dHx8Imh0bWwifWZ1bmN0aW9uIEtvKHQsaSl7dmFyIG49USgpLG89W107cmV0dXJuIEUodCxmdW5jdGlvbih0KXt2YXIgZT1pKHQpOyhuLmdldChlKXx8KG8ucHVzaChlKSxuLnNldChlLFtdKSkpLnB1c2godCl9KSx7a2V5czpvLGJ1Y2tldHM6bn19dmFyICRvPSIuIixKbz0iX19fRUNfX0NPTVBPTkVOVF9fQ09OVEFJTkVSX19fIjtmdW5jdGlvbiBRbyh0KXt2YXIgZT17bWFpbjoiIixzdWI6IiJ9O3JldHVybiB0JiYodD10LnNwbGl0KCRvKSxlLm1haW49dFswXXx8IiIsZS5zdWI9dFsxXXx8IiIpLGV9ZnVuY3Rpb24gdGEodCl7KHQuJGNvbnN0cnVjdG9yPXQpLmV4dGVuZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC4kY29uc3RydWN0b3I/dC4kY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBpPXRoaXM7cmV0dXJuIEwoZS5wcm90b3R5cGUsdCksZS5leHRlbmQ9dGhpcy5leHRlbmQsZS5zdXBlckNhbGw9bmEsZS5zdXBlckFwcGx5PW9hLHcoZSx0aGlzKSxlLnN1cGVyQ2xhc3M9aSxlfX12YXIgZWE9MDtmdW5jdGlvbiBpYSh0KXt2YXIgZT1bIl9fXDBpc19jbHoiLGVhKyssTWF0aC5yYW5kb20oKS50b0ZpeGVkKDMpXS5qb2luKCJfIik7dC5wcm90b3R5cGVbZV09ITAsdC5pc0luc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiEoIXR8fCF0W2VdKX19ZnVuY3Rpb24gbmEodCxlKXt2YXIgaT1VKGFyZ3VtZW50cywyKTtyZXR1cm4gdGhpcy5zdXBlckNsYXNzLnByb3RvdHlwZVtlXS5hcHBseSh0LGkpfWZ1bmN0aW9uIG9hKHQsZSxpKXtyZXR1cm4gdGhpcy5zdXBlckNsYXNzLnByb3RvdHlwZVtlXS5hcHBseSh0LGkpfWZ1bmN0aW9uIGFhKGksdCl7dD10fHx7fTt2YXIgbz17fTtpZihpLnJlZ2lzdGVyQ2xhc3M9ZnVuY3Rpb24odCxlKXtpZihlKWlmKGZ1bmN0aW9uKHQpe1koL15bYS16QS1aMC05X10rKFsuXVthLXpBLVowLTlfXSspPyQvLnRlc3QodCksJ2NvbXBvbmVudFR5cGUgIicrdCsnIiBpbGxlZ2FsJyl9KGUpLChlPVFvKGUpKS5zdWIpe2lmKGUuc3ViIT09Sm8peyhmdW5jdGlvbih0KXt2YXIgZT1vW3QubWFpbl07ZSYmZVtKb118fCgoZT1vW3QubWFpbl09e30pW0pvXT0hMCk7cmV0dXJuIGV9KShlKVtlLnN1Yl09dH19ZWxzZSBvW2UubWFpbl09dDtyZXR1cm4gdH0saS5nZXRDbGFzcz1mdW5jdGlvbih0LGUsaSl7dmFyIG49b1t0XTtpZihuJiZuW0pvXSYmKG49ZT9uW2VdOm51bGwpLGkmJiFuKXRocm93IG5ldyBFcnJvcihlPyJDb21wb25lbnQgIit0KyIuIisoZXx8IiIpKyIgbm90IGV4aXN0cy4gTG9hZCBpdCBmaXJzdC4iOnQrIi50eXBlIHNob3VsZCBiZSBzcGVjaWZpZWQuIik7cmV0dXJuIG59LGkuZ2V0Q2xhc3Nlc0J5TWFpblR5cGU9ZnVuY3Rpb24odCl7dD1Rbyh0KTt2YXIgaT1bXSxlPW9bdC5tYWluXTtyZXR1cm4gZSYmZVtKb10/RShlLGZ1bmN0aW9uKHQsZSl7ZSE9PUpvJiZpLnB1c2godCl9KTppLnB1c2goZSksaX0saS5oYXNDbGFzcz1mdW5jdGlvbih0KXtyZXR1cm4gdD1Rbyh0KSwhIW9bdC5tYWluXX0saS5nZXRBbGxDbGFzc01haW5UeXBlcz1mdW5jdGlvbigpe3ZhciBpPVtdO3JldHVybiBFKG8sZnVuY3Rpb24odCxlKXtpLnB1c2goZSl9KSxpfSxpLmhhc1N1YlR5cGVzPWZ1bmN0aW9uKHQpe3Q9UW8odCk7dmFyIGU9b1t0Lm1haW5dO3JldHVybiBlJiZlW0pvXX0saS5wYXJzZUNsYXNzVHlwZT1Rbyx0LnJlZ2lzdGVyV2hlbkV4dGVuZCl7dmFyIG49aS5leHRlbmQ7biYmKGkuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPW4uY2FsbCh0aGlzLHQpO3JldHVybiBpLnJlZ2lzdGVyQ2xhc3MoZSx0LnR5cGUpfSl9cmV0dXJuIGl9ZnVuY3Rpb24gcmEocyl7Zm9yKHZhciB0PTA7dDxzLmxlbmd0aDt0Kyspc1t0XVsxXXx8KHNbdF1bMV09c1t0XVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG49e30sbz0wO288cy5sZW5ndGg7bysrKXt2YXIgYT1zW29dWzFdO2lmKCEoZSYmMDw9XyhlLGEpfHxpJiZfKGksYSk8MCkpe3ZhciByPXQuZ2V0U2hhbGxvdyhhKTtudWxsIT1yJiYobltzW29dWzBdXT1yKX19cmV0dXJuIG59fXZhciBzYT1yYShbWyJsaW5lV2lkdGgiLCJ3aWR0aCJdLFsic3Ryb2tlIiwiY29sb3IiXSxbIm9wYWNpdHkiXSxbInNoYWRvd0JsdXIiXSxbInNoYWRvd09mZnNldFgiXSxbInNoYWRvd09mZnNldFkiXSxbInNoYWRvd0NvbG9yIl1dKSxsYT17Z2V0TGluZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXNhKHRoaXMsdCk7cmV0dXJuIGUubGluZURhc2g9dGhpcy5nZXRMaW5lRGFzaChlLmxpbmVXaWR0aCksZX0sZ2V0TGluZURhc2g6ZnVuY3Rpb24odCl7bnVsbD09dCYmKHQ9MSk7dmFyIGU9dGhpcy5nZXQoInR5cGUiKSxpPU1hdGgubWF4KHQsMiksbj00KnQ7cmV0dXJuInNvbGlkIiE9PWUmJm51bGwhPWUmJigiZGFzaGVkIj09PWU/W24sbl06W2ksaV0pfX0sdWE9cmEoW1siZmlsbCIsImNvbG9yIl0sWyJzaGFkb3dCbHVyIl0sWyJzaGFkb3dPZmZzZXRYIl0sWyJzaGFkb3dPZmZzZXRZIl0sWyJvcGFjaXR5Il0sWyJzaGFkb3dDb2xvciJdXSksaGE9e2dldEFyZWFTdHlsZTpmdW5jdGlvbih0LGUpe3JldHVybiB1YSh0aGlzLHQsZSl9fSxjYT1NYXRoLnBvdyxkYT1NYXRoLnNxcnQsZmE9MWUtOCxwYT0xZS00LGdhPWRhKDMpLG1hPTEvMyx2YT1vdCgpLHlhPW90KCkseGE9b3QoKTtmdW5jdGlvbiBfYSh0KXtyZXR1cm4tZmE8dCYmdDxmYX1mdW5jdGlvbiB3YSh0KXtyZXR1cm4gZmE8dHx8dDwtZmF9ZnVuY3Rpb24gYmEodCxlLGksbixvKXt2YXIgYT0xLW87cmV0dXJuIGEqYSooYSp0KzMqbyplKStvKm8qKG8qbiszKmEqaSl9ZnVuY3Rpb24gU2EodCxlLGksbixvKXt2YXIgYT0xLW87cmV0dXJuIDMqKCgoZS10KSphKzIqKGktZSkqbykqYSsobi1pKSpvKm8pfWZ1bmN0aW9uIE1hKHQsZSxpLG4sbyl7dmFyIGE9NippLTEyKmUrNip0LHI9OSplKzMqbi0zKnQtOSppLHM9MyplLTMqdCxsPTA7aWYoX2Eocikpe2lmKHdhKGEpKTA8PShoPS1zL2EpJiZoPD0xJiYob1tsKytdPWgpfWVsc2V7dmFyIHU9YSphLTQqcipzO2lmKF9hKHUpKW9bMF09LWEvKDIqcik7ZWxzZSBpZigwPHUpe3ZhciBoLGM9ZGEodSksZD0oLWEtYykvKDIqcik7MDw9KGg9KC1hK2MpLygyKnIpKSYmaDw9MSYmKG9bbCsrXT1oKSwwPD1kJiZkPD0xJiYob1tsKytdPWQpfX1yZXR1cm4gbH1mdW5jdGlvbiBJYSh0LGUsaSxuLG8sYSl7dmFyIHI9KGUtdCkqbyt0LHM9KGktZSkqbytlLGw9KG4taSkqbytpLHU9KHMtcikqbytyLGg9KGwtcykqbytzLGM9KGgtdSkqbyt1O2FbMF09dCxhWzFdPXIsYVsyXT11LGFbM109YyxhWzRdPWMsYVs1XT1oLGFbNl09bCxhWzddPW59ZnVuY3Rpb24gVGEodCxlLGksbil7dmFyIG89MS1uO3JldHVybiBvKihvKnQrMipuKmUpK24qbippfWZ1bmN0aW9uIEFhKHQsZSxpLG4pe3JldHVybiAyKigoMS1uKSooZS10KStuKihpLWUpKX1mdW5jdGlvbiBEYSh0LGUsaSl7dmFyIG49dCtpLTIqZTtyZXR1cm4gMD09bj8uNToodC1lKS9ufWZ1bmN0aW9uIENhKHQsZSxpLG4sbyl7dmFyIGE9KGUtdCkqbit0LHI9KGktZSkqbitlLHM9KHItYSkqbithO29bMF09dCxvWzFdPWEsb1syXT1zLG9bM109cyxvWzRdPXIsb1s1XT1pfXZhciBMYT1NYXRoLm1pbixrYT1NYXRoLm1heCxQYT1NYXRoLnNpbixOYT1NYXRoLmNvcyxPYT0yKk1hdGguUEksRWE9b3QoKSx6YT1vdCgpLFJhPW90KCk7ZnVuY3Rpb24gQmEodCxlLGkpe2lmKDAhPT10Lmxlbmd0aCl7dmFyIG4sbz10WzBdLGE9b1swXSxyPW9bMF0scz1vWzFdLGw9b1sxXTtmb3Iobj0xO248dC5sZW5ndGg7bisrKW89dFtuXSxhPUxhKGEsb1swXSkscj1rYShyLG9bMF0pLHM9TGEocyxvWzFdKSxsPWthKGwsb1sxXSk7ZVswXT1hLGVbMV09cyxpWzBdPXIsaVsxXT1sfX1mdW5jdGlvbiBWYSh0LGUsaSxuLG8sYSl7b1swXT1MYSh0LGkpLG9bMV09TGEoZSxuKSxhWzBdPWthKHQsaSksYVsxXT1rYShlLG4pfXZhciBHYT1bXSxGYT1bXTtmdW5jdGlvbiBXYSh0LGUsaSxuLG8sYSxyLHMsbCx1KXt2YXIgaCxjPU1hLGQ9YmEsZj1jKHQsaSxvLHIsR2EpO2ZvcihsWzBdPTEvMCxsWzFdPTEvMCx1WzBdPS0xLzAsdVsxXT0tMS8wLGg9MDtoPGY7aCsrKXt2YXIgcD1kKHQsaSxvLHIsR2FbaF0pO2xbMF09TGEocCxsWzBdKSx1WzBdPWthKHAsdVswXSl9Zm9yKGY9YyhlLG4sYSxzLEZhKSxoPTA7aDxmO2grKyl7dmFyIGc9ZChlLG4sYSxzLEZhW2hdKTtsWzFdPUxhKGcsbFsxXSksdVsxXT1rYShnLHVbMV0pfWxbMF09TGEodCxsWzBdKSx1WzBdPWthKHQsdVswXSksbFswXT1MYShyLGxbMF0pLHVbMF09a2Eocix1WzBdKSxsWzFdPUxhKGUsbFsxXSksdVsxXT1rYShlLHVbMV0pLGxbMV09TGEocyxsWzFdKSx1WzFdPWthKHMsdVsxXSl9ZnVuY3Rpb24gSGEodCxlLGksbixvLGEscixzLGwpe3ZhciB1PVN0LGg9TXQsYz1NYXRoLmFicyhvLWEpO2lmKGMlT2E8MWUtNCYmMWUtNDxjKXJldHVybiBzWzBdPXQtaSxzWzFdPWUtbixsWzBdPXQraSx2b2lkKGxbMV09ZStuKTtpZihFYVswXT1OYShvKSppK3QsRWFbMV09UGEobykqbitlLHphWzBdPU5hKGEpKmkrdCx6YVsxXT1QYShhKSpuK2UsdShzLEVhLHphKSxoKGwsRWEsemEpLChvJT1PYSk8MCYmKG8rPU9hKSwoYSU9T2EpPDAmJihhKz1PYSksYTxvJiYhcj9hKz1PYTpvPGEmJnImJihvKz1PYSkscil7dmFyIGQ9YTthPW8sbz1kfWZvcih2YXIgZj0wO2Y8YTtmKz1NYXRoLlBJLzIpbzxmJiYoUmFbMF09TmEoZikqaSt0LFJhWzFdPVBhKGYpKm4rZSx1KHMsUmEscyksaChsLFJhLGwpKX12YXIgWmE9e006MSxMOjIsQzozLFE6NCxBOjUsWjo2LFI6N30sVWE9W10sWGE9W10sWWE9W10samE9W10scWE9TWF0aC5taW4sS2E9TWF0aC5tYXgsJGE9TWF0aC5jb3MsSmE9TWF0aC5zaW4sUWE9TWF0aC5zcXJ0LHRyPU1hdGguYWJzLGVyPSJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5LGlyPWZ1bmN0aW9uKHQpe3RoaXMuX3NhdmVEYXRhPSF0LHRoaXMuX3NhdmVEYXRhJiYodGhpcy5kYXRhPVtdKSx0aGlzLl9jdHg9bnVsbH07ZnVuY3Rpb24gbnIodCxlLGksbixvLGEscil7aWYoMD09PW8pcmV0dXJuITE7dmFyIHM9byxsPTA7aWYoZStzPHImJm4rczxyfHxyPGUtcyYmcjxuLXN8fHQrczxhJiZpK3M8YXx8YTx0LXMmJmE8aS1zKXJldHVybiExO2lmKHQ9PT1pKXJldHVybiBNYXRoLmFicyhhLXQpPD1zLzI7dmFyIHU9KGw9KGUtbikvKHQtaSkpKmEtcisodCpuLWkqZSkvKHQtaSk7cmV0dXJuIHUqdS8obCpsKzEpPD1zLzIqcy8yfWZ1bmN0aW9uIG9yKHQsZSxpLG4sbyxhLHIscyxsLHUsaCl7aWYoMD09PWwpcmV0dXJuITE7dmFyIGM9bDtyZXR1cm4hKGUrYzxoJiZuK2M8aCYmYStjPGgmJnMrYzxofHxoPGUtYyYmaDxuLWMmJmg8YS1jJiZoPHMtY3x8dCtjPHUmJmkrYzx1JiZvK2M8dSYmcitjPHV8fHU8dC1jJiZ1PGktYyYmdTxvLWMmJnU8ci1jKSYmZnVuY3Rpb24odCxlLGksbixvLGEscixzLGwsdSxoKXt2YXIgYyxkLGYscCxnLG09LjAwNSx2PTEvMDt2YVswXT1sLHZhWzFdPXU7Zm9yKHZhciB5PTA7eTwxO3krPS4wNSl5YVswXT1iYSh0LGksbyxyLHkpLHlhWzFdPWJhKGUsbixhLHMseSksKHA9X3QodmEseWEpKTx2JiYoYz15LHY9cCk7dj0xLzA7Zm9yKHZhciB4PTA7eDwzMiYmIShtPHBhKTt4KyspZD1jLW0sZj1jK20seWFbMF09YmEodCxpLG8scixkKSx5YVsxXT1iYShlLG4sYSxzLGQpLHA9X3QoeWEsdmEpLDA8PWQmJnA8dj8oYz1kLHY9cCk6KHhhWzBdPWJhKHQsaSxvLHIsZikseGFbMV09YmEoZSxuLGEscyxmKSxnPV90KHhhLHZhKSxmPD0xJiZnPHY/KGM9Zix2PWcpOm0qPS41KTtyZXR1cm4gaCYmKGhbMF09YmEodCxpLG8scixjKSxoWzFdPWJhKGUsbixhLHMsYykpLGRhKHYpfSh0LGUsaSxuLG8sYSxyLHMsdSxoLG51bGwpPD1jLzJ9ZnVuY3Rpb24gYXIodCxlLGksbixvLGEscixzLGwpe2lmKDA9PT1yKXJldHVybiExO3ZhciB1PXI7cmV0dXJuIShlK3U8bCYmbit1PGwmJmErdTxsfHxsPGUtdSYmbDxuLXUmJmw8YS11fHx0K3U8cyYmaSt1PHMmJm8rdTxzfHxzPHQtdSYmczxpLXUmJnM8by11KSYmZnVuY3Rpb24odCxlLGksbixvLGEscixzLGwpe3ZhciB1LGg9LjAwNSxjPTEvMDt2YVswXT1yLHZhWzFdPXM7Zm9yKHZhciBkPTA7ZDwxO2QrPS4wNSl7eWFbMF09VGEodCxpLG8sZCkseWFbMV09VGEoZSxuLGEsZCksKG09X3QodmEseWEpKTxjJiYodT1kLGM9bSl9Yz0xLzA7Zm9yKHZhciBmPTA7ZjwzMiYmIShoPHBhKTtmKyspe3ZhciBwPXUtaCxnPXUraDt5YVswXT1UYSh0LGksbyxwKSx5YVsxXT1UYShlLG4sYSxwKTt2YXIgbT1fdCh5YSx2YSk7aWYoMDw9cCYmbTxjKXU9cCxjPW07ZWxzZXt4YVswXT1UYSh0LGksbyxnKSx4YVsxXT1UYShlLG4sYSxnKTt2YXIgdj1fdCh4YSx2YSk7Zzw9MSYmdjxjPyh1PWcsYz12KTpoKj0uNX19cmV0dXJuIGwmJihsWzBdPVRhKHQsaSxvLHUpLGxbMV09VGEoZSxuLGEsdSkpLGRhKGMpfSh0LGUsaSxuLG8sYSxzLGwsbnVsbCk8PXUvMn1pci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlyLF94aTowLF95aTowLF94MDowLF95MDowLF91eDowLF91eTowLF9sZW46MCxfbGluZURhc2g6bnVsbCxfZGFzaE9mZnNldDowLF9kYXNoSWR4OjAsX2Rhc2hTdW06MCxzZXRTY2FsZTpmdW5jdGlvbih0LGUsaSl7aT1pfHwwLHRoaXMuX3V4PXRyKGkvaGkvdCl8fDAsdGhpcy5fdXk9dHIoaS9oaS9lKXx8MH0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdHh9LGJlZ2luUGF0aDpmdW5jdGlvbih0KXtyZXR1cm4odGhpcy5fY3R4PXQpJiZ0LmJlZ2luUGF0aCgpLHQmJih0aGlzLmRwcj10LmRwciksdGhpcy5fc2F2ZURhdGEmJih0aGlzLl9sZW49MCksdGhpcy5fbGluZURhc2gmJih0aGlzLl9saW5lRGFzaD1udWxsLHRoaXMuX2Rhc2hPZmZzZXQ9MCksdGhpc30sbW92ZVRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkRGF0YShaYS5NLHQsZSksdGhpcy5fY3R4JiZ0aGlzLl9jdHgubW92ZVRvKHQsZSksdGhpcy5feDA9dCx0aGlzLl95MD1lLHRoaXMuX3hpPXQsdGhpcy5feWk9ZSx0aGlzfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt2YXIgaT10cih0LXRoaXMuX3hpKT50aGlzLl91eHx8dHIoZS10aGlzLl95aSk+dGhpcy5fdXl8fHRoaXMuX2xlbjw1O3JldHVybiB0aGlzLmFkZERhdGEoWmEuTCx0LGUpLHRoaXMuX2N0eCYmaSYmKHRoaXMuX25lZWRzRGFzaCgpP3RoaXMuX2Rhc2hlZExpbmVUbyh0LGUpOnRoaXMuX2N0eC5saW5lVG8odCxlKSksaSYmKHRoaXMuX3hpPXQsdGhpcy5feWk9ZSksdGhpc30sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsaSxuLG8sYSl7cmV0dXJuIHRoaXMuYWRkRGF0YShaYS5DLHQsZSxpLG4sbyxhKSx0aGlzLl9jdHgmJih0aGlzLl9uZWVkc0Rhc2goKT90aGlzLl9kYXNoZWRCZXppZXJUbyh0LGUsaSxuLG8sYSk6dGhpcy5fY3R4LmJlemllckN1cnZlVG8odCxlLGksbixvLGEpKSx0aGlzLl94aT1vLHRoaXMuX3lpPWEsdGhpc30scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gdGhpcy5hZGREYXRhKFphLlEsdCxlLGksbiksdGhpcy5fY3R4JiYodGhpcy5fbmVlZHNEYXNoKCk/dGhpcy5fZGFzaGVkUXVhZHJhdGljVG8odCxlLGksbik6dGhpcy5fY3R4LnF1YWRyYXRpY0N1cnZlVG8odCxlLGksbikpLHRoaXMuX3hpPWksdGhpcy5feWk9bix0aGlzfSxhcmM6ZnVuY3Rpb24odCxlLGksbixvLGEpe3JldHVybiB0aGlzLmFkZERhdGEoWmEuQSx0LGUsaSxpLG4sby1uLDAsYT8wOjEpLHRoaXMuX2N0eCYmdGhpcy5fY3R4LmFyYyh0LGUsaSxuLG8sYSksdGhpcy5feGk9JGEobykqaSt0LHRoaXMuX3lpPUphKG8pKmkrZSx0aGlzfSxhcmNUbzpmdW5jdGlvbih0LGUsaSxuLG8pe3JldHVybiB0aGlzLl9jdHgmJnRoaXMuX2N0eC5hcmNUbyh0LGUsaSxuLG8pLHRoaXN9LHJlY3Q6ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHRoaXMuX2N0eCYmdGhpcy5fY3R4LnJlY3QodCxlLGksbiksdGhpcy5hZGREYXRhKFphLlIsdCxlLGksbiksdGhpc30sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5hZGREYXRhKFphLlopO3ZhciB0PXRoaXMuX2N0eCxlPXRoaXMuX3gwLGk9dGhpcy5feTA7cmV0dXJuIHQmJih0aGlzLl9uZWVkc0Rhc2goKSYmdGhpcy5fZGFzaGVkTGluZVRvKGUsaSksdC5jbG9zZVBhdGgoKSksdGhpcy5feGk9ZSx0aGlzLl95aT1pLHRoaXN9LGZpbGw6ZnVuY3Rpb24odCl7dCYmdC5maWxsKCksdGhpcy50b1N0YXRpYygpfSxzdHJva2U6ZnVuY3Rpb24odCl7dCYmdC5zdHJva2UoKSx0aGlzLnRvU3RhdGljKCl9LHNldExpbmVEYXNoOmZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBBcnJheSl7dGhpcy5fbGluZURhc2g9dDtmb3IodmFyIGU9dGhpcy5fZGFzaElkeD0wLGk9MDtpPHQubGVuZ3RoO2krKyllKz10W2ldO3RoaXMuX2Rhc2hTdW09ZX1yZXR1cm4gdGhpc30sc2V0TGluZURhc2hPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Rhc2hPZmZzZXQ9dCx0aGlzfSxsZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVufSxzZXREYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO3RoaXMuZGF0YSYmdGhpcy5kYXRhLmxlbmd0aD09PWV8fCFlcnx8KHRoaXMuZGF0YT1uZXcgRmxvYXQzMkFycmF5KGUpKTtmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMuZGF0YVtpXT10W2ldO3RoaXMuX2xlbj1lfSxhcHBlbmRQYXRoOmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBBcnJheXx8KHQ9W3RdKTtmb3IodmFyIGU9dC5sZW5ndGgsaT0wLG49dGhpcy5fbGVuLG89MDtvPGU7bysrKWkrPXRbb10ubGVuKCk7ZXImJnRoaXMuZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSYmKHRoaXMuZGF0YT1uZXcgRmxvYXQzMkFycmF5KG4raSkpO2ZvcihvPTA7bzxlO28rKylmb3IodmFyIGE9dFtvXS5kYXRhLHI9MDtyPGEubGVuZ3RoO3IrKyl0aGlzLmRhdGFbbisrXT1hW3JdO3RoaXMuX2xlbj1ufSxhZGREYXRhOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX3NhdmVEYXRhKXt2YXIgZT10aGlzLmRhdGE7dGhpcy5fbGVuK2FyZ3VtZW50cy5sZW5ndGg+ZS5sZW5ndGgmJih0aGlzLl9leHBhbmREYXRhKCksZT10aGlzLmRhdGEpO2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspZVt0aGlzLl9sZW4rK109YXJndW1lbnRzW2ldO3RoaXMuX3ByZXZDbWQ9dH19LF9leHBhbmREYXRhOmZ1bmN0aW9uKCl7aWYoISh0aGlzLmRhdGEgaW5zdGFuY2VvZiBBcnJheSkpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLl9sZW47ZSsrKXRbZV09dGhpcy5kYXRhW2VdO3RoaXMuZGF0YT10fX0sX25lZWRzRGFzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9saW5lRGFzaH0sX2Rhc2hlZExpbmVUbzpmdW5jdGlvbih0LGUpe3ZhciBpLG4sbz10aGlzLl9kYXNoU3VtLGE9dGhpcy5fZGFzaE9mZnNldCxyPXRoaXMuX2xpbmVEYXNoLHM9dGhpcy5fY3R4LGw9dGhpcy5feGksdT10aGlzLl95aSxoPXQtbCxjPWUtdSxkPVFhKGgqaCtjKmMpLGY9bCxwPXUsZz1yLmxlbmd0aDtmb3IoYTwwJiYoYT1vK2EpLGYtPShhJT1vKSooaC89ZCkscC09YSooYy89ZCk7MDxoJiZmPD10fHxoPDAmJnQ8PWZ8fDA9PT1oJiYoMDxjJiZwPD1lfHxjPDAmJmU8PXApOylmKz1oKihpPXJbbj10aGlzLl9kYXNoSWR4XSkscCs9YyppLHRoaXMuX2Rhc2hJZHg9KG4rMSklZywwPGgmJmY8bHx8aDwwJiZsPGZ8fDA8YyYmcDx1fHxjPDAmJnU8cHx8c1tuJTI/Im1vdmVUbyI6ImxpbmVUbyJdKDA8PWg/cWEoZix0KTpLYShmLHQpLDA8PWM/cWEocCxlKTpLYShwLGUpKTtoPWYtdCxjPXAtZSx0aGlzLl9kYXNoT2Zmc2V0PS1RYShoKmgrYypjKX0sX2Rhc2hlZEJlemllclRvOmZ1bmN0aW9uKHQsZSxpLG4sbyxhKXt2YXIgcixzLGwsdSxoLGM9dGhpcy5fZGFzaFN1bSxkPXRoaXMuX2Rhc2hPZmZzZXQsZj10aGlzLl9saW5lRGFzaCxwPXRoaXMuX2N0eCxnPXRoaXMuX3hpLG09dGhpcy5feWksdj1iYSx5PTAseD10aGlzLl9kYXNoSWR4LF89Zi5sZW5ndGgsdz0wO2ZvcihkPDAmJihkPWMrZCksZCU9YyxyPTA7cjwxO3IrPS4xKXM9dihnLHQsaSxvLHIrLjEpLXYoZyx0LGksbyxyKSxsPXYobSxlLG4sYSxyKy4xKS12KG0sZSxuLGEscikseSs9UWEocypzK2wqbCk7Zm9yKDt4PF8mJiEoZDwodys9Zlt4XSkpO3grKyk7Zm9yKHI9KHctZCkveTtyPD0xOyl1PXYoZyx0LGksbyxyKSxoPXYobSxlLG4sYSxyKSx4JTI/cC5tb3ZlVG8odSxoKTpwLmxpbmVUbyh1LGgpLHIrPWZbeF0veSx4PSh4KzEpJV87eCUyIT0wJiZwLmxpbmVUbyhvLGEpLHM9by11LGw9YS1oLHRoaXMuX2Rhc2hPZmZzZXQ9LVFhKHMqcytsKmwpfSxfZGFzaGVkUXVhZHJhdGljVG86ZnVuY3Rpb24odCxlLGksbil7dmFyIG89aSxhPW47aT0oaSsyKnQpLzMsbj0obisyKmUpLzMsdD0odGhpcy5feGkrMip0KS8zLGU9KHRoaXMuX3lpKzIqZSkvMyx0aGlzLl9kYXNoZWRCZXppZXJUbyh0LGUsaSxuLG8sYSl9LHRvU3RhdGljOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhO3QgaW5zdGFuY2VvZiBBcnJheSYmKHQubGVuZ3RoPXRoaXMuX2xlbixlciYmKHRoaXMuZGF0YT1uZXcgRmxvYXQzMkFycmF5KHQpKSl9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe1VhWzBdPVVhWzFdPVlhWzBdPVlhWzFdPU51bWJlci5NQVhfVkFMVUUsWGFbMF09WGFbMV09amFbMF09amFbMV09LU51bWJlci5NQVhfVkFMVUU7Zm9yKHZhciB0LGUsaSxuLG8sYSxyLHMsbCx1LGgsYyxkLGYscD10aGlzLmRhdGEsZz0wLG09MCx2PTAseT0wLHg9MDt4PHAubGVuZ3RoOyl7dmFyIF89cFt4KytdO3N3aXRjaCgxPT09eCYmKHY9Zz1wW3hdLHk9bT1wW3grMV0pLF8pe2Nhc2UgWmEuTTpnPXY9cFt4KytdLG09eT1wW3grK10sWWFbMF09dixZYVsxXT15LGphWzBdPXYsamFbMV09eTticmVhaztjYXNlIFphLkw6VmEoZyxtLHBbeF0scFt4KzFdLFlhLGphKSxnPXBbeCsrXSxtPXBbeCsrXTticmVhaztjYXNlIFphLkM6V2EoZyxtLHBbeCsrXSxwW3grK10scFt4KytdLHBbeCsrXSxwW3hdLHBbeCsxXSxZYSxqYSksZz1wW3grK10sbT1wW3grK107YnJlYWs7Y2FzZSBaYS5ROnQ9ZyxlPW0saT1wW3grK10sbj1wW3grK10sbz1wW3hdLGE9cFt4KzFdLHI9WWEscz1qYSx1PWw9dm9pZCAwLHU9VGEsaD1rYShMYSgobD1EYSkodCxpLG8pLDEpLDApLGM9a2EoTGEobChlLG4sYSksMSksMCksZD11KHQsaSxvLGgpLGY9dShlLG4sYSxjKSxyWzBdPUxhKHQsbyxkKSxyWzFdPUxhKGUsYSxmKSxzWzBdPWthKHQsbyxkKSxzWzFdPWthKGUsYSxmKSxnPXBbeCsrXSxtPXBbeCsrXTticmVhaztjYXNlIFphLkE6dmFyIHc9cFt4KytdLGI9cFt4KytdLFM9cFt4KytdLE09cFt4KytdLEk9cFt4KytdLFQ9cFt4KytdK0k7eCs9MTt2YXIgQT0xLXBbeCsrXTsxPT09eCYmKHY9JGEoSSkqUyt3LHk9SmEoSSkqTStiKSxIYSh3LGIsUyxNLEksVCxBLFlhLGphKSxnPSRhKFQpKlMrdyxtPUphKFQpKk0rYjticmVhaztjYXNlIFphLlI6VmEodj1nPXBbeCsrXSx5PW09cFt4KytdLHYrcFt4KytdLHkrcFt4KytdLFlhLGphKTticmVhaztjYXNlIFphLlo6Zz12LG09eX1TdChVYSxVYSxZYSksTXQoWGEsWGEsamEpfXJldHVybiAwPT09eCYmKFVhWzBdPVVhWzFdPVhhWzBdPVhhWzFdPTApLG5ldyBNaShVYVswXSxVYVsxXSxYYVswXS1VYVswXSxYYVsxXS1VYVsxXSl9LHJlYnVpbGRQYXRoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpLG4sbyxhLHIscz10aGlzLmRhdGEsbD10aGlzLl91eCx1PXRoaXMuX3V5LGg9dGhpcy5fbGVuLGM9MDtjPGg7KXt2YXIgZD1zW2MrK107c3dpdGNoKDE9PT1jJiYoZT1uPXNbY10saT1vPXNbYysxXSksZCl7Y2FzZSBaYS5NOmU9bj1zW2MrK10saT1vPXNbYysrXSx0Lm1vdmVUbyhuLG8pO2JyZWFrO2Nhc2UgWmEuTDphPXNbYysrXSxyPXNbYysrXSwodHIoYS1uKT5sfHx0cihyLW8pPnV8fGM9PT1oLTEpJiYodC5saW5lVG8oYSxyKSxuPWEsbz1yKTticmVhaztjYXNlIFphLkM6dC5iZXppZXJDdXJ2ZVRvKHNbYysrXSxzW2MrK10sc1tjKytdLHNbYysrXSxzW2MrK10sc1tjKytdKSxuPXNbYy0yXSxvPXNbYy0xXTticmVhaztjYXNlIFphLlE6dC5xdWFkcmF0aWNDdXJ2ZVRvKHNbYysrXSxzW2MrK10sc1tjKytdLHNbYysrXSksbj1zW2MtMl0sbz1zW2MtMV07YnJlYWs7Y2FzZSBaYS5BOnZhciBmPXNbYysrXSxwPXNbYysrXSxnPXNbYysrXSxtPXNbYysrXSx2PXNbYysrXSx5PXNbYysrXSx4PXNbYysrXSxfPXNbYysrXSx3PW08Zz9nOm0sYj1tPGc/MTpnL20sUz1tPGc/bS9nOjEsTT12K3k7LjAwMTxNYXRoLmFicyhnLW0pPyh0LnRyYW5zbGF0ZShmLHApLHQucm90YXRlKHgpLHQuc2NhbGUoYixTKSx0LmFyYygwLDAsdyx2LE0sMS1fKSx0LnNjYWxlKDEvYiwxL1MpLHQucm90YXRlKC14KSx0LnRyYW5zbGF0ZSgtZiwtcCkpOnQuYXJjKGYscCx3LHYsTSwxLV8pLDE9PT1jJiYoZT0kYSh2KSpnK2YsaT1KYSh2KSptK3ApLG49JGEoTSkqZytmLG89SmEoTSkqbStwO2JyZWFrO2Nhc2UgWmEuUjplPW49c1tjXSxpPW89c1tjKzFdLHQucmVjdChzW2MrK10sc1tjKytdLHNbYysrXSxzW2MrK10pO2JyZWFrO2Nhc2UgWmEuWjp0LmNsb3NlUGF0aCgpLG49ZSxvPWl9fX19LGlyLkNNRD1aYTt2YXIgcnI9MipNYXRoLlBJO2Z1bmN0aW9uIHNyKHQpe3JldHVybih0JT1ycik8MCYmKHQrPXJyKSx0fXZhciBscj0yKk1hdGguUEk7ZnVuY3Rpb24gdXIodCxlLGksbixvLGEscixzLGwpe2lmKDA9PT1yKXJldHVybiExO3ZhciB1PXI7cy09dCxsLT1lO3ZhciBoPU1hdGguc3FydChzKnMrbCpsKTtpZihpPGgtdXx8aCt1PGkpcmV0dXJuITE7aWYoTWF0aC5hYnMobi1vKSVscjwxZS00KXJldHVybiEwO2lmKGEpe3ZhciBjPW47bj1zcihvKSxvPXNyKGMpfWVsc2Ugbj1zcihuKSxvPXNyKG8pO288biYmKG8rPWxyKTt2YXIgZD1NYXRoLmF0YW4yKGwscyk7cmV0dXJuIGQ8MCYmKGQrPWxyKSxuPD1kJiZkPD1vfHxuPD1kK2xyJiZkK2xyPD1vfWZ1bmN0aW9uIGhyKHQsZSxpLG4sbyxhKXtpZihlPGEmJm48YXx8YTxlJiZhPG4pcmV0dXJuIDA7aWYobj09PWUpcmV0dXJuIDA7dmFyIHI9bjxlPzE6LTEscz0oYS1lKS8obi1lKTsxIT1zJiYwIT1zfHwocj1uPGU/LjU6LS41KTt2YXIgbD1zKihpLXQpK3Q7cmV0dXJuIGw9PT1vPzEvMDpvPGw/cjowfXZhciBjcj1pci5DTUQsZHI9MipNYXRoLlBJLGZyPTFlLTQ7dmFyIHByPVstMSwtMSwtMV0sZ3I9Wy0xLC0xXTtmdW5jdGlvbiBtcih0LGUsaSxuLG8sYSxyLHMsbCx1KXtpZihlPHUmJm48dSYmYTx1JiZzPHV8fHU8ZSYmdTxuJiZ1PGEmJnU8cylyZXR1cm4gMDt2YXIgaCxjPWZ1bmN0aW9uKHQsZSxpLG4sbyxhKXt2YXIgcj1uKzMqKGUtaSktdCxzPTMqKGktMiplK3QpLGw9MyooZS10KSx1PXQtbyxoPXMqcy0zKnIqbCxjPXMqbC05KnIqdSxkPWwqbC0zKnMqdSxmPTA7aWYoX2EoaCkmJl9hKGMpKXtpZihfYShzKSlhWzBdPTA7ZWxzZSAwPD0oTT0tbC9zKSYmTTw9MSYmKGFbZisrXT1NKX1lbHNle3ZhciBwPWMqYy00KmgqZDtpZihfYShwKSl7dmFyIGc9Yy9oLG09LWcvMjswPD0oTT0tcy9yK2cpJiZNPD0xJiYoYVtmKytdPU0pLDA8PW0mJm08PTEmJihhW2YrK109bSl9ZWxzZSBpZigwPHApe3ZhciB2PWRhKHApLHk9aCpzKzEuNSpyKigtYyt2KSx4PWgqcysxLjUqciooLWMtdik7MDw9KE09KC1zLSgoeT15PDA/LWNhKC15LG1hKTpjYSh5LG1hKSkrKHg9eDwwPy1jYSgteCxtYSk6Y2EoeCxtYSkpKSkvKDMqcikpJiZNPD0xJiYoYVtmKytdPU0pfWVsc2V7dmFyIF89KDIqaCpzLTMqcipjKS8oMipkYShoKmgqaCkpLHc9TWF0aC5hY29zKF8pLzMsYj1kYShoKSxTPU1hdGguY29zKHcpLE09KC1zLTIqYipTKS8oMypyKSxJPShtPSgtcytiKihTK2dhKk1hdGguc2luKHcpKSkvKDMqciksKC1zK2IqKFMtZ2EqTWF0aC5zaW4odykpKS8oMypyKSk7MDw9TSYmTTw9MSYmKGFbZisrXT1NKSwwPD1tJiZtPD0xJiYoYVtmKytdPW0pLDA8PUkmJkk8PTEmJihhW2YrK109SSl9fXJldHVybiBmfShlLG4sYSxzLHUscHIpO2lmKDA9PT1jKXJldHVybiAwO2Zvcih2YXIgZCxmLHA9MCxnPS0xLG09MDttPGM7bSsrKXt2YXIgdj1wclttXSx5PTA9PT12fHwxPT09dj8uNToxO2JhKHQsaSxvLHIsdik8bHx8KGc8MCYmKGc9TWEoZSxuLGEscyxnciksZ3JbMV08Z3JbMF0mJjE8ZyYmKHZvaWQgMCxoPWdyWzBdLGdyWzBdPWdyWzFdLGdyWzFdPWgpLGQ9YmEoZSxuLGEscyxnclswXSksMTxnJiYoZj1iYShlLG4sYSxzLGdyWzFdKSkpLDI9PT1nP3Y8Z3JbMF0/cCs9ZDxlP3k6LXk6djxnclsxXT9wKz1mPGQ/eToteTpwKz1zPGY/eToteTp2PGdyWzBdP3ArPWQ8ZT95Oi15OnArPXM8ZD95Oi15KX1yZXR1cm4gcH1mdW5jdGlvbiB2cih0LGUsaSxuLG8sYSxyLHMpe2lmKGU8cyYmbjxzJiZhPHN8fHM8ZSYmczxuJiZzPGEpcmV0dXJuIDA7dmFyIGw9ZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT10LTIqZStpLHI9MiooZS10KSxzPXQtbixsPTA7aWYoX2EoYSkpe2lmKHdhKHIpKTA8PShoPS1zL3IpJiZoPD0xJiYob1tsKytdPWgpfWVsc2V7dmFyIHU9cipyLTQqYSpzO2lmKF9hKHUpKTA8PShoPS1yLygyKmEpKSYmaDw9MSYmKG9bbCsrXT1oKTtlbHNlIGlmKDA8dSl7dmFyIGgsYz1kYSh1KSxkPSgtci1jKS8oMiphKTswPD0oaD0oLXIrYykvKDIqYSkpJiZoPD0xJiYob1tsKytdPWgpLDA8PWQmJmQ8PTEmJihvW2wrK109ZCl9fXJldHVybiBsfShlLG4sYSxzLHByKTtpZigwPT09bClyZXR1cm4gMDt2YXIgdT1EYShlLG4sYSk7aWYoMDw9dSYmdTw9MSl7Zm9yKHZhciBoPTAsYz1UYShlLG4sYSx1KSxkPTA7ZDxsO2QrKyl7dmFyIGY9MD09PXByW2RdfHwxPT09cHJbZF0/LjU6MTtUYSh0LGksbyxwcltkXSk8cnx8KHByW2RdPHU/aCs9YzxlP2Y6LWY6aCs9YTxjP2Y6LWYpfXJldHVybiBofWY9MD09PXByWzBdfHwxPT09cHJbMF0/LjU6MTtyZXR1cm4gVGEodCxpLG8scHJbMF0pPHI/MDphPGU/ZjotZn1mdW5jdGlvbiB5cih0LGUsaSxuLG8sYSxyLHMpe2lmKGk8KHMtPWUpfHxzPC1pKXJldHVybiAwO3ZhciBsPU1hdGguc3FydChpKmktcypzKTtwclswXT0tbCxwclsxXT1sO3ZhciB1PU1hdGguYWJzKG4tbyk7aWYodTwxZS00KXJldHVybiAwO2lmKHUlZHI8MWUtNCl7bz1kcjt2YXIgaD1hPzE6LTE7cmV0dXJuIHI+PXByW249MF0rdCYmcjw9cHJbMV0rdD9oOjB9aWYoYSl7bD1uO249c3Iobyksbz1zcihsKX1lbHNlIG49c3Iobiksbz1zcihvKTtvPG4mJihvKz1kcik7Zm9yKHZhciBjPTAsZD0wO2Q8MjtkKyspe3ZhciBmPXByW2RdO2lmKHI8Zit0KXt2YXIgcD1NYXRoLmF0YW4yKHMsZik7aD1hPzE6LTE7cDwwJiYocD1kcitwKSwobjw9cCYmcDw9b3x8bjw9cCtkciYmcCtkcjw9bykmJihwPk1hdGguUEkvMiYmcDwxLjUqTWF0aC5QSSYmKGg9LWgpLGMrPWgpfX1yZXR1cm4gY31mdW5jdGlvbiB4cih0LGUsaSxuLG8pe2Zvcih2YXIgYT0wLHI9MCxzPTAsbD0wLHU9MCxoPTA7aDx0Lmxlbmd0aDspe3ZhciBjPXRbaCsrXTtzd2l0Y2goYz09PWNyLk0mJjE8aCYmKGl8fChhKz1ocihyLHMsbCx1LG4sbykpKSwxPT09aCYmKGw9cj10W2hdLHU9cz10W2grMV0pLGMpe2Nhc2UgY3IuTTpyPWw9dFtoKytdLHM9dT10W2grK107YnJlYWs7Y2FzZSBjci5MOmlmKGkpe2lmKG5yKHIscyx0W2hdLHRbaCsxXSxlLG4sbykpcmV0dXJuITB9ZWxzZSBhKz1ocihyLHMsdFtoXSx0W2grMV0sbixvKXx8MDtyPXRbaCsrXSxzPXRbaCsrXTticmVhaztjYXNlIGNyLkM6aWYoaSl7aWYob3IocixzLHRbaCsrXSx0W2grK10sdFtoKytdLHRbaCsrXSx0W2hdLHRbaCsxXSxlLG4sbykpcmV0dXJuITB9ZWxzZSBhKz1tcihyLHMsdFtoKytdLHRbaCsrXSx0W2grK10sdFtoKytdLHRbaF0sdFtoKzFdLG4sbyl8fDA7cj10W2grK10scz10W2grK107YnJlYWs7Y2FzZSBjci5ROmlmKGkpe2lmKGFyKHIscyx0W2grK10sdFtoKytdLHRbaF0sdFtoKzFdLGUsbixvKSlyZXR1cm4hMH1lbHNlIGErPXZyKHIscyx0W2grK10sdFtoKytdLHRbaF0sdFtoKzFdLG4sbyl8fDA7cj10W2grK10scz10W2grK107YnJlYWs7Y2FzZSBjci5BOnZhciBkPXRbaCsrXSxmPXRbaCsrXSxwPXRbaCsrXSxnPXRbaCsrXSxtPXRbaCsrXSx2PXRbaCsrXTtoKz0xO3ZhciB5PTEtdFtoKytdLHg9TWF0aC5jb3MobSkqcCtkLF89TWF0aC5zaW4obSkqZytmOzE8aD9hKz1ocihyLHMseCxfLG4sbyk6KGw9eCx1PV8pO3ZhciB3PShuLWQpKmcvcCtkO2lmKGkpe2lmKHVyKGQsZixnLG0sbSt2LHksZSx3LG8pKXJldHVybiEwfWVsc2UgYSs9eXIoZCxmLGcsbSxtK3YseSx3LG8pO3I9TWF0aC5jb3MobSt2KSpwK2Qscz1NYXRoLnNpbihtK3YpKmcrZjticmVhaztjYXNlIGNyLlI6bD1yPXRbaCsrXSx1PXM9dFtoKytdO3g9bCt0W2grK10sXz11K3RbaCsrXTtpZihpKXtpZihucihsLHUseCx1LGUsbixvKXx8bnIoeCx1LHgsXyxlLG4sbyl8fG5yKHgsXyxsLF8sZSxuLG8pfHxucihsLF8sbCx1LGUsbixvKSlyZXR1cm4hMH1lbHNlIGErPWhyKHgsdSx4LF8sbixvKSxhKz1ocihsLF8sbCx1LG4sbyk7YnJlYWs7Y2FzZSBjci5aOmlmKGkpe2lmKG5yKHIscyxsLHUsZSxuLG8pKXJldHVybiEwfWVsc2UgYSs9aHIocixzLGwsdSxuLG8pO3I9bCxzPXV9fXJldHVybiBpfHxmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmFicyh0LWUpPGZyfShzLHUpfHwoYSs9aHIocixzLGwsdSxuLG8pfHwwKSwwIT09YX12YXIgX3I9WWkucHJvdG90eXBlLmdldENhbnZhc1BhdHRlcm4sd3I9TWF0aC5hYnMsYnI9bmV3IGlyKCEwKTtmdW5jdGlvbiBTcih0KXtqbi5jYWxsKHRoaXMsdCksdGhpcy5wYXRoPW51bGx9U3IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTcix0eXBlOiJwYXRoIixfX2RpcnR5UGF0aDohMCxzdHJva2VDb250YWluVGhyZXNob2xkOjUsc2VnbWVudElnbm9yZVRocmVzaG9sZDowLHN1YlBpeGVsT3B0aW1pemU6ITEsYnJ1c2g6ZnVuY3Rpb24odCxlKXt2YXIgaSxuPXRoaXMuc3R5bGUsbz10aGlzLnBhdGh8fGJyLGE9bi5oYXNTdHJva2UoKSxyPW4uaGFzRmlsbCgpLHM9bi5maWxsLGw9bi5zdHJva2UsdT1yJiYhIXMuY29sb3JTdG9wcyxoPWEmJiEhbC5jb2xvclN0b3BzLGM9ciYmISFzLmltYWdlLGQ9YSYmISFsLmltYWdlO24uYmluZCh0LHRoaXMsZSksdGhpcy5zZXRUcmFuc2Zvcm0odCksdGhpcy5fX2RpcnR5JiYodSYmKGk9aXx8dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSx0aGlzLl9maWxsR3JhZGllbnQ9bi5nZXRHcmFkaWVudCh0LHMsaSkpLGgmJihpPWl8fHRoaXMuZ2V0Qm91bmRpbmdSZWN0KCksdGhpcy5fc3Ryb2tlR3JhZGllbnQ9bi5nZXRHcmFkaWVudCh0LGwsaSkpKTt1P3QuZmlsbFN0eWxlPXRoaXMuX2ZpbGxHcmFkaWVudDpjJiYodC5maWxsU3R5bGU9X3IuY2FsbChzLHQpKSxoP3Quc3Ryb2tlU3R5bGU9dGhpcy5fc3Ryb2tlR3JhZGllbnQ6ZCYmKHQuc3Ryb2tlU3R5bGU9X3IuY2FsbChsLHQpKTt2YXIgZj1uLmxpbmVEYXNoLHA9bi5saW5lRGFzaE9mZnNldCxnPSEhdC5zZXRMaW5lRGFzaCxtPXRoaXMuZ2V0R2xvYmFsU2NhbGUoKTtpZihvLnNldFNjYWxlKG1bMF0sbVsxXSx0aGlzLnNlZ21lbnRJZ25vcmVUaHJlc2hvbGQpLHRoaXMuX19kaXJ0eVBhdGh8fGYmJiFnJiZhPyhvLmJlZ2luUGF0aCh0KSxmJiYhZyYmKG8uc2V0TGluZURhc2goZiksby5zZXRMaW5lRGFzaE9mZnNldChwKSksdGhpcy5idWlsZFBhdGgobyx0aGlzLnNoYXBlLCExKSx0aGlzLnBhdGgmJih0aGlzLl9fZGlydHlQYXRoPSExKSk6KHQuYmVnaW5QYXRoKCksdGhpcy5wYXRoLnJlYnVpbGRQYXRoKHQpKSxyKWlmKG51bGwhPW4uZmlsbE9wYWNpdHkpe3ZhciB2PXQuZ2xvYmFsQWxwaGE7dC5nbG9iYWxBbHBoYT1uLmZpbGxPcGFjaXR5Km4ub3BhY2l0eSxvLmZpbGwodCksdC5nbG9iYWxBbHBoYT12fWVsc2Ugby5maWxsKHQpO2lmKGYmJmcmJih0LnNldExpbmVEYXNoKGYpLHQubGluZURhc2hPZmZzZXQ9cCksYSlpZihudWxsIT1uLnN0cm9rZU9wYWNpdHkpe3Y9dC5nbG9iYWxBbHBoYTt0Lmdsb2JhbEFscGhhPW4uc3Ryb2tlT3BhY2l0eSpuLm9wYWNpdHksby5zdHJva2UodCksdC5nbG9iYWxBbHBoYT12fWVsc2Ugby5zdHJva2UodCk7ZiYmZyYmdC5zZXRMaW5lRGFzaChbXSksbnVsbCE9bi50ZXh0JiYodGhpcy5yZXN0b3JlVHJhbnNmb3JtKHQpLHRoaXMuZHJhd1JlY3RUZXh0KHQsdGhpcy5nZXRCb3VuZGluZ1JlY3QoKSkpfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlLGkpe30sY3JlYXRlUGF0aFByb3h5OmZ1bmN0aW9uKCl7dGhpcy5wYXRoPW5ldyBpcn0sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVjdCxlPXRoaXMuc3R5bGUsaT0hdDtpZihpKXt2YXIgbj10aGlzLnBhdGg7bj1ufHwodGhpcy5wYXRoPW5ldyBpciksdGhpcy5fX2RpcnR5UGF0aCYmKG4uYmVnaW5QYXRoKCksdGhpcy5idWlsZFBhdGgobix0aGlzLnNoYXBlLCExKSksdD1uLmdldEJvdW5kaW5nUmVjdCgpfWlmKHRoaXMuX3JlY3Q9dCxlLmhhc1N0cm9rZSgpKXt2YXIgbz10aGlzLl9yZWN0V2l0aFN0cm9rZXx8KHRoaXMuX3JlY3RXaXRoU3Ryb2tlPXQuY2xvbmUoKSk7aWYodGhpcy5fX2RpcnR5fHxpKXtvLmNvcHkodCk7dmFyIGE9ZS5saW5lV2lkdGgscj1lLnN0cm9rZU5vU2NhbGU/dGhpcy5nZXRMaW5lU2NhbGUoKToxO2UuaGFzRmlsbCgpfHwoYT1NYXRoLm1heChhLHRoaXMuc3Ryb2tlQ29udGFpblRocmVzaG9sZHx8NCkpLDFlLTEwPHImJihvLndpZHRoKz1hL3Isby5oZWlnaHQrPWEvcixvLngtPWEvci8yLG8ueS09YS9yLzIpfXJldHVybiBvfXJldHVybiB0fSxjb250YWluOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Db29yZFRvTG9jYWwodCxlKSxuPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCksbz10aGlzLnN0eWxlO2lmKHQ9aVswXSxlPWlbMV0sbi5jb250YWluKHQsZSkpe3ZhciBhPXRoaXMucGF0aC5kYXRhO2lmKG8uaGFzU3Ryb2tlKCkpe3ZhciByPW8ubGluZVdpZHRoLHM9by5zdHJva2VOb1NjYWxlP3RoaXMuZ2V0TGluZVNjYWxlKCk6MTtpZigxZS0xMDxzJiYoby5oYXNGaWxsKCl8fChyPU1hdGgubWF4KHIsdGhpcy5zdHJva2VDb250YWluVGhyZXNob2xkKSksZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHhyKHQsZSwhMCxpLG4pfShhLHIvcyx0LGUpKSlyZXR1cm4hMH1pZihvLmhhc0ZpbGwoKSlyZXR1cm4gZnVuY3Rpb24odCxlLGkpe3JldHVybiB4cih0LDAsITEsZSxpKX0oYSx0LGUpfXJldHVybiExfSxkaXJ0eTpmdW5jdGlvbih0KXtudWxsPT10JiYodD0hMCksdCYmKHRoaXMuX19kaXJ0eVBhdGg9dCx0aGlzLl9yZWN0PW51bGwpLHRoaXMuX19kaXJ0eT10aGlzLl9fZGlydHlUZXh0PSEwLHRoaXMuX196ciYmdGhpcy5fX3pyLnJlZnJlc2goKSx0aGlzLl9fY2xpcFRhcmdldCYmdGhpcy5fX2NsaXBUYXJnZXQuZGlydHkoKX0sYW5pbWF0ZVNoYXBlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFuaW1hdGUoInNoYXBlIix0KX0sYXR0cktWOmZ1bmN0aW9uKHQsZSl7InNoYXBlIj09PXQ/KHRoaXMuc2V0U2hhcGUoZSksdGhpcy5fX2RpcnR5UGF0aD0hMCx0aGlzLl9yZWN0PW51bGwpOmpuLnByb3RvdHlwZS5hdHRyS1YuY2FsbCh0aGlzLHQsZSl9LHNldFNoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zaGFwZTtpZihpKXtpZihSKHQpKWZvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihpW25dPXRbbl0pO2Vsc2UgaVt0XT1lO3RoaXMuZGlydHkoITApfXJldHVybiB0aGlzfSxnZXRMaW5lU2NhbGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRyYW5zZm9ybTtyZXR1cm4gdCYmMWUtMTA8d3IodFswXS0xKSYmMWUtMTA8d3IodFszXS0xKT9NYXRoLnNxcnQod3IodFswXSp0WzNdLXRbMl0qdFsxXSkpOjF9fSxTci5leHRlbmQ9ZnVuY3Rpb24obyl7ZnVuY3Rpb24gdCh0KXtTci5jYWxsKHRoaXMsdCksby5zdHlsZSYmdGhpcy5zdHlsZS5leHRlbmRGcm9tKG8uc3R5bGUsITEpO3ZhciBlPW8uc2hhcGU7aWYoZSl7dGhpcy5zaGFwZT10aGlzLnNoYXBlfHx7fTt2YXIgaT10aGlzLnNoYXBlO2Zvcih2YXIgbiBpbiBlKSFpLmhhc093blByb3BlcnR5KG4pJiZlLmhhc093blByb3BlcnR5KG4pJiYoaVtuXT1lW25dKX1vLmluaXQmJm8uaW5pdC5jYWxsKHRoaXMsdCl9Zm9yKHZhciBlIGluIHcodCxTciksbykic3R5bGUiIT09ZSYmInNoYXBlIiE9PWUmJih0LnByb3RvdHlwZVtlXT1vW2VdKTtyZXR1cm4gdH0sdyhTcixqbik7ZnVuY3Rpb24gTXIodCl7cmV0dXJuIE1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKX12YXIgSXI9aXIuQ01ELFRyPVtbXSxbXSxbXV0sQXI9TWF0aC5zcXJ0LERyPU1hdGguYXRhbjIsQ3I9ZnVuY3Rpb24odCxlKXt2YXIgaSxuLG8sYSxyLHM9dC5kYXRhLGw9SXIuTSx1PUlyLkMsaD1Jci5MLGM9SXIuUixkPUlyLkEsZj1Jci5RO2ZvcihhPW89MDtvPHMubGVuZ3RoOyl7c3dpdGNoKGk9c1tvKytdLGE9byxuPTAsaSl7Y2FzZSBsOmNhc2UgaDpuPTE7YnJlYWs7Y2FzZSB1Om49MzticmVhaztjYXNlIGY6bj0yO2JyZWFrO2Nhc2UgZDp2YXIgcD1lWzRdLGc9ZVs1XSxtPUFyKGVbMF0qZVswXStlWzFdKmVbMV0pLHY9QXIoZVsyXSplWzJdK2VbM10qZVszXSkseT1EcigtZVsxXS92LGVbMF0vbSk7c1tvXSo9bSxzW28rK10rPXAsc1tvXSo9dixzW28rK10rPWcsc1tvKytdKj1tLHNbbysrXSo9dixzW28rK10rPXksc1tvKytdKz15LGE9bys9MjticmVhaztjYXNlIGM6eFswXT1zW28rK10seFsxXT1zW28rK10sYnQoeCx4LGUpLHNbYSsrXT14WzBdLHNbYSsrXT14WzFdLHhbMF0rPXNbbysrXSx4WzFdKz1zW28rK10sYnQoeCx4LGUpLHNbYSsrXT14WzBdLHNbYSsrXT14WzFdfWZvcihyPTA7cjxuO3IrKyl7dmFyIHg7KHg9VHJbcl0pWzBdPXNbbysrXSx4WzFdPXNbbysrXSxidCh4LHgsZSksc1thKytdPXhbMF0sc1thKytdPXhbMV19fX0sTHI9TWF0aC5zcXJ0LGtyPU1hdGguc2luLFByPU1hdGguY29zLE5yPU1hdGguUEksT3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4odFswXSplWzBdK3RbMV0qZVsxXSkvKE1yKHQpKk1yKGUpKX0sRXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odFswXSplWzFdPHRbMV0qZVswXT8tMToxKSpNYXRoLmFjb3MoT3IodCxlKSl9O2Z1bmN0aW9uIHpyKHQsZSxpLG4sbyxhLHIscyxsLHUsaCl7dmFyIGM9bCooTnIvMTgwKSxkPVByKGMpKih0LWkpLzIra3IoYykqKGUtbikvMixmPS0xKmtyKGMpKih0LWkpLzIrUHIoYykqKGUtbikvMixwPWQqZC8ocipyKStmKmYvKHMqcyk7MTxwJiYocio9THIocCkscyo9THIocCkpO3ZhciBnPShvPT09YT8tMToxKSpMcigocipyKihzKnMpLXIqciooZipmKS1zKnMqKGQqZCkpLyhyKnIqKGYqZikrcypzKihkKmQpKSl8fDAsbT1nKnIqZi9zLHY9ZyotcypkL3IseT0odCtpKS8yK1ByKGMpKm0ta3IoYykqdix4PShlK24pLzIra3IoYykqbStQcihjKSp2LF89RXIoWzEsMF0sWyhkLW0pL3IsKGYtdikvc10pLHc9WyhkLW0pL3IsKGYtdikvc10sYj1bKC0xKmQtbSkvciwoLTEqZi12KS9zXSxTPUVyKHcsYik7T3IodyxiKTw9LTEmJihTPU5yKSwxPD1Pcih3LGIpJiYoUz0wKSwwPT09YSYmMDxTJiYoUy09MipOciksMT09PWEmJlM8MCYmKFMrPTIqTnIpLGguYWRkRGF0YSh1LHkseCxyLHMsXyxTLGMsYSl9dmFyIFJyPS8oW21sdmh6Y3F0c2FdKShbXm1sdmh6Y3F0c2FdKikvZ2ksQnI9Ly0/KFswLTldKlwuKT9bMC05XSsoW2VFXS0/WzAtOV0rKT8vZztmdW5jdGlvbiBWcih0LGUpe3ZhciBpPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBuZXcgaXI7Zm9yKHZhciBlLGk9MCxuPTAsbz1pLGE9bixyPW5ldyBpcixzPWlyLkNNRCxsPXQubWF0Y2goUnIpLHU9MDt1PGwubGVuZ3RoO3UrKyl7Zm9yKHZhciBoLGM9bFt1XSxkPWMuY2hhckF0KDApLGY9Yy5tYXRjaChCcil8fFtdLHA9Zi5sZW5ndGgsZz0wO2c8cDtnKyspZltnXT1wYXJzZUZsb2F0KGZbZ10pO2Zvcih2YXIgbT0wO208cDspe3ZhciB2LHkseCxfLHcsYixTLE09aSxJPW47c3dpdGNoKGQpe2Nhc2UibCI6aSs9ZlttKytdLG4rPWZbbSsrXSxoPXMuTCxyLmFkZERhdGEoaCxpLG4pO2JyZWFrO2Nhc2UiTCI6aT1mW20rK10sbj1mW20rK10saD1zLkwsci5hZGREYXRhKGgsaSxuKTticmVhaztjYXNlIm0iOmkrPWZbbSsrXSxuKz1mW20rK10saD1zLk0sci5hZGREYXRhKGgsaSxuKSxvPWksYT1uLGQ9ImwiO2JyZWFrO2Nhc2UiTSI6aT1mW20rK10sbj1mW20rK10saD1zLk0sci5hZGREYXRhKGgsaSxuKSxvPWksYT1uLGQ9IkwiO2JyZWFrO2Nhc2UiaCI6aSs9ZlttKytdLGg9cy5MLHIuYWRkRGF0YShoLGksbik7YnJlYWs7Y2FzZSJIIjppPWZbbSsrXSxoPXMuTCxyLmFkZERhdGEoaCxpLG4pO2JyZWFrO2Nhc2UidiI6bis9ZlttKytdLGg9cy5MLHIuYWRkRGF0YShoLGksbik7YnJlYWs7Y2FzZSJWIjpuPWZbbSsrXSxoPXMuTCxyLmFkZERhdGEoaCxpLG4pO2JyZWFrO2Nhc2UiQyI6aD1zLkMsci5hZGREYXRhKGgsZlttKytdLGZbbSsrXSxmW20rK10sZlttKytdLGZbbSsrXSxmW20rK10pLGk9ZlttLTJdLG49ZlttLTFdO2JyZWFrO2Nhc2UiYyI6aD1zLkMsci5hZGREYXRhKGgsZlttKytdK2ksZlttKytdK24sZlttKytdK2ksZlttKytdK24sZlttKytdK2ksZlttKytdK24pLGkrPWZbbS0yXSxuKz1mW20tMV07YnJlYWs7Y2FzZSJTIjp2PWkseT1uO3ZhciBUPXIubGVuKCksQT1yLmRhdGE7ZT09PXMuQyYmKHYrPWktQVtULTRdLHkrPW4tQVtULTNdKSxoPXMuQyxNPWZbbSsrXSxJPWZbbSsrXSxpPWZbbSsrXSxuPWZbbSsrXSxyLmFkZERhdGEoaCx2LHksTSxJLGksbik7YnJlYWs7Y2FzZSJzIjp2PWkseT1uO1Q9ci5sZW4oKSxBPXIuZGF0YTtlPT09cy5DJiYodis9aS1BW1QtNF0seSs9bi1BW1QtM10pLGg9cy5DLE09aStmW20rK10sST1uK2ZbbSsrXSxpKz1mW20rK10sbis9ZlttKytdLHIuYWRkRGF0YShoLHYseSxNLEksaSxuKTticmVhaztjYXNlIlEiOk09ZlttKytdLEk9ZlttKytdLGk9ZlttKytdLG49ZlttKytdLGg9cy5RLHIuYWRkRGF0YShoLE0sSSxpLG4pO2JyZWFrO2Nhc2UicSI6TT1mW20rK10raSxJPWZbbSsrXStuLGkrPWZbbSsrXSxuKz1mW20rK10saD1zLlEsci5hZGREYXRhKGgsTSxJLGksbik7YnJlYWs7Y2FzZSJUIjp2PWkseT1uO1Q9ci5sZW4oKSxBPXIuZGF0YTtlPT09cy5RJiYodis9aS1BW1QtNF0seSs9bi1BW1QtM10pLGk9ZlttKytdLG49ZlttKytdLGg9cy5RLHIuYWRkRGF0YShoLHYseSxpLG4pO2JyZWFrO2Nhc2UidCI6dj1pLHk9bjtUPXIubGVuKCksQT1yLmRhdGE7ZT09PXMuUSYmKHYrPWktQVtULTRdLHkrPW4tQVtULTNdKSxpKz1mW20rK10sbis9ZlttKytdLGg9cy5RLHIuYWRkRGF0YShoLHYseSxpLG4pO2JyZWFrO2Nhc2UiQSI6eD1mW20rK10sXz1mW20rK10sdz1mW20rK10sYj1mW20rK10sUz1mW20rK10senIoTT1pLEk9bixpPWZbbSsrXSxuPWZbbSsrXSxiLFMseCxfLHcsaD1zLkEscik7YnJlYWs7Y2FzZSJhIjp4PWZbbSsrXSxfPWZbbSsrXSx3PWZbbSsrXSxiPWZbbSsrXSxTPWZbbSsrXSx6cihNPWksST1uLGkrPWZbbSsrXSxuKz1mW20rK10sYixTLHgsXyx3LGg9cy5BLHIpfX0ieiIhPT1kJiYiWiIhPT1kfHwoaD1zLlosci5hZGREYXRhKGgpLGk9byxuPWEpLGU9aH1yZXR1cm4gci50b1N0YXRpYygpLHJ9KHQpO3JldHVybihlPWV8fHt9KS5idWlsZFBhdGg9ZnVuY3Rpb24odCl7aWYodC5zZXREYXRhKXt0LnNldERhdGEoaS5kYXRhKSwoZT10LmdldENvbnRleHQoKSkmJnQucmVidWlsZFBhdGgoZSl9ZWxzZXt2YXIgZT10O2kucmVidWlsZFBhdGgoZSl9fSxlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQpe0NyKGksdCksdGhpcy5kaXJ0eSghMCl9LGV9ZnVuY3Rpb24gR3IodCxlKXtyZXR1cm4gbmV3IFNyKFZyKHQsZSkpfXZhciBGcj1mdW5jdGlvbih0KXtqbi5jYWxsKHRoaXMsdCl9O0ZyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6RnIsdHlwZToidGV4dCIsYnJ1c2g6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnN0eWxlO3RoaXMuX19kaXJ0eSYma24oaSksaS5maWxsPWkuc3Ryb2tlPWkuc2hhZG93Qmx1cj1pLnNoYWRvd0NvbG9yPWkuc2hhZG93T2Zmc2V0WD1pLnNoYWRvd09mZnNldFk9bnVsbDt2YXIgbj1pLnRleHQ7bnVsbCE9biYmKG4rPSIiKSxVbihuLGkpPyh0aGlzLnNldFRyYW5zZm9ybSh0KSxObih0aGlzLHQsbixpLG51bGwsZSksdGhpcy5yZXN0b3JlVHJhbnNmb3JtKHQpKTp0Ll9fYXR0ckNhY2hlZEJ5PUJpLk5PTkV9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGU7aWYodGhpcy5fX2RpcnR5JiZrbih0KSwhdGhpcy5fcmVjdCl7dmFyIGU9dC50ZXh0O251bGwhPWU/ZSs9IiI6ZT0iIjt2YXIgaT1jbih0LnRleHQrIiIsdC5mb250LHQudGV4dEFsaWduLHQudGV4dFZlcnRpY2FsQWxpZ24sdC50ZXh0UGFkZGluZyx0LnRleHRMaW5lSGVpZ2h0LHQucmljaCk7aWYoaS54Kz10Lnh8fDAsaS55Kz10Lnl8fDAsRm4odC50ZXh0U3Ryb2tlLHQudGV4dFN0cm9rZVdpZHRoKSl7dmFyIG49dC50ZXh0U3Ryb2tlV2lkdGg7aS54LT1uLzIsaS55LT1uLzIsaS53aWR0aCs9bixpLmhlaWdodCs9bn10aGlzLl9yZWN0PWl9cmV0dXJuIHRoaXMuX3JlY3R9fSx3KEZyLGpuKTtmdW5jdGlvbiBXcihsKXtyZXR1cm4gdi5icm93c2VyLmllJiYxMTw9di5icm93c2VyLnZlcnNpb24/ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX19jbGlwUGF0aHMsaT10aGlzLnN0eWxlO2lmKGUpZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvPWVbbl0sYT1vJiZvLnNoYXBlLHI9byYmby50eXBlO2lmKGEmJigic2VjdG9yIj09PXImJmEuc3RhcnRBbmdsZT09PWEuZW5kQW5nbGV8fCJyZWN0Ij09PXImJighYS53aWR0aHx8IWEuaGVpZ2h0KSkpe2Zvcih2YXIgcz0wO3M8WnIubGVuZ3RoO3MrKylacltzXVsyXT1pW1pyW3NdWzBdXSxpW1pyW3NdWzBdXT1acltzXVsxXTt0PSEwO2JyZWFrfX1pZihsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0KWZvcihzPTA7czxaci5sZW5ndGg7cysrKWlbWnJbc11bMF1dPVpyW3NdWzJdfTpsfXZhciBIcj1Tci5leHRlbmQoe3R5cGU6ImNpcmNsZSIsc2hhcGU6e2N4OjAsY3k6MCxyOjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUsaSl7aSYmdC5tb3ZlVG8oZS5jeCtlLnIsZS5jeSksdC5hcmMoZS5jeCxlLmN5LGUuciwwLDIqTWF0aC5QSSwhMCl9fSksWnI9W1sic2hhZG93Qmx1ciIsMF0sWyJzaGFkb3dDb2xvciIsIiMwMDAiXSxbInNoYWRvd09mZnNldFgiLDBdLFsic2hhZG93T2Zmc2V0WSIsMF1dLFVyPVNyLmV4dGVuZCh7dHlwZToic2VjdG9yIixzaGFwZTp7Y3g6MCxjeTowLHIwOjAscjowLHN0YXJ0QW5nbGU6MCxlbmRBbmdsZToyKk1hdGguUEksY2xvY2t3aXNlOiEwfSxicnVzaDpXcihTci5wcm90b3R5cGUuYnJ1c2gpLGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuY3gsbj1lLmN5LG89TWF0aC5tYXgoZS5yMHx8MCwwKSxhPU1hdGgubWF4KGUuciwwKSxyPWUuc3RhcnRBbmdsZSxzPWUuZW5kQW5nbGUsbD1lLmNsb2Nrd2lzZSx1PU1hdGguY29zKHIpLGg9TWF0aC5zaW4ocik7dC5tb3ZlVG8odSpvK2ksaCpvK24pLHQubGluZVRvKHUqYStpLGgqYStuKSx0LmFyYyhpLG4sYSxyLHMsIWwpLHQubGluZVRvKE1hdGguY29zKHMpKm8raSxNYXRoLnNpbihzKSpvK24pLDAhPT1vJiZ0LmFyYyhpLG4sbyxzLHIsbCksdC5jbG9zZVBhdGgoKX19KSxYcj1Tci5leHRlbmQoe3R5cGU6InJpbmciLHNoYXBlOntjeDowLGN5OjAscjowLHIwOjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuY3gsbj1lLmN5LG89MipNYXRoLlBJO3QubW92ZVRvKGkrZS5yLG4pLHQuYXJjKGksbixlLnIsMCxvLCExKSx0Lm1vdmVUbyhpK2UucjAsbiksdC5hcmMoaSxuLGUucjAsMCxvLCEwKX19KTtmdW5jdGlvbiBZcih0LGUsaSxuLG8sYSxyKXt2YXIgcz0uNSooaS10KSxsPS41KihuLWUpO3JldHVybigyKihlLWkpK3MrbCkqcisoLTMqKGUtaSktMipzLWwpKmErcypvK2V9ZnVuY3Rpb24ganIodCxlLGkpe3ZhciBuPWUucG9pbnRzLG89ZS5zbW9vdGg7aWYobiYmMjw9bi5sZW5ndGgpe2lmKG8mJiJzcGxpbmUiIT09byl7dmFyIGE9ZnVuY3Rpb24odCxlLGksbil7dmFyIG8sYSxyLHMsbD1bXSx1PVtdLGg9W10sYz1bXTtpZihuKXtyPVsxLzAsMS8wXSxzPVstMS8wLC0xLzBdO2Zvcih2YXIgZD0wLGY9dC5sZW5ndGg7ZDxmO2QrKylTdChyLHIsdFtkXSksTXQocyxzLHRbZF0pO1N0KHIscixuWzBdKSxNdChzLHMsblsxXSl9Zm9yKGQ9MCxmPXQubGVuZ3RoO2Q8ZjtkKyspe3ZhciBwPXRbZF07aWYoaSlvPXRbZD9kLTE6Zi0xXSxhPXRbKGQrMSklZl07ZWxzZXtpZigwPT09ZHx8ZD09PWYtMSl7bC5wdXNoKHJ0KHRbZF0pKTtjb250aW51ZX1vPXRbZC0xXSxhPXRbZCsxXX1odCh1LGEsbyksZ3QodSx1LGUpO3ZhciBnPXZ0KHAsbyksbT12dChwLGEpLHY9ZyttOzAhPT12JiYoZy89dixtLz12KSxndChoLHUsLWcpLGd0KGMsdSxtKTt2YXIgeT1sdChbXSxwLGgpLHg9bHQoW10scCxjKTtuJiYoTXQoeSx5LHIpLFN0KHkseSxzKSxNdCh4LHgsciksU3QoeCx4LHMpKSxsLnB1c2goeSksbC5wdXNoKHgpfXJldHVybiBpJiZsLnB1c2gobC5zaGlmdCgpKSxsfShuLG8saSxlLnNtb290aENvbnN0cmFpbnQpO3QubW92ZVRvKG5bMF1bMF0sblswXVsxXSk7Zm9yKHZhciByPW4ubGVuZ3RoLHM9MDtzPChpP3I6ci0xKTtzKyspe3ZhciBsPWFbMipzXSx1PWFbMipzKzFdLGg9blsocysxKSVyXTt0LmJlemllckN1cnZlVG8obFswXSxsWzFdLHVbMF0sdVsxXSxoWzBdLGhbMV0pfX1lbHNleyJzcGxpbmUiPT09byYmKG49ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5sZW5ndGgsbj1bXSxvPTAsYT0xO2E8aTthKyspbys9dnQodFthLTFdLHRbYV0pO3ZhciByPW8vMjtyPXI8aT9pOnI7Zm9yKGE9MDthPHI7YSsrKXt2YXIgcyxsLHUsaD1hLyhyLTEpKihlP2k6aS0xKSxjPU1hdGguZmxvb3IoaCksZD1oLWMsZj10W2MlaV07dT1lPyhzPXRbKGMtMStpKSVpXSxsPXRbKGMrMSklaV0sdFsoYysyKSVpXSk6KHM9dFswPT09Yz9jOmMtMV0sbD10W2ktMjxjP2ktMTpjKzFdLHRbaS0zPGM/aS0xOmMrMl0pO3ZhciBwPWQqZCxnPWQqcDtuLnB1c2goW1lyKHNbMF0sZlswXSxsWzBdLHVbMF0sZCxwLGcpLFlyKHNbMV0sZlsxXSxsWzFdLHVbMV0sZCxwLGcpXSl9cmV0dXJuIG59KG4saSkpLHQubW92ZVRvKG5bMF1bMF0sblswXVsxXSk7cz0xO2Zvcih2YXIgYz1uLmxlbmd0aDtzPGM7cysrKXQubGluZVRvKG5bc11bMF0sbltzXVsxXSl9aSYmdC5jbG9zZVBhdGgoKX19dmFyIHFyPVNyLmV4dGVuZCh7dHlwZToicG9seWdvbiIsc2hhcGU6e3BvaW50czpudWxsLHNtb290aDohMSxzbW9vdGhDb25zdHJhaW50Om51bGx9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe2pyKHQsZSwhMCl9fSksS3I9U3IuZXh0ZW5kKHt0eXBlOiJwb2x5bGluZSIsc2hhcGU6e3BvaW50czpudWxsLHNtb290aDohMSxzbW9vdGhDb25zdHJhaW50Om51bGx9LHN0eWxlOntzdHJva2U6IiMwMDAiLGZpbGw6bnVsbH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7anIodCxlLCExKX19KSwkcj1NYXRoLnJvdW5kO2Z1bmN0aW9uIEpyKHQsZSxpKXt2YXIgbj1pJiZpLmxpbmVXaWR0aDtpZihlJiZuKXt2YXIgbz1lLngxLGE9ZS54MixyPWUueTEscz1lLnkyOyRyKDIqbyk9PT0kcigyKmEpP3QueDE9dC54Mj10cyhvLG4sITApOih0LngxPW8sdC54Mj1hKSwkcigyKnIpPT09JHIoMipzKT90LnkxPXQueTI9dHMocixuLCEwKToodC55MT1yLHQueTI9cyl9fWZ1bmN0aW9uIFFyKHQsZSxpKXt2YXIgbj1pJiZpLmxpbmVXaWR0aDtpZihlJiZuKXt2YXIgbz1lLngsYT1lLnkscj1lLndpZHRoLHM9ZS5oZWlnaHQ7dC54PXRzKG8sbiwhMCksdC55PXRzKGEsbiwhMCksdC53aWR0aD1NYXRoLm1heCh0cyhvK3IsbiwhMSktdC54LDA9PT1yPzA6MSksdC5oZWlnaHQ9TWF0aC5tYXgodHMoYStzLG4sITEpLXQueSwwPT09cz8wOjEpfX1mdW5jdGlvbiB0cyh0LGUsaSl7dmFyIG49JHIoMip0KTtyZXR1cm4obiskcihlKSklMj09MD9uLzI6KG4rKGk/MTotMSkpLzJ9dmFyIGVzPXt9LGlzPVNyLmV4dGVuZCh7dHlwZToicmVjdCIsc2hhcGU6e3I6MCx4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpLG4sbyxhO3RoaXMuc3ViUGl4ZWxPcHRpbWl6ZT8oUXIoZXMsZSx0aGlzLnN0eWxlKSxpPWVzLngsbj1lcy55LG89ZXMud2lkdGgsYT1lcy5oZWlnaHQsZXMucj1lLnIsZT1lcyk6KGk9ZS54LG49ZS55LG89ZS53aWR0aCxhPWUuaGVpZ2h0KSxlLnI/TW4odCxlKTp0LnJlY3QoaSxuLG8sYSksdC5jbG9zZVBhdGgoKX19KSxucz17fSxvcz1Tci5leHRlbmQoe3R5cGU6ImxpbmUiLHNoYXBlOnt4MTowLHkxOjAseDI6MCx5MjowLHBlcmNlbnQ6MX0sc3R5bGU6e3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLG8sYTthPXRoaXMuc3ViUGl4ZWxPcHRpbWl6ZT8oSnIobnMsZSx0aGlzLnN0eWxlKSxpPW5zLngxLG49bnMueTEsbz1ucy54Mixucy55Mik6KGk9ZS54MSxuPWUueTEsbz1lLngyLGUueTIpO3ZhciByPWUucGVyY2VudDswIT09ciYmKHQubW92ZVRvKGksbikscjwxJiYobz1pKigxLXIpK28qcixhPW4qKDEtcikrYSpyKSx0LmxpbmVUbyhvLGEpKX0scG9pbnRBdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNoYXBlO3JldHVybltlLngxKigxLXQpK2UueDIqdCxlLnkxKigxLXQpK2UueTIqdF19fSksYXM9W107ZnVuY3Rpb24gcnModCxlLGkpe3ZhciBuPXQuY3B4MixvPXQuY3B5MjtyZXR1cm4gbnVsbD09PW58fG51bGw9PT1vP1soaT9TYTpiYSkodC54MSx0LmNweDEsdC5jcHgyLHQueDIsZSksKGk/U2E6YmEpKHQueTEsdC5jcHkxLHQuY3B5Mix0LnkyLGUpXTpbKGk/QWE6VGEpKHQueDEsdC5jcHgxLHQueDIsZSksKGk/QWE6VGEpKHQueTEsdC5jcHkxLHQueTIsZSldfWZ1bmN0aW9uIHNzKHQpe3RoaXMuY29sb3JTdG9wcz10fHxbXX12YXIgbHM9U3IuZXh0ZW5kKHt0eXBlOiJiZXppZXItY3VydmUiLHNoYXBlOnt4MTowLHkxOjAseDI6MCx5MjowLGNweDE6MCxjcHkxOjAscGVyY2VudDoxfSxzdHlsZTp7c3Ryb2tlOiIjMDAwIixmaWxsOm51bGx9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUueDEsbj1lLnkxLG89ZS54MixhPWUueTIscj1lLmNweDEscz1lLmNweTEsbD1lLmNweDIsdT1lLmNweTIsaD1lLnBlcmNlbnQ7MCE9PWgmJih0Lm1vdmVUbyhpLG4pLG51bGw9PWx8fG51bGw9PXU/KGg8MSYmKENhKGkscixvLGgsYXMpLHI9YXNbMV0sbz1hc1syXSxDYShuLHMsYSxoLGFzKSxzPWFzWzFdLGE9YXNbMl0pLHQucXVhZHJhdGljQ3VydmVUbyhyLHMsbyxhKSk6KGg8MSYmKElhKGkscixsLG8saCxhcykscj1hc1sxXSxsPWFzWzJdLG89YXNbM10sSWEobixzLHUsYSxoLGFzKSxzPWFzWzFdLHU9YXNbMl0sYT1hc1szXSksdC5iZXppZXJDdXJ2ZVRvKHIscyxsLHUsbyxhKSkpfSxwb2ludEF0OmZ1bmN0aW9uKHQpe3JldHVybiBycyh0aGlzLnNoYXBlLHQsITEpfSx0YW5nZW50QXQ6ZnVuY3Rpb24odCl7dmFyIGU9cnModGhpcy5zaGFwZSx0LCEwKTtyZXR1cm4gbXQoZSxlKX19KSx1cz1Tci5leHRlbmQoe3R5cGU6ImFyYyIsc2hhcGU6e2N4OjAsY3k6MCxyOjAsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjIqTWF0aC5QSSxjbG9ja3dpc2U6ITB9LHN0eWxlOntzdHJva2U6IiMwMDAiLGZpbGw6bnVsbH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5jeCxuPWUuY3ksbz1NYXRoLm1heChlLnIsMCksYT1lLnN0YXJ0QW5nbGUscj1lLmVuZEFuZ2xlLHM9ZS5jbG9ja3dpc2UsbD1NYXRoLmNvcyhhKSx1PU1hdGguc2luKGEpO3QubW92ZVRvKGwqbytpLHUqbytuKSx0LmFyYyhpLG4sbyxhLHIsIXMpfX0pLGhzPVNyLmV4dGVuZCh7dHlwZToiY29tcG91bmQiLHNoYXBlOntwYXRoczpudWxsfSxfdXBkYXRlUGF0aERpcnR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX19kaXJ0eVBhdGgsZT10aGlzLnNoYXBlLnBhdGhzLGk9MDtpPGUubGVuZ3RoO2krKyl0PXR8fGVbaV0uX19kaXJ0eVBhdGg7dGhpcy5fX2RpcnR5UGF0aD10LHRoaXMuX19kaXJ0eT10aGlzLl9fZGlydHl8fHR9LGJlZm9yZUJydXNoOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUGF0aERpcnR5KCk7Zm9yKHZhciB0PXRoaXMuc2hhcGUucGF0aHN8fFtdLGU9dGhpcy5nZXRHbG9iYWxTY2FsZSgpLGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldLnBhdGh8fHRbaV0uY3JlYXRlUGF0aFByb3h5KCksdFtpXS5wYXRoLnNldFNjYWxlKGVbMF0sZVsxXSx0W2ldLnNlZ21lbnRJZ25vcmVUaHJlc2hvbGQpfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9ZS5wYXRoc3x8W10sbj0wO248aS5sZW5ndGg7bisrKWlbbl0uYnVpbGRQYXRoKHQsaVtuXS5zaGFwZSwhMCl9LGFmdGVyQnJ1c2g6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5zaGFwZS5wYXRoc3x8W10sZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0uX19kaXJ0eVBhdGg9ITF9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVQYXRoRGlydHkoKSxTci5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0LmNhbGwodGhpcyl9fSk7c3MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpzcyxhZGRDb2xvclN0b3A6ZnVuY3Rpb24odCxlKXt0aGlzLmNvbG9yU3RvcHMucHVzaCh7b2Zmc2V0OnQsY29sb3I6ZX0pfX07ZnVuY3Rpb24gY3ModCxlLGksbixvLGEpe3RoaXMueD1udWxsPT10PzA6dCx0aGlzLnk9bnVsbD09ZT8wOmUsdGhpcy54Mj1udWxsPT1pPzE6aSx0aGlzLnkyPW51bGw9PW4/MDpuLHRoaXMudHlwZT0ibGluZWFyIix0aGlzLmdsb2JhbD1hfHwhMSxzcy5jYWxsKHRoaXMsbyl9Y3MucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjpjc30sdyhjcyxzcyk7ZnVuY3Rpb24gZHModCxlLGksbixvKXt0aGlzLng9bnVsbD09dD8uNTp0LHRoaXMueT1udWxsPT1lPy41OmUsdGhpcy5yPW51bGw9PWk/LjU6aSx0aGlzLnR5cGU9InJhZGlhbCIsdGhpcy5nbG9iYWw9b3x8ITEsc3MuY2FsbCh0aGlzLG4pfWZ1bmN0aW9uIGZzKHQpe2puLmNhbGwodGhpcyx0KSx0aGlzLl9kaXNwbGF5YWJsZXM9W10sdGhpcy5fdGVtcG9yYXJ5RGlzcGxheWFibGVzPVtdLHRoaXMuX2N1cnNvcj0wLHRoaXMubm90Q2xlYXI9ITB9ZHMucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjpkc30sdyhkcyxzcyksZnMucHJvdG90eXBlLmluY3JlbWVudGFsPSEwLGZzLnByb3RvdHlwZS5jbGVhckRpc3BsYXlibGVzPWZ1bmN0aW9uKCl7dGhpcy5fZGlzcGxheWFibGVzPVtdLHRoaXMuX3RlbXBvcmFyeURpc3BsYXlhYmxlcz1bXSx0aGlzLl9jdXJzb3I9MCx0aGlzLmRpcnR5KCksdGhpcy5ub3RDbGVhcj0hMX0sZnMucHJvdG90eXBlLmFkZERpc3BsYXlhYmxlPWZ1bmN0aW9uKHQsZSl7ZT90aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXMucHVzaCh0KTp0aGlzLl9kaXNwbGF5YWJsZXMucHVzaCh0KSx0aGlzLmRpcnR5KCl9LGZzLnByb3RvdHlwZS5hZGREaXNwbGF5YWJsZXM9ZnVuY3Rpb24odCxlKXtlPWV8fCExO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMuYWRkRGlzcGxheWFibGUodFtpXSxlKX0sZnMucHJvdG90eXBlLmVhY2hQZW5kaW5nRGlzcGxheWFibGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2N1cnNvcjtlPHRoaXMuX2Rpc3BsYXlhYmxlcy5sZW5ndGg7ZSsrKXQmJnQodGhpcy5fZGlzcGxheWFibGVzW2VdKTtmb3IoZT0wO2U8dGhpcy5fdGVtcG9yYXJ5RGlzcGxheWFibGVzLmxlbmd0aDtlKyspdCYmdCh0aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXNbZV0pfSxmcy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVUcmFuc2Zvcm0oKTtmb3IodmFyIHQ9dGhpcy5fY3Vyc29yO3Q8dGhpcy5fZGlzcGxheWFibGVzLmxlbmd0aDt0KyspeyhlPXRoaXMuX2Rpc3BsYXlhYmxlc1t0XSkucGFyZW50PXRoaXMsZS51cGRhdGUoKSxlLnBhcmVudD1udWxsfWZvcih0PTA7dDx0aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXMubGVuZ3RoO3QrKyl7dmFyIGU7KGU9dGhpcy5fdGVtcG9yYXJ5RGlzcGxheWFibGVzW3RdKS5wYXJlbnQ9dGhpcyxlLnVwZGF0ZSgpLGUucGFyZW50PW51bGx9fSxmcy5wcm90b3R5cGUuYnJ1c2g9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5fY3Vyc29yO2k8dGhpcy5fZGlzcGxheWFibGVzLmxlbmd0aDtpKyspeyhuPXRoaXMuX2Rpc3BsYXlhYmxlc1tpXSkuYmVmb3JlQnJ1c2gmJm4uYmVmb3JlQnJ1c2godCksbi5icnVzaCh0LGk9PT10aGlzLl9jdXJzb3I/bnVsbDp0aGlzLl9kaXNwbGF5YWJsZXNbaS0xXSksbi5hZnRlckJydXNoJiZuLmFmdGVyQnJ1c2godCl9dGhpcy5fY3Vyc29yPWk7Zm9yKGk9MDtpPHRoaXMuX3RlbXBvcmFyeURpc3BsYXlhYmxlcy5sZW5ndGg7aSsrKXt2YXIgbjsobj10aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXNbaV0pLmJlZm9yZUJydXNoJiZuLmJlZm9yZUJydXNoKHQpLG4uYnJ1c2godCwwPT09aT9udWxsOnRoaXMuX3RlbXBvcmFyeURpc3BsYXlhYmxlc1tpLTFdKSxuLmFmdGVyQnJ1c2gmJm4uYWZ0ZXJCcnVzaCh0KX10aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXM9W10sdGhpcy5ub3RDbGVhcj0hMH07dmFyIHBzPVtdO2ZzLnByb3RvdHlwZS5nZXRCb3VuZGluZ1JlY3Q9ZnVuY3Rpb24oKXtpZighdGhpcy5fcmVjdCl7Zm9yKHZhciB0PW5ldyBNaSgxLzAsMS8wLC0xLzAsLTEvMCksZT0wO2U8dGhpcy5fZGlzcGxheWFibGVzLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMuX2Rpc3BsYXlhYmxlc1tlXSxuPWkuZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKTtpLm5lZWRMb2NhbFRyYW5zZm9ybSgpJiZuLmFwcGx5VHJhbnNmb3JtKGkuZ2V0TG9jYWxUcmFuc2Zvcm0ocHMpKSx0LnVuaW9uKG4pfXRoaXMuX3JlY3Q9dH1yZXR1cm4gdGhpcy5fcmVjdH0sZnMucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0LGUpO2lmKHRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkuY29udGFpbihpWzBdLGlbMV0pKWZvcih2YXIgbj0wO248dGhpcy5fZGlzcGxheWFibGVzLmxlbmd0aDtuKyspe2lmKHRoaXMuX2Rpc3BsYXlhYmxlc1tuXS5jb250YWluKHQsZSkpcmV0dXJuITB9cmV0dXJuITF9LHcoZnMsam4pO3ZhciBncz1NYXRoLm1heCxtcz1NYXRoLm1pbix2cz17fSx5cz0xLHhzPXtjb2xvcjoidGV4dEZpbGwiLHRleHRCb3JkZXJDb2xvcjoidGV4dFN0cm9rZSIsdGV4dEJvcmRlcldpZHRoOiJ0ZXh0U3Ryb2tlV2lkdGgifSxfcz0iZW1waGFzaXMiLHdzPSJub3JtYWwiLGJzPTEsU3M9e30sTXM9e307ZnVuY3Rpb24gSXModCl7cmV0dXJuIFNyLmV4dGVuZCh0KX1mdW5jdGlvbiBUcyh0LGUpe01zW3RdPWV9ZnVuY3Rpb24gQXModCl7aWYoTXMuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIE1zW3RdfWZ1bmN0aW9uIERzKHQsZSxpLG4pe3ZhciBvPUdyKHQsZSk7cmV0dXJuIGkmJigiY2VudGVyIj09PW4mJihpPUxzKGksby5nZXRCb3VuZGluZ1JlY3QoKSkpLFBzKG8saSkpLG99ZnVuY3Rpb24gQ3ModCxpLG4pe3ZhciBvPW5ldyBxbih7c3R5bGU6e2ltYWdlOnQseDppLngseTppLnksd2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9LG9ubG9hZDpmdW5jdGlvbih0KXtpZigiY2VudGVyIj09PW4pe3ZhciBlPXt3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH07by5zZXRTdHlsZShMcyhpLGUpKX19fSk7cmV0dXJuIG99ZnVuY3Rpb24gTHModCxlKXt2YXIgaSxuPWUud2lkdGgvZS5oZWlnaHQsbz10LmhlaWdodCpuO3JldHVybiBpPW88PXQud2lkdGg/dC5oZWlnaHQ6KG89dC53aWR0aCkvbix7eDp0LngrdC53aWR0aC8yLW8vMix5OnQueSt0LmhlaWdodC8yLWkvMix3aWR0aDpvLGhlaWdodDppfX12YXIga3M9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W10sbj10Lmxlbmd0aCxvPTA7bzxuO28rKyl7dmFyIGE9dFtvXTthLnBhdGh8fGEuY3JlYXRlUGF0aFByb3h5KCksYS5fX2RpcnR5UGF0aCYmYS5idWlsZFBhdGgoYS5wYXRoLGEuc2hhcGUsITApLGkucHVzaChhLnBhdGgpfXZhciByPW5ldyBTcihlKTtyZXR1cm4gci5jcmVhdGVQYXRoUHJveHkoKSxyLmJ1aWxkUGF0aD1mdW5jdGlvbih0KXt0LmFwcGVuZFBhdGgoaSk7dmFyIGU9dC5nZXRDb250ZXh0KCk7ZSYmdC5yZWJ1aWxkUGF0aChlKX0scn07ZnVuY3Rpb24gUHModCxlKXtpZih0LmFwcGx5VHJhbnNmb3JtKXt2YXIgaT10LmdldEJvdW5kaW5nUmVjdCgpLmNhbGN1bGF0ZVRyYW5zZm9ybShlKTt0LmFwcGx5VHJhbnNmb3JtKGkpfX12YXIgTnM9dHM7ZnVuY3Rpb24gT3ModCl7cmV0dXJuIG51bGwhPXQmJiJub25lIiE9PXR9dmFyIEVzPVEoKSx6cz0wO2Z1bmN0aW9uIFJzKHQpe3ZhciBlPXQuX19ob3ZlclN0bDtpZihlJiYhdC5fX2hpZ2hsaWdodGVkKXt2YXIgaT10Ll9fenIsbj10LnVzZUhvdmVyTGF5ZXImJmkmJiJjYW52YXMiPT09aS5wYWludGVyLnR5cGU7aWYodC5fX2hpZ2hsaWdodGVkPW4/ImxheWVyIjoicGxhaW4iLCEodC5pc0dyb3VwfHwhaSYmdC51c2VIb3ZlckxheWVyKSl7dmFyIG89dCxhPXQuc3R5bGU7biYmKGE9KG89aS5hZGRIb3Zlcih0KSkuc3R5bGUpLG9sKGEpLG58fGZ1bmN0aW9uKHQpe2lmKHQuX19ob3ZlclN0bERpcnR5KXt0Ll9faG92ZXJTdGxEaXJ0eT0hMTt2YXIgZT10Ll9faG92ZXJTdGw7aWYoZSl7dmFyIGk9dC5fX2NhY2hlZE5vcm1hbFN0bD17fTt0Ll9fY2FjaGVkTm9ybWFsWjI9dC56Mjt2YXIgbj10LnN0eWxlO2Zvcih2YXIgbyBpbiBlKW51bGwhPWVbb10mJihpW29dPW5bb10pO2kuZmlsbD1uLmZpbGwsaS5zdHJva2U9bi5zdHJva2V9ZWxzZSB0Ll9fY2FjaGVkTm9ybWFsU3RsPXQuX19jYWNoZWROb3JtYWxaMj1udWxsfX0obyksYS5leHRlbmRGcm9tKGUpLEJzKGEsZSwiZmlsbCIpLEJzKGEsZSwic3Ryb2tlIiksbmwoYSksbnx8KHQuZGlydHkoITEpLHQuejIrPXlzKX19fWZ1bmN0aW9uIEJzKHQsZSxpKXshT3MoZVtpXSkmJk9zKHRbaV0pJiYodFtpXT1mdW5jdGlvbih0KXtpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHQ7dmFyIGU9RXMuZ2V0KHQpO3JldHVybiBlfHwoZT1WZSh0LC0uMSksenM8MWU0JiYoRXMuc2V0KHQsZSksenMrKykpLGV9KHRbaV0pKX1mdW5jdGlvbiBWcyh0KXt2YXIgZT10Ll9faGlnaGxpZ2h0ZWQ7aWYoZSYmKHQuX19oaWdobGlnaHRlZD0hMSwhdC5pc0dyb3VwKSlpZigibGF5ZXIiPT09ZSl0Ll9fenImJnQuX196ci5yZW1vdmVIb3Zlcih0KTtlbHNle3ZhciBpPXQuc3R5bGUsbj10Ll9fY2FjaGVkTm9ybWFsU3RsO24mJihvbChpKSx0LnNldFN0eWxlKG4pLG5sKGkpKTt2YXIgbz10Ll9fY2FjaGVkTm9ybWFsWjI7bnVsbCE9byYmdC56Mi1vPT09eXMmJih0LnoyPW8pfX1mdW5jdGlvbiBHcyh0LGUsaSl7dmFyIG4sbz13cyxhPXdzO3QuX19oaWdobGlnaHRlZCYmKG89X3Msbj0hMCksZSh0LGkpLHQuX19oaWdobGlnaHRlZCYmKGE9X3Msbj0hMCksdC5pc0dyb3VwJiZ0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3QuaXNHcm91cHx8ZSh0LGkpfSksbiYmdC5fX2hpZ2hEb3duT25VcGRhdGUmJnQuX19oaWdoRG93bk9uVXBkYXRlKG8sYSl9ZnVuY3Rpb24gRnModCxlKXtlPXQuX19ob3ZlclN0bD0hMSE9PWUmJih0LmhvdmVyU3R5bGV8fGV8fHt9KSx0Ll9faG92ZXJTdGxEaXJ0eT0hMCx0Ll9faGlnaGxpZ2h0ZWQmJih0Ll9fY2FjaGVkTm9ybWFsU3RsPW51bGwsVnModCksUnModCkpfWZ1bmN0aW9uIFdzKHQpe1hzKHRoaXMsdCl8fHRoaXMuX19oaWdoQnlPdXRlcnx8R3ModGhpcyxScyl9ZnVuY3Rpb24gSHModCl7WHModGhpcyx0KXx8dGhpcy5fX2hpZ2hCeU91dGVyfHxHcyh0aGlzLFZzKX1mdW5jdGlvbiBacyh0KXt0aGlzLl9faGlnaEJ5T3V0ZXJ8PTE8PCh0fHwwKSxHcyh0aGlzLFJzKX1mdW5jdGlvbiBVcyh0KXsodGhpcy5fX2hpZ2hCeU91dGVyJj1+KDE8PCh0fHwwKSkpfHxHcyh0aGlzLFZzKX1mdW5jdGlvbiBYcyh0LGUpe3JldHVybiB0Ll9faGlnaERvd25TaWxlbnRPblRvdWNoJiZlLnpyQnlUb3VjaH1mdW5jdGlvbiBZcyh0LGUpe2pzKHQsITApLEdzKHQsRnMsZSl9ZnVuY3Rpb24ganModCxlKXt2YXIgaT0hMT09PWU7aWYodC5fX2hpZ2hEb3duU2lsZW50T25Ub3VjaD10LmhpZ2hEb3duU2lsZW50T25Ub3VjaCx0Ll9faGlnaERvd25PblVwZGF0ZT10LmhpZ2hEb3duT25VcGRhdGUsIWl8fHQuX19oaWdoRG93bkRpc3BhdGNoZXIpe3ZhciBuPWk/Im9mZiI6Im9uIjt0W25dKCJtb3VzZW92ZXIiLFdzKVtuXSgibW91c2VvdXQiLEhzKSx0W25dKCJlbXBoYXNpcyIsWnMpW25dKCJub3JtYWwiLFVzKSx0Ll9faGlnaEJ5T3V0ZXI9dC5fX2hpZ2hCeU91dGVyfHwwLHQuX19oaWdoRG93bkRpc3BhdGNoZXI9IWl9fWZ1bmN0aW9uIHFzKHQpe3JldHVybiEoIXR8fCF0Ll9faGlnaERvd25EaXNwYXRjaGVyKX1mdW5jdGlvbiBLcyh0KXt2YXIgZT1Tc1t0XTtyZXR1cm4gbnVsbD09ZSYmYnM8PTMyJiYoZT1Tc1t0XT1icysrKSxlfWZ1bmN0aW9uICRzKHQsZSxpLG4sbyxhLHIpe3ZhciBzLGw9KG89b3x8dnMpLmxhYmVsRmV0Y2hlcix1PW8ubGFiZWxEYXRhSW5kZXgsaD1vLmxhYmVsRGltSW5kZXgsYz1pLmdldFNoYWxsb3coInNob3ciKSxkPW4uZ2V0U2hhbGxvdygic2hvdyIpOyhjfHxkKSYmKGwmJihzPWwuZ2V0Rm9ybWF0dGVkTGFiZWwodSwibm9ybWFsIixudWxsLGgpKSxudWxsPT1zJiYocz1PKG8uZGVmYXVsdFRleHQpP28uZGVmYXVsdFRleHQodSxvKTpvLmRlZmF1bHRUZXh0KSk7dmFyIGY9Yz9zOm51bGwscD1kP0gobD9sLmdldEZvcm1hdHRlZExhYmVsKHUsImVtcGhhc2lzIixudWxsLGgpOm51bGwscyk6bnVsbDtudWxsPT1mJiZudWxsPT1wfHwoUXModCxpLGEsbyksUXMoZSxuLHIsbywhMCkpLHQudGV4dD1mLGUudGV4dD1wfWZ1bmN0aW9uIEpzKHQsZSxpKXt2YXIgbj10LnN0eWxlO2UmJihvbChuKSx0LnNldFN0eWxlKGUpLG5sKG4pKSxuPXQuX19ob3ZlclN0bCxpJiZuJiYob2wobiksTChuLGkpLG5sKG4pKX1mdW5jdGlvbiBRcyh0LGUsaSxuLG8pe3JldHVybiB0bCh0LGUsbixvKSxpJiZMKHQsaSksdH1mdW5jdGlvbiB0bCh0LGUsaSxuKXtpZigoaT1pfHx2cykuaXNSZWN0VGV4dCl7dmFyIG87aS5nZXRUZXh0UG9zaXRpb24/bz1pLmdldFRleHRQb3NpdGlvbihlLG4pOiJvdXRzaWRlIj09PShvPWUuZ2V0U2hhbGxvdygicG9zaXRpb24iKXx8KG4/bnVsbDoiaW5zaWRlIikpJiYobz0idG9wIiksdC50ZXh0UG9zaXRpb249byx0LnRleHRPZmZzZXQ9ZS5nZXRTaGFsbG93KCJvZmZzZXQiKTt2YXIgYT1lLmdldFNoYWxsb3coInJvdGF0ZSIpO251bGwhPWEmJihhKj1NYXRoLlBJLzE4MCksdC50ZXh0Um90YXRpb249YSx0LnRleHREaXN0YW5jZT1IKGUuZ2V0U2hhbGxvdygiZGlzdGFuY2UiKSxuP251bGw6NSl9dmFyIHIscz1lLmVjTW9kZWwsbD1zJiZzLm9wdGlvbi50ZXh0U3R5bGUsdT1mdW5jdGlvbih0KXt2YXIgZTtmb3IoO3QmJnQhPT10LmVjTW9kZWw7KXt2YXIgaT0odC5vcHRpb258fHZzKS5yaWNoO2lmKGkpZm9yKHZhciBuIGluIGU9ZXx8e30saSlpLmhhc093blByb3BlcnR5KG4pJiYoZVtuXT0xKTt0PXQucGFyZW50TW9kZWx9cmV0dXJuIGV9KGUpO2lmKHUpZm9yKHZhciBoIGluIHI9e30sdSlpZih1Lmhhc093blByb3BlcnR5KGgpKXt2YXIgYz1lLmdldE1vZGVsKFsicmljaCIsaF0pO2VsKHJbaF09e30sYyxsLGksbil9cmV0dXJuIHQucmljaD1yLGVsKHQsZSxsLGksbiwhMCksaS5mb3JjZVJpY2gmJiFpLnRleHRTdHlsZSYmKGkudGV4dFN0eWxlPXt9KSx0fWZ1bmN0aW9uIGVsKHQsZSxpLG4sbyxhKXtpPSFvJiZpfHx2cyx0LnRleHRGaWxsPWlsKGUuZ2V0U2hhbGxvdygiY29sb3IiKSxuKXx8aS5jb2xvcix0LnRleHRTdHJva2U9aWwoZS5nZXRTaGFsbG93KCJ0ZXh0Qm9yZGVyQ29sb3IiKSxuKXx8aS50ZXh0Qm9yZGVyQ29sb3IsdC50ZXh0U3Ryb2tlV2lkdGg9SChlLmdldFNoYWxsb3coInRleHRCb3JkZXJXaWR0aCIpLGkudGV4dEJvcmRlcldpZHRoKSxvfHwoYSYmKHQuaW5zaWRlUm9sbGJhY2tPcHQ9bixubCh0KSksbnVsbD09dC50ZXh0RmlsbCYmKHQudGV4dEZpbGw9bi5hdXRvQ29sb3IpKSx0LmZvbnRTdHlsZT1lLmdldFNoYWxsb3coImZvbnRTdHlsZSIpfHxpLmZvbnRTdHlsZSx0LmZvbnRXZWlnaHQ9ZS5nZXRTaGFsbG93KCJmb250V2VpZ2h0Iil8fGkuZm9udFdlaWdodCx0LmZvbnRTaXplPWUuZ2V0U2hhbGxvdygiZm9udFNpemUiKXx8aS5mb250U2l6ZSx0LmZvbnRGYW1pbHk9ZS5nZXRTaGFsbG93KCJmb250RmFtaWx5Iil8fGkuZm9udEZhbWlseSx0LnRleHRBbGlnbj1lLmdldFNoYWxsb3coImFsaWduIiksdC50ZXh0VmVydGljYWxBbGlnbj1lLmdldFNoYWxsb3coInZlcnRpY2FsQWxpZ24iKXx8ZS5nZXRTaGFsbG93KCJiYXNlbGluZSIpLHQudGV4dExpbmVIZWlnaHQ9ZS5nZXRTaGFsbG93KCJsaW5lSGVpZ2h0IiksdC50ZXh0V2lkdGg9ZS5nZXRTaGFsbG93KCJ3aWR0aCIpLHQudGV4dEhlaWdodD1lLmdldFNoYWxsb3coImhlaWdodCIpLHQudGV4dFRhZz1lLmdldFNoYWxsb3coInRhZyIpLGEmJm4uZGlzYWJsZUJveHx8KHQudGV4dEJhY2tncm91bmRDb2xvcj1pbChlLmdldFNoYWxsb3coImJhY2tncm91bmRDb2xvciIpLG4pLHQudGV4dFBhZGRpbmc9ZS5nZXRTaGFsbG93KCJwYWRkaW5nIiksdC50ZXh0Qm9yZGVyQ29sb3I9aWwoZS5nZXRTaGFsbG93KCJib3JkZXJDb2xvciIpLG4pLHQudGV4dEJvcmRlcldpZHRoPWUuZ2V0U2hhbGxvdygiYm9yZGVyV2lkdGgiKSx0LnRleHRCb3JkZXJSYWRpdXM9ZS5nZXRTaGFsbG93KCJib3JkZXJSYWRpdXMiKSx0LnRleHRCb3hTaGFkb3dDb2xvcj1lLmdldFNoYWxsb3coInNoYWRvd0NvbG9yIiksdC50ZXh0Qm94U2hhZG93Qmx1cj1lLmdldFNoYWxsb3coInNoYWRvd0JsdXIiKSx0LnRleHRCb3hTaGFkb3dPZmZzZXRYPWUuZ2V0U2hhbGxvdygic2hhZG93T2Zmc2V0WCIpLHQudGV4dEJveFNoYWRvd09mZnNldFk9ZS5nZXRTaGFsbG93KCJzaGFkb3dPZmZzZXRZIikpLHQudGV4dFNoYWRvd0NvbG9yPWUuZ2V0U2hhbGxvdygidGV4dFNoYWRvd0NvbG9yIil8fGkudGV4dFNoYWRvd0NvbG9yLHQudGV4dFNoYWRvd0JsdXI9ZS5nZXRTaGFsbG93KCJ0ZXh0U2hhZG93Qmx1ciIpfHxpLnRleHRTaGFkb3dCbHVyLHQudGV4dFNoYWRvd09mZnNldFg9ZS5nZXRTaGFsbG93KCJ0ZXh0U2hhZG93T2Zmc2V0WCIpfHxpLnRleHRTaGFkb3dPZmZzZXRYLHQudGV4dFNoYWRvd09mZnNldFk9ZS5nZXRTaGFsbG93KCJ0ZXh0U2hhZG93T2Zmc2V0WSIpfHxpLnRleHRTaGFkb3dPZmZzZXRZfWZ1bmN0aW9uIGlsKHQsZSl7cmV0dXJuImF1dG8iIT09dD90OmUmJmUuYXV0b0NvbG9yP2UuYXV0b0NvbG9yOm51bGx9ZnVuY3Rpb24gbmwodCl7dmFyIGUsaT10LnRleHRQb3NpdGlvbixuPXQuaW5zaWRlUm9sbGJhY2tPcHQ7aWYobiYmbnVsbD09dC50ZXh0RmlsbCl7dmFyIG89bi5hdXRvQ29sb3IsYT1uLmlzUmVjdFRleHQscj1uLnVzZUluc2lkZVN0eWxlLHM9ITEhPT1yJiYoITA9PT1yfHxhJiZpJiYic3RyaW5nIj09dHlwZW9mIGkmJjA8PWkuaW5kZXhPZigiaW5zaWRlIikpLGw9IXMmJm51bGwhPW87KHN8fGwpJiYoZT17dGV4dEZpbGw6dC50ZXh0RmlsbCx0ZXh0U3Ryb2tlOnQudGV4dFN0cm9rZSx0ZXh0U3Ryb2tlV2lkdGg6dC50ZXh0U3Ryb2tlV2lkdGh9KSxzJiYodC50ZXh0RmlsbD0iI2ZmZiIsbnVsbD09dC50ZXh0U3Ryb2tlJiYodC50ZXh0U3Ryb2tlPW8sbnVsbD09dC50ZXh0U3Ryb2tlV2lkdGgmJih0LnRleHRTdHJva2VXaWR0aD0yKSkpLGwmJih0LnRleHRGaWxsPW8pfXQuaW5zaWRlUm9sbGJhY2s9ZX1mdW5jdGlvbiBvbCh0KXt2YXIgZT10Lmluc2lkZVJvbGxiYWNrO2UmJih0LnRleHRGaWxsPWUudGV4dEZpbGwsdC50ZXh0U3Ryb2tlPWUudGV4dFN0cm9rZSx0LnRleHRTdHJva2VXaWR0aD1lLnRleHRTdHJva2VXaWR0aCx0Lmluc2lkZVJvbGxiYWNrPW51bGwpfWZ1bmN0aW9uIGFsKHQsZSl7dmFyIGk9ZSYmZS5nZXRNb2RlbCgidGV4dFN0eWxlIik7cmV0dXJuIGooW3QuZm9udFN0eWxlfHxpJiZpLmdldFNoYWxsb3coImZvbnRTdHlsZSIpfHwiIix0LmZvbnRXZWlnaHR8fGkmJmkuZ2V0U2hhbGxvdygiZm9udFdlaWdodCIpfHwiIiwodC5mb250U2l6ZXx8aSYmaS5nZXRTaGFsbG93KCJmb250U2l6ZSIpfHwxMikrInB4Iix0LmZvbnRGYW1pbHl8fGkmJmkuZ2V0U2hhbGxvdygiZm9udEZhbWlseSIpfHwic2Fucy1zZXJpZiJdLmpvaW4oIiAiKSl9ZnVuY3Rpb24gcmwodCxlLGksbixvLGEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvJiYoYT1vLG89bnVsbCksbiYmbi5pc0FuaW1hdGlvbkVuYWJsZWQoKSl7dmFyIHI9dD8iVXBkYXRlIjoiIixzPW4uZ2V0U2hhbGxvdygiYW5pbWF0aW9uRHVyYXRpb24iK3IpLGw9bi5nZXRTaGFsbG93KCJhbmltYXRpb25FYXNpbmciK3IpLHU9bi5nZXRTaGFsbG93KCJhbmltYXRpb25EZWxheSIrcik7ImZ1bmN0aW9uIj09dHlwZW9mIHUmJih1PXUobyxuLmdldEFuaW1hdGlvbkRlbGF5UGFyYW1zP24uZ2V0QW5pbWF0aW9uRGVsYXlQYXJhbXMoZSxvKTpudWxsKSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMobykpLDA8cz9lLmFuaW1hdGVUbyhpLHMsdXx8MCxsLGEsISFhKTooZS5zdG9wQW5pbWF0aW9uKCksZS5hdHRyKGkpLGEmJmEoKSl9ZWxzZSBlLnN0b3BBbmltYXRpb24oKSxlLmF0dHIoaSksYSYmYSgpfWZ1bmN0aW9uIHNsKHQsZSxpLG4sbyl7cmwoITAsdCxlLGksbixvKX1mdW5jdGlvbiBsbCh0LGUsaSxuLG8pe3JsKCExLHQsZSxpLG4sbyl9ZnVuY3Rpb24gdWwodCxlKXtmb3IodmFyIGk9aWUoW10pO3QmJnQhPT1lOylvZShpLHQuZ2V0TG9jYWxUcmFuc2Zvcm0oKSxpKSx0PXQucGFyZW50O3JldHVybiBpfWZ1bmN0aW9uIGhsKHQsZSxpKXtyZXR1cm4gZSYmIVAoZSkmJihlPWZlLmdldExvY2FsVHJhbnNmb3JtKGUpKSxpJiYoZT1sZShbXSxlKSksYnQoW10sdCxlKX1mdW5jdGlvbiBjbCh0LGUsaSl7dmFyIG49MD09PWVbNF18fDA9PT1lWzVdfHwwPT09ZVswXT8xOk1hdGguYWJzKDIqZVs0XS9lWzBdKSxvPTA9PT1lWzRdfHwwPT09ZVs1XXx8MD09PWVbMl0/MTpNYXRoLmFicygyKmVbNF0vZVsyXSksYT1bImxlZnQiPT09dD8tbjoicmlnaHQiPT09dD9uOjAsInRvcCI9PT10Py1vOiJib3R0b20iPT09dD9vOjBdO3JldHVybiBhPWhsKGEsZSxpKSxNYXRoLmFicyhhWzBdKT5NYXRoLmFicyhhWzFdKT8wPGFbMF0/InJpZ2h0IjoibGVmdCI6MDxhWzFdPyJib3R0b20iOiJ0b3AifWZ1bmN0aW9uIGRsKHQsZSxuLGkpe2lmKHQmJmUpe3ZhciBvLGE9KG89e30sdC50cmF2ZXJzZShmdW5jdGlvbih0KXshdC5pc0dyb3VwJiZ0LmFuaWQmJihvW3QuYW5pZF09dCl9KSxvKTtlLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe2lmKCF0LmlzR3JvdXAmJnQuYW5pZCl7dmFyIGU9YVt0LmFuaWRdO2lmKGUpe3ZhciBpPXIodCk7dC5hdHRyKHIoZSkpLHNsKHQsaSxuLHQuZGF0YUluZGV4KX19fSl9ZnVuY3Rpb24gcih0KXt2YXIgZT17cG9zaXRpb246cnQodC5wb3NpdGlvbikscm90YXRpb246dC5yb3RhdGlvbn07cmV0dXJuIHQuc2hhcGUmJihlLnNoYXBlPUwoe30sdC5zaGFwZSkpLGV9fWZ1bmN0aW9uIGZsKHQsbil7cmV0dXJuIE4odCxmdW5jdGlvbih0KXt2YXIgZT10WzBdO2U9Z3MoZSxuLngpLGU9bXMoZSxuLngrbi53aWR0aCk7dmFyIGk9dFsxXTtyZXR1cm4gaT1ncyhpLG4ueSksW2UsaT1tcyhpLG4ueStuLmhlaWdodCldfSl9ZnVuY3Rpb24gcGwodCxlLGkpe3ZhciBuPShlPUwoe3JlY3RIb3ZlcjohMH0sZSkpLnN0eWxlPXtzdHJva2VOb1NjYWxlOiEwfTtpZihpPWl8fHt4Oi0xLHk6LTEsd2lkdGg6MixoZWlnaHQ6Mn0sdClyZXR1cm4gMD09PXQuaW5kZXhPZigiaW1hZ2U6Ly8iKT8obi5pbWFnZT10LnNsaWNlKDgpLEMobixpKSxuZXcgcW4oZSkpOkRzKHQucmVwbGFjZSgicGF0aDovLyIsIiIpLGUsaSwiY2VudGVyIil9ZnVuY3Rpb24gZ2wodCxlLGksbixvKXtmb3IodmFyIGE9MCxyPW9bby5sZW5ndGgtMV07YTxvLmxlbmd0aDthKyspe3ZhciBzPW9bYV07aWYobWwodCxlLGksbixzWzBdLHNbMV0sclswXSxyWzFdKSlyZXR1cm4hMDtyPXN9fWZ1bmN0aW9uIG1sKHQsZSxpLG4sbyxhLHIscyl7dmFyIGw9aS10LHU9bi1lLGg9ci1vLGM9cy1hLGQ9dmwoaCxjLGwsdSk7aWYoZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTFlLTYmJi0xZS02PD10fShkKSlyZXR1cm4hMTt2YXIgZj10LW8scD1lLWEsZz12bChmLHAsbCx1KS9kO2lmKGc8MHx8MTxnKXJldHVybiExO3ZhciBtPXZsKGYscCxoLGMpL2Q7cmV0dXJuIShtPDB8fDE8bSl9ZnVuY3Rpb24gdmwodCxlLGksbil7cmV0dXJuIHQqbi1pKmV9VHMoImNpcmNsZSIsSHIpLFRzKCJzZWN0b3IiLFVyKSxUcygicmluZyIsWHIpLFRzKCJwb2x5Z29uIixxciksVHMoInBvbHlsaW5lIixLciksVHMoInJlY3QiLGlzKSxUcygibGluZSIsb3MpLFRzKCJiZXppZXJDdXJ2ZSIsbHMpLFRzKCJhcmMiLHVzKTt2YXIgeWw9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe1oyX0VNUEhBU0lTX0xJRlQ6eXMsQ0FDSEVEX0xBQkVMX1NUWUxFX1BST1BFUlRJRVM6eHMsZXh0ZW5kU2hhcGU6SXMsZXh0ZW5kUGF0aDpmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBTci5leHRlbmQoVnIodCxlKSl9KHQsZSl9LHJlZ2lzdGVyU2hhcGU6VHMsZ2V0U2hhcGVDbGFzczpBcyxtYWtlUGF0aDpEcyxtYWtlSW1hZ2U6Q3MsbWVyZ2VQYXRoOmtzLHJlc2l6ZVBhdGg6UHMsc3ViUGl4ZWxPcHRpbWl6ZUxpbmU6ZnVuY3Rpb24odCl7cmV0dXJuIEpyKHQuc2hhcGUsdC5zaGFwZSx0LnN0eWxlKSx0fSxzdWJQaXhlbE9wdGltaXplUmVjdDpmdW5jdGlvbih0KXtyZXR1cm4gUXIodC5zaGFwZSx0LnNoYXBlLHQuc3R5bGUpLHR9LHN1YlBpeGVsT3B0aW1pemU6TnMsc2V0RWxlbWVudEhvdmVyU3R5bGU6RnMsc2V0SG92ZXJTdHlsZTpZcyxzZXRBc0hpZ2hEb3duRGlzcGF0Y2hlcjpqcyxpc0hpZ2hEb3duRGlzcGF0Y2hlcjpxcyxnZXRIaWdobGlnaHREaWdpdDpLcyxzZXRMYWJlbFN0eWxlOiRzLG1vZGlmeUxhYmVsU3R5bGU6SnMsc2V0VGV4dFN0eWxlOlFzLHNldFRleHQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG89e2lzUmVjdFRleHQ6ITB9OyExPT09aT9uPSEwOm8uYXV0b0NvbG9yPWksdGwodCxlLG8sbil9LGdldEZvbnQ6YWwsdXBkYXRlUHJvcHM6c2wsaW5pdFByb3BzOmxsLGdldFRyYW5zZm9ybTp1bCxhcHBseVRyYW5zZm9ybTpobCx0cmFuc2Zvcm1EaXJlY3Rpb246Y2wsZ3JvdXBUcmFuc2l0aW9uOmRsLGNsaXBQb2ludHNCeVJlY3Q6ZmwsY2xpcFJlY3RCeVJlY3Q6ZnVuY3Rpb24odCxlKXt2YXIgaT1ncyh0LngsZS54KSxuPW1zKHQueCt0LndpZHRoLGUueCtlLndpZHRoKSxvPWdzKHQueSxlLnkpLGE9bXModC55K3QuaGVpZ2h0LGUueStlLmhlaWdodCk7aWYoaTw9biYmbzw9YSlyZXR1cm57eDppLHk6byx3aWR0aDpuLWksaGVpZ2h0OmEtb319LGNyZWF0ZUljb246cGwsbGluZVBvbHlnb25JbnRlcnNlY3Q6Z2wsbGluZUxpbmVJbnRlcnNlY3Q6bWwsR3JvdXA6SWksSW1hZ2U6cW4sVGV4dDpGcixDaXJjbGU6SHIsU2VjdG9yOlVyLFJpbmc6WHIsUG9seWdvbjpxcixQb2x5bGluZTpLcixSZWN0OmlzLExpbmU6b3MsQmV6aWVyQ3VydmU6bHMsQXJjOnVzLEluY3JlbWVudGFsRGlzcGxheWFibGU6ZnMsQ29tcG91bmRQYXRoOmhzLExpbmVhckdyYWRpZW50OmNzLFJhZGlhbEdyYWRpZW50OmRzLEJvdW5kaW5nUmVjdDpNaX0pLHhsPVsidGV4dFN0eWxlIiwiY29sb3IiXSxfbD17Z2V0VGV4dENvbG9yOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWNNb2RlbDtyZXR1cm4gdGhpcy5nZXRTaGFsbG93KCJjb2xvciIpfHwoIXQmJmU/ZS5nZXQoeGwpOm51bGwpfSxnZXRGb250OmZ1bmN0aW9uKCl7cmV0dXJuIGFsKHtmb250U3R5bGU6dGhpcy5nZXRTaGFsbG93KCJmb250U3R5bGUiKSxmb250V2VpZ2h0OnRoaXMuZ2V0U2hhbGxvdygiZm9udFdlaWdodCIpLGZvbnRTaXplOnRoaXMuZ2V0U2hhbGxvdygiZm9udFNpemUiKSxmb250RmFtaWx5OnRoaXMuZ2V0U2hhbGxvdygiZm9udEZhbWlseSIpfSx0aGlzLmVjTW9kZWwpfSxnZXRUZXh0UmVjdDpmdW5jdGlvbih0KXtyZXR1cm4gY24odCx0aGlzLmdldEZvbnQoKSx0aGlzLmdldFNoYWxsb3coImFsaWduIiksdGhpcy5nZXRTaGFsbG93KCJ2ZXJ0aWNhbEFsaWduIil8fHRoaXMuZ2V0U2hhbGxvdygiYmFzZWxpbmUiKSx0aGlzLmdldFNoYWxsb3coInBhZGRpbmciKSx0aGlzLmdldFNoYWxsb3coImxpbmVIZWlnaHQiKSx0aGlzLmdldFNoYWxsb3coInJpY2giKSx0aGlzLmdldFNoYWxsb3coInRydW5jYXRlVGV4dCIpKX19LHdsPXJhKFtbImZpbGwiLCJjb2xvciJdLFsic3Ryb2tlIiwiYm9yZGVyQ29sb3IiXSxbImxpbmVXaWR0aCIsImJvcmRlcldpZHRoIl0sWyJvcGFjaXR5Il0sWyJzaGFkb3dCbHVyIl0sWyJzaGFkb3dPZmZzZXRYIl0sWyJzaGFkb3dPZmZzZXRZIl0sWyJzaGFkb3dDb2xvciJdLFsidGV4dFBvc2l0aW9uIl0sWyJ0ZXh0QWxpZ24iXV0pLGJsPXtnZXRJdGVtU3R5bGU6ZnVuY3Rpb24odCxlKXt2YXIgaT13bCh0aGlzLHQsZSksbj10aGlzLmdldEJvcmRlckxpbmVEYXNoKCk7cmV0dXJuIG4mJihpLmxpbmVEYXNoPW4pLGl9LGdldEJvcmRlckxpbmVEYXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoImJvcmRlclR5cGUiKTtyZXR1cm4ic29saWQiPT09dHx8bnVsbD09dD9udWxsOiJkYXNoZWQiPT09dD9bNSw1XTpbMSwxXX19LFNsPWIsTWw9Wm8oKTtmdW5jdGlvbiBJbCh0LGUsaSl7dGhpcy5wYXJlbnRNb2RlbD1lLHRoaXMuZWNNb2RlbD1pLHRoaXMub3B0aW9uPXR9ZnVuY3Rpb24gVGwodCxlLGkpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGgmJighZVtuXXx8bnVsbCE9KHQ9dCYmIm9iamVjdCI9PXR5cGVvZiB0P3RbZVtuXV06bnVsbCkpO24rKyk7cmV0dXJuIG51bGw9PXQmJmkmJih0PWkuZ2V0KGUpKSx0fWZ1bmN0aW9uIEFsKHQsZSl7dmFyIGk9TWwodCkuZ2V0UGFyZW50O3JldHVybiBpP2kuY2FsbCh0LGUpOnQucGFyZW50TW9kZWx9SWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpJbCxpbml0Om51bGwsbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7bSh0aGlzLm9wdGlvbix0LCEwKX0sZ2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dGhpcy5vcHRpb246VGwodGhpcy5vcHRpb24sdGhpcy5wYXJzZVBhdGgodCksIWUmJkFsKHRoaXMsdCkpfSxnZXRTaGFsbG93OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb24sbj1udWxsPT1pP2k6aVt0XSxvPSFlJiZBbCh0aGlzLHQpO3JldHVybiBudWxsPT1uJiZvJiYobj1vLmdldFNoYWxsb3codCkpLG59LGdldE1vZGVsOmZ1bmN0aW9uKHQsZSl7dmFyIGk7cmV0dXJuIG5ldyBJbChudWxsPT10P3RoaXMub3B0aW9uOlRsKHRoaXMub3B0aW9uLHQ9dGhpcy5wYXJzZVBhdGgodCkpLGU9ZXx8KGk9QWwodGhpcyx0KSkmJmkuZ2V0TW9kZWwodCksdGhpcy5lY01vZGVsKX0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLm9wdGlvbn0scmVzdG9yZURhdGE6ZnVuY3Rpb24oKXt9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKEQodGhpcy5vcHRpb24pKX0sc2V0UmVhZE9ubHk6ZnVuY3Rpb24odCl7fSxwYXJzZVBhdGg6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIuIikpLHR9LGN1c3RvbWl6ZUdldFBhcmVudDpmdW5jdGlvbih0KXtNbCh0aGlzKS5nZXRQYXJlbnQ9dH0saXNBbmltYXRpb25FbmFibGVkOmZ1bmN0aW9uKCl7aWYoIXYubm9kZSl7aWYobnVsbCE9dGhpcy5vcHRpb24uYW5pbWF0aW9uKXJldHVybiEhdGhpcy5vcHRpb24uYW5pbWF0aW9uO2lmKHRoaXMucGFyZW50TW9kZWwpcmV0dXJuIHRoaXMucGFyZW50TW9kZWwuaXNBbmltYXRpb25FbmFibGVkKCl9fX0sdGEoSWwpLGlhKElsKSxTbChJbCxsYSksU2woSWwsaGEpLFNsKElsLF9sKSxTbChJbCxibCk7dmFyIERsPTA7ZnVuY3Rpb24gQ2wodCl7cmV0dXJuW3R8fCIiLERsKyssTWF0aC5yYW5kb20oKS50b0ZpeGVkKDUpXS5qb2luKCJfIil9dmFyIExsPTFlLTQ7ZnVuY3Rpb24ga2wodCxlLGksbil7dmFyIG89ZVsxXS1lWzBdLGE9aVsxXS1pWzBdO2lmKDA9PW8pcmV0dXJuIDA9PWE/aVswXTooaVswXStpWzFdKS8yO2lmKG4paWYoMDxvKXtpZih0PD1lWzBdKXJldHVybiBpWzBdO2lmKHQ+PWVbMV0pcmV0dXJuIGlbMV19ZWxzZXtpZih0Pj1lWzBdKXJldHVybiBpWzBdO2lmKHQ8PWVbMV0pcmV0dXJuIGlbMV19ZWxzZXtpZih0PT09ZVswXSlyZXR1cm4gaVswXTtpZih0PT09ZVsxXSlyZXR1cm4gaVsxXX1yZXR1cm4odC1lWzBdKS9vKmEraVswXX1mdW5jdGlvbiBQbCh0LGUpe3N3aXRjaCh0KXtjYXNlImNlbnRlciI6Y2FzZSJtaWRkbGUiOnQ9IjUwJSI7YnJlYWs7Y2FzZSJsZWZ0IjpjYXNlInRvcCI6dD0iMCUiO2JyZWFrO2Nhc2UicmlnaHQiOmNhc2UiYm90dG9tIjp0PSIxMDAlIn1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5tYXRjaCgvJSQvKT9wYXJzZUZsb2F0KHQpLzEwMCplOnBhcnNlRmxvYXQodCk6bnVsbD09dD9OYU46K3R9ZnVuY3Rpb24gTmwodCxlLGkpe3JldHVybiBudWxsPT1lJiYoZT0xMCksZT1NYXRoLm1pbihNYXRoLm1heCgwLGUpLDIwKSx0PSgrdCkudG9GaXhlZChlKSxpP3Q6K3R9ZnVuY3Rpb24gT2wodCl7cmV0dXJuIHQuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSx0fWZ1bmN0aW9uIEVsKHQpe2lmKHQ9K3QsaXNOYU4odCkpcmV0dXJuIDA7Zm9yKHZhciBlPTEsaT0wO01hdGgucm91bmQodCplKS9lIT09dDspZSo9MTAsaSsrO3JldHVybiBpfWZ1bmN0aW9uIHpsKHQpe3ZhciBlPXQudG9TdHJpbmcoKSxpPWUuaW5kZXhPZigiZSIpO2lmKDA8aSl7dmFyIG49K2Uuc2xpY2UoaSsxKTtyZXR1cm4gbjwwPy1uOjB9dmFyIG89ZS5pbmRleE9mKCIuIik7cmV0dXJuIG88MD8wOmUubGVuZ3RoLTEtb31mdW5jdGlvbiBSbCh0LGUpe3ZhciBpPU1hdGgubG9nLG49TWF0aC5MTjEwLG89TWF0aC5mbG9vcihpKHRbMV0tdFswXSkvbiksYT1NYXRoLnJvdW5kKGkoTWF0aC5hYnMoZVsxXS1lWzBdKSkvbikscj1NYXRoLm1pbihNYXRoLm1heCgtbythLDApLDIwKTtyZXR1cm4gaXNGaW5pdGUocik/cjoyMH1mdW5jdGlvbiBCbCh0LGUsaSl7aWYoIXRbZV0pcmV0dXJuIDA7dmFyIG49Uyh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrKGlzTmFOKGUpPzA6ZSl9LDApO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgbz1NYXRoLnBvdygxMCxpKSxhPU4odCxmdW5jdGlvbih0KXtyZXR1cm4oaXNOYU4odCk/MDp0KS9uKm8qMTAwfSkscj0xMDAqbyxzPU4oYSxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0KX0pLGw9UyhzLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0sMCksdT1OKGEsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1zW2VdfSk7bDxyOyl7Zm9yKHZhciBoPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxjPW51bGwsZD0wLGY9dS5sZW5ndGg7ZDxmOysrZCl1W2RdPmgmJihoPXVbZF0sYz1kKTsrK3NbY10sdVtjXT0wLCsrbH1yZXR1cm4gc1tlXS9vfXZhciBWbD05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIEdsKHQpe3ZhciBlPTIqTWF0aC5QSTtyZXR1cm4odCVlK2UpJWV9ZnVuY3Rpb24gRmwodCl7cmV0dXJuLUxsPHQmJnQ8TGx9dmFyIFdsPS9eKD86KFxkezR9KSg/OlstXC9dKFxkezEsMn0pKD86Wy1cL10oXGR7MSwyfSkoPzpbVCBdKFxkezEsMn0pKD86OihcZFxkKSg/OjooXGRcZCkoPzpbLixdKFxkKykpPyk/KT8oWnxbXCtcLV1cZFxkOj9cZFxkKT8pPyk/KT8pPyQvO2Z1bmN0aW9uIEhsKHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0O2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gbnVsbD09dD9uZXcgRGF0ZShOYU4pOm5ldyBEYXRlKE1hdGgucm91bmQodCkpO3ZhciBlPVdsLmV4ZWModCk7aWYoIWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7aWYoZVs4XSl7dmFyIGk9K2VbNF18fDA7cmV0dXJuIloiIT09ZVs4XS50b1VwcGVyQ2FzZSgpJiYoaS09ZVs4XS5zbGljZSgwLDMpKSxuZXcgRGF0ZShEYXRlLlVUQygrZVsxXSwrKGVbMl18fDEpLTEsK2VbM118fDEsaSwrKGVbNV18fDApLCtlWzZdfHwwLCtlWzddfHwwKSl9cmV0dXJuIG5ldyBEYXRlKCtlWzFdLCsoZVsyXXx8MSktMSwrZVszXXx8MSwrZVs0XXx8MCwrKGVbNV18fDApLCtlWzZdfHwwLCtlWzddfHwwKX1mdW5jdGlvbiBabCh0KXtyZXR1cm4gTWF0aC5wb3coMTAsVWwodCkpfWZ1bmN0aW9uIFVsKHQpe2lmKDA9PT10KXJldHVybiAwO3ZhciBlPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjEwKTtyZXR1cm4gMTA8PXQvTWF0aC5wb3coMTAsZSkmJmUrKyxlfWZ1bmN0aW9uIFhsKHQsZSl7dmFyIGk9VWwodCksbj1NYXRoLnBvdygxMCxpKSxvPXQvbjtyZXR1cm4gdD0oZT9vPDEuNT8xOm88Mi41PzI6bzw0PzM6bzw3PzU6MTA6bzwxPzE6bzwyPzI6bzwzPzM6bzw1PzU6MTApKm4sLTIwPD1pPyt0LnRvRml4ZWQoaTwwPy1pOjApOnR9ZnVuY3Rpb24gWWwodCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxpLG4pe3JldHVybiBlLmludGVydmFsW25dPGkuaW50ZXJ2YWxbbl18fGUuaW50ZXJ2YWxbbl09PT1pLmludGVydmFsW25dJiYoZS5jbG9zZVtuXS1pLmNsb3NlW25dPT0obj8tMToxKXx8IW4mJnQoZSxpLDEpKX0odCxlLDApPy0xOjF9KTtmb3IodmFyIGU9LTEvMCxpPTEsbj0wO248dC5sZW5ndGg7KXtmb3IodmFyIG89dFtuXS5pbnRlcnZhbCxhPXRbbl0uY2xvc2Uscj0wO3I8MjtyKyspb1tyXTw9ZSYmKG9bcl09ZSxhW3JdPXI/MToxLWkpLGU9b1tyXSxpPWFbcl07b1swXT09PW9bMV0mJmFbMF0qYVsxXSE9MT90LnNwbGljZShuLDEpOm4rK31yZXR1cm4gdH1mdW5jdGlvbiBqbCh0KXtyZXR1cm4gMDw9dC1wYXJzZUZsb2F0KHQpfXZhciBxbD0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7bGluZWFyTWFwOmtsLHBhcnNlUGVyY2VudDpQbCxyb3VuZDpObCxhc2M6T2wsZ2V0UHJlY2lzaW9uOkVsLGdldFByZWNpc2lvblNhZmU6emwsZ2V0UGl4ZWxQcmVjaXNpb246UmwsZ2V0UGVyY2VudFdpdGhQcmVjaXNpb246QmwsTUFYX1NBRkVfSU5URUdFUjpWbCxyZW1SYWRpYW46R2wsaXNSYWRpYW5Bcm91bmRaZXJvOkZsLHBhcnNlRGF0ZTpIbCxxdWFudGl0eTpabCxxdWFudGl0eUV4cG9uZW50OlVsLG5pY2U6WGwscXVhbnRpbGU6ZnVuY3Rpb24odCxlKXt2YXIgaT0odC5sZW5ndGgtMSkqZSsxLG49TWF0aC5mbG9vcihpKSxvPSt0W24tMV0sYT1pLW47cmV0dXJuIGE/bythKih0W25dLW8pOm99LHJlZm9ybUludGVydmFsczpZbCxpc051bWVyaWM6amx9KTtmdW5jdGlvbiBLbCh0KXtyZXR1cm4gaXNOYU4odCk/Ii0iOih0PSh0KyIiKS5zcGxpdCgiLiIpKVswXS5yZXBsYWNlKC8oXGR7MSwzfSkoPz0oPzpcZHszfSkrKD8hXGQpKS9nLCIkMSwiKSsoMTx0Lmxlbmd0aD8iLiIrdFsxXToiIil9ZnVuY3Rpb24gJGwodCxlKXtyZXR1cm4gdD0odHx8IiIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLSguKS9nLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX0pLGUmJnQmJih0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSksdH12YXIgSmw9WCxRbD0vKFsmPD4iJ10pL2csdHU9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9O2Z1bmN0aW9uIGV1KHQpe3JldHVybiBudWxsPT10PyIiOih0KyIiKS5yZXBsYWNlKFFsLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR1W2VdfSl9ZnVuY3Rpb24gaXUodCxlKXtyZXR1cm4ieyIrdCsobnVsbD09ZT8iIjplKSsifSJ9dmFyIG51PVsiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyJdO2Z1bmN0aW9uIG91KHQsZSxpKXtrKGUpfHwoZT1bZV0pO3ZhciBuPWUubGVuZ3RoO2lmKCFuKXJldHVybiIiO2Zvcih2YXIgbz1lWzBdLiR2YXJzfHxbXSxhPTA7YTxvLmxlbmd0aDthKyspe3ZhciByPW51W2FdO3Q9dC5yZXBsYWNlKGl1KHIpLGl1KHIsMCkpfWZvcih2YXIgcz0wO3M8bjtzKyspZm9yKHZhciBsPTA7bDxvLmxlbmd0aDtsKyspe3ZhciB1PWVbc11bb1tsXV07dD10LnJlcGxhY2UoaXUobnVbbF0scyksaT9ldSh1KTp1KX1yZXR1cm4gdH1mdW5jdGlvbiBhdShpLHQsbil7cmV0dXJuIEUodCxmdW5jdGlvbih0LGUpe2k9aS5yZXBsYWNlKCJ7IitlKyJ9IixuP2V1KHQpOnQpfSksaX1mdW5jdGlvbiBydSh0LGUpe3ZhciBpPSh0PXoodCk/e2NvbG9yOnQsZXh0cmFDc3NUZXh0OmV9OnR8fHt9KS5jb2xvcixuPXQudHlwZSxvPShlPXQuZXh0cmFDc3NUZXh0LHQucmVuZGVyTW9kZXx8Imh0bWwiKSxhPXQubWFya2VySWR8fCJYIjtyZXR1cm4gaT8iaHRtbCI9PT1vPyJzdWJJdGVtIj09PW4/JzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXJpZ2h0OjhweDttYXJnaW4tbGVmdDozcHg7Ym9yZGVyLXJhZGl1czo0cHg7d2lkdGg6NHB4O2hlaWdodDo0cHg7YmFja2dyb3VuZC1jb2xvcjonK2V1KGkpKyI7IisoZXx8IiIpKyciPjwvc3Bhbj4nOic8c3BhbiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjVweDtib3JkZXItcmFkaXVzOjEwcHg7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOicrZXUoaSkrIjsiKyhlfHwiIikrJyI+PC9zcGFuPic6e3JlbmRlck1vZGU6byxjb250ZW50OiJ7bWFya2VyIithKyJ8fSAgIixzdHlsZTp7Y29sb3I6aX19OiIifWZ1bmN0aW9uIHN1KHQsZSl7cmV0dXJuIjAwMDAiLnN1YnN0cigwLGUtKHQrPSIiKS5sZW5ndGgpK3R9ZnVuY3Rpb24gbHUodCxlLGkpeyJ3ZWVrIiE9PXQmJiJtb250aCIhPT10JiYicXVhcnRlciIhPT10JiYiaGFsZi15ZWFyIiE9PXQmJiJ5ZWFyIiE9PXR8fCh0PSJNTS1kZFxueXl5eSIpO3ZhciBuPUhsKGUpLG89aT8iVVRDIjoiIixhPW5bImdldCIrbysiRnVsbFllYXIiXSgpLHI9blsiZ2V0IitvKyJNb250aCJdKCkrMSxzPW5bImdldCIrbysiRGF0ZSJdKCksbD1uWyJnZXQiK28rIkhvdXJzIl0oKSx1PW5bImdldCIrbysiTWludXRlcyJdKCksaD1uWyJnZXQiK28rIlNlY29uZHMiXSgpLGM9blsiZ2V0IitvKyJNaWxsaXNlY29uZHMiXSgpO3JldHVybiB0PXQucmVwbGFjZSgiTU0iLHN1KHIsMikpLnJlcGxhY2UoIk0iLHIpLnJlcGxhY2UoInl5eXkiLGEpLnJlcGxhY2UoInl5IixhJTEwMCkucmVwbGFjZSgiZGQiLHN1KHMsMikpLnJlcGxhY2UoImQiLHMpLnJlcGxhY2UoImhoIixzdShsLDIpKS5yZXBsYWNlKCJoIixsKS5yZXBsYWNlKCJtbSIsc3UodSwyKSkucmVwbGFjZSgibSIsdSkucmVwbGFjZSgic3MiLHN1KGgsMikpLnJlcGxhY2UoInMiLGgpLnJlcGxhY2UoIlNTUyIsc3UoYywzKSl9ZnVuY3Rpb24gdXUodCl7cmV0dXJuIHQ/dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTp0fXZhciBodT1nbjt2YXIgY3U9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe2FkZENvbW1hczpLbCx0b0NhbWVsQ2FzZTokbCxub3JtYWxpemVDc3NBcnJheTpKbCxlbmNvZGVIVE1MOmV1LGZvcm1hdFRwbDpvdSxmb3JtYXRUcGxTaW1wbGU6YXUsZ2V0VG9vbHRpcE1hcmtlcjpydSxmb3JtYXRUaW1lOmx1LGNhcGl0YWxGaXJzdDp1dSx0cnVuY2F0ZVRleHQ6aHUsZ2V0VGV4dEJvdW5kaW5nUmVjdDpmdW5jdGlvbih0KXtyZXR1cm4gY24odC50ZXh0LHQuZm9udCx0LnRleHRBbGlnbix0LnRleHRWZXJ0aWNhbEFsaWduLHQudGV4dFBhZGRpbmcsdC50ZXh0TGluZUhlaWdodCx0LnJpY2gsdC50cnVuY2F0ZSl9LGdldFRleHRSZWN0OmZ1bmN0aW9uKHQsZSxpLG4sbyxhLHIscyl7cmV0dXJuIGNuKHQsZSxpLG4sbyxzLGEscil9fSksZHU9RSxmdT1bImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSIsIndpZHRoIiwiaGVpZ2h0Il0scHU9W1sid2lkdGgiLCJsZWZ0IiwicmlnaHQiXSxbImhlaWdodCIsInRvcCIsImJvdHRvbSJdXTtmdW5jdGlvbiBndShoLGMsZCxmLHApe3ZhciBnPTAsbT0wO251bGw9PWYmJihmPTEvMCksbnVsbD09cCYmKHA9MS8wKTt2YXIgdj0wO2MuZWFjaENoaWxkKGZ1bmN0aW9uKHQsZSl7dmFyIGksbixvPXQucG9zaXRpb24sYT10LmdldEJvdW5kaW5nUmVjdCgpLHI9Yy5jaGlsZEF0KGUrMSkscz1yJiZyLmdldEJvdW5kaW5nUmVjdCgpO2lmKCJob3Jpem9udGFsIj09PWgpe3ZhciBsPWEud2lkdGgrKHM/LXMueCthLng6MCk7dj1mPChpPWcrbCl8fHQubmV3bGluZT8oZz0wLGk9bCxtKz12K2QsYS5oZWlnaHQpOk1hdGgubWF4KHYsYS5oZWlnaHQpfWVsc2V7dmFyIHU9YS5oZWlnaHQrKHM/LXMueSthLnk6MCk7dj1wPChuPW0rdSl8fHQubmV3bGluZT8oZys9ditkLG09MCxuPXUsYS53aWR0aCk6TWF0aC5tYXgodixhLndpZHRoKX10Lm5ld2xpbmV8fChvWzBdPWcsb1sxXT1tLCJob3Jpem9udGFsIj09PWg/Zz1pK2Q6bT1uK2QpfSl9dmFyIG11PWd1O1QoZ3UsInZlcnRpY2FsIiksVChndSwiaG9yaXpvbnRhbCIpO2Z1bmN0aW9uIHZ1KHQsZSxpKXtpPUpsKGl8fDApO3ZhciBuPWUud2lkdGgsbz1lLmhlaWdodCxhPVBsKHQubGVmdCxuKSxyPVBsKHQudG9wLG8pLHM9UGwodC5yaWdodCxuKSxsPVBsKHQuYm90dG9tLG8pLHU9UGwodC53aWR0aCxuKSxoPVBsKHQuaGVpZ2h0LG8pLGM9aVsyXStpWzBdLGQ9aVsxXStpWzNdLGY9dC5hc3BlY3Q7c3dpdGNoKGlzTmFOKHUpJiYodT1uLXMtZC1hKSxpc05hTihoKSYmKGg9by1sLWMtciksbnVsbCE9ZiYmKGlzTmFOKHUpJiZpc05hTihoKSYmKG4vbzxmP3U9LjgqbjpoPS44Km8pLGlzTmFOKHUpJiYodT1mKmgpLGlzTmFOKGgpJiYoaD11L2YpKSxpc05hTihhKSYmKGE9bi1zLXUtZCksaXNOYU4ocikmJihyPW8tbC1oLWMpLHQubGVmdHx8dC5yaWdodCl7Y2FzZSJjZW50ZXIiOmE9bi8yLXUvMi1pWzNdO2JyZWFrO2Nhc2UicmlnaHQiOmE9bi11LWR9c3dpdGNoKHQudG9wfHx0LmJvdHRvbSl7Y2FzZSJtaWRkbGUiOmNhc2UiY2VudGVyIjpyPW8vMi1oLzItaVswXTticmVhaztjYXNlImJvdHRvbSI6cj1vLWgtY31hPWF8fDAscj1yfHwwLGlzTmFOKHUpJiYodT1uLWQtYS0oc3x8MCkpLGlzTmFOKGgpJiYoaD1vLWMtci0obHx8MCkpO3ZhciBwPW5ldyBNaShhK2lbM10scitpWzBdLHUsaCk7cmV0dXJuIHAubWFyZ2luPWkscH1mdW5jdGlvbiB5dSh0LGUsaSxuLG8pe3ZhciBhPSFvfHwhby5odnx8by5odlswXSxyPSFvfHwhby5odnx8by5odlsxXSxzPW8mJm8uYm91bmRpbmdNb2RlfHwiYWxsIjtpZihhfHxyKXt2YXIgbDtpZigicmF3Ij09PXMpbD0iZ3JvdXAiPT09dC50eXBlP25ldyBNaSgwLDAsK2Uud2lkdGh8fDAsK2UuaGVpZ2h0fHwwKTp0LmdldEJvdW5kaW5nUmVjdCgpO2Vsc2UgaWYobD10LmdldEJvdW5kaW5nUmVjdCgpLHQubmVlZExvY2FsVHJhbnNmb3JtKCkpe3ZhciB1PXQuZ2V0TG9jYWxUcmFuc2Zvcm0oKTsobD1sLmNsb25lKCkpLmFwcGx5VHJhbnNmb3JtKHUpfWU9dnUoQyh7d2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9LGUpLGksbik7dmFyIGg9dC5wb3NpdGlvbixjPWE/ZS54LWwueDowLGQ9cj9lLnktbC55OjA7dC5hdHRyKCJwb3NpdGlvbiIsInJhdyI9PT1zP1tjLGRdOltoWzBdK2MsaFsxXStkXSl9fWZ1bmN0aW9uIHh1KGwsdSx0KXtSKHQpfHwodD17fSk7dmFyIGg9dC5pZ25vcmVTaXplO2soaCl8fChoPVtoLGhdKTt2YXIgZT1uKHB1WzBdLDApLGk9bihwdVsxXSwxKTtmdW5jdGlvbiBuKHQsZSl7dmFyIGk9e30sbj0wLG89e30sYT0wO2lmKGR1KHQsZnVuY3Rpb24odCl7b1t0XT1sW3RdfSksZHUodCxmdW5jdGlvbih0KXtjKHUsdCkmJihpW3RdPW9bdF09dVt0XSksZChpLHQpJiZuKyssZChvLHQpJiZhKyt9KSxoW2VdKXJldHVybiBkKHUsdFsxXSk/b1t0WzJdXT1udWxsOmQodSx0WzJdKSYmKG9bdFsxXV09bnVsbCksbztpZigyIT09YSYmbil7aWYoMjw9bilyZXR1cm4gaTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIHM9dFtyXTtpZighYyhpLHMpJiZjKGwscykpe2lbc109bFtzXTticmVha319cmV0dXJuIGl9cmV0dXJuIG99ZnVuY3Rpb24gYyh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpfWZ1bmN0aW9uIGQodCxlKXtyZXR1cm4gbnVsbCE9dFtlXSYmImF1dG8iIT09dFtlXX1mdW5jdGlvbiBvKHQsZSxpKXtkdSh0LGZ1bmN0aW9uKHQpe2VbdF09aVt0XX0pfW8ocHVbMF0sbCxlKSxvKHB1WzFdLGwsaSl9ZnVuY3Rpb24gX3UodCl7cmV0dXJuIHd1KHt9LHQpfWZ1bmN0aW9uIHd1KGUsaSl7cmV0dXJuIGkmJmUmJmR1KGZ1LGZ1bmN0aW9uKHQpe2kuaGFzT3duUHJvcGVydHkodCkmJihlW3RdPWlbdF0pfSksZX12YXIgYnUsU3UsTXUsSXU9Wm8oKSxUdT1JbC5leHRlbmQoe3R5cGU6ImNvbXBvbmVudCIsaWQ6IiIsbmFtZToiIixtYWluVHlwZToiIixzdWJUeXBlOiIiLGNvbXBvbmVudEluZGV4OjAsZGVmYXVsdE9wdGlvbjpudWxsLGVjTW9kZWw6bnVsbCxkZXBlbmRlbnRNb2RlbHM6W10sdWlkOm51bGwsbGF5b3V0TW9kZTpudWxsLCRjb25zdHJ1Y3RvcjpmdW5jdGlvbih0LGUsaSxuKXtJbC5jYWxsKHRoaXMsdCxlLGksbiksdGhpcy51aWQ9Q2woImVjX2NwdF9tb2RlbCIpfSxpbml0OmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMubWVyZ2VEZWZhdWx0QW5kVGhlbWUodCxpKX0sbWVyZ2VEZWZhdWx0QW5kVGhlbWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmxheW91dE1vZGUsbj1pP191KHQpOnt9O20odCxlLmdldFRoZW1lKCkuZ2V0KHRoaXMubWFpblR5cGUpKSxtKHQsdGhpcy5nZXREZWZhdWx0T3B0aW9uKCkpLGkmJnh1KHQsbixpKX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCxlKXttKHRoaXMub3B0aW9uLHQsITApO3ZhciBpPXRoaXMubGF5b3V0TW9kZTtpJiZ4dSh0aGlzLm9wdGlvbix0LGkpfSxvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKHQsZSl7fSxnZXREZWZhdWx0T3B0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9SXUodGhpcyk7aWYoIXQuZGVmYXVsdE9wdGlvbil7Zm9yKHZhciBlPVtdLGk9dGhpcy5jb25zdHJ1Y3RvcjtpOyl7dmFyIG49aS5wcm90b3R5cGUuZGVmYXVsdE9wdGlvbjtuJiZlLnB1c2gobiksaT1pLnN1cGVyQ2xhc3N9Zm9yKHZhciBvPXt9LGE9ZS5sZW5ndGgtMTswPD1hO2EtLSlvPW0obyxlW2FdLCEwKTt0LmRlZmF1bHRPcHRpb249b31yZXR1cm4gdC5kZWZhdWx0T3B0aW9ufSxnZXRSZWZlcnJpbmdDb21wb25lbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVjTW9kZWwucXVlcnlDb21wb25lbnRzKHttYWluVHlwZTp0LGluZGV4OnRoaXMuZ2V0KHQrIkluZGV4IiwhMCksaWQ6dGhpcy5nZXQodCsiSWQiLCEwKX0pfX0pO2Z1bmN0aW9uIEF1KHQsZSl7cmV0dXJuIHRbZV18fCh0W2VdPXtwcmVkZWNlc3NvcjpbXSxzdWNjZXNzb3I6W119KSx0W2VdfWFhKFR1LHtyZWdpc3RlcldoZW5FeHRlbmQ6ITB9KSxTdT17fSwoYnU9VHUpLnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcj1mdW5jdGlvbih0LGUpe3Q9UW8odCksU3VbdC5tYWluXT1lfSxidS5kZXRlcm1pbmVTdWJUeXBlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS50eXBlO2lmKCFpKXt2YXIgbj1Rbyh0KS5tYWluO2J1Lmhhc1N1YlR5cGVzKHQpJiZTdVtuXSYmKGk9U3Vbbl0oZSkpfXJldHVybiBpfSxNdT1mdW5jdGlvbih0KXt2YXIgZT1bXTtFKFR1LmdldENsYXNzZXNCeU1haW5UeXBlKHQpLGZ1bmN0aW9uKHQpe2U9ZS5jb25jYXQodC5wcm90b3R5cGUuZGVwZW5kZW5jaWVzfHxbXSl9KSxlPU4oZSxmdW5jdGlvbih0KXtyZXR1cm4gUW8odCkubWFpbn0pLCJkYXRhc2V0IiE9PXQmJl8oZSwiZGF0YXNldCIpPD0wJiZlLnVuc2hpZnQoImRhdGFzZXQiKTtyZXR1cm4gZX0sVHUudG9wb2xvZ2ljYWxUcmF2ZWw9ZnVuY3Rpb24odCxlLGksbil7aWYodC5sZW5ndGgpe3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciBvPXt9LGE9W107cmV0dXJuIEUoZSxmdW5jdGlvbihpKXt2YXIgbj1BdShvLGkpLHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtyZXR1cm4gRSh0LGZ1bmN0aW9uKHQpezA8PV8oZSx0KSYmaS5wdXNoKHQpfSksaX0obi5vcmlnaW5hbERlcHM9TXUoaSksZSk7bi5lbnRyeUNvdW50PXQubGVuZ3RoLDA9PT1uLmVudHJ5Q291bnQmJmEucHVzaChpKSxFKHQsZnVuY3Rpb24odCl7XyhuLnByZWRlY2Vzc29yLHQpPDAmJm4ucHJlZGVjZXNzb3IucHVzaCh0KTt2YXIgZT1BdShvLHQpO18oZS5zdWNjZXNzb3IsdCk8MCYmZS5zdWNjZXNzb3IucHVzaChpKX0pfSkse2dyYXBoOm8sbm9FbnRyeUxpc3Q6YX19KGUpLGE9by5ncmFwaCxyPW8ubm9FbnRyeUxpc3Qscz17fTtmb3IoRSh0LGZ1bmN0aW9uKHQpe3NbdF09ITB9KTtyLmxlbmd0aDspe3ZhciBsPXIucG9wKCksdT1hW2xdLGg9ISFzW2xdO2gmJihpLmNhbGwobixsLHUub3JpZ2luYWxEZXBzLnNsaWNlKCkpLGRlbGV0ZSBzW2xdKSxFKHUuc3VjY2Vzc29yLGg/ZDpjKX1FKHMsZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNpcmNsZSBkZXBlbmRlbmN5IG1heSBleGlzdHMiKX0pfWZ1bmN0aW9uIGModCl7YVt0XS5lbnRyeUNvdW50LS0sMD09PWFbdF0uZW50cnlDb3VudCYmci5wdXNoKHQpfWZ1bmN0aW9uIGQodCl7c1t0XT0hMCxjKHQpfX0sYihUdSx7Z2V0Qm94TGF5b3V0UGFyYW1zOmZ1bmN0aW9uKCl7cmV0dXJue2xlZnQ6dGhpcy5nZXQoImxlZnQiKSx0b3A6dGhpcy5nZXQoInRvcCIpLHJpZ2h0OnRoaXMuZ2V0KCJyaWdodCIpLGJvdHRvbTp0aGlzLmdldCgiYm90dG9tIiksd2lkdGg6dGhpcy5nZXQoIndpZHRoIiksaGVpZ2h0OnRoaXMuZ2V0KCJoZWlnaHQiKX19fSk7dmFyIER1PSIiOyJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiYoRHU9bmF2aWdhdG9yLnBsYXRmb3JtfHwiIik7dmFyIEN1PXtjb2xvcjpbIiNjMjM1MzEiLCIjMmY0NTU0IiwiIzYxYTBhOCIsIiNkNDgyNjUiLCIjOTFjN2FlIiwiIzc0OWY4MyIsIiNjYTg2MjIiLCIjYmRhMjlhIiwiIzZlNzA3NCIsIiM1NDY1NzAiLCIjYzRjY2QzIl0sZ3JhZGllbnRDb2xvcjpbIiNmNmVmYTYiLCIjZDg4MjczIiwiI2JmNDQ0YyJdLHRleHRTdHlsZTp7Zm9udEZhbWlseTpEdS5tYXRjaCgvXldpbi8pPyJNaWNyb3NvZnQgWWFIZWkiOiJzYW5zLXNlcmlmIixmb250U2l6ZToxMixmb250U3R5bGU6Im5vcm1hbCIsZm9udFdlaWdodDoibm9ybWFsIn0sYmxlbmRNb2RlOm51bGwsYW5pbWF0aW9uOiJhdXRvIixhbmltYXRpb25EdXJhdGlvbjoxZTMsYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6MzAwLGFuaW1hdGlvbkVhc2luZzoiZXhwb25lbnRpYWxPdXQiLGFuaW1hdGlvbkVhc2luZ1VwZGF0ZToiY3ViaWNPdXQiLGFuaW1hdGlvblRocmVzaG9sZDoyZTMscHJvZ3Jlc3NpdmVUaHJlc2hvbGQ6M2UzLHByb2dyZXNzaXZlOjQwMCxob3ZlckxheWVyVGhyZXNob2xkOjNlMyx1c2VVVEM6ITF9LEx1PVpvKCk7dmFyIGt1PXtjbGVhckNvbG9yUGFsZXR0ZTpmdW5jdGlvbigpe0x1KHRoaXMpLmNvbG9ySWR4PTAsTHUodGhpcykuY29sb3JOYW1lTWFwPXt9fSxnZXRDb2xvckZyb21QYWxldHRlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1MdShlPWV8fHRoaXMpLG89bi5jb2xvcklkeHx8MCxhPW4uY29sb3JOYW1lTWFwPW4uY29sb3JOYW1lTWFwfHx7fTtpZihhLmhhc093blByb3BlcnR5KHQpKXJldHVybiBhW3RdO3ZhciByPUVvKHRoaXMuZ2V0KCJjb2xvciIsITApKSxzPXRoaXMuZ2V0KCJjb2xvckxheWVyIiwhMCksbD1udWxsIT1pJiZzP2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQubGVuZ3RoLG49MDtuPGk7bisrKWlmKHRbbl0ubGVuZ3RoPmUpcmV0dXJuIHRbbl07cmV0dXJuIHRbaS0xXX0ocyxpKTpyO2lmKChsPWx8fHIpJiZsLmxlbmd0aCl7dmFyIHU9bFtvXTtyZXR1cm4gdCYmKGFbdF09dSksbi5jb2xvcklkeD0obysxKSVsLmxlbmd0aCx1fX19LFB1PSJvcmlnaW5hbCIsTnU9ImFycmF5Um93cyIsT3U9Im9iamVjdFJvd3MiLEV1PSJrZXllZENvbHVtbnMiLHp1PSJ1bmtub3duIixSdT0idHlwZWRBcnJheSIsQnU9ImNvbHVtbiIsVnU9InJvdyI7ZnVuY3Rpb24gR3UodCl7dGhpcy5mcm9tRGF0YXNldD10LmZyb21EYXRhc2V0LHRoaXMuZGF0YT10LmRhdGF8fCh0LnNvdXJjZUZvcm1hdD09PUV1P3t9OltdKSx0aGlzLnNvdXJjZUZvcm1hdD10LnNvdXJjZUZvcm1hdHx8enUsdGhpcy5zZXJpZXNMYXlvdXRCeT10LnNlcmllc0xheW91dEJ5fHxCdSx0aGlzLmRpbWVuc2lvbnNEZWZpbmU9dC5kaW1lbnNpb25zRGVmaW5lLHRoaXMuZW5jb2RlRGVmaW5lPXQuZW5jb2RlRGVmaW5lJiZRKHQuZW5jb2RlRGVmaW5lKSx0aGlzLnN0YXJ0SW5kZXg9dC5zdGFydEluZGV4fHwwLHRoaXMuZGltZW5zaW9uc0RldGVjdENvdW50PXQuZGltZW5zaW9uc0RldGVjdENvdW50fUd1LnNlcmllc0RhdGFUb1NvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEd1KHtkYXRhOnQsc291cmNlRm9ybWF0OlYodCk/UnU6UHUsZnJvbURhdGFzZXQ6ITF9KX0saWEoR3UpO3ZhciBGdT17TXVzdDoxLE1pZ2h0OjIsTm90OjN9LFd1PVpvKCk7ZnVuY3Rpb24gSHUodCl7dmFyIGU9dC5vcHRpb24saT1lLmRhdGEsbj1WKGkpP1J1OlB1LG89ITEsYT1lLnNlcmllc0xheW91dEJ5LHI9ZS5zb3VyY2VIZWFkZXIscz1lLmRpbWVuc2lvbnMsbD1qdSh0KTtpZihsKXt2YXIgdT1sLm9wdGlvbjtpPXUuc291cmNlLG49V3UobCkuc291cmNlRm9ybWF0LG89ITAsYT1hfHx1LnNlcmllc0xheW91dEJ5LG51bGw9PXImJihyPXUuc291cmNlSGVhZGVyKSxzPXN8fHUuZGltZW5zaW9uc312YXIgaD1mdW5jdGlvbih0LGUsaSxuLG8pe2lmKCF0KXJldHVybntkaW1lbnNpb25zRGVmaW5lOlp1KG8pfTt2YXIgYSxyO2lmKGU9PT1OdSkiYXV0byI9PT1ufHxudWxsPT1uP1V1KGZ1bmN0aW9uKHQpe251bGwhPXQmJiItIiE9PXQmJih6KHQpP251bGw9PXImJihyPTEpOnI9MCl9LGksdCwxMCk6cj1uPzE6MCxvfHwxIT09cnx8KG89W10sVXUoZnVuY3Rpb24odCxlKXtvW2VdPW51bGwhPXQ/dDoiIn0saSx0KSksYT1vP28ubGVuZ3RoOmk9PT1WdT90Lmxlbmd0aDp0WzBdP3RbMF0ubGVuZ3RoOm51bGw7ZWxzZSBpZihlPT09T3Upbz1vfHxmdW5jdGlvbih0KXt2YXIgZSxpPTA7Zm9yKDtpPHQubGVuZ3RoJiYhKGU9dFtpKytdKTspO2lmKGUpe3ZhciBuPVtdO3JldHVybiBFKGUsZnVuY3Rpb24odCxlKXtuLnB1c2goZSl9KSxufX0odCk7ZWxzZSBpZihlPT09RXUpb3x8KG89W10sRSh0LGZ1bmN0aW9uKHQsZSl7by5wdXNoKGUpfSkpO2Vsc2UgaWYoZT09PVB1KXt2YXIgcz1Cbyh0WzBdKTthPWsocykmJnMubGVuZ3RofHwxfXJldHVybntzdGFydEluZGV4OnIsZGltZW5zaW9uc0RlZmluZTpadShvKSxkaW1lbnNpb25zRGV0ZWN0Q291bnQ6YX19KGksbixhLHIscyk7V3UodCkuc291cmNlPW5ldyBHdSh7ZGF0YTppLGZyb21EYXRhc2V0Om8sc2VyaWVzTGF5b3V0Qnk6YSxzb3VyY2VGb3JtYXQ6bixkaW1lbnNpb25zRGVmaW5lOmguZGltZW5zaW9uc0RlZmluZSxzdGFydEluZGV4Omguc3RhcnRJbmRleCxkaW1lbnNpb25zRGV0ZWN0Q291bnQ6aC5kaW1lbnNpb25zRGV0ZWN0Q291bnQsZW5jb2RlRGVmaW5lOmUuZW5jb2RlfSl9ZnVuY3Rpb24gWnUodCl7aWYodCl7dmFyIG49USgpO3JldHVybiBOKHQsZnVuY3Rpb24odCxlKXtpZihudWxsPT0odD1MKHt9LFIodCk/dDp7bmFtZTp0fSkpLm5hbWUpcmV0dXJuIHQ7dC5uYW1lKz0iIixudWxsPT10LmRpc3BsYXlOYW1lJiYodC5kaXNwbGF5TmFtZT10Lm5hbWUpO3ZhciBpPW4uZ2V0KHQubmFtZSk7cmV0dXJuIGk/dC5uYW1lKz0iLSIraS5jb3VudCsrOm4uc2V0KHQubmFtZSx7Y291bnQ6MX0pLHR9KX19ZnVuY3Rpb24gVXUodCxlLGksbil7aWYobnVsbD09biYmKG49MS8wKSxlPT09VnUpZm9yKHZhciBvPTA7bzxpLmxlbmd0aCYmbzxuO28rKyl0KGlbb10/aVtvXVswXTpudWxsLG8pO2Vsc2V7dmFyIGE9aVswXXx8W107Zm9yKG89MDtvPGEubGVuZ3RoJiZvPG47bysrKXQoYVtvXSxvKX19ZnVuY3Rpb24gWHUoaSx0LGUpe3ZhciBhPXt9LG49anUodCk7aWYoIW58fCFpKXJldHVybiBhO3ZhciByLG8scz1bXSxsPVtdLHU9dC5lY01vZGVsLGg9V3UodSkuZGF0YXNldE1hcCxjPW4udWlkKyJfIitlLnNlcmllc0xheW91dEJ5O0UoaT1pLnNsaWNlKCksZnVuY3Rpb24odCxlKXtSKHQpfHwoaVtlXT17bmFtZTp0fSksIm9yZGluYWwiPT09dC50eXBlJiZudWxsPT1yJiYobz1wKGlbcj1lXSkpLGFbdC5uYW1lXT1bXX0pO3ZhciBkPWguZ2V0KGMpfHxoLnNldChjLHtjYXRlZ29yeVdheURpbTpvLHZhbHVlV2F5RGltOjB9KTtmdW5jdGlvbiBmKHQsZSxpKXtmb3IodmFyIG49MDtuPGk7bisrKXQucHVzaChlK24pfWZ1bmN0aW9uIHAodCl7dmFyIGU9dC5kaW1zRGVmO3JldHVybiBlP2UubGVuZ3RoOjF9cmV0dXJuIEUoaSxmdW5jdGlvbih0LGUpe3ZhciBpPXQubmFtZSxuPXAodCk7aWYobnVsbD09cil7dmFyIG89ZC52YWx1ZVdheURpbTtmKGFbaV0sbyxuKSxmKGwsbyxuKSxkLnZhbHVlV2F5RGltKz1ufWVsc2UgaWYocj09PWUpZihhW2ldLDAsbiksZihzLDAsbik7ZWxzZXtvPWQuY2F0ZWdvcnlXYXlEaW07ZihhW2ldLG8sbiksZihsLG8sbiksZC5jYXRlZ29yeVdheURpbSs9bn19KSxzLmxlbmd0aCYmKGEuaXRlbU5hbWU9cyksbC5sZW5ndGgmJihhLnNlcmllc05hbWU9bCksYX1mdW5jdGlvbiBZdSh0LGwsdSl7dmFyIGU9e307aWYoIWp1KHQpKXJldHVybiBlO3ZhciBoLGM9bC5zb3VyY2VGb3JtYXQsZD1sLmRpbWVuc2lvbnNEZWZpbmU7YyE9PU91JiZjIT09RXV8fEUoZCxmdW5jdGlvbih0LGUpeyJuYW1lIj09PShSKHQpP3QubmFtZTp0KSYmKGg9ZSl9KTt2YXIgaT1mdW5jdGlvbigpe2Zvcih2YXIgdD17fSxlPXt9LGk9W10sbj0wLG89TWF0aC5taW4oNSx1KTtuPG87bisrKXt2YXIgYT1xdShsLmRhdGEsYyxsLnNlcmllc0xheW91dEJ5LGQsbC5zdGFydEluZGV4LG4pO2kucHVzaChhKTt2YXIgcj1hPT09RnUuTm90O2lmKHImJm51bGw9PXQudiYmbiE9PWgmJih0LnY9biksbnVsbCE9dC5uJiZ0Lm4hPT10LnYmJihyfHxpW3Qubl0hPT1GdS5Ob3QpfHwodC5uPW4pLHModCkmJmlbdC5uXSE9PUZ1Lk5vdClyZXR1cm4gdDtyfHwoYT09PUZ1Lk1pZ2h0JiZudWxsPT1lLnYmJm4hPT1oJiYoZS52PW4pLG51bGwhPWUubiYmZS5uIT09ZS52fHwoZS5uPW4pKX1mdW5jdGlvbiBzKHQpe3JldHVybiBudWxsIT10LnYmJm51bGwhPXQubn1yZXR1cm4gcyh0KT90OnMoZSk/ZTpudWxsfSgpO2lmKGkpe2UudmFsdWU9aS52O3ZhciBuPW51bGwhPWg/aDppLm47ZS5pdGVtTmFtZT1bbl0sZS5zZXJpZXNOYW1lPVtuXX1yZXR1cm4gZX1mdW5jdGlvbiBqdSh0KXt2YXIgZT10Lm9wdGlvbjtpZighZS5kYXRhKXJldHVybiB0LmVjTW9kZWwuZ2V0Q29tcG9uZW50KCJkYXRhc2V0IixlLmRhdGFzZXRJbmRleHx8MCl9ZnVuY3Rpb24gcXUodCxlLGksbixvLGEpe3ZhciByLHMsbDtpZihWKHQpKXJldHVybiBGdS5Ob3Q7aWYobil7dmFyIHU9blthXTtSKHUpPyhzPXUubmFtZSxsPXUudHlwZSk6eih1KSYmKHM9dSl9aWYobnVsbCE9bClyZXR1cm4ib3JkaW5hbCI9PT1sP0Z1Lk11c3Q6RnUuTm90O2lmKGU9PT1OdSlpZihpPT09VnUpe2Zvcih2YXIgaD10W2FdLGM9MDtjPChofHxbXSkubGVuZ3RoJiZjPDU7YysrKWlmKG51bGwhPShyPWcoaFtvK2NdKSkpcmV0dXJuIHJ9ZWxzZSBmb3IoYz0wO2M8dC5sZW5ndGgmJmM8NTtjKyspe3ZhciBkPXRbbytjXTtpZihkJiZudWxsIT0ocj1nKGRbYV0pKSlyZXR1cm4gcn1lbHNlIGlmKGU9PT1PdSl7aWYoIXMpcmV0dXJuIEZ1Lk5vdDtmb3IoYz0wO2M8dC5sZW5ndGgmJmM8NTtjKyspe2lmKChmPXRbY10pJiZudWxsIT0ocj1nKGZbc10pKSlyZXR1cm4gcn19ZWxzZSBpZihlPT09RXUpe2lmKCFzKXJldHVybiBGdS5Ob3Q7aWYoIShoPXRbc10pfHxWKGgpKXJldHVybiBGdS5Ob3Q7Zm9yKGM9MDtjPGgubGVuZ3RoJiZjPDU7YysrKWlmKG51bGwhPShyPWcoaFtjXSkpKXJldHVybiByfWVsc2UgaWYoZT09PVB1KWZvcihjPTA7Yzx0Lmxlbmd0aCYmYzw1O2MrKyl7dmFyIGYscD1CbyhmPXRbY10pO2lmKCFrKHApKXJldHVybiBGdS5Ob3Q7aWYobnVsbCE9KHI9ZyhwW2FdKSkpcmV0dXJuIHJ9ZnVuY3Rpb24gZyh0KXt2YXIgZT16KHQpO3JldHVybiBudWxsIT10JiZpc0Zpbml0ZSh0KSYmIiIhPT10P2U/RnUuTWlnaHQ6RnUuTm90OmUmJiItIiE9PXQ/RnUuTXVzdDp2b2lkIDB9cmV0dXJuIEZ1Lk5vdH12YXIgS3U9IlwwX2VjX2lubmVyIiwkdT1JbC5leHRlbmQoe2luaXQ6ZnVuY3Rpb24odCxlLGksbil7aT1pfHx7fSx0aGlzLm9wdGlvbj1udWxsLHRoaXMuX3RoZW1lPW5ldyBJbChpKSx0aGlzLl9vcHRpb25NYW5hZ2VyPW59LHNldE9wdGlvbjpmdW5jdGlvbih0LGUpe1koIShLdSBpbiB0KSwicGxlYXNlIHVzZSBjaGFydC5nZXRPcHRpb24oKSIpLHRoaXMuX29wdGlvbk1hbmFnZXIuc2V0T3B0aW9uKHQsZSksdGhpcy5yZXNldE9wdGlvbihudWxsKX0scmVzZXRPcHRpb246ZnVuY3Rpb24odCl7dmFyIGU9ITEsaT10aGlzLl9vcHRpb25NYW5hZ2VyO2lmKCF0fHwicmVjcmVhdGUiPT09dCl7dmFyIG49aS5tb3VudE9wdGlvbigicmVjcmVhdGUiPT09dCk7dGhpcy5vcHRpb24mJiJyZWNyZWF0ZSIhPT10Pyh0aGlzLnJlc3RvcmVEYXRhKCksdGhpcy5tZXJnZU9wdGlvbihuKSk6ZnVuY3Rpb24odCl7dD10LHRoaXMub3B0aW9uPXt9LHRoaXMub3B0aW9uW0t1XT0xLHRoaXMuX2NvbXBvbmVudHNNYXA9USh7c2VyaWVzOltdfSksdGhpcy5fc2VyaWVzSW5kaWNlcyx0aGlzLl9zZXJpZXNJbmRpY2VzTWFwLGZ1bmN0aW9uKGksdCl7dmFyIG49aS5jb2xvciYmIWkuY29sb3JMYXllcjtFKHQsZnVuY3Rpb24odCxlKXsiY29sb3JMYXllciI9PT1lJiZufHxUdS5oYXNDbGFzcyhlKXx8KCJvYmplY3QiPT10eXBlb2YgdD9pW2VdPWlbZV0/bShpW2VdLHQsITEpOkQodCk6bnVsbD09aVtlXSYmKGlbZV09dCkpfSl9KHQsdGhpcy5fdGhlbWUub3B0aW9uKSxtKHQsQ3UsITEpLHRoaXMubWVyZ2VPcHRpb24odCl9LmNhbGwodGhpcyxuKSxlPSEwfWlmKCJ0aW1lbGluZSIhPT10JiYibWVkaWEiIT09dHx8dGhpcy5yZXN0b3JlRGF0YSgpLCF0fHwicmVjcmVhdGUiPT09dHx8InRpbWVsaW5lIj09PXQpe3ZhciBvPWkuZ2V0VGltZWxpbmVPcHRpb24odGhpcyk7byYmKHRoaXMubWVyZ2VPcHRpb24obyksZT0hMCl9aWYoIXR8fCJyZWNyZWF0ZSI9PT10fHwibWVkaWEiPT09dCl7dmFyIGE9aS5nZXRNZWRpYU9wdGlvbih0aGlzLHRoaXMuX2FwaSk7YS5sZW5ndGgmJkUoYSxmdW5jdGlvbih0KXt0aGlzLm1lcmdlT3B0aW9uKHQsZT0hMCl9LHRoaXMpfXJldHVybiBlfSxtZXJnZU9wdGlvbjpmdW5jdGlvbihuKXt2YXIgbD10aGlzLm9wdGlvbix1PXRoaXMuX2NvbXBvbmVudHNNYXAsaT1bXTshZnVuY3Rpb24odCl7V3UodCkuZGF0YXNldE1hcD1RKCl9KHRoaXMpLEUobixmdW5jdGlvbih0LGUpe251bGwhPXQmJihUdS5oYXNDbGFzcyhlKT9lJiZpLnB1c2goZSk6bFtlXT1udWxsPT1sW2VdP0QodCk6bShsW2VdLHQsITApKX0pLFR1LnRvcG9sb2dpY2FsVHJhdmVsKGksVHUuZ2V0QWxsQ2xhc3NNYWluVHlwZXMoKSxmdW5jdGlvbihyLHQpe3ZhciBlPUVvKG5bcl0pLGk9Vm8odS5nZXQociksZSk7R28oaSksRShpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5vcHRpb247UihpKSYmKHQua2V5SW5mby5tYWluVHlwZT1yLHQua2V5SW5mby5zdWJUeXBlPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gZS50eXBlP2UudHlwZTppP2kuc3ViVHlwZTpUdS5kZXRlcm1pbmVTdWJUeXBlKHQsZSl9KHIsaSx0LmV4aXN0KSl9KTt2YXIgcz1mdW5jdGlvbihlLHQpe2sodCl8fCh0PXQ/W3RdOltdKTt2YXIgaT17fTtyZXR1cm4gRSh0LGZ1bmN0aW9uKHQpe2lbdF09KGUuZ2V0KHQpfHxbXSkuc2xpY2UoKX0pLGl9KHUsdCk7bFtyXT1bXSx1LnNldChyLFtdKSxFKGksZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4aXN0LG49dC5vcHRpb247aWYoWShSKG4pfHxpLCJFbXB0eSBjb21wb25lbnQgZGVmaW5pdGlvbiIpLG4pe3ZhciBvPVR1LmdldENsYXNzKHIsdC5rZXlJbmZvLnN1YlR5cGUsITApO2lmKGkmJmkuY29uc3RydWN0b3I9PT1vKWkubmFtZT10LmtleUluZm8ubmFtZSxpLm1lcmdlT3B0aW9uKG4sdGhpcyksaS5vcHRpb25VcGRhdGVkKG4sITEpO2Vsc2V7dmFyIGE9TCh7ZGVwZW5kZW50TW9kZWxzOnMsY29tcG9uZW50SW5kZXg6ZX0sdC5rZXlJbmZvKTtMKGk9bmV3IG8obix0aGlzLHRoaXMsYSksYSksaS5pbml0KG4sdGhpcyx0aGlzLGEpLGkub3B0aW9uVXBkYXRlZChudWxsLCEwKX19ZWxzZSBpLm1lcmdlT3B0aW9uKHt9LHRoaXMpLGkub3B0aW9uVXBkYXRlZCh7fSwhMSk7dS5nZXQocilbZV09aSxsW3JdW2VdPWkub3B0aW9ufSx0aGlzKSwic2VyaWVzIj09PXImJkp1KHRoaXMsdS5nZXQoInNlcmllcyIpKX0sdGhpcyksdGhpcy5fc2VyaWVzSW5kaWNlc01hcD1RKHRoaXMuX3Nlcmllc0luZGljZXM9dGhpcy5fc2VyaWVzSW5kaWNlc3x8W10pfSxnZXRPcHRpb246ZnVuY3Rpb24oKXt2YXIgbj1EKHRoaXMub3B0aW9uKTtyZXR1cm4gRShuLGZ1bmN0aW9uKHQsZSl7aWYoVHUuaGFzQ2xhc3MoZSkpe2Zvcih2YXIgaT0odD1Fbyh0KSkubGVuZ3RoLTE7MDw9aTtpLS0pV28odFtpXSkmJnQuc3BsaWNlKGksMSk7bltlXT10fX0pLGRlbGV0ZSBuW0t1XSxufSxnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aGVtZX0sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fY29tcG9uZW50c01hcC5nZXQodCk7aWYoaSlyZXR1cm4gaVtlfHwwXX0scXVlcnlDb21wb25lbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWFpblR5cGU7aWYoIWUpcmV0dXJuW107dmFyIGksbj10LmluZGV4LG89dC5pZCxhPXQubmFtZSxyPXRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KGUpO2lmKCFyfHwhci5sZW5ndGgpcmV0dXJuW107aWYobnVsbCE9bilrKG4pfHwobj1bbl0pLGk9TShOKG4sZnVuY3Rpb24odCl7cmV0dXJuIHJbdF19KSxmdW5jdGlvbih0KXtyZXR1cm4hIXR9KTtlbHNlIGlmKG51bGwhPW8pe3ZhciBzPWsobyk7aT1NKHIsZnVuY3Rpb24odCl7cmV0dXJuIHMmJjA8PV8obyx0LmlkKXx8IXMmJnQuaWQ9PT1vfSl9ZWxzZSBpZihudWxsIT1hKXt2YXIgbD1rKGEpO2k9TShyLGZ1bmN0aW9uKHQpe3JldHVybiBsJiYwPD1fKGEsdC5uYW1lKXx8IWwmJnQubmFtZT09PWF9KX1lbHNlIGk9ci5zbGljZSgpO3JldHVybiBRdShpLHQpfSxmaW5kQ29tcG9uZW50czpmdW5jdGlvbih0KXt2YXIgZSxpLG4sbyxhLHI9dC5xdWVyeSxzPXQubWFpblR5cGUsbD0oaT1zKyJJbmRleCIsbj1zKyJJZCIsbz1zKyJOYW1lIiwhKGU9cil8fG51bGw9PWVbaV0mJm51bGw9PWVbbl0mJm51bGw9PWVbb10/bnVsbDp7bWFpblR5cGU6cyxpbmRleDplW2ldLGlkOmVbbl0sbmFtZTplW29dfSksdT1sP3RoaXMucXVlcnlDb21wb25lbnRzKGwpOnRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KHMpO3JldHVybiBhPVF1KHUsdCksdC5maWx0ZXI/TShhLHQuZmlsdGVyKTphfSxlYWNoQ29tcG9uZW50OmZ1bmN0aW9uKHQsbixvKXt2YXIgZT10aGlzLl9jb21wb25lbnRzTWFwO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KW89bixuPXQsZS5lYWNoKGZ1bmN0aW9uKHQsaSl7RSh0LGZ1bmN0aW9uKHQsZSl7bi5jYWxsKG8saSx0LGUpfSl9KTtlbHNlIGlmKHoodCkpRShlLmdldCh0KSxuLG8pO2Vsc2UgaWYoUih0KSl7RSh0aGlzLmZpbmRDb21wb25lbnRzKHQpLG4sbyl9fSxnZXRTZXJpZXNCeU5hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIE0odGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWU9PT1lfSl9LGdldFNlcmllc0J5SW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKVt0XX0sZ2V0U2VyaWVzQnlUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBNKHRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKSxmdW5jdGlvbih0KXtyZXR1cm4gdC5zdWJUeXBlPT09ZX0pfSxnZXRTZXJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpLnNsaWNlKCl9LGdldFNlcmllc0NvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKS5sZW5ndGh9LGVhY2hTZXJpZXM6ZnVuY3Rpb24oaSxuKXtFKHRoaXMuX3Nlcmllc0luZGljZXMsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpW3RdO2kuY2FsbChuLGUsdCl9LHRoaXMpfSxlYWNoUmF3U2VyaWVzOmZ1bmN0aW9uKHQsZSl7RSh0aGlzLl9jb21wb25lbnRzTWFwLmdldCgic2VyaWVzIiksdCxlKX0sZWFjaFNlcmllc0J5VHlwZTpmdW5jdGlvbihpLG4sbyl7RSh0aGlzLl9zZXJpZXNJbmRpY2VzLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKVt0XTtlLnN1YlR5cGU9PT1pJiZuLmNhbGwobyxlLHQpfSx0aGlzKX0sZWFjaFJhd1Nlcmllc0J5VHlwZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIEUodGhpcy5nZXRTZXJpZXNCeVR5cGUodCksZSxpKX0saXNTZXJpZXNGaWx0ZXJlZDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dGhpcy5fc2VyaWVzSW5kaWNlc01hcC5nZXQodC5jb21wb25lbnRJbmRleCl9LGdldEN1cnJlbnRTZXJpZXNJbmRpY2VzOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX3Nlcmllc0luZGljZXN8fFtdKS5zbGljZSgpfSxmaWx0ZXJTZXJpZXM6ZnVuY3Rpb24odCxlKXt2YXIgaT1NKHRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKSx0LGUpO0p1KHRoaXMsaSl9LHJlc3RvcmVEYXRhOmZ1bmN0aW9uKGkpe3ZhciBuPXRoaXMuX2NvbXBvbmVudHNNYXA7SnUodGhpcyxuLmdldCgic2VyaWVzIikpO3ZhciBvPVtdO24uZWFjaChmdW5jdGlvbih0LGUpe28ucHVzaChlKX0pLFR1LnRvcG9sb2dpY2FsVHJhdmVsKG8sVHUuZ2V0QWxsQ2xhc3NNYWluVHlwZXMoKSxmdW5jdGlvbihlLHQpe0Uobi5nZXQoZSksZnVuY3Rpb24odCl7InNlcmllcyI9PT1lJiZmdW5jdGlvbih0LGUpe2lmKGUpe3ZhciBpPWUuc2VpcmVzSW5kZXgsbj1lLnNlcmllc0lkLG89ZS5zZXJpZXNOYW1lO3JldHVybiBudWxsIT1pJiZ0LmNvbXBvbmVudEluZGV4IT09aXx8bnVsbCE9biYmdC5pZCE9PW58fG51bGwhPW8mJnQubmFtZSE9PW99fSh0LGkpfHx0LnJlc3RvcmVEYXRhKCl9KX0pfX0pO2Z1bmN0aW9uIEp1KHQsZSl7dC5fc2VyaWVzSW5kaWNlc01hcD1RKHQuX3Nlcmllc0luZGljZXM9TihlLGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbXBvbmVudEluZGV4fSl8fFtdKX1mdW5jdGlvbiBRdSh0LGUpe3JldHVybiBlLmhhc093blByb3BlcnR5KCJzdWJUeXBlIik/TSh0LGZ1bmN0aW9uKHQpe3JldHVybiB0LnN1YlR5cGU9PT1lLnN1YlR5cGV9KTp0fWIoJHUsa3UpO3ZhciB0aD1bImdldERvbSIsImdldFpyIiwiZ2V0V2lkdGgiLCJnZXRIZWlnaHQiLCJnZXREZXZpY2VQaXhlbFJhdGlvIiwiZGlzcGF0Y2hBY3Rpb24iLCJpc0Rpc3Bvc2VkIiwib24iLCJvZmYiLCJnZXREYXRhVVJMIiwiZ2V0Q29ubmVjdGVkRGF0YVVSTCIsImdldE1vZGVsIiwiZ2V0T3B0aW9uIiwiZ2V0Vmlld09mQ29tcG9uZW50TW9kZWwiLCJnZXRWaWV3T2ZTZXJpZXNNb2RlbCJdO2Z1bmN0aW9uIGVoKGUpe0UodGgsZnVuY3Rpb24odCl7dGhpc1t0XT1BKGVbdF0sZSl9LHRoaXMpfXZhciBpaD17fTtmdW5jdGlvbiBuaCgpe3RoaXMuX2Nvb3JkaW5hdGVTeXN0ZW1zPVtdfW5oLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bmgsY3JlYXRlOmZ1bmN0aW9uKG4sbyl7dmFyIGE9W107RShpaCxmdW5jdGlvbih0LGUpe3ZhciBpPXQuY3JlYXRlKG4sbyk7YT1hLmNvbmNhdChpfHxbXSl9KSx0aGlzLl9jb29yZGluYXRlU3lzdGVtcz1hfSx1cGRhdGU6ZnVuY3Rpb24oZSxpKXtFKHRoaXMuX2Nvb3JkaW5hdGVTeXN0ZW1zLGZ1bmN0aW9uKHQpe3QudXBkYXRlJiZ0LnVwZGF0ZShlLGkpfSl9LGdldENvb3JkaW5hdGVTeXN0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVTeXN0ZW1zLnNsaWNlKCl9fSxuaC5yZWdpc3Rlcj1mdW5jdGlvbih0LGUpe2loW3RdPWV9LG5oLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gaWhbdF19O3ZhciBvaD1FLGFoPUQscmg9TixzaD1tLGxoPS9eKG1pbnxtYXgpPyguKykkLztmdW5jdGlvbiB1aCh0KXt0aGlzLl9hcGk9dCx0aGlzLl90aW1lbGluZU9wdGlvbnM9W10sdGhpcy5fbWVkaWFMaXN0PVtdLHRoaXMuX21lZGlhRGVmYXVsdCx0aGlzLl9jdXJyZW50TWVkaWFJbmRpY2VzPVtdLHRoaXMuX29wdGlvbkJhY2t1cCx0aGlzLl9uZXdCYXNlT3B0aW9ufWZ1bmN0aW9uIGhoKHQsZSxpKXt2YXIgYT17d2lkdGg6ZSxoZWlnaHQ6aSxhc3BlY3RyYXRpbzplL2l9LHI9ITA7cmV0dXJuIEUodCxmdW5jdGlvbih0LGUpe3ZhciBpPWUubWF0Y2gobGgpO2lmKGkmJmlbMV0mJmlbMl0pe3ZhciBuPWlbMV0sbz1pWzJdLnRvTG93ZXJDYXNlKCk7IWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4ibWluIj09PWk/ZTw9dDoibWF4Ij09PWk/dDw9ZTp0PT09ZX0oYVtvXSx0LG4pJiYocj0hMSl9fSkscn11aC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnVoLHNldE9wdGlvbjpmdW5jdGlvbih0LGUpe3QmJkUoRW8odC5zZXJpZXMpLGZ1bmN0aW9uKHQpe3QmJnQuZGF0YSYmVih0LmRhdGEpJiZLKHQuZGF0YSl9KSx0PWFoKHQpO3ZhciBpPXRoaXMuX29wdGlvbkJhY2t1cCxuPWZ1bmN0aW9uKHQsaSxuKXt2YXIgZSxvLGE9W10scj1bXSxzPXQudGltZWxpbmU7dC5iYXNlT3B0aW9uJiYobz10LmJhc2VPcHRpb24pOyhzfHx0Lm9wdGlvbnMpJiYobz1vfHx7fSxhPSh0Lm9wdGlvbnN8fFtdKS5zbGljZSgpKTtpZih0Lm1lZGlhKXtvPW98fHt9O3ZhciBsPXQubWVkaWE7b2gobCxmdW5jdGlvbih0KXt0JiZ0Lm9wdGlvbiYmKHQucXVlcnk/ci5wdXNoKHQpOmU9ZXx8dCl9KX1vPW98fHQ7by50aW1lbGluZXx8KG8udGltZWxpbmU9cyk7cmV0dXJuIG9oKFtvXS5jb25jYXQoYSkuY29uY2F0KE4ocixmdW5jdGlvbih0KXtyZXR1cm4gdC5vcHRpb259KSksZnVuY3Rpb24oZSl7b2goaSxmdW5jdGlvbih0KXt0KGUsbil9KX0pLHtiYXNlT3B0aW9uOm8sdGltZWxpbmVPcHRpb25zOmEsbWVkaWFEZWZhdWx0OmUsbWVkaWFMaXN0OnJ9fS5jYWxsKHRoaXMsdCxlLCFpKTt0aGlzLl9uZXdCYXNlT3B0aW9uPW4uYmFzZU9wdGlvbixpPyhmdW5jdGlvbihvLHQpe29oKHQ9dHx8e30sZnVuY3Rpb24odCxlKXtpZihudWxsIT10KXt2YXIgaT1vW2VdO2lmKFR1Lmhhc0NsYXNzKGUpKXt0PUVvKHQpO3ZhciBuPVZvKGk9RW8oaSksdCk7b1tlXT1yaChuLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9wdGlvbiYmdC5leGlzdD9zaCh0LmV4aXN0LHQub3B0aW9uLCEwKTp0LmV4aXN0fHx0Lm9wdGlvbn0pfWVsc2Ugb1tlXT1zaChpLHQsITApfX0pfShpLmJhc2VPcHRpb24sbi5iYXNlT3B0aW9uKSxuLnRpbWVsaW5lT3B0aW9ucy5sZW5ndGgmJihpLnRpbWVsaW5lT3B0aW9ucz1uLnRpbWVsaW5lT3B0aW9ucyksbi5tZWRpYUxpc3QubGVuZ3RoJiYoaS5tZWRpYUxpc3Q9bi5tZWRpYUxpc3QpLG4ubWVkaWFEZWZhdWx0JiYoaS5tZWRpYURlZmF1bHQ9bi5tZWRpYURlZmF1bHQpKTp0aGlzLl9vcHRpb25CYWNrdXA9bn0sbW91bnRPcHRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fb3B0aW9uQmFja3VwO3JldHVybiB0aGlzLl90aW1lbGluZU9wdGlvbnM9cmgoZS50aW1lbGluZU9wdGlvbnMsYWgpLHRoaXMuX21lZGlhTGlzdD1yaChlLm1lZGlhTGlzdCxhaCksdGhpcy5fbWVkaWFEZWZhdWx0PWFoKGUubWVkaWFEZWZhdWx0KSx0aGlzLl9jdXJyZW50TWVkaWFJbmRpY2VzPVtdLGFoKHQ/ZS5iYXNlT3B0aW9uOnRoaXMuX25ld0Jhc2VPcHRpb24pfSxnZXRUaW1lbGluZU9wdGlvbjpmdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMuX3RpbWVsaW5lT3B0aW9ucztpZihpLmxlbmd0aCl7dmFyIG49dC5nZXRDb21wb25lbnQoInRpbWVsaW5lIik7biYmKGU9YWgoaVtuLmdldEN1cnJlbnRJbmRleCgpXSwhMCkpfXJldHVybiBlfSxnZXRNZWRpYU9wdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9hcGkuZ2V0V2lkdGgoKSxpPXRoaXMuX2FwaS5nZXRIZWlnaHQoKSxuPXRoaXMuX21lZGlhTGlzdCxvPXRoaXMuX21lZGlhRGVmYXVsdCxhPVtdLHI9W107aWYoIW4ubGVuZ3RoJiYhbylyZXR1cm4gcjtmb3IodmFyIHM9MCxsPW4ubGVuZ3RoO3M8bDtzKyspaGgobltzXS5xdWVyeSxlLGkpJiZhLnB1c2gocyk7cmV0dXJuIWEubGVuZ3RoJiZvJiYoYT1bLTFdKSxhLmxlbmd0aCYmIWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuam9pbigiLCIpPT09ZS5qb2luKCIsIil9KGEsdGhpcy5fY3VycmVudE1lZGlhSW5kaWNlcykmJihyPXJoKGEsZnVuY3Rpb24odCl7cmV0dXJuIGFoKC0xPT09dD9vLm9wdGlvbjpuW3RdLm9wdGlvbil9KSksdGhpcy5fY3VycmVudE1lZGlhSW5kaWNlcz1hLHJ9fTt2YXIgY2g9RSxkaD1SLGZoPVsiYXJlYVN0eWxlIiwibGluZVN0eWxlIiwibm9kZVN0eWxlIiwibGlua1N0eWxlIiwiY2hvcmRTdHlsZSIsImxhYmVsIiwibGFiZWxMaW5lIl07ZnVuY3Rpb24gcGgodCl7dmFyIGU9dCYmdC5pdGVtU3R5bGU7aWYoZSlmb3IodmFyIGk9MCxuPWZoLmxlbmd0aDtpPG47aSsrKXt2YXIgbz1maFtpXSxhPWUubm9ybWFsLHI9ZS5lbXBoYXNpczthJiZhW29dJiYodFtvXT10W29dfHx7fSx0W29dLm5vcm1hbD9tKHRbb10ubm9ybWFsLGFbb10pOnRbb10ubm9ybWFsPWFbb10sYVtvXT1udWxsKSxyJiZyW29dJiYodFtvXT10W29dfHx7fSx0W29dLmVtcGhhc2lzP20odFtvXS5lbXBoYXNpcyxyW29dKTp0W29dLmVtcGhhc2lzPXJbb10scltvXT1udWxsKX19ZnVuY3Rpb24gZ2godCxlLGkpe2lmKHQmJnRbZV0mJih0W2VdLm5vcm1hbHx8dFtlXS5lbXBoYXNpcykpe3ZhciBuPXRbZV0ubm9ybWFsLG89dFtlXS5lbXBoYXNpcztuJiYoaT8odFtlXS5ub3JtYWw9dFtlXS5lbXBoYXNpcz1udWxsLEModFtlXSxuKSk6dFtlXT1uKSxvJiYodC5lbXBoYXNpcz10LmVtcGhhc2lzfHx7fSx0LmVtcGhhc2lzW2VdPW8pfX1mdW5jdGlvbiBtaCh0KXtnaCh0LCJpdGVtU3R5bGUiKSxnaCh0LCJsaW5lU3R5bGUiKSxnaCh0LCJhcmVhU3R5bGUiKSxnaCh0LCJsYWJlbCIpLGdoKHQsImxhYmVsTGluZSIpLGdoKHQsInVwcGVyTGFiZWwiKSxnaCh0LCJlZGdlTGFiZWwiKX1mdW5jdGlvbiB2aCh0LGUpe3ZhciBpPWRoKHQpJiZ0W2VdLG49ZGgoaSkmJmkudGV4dFN0eWxlO2lmKG4pZm9yKHZhciBvPTAsYT1Sby5sZW5ndGg7bzxhO28rKyl7ZT1Sb1tvXTtuLmhhc093blByb3BlcnR5KGUpJiYoaVtlXT1uW2VdKX19ZnVuY3Rpb24geWgodCl7dCYmKG1oKHQpLHZoKHQsImxhYmVsIiksdC5lbXBoYXNpcyYmdmgodC5lbXBoYXNpcywibGFiZWwiKSl9ZnVuY3Rpb24geGgodCl7cmV0dXJuIGsodCk/dDp0P1t0XTpbXX1mdW5jdGlvbiBfaCh0KXtyZXR1cm4oayh0KT90WzBdOnQpfHx7fX1mdW5jdGlvbiB3aChlLHQpe2NoKHhoKGUuc2VyaWVzKSxmdW5jdGlvbih0KXtkaCh0KSYmZnVuY3Rpb24odCl7aWYoZGgodCkpe3BoKHQpLG1oKHQpLHZoKHQsImxhYmVsIiksdmgodCwidXBwZXJMYWJlbCIpLHZoKHQsImVkZ2VMYWJlbCIpLHQuZW1waGFzaXMmJih2aCh0LmVtcGhhc2lzLCJsYWJlbCIpLHZoKHQuZW1waGFzaXMsInVwcGVyTGFiZWwiKSx2aCh0LmVtcGhhc2lzLCJlZGdlTGFiZWwiKSksKGk9dC5tYXJrUG9pbnQpJiYocGgoaSkseWgoaSkpLChuPXQubWFya0xpbmUpJiYocGgobikseWgobikpO3ZhciBlPXQubWFya0FyZWE7ZSYmeWgoZSk7dmFyIGksbixvPXQuZGF0YTtpZigiZ3JhcGgiPT09dC50eXBlKXtvPW98fHQubm9kZXM7dmFyIGE9dC5saW5rc3x8dC5lZGdlcztpZihhJiYhVihhKSlmb3IodmFyIHI9MDtyPGEubGVuZ3RoO3IrKyl5aChhW3JdKTtFKHQuY2F0ZWdvcmllcyxmdW5jdGlvbih0KXttaCh0KX0pfWlmKG8mJiFWKG8pKWZvcihyPTA7cjxvLmxlbmd0aDtyKyspeWgob1tyXSk7aWYoKGk9dC5tYXJrUG9pbnQpJiZpLmRhdGEpe3ZhciBzPWkuZGF0YTtmb3Iocj0wO3I8cy5sZW5ndGg7cisrKXloKHNbcl0pfWlmKChuPXQubWFya0xpbmUpJiZuLmRhdGEpe3ZhciBsPW4uZGF0YTtmb3Iocj0wO3I8bC5sZW5ndGg7cisrKWsobFtyXSk/KHloKGxbcl1bMF0pLHloKGxbcl1bMV0pKTp5aChsW3JdKX0iZ2F1Z2UiPT09dC50eXBlPyh2aCh0LCJheGlzTGFiZWwiKSx2aCh0LCJ0aXRsZSIpLHZoKHQsImRldGFpbCIpKToidHJlZW1hcCI9PT10LnR5cGU/KGdoKHQuYnJlYWRjcnVtYiwiaXRlbVN0eWxlIiksRSh0LmxldmVscyxmdW5jdGlvbih0KXttaCh0KX0pKToidHJlZSI9PT10LnR5cGUmJm1oKHQubGVhdmVzKX19KHQpfSk7dmFyIGk9WyJ4QXhpcyIsInlBeGlzIiwicmFkaXVzQXhpcyIsImFuZ2xlQXhpcyIsInNpbmdsZUF4aXMiLCJwYXJhbGxlbEF4aXMiLCJyYWRhciJdO3QmJmkucHVzaCgidmFsdWVBeGlzIiwiY2F0ZWdvcnlBeGlzIiwibG9nQXhpcyIsInRpbWVBeGlzIiksY2goaSxmdW5jdGlvbih0KXtjaCh4aChlW3RdKSxmdW5jdGlvbih0KXt0JiYodmgodCwiYXhpc0xhYmVsIiksdmgodC5heGlzUG9pbnRlciwibGFiZWwiKSl9KX0pLGNoKHhoKGUucGFyYWxsZWwpLGZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQucGFyYWxsZWxBeGlzRGVmYXVsdDt2aChlLCJheGlzTGFiZWwiKSx2aChlJiZlLmF4aXNQb2ludGVyLCJsYWJlbCIpfSksY2goeGgoZS5jYWxlbmRhciksZnVuY3Rpb24odCl7Z2godCwiaXRlbVN0eWxlIiksdmgodCwiZGF5TGFiZWwiKSx2aCh0LCJtb250aExhYmVsIiksdmgodCwieWVhckxhYmVsIil9KSxjaCh4aChlLnJhZGFyKSxmdW5jdGlvbih0KXt2aCh0LCJuYW1lIil9KSxjaCh4aChlLmdlbyksZnVuY3Rpb24odCl7ZGgodCkmJih5aCh0KSxjaCh4aCh0LnJlZ2lvbnMpLGZ1bmN0aW9uKHQpe3loKHQpfSkpfSksY2goeGgoZS50aW1lbGluZSksZnVuY3Rpb24odCl7eWgodCksZ2godCwibGFiZWwiKSxnaCh0LCJpdGVtU3R5bGUiKSxnaCh0LCJjb250cm9sU3R5bGUiLCEwKTt2YXIgZT10LmRhdGE7ayhlKSYmRShlLGZ1bmN0aW9uKHQpe1IodCkmJihnaCh0LCJsYWJlbCIpLGdoKHQsIml0ZW1TdHlsZSIpKX0pfSksY2goeGgoZS50b29sYm94KSxmdW5jdGlvbih0KXtnaCh0LCJpY29uU3R5bGUiKSxjaCh0LmZlYXR1cmUsZnVuY3Rpb24odCl7Z2godCwiaWNvblN0eWxlIil9KX0pLHZoKF9oKGUuYXhpc1BvaW50ZXIpLCJsYWJlbCIpLHZoKF9oKGUudG9vbHRpcCkuYXhpc1BvaW50ZXIsImxhYmVsIil9ZnVuY3Rpb24gYmgoZSl7RShTaCxmdW5jdGlvbih0KXt0WzBdaW4gZSYmISh0WzFdaW4gZSkmJihlW3RbMV1dPWVbdFswXV0pfSl9dmFyIFNoPVtbIngiLCJsZWZ0Il0sWyJ5IiwidG9wIl0sWyJ4MiIsInJpZ2h0Il0sWyJ5MiIsImJvdHRvbSJdXSxNaD1bImdyaWQiLCJnZW8iLCJwYXJhbGxlbCIsImxlZ2VuZCIsInRvb2xib3giLCJ0aXRsZSIsInZpc3VhbE1hcCIsImRhdGFab29tIiwidGltZWxpbmUiXSxJaD1mdW5jdGlvbihpLHQpe3doKGksdCksaS5zZXJpZXM9RW8oaS5zZXJpZXMpLEUoaS5zZXJpZXMsZnVuY3Rpb24odCl7aWYoUih0KSl7dmFyIGU9dC50eXBlO2lmKCJsaW5lIj09PWUpbnVsbCE9dC5jbGlwT3ZlcmZsb3cmJih0LmNsaXA9dC5jbGlwT3ZlcmZsb3cpO2Vsc2UgaWYoInBpZSI9PT1lfHwiZ2F1Z2UiPT09ZSludWxsIT10LmNsb2NrV2lzZSYmKHQuY2xvY2t3aXNlPXQuY2xvY2tXaXNlKTtlbHNlIGlmKCJnYXVnZSI9PT1lKXt2YXIgaT1mdW5jdGlvbih0LGUpe2U9ZS5zcGxpdCgiLCIpO2Zvcih2YXIgaT10LG49MDtuPGUubGVuZ3RoJiZudWxsIT0oaT1pJiZpW2Vbbl1dKTtuKyspO3JldHVybiBpfSh0LCJwb2ludGVyLmNvbG9yIik7bnVsbCE9aSYmZnVuY3Rpb24odCxlLGksbil7ZT1lLnNwbGl0KCIsIik7Zm9yKHZhciBvLGE9dCxyPTA7cjxlLmxlbmd0aC0xO3IrKyludWxsPT1hW289ZVtyXV0mJihhW29dPXt9KSxhPWFbb107IW4mJm51bGwhPWFbZVtyXV18fChhW2Vbcl1dPWkpfSh0LCJpdGVtU3R5bGUuY29sb3IiLGkpfWJoKHQpfX0pLGkuZGF0YVJhbmdlJiYoaS52aXN1YWxNYXA9aS5kYXRhUmFuZ2UpLEUoTWgsZnVuY3Rpb24odCl7dmFyIGU9aVt0XTtlJiYoayhlKXx8KGU9W2VdKSxFKGUsZnVuY3Rpb24odCl7YmgodCl9KSl9KX07ZnVuY3Rpb24gVGgobSl7RShtLGZ1bmN0aW9uKGgsYyl7dmFyIGQ9W10sZj1bTmFOLE5hTl0sdD1baC5zdGFja1Jlc3VsdERpbWVuc2lvbixoLnN0YWNrZWRPdmVyRGltZW5zaW9uXSxwPWguZGF0YSxnPWguaXNTdGFja2VkQnlJbmRleCxlPXAubWFwKHQsZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8sYT1wLmdldChoLnN0YWNrZWREaW1lbnNpb24saSk7aWYoaXNOYU4oYSkpcmV0dXJuIGY7Zz9vPXAuZ2V0UmF3SW5kZXgoaSk6bj1wLmdldChoLnN0YWNrZWRCeURpbWVuc2lvbixpKTtmb3IodmFyIHI9TmFOLHM9Yy0xOzA8PXM7cy0tKXt2YXIgbD1tW3NdO2lmKGd8fChvPWwuZGF0YS5yYXdJbmRleE9mKGwuc3RhY2tlZEJ5RGltZW5zaW9uLG4pKSwwPD1vKXt2YXIgdT1sLmRhdGEuZ2V0QnlSYXdJbmRleChsLnN0YWNrUmVzdWx0RGltZW5zaW9uLG8pO2lmKDA8PWEmJjA8dXx8YTw9MCYmdTwwKXthKz11LHI9dTticmVha319fXJldHVybiBkWzBdPWEsZFsxXT1yLGR9KTtwLmhvc3RNb2RlbC5zZXREYXRhKGUpLGguZGF0YT1lfSl9ZnVuY3Rpb24gQWgodCxlKXtHdS5pc0luc3RhbmNlKHQpfHwodD1HdS5zZXJpZXNEYXRhVG9Tb3VyY2UodCkpLHRoaXMuX3NvdXJjZT10O3ZhciBpPXRoaXMuX2RhdGE9dC5kYXRhLG49dC5zb3VyY2VGb3JtYXQ7bj09PVJ1JiYodGhpcy5fb2Zmc2V0PTAsdGhpcy5fZGltU2l6ZT1lLHRoaXMuX2RhdGE9aSksTCh0aGlzLENoW249PT1OdT9uKyJfIit0LnNlcmllc0xheW91dEJ5Om5dKX12YXIgRGg9QWgucHJvdG90eXBlO0RoLnB1cmU9ITE7dmFyIENoPXthcnJheVJvd3NfY29sdW1uOntwdXJlOkRoLnBlcnNpc3RlbnQ9ITAsY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgoMCx0aGlzLl9kYXRhLmxlbmd0aC10aGlzLl9zb3VyY2Uuc3RhcnRJbmRleCl9LGdldEl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RhdGFbdCt0aGlzLl9zb3VyY2Uuc3RhcnRJbmRleF19LGFwcGVuZERhdGE6UGh9LGFycmF5Um93c19yb3c6e3B1cmU6ITAsY291bnQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9kYXRhWzBdO3JldHVybiB0P01hdGgubWF4KDAsdC5sZW5ndGgtdGhpcy5fc291cmNlLnN0YXJ0SW5kZXgpOjB9LGdldEl0ZW06ZnVuY3Rpb24odCl7dCs9dGhpcy5fc291cmNlLnN0YXJ0SW5kZXg7Zm9yKHZhciBlPVtdLGk9dGhpcy5fZGF0YSxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvPWlbbl07ZS5wdXNoKG8/b1t0XTpudWxsKX1yZXR1cm4gZX0sYXBwZW5kRGF0YTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcignRG8gbm90IHN1cHBvcnQgYXBwZW5kRGF0YSB3aGVuIHNldCBzZXJpZXNMYXlvdXRCeTogInJvdyIuJyl9fSxvYmplY3RSb3dzOntwdXJlOiEwLGNvdW50OkxoLGdldEl0ZW06a2gsYXBwZW5kRGF0YTpQaH0sa2V5ZWRDb2x1bW5zOntwdXJlOiEwLGNvdW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc291cmNlLmRpbWVuc2lvbnNEZWZpbmVbMF0ubmFtZSxlPXRoaXMuX2RhdGFbdF07cmV0dXJuIGU/ZS5sZW5ndGg6MH0sZ2V0SXRlbTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10aGlzLl9zb3VyY2UuZGltZW5zaW9uc0RlZmluZSxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvPXRoaXMuX2RhdGFbaVtuXS5uYW1lXTtlLnB1c2gobz9vW3RdOm51bGwpfXJldHVybiBlfSxhcHBlbmREYXRhOmZ1bmN0aW9uKHQpe3ZhciBvPXRoaXMuX2RhdGE7RSh0LGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPW9bZV18fChvW2VdPVtdKSxuPTA7bjwodHx8W10pLmxlbmd0aDtuKyspaS5wdXNoKHRbbl0pfSl9fSxvcmlnaW5hbDp7Y291bnQ6TGgsZ2V0SXRlbTpraCxhcHBlbmREYXRhOlBofSx0eXBlZEFycmF5OntwZXJzaXN0ZW50OiEoRGguZ2V0U291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXJjZX0pLHB1cmU6ITAsY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YT90aGlzLl9kYXRhLmxlbmd0aC90aGlzLl9kaW1TaXplOjB9LGdldEl0ZW06ZnVuY3Rpb24odCxlKXt0LT10aGlzLl9vZmZzZXQsZT1lfHxbXTtmb3IodmFyIGk9dGhpcy5fZGltU2l6ZSp0LG49MDtuPHRoaXMuX2RpbVNpemU7bisrKWVbbl09dGhpcy5fZGF0YVtpK25dO3JldHVybiBlfSxhcHBlbmREYXRhOmZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sY2xlYW46ZnVuY3Rpb24oKXt0aGlzLl9vZmZzZXQrPXRoaXMuY291bnQoKSx0aGlzLl9kYXRhPW51bGx9fX07ZnVuY3Rpb24gTGgoKXtyZXR1cm4gdGhpcy5fZGF0YS5sZW5ndGh9ZnVuY3Rpb24ga2godCl7cmV0dXJuIHRoaXMuX2RhdGFbdF19ZnVuY3Rpb24gUGgodCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5fZGF0YS5wdXNoKHRbZV0pfXZhciBOaD17YXJyYXlSb3dzOk9oLG9iamVjdFJvd3M6ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIG51bGwhPWk/dFtuXTp0fSxrZXllZENvbHVtbnM6T2gsb3JpZ2luYWw6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89Qm8odCk7cmV0dXJuIG51bGwhPWkmJm8gaW5zdGFuY2VvZiBBcnJheT9vW2ldOm99LHR5cGVkQXJyYXk6T2h9O2Z1bmN0aW9uIE9oKHQsZSxpLG4pe3JldHVybiBudWxsIT1pP3RbaV06dH12YXIgRWg9e2FycmF5Um93czp6aCxvYmplY3RSb3dzOmZ1bmN0aW9uKHQsZSxpLG4pe3JldHVybiBSaCh0W2VdLHRoaXMuX2RpbWVuc2lvbkluZm9zW2VdKX0sa2V5ZWRDb2x1bW5zOnpoLG9yaWdpbmFsOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXQmJihudWxsPT10LnZhbHVlP3Q6dC52YWx1ZSk7cmV0dXJuIXRoaXMuX3Jhd0RhdGEucHVyZSYmZnVuY3Rpb24odCl7cmV0dXJuIFBvKHQpJiYhKHQgaW5zdGFuY2VvZiBBcnJheSl9KHQpJiYodGhpcy5oYXNJdGVtT3B0aW9uPSEwKSxSaChvIGluc3RhbmNlb2YgQXJyYXk/b1tuXTpvLHRoaXMuX2RpbWVuc2lvbkluZm9zW2VdKX0sdHlwZWRBcnJheTpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gdFtuXX19O2Z1bmN0aW9uIHpoKHQsZSxpLG4pe3JldHVybiBSaCh0W25dLHRoaXMuX2RpbWVuc2lvbkluZm9zW2VdKX1mdW5jdGlvbiBSaCh0LGUpe3ZhciBpPWUmJmUudHlwZTtpZigib3JkaW5hbCIhPT1pKXJldHVybiJ0aW1lIj09PWkmJiJudW1iZXIiIT10eXBlb2YgdCYmbnVsbCE9dCYmIi0iIT09dCYmKHQ9K0hsKHQpKSxudWxsPT10fHwiIj09PXQ/TmFOOit0O3ZhciBuPWUmJmUub3JkaW5hbE1ldGE7cmV0dXJuIG4/bi5wYXJzZUFuZENvbGxlY3QodCk6dH1mdW5jdGlvbiBCaCh0LGUsaSl7aWYodCl7dmFyIG49dC5nZXRSYXdEYXRhSXRlbShlKTtpZihudWxsIT1uKXt2YXIgbyxhLHI9dC5nZXRQcm92aWRlcigpLmdldFNvdXJjZSgpLnNvdXJjZUZvcm1hdCxzPXQuZ2V0RGltZW5zaW9uSW5mbyhpKTtyZXR1cm4gcyYmKG89cy5uYW1lLGE9cy5pbmRleCksTmhbcl0obixlLGEsbyl9fX1mdW5jdGlvbiBWaCh0LGUsaSl7aWYodCl7dmFyIG49dC5nZXRQcm92aWRlcigpLmdldFNvdXJjZSgpLnNvdXJjZUZvcm1hdDtpZihuPT09UHV8fG49PT1PdSl7dmFyIG89dC5nZXRSYXdEYXRhSXRlbShlKTtyZXR1cm4gbiE9PVB1fHxSKG8pfHwobz1udWxsKSxvP29baV06dm9pZCAwfX19dmFyIEdoPS9ce0AoLis/KVx9L2csRmg9e2dldERhdGFQYXJhbXM6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldERhdGEoZSksbj10aGlzLmdldFJhd1ZhbHVlKHQsZSksbz1pLmdldFJhd0luZGV4KHQpLGE9aS5nZXROYW1lKHQpLHI9aS5nZXRSYXdEYXRhSXRlbSh0KSxzPWkuZ2V0SXRlbVZpc3VhbCh0LCJjb2xvciIpLGw9aS5nZXRJdGVtVmlzdWFsKHQsImJvcmRlckNvbG9yIiksdT10aGlzLmVjTW9kZWwuZ2V0Q29tcG9uZW50KCJ0b29sdGlwIiksaD1xbyh1JiZ1LmdldCgicmVuZGVyTW9kZSIpKSxjPXRoaXMubWFpblR5cGUsZD0ic2VyaWVzIj09PWMsZj1pLnVzZXJPdXRwdXQ7cmV0dXJue2NvbXBvbmVudFR5cGU6Yyxjb21wb25lbnRTdWJUeXBlOnRoaXMuc3ViVHlwZSxjb21wb25lbnRJbmRleDp0aGlzLmNvbXBvbmVudEluZGV4LHNlcmllc1R5cGU6ZD90aGlzLnN1YlR5cGU6bnVsbCxzZXJpZXNJbmRleDp0aGlzLnNlcmllc0luZGV4LHNlcmllc0lkOmQ/dGhpcy5pZDpudWxsLHNlcmllc05hbWU6ZD90aGlzLm5hbWU6bnVsbCxuYW1lOmEsZGF0YUluZGV4Om8sZGF0YTpyLGRhdGFUeXBlOmUsdmFsdWU6bixjb2xvcjpzLGJvcmRlckNvbG9yOmwsZGltZW5zaW9uTmFtZXM6Zj9mLmRpbWVuc2lvbk5hbWVzOm51bGwsZW5jb2RlOmY/Zi5lbmNvZGU6bnVsbCxtYXJrZXI6cnUoe2NvbG9yOnMscmVuZGVyTW9kZTpofSksJHZhcnM6WyJzZXJpZXNOYW1lIiwibmFtZSIsInZhbHVlIl19fSxnZXRGb3JtYXR0ZWRMYWJlbDpmdW5jdGlvbihuLHQsZSxpLG8pe3Q9dHx8Im5vcm1hbCI7dmFyIGE9dGhpcy5nZXREYXRhKGUpLHI9YS5nZXRJdGVtTW9kZWwobikscz10aGlzLmdldERhdGFQYXJhbXMobixlKTtudWxsIT1pJiZzLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkmJihzLnZhbHVlPXMudmFsdWVbaV0pO3ZhciBsPXIuZ2V0KCJub3JtYWwiPT09dD9bb3x8ImxhYmVsIiwiZm9ybWF0dGVyIl06W3Qsb3x8ImxhYmVsIiwiZm9ybWF0dGVyIl0pO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBsPyhzLnN0YXR1cz10LHMuZGltZW5zaW9uSW5kZXg9aSxsKHMpKToic3RyaW5nIj09dHlwZW9mIGw/b3UobCxzKS5yZXBsYWNlKEdoLGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5sZW5ndGg7cmV0dXJuIlsiPT09ZS5jaGFyQXQoMCkmJiJdIj09PWUuY2hhckF0KGktMSkmJihlPStlLnNsaWNlKDEsaS0xKSksQmgoYSxuLGUpfSk6dm9pZCAwfSxnZXRSYXdWYWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBCaCh0aGlzLmdldERhdGEoZSksdCl9LGZvcm1hdFRvb2x0aXA6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBXaCh0KXtyZXR1cm4gbmV3IEhoKHQpfWZ1bmN0aW9uIEhoKHQpe3Q9dHx8e30sdGhpcy5fcmVzZXQ9dC5yZXNldCx0aGlzLl9wbGFuPXQucGxhbix0aGlzLl9jb3VudD10LmNvdW50LHRoaXMuX29uRGlydHk9dC5vbkRpcnR5LHRoaXMuX2RpcnR5PSEwLHRoaXMuY29udGV4dH12YXIgWmg9SGgucHJvdG90eXBlO1poLnBlcmZvcm09ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLl91cHN0cmVhbSxuPXQmJnQuc2tpcDtpZih0aGlzLl9kaXJ0eSYmaSl7dmFyIG89dGhpcy5jb250ZXh0O28uZGF0YT1vLm91dHB1dERhdGE9aS5jb250ZXh0Lm91dHB1dERhdGF9dGhpcy5fX3BpcGVsaW5lJiYodGhpcy5fX3BpcGVsaW5lLmN1cnJlbnRUYXNrPXRoaXMpLHRoaXMuX3BsYW4mJiFuJiYoZT10aGlzLl9wbGFuKHRoaXMuY29udGV4dCkpO3ZhciBhLHI9aCh0aGlzLl9tb2RCeSkscz10aGlzLl9tb2REYXRhQ291bnR8fDAsbD1oKHQmJnQubW9kQnkpLHU9dCYmdC5tb2REYXRhQ291bnR8fDA7ZnVuY3Rpb24gaCh0KXtyZXR1cm4gMTw9dHx8KHQ9MSksdH1yPT09bCYmcz09PXV8fChlPSJyZXNldCIpLCF0aGlzLl9kaXJ0eSYmInJlc2V0IiE9PWV8fCh0aGlzLl9kaXJ0eT0hMSxhPWZ1bmN0aW9uKHQsZSl7dmFyIGksbjt0Ll9kdWVJbmRleD10Ll9vdXRwdXREdWVFbmQ9dC5fZHVlRW5kPTAsdC5fc2V0dGVkT3V0cHV0RW5kPW51bGwsIWUmJnQuX3Jlc2V0JiYoKGk9dC5fcmVzZXQodC5jb250ZXh0KSkmJmkucHJvZ3Jlc3MmJihuPWkuZm9yY2VGaXJzdFByb2dyZXNzLGk9aS5wcm9ncmVzcyksayhpKSYmIWkubGVuZ3RoJiYoaT1udWxsKSk7dC5fcHJvZ3Jlc3M9aSx0Ll9tb2RCeT10Ll9tb2REYXRhQ291bnQ9bnVsbDt2YXIgbz10Ll9kb3duc3RyZWFtO3JldHVybiBvJiZvLmRpcnR5KCksbn0odGhpcyxuKSksdGhpcy5fbW9kQnk9bCx0aGlzLl9tb2REYXRhQ291bnQ9dTt2YXIgYz10JiZ0LnN0ZXA7aWYodGhpcy5fZHVlRW5kPWk/aS5fb3V0cHV0RHVlRW5kOnRoaXMuX2NvdW50P3RoaXMuX2NvdW50KHRoaXMuY29udGV4dCk6MS8wLHRoaXMuX3Byb2dyZXNzKXt2YXIgZD10aGlzLl9kdWVJbmRleCxmPU1hdGgubWluKG51bGwhPWM/dGhpcy5fZHVlSW5kZXgrYzoxLzAsdGhpcy5fZHVlRW5kKTtpZighbiYmKGF8fGQ8Zikpe3ZhciBwPXRoaXMuX3Byb2dyZXNzO2lmKGsocCkpZm9yKHZhciBnPTA7ZzxwLmxlbmd0aDtnKyspdGModGhpcyxwW2ddLGQsZixsLHUpO2Vsc2UgdGModGhpcyxwLGQsZixsLHUpfXRoaXMuX2R1ZUluZGV4PWY7dmFyIG09bnVsbCE9dGhpcy5fc2V0dGVkT3V0cHV0RW5kP3RoaXMuX3NldHRlZE91dHB1dEVuZDpmO3RoaXMuX291dHB1dER1ZUVuZD1tfWVsc2UgdGhpcy5fZHVlSW5kZXg9dGhpcy5fb3V0cHV0RHVlRW5kPW51bGwhPXRoaXMuX3NldHRlZE91dHB1dEVuZD90aGlzLl9zZXR0ZWRPdXRwdXRFbmQ6dGhpcy5fZHVlRW5kO3JldHVybiB0aGlzLnVuZmluaXNoZWQoKX07dmFyIFVoLFhoLFloLGpoLHFoLEtoLCRoPUtoPXtyZXNldDpmdW5jdGlvbih0LGUsaSxuKXtYaD10LFVoPWUsWWg9aSxqaD1uLHFoPU1hdGguY2VpbChqaC9ZaCksS2gubmV4dD0xPFloJiYwPGpoP1FoOkpofX07ZnVuY3Rpb24gSmgoKXtyZXR1cm4gWGg8VWg/WGgrKzpudWxsfWZ1bmN0aW9uIFFoKCl7dmFyIHQ9WGglcWgqWWgrTWF0aC5jZWlsKFhoL3FoKSxlPVVoPD1YaD9udWxsOnQ8amg/dDpYaDtyZXR1cm4gWGgrKyxlfWZ1bmN0aW9uIHRjKHQsZSxpLG4sbyxhKXskaC5yZXNldChpLG4sbyxhKSx0Ll9jYWxsaW5nUHJvZ3Jlc3M9ZSx0Ll9jYWxsaW5nUHJvZ3Jlc3Moe3N0YXJ0OmksZW5kOm4sY291bnQ6bi1pLG5leHQ6JGgubmV4dH0sdC5jb250ZXh0KX1aaC5kaXJ0eT1mdW5jdGlvbigpe3RoaXMuX2RpcnR5PSEwLHRoaXMuX29uRGlydHkmJnRoaXMuX29uRGlydHkodGhpcy5jb250ZXh0KX0sWmgudW5maW5pc2hlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9ncmVzcyYmdGhpcy5fZHVlSW5kZXg8dGhpcy5fZHVlRW5kfSxaaC5waXBlPWZ1bmN0aW9uKHQpe3RoaXMuX2Rvd25zdHJlYW09PT10JiYhdGhpcy5fZGlydHl8fCgodGhpcy5fZG93bnN0cmVhbT10KS5fdXBzdHJlYW09dGhpcyx0LmRpcnR5KCkpfSxaaC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fZGlzcG9zZWR8fCh0aGlzLl91cHN0cmVhbSYmKHRoaXMuX3Vwc3RyZWFtLl9kb3duc3RyZWFtPW51bGwpLHRoaXMuX2Rvd25zdHJlYW0mJih0aGlzLl9kb3duc3RyZWFtLl91cHN0cmVhbT1udWxsKSx0aGlzLl9kaXJ0eT0hMSx0aGlzLl9kaXNwb3NlZD0hMCl9LFpoLmdldFVwc3RyZWFtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Vwc3RyZWFtfSxaaC5nZXREb3duc3RyZWFtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd25zdHJlYW19LFpoLnNldE91dHB1dEVuZD1mdW5jdGlvbih0KXt0aGlzLl9vdXRwdXREdWVFbmQ9dGhpcy5fc2V0dGVkT3V0cHV0RW5kPXR9O3ZhciBlYz1abygpLGljPVR1LmV4dGVuZCh7dHlwZToic2VyaWVzLl9fYmFzZV9fIixzZXJpZXNJbmRleDowLGNvb3JkaW5hdGVTeXN0ZW06bnVsbCxkZWZhdWx0T3B0aW9uOm51bGwsbGVnZW5kVmlzdWFsUHJvdmlkZXI6bnVsbCx2aXN1YWxDb2xvckFjY2Vzc1BhdGg6Iml0ZW1TdHlsZS5jb2xvciIsdmlzdWFsQm9yZGVyQ29sb3JBY2Nlc3NQYXRoOiJpdGVtU3R5bGUuYm9yZGVyQ29sb3IiLGxheW91dE1vZGU6bnVsbCxpbml0OmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuc2VyaWVzSW5kZXg9dGhpcy5jb21wb25lbnRJbmRleCx0aGlzLmRhdGFUYXNrPVdoKHtjb3VudDpvYyxyZXNldDphY30pLHRoaXMuZGF0YVRhc2suY29udGV4dD17bW9kZWw6dGhpc30sdGhpcy5tZXJnZURlZmF1bHRBbmRUaGVtZSh0LGkpLEh1KHRoaXMpO3ZhciBvPXRoaXMuZ2V0SW5pdGlhbERhdGEodCxpKTtzYyhvLHRoaXMpLHRoaXMuZGF0YVRhc2suY29udGV4dC5kYXRhPW8sZWModGhpcykuZGF0YUJlZm9yZVByb2Nlc3NlZD1vLG5jKHRoaXMpfSxtZXJnZURlZmF1bHRBbmRUaGVtZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMubGF5b3V0TW9kZSxuPWk/X3UodCk6e30sbz10aGlzLnN1YlR5cGU7VHUuaGFzQ2xhc3MobykmJihvKz0iU2VyaWVzIiksbSh0LGUuZ2V0VGhlbWUoKS5nZXQodGhpcy5zdWJUeXBlKSksbSh0LHRoaXMuZ2V0RGVmYXVsdE9wdGlvbigpKSx6byh0LCJsYWJlbCIsWyJzaG93Il0pLHRoaXMuZmlsbERhdGFUZXh0U3R5bGUodC5kYXRhKSxpJiZ4dSh0LG4saSl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQsZSl7dD1tKHRoaXMub3B0aW9uLHQsITApLHRoaXMuZmlsbERhdGFUZXh0U3R5bGUodC5kYXRhKTt2YXIgaT10aGlzLmxheW91dE1vZGU7aSYmeHUodGhpcy5vcHRpb24sdCxpKSxIdSh0aGlzKTt2YXIgbj10aGlzLmdldEluaXRpYWxEYXRhKHQsZSk7c2Mobix0aGlzKSx0aGlzLmRhdGFUYXNrLmRpcnR5KCksdGhpcy5kYXRhVGFzay5jb250ZXh0LmRhdGE9bixlYyh0aGlzKS5kYXRhQmVmb3JlUHJvY2Vzc2VkPW4sbmModGhpcyl9LGZpbGxEYXRhVGV4dFN0eWxlOmZ1bmN0aW9uKHQpe2lmKHQmJiFWKHQpKWZvcih2YXIgZT1bInNob3ciXSxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXSYmdFtpXS5sYWJlbCYmem8odFtpXSwibGFiZWwiLGUpfSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbigpe30sYXBwZW5kRGF0YTpmdW5jdGlvbih0KXt0aGlzLmdldFJhd0RhdGEoKS5hcHBlbmREYXRhKHQuZGF0YSl9LGdldERhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dWModGhpcyk7aWYoZSl7dmFyIGk9ZS5jb250ZXh0LmRhdGE7cmV0dXJuIG51bGw9PXQ/aTppLmdldExpbmtlZERhdGEodCl9cmV0dXJuIGVjKHRoaXMpLmRhdGF9LHNldERhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dWModGhpcyk7aWYoZSl7dmFyIGk9ZS5jb250ZXh0O2kuZGF0YSE9PXQmJmUubW9kaWZ5T3V0cHV0RW5kJiZlLnNldE91dHB1dEVuZCh0LmNvdW50KCkpLGkub3V0cHV0RGF0YT10LGUhPT10aGlzLmRhdGFUYXNrJiYoaS5kYXRhPXQpfWVjKHRoaXMpLmRhdGE9dH0sZ2V0U291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBXdSh0KS5zb3VyY2V9KHRoaXMpfSxnZXRSYXdEYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIGVjKHRoaXMpLmRhdGFCZWZvcmVQcm9jZXNzZWR9LGdldEJhc2VBeGlzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb29yZGluYXRlU3lzdGVtO3JldHVybiB0JiZ0LmdldEJhc2VBeGlzJiZ0LmdldEJhc2VBeGlzKCl9LGZvcm1hdFRvb2x0aXA6ZnVuY3Rpb24obyxoLHQsYyl7dmFyIGQ9dGhpcyxlPSJodG1sIj09PShjPWN8fCJodG1sIik/Ijxici8+IjoiXG4iLGY9InJpY2hUZXh0Ij09PWMscD17fSxnPTA7ZnVuY3Rpb24gaSh0KXtyZXR1cm57cmVuZGVyTW9kZTpjLGNvbnRlbnQ6ZXUoS2wodCkpLHN0eWxlOnB9fXZhciBtPXRoaXMuZ2V0RGF0YSgpLGE9bS5tYXBEaW1lbnNpb24oImRlZmF1bHRlZFRvb2x0aXAiLCEwKSxuPWEubGVuZ3RoLHI9dGhpcy5nZXRSYXdWYWx1ZShvKSxzPWsociksdj1tLmdldEl0ZW1WaXN1YWwobywiY29sb3IiKTtSKHYpJiZ2LmNvbG9yU3RvcHMmJih2PSh2LmNvbG9yU3RvcHNbMF18fHt9KS5jb2xvciksdj12fHwidHJhbnNwYXJlbnQiO3ZhciBsPSgxPG58fHMmJiFuP2Z1bmN0aW9uKHQpe3ZhciBsPVModCxmdW5jdGlvbih0LGUsaSl7dmFyIG49bS5nZXREaW1lbnNpb25JbmZvKGkpO3JldHVybiB0fChuJiYhMSE9PW4udG9vbHRpcCYmbnVsbCE9bi5kaXNwbGF5TmFtZSl9LDApLHU9W107ZnVuY3Rpb24gZSh0LGUpe3ZhciBpPW0uZ2V0RGltZW5zaW9uSW5mbyhlKTtpZihpJiYhMSE9PWkub3RoZXJEaW1zLnRvb2x0aXApe3ZhciBuPWkudHlwZSxvPSJzdWIiK2Quc2VyaWVzSW5kZXgrImF0IitnLGE9cnUoe2NvbG9yOnYsdHlwZToic3ViSXRlbSIscmVuZGVyTW9kZTpjLG1hcmtlcklkOm99KSxyPSJzdHJpbmciPT10eXBlb2YgYT9hOmEuY29udGVudCxzPShsP3IrZXUoaS5kaXNwbGF5TmFtZXx8Ii0iKSsiOiAiOiIiKStldSgib3JkaW5hbCI9PT1uP3QrIiI6InRpbWUiPT09bj9oPyIiOmx1KCJ5eXl5L01NL2RkIGhoOm1tOnNzIix0KTpLbCh0KSk7cyYmdS5wdXNoKHMpLGYmJihwW29dPXYsKytnKX19YS5sZW5ndGg/RShhLGZ1bmN0aW9uKHQpe2UoQmgobSxvLHQpLHQpfSk6RSh0LGUpO3ZhciBpPWw/Zj8iXG4iOiI8YnIvPiI6IiIsbj1pK3Uuam9pbihpfHwiLCAiKTtyZXR1cm57cmVuZGVyTW9kZTpjLGNvbnRlbnQ6bixzdHlsZTpwfX0ocik6aShuP0JoKG0sbyxhWzBdKTpzP3JbMF06cikpLmNvbnRlbnQsdT1kLnNlcmllc0luZGV4KyJhdCIrZyx5PXJ1KHtjb2xvcjp2LHR5cGU6Iml0ZW0iLHJlbmRlck1vZGU6YyxtYXJrZXJJZDp1fSk7cFt1XT12LCsrZzt2YXIgeD1tLmdldE5hbWUobyksXz10aGlzLm5hbWU7Rm8odGhpcyl8fChfPSIiKSxfPV8/ZXUoXykrKGg/IjogIjplKToiIjt2YXIgdz0ic3RyaW5nIj09dHlwZW9mIHk/eTp5LmNvbnRlbnQ7cmV0dXJue2h0bWw6aD93K18rbDpfK3crKHg/ZXUoeCkrIjogIitsOmwpLG1hcmtlcnM6cH19LGlzQW5pbWF0aW9uRW5hYmxlZDpmdW5jdGlvbigpe2lmKHYubm9kZSlyZXR1cm4hMTt2YXIgdD10aGlzLmdldFNoYWxsb3coImFuaW1hdGlvbiIpO3JldHVybiB0JiZ0aGlzLmdldERhdGEoKS5jb3VudCgpPnRoaXMuZ2V0U2hhbGxvdygiYW5pbWF0aW9uVGhyZXNob2xkIikmJih0PSExKSx0fSxyZXN0b3JlRGF0YTpmdW5jdGlvbigpe3RoaXMuZGF0YVRhc2suZGlydHkoKX0sZ2V0Q29sb3JGcm9tUGFsZXR0ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5lY01vZGVsLG89a3UuZ2V0Q29sb3JGcm9tUGFsZXR0ZS5jYWxsKHRoaXMsdCxlLGkpO3JldHVybiBvPW98fG4uZ2V0Q29sb3JGcm9tUGFsZXR0ZSh0LGUsaSl9LGNvb3JkRGltVG9EYXRhRGltOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFJhd0RhdGEoKS5tYXBEaW1lbnNpb24odCwhMCl9LGdldFByb2dyZXNzaXZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJwcm9ncmVzc2l2ZSIpfSxnZXRQcm9ncmVzc2l2ZVRocmVzaG9sZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgicHJvZ3Jlc3NpdmVUaHJlc2hvbGQiKX0sZ2V0QXhpc1Rvb2x0aXBEYXRhOm51bGwsZ2V0VG9vbHRpcFBvc2l0aW9uOm51bGwscGlwZVRhc2s6bnVsbCxwcmV2ZW50SW5jcmVtZW50YWw6bnVsbCxwaXBlbGluZUNvbnRleHQ6bnVsbH0pO2Z1bmN0aW9uIG5jKHQpe3ZhciBlPXQubmFtZTtGbyh0KXx8KHQubmFtZT1mdW5jdGlvbih0KXt2YXIgaT10LmdldFJhd0RhdGEoKSxlPWkubWFwRGltZW5zaW9uKCJzZXJpZXNOYW1lIiwhMCksbj1bXTtyZXR1cm4gRShlLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0RGltZW5zaW9uSW5mbyh0KTtlLmRpc3BsYXlOYW1lJiZuLnB1c2goZS5kaXNwbGF5TmFtZSl9KSxuLmpvaW4oIiAiKX0odCl8fGUpfWZ1bmN0aW9uIG9jKHQpe3JldHVybiB0Lm1vZGVsLmdldFJhd0RhdGEoKS5jb3VudCgpfWZ1bmN0aW9uIGFjKHQpe3ZhciBlPXQubW9kZWw7cmV0dXJuIGUuc2V0RGF0YShlLmdldFJhd0RhdGEoKS5jbG9uZVNoYWxsb3coKSkscmN9ZnVuY3Rpb24gcmModCxlKXt0LmVuZD5lLm91dHB1dERhdGEuY291bnQoKSYmZS5tb2RlbC5nZXRSYXdEYXRhKCkuY2xvbmVTaGFsbG93KGUub3V0cHV0RGF0YSl9ZnVuY3Rpb24gc2MoZSxpKXtFKGUuQ0hBTkdBQkxFX01FVEhPRFMsZnVuY3Rpb24odCl7ZS53cmFwTWV0aG9kKHQsVChsYyxpKSl9KX1mdW5jdGlvbiBsYyh0KXt2YXIgZT11Yyh0KTtlJiZlLnNldE91dHB1dEVuZCh0aGlzLmNvdW50KCkpfWZ1bmN0aW9uIHVjKHQpe3ZhciBlPSh0LmVjTW9kZWx8fHt9KS5zY2hlZHVsZXIsaT1lJiZlLmdldFBpcGVsaW5lKHQudWlkKTtpZihpKXt2YXIgbj1pLmN1cnJlbnRUYXNrO2lmKG4pe3ZhciBvPW4uYWdlbnRTdHViTWFwO28mJihuPW8uZ2V0KHQudWlkKSl9cmV0dXJuIG59fWIoaWMsRmgpLGIoaWMsa3UpO3ZhciBoYz1mdW5jdGlvbigpe3RoaXMuZ3JvdXA9bmV3IElpLHRoaXMudWlkPUNsKCJ2aWV3Q29tcG9uZW50Iil9O2hjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aGMsaW5pdDpmdW5jdGlvbih0LGUpe30scmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe30sZGlzcG9zZTpmdW5jdGlvbigpe30sZmlsdGVyRm9yRXhwb3NlZEV2ZW50Om51bGx9O3ZhciBjYz1oYy5wcm90b3R5cGU7Y2MudXBkYXRlVmlldz1jYy51cGRhdGVMYXlvdXQ9Y2MudXBkYXRlVmlzdWFsPWZ1bmN0aW9uKHQsZSxpLG4pe30sdGEoaGMpLGFhKGhjLHtyZWdpc3RlcldoZW5FeHRlbmQ6ITB9KTtmdW5jdGlvbiBkYygpe3ZhciBzPVpvKCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXModCksaT10LnBpcGVsaW5lQ29udGV4dCxuPWUubGFyZ2Usbz1lLnByb2dyZXNzaXZlUmVuZGVyLGE9ZS5sYXJnZT1pLmxhcmdlLHI9ZS5wcm9ncmVzc2l2ZVJlbmRlcj1pLnByb2dyZXNzaXZlUmVuZGVyO3JldHVybiEhKG5eYXx8b15yKSYmInJlc2V0In19dmFyIGZjPVpvKCkscGM9ZGMoKTtmdW5jdGlvbiBnYygpe3RoaXMuZ3JvdXA9bmV3IElpLHRoaXMudWlkPUNsKCJ2aWV3Q2hhcnQiKSx0aGlzLnJlbmRlclRhc2s9V2goe3BsYW46eGMscmVzZXQ6X2N9KSx0aGlzLnJlbmRlclRhc2suY29udGV4dD17dmlldzp0aGlzfX12YXIgbWM9Z2MucHJvdG90eXBlPXt0eXBlOiJjaGFydCIsaW5pdDpmdW5jdGlvbih0LGUpe30scmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe30saGlnaGxpZ2h0OmZ1bmN0aW9uKHQsZSxpLG4pe3ljKHQuZ2V0RGF0YSgpLG4sImVtcGhhc2lzIil9LGRvd25wbGF5OmZ1bmN0aW9uKHQsZSxpLG4pe3ljKHQuZ2V0RGF0YSgpLG4sIm5vcm1hbCIpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fSxpbmNyZW1lbnRhbFByZXBhcmVSZW5kZXI6bnVsbCxpbmNyZW1lbnRhbFJlbmRlcjpudWxsLHVwZGF0ZVRyYW5zZm9ybTpudWxsLGZpbHRlckZvckV4cG9zZWRFdmVudDpudWxsfTtmdW5jdGlvbiB2Yyh0LGUsaSl7aWYodCYmKHQudHJpZ2dlcihlLGkpLHQuaXNHcm91cCYmIXFzKHQpKSlmb3IodmFyIG49MCxvPXQuY2hpbGRDb3VudCgpO248bztuKyspdmModC5jaGlsZEF0KG4pLGUsaSl9ZnVuY3Rpb24geWMoZSx0LGkpe3ZhciBuPUhvKGUsdCksbz10JiZudWxsIT10LmhpZ2hsaWdodEtleT9Lcyh0LmhpZ2hsaWdodEtleSk6bnVsbDtudWxsIT1uP0UoRW8obiksZnVuY3Rpb24odCl7dmMoZS5nZXRJdGVtR3JhcGhpY0VsKHQpLGksbyl9KTplLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQpe3ZjKHQsaSxvKX0pfWZ1bmN0aW9uIHhjKHQpe3JldHVybiBwYyh0Lm1vZGVsKX1mdW5jdGlvbiBfYyh0KXt2YXIgZT10Lm1vZGVsLGk9dC5lY01vZGVsLG49dC5hcGksbz10LnBheWxvYWQsYT1lLnBpcGVsaW5lQ29udGV4dC5wcm9ncmVzc2l2ZVJlbmRlcixyPXQudmlldyxzPW8mJmZjKG8pLnVwZGF0ZU1ldGhvZCxsPWE/ImluY3JlbWVudGFsUHJlcGFyZVJlbmRlciI6cyYmcltzXT9zOiJyZW5kZXIiO3JldHVybiJyZW5kZXIiIT09bCYmcltsXShlLGksbixvKSx3Y1tsXX1tYy51cGRhdGVWaWV3PW1jLnVwZGF0ZUxheW91dD1tYy51cGRhdGVWaXN1YWw9ZnVuY3Rpb24odCxlLGksbil7dGhpcy5yZW5kZXIodCxlLGksbil9LHRhKGdjKSxhYShnYyx7cmVnaXN0ZXJXaGVuRXh0ZW5kOiEwfSksZ2MubWFya1VwZGF0ZU1ldGhvZD1mdW5jdGlvbih0LGUpe2ZjKHQpLnVwZGF0ZU1ldGhvZD1lfTt2YXIgd2M9e2luY3JlbWVudGFsUHJlcGFyZVJlbmRlcjp7cHJvZ3Jlc3M6ZnVuY3Rpb24odCxlKXtlLnZpZXcuaW5jcmVtZW50YWxSZW5kZXIodCxlLm1vZGVsLGUuZWNNb2RlbCxlLmFwaSxlLnBheWxvYWQpfX0scmVuZGVyOntmb3JjZUZpcnN0UHJvZ3Jlc3M6ITAscHJvZ3Jlc3M6ZnVuY3Rpb24odCxlKXtlLnZpZXcucmVuZGVyKGUubW9kZWwsZS5lY01vZGVsLGUuYXBpLGUucGF5bG9hZCl9fX0sYmM9IlwwX190aHJvdHRsZU9yaWdpbk1ldGhvZCIsU2M9IlwwX190aHJvdHRsZVJhdGUiLE1jPSJcMF9fdGhyb3R0bGVUeXBlIjtmdW5jdGlvbiBJYyh0LGksbil7dmFyIG8sYSxyLHMsbCx1PTAsaD0wLGM9bnVsbDtmdW5jdGlvbiBkKCl7aD0obmV3IERhdGUpLmdldFRpbWUoKSxjPW51bGwsdC5hcHBseShyLHN8fFtdKX1pPWl8fDA7ZnVuY3Rpb24gZSgpe289KG5ldyBEYXRlKS5nZXRUaW1lKCkscj10aGlzLHM9YXJndW1lbnRzO3ZhciB0PWx8fGksZT1sfHxuO2w9bnVsbCxhPW8tKGU/dTpoKS10LGNsZWFyVGltZW91dChjKSxlP2M9c2V0VGltZW91dChkLHQpOjA8PWE/ZCgpOmM9c2V0VGltZW91dChkLC1hKSx1PW99cmV0dXJuIGUuY2xlYXI9ZnVuY3Rpb24oKXtjJiYoY2xlYXJUaW1lb3V0KGMpLGM9bnVsbCl9LGUuZGVib3VuY2VOZXh0Q2FsbD1mdW5jdGlvbih0KXtsPXR9LGV9ZnVuY3Rpb24gVGModCxlLGksbil7dmFyIG89dFtlXTtpZihvKXt2YXIgYT1vW2JjXXx8byxyPW9bTWNdO2lmKG9bU2NdIT09aXx8ciE9PW4pe2lmKG51bGw9PWl8fCFuKXJldHVybiB0W2VdPWE7KG89dFtlXT1JYyhhLGksImRlYm91bmNlIj09PW4pKVtiY109YSxvW01jXT1uLG9bU2NdPWl9cmV0dXJuIG99fWZ1bmN0aW9uIEFjKHQsZSl7dmFyIGk9dFtlXTtpJiZpW2JjXSYmKHRbZV09aVtiY10pfXZhciBEYz17Y3JlYXRlT25BbGxTZXJpZXM6ITAscGVyZm9ybVJhd1NlcmllczohMCxyZXNldDpmdW5jdGlvbihlLHQpe3ZhciBpPWUuZ2V0RGF0YSgpLGE9KGUudmlzdWFsQ29sb3JBY2Nlc3NQYXRofHwiaXRlbVN0eWxlLmNvbG9yIikuc3BsaXQoIi4iKSxuPWUuZ2V0KGEpLG89IU8obil8fG4gaW5zdGFuY2VvZiBzcz9udWxsOm47biYmIW98fChuPWUuZ2V0Q29sb3JGcm9tUGFsZXR0ZShlLm5hbWUsbnVsbCx0LmdldFNlcmllc0NvdW50KCkpKSxpLnNldFZpc3VhbCgiY29sb3IiLG4pO3ZhciByPShlLnZpc3VhbEJvcmRlckNvbG9yQWNjZXNzUGF0aHx8Iml0ZW1TdHlsZS5ib3JkZXJDb2xvciIpLnNwbGl0KCIuIikscz1lLmdldChyKTtpZihpLnNldFZpc3VhbCgiYm9yZGVyQ29sb3IiLHMpLCF0LmlzU2VyaWVzRmlsdGVyZWQoZSkpe28mJmkuZWFjaChmdW5jdGlvbih0KXtpLnNldEl0ZW1WaXN1YWwodCwiY29sb3IiLG8oZS5nZXREYXRhUGFyYW1zKHQpKSl9KTtyZXR1cm57ZGF0YUVhY2g6aS5oYXNJdGVtT3B0aW9uP2Z1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRJdGVtTW9kZWwoZSksbj1pLmdldChhLCEwKSxvPWkuZ2V0KHIsITApO251bGwhPW4mJnQuc2V0SXRlbVZpc3VhbChlLCJjb2xvciIsbiksbnVsbCE9byYmdC5zZXRJdGVtVmlzdWFsKGUsImJvcmRlckNvbG9yIixvKX06bnVsbH19fX0sQ2M9e2xlZ2VuZDp7c2VsZWN0b3I6e2FsbDoi5YWo6YCJIixpbnZlcnNlOiLlj43pgIkifX0sdG9vbGJveDp7YnJ1c2g6e3RpdGxlOntyZWN0OiLnn6nlvaLpgInmi6kiLHBvbHlnb246IuWciOmAiSIsbGluZVg6IuaoquWQkemAieaLqSIsbGluZVk6Iue6teWQkemAieaLqSIsa2VlcDoi5L+d5oyB6YCJ5oupIixjbGVhcjoi5riF6Zmk6YCJ5oupIn19LGRhdGFWaWV3Ont0aXRsZToi5pWw5o2u6KeG5Zu+IixsYW5nOlsi5pWw5o2u6KeG5Zu+Iiwi5YWz6ZetIiwi5Yi35pawIl19LGRhdGFab29tOnt0aXRsZTp7em9vbToi5Yy65Z+f57yp5pS+IixiYWNrOiLljLrln5/nvKnmlL7ov5jljp8ifX0sbWFnaWNUeXBlOnt0aXRsZTp7bGluZToi5YiH5o2i5Li65oqY57q/5Zu+IixiYXI6IuWIh+aNouS4uuafseeKtuWbviIsc3RhY2s6IuWIh+aNouS4uuWghuWPoCIsdGlsZWQ6IuWIh+aNouS4uuW5s+mTuiJ9fSxyZXN0b3JlOnt0aXRsZToi6L+Y5Y6fIn0sc2F2ZUFzSW1hZ2U6e3RpdGxlOiLkv53lrZjkuLrlm77niYciLGxhbmc6WyLlj7PplK7lj6blrZjkuLrlm77niYciXX19LHNlcmllczp7dHlwZU5hbWVzOntwaWU6IumlvOWbviIsYmFyOiLmn7Hnirblm74iLGxpbmU6IuaKmOe6v+WbviIsc2NhdHRlcjoi5pWj54K55Zu+IixlZmZlY3RTY2F0dGVyOiLmtp/mvKrmlaPngrnlm74iLHJhZGFyOiLpm7fovr7lm74iLHRyZWU6IuagkeWbviIsdHJlZW1hcDoi55+p5b2i5qCR5Zu+Iixib3hwbG90OiLnrrHlnovlm74iLGNhbmRsZXN0aWNrOiJL57q/5Zu+IixrOiJL57q/5Zu+IixoZWF0bWFwOiLng63lipvlm74iLG1hcDoi5Zyw5Zu+IixwYXJhbGxlbDoi5bmz6KGM5Z2Q5qCH5Zu+IixsaW5lczoi57q/5Zu+IixncmFwaDoi5YWz57O75Zu+IixzYW5rZXk6IuahkeWfuuWbviIsZnVubmVsOiLmvI/mlpflm74iLGdhdWdlOiLku6rooajnm5jlm74iLHBpY3RvcmlhbEJhcjoi6LGh5b2i5p+x5Zu+Iix0aGVtZVJpdmVyOiLkuLvpopjmsrPmtYHlm74iLHN1bmJ1cnN0OiLml63ml6Xlm74ifX0sYXJpYTp7Z2VuZXJhbDp7d2l0aFRpdGxlOiLov5nmmK/kuIDkuKrlhbPkuo7igJx7dGl0bGV94oCd55qE5Zu+6KGo44CCIix3aXRob3V0VGl0bGU6Iui/meaYr+S4gOS4quWbvuihqO+8jCJ9LHNlcmllczp7c2luZ2xlOntwcmVmaXg6IiIsd2l0aE5hbWU6IuWbvuihqOexu+Wei+aYr3tzZXJpZXNUeXBlfe+8jOihqOekuntzZXJpZXNOYW1lfeOAgiIsd2l0aG91dE5hbWU6IuWbvuihqOexu+Wei+aYr3tzZXJpZXNUeXBlfeOAgiJ9LG11bHRpcGxlOntwcmVmaXg6IuWug+eUsXtzZXJpZXNDb3VudH3kuKrlm77ooajns7vliJfnu4TmiJDjgIIiLHdpdGhOYW1lOiLnrKx7c2VyaWVzSWR95Liq57O75YiX5piv5LiA5Liq6KGo56S6e3Nlcmllc05hbWV955qEe3Nlcmllc1R5cGV977yMIix3aXRob3V0TmFtZToi56yse3Nlcmllc0lkfeS4quezu+WIl+aYr+S4gOS4qntzZXJpZXNUeXBlfe+8jCIsc2VwYXJhdG9yOnttaWRkbGU6Iu+8myIsZW5kOiLjgIIifX19LGRhdGE6e2FsbERhdGE6IuWFtuaVsOaNruaYr+KAlOKAlCIscGFydGlhbERhdGE6IuWFtuS4re+8jOWJjXtkaXNwbGF5Q250femhueaYr+KAlOKAlCIsd2l0aE5hbWU6IntuYW1lfeeahOaVsOaNruaYr3t2YWx1ZX0iLHdpdGhvdXROYW1lOiJ7dmFsdWV9IixzZXBhcmF0b3I6e21pZGRsZToi77yMIixlbmQ6IiJ9fX19LExjPWZ1bmN0aW9uKHQsZSl7dmFyIGE9ZS5nZXRNb2RlbCgiYXJpYSIpO2lmKGEuZ2V0KCJzaG93IikpaWYoYS5nZXQoImRlc2NyaXB0aW9uIikpdC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGEuZ2V0KCJkZXNjcmlwdGlvbiIpKTtlbHNle3ZhciBoPTA7ZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQsZSl7KytofSx0aGlzKTt2YXIgaSxjPWEuZ2V0KCJkYXRhLm1heENvdW50Iil8fDEwLG49YS5nZXQoInNlcmllcy5tYXhDb3VudCIpfHwxMCxkPU1hdGgubWluKGgsbik7aWYoIShoPDEpKXt2YXIgbz1mdW5jdGlvbigpe3ZhciB0PWUuZ2V0TW9kZWwoInRpdGxlIikub3B0aW9uO3QmJnQubGVuZ3RoJiYodD10WzBdKTtyZXR1cm4gdCYmdC50ZXh0fSgpO2k9bz9wKGcoImdlbmVyYWwud2l0aFRpdGxlIikse3RpdGxlOm99KTpnKCJnZW5lcmFsLndpdGhvdXRUaXRsZSIpO3ZhciBmPVtdO2krPXAoZygxPGg/InNlcmllcy5tdWx0aXBsZS5wcmVmaXgiOiJzZXJpZXMuc2luZ2xlLnByZWZpeCIpLHtzZXJpZXNDb3VudDpofSksZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQsZSl7aWYoZTxkKXt2YXIgaSxuPXQuZ2V0KCJuYW1lIiksbz0ic2VyaWVzLiIrKDE8aD8ibXVsdGlwbGUiOiJzaW5nbGUiKSsiLiI7aT1wKGk9ZyhuP28rIndpdGhOYW1lIjpvKyJ3aXRob3V0TmFtZSIpLHtzZXJpZXNJZDp0LnNlcmllc0luZGV4LHNlcmllc05hbWU6dC5nZXQoIm5hbWUiKSxzZXJpZXNUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBDYy5zZXJpZXMudHlwZU5hbWVzW3RdfHwi6Ieq5a6a5LmJ5Zu+In0odC5zdWJUeXBlKX0pO3ZhciBhPXQuZ2V0RGF0YSgpOyh3aW5kb3cuZGF0YT1hKS5jb3VudCgpPmM/aSs9cChnKCJkYXRhLnBhcnRpYWxEYXRhIikse2Rpc3BsYXlDbnQ6Y30pOmkrPWcoImRhdGEuYWxsRGF0YSIpO2Zvcih2YXIgcj1bXSxzPTA7czxhLmNvdW50KCk7cysrKWlmKHM8Yyl7dmFyIGw9YS5nZXROYW1lKHMpLHU9QmgoYSxzKTtyLnB1c2gocChnKGw/ImRhdGEud2l0aE5hbWUiOiJkYXRhLndpdGhvdXROYW1lIikse25hbWU6bCx2YWx1ZTp1fSkpfWkrPXIuam9pbihnKCJkYXRhLnNlcGFyYXRvci5taWRkbGUiKSkrZygiZGF0YS5zZXBhcmF0b3IuZW5kIiksZi5wdXNoKGkpfX0pLGkrPWYuam9pbihnKCJzZXJpZXMubXVsdGlwbGUuc2VwYXJhdG9yLm1pZGRsZSIpKStnKCJzZXJpZXMubXVsdGlwbGUuc2VwYXJhdG9yLmVuZCIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixpKX19ZnVuY3Rpb24gcCh0LGUpe2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDt2YXIgaT10O3JldHVybiBFKGUsZnVuY3Rpb24odCxlKXtpPWkucmVwbGFjZShuZXcgUmVnRXhwKCJcXHtcXHMqIitlKyJcXHMqXFx9IiwiZyIpLHQpfSksaX1mdW5jdGlvbiBnKHQpe3ZhciBlPWEuZ2V0KHQpO2lmKG51bGwhPWUpcmV0dXJuIGU7Zm9yKHZhciBpPXQuc3BsaXQoIi4iKSxuPUNjLmFyaWEsbz0wO288aS5sZW5ndGg7KytvKW49bltpW29dXTtyZXR1cm4gbn19LGtjPU1hdGguUEk7ZnVuY3Rpb24gUGModCxlLGksbil7dGhpcy5lY0luc3RhbmNlPXQsdGhpcy5hcGk9ZSx0aGlzLnVuZmluaXNoZWQ7aT10aGlzLl9kYXRhUHJvY2Vzc29ySGFuZGxlcnM9aS5zbGljZSgpLG49dGhpcy5fdmlzdWFsSGFuZGxlcnM9bi5zbGljZSgpO3RoaXMuX2FsbEhhbmRsZXJzPWkuY29uY2F0KG4pLHRoaXMuX3N0YWdlVGFza01hcD1RKCl9dmFyIE5jPVBjLnByb3RvdHlwZTtmdW5jdGlvbiBPYyhsLHQsdSxoLGMpe3ZhciBkO2Z1bmN0aW9uIGYodCxlKXtyZXR1cm4gdC5zZXREaXJ0eSYmKCF0LmRpcnR5TWFwfHx0LmRpcnR5TWFwLmdldChlLl9fcGlwZWxpbmUuaWQpKX1jPWN8fHt9LEUodCxmdW5jdGlvbihuLHQpe2lmKCFjLnZpc3VhbFR5cGV8fGMudmlzdWFsVHlwZT09PW4udmlzdWFsVHlwZSl7dmFyIGU9bC5fc3RhZ2VUYXNrTWFwLmdldChuLnVpZCksaT1lLnNlcmllc1Rhc2tNYXAsbz1lLm92ZXJhbGxUYXNrO2lmKG8pe3ZhciBhLHI9by5hZ2VudFN0dWJNYXA7ci5lYWNoKGZ1bmN0aW9uKHQpe2YoYyx0KSYmKHQuZGlydHkoKSxhPSEwKX0pLGEmJm8uZGlydHkoKSxFYyhvLGgpO3ZhciBzPWwuZ2V0UGVyZm9ybUFyZ3MobyxjLmJsb2NrKTtyLmVhY2goZnVuY3Rpb24odCl7dC5wZXJmb3JtKHMpfSksZHw9by5wZXJmb3JtKHMpfWVsc2UgaSYmaS5lYWNoKGZ1bmN0aW9uKHQsZSl7ZihjLHQpJiZ0LmRpcnR5KCk7dmFyIGk9bC5nZXRQZXJmb3JtQXJncyh0LGMuYmxvY2spO2kuc2tpcD0hbi5wZXJmb3JtUmF3U2VyaWVzJiZ1LmlzU2VyaWVzRmlsdGVyZWQodC5jb250ZXh0Lm1vZGVsKSxFYyh0LGgpLGR8PXQucGVyZm9ybShpKX0pfX0pLGwudW5maW5pc2hlZHw9ZH1OYy5yZXN0b3JlRGF0YT1mdW5jdGlvbih0LGUpe3QucmVzdG9yZURhdGEoZSksdGhpcy5fc3RhZ2VUYXNrTWFwLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5vdmVyYWxsVGFzaztlJiZlLmRpcnR5KCl9KX0sTmMuZ2V0UGVyZm9ybUFyZ3M9ZnVuY3Rpb24odCxlKXtpZih0Ll9fcGlwZWxpbmUpe3ZhciBpPXRoaXMuX3BpcGVsaW5lTWFwLmdldCh0Ll9fcGlwZWxpbmUuaWQpLG49aS5jb250ZXh0LG89IWUmJmkucHJvZ3Jlc3NpdmVFbmFibGVkJiYoIW58fG4ucHJvZ3Jlc3NpdmVSZW5kZXIpJiZ0Ll9faWR4SW5QaXBlbGluZT5pLmJsb2NrSW5kZXg/aS5zdGVwOm51bGwsYT1uJiZuLm1vZERhdGFDb3VudDtyZXR1cm57c3RlcDpvLG1vZEJ5Om51bGwhPWE/TWF0aC5jZWlsKGEvbyk6bnVsbCxtb2REYXRhQ291bnQ6YX19fSxOYy5nZXRQaXBlbGluZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGlwZWxpbmVNYXAuZ2V0KHQpfSxOYy51cGRhdGVTdHJlYW1Nb2Rlcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3BpcGVsaW5lTWFwLmdldCh0LnVpZCksbj10LmdldERhdGEoKS5jb3VudCgpLG89aS5wcm9ncmVzc2l2ZUVuYWJsZWQmJmUuaW5jcmVtZW50YWxQcmVwYXJlUmVuZGVyJiZuPj1pLnRocmVzaG9sZCxhPXQuZ2V0KCJsYXJnZSIpJiZuPj10LmdldCgibGFyZ2VUaHJlc2hvbGQiKSxyPSJtb2QiPT09dC5nZXQoInByb2dyZXNzaXZlQ2h1bmtNb2RlIik/bjpudWxsO3QucGlwZWxpbmVDb250ZXh0PWkuY29udGV4dD17cHJvZ3Jlc3NpdmVSZW5kZXI6byxtb2REYXRhQ291bnQ6cixsYXJnZTphfX0sTmMucmVzdG9yZVBpcGVsaW5lcz1mdW5jdGlvbih0KXt2YXIgbj10aGlzLG89bi5fcGlwZWxpbmVNYXA9USgpO3QuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt2YXIgZT10LmdldFByb2dyZXNzaXZlKCksaT10LnVpZDtvLnNldChpLHtpZDppLGhlYWQ6bnVsbCx0YWlsOm51bGwsdGhyZXNob2xkOnQuZ2V0UHJvZ3Jlc3NpdmVUaHJlc2hvbGQoKSxwcm9ncmVzc2l2ZUVuYWJsZWQ6ZSYmISh0LnByZXZlbnRJbmNyZW1lbnRhbCYmdC5wcmV2ZW50SW5jcmVtZW50YWwoKSksYmxvY2tJbmRleDotMSxzdGVwOk1hdGgucm91bmQoZXx8NzAwKSxjb3VudDowfSksVWMobix0LHQuZGF0YVRhc2spfSl9LE5jLnByZXBhcmVTdGFnZVRhc2tzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5fc3RhZ2VUYXNrTWFwLG49dGhpcy5lY0luc3RhbmNlLmdldE1vZGVsKCksbz10aGlzLmFwaTtFKHRoaXMuX2FsbEhhbmRsZXJzLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0KHQudWlkKXx8aS5zZXQodC51aWQsW10pO3QucmVzZXQmJmZ1bmN0aW9uKG4sbyx0LGEscil7dmFyIHM9dC5zZXJpZXNUYXNrTWFwfHwodC5zZXJpZXNUYXNrTWFwPVEoKSksZT1vLnNlcmllc1R5cGUsaT1vLmdldFRhcmdldFNlcmllcztvLmNyZWF0ZU9uQWxsU2VyaWVzP2EuZWFjaFJhd1NlcmllcyhsKTplP2EuZWFjaFJhd1Nlcmllc0J5VHlwZShlLGwpOmkmJmkoYSxyKS5lYWNoKGwpO2Z1bmN0aW9uIGwodCl7dmFyIGU9dC51aWQsaT1zLmdldChlKXx8cy5zZXQoZSxXaCh7cGxhbjpHYyxyZXNldDpGYyxjb3VudDpaY30pKTtpLmNvbnRleHQ9e21vZGVsOnQsZWNNb2RlbDphLGFwaTpyLHVzZUNsZWFyVmlzdWFsOm8uaXNWaXN1YWwmJiFvLmlzTGF5b3V0LHBsYW46by5wbGFuLHJlc2V0Om8ucmVzZXQsc2NoZWR1bGVyOm59LFVjKG4sdCxpKX12YXIgdT1uLl9waXBlbGluZU1hcDtzLmVhY2goZnVuY3Rpb24odCxlKXt1LmdldChlKXx8KHQuZGlzcG9zZSgpLHMucmVtb3ZlS2V5KGUpKX0pfSh0aGlzLHQsZSxuLG8pLHQub3ZlcmFsbFJlc2V0JiZmdW5jdGlvbihuLHQsZSxpLG8pe3ZhciBhPWUub3ZlcmFsbFRhc2s9ZS5vdmVyYWxsVGFza3x8V2goe3Jlc2V0OnpjfSk7YS5jb250ZXh0PXtlY01vZGVsOmksYXBpOm8sb3ZlcmFsbFJlc2V0OnQub3ZlcmFsbFJlc2V0LHNjaGVkdWxlcjpufTt2YXIgcj1hLmFnZW50U3R1Yk1hcD1hLmFnZW50U3R1Yk1hcHx8USgpLHM9dC5zZXJpZXNUeXBlLGw9dC5nZXRUYXJnZXRTZXJpZXMsdT0hMCxoPXQubW9kaWZ5T3V0cHV0RW5kO3M/aS5lYWNoUmF3U2VyaWVzQnlUeXBlKHMsYyk6bD9sKGksbykuZWFjaChjKToodT0hMSxFKGkuZ2V0U2VyaWVzKCksYykpO2Z1bmN0aW9uIGModCl7dmFyIGU9dC51aWQsaT1yLmdldChlKTtpfHwoaT1yLnNldChlLFdoKHtyZXNldDpSYyxvbkRpcnR5OlZjfSkpLGEuZGlydHkoKSksaS5jb250ZXh0PXttb2RlbDp0LG92ZXJhbGxQcm9ncmVzczp1LG1vZGlmeU91dHB1dEVuZDpofSxpLmFnZW50PWEsaS5fX2Jsb2NrPXUsVWMobix0LGkpfXZhciBkPW4uX3BpcGVsaW5lTWFwO3IuZWFjaChmdW5jdGlvbih0LGUpe2QuZ2V0KGUpfHwodC5kaXNwb3NlKCksYS5kaXJ0eSgpLHIucmVtb3ZlS2V5KGUpKX0pfSh0aGlzLHQsZSxuLG8pfSx0aGlzKX0sTmMucHJlcGFyZVZpZXc9ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dC5yZW5kZXJUYXNrLGE9by5jb250ZXh0O2EubW9kZWw9ZSxhLmVjTW9kZWw9aSxhLmFwaT1uLG8uX19ibG9jaz0hdC5pbmNyZW1lbnRhbFByZXBhcmVSZW5kZXIsVWModGhpcyxlLG8pfSxOYy5wZXJmb3JtRGF0YVByb2Nlc3NvclRhc2tzPWZ1bmN0aW9uKHQsZSl7T2ModGhpcyx0aGlzLl9kYXRhUHJvY2Vzc29ySGFuZGxlcnMsdCxlLHtibG9jazohMH0pfSxOYy5wZXJmb3JtVmlzdWFsVGFza3M9ZnVuY3Rpb24odCxlLGkpe09jKHRoaXMsdGhpcy5fdmlzdWFsSGFuZGxlcnMsdCxlLGkpfSxOYy5wZXJmb3JtU2VyaWVzVGFza3M9ZnVuY3Rpb24odCl7dmFyIGU7dC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe2V8PXQuZGF0YVRhc2sucGVyZm9ybSgpfSksdGhpcy51bmZpbmlzaGVkfD1lfSxOYy5wbGFuPWZ1bmN0aW9uKCl7dGhpcy5fcGlwZWxpbmVNYXAuZWFjaChmdW5jdGlvbih0KXt2YXIgZT10LnRhaWw7ZG97aWYoZS5fX2Jsb2NrKXt0LmJsb2NrSW5kZXg9ZS5fX2lkeEluUGlwZWxpbmU7YnJlYWt9ZT1lLmdldFVwc3RyZWFtKCl9d2hpbGUoZSl9KX07dmFyIEVjPU5jLnVwZGF0ZVBheWxvYWQ9ZnVuY3Rpb24odCxlKXsicmVtYWluIiE9PWUmJih0LmNvbnRleHQucGF5bG9hZD1lKX07ZnVuY3Rpb24gemModCl7dC5vdmVyYWxsUmVzZXQodC5lY01vZGVsLHQuYXBpLHQucGF5bG9hZCl9ZnVuY3Rpb24gUmModCxlKXtyZXR1cm4gdC5vdmVyYWxsUHJvZ3Jlc3MmJkJjfWZ1bmN0aW9uIEJjKCl7dGhpcy5hZ2VudC5kaXJ0eSgpLHRoaXMuZ2V0RG93bnN0cmVhbSgpLmRpcnR5KCl9ZnVuY3Rpb24gVmMoKXt0aGlzLmFnZW50JiZ0aGlzLmFnZW50LmRpcnR5KCl9ZnVuY3Rpb24gR2ModCl7cmV0dXJuIHQucGxhbiYmdC5wbGFuKHQubW9kZWwsdC5lY01vZGVsLHQuYXBpLHQucGF5bG9hZCl9ZnVuY3Rpb24gRmModCl7dC51c2VDbGVhclZpc3VhbCYmdC5kYXRhLmNsZWFyQWxsVmlzdWFsKCk7dmFyIGU9dC5yZXNldERlZmluZXM9RW8odC5yZXNldCh0Lm1vZGVsLHQuZWNNb2RlbCx0LmFwaSx0LnBheWxvYWQpKTtyZXR1cm4gMTxlLmxlbmd0aD9OKGUsZnVuY3Rpb24odCxlKXtyZXR1cm4gSGMoZSl9KTpXY312YXIgV2M9SGMoMCk7ZnVuY3Rpb24gSGMoYSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5kYXRhLG49ZS5yZXNldERlZmluZXNbYV07aWYobiYmbi5kYXRhRWFjaClmb3IodmFyIG89dC5zdGFydDtvPHQuZW5kO28rKyluLmRhdGFFYWNoKGksbyk7ZWxzZSBuJiZuLnByb2dyZXNzJiZuLnByb2dyZXNzKHQsaSl9fWZ1bmN0aW9uIFpjKHQpe3JldHVybiB0LmRhdGEuY291bnQoKX1mdW5jdGlvbiBVYyh0LGUsaSl7dmFyIG49ZS51aWQsbz10Ll9waXBlbGluZU1hcC5nZXQobik7by5oZWFkfHwoby5oZWFkPWkpLG8udGFpbCYmby50YWlsLnBpcGUoaSksKG8udGFpbD1pKS5fX2lkeEluUGlwZWxpbmU9by5jb3VudCsrLGkuX19waXBlbGluZT1vfVBjLndyYXBTdGFnZUhhbmRsZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTyh0KSYmKHQ9e292ZXJhbGxSZXNldDp0LHNlcmllc1R5cGU6ZnVuY3Rpb24odCl7WGM9bnVsbDt0cnl7dChZYyxqYyl9Y2F0Y2godCl7fXJldHVybiBYY30odCl9KSx0LnVpZD1DbCgic3RhZ2VIYW5kbGVyIiksZSYmKHQudmlzdWFsVHlwZT1lKSx0fTt2YXIgWGMsWWM9e30samM9e307ZnVuY3Rpb24gcWModCxlKXtmb3IodmFyIGkgaW4gZS5wcm90b3R5cGUpdFtpXT1ldH1xYyhZYywkdSkscWMoamMsZWgpLFljLmVhY2hTZXJpZXNCeVR5cGU9WWMuZWFjaFJhd1Nlcmllc0J5VHlwZT1mdW5jdGlvbih0KXtYYz10fSxZYy5lYWNoQ29tcG9uZW50PWZ1bmN0aW9uKHQpeyJzZXJpZXMiPT09dC5tYWluVHlwZSYmdC5zdWJUeXBlJiYoWGM9dC5zdWJUeXBlKX07ZnVuY3Rpb24gS2MoKXtyZXR1cm57YXhpc0xpbmU6e2xpbmVTdHlsZTp7Y29sb3I6UWN9fSxheGlzVGljazp7bGluZVN0eWxlOntjb2xvcjpRY319LGF4aXNMYWJlbDp7dGV4dFN0eWxlOntjb2xvcjpRY319LHNwbGl0TGluZTp7bGluZVN0eWxlOnt0eXBlOiJkYXNoZWQiLGNvbG9yOiIjYWFhIn19LHNwbGl0QXJlYTp7YXJlYVN0eWxlOntjb2xvcjpRY319fX12YXIgJGM9WyIjMzdBMkRBIiwiIzMyQzVFOSIsIiM2N0UwRTMiLCIjOUZFNkI4IiwiI0ZGREI1QyIsIiNmZjlmN2YiLCIjZmI3MjkzIiwiI0UwNjJBRSIsIiNFNjkwRDEiLCIjZTdiY2YzIiwiIzlkOTZmNSIsIiM4Mzc4RUEiLCIjOTZCRkZGIl0sSmM9e2NvbG9yOiRjLGNvbG9yTGF5ZXI6W1siIzM3QTJEQSIsIiNmZmQ4NWMiLCIjZmQ3YjVmIl0sWyIjMzdBMkRBIiwiIzY3RTBFMyIsIiNGRkRCNUMiLCIjZmY5ZjdmIiwiI0UwNjJBRSIsIiM5ZDk2ZjUiXSxbIiMzN0EyREEiLCIjMzJDNUU5IiwiIzlGRTZCOCIsIiNGRkRCNUMiLCIjZmY5ZjdmIiwiI2ZiNzI5MyIsIiNlN2JjZjMiLCIjODM3OEVBIiwiIzk2QkZGRiJdLCRjXX0sUWM9IiNlZWUiLHRkPVsiI2RkNmI2NiIsIiM3NTlhYTAiLCIjZTY5ZDg3IiwiIzhkYzFhOSIsIiNlYTdlNTMiLCIjZWVkZDc4IiwiIzczYTM3MyIsIiM3M2I5YmMiLCIjNzI4OWFiIiwiIzkxY2E4YyIsIiNmNDlmNDIiXSxlZD17Y29sb3I6dGQsYmFja2dyb3VuZENvbG9yOiIjMzMzIix0b29sdGlwOntheGlzUG9pbnRlcjp7bGluZVN0eWxlOntjb2xvcjpRY30sY3Jvc3NTdHlsZTp7Y29sb3I6UWN9LGxhYmVsOntjb2xvcjoiIzAwMCJ9fX0sbGVnZW5kOnt0ZXh0U3R5bGU6e2NvbG9yOlFjfX0sdGV4dFN0eWxlOntjb2xvcjpRY30sdGl0bGU6e3RleHRTdHlsZTp7Y29sb3I6UWN9fSx0b29sYm94OntpY29uU3R5bGU6e25vcm1hbDp7Ym9yZGVyQ29sb3I6UWN9fX0sZGF0YVpvb206e3RleHRTdHlsZTp7Y29sb3I6UWN9fSx2aXN1YWxNYXA6e3RleHRTdHlsZTp7Y29sb3I6UWN9fSx0aW1lbGluZTp7bGluZVN0eWxlOntjb2xvcjpRY30saXRlbVN0eWxlOntub3JtYWw6e2NvbG9yOnRkWzFdfX0sbGFiZWw6e25vcm1hbDp7dGV4dFN0eWxlOntjb2xvcjpRY319fSxjb250cm9sU3R5bGU6e25vcm1hbDp7Y29sb3I6UWMsYm9yZGVyQ29sb3I6UWN9fX0sdGltZUF4aXM6S2MoKSxsb2dBeGlzOktjKCksdmFsdWVBeGlzOktjKCksY2F0ZWdvcnlBeGlzOktjKCksbGluZTp7c3ltYm9sOiJjaXJjbGUifSxncmFwaDp7Y29sb3I6dGR9LGdhdWdlOnt0aXRsZTp7dGV4dFN0eWxlOntjb2xvcjpRY319fSxjYW5kbGVzdGljazp7aXRlbVN0eWxlOntub3JtYWw6e2NvbG9yOiIjRkQxMDUwIixjb2xvcjA6IiMwQ0Y0OUIiLGJvcmRlckNvbG9yOiIjRkQxMDUwIixib3JkZXJDb2xvcjA6IiMwQ0Y0OUIifX19fTtlZC5jYXRlZ29yeUF4aXMuc3BsaXRMaW5lLnNob3c9ITEsVHUuZXh0ZW5kKHt0eXBlOiJkYXRhc2V0IixkZWZhdWx0T3B0aW9uOntzZXJpZXNMYXlvdXRCeTpCdSxzb3VyY2VIZWFkZXI6bnVsbCxkaW1lbnNpb25zOm51bGwsc291cmNlOm51bGx9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7dmFyIGU9dC5vcHRpb24uc291cmNlLGk9enU7aWYoVihlKSlpPVJ1O2Vsc2UgaWYoayhlKSl7MD09PWUubGVuZ3RoJiYoaT1OdSk7Zm9yKHZhciBuPTAsbz1lLmxlbmd0aDtuPG87bisrKXt2YXIgYT1lW25dO2lmKG51bGwhPWEpe2lmKGsoYSkpe2k9TnU7YnJlYWt9aWYoUihhKSl7aT1PdTticmVha319fX1lbHNlIGlmKFIoZSkpe2Zvcih2YXIgciBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkocikmJlAoZVtyXSkpe2k9RXU7YnJlYWt9fWVsc2UgaWYobnVsbCE9ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YSIpO1d1KHQpLnNvdXJjZUZvcm1hdD1pfSh0aGlzKX19KSxoYy5leHRlbmQoe3R5cGU6ImRhdGFzZXQifSk7dmFyIGlkPVNyLmV4dGVuZCh7dHlwZToiZWxsaXBzZSIsc2hhcGU6e2N4OjAsY3k6MCxyeDowLHJ5OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuY3gsbj1lLmN5LG89ZS5yeCxhPWUucnkscj0uNTUyMjg0OCpvLHM9LjU1MjI4NDgqYTt0Lm1vdmVUbyhpLW8sbiksdC5iZXppZXJDdXJ2ZVRvKGktbyxuLXMsaS1yLG4tYSxpLG4tYSksdC5iZXppZXJDdXJ2ZVRvKGkrcixuLWEsaStvLG4tcyxpK28sbiksdC5iZXppZXJDdXJ2ZVRvKGkrbyxuK3MsaStyLG4rYSxpLG4rYSksdC5iZXppZXJDdXJ2ZVRvKGktcixuK2EsaS1vLG4rcyxpLW8sbiksdC5jbG9zZVBhdGgoKX19KSxuZD0vW1xzLF0rLztmdW5jdGlvbiBvZCh0KXt6KHQpJiYodD0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIikpO2Zvcig5PT09dC5ub2RlVHlwZSYmKHQ9dC5maXJzdENoaWxkKTsic3ZnIiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKXx8MSE9PXQubm9kZVR5cGU7KXQ9dC5uZXh0U2libGluZztyZXR1cm4gdH1mdW5jdGlvbiBhZCgpe3RoaXMuX2RlZnM9e30sdGhpcy5fcm9vdD1udWxsLHRoaXMuX2lzRGVmaW5lPSExLHRoaXMuX2lzVGV4dD0hMX1hZC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCxlKXtlPWV8fHt9O3ZhciBpPW9kKHQpO2lmKCFpKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBzdmciKTt2YXIgbj1uZXcgSWk7dGhpcy5fcm9vdD1uO3ZhciBvPWkuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIiLGE9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgid2lkdGgiKXx8ZS53aWR0aCkscj1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKXx8ZS5oZWlnaHQpO2lzTmFOKGEpJiYoYT1udWxsKSxpc05hTihyKSYmKHI9bnVsbCksY2QoaSxuLG51bGwsITApO2Zvcih2YXIgcyxsLHU9aS5maXJzdENoaWxkO3U7KXRoaXMuX3BhcnNlTm9kZSh1LG4pLHU9dS5uZXh0U2libGluZztpZihvKXt2YXIgaD1qKG8pLnNwbGl0KG5kKTs0PD1oLmxlbmd0aCYmKHM9e3g6cGFyc2VGbG9hdChoWzBdfHwwKSx5OnBhcnNlRmxvYXQoaFsxXXx8MCksd2lkdGg6cGFyc2VGbG9hdChoWzJdKSxoZWlnaHQ6cGFyc2VGbG9hdChoWzNdKX0pfWlmKHMmJm51bGwhPWEmJm51bGwhPXImJihsPW1kKHMsYSxyKSwhZS5pZ25vcmVWaWV3Qm94KSl7dmFyIGM9bjsobj1uZXcgSWkpLmFkZChjKSxjLnNjYWxlPWwuc2NhbGUuc2xpY2UoKSxjLnBvc2l0aW9uPWwucG9zaXRpb24uc2xpY2UoKX1yZXR1cm4gZS5pZ25vcmVSb290Q2xpcHx8bnVsbD09YXx8bnVsbD09cnx8bi5zZXRDbGlwUGF0aChuZXcgaXMoe3NoYXBlOnt4OjAseTowLHdpZHRoOmEsaGVpZ2h0OnJ9fSkpLHtyb290Om4sd2lkdGg6YSxoZWlnaHQ6cix2aWV3Qm94UmVjdDpzLHZpZXdCb3hUcmFuc2Zvcm06bH19LGFkLnByb3RvdHlwZS5fcGFyc2VOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIGksbixvPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigiZGVmcyI9PT1vP3RoaXMuX2lzRGVmaW5lPSEwOiJ0ZXh0Ij09PW8mJih0aGlzLl9pc1RleHQ9ITApLHRoaXMuX2lzRGVmaW5lKXtpZihuPXNkW29dKXt2YXIgYT1uLmNhbGwodGhpcyx0KSxyPXQuZ2V0QXR0cmlidXRlKCJpZCIpO3ImJih0aGlzLl9kZWZzW3JdPWEpfX1lbHNlKG49cmRbb10pJiYoaT1uLmNhbGwodGhpcyx0LGUpLGUuYWRkKGkpKTtmb3IodmFyIHM9dC5maXJzdENoaWxkO3M7KTE9PT1zLm5vZGVUeXBlJiZ0aGlzLl9wYXJzZU5vZGUocyxpKSwzPT09cy5ub2RlVHlwZSYmdGhpcy5faXNUZXh0JiZ0aGlzLl9wYXJzZVRleHQocyxpKSxzPXMubmV4dFNpYmxpbmc7ImRlZnMiPT09bz90aGlzLl9pc0RlZmluZT0hMToidGV4dCI9PT1vJiYodGhpcy5faXNUZXh0PSExKX0sYWQucHJvdG90eXBlLl9wYXJzZVRleHQ9ZnVuY3Rpb24odCxlKXtpZigxPT09dC5ub2RlVHlwZSl7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImR4Iil8fDAsbj10LmdldEF0dHJpYnV0ZSgiZHkiKXx8MDt0aGlzLl90ZXh0WCs9cGFyc2VGbG9hdChpKSx0aGlzLl90ZXh0WSs9cGFyc2VGbG9hdChuKX12YXIgbz1uZXcgRnIoe3N0eWxlOnt0ZXh0OnQudGV4dENvbnRlbnQsdHJhbnNmb3JtVGV4dDohMH0scG9zaXRpb246W3RoaXMuX3RleHRYfHwwLHRoaXMuX3RleHRZfHwwXX0pO2xkKGUsbyksY2QodCxvLHRoaXMuX2RlZnMpO3ZhciBhPW8uc3R5bGUuZm9udFNpemU7YSYmYTw5JiYoby5zdHlsZS5mb250U2l6ZT05LG8uc2NhbGU9by5zY2FsZXx8WzEsMV0sby5zY2FsZVswXSo9YS85LG8uc2NhbGVbMV0qPWEvOSk7dmFyIHI9by5nZXRCb3VuZGluZ1JlY3QoKTtyZXR1cm4gdGhpcy5fdGV4dFgrPXIud2lkdGgsZS5hZGQobyksb307dmFyIHJkPXtnOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IElpO3JldHVybiBsZChlLGkpLGNkKHQsaSx0aGlzLl9kZWZzKSxpfSxyZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IGlzO3JldHVybiBsZChlLGkpLGNkKHQsaSx0aGlzLl9kZWZzKSxpLnNldFNoYXBlKHt4OnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoIngiKXx8MCkseTpwYXJzZUZsb2F0KHQuZ2V0QXR0cmlidXRlKCJ5Iil8fDApLHdpZHRoOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoIndpZHRoIil8fDApLGhlaWdodDpwYXJzZUZsb2F0KHQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKXx8MCl9KSxpfSxjaXJjbGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgSHI7cmV0dXJuIGxkKGUsaSksY2QodCxpLHRoaXMuX2RlZnMpLGkuc2V0U2hhcGUoe2N4OnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoImN4Iil8fDApLGN5OnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoImN5Iil8fDApLHI6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgiciIpfHwwKX0pLGl9LGxpbmU6ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgb3M7cmV0dXJuIGxkKGUsaSksY2QodCxpLHRoaXMuX2RlZnMpLGkuc2V0U2hhcGUoe3gxOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoIngxIil8fDApLHkxOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoInkxIil8fDApLHgyOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoIngyIil8fDApLHkyOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoInkyIil8fDApfSksaX0sZWxsaXBzZTpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBpZDtyZXR1cm4gbGQoZSxpKSxjZCh0LGksdGhpcy5fZGVmcyksaS5zZXRTaGFwZSh7Y3g6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgiY3giKXx8MCksY3k6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgiY3kiKXx8MCkscng6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgicngiKXx8MCkscnk6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgicnkiKXx8MCl9KSxpfSxwb2x5Z29uOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoInBvaW50cyIpO2k9aSYmdWQoaSk7dmFyIG49bmV3IHFyKHtzaGFwZTp7cG9pbnRzOml8fFtdfX0pO3JldHVybiBsZChlLG4pLGNkKHQsbix0aGlzLl9kZWZzKSxufSxwb2x5bGluZTpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBTcjtsZChlLGkpLGNkKHQsaSx0aGlzLl9kZWZzKTt2YXIgbj10LmdldEF0dHJpYnV0ZSgicG9pbnRzIik7cmV0dXJuIG49biYmdWQobiksbmV3IEtyKHtzaGFwZTp7cG9pbnRzOm58fFtdfX0pfSxpbWFnZTpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBxbjtyZXR1cm4gbGQoZSxpKSxjZCh0LGksdGhpcy5fZGVmcyksaS5zZXRTdHlsZSh7aW1hZ2U6dC5nZXRBdHRyaWJ1dGUoInhsaW5rOmhyZWYiKSx4OnQuZ2V0QXR0cmlidXRlKCJ4IikseTp0LmdldEF0dHJpYnV0ZSgieSIpLHdpZHRoOnQuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDp0LmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iil9KSxpfSx0ZXh0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoIngiKXx8MCxuPXQuZ2V0QXR0cmlidXRlKCJ5Iil8fDAsbz10LmdldEF0dHJpYnV0ZSgiZHgiKXx8MCxhPXQuZ2V0QXR0cmlidXRlKCJkeSIpfHwwO3RoaXMuX3RleHRYPXBhcnNlRmxvYXQoaSkrcGFyc2VGbG9hdChvKSx0aGlzLl90ZXh0WT1wYXJzZUZsb2F0KG4pK3BhcnNlRmxvYXQoYSk7dmFyIHI9bmV3IElpO3JldHVybiBsZChlLHIpLGNkKHQscix0aGlzLl9kZWZzKSxyfSx0c3BhbjpmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJ4Iiksbj10LmdldEF0dHJpYnV0ZSgieSIpO251bGwhPWkmJih0aGlzLl90ZXh0WD1wYXJzZUZsb2F0KGkpKSxudWxsIT1uJiYodGhpcy5fdGV4dFk9cGFyc2VGbG9hdChuKSk7dmFyIG89dC5nZXRBdHRyaWJ1dGUoImR4Iil8fDAsYT10LmdldEF0dHJpYnV0ZSgiZHkiKXx8MCxyPW5ldyBJaTtyZXR1cm4gbGQoZSxyKSxjZCh0LHIsdGhpcy5fZGVmcyksdGhpcy5fdGV4dFgrPW8sdGhpcy5fdGV4dFkrPWEscn0scGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPUdyKHQuZ2V0QXR0cmlidXRlKCJkIil8fCIiKTtyZXR1cm4gbGQoZSxpKSxjZCh0LGksdGhpcy5fZGVmcyksaX19LHNkPXtsaW5lYXJncmFkaWVudDpmdW5jdGlvbih0KXt2YXIgZT1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgieDEiKXx8MCwxMCksaT1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgieTEiKXx8MCwxMCksbj1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgieDIiKXx8MTAsMTApLG89cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoInkyIil8fDAsMTApLGE9bmV3IGNzKGUsaSxuLG8pO3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBpPXQuZmlyc3RDaGlsZDtmb3IoO2k7KXtpZigxPT09aS5ub2RlVHlwZSl7dmFyIG49aS5nZXRBdHRyaWJ1dGUoIm9mZnNldCIpO249MDxuLmluZGV4T2YoIiUiKT9wYXJzZUludChuLDEwKS8xMDA6bj9wYXJzZUZsb2F0KG4pOjA7dmFyIG89aS5nZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiKXx8IiMwMDAwMDAiO2UuYWRkQ29sb3JTdG9wKG4sbyl9aT1pLm5leHRTaWJsaW5nfX0odCxhKSxhfSxyYWRpYWxncmFkaWVudDpmdW5jdGlvbih0KXt9fTtmdW5jdGlvbiBsZCh0LGUpe3QmJnQuX19pbmhlcml0ZWRTdHlsZSYmKGUuX19pbmhlcml0ZWRTdHlsZXx8KGUuX19pbmhlcml0ZWRTdHlsZT17fSksQyhlLl9faW5oZXJpdGVkU3R5bGUsdC5fX2luaGVyaXRlZFN0eWxlKSl9ZnVuY3Rpb24gdWQodCl7Zm9yKHZhciBlPWoodCkuc3BsaXQobmQpLGk9W10sbj0wO248ZS5sZW5ndGg7bis9Mil7dmFyIG89cGFyc2VGbG9hdChlW25dKSxhPXBhcnNlRmxvYXQoZVtuKzFdKTtpLnB1c2goW28sYV0pfXJldHVybiBpfXZhciBoZD17ZmlsbDoiZmlsbCIsc3Ryb2tlOiJzdHJva2UiLCJzdHJva2Utd2lkdGgiOiJsaW5lV2lkdGgiLG9wYWNpdHk6Im9wYWNpdHkiLCJmaWxsLW9wYWNpdHkiOiJmaWxsT3BhY2l0eSIsInN0cm9rZS1vcGFjaXR5Ijoic3Ryb2tlT3BhY2l0eSIsInN0cm9rZS1kYXNoYXJyYXkiOiJsaW5lRGFzaCIsInN0cm9rZS1kYXNob2Zmc2V0IjoibGluZURhc2hPZmZzZXQiLCJzdHJva2UtbGluZWNhcCI6ImxpbmVDYXAiLCJzdHJva2UtbGluZWpvaW4iOiJsaW5lSm9pbiIsInN0cm9rZS1taXRlcmxpbWl0IjoibWl0ZXJMaW1pdCIsImZvbnQtZmFtaWx5IjoiZm9udEZhbWlseSIsImZvbnQtc2l6ZSI6ImZvbnRTaXplIiwiZm9udC1zdHlsZSI6ImZvbnRTdHlsZSIsImZvbnQtd2VpZ2h0IjoiZm9udFdlaWdodCIsInRleHQtYWxpZ24iOiJ0ZXh0QWxpZ24iLCJhbGlnbm1lbnQtYmFzZWxpbmUiOiJ0ZXh0QmFzZWxpbmUifTtmdW5jdGlvbiBjZCh0LGUsaSxuKXt2YXIgbz1lLl9faW5oZXJpdGVkU3R5bGV8fHt9LGE9InRleHQiPT09ZS50eXBlO2lmKDE9PT10Lm5vZGVUeXBlJiYoZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIik7aWYoaSl7aT1pLnJlcGxhY2UoLywvZywiICIpO3ZhciBuPW51bGwsbz1bXTtpLnJlcGxhY2UocGQsZnVuY3Rpb24odCxlLGkpe28ucHVzaChlLGkpfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLTE7MDxhO2EtPTIpe3ZhciByPW9bYV0scz1vW2EtMV07c3dpdGNoKG49bnx8ZWUoKSxzKXtjYXNlInRyYW5zbGF0ZSI6cj1qKHIpLnNwbGl0KG5kKSxhZShuLG4sW3BhcnNlRmxvYXQoclswXSkscGFyc2VGbG9hdChyWzFdfHwwKV0pO2JyZWFrO2Nhc2Uic2NhbGUiOnI9aihyKS5zcGxpdChuZCksc2UobixuLFtwYXJzZUZsb2F0KHJbMF0pLHBhcnNlRmxvYXQoclsxXXx8clswXSldKTticmVhaztjYXNlInJvdGF0ZSI6cj1qKHIpLnNwbGl0KG5kKSxyZShuLG4scGFyc2VGbG9hdChyWzBdKSk7YnJlYWs7Y2FzZSJza2V3IjpyPWoocikuc3BsaXQobmQpLGNvbnNvbGUud2FybigiU2tldyB0cmFuc2Zvcm0gaXMgbm90IHN1cHBvcnRlZCB5ZXQiKTticmVhaztjYXNlIm1hdHJpeCI6cj1qKHIpLnNwbGl0KG5kKTtuWzBdPXBhcnNlRmxvYXQoclswXSksblsxXT1wYXJzZUZsb2F0KHJbMV0pLG5bMl09cGFyc2VGbG9hdChyWzJdKSxuWzNdPXBhcnNlRmxvYXQoclszXSksbls0XT1wYXJzZUZsb2F0KHJbNF0pLG5bNV09cGFyc2VGbG9hdChyWzVdKX19ZS5zZXRMb2NhbFRyYW5zZm9ybShuKX19KHQsZSksTChvLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpLGk9e307aWYoIWUpcmV0dXJuIGk7dmFyIG4sbz17fTtnZC5sYXN0SW5kZXg9MDtmb3IoO251bGwhPShuPWdkLmV4ZWMoZSkpOylvW25bMV1dPW5bMl07Zm9yKHZhciBhIGluIGhkKWhkLmhhc093blByb3BlcnR5KGEpJiZudWxsIT1vW2FdJiYoaVtoZFthXV09b1thXSk7cmV0dXJuIGl9KHQpKSwhbikpZm9yKHZhciByIGluIGhkKWlmKGhkLmhhc093blByb3BlcnR5KHIpKXt2YXIgcz10LmdldEF0dHJpYnV0ZShyKTtudWxsIT1zJiYob1toZFtyXV09cyl9dmFyIGw9YT8idGV4dEZpbGwiOiJmaWxsIix1PWE/InRleHRTdHJva2UiOiJzdHJva2UiO2Uuc3R5bGU9ZS5zdHlsZXx8bmV3IEZpO3ZhciBoPWUuc3R5bGU7bnVsbCE9by5maWxsJiZoLnNldChsLGZkKG8uZmlsbCxpKSksbnVsbCE9by5zdHJva2UmJmguc2V0KHUsZmQoby5zdHJva2UsaSkpLEUoWyJsaW5lV2lkdGgiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJzdHJva2VPcGFjaXR5IiwibWl0ZXJMaW1pdCIsImZvbnRTaXplIl0sZnVuY3Rpb24odCl7dmFyIGU9ImxpbmVXaWR0aCI9PT10JiZhPyJ0ZXh0U3Ryb2tlV2lkdGgiOnQ7bnVsbCE9b1t0XSYmaC5zZXQoZSxwYXJzZUZsb2F0KG9bdF0pKX0pLG8udGV4dEJhc2VsaW5lJiYiYXV0byIhPT1vLnRleHRCYXNlbGluZXx8KG8udGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIiksImFscGhhYmV0aWMiPT09by50ZXh0QmFzZWxpbmUmJihvLnRleHRCYXNlbGluZT0iYm90dG9tIiksInN0YXJ0Ij09PW8udGV4dEFsaWduJiYoby50ZXh0QWxpZ249ImxlZnQiKSwiZW5kIj09PW8udGV4dEFsaWduJiYoby50ZXh0QWxpZ249InJpZ2h0IiksRShbImxpbmVEYXNoT2Zmc2V0IiwibGluZUNhcCIsImxpbmVKb2luIiwiZm9udFdlaWdodCIsImZvbnRGYW1pbHkiLCJmb250U3R5bGUiLCJ0ZXh0QWxpZ24iLCJ0ZXh0QmFzZWxpbmUiXSxmdW5jdGlvbih0KXtudWxsIT1vW3RdJiZoLnNldCh0LG9bdF0pfSksby5saW5lRGFzaCYmKGUuc3R5bGUubGluZURhc2g9aihvLmxpbmVEYXNoKS5zcGxpdChuZCkpLGhbdV0mJiJub25lIiE9PWhbdV0mJihlW3VdPSEwKSxlLl9faW5oZXJpdGVkU3R5bGU9b312YXIgZGQ9L3VybFwoXHMqIyguKj8pXCkvO2Z1bmN0aW9uIGZkKHQsZSl7dmFyIGk9ZSYmdCYmdC5tYXRjaChkZCk7cmV0dXJuIGk/ZVtqKGlbMV0pXTp0fXZhciBwZD0vKHRyYW5zbGF0ZXxzY2FsZXxyb3RhdGV8c2tld1h8c2tld1l8bWF0cml4KVwoKFtcLVxzMC05XC5lLF0qKVwpL2c7dmFyIGdkPS8oW15cczo7XSspXHMqOlxzKihbXjo7XSspL2c7ZnVuY3Rpb24gbWQodCxlLGkpe3ZhciBuPWUvdC53aWR0aCxvPWkvdC5oZWlnaHQsYT1NYXRoLm1pbihuLG8pO3JldHVybntzY2FsZTpbYSxhXSxwb3NpdGlvbjpbLSh0LngrdC53aWR0aC8yKSphK2UvMiwtKHQueSt0LmhlaWdodC8yKSphK2kvMl19fXZhciB2ZD1RKCkseWQ9e3JlZ2lzdGVyTWFwOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbjtyZXR1cm4gRShuPWsoZSk/ZTplLnN2Zz9be3R5cGU6InN2ZyIsc291cmNlOmUuc3ZnLHNwZWNpYWxBcmVhczplLnNwZWNpYWxBcmVhc31dOihlLmdlb0pzb24mJiFlLmZlYXR1cmVzJiYoaT1lLnNwZWNpYWxBcmVhcyxlPWUuZ2VvSnNvbiksW3t0eXBlOiJnZW9KU09OIixzb3VyY2U6ZSxzcGVjaWFsQXJlYXM6aX1dKSxmdW5jdGlvbih0KXt2YXIgZT10LnR5cGU7Imdlb0pzb24iPT09ZSYmKGU9dC50eXBlPSJnZW9KU09OIiksKDAseGRbZV0pKHQpfSksdmQuc2V0KHQsbil9LHJldHJpZXZlTWFwOmZ1bmN0aW9uKHQpe3JldHVybiB2ZC5nZXQodCl9fSx4ZD17Z2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgZT10LnNvdXJjZTt0Lmdlb0pTT049eihlKT8idW5kZWZpbmVkIiE9dHlwZW9mIEpTT04mJkpTT04ucGFyc2U/SlNPTi5wYXJzZShlKTpuZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpOyIpKCk6ZX0sc3ZnOmZ1bmN0aW9uKHQpe3Quc3ZnWE1MPW9kKHQuc291cmNlKX19LF9kPVksd2Q9RSxiZD1PLFNkPVIsTWQ9VHUucGFyc2VDbGFzc1R5cGUsSWQ9e1BST0NFU1NPUjp7RklMVEVSOjFlMyxTRVJJRVNfRklMVEVSOjgwMCxTVEFUSVNUSUM6NWUzfSxWSVNVQUw6e0xBWU9VVDoxZTMsUFJPR1JFU1NJVkVfTEFZT1VUOjExMDAsR0xPQkFMOjJlMyxDSEFSVDozZTMsUE9TVF9DSEFSVF9MQVlPVVQ6MzUwMCxDT01QT05FTlQ6NGUzLEJSVVNIOjVlM319LFRkPSJfX2ZsYWdJbk1haW5Qcm9jZXNzIixBZD0iX19vcHRpb25VcGRhdGVkIixEZD0vXlthLXpBLVowLTlfXSskLztmdW5jdGlvbiBDZChuLG8pe3JldHVybiBmdW5jdGlvbih0LGUsaSl7IW8mJnRoaXMuX2Rpc3Bvc2VkfHwodD10JiZ0LnRvTG93ZXJDYXNlKCksQ3QucHJvdG90eXBlW25dLmNhbGwodGhpcyx0LGUsaSkpfX1mdW5jdGlvbiBMZCgpe0N0LmNhbGwodGhpcyl9ZnVuY3Rpb24ga2QodCxlLGkpe2k9aXx8e30sInN0cmluZyI9PXR5cGVvZiBlJiYoZT1lZltlXSksdGhpcy5pZCx0aGlzLmdyb3VwLHRoaXMuX2RvbT10O3ZhciBuPXRoaXMuX3pyPUFvKHQse3JlbmRlcmVyOmkucmVuZGVyZXJ8fCJjYW52YXMiLGRldmljZVBpeGVsUmF0aW86aS5kZXZpY2VQaXhlbFJhdGlvLHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fSk7dGhpcy5fdGhyb3R0bGVkWnJGbHVzaD1JYyhBKG4uZmx1c2gsbiksMTcpLChlPUQoZSkpJiZJaChlLCEwKSx0aGlzLl90aGVtZT1lLHRoaXMuX2NoYXJ0c1ZpZXdzPVtdLHRoaXMuX2NoYXJ0c01hcD17fSx0aGlzLl9jb21wb25lbnRzVmlld3M9W10sdGhpcy5fY29tcG9uZW50c01hcD17fSx0aGlzLl9jb29yZFN5c01ncj1uZXcgbmg7dmFyIG89dGhpcy5fYXBpPWZ1bmN0aW9uKGkpe3ZhciB0PWkuX2Nvb3JkU3lzTWdyO3JldHVybiBMKG5ldyBlaChpKSx7Z2V0Q29vcmRpbmF0ZVN5c3RlbXM6QSh0LmdldENvb3JkaW5hdGVTeXN0ZW1zLHQpLGdldENvbXBvbmVudEJ5RWxlbWVudDpmdW5jdGlvbih0KXtmb3IoO3Q7KXt2YXIgZT10Ll9fZWNDb21wb25lbnRJbmZvO2lmKG51bGwhPWUpcmV0dXJuIGkuX21vZGVsLmdldENvbXBvbmVudChlLm1haW5UeXBlLGUuaW5kZXgpO3Q9dC5wYXJlbnR9fX0pfSh0aGlzKTtmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIHQuX19wcmlvLWUuX19wcmlvfU5pKHRmLGEpLE5pKCRkLGEpLHRoaXMuX3NjaGVkdWxlcj1uZXcgUGModGhpcyxvLCRkLHRmKSxDdC5jYWxsKHRoaXMsdGhpcy5fZWNFdmVudFByb2Nlc3Nvcj1uZXcgamQpLHRoaXMuX21lc3NhZ2VDZW50ZXI9bmV3IExkLHRoaXMuX2luaXRFdmVudHMoKSx0aGlzLnJlc2l6ZT1BKHRoaXMucmVzaXplLHRoaXMpLHRoaXMuX3BlbmRpbmdBY3Rpb25zPVtdLG4uYW5pbWF0aW9uLm9uKCJmcmFtZSIsdGhpcy5fb25mcmFtZSx0aGlzKSxmdW5jdGlvbih0LGUpe3Qub24oInJlbmRlcmVkIixmdW5jdGlvbigpe2UudHJpZ2dlcigicmVuZGVyZWQiKSwhdC5hbmltYXRpb24uaXNGaW5pc2hlZCgpfHxlW0FkXXx8ZS5fc2NoZWR1bGVyLnVuZmluaXNoZWR8fGUuX3BlbmRpbmdBY3Rpb25zLmxlbmd0aHx8ZS50cmlnZ2VyKCJmaW5pc2hlZCIpfSl9KG4sdGhpcyksSyh0aGlzKX1MZC5wcm90b3R5cGUub249Q2QoIm9uIiwhMCksTGQucHJvdG90eXBlLm9mZj1DZCgib2ZmIiwhMCksTGQucHJvdG90eXBlLm9uZT1DZCgib25lIiwhMCksYihMZCxDdCk7dmFyIFBkPWtkLnByb3RvdHlwZTtmdW5jdGlvbiBOZCh0LGUsaSl7aWYoIXRoaXMuX2Rpc3Bvc2VkKXt2YXIgbixvPXRoaXMuX21vZGVsLGE9dGhpcy5fY29vcmRTeXNNZ3IuZ2V0Q29vcmRpbmF0ZVN5c3RlbXMoKTtlPVhvKG8sZSk7Zm9yKHZhciByPTA7cjxhLmxlbmd0aDtyKyspe3ZhciBzPWFbcl07aWYoc1t0XSYmbnVsbCE9KG49c1t0XShvLGUsaSkpKXJldHVybiBufX19UGQuX29uZnJhbWU9ZnVuY3Rpb24oKXtpZighdGhpcy5fZGlzcG9zZWQpe3ZhciB0PXRoaXMuX3NjaGVkdWxlcjtpZih0aGlzW0FkXSl7dmFyIGU9dGhpc1tBZF0uc2lsZW50O3RoaXNbVGRdPSEwLEVkKHRoaXMpLE9kLnVwZGF0ZS5jYWxsKHRoaXMpLHRoaXNbVGRdPSExLHRoaXNbQWRdPSExLFZkLmNhbGwodGhpcyxlKSxHZC5jYWxsKHRoaXMsZSl9ZWxzZSBpZih0LnVuZmluaXNoZWQpe3ZhciBpPTEsbj10aGlzLl9tb2RlbCxvPXRoaXMuX2FwaTt0LnVuZmluaXNoZWQ9ITE7ZG97dmFyIGE9K25ldyBEYXRlO3QucGVyZm9ybVNlcmllc1Rhc2tzKG4pLHQucGVyZm9ybURhdGFQcm9jZXNzb3JUYXNrcyhuKSxSZCh0aGlzLG4pLHQucGVyZm9ybVZpc3VhbFRhc2tzKG4pLFpkKHRoaXMsdGhpcy5fbW9kZWwsbywicmVtYWluIiksaS09K25ldyBEYXRlLWF9d2hpbGUoMDxpJiZ0LnVuZmluaXNoZWQpO3QudW5maW5pc2hlZHx8dGhpcy5fenIuZmx1c2goKX19fSxQZC5nZXREb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG9tfSxQZC5nZXRacj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl96cn0sUGQuc2V0T3B0aW9uPWZ1bmN0aW9uKHQsZSxpKXtpZighdGhpcy5fZGlzcG9zZWQpe3ZhciBuO2lmKFNkKGUpJiYoaT1lLmxhenlVcGRhdGUsbj1lLnNpbGVudCxlPWUubm90TWVyZ2UpLHRoaXNbVGRdPSEwLCF0aGlzLl9tb2RlbHx8ZSl7dmFyIG89bmV3IHVoKHRoaXMuX2FwaSksYT10aGlzLl90aGVtZSxyPXRoaXMuX21vZGVsPW5ldyAkdTtyLnNjaGVkdWxlcj10aGlzLl9zY2hlZHVsZXIsci5pbml0KG51bGwsbnVsbCxhLG8pfXRoaXMuX21vZGVsLnNldE9wdGlvbih0LEpkKSxpPyh0aGlzW0FkXT17c2lsZW50Om59LHRoaXNbVGRdPSExKTooRWQodGhpcyksT2QudXBkYXRlLmNhbGwodGhpcyksdGhpcy5fenIuZmx1c2goKSx0aGlzW0FkXT0hMSx0aGlzW1RkXT0hMSxWZC5jYWxsKHRoaXMsbiksR2QuY2FsbCh0aGlzLG4pKX19LFBkLnNldFRoZW1lPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiRUNoYXJ0cyNzZXRUaGVtZSgpIGlzIERFUFJFQ0FURUQgaW4gRUNoYXJ0cyAzLjAiKX0sUGQuZ2V0TW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWx9LFBkLmdldE9wdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlbCYmdGhpcy5fbW9kZWwuZ2V0T3B0aW9uKCl9LFBkLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pyLmdldFdpZHRoKCl9LFBkLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl96ci5nZXRIZWlnaHQoKX0sUGQuZ2V0RGV2aWNlUGl4ZWxSYXRpbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl96ci5wYWludGVyLmRwcnx8d2luZG93LmRldmljZVBpeGVsUmF0aW98fDF9LFBkLmdldFJlbmRlcmVkQ2FudmFzPWZ1bmN0aW9uKHQpe2lmKHYuY2FudmFzU3VwcG9ydGVkKXJldHVybih0PXR8fHt9KS5waXhlbFJhdGlvPXQucGl4ZWxSYXRpb3x8MSx0LmJhY2tncm91bmRDb2xvcj10LmJhY2tncm91bmRDb2xvcnx8dGhpcy5fbW9kZWwuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKSx0aGlzLl96ci5wYWludGVyLmdldFJlbmRlcmVkQ2FudmFzKHQpfSxQZC5nZXRTdmdEYXRhVXJsPWZ1bmN0aW9uKCl7aWYodi5zdmdTdXBwb3J0ZWQpe3ZhciB0PXRoaXMuX3pyO3JldHVybiBFKHQuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCgpLGZ1bmN0aW9uKHQpe3Quc3RvcEFuaW1hdGlvbighMCl9KSx0LnBhaW50ZXIucGF0aFRvRGF0YVVybCgpfX0sUGQuZ2V0RGF0YVVSTD1mdW5jdGlvbih0KXtpZighdGhpcy5fZGlzcG9zZWQpe3ZhciBlPSh0PXR8fHt9KS5leGNsdWRlQ29tcG9uZW50cyxpPXRoaXMuX21vZGVsLG49W10sbz10aGlzO3dkKGUsZnVuY3Rpb24odCl7aS5lYWNoQ29tcG9uZW50KHttYWluVHlwZTp0fSxmdW5jdGlvbih0KXt2YXIgZT1vLl9jb21wb25lbnRzTWFwW3QuX192aWV3SWRdO2UuZ3JvdXAuaWdub3JlfHwobi5wdXNoKGUpLGUuZ3JvdXAuaWdub3JlPSEwKX0pfSk7dmFyIGE9InN2ZyI9PT10aGlzLl96ci5wYWludGVyLmdldFR5cGUoKT90aGlzLmdldFN2Z0RhdGFVcmwoKTp0aGlzLmdldFJlbmRlcmVkQ2FudmFzKHQpLnRvRGF0YVVSTCgiaW1hZ2UvIisodCYmdC50eXBlfHwicG5nIikpO3JldHVybiB3ZChuLGZ1bmN0aW9uKHQpe3QuZ3JvdXAuaWdub3JlPSExfSksYX19LFBkLmdldENvbm5lY3RlZERhdGFVUkw9ZnVuY3Rpb24obyl7aWYoIXRoaXMuX2Rpc3Bvc2VkJiZ2LmNhbnZhc1N1cHBvcnRlZCl7dmFyIGE9dGhpcy5ncm91cCxyPU1hdGgubWluLHM9TWF0aC5tYXg7aWYoYWZbYV0pe3ZhciBsPTEvMCx1PTEvMCxoPS0xLzAsYz0tMS8wLGQ9W10saT1vJiZvLnBpeGVsUmF0aW98fDE7RShvZixmdW5jdGlvbih0LGUpe2lmKHQuZ3JvdXA9PT1hKXt2YXIgaT10LmdldFJlbmRlcmVkQ2FudmFzKEQobykpLG49dC5nZXREb20oKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsPXIobi5sZWZ0LGwpLHU9cihuLnRvcCx1KSxoPXMobi5yaWdodCxoKSxjPXMobi5ib3R0b20sYyksZC5wdXNoKHtkb206aSxsZWZ0Om4ubGVmdCx0b3A6bi50b3B9KX19KTt2YXIgdD0oaCo9aSktKGwqPWkpLGU9KGMqPWkpLSh1Kj1pKSxuPWcoKTtuLndpZHRoPXQsbi5oZWlnaHQ9ZTt2YXIgZj1BbyhuKTtyZXR1cm4gby5jb25uZWN0ZWRCYWNrZ3JvdW5kQ29sb3ImJmYuYWRkKG5ldyBpcyh7c2hhcGU6e3g6MCx5OjAsd2lkdGg6dCxoZWlnaHQ6ZX0sc3R5bGU6e2ZpbGw6by5jb25uZWN0ZWRCYWNrZ3JvdW5kQ29sb3J9fSkpLHdkKGQsZnVuY3Rpb24odCl7dmFyIGU9bmV3IHFuKHtzdHlsZTp7eDp0LmxlZnQqaS1sLHk6dC50b3AqaS11LGltYWdlOnQuZG9tfX0pO2YuYWRkKGUpfSksZi5yZWZyZXNoSW1tZWRpYXRlbHkoKSxuLnRvRGF0YVVSTCgiaW1hZ2UvIisobyYmby50eXBlfHwicG5nIikpfXJldHVybiB0aGlzLmdldERhdGFVUkwobyl9fSxQZC5jb252ZXJ0VG9QaXhlbD1UKE5kLCJjb252ZXJ0VG9QaXhlbCIpLFBkLmNvbnZlcnRGcm9tUGl4ZWw9VChOZCwiY29udmVydEZyb21QaXhlbCIpLFBkLmNvbnRhaW5QaXhlbD1mdW5jdGlvbih0LG8pe3ZhciBhO2lmKCF0aGlzLl9kaXNwb3NlZClyZXR1cm4gRSh0PVhvKHRoaXMuX21vZGVsLHQpLGZ1bmN0aW9uKHQsbil7MDw9bi5pbmRleE9mKCJNb2RlbHMiKSYmRSh0LGZ1bmN0aW9uKHQpe3ZhciBlPXQuY29vcmRpbmF0ZVN5c3RlbTtpZihlJiZlLmNvbnRhaW5Qb2ludClhfD0hIWUuY29udGFpblBvaW50KG8pO2Vsc2UgaWYoInNlcmllc01vZGVscyI9PT1uKXt2YXIgaT10aGlzLl9jaGFydHNNYXBbdC5fX3ZpZXdJZF07aSYmaS5jb250YWluUG9pbnQmJihhfD1pLmNvbnRhaW5Qb2ludChvLHQpKX19LHRoaXMpfSx0aGlzKSwhIWF9LFBkLmdldFZpc3VhbD1mdW5jdGlvbih0LGUpe3ZhciBpPSh0PVhvKHRoaXMuX21vZGVsLHQse2RlZmF1bHRNYWluVHlwZToic2VyaWVzIn0pKS5zZXJpZXNNb2RlbC5nZXREYXRhKCksbj10Lmhhc093blByb3BlcnR5KCJkYXRhSW5kZXhJbnNpZGUiKT90LmRhdGFJbmRleEluc2lkZTp0Lmhhc093blByb3BlcnR5KCJkYXRhSW5kZXgiKT9pLmluZGV4T2ZSYXdJbmRleCh0LmRhdGFJbmRleCk6bnVsbDtyZXR1cm4gbnVsbCE9bj9pLmdldEl0ZW1WaXN1YWwobixlKTppLmdldFZpc3VhbChlKX0sUGQuZ2V0Vmlld09mQ29tcG9uZW50TW9kZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHNNYXBbdC5fX3ZpZXdJZF19LFBkLmdldFZpZXdPZlNlcmllc01vZGVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jaGFydHNNYXBbdC5fX3ZpZXdJZF19O3ZhciBPZD17cHJlcGFyZUFuZFVwZGF0ZTpmdW5jdGlvbih0KXtFZCh0aGlzKSxPZC51cGRhdGUuY2FsbCh0aGlzLHQpfSx1cGRhdGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbW9kZWwsaT10aGlzLl9hcGksbj10aGlzLl96cixvPXRoaXMuX2Nvb3JkU3lzTWdyLGE9dGhpcy5fc2NoZWR1bGVyO2lmKGUpe2EucmVzdG9yZURhdGEoZSx0KSxhLnBlcmZvcm1TZXJpZXNUYXNrcyhlKSxvLmNyZWF0ZShlLGkpLGEucGVyZm9ybURhdGFQcm9jZXNzb3JUYXNrcyhlLHQpLFJkKHRoaXMsZSksby51cGRhdGUoZSxpKSxXZChlKSxhLnBlcmZvcm1WaXN1YWxUYXNrcyhlLHQpLEhkKHRoaXMsZSxpLHQpO3ZhciByPWUuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKXx8InRyYW5zcGFyZW50IjtpZih2LmNhbnZhc1N1cHBvcnRlZCluLnNldEJhY2tncm91bmRDb2xvcihyKTtlbHNle3ZhciBzPVJlKHIpO3I9WWUocywicmdiIiksMD09PXNbM10mJihyPSJ0cmFuc3BhcmVudCIpfVVkKGUsaSl9fSx1cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24obyl7dmFyIGE9dGhpcy5fbW9kZWwscj10aGlzLHM9dGhpcy5fYXBpO2lmKGEpe3ZhciBsPVtdO2EuZWFjaENvbXBvbmVudChmdW5jdGlvbih0LGUpe3ZhciBpPXIuZ2V0Vmlld09mQ29tcG9uZW50TW9kZWwoZSk7aWYoaSYmaS5fX2FsaXZlKWlmKGkudXBkYXRlVHJhbnNmb3JtKXt2YXIgbj1pLnVwZGF0ZVRyYW5zZm9ybShlLGEscyxvKTtuJiZuLnVwZGF0ZSYmbC5wdXNoKGkpfWVsc2UgbC5wdXNoKGkpfSk7dmFyIG49USgpO2EuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt2YXIgZT1yLl9jaGFydHNNYXBbdC5fX3ZpZXdJZF07aWYoZS51cGRhdGVUcmFuc2Zvcm0pe3ZhciBpPWUudXBkYXRlVHJhbnNmb3JtKHQsYSxzLG8pO2kmJmkudXBkYXRlJiZuLnNldCh0LnVpZCwxKX1lbHNlIG4uc2V0KHQudWlkLDEpfSksV2QoYSksdGhpcy5fc2NoZWR1bGVyLnBlcmZvcm1WaXN1YWxUYXNrcyhhLG8se3NldERpcnR5OiEwLGRpcnR5TWFwOm59KSxaZChyLGEscyxvLG4pLFVkKGEsdGhpcy5fYXBpKX19LHVwZGF0ZVZpZXc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbW9kZWw7ZSYmKGdjLm1hcmtVcGRhdGVNZXRob2QodCwidXBkYXRlVmlldyIpLFdkKGUpLHRoaXMuX3NjaGVkdWxlci5wZXJmb3JtVmlzdWFsVGFza3MoZSx0LHtzZXREaXJ0eTohMH0pLEhkKHRoaXMsdGhpcy5fbW9kZWwsdGhpcy5fYXBpLHQpLFVkKGUsdGhpcy5fYXBpKSl9LHVwZGF0ZVZpc3VhbDpmdW5jdGlvbih0KXtPZC51cGRhdGUuY2FsbCh0aGlzLHQpfSx1cGRhdGVMYXlvdXQ6ZnVuY3Rpb24odCl7T2QudXBkYXRlLmNhbGwodGhpcyx0KX19O2Z1bmN0aW9uIEVkKHQpe3ZhciBlPXQuX21vZGVsLGk9dC5fc2NoZWR1bGVyO2kucmVzdG9yZVBpcGVsaW5lcyhlKSxpLnByZXBhcmVTdGFnZVRhc2tzKCksRmQodCwiY29tcG9uZW50IixlLGkpLEZkKHQsImNoYXJ0IixlLGkpLGkucGxhbigpfWZ1bmN0aW9uIHpkKGUsaSxuLG8sdCl7dmFyIGE9ZS5fbW9kZWw7aWYobyl7dmFyIHI9e307cltvKyJJZCJdPW5bbysiSWQiXSxyW28rIkluZGV4Il09bltvKyJJbmRleCJdLHJbbysiTmFtZSJdPW5bbysiTmFtZSJdO3ZhciBzPXttYWluVHlwZTpvLHF1ZXJ5OnJ9O3QmJihzLnN1YlR5cGU9dCk7dmFyIGw9bi5leGNsdWRlU2VyaWVzSWQ7bnVsbCE9bCYmKGw9UShFbyhsKSkpLGEmJmEuZWFjaENvbXBvbmVudChzLGZ1bmN0aW9uKHQpe2wmJm51bGwhPWwuZ2V0KHQuaWQpfHx1KGVbInNlcmllcyI9PT1vPyJfY2hhcnRzTWFwIjoiX2NvbXBvbmVudHNNYXAiXVt0Ll9fdmlld0lkXSl9LGUpfWVsc2Ugd2QoZS5fY29tcG9uZW50c1ZpZXdzLmNvbmNhdChlLl9jaGFydHNWaWV3cyksdSk7ZnVuY3Rpb24gdSh0KXt0JiZ0Ll9fYWxpdmUmJnRbaV0mJnRbaV0odC5fX21vZGVsLGEsZS5fYXBpLG4pfX1mdW5jdGlvbiBSZCh0LGUpe3ZhciBpPXQuX2NoYXJ0c01hcCxuPXQuX3NjaGVkdWxlcjtlLmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7bi51cGRhdGVTdHJlYW1Nb2Rlcyh0LGlbdC5fX3ZpZXdJZF0pfSl9ZnVuY3Rpb24gQmQoZSx0KXt2YXIgaT1lLnR5cGUsbj1lLmVzY2FwZUNvbm5lY3Qsbz1xZFtpXSxhPW8uYWN0aW9uSW5mbyxyPShhLnVwZGF0ZXx8InVwZGF0ZSIpLnNwbGl0KCI6Iikscz1yLnBvcCgpO3I9bnVsbCE9clswXSYmTWQoclswXSksdGhpc1tUZF09ITA7dmFyIGw9W2VdLHU9ITE7ZS5iYXRjaCYmKHU9ITAsbD1OKGUuYmF0Y2gsZnVuY3Rpb24odCl7cmV0dXJuKHQ9QyhMKHt9LHQpLGUpKS5iYXRjaD1udWxsLHR9KSk7dmFyIGgsYz1bXSxkPSJoaWdobGlnaHQiPT09aXx8ImRvd25wbGF5Ij09PWk7d2QobCxmdW5jdGlvbih0KXsoaD0oaD1vLmFjdGlvbih0LHRoaXMuX21vZGVsLHRoaXMuX2FwaSkpfHxMKHt9LHQpKS50eXBlPWEuZXZlbnR8fGgudHlwZSxjLnB1c2goaCksZD96ZCh0aGlzLHMsdCwic2VyaWVzIik6ciYmemQodGhpcyxzLHQsci5tYWluLHIuc3ViKX0sdGhpcyksIm5vbmUiPT09c3x8ZHx8cnx8KHRoaXNbQWRdPyhFZCh0aGlzKSxPZC51cGRhdGUuY2FsbCh0aGlzLGUpLHRoaXNbQWRdPSExKTpPZFtzXS5jYWxsKHRoaXMsZSkpLGg9dT97dHlwZTphLmV2ZW50fHxpLGVzY2FwZUNvbm5lY3Q6bixiYXRjaDpjfTpjWzBdLHRoaXNbVGRdPSExLHR8fHRoaXMuX21lc3NhZ2VDZW50ZXIudHJpZ2dlcihoLnR5cGUsaCl9ZnVuY3Rpb24gVmQodCl7Zm9yKHZhciBlPXRoaXMuX3BlbmRpbmdBY3Rpb25zO2UubGVuZ3RoOyl7dmFyIGk9ZS5zaGlmdCgpO0JkLmNhbGwodGhpcyxpLHQpfX1mdW5jdGlvbiBHZCh0KXt0fHx0aGlzLnRyaWdnZXIoInVwZGF0ZWQiKX1mdW5jdGlvbiBGZCh0LGUsbyxhKXtmb3IodmFyIHI9ImNvbXBvbmVudCI9PT1lLHM9cj90Ll9jb21wb25lbnRzVmlld3M6dC5fY2hhcnRzVmlld3MsbD1yP3QuX2NvbXBvbmVudHNNYXA6dC5fY2hhcnRzTWFwLHU9dC5fenIsaD10Ll9hcGksaT0wO2k8cy5sZW5ndGg7aSsrKXNbaV0uX19hbGl2ZT0hMTtmdW5jdGlvbiBuKHQpe3ZhciBlPSJfZWNfIit0LmlkKyJfIit0LnR5cGUsaT1sW2VdO2lmKCFpKXt2YXIgbj1NZCh0LnR5cGUpOyhpPW5ldyhyP2hjLmdldENsYXNzKG4ubWFpbixuLnN1Yik6Z2MuZ2V0Q2xhc3Mobi5zdWIpKSkuaW5pdChvLGgpLGxbZV09aSxzLnB1c2goaSksdS5hZGQoaS5ncm91cCl9dC5fX3ZpZXdJZD1pLl9faWQ9ZSxpLl9fYWxpdmU9ITAsaS5fX21vZGVsPXQsaS5ncm91cC5fX2VjQ29tcG9uZW50SW5mbz17bWFpblR5cGU6dC5tYWluVHlwZSxpbmRleDp0LmNvbXBvbmVudEluZGV4fSxyfHxhLnByZXBhcmVWaWV3KGksdCxvLGgpfXI/by5lYWNoQ29tcG9uZW50KGZ1bmN0aW9uKHQsZSl7InNlcmllcyIhPT10JiZuKGUpfSk6by5lYWNoU2VyaWVzKG4pO2ZvcihpPTA7aTxzLmxlbmd0aDspe3ZhciBjPXNbaV07Yy5fX2FsaXZlP2krKzoocnx8Yy5yZW5kZXJUYXNrLmRpc3Bvc2UoKSx1LnJlbW92ZShjLmdyb3VwKSxjLmRpc3Bvc2UobyxoKSxzLnNwbGljZShpLDEpLGRlbGV0ZSBsW2MuX19pZF0sYy5fX2lkPWMuZ3JvdXAuX19lY0NvbXBvbmVudEluZm89bnVsbCl9fWZ1bmN0aW9uIFdkKHQpe3QuY2xlYXJDb2xvclBhbGV0dGUoKSx0LmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7dC5jbGVhckNvbG9yUGFsZXR0ZSgpfSl9ZnVuY3Rpb24gSGQodCxlLGksbil7IWZ1bmN0aW9uKHQsaSxuLG8sZSl7d2QoZXx8dC5fY29tcG9uZW50c1ZpZXdzLGZ1bmN0aW9uKHQpe3ZhciBlPXQuX19tb2RlbDt0LnJlbmRlcihlLGksbixvKSxZZChlLHQpfSl9KHQsZSxpLG4pLHdkKHQuX2NoYXJ0c1ZpZXdzLGZ1bmN0aW9uKHQpe3QuX19hbGl2ZT0hMX0pLFpkKHQsZSxpLG4pLHdkKHQuX2NoYXJ0c1ZpZXdzLGZ1bmN0aW9uKHQpe3QuX19hbGl2ZXx8dC5yZW1vdmUoZSxpKX0pfWZ1bmN0aW9uIFpkKG4sdCxlLG8sYSl7dmFyIHIscz1uLl9zY2hlZHVsZXI7dC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe3ZhciBlPW4uX2NoYXJ0c01hcFt0Ll9fdmlld0lkXTtlLl9fYWxpdmU9ITA7dmFyIGk9ZS5yZW5kZXJUYXNrO3MudXBkYXRlUGF5bG9hZChpLG8pLGEmJmEuZ2V0KHQudWlkKSYmaS5kaXJ0eSgpLHJ8PWkucGVyZm9ybShzLmdldFBlcmZvcm1BcmdzKGkpKSxlLmdyb3VwLnNpbGVudD0hIXQuZ2V0KCJzaWxlbnQiKSxZZCh0LGUpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXQoImJsZW5kTW9kZSIpfHxudWxsO2UuZ3JvdXAudHJhdmVyc2UoZnVuY3Rpb24odCl7dC5pc0dyb3VwfHx0LnN0eWxlLmJsZW5kIT09aSYmdC5zZXRTdHlsZSgiYmxlbmQiLGkpLHQuZWFjaFBlbmRpbmdEaXNwbGF5YWJsZSYmdC5lYWNoUGVuZGluZ0Rpc3BsYXlhYmxlKGZ1bmN0aW9uKHQpe3Quc2V0U3R5bGUoImJsZW5kIixpKX0pfSl9KHQsZSl9KSxzLnVuZmluaXNoZWR8PXIsZnVuY3Rpb24oaSx0KXt2YXIgZT1pLl96ci5zdG9yYWdlLG49MDtlLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe24rK30pLG4+dC5nZXQoImhvdmVyTGF5ZXJUaHJlc2hvbGQiKSYmIXYubm9kZSYmdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe2lmKCF0LnByZXZlbnRVc2luZ0hvdmVyTGF5ZXIpe3ZhciBlPWkuX2NoYXJ0c01hcFt0Ll9fdmlld0lkXTtlLl9fYWxpdmUmJmUuZ3JvdXAudHJhdmVyc2UoZnVuY3Rpb24odCl7dC51c2VIb3ZlckxheWVyPSEwfSl9fSl9KG4sdCksTGMobi5fenIuZG9tLHQpfWZ1bmN0aW9uIFVkKGUsaSl7d2QoUWQsZnVuY3Rpb24odCl7dChlLGkpfSl9UGQucmVzaXplPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9kaXNwb3NlZCl7dGhpcy5fenIucmVzaXplKHQpO3ZhciBlPXRoaXMuX21vZGVsO2lmKHRoaXMuX2xvYWRpbmdGWCYmdGhpcy5fbG9hZGluZ0ZYLnJlc2l6ZSgpLGUpe3ZhciBpPWUucmVzZXRPcHRpb24oIm1lZGlhIiksbj10JiZ0LnNpbGVudDt0aGlzW1RkXT0hMCxpJiZFZCh0aGlzKSxPZC51cGRhdGUuY2FsbCh0aGlzKSx0aGlzW1RkXT0hMSxWZC5jYWxsKHRoaXMsbiksR2QuY2FsbCh0aGlzLG4pfX19LFBkLnNob3dMb2FkaW5nPWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuX2Rpc3Bvc2VkJiYoU2QodCkmJihlPXQsdD0iIiksdD10fHwiZGVmYXVsdCIsdGhpcy5oaWRlTG9hZGluZygpLG5mW3RdKSl7dmFyIGk9bmZbdF0odGhpcy5fYXBpLGUpLG49dGhpcy5fenI7dGhpcy5fbG9hZGluZ0ZYPWksbi5hZGQoaSl9fSxQZC5oaWRlTG9hZGluZz1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VkfHwodGhpcy5fbG9hZGluZ0ZYJiZ0aGlzLl96ci5yZW1vdmUodGhpcy5fbG9hZGluZ0ZYKSx0aGlzLl9sb2FkaW5nRlg9bnVsbCl9LFBkLm1ha2VBY3Rpb25Gcm9tRXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9TCh7fSx0KTtyZXR1cm4gZS50eXBlPUtkW3QudHlwZV0sZX0sUGQuZGlzcGF0Y2hBY3Rpb249ZnVuY3Rpb24odCxlKXt0aGlzLl9kaXNwb3NlZHx8KFNkKGUpfHwoZT17c2lsZW50OiEhZX0pLHFkW3QudHlwZV0mJnRoaXMuX21vZGVsJiYodGhpc1tUZF0/dGhpcy5fcGVuZGluZ0FjdGlvbnMucHVzaCh0KTooQmQuY2FsbCh0aGlzLHQsZS5zaWxlbnQpLGUuZmx1c2g/dGhpcy5fenIuZmx1c2goITApOiExIT09ZS5mbHVzaCYmdi5icm93c2VyLndlQ2hhdCYmdGhpcy5fdGhyb3R0bGVkWnJGbHVzaCgpLFZkLmNhbGwodGhpcyxlLnNpbGVudCksR2QuY2FsbCh0aGlzLGUuc2lsZW50KSkpKX0sUGQuYXBwZW5kRGF0YT1mdW5jdGlvbih0KXtpZighdGhpcy5fZGlzcG9zZWQpe3ZhciBlPXQuc2VyaWVzSW5kZXg7dGhpcy5nZXRNb2RlbCgpLmdldFNlcmllc0J5SW5kZXgoZSkuYXBwZW5kRGF0YSh0KSx0aGlzLl9zY2hlZHVsZXIudW5maW5pc2hlZD0hMH19LFBkLm9uPUNkKCJvbiIsITEpLFBkLm9mZj1DZCgib2ZmIiwhMSksUGQub25lPUNkKCJvbmUiLCExKTt2YXIgWGQ9WyJjbGljayIsImRibGNsaWNrIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJtb3VzZW1vdmUiLCJtb3VzZWRvd24iLCJtb3VzZXVwIiwiZ2xvYmFsb3V0IiwiY29udGV4dG1lbnUiXTtmdW5jdGlvbiBZZCh0LGUpe3ZhciBpPXQuZ2V0KCJ6Iiksbj10LmdldCgiemxldmVsIik7ZS5ncm91cC50cmF2ZXJzZShmdW5jdGlvbih0KXsiZ3JvdXAiIT09dC50eXBlJiYobnVsbCE9aSYmKHQuej1pKSxudWxsIT1uJiYodC56bGV2ZWw9bikpfSl9ZnVuY3Rpb24gamQoKXt0aGlzLmV2ZW50SW5mb31QZC5faW5pdEV2ZW50cz1mdW5jdGlvbigpe3dkKFhkLGZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHQodCl7dmFyIGUsaT10aGlzLmdldE1vZGVsKCksbj10LnRhcmdldDtpZigiZ2xvYmFsb3V0Ij09PXUpZT17fTtlbHNlIGlmKG4mJm51bGwhPW4uZGF0YUluZGV4KXt2YXIgbz1uLmRhdGFNb2RlbHx8aS5nZXRTZXJpZXNCeUluZGV4KG4uc2VyaWVzSW5kZXgpO2U9byYmby5nZXREYXRhUGFyYW1zKG4uZGF0YUluZGV4LG4uZGF0YVR5cGUsbil8fHt9fWVsc2UgbiYmbi5ldmVudERhdGEmJihlPUwoe30sbi5ldmVudERhdGEpKTtpZihlKXt2YXIgYT1lLmNvbXBvbmVudFR5cGUscj1lLmNvbXBvbmVudEluZGV4OyJtYXJrTGluZSIhPT1hJiYibWFya1BvaW50IiE9PWEmJiJtYXJrQXJlYSIhPT1hfHwoYT0ic2VyaWVzIixyPWUuc2VyaWVzSW5kZXgpO3ZhciBzPWEmJm51bGwhPXImJmkuZ2V0Q29tcG9uZW50KGEsciksbD1zJiZ0aGlzWyJzZXJpZXMiPT09cy5tYWluVHlwZT8iX2NoYXJ0c01hcCI6Il9jb21wb25lbnRzTWFwIl1bcy5fX3ZpZXdJZF07ZS5ldmVudD10LGUudHlwZT11LHRoaXMuX2VjRXZlbnRQcm9jZXNzb3IuZXZlbnRJbmZvPXt0YXJnZXRFbDpuLHBhY2tlZEV2ZW50OmUsbW9kZWw6cyx2aWV3Omx9LHRoaXMudHJpZ2dlcih1LGUpfX10LnpyRXZlbnRmdWxDYWxsQXRMYXN0PSEwLHRoaXMuX3pyLm9uKHUsdCx0aGlzKX0sdGhpcyksd2QoS2QsZnVuY3Rpb24odCxlKXt0aGlzLl9tZXNzYWdlQ2VudGVyLm9uKGUsZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKGUsdCl9LHRoaXMpfSx0aGlzKX0sUGQuaXNEaXNwb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNwb3NlZH0sUGQuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9kaXNwb3NlZHx8dGhpcy5zZXRPcHRpb24oe3NlcmllczpbXX0sITApfSxQZC5kaXNwb3NlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Rpc3Bvc2VkKXt0aGlzLl9kaXNwb3NlZD0hMCxqbyh0aGlzLmdldERvbSgpLGxmLCIiKTt2YXIgZT10aGlzLl9hcGksaT10aGlzLl9tb2RlbDt3ZCh0aGlzLl9jb21wb25lbnRzVmlld3MsZnVuY3Rpb24odCl7dC5kaXNwb3NlKGksZSl9KSx3ZCh0aGlzLl9jaGFydHNWaWV3cyxmdW5jdGlvbih0KXt0LmRpc3Bvc2UoaSxlKX0pLHRoaXMuX3pyLmRpc3Bvc2UoKSxkZWxldGUgb2ZbdGhpcy5pZF19fSxiKGtkLEN0KSxqZC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmpkLG5vcm1hbGl6ZVF1ZXJ5OmZ1bmN0aW9uKHQpe3ZhciBzPXt9LGw9e30sdT17fTtpZih6KHQpKXt2YXIgZT1NZCh0KTtzLm1haW5UeXBlPWUubWFpbnx8bnVsbCxzLnN1YlR5cGU9ZS5zdWJ8fG51bGx9ZWxzZXt2YXIgaD1bIkluZGV4IiwiTmFtZSIsIklkIl0sYz17bmFtZToxLGRhdGFJbmRleDoxLGRhdGFUeXBlOjF9O0UodCxmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0hMSxuPTA7bjxoLmxlbmd0aDtuKyspe3ZhciBvPWhbbl0sYT1lLmxhc3RJbmRleE9mKG8pO2lmKDA8YSYmYT09PWUubGVuZ3RoLW8ubGVuZ3RoKXt2YXIgcj1lLnNsaWNlKDAsYSk7ImRhdGEiIT09ciYmKHMubWFpblR5cGU9cixzW28udG9Mb3dlckNhc2UoKV09dCxpPSEwKX19Yy5oYXNPd25Qcm9wZXJ0eShlKSYmKGxbZV09dCxpPSEwKSxpfHwodVtlXT10KX0pfXJldHVybntjcHRRdWVyeTpzLGRhdGFRdWVyeTpsLG90aGVyUXVlcnk6dX19LGZpbHRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5ldmVudEluZm87aWYoIW4pcmV0dXJuITA7dmFyIG89bi50YXJnZXRFbCxhPW4ucGFja2VkRXZlbnQscj1uLm1vZGVsLHM9bi52aWV3O2lmKCFyfHwhcylyZXR1cm4hMDt2YXIgbD1lLmNwdFF1ZXJ5LHU9ZS5kYXRhUXVlcnk7cmV0dXJuIGgobCxyLCJtYWluVHlwZSIpJiZoKGwsciwic3ViVHlwZSIpJiZoKGwsciwiaW5kZXgiLCJjb21wb25lbnRJbmRleCIpJiZoKGwsciwibmFtZSIpJiZoKGwsciwiaWQiKSYmaCh1LGEsIm5hbWUiKSYmaCh1LGEsImRhdGFJbmRleCIpJiZoKHUsYSwiZGF0YVR5cGUiKSYmKCFzLmZpbHRlckZvckV4cG9zZWRFdmVudHx8cy5maWx0ZXJGb3JFeHBvc2VkRXZlbnQodCxlLm90aGVyUXVlcnksbyxhKSk7ZnVuY3Rpb24gaCh0LGUsaSxuKXtyZXR1cm4gbnVsbD09dFtpXXx8ZVtufHxpXT09PXRbaV19fSxhZnRlclRyaWdnZXI6ZnVuY3Rpb24oKXt0aGlzLmV2ZW50SW5mbz1udWxsfX07dmFyIHFkPXt9LEtkPXt9LCRkPVtdLEpkPVtdLFFkPVtdLHRmPVtdLGVmPXt9LG5mPXt9LG9mPXt9LGFmPXt9LHJmPW5ldyBEYXRlLTAsc2Y9bmV3IERhdGUtMCxsZj0iX2VjaGFydHNfaW5zdGFuY2VfIjtmdW5jdGlvbiB1Zih0KXthZlt0XT0hMX12YXIgaGY9dWY7ZnVuY3Rpb24gY2YodCl7cmV0dXJuIG9mW2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlP3QuZ2V0QXR0cmlidXRlKGUpOnRbZV19KHQsbGYpXX1mdW5jdGlvbiBkZih0LGUpe2VmW3RdPWV9ZnVuY3Rpb24gZmYodCl7SmQucHVzaCh0KX1mdW5jdGlvbiBwZih0LGUpe3hmKCRkLHQsZSwxZTMpfWZ1bmN0aW9uIGdmKHQsZSxpKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKGk9ZSxlPSIiKTt2YXIgbj1TZCh0KT90LnR5cGU6W3QsdD17ZXZlbnQ6ZX1dWzBdO3QuZXZlbnQ9KHQuZXZlbnR8fG4pLnRvTG93ZXJDYXNlKCksZT10LmV2ZW50LF9kKERkLnRlc3QobikmJkRkLnRlc3QoZSkpLHFkW25dfHwocWRbbl09e2FjdGlvbjppLGFjdGlvbkluZm86dH0pLEtkW2VdPW59ZnVuY3Rpb24gbWYodCxlKXtuaC5yZWdpc3Rlcih0LGUpfWZ1bmN0aW9uIHZmKHQsZSl7eGYodGYsdCxlLDFlMywibGF5b3V0Iil9ZnVuY3Rpb24geWYodCxlKXt4Zih0Zix0LGUsM2UzLCJ2aXN1YWwiKX1mdW5jdGlvbiB4Zih0LGUsaSxuLG8peyhiZChlKXx8U2QoZSkpJiYoaT1lLGU9bik7dmFyIGE9UGMud3JhcFN0YWdlSGFuZGxlcihpLG8pO3JldHVybiBhLl9fcHJpbz1lLGEuX19yYXc9aSx0LnB1c2goYSksYX1mdW5jdGlvbiBfZih0LGUpe25mW3RdPWV9ZnVuY3Rpb24gd2YodCl7cmV0dXJuIFR1LmV4dGVuZCh0KX1mdW5jdGlvbiBiZih0KXtyZXR1cm4gaGMuZXh0ZW5kKHQpfWZ1bmN0aW9uIFNmKHQpe3JldHVybiBpYy5leHRlbmQodCl9ZnVuY3Rpb24gTWYodCl7cmV0dXJuIGdjLmV4dGVuZCh0KX15ZigyZTMsRGMpLGZmKEloKSxwZig5MDAsZnVuY3Rpb24odCl7dmFyIGE9USgpO3QuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt2YXIgZT10LmdldCgic3RhY2siKTtpZihlKXt2YXIgaT1hLmdldChlKXx8YS5zZXQoZSxbXSksbj10LmdldERhdGEoKSxvPXtzdGFja1Jlc3VsdERpbWVuc2lvbjpuLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tSZXN1bHREaW1lbnNpb24iKSxzdGFja2VkT3ZlckRpbWVuc2lvbjpuLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tlZE92ZXJEaW1lbnNpb24iKSxzdGFja2VkRGltZW5zaW9uOm4uZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkRGltZW5zaW9uIiksc3RhY2tlZEJ5RGltZW5zaW9uOm4uZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkQnlEaW1lbnNpb24iKSxpc1N0YWNrZWRCeUluZGV4Om4uZ2V0Q2FsY3VsYXRpb25JbmZvKCJpc1N0YWNrZWRCeUluZGV4IiksZGF0YTpuLHNlcmllc01vZGVsOnR9O2lmKCFvLnN0YWNrZWREaW1lbnNpb258fCFvLmlzU3RhY2tlZEJ5SW5kZXgmJiFvLnN0YWNrZWRCeURpbWVuc2lvbilyZXR1cm47aS5sZW5ndGgmJm4uc2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkT25TZXJpZXMiLGlbaS5sZW5ndGgtMV0uc2VyaWVzTW9kZWwpLGkucHVzaChvKX19KSxhLmVhY2goVGgpfSksX2YoImRlZmF1bHQiLGZ1bmN0aW9uKG4sdCl7Qyh0PXR8fHt9LHt0ZXh0OiJsb2FkaW5nIixjb2xvcjoiI2MyMzUzMSIsdGV4dENvbG9yOiIjMDAwIixtYXNrQ29sb3I6InJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSIsemxldmVsOjB9KTt2YXIgbz1uZXcgaXMoe3N0eWxlOntmaWxsOnQubWFza0NvbG9yfSx6bGV2ZWw6dC56bGV2ZWwsejoxZTR9KSxhPW5ldyB1cyh7c2hhcGU6e3N0YXJ0QW5nbGU6LWtjLzIsZW5kQW5nbGU6LWtjLzIrLjEscjoxMH0sc3R5bGU6e3N0cm9rZTp0LmNvbG9yLGxpbmVDYXA6InJvdW5kIixsaW5lV2lkdGg6NX0semxldmVsOnQuemxldmVsLHo6MTAwMDF9KSxyPW5ldyBpcyh7c3R5bGU6e2ZpbGw6Im5vbmUiLHRleHQ6dC50ZXh0LHRleHRQb3NpdGlvbjoicmlnaHQiLHRleHREaXN0YW5jZToxMCx0ZXh0RmlsbDp0LnRleHRDb2xvcn0semxldmVsOnQuemxldmVsLHo6MTAwMDF9KTthLmFuaW1hdGVTaGFwZSghMCkud2hlbigxZTMse2VuZEFuZ2xlOjMqa2MvMn0pLnN0YXJ0KCJjaXJjdWxhckluT3V0IiksYS5hbmltYXRlU2hhcGUoITApLndoZW4oMWUzLHtzdGFydEFuZ2xlOjMqa2MvMn0pLmRlbGF5KDMwMCkuc3RhcnQoImNpcmN1bGFySW5PdXQiKTt2YXIgZT1uZXcgSWk7cmV0dXJuIGUuYWRkKGEpLGUuYWRkKHIpLGUuYWRkKG8pLGUucmVzaXplPWZ1bmN0aW9uKCl7dmFyIHQ9bi5nZXRXaWR0aCgpLzIsZT1uLmdldEhlaWdodCgpLzI7YS5zZXRTaGFwZSh7Y3g6dCxjeTplfSk7dmFyIGk9YS5zaGFwZS5yO3Iuc2V0U2hhcGUoe3g6dC1pLHk6ZS1pLHdpZHRoOjIqaSxoZWlnaHQ6MippfSksby5zZXRTaGFwZSh7eDowLHk6MCx3aWR0aDpuLmdldFdpZHRoKCksaGVpZ2h0Om4uZ2V0SGVpZ2h0KCl9KX0sZS5yZXNpemUoKSxlfSksZ2Yoe3R5cGU6ImhpZ2hsaWdodCIsZXZlbnQ6ImhpZ2hsaWdodCIsdXBkYXRlOiJoaWdobGlnaHQifSxldCksZ2Yoe3R5cGU6ImRvd25wbGF5IixldmVudDoiZG93bnBsYXkiLHVwZGF0ZToiZG93bnBsYXkifSxldCksZGYoImxpZ2h0IixKYyksZGYoImRhcmsiLGVkKTtmdW5jdGlvbiBJZih0KXtyZXR1cm4gdH1mdW5jdGlvbiBUZih0LGUsaSxuLG8pe3RoaXMuX29sZD10LHRoaXMuX25ldz1lLHRoaXMuX29sZEtleUdldHRlcj1pfHxJZix0aGlzLl9uZXdLZXlHZXR0ZXI9bnx8SWYsdGhpcy5jb250ZXh0PW99ZnVuY3Rpb24gQWYodCxlLGksbixvKXtmb3IodmFyIGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIHI9Il9lY18iK29bbl0odFthXSxhKSxzPWVbcl07bnVsbD09cz8oaS5wdXNoKHIpLGVbcl09YSk6KHMubGVuZ3RofHwoZVtyXT1zPVtzXSkscy5wdXNoKGEpKX19VGYucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpUZixhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZD10LHRoaXN9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdXBkYXRlPXQsdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmU9dCx0aGlzfSxleGVjdXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fb2xkLGU9dGhpcy5fbmV3LGk9e30sbj1bXSxvPVtdO2ZvcihBZih0LHt9LG4sIl9vbGRLZXlHZXR0ZXIiLHRoaXMpLEFmKGUsaSxvLCJfbmV3S2V5R2V0dGVyIix0aGlzKSxhPTA7YTx0Lmxlbmd0aDthKyspe2lmKG51bGwhPShzPWlbcj1uW2FdXSkpKHU9cy5sZW5ndGgpPygxPT09dSYmKGlbcl09bnVsbCkscz1zLnNoaWZ0KCkpOmlbcl09bnVsbCx0aGlzLl91cGRhdGUmJnRoaXMuX3VwZGF0ZShzLGEpO2Vsc2UgdGhpcy5fcmVtb3ZlJiZ0aGlzLl9yZW1vdmUoYSl9Zm9yKHZhciBhPTA7YTxvLmxlbmd0aDthKyspe3ZhciByPW9bYV07aWYoaS5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIHM7aWYobnVsbD09KHM9aVtyXSkpY29udGludWU7aWYocy5sZW5ndGgpZm9yKHZhciBsPTAsdT1zLmxlbmd0aDtsPHU7bCsrKXRoaXMuX2FkZCYmdGhpcy5fYWRkKHNbbF0pO2Vsc2UgdGhpcy5fYWRkJiZ0aGlzLl9hZGQocyl9fX19O3ZhciBEZj1RKFsidG9vbHRpcCIsImxhYmVsIiwiaXRlbU5hbWUiLCJpdGVtSWQiLCJzZXJpZXNOYW1lIl0pO2Z1bmN0aW9uIENmKHQsZSl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSl8fCh0W2VdPVtdKSx0W2VdfWZ1bmN0aW9uIExmKHQpe3JldHVybiJjYXRlZ29yeSI9PT10PyJvcmRpbmFsIjoidGltZSI9PT10PyJ0aW1lIjoiZmxvYXQifWZ1bmN0aW9uIGtmKHQpe251bGwhPXQmJkwodGhpcyx0KSx0aGlzLm90aGVyRGltcz17fX12YXIgUGY9UixOZj0idW5kZWZpbmVkIixPZj17ZmxvYXQ6dHlwZW9mIEZsb2F0NjRBcnJheT09TmY/QXJyYXk6RmxvYXQ2NEFycmF5LGludDp0eXBlb2YgSW50MzJBcnJheT09TmY/QXJyYXk6SW50MzJBcnJheSxvcmRpbmFsOkFycmF5LG51bWJlcjpBcnJheSx0aW1lOkFycmF5fSxFZj10eXBlb2YgVWludDMyQXJyYXk9PU5mP0FycmF5OlVpbnQzMkFycmF5LHpmPXR5cGVvZiBJbnQzMkFycmF5PT1OZj9BcnJheTpJbnQzMkFycmF5LFJmPXR5cGVvZiBVaW50MTZBcnJheT09TmY/QXJyYXk6VWludDE2QXJyYXk7ZnVuY3Rpb24gQmYodCl7cmV0dXJuIDY1NTM1PHQuX3Jhd0NvdW50P0VmOlJmfXZhciBWZj1bImhhc0l0ZW1PcHRpb24iLCJfbmFtZUxpc3QiLCJfaWRMaXN0IiwiX2ludmVydGVkSW5kaWNlc01hcCIsIl9yYXdEYXRhIiwiX2NodW5rU2l6ZSIsIl9jaHVua0NvdW50IiwiX2RpbVZhbHVlR2V0dGVyIiwiX2NvdW50IiwiX3Jhd0NvdW50IiwiX25hbWVEaW1JZHgiLCJfaWREaW1JZHgiXSxHZj1bIl9leHRlbnQiLCJfYXBwcm94aW1hdGVFeHRlbnQiLCJfcmF3RXh0ZW50Il07ZnVuY3Rpb24gRmYoZSxpKXtFKFZmLmNvbmNhdChpLl9fd3JhcHBlZE1ldGhvZHN8fFtdKSxmdW5jdGlvbih0KXtpLmhhc093blByb3BlcnR5KHQpJiYoZVt0XT1pW3RdKX0pLGUuX193cmFwcGVkTWV0aG9kcz1pLl9fd3JhcHBlZE1ldGhvZHMsRShHZixmdW5jdGlvbih0KXtlW3RdPUQoaVt0XSl9KSxlLl9jYWxjdWxhdGlvbkluZm89TChpLl9jYWxjdWxhdGlvbkluZm8pfXZhciBXZj1mdW5jdGlvbih0LGUpe3Q9dHx8WyJ4IiwieSJdO2Zvcih2YXIgaT17fSxuPVtdLG89e30sYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgcj10W2FdO3oocik/cj1uZXcga2Yoe25hbWU6cn0pOnIgaW5zdGFuY2VvZiBrZnx8KHI9bmV3IGtmKHIpKTt2YXIgcz1yLm5hbWU7ci50eXBlPXIudHlwZXx8ImZsb2F0IixyLmNvb3JkRGltfHwoci5jb29yZERpbT1zLHIuY29vcmREaW1JbmRleD0wKSxyLm90aGVyRGltcz1yLm90aGVyRGltc3x8e30sbi5wdXNoKHMpLChpW3NdPXIpLmluZGV4PWEsci5jcmVhdGVJbnZlcnRlZEluZGljZXMmJihvW3NdPVtdKX10aGlzLmRpbWVuc2lvbnM9bix0aGlzLl9kaW1lbnNpb25JbmZvcz1pLHRoaXMuaG9zdE1vZGVsPWUsdGhpcy5kYXRhVHlwZSx0aGlzLl9pbmRpY2VzPW51bGwsdGhpcy5fY291bnQ9MCx0aGlzLl9yYXdDb3VudD0wLHRoaXMuX3N0b3JhZ2U9e30sdGhpcy5fbmFtZUxpc3Q9W10sdGhpcy5faWRMaXN0PVtdLHRoaXMuX29wdGlvbk1vZGVscz1bXSx0aGlzLl92aXN1YWw9e30sdGhpcy5fbGF5b3V0PXt9LHRoaXMuX2l0ZW1WaXN1YWxzPVtdLHRoaXMuaGFzSXRlbVZpc3VhbD17fSx0aGlzLl9pdGVtTGF5b3V0cz1bXSx0aGlzLl9ncmFwaGljRWxzPVtdLHRoaXMuX2NodW5rU2l6ZT0xZTUsdGhpcy5fY2h1bmtDb3VudD0wLHRoaXMuX3Jhd0RhdGEsdGhpcy5fcmF3RXh0ZW50PXt9LHRoaXMuX2V4dGVudD17fSx0aGlzLl9hcHByb3hpbWF0ZUV4dGVudD17fSx0aGlzLl9kaW1lbnNpb25zU3VtbWFyeT1mdW5jdGlvbihuKXt2YXIgdD17fSxhPXQuZW5jb2RlPXt9LHI9USgpLHM9W10sbD1bXSx1PXQudXNlck91dHB1dD17ZGltZW5zaW9uTmFtZXM6bi5kaW1lbnNpb25zLnNsaWNlKCksZW5jb2RlOnt9fTtFKG4uZGltZW5zaW9ucyxmdW5jdGlvbih0KXt2YXIgbz1uLmdldERpbWVuc2lvbkluZm8odCksZT1vLmNvb3JkRGltO2lmKGUpe3ZhciBpPW8uY29vcmREaW1JbmRleDtDZihhLGUpW2ldPXQsby5pc0V4dHJhQ29vcmR8fChyLnNldChlLDEpLGZ1bmN0aW9uKHQpe3JldHVybiEoIm9yZGluYWwiPT09dHx8InRpbWUiPT09dCl9KG8udHlwZSkmJihzWzBdPXQpLENmKHUuZW5jb2RlLGUpW2ldPW8uaW5kZXgpLG8uZGVmYXVsdFRvb2x0aXAmJmwucHVzaCh0KX1EZi5lYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9Q2YoYSxlKSxuPW8ub3RoZXJEaW1zW2VdO251bGwhPW4mJiExIT09biYmKGlbbl09by5uYW1lKX0pfSk7dmFyIG89W10saD17fTtyLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgaT1hW2VdO2hbZV09aVswXSxvPW8uY29uY2F0KGkpfSksdC5kYXRhRGltc09uQ29vcmQ9byx0LmVuY29kZUZpcnN0RGltTm90RXh0cmE9aDt2YXIgZT1hLmxhYmVsO2UmJmUubGVuZ3RoJiYocz1lLnNsaWNlKCkpO3ZhciBpPWEudG9vbHRpcDtyZXR1cm4gaSYmaS5sZW5ndGg/bD1pLnNsaWNlKCk6bC5sZW5ndGh8fChsPXMuc2xpY2UoKSksYS5kZWZhdWx0ZWRMYWJlbD1zLGEuZGVmYXVsdGVkVG9vbHRpcD1sLHR9KHRoaXMpLHRoaXMuX2ludmVydGVkSW5kaWNlc01hcD1vLHRoaXMuX2NhbGN1bGF0aW9uSW5mbz17fSx0aGlzLnVzZXJPdXRwdXQ9dGhpcy5fZGltZW5zaW9uc1N1bW1hcnkudXNlck91dHB1dH0sSGY9V2YucHJvdG90eXBlO2Z1bmN0aW9uIFpmKHQsZSxpLG4sbyl7dmFyIGE9T2ZbZS50eXBlXSxyPW4tMSxzPWUubmFtZSxsPXRbc11bcl07aWYobCYmbC5sZW5ndGg8aSl7Zm9yKHZhciB1PW5ldyBhKE1hdGgubWluKG8tcippLGkpKSxoPTA7aDxsLmxlbmd0aDtoKyspdVtoXT1sW2hdO3Rbc11bcl09dX1mb3IodmFyIGM9bippO2M8bztjKz1pKXRbc10ucHVzaChuZXcgYShNYXRoLm1pbihvLWMsaSkpKX1mdW5jdGlvbiBVZihvKXt2YXIgYT1vLl9pbnZlcnRlZEluZGljZXNNYXA7RShhLGZ1bmN0aW9uKHQsZSl7dmFyIGk9by5fZGltZW5zaW9uSW5mb3NbZV0ub3JkaW5hbE1ldGE7aWYoaSl7dD1hW2VdPW5ldyB6ZihpLmNhdGVnb3JpZXMubGVuZ3RoKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dPS0xO2ZvcihuPTA7bjxvLl9jb3VudDtuKyspdFtvLmdldChlLG4pXT1ufX0pfWZ1bmN0aW9uIFhmKHQsZSxpKXt2YXIgbjtpZihudWxsIT1lKXt2YXIgbz10Ll9jaHVua1NpemUsYT1NYXRoLmZsb29yKGkvbykscj1pJW8scz10LmRpbWVuc2lvbnNbZV0sbD10Ll9zdG9yYWdlW3NdW2FdO2lmKGwpe249bFtyXTt2YXIgdT10Ll9kaW1lbnNpb25JbmZvc1tzXS5vcmRpbmFsTWV0YTt1JiZ1LmNhdGVnb3JpZXMubGVuZ3RoJiYobj11LmNhdGVnb3JpZXNbbl0pfX1yZXR1cm4gbn1mdW5jdGlvbiBZZih0KXtyZXR1cm4gdH1mdW5jdGlvbiBqZih0KXtyZXR1cm4gdDx0aGlzLl9jb3VudCYmMDw9dD90aGlzLl9pbmRpY2VzW3RdOi0xfWZ1bmN0aW9uIHFmKHQsZSl7dmFyIGk9dC5faWRMaXN0W2VdO3JldHVybiBudWxsPT1pJiYoaT1YZih0LHQuX2lkRGltSWR4LGUpKSxudWxsPT1pJiYoaT0iZVwwXDAiK2UpLGl9ZnVuY3Rpb24gS2YodCl7cmV0dXJuIGsodCl8fCh0PVt0XSksdH1mdW5jdGlvbiAkZih0LGUpe3ZhciBpPXQuZGltZW5zaW9ucyxuPW5ldyBXZihOKGksdC5nZXREaW1lbnNpb25JbmZvLHQpLHQuaG9zdE1vZGVsKTtGZihuLHQpO2Zvcih2YXIgbz1uLl9zdG9yYWdlPXt9LGE9dC5fc3RvcmFnZSxyPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBzPWlbcl07YVtzXSYmKDA8PV8oZSxzKT8ob1tzXT1KZihhW3NdKSxuLl9yYXdFeHRlbnRbc109UWYoKSxuLl9leHRlbnRbc109bnVsbCk6b1tzXT1hW3NdKX1yZXR1cm4gbn1mdW5jdGlvbiBKZih0KXtmb3IodmFyIGUsaSxuPW5ldyBBcnJheSh0Lmxlbmd0aCksbz0wO288dC5sZW5ndGg7bysrKW5bb109KGU9dFtvXSxpPXZvaWQgMCwoaT1lLmNvbnN0cnVjdG9yKT09PUFycmF5P2Uuc2xpY2UoKTpuZXcgaShlKSk7cmV0dXJuIG59ZnVuY3Rpb24gUWYoKXtyZXR1cm5bMS8wLC0xLzBdfUhmLnR5cGU9Imxpc3QiLEhmLmhhc0l0ZW1PcHRpb249ITAsSGYuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiIT10eXBlb2YgdCYmKGlzTmFOKHQpfHx0aGlzLl9kaW1lbnNpb25JbmZvcy5oYXNPd25Qcm9wZXJ0eSh0KSl8fCh0PXRoaXMuZGltZW5zaW9uc1t0XSksdH0sSGYuZ2V0RGltZW5zaW9uSW5mbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGltZW5zaW9uSW5mb3NbdGhpcy5nZXREaW1lbnNpb24odCldfSxIZi5nZXREaW1lbnNpb25zT25Db29yZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaW1lbnNpb25zU3VtbWFyeS5kYXRhRGltc09uQ29vcmQuc2xpY2UoKX0sSGYubWFwRGltZW5zaW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZGltZW5zaW9uc1N1bW1hcnk7aWYobnVsbD09ZSlyZXR1cm4gaS5lbmNvZGVGaXJzdERpbU5vdEV4dHJhW3RdO3ZhciBuPWkuZW5jb2RlW3RdO3JldHVybiEwPT09ZT8obnx8W10pLnNsaWNlKCk6biYmbltlXX0sSGYuaW5pdERhdGE9ZnVuY3Rpb24odCxlLGkpeyhHdS5pc0luc3RhbmNlKHQpfHxQKHQpKSYmKHQ9bmV3IEFoKHQsdGhpcy5kaW1lbnNpb25zLmxlbmd0aCkpLHRoaXMuX3Jhd0RhdGE9dCx0aGlzLl9zdG9yYWdlPXt9LHRoaXMuX2luZGljZXM9bnVsbCx0aGlzLl9uYW1lTGlzdD1lfHxbXSx0aGlzLl9pZExpc3Q9W10sdGhpcy5fbmFtZVJlcGVhdENvdW50PXt9LGl8fCh0aGlzLmhhc0l0ZW1PcHRpb249ITEpLHRoaXMuZGVmYXVsdERpbVZhbHVlR2V0dGVyPUVoW3RoaXMuX3Jhd0RhdGEuZ2V0U291cmNlKCkuc291cmNlRm9ybWF0XSx0aGlzLl9kaW1WYWx1ZUdldHRlcj1pPWl8fHRoaXMuZGVmYXVsdERpbVZhbHVlR2V0dGVyLHRoaXMuX2RpbVZhbHVlR2V0dGVyQXJyYXlSb3dzPUVoLmFycmF5Um93cyx0aGlzLl9yYXdFeHRlbnQ9e30sdGhpcy5faW5pdERhdGFGcm9tUHJvdmlkZXIoMCx0LmNvdW50KCkpLHQucHVyZSYmKHRoaXMuaGFzSXRlbU9wdGlvbj0hMSl9LEhmLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jhd0RhdGF9LEhmLmFwcGVuZERhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmF3RGF0YSxpPXRoaXMuY291bnQoKTtlLmFwcGVuZERhdGEodCk7dmFyIG49ZS5jb3VudCgpO2UucGVyc2lzdGVudHx8KG4rPWkpLHRoaXMuX2luaXREYXRhRnJvbVByb3ZpZGVyKGksbil9LEhmLmFwcGVuZFZhbHVlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLl9jaHVua1NpemUsbj10aGlzLl9zdG9yYWdlLG89dGhpcy5kaW1lbnNpb25zLGE9by5sZW5ndGgscj10aGlzLl9yYXdFeHRlbnQscz10aGlzLmNvdW50KCksbD1zK01hdGgubWF4KHQubGVuZ3RoLGU/ZS5sZW5ndGg6MCksdT10aGlzLl9jaHVua0NvdW50LGg9MDtoPGE7aCsrKXtyW3Y9b1toXV18fChyW3ZdPVFmKCkpLG5bdl18fChuW3ZdPVtdKSxaZihuLHRoaXMuX2RpbWVuc2lvbkluZm9zW3ZdLGksdSxsKSx0aGlzLl9jaHVua0NvdW50PW5bdl0ubGVuZ3RofWZvcih2YXIgYz1uZXcgQXJyYXkoYSksZD1zO2Q8bDtkKyspe2Zvcih2YXIgZj1kLXMscD1NYXRoLmZsb29yKGQvaSksZz1kJWksbT0wO208YTttKyspe3ZhciB2PW9bbV0seT10aGlzLl9kaW1WYWx1ZUdldHRlckFycmF5Um93cyh0W2ZdfHxjLHYsZixtKTtuW3ZdW3BdW2ddPXk7dmFyIHg9clt2XTt5PHhbMF0mJih4WzBdPXkpLHk+eFsxXSYmKHhbMV09eSl9ZSYmKHRoaXMuX25hbWVMaXN0W2RdPWVbZl0pfXRoaXMuX3Jhd0NvdW50PXRoaXMuX2NvdW50PWwsdGhpcy5fZXh0ZW50PXt9LFVmKHRoaXMpfSxIZi5faW5pdERhdGFGcm9tUHJvdmlkZXI9ZnVuY3Rpb24odCxlKXtpZighKGU8PXQpKXtmb3IodmFyIGksbj10aGlzLl9jaHVua1NpemUsbz10aGlzLl9yYXdEYXRhLGE9dGhpcy5fc3RvcmFnZSxyPXRoaXMuZGltZW5zaW9ucyxzPXIubGVuZ3RoLGw9dGhpcy5fZGltZW5zaW9uSW5mb3MsdT10aGlzLl9uYW1lTGlzdCxoPXRoaXMuX2lkTGlzdCxjPXRoaXMuX3Jhd0V4dGVudCxkPXRoaXMuX25hbWVSZXBlYXRDb3VudD17fSxmPXRoaXMuX2NodW5rQ291bnQscD0wO3A8cztwKyspe2Nbdz1yW3BdXXx8KGNbd109UWYoKSk7dmFyIGc9bFt3XTswPT09Zy5vdGhlckRpbXMuaXRlbU5hbWUmJihpPXRoaXMuX25hbWVEaW1JZHg9cCksMD09PWcub3RoZXJEaW1zLml0ZW1JZCYmKHRoaXMuX2lkRGltSWR4PXApLGFbd118fChhW3ddPVtdKSxaZihhLGcsbixmLGUpLHRoaXMuX2NodW5rQ291bnQ9YVt3XS5sZW5ndGh9Zm9yKHZhciBtPW5ldyBBcnJheShzKSx2PXQ7djxlO3YrKyl7bT1vLmdldEl0ZW0odixtKTtmb3IodmFyIHk9TWF0aC5mbG9vcih2L24pLHg9diVuLF89MDtfPHM7XysrKXt2YXIgdyxiPWFbdz1yW19dXVt5XSxTPXRoaXMuX2RpbVZhbHVlR2V0dGVyKG0sdyx2LF8pO2JbeF09Uzt2YXIgTT1jW3ddO1M8TVswXSYmKE1bMF09UyksUz5NWzFdJiYoTVsxXT1TKX1pZighby5wdXJlKXt2YXIgST11W3ZdO2lmKG0mJm51bGw9PUkpaWYobnVsbCE9bS5uYW1lKXVbdl09ST1tLm5hbWU7ZWxzZSBpZihudWxsIT1pKXt2YXIgVD1yW2ldLEE9YVtUXVt5XTtpZihBKXtJPUFbeF07dmFyIEQ9bFtUXS5vcmRpbmFsTWV0YTtEJiZELmNhdGVnb3JpZXMubGVuZ3RoJiYoST1ELmNhdGVnb3JpZXNbSV0pfX12YXIgQz1udWxsPT1tP251bGw6bS5pZDtudWxsPT1DJiZudWxsIT1JJiYoZFtJXT1kW0ldfHwwLDA8ZFtDPUldJiYoQys9Il9fZWNfXyIrZFtJXSksZFtJXSsrKSxudWxsIT1DJiYoaFt2XT1DKX19IW8ucGVyc2lzdGVudCYmby5jbGVhbiYmby5jbGVhbigpLHRoaXMuX3Jhd0NvdW50PXRoaXMuX2NvdW50PWUsdGhpcy5fZXh0ZW50PXt9LFVmKHRoaXMpfX0sSGYuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY291bnR9LEhmLmdldEluZGljZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbmRpY2VzO2lmKHQpe3ZhciBlPXQuY29uc3RydWN0b3IsaT10aGlzLl9jb3VudDtpZihlPT09QXJyYXkpe289bmV3IGUoaSk7Zm9yKHZhciBuPTA7bjxpO24rKylvW25dPXRbbl19ZWxzZSBvPW5ldyBlKHQuYnVmZmVyLDAsaSl9ZWxzZXt2YXIgbz1uZXcoZT1CZih0aGlzKSkodGhpcy5jb3VudCgpKTtmb3Iobj0wO248by5sZW5ndGg7bisrKW9bbl09bn1yZXR1cm4gb30sSGYuZ2V0PWZ1bmN0aW9uKHQsZSl7aWYoISgwPD1lJiZlPHRoaXMuX2NvdW50KSlyZXR1cm4gTmFOO3ZhciBpPXRoaXMuX3N0b3JhZ2U7aWYoIWlbdF0pcmV0dXJuIE5hTjtlPXRoaXMuZ2V0UmF3SW5kZXgoZSk7dmFyIG49TWF0aC5mbG9vcihlL3RoaXMuX2NodW5rU2l6ZSksbz1lJXRoaXMuX2NodW5rU2l6ZTtyZXR1cm4gaVt0XVtuXVtvXX0sSGYuZ2V0QnlSYXdJbmRleD1mdW5jdGlvbih0LGUpe2lmKCEoMDw9ZSYmZTx0aGlzLl9yYXdDb3VudCkpcmV0dXJuIE5hTjt2YXIgaT10aGlzLl9zdG9yYWdlW3RdO2lmKCFpKXJldHVybiBOYU47dmFyIG49TWF0aC5mbG9vcihlL3RoaXMuX2NodW5rU2l6ZSksbz1lJXRoaXMuX2NodW5rU2l6ZTtyZXR1cm4gaVtuXVtvXX0sSGYuX2dldEZhc3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLmZsb29yKGUvdGhpcy5fY2h1bmtTaXplKSxuPWUldGhpcy5fY2h1bmtTaXplO3JldHVybiB0aGlzLl9zdG9yYWdlW3RdW2ldW25dfSxIZi5nZXRWYWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtrKHQpfHwoZT10LHQ9dGhpcy5kaW1lbnNpb25zKTtmb3IodmFyIG49MCxvPXQubGVuZ3RoO248bztuKyspaS5wdXNoKHRoaXMuZ2V0KHRbbl0sZSkpO3JldHVybiBpfSxIZi5oYXNWYWx1ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fZGltZW5zaW9uc1N1bW1hcnkuZGF0YURpbXNPbkNvb3JkLGk9MCxuPWUubGVuZ3RoO2k8bjtpKyspaWYoaXNOYU4odGhpcy5nZXQoZVtpXSx0KSkpcmV0dXJuITE7cmV0dXJuITB9LEhmLmdldERhdGFFeHRlbnQ9ZnVuY3Rpb24odCl7dD10aGlzLmdldERpbWVuc2lvbih0KTt2YXIgZT10aGlzLl9zdG9yYWdlW3RdLGk9UWYoKTtpZighZSlyZXR1cm4gaTt2YXIgbixvPXRoaXMuY291bnQoKTtpZighdGhpcy5faW5kaWNlcylyZXR1cm4gdGhpcy5fcmF3RXh0ZW50W3RdLnNsaWNlKCk7aWYobj10aGlzLl9leHRlbnRbdF0pcmV0dXJuIG4uc2xpY2UoKTtmb3IodmFyIGE9KG49aSlbMF0scj1uWzFdLHM9MDtzPG87cysrKXt2YXIgbD10aGlzLl9nZXRGYXN0KHQsdGhpcy5nZXRSYXdJbmRleChzKSk7bDxhJiYoYT1sKSxyPGwmJihyPWwpfXJldHVybiBuPVthLHJdLHRoaXMuX2V4dGVudFt0XT1ufSxIZi5nZXRBcHByb3hpbWF0ZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmdldERpbWVuc2lvbih0KSx0aGlzLl9hcHByb3hpbWF0ZUV4dGVudFt0XXx8dGhpcy5nZXREYXRhRXh0ZW50KHQpfSxIZi5zZXRBcHByb3hpbWF0ZUV4dGVudD1mdW5jdGlvbih0LGUpe2U9dGhpcy5nZXREaW1lbnNpb24oZSksdGhpcy5fYXBwcm94aW1hdGVFeHRlbnRbZV09dC5zbGljZSgpfSxIZi5nZXRDYWxjdWxhdGlvbkluZm89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhbGN1bGF0aW9uSW5mb1t0XX0sSGYuc2V0Q2FsY3VsYXRpb25JbmZvPWZ1bmN0aW9uKHQsZSl7UGYodCk/TCh0aGlzLl9jYWxjdWxhdGlvbkluZm8sdCk6dGhpcy5fY2FsY3VsYXRpb25JbmZvW3RdPWV9LEhmLmdldFN1bT1mdW5jdGlvbih0KXt2YXIgZT0wO2lmKHRoaXMuX3N0b3JhZ2VbdF0pZm9yKHZhciBpPTAsbj10aGlzLmNvdW50KCk7aTxuO2krKyl7dmFyIG89dGhpcy5nZXQodCxpKTtpc05hTihvKXx8KGUrPW8pfXJldHVybiBlfSxIZi5nZXRNZWRpYW49ZnVuY3Rpb24odCl7dmFyIGk9W107dGhpcy5lYWNoKHQsZnVuY3Rpb24odCxlKXtpc05hTih0KXx8aS5wdXNoKHQpfSk7dmFyIGU9W10uY29uY2F0KGkpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksbj10aGlzLmNvdW50KCk7cmV0dXJuIDA9PT1uPzA6biUyPT0xP2VbKG4tMSkvMl06KGVbbi8yXStlW24vMi0xXSkvMn0sSGYucmF3SW5kZXhPZj1mdW5jdGlvbih0LGUpe3ZhciBpPSh0JiZ0aGlzLl9pbnZlcnRlZEluZGljZXNNYXBbdF0pW2VdO3JldHVybiBudWxsPT1pfHxpc05hTihpKT8tMTppfSxIZi5pbmRleE9mTmFtZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXRoaXMuY291bnQoKTtlPGk7ZSsrKWlmKHRoaXMuZ2V0TmFtZShlKT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LEhmLmluZGV4T2ZSYXdJbmRleD1mdW5jdGlvbih0KXtpZih0Pj10aGlzLl9yYXdDb3VudHx8dDwwKXJldHVybi0xO2lmKCF0aGlzLl9pbmRpY2VzKXJldHVybiB0O3ZhciBlPXRoaXMuX2luZGljZXMsaT1lW3RdO2lmKG51bGwhPWkmJmk8dGhpcy5fY291bnQmJmk9PT10KXJldHVybiB0O2Zvcih2YXIgbj0wLG89dGhpcy5fY291bnQtMTtuPD1vOyl7dmFyIGE9KG4rbykvMnwwO2lmKGVbYV08dCluPTErYTtlbHNle2lmKCEoZVthXT50KSlyZXR1cm4gYTtvPWEtMX19cmV0dXJuLTF9LEhmLmluZGljZXNPZk5lYXJlc3Q9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPVtdO2lmKCF0aGlzLl9zdG9yYWdlW3RdKXJldHVybiBuO251bGw9PWkmJihpPTEvMCk7Zm9yKHZhciBvPTEvMCxhPS0xLHI9MCxzPTAsbD10aGlzLmNvdW50KCk7czxsO3MrKyl7dmFyIHU9ZS10aGlzLmdldCh0LHMpLGg9TWF0aC5hYnModSk7aDw9aSYmKChoPG98fGg9PT1vJiYwPD11JiZhPDApJiYobz1oLGE9dSxyPTApLHU9PT1hJiYobltyKytdPXMpKX1yZXR1cm4gbi5sZW5ndGg9cixufSxIZi5nZXRSYXdJbmRleD1ZZixIZi5nZXRSYXdEYXRhSXRlbT1mdW5jdGlvbih0KXtpZih0aGlzLl9yYXdEYXRhLnBlcnNpc3RlbnQpcmV0dXJuIHRoaXMuX3Jhd0RhdGEuZ2V0SXRlbSh0aGlzLmdldFJhd0luZGV4KHQpKTtmb3IodmFyIGU9W10saT0wO2k8dGhpcy5kaW1lbnNpb25zLmxlbmd0aDtpKyspe3ZhciBuPXRoaXMuZGltZW5zaW9uc1tpXTtlLnB1c2godGhpcy5nZXQobix0KSl9cmV0dXJuIGV9LEhmLmdldE5hbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSYXdJbmRleCh0KTtyZXR1cm4gdGhpcy5fbmFtZUxpc3RbZV18fFhmKHRoaXMsdGhpcy5fbmFtZURpbUlkeCxlKXx8IiJ9LEhmLmdldElkPWZ1bmN0aW9uKHQpe3JldHVybiBxZih0aGlzLHRoaXMuZ2V0UmF3SW5kZXgodCkpfSxIZi5lYWNoPWZ1bmN0aW9uKHQsZSxpLG4pe2lmKHRoaXMuX2NvdW50KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49aSxpPWUsZT10LHQ9W10pLGk9aXx8bnx8dGhpcztmb3IodmFyIG89KHQ9TihLZih0KSx0aGlzLmdldERpbWVuc2lvbix0aGlzKSkubGVuZ3RoLGE9MDthPHRoaXMuY291bnQoKTthKyspc3dpdGNoKG8pe2Nhc2UgMDplLmNhbGwoaSxhKTticmVhaztjYXNlIDE6ZS5jYWxsKGksdGhpcy5nZXQodFswXSxhKSxhKTticmVhaztjYXNlIDI6ZS5jYWxsKGksdGhpcy5nZXQodFswXSxhKSx0aGlzLmdldCh0WzFdLGEpLGEpO2JyZWFrO2RlZmF1bHQ6Zm9yKHZhciByPTAscz1bXTtyPG87cisrKXNbcl09dGhpcy5nZXQodFtyXSxhKTtzW3JdPWEsZS5hcHBseShpLHMpfX19LEhmLmZpbHRlclNlbGY9ZnVuY3Rpb24odCxlLGksbil7aWYodGhpcy5fY291bnQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj1pLGk9ZSxlPXQsdD1bXSksaT1pfHxufHx0aGlzLHQ9TihLZih0KSx0aGlzLmdldERpbWVuc2lvbix0aGlzKTtmb3IodmFyIG89dGhpcy5jb3VudCgpLGE9bmV3KEJmKHRoaXMpKShvKSxyPVtdLHM9dC5sZW5ndGgsbD0wLHU9dFswXSxoPTA7aDxvO2grKyl7dmFyIGMsZD10aGlzLmdldFJhd0luZGV4KGgpO2lmKDA9PT1zKWM9ZS5jYWxsKGksaCk7ZWxzZSBpZigxPT09cyl7dmFyIGY9dGhpcy5fZ2V0RmFzdCh1LGQpO2M9ZS5jYWxsKGksZixoKX1lbHNle2Zvcih2YXIgcD0wO3A8cztwKyspcltwXT10aGlzLl9nZXRGYXN0KHUsZCk7cltwXT1oLGM9ZS5hcHBseShpLHIpfWMmJihhW2wrK109ZCl9cmV0dXJuIGw8byYmKHRoaXMuX2luZGljZXM9YSksdGhpcy5fY291bnQ9bCx0aGlzLl9leHRlbnQ9e30sdGhpcy5nZXRSYXdJbmRleD10aGlzLl9pbmRpY2VzP2pmOllmLHRoaXN9fSxIZi5zZWxlY3RSYW5nZT1mdW5jdGlvbih0KXtpZih0aGlzLl9jb3VudCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmZS5wdXNoKGkpO3ZhciBuPWUubGVuZ3RoO2lmKG4pe3ZhciBvPXRoaXMuY291bnQoKSxhPW5ldyhCZih0aGlzKSkobykscj0wLHM9ZVswXSxsPXRbc11bMF0sdT10W3NdWzFdLGg9ITE7aWYoIXRoaXMuX2luZGljZXMpe3ZhciBjPTA7aWYoMT09PW4pe2Zvcih2YXIgZD10aGlzLl9zdG9yYWdlW2VbMF1dLGY9MDtmPHRoaXMuX2NodW5rQ291bnQ7ZisrKWZvcih2YXIgcD1kW2ZdLGc9TWF0aC5taW4odGhpcy5fY291bnQtZip0aGlzLl9jaHVua1NpemUsdGhpcy5fY2h1bmtTaXplKSxtPTA7bTxnO20rKyl7KGw8PSh3PXBbbV0pJiZ3PD11fHxpc05hTih3KSkmJihhW3IrK109YyksYysrfWg9ITB9ZWxzZSBpZigyPT09bil7ZD10aGlzLl9zdG9yYWdlW3NdO3ZhciB2PXRoaXMuX3N0b3JhZ2VbZVsxXV0seT10W2VbMV1dWzBdLHg9dFtlWzFdXVsxXTtmb3IoZj0wO2Y8dGhpcy5fY2h1bmtDb3VudDtmKyspe3A9ZFtmXTt2YXIgXz12W2ZdO2ZvcihnPU1hdGgubWluKHRoaXMuX2NvdW50LWYqdGhpcy5fY2h1bmtTaXplLHRoaXMuX2NodW5rU2l6ZSksbT0wO208ZzttKyspe3ZhciB3PXBbbV0sYj1fW21dOyhsPD13JiZ3PD11fHxpc05hTih3KSkmJih5PD1iJiZiPD14fHxpc05hTihiKSkmJihhW3IrK109YyksYysrfX1oPSEwfX1pZighaClpZigxPT09bilmb3IobT0wO208bzttKyspe3ZhciBTPXRoaXMuZ2V0UmF3SW5kZXgobSk7KGw8PSh3PXRoaXMuX2dldEZhc3QocyxTKSkmJnc8PXV8fGlzTmFOKHcpKSYmKGFbcisrXT1TKX1lbHNlIGZvcihtPTA7bTxvO20rKyl7dmFyIE09ITA7Zm9yKFM9dGhpcy5nZXRSYXdJbmRleChtKSxmPTA7ZjxuO2YrKyl7dmFyIEk9ZVtmXTsoKHc9dGhpcy5fZ2V0RmFzdChpLFMpKTx0W0ldWzBdfHx3PnRbSV1bMV0pJiYoTT0hMSl9TSYmKGFbcisrXT10aGlzLmdldFJhd0luZGV4KG0pKX1yZXR1cm4gcjxvJiYodGhpcy5faW5kaWNlcz1hKSx0aGlzLl9jb3VudD1yLHRoaXMuX2V4dGVudD17fSx0aGlzLmdldFJhd0luZGV4PXRoaXMuX2luZGljZXM/amY6WWYsdGhpc319fSxIZi5tYXBBcnJheT1mdW5jdGlvbih0LGUsaSxuKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49aSxpPWUsZT10LHQ9W10pLGk9aXx8bnx8dGhpczt2YXIgbz1bXTtyZXR1cm4gdGhpcy5lYWNoKHQsZnVuY3Rpb24oKXtvLnB1c2goZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxpKSxvfSxIZi5tYXA9ZnVuY3Rpb24odCxlLGksbil7aT1pfHxufHx0aGlzO3ZhciBvPSRmKHRoaXMsdD1OKEtmKHQpLHRoaXMuZ2V0RGltZW5zaW9uLHRoaXMpKTtvLl9pbmRpY2VzPXRoaXMuX2luZGljZXMsby5nZXRSYXdJbmRleD1vLl9pbmRpY2VzP2pmOllmO2Zvcih2YXIgYT1vLl9zdG9yYWdlLHI9W10scz10aGlzLl9jaHVua1NpemUsbD10Lmxlbmd0aCx1PXRoaXMuY291bnQoKSxoPVtdLGM9by5fcmF3RXh0ZW50LGQ9MDtkPHU7ZCsrKXtmb3IodmFyIGY9MDtmPGw7ZisrKWhbZl09dGhpcy5nZXQodFtmXSxkKTtoW2xdPWQ7dmFyIHA9ZSYmZS5hcHBseShpLGgpO2lmKG51bGwhPXApeyJvYmplY3QiIT10eXBlb2YgcCYmKHJbMF09cCxwPXIpO2Zvcih2YXIgZz10aGlzLmdldFJhd0luZGV4KGQpLG09TWF0aC5mbG9vcihnL3MpLHY9ZyVzLHk9MDt5PHAubGVuZ3RoO3krKyl7dmFyIHg9dFt5XSxfPXBbeV0sdz1jW3hdLGI9YVt4XTtiJiYoYlttXVt2XT1fKSxfPHdbMF0mJih3WzBdPV8pLF8+d1sxXSYmKHdbMV09Xyl9fX1yZXR1cm4gb30sSGYuZG93blNhbXBsZT1mdW5jdGlvbih0LGUsaSxuKXtmb3IodmFyIG89JGYodGhpcyxbdF0pLGE9by5fc3RvcmFnZSxyPVtdLHM9TWF0aC5mbG9vcigxL2UpLGw9YVt0XSx1PXRoaXMuY291bnQoKSxoPXRoaXMuX2NodW5rU2l6ZSxjPW8uX3Jhd0V4dGVudFt0XSxkPW5ldyhCZih0aGlzKSkodSksZj0wLHA9MDtwPHU7cCs9cyl7dS1wPHMmJihzPXUtcCxyLmxlbmd0aD1zKTtmb3IodmFyIGc9MDtnPHM7ZysrKXt2YXIgbT10aGlzLmdldFJhd0luZGV4KHArZyksdj1NYXRoLmZsb29yKG0vaCkseT1tJWg7cltnXT1sW3ZdW3ldfXZhciB4PWkociksXz10aGlzLmdldFJhd0luZGV4KE1hdGgubWluKHArbihyLHgpfHwwLHUtMSkpLHc9XyVoOyhsW01hdGguZmxvb3IoXy9oKV1bd109eCk8Y1swXSYmKGNbMF09eCkseD5jWzFdJiYoY1sxXT14KSxkW2YrK109X31yZXR1cm4gby5fY291bnQ9ZixvLl9pbmRpY2VzPWQsby5nZXRSYXdJbmRleD1qZixvfSxIZi5nZXRJdGVtTW9kZWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ob3N0TW9kZWw7cmV0dXJuIG5ldyBJbCh0aGlzLmdldFJhd0RhdGFJdGVtKHQpLGUsZSYmZS5lY01vZGVsKX0sSGYuZGlmZj1mdW5jdGlvbihlKXt2YXIgaT10aGlzO3JldHVybiBuZXcgVGYoZT9lLmdldEluZGljZXMoKTpbXSx0aGlzLmdldEluZGljZXMoKSxmdW5jdGlvbih0KXtyZXR1cm4gcWYoZSx0KX0sZnVuY3Rpb24odCl7cmV0dXJuIHFmKGksdCl9KX0sSGYuZ2V0VmlzdWFsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Zpc3VhbDtyZXR1cm4gZSYmZVt0XX0sSGYuc2V0VmlzdWFsPWZ1bmN0aW9uKHQsZSl7aWYoUGYodCkpZm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmdGhpcy5zZXRWaXN1YWwoaSx0W2ldKTtlbHNlIHRoaXMuX3Zpc3VhbD10aGlzLl92aXN1YWx8fHt9LHRoaXMuX3Zpc3VhbFt0XT1lfSxIZi5zZXRMYXlvdXQ9ZnVuY3Rpb24odCxlKXtpZihQZih0KSlmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZ0aGlzLnNldExheW91dChpLHRbaV0pO2Vsc2UgdGhpcy5fbGF5b3V0W3RdPWV9LEhmLmdldExheW91dD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF5b3V0W3RdfSxIZi5nZXRJdGVtTGF5b3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtTGF5b3V0c1t0XX0sSGYuc2V0SXRlbUxheW91dD1mdW5jdGlvbih0LGUsaSl7dGhpcy5faXRlbUxheW91dHNbdF09aT9MKHRoaXMuX2l0ZW1MYXlvdXRzW3RdfHx7fSxlKTplfSxIZi5jbGVhckl0ZW1MYXlvdXRzPWZ1bmN0aW9uKCl7dGhpcy5faXRlbUxheW91dHMubGVuZ3RoPTB9LEhmLmdldEl0ZW1WaXN1YWw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2l0ZW1WaXN1YWxzW3RdLG89biYmbltlXTtyZXR1cm4gbnVsbCE9b3x8aT9vOnRoaXMuZ2V0VmlzdWFsKGUpfSxIZi5zZXRJdGVtVmlzdWFsPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9pdGVtVmlzdWFsc1t0XXx8e30sbz10aGlzLmhhc0l0ZW1WaXN1YWw7aWYodGhpcy5faXRlbVZpc3VhbHNbdF09bixQZihlKSlmb3IodmFyIGEgaW4gZSllLmhhc093blByb3BlcnR5KGEpJiYoblthXT1lW2FdLG9bYV09ITApO2Vsc2UgbltlXT1pLG9bZV09ITB9LEhmLmNsZWFyQWxsVmlzdWFsPWZ1bmN0aW9uKCl7dGhpcy5fdmlzdWFsPXt9LHRoaXMuX2l0ZW1WaXN1YWxzPVtdLHRoaXMuaGFzSXRlbVZpc3VhbD17fX07ZnVuY3Rpb24gdHAodCl7dC5zZXJpZXNJbmRleD10aGlzLnNlcmllc0luZGV4LHQuZGF0YUluZGV4PXRoaXMuZGF0YUluZGV4LHQuZGF0YVR5cGU9dGhpcy5kYXRhVHlwZX1mdW5jdGlvbiBlcCh0LGUsaSl7R3UuaXNJbnN0YW5jZShlKXx8KGU9R3Uuc2VyaWVzRGF0YVRvU291cmNlKGUpKSxpPWl8fHt9LHQ9KHR8fFtdKS5zbGljZSgpO2Zvcih2YXIgbj0oaS5kaW1zRGVmfHxbXSkuc2xpY2UoKSxvPVEoKSxhPVEoKSxsPVtdLHI9ZnVuY3Rpb24odCxlLGksbil7dmFyIG89TWF0aC5tYXgodC5kaW1lbnNpb25zRGV0ZWN0Q291bnR8fDEsZS5sZW5ndGgsaS5sZW5ndGgsbnx8MCk7cmV0dXJuIEUoZSxmdW5jdGlvbih0KXt2YXIgZT10LmRpbXNEZWY7ZSYmKG89TWF0aC5tYXgobyxlLmxlbmd0aCkpfSksb30oZSx0LG4saS5kaW1Db3VudCkscz0wO3M8cjtzKyspe3ZhciB1PW5bc109TCh7fSxSKG5bc10pP25bc106e25hbWU6bltzXX0pLGg9dS5uYW1lLGM9bFtzXT1uZXcga2Y7bnVsbCE9aCYmbnVsbD09by5nZXQoaCkmJihjLm5hbWU9Yy5kaXNwbGF5TmFtZT1oLG8uc2V0KGgscykpLG51bGwhPXUudHlwZSYmKGMudHlwZT11LnR5cGUpLG51bGwhPXUuZGlzcGxheU5hbWUmJihjLmRpc3BsYXlOYW1lPXUuZGlzcGxheU5hbWUpfXZhciBkPWkuZW5jb2RlRGVmOyFkJiZpLmVuY29kZURlZmF1bHRlciYmKGQ9aS5lbmNvZGVEZWZhdWx0ZXIoZSxyKSksKGQ9UShkKSkuZWFjaChmdW5jdGlvbih0LGkpe2lmKDE9PT0odD1Fbyh0KS5zbGljZSgpKS5sZW5ndGgmJiF6KHRbMF0pJiZ0WzBdPDApZC5zZXQoaSwhMSk7ZWxzZXt2YXIgbj1kLnNldChpLFtdKTtFKHQsZnVuY3Rpb24odCxlKXt6KHQpJiYodD1vLmdldCh0KSksbnVsbCE9dCYmdDxyJiYobltlXT10LHAobFt0XSxpLGUpKX0pfX0pO3ZhciBmPTA7ZnVuY3Rpb24gcCh0LGUsaSl7bnVsbCE9RGYuZ2V0KGUpP3Qub3RoZXJEaW1zW2VdPWk6KHQuY29vcmREaW09ZSx0LmNvb3JkRGltSW5kZXg9aSxhLnNldChlLCEwKSl9RSh0LGZ1bmN0aW9uKG8sdCl7dmFyIGEscixzO2lmKHoobykpYT1vLG89e307ZWxzZXthPW8ubmFtZTt2YXIgZT1vLm9yZGluYWxNZXRhO28ub3JkaW5hbE1ldGE9bnVsbCwobz1EKG8pKS5vcmRpbmFsTWV0YT1lLHI9by5kaW1zRGVmLHM9by5vdGhlckRpbXMsby5uYW1lPW8uY29vcmREaW09by5jb29yZERpbUluZGV4PW8uZGltc0RlZj1vLm90aGVyRGltcz1udWxsfWlmKCExIT09KGk9ZC5nZXQoYSkpKXt2YXIgaTtpZighKGk9RW8oaSkpLmxlbmd0aClmb3IodmFyIG49MDtuPChyJiZyLmxlbmd0aHx8MSk7bisrKXtmb3IoO2Y8bC5sZW5ndGgmJm51bGwhPWxbZl0uY29vcmREaW07KWYrKztmPGwubGVuZ3RoJiZpLnB1c2goZisrKX1FKGksZnVuY3Rpb24odCxlKXt2YXIgaT1sW3RdO2lmKHAoQyhpLG8pLGEsZSksbnVsbD09aS5uYW1lJiZyKXt2YXIgbj1yW2VdO1Iobil8fChuPXtuYW1lOm59KSxpLm5hbWU9aS5kaXNwbGF5TmFtZT1uLm5hbWUsaS5kZWZhdWx0VG9vbHRpcD1uLmRlZmF1bHRUb29sdGlwfXMmJkMoaS5vdGhlckRpbXMscyl9KX19KTt2YXIgZz1pLmdlbmVyYXRlQ29vcmQsbT1pLmdlbmVyYXRlQ29vcmRDb3VudCx2PW51bGwhPW07bT1nP218fDE6MDtmb3IodmFyIHkseCxfPWd8fCJ2YWx1ZSIsdz0wO3c8cjt3Kyspe251bGw9PShjPWxbd109bFt3XXx8bmV3IGtmKS5jb29yZERpbSYmKGMuY29vcmREaW09aXAoXyxhLHYpLGMuY29vcmREaW1JbmRleD0wLCghZ3x8bTw9MCkmJihjLmlzRXh0cmFDb29yZD0hMCksbS0tKSxudWxsPT1jLm5hbWUmJihjLm5hbWU9aXAoYy5jb29yZERpbSxvKSksbnVsbD09Yy50eXBlJiYoeT1lLHg9dyxjLm5hbWUscXUoeS5kYXRhLHkuc291cmNlRm9ybWF0LHkuc2VyaWVzTGF5b3V0QnkseS5kaW1lbnNpb25zRGVmaW5lLHkuc3RhcnRJbmRleCx4KT09PUZ1Lk11c3R8fGMuaXNFeHRyYUNvb3JkJiYobnVsbCE9Yy5vdGhlckRpbXMuaXRlbU5hbWV8fG51bGwhPWMub3RoZXJEaW1zLnNlcmllc05hbWUpKSYmKGMudHlwZT0ib3JkaW5hbCIpfXJldHVybiBsfWZ1bmN0aW9uIGlwKHQsZSxpKXtpZihpfHxudWxsIT1lLmdldCh0KSl7Zm9yKHZhciBuPTA7bnVsbCE9ZS5nZXQodCtuKTspbisrO3QrPW59cmV0dXJuIGUuc2V0KHQsITApLHR9SGYuc2V0SXRlbUdyYXBoaWNFbD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuaG9zdE1vZGVsO2UmJihlLmRhdGFJbmRleD10LGUuZGF0YVR5cGU9dGhpcy5kYXRhVHlwZSxlLnNlcmllc0luZGV4PWkmJmkuc2VyaWVzSW5kZXgsImdyb3VwIj09PWUudHlwZSYmZS50cmF2ZXJzZSh0cCxlKSksdGhpcy5fZ3JhcGhpY0Vsc1t0XT1lfSxIZi5nZXRJdGVtR3JhcGhpY0VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ncmFwaGljRWxzW3RdfSxIZi5lYWNoSXRlbUdyYXBoaWNFbD1mdW5jdGlvbihpLG4pe0UodGhpcy5fZ3JhcGhpY0VscyxmdW5jdGlvbih0LGUpe3QmJmkmJmkuY2FsbChuLHQsZSl9KX0sSGYuY2xvbmVTaGFsbG93PWZ1bmN0aW9uKHQpe2lmKCF0KXt2YXIgZT1OKHRoaXMuZGltZW5zaW9ucyx0aGlzLmdldERpbWVuc2lvbkluZm8sdGhpcyk7dD1uZXcgV2YoZSx0aGlzLmhvc3RNb2RlbCl9aWYodC5fc3RvcmFnZT10aGlzLl9zdG9yYWdlLEZmKHQsdGhpcyksdGhpcy5faW5kaWNlcyl7dmFyIGk9dGhpcy5faW5kaWNlcy5jb25zdHJ1Y3Rvcjt0Ll9pbmRpY2VzPW5ldyBpKHRoaXMuX2luZGljZXMpfWVsc2UgdC5faW5kaWNlcz1udWxsO3JldHVybiB0LmdldFJhd0luZGV4PXQuX2luZGljZXM/amY6WWYsdH0sSGYud3JhcE1ldGhvZD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXNbdF07ImZ1bmN0aW9uIj09dHlwZW9mIGkmJih0aGlzLl9fd3JhcHBlZE1ldGhvZHM9dGhpcy5fX3dyYXBwZWRNZXRob2RzfHxbXSx0aGlzLl9fd3JhcHBlZE1ldGhvZHMucHVzaCh0KSx0aGlzW3RdPWZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUuYXBwbHkodGhpcyxbdF0uY29uY2F0KFUoYXJndW1lbnRzKSkpfSl9LEhmLlRSQU5TRkVSQUJMRV9NRVRIT0RTPVsiY2xvbmVTaGFsbG93IiwiZG93blNhbXBsZSIsIm1hcCJdLEhmLkNIQU5HQUJMRV9NRVRIT0RTPVsiZmlsdGVyU2VsZiIsInNlbGVjdFJhbmdlIl07dmFyIG5wPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVwKChlPWV8fHt9KS5jb29yZERpbWVuc2lvbnN8fFtdLHQse2RpbXNEZWY6ZS5kaW1lbnNpb25zRGVmaW5lfHx0LmRpbWVuc2lvbnNEZWZpbmUsZW5jb2RlRGVmOmUuZW5jb2RlRGVmaW5lfHx0LmVuY29kZURlZmluZSxkaW1Db3VudDplLmRpbWVuc2lvbnNDb3VudCxlbmNvZGVEZWZhdWx0ZXI6ZS5lbmNvZGVEZWZhdWx0ZXIsZ2VuZXJhdGVDb29yZDplLmdlbmVyYXRlQ29vcmQsZ2VuZXJhdGVDb29yZENvdW50OmUuZ2VuZXJhdGVDb29yZENvdW50fSl9O2Z1bmN0aW9uIG9wKHQpe3RoaXMuY29vcmRTeXNOYW1lPXQsdGhpcy5jb29yZFN5c0RpbXM9W10sdGhpcy5heGlzTWFwPVEoKSx0aGlzLmNhdGVnb3J5QXhpc01hcD1RKCksdGhpcy5maXJzdENhdGVnb3J5RGltSW5kZXg9bnVsbH12YXIgYXA9e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygieEF4aXMiKVswXSxhPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygieUF4aXMiKVswXTtlLmNvb3JkU3lzRGltcz1bIngiLCJ5Il0saS5zZXQoIngiLG8pLGkuc2V0KCJ5IixhKSxycChvKSYmKG4uc2V0KCJ4IixvKSxlLmZpcnN0Q2F0ZWdvcnlEaW1JbmRleD0wKSxycChhKSYmKG4uc2V0KCJ5IixhKSxlLmZpcnN0Q2F0ZWdvcnlEaW1JbmRleCxlLmZpcnN0Q2F0ZWdvcnlEaW1JbmRleD0xKX0sc2luZ2xlQXhpczpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10LmdldFJlZmVycmluZ0NvbXBvbmVudHMoInNpbmdsZUF4aXMiKVswXTtlLmNvb3JkU3lzRGltcz1bInNpbmdsZSJdLGkuc2V0KCJzaW5nbGUiLG8pLHJwKG8pJiYobi5zZXQoInNpbmdsZSIsbyksZS5maXJzdENhdGVnb3J5RGltSW5kZXg9MCl9LHBvbGFyOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygicG9sYXIiKVswXSxhPW8uZmluZEF4aXNNb2RlbCgicmFkaXVzQXhpcyIpLHI9by5maW5kQXhpc01vZGVsKCJhbmdsZUF4aXMiKTtlLmNvb3JkU3lzRGltcz1bInJhZGl1cyIsImFuZ2xlIl0saS5zZXQoInJhZGl1cyIsYSksaS5zZXQoImFuZ2xlIixyKSxycChhKSYmKG4uc2V0KCJyYWRpdXMiLGEpLGUuZmlyc3RDYXRlZ29yeURpbUluZGV4PTApLHJwKHIpJiYobi5zZXQoImFuZ2xlIixyKSxudWxsPT1lLmZpcnN0Q2F0ZWdvcnlEaW1JbmRleCYmKGUuZmlyc3RDYXRlZ29yeURpbUluZGV4PTEpKX0sZ2VvOmZ1bmN0aW9uKHQsZSxpLG4pe2UuY29vcmRTeXNEaW1zPVsibG5nIiwibGF0Il19LHBhcmFsbGVsOmZ1bmN0aW9uKHQsbyxhLHIpe3ZhciBzPXQuZWNNb2RlbCxlPXMuZ2V0Q29tcG9uZW50KCJwYXJhbGxlbCIsdC5nZXQoInBhcmFsbGVsSW5kZXgiKSksbD1vLmNvb3JkU3lzRGltcz1lLmRpbWVuc2lvbnMuc2xpY2UoKTtFKGUucGFyYWxsZWxBeGlzSW5kZXgsZnVuY3Rpb24odCxlKXt2YXIgaT1zLmdldENvbXBvbmVudCgicGFyYWxsZWxBeGlzIix0KSxuPWxbZV07YS5zZXQobixpKSxycChpKSYmbnVsbD09by5maXJzdENhdGVnb3J5RGltSW5kZXgmJihyLnNldChuLGkpLG8uZmlyc3RDYXRlZ29yeURpbUluZGV4PWUpfSl9fTtmdW5jdGlvbiBycCh0KXtyZXR1cm4iY2F0ZWdvcnkiPT09dC5nZXQoInR5cGUiKX1mdW5jdGlvbiBzcCh0LGksZSl7dmFyIG4sbyxhLHIscz0oZT1lfHx7fSkuYnlJbmRleCxsPWUuc3RhY2tlZENvb3JkRGltZW5zaW9uLHU9ISghdHx8IXQuZ2V0KCJzdGFjayIpKTtpZihFKGksZnVuY3Rpb24odCxlKXt6KHQpJiYoaVtlXT10PXtuYW1lOnR9KSx1JiYhdC5pc0V4dHJhQ29vcmQmJihzfHxufHwhdC5vcmRpbmFsTWV0YXx8KG49dCksb3x8Im9yZGluYWwiPT09dC50eXBlfHwidGltZSI9PT10LnR5cGV8fGwmJmwhPT10LmNvb3JkRGltfHwobz10KSl9KSwhb3x8c3x8bnx8KHM9ITApLG8pe2E9Il9fXDBlY3N0YWNrcmVzdWx0IixyPSJfX1wwZWNzdGFja2Vkb3ZlciIsbiYmKG4uY3JlYXRlSW52ZXJ0ZWRJbmRpY2VzPSEwKTt2YXIgaD1vLmNvb3JkRGltLGM9by50eXBlLGQ9MDtFKGksZnVuY3Rpb24odCl7dC5jb29yZERpbT09PWgmJmQrK30pLGkucHVzaCh7bmFtZTphLGNvb3JkRGltOmgsY29vcmREaW1JbmRleDpkLHR5cGU6Yyxpc0V4dHJhQ29vcmQ6ITAsaXNDYWxjdWxhdGlvbkNvb3JkOiEwfSksZCsrLGkucHVzaCh7bmFtZTpyLGNvb3JkRGltOnIsY29vcmREaW1JbmRleDpkLHR5cGU6Yyxpc0V4dHJhQ29vcmQ6ITAsaXNDYWxjdWxhdGlvbkNvb3JkOiEwfSl9cmV0dXJue3N0YWNrZWREaW1lbnNpb246byYmby5uYW1lLHN0YWNrZWRCeURpbWVuc2lvbjpuJiZuLm5hbWUsaXNTdGFja2VkQnlJbmRleDpzLHN0YWNrZWRPdmVyRGltZW5zaW9uOnIsc3RhY2tSZXN1bHREaW1lbnNpb246YX19ZnVuY3Rpb24gbHAodCxlKXtyZXR1cm4hIWUmJmU9PT10LmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tlZERpbWVuc2lvbiIpfWZ1bmN0aW9uIHVwKHQsZSl7cmV0dXJuIGxwKHQsZSk/dC5nZXRDYWxjdWxhdGlvbkluZm8oInN0YWNrUmVzdWx0RGltZW5zaW9uIik6ZX1mdW5jdGlvbiBocCh0LGUsaSl7aT1pfHx7fSxHdS5pc0luc3RhbmNlKHQpfHwodD1HdS5zZXJpZXNEYXRhVG9Tb3VyY2UodCkpO3ZhciBuLG89ZS5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSxhPW5oLmdldChvKSxyPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIiksaT1uZXcgb3AoZSksbj1hcFtlXTtpZihuKXJldHVybiBuKHQsaSxpLmF4aXNNYXAsaS5jYXRlZ29yeUF4aXNNYXApLGl9KGUpO3ImJihuPU4oci5jb29yZFN5c0RpbXMsZnVuY3Rpb24odCl7dmFyIGU9e25hbWU6dH0saT1yLmF4aXNNYXAuZ2V0KHQpO2lmKGkpe3ZhciBuPWkuZ2V0KCJ0eXBlIik7ZS50eXBlPUxmKG4pfXJldHVybiBlfSkpLG49bnx8KGEmJihhLmdldERpbWVuc2lvbnNJbmZvP2EuZ2V0RGltZW5zaW9uc0luZm8oKTphLmRpbWVuc2lvbnMuc2xpY2UoKSl8fFsieCIsInkiXSk7dmFyIHMsbCx1PW5wKHQse2Nvb3JkRGltZW5zaW9uczpuLGdlbmVyYXRlQ29vcmQ6aS5nZW5lcmF0ZUNvb3JkLGVuY29kZURlZmF1bHRlcjppLnVzZUVuY29kZURlZmF1bHRlcj9UKFh1LG4sZSk6bnVsbH0pO3ImJkUodSxmdW5jdGlvbih0LGUpe3ZhciBpPXQuY29vcmREaW0sbj1yLmNhdGVnb3J5QXhpc01hcC5nZXQoaSk7biYmKG51bGw9PXMmJihzPWUpLHQub3JkaW5hbE1ldGE9bi5nZXRPcmRpbmFsTWV0YSgpKSxudWxsIT10Lm90aGVyRGltcy5pdGVtTmFtZSYmKGw9ITApfSksbHx8bnVsbD09c3x8KHVbc10ub3RoZXJEaW1zLml0ZW1OYW1lPTApO3ZhciBoPXNwKGUsdSksYz1uZXcgV2YodSxlKTtjLnNldENhbGN1bGF0aW9uSW5mbyhoKTt2YXIgZD1udWxsIT1zJiZmdW5jdGlvbih0KXtpZih0LnNvdXJjZUZvcm1hdD09PVB1KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT0wO2Zvcig7ZTx0Lmxlbmd0aCYmbnVsbD09dFtlXTspZSsrO3JldHVybiB0W2VdfSh0LmRhdGF8fFtdKTtyZXR1cm4gbnVsbCE9ZSYmIWsoQm8oZSkpfX0odCk/ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIG49PT1zP2k6dGhpcy5kZWZhdWx0RGltVmFsdWVHZXR0ZXIodCxlLGksbil9Om51bGw7cmV0dXJuIGMuaGFzSXRlbU9wdGlvbj0hMSxjLmluaXREYXRhKHQsbnVsbCxkKSxjfWZ1bmN0aW9uIGNwKHQpe3RoaXMuX3NldHRpbmc9dHx8e30sdGhpcy5fZXh0ZW50PVsxLzAsLTEvMF0sdGhpcy5faW50ZXJ2YWw9MCx0aGlzLmluaXQmJnRoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZHAodCl7dGhpcy5jYXRlZ29yaWVzPXQuY2F0ZWdvcmllc3x8W10sdGhpcy5fbmVlZENvbGxlY3Q9dC5uZWVkQ29sbGVjdCx0aGlzLl9kZWR1cGxpY2F0aW9uPXQuZGVkdXBsaWNhdGlvbix0aGlzLl9tYXB9Y3AucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcC5wcm90b3R5cGUuZ2V0U2V0dGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc2V0dGluZ1t0XX0sY3AucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZXh0ZW50O3JldHVybiB0Pj1lWzBdJiZ0PD1lWzFdfSxjcC5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDtyZXR1cm4gZVsxXT09PWVbMF0/LjU6KHQtZVswXSkvKGVbMV0tZVswXSl9LGNwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQ7cmV0dXJuIHQqKGVbMV0tZVswXSkrZVswXX0sY3AucHJvdG90eXBlLnVuaW9uRXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDt0WzBdPGVbMF0mJihlWzBdPXRbMF0pLHRbMV0+ZVsxXSYmKGVbMV09dFsxXSl9LGNwLnByb3RvdHlwZS51bmlvbkV4dGVudEZyb21EYXRhPWZ1bmN0aW9uKHQsZSl7dGhpcy51bmlvbkV4dGVudCh0LmdldEFwcHJveGltYXRlRXh0ZW50KGUpKX0sY3AucHJvdG90eXBlLmdldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHRlbnQuc2xpY2UoKX0sY3AucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V4dGVudDtpc05hTih0KXx8KGlbMF09dCksaXNOYU4oZSl8fChpWzFdPWUpfSxjcC5wcm90b3R5cGUuaXNCbGFuaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0JsYW5rfSxjcC5wcm90b3R5cGUuc2V0Qmxhbms9ZnVuY3Rpb24odCl7dGhpcy5faXNCbGFuaz10fSxjcC5wcm90b3R5cGUuZ2V0TGFiZWw9bnVsbCx0YShjcCksYWEoY3Ase3JlZ2lzdGVyV2hlbkV4dGVuZDohMH0pLGRwLmNyZWF0ZUJ5QXhpc01vZGVsPWZ1bmN0aW9uKHQpe3ZhciBlPXQub3B0aW9uLGk9ZS5kYXRhLG49aSYmTihpLGdwKTtyZXR1cm4gbmV3IGRwKHtjYXRlZ29yaWVzOm4sbmVlZENvbGxlY3Q6IW4sZGVkdXBsaWNhdGlvbjohMSE9PWUuZGVkcGxpY2F0aW9ufSl9O3ZhciBmcD1kcC5wcm90b3R5cGU7ZnVuY3Rpb24gcHAodCl7cmV0dXJuIHQuX21hcHx8KHQuX21hcD1RKHQuY2F0ZWdvcmllcykpfWZ1bmN0aW9uIGdwKHQpe3JldHVybiBSKHQpJiZudWxsIT10LnZhbHVlP3QudmFsdWU6dCsiIn1mcC5nZXRPcmRpbmFsPWZ1bmN0aW9uKHQpe3JldHVybiBwcCh0aGlzKS5nZXQodCl9LGZwLnBhcnNlQW5kQ29sbGVjdD1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMuX25lZWRDb2xsZWN0O2lmKCJzdHJpbmciIT10eXBlb2YgdCYmIWkpcmV0dXJuIHQ7aWYoaSYmIXRoaXMuX2RlZHVwbGljYXRpb24pcmV0dXJuIGU9dGhpcy5jYXRlZ29yaWVzLmxlbmd0aCx0aGlzLmNhdGVnb3JpZXNbZV09dCxlO3ZhciBuPXBwKHRoaXMpO3JldHVybiBudWxsPT0oZT1uLmdldCh0KSkmJihpPyhlPXRoaXMuY2F0ZWdvcmllcy5sZW5ndGgsdGhpcy5jYXRlZ29yaWVzW2VdPXQsbi5zZXQodCxlKSk6ZT1OYU4pLGV9O3ZhciBtcD1jcC5wcm90b3R5cGUsdnA9Y3AuZXh0ZW5kKHt0eXBlOiJvcmRpbmFsIixpbml0OmZ1bmN0aW9uKHQsZSl7dCYmIWsodCl8fCh0PW5ldyBkcCh7Y2F0ZWdvcmllczp0fSkpLHRoaXMuX29yZGluYWxNZXRhPXQsdGhpcy5fZXh0ZW50PWV8fFswLHQuY2F0ZWdvcmllcy5sZW5ndGgtMV19LHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90aGlzLl9vcmRpbmFsTWV0YS5nZXRPcmRpbmFsKHQpOk1hdGgucm91bmQodCl9LGNvbnRhaW46ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5wYXJzZSh0KSxtcC5jb250YWluLmNhbGwodGhpcyx0KSYmbnVsbCE9dGhpcy5fb3JkaW5hbE1ldGEuY2F0ZWdvcmllc1t0XX0sbm9ybWFsaXplOmZ1bmN0aW9uKHQpe3JldHVybiBtcC5ub3JtYWxpemUuY2FsbCh0aGlzLHRoaXMucGFyc2UodCkpfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZChtcC5zY2FsZS5jYWxsKHRoaXMsdCkpfSxnZXRUaWNrczpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMuX2V4dGVudCxpPWVbMF07aTw9ZVsxXTspdC5wdXNoKGkpLGkrKztyZXR1cm4gdH0sZ2V0TGFiZWw6ZnVuY3Rpb24odCl7aWYoIXRoaXMuaXNCbGFuaygpKXJldHVybiB0aGlzLl9vcmRpbmFsTWV0YS5jYXRlZ29yaWVzW3RdfSxjb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHRlbnRbMV0tdGhpcy5fZXh0ZW50WzBdKzF9LHVuaW9uRXh0ZW50RnJvbURhdGE6ZnVuY3Rpb24odCxlKXt0aGlzLnVuaW9uRXh0ZW50KHQuZ2V0QXBwcm94aW1hdGVFeHRlbnQoZSkpfSxnZXRPcmRpbmFsTWV0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmRpbmFsTWV0YX0sbmljZVRpY2tzOmV0LG5pY2VFeHRlbnQ6ZXR9KTt2cC5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZwfTt2YXIgeXA9Tmw7ZnVuY3Rpb24geHAodCl7cmV0dXJuIHpsKHQpKzJ9ZnVuY3Rpb24gX3AodCxlLGkpe3RbZV09TWF0aC5tYXgoTWF0aC5taW4odFtlXSxpWzFdKSxpWzBdKX1mdW5jdGlvbiB3cCh0LGUpe2lzRmluaXRlKHRbMF0pfHwodFswXT1lWzBdKSxpc0Zpbml0ZSh0WzFdKXx8KHRbMV09ZVsxXSksX3AodCwwLGUpLF9wKHQsMSxlKSx0WzBdPnRbMV0mJih0WzBdPXRbMV0pfXZhciBicD1ObCxTcD1jcC5leHRlbmQoe3R5cGU6ImludGVydmFsIixfaW50ZXJ2YWw6MCxfaW50ZXJ2YWxQcmVjaXNpb246MixzZXRFeHRlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9leHRlbnQ7aXNOYU4odCl8fChpWzBdPXBhcnNlRmxvYXQodCkpLGlzTmFOKGUpfHwoaVsxXT1wYXJzZUZsb2F0KGUpKX0sdW5pb25FeHRlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZXh0ZW50O3RbMF08ZVswXSYmKGVbMF09dFswXSksdFsxXT5lWzFdJiYoZVsxXT10WzFdKSxTcC5wcm90b3R5cGUuc2V0RXh0ZW50LmNhbGwodGhpcyxlWzBdLGVbMV0pfSxnZXRJbnRlcnZhbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcnZhbH0sc2V0SW50ZXJ2YWw6ZnVuY3Rpb24odCl7dGhpcy5faW50ZXJ2YWw9dCx0aGlzLl9uaWNlRXh0ZW50PXRoaXMuX2V4dGVudC5zbGljZSgpLHRoaXMuX2ludGVydmFsUHJlY2lzaW9uPXhwKHQpfSxnZXRUaWNrczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pbnRlcnZhbCxpPXRoaXMuX2V4dGVudCxuPXRoaXMuX25pY2VFeHRlbnQsbz10aGlzLl9pbnRlcnZhbFByZWNpc2lvbixhPVtdO2lmKCFlKXJldHVybiBhO2lbMF08blswXSYmKHQ/YS5wdXNoKGJwKG5bMF0tZSkpOmEucHVzaChpWzBdKSk7Zm9yKHZhciByPW5bMF07cjw9blsxXSYmKGEucHVzaChyKSwocj1icChyK2UsbykpIT09YVthLmxlbmd0aC0xXSk7KWlmKDFlNDxhLmxlbmd0aClyZXR1cm5bXTt2YXIgcz1hLmxlbmd0aD9hW2EubGVuZ3RoLTFdOm5bMV07cmV0dXJuIGlbMV0+cyYmKHQ/YS5wdXNoKHMrZSk6YS5wdXNoKGlbMV0pKSxhfSxnZXRNaW5vclRpY2tzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdldFRpY2tzKCEwKSxpPVtdLG49dGhpcy5nZXRFeHRlbnQoKSxvPTE7bzxlLmxlbmd0aDtvKyspe2Zvcih2YXIgYT1lW29dLHI9ZVtvLTFdLHM9MCxsPVtdLHU9KGEtcikvdDtzPHQtMTspe3ZhciBoPU5sKHIrKHMrMSkqdSk7aD5uWzBdJiZoPG5bMV0mJmwucHVzaChoKSxzKyt9aS5wdXNoKGwpfXJldHVybiBpfSxnZXRMYWJlbDpmdW5jdGlvbih0LGUpe2lmKG51bGw9PXQpcmV0dXJuIiI7dmFyIGk9ZSYmZS5wcmVjaXNpb247cmV0dXJuIG51bGw9PWk/aT16bCh0KXx8MDoiYXV0byI9PT1pJiYoaT10aGlzLl9pbnRlcnZhbFByZWNpc2lvbiksS2wodD1icCh0LGksITApKX0sbmljZVRpY2tzOmZ1bmN0aW9uKHQsZSxpKXt0PXR8fDU7dmFyIG49dGhpcy5fZXh0ZW50LG89blsxXS1uWzBdO2lmKGlzRmluaXRlKG8pKXtvPDAmJihvPS1vLG4ucmV2ZXJzZSgpKTt2YXIgYT1mdW5jdGlvbih0LGUsaSxuKXt2YXIgbz17fSxhPXRbMV0tdFswXSxyPW8uaW50ZXJ2YWw9WGwoYS9lLCEwKTtudWxsIT1pJiZyPGkmJihyPW8uaW50ZXJ2YWw9aSksbnVsbCE9biYmbjxyJiYocj1vLmludGVydmFsPW4pO3ZhciBzPW8uaW50ZXJ2YWxQcmVjaXNpb249eHAocik7cmV0dXJuIHdwKG8ubmljZVRpY2tFeHRlbnQ9W3lwKE1hdGguY2VpbCh0WzBdL3IpKnIscykseXAoTWF0aC5mbG9vcih0WzFdL3IpKnIscyldLHQpLG99KG4sdCxlLGkpO3RoaXMuX2ludGVydmFsUHJlY2lzaW9uPWEuaW50ZXJ2YWxQcmVjaXNpb24sdGhpcy5faW50ZXJ2YWw9YS5pbnRlcnZhbCx0aGlzLl9uaWNlRXh0ZW50PWEubmljZVRpY2tFeHRlbnR9fSxuaWNlRXh0ZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDtpZihlWzBdPT09ZVsxXSlpZigwIT09ZVswXSl7dmFyIGk9ZVswXTt0LmZpeE1heHx8KGVbMV0rPWkvMiksZVswXS09aS8yfWVsc2UgZVsxXT0xO3ZhciBuPWVbMV0tZVswXTtpc0Zpbml0ZShuKXx8KGVbMF09MCxlWzFdPTEpLHRoaXMubmljZVRpY2tzKHQuc3BsaXROdW1iZXIsdC5taW5JbnRlcnZhbCx0Lm1heEludGVydmFsKTt2YXIgbz10aGlzLl9pbnRlcnZhbDt0LmZpeE1pbnx8KGVbMF09YnAoTWF0aC5mbG9vcihlWzBdL28pKm8pKSx0LmZpeE1heHx8KGVbMV09YnAoTWF0aC5jZWlsKGVbMV0vbykqbykpfX0pO1NwLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU3B9O3ZhciBNcD0iX19lY19zdGFja18iLElwPSJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5P0Zsb2F0MzJBcnJheTpBcnJheTtmdW5jdGlvbiBUcCh0KXtyZXR1cm4gdC5nZXQoInN0YWNrIil8fE1wK3Quc2VyaWVzSW5kZXh9ZnVuY3Rpb24gQXAodCl7cmV0dXJuIHQuZGltK3QuaW5kZXh9ZnVuY3Rpb24gRHAodCxlKXt2YXIgaT1bXTtyZXR1cm4gZS5lYWNoU2VyaWVzQnlUeXBlKHQsZnVuY3Rpb24odCl7T3AodCkmJiFFcCh0KSYmaS5wdXNoKHQpfSksaX1mdW5jdGlvbiBDcCh0KXt2YXIgZz1mdW5jdGlvbih0KXt2YXIgbD17fTtFKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtLmdldEJhc2VBeGlzKCk7aWYoInRpbWUiPT09ZS50eXBlfHwidmFsdWUiPT09ZS50eXBlKWZvcih2YXIgaT10LmdldERhdGEoKSxuPWUuZGltKyJfIitlLmluZGV4LG89aS5tYXBEaW1lbnNpb24oZS5kaW0pLGE9MCxyPWkuY291bnQoKTthPHI7KythKXt2YXIgcz1pLmdldChvLGEpO2xbbl0/bFtuXS5wdXNoKHMpOmxbbl09W3NdfX0pO3ZhciBlPVtdO2Zvcih2YXIgaSBpbiBsKWlmKGwuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBuPWxbaV07aWYobil7bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pO2Zvcih2YXIgbz1udWxsLGE9MTthPG4ubGVuZ3RoOysrYSl7dmFyIHI9blthXS1uW2EtMV07MDxyJiYobz1udWxsPT09bz9yOk1hdGgubWluKG8scikpfWVbaV09b319cmV0dXJuIGV9KHQpLG09W107cmV0dXJuIEUodCxmdW5jdGlvbih0KXt2YXIgZSxpPXQuY29vcmRpbmF0ZVN5c3RlbS5nZXRCYXNlQXhpcygpLG49aS5nZXRFeHRlbnQoKTtpZigiY2F0ZWdvcnkiPT09aS50eXBlKWU9aS5nZXRCYW5kV2lkdGgoKTtlbHNlIGlmKCJ2YWx1ZSI9PT1pLnR5cGV8fCJ0aW1lIj09PWkudHlwZSl7dmFyIG89aS5kaW0rIl8iK2kuaW5kZXgsYT1nW29dLHI9TWF0aC5hYnMoblsxXS1uWzBdKSxzPWkuc2NhbGUuZ2V0RXh0ZW50KCksbD1NYXRoLmFicyhzWzFdLXNbMF0pO2U9YT9yL2wqYTpyfWVsc2V7dmFyIHU9dC5nZXREYXRhKCk7ZT1NYXRoLmFicyhuWzFdLW5bMF0pL3UuY291bnQoKX12YXIgaD1QbCh0LmdldCgiYmFyV2lkdGgiKSxlKSxjPVBsKHQuZ2V0KCJiYXJNYXhXaWR0aCIpLGUpLGQ9UGwodC5nZXQoImJhck1pbldpZHRoIil8fDEsZSksZj10LmdldCgiYmFyR2FwIikscD10LmdldCgiYmFyQ2F0ZWdvcnlHYXAiKTttLnB1c2goe2JhbmRXaWR0aDplLGJhcldpZHRoOmgsYmFyTWF4V2lkdGg6YyxiYXJNaW5XaWR0aDpkLGJhckdhcDpmLGJhckNhdGVnb3J5R2FwOnAsYXhpc0tleTpBcChpKSxzdGFja0lkOlRwKHQpfSl9KSxMcChtKX1mdW5jdGlvbiBMcCh0KXt2YXIgZD17fTtFKHQsZnVuY3Rpb24odCxlKXt2YXIgaT10LmF4aXNLZXksbj10LmJhbmRXaWR0aCxvPWRbaV18fHtiYW5kV2lkdGg6bixyZW1haW5lZFdpZHRoOm4sYXV0b1dpZHRoQ291bnQ6MCxjYXRlZ29yeUdhcDoiMjAlIixnYXA6IjMwJSIsc3RhY2tzOnt9fSxhPW8uc3RhY2tzO2RbaV09bzt2YXIgcj10LnN0YWNrSWQ7YVtyXXx8by5hdXRvV2lkdGhDb3VudCsrLGFbcl09YVtyXXx8e3dpZHRoOjAsbWF4V2lkdGg6MH07dmFyIHM9dC5iYXJXaWR0aDtzJiYhYVtyXS53aWR0aCYmKGFbcl0ud2lkdGg9cyxzPU1hdGgubWluKG8ucmVtYWluZWRXaWR0aCxzKSxvLnJlbWFpbmVkV2lkdGgtPXMpO3ZhciBsPXQuYmFyTWF4V2lkdGg7bCYmKGFbcl0ubWF4V2lkdGg9bCk7dmFyIHU9dC5iYXJNaW5XaWR0aDt1JiYoYVtyXS5taW5XaWR0aD11KTt2YXIgaD10LmJhckdhcDtudWxsIT1oJiYoby5nYXA9aCk7dmFyIGM9dC5iYXJDYXRlZ29yeUdhcDtudWxsIT1jJiYoby5jYXRlZ29yeUdhcD1jKX0pO3ZhciBmPXt9O3JldHVybiBFKGQsZnVuY3Rpb24odCxpKXtmW2ldPXt9O3ZhciBlPXQuc3RhY2tzLG49dC5iYW5kV2lkdGgsbz1QbCh0LmNhdGVnb3J5R2FwLG4pLGE9UGwodC5nYXAsMSkscj10LnJlbWFpbmVkV2lkdGgscz10LmF1dG9XaWR0aENvdW50LGw9KHItbykvKHMrKHMtMSkqYSk7bD1NYXRoLm1heChsLDApLEUoZSxmdW5jdGlvbih0KXt2YXIgZT10Lm1heFdpZHRoLGk9dC5taW5XaWR0aDtpZih0LndpZHRoKXtuPXQud2lkdGg7ZSYmKG49TWF0aC5taW4obixlKSksaSYmKG49TWF0aC5tYXgobixpKSksdC53aWR0aD1uLHItPW4rYSpuLHMtLX1lbHNle3ZhciBuPWw7ZSYmZTxuJiYobj1NYXRoLm1pbihlLHIpKSxpJiZuPGkmJihuPWkpLG4hPT1sJiYodC53aWR0aD1uLHItPW4rYSpuLHMtLSl9fSksbD0oci1vKS8ocysocy0xKSphKSxsPU1hdGgubWF4KGwsMCk7dmFyIHUsaD0wO0UoZSxmdW5jdGlvbih0LGUpe3Qud2lkdGh8fCh0LndpZHRoPWwpLGgrPSh1PXQpLndpZHRoKigxK2EpfSksdSYmKGgtPXUud2lkdGgqYSk7dmFyIGM9LWgvMjtFKGUsZnVuY3Rpb24odCxlKXtmW2ldW2VdPWZbaV1bZV18fHtiYW5kV2lkdGg6bixvZmZzZXQ6Yyx3aWR0aDp0LndpZHRofSxjKz10LndpZHRoKigxK2EpfSl9KSxmfWZ1bmN0aW9uIGtwKHQsZSxpKXtpZih0JiZlKXt2YXIgbj10W0FwKGUpXTtyZXR1cm4gbnVsbCE9biYmbnVsbCE9aSYmKG49bltUcChpKV0pLG59fWZ1bmN0aW9uIFBwKHQsZSl7dmFyIGk9RHAodCxlKSxUPUNwKGkpLEE9e307RShpLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLGk9dC5jb29yZGluYXRlU3lzdGVtLG49aS5nZXRCYXNlQXhpcygpLG89VHAodCksYT1UW0FwKG4pXVtvXSxyPWEub2Zmc2V0LHM9YS53aWR0aCxsPWkuZ2V0T3RoZXJBeGlzKG4pLHU9dC5nZXQoImJhck1pbkhlaWdodCIpfHwwO0Fbb109QVtvXXx8W10sZS5zZXRMYXlvdXQoe2JhbmRXaWR0aDphLmJhbmRXaWR0aCxvZmZzZXQ6cixzaXplOnN9KTtmb3IodmFyIGg9ZS5tYXBEaW1lbnNpb24obC5kaW0pLGM9ZS5tYXBEaW1lbnNpb24obi5kaW0pLGQ9bHAoZSxoKSxmPWwuaXNIb3Jpem9udGFsKCkscD16cChuLGwsZCksZz0wLG09ZS5jb3VudCgpO2c8bTtnKyspe3ZhciB2PWUuZ2V0KGgsZykseT1lLmdldChjLGcpO2lmKCFpc05hTih2KSYmIWlzTmFOKHkpKXt2YXIgeCxfLHcsYixTLE09MDw9dj8icCI6Im4iLEk9cDtpZihkJiYoQVtvXVt5XXx8KEFbb11beV09e3A6cCxuOnB9KSxJPUFbb11beV1bTV0pLGYpeD1JLF89KFM9aS5kYXRhVG9Qb2ludChbdix5XSkpWzFdK3Isdz1TWzBdLXAsYj1zLE1hdGguYWJzKHcpPHUmJih3PSh3PDA/LTE6MSkqdSksZCYmKEFbb11beV1bTV0rPXcpO2Vsc2UgeD0oUz1pLmRhdGFUb1BvaW50KFt5LHZdKSlbMF0rcixfPUksdz1zLGI9U1sxXS1wLE1hdGguYWJzKGIpPHUmJihiPShiPD0wPy0xOjEpKnUpLGQmJihBW29dW3ldW01dKz1iKTtlLnNldEl0ZW1MYXlvdXQoZyx7eDp4LHk6Xyx3aWR0aDp3LGhlaWdodDpifSl9fX0sdGhpcyl9dmFyIE5wPXtzZXJpZXNUeXBlOiJiYXIiLHBsYW46ZGMoKSxyZXNldDpmdW5jdGlvbih0KXtpZihPcCh0KSYmRXAodCkpe3ZhciBlPXQuZ2V0RGF0YSgpLGg9dC5jb29yZGluYXRlU3lzdGVtLGM9aC5nZXRCYXNlQXhpcygpLGQ9aC5nZXRPdGhlckF4aXMoYyksZj1lLm1hcERpbWVuc2lvbihkLmRpbSkscD1lLm1hcERpbWVuc2lvbihjLmRpbSksZz1kLmlzSG9yaXpvbnRhbCgpLG09Zz8wOjEsdj1rcChDcChbdF0pLGMsdCkud2lkdGg7cmV0dXJuLjU8dnx8KHY9LjUpLHtwcm9ncmVzczpmdW5jdGlvbih0LGUpe3ZhciBpLG49dC5jb3VudCxvPW5ldyBJcCgyKm4pLGE9bmV3IElwKG4pLHI9W10scz1bXSxsPTAsdT0wO2Zvcig7bnVsbCE9KGk9dC5uZXh0KCkpOylzW21dPWUuZ2V0KGYsaSksc1sxLW1dPWUuZ2V0KHAsaSkscj1oLmRhdGFUb1BvaW50KHMsbnVsbCxyKSxvW2wrK109clswXSxvW2wrK109clsxXSxhW3UrK109aTtlLnNldExheW91dCh7bGFyZ2VQb2ludHM6byxsYXJnZURhdGFJbmRpY2VzOmEsYmFyV2lkdGg6dix2YWx1ZUF4aXNTdGFydDp6cChjLGQsITEpLHZhbHVlQXhpc0hvcml6b250YWw6Z30pfX19fX07ZnVuY3Rpb24gT3AodCl7cmV0dXJuIHQuY29vcmRpbmF0ZVN5c3RlbSYmImNhcnRlc2lhbjJkIj09PXQuY29vcmRpbmF0ZVN5c3RlbS50eXBlfWZ1bmN0aW9uIEVwKHQpe3JldHVybiB0LnBpcGVsaW5lQ29udGV4dCYmdC5waXBlbGluZUNvbnRleHQubGFyZ2V9ZnVuY3Rpb24genAodCxlKXtyZXR1cm4gZS50b0dsb2JhbENvb3JkKGUuZGF0YVRvQ29vcmQoImxvZyI9PT1lLnR5cGU/MTowKSl9dmFyIFJwPVNwLnByb3RvdHlwZSxCcD1NYXRoLmNlaWwsVnA9TWF0aC5mbG9vcixHcD0zNmU1LEZwPTg2NGU1LFdwPVNwLmV4dGVuZCh7dHlwZToidGltZSIsZ2V0TGFiZWw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3RlcEx2bCxpPW5ldyBEYXRlKHQpO3JldHVybiBsdShlWzBdLGksdGhpcy5nZXRTZXR0aW5nKCJ1c2VVVEMiKSl9LG5pY2VFeHRlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZXh0ZW50O2lmKGVbMF09PT1lWzFdJiYoZVswXS09RnAsZVsxXSs9RnApLGVbMV09PT0tMS8wJiZlWzBdPT09MS8wKXt2YXIgaT1uZXcgRGF0ZTtlWzFdPStuZXcgRGF0ZShpLmdldEZ1bGxZZWFyKCksaS5nZXRNb250aCgpLGkuZ2V0RGF0ZSgpKSxlWzBdPWVbMV0tRnB9dGhpcy5uaWNlVGlja3ModC5zcGxpdE51bWJlcix0Lm1pbkludGVydmFsLHQubWF4SW50ZXJ2YWwpO3ZhciBuPXRoaXMuX2ludGVydmFsO3QuZml4TWlufHwoZVswXT1ObChWcChlWzBdL24pKm4pKSx0LmZpeE1heHx8KGVbMV09TmwoQnAoZVsxXS9uKSpuKSl9LG5pY2VUaWNrczpmdW5jdGlvbih0LGUsaSl7dD10fHwxMDt2YXIgbj10aGlzLl9leHRlbnQsbz1uWzFdLW5bMF0sYT1vL3Q7bnVsbCE9ZSYmYTxlJiYoYT1lKSxudWxsIT1pJiZpPGEmJihhPWkpO3ZhciByPUhwLmxlbmd0aCxzPWZ1bmN0aW9uKHQsZSxpLG4pe2Zvcig7aTxuOyl7dmFyIG89aStuPj4+MTt0W29dWzFdPGU/aT0xK286bj1vfXJldHVybiBpfShIcCxhLDAsciksbD1IcFtNYXRoLm1pbihzLHItMSldLHU9bFsxXTsieWVhciI9PT1sWzBdJiYodSo9WGwoby91L3QsITApKTt2YXIgaD10aGlzLmdldFNldHRpbmcoInVzZVVUQyIpPzA6NjAqbmV3IERhdGUoK25bMF18fCtuWzFdKS5nZXRUaW1lem9uZU9mZnNldCgpKjFlMyxjPVtNYXRoLnJvdW5kKEJwKChuWzBdLWgpL3UpKnUraCksTWF0aC5yb3VuZChWcCgoblsxXS1oKS91KSp1K2gpXTt3cChjLG4pLHRoaXMuX3N0ZXBMdmw9bCx0aGlzLl9pbnRlcnZhbD11LHRoaXMuX25pY2VFeHRlbnQ9Y30scGFyc2U6ZnVuY3Rpb24odCl7cmV0dXJuK0hsKHQpfX0pO0UoWyJjb250YWluIiwibm9ybWFsaXplIl0sZnVuY3Rpb24oZSl7V3AucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQpe3JldHVybiBScFtlXS5jYWxsKHRoaXMsdGhpcy5wYXJzZSh0KSl9fSk7dmFyIEhwPVtbImhoOm1tOnNzIiwxZTNdLFsiaGg6bW06c3MiLDVlM10sWyJoaDptbTpzcyIsMWU0XSxbImhoOm1tOnNzIiwxNWUzXSxbImhoOm1tOnNzIiwzZTRdLFsiaGg6bW1cbk1NLWRkIiw2ZTRdLFsiaGg6bW1cbk1NLWRkIiwzZTVdLFsiaGg6bW1cbk1NLWRkIiw2ZTVdLFsiaGg6bW1cbk1NLWRkIiw5ZTVdLFsiaGg6bW1cbk1NLWRkIiwxOGU1XSxbImhoOm1tXG5NTS1kZCIsR3BdLFsiaGg6bW1cbk1NLWRkIiw3MmU1XSxbImhoOm1tXG5NTS1kZCIsNipHcF0sWyJoaDptbVxuTU0tZGQiLDQzMmU1XSxbIk1NLWRkXG55eXl5IixGcF0sWyJNTS1kZFxueXl5eSIsMipGcF0sWyJNTS1kZFxueXl5eSIsMypGcF0sWyJNTS1kZFxueXl5eSIsNCpGcF0sWyJNTS1kZFxueXl5eSIsNSpGcF0sWyJNTS1kZFxueXl5eSIsNipGcF0sWyJ3ZWVrIiw3KkZwXSxbIk1NLWRkXG55eXl5Iiw4NjRlNl0sWyJ3ZWVrIiwxNCpGcF0sWyJ3ZWVrIiwyMSpGcF0sWyJtb250aCIsMzEqRnBdLFsid2VlayIsNDIqRnBdLFsibW9udGgiLDYyKkZwXSxbIndlZWsiLDcwKkZwXSxbInF1YXJ0ZXIiLDk1KkZwXSxbIm1vbnRoIiwzMSpGcCo0XSxbIm1vbnRoIiwxMzM5MmU2XSxbImhhbGYteWVhciIsMTY0MTZlNl0sWyJtb250aCIsMzEqRnAqOF0sWyJtb250aCIsMjY3ODRlNl0sWyJ5ZWFyIiwzODAqRnBdXTtXcC5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBXcCh7dXNlVVRDOnQuZWNNb2RlbC5nZXQoInVzZVVUQyIpfSl9O3ZhciBacD1jcC5wcm90b3R5cGUsVXA9U3AucHJvdG90eXBlLFhwPXpsLFlwPU5sLGpwPU1hdGguZmxvb3IscXA9TWF0aC5jZWlsLEtwPU1hdGgucG93LCRwPU1hdGgubG9nLEpwPWNwLmV4dGVuZCh7dHlwZToibG9nIixiYXNlOjEwLCRjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe2NwLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9vcmlnaW5hbFNjYWxlPW5ldyBTcH0sZ2V0VGlja3M6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fb3JpZ2luYWxTY2FsZSxuPXRoaXMuX2V4dGVudCxvPWkuZ2V0RXh0ZW50KCk7cmV0dXJuIE4oVXAuZ2V0VGlja3MuY2FsbCh0aGlzLHQpLGZ1bmN0aW9uKHQpe3ZhciBlPU5sKEtwKHRoaXMuYmFzZSx0KSk7cmV0dXJuIGU9dD09PW5bMF0mJmkuX19maXhNaW4/UXAoZSxvWzBdKTplLGU9dD09PW5bMV0mJmkuX19maXhNYXg/UXAoZSxvWzFdKTplfSx0aGlzKX0sZ2V0TWlub3JUaWNrczpVcC5nZXRNaW5vclRpY2tzLGdldExhYmVsOlVwLmdldExhYmVsLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0PVpwLnNjYWxlLmNhbGwodGhpcyx0KSxLcCh0aGlzLmJhc2UsdCl9LHNldEV4dGVudDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuYmFzZTt0PSRwKHQpLyRwKGkpLGU9JHAoZSkvJHAoaSksVXAuc2V0RXh0ZW50LmNhbGwodGhpcyx0LGUpfSxnZXRFeHRlbnQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJhc2UsZT1acC5nZXRFeHRlbnQuY2FsbCh0aGlzKTtlWzBdPUtwKHQsZVswXSksZVsxXT1LcCh0LGVbMV0pO3ZhciBpPXRoaXMuX29yaWdpbmFsU2NhbGUsbj1pLmdldEV4dGVudCgpO3JldHVybiBpLl9fZml4TWluJiYoZVswXT1RcChlWzBdLG5bMF0pKSxpLl9fZml4TWF4JiYoZVsxXT1RcChlWzFdLG5bMV0pKSxlfSx1bmlvbkV4dGVudDpmdW5jdGlvbih0KXt0aGlzLl9vcmlnaW5hbFNjYWxlLnVuaW9uRXh0ZW50KHQpO3ZhciBlPXRoaXMuYmFzZTt0WzBdPSRwKHRbMF0pLyRwKGUpLHRbMV09JHAodFsxXSkvJHAoZSksWnAudW5pb25FeHRlbnQuY2FsbCh0aGlzLHQpfSx1bmlvbkV4dGVudEZyb21EYXRhOmZ1bmN0aW9uKHQsZSl7dGhpcy51bmlvbkV4dGVudCh0LmdldEFwcHJveGltYXRlRXh0ZW50KGUpKX0sbmljZVRpY2tzOmZ1bmN0aW9uKHQpe3Q9dHx8MTA7dmFyIGU9dGhpcy5fZXh0ZW50LGk9ZVsxXS1lWzBdO2lmKCEoaT09MS8wfHxpPD0wKSl7dmFyIG49WmwoaSk7Zm9yKHQvaSpuPD0uNSYmKG4qPTEwKTshaXNOYU4obikmJk1hdGguYWJzKG4pPDEmJjA8TWF0aC5hYnMobik7KW4qPTEwO3ZhciBvPVtObChxcChlWzBdL24pKm4pLE5sKGpwKGVbMV0vbikqbildO3RoaXMuX2ludGVydmFsPW4sdGhpcy5fbmljZUV4dGVudD1vfX0sbmljZUV4dGVudDpmdW5jdGlvbih0KXtVcC5uaWNlRXh0ZW50LmNhbGwodGhpcyx0KTt2YXIgZT10aGlzLl9vcmlnaW5hbFNjYWxlO2UuX19maXhNaW49dC5maXhNaW4sZS5fX2ZpeE1heD10LmZpeE1heH19KTtmdW5jdGlvbiBRcCh0LGUpe3JldHVybiBZcCh0LFhwKGUpKX1mdW5jdGlvbiB0Zyh0LGUpe3ZhciBpLG4sbyxhPXQudHlwZSxyPWUuZ2V0TWluKCkscz1lLmdldE1heCgpLGw9bnVsbCE9cix1PW51bGwhPXMsaD10LmdldEV4dGVudCgpOyJvcmRpbmFsIj09PWE/aT1lLmdldENhdGVnb3JpZXMoKS5sZW5ndGg6KGsobj1lLmdldCgiYm91bmRhcnlHYXAiKSl8fChuPVtufHwwLG58fDBdKSwiYm9vbGVhbiI9PXR5cGVvZiBuWzBdJiYobj1bMCwwXSksblswXT1QbChuWzBdLDEpLG5bMV09UGwoblsxXSwxKSxvPWhbMV0taFswXXx8TWF0aC5hYnMoaFswXSkpLG51bGw9PXImJihyPSJvcmRpbmFsIj09PWE/aT8wOk5hTjpoWzBdLW5bMF0qbyksbnVsbD09cyYmKHM9Im9yZGluYWwiPT09YT9pP2ktMTpOYU46aFsxXStuWzFdKm8pLCJkYXRhTWluIj09PXI/cj1oWzBdOiJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yKHttaW46aFswXSxtYXg6aFsxXX0pKSwiZGF0YU1heCI9PT1zP3M9aFsxXToiZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9cyh7bWluOmhbMF0sbWF4OmhbMV19KSksbnVsbCE9ciYmaXNGaW5pdGUocil8fChyPU5hTiksbnVsbCE9cyYmaXNGaW5pdGUocyl8fChzPU5hTiksdC5zZXRCbGFuayhGKHIpfHxGKHMpfHwib3JkaW5hbCI9PT1hJiYhdC5nZXRPcmRpbmFsTWV0YSgpLmNhdGVnb3JpZXMubGVuZ3RoKSxlLmdldE5lZWRDcm9zc1plcm8oKSYmKDA8ciYmMDxzJiYhbCYmKHI9MCkscjwwJiZzPDAmJiF1JiYocz0wKSk7dmFyIGM9ZS5lY01vZGVsO2lmKGMmJiJ0aW1lIj09PWEpe3ZhciBkLGY9RHAoImJhciIsYyk7aWYoRShmLGZ1bmN0aW9uKHQpe2R8PXQuZ2V0QmFzZUF4aXMoKT09PWUuYXhpc30pLGQpe3ZhciBwPUNwKGYpLGc9ZnVuY3Rpb24odCxlLGksbil7dmFyIG89aS5heGlzLmdldEV4dGVudCgpLGE9b1sxXS1vWzBdLHI9a3AobixpLmF4aXMpO2lmKHZvaWQgMD09PXIpcmV0dXJue21pbjp0LG1heDplfTt2YXIgcz0xLzA7RShyLGZ1bmN0aW9uKHQpe3M9TWF0aC5taW4odC5vZmZzZXQscyl9KTt2YXIgbD0tMS8wO0UocixmdW5jdGlvbih0KXtsPU1hdGgubWF4KHQub2Zmc2V0K3Qud2lkdGgsbCl9KSxzPU1hdGguYWJzKHMpLGw9TWF0aC5hYnMobCk7dmFyIHU9cytsLGg9ZS10LGM9aC8oMS0ocytsKS9hKS1oO3JldHVybnttaW46dC09cy91KmMsbWF4OmUrPWwvdSpjfX0ocixzLGUscCk7cj1nLm1pbixzPWcubWF4fX1yZXR1cm5bcixzXX1mdW5jdGlvbiBlZyh0LGUpe3ZhciBpPXRnKHQsZSksbj1udWxsIT1lLmdldE1pbigpLG89bnVsbCE9ZS5nZXRNYXgoKSxhPWUuZ2V0KCJzcGxpdE51bWJlciIpOyJsb2ciPT09dC50eXBlJiYodC5iYXNlPWUuZ2V0KCJsb2dCYXNlIikpO3ZhciByPXQudHlwZTt0LnNldEV4dGVudChpWzBdLGlbMV0pLHQubmljZUV4dGVudCh7c3BsaXROdW1iZXI6YSxmaXhNaW46bixmaXhNYXg6byxtaW5JbnRlcnZhbDoiaW50ZXJ2YWwiPT09cnx8InRpbWUiPT09cj9lLmdldCgibWluSW50ZXJ2YWwiKTpudWxsLG1heEludGVydmFsOiJpbnRlcnZhbCI9PT1yfHwidGltZSI9PT1yP2UuZ2V0KCJtYXhJbnRlcnZhbCIpOm51bGx9KTt2YXIgcz1lLmdldCgiaW50ZXJ2YWwiKTtudWxsIT1zJiZ0LnNldEludGVydmFsJiZ0LnNldEludGVydmFsKHMpfWZ1bmN0aW9uIGlnKHQsZSl7aWYoZT1lfHx0LmdldCgidHlwZSIpKXN3aXRjaChlKXtjYXNlImNhdGVnb3J5IjpyZXR1cm4gbmV3IHZwKHQuZ2V0T3JkaW5hbE1ldGE/dC5nZXRPcmRpbmFsTWV0YSgpOnQuZ2V0Q2F0ZWdvcmllcygpLFsxLzAsLTEvMF0pO2Nhc2UidmFsdWUiOnJldHVybiBuZXcgU3A7ZGVmYXVsdDpyZXR1cm4oY3AuZ2V0Q2xhc3MoZSl8fFNwKS5jcmVhdGUodCl9fWZ1bmN0aW9uIG5nKGkpe3ZhciBlLG49aS5nZXRMYWJlbE1vZGVsKCkuZ2V0KCJmb3JtYXR0ZXIiKSxvPSJjYXRlZ29yeSI9PT1pLnR5cGU/aS5zY2FsZS5nZXRFeHRlbnQoKVswXTpudWxsO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8oZT1uLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQ9aS5zY2FsZS5nZXRMYWJlbCh0KSxlLnJlcGxhY2UoInt2YWx1ZX0iLG51bGwhPXQ/dDoiIil9KToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT1vJiYoZT10LW8pLG4ob2coaSx0KSxlKX06ZnVuY3Rpb24odCl7cmV0dXJuIGkuc2NhbGUuZ2V0TGFiZWwodCl9fWZ1bmN0aW9uIG9nKHQsZSl7cmV0dXJuImNhdGVnb3J5Ij09PXQudHlwZT90LnNjYWxlLmdldExhYmVsKGUpOmV9ZnVuY3Rpb24gYWcodCl7dmFyIGU9dC5nZXQoImludGVydmFsIik7cmV0dXJuIG51bGw9PWU/ImF1dG8iOmV9ZnVuY3Rpb24gcmcodCl7cmV0dXJuImNhdGVnb3J5Ij09PXQudHlwZSYmMD09PWFnKHQuZ2V0TGFiZWxNb2RlbCgpKX1FKFsiY29udGFpbiIsIm5vcm1hbGl6ZSJdLGZ1bmN0aW9uKGUpe0pwLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0KXtyZXR1cm4gdD0kcCh0KS8kcCh0aGlzLmJhc2UpLFpwW2VdLmNhbGwodGhpcyx0KX19KSxKcC5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpwfTt2YXIgc2c9e2dldE1pbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbixpPXR8fG51bGw9PWUucmFuZ2VTdGFydD9lLm1pbjplLnJhbmdlU3RhcnQ7cmV0dXJuIHRoaXMuYXhpcyYmbnVsbCE9aSYmImRhdGFNaW4iIT09aSYmImZ1bmN0aW9uIiE9dHlwZW9mIGkmJiFGKGkpJiYoaT10aGlzLmF4aXMuc2NhbGUucGFyc2UoaSkpLGl9LGdldE1heDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbixpPXR8fG51bGw9PWUucmFuZ2VFbmQ/ZS5tYXg6ZS5yYW5nZUVuZDtyZXR1cm4gdGhpcy5heGlzJiZudWxsIT1pJiYiZGF0YU1heCIhPT1pJiYiZnVuY3Rpb24iIT10eXBlb2YgaSYmIUYoaSkmJihpPXRoaXMuYXhpcy5zY2FsZS5wYXJzZShpKSksaX0sZ2V0TmVlZENyb3NzWmVybzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uO3JldHVybiBudWxsPT10LnJhbmdlU3RhcnQmJm51bGw9PXQucmFuZ2VFbmQmJiF0LnNjYWxlfSxnZXRDb29yZFN5c01vZGVsOmV0LHNldFJhbmdlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vcHRpb24ucmFuZ2VTdGFydD10LHRoaXMub3B0aW9uLnJhbmdlRW5kPWV9LHJlc2V0UmFuZ2U6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbi5yYW5nZVN0YXJ0PXRoaXMub3B0aW9uLnJhbmdlRW5kPW51bGx9fSxsZz1Jcyh7dHlwZToidHJpYW5nbGUiLHNoYXBlOntjeDowLGN5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5jeCxuPWUuY3ksbz1lLndpZHRoLzIsYT1lLmhlaWdodC8yO3QubW92ZVRvKGksbi1hKSx0LmxpbmVUbyhpK28sbithKSx0LmxpbmVUbyhpLW8sbithKSx0LmNsb3NlUGF0aCgpfX0pLHVnPUlzKHt0eXBlOiJkaWFtb25kIixzaGFwZTp7Y3g6MCxjeTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuY3gsbj1lLmN5LG89ZS53aWR0aC8yLGE9ZS5oZWlnaHQvMjt0Lm1vdmVUbyhpLG4tYSksdC5saW5lVG8oaStvLG4pLHQubGluZVRvKGksbithKSx0LmxpbmVUbyhpLW8sbiksdC5jbG9zZVBhdGgoKX19KSxoZz1Jcyh7dHlwZToicGluIixzaGFwZTp7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLngsbj1lLnksbz1lLndpZHRoLzUqMyxhPU1hdGgubWF4KG8sZS5oZWlnaHQpLHI9by8yLHM9cipyLyhhLXIpLGw9bi1hK3Ircyx1PU1hdGguYXNpbihzL3IpLGg9TWF0aC5jb3ModSkqcixjPU1hdGguc2luKHUpLGQ9TWF0aC5jb3ModSksZj0uNipyLHA9Ljcqcjt0Lm1vdmVUbyhpLWgsbCtzKSx0LmFyYyhpLGwscixNYXRoLlBJLXUsMipNYXRoLlBJK3UpLHQuYmV6aWVyQ3VydmVUbyhpK2gtYypmLGwrcytkKmYsaSxuLXAsaSxuKSx0LmJlemllckN1cnZlVG8oaSxuLXAsaS1oK2MqZixsK3MrZCpmLGktaCxsK3MpLHQuY2xvc2VQYXRoKCl9fSksY2c9SXMoe3R5cGU6ImFycm93IixzaGFwZTp7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmhlaWdodCxuPWUud2lkdGgsbz1lLngsYT1lLnkscj1uLzMqMjt0Lm1vdmVUbyhvLGEpLHQubGluZVRvKG8rcixhK2kpLHQubGluZVRvKG8sYStpLzQqMyksdC5saW5lVG8oby1yLGEraSksdC5saW5lVG8obyxhKSx0LmNsb3NlUGF0aCgpfX0pLGRnPXtsaW5lOmZ1bmN0aW9uKHQsZSxpLG4sbyl7by54MT10LG8ueTE9ZStuLzIsby54Mj10K2ksby55Mj1lK24vMn0scmVjdDpmdW5jdGlvbih0LGUsaSxuLG8pe28ueD10LG8ueT1lLG8ud2lkdGg9aSxvLmhlaWdodD1ufSxyb3VuZFJlY3Q6ZnVuY3Rpb24odCxlLGksbixvKXtvLng9dCxvLnk9ZSxvLndpZHRoPWksby5oZWlnaHQ9bixvLnI9TWF0aC5taW4oaSxuKS80fSxzcXVhcmU6ZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1NYXRoLm1pbihpLG4pO28ueD10LG8ueT1lLG8ud2lkdGg9YSxvLmhlaWdodD1hfSxjaXJjbGU6ZnVuY3Rpb24odCxlLGksbixvKXtvLmN4PXQraS8yLG8uY3k9ZStuLzIsby5yPU1hdGgubWluKGksbikvMn0sZGlhbW9uZDpmdW5jdGlvbih0LGUsaSxuLG8pe28uY3g9dCtpLzIsby5jeT1lK24vMixvLndpZHRoPWksby5oZWlnaHQ9bn0scGluOmZ1bmN0aW9uKHQsZSxpLG4sbyl7by54PXQraS8yLG8ueT1lK24vMixvLndpZHRoPWksby5oZWlnaHQ9bn0sYXJyb3c6ZnVuY3Rpb24odCxlLGksbixvKXtvLng9dCtpLzIsby55PWUrbi8yLG8ud2lkdGg9aSxvLmhlaWdodD1ufSx0cmlhbmdsZTpmdW5jdGlvbih0LGUsaSxuLG8pe28uY3g9dCtpLzIsby5jeT1lK24vMixvLndpZHRoPWksby5oZWlnaHQ9bn19LGZnPXt9O0Uoe2xpbmU6b3MscmVjdDppcyxyb3VuZFJlY3Q6aXMsc3F1YXJlOmlzLGNpcmNsZTpIcixkaWFtb25kOnVnLHBpbjpoZyxhcnJvdzpjZyx0cmlhbmdsZTpsZ30sZnVuY3Rpb24odCxlKXtmZ1tlXT1uZXcgdH0pO3ZhciBwZz1Jcyh7dHlwZToic3ltYm9sIixzaGFwZTp7c3ltYm9sVHlwZToiIix4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9LGNhbGN1bGF0ZVRleHRQb3NpdGlvbjpmdW5jdGlvbih0LGUsaSl7dmFyIG49cG4odCxlLGkpLG89dGhpcy5zaGFwZTtyZXR1cm4gbyYmInBpbiI9PT1vLnN5bWJvbFR5cGUmJiJpbnNpZGUiPT09ZS50ZXh0UG9zaXRpb24mJihuLnk9aS55Ky40KmkuaGVpZ2h0KSxufSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWUuc3ltYm9sVHlwZTtpZigibm9uZSIhPT1uKXt2YXIgbz1mZ1tuXTtvPW98fGZnW249InJlY3QiXSxkZ1tuXShlLngsZS55LGUud2lkdGgsZS5oZWlnaHQsby5zaGFwZSksby5idWlsZFBhdGgodCxvLnNoYXBlLGkpfX19KTtmdW5jdGlvbiBnZyh0LGUpe2lmKCJpbWFnZSIhPT10aGlzLnR5cGUpe3ZhciBpPXRoaXMuc3R5bGUsbj10aGlzLnNoYXBlO24mJiJsaW5lIj09PW4uc3ltYm9sVHlwZT9pLnN0cm9rZT10OnRoaXMuX19pc0VtcHR5QnJ1c2g/KGkuc3Ryb2tlPXQsaS5maWxsPWV8fCIjZmZmIik6KGkuZmlsbCYmKGkuZmlsbD10KSxpLnN0cm9rZSYmKGkuc3Ryb2tlPXQpKSx0aGlzLmRpcnR5KCExKX19ZnVuY3Rpb24gbWcodCxlLGksbixvLGEscil7dmFyIHMsbD0wPT09dC5pbmRleE9mKCJlbXB0eSIpO3JldHVybiBsJiYodD10LnN1YnN0cig1LDEpLnRvTG93ZXJDYXNlKCkrdC5zdWJzdHIoNikpLChzPTA9PT10LmluZGV4T2YoImltYWdlOi8vIik/Q3ModC5zbGljZSg4KSxuZXcgTWkoZSxpLG4sbykscj8iY2VudGVyIjoiY292ZXIiKTowPT09dC5pbmRleE9mKCJwYXRoOi8vIik/RHModC5zbGljZSg3KSx7fSxuZXcgTWkoZSxpLG4sbykscj8iY2VudGVyIjoiY292ZXIiKTpuZXcgcGcoe3NoYXBlOntzeW1ib2xUeXBlOnQseDplLHk6aSx3aWR0aDpuLGhlaWdodDpvfX0pKS5fX2lzRW1wdHlCcnVzaD1sLHMuc2V0Q29sb3I9Z2cscy5zZXRDb2xvcihhKSxzfXZhciB2Zz17aXNEaW1lbnNpb25TdGFja2VkOmxwLGVuYWJsZURhdGFTdGFjazpzcCxnZXRTdGFja2VkRGltZW5zaW9uOnVwfTt2YXIgeWc9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe2NyZWF0ZUxpc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIGhwKHQuZ2V0U291cmNlKCksdCl9LGdldExheW91dFJlY3Q6dnUsZGF0YVN0YWNrOnZnLGNyZWF0ZVNjYWxlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZTtJbC5pc0luc3RhbmNlKGUpfHxiKGk9bmV3IElsKGUpLHNnKTt2YXIgbj1pZyhpKTtyZXR1cm4gbi5zZXRFeHRlbnQodFswXSx0WzFdKSxlZyhuLGkpLG59LG1peGluQXhpc01vZGVsQ29tbW9uTWV0aG9kczpmdW5jdGlvbih0KXtiKHQsc2cpfSxjb21wbGV0ZURpbWVuc2lvbnM6ZXAsY3JlYXRlRGltZW5zaW9uczpucCxjcmVhdGVTeW1ib2w6bWd9KSx4Zz0xZS04O2Z1bmN0aW9uIF9nKHQsZSl7cmV0dXJuIE1hdGguYWJzKHQtZSk8eGd9ZnVuY3Rpb24gd2codCxlLGkpe3ZhciBuPTAsbz10WzBdO2lmKCFvKXJldHVybiExO2Zvcih2YXIgYT0xO2E8dC5sZW5ndGg7YSsrKXt2YXIgcj10W2FdO24rPWhyKG9bMF0sb1sxXSxyWzBdLHJbMV0sZSxpKSxvPXJ9dmFyIHM9dFswXTtyZXR1cm4gX2cob1swXSxzWzBdKSYmX2cob1sxXSxzWzFdKXx8KG4rPWhyKG9bMF0sb1sxXSxzWzBdLHNbMV0sZSxpKSksMCE9PW59ZnVuY3Rpb24gYmcodCxlLGkpe2lmKHRoaXMubmFtZT10LHRoaXMuZ2VvbWV0cmllcz1lLGkpaT1baVswXSxpWzFdXTtlbHNle3ZhciBuPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCk7aT1bbi54K24ud2lkdGgvMixuLnkrbi5oZWlnaHQvMl19dGhpcy5jZW50ZXI9aX1mdW5jdGlvbiBTZyh0LGUsaSl7Zm9yKHZhciBuPVtdLG89ZVswXSxhPWVbMV0scj0wO3I8dC5sZW5ndGg7cis9Mil7dmFyIHM9dC5jaGFyQ29kZUF0KHIpLTY0LGw9dC5jaGFyQ29kZUF0KHIrMSktNjQ7cz1zPj4xXi0oMSZzKSxsPWw+PjFeLSgxJmwpLG89cys9byxhPWwrPWEsbi5wdXNoKFtzL2ksbC9pXSl9cmV0dXJuIG59YmcucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpiZyxwcm9wZXJ0aWVzOm51bGwsZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVjdDtpZih0KXJldHVybiB0O2Zvcih2YXIgZT1OdW1iZXIuTUFYX1ZBTFVFLGk9W2UsZV0sbj1bLWUsLWVdLG89W10sYT1bXSxyPXRoaXMuZ2VvbWV0cmllcyxzPTA7czxyLmxlbmd0aDtzKyspe2lmKCJwb2x5Z29uIj09PXJbc10udHlwZSlCYShyW3NdLmV4dGVyaW9yLG8sYSksU3QoaSxpLG8pLE10KG4sbixhKX1yZXR1cm4gMD09PXMmJihpWzBdPWlbMV09blswXT1uWzFdPTApLHRoaXMuX3JlY3Q9bmV3IE1pKGlbMF0saVsxXSxuWzBdLWlbMF0sblsxXS1pWzFdKX0sY29udGFpbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEJvdW5kaW5nUmVjdCgpLGk9dGhpcy5nZW9tZXRyaWVzO2lmKCFlLmNvbnRhaW4odFswXSx0WzFdKSlyZXR1cm4hMTt0OmZvcih2YXIgbj0wLG89aS5sZW5ndGg7bjxvO24rKylpZigicG9seWdvbiI9PT1pW25dLnR5cGUpe3ZhciBhPWlbbl0uZXh0ZXJpb3Iscj1pW25dLmludGVyaW9ycztpZih3ZyhhLHRbMF0sdFsxXSkpe2Zvcih2YXIgcz0wO3M8KHI/ci5sZW5ndGg6MCk7cysrKWlmKHdnKHJbc10pKWNvbnRpbnVlIHQ7cmV0dXJuITB9fXJldHVybiExfSx0cmFuc2Zvcm1UbzpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10aGlzLmdldEJvdW5kaW5nUmVjdCgpLGE9by53aWR0aC9vLmhlaWdodDtpP249bnx8aS9hOmk9YSpuO2Zvcih2YXIgcj1uZXcgTWkodCxlLGksbikscz1vLmNhbGN1bGF0ZVRyYW5zZm9ybShyKSxsPXRoaXMuZ2VvbWV0cmllcyx1PTA7dTxsLmxlbmd0aDt1KyspaWYoInBvbHlnb24iPT09bFt1XS50eXBlKXtmb3IodmFyIGg9bFt1XS5leHRlcmlvcixjPWxbdV0uaW50ZXJpb3JzLGQ9MDtkPGgubGVuZ3RoO2QrKylidChoW2RdLGhbZF0scyk7Zm9yKHZhciBmPTA7ZjwoYz9jLmxlbmd0aDowKTtmKyspZm9yKGQ9MDtkPGNbZl0ubGVuZ3RoO2QrKylidChjW2ZdW2RdLGNbZl1bZF0scyl9KG89dGhpcy5fcmVjdCkuY29weShyKSx0aGlzLmNlbnRlcj1bby54K28ud2lkdGgvMixvLnkrby5oZWlnaHQvMl19LGNsb25lU2hhbGxvdzpmdW5jdGlvbih0KXtudWxsPT10JiYodD10aGlzLm5hbWUpO3ZhciBlPW5ldyBiZyh0LHRoaXMuZ2VvbWV0cmllcyx0aGlzLmNlbnRlcik7cmV0dXJuIGUuX3JlY3Q9dGhpcy5fcmVjdCxlLnRyYW5zZm9ybVRvPW51bGwsZX19O2Z1bmN0aW9uIE1nKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZighdC5VVEY4RW5jb2RpbmcpcmV0dXJuO3ZhciBlPXQuVVRGOFNjYWxlO251bGw9PWUmJihlPTEwMjQpO2Zvcih2YXIgaT10LmZlYXR1cmVzLG49MDtuPGkubGVuZ3RoO24rKylmb3IodmFyIG89aVtuXS5nZW9tZXRyeSxhPW8uY29vcmRpbmF0ZXMscj1vLmVuY29kZU9mZnNldHMscz0wO3M8YS5sZW5ndGg7cysrKXt2YXIgbD1hW3NdO2lmKCJQb2x5Z29uIj09PW8udHlwZSlhW3NdPVNnKGwscltzXSxlKTtlbHNlIGlmKCJNdWx0aVBvbHlnb24iPT09by50eXBlKWZvcih2YXIgdT0wO3U8bC5sZW5ndGg7dSsrKXt2YXIgaD1sW3VdO2xbdV09U2coaCxyW3NdW3VdLGUpfX10LlVURjhFbmNvZGluZz0hMX0odCksTihNKHQuZmVhdHVyZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2VvbWV0cnkmJnQucHJvcGVydGllcyYmMDx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aH0pLGZ1bmN0aW9uKHQpe3ZhciBlPXQucHJvcGVydGllcyxpPXQuZ2VvbWV0cnksbj1pLmNvb3JkaW5hdGVzLG89W107IlBvbHlnb24iPT09aS50eXBlJiZvLnB1c2goe3R5cGU6InBvbHlnb24iLGV4dGVyaW9yOm5bMF0saW50ZXJpb3JzOm4uc2xpY2UoMSl9KSwiTXVsdGlQb2x5Z29uIj09PWkudHlwZSYmRShuLGZ1bmN0aW9uKHQpe3RbMF0mJm8ucHVzaCh7dHlwZToicG9seWdvbiIsZXh0ZXJpb3I6dFswXSxpbnRlcmlvcnM6dC5zbGljZSgxKX0pfSk7dmFyIGE9bmV3IGJnKGUubmFtZSxvLGUuY3ApO3JldHVybiBhLnByb3BlcnRpZXM9ZSxhfSl9dmFyIElnPVpvKCk7ZnVuY3Rpb24gVGcodCl7cmV0dXJuImNhdGVnb3J5Ij09PXQudHlwZT9mdW5jdGlvbih0KXt2YXIgZT10LmdldExhYmVsTW9kZWwoKSxpPURnKHQsZSk7cmV0dXJuIWUuZ2V0KCJzaG93Iil8fHQuc2NhbGUuaXNCbGFuaygpP3tsYWJlbHM6W10sbGFiZWxDYXRlZ29yeUludGVydmFsOmkubGFiZWxDYXRlZ29yeUludGVydmFsfTppfSh0KTpmdW5jdGlvbihpKXt2YXIgdD1pLnNjYWxlLmdldFRpY2tzKCksbj1uZyhpKTtyZXR1cm57bGFiZWxzOk4odCxmdW5jdGlvbih0LGUpe3JldHVybntmb3JtYXR0ZWRMYWJlbDpuKHQsZSkscmF3TGFiZWw6aS5zY2FsZS5nZXRMYWJlbCh0KSx0aWNrVmFsdWU6dH19KX19KHQpfWZ1bmN0aW9uIEFnKHQsZSl7cmV0dXJuImNhdGVnb3J5Ij09PXQudHlwZT9mdW5jdGlvbih0LGUpe3ZhciBpLG4sbz1DZyh0LCJ0aWNrcyIpLGE9YWcoZSkscj1MZyhvLGEpO2lmKHIpcmV0dXJuIHI7ZS5nZXQoInNob3ciKSYmIXQuc2NhbGUuaXNCbGFuaygpfHwoaT1bXSk7aWYoTyhhKSlpPU5nKHQsYSwhMCk7ZWxzZSBpZigiYXV0byI9PT1hKXt2YXIgcz1EZyh0LHQuZ2V0TGFiZWxNb2RlbCgpKTtuPXMubGFiZWxDYXRlZ29yeUludGVydmFsLGk9TihzLmxhYmVscyxmdW5jdGlvbih0KXtyZXR1cm4gdC50aWNrVmFsdWV9KX1lbHNlIGk9UGcodCxuPWEsITApO3JldHVybiBrZyhvLGEse3RpY2tzOmksdGlja0NhdGVnb3J5SW50ZXJ2YWw6bn0pfSh0LGUpOnt0aWNrczp0LnNjYWxlLmdldFRpY2tzKCl9fWZ1bmN0aW9uIERnKHQsZSl7dmFyIGksbj1DZyh0LCJsYWJlbHMiKSxvPWFnKGUpLGE9TGcobixvKTtyZXR1cm4gYXx8a2cobixvLHtsYWJlbHM6TyhvKT9OZyh0LG8pOlBnKHQsaT0iYXV0byI9PT1vP2Z1bmN0aW9uKHQpe3ZhciBlPUlnKHQpLmF1dG9JbnRlcnZhbDtyZXR1cm4gbnVsbCE9ZT9lOklnKHQpLmF1dG9JbnRlcnZhbD10LmNhbGN1bGF0ZUNhdGVnb3J5SW50ZXJ2YWwoKX0odCk6byksbGFiZWxDYXRlZ29yeUludGVydmFsOml9KX1mdW5jdGlvbiBDZyh0LGUpe3JldHVybiBJZyh0KVtlXXx8KElnKHQpW2VdPVtdKX1mdW5jdGlvbiBMZyh0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHRbaV0ua2V5PT09ZSlyZXR1cm4gdFtpXS52YWx1ZX1mdW5jdGlvbiBrZyh0LGUsaSl7cmV0dXJuIHQucHVzaCh7a2V5OmUsdmFsdWU6aX0pLGl9ZnVuY3Rpb24gUGcodCxlLGkpe3ZhciBuPW5nKHQpLG89dC5zY2FsZSxhPW8uZ2V0RXh0ZW50KCkscj10LmdldExhYmVsTW9kZWwoKSxzPVtdLGw9TWF0aC5tYXgoKGV8fDApKzEsMSksdT1hWzBdLGg9by5jb3VudCgpOzAhPT11JiYxPGwmJjI8aC9sJiYodT1NYXRoLnJvdW5kKE1hdGguY2VpbCh1L2wpKmwpKTt2YXIgYz1yZyh0KSxkPXIuZ2V0KCJzaG93TWluTGFiZWwiKXx8YyxmPXIuZ2V0KCJzaG93TWF4TGFiZWwiKXx8YztkJiZ1IT09YVswXSYmZyhhWzBdKTtmb3IodmFyIHA9dTtwPD1hWzFdO3ArPWwpZyhwKTtmdW5jdGlvbiBnKHQpe3MucHVzaChpP3Q6e2Zvcm1hdHRlZExhYmVsOm4odCkscmF3TGFiZWw6by5nZXRMYWJlbCh0KSx0aWNrVmFsdWU6dH0pfXJldHVybiBmJiZwLWwhPT1hWzFdJiZnKGFbMV0pLHN9ZnVuY3Rpb24gTmcodCxpLG4pe3ZhciBvPXQuc2NhbGUsYT1uZyh0KSxyPVtdO3JldHVybiBFKG8uZ2V0VGlja3MoKSxmdW5jdGlvbih0KXt2YXIgZT1vLmdldExhYmVsKHQpO2kodCxlKSYmci5wdXNoKG4/dDp7Zm9ybWF0dGVkTGFiZWw6YSh0KSxyYXdMYWJlbDplLHRpY2tWYWx1ZTp0fSl9KSxyfXZhciBPZz1bMCwxXSxFZz1mdW5jdGlvbih0LGUsaSl7dGhpcy5kaW09dCx0aGlzLnNjYWxlPWUsdGhpcy5fZXh0ZW50PWl8fFswLDBdLHRoaXMuaW52ZXJzZT0hMSx0aGlzLm9uQmFuZD0hMX07ZnVuY3Rpb24gemcodCxlKXt2YXIgaT0odFsxXS10WzBdKS9lLzI7dFswXSs9aSx0WzFdLT1pfUVnLnByb3RvdHlwZT17Y29uc3RydWN0b3I6RWcsY29udGFpbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQsaT1NYXRoLm1pbihlWzBdLGVbMV0pLG49TWF0aC5tYXgoZVswXSxlWzFdKTtyZXR1cm4gaTw9dCYmdDw9bn0sY29udGFpbkRhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2NhbGUuY29udGFpbih0KX0sZ2V0RXh0ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V4dGVudC5zbGljZSgpfSxnZXRQaXhlbFByZWNpc2lvbjpmdW5jdGlvbih0KXtyZXR1cm4gUmwodHx8dGhpcy5zY2FsZS5nZXRFeHRlbnQoKSx0aGlzLl9leHRlbnQpfSxzZXRFeHRlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9leHRlbnQ7aVswXT10LGlbMV09ZX0sZGF0YVRvQ29vcmQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9leHRlbnQsbj10aGlzLnNjYWxlO3JldHVybiB0PW4ubm9ybWFsaXplKHQpLHRoaXMub25CYW5kJiYib3JkaW5hbCI9PT1uLnR5cGUmJnpnKGk9aS5zbGljZSgpLG4uY291bnQoKSksa2wodCxPZyxpLGUpfSxjb29yZFRvRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V4dGVudCxuPXRoaXMuc2NhbGU7dGhpcy5vbkJhbmQmJiJvcmRpbmFsIj09PW4udHlwZSYmemcoaT1pLnNsaWNlKCksbi5jb3VudCgpKTt2YXIgbz1rbCh0LGksT2csZSk7cmV0dXJuIHRoaXMuc2NhbGUuc2NhbGUobyl9LHBvaW50VG9EYXRhOmZ1bmN0aW9uKHQsZSl7fSxnZXRUaWNrc0Nvb3JkczpmdW5jdGlvbih0KXt2YXIgZT0odD10fHx7fSkudGlja01vZGVsfHx0aGlzLmdldFRpY2tNb2RlbCgpLGk9TihBZyh0aGlzLGUpLnRpY2tzLGZ1bmN0aW9uKHQpe3JldHVybntjb29yZDp0aGlzLmRhdGFUb0Nvb3JkKHQpLHRpY2tWYWx1ZTp0fX0sdGhpcyk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPWUubGVuZ3RoO2lmKCF0Lm9uQmFuZHx8aXx8IW8pcmV0dXJuO3ZhciBhLHIscz10LmdldEV4dGVudCgpO2lmKDE9PT1vKWVbMF0uY29vcmQ9c1swXSxhPWVbMV09e2Nvb3JkOnNbMF19O2Vsc2V7dmFyIGw9ZVtvLTFdLnRpY2tWYWx1ZS1lWzBdLnRpY2tWYWx1ZSx1PShlW28tMV0uY29vcmQtZVswXS5jb29yZCkvbDtFKGUsZnVuY3Rpb24odCl7dC5jb29yZC09dS8yfSk7dmFyIGg9dC5zY2FsZS5nZXRFeHRlbnQoKTtyPTEraFsxXS1lW28tMV0udGlja1ZhbHVlLGE9e2Nvb3JkOmVbby0xXS5jb29yZCt1KnJ9LGUucHVzaChhKX12YXIgYz1zWzBdPnNbMV07ZChlWzBdLmNvb3JkLHNbMF0pJiYobj9lWzBdLmNvb3JkPXNbMF06ZS5zaGlmdCgpKTtuJiZkKHNbMF0sZVswXS5jb29yZCkmJmUudW5zaGlmdCh7Y29vcmQ6c1swXX0pO2Qoc1sxXSxhLmNvb3JkKSYmKG4/YS5jb29yZD1zWzFdOmUucG9wKCkpO24mJmQoYS5jb29yZCxzWzFdKSYmZS5wdXNoKHtjb29yZDpzWzFdfSk7ZnVuY3Rpb24gZCh0LGUpe3JldHVybiB0PU5sKHQpLGU9TmwoZSksYz9lPHQ6dDxlfX0odGhpcyxpLGUuZ2V0KCJhbGlnbldpdGhMYWJlbCIpLHQuY2xhbXApLGl9LGdldE1pbm9yVGlja3NDb29yZHM6ZnVuY3Rpb24oKXtpZigib3JkaW5hbCI9PT10aGlzLnNjYWxlLnR5cGUpcmV0dXJuW107dmFyIHQ9dGhpcy5tb2RlbC5nZXRNb2RlbCgibWlub3JUaWNrIikuZ2V0KCJzcGxpdE51bWJlciIpO3JldHVybiAwPHQmJnQ8MTAwfHwodD01KSxOKHRoaXMuc2NhbGUuZ2V0TWlub3JUaWNrcyh0KSxmdW5jdGlvbih0KXtyZXR1cm4gTih0LGZ1bmN0aW9uKHQpe3JldHVybntjb29yZDp0aGlzLmRhdGFUb0Nvb3JkKHQpLHRpY2tWYWx1ZTp0fX0sdGhpcyl9LHRoaXMpfSxnZXRWaWV3TGFiZWxzOmZ1bmN0aW9uKCl7cmV0dXJuIFRnKHRoaXMpLmxhYmVsc30sZ2V0TGFiZWxNb2RlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZGVsLmdldE1vZGVsKCJheGlzTGFiZWwiKX0sZ2V0VGlja01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0TW9kZWwoImF4aXNUaWNrIil9LGdldEJhbmRXaWR0aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2V4dGVudCxlPXRoaXMuc2NhbGUuZ2V0RXh0ZW50KCksaT1lWzFdLWVbMF0rKHRoaXMub25CYW5kPzE6MCk7MD09PWkmJihpPTEpO3ZhciBuPU1hdGguYWJzKHRbMV0tdFswXSk7cmV0dXJuIE1hdGguYWJzKG4pL2l9LGlzSG9yaXpvbnRhbDpudWxsLGdldFJvdGF0ZTpudWxsLGNhbGN1bGF0ZUNhdGVnb3J5SW50ZXJ2YWw6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRMYWJlbE1vZGVsKCk7cmV0dXJue2F4aXNSb3RhdGU6dC5nZXRSb3RhdGU/dC5nZXRSb3RhdGUoKTp0LmlzSG9yaXpvbnRhbCYmIXQuaXNIb3Jpem9udGFsKCk/OTA6MCxsYWJlbFJvdGF0ZTplLmdldCgicm90YXRlIil8fDAsZm9udDplLmdldEZvbnQoKX19KHQpLGk9bmcodCksbj0oZS5heGlzUm90YXRlLWUubGFiZWxSb3RhdGUpLzE4MCpNYXRoLlBJLG89dC5zY2FsZSxhPW8uZ2V0RXh0ZW50KCkscj1vLmNvdW50KCk7aWYoYVsxXS1hWzBdPDEpcmV0dXJuIDA7dmFyIHM9MTs0MDxyJiYocz1NYXRoLm1heCgxLE1hdGguZmxvb3Ioci80MCkpKTtmb3IodmFyIGw9YVswXSx1PXQuZGF0YVRvQ29vcmQobCsxKS10LmRhdGFUb0Nvb3JkKGwpLGg9TWF0aC5hYnModSpNYXRoLmNvcyhuKSksYz1NYXRoLmFicyh1Kk1hdGguc2luKG4pKSxkPTAsZj0wO2w8PWFbMV07bCs9cyl7dmFyIHAsZyxtPWNuKGkobCksZS5mb250LCJjZW50ZXIiLCJ0b3AiKTtwPTEuMyptLndpZHRoLGc9MS4zKm0uaGVpZ2h0LGQ9TWF0aC5tYXgoZCxwLDcpLGY9TWF0aC5tYXgoZixnLDcpfXZhciB2PWQvaCx5PWYvYztpc05hTih2KSYmKHY9MS8wKSxpc05hTih5KSYmKHk9MS8wKTt2YXIgeD1NYXRoLm1heCgwLE1hdGguZmxvb3IoTWF0aC5taW4odix5KSkpLF89SWcodC5tb2RlbCksdz10LmdldEV4dGVudCgpLGI9Xy5sYXN0QXV0b0ludGVydmFsLFM9Xy5sYXN0VGlja0NvdW50O3JldHVybiBudWxsIT1iJiZudWxsIT1TJiZNYXRoLmFicyhiLXgpPD0xJiZNYXRoLmFicyhTLXIpPD0xJiZ4PGImJl8uYXhpc0V4dGVuZDA9PT13WzBdJiZfLmF4aXNFeHRlbmQxPT09d1sxXT94PWI6KF8ubGFzdFRpY2tDb3VudD1yLF8ubGFzdEF1dG9JbnRlcnZhbD14LF8uYXhpc0V4dGVuZDA9d1swXSxfLmF4aXNFeHRlbmQxPXdbMV0pLHh9KHRoaXMpfX07dmFyIFJnPU1nLEJnPXt9O0UoWyJtYXAiLCJlYWNoIiwiZmlsdGVyIiwiaW5kZXhPZiIsImluaGVyaXRzIiwicmVkdWNlIiwiZmlsdGVyIiwiYmluZCIsImN1cnJ5IiwiaXNBcnJheSIsImlzU3RyaW5nIiwiaXNPYmplY3QiLCJpc0Z1bmN0aW9uIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJjbG9uZSIsIm1lcmdlIl0sZnVuY3Rpb24odCl7QmdbdF09aXRbdF19KTt2YXIgVmc9e307ZnVuY3Rpb24gR2codCxlKXt2YXIgaT10Lm1hcERpbWVuc2lvbigiZGVmYXVsdGVkTGFiZWwiLCEwKSxuPWkubGVuZ3RoO2lmKDE9PT1uKXJldHVybiBCaCh0LGUsaVswXSk7aWYobil7Zm9yKHZhciBvPVtdLGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIHI9QmgodCxlLGlbYV0pO28ucHVzaChyKX1yZXR1cm4gby5qb2luKCIgIil9fWZ1bmN0aW9uIEZnKHQsZSxpKXtJaS5jYWxsKHRoaXMpLHRoaXMudXBkYXRlRGF0YSh0LGUsaSl9RShbImV4dGVuZFNoYXBlIiwiZXh0ZW5kUGF0aCIsIm1ha2VQYXRoIiwibWFrZUltYWdlIiwibWVyZ2VQYXRoIiwicmVzaXplUGF0aCIsImNyZWF0ZUljb24iLCJzZXRIb3ZlclN0eWxlIiwic2V0TGFiZWxTdHlsZSIsInNldFRleHRTdHlsZSIsInNldFRleHQiLCJnZXRGb250IiwidXBkYXRlUHJvcHMiLCJpbml0UHJvcHMiLCJnZXRUcmFuc2Zvcm0iLCJjbGlwUG9pbnRzQnlSZWN0IiwiY2xpcFJlY3RCeVJlY3QiLCJyZWdpc3RlclNoYXBlIiwiZ2V0U2hhcGVDbGFzcyIsIkdyb3VwIiwiSW1hZ2UiLCJUZXh0IiwiQ2lyY2xlIiwiU2VjdG9yIiwiUmluZyIsIlBvbHlnb24iLCJQb2x5bGluZSIsIlJlY3QiLCJMaW5lIiwiQmV6aWVyQ3VydmUiLCJBcmMiLCJJbmNyZW1lbnRhbERpc3BsYXlhYmxlIiwiQ29tcG91bmRQYXRoIiwiTGluZWFyR3JhZGllbnQiLCJSYWRpYWxHcmFkaWVudCIsIkJvdW5kaW5nUmVjdCJdLGZ1bmN0aW9uKHQpe1ZnW3RdPXlsW3RdfSksaWMuZXh0ZW5kKHt0eXBlOiJzZXJpZXMubGluZSIsZGVwZW5kZW5jaWVzOlsiZ3JpZCIsInBvbGFyIl0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHAodGhpcy5nZXRTb3VyY2UoKSx0aGlzLHt1c2VFbmNvZGVEZWZhdWx0ZXI6ITB9KX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06ImNhcnRlc2lhbjJkIixsZWdlbmRIb3Zlckxpbms6ITAsaG92ZXJBbmltYXRpb246ITAsY2xpcDohMCxsYWJlbDp7cG9zaXRpb246InRvcCJ9LGxpbmVTdHlsZTp7d2lkdGg6Mix0eXBlOiJzb2xpZCJ9LHN0ZXA6ITEsc21vb3RoOiExLHNtb290aE1vbm90b25lOm51bGwsc3ltYm9sOiJlbXB0eUNpcmNsZSIsc3ltYm9sU2l6ZTo0LHN5bWJvbFJvdGF0ZTpudWxsLHNob3dTeW1ib2w6ITAsc2hvd0FsbFN5bWJvbDoiYXV0byIsY29ubmVjdE51bGxzOiExLHNhbXBsaW5nOiJub25lIixhbmltYXRpb25FYXNpbmc6ImxpbmVhciIscHJvZ3Jlc3NpdmU6MCxob3ZlckxheWVyVGhyZXNob2xkOjEvMH19KTt2YXIgV2c9RmcucHJvdG90eXBlLEhnPUZnLmdldFN5bWJvbFNpemU9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sU2l6ZSIpO3JldHVybiBpIGluc3RhbmNlb2YgQXJyYXk/aS5zbGljZSgpOlsraSwraV19O2Z1bmN0aW9uIFpnKHQpe3JldHVyblt0WzBdLzIsdFsxXS8yXX1mdW5jdGlvbiBVZyh0LGUpe3RoaXMucGFyZW50LmRyaWZ0KHQsZSl9V2cuX2NyZWF0ZVN5bWJvbD1mdW5jdGlvbih0LGUsaSxuLG8pe3RoaXMucmVtb3ZlQWxsKCk7dmFyIGE9bWcodCwtMSwtMSwyLDIsZS5nZXRJdGVtVmlzdWFsKGksImNvbG9yIiksbyk7YS5hdHRyKHt6MjoxMDAsY3VsbGluZzohMCxzY2FsZTpaZyhuKX0pLGEuZHJpZnQ9VWcsdGhpcy5fc3ltYm9sVHlwZT10LHRoaXMuYWRkKGEpfSxXZy5zdG9wU3ltYm9sQW5pbWF0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuY2hpbGRBdCgwKS5zdG9wQW5pbWF0aW9uKHQpfSxXZy5nZXRTeW1ib2xQYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRBdCgwKX0sV2cuZ2V0U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZEF0KDApLnNjYWxlfSxXZy5oaWdobGlnaHQ9ZnVuY3Rpb24oKXt0aGlzLmNoaWxkQXQoMCkudHJpZ2dlcigiZW1waGFzaXMiKX0sV2cuZG93bnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmNoaWxkQXQoMCkudHJpZ2dlcigibm9ybWFsIil9LFdnLnNldFo9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmNoaWxkQXQoMCk7aS56bGV2ZWw9dCxpLno9ZX0sV2cuc2V0RHJhZ2dhYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2hpbGRBdCgwKTtlLmRyYWdnYWJsZT10LGUuY3Vyc29yPXQ/Im1vdmUiOmUuY3Vyc29yfSxXZy51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLnNpbGVudD0hMTt2YXIgbj10LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sIil8fCJjaXJjbGUiLG89dC5ob3N0TW9kZWwsYT1IZyh0LGUpLHI9biE9PXRoaXMuX3N5bWJvbFR5cGU7aWYocil7dmFyIHM9dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbEtlZXBBc3BlY3QiKTt0aGlzLl9jcmVhdGVTeW1ib2wobix0LGUsYSxzKX1lbHNleyhsPXRoaXMuY2hpbGRBdCgwKSkuc2lsZW50PSExLHNsKGwse3NjYWxlOlpnKGEpfSxvLGUpfWlmKHRoaXMuX3VwZGF0ZUNvbW1vbih0LGUsYSxpKSxyKXt2YXIgbD10aGlzLmNoaWxkQXQoMCksdT1pJiZpLmZhZGVJbixoPXtzY2FsZTpsLnNjYWxlLnNsaWNlKCl9O3UmJihoLnN0eWxlPXtvcGFjaXR5Omwuc3R5bGUub3BhY2l0eX0pLGwuc2NhbGU9WzAsMF0sdSYmKGwuc3R5bGUub3BhY2l0eT0wKSxsbChsLGgsbyxlKX10aGlzLl9zZXJpZXNNb2RlbD1vfTt2YXIgWGc9WyJpdGVtU3R5bGUiXSxZZz1bImVtcGhhc2lzIiwiaXRlbVN0eWxlIl0samc9WyJsYWJlbCJdLHFnPVsiZW1waGFzaXMiLCJsYWJlbCJdO2Z1bmN0aW9uIEtnKHQsZSl7aWYoIXRoaXMuaW5jcmVtZW50YWwmJiF0aGlzLnVzZUhvdmVyTGF5ZXIpaWYoImVtcGhhc2lzIj09PWUpe3ZhciBpPXRoaXMuX19zeW1ib2xPcmlnaW5hbFNjYWxlLG49aVsxXS9pWzBdLG89e3NjYWxlOltNYXRoLm1heCgxLjEqaVswXSxpWzBdKzMpLE1hdGgubWF4KDEuMSppWzFdLGlbMV0rMypuKV19O3RoaXMuYW5pbWF0ZVRvKG8sNDAwLCJlbGFzdGljT3V0Iil9ZWxzZSJub3JtYWwiPT09ZSYmdGhpcy5hbmltYXRlVG8oe3NjYWxlOnRoaXMuX19zeW1ib2xPcmlnaW5hbFNjYWxlfSw0MDAsImVsYXN0aWNPdXQiKX1mdW5jdGlvbiAkZyh0KXt0aGlzLmdyb3VwPW5ldyBJaSx0aGlzLl9zeW1ib2xDdG9yPXR8fEZnfVdnLl91cGRhdGVDb21tb249ZnVuY3Rpb24oaSx0LGUsbil7dmFyIG89dGhpcy5jaGlsZEF0KDApLGE9aS5ob3N0TW9kZWwscj1pLmdldEl0ZW1WaXN1YWwodCwiY29sb3IiKTsiaW1hZ2UiIT09by50eXBlP28udXNlU3R5bGUoe3N0cm9rZU5vU2NhbGU6ITB9KTpvLnNldFN0eWxlKHtvcGFjaXR5Om51bGwsc2hhZG93Qmx1cjpudWxsLHNoYWRvd09mZnNldFg6bnVsbCxzaGFkb3dPZmZzZXRZOm51bGwsc2hhZG93Q29sb3I6bnVsbH0pO3ZhciBzPW4mJm4uaXRlbVN0eWxlLGw9biYmbi5ob3Zlckl0ZW1TdHlsZSx1PW4mJm4uc3ltYm9sUm90YXRlLGg9biYmbi5zeW1ib2xPZmZzZXQsYz1uJiZuLmxhYmVsTW9kZWwsZD1uJiZuLmhvdmVyTGFiZWxNb2RlbCxmPW4mJm4uaG92ZXJBbmltYXRpb24scD1uJiZuLmN1cnNvclN0eWxlO2lmKCFufHxpLmhhc0l0ZW1PcHRpb24pe3ZhciBnPW4mJm4uaXRlbU1vZGVsP24uaXRlbU1vZGVsOmkuZ2V0SXRlbU1vZGVsKHQpO3M9Zy5nZXRNb2RlbChYZykuZ2V0SXRlbVN0eWxlKFsiY29sb3IiXSksbD1nLmdldE1vZGVsKFlnKS5nZXRJdGVtU3R5bGUoKSx1PWcuZ2V0U2hhbGxvdygic3ltYm9sUm90YXRlIiksaD1nLmdldFNoYWxsb3coInN5bWJvbE9mZnNldCIpLGM9Zy5nZXRNb2RlbChqZyksZD1nLmdldE1vZGVsKHFnKSxmPWcuZ2V0U2hhbGxvdygiaG92ZXJBbmltYXRpb24iKSxwPWcuZ2V0U2hhbGxvdygiY3Vyc29yIil9ZWxzZSBsPUwoe30sbCk7dmFyIG09by5zdHlsZTtvLmF0dHIoInJvdGF0aW9uIiwodXx8MCkqTWF0aC5QSS8xODB8fDApLGgmJm8uYXR0cigicG9zaXRpb24iLFtQbChoWzBdLGVbMF0pLFBsKGhbMV0sZVsxXSldKSxwJiZvLmF0dHIoImN1cnNvciIscCksby5zZXRDb2xvcihyLG4mJm4uc3ltYm9sSW5uZXJDb2xvciksby5zZXRTdHlsZShzKTt2YXIgdj1pLmdldEl0ZW1WaXN1YWwodCwib3BhY2l0eSIpO251bGwhPXYmJihtLm9wYWNpdHk9dik7dmFyIHk9aS5nZXRJdGVtVmlzdWFsKHQsImxpZnRaIikseD1vLl9fejJPcmlnaW47bnVsbCE9eT9udWxsPT14JiYoby5fX3oyT3JpZ2luPW8uejIsby56Mis9eSk6bnVsbCE9eCYmKG8uejI9eCxvLl9fejJPcmlnaW49bnVsbCk7dmFyIF89biYmbi51c2VOYW1lTGFiZWw7JHMobSxsLGMsZCx7bGFiZWxGZXRjaGVyOmEsbGFiZWxEYXRhSW5kZXg6dCxkZWZhdWx0VGV4dDpmdW5jdGlvbih0LGUpe3JldHVybiBfP2kuZ2V0TmFtZSh0KTpHZyhpLHQpfSxpc1JlY3RUZXh0OiEwLGF1dG9Db2xvcjpyfSksby5fX3N5bWJvbE9yaWdpbmFsU2NhbGU9WmcoZSksby5ob3ZlclN0eWxlPWwsby5oaWdoRG93bk9uVXBkYXRlPWYmJmEuaXNBbmltYXRpb25FbmFibGVkKCk/S2c6bnVsbCxZcyhvKX0sV2cuZmFkZU91dD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuY2hpbGRBdCgwKTt0aGlzLnNpbGVudD1pLnNpbGVudD0hMCxlJiZlLmtlZXBMYWJlbHx8KGkuc3R5bGUudGV4dD1udWxsKSxzbChpLHtzdHlsZTp7b3BhY2l0eTowfSxzY2FsZTpbMCwwXX0sdGhpcy5fc2VyaWVzTW9kZWwsdGhpcy5kYXRhSW5kZXgsdCl9LHcoRmcsSWkpO3ZhciBKZz0kZy5wcm90b3R5cGU7ZnVuY3Rpb24gUWcodCxlLGksbil7cmV0dXJuIGUmJiFpc05hTihlWzBdKSYmIWlzTmFOKGVbMV0pJiYhKG4uaXNJZ25vcmUmJm4uaXNJZ25vcmUoaSkpJiYhKG4uY2xpcFNoYXBlJiYhbi5jbGlwU2hhcGUuY29udGFpbihlWzBdLGVbMV0pKSYmIm5vbmUiIT09dC5nZXRJdGVtVmlzdWFsKGksInN5bWJvbCIpfWZ1bmN0aW9uIHRtKHQpe3JldHVybiBudWxsPT10fHxSKHQpfHwodD17aXNJZ25vcmU6dH0pLHR8fHt9fWZ1bmN0aW9uIGVtKHQpe3ZhciBlPXQuaG9zdE1vZGVsO3JldHVybntpdGVtU3R5bGU6ZS5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKFsiY29sb3IiXSksaG92ZXJJdGVtU3R5bGU6ZS5nZXRNb2RlbCgiZW1waGFzaXMuaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksc3ltYm9sUm90YXRlOmUuZ2V0KCJzeW1ib2xSb3RhdGUiKSxzeW1ib2xPZmZzZXQ6ZS5nZXQoInN5bWJvbE9mZnNldCIpLGhvdmVyQW5pbWF0aW9uOmUuZ2V0KCJob3ZlckFuaW1hdGlvbiIpLGxhYmVsTW9kZWw6ZS5nZXRNb2RlbCgibGFiZWwiKSxob3ZlckxhYmVsTW9kZWw6ZS5nZXRNb2RlbCgiZW1waGFzaXMubGFiZWwiKSxjdXJzb3JTdHlsZTplLmdldCgiY3Vyc29yIil9fWZ1bmN0aW9uIGltKHQsZSxpKXt2YXIgbixvPXQuZ2V0QmFzZUF4aXMoKSxhPXQuZ2V0T3RoZXJBeGlzKG8pLHI9ZnVuY3Rpb24odCxlKXt2YXIgaT0wLG49dC5zY2FsZS5nZXRFeHRlbnQoKTsic3RhcnQiPT09ZT9pPW5bMF06ImVuZCI9PT1lP2k9blsxXTowPG5bMF0/aT1uWzBdOm5bMV08MCYmKGk9blsxXSk7cmV0dXJuIGl9KGEsaSkscz1vLmRpbSxsPWEuZGltLHU9ZS5tYXBEaW1lbnNpb24obCksaD1lLm1hcERpbWVuc2lvbihzKSxjPSJ4Ij09PWx8fCJyYWRpdXMiPT09bD8xOjAsZD1OKHQuZGltZW5zaW9ucyxmdW5jdGlvbih0KXtyZXR1cm4gZS5tYXBEaW1lbnNpb24odCl9KSxmPWUuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja1Jlc3VsdERpbWVuc2lvbiIpO3JldHVybihufD1scChlLGRbMF0pKSYmKGRbMF09ZiksKG58PWxwKGUsZFsxXSkpJiYoZFsxXT1mKSx7ZGF0YURpbXNGb3JQb2ludDpkLHZhbHVlU3RhcnQ6cix2YWx1ZUF4aXNEaW06bCxiYXNlQXhpc0RpbTpzLHN0YWNrZWQ6ISFuLHZhbHVlRGltOnUsYmFzZURpbTpoLGJhc2VEYXRhT2Zmc2V0OmMsc3RhY2tlZE92ZXJEaW1lbnNpb246ZS5nZXRDYWxjdWxhdGlvbkluZm8oInN0YWNrZWRPdmVyRGltZW5zaW9uIil9fWZ1bmN0aW9uIG5tKHQsZSxpLG4pe3ZhciBvPU5hTjt0LnN0YWNrZWQmJihvPWkuZ2V0KGkuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkT3ZlckRpbWVuc2lvbiIpLG4pKSxpc05hTihvKSYmKG89dC52YWx1ZVN0YXJ0KTt2YXIgYT10LmJhc2VEYXRhT2Zmc2V0LHI9W107cmV0dXJuIHJbYV09aS5nZXQodC5iYXNlRGltLG4pLHJbMS1hXT1vLGUuZGF0YVRvUG9pbnQocil9SmcudXBkYXRlRGF0YT1mdW5jdGlvbihvLGEpe2E9dG0oYSk7dmFyIHI9dGhpcy5ncm91cCxzPW8uaG9zdE1vZGVsLGw9dGhpcy5fZGF0YSx1PXRoaXMuX3N5bWJvbEN0b3IsaD1lbShvKTtsfHxyLnJlbW92ZUFsbCgpLG8uZGlmZihsKS5hZGQoZnVuY3Rpb24odCl7dmFyIGU9by5nZXRJdGVtTGF5b3V0KHQpO2lmKFFnKG8sZSx0LGEpKXt2YXIgaT1uZXcgdShvLHQsaCk7aS5hdHRyKCJwb3NpdGlvbiIsZSksby5zZXRJdGVtR3JhcGhpY0VsKHQsaSksci5hZGQoaSl9fSkudXBkYXRlKGZ1bmN0aW9uKHQsZSl7dmFyIGk9bC5nZXRJdGVtR3JhcGhpY0VsKGUpLG49by5nZXRJdGVtTGF5b3V0KHQpO1FnKG8sbix0LGEpPyhpPyhpLnVwZGF0ZURhdGEobyx0LGgpLHNsKGkse3Bvc2l0aW9uOm59LHMpKTooaT1uZXcgdShvLHQpKS5hdHRyKCJwb3NpdGlvbiIsbiksci5hZGQoaSksby5zZXRJdGVtR3JhcGhpY0VsKHQsaSkpOnIucmVtb3ZlKGkpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPWwuZ2V0SXRlbUdyYXBoaWNFbCh0KTtlJiZlLmZhZGVPdXQoZnVuY3Rpb24oKXtyLnJlbW92ZShlKX0pfSkuZXhlY3V0ZSgpLHRoaXMuX2RhdGE9b30sSmcuaXNQZXJzaXN0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuITB9LEpnLnVwZGF0ZUxheW91dD1mdW5jdGlvbigpe3ZhciBuPXRoaXMuX2RhdGE7biYmbi5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LGUpe3ZhciBpPW4uZ2V0SXRlbUxheW91dChlKTt0LmF0dHIoInBvc2l0aW9uIixpKX0pfSxKZy5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fc2VyaWVzU2NvcGU9ZW0odCksdGhpcy5fZGF0YT1udWxsLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LEpnLmluY3JlbWVudGFsVXBkYXRlPWZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3QuaXNHcm91cHx8KHQuaW5jcmVtZW50YWw9dC51c2VIb3ZlckxheWVyPSEwKX1pPXRtKGkpO2Zvcih2YXIgbz10LnN0YXJ0O288dC5lbmQ7bysrKXt2YXIgYT1lLmdldEl0ZW1MYXlvdXQobyk7aWYoUWcoZSxhLG8saSkpe3ZhciByPW5ldyB0aGlzLl9zeW1ib2xDdG9yKGUsbyx0aGlzLl9zZXJpZXNTY29wZSk7ci50cmF2ZXJzZShuKSxyLmF0dHIoInBvc2l0aW9uIixhKSx0aGlzLmdyb3VwLmFkZChyKSxlLnNldEl0ZW1HcmFwaGljRWwobyxyKX19fSxKZy5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncm91cCxpPXRoaXMuX2RhdGE7aSYmdD9pLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQpe3QuZmFkZU91dChmdW5jdGlvbigpe2UucmVtb3ZlKHQpfSl9KTplLnJlbW92ZUFsbCgpfTt2YXIgb209U3QsYW09TXQscm09dXQsc209YXQsbG09W10sdW09W10saG09W107ZnVuY3Rpb24gY20odCl7cmV0dXJuIGlzTmFOKHRbMF0pfHxpc05hTih0WzFdKX1mdW5jdGlvbiBkbSh0LGUsaSxuLG8sYSxyLHMsbCx1KXtyZXR1cm4ibm9uZSIhPT11JiZ1P2Z1bmN0aW9uKHQsZSxpLG4sbyxhLHIscyxsLHUsaCl7Zm9yKHZhciBjPTAsZD1pLGY9MDtmPG47ZisrKXt2YXIgcD1lW2RdO2lmKG88PWR8fGQ8MClicmVhaztpZihjbShwKSl7aWYoaCl7ZCs9YTtjb250aW51ZX1icmVha31pZihkPT09aSl0WzA8YT8ibW92ZVRvIjoibGluZVRvIl0ocFswXSxwWzFdKTtlbHNlIGlmKDA8bCl7dmFyIGc9ZVtjXSxtPSJ5Ij09PXU/MTowLHY9KHBbbV0tZ1ttXSkqbDtzbSh1bSxnKSx1bVttXT1nW21dK3Ysc20oaG0scCksaG1bbV09cFttXS12LHQuYmV6aWVyQ3VydmVUbyh1bVswXSx1bVsxXSxobVswXSxobVsxXSxwWzBdLHBbMV0pfWVsc2UgdC5saW5lVG8ocFswXSxwWzFdKTtjPWQsZCs9YX1yZXR1cm4gZn0uYXBwbHkodGhpcyxhcmd1bWVudHMpOmZ1bmN0aW9uKHQsZSxpLG4sbyxhLHIscyxsLHUsaCl7Zm9yKHZhciBjPTAsZD1pLGY9MDtmPG47ZisrKXt2YXIgcD1lW2RdO2lmKG88PWR8fGQ8MClicmVhaztpZihjbShwKSl7aWYoaCl7ZCs9YTtjb250aW51ZX1icmVha31pZihkPT09aSl0WzA8YT8ibW92ZVRvIjoibGluZVRvIl0ocFswXSxwWzFdKSxzbSh1bSxwKTtlbHNlIGlmKDA8bCl7dmFyIGc9ZCthLG09ZVtnXTtpZihoKWZvcig7bSYmY20oZVtnXSk7KW09ZVtnKz1hXTt2YXIgdj0uNSx5PWVbY107aWYoIShtPWVbZ10pfHxjbShtKSlzbShobSxwKTtlbHNle3ZhciB4LF87aWYoY20obSkmJiFoJiYobT1wKSxodChsbSxtLHkpLCJ4Ij09PXV8fCJ5Ij09PXUpe3ZhciB3PSJ4Ij09PXU/MDoxO3g9TWF0aC5hYnMocFt3XS15W3ddKSxfPU1hdGguYWJzKHBbd10tbVt3XSl9ZWxzZSB4PXl0KHAseSksXz15dChwLG0pO3JtKGhtLHAsbG0sLWwqKDEtKHY9Xy8oXyt4KSkpKX1vbSh1bSx1bSxzKSxhbSh1bSx1bSxyKSxvbShobSxobSxzKSxhbShobSxobSxyKSx0LmJlemllckN1cnZlVG8odW1bMF0sdW1bMV0saG1bMF0saG1bMV0scFswXSxwWzFdKSxybSh1bSxwLGxtLGwqdil9ZWxzZSB0LmxpbmVUbyhwWzBdLHBbMV0pO2M9ZCxkKz1hfXJldHVybiBmfS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZm0odCxlKXt2YXIgaT1bMS8wLDEvMF0sbj1bLTEvMCwtMS8wXTtpZihlKWZvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT10W29dO2FbMF08aVswXSYmKGlbMF09YVswXSksYVsxXTxpWzFdJiYoaVsxXT1hWzFdKSxhWzBdPm5bMF0mJihuWzBdPWFbMF0pLGFbMV0+blsxXSYmKG5bMV09YVsxXSl9cmV0dXJue21pbjplP2k6bixtYXg6ZT9uOml9fXZhciBwbT1Tci5leHRlbmQoe3R5cGU6ImVjLXBvbHlsaW5lIixzaGFwZTp7cG9pbnRzOltdLHNtb290aDowLHNtb290aENvbnN0cmFpbnQ6ITAsc21vb3RoTW9ub3RvbmU6bnVsbCxjb25uZWN0TnVsbHM6ITF9LHN0eWxlOntmaWxsOm51bGwsc3Ryb2tlOiIjMDAwIn0sYnJ1c2g6V3IoU3IucHJvdG90eXBlLmJydXNoKSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnBvaW50cyxuPTAsbz1pLmxlbmd0aCxhPWZtKGksZS5zbW9vdGhDb25zdHJhaW50KTtpZihlLmNvbm5lY3ROdWxscyl7Zm9yKDswPG8mJmNtKGlbby0xXSk7by0tKTtmb3IoO248byYmY20oaVtuXSk7bisrKTt9Zm9yKDtuPG87KW4rPWRtKHQsaSxuLG8sbywxLGEubWluLGEubWF4LGUuc21vb3RoLGUuc21vb3RoTW9ub3RvbmUsZS5jb25uZWN0TnVsbHMpKzF9fSksZ209U3IuZXh0ZW5kKHt0eXBlOiJlYy1wb2x5Z29uIixzaGFwZTp7cG9pbnRzOltdLHN0YWNrZWRPblBvaW50czpbXSxzbW9vdGg6MCxzdGFja2VkT25TbW9vdGg6MCxzbW9vdGhDb25zdHJhaW50OiEwLHNtb290aE1vbm90b25lOm51bGwsY29ubmVjdE51bGxzOiExfSxicnVzaDpXcihTci5wcm90b3R5cGUuYnJ1c2gpLGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUucG9pbnRzLG49ZS5zdGFja2VkT25Qb2ludHMsbz0wLGE9aS5sZW5ndGgscj1lLnNtb290aE1vbm90b25lLHM9Zm0oaSxlLnNtb290aENvbnN0cmFpbnQpLGw9Zm0obixlLnNtb290aENvbnN0cmFpbnQpO2lmKGUuY29ubmVjdE51bGxzKXtmb3IoOzA8YSYmY20oaVthLTFdKTthLS0pO2Zvcig7bzxhJiZjbShpW29dKTtvKyspO31mb3IoO288YTspe3ZhciB1PWRtKHQsaSxvLGEsYSwxLHMubWluLHMubWF4LGUuc21vb3RoLHIsZS5jb25uZWN0TnVsbHMpO2RtKHQsbixvK3UtMSx1LGEsLTEsbC5taW4sbC5tYXgsZS5zdGFja2VkT25TbW9vdGgscixlLmNvbm5lY3ROdWxscyksbys9dSsxLHQuY2xvc2VQYXRoKCl9fX0pO2Z1bmN0aW9uIG1tKHQsZSxpKXt2YXIgbj10LmdldEFyZWEoKSxvPXQuZ2V0QmFzZUF4aXMoKS5pc0hvcml6b250YWwoKSxhPW4ueCxyPW4ueSxzPW4ud2lkdGgsbD1uLmhlaWdodCx1PWkuZ2V0KCJsaW5lU3R5bGUud2lkdGgiKXx8MixoPW5ldyBpcyh7c2hhcGU6e3g6YS09dS8yLHk6ci09dS8yLHdpZHRoOnMrPXUsaGVpZ2h0OmwrPXV9fSk7cmV0dXJuIGUmJihoLnNoYXBlW28/IndpZHRoIjoiaGVpZ2h0Il09MCxsbChoLHtzaGFwZTp7d2lkdGg6cyxoZWlnaHQ6bH19LGkpKSxofWZ1bmN0aW9uIHZtKHQsZSxpKXt2YXIgbj10LmdldEFyZWEoKSxvPW5ldyBVcih7c2hhcGU6e2N4Ok5sKHQuY3gsMSksY3k6TmwodC5jeSwxKSxyMDpObChuLnIwLDEpLHI6Tmwobi5yLDEpLHN0YXJ0QW5nbGU6bi5zdGFydEFuZ2xlLGVuZEFuZ2xlOm4uZW5kQW5nbGUsY2xvY2t3aXNlOm4uY2xvY2t3aXNlfX0pO3JldHVybiBlJiYoby5zaGFwZS5lbmRBbmdsZT1uLnN0YXJ0QW5nbGUsbGwobyx7c2hhcGU6e2VuZEFuZ2xlOm4uZW5kQW5nbGV9fSxpKSksb31mdW5jdGlvbiB5bSh0LGUsaSl7cmV0dXJuIHQ/InBvbGFyIj09PXQudHlwZT92bSh0LGUsaSk6ImNhcnRlc2lhbjJkIj09PXQudHlwZT9tbSh0LGUsaSk6bnVsbDpudWxsfWZ1bmN0aW9uIHhtKHQsZSl7aWYodC5sZW5ndGg9PT1lLmxlbmd0aCl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBuPXRbaV0sbz1lW2ldO2lmKG5bMF0hPT1vWzBdfHxuWzFdIT09b1sxXSlyZXR1cm59cmV0dXJuITB9fWZ1bmN0aW9uIF9tKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90OnQ/LjU6MH1mdW5jdGlvbiB3bSh0LGUsaSl7Zm9yKHZhciBuPWUuZ2V0QmFzZUF4aXMoKSxvPSJ4Ij09PW4uZGltfHwicmFkaXVzIj09PW4uZGltPzA6MSxhPVtdLHI9MDtyPHQubGVuZ3RoLTE7cisrKXt2YXIgcz10W3IrMV0sbD10W3JdO2EucHVzaChsKTt2YXIgdT1bXTtzd2l0Y2goaSl7Y2FzZSJlbmQiOnVbb109c1tvXSx1WzEtb109bFsxLW9dLGEucHVzaCh1KTticmVhaztjYXNlIm1pZGRsZSI6dmFyIGg9KGxbb10rc1tvXSkvMixjPVtdO3Vbb109Y1tvXT1oLHVbMS1vXT1sWzEtb10sY1sxLW9dPXNbMS1vXSxhLnB1c2godSksYS5wdXNoKGMpO2JyZWFrO2RlZmF1bHQ6dVtvXT1sW29dLHVbMS1vXT1zWzEtb10sYS5wdXNoKHUpfX1yZXR1cm4gdFtyXSYmYS5wdXNoKHRbcl0pLGF9ZnVuY3Rpb24gYm0odCxlLGkpe3ZhciBuPXQuZ2V0KCJzaG93QWxsU3ltYm9sIiksbz0iYXV0byI9PT1uO2lmKCFufHxvKXt2YXIgYT1pLmdldEF4ZXNCeVNjYWxlKCJvcmRpbmFsIilbMF07aWYoYSYmKCFvfHwhZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEV4dGVudCgpLG49TWF0aC5hYnMoaVsxXS1pWzBdKS90LnNjYWxlLmNvdW50KCk7aXNOYU4obikmJihuPTApO2Zvcih2YXIgbz1lLmNvdW50KCksYT1NYXRoLm1heCgxLE1hdGgucm91bmQoby81KSkscj0wO3I8bztyKz1hKWlmKDEuNSpGZy5nZXRTeW1ib2xTaXplKGUscilbdC5pc0hvcml6b250YWwoKT8xOjBdPm4pcmV0dXJuITE7cmV0dXJuITB9KGEsZSkpKXt2YXIgcj1lLm1hcERpbWVuc2lvbihhLmRpbSkscz17fTtyZXR1cm4gRShhLmdldFZpZXdMYWJlbHMoKSxmdW5jdGlvbih0KXtzW3QudGlja1ZhbHVlXT0xfSksZnVuY3Rpb24odCl7cmV0dXJuIXMuaGFzT3duUHJvcGVydHkoZS5nZXQocix0KSl9fX19ZnVuY3Rpb24gU20odCxlLGkpe2lmKCJjYXJ0ZXNpYW4yZCIhPT10LnR5cGUpcmV0dXJuIHZtKHQsZSxpKTt2YXIgbj10LmdldEJhc2VBeGlzKCkuaXNIb3Jpem9udGFsKCksbz1tbSh0LGUsaSk7aWYoIWkuZ2V0KCJjbGlwIiwhMCkpe3ZhciBhPW8uc2hhcGUscj1NYXRoLm1heChhLndpZHRoLGEuaGVpZ2h0KTtuPyhhLnktPXIsYS5oZWlnaHQrPTIqcik6KGEueC09cixhLndpZHRoKz0yKnIpfXJldHVybiBvfWdjLmV4dGVuZCh7dHlwZToibGluZSIsaW5pdDpmdW5jdGlvbigpe3ZhciB0PW5ldyBJaSxlPW5ldyAkZzt0aGlzLmdyb3VwLmFkZChlLmdyb3VwKSx0aGlzLl9zeW1ib2xEcmF3PWUsdGhpcy5fbGluZUdyb3VwPXR9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtLG89dGhpcy5ncm91cCxhPXQuZ2V0RGF0YSgpLHI9dC5nZXRNb2RlbCgibGluZVN0eWxlIikscz10LmdldE1vZGVsKCJhcmVhU3R5bGUiKSxsPWEubWFwQXJyYXkoYS5nZXRJdGVtTGF5b3V0KSx1PSJwb2xhciI9PT1uLnR5cGUsaD10aGlzLl9jb29yZFN5cyxjPXRoaXMuX3N5bWJvbERyYXcsZD10aGlzLl9wb2x5bGluZSxmPXRoaXMuX3BvbHlnb24scD10aGlzLl9saW5lR3JvdXAsZz10LmdldCgiYW5pbWF0aW9uIiksbT0hcy5pc0VtcHR5KCksdj1zLmdldCgib3JpZ2luIikseT1mdW5jdGlvbih0LGUsaSl7aWYoIWkudmFsdWVEaW0pcmV0dXJuW107Zm9yKHZhciBuPVtdLG89MCxhPWUuY291bnQoKTtvPGE7bysrKW4ucHVzaChubShpLHQsZSxvKSk7cmV0dXJuIG59KG4sYSxpbShuLGEsdikpLHg9dC5nZXQoInNob3dTeW1ib2wiKSxfPXgmJiF1JiZibSh0LGEsbiksdz10aGlzLl9kYXRhO3cmJncuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCxlKXt0Ll9fdGVtcCYmKG8ucmVtb3ZlKHQpLHcuc2V0SXRlbUdyYXBoaWNFbChlLG51bGwpKX0pLHh8fGMucmVtb3ZlKCksby5hZGQocCk7dmFyIGIsUz0hdSYmdC5nZXQoInN0ZXAiKTtuJiZuLmdldEFyZWEmJnQuZ2V0KCJjbGlwIiwhMCkmJihudWxsIT0oYj1uLmdldEFyZWEoKSkud2lkdGg/KGIueC09LjEsYi55LT0uMSxiLndpZHRoKz0uMixiLmhlaWdodCs9LjIpOmIucjAmJihiLnIwLT0uNSxiLnIxKz0uNSkpLHRoaXMuX2NsaXBTaGFwZUZvclN5bWJvbD1iLGQmJmgudHlwZT09PW4udHlwZSYmUz09PXRoaXMuX3N0ZXA/KG0mJiFmP2Y9dGhpcy5fbmV3UG9seWdvbihsLHksbixnKTpmJiYhbSYmKHAucmVtb3ZlKGYpLGY9dGhpcy5fcG9seWdvbj1udWxsKSxwLnNldENsaXBQYXRoKFNtKG4sITEsdCkpLHgmJmMudXBkYXRlRGF0YShhLHtpc0lnbm9yZTpfLGNsaXBTaGFwZTpifSksYS5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0KXt0LnN0b3BBbmltYXRpb24oITApfSkseG0odGhpcy5fc3RhY2tlZE9uUG9pbnRzLHkpJiZ4bSh0aGlzLl9wb2ludHMsbCl8fChnP3RoaXMuX3VwZGF0ZUFuaW1hdGlvbihhLHksbixpLFMsdik6KFMmJihsPXdtKGwsbixTKSx5PXdtKHksbixTKSksZC5zZXRTaGFwZSh7cG9pbnRzOmx9KSxmJiZmLnNldFNoYXBlKHtwb2ludHM6bCxzdGFja2VkT25Qb2ludHM6eX0pKSkpOih4JiZjLnVwZGF0ZURhdGEoYSx7aXNJZ25vcmU6XyxjbGlwU2hhcGU6Yn0pLFMmJihsPXdtKGwsbixTKSx5PXdtKHksbixTKSksZD10aGlzLl9uZXdQb2x5bGluZShsLG4sZyksbSYmKGY9dGhpcy5fbmV3UG9seWdvbihsLHksbixnKSkscC5zZXRDbGlwUGF0aChTbShuLCEwLHQpKSk7dmFyIE09ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldFZpc3VhbCgidmlzdWFsTWV0YSIpO2lmKGkmJmkubGVuZ3RoJiZ0LmNvdW50KCkmJiJjYXJ0ZXNpYW4yZCI9PT1lLnR5cGUpe2Zvcih2YXIgbixvLGE9aS5sZW5ndGgtMTswPD1hO2EtLSl7dmFyIHI9aVthXS5kaW1lbnNpb24scz10LmRpbWVuc2lvbnNbcl0sbD10LmdldERpbWVuc2lvbkluZm8ocyk7aWYoIngiPT09KG49bCYmbC5jb29yZERpbSl8fCJ5Ij09PW4pe289aVthXTticmVha319aWYobyl7dmFyIHU9ZS5nZXRBeGlzKG4pLGg9TihvLnN0b3BzLGZ1bmN0aW9uKHQpe3JldHVybntjb29yZDp1LnRvR2xvYmFsQ29vcmQodS5kYXRhVG9Db29yZCh0LnZhbHVlKSksY29sb3I6dC5jb2xvcn19KSxjPWgubGVuZ3RoLGQ9by5vdXRlckNvbG9ycy5zbGljZSgpO2MmJmhbMF0uY29vcmQ+aFtjLTFdLmNvb3JkJiYoaC5yZXZlcnNlKCksZC5yZXZlcnNlKCkpO3ZhciBmPWhbMF0uY29vcmQtMTAscD1oW2MtMV0uY29vcmQrMTAsZz1wLWY7aWYoZzwuMDAxKXJldHVybiJ0cmFuc3BhcmVudCI7RShoLGZ1bmN0aW9uKHQpe3Qub2Zmc2V0PSh0LmNvb3JkLWYpL2d9KSxoLnB1c2goe29mZnNldDpjP2hbYy0xXS5vZmZzZXQ6LjUsY29sb3I6ZFsxXXx8InRyYW5zcGFyZW50In0pLGgudW5zaGlmdCh7b2Zmc2V0OmM/aFswXS5vZmZzZXQ6LjUsY29sb3I6ZFswXXx8InRyYW5zcGFyZW50In0pO3ZhciBtPW5ldyBjcygwLDAsMCwwLGgsITApO3JldHVybiBtW25dPWYsbVtuKyIyIl09cCxtfX19KGEsbil8fGEuZ2V0VmlzdWFsKCJjb2xvciIpO2QudXNlU3R5bGUoQyhyLmdldExpbmVTdHlsZSgpLHtmaWxsOiJub25lIixzdHJva2U6TSxsaW5lSm9pbjoiYmV2ZWwifSkpO3ZhciBJPXQuZ2V0KCJzbW9vdGgiKTtpZihJPV9tKHQuZ2V0KCJzbW9vdGgiKSksZC5zZXRTaGFwZSh7c21vb3RoOkksc21vb3RoTW9ub3RvbmU6dC5nZXQoInNtb290aE1vbm90b25lIiksY29ubmVjdE51bGxzOnQuZ2V0KCJjb25uZWN0TnVsbHMiKX0pLGYpe3ZhciBUPWEuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkT25TZXJpZXMiKSxBPTA7Zi51c2VTdHlsZShDKHMuZ2V0QXJlYVN0eWxlKCkse2ZpbGw6TSxvcGFjaXR5Oi43LGxpbmVKb2luOiJiZXZlbCJ9KSksVCYmKEE9X20oVC5nZXQoInNtb290aCIpKSksZi5zZXRTaGFwZSh7c21vb3RoOkksc3RhY2tlZE9uU21vb3RoOkEsc21vb3RoTW9ub3RvbmU6dC5nZXQoInNtb290aE1vbm90b25lIiksY29ubmVjdE51bGxzOnQuZ2V0KCJjb25uZWN0TnVsbHMiKX0pfXRoaXMuX2RhdGE9YSx0aGlzLl9jb29yZFN5cz1uLHRoaXMuX3N0YWNrZWRPblBvaW50cz15LHRoaXMuX3BvaW50cz1sLHRoaXMuX3N0ZXA9Uyx0aGlzLl92YWx1ZU9yaWdpbj12fSxkaXNwb3NlOmZ1bmN0aW9uKCl7fSxoaWdobGlnaHQ6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dC5nZXREYXRhKCksYT1IbyhvLG4pO2lmKCEoYSBpbnN0YW5jZW9mIEFycmF5KSYmbnVsbCE9YSYmMDw9YSl7dmFyIHI9by5nZXRJdGVtR3JhcGhpY0VsKGEpO2lmKCFyKXt2YXIgcz1vLmdldEl0ZW1MYXlvdXQoYSk7aWYoIXMpcmV0dXJuO2lmKHRoaXMuX2NsaXBTaGFwZUZvclN5bWJvbCYmIXRoaXMuX2NsaXBTaGFwZUZvclN5bWJvbC5jb250YWluKHNbMF0sc1sxXSkpcmV0dXJuOyhyPW5ldyBGZyhvLGEpKS5wb3NpdGlvbj1zLHIuc2V0Wih0LmdldCgiemxldmVsIiksdC5nZXQoInoiKSksci5pZ25vcmU9aXNOYU4oc1swXSl8fGlzTmFOKHNbMV0pLHIuX190ZW1wPSEwLG8uc2V0SXRlbUdyYXBoaWNFbChhLHIpLHIuc3RvcFN5bWJvbEFuaW1hdGlvbighMCksdGhpcy5ncm91cC5hZGQocil9ci5oaWdobGlnaHQoKX1lbHNlIGdjLnByb3RvdHlwZS5oaWdobGlnaHQuY2FsbCh0aGlzLHQsZSxpLG4pfSxkb3ducGxheTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10LmdldERhdGEoKSxhPUhvKG8sbik7aWYobnVsbCE9YSYmMDw9YSl7dmFyIHI9by5nZXRJdGVtR3JhcGhpY0VsKGEpO3ImJihyLl9fdGVtcD8oby5zZXRJdGVtR3JhcGhpY0VsKGEsbnVsbCksdGhpcy5ncm91cC5yZW1vdmUocikpOnIuZG93bnBsYXkoKSl9ZWxzZSBnYy5wcm90b3R5cGUuZG93bnBsYXkuY2FsbCh0aGlzLHQsZSxpLG4pfSxfbmV3UG9seWxpbmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcG9seWxpbmU7cmV0dXJuIGUmJnRoaXMuX2xpbmVHcm91cC5yZW1vdmUoZSksZT1uZXcgcG0oe3NoYXBlOntwb2ludHM6dH0sc2lsZW50OiEwLHoyOjEwfSksdGhpcy5fbGluZUdyb3VwLmFkZChlKSx0aGlzLl9wb2x5bGluZT1lfSxfbmV3UG9seWdvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3BvbHlnb247cmV0dXJuIGkmJnRoaXMuX2xpbmVHcm91cC5yZW1vdmUoaSksaT1uZXcgZ20oe3NoYXBlOntwb2ludHM6dCxzdGFja2VkT25Qb2ludHM6ZX0sc2lsZW50OiEwfSksdGhpcy5fbGluZUdyb3VwLmFkZChpKSx0aGlzLl9wb2x5Z29uPWl9LF91cGRhdGVBbmltYXRpb246ZnVuY3Rpb24odCxlLGksbixvLGEpe3ZhciByPXRoaXMuX3BvbHlsaW5lLHM9dGhpcy5fcG9seWdvbixsPXQuaG9zdE1vZGVsLHU9ZnVuY3Rpb24odCxlLGksbixvLGEscixzKXtmb3IodmFyIGw9ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtyZXR1cm4gZS5kaWZmKHQpLmFkZChmdW5jdGlvbih0KXtpLnB1c2goe2NtZDoiKyIsaWR4OnR9KX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe2kucHVzaCh7Y21kOiI9IixpZHg6ZSxpZHgxOnR9KX0pLnJlbW92ZShmdW5jdGlvbih0KXtpLnB1c2goe2NtZDoiLSIsaWR4OnR9KX0pLmV4ZWN1dGUoKSxpfSh0LGUpLHU9W10saD1bXSxjPVtdLGQ9W10sZj1bXSxwPVtdLGc9W10sbT1pbShvLGUsciksdj1pbShhLHQscykseT0wO3k8bC5sZW5ndGg7eSsrKXt2YXIgeD1sW3ldLF89ITA7c3dpdGNoKHguY21kKXtjYXNlIj0iOnZhciB3PXQuZ2V0SXRlbUxheW91dCh4LmlkeCksYj1lLmdldEl0ZW1MYXlvdXQoeC5pZHgxKTsoaXNOYU4od1swXSl8fGlzTmFOKHdbMV0pKSYmKHc9Yi5zbGljZSgpKSx1LnB1c2godyksaC5wdXNoKGIpLGMucHVzaChpW3guaWR4XSksZC5wdXNoKG5beC5pZHgxXSksZy5wdXNoKGUuZ2V0UmF3SW5kZXgoeC5pZHgxKSk7YnJlYWs7Y2FzZSIrIjp2YXIgUz14LmlkeDt1LnB1c2goby5kYXRhVG9Qb2ludChbZS5nZXQobS5kYXRhRGltc0ZvclBvaW50WzBdLFMpLGUuZ2V0KG0uZGF0YURpbXNGb3JQb2ludFsxXSxTKV0pKSxoLnB1c2goZS5nZXRJdGVtTGF5b3V0KFMpLnNsaWNlKCkpLGMucHVzaChubShtLG8sZSxTKSksZC5wdXNoKG5bU10pLGcucHVzaChlLmdldFJhd0luZGV4KFMpKTticmVhaztjYXNlIi0iOlM9eC5pZHg7dmFyIE09dC5nZXRSYXdJbmRleChTKTtNIT09Uz8odS5wdXNoKHQuZ2V0SXRlbUxheW91dChTKSksaC5wdXNoKGEuZGF0YVRvUG9pbnQoW3QuZ2V0KHYuZGF0YURpbXNGb3JQb2ludFswXSxTKSx0LmdldCh2LmRhdGFEaW1zRm9yUG9pbnRbMV0sUyldKSksYy5wdXNoKGlbU10pLGQucHVzaChubSh2LGEsdCxTKSksZy5wdXNoKE0pKTpfPSExfV8mJihmLnB1c2goeCkscC5wdXNoKHAubGVuZ3RoKSl9cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGdbdF0tZ1tlXX0pO3ZhciBJPVtdLFQ9W10sQT1bXSxEPVtdLEM9W107Zm9yKHk9MDt5PHAubGVuZ3RoO3krKyl7Uz1wW3ldO0lbeV09dVtTXSxUW3ldPWhbU10sQVt5XT1jW1NdLERbeV09ZFtTXSxDW3ldPWZbU119cmV0dXJue2N1cnJlbnQ6SSxuZXh0OlQsc3RhY2tlZE9uQ3VycmVudDpBLHN0YWNrZWRPbk5leHQ6RCxzdGF0dXM6Q319KHRoaXMuX2RhdGEsdCx0aGlzLl9zdGFja2VkT25Qb2ludHMsZSx0aGlzLl9jb29yZFN5cyxpLHRoaXMuX3ZhbHVlT3JpZ2luLGEpLGg9dS5jdXJyZW50LGM9dS5zdGFja2VkT25DdXJyZW50LGQ9dS5uZXh0LGY9dS5zdGFja2VkT25OZXh0O28mJihoPXdtKHUuY3VycmVudCxpLG8pLGM9d20odS5zdGFja2VkT25DdXJyZW50LGksbyksZD13bSh1Lm5leHQsaSxvKSxmPXdtKHUuc3RhY2tlZE9uTmV4dCxpLG8pKSxyLnNoYXBlLl9fcG9pbnRzPXUuY3VycmVudCxyLnNoYXBlLnBvaW50cz1oLHNsKHIse3NoYXBlOntwb2ludHM6ZH19LGwpLHMmJihzLnNldFNoYXBlKHtwb2ludHM6aCxzdGFja2VkT25Qb2ludHM6Y30pLHNsKHMse3NoYXBlOntwb2ludHM6ZCxzdGFja2VkT25Qb2ludHM6Zn19LGwpKTtmb3IodmFyIHA9W10sZz11LnN0YXR1cyxtPTA7bTxnLmxlbmd0aDttKyspe2lmKCI9Ij09PWdbbV0uY21kKXt2YXIgdj10LmdldEl0ZW1HcmFwaGljRWwoZ1ttXS5pZHgxKTt2JiZwLnB1c2goe2VsOnYscHRJZHg6bX0pfX1yLmFuaW1hdG9ycyYmci5hbmltYXRvcnMubGVuZ3RoJiZyLmFuaW1hdG9yc1swXS5kdXJpbmcoZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHAubGVuZ3RoO3QrKyl7cFt0XS5lbC5hdHRyKCJwb3NpdGlvbiIsci5zaGFwZS5fX3BvaW50c1twW3RdLnB0SWR4XSl9fSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmdyb3VwLG49dGhpcy5fZGF0YTt0aGlzLl9saW5lR3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fc3ltYm9sRHJhdy5yZW1vdmUoITApLG4mJm4uZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCxlKXt0Ll9fdGVtcCYmKGkucmVtb3ZlKHQpLG4uc2V0SXRlbUdyYXBoaWNFbChlLG51bGwpKX0pLHRoaXMuX3BvbHlsaW5lPXRoaXMuX3BvbHlnb249dGhpcy5fY29vcmRTeXM9dGhpcy5fcG9pbnRzPXRoaXMuX3N0YWNrZWRPblBvaW50cz10aGlzLl9kYXRhPW51bGx9fSk7ZnVuY3Rpb24gTW0odCxyLHMpe3JldHVybntzZXJpZXNUeXBlOnQscGVyZm9ybVJhd1NlcmllczohMCxyZXNldDpmdW5jdGlvbihsLHQsZSl7dmFyIGk9bC5nZXREYXRhKCksdT1sLmdldCgic3ltYm9sIiksaD1sLmdldCgic3ltYm9sU2l6ZSIpLG49bC5nZXQoInN5bWJvbEtlZXBBc3BlY3QiKSxjPU8odSksZD1PKGgpLGY9Y3x8ZCxvPSFjJiZ1P3U6cixhPWQ/bnVsbDpoO2lmKGkuc2V0VmlzdWFsKHtsZWdlbmRTeW1ib2w6c3x8byxzeW1ib2w6byxzeW1ib2xTaXplOmEsc3ltYm9sS2VlcEFzcGVjdDpufSksIXQuaXNTZXJpZXNGaWx0ZXJlZChsKSlyZXR1cm57ZGF0YUVhY2g6aS5oYXNJdGVtT3B0aW9ufHxmP2Z1bmN0aW9uKHQsZSl7aWYoZil7dmFyIGk9bC5nZXRSYXdWYWx1ZShlKSxuPWwuZ2V0RGF0YVBhcmFtcyhlKTtjJiZ0LnNldEl0ZW1WaXN1YWwoZSwic3ltYm9sIix1KGksbikpLGQmJnQuc2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIixoKGksbikpfWlmKHQuaGFzSXRlbU9wdGlvbil7dmFyIG89dC5nZXRJdGVtTW9kZWwoZSksYT1vLmdldFNoYWxsb3coInN5bWJvbCIsITApLHI9by5nZXRTaGFsbG93KCJzeW1ib2xTaXplIiwhMCkscz1vLmdldFNoYWxsb3coInN5bWJvbEtlZXBBc3BlY3QiLCEwKTtudWxsIT1hJiZ0LnNldEl0ZW1WaXN1YWwoZSwic3ltYm9sIixhKSxudWxsIT1yJiZ0LnNldEl0ZW1WaXN1YWwoZSwic3ltYm9sU2l6ZSIsciksbnVsbCE9cyYmdC5zZXRJdGVtVmlzdWFsKGUsInN5bWJvbEtlZXBBc3BlY3QiLHMpfX06bnVsbH19fX1mdW5jdGlvbiBJbSh0KXtyZXR1cm57c2VyaWVzVHlwZTp0LHBsYW46ZGMoKSxyZXNldDpmdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKSxjPXQuY29vcmRpbmF0ZVN5c3RlbSxkPXQucGlwZWxpbmVDb250ZXh0LmxhcmdlO2lmKGMpe3ZhciBmPU4oYy5kaW1lbnNpb25zLGZ1bmN0aW9uKHQpe3JldHVybiBlLm1hcERpbWVuc2lvbih0KX0pLnNsaWNlKDAsMikscD1mLmxlbmd0aCxpPWUuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja1Jlc3VsdERpbWVuc2lvbiIpO3JldHVybiBscChlLGZbMF0pJiYoZlswXT1pKSxscChlLGZbMV0pJiYoZlsxXT1pKSxwJiZ7cHJvZ3Jlc3M6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5lbmQtdC5zdGFydCxuPWQmJm5ldyBGbG9hdDMyQXJyYXkoaSpwKSxvPXQuc3RhcnQsYT0wLHI9W10scz1bXTtvPHQuZW5kO28rKyl7dmFyIGw7aWYoMT09PXApe3ZhciB1PWUuZ2V0KGZbMF0sbyk7bD0haXNOYU4odSkmJmMuZGF0YVRvUG9pbnQodSxudWxsLHMpfWVsc2V7dT1yWzBdPWUuZ2V0KGZbMF0sbyk7dmFyIGg9clsxXT1lLmdldChmWzFdLG8pO2w9IWlzTmFOKHUpJiYhaXNOYU4oaCkmJmMuZGF0YVRvUG9pbnQocixudWxsLHMpfWQ/KG5bYSsrXT1sP2xbMF06TmFOLG5bYSsrXT1sP2xbMV06TmFOKTplLnNldEl0ZW1MYXlvdXQobyxsJiZsLnNsaWNlKCl8fFtOYU4sTmFOXSl9ZCYmZS5zZXRMYXlvdXQoInN5bWJvbFBvaW50cyIsbil9fX19fX1mdW5jdGlvbiBUbSh0LGUpe3JldHVybiBNYXRoLnJvdW5kKHQubGVuZ3RoLzIpfXZhciBBbT17YXZlcmFnZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPTAsbj0wO248dC5sZW5ndGg7bisrKWlzTmFOKHRbbl0pfHwoZSs9dFtuXSxpKyspO3JldHVybiAwPT09aT9OYU46ZS9pfSxzdW06ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsaT0wO2k8dC5sZW5ndGg7aSsrKWUrPXRbaV18fDA7cmV0dXJuIGV9LG1heDpmdW5jdGlvbih0KXtmb3IodmFyIGU9LTEvMCxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXT5lJiYoZT10W2ldKTtyZXR1cm4gaXNGaW5pdGUoZSk/ZTpOYU59LG1pbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9MS8wLGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldPGUmJihlPXRbaV0pO3JldHVybiBpc0Zpbml0ZShlKT9lOk5hTn0sbmVhcmVzdDpmdW5jdGlvbih0KXtyZXR1cm4gdFswXX19O2Z1bmN0aW9uIERtKHQpe3JldHVybiB0aGlzLl9heGVzW3RdfWZ1bmN0aW9uIENtKHQpe3RoaXMuX2F4ZXM9e30sdGhpcy5fZGltTGlzdD1bXSx0aGlzLm5hbWU9dHx8IiJ9ZnVuY3Rpb24gTG0odCl7Q20uY2FsbCh0aGlzLHQpfUNtLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Q20sdHlwZToiY2FydGVzaWFuIixnZXRBeGlzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9heGVzW3RdfSxnZXRBeGVzOmZ1bmN0aW9uKCl7cmV0dXJuIE4odGhpcy5fZGltTGlzdCxEbSx0aGlzKX0sZ2V0QXhlc0J5U2NhbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS50b0xvd2VyQ2FzZSgpLE0odGhpcy5nZXRBeGVzKCksZnVuY3Rpb24odCl7cmV0dXJuIHQuc2NhbGUudHlwZT09PWV9KX0sYWRkQXhpczpmdW5jdGlvbih0KXt2YXIgZT10LmRpbTt0aGlzLl9heGVzW2VdPXQsdGhpcy5fZGltTGlzdC5wdXNoKGUpfSxkYXRhVG9Db29yZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGF0YUNvb3JkQ29udmVydCh0LCJkYXRhVG9Db29yZCIpfSxjb29yZFRvRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGF0YUNvb3JkQ29udmVydCh0LCJjb29yZFRvRGF0YSIpfSxfZGF0YUNvb3JkQ29udmVydDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLl9kaW1MaXN0LG49dCBpbnN0YW5jZW9mIEFycmF5P1tdOnt9LG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9aVtvXSxyPXRoaXMuX2F4ZXNbYV07blthXT1yW2VdKHRbYV0pfXJldHVybiBufX0sTG0ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpMbSx0eXBlOiJjYXJ0ZXNpYW4yZCIsZGltZW5zaW9uczpbIngiLCJ5Il0sZ2V0QmFzZUF4aXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBeGVzQnlTY2FsZSgib3JkaW5hbCIpWzBdfHx0aGlzLmdldEF4ZXNCeVNjYWxlKCJ0aW1lIilbMF18fHRoaXMuZ2V0QXhpcygieCIpfSxjb250YWluUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRBeGlzKCJ4IiksaT10aGlzLmdldEF4aXMoInkiKTtyZXR1cm4gZS5jb250YWluKGUudG9Mb2NhbENvb3JkKHRbMF0pKSYmaS5jb250YWluKGkudG9Mb2NhbENvb3JkKHRbMV0pKX0sY29udGFpbkRhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0QXhpcygieCIpLmNvbnRhaW5EYXRhKHRbMF0pJiZ0aGlzLmdldEF4aXMoInkiKS5jb250YWluRGF0YSh0WzFdKX0sZGF0YVRvUG9pbnQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuZ2V0QXhpcygieCIpLG89dGhpcy5nZXRBeGlzKCJ5Iik7cmV0dXJuKGk9aXx8W10pWzBdPW4udG9HbG9iYWxDb29yZChuLmRhdGFUb0Nvb3JkKHRbMF0pKSxpWzFdPW8udG9HbG9iYWxDb29yZChvLmRhdGFUb0Nvb3JkKHRbMV0pKSxpfSxjbGFtcERhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEF4aXMoIngiKS5zY2FsZSxuPXRoaXMuZ2V0QXhpcygieSIpLnNjYWxlLG89aS5nZXRFeHRlbnQoKSxhPW4uZ2V0RXh0ZW50KCkscj1pLnBhcnNlKHRbMF0pLHM9bi5wYXJzZSh0WzFdKTtyZXR1cm4oZT1lfHxbXSlbMF09TWF0aC5taW4oTWF0aC5tYXgoTWF0aC5taW4ob1swXSxvWzFdKSxyKSxNYXRoLm1heChvWzBdLG9bMV0pKSxlWzFdPU1hdGgubWluKE1hdGgubWF4KE1hdGgubWluKGFbMF0sYVsxXSkscyksTWF0aC5tYXgoYVswXSxhWzFdKSksZX0scG9pbnRUb0RhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEF4aXMoIngiKSxuPXRoaXMuZ2V0QXhpcygieSIpO3JldHVybihlPWV8fFtdKVswXT1pLmNvb3JkVG9EYXRhKGkudG9Mb2NhbENvb3JkKHRbMF0pKSxlWzFdPW4uY29vcmRUb0RhdGEobi50b0xvY2FsQ29vcmQodFsxXSkpLGV9LGdldE90aGVyQXhpczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRBeGlzKCJ4Ij09PXQuZGltPyJ5IjoieCIpfSxnZXRBcmVhOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRBeGlzKCJ4IikuZ2V0R2xvYmFsRXh0ZW50KCksZT10aGlzLmdldEF4aXMoInkiKS5nZXRHbG9iYWxFeHRlbnQoKSxpPU1hdGgubWluKHRbMF0sdFsxXSksbj1NYXRoLm1pbihlWzBdLGVbMV0pO3JldHVybiBuZXcgTWkoaSxuLE1hdGgubWF4KHRbMF0sdFsxXSktaSxNYXRoLm1heChlWzBdLGVbMV0pLW4pfX0sdyhMbSxDbSk7ZnVuY3Rpb24ga20odCxlLGksbixvKXtFZy5jYWxsKHRoaXMsdCxlLGkpLHRoaXMudHlwZT1ufHwidmFsdWUiLHRoaXMucG9zaXRpb249b3x8ImJvdHRvbSJ9a20ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprbSxpbmRleDowLGdldEF4ZXNPblplcm9PZjpudWxsLG1vZGVsOm51bGwsaXNIb3Jpem9udGFsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wb3NpdGlvbjtyZXR1cm4idG9wIj09PXR8fCJib3R0b20iPT09dH0sZ2V0R2xvYmFsRXh0ZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RXh0ZW50KCk7cmV0dXJuIGVbMF09dGhpcy50b0dsb2JhbENvb3JkKGVbMF0pLGVbMV09dGhpcy50b0dsb2JhbENvb3JkKGVbMV0pLHQmJmVbMF0+ZVsxXSYmZS5yZXZlcnNlKCksZX0sZ2V0T3RoZXJBeGlzOmZ1bmN0aW9uKCl7dGhpcy5ncmlkLmdldE90aGVyQXhpcygpfSxwb2ludFRvRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvb3JkVG9EYXRhKHRoaXMudG9Mb2NhbENvb3JkKHRbIngiPT09dGhpcy5kaW0/MDoxXSksZSl9LHRvTG9jYWxDb29yZDpudWxsLHRvR2xvYmFsQ29vcmQ6bnVsbH0sdyhrbSxFZyk7dmFyIFBtPXtzaG93OiEwLHpsZXZlbDowLHo6MCxpbnZlcnNlOiExLG5hbWU6IiIsbmFtZUxvY2F0aW9uOiJlbmQiLG5hbWVSb3RhdGU6bnVsbCxuYW1lVHJ1bmNhdGU6e21heFdpZHRoOm51bGwsZWxsaXBzaXM6Ii4uLiIscGxhY2Vob2xkZXI6Ii4ifSxuYW1lVGV4dFN0eWxlOnt9LG5hbWVHYXA6MTUsc2lsZW50OiExLHRyaWdnZXJFdmVudDohMSx0b29sdGlwOntzaG93OiExfSxheGlzUG9pbnRlcjp7fSxheGlzTGluZTp7c2hvdzohMCxvblplcm86ITAsb25aZXJvQXhpc0luZGV4Om51bGwsbGluZVN0eWxlOntjb2xvcjoiIzMzMyIsd2lkdGg6MSx0eXBlOiJzb2xpZCJ9LHN5bWJvbDpbIm5vbmUiLCJub25lIl0sc3ltYm9sU2l6ZTpbMTAsMTVdfSxheGlzVGljazp7c2hvdzohMCxpbnNpZGU6ITEsbGVuZ3RoOjUsbGluZVN0eWxlOnt3aWR0aDoxfX0sYXhpc0xhYmVsOntzaG93OiEwLGluc2lkZTohMSxyb3RhdGU6MCxzaG93TWluTGFiZWw6bnVsbCxzaG93TWF4TGFiZWw6bnVsbCxtYXJnaW46OCxmb250U2l6ZToxMn0sc3BsaXRMaW5lOntzaG93OiEwLGxpbmVTdHlsZTp7Y29sb3I6WyIjY2NjIl0sd2lkdGg6MSx0eXBlOiJzb2xpZCJ9fSxzcGxpdEFyZWE6e3Nob3c6ITEsYXJlYVN0eWxlOntjb2xvcjpbInJnYmEoMjUwLDI1MCwyNTAsMC4zKSIsInJnYmEoMjAwLDIwMCwyMDAsMC4zKSJdfX19LE5tPXt9O05tLmNhdGVnb3J5QXhpcz1tKHtib3VuZGFyeUdhcDohMCxkZWR1cGxpY2F0aW9uOm51bGwsc3BsaXRMaW5lOntzaG93OiExfSxheGlzVGljazp7YWxpZ25XaXRoTGFiZWw6ITEsaW50ZXJ2YWw6ImF1dG8ifSxheGlzTGFiZWw6e2ludGVydmFsOiJhdXRvIn19LFBtKSxObS52YWx1ZUF4aXM9bSh7Ym91bmRhcnlHYXA6WzAsMF0sc3BsaXROdW1iZXI6NSxtaW5vclRpY2s6e3Nob3c6ITEsc3BsaXROdW1iZXI6NSxsZW5ndGg6MyxsaW5lU3R5bGU6e319LG1pbm9yU3BsaXRMaW5lOntzaG93OiExLGxpbmVTdHlsZTp7Y29sb3I6IiNlZWUiLHdpZHRoOjF9fX0sUG0pLE5tLnRpbWVBeGlzPUMoe3NjYWxlOiEwLG1pbjoiZGF0YU1pbiIsbWF4OiJkYXRhTWF4In0sTm0udmFsdWVBeGlzKSxObS5sb2dBeGlzPUMoe3NjYWxlOiEwLGxvZ0Jhc2U6MTB9LE5tLnZhbHVlQXhpcyk7ZnVuY3Rpb24gT20oYSx0LHIsZSl7RShFbSxmdW5jdGlvbihvKXt0LmV4dGVuZCh7dHlwZTphKyJBeGlzLiIrbyxtZXJnZURlZmF1bHRBbmRUaGVtZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMubGF5b3V0TW9kZSxuPWk/X3UodCk6e307bSh0LGUuZ2V0VGhlbWUoKS5nZXQobysiQXhpcyIpKSxtKHQsdGhpcy5nZXREZWZhdWx0T3B0aW9uKCkpLHQudHlwZT1yKGEsdCksaSYmeHUodCxuLGkpfSxvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKCl7ImNhdGVnb3J5Ij09PXRoaXMub3B0aW9uLnR5cGUmJih0aGlzLl9fb3JkaW5hbE1ldGE9ZHAuY3JlYXRlQnlBeGlzTW9kZWwodGhpcykpfSxnZXRDYXRlZ29yaWVzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uO2lmKCJjYXRlZ29yeSI9PT1lLnR5cGUpcmV0dXJuIHQ/ZS5kYXRhOnRoaXMuX19vcmRpbmFsTWV0YS5jYXRlZ29yaWVzfSxnZXRPcmRpbmFsTWV0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fb3JkaW5hbE1ldGF9LGRlZmF1bHRPcHRpb246cChbe30sTm1bbysiQXhpcyJdLGVdLCEwKX0pfSksVHUucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyKGErIkF4aXMiLFQocixhKSl9dmFyIEVtPVsidmFsdWUiLCJjYXRlZ29yeSIsInRpbWUiLCJsb2ciXSx6bT1UdS5leHRlbmQoe3R5cGU6ImNhcnRlc2lhbjJkQXhpcyIsYXhpczpudWxsLGluaXQ6ZnVuY3Rpb24oKXt6bS5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyksdGhpcy5yZXNldFJhbmdlKCl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKCl7em0uc3VwZXJBcHBseSh0aGlzLCJtZXJnZU9wdGlvbiIsYXJndW1lbnRzKSx0aGlzLnJlc2V0UmFuZ2UoKX0scmVzdG9yZURhdGE6ZnVuY3Rpb24oKXt6bS5zdXBlckFwcGx5KHRoaXMsInJlc3RvcmVEYXRhIixhcmd1bWVudHMpLHRoaXMucmVzZXRSYW5nZSgpfSxnZXRDb29yZFN5c01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWNNb2RlbC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJncmlkIixpbmRleDp0aGlzLm9wdGlvbi5ncmlkSW5kZXgsaWQ6dGhpcy5vcHRpb24uZ3JpZElkfSlbMF19fSk7ZnVuY3Rpb24gUm0odCxlKXtyZXR1cm4gZS50eXBlfHwoZS5kYXRhPyJjYXRlZ29yeSI6InZhbHVlIil9bSh6bS5wcm90b3R5cGUsc2cpO3ZhciBCbT17b2Zmc2V0OjB9O2Z1bmN0aW9uIFZtKHQsZSl7cmV0dXJuIHQuZ2V0Q29vcmRTeXNNb2RlbCgpPT09ZX1mdW5jdGlvbiBHbSh0LGUsaSl7dGhpcy5fY29vcmRzTWFwPXt9LHRoaXMuX2Nvb3Jkc0xpc3Q9W10sdGhpcy5fYXhlc01hcD17fSx0aGlzLl9heGVzTGlzdD1bXSx0aGlzLl9pbml0Q2FydGVzaWFuKHQsZSxpKSx0aGlzLm1vZGVsPXR9T20oIngiLHptLFJtLEJtKSxPbSgieSIsem0sUm0sQm0pLFR1LmV4dGVuZCh7dHlwZToiZ3JpZCIsZGVwZW5kZW5jaWVzOlsieEF4aXMiLCJ5QXhpcyJdLGxheW91dE1vZGU6ImJveCIsY29vcmRpbmF0ZVN5c3RlbTpudWxsLGRlZmF1bHRPcHRpb246e3Nob3c6ITEsemxldmVsOjAsejowLGxlZnQ6IjEwJSIsdG9wOjYwLHJpZ2h0OiIxMCUiLGJvdHRvbTo2MCxjb250YWluTGFiZWw6ITEsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiIjY2NjIn19KTt2YXIgRm09R20ucHJvdG90eXBlO2Z1bmN0aW9uIFdtKHQsZSxpLG4pe2kuZ2V0QXhlc09uWmVyb09mPWZ1bmN0aW9uKCl7cmV0dXJuIG8/W29dOltdfTt2YXIgbyxhPXRbZV0scj1pLm1vZGVsLHM9ci5nZXQoImF4aXNMaW5lLm9uWmVybyIpLGw9ci5nZXQoImF4aXNMaW5lLm9uWmVyb0F4aXNJbmRleCIpO2lmKHMpe2lmKG51bGwhPWwpSG0oYVtsXSkmJihvPWFbbF0pO2Vsc2UgZm9yKHZhciB1IGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eSh1KSYmSG0oYVt1XSkmJiFuW2goYVt1XSldKXtvPWFbdV07YnJlYWt9byYmKG5baChvKV09ITApfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQuZGltKyJfIit0LmluZGV4fX1mdW5jdGlvbiBIbSh0KXtyZXR1cm4gdCYmImNhdGVnb3J5IiE9PXQudHlwZSYmInRpbWUiIT09dC50eXBlJiZmdW5jdGlvbih0KXt2YXIgZT10LnNjYWxlLmdldEV4dGVudCgpLGk9ZVswXSxuPWVbMV07cmV0dXJuISgwPGkmJjA8bnx8aTwwJiZuPDApfSh0KX1GbS50eXBlPSJncmlkIixGbS5heGlzUG9pbnRlckVuYWJsZWQ9ITAsRm0uZ2V0UmVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWN0fSxGbS51cGRhdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9heGVzTWFwO3RoaXMuX3VwZGF0ZVNjYWxlKHQsdGhpcy5tb2RlbCksRShpLngsZnVuY3Rpb24odCl7ZWcodC5zY2FsZSx0Lm1vZGVsKX0pLEUoaS55LGZ1bmN0aW9uKHQpe2VnKHQuc2NhbGUsdC5tb2RlbCl9KTt2YXIgbj17fTtFKGkueCxmdW5jdGlvbih0KXtXbShpLCJ5Iix0LG4pfSksRShpLnksZnVuY3Rpb24odCl7V20oaSwieCIsdCxuKX0pLHRoaXMucmVzaXplKHRoaXMubW9kZWwsZSl9LEZtLnJlc2l6ZT1mdW5jdGlvbih0LGUsaSl7dmFyIG89dnUodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSk7dGhpcy5fcmVjdD1vO3ZhciBuPXRoaXMuX2F4ZXNMaXN0O2Z1bmN0aW9uIGEoKXtFKG4sZnVuY3Rpb24odCl7dmFyIGU9dC5pc0hvcml6b250YWwoKSxpPWU/WzAsby53aWR0aF06WzAsby5oZWlnaHRdLG49dC5pbnZlcnNlPzE6MDt0LnNldEV4dGVudChpW25dLGlbMS1uXSksZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEV4dGVudCgpLG49aVswXStpWzFdO3QudG9HbG9iYWxDb29yZD0ieCI9PT10LmRpbT9mdW5jdGlvbih0KXtyZXR1cm4gdCtlfTpmdW5jdGlvbih0KXtyZXR1cm4gbi10K2V9LHQudG9Mb2NhbENvb3JkPSJ4Ij09PXQuZGltP2Z1bmN0aW9uKHQpe3JldHVybiB0LWV9OmZ1bmN0aW9uKHQpe3JldHVybiBuLXQrZX19KHQsZT9vLng6by55KX0pfWEoKSwhaSYmdC5nZXQoImNvbnRhaW5MYWJlbCIpJiYoRShuLGZ1bmN0aW9uKHQpe2lmKCF0Lm1vZGVsLmdldCgiYXhpc0xhYmVsLmluc2lkZSIpKXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10Lm1vZGVsLGk9dC5zY2FsZTtpZihlLmdldCgiYXhpc0xhYmVsLnNob3ciKSYmIWkuaXNCbGFuaygpKXt2YXIgbixvLGE9ImNhdGVnb3J5Ij09PXQudHlwZSxyPWkuZ2V0RXh0ZW50KCk7bz1hP2kuY291bnQoKToobj1pLmdldFRpY2tzKCkpLmxlbmd0aDt2YXIgcyxsLHUsaCxjLGQsZixwLGcsbT10LmdldExhYmVsTW9kZWwoKSx2PW5nKHQpLHk9MTs0MDxvJiYoeT1NYXRoLmNlaWwoby80MCkpO2Zvcih2YXIgeD0wO3g8bzt4Kz15KXt2YXIgXz12KG4/blt4XTpyWzBdK3gpLHc9bS5nZXRUZXh0UmVjdChfKSxiPShsPXcsdT1tLmdldCgicm90YXRlIil8fDAsdm9pZCAwLGg9dSpNYXRoLlBJLzE4MCxjPWwucGxhaW4oKSxkPWMud2lkdGgsZj1jLmhlaWdodCxwPWQqTWF0aC5jb3MoaCkrZipNYXRoLnNpbihoKSxnPWQqTWF0aC5zaW4oaCkrZipNYXRoLmNvcyhoKSxuZXcgTWkoYy54LGMueSxwLGcpKTtzP3MudW5pb24oYik6cz1ifXJldHVybiBzfX0odCk7aWYoZSl7dmFyIGk9dC5pc0hvcml6b250YWwoKT8iaGVpZ2h0Ijoid2lkdGgiLG49dC5tb2RlbC5nZXQoImF4aXNMYWJlbC5tYXJnaW4iKTtvW2ldLT1lW2ldK24sInRvcCI9PT10LnBvc2l0aW9uP28ueSs9ZS5oZWlnaHQrbjoibGVmdCI9PT10LnBvc2l0aW9uJiYoby54Kz1lLndpZHRoK24pfX19KSxhKCkpfSxGbS5nZXRBeGlzPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fYXhlc01hcFt0XTtpZihudWxsIT1pKXtpZihudWxsPT1lKWZvcih2YXIgbiBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkobikpcmV0dXJuIGlbbl07cmV0dXJuIGlbZV19fSxGbS5nZXRBeGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F4ZXNMaXN0LnNsaWNlKCl9LEZtLmdldENhcnRlc2lhbj1mdW5jdGlvbih0LGUpe2lmKG51bGwhPXQmJm51bGwhPWUpe3ZhciBpPSJ4Iit0KyJ5IitlO3JldHVybiB0aGlzLl9jb29yZHNNYXBbaV19Uih0KSYmKGU9dC55QXhpc0luZGV4LHQ9dC54QXhpc0luZGV4KTtmb3IodmFyIG49MCxvPXRoaXMuX2Nvb3Jkc0xpc3Q7bjxvLmxlbmd0aDtuKyspaWYob1tuXS5nZXRBeGlzKCJ4IikuaW5kZXg9PT10fHxvW25dLmdldEF4aXMoInkiKS5pbmRleD09PWUpcmV0dXJuIG9bbl19LEZtLmdldENhcnRlc2lhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRzTGlzdC5zbGljZSgpfSxGbS5jb252ZXJ0VG9QaXhlbD1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fZmluZENvbnZlcnRUYXJnZXQodCxlKTtyZXR1cm4gbi5jYXJ0ZXNpYW4/bi5jYXJ0ZXNpYW4uZGF0YVRvUG9pbnQoaSk6bi5heGlzP24uYXhpcy50b0dsb2JhbENvb3JkKG4uYXhpcy5kYXRhVG9Db29yZChpKSk6bnVsbH0sRm0uY29udmVydEZyb21QaXhlbD1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fZmluZENvbnZlcnRUYXJnZXQodCxlKTtyZXR1cm4gbi5jYXJ0ZXNpYW4/bi5jYXJ0ZXNpYW4ucG9pbnRUb0RhdGEoaSk6bi5heGlzP24uYXhpcy5jb29yZFRvRGF0YShuLmF4aXMudG9Mb2NhbENvb3JkKGkpKTpudWxsfSxGbS5fZmluZENvbnZlcnRUYXJnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxuLG89ZS5zZXJpZXNNb2RlbCxhPWUueEF4aXNNb2RlbHx8byYmby5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJ4QXhpcyIpWzBdLHI9ZS55QXhpc01vZGVsfHxvJiZvLmdldFJlZmVycmluZ0NvbXBvbmVudHMoInlBeGlzIilbMF0scz1lLmdyaWRNb2RlbCxsPXRoaXMuX2Nvb3Jkc0xpc3Q7aWYobylfKGwsaT1vLmNvb3JkaW5hdGVTeXN0ZW0pPDAmJihpPW51bGwpO2Vsc2UgaWYoYSYmcilpPXRoaXMuZ2V0Q2FydGVzaWFuKGEuY29tcG9uZW50SW5kZXgsci5jb21wb25lbnRJbmRleCk7ZWxzZSBpZihhKW49dGhpcy5nZXRBeGlzKCJ4IixhLmNvbXBvbmVudEluZGV4KTtlbHNlIGlmKHIpbj10aGlzLmdldEF4aXMoInkiLHIuY29tcG9uZW50SW5kZXgpO2Vsc2UgaWYocyl7cy5jb29yZGluYXRlU3lzdGVtPT09dGhpcyYmKGk9dGhpcy5fY29vcmRzTGlzdFswXSl9cmV0dXJue2NhcnRlc2lhbjppLGF4aXM6bn19LEZtLmNvbnRhaW5Qb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb29yZHNMaXN0WzBdO2lmKGUpcmV0dXJuIGUuY29udGFpblBvaW50KHQpfSxGbS5faW5pdENhcnRlc2lhbj1mdW5jdGlvbihyLHQsZSl7dmFyIHM9e2xlZnQ6ITEscmlnaHQ6ITEsdG9wOiExLGJvdHRvbTohMX0sbD17eDp7fSx5Ont9fSx1PXt4OjAseTowfTtpZih0LmVhY2hDb21wb25lbnQoInhBeGlzIixpKCJ4IiksdGhpcyksdC5lYWNoQ29tcG9uZW50KCJ5QXhpcyIsaSgieSIpLHRoaXMpLCF1Lnh8fCF1LnkpcmV0dXJuIHRoaXMuX2F4ZXNNYXA9e30sdm9pZCh0aGlzLl9heGVzTGlzdD1bXSk7ZnVuY3Rpb24gaShhKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihWbSh0LHIpKXt2YXIgaT10LmdldCgicG9zaXRpb24iKTsieCI9PT1hPyJ0b3AiIT09aSYmImJvdHRvbSIhPT1pJiYoaT1zLmJvdHRvbT8idG9wIjoiYm90dG9tIik6ImxlZnQiIT09aSYmInJpZ2h0IiE9PWkmJihpPXMubGVmdD8icmlnaHQiOiJsZWZ0Iiksc1tpXT0hMDt2YXIgbj1uZXcga20oYSxpZyh0KSxbMCwwXSx0LmdldCgidHlwZSIpLGkpLG89ImNhdGVnb3J5Ij09PW4udHlwZTtuLm9uQmFuZD1vJiZ0LmdldCgiYm91bmRhcnlHYXAiKSxuLmludmVyc2U9dC5nZXQoImludmVyc2UiKSwodC5heGlzPW4pLm1vZGVsPXQsbi5ncmlkPXRoaXMsbi5pbmRleD1lLHRoaXMuX2F4ZXNMaXN0LnB1c2gobiksbFthXVtlXT1uLHVbYV0rK319fUUoKHRoaXMuX2F4ZXNNYXA9bCkueCxmdW5jdGlvbihvLGEpe0UobC55LGZ1bmN0aW9uKHQsZSl7dmFyIGk9IngiK2ErInkiK2Usbj1uZXcgTG0oaSk7bi5ncmlkPXRoaXMsbi5tb2RlbD1yLHRoaXMuX2Nvb3Jkc01hcFtpXT1uLHRoaXMuX2Nvb3Jkc0xpc3QucHVzaChuKSxuLmFkZEF4aXMobyksbi5hZGRBeGlzKHQpfSx0aGlzKX0sdGhpcyl9LEZtLl91cGRhdGVTY2FsZT1mdW5jdGlvbihsLHUpe2Z1bmN0aW9uIGgoZSxpKXtFKGUubWFwRGltZW5zaW9uKGkuZGltLCEwKSxmdW5jdGlvbih0KXtpLnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoZSx1cChlLHQpKX0pfUUodGhpcy5fYXhlc0xpc3QsZnVuY3Rpb24odCl7dC5zY2FsZS5zZXRFeHRlbnQoMS8wLC0xLzApfSksbC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe2lmKFhtKHQpKXt2YXIgZT1VbSh0LGwpLGk9ZVswXSxuPWVbMV07aWYoIVZtKGksdSl8fCFWbShuLHUpKXJldHVybjt2YXIgbz10aGlzLmdldENhcnRlc2lhbihpLmNvbXBvbmVudEluZGV4LG4uY29tcG9uZW50SW5kZXgpLGE9dC5nZXREYXRhKCkscj1vLmdldEF4aXMoIngiKSxzPW8uZ2V0QXhpcygieSIpOyJsaXN0Ij09PWEudHlwZSYmKGgoYSxyLHQpLGgoYSxzLHQpKX19LHRoaXMpfSxGbS5nZXRUb29sdGlwQXhlcz1mdW5jdGlvbihuKXt2YXIgbz1bXSxhPVtdO3JldHVybiBFKHRoaXMuZ2V0Q2FydGVzaWFucygpLGZ1bmN0aW9uKHQpe3ZhciBlPW51bGwhPW4mJiJhdXRvIiE9PW4/dC5nZXRBeGlzKG4pOnQuZ2V0QmFzZUF4aXMoKSxpPXQuZ2V0T3RoZXJBeGlzKGUpO18obyxlKTwwJiZvLnB1c2goZSksXyhhLGkpPDAmJmEucHVzaChpKX0pLHtiYXNlQXhlczpvLG90aGVyQXhlczphfX07dmFyIFptPVsieEF4aXMiLCJ5QXhpcyJdO2Z1bmN0aW9uIFVtKGUpe3JldHVybiBOKFptLGZ1bmN0aW9uKHQpe3JldHVybiBlLmdldFJlZmVycmluZ0NvbXBvbmVudHModClbMF19KX1mdW5jdGlvbiBYbSh0KXtyZXR1cm4iY2FydGVzaWFuMmQiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKX1HbS5jcmVhdGU9ZnVuY3Rpb24obixvKXt2YXIgYT1bXTtyZXR1cm4gbi5lYWNoQ29tcG9uZW50KCJncmlkIixmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBHbSh0LG4sbyk7aS5uYW1lPSJncmlkXyIrZSxpLnJlc2l6ZSh0LG8sITApLHQuY29vcmRpbmF0ZVN5c3RlbT1pLGEucHVzaChpKX0pLG4uZWFjaFNlcmllcyhmdW5jdGlvbih0KXtpZihYbSh0KSl7dmFyIGU9VW0odCksaT1lWzBdLG49ZVsxXSxvPWkuZ2V0Q29vcmRTeXNNb2RlbCgpLmNvb3JkaW5hdGVTeXN0ZW07dC5jb29yZGluYXRlU3lzdGVtPW8uZ2V0Q2FydGVzaWFuKGkuY29tcG9uZW50SW5kZXgsbi5jb21wb25lbnRJbmRleCl9fSksYX0sR20uZGltZW5zaW9ucz1HbS5wcm90b3R5cGUuZGltZW5zaW9ucz1MbS5wcm90b3R5cGUuZGltZW5zaW9ucyxuaC5yZWdpc3RlcigiY2FydGVzaWFuMmQiLEdtKTtmdW5jdGlvbiBZbSh0LGUpe3RoaXMub3B0PWUsdGhpcy5heGlzTW9kZWw9dCxDKGUse2xhYmVsT2Zmc2V0OjAsbmFtZURpcmVjdGlvbjoxLHRpY2tEaXJlY3Rpb246MSxsYWJlbERpcmVjdGlvbjoxLHNpbGVudDohMH0pLHRoaXMuZ3JvdXA9bmV3IElpO3ZhciBpPW5ldyBJaSh7cG9zaXRpb246ZS5wb3NpdGlvbi5zbGljZSgpLHJvdGF0aW9uOmUucm90YXRpb259KTtpLnVwZGF0ZVRyYW5zZm9ybSgpLHRoaXMuX3RyYW5zZm9ybT1pLnRyYW5zZm9ybSx0aGlzLl9kdW1iR3JvdXA9aX12YXIgam09TWF0aC5QSTtZbS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlltLGhhc0J1aWxkZXI6ZnVuY3Rpb24odCl7cmV0dXJuISFxbVt0XX0sYWRkOmZ1bmN0aW9uKHQpe3FtW3RdLmNhbGwodGhpcyl9LGdldEdyb3VwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JvdXB9fTt2YXIgcW09e2F4aXNMaW5lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHQsdD10aGlzLmF4aXNNb2RlbDtpZih0LmdldCgiYXhpc0xpbmUuc2hvdyIpKXt2YXIgZT10aGlzLmF4aXNNb2RlbC5heGlzLmdldEV4dGVudCgpLGk9dGhpcy5fdHJhbnNmb3JtLHI9W2VbMF0sMF0sbj1bZVsxXSwwXTtpJiYoYnQocixyLGkpLGJ0KG4sbixpKSk7dmFyIHM9TCh7bGluZUNhcDoicm91bmQifSx0LmdldE1vZGVsKCJheGlzTGluZS5saW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSk7dGhpcy5ncm91cC5hZGQobmV3IG9zKHthbmlkOiJsaW5lIixzdWJQaXhlbE9wdGltaXplOiEwLHNoYXBlOnt4MTpyWzBdLHkxOnJbMV0seDI6blswXSx5MjpuWzFdfSxzdHlsZTpzLHN0cm9rZUNvbnRhaW5UaHJlc2hvbGQ6YS5zdHJva2VDb250YWluVGhyZXNob2xkfHw1LHNpbGVudDohMCx6MjoxfSkpO3ZhciBsPXQuZ2V0KCJheGlzTGluZS5zeW1ib2wiKSxvPXQuZ2V0KCJheGlzTGluZS5zeW1ib2xTaXplIiksdT10LmdldCgiYXhpc0xpbmUuc3ltYm9sT2Zmc2V0Iil8fDA7aWYoIm51bWJlciI9PXR5cGVvZiB1JiYodT1bdSx1XSksbnVsbCE9bCl7InN0cmluZyI9PXR5cGVvZiBsJiYobD1bbCxsXSksInN0cmluZyIhPXR5cGVvZiBvJiYibnVtYmVyIiE9dHlwZW9mIG98fChvPVtvLG9dKTt2YXIgaD1vWzBdLGM9b1sxXTtFKFt7cm90YXRlOmEucm90YXRpb24rTWF0aC5QSS8yLG9mZnNldDp1WzBdLHI6MH0se3JvdGF0ZTphLnJvdGF0aW9uLU1hdGguUEkvMixvZmZzZXQ6dVsxXSxyOk1hdGguc3FydCgoclswXS1uWzBdKSooclswXS1uWzBdKSsoclsxXS1uWzFdKSooclsxXS1uWzFdKSl9XSxmdW5jdGlvbih0LGUpe2lmKCJub25lIiE9PWxbZV0mJm51bGwhPWxbZV0pe3ZhciBpPW1nKGxbZV0sLWgvMiwtYy8yLGgsYyxzLnN0cm9rZSwhMCksbj10LnIrdC5vZmZzZXQsbz1bclswXStuKk1hdGguY29zKGEucm90YXRpb24pLHJbMV0tbipNYXRoLnNpbihhLnJvdGF0aW9uKV07aS5hdHRyKHtyb3RhdGlvbjp0LnJvdGF0ZSxwb3NpdGlvbjpvLHNpbGVudDohMCx6MjoxMX0pLHRoaXMuZ3JvdXAuYWRkKGkpfX0sdGhpcyl9fX0sYXhpc1RpY2tMYWJlbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYXhpc01vZGVsLGU9dGhpcy5vcHQsaT1mdW5jdGlvbih0LGUsaSl7dmFyIG49ZS5heGlzLG89ZS5nZXRNb2RlbCgiYXhpc1RpY2siKTtpZighby5nZXQoInNob3ciKXx8bi5zY2FsZS5pc0JsYW5rKCkpcmV0dXJuO2Zvcih2YXIgYT1vLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxyPWkudGlja0RpcmVjdGlvbipvLmdldCgibGVuZ3RoIikscz1pdihuLmdldFRpY2tzQ29vcmRzKCksdC5fdHJhbnNmb3JtLHIsQyhhLmdldExpbmVTdHlsZSgpLHtzdHJva2U6ZS5nZXQoImF4aXNMaW5lLmxpbmVTdHlsZS5jb2xvciIpfSksInRpY2tzIiksbD0wO2w8cy5sZW5ndGg7bCsrKXQuZ3JvdXAuYWRkKHNbbF0pO3JldHVybiBzfSh0aGlzLHQsZSk7IWZ1bmN0aW9uKHQsZSxpKXtpZihyZyh0LmF4aXMpKXJldHVybjt2YXIgbj10LmdldCgiYXhpc0xhYmVsLnNob3dNaW5MYWJlbCIpLG89dC5nZXQoImF4aXNMYWJlbC5zaG93TWF4TGFiZWwiKTtpPWl8fFtdO3ZhciBhPShlPWV8fFtdKVswXSxyPWVbMV0scz1lW2UubGVuZ3RoLTFdLGw9ZVtlLmxlbmd0aC0yXSx1PWlbMF0saD1pWzFdLGM9aVtpLmxlbmd0aC0xXSxkPWlbaS5sZW5ndGgtMl07ITE9PT1uPyhRbShhKSxRbSh1KSk6dHYoYSxyKSYmKG4/KFFtKHIpLFFtKGgpKTooUW0oYSksUW0odSkpKTshMT09PW8/KFFtKHMpLFFtKGMpKTp0dihsLHMpJiYobz8oUW0obCksUW0oZCkpOihRbShzKSxRbShjKSkpfSh0LGZ1bmN0aW9uKHUsaCxjKXt2YXIgZD1oLmF4aXM7aWYoIVcoYy5heGlzTGFiZWxTaG93LGguZ2V0KCJheGlzTGFiZWwuc2hvdyIpKXx8ZC5zY2FsZS5pc0JsYW5rKCkpcmV0dXJuO3ZhciBmPWguZ2V0TW9kZWwoImF4aXNMYWJlbCIpLHA9Zi5nZXQoIm1hcmdpbiIpLHQ9ZC5nZXRWaWV3TGFiZWxzKCksZT0oVyhjLmxhYmVsUm90YXRlLGYuZ2V0KCJyb3RhdGUiKSl8fDApKmptLzE4MCxnPSRtKGMucm90YXRpb24sZSxjLmxhYmVsRGlyZWN0aW9uKSxtPWguZ2V0Q2F0ZWdvcmllcyYmaC5nZXRDYXRlZ29yaWVzKCEwKSx2PVtdLHk9Sm0oaCkseD1oLmdldCgidHJpZ2dlckV2ZW50Iik7cmV0dXJuIEUodCxmdW5jdGlvbih0LGUpe3ZhciBpPXQudGlja1ZhbHVlLG49dC5mb3JtYXR0ZWRMYWJlbCxvPXQucmF3TGFiZWwsYT1mO20mJm1baV0mJm1baV0udGV4dFN0eWxlJiYoYT1uZXcgSWwobVtpXS50ZXh0U3R5bGUsZixoLmVjTW9kZWwpKTt2YXIgcj1hLmdldFRleHRDb2xvcigpfHxoLmdldCgiYXhpc0xpbmUubGluZVN0eWxlLmNvbG9yIikscz1bZC5kYXRhVG9Db29yZChpKSxjLmxhYmVsT2Zmc2V0K2MubGFiZWxEaXJlY3Rpb24qcF0sbD1uZXcgRnIoe2FuaWQ6ImxhYmVsXyIraSxwb3NpdGlvbjpzLHJvdGF0aW9uOmcucm90YXRpb24sc2lsZW50OnksejI6MTB9KTtRcyhsLnN0eWxlLGEse3RleHQ6bix0ZXh0QWxpZ246YS5nZXRTaGFsbG93KCJhbGlnbiIsITApfHxnLnRleHRBbGlnbix0ZXh0VmVydGljYWxBbGlnbjphLmdldFNoYWxsb3coInZlcnRpY2FsQWxpZ24iLCEwKXx8YS5nZXRTaGFsbG93KCJiYXNlbGluZSIsITApfHxnLnRleHRWZXJ0aWNhbEFsaWduLHRleHRGaWxsOiJmdW5jdGlvbiI9PXR5cGVvZiByP3IoImNhdGVnb3J5Ij09PWQudHlwZT9vOiJ2YWx1ZSI9PT1kLnR5cGU/aSsiIjppLGUpOnJ9KSx4JiYobC5ldmVudERhdGE9S20oaCksbC5ldmVudERhdGEudGFyZ2V0VHlwZT0iYXhpc0xhYmVsIixsLmV2ZW50RGF0YS52YWx1ZT1vKSx1Ll9kdW1iR3JvdXAuYWRkKGwpLGwudXBkYXRlVHJhbnNmb3JtKCksdi5wdXNoKGwpLHUuZ3JvdXAuYWRkKGwpLGwuZGVjb21wb3NlVHJhbnNmb3JtKCl9KSx2fSh0aGlzLHQsZSksaSksZnVuY3Rpb24odCxlLGkpe3ZhciBuPWUuYXhpcyxvPWUuZ2V0TW9kZWwoIm1pbm9yVGljayIpO2lmKCFvLmdldCgic2hvdyIpfHxuLnNjYWxlLmlzQmxhbmsoKSlyZXR1cm47dmFyIGE9bi5nZXRNaW5vclRpY2tzQ29vcmRzKCk7aWYoIWEubGVuZ3RoKXJldHVybjtmb3IodmFyIHI9by5nZXRNb2RlbCgibGluZVN0eWxlIikscz1pLnRpY2tEaXJlY3Rpb24qby5nZXQoImxlbmd0aCIpLGw9QyhyLmdldExpbmVTdHlsZSgpLEMoZS5nZXRNb2RlbCgiYXhpc1RpY2siKS5nZXRMaW5lU3R5bGUoKSx7c3Ryb2tlOmUuZ2V0KCJheGlzTGluZS5saW5lU3R5bGUuY29sb3IiKX0pKSx1PTA7dTxhLmxlbmd0aDt1KyspZm9yKHZhciBoPWl2KGFbdV0sdC5fdHJhbnNmb3JtLHMsbCwibWlub3J0aWNrc18iK3UpLGM9MDtjPGgubGVuZ3RoO2MrKyl0Lmdyb3VwLmFkZChoW2NdKX0odGhpcyx0LGUpfSxheGlzTmFtZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0LGU9dGhpcy5heGlzTW9kZWwsaT1XKHQuYXhpc05hbWUsZS5nZXQoIm5hbWUiKSk7aWYoaSl7dmFyIG4sbyxhPWUuZ2V0KCJuYW1lTG9jYXRpb24iKSxyPXQubmFtZURpcmVjdGlvbixzPWUuZ2V0TW9kZWwoIm5hbWVUZXh0U3R5bGUiKSxsPWUuZ2V0KCJuYW1lR2FwIil8fDAsdT10aGlzLmF4aXNNb2RlbC5heGlzLmdldEV4dGVudCgpLGg9dVswXT51WzFdPy0xOjEsYz1bInN0YXJ0Ij09PWE/dVswXS1oKmw6ImVuZCI9PT1hP3VbMV0raCpsOih1WzBdK3VbMV0pLzIsZXYoYSk/dC5sYWJlbE9mZnNldCtyKmw6MF0sZD1lLmdldCgibmFtZVJvdGF0ZSIpO251bGwhPWQmJihkPWQqam0vMTgwKSxldihhKT9uPSRtKHQucm90YXRpb24sbnVsbCE9ZD9kOnQucm90YXRpb24scik6KG49ZnVuY3Rpb24odCxlLGksbil7dmFyIG8sYSxyPUdsKGktdC5yb3RhdGlvbikscz1uWzBdPm5bMV0sbD0ic3RhcnQiPT09ZSYmIXN8fCJzdGFydCIhPT1lJiZzO289Rmwoci1qbS8yKT8oYT1sPyJib3R0b20iOiJ0b3AiLCJjZW50ZXIiKTpGbChyLTEuNSpqbSk/KGE9bD8idG9wIjoiYm90dG9tIiwiY2VudGVyIik6KGE9Im1pZGRsZSIscjwxLjUqam0mJmptLzI8cj9sPyJsZWZ0IjoicmlnaHQiOmw/InJpZ2h0IjoibGVmdCIpO3JldHVybntyb3RhdGlvbjpyLHRleHRBbGlnbjpvLHRleHRWZXJ0aWNhbEFsaWduOmF9fSh0LGEsZHx8MCx1KSxudWxsIT0obz10LmF4aXNOYW1lQXZhaWxhYmxlV2lkdGgpJiYobz1NYXRoLmFicyhvL01hdGguc2luKG4ucm90YXRpb24pKSxpc0Zpbml0ZShvKXx8KG89bnVsbCkpKTt2YXIgZj1zLmdldEZvbnQoKSxwPWUuZ2V0KCJuYW1lVHJ1bmNhdGUiLCEwKXx8e30sZz1wLmVsbGlwc2lzLG09Vyh0Lm5hbWVUcnVuY2F0ZU1heFdpZHRoLHAubWF4V2lkdGgsbyksdj1udWxsIT1nJiZudWxsIT1tP2h1KGksbSxmLGcse21pbkNoYXI6MixwbGFjZWhvbGRlcjpwLnBsYWNlaG9sZGVyfSk6aSx5PWUuZ2V0KCJ0b29sdGlwIiwhMCkseD1lLm1haW5UeXBlLF89e2NvbXBvbmVudFR5cGU6eCxuYW1lOmksJHZhcnM6WyJuYW1lIl19O19beCsiSW5kZXgiXT1lLmNvbXBvbmVudEluZGV4O3ZhciB3PW5ldyBGcih7YW5pZDoibmFtZSIsX19mdWxsVGV4dDppLF9fdHJ1bmNhdGVkVGV4dDp2LHBvc2l0aW9uOmMscm90YXRpb246bi5yb3RhdGlvbixzaWxlbnQ6Sm0oZSksejI6MSx0b29sdGlwOnkmJnkuc2hvdz9MKHtjb250ZW50OmksZm9ybWF0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGZvcm1hdHRlclBhcmFtczpffSx5KTpudWxsfSk7UXMody5zdHlsZSxzLHt0ZXh0OnYsdGV4dEZvbnQ6Zix0ZXh0RmlsbDpzLmdldFRleHRDb2xvcigpfHxlLmdldCgiYXhpc0xpbmUubGluZVN0eWxlLmNvbG9yIiksdGV4dEFsaWduOnMuZ2V0KCJhbGlnbiIpfHxuLnRleHRBbGlnbix0ZXh0VmVydGljYWxBbGlnbjpzLmdldCgidmVydGljYWxBbGlnbiIpfHxuLnRleHRWZXJ0aWNhbEFsaWdufSksZS5nZXQoInRyaWdnZXJFdmVudCIpJiYody5ldmVudERhdGE9S20oZSksdy5ldmVudERhdGEudGFyZ2V0VHlwZT0iYXhpc05hbWUiLHcuZXZlbnREYXRhLm5hbWU9aSksdGhpcy5fZHVtYkdyb3VwLmFkZCh3KSx3LnVwZGF0ZVRyYW5zZm9ybSgpLHRoaXMuZ3JvdXAuYWRkKHcpLHcuZGVjb21wb3NlVHJhbnNmb3JtKCl9fX0sS209WW0ubWFrZUF4aXNFdmVudERhdGFCYXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXtjb21wb25lbnRUeXBlOnQubWFpblR5cGUsY29tcG9uZW50SW5kZXg6dC5jb21wb25lbnRJbmRleH07cmV0dXJuIGVbdC5tYWluVHlwZSsiSW5kZXgiXT10LmNvbXBvbmVudEluZGV4LGV9LCRtPVltLmlubmVyVGV4dExheW91dD1mdW5jdGlvbih0LGUsaSl7dmFyIG4sbz1HbChlLXQpO3JldHVybntyb3RhdGlvbjpvLHRleHRBbGlnbjpGbChvKT8obj0wPGk/InRvcCI6ImJvdHRvbSIsImNlbnRlciIpOkZsKG8tam0pPyhuPTA8aT8iYm90dG9tIjoidG9wIiwiY2VudGVyIik6KG49Im1pZGRsZSIsMDxvJiZvPGptPzA8aT8icmlnaHQiOiJsZWZ0IjowPGk/ImxlZnQiOiJyaWdodCIpLHRleHRWZXJ0aWNhbEFsaWduOm59fTt2YXIgSm09WW0uaXNMYWJlbFNpbGVudD1mdW5jdGlvbih0KXt2YXIgZT10LmdldCgidG9vbHRpcCIpO3JldHVybiB0LmdldCgic2lsZW50Iil8fCEodC5nZXQoInRyaWdnZXJFdmVudCIpfHxlJiZlLnNob3cpfTtmdW5jdGlvbiBRbSh0KXt0JiYodC5pZ25vcmU9ITApfWZ1bmN0aW9uIHR2KHQsZSl7dmFyIGk9dCYmdC5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpLG49ZSYmZS5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpO2lmKGkmJm4pe3ZhciBvPWllKFtdKTtyZXR1cm4gcmUobyxvLC10LnJvdGF0aW9uKSxpLmFwcGx5VHJhbnNmb3JtKG9lKFtdLG8sdC5nZXRMb2NhbFRyYW5zZm9ybSgpKSksbi5hcHBseVRyYW5zZm9ybShvZShbXSxvLGUuZ2V0TG9jYWxUcmFuc2Zvcm0oKSkpLGkuaW50ZXJzZWN0KG4pfX1mdW5jdGlvbiBldih0KXtyZXR1cm4ibWlkZGxlIj09PXR8fCJjZW50ZXIiPT09dH1mdW5jdGlvbiBpdih0LGUsaSxuLG8pe2Zvcih2YXIgYT1bXSxyPVtdLHM9W10sbD0wO2w8dC5sZW5ndGg7bCsrKXt2YXIgdT10W2xdLmNvb3JkO3JbMF09dSxzW3JbMV09MF09dSxzWzFdPWksZSYmKGJ0KHIscixlKSxidChzLHMsZSkpO3ZhciBoPW5ldyBvcyh7YW5pZDpvKyJfIit0W2xdLnRpY2tWYWx1ZSxzdWJQaXhlbE9wdGltaXplOiEwLHNoYXBlOnt4MTpyWzBdLHkxOnJbMV0seDI6c1swXSx5MjpzWzFdfSxzdHlsZTpuLHoyOjIsc2lsZW50OiEwfSk7YS5wdXNoKGgpfXJldHVybiBhfXZhciBudj1FLG92PVQ7ZnVuY3Rpb24gYXYodCxlKXt2YXIgaT17YXhlc0luZm86e30sc2VyaWVzSW52b2x2ZWQ6ITEsY29vcmRTeXNBeGVzSW5mbzp7fSxjb29yZFN5c01hcDp7fX07cmV0dXJuIGZ1bmN0aW9uKHAsZyx0KXt2YXIgYT1nLmdldENvbXBvbmVudCgidG9vbHRpcCIpLG09Zy5nZXRDb21wb25lbnQoImF4aXNQb2ludGVyIiksdj1tLmdldCgibGluayIsITApfHxbXSx5PVtdO252KHQuZ2V0Q29vcmRpbmF0ZVN5c3RlbXMoKSxmdW5jdGlvbihjKXtpZihjLmF4aXNQb2ludGVyRW5hYmxlZCl7dmFyIHQ9dXYoYy5tb2RlbCksZD1wLmNvb3JkU3lzQXhlc0luZm9bdF09e30sZj0ocC5jb29yZFN5c01hcFt0XT1jKS5tb2RlbC5nZXRNb2RlbCgidG9vbHRpcCIsYSk7aWYobnYoYy5nZXRBeGVzKCksb3YobywhMSxudWxsKSksYy5nZXRUb29sdGlwQXhlcyYmYSYmZi5nZXQoInNob3ciKSl7dmFyIGU9ImF4aXMiPT09Zi5nZXQoInRyaWdnZXIiKSxpPSJjcm9zcyI9PT1mLmdldCgiYXhpc1BvaW50ZXIudHlwZSIpLG49Yy5nZXRUb29sdGlwQXhlcyhmLmdldCgiYXhpc1BvaW50ZXIuYXhpcyIpKTsoZXx8aSkmJm52KG4uYmFzZUF4ZXMsb3YobywhaXx8ImNyb3NzIixlKSksaSYmbnYobi5vdGhlckF4ZXMsb3YobywiY3Jvc3MiLCExKSl9fWZ1bmN0aW9uIG8odCxlLGkpe3ZhciBuPWkubW9kZWwuZ2V0TW9kZWwoImF4aXNQb2ludGVyIixtKSxvPW4uZ2V0KCJzaG93Iik7aWYobyYmKCJhdXRvIiE9PW98fHR8fGx2KG4pKSl7bnVsbD09ZSYmKGU9bi5nZXQoInRyaWdnZXJUb29sdGlwIikpO3ZhciBhPShuPXQ/ZnVuY3Rpb24odCxlLGksbixvLGEpe3ZhciByPWUuZ2V0TW9kZWwoImF4aXNQb2ludGVyIikscz17fTtudihbInR5cGUiLCJzbmFwIiwibGluZVN0eWxlIiwic2hhZG93U3R5bGUiLCJsYWJlbCIsImFuaW1hdGlvbiIsImFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlIiwiYW5pbWF0aW9uRWFzaW5nVXBkYXRlIiwieiJdLGZ1bmN0aW9uKHQpe3NbdF09RChyLmdldCh0KSl9KSxzLnNuYXA9ImNhdGVnb3J5IiE9PXQudHlwZSYmISFhLCJjcm9zcyI9PT1yLmdldCgidHlwZSIpJiYocy50eXBlPSJsaW5lIik7dmFyIGw9cy5sYWJlbHx8KHMubGFiZWw9e30pO2lmKG51bGw9PWwuc2hvdyYmKGwuc2hvdz0hMSksImNyb3NzIj09PW8pe3ZhciB1PXIuZ2V0KCJsYWJlbC5zaG93Iik7aWYobC5zaG93PW51bGw9PXV8fHUsIWEpe3ZhciBoPXMubGluZVN0eWxlPXIuZ2V0KCJjcm9zc1N0eWxlIik7aCYmQyhsLGgudGV4dFN0eWxlKX19cmV0dXJuIHQubW9kZWwuZ2V0TW9kZWwoImF4aXNQb2ludGVyIixuZXcgSWwocyxpLG4pKX0oaSxmLG0sZyx0LGUpOm4pLmdldCgic25hcCIpLHI9dXYoaS5tb2RlbCkscz1lfHxhfHwiY2F0ZWdvcnkiPT09aS50eXBlLGw9cC5heGVzSW5mb1tyXT17a2V5OnIsYXhpczppLGNvb3JkU3lzOmMsYXhpc1BvaW50ZXJNb2RlbDpuLHRyaWdnZXJUb29sdGlwOmUsaW52b2x2ZVNlcmllczpzLHNuYXA6YSx1c2VIYW5kbGU6bHYobiksc2VyaWVzTW9kZWxzOltdfTtkW3JdPWwscC5zZXJpZXNJbnZvbHZlZHw9czt2YXIgdT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1lLm1vZGVsLG49ZS5kaW0sbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT10W29dfHx7fTtpZihydihhW24rIkF4aXNJZCJdLGkuaWQpfHxydihhW24rIkF4aXNJbmRleCJdLGkuY29tcG9uZW50SW5kZXgpfHxydihhW24rIkF4aXNOYW1lIl0saS5uYW1lKSlyZXR1cm4gb319KHYsaSk7aWYobnVsbCE9dSl7dmFyIGg9eVt1XXx8KHlbdV09e2F4ZXNJbmZvOnt9fSk7aC5heGVzSW5mb1tyXT1sLGgubWFwcGVyPXZbdV0ubWFwcGVyLGwubGlua0dyb3VwPWh9fX19KX0oaSx0LGUpLGkuc2VyaWVzSW52b2x2ZWQmJmZ1bmN0aW9uKG8sdCl7dC5lYWNoU2VyaWVzKGZ1bmN0aW9uKGkpe3ZhciBuPWkuY29vcmRpbmF0ZVN5c3RlbSx0PWkuZ2V0KCJ0b29sdGlwLnRyaWdnZXIiLCEwKSxlPWkuZ2V0KCJ0b29sdGlwLnNob3ciLCEwKTtuJiYibm9uZSIhPT10JiYhMSE9PXQmJiJpdGVtIiE9PXQmJiExIT09ZSYmITEhPT1pLmdldCgiYXhpc1BvaW50ZXIuc2hvdyIsITApJiZudihvLmNvb3JkU3lzQXhlc0luZm9bdXYobi5tb2RlbCldLGZ1bmN0aW9uKHQpe3ZhciBlPXQuYXhpcztuLmdldEF4aXMoZS5kaW0pPT09ZSYmKHQuc2VyaWVzTW9kZWxzLnB1c2goaSksbnVsbD09dC5zZXJpZXNEYXRhQ291bnQmJih0LnNlcmllc0RhdGFDb3VudD0wKSx0LnNlcmllc0RhdGFDb3VudCs9aS5nZXREYXRhKCkuY291bnQoKSl9KX0sdGhpcyl9KGksdCksaX1mdW5jdGlvbiBydih0LGUpe3JldHVybiJhbGwiPT09dHx8ayh0KSYmMDw9Xyh0LGUpfHx0PT09ZX1mdW5jdGlvbiBzdih0KXt2YXIgZT0odC5lY01vZGVsLmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKXx8e30pLmNvb3JkU3lzQXhlc0luZm87cmV0dXJuIGUmJmUuYXhlc0luZm9bdXYodCldfWZ1bmN0aW9uIGx2KHQpe3JldHVybiEhdC5nZXQoImhhbmRsZS5zaG93Iil9ZnVuY3Rpb24gdXYodCl7cmV0dXJuIHQudHlwZSsifHwiK3QuaWR9dmFyIGh2PWJmKHt0eXBlOiJheGlzIixfYXhpc1BvaW50ZXI6bnVsbCxheGlzUG9pbnRlckNsYXNzOm51bGwscmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuYXhpc1BvaW50ZXJDbGFzcyYmZnVuY3Rpb24odCl7dmFyIGU9c3YodCk7aWYoZSl7dmFyIGk9ZS5heGlzUG9pbnRlck1vZGVsLG49ZS5heGlzLnNjYWxlLG89aS5vcHRpb24sYT1pLmdldCgic3RhdHVzIikscj1pLmdldCgidmFsdWUiKTtudWxsIT1yJiYocj1uLnBhcnNlKHIpKTt2YXIgcz1sdihpKTtudWxsPT1hJiYoby5zdGF0dXM9cz8ic2hvdyI6ImhpZGUiKTt2YXIgbD1uLmdldEV4dGVudCgpLnNsaWNlKCk7bFswXT5sWzFdJiZsLnJldmVyc2UoKSwobnVsbD09cnx8cj5sWzFdKSYmKHI9bFsxXSkscjxsWzBdJiYocj1sWzBdKSxvLnZhbHVlPXIscyYmKG8uc3RhdHVzPWUuYXhpcy5zY2FsZS5pc0JsYW5rKCk/ImhpZGUiOiJzaG93Iil9fSh0KSxodi5zdXBlckFwcGx5KHRoaXMsInJlbmRlciIsYXJndW1lbnRzKSxjdih0aGlzLHQsZSxpLG4sITApfSx1cGRhdGVBeGlzUG9pbnRlcjpmdW5jdGlvbih0LGUsaSxuLG8pe2N2KHRoaXMsdCxlLGksbiwhMSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2F4aXNQb2ludGVyO2kmJmkucmVtb3ZlKGUpLGh2LnN1cGVyQXBwbHkodGhpcywicmVtb3ZlIixhcmd1bWVudHMpfSxkaXNwb3NlOmZ1bmN0aW9uKHQsZSl7ZHYodGhpcyxlKSxodi5zdXBlckFwcGx5KHRoaXMsImRpc3Bvc2UiLGFyZ3VtZW50cyl9fSk7ZnVuY3Rpb24gY3YodCxlLGksbixvLGEpe3ZhciByPWh2LmdldEF4aXNQb2ludGVyQ2xhc3ModC5heGlzUG9pbnRlckNsYXNzKTtpZihyKXt2YXIgcz1mdW5jdGlvbih0KXt2YXIgZT1zdih0KTtyZXR1cm4gZSYmZS5heGlzUG9pbnRlck1vZGVsfShlKTtzPyh0Ll9heGlzUG9pbnRlcnx8KHQuX2F4aXNQb2ludGVyPW5ldyByKSkucmVuZGVyKGUscyxuLGEpOmR2KHQsbil9fWZ1bmN0aW9uIGR2KHQsZSxpKXt2YXIgbj10Ll9heGlzUG9pbnRlcjtuJiZuLmRpc3Bvc2UoZSxpKSx0Ll9heGlzUG9pbnRlcj1udWxsfXZhciBmdj1bXTtmdW5jdGlvbiBwdih0LGUsaSl7aT1pfHx7fTt2YXIgbj10LmNvb3JkaW5hdGVTeXN0ZW0sbz1lLmF4aXMsYT17fSxyPW8uZ2V0QXhlc09uWmVyb09mKClbMF0scz1vLnBvc2l0aW9uLGw9cj8ib25aZXJvIjpzLHU9by5kaW0saD1uLmdldFJlY3QoKSxjPVtoLngsaC54K2gud2lkdGgsaC55LGgueStoLmhlaWdodF0sZD17bGVmdDowLHJpZ2h0OjEsdG9wOjAsYm90dG9tOjEsb25aZXJvOjJ9LGY9ZS5nZXQoIm9mZnNldCIpfHwwLHA9IngiPT09dT9bY1syXS1mLGNbM10rZl06W2NbMF0tZixjWzFdK2ZdO2lmKHIpe3ZhciBnPXIudG9HbG9iYWxDb29yZChyLmRhdGFUb0Nvb3JkKDApKTtwW2Qub25aZXJvXT1NYXRoLm1heChNYXRoLm1pbihnLHBbMV0pLHBbMF0pfWEucG9zaXRpb249WyJ5Ij09PXU/cFtkW2xdXTpjWzBdLCJ4Ij09PXU/cFtkW2xdXTpjWzNdXSxhLnJvdGF0aW9uPU1hdGguUEkvMiooIngiPT09dT8wOjEpO2EubGFiZWxEaXJlY3Rpb249YS50aWNrRGlyZWN0aW9uPWEubmFtZURpcmVjdGlvbj17dG9wOi0xLGJvdHRvbToxLGxlZnQ6LTEscmlnaHQ6MX1bc10sYS5sYWJlbE9mZnNldD1yP3BbZFtzXV0tcFtkLm9uWmVyb106MCxlLmdldCgiYXhpc1RpY2suaW5zaWRlIikmJihhLnRpY2tEaXJlY3Rpb249LWEudGlja0RpcmVjdGlvbiksVyhpLmxhYmVsSW5zaWRlLGUuZ2V0KCJheGlzTGFiZWwuaW5zaWRlIikpJiYoYS5sYWJlbERpcmVjdGlvbj0tYS5sYWJlbERpcmVjdGlvbik7dmFyIG09ZS5nZXQoImF4aXNMYWJlbC5yb3RhdGUiKTtyZXR1cm4gYS5sYWJlbFJvdGF0ZT0idG9wIj09PWw/LW06bSxhLnoyPTEsYX1odi5yZWdpc3RlckF4aXNQb2ludGVyQ2xhc3M9ZnVuY3Rpb24odCxlKXtmdlt0XT1lfSxodi5nZXRBeGlzUG9pbnRlckNsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZmdlt0XX07dmFyIGd2PVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSxtdj1bInNwbGl0QXJlYSIsInNwbGl0TGluZSIsIm1pbm9yU3BsaXRMaW5lIl0sdnY9aHYuZXh0ZW5kKHt0eXBlOiJjYXJ0ZXNpYW5BeGlzIixheGlzUG9pbnRlckNsYXNzOiJDYXJ0ZXNpYW5BeGlzUG9pbnRlciIscmVuZGVyOmZ1bmN0aW9uKGUsdCxpLG4pe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIG89dGhpcy5fYXhpc0dyb3VwO2lmKHRoaXMuX2F4aXNHcm91cD1uZXcgSWksdGhpcy5ncm91cC5hZGQodGhpcy5fYXhpc0dyb3VwKSxlLmdldCgic2hvdyIpKXt2YXIgYT1lLmdldENvb3JkU3lzTW9kZWwoKSxyPXB2KGEsZSkscz1uZXcgWW0oZSxyKTtFKGd2LHMuYWRkLHMpLHRoaXMuX2F4aXNHcm91cC5hZGQocy5nZXRHcm91cCgpKSxFKG12LGZ1bmN0aW9uKHQpe2UuZ2V0KHQrIi5zaG93IikmJnRoaXNbIl8iK3RdKGUsYSl9LHRoaXMpLGRsKG8sdGhpcy5fYXhpc0dyb3VwLGUpLHZ2LnN1cGVyQ2FsbCh0aGlzLCJyZW5kZXIiLGUsdCxpLG4pfX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fc3BsaXRBcmVhQ29sb3JzPW51bGx9LF9zcGxpdExpbmU6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmF4aXM7aWYoIWkuc2NhbGUuaXNCbGFuaygpKXt2YXIgbj10LmdldE1vZGVsKCJzcGxpdExpbmUiKSxvPW4uZ2V0TW9kZWwoImxpbmVTdHlsZSIpLGE9by5nZXQoImNvbG9yIik7YT1rKGEpP2E6W2FdO2Zvcih2YXIgcj1lLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0UmVjdCgpLHM9aS5pc0hvcml6b250YWwoKSxsPTAsdT1pLmdldFRpY2tzQ29vcmRzKHt0aWNrTW9kZWw6bn0pLGg9W10sYz1bXSxkPW8uZ2V0TGluZVN0eWxlKCksZj0wO2Y8dS5sZW5ndGg7ZisrKXt2YXIgcD1pLnRvR2xvYmFsQ29vcmQodVtmXS5jb29yZCk7cz8oaFswXT1wLGhbMV09ci55LGNbMF09cCxjWzFdPXIueStyLmhlaWdodCk6KGhbMF09ci54LGhbMV09cCxjWzBdPXIueCtyLndpZHRoLGNbMV09cCk7dmFyIGc9bCsrJWEubGVuZ3RoLG09dVtmXS50aWNrVmFsdWU7dGhpcy5fYXhpc0dyb3VwLmFkZChuZXcgb3Moe2FuaWQ6bnVsbCE9bT8ibGluZV8iK3VbZl0udGlja1ZhbHVlOm51bGwsc3ViUGl4ZWxPcHRpbWl6ZTohMCxzaGFwZTp7eDE6aFswXSx5MTpoWzFdLHgyOmNbMF0seTI6Y1sxXX0sc3R5bGU6Qyh7c3Ryb2tlOmFbZ119LGQpLHNpbGVudDohMH0pKX19fSxfbWlub3JTcGxpdExpbmU6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmF4aXMsbj10LmdldE1vZGVsKCJtaW5vclNwbGl0TGluZSIpLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxvPWUuY29vcmRpbmF0ZVN5c3RlbS5nZXRSZWN0KCksYT1pLmlzSG9yaXpvbnRhbCgpLHI9aS5nZXRNaW5vclRpY2tzQ29vcmRzKCk7aWYoci5sZW5ndGgpZm9yKHZhciBzPVtdLGw9W10sdT1uLmdldExpbmVTdHlsZSgpLGg9MDtoPHIubGVuZ3RoO2grKylmb3IodmFyIGM9MDtjPHJbaF0ubGVuZ3RoO2MrKyl7dmFyIGQ9aS50b0dsb2JhbENvb3JkKHJbaF1bY10uY29vcmQpO2E/KHNbMF09ZCxzWzFdPW8ueSxsWzBdPWQsbFsxXT1vLnkrby5oZWlnaHQpOihzWzBdPW8ueCxzWzFdPWQsbFswXT1vLngrby53aWR0aCxsWzFdPWQpLHRoaXMuX2F4aXNHcm91cC5hZGQobmV3IG9zKHthbmlkOiJtaW5vcl9saW5lXyIrcltoXVtjXS50aWNrVmFsdWUsc3ViUGl4ZWxPcHRpbWl6ZTohMCxzaGFwZTp7eDE6c1swXSx5MTpzWzFdLHgyOmxbMF0seTI6bFsxXX0sc3R5bGU6dSxzaWxlbnQ6ITB9KSl9fSxfc3BsaXRBcmVhOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5heGlzO2lmKCFpLnNjYWxlLmlzQmxhbmsoKSl7dmFyIG49dC5nZXRNb2RlbCgic3BsaXRBcmVhIiksbz1uLmdldE1vZGVsKCJhcmVhU3R5bGUiKSxhPW8uZ2V0KCJjb2xvciIpLHI9ZS5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKSxzPWkuZ2V0VGlja3NDb29yZHMoe3RpY2tNb2RlbDpuLGNsYW1wOiEwfSk7aWYocy5sZW5ndGgpe3ZhciBsPWEubGVuZ3RoLHU9dGhpcy5fc3BsaXRBcmVhQ29sb3JzLGg9USgpLGM9MDtpZih1KWZvcih2YXIgZD0wO2Q8cy5sZW5ndGg7ZCsrKXt2YXIgZj11LmdldChzW2RdLnRpY2tWYWx1ZSk7aWYobnVsbCE9Zil7Yz0oZisobC0xKSpkKSVsO2JyZWFrfX12YXIgcD1pLnRvR2xvYmFsQ29vcmQoc1swXS5jb29yZCksZz1vLmdldEFyZWFTdHlsZSgpO2E9ayhhKT9hOlthXTtmb3IoZD0xO2Q8cy5sZW5ndGg7ZCsrKXt2YXIgbSx2LHkseCxfPWkudG9HbG9iYWxDb29yZChzW2RdLmNvb3JkKTtwPWkuaXNIb3Jpem9udGFsKCk/KG09cCx2PXIueSx5PV8tbSx4PXIuaGVpZ2h0LG0reSk6KG09ci54LHY9cCx5PXIud2lkdGgsdisoeD1fLXYpKTt2YXIgdz1zW2QtMV0udGlja1ZhbHVlO251bGwhPXcmJmguc2V0KHcsYyksdGhpcy5fYXhpc0dyb3VwLmFkZChuZXcgaXMoe2FuaWQ6bnVsbCE9dz8iYXJlYV8iK3c6bnVsbCxzaGFwZTp7eDptLHk6dix3aWR0aDp5LGhlaWdodDp4fSxzdHlsZTpDKHtmaWxsOmFbY119LGcpLHNpbGVudDohMH0pKSxjPShjKzEpJWx9dGhpcy5fc3BsaXRBcmVhQ29sb3JzPWh9fX19KTt2di5leHRlbmQoe3R5cGU6InhBeGlzIn0pLHZ2LmV4dGVuZCh7dHlwZToieUF4aXMifSksYmYoe3R5cGU6ImdyaWQiLHJlbmRlcjpmdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciKSYmdGhpcy5ncm91cC5hZGQobmV3IGlzKHtzaGFwZTp0LmNvb3JkaW5hdGVTeXN0ZW0uZ2V0UmVjdCgpLHN0eWxlOkMoe2ZpbGw6dC5nZXQoImJhY2tncm91bmRDb2xvciIpfSx0LmdldEl0ZW1TdHlsZSgpKSxzaWxlbnQ6ITAsejI6LTF9KSl9fSksZmYoZnVuY3Rpb24odCl7dC54QXhpcyYmdC55QXhpcyYmIXQuZ3JpZCYmKHQuZ3JpZD17fSl9KSx5ZihNbSgibGluZSIsImNpcmNsZSIsImxpbmUiKSksdmYoSW0oImxpbmUiKSkscGYoSWQuUFJPQ0VTU09SLlNUQVRJU1RJQyx7c2VyaWVzVHlwZToibGluZSIsbW9kaWZ5T3V0cHV0RW5kOiEwLHJlc2V0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldERhdGEoKSxvPXQuZ2V0KCJzYW1wbGluZyIpLGE9dC5jb29yZGluYXRlU3lzdGVtO2lmKCJjYXJ0ZXNpYW4yZCI9PT1hLnR5cGUmJm8pe3ZhciByLHM9YS5nZXRCYXNlQXhpcygpLGw9YS5nZXRPdGhlckF4aXMocyksdT1zLmdldEV4dGVudCgpLGg9dVsxXS11WzBdLGM9TWF0aC5yb3VuZChuLmNvdW50KCkvaCk7MTxjJiYoInN0cmluZyI9PXR5cGVvZiBvP3I9QW1bb106ImZ1bmN0aW9uIj09dHlwZW9mIG8mJihyPW8pLHImJnQuc2V0RGF0YShuLmRvd25TYW1wbGUobi5tYXBEaW1lbnNpb24obC5kaW0pLDEvYyxyLFRtKSkpfX19KTt2YXIgeXY9aWMuZXh0ZW5kKHt0eXBlOiJzZXJpZXMuX19iYXNlX2Jhcl9fIixnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiBocCh0aGlzLmdldFNvdXJjZSgpLHRoaXMse3VzZUVuY29kZURlZmF1bHRlcjohMH0pfSxnZXRNYXJrZXJQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvb3JkaW5hdGVTeXN0ZW07aWYoZSl7dmFyIGk9ZS5kYXRhVG9Qb2ludChlLmNsYW1wRGF0YSh0KSksbj10aGlzLmdldERhdGEoKSxvPW4uZ2V0TGF5b3V0KCJvZmZzZXQiKSxhPW4uZ2V0TGF5b3V0KCJzaXplIik7cmV0dXJuIGlbZS5nZXRCYXNlQXhpcygpLmlzSG9yaXpvbnRhbCgpPzA6MV0rPW8rYS8yLGl9cmV0dXJuW05hTixOYU5dfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLGxlZ2VuZEhvdmVyTGluazohMCxiYXJNaW5IZWlnaHQ6MCxiYXJNaW5BbmdsZTowLGxhcmdlOiExLGxhcmdlVGhyZXNob2xkOjQwMCxwcm9ncmVzc2l2ZTozZTMscHJvZ3Jlc3NpdmVDaHVua01vZGU6Im1vZCIsaXRlbVN0eWxlOnt9LGVtcGhhc2lzOnt9fX0pO2Z1bmN0aW9uIHh2KHQsZSxpLG4sbyxhKXskcyh0LGUsaS5nZXRNb2RlbCgibGFiZWwiKSxpLmdldE1vZGVsKCJlbXBoYXNpcy5sYWJlbCIpLHtsYWJlbEZldGNoZXI6byxsYWJlbERhdGFJbmRleDphLGRlZmF1bHRUZXh0OkdnKG8uZ2V0RGF0YSgpLGEpLGlzUmVjdFRleHQ6ITAsYXV0b0NvbG9yOm59KSxfdih0KSxfdihlKX1mdW5jdGlvbiBfdih0LGUpeyJvdXRzaWRlIj09PXQudGV4dFBvc2l0aW9uJiYodC50ZXh0UG9zaXRpb249ZSl9eXYuZXh0ZW5kKHt0eXBlOiJzZXJpZXMuYmFyIixkZXBlbmRlbmNpZXM6WyJncmlkIiwicG9sYXIiXSxicnVzaFNlbGVjdG9yOiJyZWN0IixnZXRQcm9ncmVzc2l2ZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5nZXQoImxhcmdlIikmJnRoaXMuZ2V0KCJwcm9ncmVzc2l2ZSIpfSxnZXRQcm9ncmVzc2l2ZVRocmVzaG9sZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KCJwcm9ncmVzc2l2ZVRocmVzaG9sZCIpLGU9dGhpcy5nZXQoImxhcmdlVGhyZXNob2xkIik7cmV0dXJuIHQ8ZSYmKHQ9ZSksdH0sZGVmYXVsdE9wdGlvbjp7Y2xpcDohMCxyb3VuZENhcDohMX19KTt2YXIgd3Y9cmEoW1siZmlsbCIsImNvbG9yIl0sWyJzdHJva2UiLCJib3JkZXJDb2xvciJdLFsibGluZVdpZHRoIiwiYm9yZGVyV2lkdGgiXSxbInN0cm9rZSIsImJhckJvcmRlckNvbG9yIl0sWyJsaW5lV2lkdGgiLCJiYXJCb3JkZXJXaWR0aCJdLFsib3BhY2l0eSJdLFsic2hhZG93Qmx1ciJdLFsic2hhZG93T2Zmc2V0WCJdLFsic2hhZG93T2Zmc2V0WSJdLFsic2hhZG93Q29sb3IiXV0pLGJ2PXtnZXRCYXJJdGVtU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9d3YodGhpcyx0KTtpZih0aGlzLmdldEJvcmRlckxpbmVEYXNoKXt2YXIgaT10aGlzLmdldEJvcmRlckxpbmVEYXNoKCk7aSYmKGUubGluZURhc2g9aSl9cmV0dXJuIGV9fSxTdj1Jcyh7dHlwZToic2F1c2FnZSIsc2hhcGU6e2N4OjAsY3k6MCxyMDowLHI6MCxzdGFydEFuZ2xlOjAsZW5kQW5nbGU6MipNYXRoLlBJLGNsb2Nrd2lzZTohMH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5jeCxuPWUuY3ksbz1NYXRoLm1heChlLnIwfHwwLDApLGE9TWF0aC5tYXgoZS5yLDApLHI9LjUqKGEtbykscz1vK3IsbD1lLnN0YXJ0QW5nbGUsdT1lLmVuZEFuZ2xlLGg9ZS5jbG9ja3dpc2UsYz1NYXRoLmNvcyhsKSxkPU1hdGguc2luKGwpLGY9TWF0aC5jb3ModSkscD1NYXRoLnNpbih1KTsoaD91LWw8MipNYXRoLlBJOmwtdTwyKk1hdGguUEkpJiYodC5tb3ZlVG8oYypvK2ksZCpvK24pLHQuYXJjKGMqcytpLGQqcytuLHIsLU1hdGguUEkrbCxsLCFoKSksdC5hcmMoaSxuLGEsbCx1LCFoKSx0Lm1vdmVUbyhmKmEraSxwKmErbiksdC5hcmMoZipzK2kscCpzK24scix1LTIqTWF0aC5QSSx1LU1hdGguUEksIWgpLDAhPT1vJiYodC5hcmMoaSxuLG8sdSxsLGgpLHQubW92ZVRvKGMqbytpLHAqbytuKSksdC5jbG9zZVBhdGgoKX19KSxNdj1bIml0ZW1TdHlsZSIsImJhckJvcmRlcldpZHRoIl0sSXY9WzAsMF07TChJbC5wcm90b3R5cGUsYnYpLE1mKHt0eXBlOiJiYXIiLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dGhpcy5fdXBkYXRlRHJhd01vZGUodCk7dmFyIG49dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKTtyZXR1cm4iY2FydGVzaWFuMmQiIT09biYmInBvbGFyIiE9PW58fCh0aGlzLl9pc0xhcmdlRHJhdz90aGlzLl9yZW5kZXJMYXJnZSh0LGUsaSk6dGhpcy5fcmVuZGVyTm9ybWFsKHQsZSxpKSksdGhpcy5ncm91cH0saW5jcmVtZW50YWxQcmVwYXJlUmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9jbGVhcigpLHRoaXMuX3VwZGF0ZURyYXdNb2RlKHQpfSxpbmNyZW1lbnRhbFJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXt0aGlzLl9pbmNyZW1lbnRhbFJlbmRlckxhcmdlKHQsZSl9LF91cGRhdGVEcmF3TW9kZTpmdW5jdGlvbih0KXt2YXIgZT10LnBpcGVsaW5lQ29udGV4dC5sYXJnZTsobnVsbD09dGhpcy5faXNMYXJnZURyYXd8fGVedGhpcy5faXNMYXJnZURyYXcpJiYodGhpcy5faXNMYXJnZURyYXc9ZSx0aGlzLl9jbGVhcigpKX0sX3JlbmRlck5vcm1hbDpmdW5jdGlvbihhLHQsZSl7dmFyIHIscz10aGlzLmdyb3VwLGw9YS5nZXREYXRhKCksdT10aGlzLl9kYXRhLGg9YS5jb29yZGluYXRlU3lzdGVtLGk9aC5nZXRCYXNlQXhpcygpOyJjYXJ0ZXNpYW4yZCI9PT1oLnR5cGU/cj1pLmlzSG9yaXpvbnRhbCgpOiJwb2xhciI9PT1oLnR5cGUmJihyPSJhbmdsZSI9PT1pLmRpbSk7dmFyIGM9YS5pc0FuaW1hdGlvbkVuYWJsZWQoKT9hOm51bGwsZD1hLmdldCgiY2xpcCIsITApLGY9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEFyZWEmJnQuZ2V0QXJlYSgpO2lmKCJjYXJ0ZXNpYW4yZCI9PT10LnR5cGUpe3ZhciBuPXQuZ2V0QmFzZUF4aXMoKTtpZigiY2F0ZWdvcnkiIT09bi50eXBlfHwhbi5vbkJhbmQpe3ZhciBvPWUuZ2V0TGF5b3V0KCJiYW5kV2lkdGgiKTtuLmlzSG9yaXpvbnRhbCgpPyhpLngtPW8saS53aWR0aCs9MipvKTooaS55LT1vLGkuaGVpZ2h0Kz0yKm8pfX1yZXR1cm4gaX0oaCxsKTtzLnJlbW92ZUNsaXBQYXRoKCk7dmFyIHA9YS5nZXQoInJvdW5kQ2FwIiwhMCk7bC5kaWZmKHUpLmFkZChmdW5jdGlvbih0KXtpZihsLmhhc1ZhbHVlKHQpKXt2YXIgZT1sLmdldEl0ZW1Nb2RlbCh0KSxpPVB2W2gudHlwZV0obCx0LGUpO2lmKGQpaWYoRHZbaC50eXBlXShmLGkpKXJldHVybiB2b2lkIHMucmVtb3ZlKG4pO3ZhciBuPUN2W2gudHlwZV0odCxpLHIsYywhMSxwKTtsLnNldEl0ZW1HcmFwaGljRWwodCxuKSxzLmFkZChuKSxPdihuLGwsdCxlLGksYSxyLCJwb2xhciI9PT1oLnR5cGUpfX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPXUuZ2V0SXRlbUdyYXBoaWNFbChlKTtpZihsLmhhc1ZhbHVlKHQpKXt2YXIgbj1sLmdldEl0ZW1Nb2RlbCh0KSxvPVB2W2gudHlwZV0obCx0LG4pO2lmKGQpaWYoRHZbaC50eXBlXShmLG8pKXJldHVybiB2b2lkIHMucmVtb3ZlKGkpO2k/c2woaSx7c2hhcGU6b30sYyx0KTppPUN2W2gudHlwZV0odCxvLHIsYywhMCxwKSxsLnNldEl0ZW1HcmFwaGljRWwodCxpKSxzLmFkZChpKSxPdihpLGwsdCxuLG8sYSxyLCJwb2xhciI9PT1oLnR5cGUpfWVsc2Ugcy5yZW1vdmUoaSl9KS5yZW1vdmUoZnVuY3Rpb24odCl7dmFyIGU9dS5nZXRJdGVtR3JhcGhpY0VsKHQpOyJjYXJ0ZXNpYW4yZCI9PT1oLnR5cGU/ZSYmTHYodCxjLGUpOmUmJmt2KHQsYyxlKX0pLmV4ZWN1dGUoKSx0aGlzLl9kYXRhPWx9LF9yZW5kZXJMYXJnZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5fY2xlYXIoKSx6dih0LHRoaXMuZ3JvdXApO3ZhciBuPXQuZ2V0KCJjbGlwIiwhMCk/eW0odC5jb29yZGluYXRlU3lzdGVtLCExLHQpOm51bGw7bj90aGlzLmdyb3VwLnNldENsaXBQYXRoKG4pOnRoaXMuZ3JvdXAucmVtb3ZlQ2xpcFBhdGgoKX0sX2luY3JlbWVudGFsUmVuZGVyTGFyZ2U6ZnVuY3Rpb24odCxlKXt6dihlLHRoaXMuZ3JvdXAsITApfSxkaXNwb3NlOmV0LHJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9jbGVhcih0KX0sX2NsZWFyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ3JvdXAsaT10aGlzLl9kYXRhO2UmJmUuZ2V0KCJhbmltYXRpb24iKSYmaSYmIXRoaXMuX2lzTGFyZ2VEcmF3P2kuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCl7InNlY3RvciI9PT10LnR5cGU/a3YodC5kYXRhSW5kZXgsZSx0KTpMdih0LmRhdGFJbmRleCxlLHQpfSk6dC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9fSk7dmFyIFR2PU1hdGgubWF4LEF2PU1hdGgubWluLER2PXtjYXJ0ZXNpYW4yZDpmdW5jdGlvbih0LGUpe3ZhciBpPWUud2lkdGg8MD8tMToxLG49ZS5oZWlnaHQ8MD8tMToxO2k8MCYmKGUueCs9ZS53aWR0aCxlLndpZHRoPS1lLndpZHRoKSxuPDAmJihlLnkrPWUuaGVpZ2h0LGUuaGVpZ2h0PS1lLmhlaWdodCk7dmFyIG89VHYoZS54LHQueCksYT1BdihlLngrZS53aWR0aCx0LngrdC53aWR0aCkscj1UdihlLnksdC55KSxzPUF2KGUueStlLmhlaWdodCx0LnkrdC5oZWlnaHQpO2UueD1vLGUueT1yLGUud2lkdGg9YS1vLGUuaGVpZ2h0PXMtcjt2YXIgbD1lLndpZHRoPDB8fGUuaGVpZ2h0PDA7cmV0dXJuIGk8MCYmKGUueCs9ZS53aWR0aCxlLndpZHRoPS1lLndpZHRoKSxuPDAmJihlLnkrPWUuaGVpZ2h0LGUuaGVpZ2h0PS1lLmhlaWdodCksbH0scG9sYXI6ZnVuY3Rpb24odCl7cmV0dXJuITF9fSxDdj17Y2FydGVzaWFuMmQ6ZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1uZXcgaXMoe3NoYXBlOkwoe30sZSl9KTtpZihuKXt2YXIgcj1pPyJoZWlnaHQiOiJ3aWR0aCIscz17fTthLnNoYXBlW3JdPTAsc1tyXT1lW3JdLHlsW28/InVwZGF0ZVByb3BzIjoiaW5pdFByb3BzIl0oYSx7c2hhcGU6c30sbix0KX1yZXR1cm4gYX0scG9sYXI6ZnVuY3Rpb24odCxlLGksbixvLGEpe3ZhciByPWUuc3RhcnRBbmdsZTxlLmVuZEFuZ2xlLHM9bmV3KCFpJiZhP1N2OlVyKSh7c2hhcGU6Qyh7Y2xvY2t3aXNlOnJ9LGUpfSk7aWYobil7dmFyIGw9aT8iciI6ImVuZEFuZ2xlIix1PXt9O3Muc2hhcGVbbF09aT8wOmUuc3RhcnRBbmdsZSx1W2xdPWVbbF0seWxbbz8idXBkYXRlUHJvcHMiOiJpbml0UHJvcHMiXShzLHtzaGFwZTp1fSxuLHQpfXJldHVybiBzfX07ZnVuY3Rpb24gTHYodCxlLGkpe2kuc3R5bGUudGV4dD1udWxsLHNsKGkse3NoYXBlOnt3aWR0aDowfX0sZSx0LGZ1bmN0aW9uKCl7aS5wYXJlbnQmJmkucGFyZW50LnJlbW92ZShpKX0pfWZ1bmN0aW9uIGt2KHQsZSxpKXtpLnN0eWxlLnRleHQ9bnVsbCxzbChpLHtzaGFwZTp7cjppLnNoYXBlLnIwfX0sZSx0LGZ1bmN0aW9uKCl7aS5wYXJlbnQmJmkucGFyZW50LnJlbW92ZShpKX0pfXZhciBQdj17Y2FydGVzaWFuMmQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0SXRlbUxheW91dChlKSxvPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXQoTXYpfHwwO3JldHVybiBNYXRoLm1pbihpLE1hdGguYWJzKGUud2lkdGgpLE1hdGguYWJzKGUuaGVpZ2h0KSl9KGksbiksYT0wPG4ud2lkdGg/MTotMSxyPTA8bi5oZWlnaHQ/MTotMTtyZXR1cm57eDpuLngrYSpvLzIseTpuLnkrcipvLzIsd2lkdGg6bi53aWR0aC1hKm8saGVpZ2h0Om4uaGVpZ2h0LXIqb319LHBvbGFyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldEl0ZW1MYXlvdXQoZSk7cmV0dXJue2N4Om4uY3gsY3k6bi5jeSxyMDpuLnIwLHI6bi5yLHN0YXJ0QW5nbGU6bi5zdGFydEFuZ2xlLGVuZEFuZ2xlOm4uZW5kQW5nbGV9fX07ZnVuY3Rpb24gTnYodCl7cmV0dXJuIG51bGwhPXQuc3RhcnRBbmdsZSYmbnVsbCE9dC5lbmRBbmdsZSYmdC5zdGFydEFuZ2xlPT09dC5lbmRBbmdsZX1mdW5jdGlvbiBPdih0LGUsaSxuLG8sYSxyLHMpe3ZhciBsPWUuZ2V0SXRlbVZpc3VhbChpLCJjb2xvciIpLHU9ZS5nZXRJdGVtVmlzdWFsKGksIm9wYWNpdHkiKSxoPWUuZ2V0VmlzdWFsKCJib3JkZXJDb2xvciIpLGM9bi5nZXRNb2RlbCgiaXRlbVN0eWxlIiksZD1uLmdldE1vZGVsKCJlbXBoYXNpcy5pdGVtU3R5bGUiKS5nZXRCYXJJdGVtU3R5bGUoKTtzfHx0LnNldFNoYXBlKCJyIixjLmdldCgiYmFyQm9yZGVyUmFkaXVzIil8fDApLHQudXNlU3R5bGUoQyh7c3Ryb2tlOk52KG8pPyJub25lIjpoLGZpbGw6TnYobyk/Im5vbmUiOmwsb3BhY2l0eTp1fSxjLmdldEJhckl0ZW1TdHlsZSgpKSk7dmFyIGY9bi5nZXRTaGFsbG93KCJjdXJzb3IiKTtmJiZ0LmF0dHIoImN1cnNvciIsZik7cj9vLmhlaWdodDpvLndpZHRoO3N8fHh2KHQuc3R5bGUsZCxuLGwsYSxpKSxOdihvKSYmKGQuZmlsbD1kLnN0cm9rZT0ibm9uZSIpLFlzKHQsZCl9dmFyIEV2PVNyLmV4dGVuZCh7dHlwZToibGFyZ2VCYXIiLHNoYXBlOntwb2ludHM6W119LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1lLnBvaW50cyxuPXRoaXMuX19zdGFydFBvaW50LG89dGhpcy5fX2Jhc2VEaW1JZHgsYT0wO2E8aS5sZW5ndGg7YSs9MiluW29dPWlbYStvXSx0Lm1vdmVUbyhuWzBdLG5bMV0pLHQubGluZVRvKGlbYV0saVthKzFdKX19KTtmdW5jdGlvbiB6dih0LGUsaSl7dmFyIG49dC5nZXREYXRhKCksbz1bXSxhPW4uZ2V0TGF5b3V0KCJ2YWx1ZUF4aXNIb3Jpem9udGFsIik/MTowO29bMS1hXT1uLmdldExheW91dCgidmFsdWVBeGlzU3RhcnQiKTt2YXIgcj1uZXcgRXYoe3NoYXBlOntwb2ludHM6bi5nZXRMYXlvdXQoImxhcmdlUG9pbnRzIil9LGluY3JlbWVudGFsOiEhaSxfX3N0YXJ0UG9pbnQ6byxfX2Jhc2VEaW1JZHg6YSxfX2xhcmdlRGF0YUluZGljZXM6bi5nZXRMYXlvdXQoImxhcmdlRGF0YUluZGljZXMiKSxfX2JhcldpZHRoOm4uZ2V0TGF5b3V0KCJiYXJXaWR0aCIpfSk7ZS5hZGQociksZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkuZ2V0VmlzdWFsKCJib3JkZXJDb2xvciIpfHxpLmdldFZpc3VhbCgiY29sb3IiKSxvPWUuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZShbImNvbG9yIiwiYm9yZGVyQ29sb3IiXSk7dC51c2VTdHlsZShvKSx0LnN0eWxlLmZpbGw9bnVsbCx0LnN0eWxlLnN0cm9rZT1uLHQuc3R5bGUubGluZVdpZHRoPWkuZ2V0TGF5b3V0KCJiYXJXaWR0aCIpfShyLHQsbiksci5zZXJpZXNJbmRleD10LnNlcmllc0luZGV4LHQuZ2V0KCJzaWxlbnQiKXx8KHIub24oIm1vdXNlZG93biIsUnYpLHIub24oIm1vdXNlbW92ZSIsUnYpKX12YXIgUnY9SWMoZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuX19iYXNlRGltSWR4LG89MS1uLGE9dC5zaGFwZS5wb2ludHMscj10Ll9fbGFyZ2VEYXRhSW5kaWNlcyxzPU1hdGguYWJzKHQuX19iYXJXaWR0aC8yKSxsPXQuX19zdGFydFBvaW50W29dO0l2WzBdPWUsSXZbMV09aTtmb3IodmFyIHU9SXZbbl0saD1JdlsxLW5dLGM9dS1zLGQ9dStzLGY9MCxwPWEubGVuZ3RoLzI7ZjxwO2YrKyl7dmFyIGc9MipmLG09YVtnK25dLHY9YVtnK29dO2lmKGM8PW0mJm08PWQmJihsPD12P2w8PWgmJmg8PXY6djw9aCYmaDw9bCkpcmV0dXJuIHJbZl19cmV0dXJuLTF9KHRoaXMsdC5vZmZzZXRYLHQub2Zmc2V0WSk7dGhpcy5kYXRhSW5kZXg9MDw9ZT9lOm51bGx9LDMwLCExKTt2ZihJZC5WSVNVQUwuTEFZT1VULFQoUHAsImJhciIpKSx2ZihJZC5WSVNVQUwuUFJPR1JFU1NJVkVfTEFZT1VULE5wKSx5Zih7c2VyaWVzVHlwZToiYmFyIixyZXNldDpmdW5jdGlvbih0KXt0LmdldERhdGEoKS5zZXRWaXN1YWwoImxlZ2VuZFN5bWJvbCIsInJvdW5kUmVjdCIpfX0pO2Z1bmN0aW9uIEJ2KHQsZSxpKXtlPWsoZSkmJntjb29yZERpbWVuc2lvbnM6ZX18fEwoe30sZSk7dmFyIG49dC5nZXRTb3VyY2UoKSxvPW5wKG4sZSksYT1uZXcgV2Yobyx0KTtyZXR1cm4gYS5pbml0RGF0YShuLGkpLGF9dmFyIFZ2PXt1cGRhdGVTZWxlY3RlZE1hcDpmdW5jdGlvbih0KXt0aGlzLl90YXJnZXRMaXN0PWsodCk/dC5zbGljZSgpOltdLHRoaXMuX3NlbGVjdFRhcmdldE1hcD1TKHR8fFtdLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc2V0KGUubmFtZSxlKSx0fSxRKCkpfSxzZWxlY3Q6ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsIT1lP3RoaXMuX3RhcmdldExpc3RbZV06dGhpcy5fc2VsZWN0VGFyZ2V0TWFwLmdldCh0KTsic2luZ2xlIj09PXRoaXMuZ2V0KCJzZWxlY3RlZE1vZGUiKSYmdGhpcy5fc2VsZWN0VGFyZ2V0TWFwLmVhY2goZnVuY3Rpb24odCl7dC5zZWxlY3RlZD0hMX0pLGkmJihpLnNlbGVjdGVkPSEwKX0sdW5TZWxlY3Q6ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsIT1lP3RoaXMuX3RhcmdldExpc3RbZV06dGhpcy5fc2VsZWN0VGFyZ2V0TWFwLmdldCh0KTtpJiYoaS5zZWxlY3RlZD0hMSl9LHRvZ2dsZVNlbGVjdGVkOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bnVsbCE9ZT90aGlzLl90YXJnZXRMaXN0W2VdOnRoaXMuX3NlbGVjdFRhcmdldE1hcC5nZXQodCk7aWYobnVsbCE9aSlyZXR1cm4gdGhpc1tpLnNlbGVjdGVkPyJ1blNlbGVjdCI6InNlbGVjdCJdKHQsZSksaS5zZWxlY3RlZH0saXNTZWxlY3RlZDpmdW5jdGlvbih0LGUpe3ZhciBpPW51bGwhPWU/dGhpcy5fdGFyZ2V0TGlzdFtlXTp0aGlzLl9zZWxlY3RUYXJnZXRNYXAuZ2V0KHQpO3JldHVybiBpJiZpLnNlbGVjdGVkfX07ZnVuY3Rpb24gR3YoaSxlKXt0aGlzLmdldEFsbE5hbWVzPWZ1bmN0aW9uKCl7dmFyIHQ9ZSgpO3JldHVybiB0Lm1hcEFycmF5KHQuZ2V0TmFtZSl9LHRoaXMuY29udGFpbk5hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIDA8PWUoKS5pbmRleE9mTmFtZSh0KX0sdGhpcy5pbmRleE9mTmFtZT1mdW5jdGlvbih0KXtyZXR1cm4gaSgpLmluZGV4T2ZOYW1lKHQpfSx0aGlzLmdldEl0ZW1WaXN1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaSgpLmdldEl0ZW1WaXN1YWwodCxlKX19dmFyIEZ2PVNmKHt0eXBlOiJzZXJpZXMucGllIixpbml0OmZ1bmN0aW9uKHQpe0Z2LnN1cGVyQXBwbHkodGhpcywiaW5pdCIsYXJndW1lbnRzKSx0aGlzLmxlZ2VuZFZpc3VhbFByb3ZpZGVyPW5ldyBHdihBKHRoaXMuZ2V0RGF0YSx0aGlzKSxBKHRoaXMuZ2V0UmF3RGF0YSx0aGlzKSksdGhpcy51cGRhdGVTZWxlY3RlZE1hcCh0aGlzLl9jcmVhdGVTZWxlY3RhYmxlTGlzdCgpKSx0aGlzLl9kZWZhdWx0TGFiZWxMaW5lKHQpfSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0KXtGdi5zdXBlckNhbGwodGhpcywibWVyZ2VPcHRpb24iLHQpLHRoaXMudXBkYXRlU2VsZWN0ZWRNYXAodGhpcy5fY3JlYXRlU2VsZWN0YWJsZUxpc3QoKSl9LGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJ2KHRoaXMse2Nvb3JkRGltZW5zaW9uczpbInZhbHVlIl0sZW5jb2RlRGVmYXVsdGVyOlQoWXUsdGhpcyl9KX0sX2NyZWF0ZVNlbGVjdGFibGVMaXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZ2V0UmF3RGF0YSgpLGU9dC5tYXBEaW1lbnNpb24oInZhbHVlIiksaT1bXSxuPTAsbz10LmNvdW50KCk7bjxvO24rKylpLnB1c2goe25hbWU6dC5nZXROYW1lKG4pLHZhbHVlOnQuZ2V0KGUsbiksc2VsZWN0ZWQ6VmgodCxuLCJzZWxlY3RlZCIpfSk7cmV0dXJuIGl9LGdldERhdGFQYXJhbXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXREYXRhKCksaT1Gdi5zdXBlckNhbGwodGhpcywiZ2V0RGF0YVBhcmFtcyIsdCksbj1bXTtyZXR1cm4gZS5lYWNoKGUubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGZ1bmN0aW9uKHQpe24ucHVzaCh0KX0pLGkucGVyY2VudD1CbChuLHQsZS5ob3N0TW9kZWwuZ2V0KCJwZXJjZW50UHJlY2lzaW9uIikpLGkuJHZhcnMucHVzaCgicGVyY2VudCIpLGl9LF9kZWZhdWx0TGFiZWxMaW5lOmZ1bmN0aW9uKHQpe3pvKHQsImxhYmVsTGluZSIsWyJzaG93Il0pO3ZhciBlPXQubGFiZWxMaW5lLGk9dC5lbXBoYXNpcy5sYWJlbExpbmU7ZS5zaG93PWUuc2hvdyYmdC5sYWJlbC5zaG93LGkuc2hvdz1pLnNob3cmJnQuZW1waGFzaXMubGFiZWwuc2hvd30sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGxlZ2VuZEhvdmVyTGluazohMCxob3ZlckFuaW1hdGlvbjohMCxjZW50ZXI6WyI1MCUiLCI1MCUiXSxyYWRpdXM6WzAsIjc1JSJdLGNsb2Nrd2lzZTohMCxzdGFydEFuZ2xlOjkwLG1pbkFuZ2xlOjAsbWluU2hvd0xhYmVsQW5nbGU6MCxzZWxlY3RlZE9mZnNldDoxMCxob3Zlck9mZnNldDoxMCxhdm9pZExhYmVsT3ZlcmxhcDohMCxwZXJjZW50UHJlY2lzaW9uOjIsc3RpbGxTaG93WmVyb1N1bTohMCxsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MCx3aWR0aDpudWxsLGhlaWdodDpudWxsLGxhYmVsOntyb3RhdGU6ITEsc2hvdzohMCxwb3NpdGlvbjoib3V0ZXIiLGFsaWduVG86Im5vbmUiLG1hcmdpbjoiMjUlIixibGVlZE1hcmdpbjoxMCxkaXN0YW5jZVRvTGFiZWxMaW5lOjV9LGxhYmVsTGluZTp7c2hvdzohMCxsZW5ndGg6MTUsbGVuZ3RoMjoxNSxzbW9vdGg6ITEsbGluZVN0eWxlOnt3aWR0aDoxLHR5cGU6InNvbGlkIn19LGl0ZW1TdHlsZTp7Ym9yZGVyV2lkdGg6MX0sYW5pbWF0aW9uVHlwZToiZXhwYW5zaW9uIixhbmltYXRpb25UeXBlVXBkYXRlOiJ0cmFuc2l0aW9uIixhbmltYXRpb25FYXNpbmc6ImN1YmljT3V0In19KTtmdW5jdGlvbiBXdih0LGUsaSxuKXt2YXIgbz1lLmdldERhdGEoKSxhPXRoaXMuZGF0YUluZGV4LHI9by5nZXROYW1lKGEpLHM9ZS5nZXQoInNlbGVjdGVkT2Zmc2V0Iik7bi5kaXNwYXRjaEFjdGlvbih7dHlwZToicGllVG9nZ2xlU2VsZWN0Iixmcm9tOnQsbmFtZTpyLHNlcmllc0lkOmUuaWR9KSxvLmVhY2goZnVuY3Rpb24odCl7SHYoby5nZXRJdGVtR3JhcGhpY0VsKHQpLG8uZ2V0SXRlbUxheW91dCh0KSxlLmlzU2VsZWN0ZWQoby5nZXROYW1lKHQpKSxzLGkpfSl9ZnVuY3Rpb24gSHYodCxlLGksbixvKXt2YXIgYT0oZS5zdGFydEFuZ2xlK2UuZW5kQW5nbGUpLzIscj1pP246MCxzPVtNYXRoLmNvcyhhKSpyLE1hdGguc2luKGEpKnJdO28/dC5hbmltYXRlKCkud2hlbigyMDAse3Bvc2l0aW9uOnN9KS5zdGFydCgiYm91bmNlT3V0Iik6dC5hdHRyKCJwb3NpdGlvbiIscyl9ZnVuY3Rpb24gWnYodCxlKXtJaS5jYWxsKHRoaXMpO3ZhciBpPW5ldyBVcih7ejI6Mn0pLG49bmV3IEtyLG89bmV3IEZyO3RoaXMuYWRkKGkpLHRoaXMuYWRkKG4pLHRoaXMuYWRkKG8pLHRoaXMudXBkYXRlRGF0YSh0LGUsITApfWIoRnYsVnYpO3ZhciBVdj1adi5wcm90b3R5cGU7VXYudXBkYXRlRGF0YT1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5jaGlsZEF0KDApLG89dGhpcy5jaGlsZEF0KDEpLGE9dGhpcy5jaGlsZEF0KDIpLHI9dC5ob3N0TW9kZWwscz10LmdldEl0ZW1Nb2RlbChlKSxsPXQuZ2V0SXRlbUxheW91dChlKSx1PUwoe30sbCk7dS5sYWJlbD1udWxsO3ZhciBoPXIuZ2V0U2hhbGxvdygiYW5pbWF0aW9uVHlwZVVwZGF0ZSIpO2k/KG4uc2V0U2hhcGUodSksInNjYWxlIj09PXIuZ2V0U2hhbGxvdygiYW5pbWF0aW9uVHlwZSIpPyhuLnNoYXBlLnI9bC5yMCxsbChuLHtzaGFwZTp7cjpsLnJ9fSxyLGUpKToobi5zaGFwZS5lbmRBbmdsZT1sLnN0YXJ0QW5nbGUsc2wobix7c2hhcGU6e2VuZEFuZ2xlOmwuZW5kQW5nbGV9fSxyLGUpKSk6ImV4cGFuc2lvbiI9PT1oP24uc2V0U2hhcGUodSk6c2wobix7c2hhcGU6dX0scixlKTt2YXIgYz10LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKTtuLnVzZVN0eWxlKEMoe2xpbmVKb2luOiJiZXZlbCIsZmlsbDpjfSxzLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSkpLG4uaG92ZXJTdHlsZT1zLmdldE1vZGVsKCJlbXBoYXNpcy5pdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKTt2YXIgZD1zLmdldFNoYWxsb3coImN1cnNvciIpO2QmJm4uYXR0cigiY3Vyc29yIixkKSxIdih0aGlzLHQuZ2V0SXRlbUxheW91dChlKSxyLmlzU2VsZWN0ZWQobnVsbCxlKSxyLmdldCgic2VsZWN0ZWRPZmZzZXQiKSxyLmdldCgiYW5pbWF0aW9uIikpO3ZhciBmPSFpJiYidHJhbnNpdGlvbiI9PT1oO3RoaXMuX3VwZGF0ZUxhYmVsKHQsZSxmKSx0aGlzLmhpZ2hEb3duT25VcGRhdGU9cy5nZXQoImhvdmVyQW5pbWF0aW9uIikmJnIuaXNBbmltYXRpb25FbmFibGVkKCk/ZnVuY3Rpb24odCxlKXsiZW1waGFzaXMiPT09ZT8oby5pZ25vcmU9by5ob3Zlcklnbm9yZSxhLmlnbm9yZT1hLmhvdmVySWdub3JlLG4uc3RvcEFuaW1hdGlvbighMCksbi5hbmltYXRlVG8oe3NoYXBlOntyOmwucityLmdldCgiaG92ZXJPZmZzZXQiKX19LDMwMCwiZWxhc3RpY091dCIpKTooby5pZ25vcmU9by5ub3JtYWxJZ25vcmUsYS5pZ25vcmU9YS5ub3JtYWxJZ25vcmUsbi5zdG9wQW5pbWF0aW9uKCEwKSxuLmFuaW1hdGVUbyh7c2hhcGU6e3I6bC5yfX0sMzAwLCJlbGFzdGljT3V0IikpfTpudWxsLFlzKHRoaXMpfSxVdi5fdXBkYXRlTGFiZWw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuY2hpbGRBdCgxKSxvPXRoaXMuY2hpbGRBdCgyKSxhPXQuaG9zdE1vZGVsLHI9dC5nZXRJdGVtTW9kZWwoZSkscz10LmdldEl0ZW1MYXlvdXQoZSkubGFiZWwsbD10LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKTtpZighc3x8aXNOYU4ocy54KXx8aXNOYU4ocy55KSlvLmlnbm9yZT1vLm5vcm1hbElnbm9yZT1vLmhvdmVySWdub3JlPW4uaWdub3JlPW4ubm9ybWFsSWdub3JlPW4uaG92ZXJJZ25vcmU9ITA7ZWxzZXt2YXIgdT17cG9pbnRzOnMubGluZVBvaW50c3x8W1tzLngscy55XSxbcy54LHMueV0sW3MueCxzLnldXX0saD17eDpzLngseTpzLnl9O2k/KHNsKG4se3NoYXBlOnV9LGEsZSksc2wobyx7c3R5bGU6aH0sYSxlKSk6KG4uYXR0cih7c2hhcGU6dX0pLG8uYXR0cih7c3R5bGU6aH0pKSxvLmF0dHIoe3JvdGF0aW9uOnMucm90YXRpb24sb3JpZ2luOltzLngscy55XSx6MjoxMH0pO3ZhciBjPXIuZ2V0TW9kZWwoImxhYmVsIiksZD1yLmdldE1vZGVsKCJlbXBoYXNpcy5sYWJlbCIpLGY9ci5nZXRNb2RlbCgibGFiZWxMaW5lIikscD1yLmdldE1vZGVsKCJlbXBoYXNpcy5sYWJlbExpbmUiKTtsPXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpOyRzKG8uc3R5bGUsby5ob3ZlclN0eWxlPXt9LGMsZCx7bGFiZWxGZXRjaGVyOnQuaG9zdE1vZGVsLGxhYmVsRGF0YUluZGV4OmUsZGVmYXVsdFRleHQ6cy50ZXh0LGF1dG9Db2xvcjpsLHVzZUluc2lkZVN0eWxlOiEhcy5pbnNpZGV9LHt0ZXh0QWxpZ246cy50ZXh0QWxpZ24sdGV4dFZlcnRpY2FsQWxpZ246cy52ZXJ0aWNhbEFsaWduLG9wYWNpdHk6dC5nZXRJdGVtVmlzdWFsKGUsIm9wYWNpdHkiKX0pLG8uaWdub3JlPW8ubm9ybWFsSWdub3JlPSFjLmdldCgic2hvdyIpLG8uaG92ZXJJZ25vcmU9IWQuZ2V0KCJzaG93Iiksbi5pZ25vcmU9bi5ub3JtYWxJZ25vcmU9IWYuZ2V0KCJzaG93Iiksbi5ob3Zlcklnbm9yZT0hcC5nZXQoInNob3ciKSxuLnNldFN0eWxlKHtzdHJva2U6bCxvcGFjaXR5OnQuZ2V0SXRlbVZpc3VhbChlLCJvcGFjaXR5Iil9KSxuLnNldFN0eWxlKGYuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpKSxuLmhvdmVyU3R5bGU9cC5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCk7dmFyIGc9Zi5nZXQoInNtb290aCIpO2cmJiEwPT09ZyYmKGc9LjQpLG4uc2V0U2hhcGUoe3Ntb290aDpnfSl9fSx3KFp2LElpKTtmdW5jdGlvbiBYdihpLHQpe0UodCxmdW5jdGlvbihhKXthLnVwZGF0ZT0idXBkYXRlVmlldyIsZ2YoYSxmdW5jdGlvbih0LGUpe3ZhciBvPXt9O3JldHVybiBlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6aSxxdWVyeTp0fSxmdW5jdGlvbihpKXtpW2EubWV0aG9kXSYmaVthLm1ldGhvZF0odC5uYW1lLHQuZGF0YUluZGV4KTt2YXIgbj1pLmdldERhdGEoKTtuLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9bi5nZXROYW1lKHQpO29bZV09aS5pc1NlbGVjdGVkKGUpfHwhMX0pfSkse25hbWU6dC5uYW1lLHNlbGVjdGVkOm8sc2VyaWVzSWQ6dC5zZXJpZXNJZH19KX0pfWZ1bmN0aW9uIFl2KG4pe3JldHVybntnZXRUYXJnZXRTZXJpZXM6ZnVuY3Rpb24odCl7dmFyIGU9e30saT1RKCk7cmV0dXJuIHQuZWFjaFNlcmllc0J5VHlwZShuLGZ1bmN0aW9uKHQpe3QuX19wYWxldHRlU2NvcGU9ZSxpLnNldCh0LnVpZCx0KX0pLGl9LHJlc2V0OmZ1bmN0aW9uKHMsdCl7dmFyIGw9cy5nZXRSYXdEYXRhKCksdT17fSxoPXMuZ2V0RGF0YSgpO2guZWFjaChmdW5jdGlvbih0KXt2YXIgZT1oLmdldFJhd0luZGV4KHQpO3VbZV09dH0pLGwuZWFjaChmdW5jdGlvbih0KXt2YXIgZSxpPXVbdF0sbj1udWxsIT1pJiZoLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiLCEwKSxvPW51bGwhPWkmJmguZ2V0SXRlbVZpc3VhbChpLCJib3JkZXJDb2xvciIsITApO2lmKG4mJm98fChlPWwuZ2V0SXRlbU1vZGVsKHQpKSwhbil7dmFyIGE9ZS5nZXQoIml0ZW1TdHlsZS5jb2xvciIpfHxzLmdldENvbG9yRnJvbVBhbGV0dGUobC5nZXROYW1lKHQpfHx0KyIiLHMuX19wYWxldHRlU2NvcGUsbC5jb3VudCgpKTtudWxsIT1pJiZoLnNldEl0ZW1WaXN1YWwoaSwiY29sb3IiLGEpfWlmKCFvKXt2YXIgcj1lLmdldCgiaXRlbVN0eWxlLmJvcmRlckNvbG9yIik7bnVsbCE9aSYmaC5zZXRJdGVtVmlzdWFsKGksImJvcmRlckNvbG9yIixyKX19KX19fWdjLmV4dGVuZCh7dHlwZToicGllIixpbml0OmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IElpO3RoaXMuX3NlY3Rvckdyb3VwPXR9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXtpZighbnx8bi5mcm9tIT09dGhpcy51aWQpe3ZhciBvPXQuZ2V0RGF0YSgpLGE9dGhpcy5fZGF0YSxyPXRoaXMuZ3JvdXAscz1lLmdldCgiYW5pbWF0aW9uIiksbD0hYSx1PXQuZ2V0KCJhbmltYXRpb25UeXBlIiksaD10LmdldCgiYW5pbWF0aW9uVHlwZVVwZGF0ZSIpLGM9VChXdix0aGlzLnVpZCx0LHMsaSksZD10LmdldCgic2VsZWN0ZWRNb2RlIik7aWYoby5kaWZmKGEpLmFkZChmdW5jdGlvbih0KXt2YXIgZT1uZXcgWnYobyx0KTtsJiYic2NhbGUiIT09dSYmZS5lYWNoQ2hpbGQoZnVuY3Rpb24odCl7dC5zdG9wQW5pbWF0aW9uKCEwKX0pLGQmJmUub24oImNsaWNrIixjKSxvLnNldEl0ZW1HcmFwaGljRWwodCxlKSxyLmFkZChlKX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPWEuZ2V0SXRlbUdyYXBoaWNFbChlKTtsfHwidHJhbnNpdGlvbiI9PT1ofHxpLmVhY2hDaGlsZChmdW5jdGlvbih0KXt0LnN0b3BBbmltYXRpb24oITApfSksaS51cGRhdGVEYXRhKG8sdCksaS5vZmYoImNsaWNrIiksZCYmaS5vbigiY2xpY2siLGMpLHIuYWRkKGkpLG8uc2V0SXRlbUdyYXBoaWNFbCh0LGkpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPWEuZ2V0SXRlbUdyYXBoaWNFbCh0KTtyLnJlbW92ZShlKX0pLmV4ZWN1dGUoKSxzJiYwPG8uY291bnQoKSYmKGw/InNjYWxlIiE9PXU6InRyYW5zaXRpb24iIT09aCkpe2Zvcih2YXIgZj1vLmdldEl0ZW1MYXlvdXQoMCkscD0xO2lzTmFOKGYuc3RhcnRBbmdsZSkmJnA8by5jb3VudCgpOysrcClmPW8uZ2V0SXRlbUxheW91dChwKTt2YXIgZz1NYXRoLm1heChpLmdldFdpZHRoKCksaS5nZXRIZWlnaHQoKSkvMixtPUEoci5yZW1vdmVDbGlwUGF0aCxyKTtyLnNldENsaXBQYXRoKHRoaXMuX2NyZWF0ZUNsaXBQYXRoKGYuY3gsZi5jeSxnLGYuc3RhcnRBbmdsZSxmLmNsb2Nrd2lzZSxtLHQsbCkpfWVsc2Ugci5yZW1vdmVDbGlwUGF0aCgpO3RoaXMuX2RhdGE9b319LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9LF9jcmVhdGVDbGlwUGF0aDpmdW5jdGlvbih0LGUsaSxuLG8sYSxyLHMpe3ZhciBsPW5ldyBVcih7c2hhcGU6e2N4OnQsY3k6ZSxyMDowLHI6aSxzdGFydEFuZ2xlOm4sZW5kQW5nbGU6bixjbG9ja3dpc2U6b319KTtyZXR1cm4ocz9sbDpzbCkobCx7c2hhcGU6e2VuZEFuZ2xlOm4rKG8/MTotMSkqTWF0aC5QSSoyfX0scixhKSxsfSxjb250YWluUG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldERhdGEoKS5nZXRJdGVtTGF5b3V0KDApO2lmKGkpe3ZhciBuPXRbMF0taS5jeCxvPXRbMV0taS5jeSxhPU1hdGguc3FydChuKm4rbypvKTtyZXR1cm4gYTw9aS5yJiZhPj1pLnIwfX19KTt2YXIganY9TWF0aC5QSS8xODA7ZnVuY3Rpb24gcXYobyx0LGUsaSxuLGEscixzLGwsdSl7ZnVuY3Rpb24gaCh0LGUsaSl7Zm9yKHZhciBuPXQ7bjxlJiYhKG9bbl0ueStpPmwrcik7bisrKWlmKG9bbl0ueSs9aSx0PG4mJm4rMTxlJiZvW24rMV0ueT5vW25dLnkrb1tuXS5oZWlnaHQpcmV0dXJuIHZvaWQgYyhuLGkvMik7YyhlLTEsaS8yKX1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciBpPXQ7MDw9aSYmIShvW2ldLnktZTxsKSYmKG9baV0ueS09ZSwhKDA8aSYmb1tpXS55Pm9baS0xXS55K29baS0xXS5oZWlnaHQpKTtpLS0pO31mdW5jdGlvbiBkKHQsZSxpLG4sbyxhKXtmb3IodmFyIHI9ZT9OdW1iZXIuTUFYX1ZBTFVFOjAscz0wLGw9dC5sZW5ndGg7czxsO3MrKylpZigibm9uZSI9PT10W3NdLmxhYmVsQWxpZ25Ubyl7dmFyIHU9TWF0aC5hYnModFtzXS55LW4pLGg9dFtzXS5sZW4sYz10W3NdLmxlbjIsZD11PG8raD9NYXRoLnNxcnQoKG8raCtjKSoobytoK2MpLXUqdSk6TWF0aC5hYnModFtzXS54LWkpO2UmJnI8PWQmJihkPXItMTApLCFlJiZkPD1yJiYoZD1yKzEwKSx0W3NdLng9aStkKmEscj1kfX1vLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC55LWUueX0pO2Zvcih2YXIgZixwPTAsZz1vLmxlbmd0aCxtPVtdLHY9W10seT0wO3k8Zzt5Kyspe2lmKCJvdXRlciI9PT1vW3ldLnBvc2l0aW9uJiYibGFiZWxMaW5lIj09PW9beV0ubGFiZWxBbGlnblRvKXt2YXIgeD1vW3ldLngtdTtvW3ldLmxpbmVQb2ludHNbMV1bMF0rPXgsb1t5XS54PXV9KGY9b1t5XS55LXApPDAmJmgoeSxnLC1mKSxwPW9beV0ueStvW3ldLmhlaWdodH1yLXA8MCYmYyhnLTEscC1yKTtmb3IoeT0wO3k8Zzt5Kyspb1t5XS55Pj1lP3YucHVzaChvW3ldKTptLnB1c2gob1t5XSk7ZChtLCExLHQsZSxpLG4pLGQodiwhMCx0LGUsaSxuKX1mdW5jdGlvbiBLdih0KXtyZXR1cm4iY2VudGVyIj09PXQucG9zaXRpb259ZnVuY3Rpb24gJHYoTCxrLFAsdCxOLGUpe3ZhciBPLEUsej1MLmdldERhdGEoKSxSPVtdLEI9ITEsVj0oTC5nZXQoIm1pblNob3dMYWJlbEFuZ2xlIil8fDApKmp2O3ouZWFjaChmdW5jdGlvbih0KXt2YXIgZT16LmdldEl0ZW1MYXlvdXQodCksaT16LmdldEl0ZW1Nb2RlbCh0KSxuPWkuZ2V0TW9kZWwoImxhYmVsIiksbz1uLmdldCgicG9zaXRpb24iKXx8aS5nZXQoImVtcGhhc2lzLmxhYmVsLnBvc2l0aW9uIiksYT1uLmdldCgiZGlzdGFuY2VUb0xhYmVsTGluZSIpLHI9bi5nZXQoImFsaWduVG8iKSxzPVBsKG4uZ2V0KCJtYXJnaW4iKSxQKSxsPW4uZ2V0KCJibGVlZE1hcmdpbiIpLHU9bi5nZXRGb250KCksaD1pLmdldE1vZGVsKCJsYWJlbExpbmUiKSxjPWguZ2V0KCJsZW5ndGgiKTtjPVBsKGMsUCk7dmFyIGQ9aC5nZXQoImxlbmd0aDIiKTtpZihkPVBsKGQsUCksIShlLmFuZ2xlPFYpKXt2YXIgZixwLGcsbSx2PShlLnN0YXJ0QW5nbGUrZS5lbmRBbmdsZSkvMix5PU1hdGguY29zKHYpLHg9TWF0aC5zaW4odik7Tz1lLmN4LEU9ZS5jeTt2YXIgXyx3PUwuZ2V0Rm9ybWF0dGVkTGFiZWwodCwibm9ybWFsIil8fHouZ2V0TmFtZSh0KSxiPWNuKHcsdSxtLCJ0b3AiKSxTPSJpbnNpZGUiPT09b3x8ImlubmVyIj09PW87aWYoImNlbnRlciI9PT1vKWY9ZS5jeCxwPWUuY3ksbT0iY2VudGVyIjtlbHNle3ZhciBNPShTPyhlLnIrZS5yMCkvMip5OmUucip5KStPLEk9KFM/KGUucitlLnIwKS8yKng6ZS5yKngpK0U7aWYoZj1NKzMqeSxwPUkrMyp4LCFTKXt2YXIgVD1NK3kqKGMray1lLnIpLEE9SSt4KihjK2stZS5yKSxEPVQrKHk8MD8tMToxKSpkO2Y9ImVkZ2UiPT09cj95PDA/TitzOk4rUC1zOkQrKHk8MD8tYTphKSxnPVtbTSxJXSxbVCxBXSxbRCxwPUFdXX1tPVM/ImNlbnRlciI6ImVkZ2UiPT09cj8wPHk/InJpZ2h0IjoibGVmdCI6MDx5PyJsZWZ0IjoicmlnaHQifXZhciBDPW4uZ2V0KCJyb3RhdGUiKTtfPSJudW1iZXIiPT10eXBlb2YgQz9DKihNYXRoLlBJLzE4MCk6Qz95PDA/LXYrTWF0aC5QSTotdjowLEI9ISFfLGUubGFiZWw9e3g6Zix5OnAscG9zaXRpb246byxoZWlnaHQ6Yi5oZWlnaHQsbGVuOmMsbGVuMjpkLGxpbmVQb2ludHM6Zyx0ZXh0QWxpZ246bSx2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLHJvdGF0aW9uOl8saW5zaWRlOlMsbGFiZWxEaXN0YW5jZTphLGxhYmVsQWxpZ25UbzpyLGxhYmVsTWFyZ2luOnMsYmxlZWRNYXJnaW46bCx0ZXh0UmVjdDpiLHRleHQ6dyxmb250OnV9LFN8fFIucHVzaChlLmxhYmVsKX19KSwhQiYmTC5nZXQoImF2b2lkTGFiZWxPdmVybGFwIikmJmZ1bmN0aW9uKHQsZSxpLG4sbyxhLHIscyl7Zm9yKHZhciBsPVtdLHU9W10saD1OdW1iZXIuTUFYX1ZBTFVFLGM9LU51bWJlci5NQVhfVkFMVUUsZD0wO2Q8dC5sZW5ndGg7ZCsrKUt2KHRbZF0pfHwodFtkXS54PGU/KGg9TWF0aC5taW4oaCx0W2RdLngpLGwucHVzaCh0W2RdKSk6KGM9TWF0aC5tYXgoYyx0W2RdLngpLHUucHVzaCh0W2RdKSkpO2Zvcihxdih1LGUsaSxuLDEsMCxhLDAscyxjKSxxdihsLGUsaSxuLC0xLDAsYSwwLHMsaCksZD0wO2Q8dC5sZW5ndGg7ZCsrKXt2YXIgZj10W2RdO2lmKCFLdihmKSl7dmFyIHA9Zi5saW5lUG9pbnRzO2lmKHApe3ZhciBnLG09ImVkZ2UiPT09Zi5sYWJlbEFsaWduVG8sdj1mLnRleHRSZWN0LndpZHRoOyhnPW0/Zi54PGU/cFsyXVswXS1mLmxhYmVsRGlzdGFuY2Utci1mLmxhYmVsTWFyZ2luOnIrby1mLmxhYmVsTWFyZ2luLXBbMl1bMF0tZi5sYWJlbERpc3RhbmNlOmYueDxlP2YueC1yLWYuYmxlZWRNYXJnaW46citvLWYueC1mLmJsZWVkTWFyZ2luKTxmLnRleHRSZWN0LndpZHRoJiYoZi50ZXh0PWduKGYudGV4dCxnLGYuZm9udCksImVkZ2UiPT09Zi5sYWJlbEFsaWduVG8mJih2PWhuKGYudGV4dCxmLmZvbnQpKSk7dmFyIHk9cFsxXVswXS1wWzJdWzBdO20/Zi54PGU/cFsyXVswXT1yK2YubGFiZWxNYXJnaW4rditmLmxhYmVsRGlzdGFuY2U6cFsyXVswXT1yK28tZi5sYWJlbE1hcmdpbi12LWYubGFiZWxEaXN0YW5jZTooZi54PGU/cFsyXVswXT1mLngrZi5sYWJlbERpc3RhbmNlOnBbMl1bMF09Zi54LWYubGFiZWxEaXN0YW5jZSxwWzFdWzBdPXBbMl1bMF0reSkscFsxXVsxXT1wWzJdWzFdPWYueX19fX0oUixPLEUsayxQLHQsTixlKX12YXIgSnY9MipNYXRoLlBJLFF2PU1hdGguUEkvMTgwO2Z1bmN0aW9uIHR5KHQpe3JldHVybntzZXJpZXNUeXBlOnQscmVzZXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmZpbmRDb21wb25lbnRzKHttYWluVHlwZToibGVnZW5kIn0pO2lmKG4mJm4ubGVuZ3RoKXt2YXIgbz10LmdldERhdGEoKTtvLmZpbHRlclNlbGYoZnVuY3Rpb24odCl7Zm9yKHZhciBlPW8uZ2V0TmFtZSh0KSxpPTA7aTxuLmxlbmd0aDtpKyspaWYoIW5baV0uaXNTZWxlY3RlZChlKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX19fVh2KCJwaWUiLFt7dHlwZToicGllVG9nZ2xlU2VsZWN0IixldmVudDoicGllc2VsZWN0Y2hhbmdlZCIsbWV0aG9kOiJ0b2dnbGVTZWxlY3RlZCJ9LHt0eXBlOiJwaWVTZWxlY3QiLGV2ZW50OiJwaWVzZWxlY3RlZCIsbWV0aG9kOiJzZWxlY3QifSx7dHlwZToicGllVW5TZWxlY3QiLGV2ZW50OiJwaWV1bnNlbGVjdGVkIixtZXRob2Q6InVuU2VsZWN0In1dKSx5ZihZdigicGllIikpLHZmKFQoZnVuY3Rpb24odCxlLEEsaSl7ZS5lYWNoU2VyaWVzQnlUeXBlKHQsZnVuY3Rpb24odCl7dmFyIG89dC5nZXREYXRhKCksZT1vLm1hcERpbWVuc2lvbigidmFsdWUiKSxhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZ1KHQuZ2V0Qm94TGF5b3V0UGFyYW1zKCkse3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0pfSh0LEEpLGk9dC5nZXQoImNlbnRlciIpLG49dC5nZXQoInJhZGl1cyIpO2sobil8fChuPVswLG5dKSxrKGkpfHwoaT1baSxpXSk7dmFyIHI9UGwoYS53aWR0aCxBLmdldFdpZHRoKCkpLHM9UGwoYS5oZWlnaHQsQS5nZXRIZWlnaHQoKSksbD1NYXRoLm1pbihyLHMpLHU9UGwoaVswXSxyKSthLngsaD1QbChpWzFdLHMpK2EueSxjPVBsKG5bMF0sbC8yKSxkPVBsKG5bMV0sbC8yKSxmPS10LmdldCgic3RhcnRBbmdsZSIpKlF2LHA9dC5nZXQoIm1pbkFuZ2xlIikqUXYsZz0wO28uZWFjaChlLGZ1bmN0aW9uKHQpe2lzTmFOKHQpfHxnKyt9KTt2YXIgbT1vLmdldFN1bShlKSx2PU1hdGguUEkvKG18fGcpKjIseT10LmdldCgiY2xvY2t3aXNlIikseD10LmdldCgicm9zZVR5cGUiKSxfPXQuZ2V0KCJzdGlsbFNob3daZXJvU3VtIiksdz1vLmdldERhdGFFeHRlbnQoZSk7d1swXT0wO3ZhciBiPUp2LFM9MCxNPWYsST15PzE6LTE7aWYoby5lYWNoKGUsZnVuY3Rpb24odCxlKXt2YXIgaTtpZihpc05hTih0KSlvLnNldEl0ZW1MYXlvdXQoZSx7YW5nbGU6TmFOLHN0YXJ0QW5nbGU6TmFOLGVuZEFuZ2xlOk5hTixjbG9ja3dpc2U6eSxjeDp1LGN5OmgscjA6YyxyOng/TmFOOmQsdmlld1JlY3Q6YX0pO2Vsc2V7KGk9ImFyZWEiIT09eD8wPT09bSYmXz92OnQqdjpKdi9nKTxwP2ItPWk9cDpTKz10O3ZhciBuPU0rSSppO28uc2V0SXRlbUxheW91dChlLHthbmdsZTppLHN0YXJ0QW5nbGU6TSxlbmRBbmdsZTpuLGNsb2Nrd2lzZTp5LGN4OnUsY3k6aCxyMDpjLHI6eD9rbCh0LHcsW2MsZF0pOmQsdmlld1JlY3Q6YX0pLE09bn19KSxiPEp2JiZnKWlmKGI8PS4wMDEpe3ZhciBUPUp2L2c7by5lYWNoKGUsZnVuY3Rpb24odCxlKXtpZighaXNOYU4odCkpe3ZhciBpPW8uZ2V0SXRlbUxheW91dChlKTtpLmFuZ2xlPVQsaS5zdGFydEFuZ2xlPWYrSSplKlQsaS5lbmRBbmdsZT1mK0kqKGUrMSkqVH19KX1lbHNlIHY9Yi9TLE09ZixvLmVhY2goZSxmdW5jdGlvbih0LGUpe2lmKCFpc05hTih0KSl7dmFyIGk9by5nZXRJdGVtTGF5b3V0KGUpLG49aS5hbmdsZT09PXA/cDp0KnY7aS5zdGFydEFuZ2xlPU0saS5lbmRBbmdsZT1NK0kqbixNKz1JKm59fSk7JHYodCxkLGEud2lkdGgsYS5oZWlnaHQsYS54LGEueSl9KX0sInBpZSIpKSxwZih0eSgicGllIikpLGljLmV4dGVuZCh7dHlwZToic2VyaWVzLnNjYXR0ZXIiLGRlcGVuZGVuY2llczpbImdyaWQiLCJwb2xhciIsImdlbyIsInNpbmdsZUF4aXMiLCJjYWxlbmRhciJdLGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhwKHRoaXMuZ2V0U291cmNlKCksdGhpcyx7dXNlRW5jb2RlRGVmYXVsdGVyOiEwfSl9LGJydXNoU2VsZWN0b3I6InBvaW50IixnZXRQcm9ncmVzc2l2ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLnByb2dyZXNzaXZlO3JldHVybiBudWxsPT10P3RoaXMub3B0aW9uLmxhcmdlPzVlMzp0aGlzLmdldCgicHJvZ3Jlc3NpdmUiKTp0fSxnZXRQcm9ncmVzc2l2ZVRocmVzaG9sZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLnByb2dyZXNzaXZlVGhyZXNob2xkO3JldHVybiBudWxsPT10P3RoaXMub3B0aW9uLmxhcmdlPzFlNDp0aGlzLmdldCgicHJvZ3Jlc3NpdmVUaHJlc2hvbGQiKTp0fSxkZWZhdWx0T3B0aW9uOntjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsemxldmVsOjAsejoyLGxlZ2VuZEhvdmVyTGluazohMCxob3ZlckFuaW1hdGlvbjohMCxzeW1ib2xTaXplOjEwLGxhcmdlOiExLGxhcmdlVGhyZXNob2xkOjJlMyxpdGVtU3R5bGU6e29wYWNpdHk6Ljh9LGNsaXA6ITB9fSk7dmFyIGV5PUlzKHtzaGFwZTp7cG9pbnRzOm51bGx9LHN5bWJvbFByb3h5Om51bGwsc29mdENsaXBTaGFwZTpudWxsLGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUucG9pbnRzLG49ZS5zaXplLG89dGhpcy5zeW1ib2xQcm94eSxhPW8uc2hhcGU7aWYoISgodC5nZXRDb250ZXh0P3QuZ2V0Q29udGV4dCgpOnQpJiZuWzBdPDQpKWZvcih2YXIgcj0wO3I8aS5sZW5ndGg7KXt2YXIgcz1pW3IrK10sbD1pW3IrK107aXNOYU4ocyl8fGlzTmFOKGwpfHx0aGlzLnNvZnRDbGlwU2hhcGUmJiF0aGlzLnNvZnRDbGlwU2hhcGUuY29udGFpbihzLGwpfHwoYS54PXMtblswXS8yLGEueT1sLW5bMV0vMixhLndpZHRoPW5bMF0sYS5oZWlnaHQ9blsxXSxvLmJ1aWxkUGF0aCh0LGEsITApKX19LGFmdGVyQnJ1c2g6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zaGFwZSxpPWUucG9pbnRzLG49ZS5zaXplO2lmKG5bMF08NCl7dGhpcy5zZXRUcmFuc2Zvcm0odCk7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDspe3ZhciBhPWlbbysrXSxyPWlbbysrXTtpc05hTihhKXx8aXNOYU4ocil8fHRoaXMuc29mdENsaXBTaGFwZSYmIXRoaXMuc29mdENsaXBTaGFwZS5jb250YWluKGEscil8fHQuZmlsbFJlY3QoYS1uWzBdLzIsci1uWzFdLzIsblswXSxuWzFdKX10aGlzLnJlc3RvcmVUcmFuc2Zvcm0odCl9fSxmaW5kRGF0YUluZGV4OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuc2hhcGUsbj1pLnBvaW50cyxvPWkuc2l6ZSxhPU1hdGgubWF4KG9bMF0sNCkscj1NYXRoLm1heChvWzFdLDQpLHM9bi5sZW5ndGgvMi0xOzA8PXM7cy0tKXt2YXIgbD0yKnMsdT1uW2xdLWEvMixoPW5bMStsXS1yLzI7aWYodTw9dCYmaDw9ZSYmdDw9dSthJiZlPD1oK3IpcmV0dXJuIHN9cmV0dXJuLTF9fSk7ZnVuY3Rpb24gaXkoKXt0aGlzLmdyb3VwPW5ldyBJaX12YXIgbnk9aXkucHJvdG90eXBlO2Z1bmN0aW9uIG95KHQsZSxpKXtFZy5jYWxsKHRoaXMsdCxlLGkpLHRoaXMudHlwZT0idmFsdWUiLHRoaXMuYW5nbGU9MCx0aGlzLm5hbWU9IiIsdGhpcy5tb2RlbH1mdW5jdGlvbiBheSh0LGUsaSl7dGhpcy5fbW9kZWw9dCx0aGlzLmRpbWVuc2lvbnM9W10sdGhpcy5faW5kaWNhdG9yQXhlcz1OKHQuZ2V0SW5kaWNhdG9yTW9kZWxzKCksZnVuY3Rpb24odCxlKXt2YXIgaT0iaW5kaWNhdG9yXyIrZSxuPW5ldyBveShpLCJsb2ciPT09dC5nZXQoImF4aXNUeXBlIik/bmV3IEpwOm5ldyBTcCk7cmV0dXJuIG4ubmFtZT10LmdldCgibmFtZSIpLChuLm1vZGVsPXQpLmF4aXM9bix0aGlzLmRpbWVuc2lvbnMucHVzaChpKSxufSx0aGlzKSx0aGlzLnJlc2l6ZSh0LGkpLHRoaXMuY3gsdGhpcy5jeSx0aGlzLnIsdGhpcy5yMCx0aGlzLnN0YXJ0QW5nbGV9bnkuaXNQZXJzaXN0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2luY3JlbWVudGFsfSxueS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgaT1uZXcgZXkoe3JlY3RIb3ZlcjohMCxjdXJzb3I6ImRlZmF1bHQifSk7aS5zZXRTaGFwZSh7cG9pbnRzOnQuZ2V0TGF5b3V0KCJzeW1ib2xQb2ludHMiKX0pLHRoaXMuX3NldENvbW1vbihpLHQsITEsZSksdGhpcy5ncm91cC5hZGQoaSksdGhpcy5faW5jcmVtZW50YWw9bnVsbH0sbnkudXBkYXRlTGF5b3V0PWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9pbmNyZW1lbnRhbCl7dmFyIG49dC5nZXRMYXlvdXQoInN5bWJvbFBvaW50cyIpO3RoaXMuZ3JvdXAuZWFjaENoaWxkKGZ1bmN0aW9uKHQpe2lmKG51bGwhPXQuc3RhcnRJbmRleCl7dmFyIGU9MioodC5lbmRJbmRleC10LnN0YXJ0SW5kZXgpLGk9NCp0LnN0YXJ0SW5kZXgqMjtuPW5ldyBGbG9hdDMyQXJyYXkobi5idWZmZXIsaSxlKX10LnNldFNoYXBlKCJwb2ludHMiLG4pfSl9fSxueS5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl9jbGVhckluY3JlbWVudGFsKCksMmU2PHQuY291bnQoKT8odGhpcy5faW5jcmVtZW50YWx8fCh0aGlzLl9pbmNyZW1lbnRhbD1uZXcgZnMoe3NpbGVudDohMH0pKSx0aGlzLmdyb3VwLmFkZCh0aGlzLl9pbmNyZW1lbnRhbCkpOnRoaXMuX2luY3JlbWVudGFsPW51bGx9LG55LmluY3JlbWVudGFsVXBkYXRlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbjt0aGlzLl9pbmNyZW1lbnRhbD8obj1uZXcgZXksdGhpcy5faW5jcmVtZW50YWwuYWRkRGlzcGxheWFibGUobiwhMCkpOigobj1uZXcgZXkoe3JlY3RIb3ZlcjohMCxjdXJzb3I6ImRlZmF1bHQiLHN0YXJ0SW5kZXg6dC5zdGFydCxlbmRJbmRleDp0LmVuZH0pKS5pbmNyZW1lbnRhbD0hMCx0aGlzLmdyb3VwLmFkZChuKSksbi5zZXRTaGFwZSh7cG9pbnRzOmUuZ2V0TGF5b3V0KCJzeW1ib2xQb2ludHMiKX0pLHRoaXMuX3NldENvbW1vbihuLGUsISF0aGlzLl9pbmNyZW1lbnRhbCxpKX0sbnkuX3NldENvbW1vbj1mdW5jdGlvbihpLHQsZSxuKXt2YXIgbz10Lmhvc3RNb2RlbDtuPW58fHt9O3ZhciBhPXQuZ2V0VmlzdWFsKCJzeW1ib2xTaXplIik7aS5zZXRTaGFwZSgic2l6ZSIsYSBpbnN0YW5jZW9mIEFycmF5P2E6W2EsYV0pLGkuc29mdENsaXBTaGFwZT1uLmNsaXBTaGFwZXx8bnVsbCxpLnN5bWJvbFByb3h5PW1nKHQuZ2V0VmlzdWFsKCJzeW1ib2wiKSwwLDAsMCwwKSxpLnNldENvbG9yPWkuc3ltYm9sUHJveHkuc2V0Q29sb3I7dmFyIHI9aS5zaGFwZS5zaXplWzBdPDQ7aS51c2VTdHlsZShvLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUocj9bImNvbG9yIiwic2hhZG93Qmx1ciIsInNoYWRvd0NvbG9yIl06WyJjb2xvciJdKSk7dmFyIHM9dC5nZXRWaXN1YWwoImNvbG9yIik7cyYmaS5zZXRDb2xvcihzKSxlfHwoaS5zZXJpZXNJbmRleD1vLnNlcmllc0luZGV4LGkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7aS5kYXRhSW5kZXg9bnVsbDt2YXIgZT1pLmZpbmREYXRhSW5kZXgodC5vZmZzZXRYLHQub2Zmc2V0WSk7MDw9ZSYmKGkuZGF0YUluZGV4PWUrKGkuc3RhcnRJbmRleHx8MCkpfSkpfSxueS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckluY3JlbWVudGFsKCksdGhpcy5faW5jcmVtZW50YWw9bnVsbCx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxueS5fY2xlYXJJbmNyZW1lbnRhbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2luY3JlbWVudGFsO3QmJnQuY2xlYXJEaXNwbGF5YmxlcygpfSxNZih7dHlwZToic2NhdHRlciIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldERhdGEoKTt0aGlzLl91cGRhdGVTeW1ib2xEcmF3KG4sdCkudXBkYXRlRGF0YShuLHtjbGlwU2hhcGU6dGhpcy5fZ2V0Q2xpcFNoYXBlKHQpfSksdGhpcy5fZmluaXNoZWQ9ITB9LGluY3JlbWVudGFsUHJlcGFyZVJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5nZXREYXRhKCk7dGhpcy5fdXBkYXRlU3ltYm9sRHJhdyhuLHQpLmluY3JlbWVudGFsUHJlcGFyZVVwZGF0ZShuKSx0aGlzLl9maW5pc2hlZD0hMX0saW5jcmVtZW50YWxSZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX3N5bWJvbERyYXcuaW5jcmVtZW50YWxVcGRhdGUodCxlLmdldERhdGEoKSx7Y2xpcFNoYXBlOnRoaXMuX2dldENsaXBTaGFwZShlKX0pLHRoaXMuX2ZpbmlzaGVkPXQuZW5kPT09ZS5nZXREYXRhKCkuY291bnQoKX0sdXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldERhdGEoKTtpZih0aGlzLmdyb3VwLmRpcnR5KCksIXRoaXMuX2ZpbmlzaGVkfHwxZTQ8bi5jb3VudCgpfHwhdGhpcy5fc3ltYm9sRHJhdy5pc1BlcnNpc3RlbnQoKSlyZXR1cm57dXBkYXRlOiEwfTt2YXIgbz1JbSgpLnJlc2V0KHQpO28ucHJvZ3Jlc3MmJm8ucHJvZ3Jlc3Moe3N0YXJ0OjAsZW5kOm4uY291bnQoKX0sbiksdGhpcy5fc3ltYm9sRHJhdy51cGRhdGVMYXlvdXQobil9LF9nZXRDbGlwU2hhcGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtLGk9ZSYmZS5nZXRBcmVhJiZlLmdldEFyZWEoKTtyZXR1cm4gdC5nZXQoImNsaXAiLCEwKT9pOm51bGx9LF91cGRhdGVTeW1ib2xEcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc3ltYm9sRHJhdyxuPWUucGlwZWxpbmVDb250ZXh0LmxhcmdlO3JldHVybiBpJiZuPT09dGhpcy5faXNMYXJnZURyYXd8fChpJiZpLnJlbW92ZSgpLGk9dGhpcy5fc3ltYm9sRHJhdz1uP25ldyBpeTpuZXcgJGcsdGhpcy5faXNMYXJnZURyYXc9bix0aGlzLmdyb3VwLnJlbW92ZUFsbCgpKSx0aGlzLmdyb3VwLmFkZChpLmdyb3VwKSxpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt0aGlzLl9zeW1ib2xEcmF3JiZ0aGlzLl9zeW1ib2xEcmF3LnJlbW92ZSghMCksdGhpcy5fc3ltYm9sRHJhdz1udWxsfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pLHlmKE1tKCJzY2F0dGVyIiwiY2lyY2xlIikpLHZmKEltKCJzY2F0dGVyIikpLHcob3ksRWcpLGF5LnByb3RvdHlwZS5nZXRJbmRpY2F0b3JBeGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luZGljYXRvckF4ZXN9LGF5LnByb3RvdHlwZS5kYXRhVG9Qb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2luZGljYXRvckF4ZXNbZV07cmV0dXJuIHRoaXMuY29vcmRUb1BvaW50KGkuZGF0YVRvQ29vcmQodCksZSl9LGF5LnByb3RvdHlwZS5jb29yZFRvUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9pbmRpY2F0b3JBeGVzW2VdLmFuZ2xlO3JldHVyblt0aGlzLmN4K3QqTWF0aC5jb3MoaSksdGhpcy5jeS10Kk1hdGguc2luKGkpXX0sYXkucHJvdG90eXBlLnBvaW50VG9EYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0tdGhpcy5jeCxpPXRbMV0tdGhpcy5jeSxuPU1hdGguc3FydChlKmUraSppKTtlLz1uLGkvPW47Zm9yKHZhciBvLGE9TWF0aC5hdGFuMigtaSxlKSxyPTEvMCxzPS0xLGw9MDtsPHRoaXMuX2luZGljYXRvckF4ZXMubGVuZ3RoO2wrKyl7dmFyIHU9dGhpcy5faW5kaWNhdG9yQXhlc1tsXSxoPU1hdGguYWJzKGEtdS5hbmdsZSk7aDxyJiYobz11LHM9bCxyPWgpfXJldHVybltzLCsobyYmby5jb29yZFRvRGF0YShuKSldfSxheS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXQoImNlbnRlciIpLG49ZS5nZXRXaWR0aCgpLG89ZS5nZXRIZWlnaHQoKSxhPU1hdGgubWluKG4sbykvMjt0aGlzLmN4PVBsKGlbMF0sbiksdGhpcy5jeT1QbChpWzFdLG8pLHRoaXMuc3RhcnRBbmdsZT10LmdldCgic3RhcnRBbmdsZSIpKk1hdGguUEkvMTgwO3ZhciByPXQuZ2V0KCJyYWRpdXMiKTsic3RyaW5nIiE9dHlwZW9mIHImJiJudW1iZXIiIT10eXBlb2Ygcnx8KHI9WzAscl0pLHRoaXMucjA9UGwoclswXSxhKSx0aGlzLnI9UGwoclsxXSxhKSxFKHRoaXMuX2luZGljYXRvckF4ZXMsZnVuY3Rpb24odCxlKXt0LnNldEV4dGVudCh0aGlzLnIwLHRoaXMucik7dmFyIGk9dGhpcy5zdGFydEFuZ2xlK2UqTWF0aC5QSSoyL3RoaXMuX2luZGljYXRvckF4ZXMubGVuZ3RoO2k9TWF0aC5hdGFuMihNYXRoLnNpbihpKSxNYXRoLmNvcyhpKSksdC5hbmdsZT1pfSx0aGlzKX0sYXkucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihuLHQpe3ZhciBvPXRoaXMuX2luZGljYXRvckF4ZXMsYT10aGlzLl9tb2RlbDtFKG8sZnVuY3Rpb24odCl7dC5zY2FsZS5zZXRFeHRlbnQoMS8wLC0xLzApfSksbi5lYWNoU2VyaWVzQnlUeXBlKCJyYWRhciIsZnVuY3Rpb24odCxlKXtpZigicmFkYXIiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSYmbi5nZXRDb21wb25lbnQoInJhZGFyIix0LmdldCgicmFkYXJJbmRleCIpKT09PWEpe3ZhciBpPXQuZ2V0RGF0YSgpO0UobyxmdW5jdGlvbih0KXt0LnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoaSxpLm1hcERpbWVuc2lvbih0LmRpbSkpfSl9fSx0aGlzKTt2YXIgZj1hLmdldCgic3BsaXROdW1iZXIiKTtmdW5jdGlvbiBwKHQpe3ZhciBlPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjEwKSksaT10L2U7cmV0dXJuIDI9PT1pP2k9NTppKj0yLGkqZX1FKG8sZnVuY3Rpb24odCxlKXt2YXIgaT10Zyh0LnNjYWxlLHQubW9kZWwpO2VnKHQuc2NhbGUsdC5tb2RlbCk7dmFyIG49dC5tb2RlbCxvPXQuc2NhbGUsYT1uLmdldE1pbigpLHI9bi5nZXRNYXgoKSxzPW8uZ2V0SW50ZXJ2YWwoKTtpZihudWxsIT1hJiZudWxsIT1yKW8uc2V0RXh0ZW50KCthLCtyKSxvLnNldEludGVydmFsKChyLWEpL2YpO2Vsc2UgaWYobnVsbCE9YSlmb3IodmFyIGw7bD1hK3MqZixvLnNldEV4dGVudCgrYSxsKSxvLnNldEludGVydmFsKHMpLHM9cChzKSxsPGlbMV0mJmlzRmluaXRlKGwpJiZpc0Zpbml0ZShpWzFdKTspO2Vsc2UgaWYobnVsbCE9cilmb3IodmFyIHU7dT1yLXMqZixvLnNldEV4dGVudCh1LCtyKSxvLnNldEludGVydmFsKHMpLHM9cChzKSx1PmlbMF0mJmlzRmluaXRlKHUpJiZpc0Zpbml0ZShpWzBdKTspO2Vsc2V7dmFyIGg9by5nZXRUaWNrcygpLmxlbmd0aC0xO2Y8aCYmKHM9cChzKSk7dmFyIGM9TWF0aC5yb3VuZCgoaVswXStpWzFdKS8yL3MpKnMsZD1NYXRoLnJvdW5kKGYvMik7by5zZXRFeHRlbnQoTmwoYy1kKnMpLE5sKGMrKGYtZCkqcykpLG8uc2V0SW50ZXJ2YWwocyl9fSl9LGF5LmRpbWVuc2lvbnM9W10sYXkuY3JlYXRlPWZ1bmN0aW9uKGksbil7dmFyIG89W107cmV0dXJuIGkuZWFjaENvbXBvbmVudCgicmFkYXIiLGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBheSh0LGksbik7by5wdXNoKGUpLHQuY29vcmRpbmF0ZVN5c3RlbT1lfSksaS5lYWNoU2VyaWVzQnlUeXBlKCJyYWRhciIsZnVuY3Rpb24odCl7InJhZGFyIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikmJih0LmNvb3JkaW5hdGVTeXN0ZW09b1t0LmdldCgicmFkYXJJbmRleCIpfHwwXSl9KSxvfSxuaC5yZWdpc3RlcigicmFkYXIiLGF5KTt2YXIgcnk9Tm0udmFsdWVBeGlzO2Z1bmN0aW9uIHN5KHQsZSl7cmV0dXJuIEMoe3Nob3c6ZX0sdCl9d2Yoe3R5cGU6InJhZGFyIixvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXQoImJvdW5kYXJ5R2FwIiksYT10aGlzLmdldCgic3BsaXROdW1iZXIiKSxyPXRoaXMuZ2V0KCJzY2FsZSIpLHM9dGhpcy5nZXQoImF4aXNMaW5lIiksbD10aGlzLmdldCgiYXhpc1RpY2siKSx1PXRoaXMuZ2V0KCJheGlzVHlwZSIpLGg9dGhpcy5nZXQoImF4aXNMYWJlbCIpLGM9dGhpcy5nZXQoIm5hbWUiKSxkPXRoaXMuZ2V0KCJuYW1lLnNob3ciKSxmPXRoaXMuZ2V0KCJuYW1lLmZvcm1hdHRlciIpLHA9dGhpcy5nZXQoIm5hbWVHYXAiKSxnPXRoaXMuZ2V0KCJ0cmlnZ2VyRXZlbnQiKSx0PU4odGhpcy5nZXQoImluZGljYXRvciIpfHxbXSxmdW5jdGlvbih0KXtudWxsIT10Lm1heCYmMDx0Lm1heCYmIXQubWluP3QubWluPTA6bnVsbCE9dC5taW4mJnQubWluPDAmJiF0Lm1heCYmKHQubWF4PTApO3ZhciBlPWM7aWYobnVsbCE9dC5jb2xvciYmKGU9Qyh7Y29sb3I6dC5jb2xvcn0sYykpLHQ9bShEKHQpLHtib3VuZGFyeUdhcDpvLHNwbGl0TnVtYmVyOmEsc2NhbGU6cixheGlzTGluZTpzLGF4aXNUaWNrOmwsYXhpc1R5cGU6dSxheGlzTGFiZWw6aCxuYW1lOnQudGV4dCxuYW1lTG9jYXRpb246ImVuZCIsbmFtZUdhcDpwLG5hbWVUZXh0U3R5bGU6ZSx0cmlnZ2VyRXZlbnQ6Z30sITEpLGR8fCh0Lm5hbWU9IiIpLCJzdHJpbmciPT10eXBlb2YgZil7dmFyIGk9dC5uYW1lO3QubmFtZT1mLnJlcGxhY2UoInt2YWx1ZX0iLG51bGwhPWk/aToiIil9ZWxzZSJmdW5jdGlvbiI9PXR5cGVvZiBmJiYodC5uYW1lPWYodC5uYW1lLHQpKTt2YXIgbj1MKG5ldyBJbCh0LG51bGwsdGhpcy5lY01vZGVsKSxzZyk7cmV0dXJuIG4ubWFpblR5cGU9InJhZGFyIixuLmNvbXBvbmVudEluZGV4PXRoaXMuY29tcG9uZW50SW5kZXgsbn0sdGhpcyk7dGhpcy5nZXRJbmRpY2F0b3JNb2RlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gdH19LGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6MCxjZW50ZXI6WyI1MCUiLCI1MCUiXSxyYWRpdXM6Ijc1JSIsc3RhcnRBbmdsZTo5MCxuYW1lOntzaG93OiEwfSxib3VuZGFyeUdhcDpbMCwwXSxzcGxpdE51bWJlcjo1LG5hbWVHYXA6MTUsc2NhbGU6ITEsc2hhcGU6InBvbHlnb24iLGF4aXNMaW5lOm0oe2xpbmVTdHlsZTp7Y29sb3I6IiNiYmIifX0scnkuYXhpc0xpbmUpLGF4aXNMYWJlbDpzeShyeS5heGlzTGFiZWwsITEpLGF4aXNUaWNrOnN5KHJ5LmF4aXNUaWNrLCExKSxheGlzVHlwZToiaW50ZXJ2YWwiLHNwbGl0TGluZTpzeShyeS5zcGxpdExpbmUsITApLHNwbGl0QXJlYTpzeShyeS5zcGxpdEFyZWEsITApLGluZGljYXRvcjpbXX19KTt2YXIgbHk9WyJheGlzTGluZSIsImF4aXNUaWNrTGFiZWwiLCJheGlzTmFtZSJdO2JmKHt0eXBlOiJyYWRhciIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2J1aWxkQXhlcyh0KSx0aGlzLl9idWlsZFNwbGl0TGluZUFuZEFyZWEodCl9LF9idWlsZEF4ZXM6ZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO0UoTihlLmdldEluZGljYXRvckF4ZXMoKSxmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFltKHQubW9kZWwse3Bvc2l0aW9uOltlLmN4LGUuY3ldLHJvdGF0aW9uOnQuYW5nbGUsbGFiZWxEaXJlY3Rpb246LTEsdGlja0RpcmVjdGlvbjotMSxuYW1lRGlyZWN0aW9uOjF9KX0pLGZ1bmN0aW9uKHQpe0UobHksdC5hZGQsdCksdGhpcy5ncm91cC5hZGQodC5nZXRHcm91cCgpKX0sdGhpcyl9LF9idWlsZFNwbGl0TGluZUFuZEFyZWE6ZnVuY3Rpb24odCl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtLGU9bi5nZXRJbmRpY2F0b3JBeGVzKCk7aWYoZS5sZW5ndGgpe3ZhciBpPXQuZ2V0KCJzaGFwZSIpLG89dC5nZXRNb2RlbCgic3BsaXRMaW5lIiksYT10LmdldE1vZGVsKCJzcGxpdEFyZWEiKSxyPW8uZ2V0TW9kZWwoImxpbmVTdHlsZSIpLHM9YS5nZXRNb2RlbCgiYXJlYVN0eWxlIiksbD1vLmdldCgic2hvdyIpLHU9YS5nZXQoInNob3ciKSxoPXIuZ2V0KCJjb2xvciIpLGM9cy5nZXQoImNvbG9yIik7aD1rKGgpP2g6W2hdLGM9ayhjKT9jOltjXTt2YXIgZD1bXSxmPVtdO2lmKCJjaXJjbGUiPT09aSlmb3IodmFyIHA9ZVswXS5nZXRUaWNrc0Nvb3JkcygpLGc9bi5jeCxtPW4uY3ksdj0wO3Y8cC5sZW5ndGg7disrKXtpZihsKWRbSShkLGgsdildLnB1c2gobmV3IEhyKHtzaGFwZTp7Y3g6ZyxjeTptLHI6cFt2XS5jb29yZH19KSk7aWYodSYmdjxwLmxlbmd0aC0xKWZbSShmLGMsdildLnB1c2gobmV3IFhyKHtzaGFwZTp7Y3g6ZyxjeTptLHIwOnBbdl0uY29vcmQscjpwW3YrMV0uY29vcmR9fSkpfWVsc2V7dmFyIHkseD1OKGUsZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldFRpY2tzQ29vcmRzKCk7cmV0dXJuIHk9bnVsbD09eT9pLmxlbmd0aC0xOk1hdGgubWluKGkubGVuZ3RoLTEseSksTihpLGZ1bmN0aW9uKHQpe3JldHVybiBuLmNvb3JkVG9Qb2ludCh0LmNvb3JkLGUpfSl9KSxfPVtdO2Zvcih2PTA7djw9eTt2Kyspe2Zvcih2YXIgdz1bXSxiPTA7YjxlLmxlbmd0aDtiKyspdy5wdXNoKHhbYl1bdl0pO2lmKHdbMF0mJncucHVzaCh3WzBdLnNsaWNlKCkpLGwpZFtJKGQsaCx2KV0ucHVzaChuZXcgS3Ioe3NoYXBlOntwb2ludHM6d319KSk7aWYodSYmXylmW0koZixjLHYtMSldLnB1c2gobmV3IHFyKHtzaGFwZTp7cG9pbnRzOncuY29uY2F0KF8pfX0pKTtfPXcuc2xpY2UoKS5yZXZlcnNlKCl9fXZhciBTPXIuZ2V0TGluZVN0eWxlKCksTT1zLmdldEFyZWFTdHlsZSgpO0UoZixmdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXAuYWRkKGtzKHQse3N0eWxlOkMoe3N0cm9rZToibm9uZSIsZmlsbDpjW2UlYy5sZW5ndGhdfSxNKSxzaWxlbnQ6ITB9KSl9LHRoaXMpLEUoZCxmdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXAuYWRkKGtzKHQse3N0eWxlOkMoe2ZpbGw6Im5vbmUiLHN0cm9rZTpoW2UlaC5sZW5ndGhdfSxTKSxzaWxlbnQ6ITB9KSl9LHRoaXMpfWZ1bmN0aW9uIEkodCxlLGkpe3ZhciBuPWklZS5sZW5ndGg7cmV0dXJuIHRbbl09dFtuXXx8W10sbn19fSk7dmFyIHV5PWljLmV4dGVuZCh7dHlwZToic2VyaWVzLnJhZGFyIixkZXBlbmRlbmNpZXM6WyJyYWRhciJdLGluaXQ6ZnVuY3Rpb24odCl7dXkuc3VwZXJBcHBseSh0aGlzLCJpbml0Iixhcmd1bWVudHMpLHRoaXMubGVnZW5kVmlzdWFsUHJvdmlkZXI9bmV3IEd2KEEodGhpcy5nZXREYXRhLHRoaXMpLEEodGhpcy5nZXRSYXdEYXRhLHRoaXMpKX0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gQnYodGhpcyx7Z2VuZXJhdGVDb29yZDoiaW5kaWNhdG9yXyIsZ2VuZXJhdGVDb29yZENvdW50OjEvMH0pfSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKG4pe3ZhciBvPXRoaXMuZ2V0RGF0YSgpLHQ9dGhpcy5jb29yZGluYXRlU3lzdGVtLmdldEluZGljYXRvckF4ZXMoKSxlPXRoaXMuZ2V0RGF0YSgpLmdldE5hbWUobik7cmV0dXJuIGV1KCIiPT09ZT90aGlzLm5hbWU6ZSkrIjxici8+IitOKHQsZnVuY3Rpb24odCxlKXt2YXIgaT1vLmdldChvLm1hcERpbWVuc2lvbih0LmRpbSksbik7cmV0dXJuIGV1KHQubmFtZSsiIDogIitpKX0pLmpvaW4oIjxiciAvPiIpfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToicmFkYXIiLGxlZ2VuZEhvdmVyTGluazohMCxyYWRhckluZGV4OjAsbGluZVN0eWxlOnt3aWR0aDoyLHR5cGU6InNvbGlkIn0sbGFiZWw6e3Bvc2l0aW9uOiJ0b3AifSxzeW1ib2w6ImVtcHR5Q2lyY2xlIixzeW1ib2xTaXplOjR9fSk7TWYoe3R5cGU6InJhZGFyIixyZW5kZXI6ZnVuY3Rpb24obCx0LGUpe3ZhciBpPWwuY29vcmRpbmF0ZVN5c3RlbSxnPXRoaXMuZ3JvdXAsbT1sLmdldERhdGEoKSxzPXRoaXMuX2RhdGE7ZnVuY3Rpb24gdSh0LGUpe3ZhciBpPXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2wiKXx8ImNpcmNsZSIsbj10LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKTtpZigibm9uZSIhPT1pKXt2YXIgbz1mdW5jdGlvbih0KXtyZXR1cm4gayh0KXx8KHQ9Wyt0LCt0XSksdH0odC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbFNpemUiKSksYT1tZyhpLC0xLC0xLDIsMixuKTtyZXR1cm4gYS5hdHRyKHtzdHlsZTp7c3Ryb2tlTm9TY2FsZTohMH0sejI6MTAwLHNjYWxlOltvWzBdLzIsb1sxXS8yXX0pLGF9fWZ1bmN0aW9uIGgodCxlLGksbixvLGEpe2kucmVtb3ZlQWxsKCk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aC0xO3IrKyl7dmFyIHM9dShuLG8pO3MmJih0W3MuX19kaW1JZHg9cl0/KHMuYXR0cigicG9zaXRpb24iLHRbcl0pLHlsW2E/ImluaXRQcm9wcyI6InVwZGF0ZVByb3BzIl0ocyx7cG9zaXRpb246ZVtyXX0sbCxvKSk6cy5hdHRyKCJwb3NpdGlvbiIsZVtyXSksaS5hZGQocykpfX1mdW5jdGlvbiBjKHQpe3JldHVybiBOKHQsZnVuY3Rpb24odCl7cmV0dXJuW2kuY3gsaS5jeV19KX1tLmRpZmYocykuYWRkKGZ1bmN0aW9uKHQpe3ZhciBlPW0uZ2V0SXRlbUxheW91dCh0KTtpZihlKXt2YXIgaT1uZXcgcXIsbj1uZXcgS3Isbz17c2hhcGU6e3BvaW50czplfX07aS5zaGFwZS5wb2ludHM9YyhlKSxuLnNoYXBlLnBvaW50cz1jKGUpLGxsKGksbyxsLHQpLGxsKG4sbyxsLHQpO3ZhciBhPW5ldyBJaSxyPW5ldyBJaTthLmFkZChuKSxhLmFkZChpKSxhLmFkZChyKSxoKG4uc2hhcGUucG9pbnRzLGUscixtLHQsITApLG0uc2V0SXRlbUdyYXBoaWNFbCh0LGEpfX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPXMuZ2V0SXRlbUdyYXBoaWNFbChlKSxuPWkuY2hpbGRBdCgwKSxvPWkuY2hpbGRBdCgxKSxhPWkuY2hpbGRBdCgyKSxyPXtzaGFwZTp7cG9pbnRzOm0uZ2V0SXRlbUxheW91dCh0KX19O3Iuc2hhcGUucG9pbnRzJiYoaChuLnNoYXBlLnBvaW50cyxyLnNoYXBlLnBvaW50cyxhLG0sdCwhMSksc2wobixyLGwpLHNsKG8scixsKSxtLnNldEl0ZW1HcmFwaGljRWwodCxpKSl9KS5yZW1vdmUoZnVuY3Rpb24odCl7Zy5yZW1vdmUocy5nZXRJdGVtR3JhcGhpY0VsKHQpKX0pLmV4ZWN1dGUoKSxtLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsaSl7dmFyIGU9bS5nZXRJdGVtTW9kZWwoaSksbj10LmNoaWxkQXQoMCksbz10LmNoaWxkQXQoMSksYT10LmNoaWxkQXQoMikscj1tLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKTtnLmFkZCh0KSxuLnVzZVN0eWxlKEMoZS5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCkse2ZpbGw6Im5vbmUiLHN0cm9rZTpyfSkpLG4uaG92ZXJTdHlsZT1lLmdldE1vZGVsKCJlbXBoYXNpcy5saW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKTt2YXIgcz1lLmdldE1vZGVsKCJhcmVhU3R5bGUiKSxsPWUuZ2V0TW9kZWwoImVtcGhhc2lzLmFyZWFTdHlsZSIpLHU9cy5pc0VtcHR5KCkmJnMucGFyZW50TW9kZWwuaXNFbXB0eSgpLGg9bC5pc0VtcHR5KCkmJmwucGFyZW50TW9kZWwuaXNFbXB0eSgpO2g9aCYmdSxvLmlnbm9yZT11LG8udXNlU3R5bGUoQyhzLmdldEFyZWFTdHlsZSgpLHtmaWxsOnIsb3BhY2l0eTouN30pKSxvLmhvdmVyU3R5bGU9bC5nZXRBcmVhU3R5bGUoKTt2YXIgYz1lLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoWyJjb2xvciJdKSxkPWUuZ2V0TW9kZWwoImVtcGhhc2lzLml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpLGY9ZS5nZXRNb2RlbCgibGFiZWwiKSxwPWUuZ2V0TW9kZWwoImVtcGhhc2lzLmxhYmVsIik7YS5lYWNoQ2hpbGQoZnVuY3Rpb24odCl7dC5zZXRTdHlsZShjKSx0LmhvdmVyU3R5bGU9RChkKTt2YXIgZT1tLmdldChtLmRpbWVuc2lvbnNbdC5fX2RpbUlkeF0saSk7bnVsbCE9ZSYmIWlzTmFOKGUpfHwoZT0iIiksJHModC5zdHlsZSx0LmhvdmVyU3R5bGUsZixwLHtsYWJlbEZldGNoZXI6bS5ob3N0TW9kZWwsbGFiZWxEYXRhSW5kZXg6aSxsYWJlbERpbUluZGV4OnQuX19kaW1JZHgsZGVmYXVsdFRleHQ6ZSxhdXRvQ29sb3I6cixpc1JlY3RUZXh0OiEwfSl9KSx0LmhpZ2hEb3duT25VcGRhdGU9ZnVuY3Rpb24odCxlKXtvLmF0dHIoImlnbm9yZSIsImVtcGhhc2lzIj09PWU/aDp1KX0sWXModCl9KSx0aGlzLl9kYXRhPW19LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fZGF0YT1udWxsfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pO2Z1bmN0aW9uIGh5KHQpe3JldHVybiFpc05hTih0WzBdKSYmIWlzTmFOKHRbMV0pfWZ1bmN0aW9uIGN5KHQpe3JldHVyblt0LmN4LHQuY3ldfXlmKFl2KCJyYWRhciIpKSx5ZihNbSgicmFkYXIiLCJjaXJjbGUiKSksdmYoZnVuY3Rpb24odCl7dC5lYWNoU2VyaWVzQnlUeXBlKCJyYWRhciIsZnVuY3Rpb24odCl7dmFyIGk9dC5nZXREYXRhKCksbz1bXSxhPXQuY29vcmRpbmF0ZVN5c3RlbTtpZihhKXt2YXIgZT1hLmdldEluZGljYXRvckF4ZXMoKTtFKGUsZnVuY3Rpb24odCxuKXtpLmVhY2goaS5tYXBEaW1lbnNpb24oZVtuXS5kaW0pLGZ1bmN0aW9uKHQsZSl7b1tlXT1vW2VdfHxbXTt2YXIgaT1hLmRhdGFUb1BvaW50KHQsbik7b1tlXVtuXT1oeShpKT9pOmN5KGEpfSl9KSxpLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9SShvW3RdLGZ1bmN0aW9uKHQpe3JldHVybiBoeSh0KX0pfHxjeShhKTtvW3RdLnB1c2goZS5zbGljZSgpKSxpLnNldEl0ZW1MYXlvdXQodCxvW3RdKX0pfX0pfSkscGYodHkoInJhZGFyIikpLGZmKGZ1bmN0aW9uKGkpe3ZhciB0PWkucG9sYXI7aWYodCl7ayh0KXx8KHQ9W3RdKTt2YXIgbj1bXTtFKHQsZnVuY3Rpb24odCxlKXt0LmluZGljYXRvcj8odC50eXBlJiYhdC5zaGFwZSYmKHQuc2hhcGU9dC50eXBlKSxpLnJhZGFyPWkucmFkYXJ8fFtdLGsoaS5yYWRhcil8fChpLnJhZGFyPVtpLnJhZGFyXSksaS5yYWRhci5wdXNoKHQpKTpuLnB1c2godCl9KSxpLnBvbGFyPW59RShpLnNlcmllcyxmdW5jdGlvbih0KXt0JiYicmFkYXIiPT09dC50eXBlJiZ0LnBvbGFySW5kZXgmJih0LnJhZGFySW5kZXg9dC5wb2xhckluZGV4KX0pfSk7Zm9yKHZhciBkeT1bMTI2LDI1XSxmeT1bW1swLDMuNV0sWzcsMTEuMl0sWzE1LDExLjldLFszMCw3XSxbNDIsLjddLFs1MiwuN10sWzU2LDcuN10sWzU5LC43XSxbNjQsLjddLFs2NCwwXSxbNSwwXSxbMCwzLjVdXSxbWzEzLDE2LjFdLFsxOSwxNC43XSxbMTYsMjEuN10sWzExLDIzLjFdLFsxMywxNi4xXV0sW1sxMiwzMi4yXSxbMTQsMzguNV0sWzE1LDM4LjVdLFsxMywzMi4yXSxbMTIsMzIuMl1dLFtbMTYsNDcuNl0sWzEyLDUzLjJdLFsxMyw1My4yXSxbMTgsNDcuNl0sWzE2LDQ3LjZdXSxbWzYsNjQuNF0sWzgsNzBdLFs5LDcwXSxbOCw2NC40XSxbNiw2NC40XV0sW1syMyw4Mi42XSxbMjksNzkuOF0sWzMwLDc5LjhdLFsyNSw4Mi42XSxbMjMsODIuNl1dLFtbMzcsNzAuN10sWzQzLDYyLjNdLFs0NCw2Mi4zXSxbMzksNzAuN10sWzM3LDcwLjddXSxbWzQ4LDUxLjFdLFs1MSw0NS41XSxbNTMsNDUuNV0sWzUwLDUxLjFdLFs0OCw1MS4xXV0sW1s1MSwzNV0sWzUxLDI4LjddLFs1MywyOC43XSxbNTMsMzVdLFs1MSwzNV1dLFtbNTIsMjIuNF0sWzU1LDE3LjVdLFs1NiwxNy41XSxbNTMsMjIuNF0sWzUyLDIyLjRdXSxbWzU4LDEyLjZdLFs2Miw3XSxbNjMsN10sWzYwLDEyLjZdLFs1OCwxMi42XV0sW1swLDMuNV0sWzAsOTMuMV0sWzY0LDkzLjFdLFs2NCwwXSxbNjMsMF0sWzYzLDkyLjRdLFsxLDkyLjRdLFsxLDMuNV0sWzAsMy41XV1dLHB5PTA7cHk8ZnkubGVuZ3RoO3B5KyspZm9yKHZhciBneT0wO2d5PGZ5W3B5XS5sZW5ndGg7Z3krKylmeVtweV1bZ3ldWzBdLz0xMC41LGZ5W3B5XVtneV1bMV0vPS0xNCxmeVtweV1bZ3ldWzBdKz1keVswXSxmeVtweV1bZ3ldWzFdKz1keVsxXTt2YXIgbXk9eyLljZfmtbfor7jlspsiOlszMiw4MF0sIuW5v+S4nCI6WzAsLTEwXSwi6aaZ5rivIjpbMTAsNV0sIua+s+mXqCI6Wy0xMCwxMF0sIuWkqea0pSI6WzUsNV19LHZ5PXtSdXNzaWE6WzEwMCw2MF0sIlVuaXRlZCBTdGF0ZXMiOlstOTksMzhdLCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiOlstOTksMzhdfSx5eT1bW1sxMjMuNDUxNjUyNTI2ODU1NDcsMjUuNzM1MjcxNjQ0MDIyNjFdLFsxMjMuNDk3MzE0NDUzMTI0OTksMjUuNzM1MjcxNjQ0MDIyNjFdLFsxMjMuNDk3MzE0NDUzMTI0OTksMjUuNzUwNzM0MDY0NjAwODg0XSxbMTIzLjQ1MTY1MjUyNjg1NTQ3LDI1Ljc1MDczNDA2NDYwMDg4NF0sWzEyMy40NTE2NTI1MjY4NTU0NywyNS43MzUyNzE2NDQwMjI2MV1dXSx4eT1abygpLF95PXtsb2FkOmZ1bmN0aW9uKG4sdCl7dmFyIGU9eHkodCkucGFyc2VkO2lmKGUpcmV0dXJuIGU7dmFyIGksbz10LnNwZWNpYWxBcmVhc3x8e30sYT10Lmdlb0pTT047dHJ5e2k9YT9NZyhhKTpbXX1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZ2VvSnNvbiBmb3JtYXRcbiIrdC5tZXNzYWdlKX1yZXR1cm4gZnVuY3Rpb24odCxlKXsiY2hpbmEiPT09dCYmZS5wdXNoKG5ldyBiZygi5Y2X5rW36K+45bKbIixOKGZ5LGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJwb2x5Z29uIixleHRlcmlvcjp0fX0pLGR5KSl9KG4saSksRShpLGZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZTshZnVuY3Rpb24odCxlKXtpZigiY2hpbmEiPT09dCl7dmFyIGk9bXlbZS5uYW1lXTtpZihpKXt2YXIgbj1lLmNlbnRlcjtuWzBdKz1pWzBdLzEwLjUsblsxXSs9LWlbMV0vMTR9fX0obix0KSxmdW5jdGlvbih0LGUpe2lmKCJ3b3JsZCI9PT10KXt2YXIgaT12eVtlLm5hbWVdO2lmKGkpe3ZhciBuPWUuY2VudGVyO25bMF09aVswXSxuWzFdPWlbMV19fX0obix0KSxmdW5jdGlvbih0LGUpeyJjaGluYSI9PT10JiYi5Y+w5rm+Ij09PWUubmFtZSYmZS5nZW9tZXRyaWVzLnB1c2goe3R5cGU6InBvbHlnb24iLGV4dGVyaW9yOnl5WzBdfSl9KG4sdCk7dmFyIGk9b1tlXTtpJiZ0LnRyYW5zZm9ybVRvKGkubGVmdCxpLnRvcCxpLndpZHRoLGkuaGVpZ2h0KX0pLHh5KHQpLnBhcnNlZD17cmVnaW9uczppLGJvdW5kaW5nUmVjdDpmdW5jdGlvbih0KXtmb3IodmFyIGUsaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbj10W2ldLmdldEJvdW5kaW5nUmVjdCgpOyhlPWV8fG4uY2xvbmUoKSkudW5pb24obil9cmV0dXJuIGV9KGkpfX19O3ZhciB3eT1abygpO2Z1bmN0aW9uIGJ5KHQsZSl7dmFyIGksbixvPXQuc3ZnWE1MO3RyeXtZKG51bGwhPShuPShpPW8mJmZ1bmN0aW9uKHQsZSl7cmV0dXJuKG5ldyBhZCkucGFyc2UodCxlKX0obyx7aWdub3JlVmlld0JveDohMCxpZ25vcmVSb290Q2xpcDohMH0pfHx7fSkucm9vdCkpfWNhdGNoKHQpe3Rocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdmcgZm9ybWF0XG4iK3QubWVzc2FnZSl9dmFyIGE9aS53aWR0aCxyPWkuaGVpZ2h0LHM9aS52aWV3Qm94UmVjdDtpZihlfHwoZT1udWxsPT1hfHxudWxsPT1yP24uZ2V0Qm91bmRpbmdSZWN0KCk6bmV3IE1pKDAsMCwwLDApLG51bGwhPWEmJihlLndpZHRoPWEpLG51bGwhPXImJihlLmhlaWdodD1yKSkscyl7dmFyIGw9bWQocyxlLndpZHRoLGUuaGVpZ2h0KSx1PW47KG49bmV3IElpKS5hZGQodSksdS5zY2FsZT1sLnNjYWxlLHUucG9zaXRpb249bC5wb3NpdGlvbn1yZXR1cm4gbi5zZXRDbGlwUGF0aChuZXcgaXMoe3NoYXBlOmUucGxhaW4oKX0pKSx7cm9vdDpuLGJvdW5kaW5nUmVjdDplfX12YXIgU3k9e2dlb0pTT046X3ksc3ZnOntsb2FkOmZ1bmN0aW9uKHQsZSl7dmFyIGk9d3koZSkub3JpZ2luUm9vdDtpZihpKXJldHVybntyb290OmksYm91bmRpbmdSZWN0Ond5KGUpLmJvdW5kaW5nUmVjdH07dmFyIG49YnkoZSk7cmV0dXJuIHd5KGUpLm9yaWdpblJvb3Q9bi5yb290LHd5KGUpLmJvdW5kaW5nUmVjdD1uLmJvdW5kaW5nUmVjdCxufSxtYWtlR3JhcGhpYzpmdW5jdGlvbih0LGUsaSl7dmFyIG49d3koZSksbz1uLnJvb3RNYXB8fChuLnJvb3RNYXA9USgpKSxhPW8uZ2V0KGkpO2lmKGEpcmV0dXJuIGE7dmFyIHI9bi5vcmlnaW5Sb290LHM9bi5ib3VuZGluZ1JlY3Q7cmV0dXJuIGE9bi5vcmlnaW5Sb290SG9zdEtleT9ieShlLHMpLnJvb3Q6KG4ub3JpZ2luUm9vdEhvc3RLZXk9aSxyKSxvLnNldChpLGEpfSxyZW1vdmVHcmFwaGljOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj13eShlKSxvPW4ucm9vdE1hcDtvJiZvLnJlbW92ZUtleShpKSxpPT09bi5vcmlnaW5Sb290SG9zdEtleSYmKG4ub3JpZ2luUm9vdEhvc3RLZXk9bnVsbCl9fX0sTXk9e2xvYWQ6ZnVuY3Rpb24obixvKXt2YXIgYSxyPVtdLHM9USgpLGw9USgpO3JldHVybiBFKFR5KG4pLGZ1bmN0aW9uKHQpe3ZhciBlPVN5W3QudHlwZV0ubG9hZChuLHQpO0UoZS5yZWdpb25zLGZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZTtvJiZvLmhhc093blByb3BlcnR5KGUpJiYodD10LmNsb25lU2hhbGxvdyhlPW9bZV0pKSxyLnB1c2godCkscy5zZXQoZSx0KSxsLnNldChlLHQuY2VudGVyKX0pO3ZhciBpPWUuYm91bmRpbmdSZWN0O2kmJihhP2EudW5pb24oaSk6YT1pLmNsb25lKCkpfSkse3JlZ2lvbnM6cixyZWdpb25zTWFwOnMsbmFtZUNvb3JkTWFwOmwsYm91bmRpbmdSZWN0OmF8fG5ldyBNaSgwLDAsMCwwKX19LG1ha2VHcmFwaGljOkl5KCJtYWtlR3JhcGhpYyIpLHJlbW92ZUdyYXBoaWM6SXkoInJlbW92ZUdyYXBoaWMiKX07ZnVuY3Rpb24gSXkoYSl7cmV0dXJuIGZ1bmN0aW9uKGksbil7dmFyIHQ9VHkoaSksbz1bXTtyZXR1cm4gRSh0LGZ1bmN0aW9uKHQpe3ZhciBlPVN5W3QudHlwZV1bYV07ZSYmby5wdXNoKGUoaSx0LG4pKX0pLG99fWZ1bmN0aW9uIFR5KHQpe3JldHVybiB5ZC5yZXRyaWV2ZU1hcCh0KXx8W119YihpYy5leHRlbmQoe3R5cGU6InNlcmllcy5tYXAiLGRlcGVuZGVuY2llczpbImdlbyJdLGxheW91dE1vZGU6ImJveCIsbmVlZHNEcmF3TWFwOiExLHNlcmllc0dyb3VwOltdLGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1Cdih0aGlzLHtjb29yZERpbWVuc2lvbnM6WyJ2YWx1ZSJdLGVuY29kZURlZmF1bHRlcjpUKFl1LHRoaXMpfSksaT1lLm1hcERpbWVuc2lvbigidmFsdWUiKSxuPVEoKSxvPVtdLGE9W10scj0wLHM9ZS5jb3VudCgpO3I8cztyKyspe3ZhciBsPWUuZ2V0TmFtZShyKTtuLnNldChsLCEwKSxvLnB1c2goe25hbWU6bCx2YWx1ZTplLmdldChpLHIpLHNlbGVjdGVkOlZoKGUsciwic2VsZWN0ZWQiKX0pfXJldHVybiBFKE15LmxvYWQodGhpcy5nZXRNYXBUeXBlKCksdGhpcy5vcHRpb24ubmFtZU1hcCkucmVnaW9ucyxmdW5jdGlvbih0KXt2YXIgZT10Lm5hbWU7bi5nZXQoZSl8fChvLnB1c2goe25hbWU6ZX0pLGEucHVzaChlKSl9KSx0aGlzLnVwZGF0ZVNlbGVjdGVkTWFwKG8pLGUuYXBwZW5kVmFsdWVzKFtdLGEpLGV9LGdldEhvc3RHZW9Nb2RlbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLmdlb0luZGV4O3JldHVybiBudWxsIT10P3RoaXMuZGVwZW5kZW50TW9kZWxzLmdlb1t0XTpudWxsfSxnZXRNYXBUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZ2V0SG9zdEdlb01vZGVsKCl8fHRoaXMpLm9wdGlvbi5tYXB9LGdldFJhd1ZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YSgpO3JldHVybiBlLmdldChlLm1hcERpbWVuc2lvbigidmFsdWUiKSx0KX0sZ2V0UmVnaW9uTW9kZWw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXREYXRhKCk7cmV0dXJuIGUuZ2V0SXRlbU1vZGVsKGUuaW5kZXhPZk5hbWUodCkpfSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdldERhdGEoKSxpPUtsKHRoaXMuZ2V0UmF3VmFsdWUodCkpLG49ZS5nZXROYW1lKHQpLG89dGhpcy5zZXJpZXNHcm91cCxhPVtdLHI9MDtyPG8ubGVuZ3RoO3IrKyl7dmFyIHM9b1tyXS5vcmlnaW5hbERhdGEuaW5kZXhPZk5hbWUobiksbD1lLm1hcERpbWVuc2lvbigidmFsdWUiKTtpc05hTihvW3JdLm9yaWdpbmFsRGF0YS5nZXQobCxzKSl8fGEucHVzaChldShvW3JdLm5hbWUpKX1yZXR1cm4gYS5qb2luKCIsICIpKyI8YnIgLz4iK2V1KG4rIiA6ICIraSl9LGdldFRvb2x0aXBQb3NpdGlvbjpmdW5jdGlvbih0KXtpZihudWxsIT10KXt2YXIgZT10aGlzLmdldERhdGEoKS5nZXROYW1lKHQpLGk9dGhpcy5jb29yZGluYXRlU3lzdGVtLG49aS5nZXRSZWdpb24oZSk7cmV0dXJuIG4mJmkuZGF0YVRvUG9pbnQobi5jZW50ZXIpfX0sc2V0Wm9vbTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbi56b29tPXR9LHNldENlbnRlcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbi5jZW50ZXI9dH0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06ImdlbyIsbWFwOiIiLGxlZnQ6ImNlbnRlciIsdG9wOiJjZW50ZXIiLGFzcGVjdFNjYWxlOi43NSxzaG93TGVnZW5kU3ltYm9sOiEwLGRhdGFSYW5nZUhvdmVyTGluazohMCxib3VuZGluZ0Nvb3JkczpudWxsLGNlbnRlcjpudWxsLHpvb206MSxzY2FsZUxpbWl0Om51bGwsbGFiZWw6e3Nob3c6ITEsY29sb3I6IiMwMDAifSxpdGVtU3R5bGU6e2JvcmRlcldpZHRoOi41LGJvcmRlckNvbG9yOiIjNDQ0IixhcmVhQ29sb3I6IiNlZWUifSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITAsY29sb3I6InJnYigxMDAsMCwwKSJ9LGl0ZW1TdHlsZTp7YXJlYUNvbG9yOiJyZ2JhKDI1NSwyMTUsMCwwLjgpIn19fX0pLFZ2KTt2YXIgQXk9IlwwX2VjX2ludGVyYWN0aW9uX211dGV4IjtmdW5jdGlvbiBEeSh0LGUpe3JldHVybiEhQ3kodClbZV19ZnVuY3Rpb24gQ3kodCl7cmV0dXJuIHRbQXldfHwodFtBeV09e30pfWZ1bmN0aW9uIEx5KGkpe3RoaXMucG9pbnRlckNoZWNrZXIsdGhpcy5fenI9aSx0aGlzLl9vcHQ9e307dmFyIHQ9QSxuPXQoa3ksdGhpcyksbz10KFB5LHRoaXMpLGE9dChOeSx0aGlzKSxyPXQoT3ksdGhpcykscz10KEV5LHRoaXMpO0N0LmNhbGwodGhpcyksdGhpcy5zZXRQb2ludGVyQ2hlY2tlcj1mdW5jdGlvbih0KXt0aGlzLnBvaW50ZXJDaGVja2VyPXR9LHRoaXMuZW5hYmxlPWZ1bmN0aW9uKHQsZSl7dGhpcy5kaXNhYmxlKCksdGhpcy5fb3B0PUMoRChlKXx8e30se3pvb21Pbk1vdXNlV2hlZWw6ITAsbW92ZU9uTW91c2VNb3ZlOiEwLG1vdmVPbk1vdXNlV2hlZWw6ITEscHJldmVudERlZmF1bHRNb3VzZU1vdmU6ITB9KSxudWxsPT10JiYodD0hMCksITAhPT10JiYibW92ZSIhPT10JiYicGFuIiE9PXR8fChpLm9uKCJtb3VzZWRvd24iLG4pLGkub24oIm1vdXNlbW92ZSIsbyksaS5vbigibW91c2V1cCIsYSkpLCEwIT09dCYmInNjYWxlIiE9PXQmJiJ6b29tIiE9PXR8fChpLm9uKCJtb3VzZXdoZWVsIixyKSxpLm9uKCJwaW5jaCIscykpfSx0aGlzLmRpc2FibGU9ZnVuY3Rpb24oKXtpLm9mZigibW91c2Vkb3duIixuKSxpLm9mZigibW91c2Vtb3ZlIixvKSxpLm9mZigibW91c2V1cCIsYSksaS5vZmYoIm1vdXNld2hlZWwiLHIpLGkub2ZmKCJwaW5jaCIscyl9LHRoaXMuZGlzcG9zZT10aGlzLmRpc2FibGUsdGhpcy5pc0RyYWdnaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnaW5nfSx0aGlzLmlzUGluY2hpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGluY2hpbmd9fWZ1bmN0aW9uIGt5KHQpe2lmKCEoSHQodCl8fHQudGFyZ2V0JiZ0LnRhcmdldC5kcmFnZ2FibGUpKXt2YXIgZT10Lm9mZnNldFgsaT10Lm9mZnNldFk7dGhpcy5wb2ludGVyQ2hlY2tlciYmdGhpcy5wb2ludGVyQ2hlY2tlcih0LGUsaSkmJih0aGlzLl94PWUsdGhpcy5feT1pLHRoaXMuX2RyYWdnaW5nPSEwKX19ZnVuY3Rpb24gUHkodCl7aWYodGhpcy5fZHJhZ2dpbmcmJkJ5KCJtb3ZlT25Nb3VzZU1vdmUiLHQsdGhpcy5fb3B0KSYmInBpbmNoIiE9PXQuZ2VzdHVyZUV2ZW50JiYhRHkodGhpcy5fenIsImdsb2JhbFBhbiIpKXt2YXIgZT10Lm9mZnNldFgsaT10Lm9mZnNldFksbj10aGlzLl94LG89dGhpcy5feSxhPWUtbixyPWktbzt0aGlzLl94PWUsdGhpcy5feT1pLHRoaXMuX29wdC5wcmV2ZW50RGVmYXVsdE1vdXNlTW92ZSYmV3QodC5ldmVudCksUnkodGhpcywicGFuIiwibW92ZU9uTW91c2VNb3ZlIix0LHtkeDphLGR5OnIsb2xkWDpuLG9sZFk6byxuZXdYOmUsbmV3WTppfSl9fWZ1bmN0aW9uIE55KHQpe0h0KHQpfHwodGhpcy5fZHJhZ2dpbmc9ITEpfWZ1bmN0aW9uIE95KHQpe3ZhciBlPUJ5KCJ6b29tT25Nb3VzZVdoZWVsIix0LHRoaXMuX29wdCksaT1CeSgibW92ZU9uTW91c2VXaGVlbCIsdCx0aGlzLl9vcHQpLG49dC53aGVlbERlbHRhLG89TWF0aC5hYnMobiksYT10Lm9mZnNldFgscj10Lm9mZnNldFk7aWYoMCE9PW4mJihlfHxpKSl7aWYoZSl7dmFyIHM9MzxvPzEuNDoxPG8/MS4yOjEuMTt6eSh0aGlzLCJ6b29tIiwiem9vbU9uTW91c2VXaGVlbCIsdCx7c2NhbGU6MDxuP3M6MS9zLG9yaWdpblg6YSxvcmlnaW5ZOnJ9KX1pZihpKXt2YXIgbD1NYXRoLmFicyhuKTt6eSh0aGlzLCJzY3JvbGxNb3ZlIiwibW92ZU9uTW91c2VXaGVlbCIsdCx7c2Nyb2xsRGVsdGE6KDA8bj8xOi0xKSooMzxsPy40OjE8bD8uMTU6LjA1KSxvcmlnaW5YOmEsb3JpZ2luWTpyfSl9fX1mdW5jdGlvbiBFeSh0KXtEeSh0aGlzLl96ciwiZ2xvYmFsUGFuIil8fHp5KHRoaXMsInpvb20iLG51bGwsdCx7c2NhbGU6MTx0LnBpbmNoU2NhbGU/MS4xOjEvMS4xLG9yaWdpblg6dC5waW5jaFgsb3JpZ2luWTp0LnBpbmNoWX0pfWZ1bmN0aW9uIHp5KHQsZSxpLG4sbyl7dC5wb2ludGVyQ2hlY2tlciYmdC5wb2ludGVyQ2hlY2tlcihuLG8ub3JpZ2luWCxvLm9yaWdpblkpJiYoV3Qobi5ldmVudCksUnkodCxlLGksbixvKSl9ZnVuY3Rpb24gUnkodCxlLGksbixvKXtvLmlzQXZhaWxhYmxlQmVoYXZpb3I9QShCeSxudWxsLGksbiksdC50cmlnZ2VyKGUsbyl9ZnVuY3Rpb24gQnkodCxlLGkpe3ZhciBuPWlbdF07cmV0dXJuIXR8fG4mJigheihuKXx8ZS5ldmVudFtuKyJLZXkiXSl9ZnVuY3Rpb24gVnkodCxlLGkpe3ZhciBuPXQudGFyZ2V0LG89bi5wb3NpdGlvbjtvWzBdKz1lLG9bMV0rPWksbi5kaXJ0eSgpfWZ1bmN0aW9uIEd5KHQsZSxpLG4pe3ZhciBvPXQudGFyZ2V0LGE9dC56b29tTGltaXQscj1vLnBvc2l0aW9uLHM9by5zY2FsZSxsPXQuem9vbT10Lnpvb218fDE7aWYobCo9ZSxhKXt2YXIgdT1hLm1pbnx8MCxoPWEubWF4fHwxLzA7bD1NYXRoLm1heChNYXRoLm1pbihoLGwpLHUpfXZhciBjPWwvdC56b29tO3Quem9vbT1sLHJbMF0tPShpLXJbMF0pKihjLTEpLHJbMV0tPShuLXJbMV0pKihjLTEpLHNbMF0qPWMsc1sxXSo9YyxvLmRpcnR5KCl9Z2Yoe3R5cGU6InRha2VHbG9iYWxDdXJzb3IiLGV2ZW50OiJnbG9iYWxDdXJzb3JUYWtlbiIsdXBkYXRlOiJ1cGRhdGUifSxmdW5jdGlvbigpe30pLGIoTHksQ3QpO3ZhciBGeT17YXhpc1BvaW50ZXI6MSx0b29sdGlwOjEsYnJ1c2g6MX07ZnVuY3Rpb24gV3kodCxlLGkpe3ZhciBuPWUuZ2V0Q29tcG9uZW50QnlFbGVtZW50KHQudG9wVGFyZ2V0KSxvPW4mJm4uY29vcmRpbmF0ZVN5c3RlbTtyZXR1cm4gbiYmbiE9PWkmJiFGeVtuLm1haW5UeXBlXSYmbyYmby5tb2RlbCE9PWl9ZnVuY3Rpb24gSHkodCl7dmFyIGU9dC5nZXRJdGVtU3R5bGUoKSxpPXQuZ2V0KCJhcmVhQ29sb3IiKTtyZXR1cm4gbnVsbCE9aSYmKGUuZmlsbD1pKSxlfWZ1bmN0aW9uIFp5KGksdCl7dC5lYWNoQ2hpbGQoZnVuY3Rpb24oZSl7RShlLl9fcmVnaW9ucyxmdW5jdGlvbih0KXtlLnRyaWdnZXIoaS5pc1NlbGVjdGVkKHQubmFtZSk/ImVtcGhhc2lzIjoibm9ybWFsIil9KX0pfWZ1bmN0aW9uIFV5KHQsZSl7dmFyIGk9bmV3IElpO3RoaXMudWlkPUNsKCJlY19tYXBfZHJhdyIpLHRoaXMuX2NvbnRyb2xsZXI9bmV3IEx5KHQuZ2V0WnIoKSksdGhpcy5fY29udHJvbGxlckhvc3Q9e3RhcmdldDplP2k6bnVsbH0sdGhpcy5ncm91cD1pLHRoaXMuX3VwZGF0ZUdyb3VwPWUsdGhpcy5fbW91c2VEb3duRmxhZyx0aGlzLl9tYXBOYW1lLHRoaXMuX2luaXRpYWxpemVkLGkuYWRkKHRoaXMuX3JlZ2lvbnNHcm91cD1uZXcgSWkpLGkuYWRkKHRoaXMuX2JhY2tncm91bmRHcm91cD1uZXcgSWkpfVV5LnByb3RvdHlwZT17Y29uc3RydWN0b3I6VXksZHJhdzpmdW5jdGlvbihfLHQsZSxpLG4pe3ZhciB3PSJnZW8iPT09Xy5tYWluVHlwZSxiPV8uZ2V0RGF0YSYmXy5nZXREYXRhKCk7dyYmdC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToic2VyaWVzIixzdWJUeXBlOiJtYXAifSxmdW5jdGlvbih0KXtifHx0LmdldEhvc3RHZW9Nb2RlbCgpIT09X3x8KGI9dC5nZXREYXRhKCkpfSk7dmFyIG89Xy5jb29yZGluYXRlU3lzdGVtO3RoaXMuX3VwZGF0ZUJhY2tncm91bmQobyk7dmFyIFM9dGhpcy5fcmVnaW9uc0dyb3VwLE09dGhpcy5ncm91cDtvLl9yb2FtVHJhbnNmb3JtYWJsZS50cmFuc2Zvcm0mJihNLnRyYW5zZm9ybT1vLl9yb2FtVHJhbnNmb3JtYWJsZS50cmFuc2Zvcm0uc2xpY2UoKSxNLmRlY29tcG9zZVRyYW5zZm9ybSgpKTt2YXIgST1vLl9yYXdUcmFuc2Zvcm1hYmxlLnNjYWxlLFQ9by5fcmF3VHJhbnNmb3JtYWJsZS5wb3NpdGlvbjtTLnJlbW92ZUFsbCgpO3ZhciBBPVsiaXRlbVN0eWxlIl0sRD1bImVtcGhhc2lzIiwiaXRlbVN0eWxlIl0sQz1bImxhYmVsIl0sTD1bImVtcGhhc2lzIiwibGFiZWwiXSxrPVEoKTtFKG8ucmVnaW9ucyxmdW5jdGlvbih0KXt2YXIgZT1rLmdldCh0Lm5hbWUpfHxrLnNldCh0Lm5hbWUsbmV3IElpKSxhPW5ldyBocyh7c2VnbWVudElnbm9yZVRocmVzaG9sZDoxLHNoYXBlOntwYXRoczpbXX19KTtlLmFkZChhKTt2YXIgaSxuPSh4PV8uZ2V0UmVnaW9uTW9kZWwodC5uYW1lKXx8XykuZ2V0TW9kZWwoQSksbz14LmdldE1vZGVsKEQpLHI9SHkobikscz1IeShvKSxsPXguZ2V0TW9kZWwoQyksdT14LmdldE1vZGVsKEwpO2lmKGIpe2k9Yi5pbmRleE9mTmFtZSh0Lm5hbWUpO3ZhciBoPWIuZ2V0SXRlbVZpc3VhbChpLCJjb2xvciIsITApO2gmJihyLmZpbGw9aCl9ZnVuY3Rpb24gYyh0KXtyZXR1cm5bdFswXSpJWzBdK1RbMF0sdFsxXSpJWzFdK1RbMV1dfUUodC5nZW9tZXRyaWVzLGZ1bmN0aW9uKHQpe2lmKCJwb2x5Z29uIj09PXQudHlwZSl7Zm9yKHZhciBlPVtdLGk9MDtpPHQuZXh0ZXJpb3IubGVuZ3RoOysraSllLnB1c2goYyh0LmV4dGVyaW9yW2ldKSk7YS5zaGFwZS5wYXRocy5wdXNoKG5ldyBxcih7c2VnbWVudElnbm9yZVRocmVzaG9sZDoxLHNoYXBlOntwb2ludHM6ZX19KSk7Zm9yKGk9MDtpPCh0LmludGVyaW9ycz90LmludGVyaW9ycy5sZW5ndGg6MCk7KytpKXtmb3IodmFyIG49dC5pbnRlcmlvcnNbaV0sbz0oZT1bXSwwKTtvPG4ubGVuZ3RoOysrbyllLnB1c2goYyhuW29dKSk7YS5zaGFwZS5wYXRocy5wdXNoKG5ldyBxcih7c2VnbWVudElnbm9yZVRocmVzaG9sZDoxLHNoYXBlOntwb2ludHM6ZX19KSl9fX0pLGEuc2V0U3R5bGUociksYS5zdHlsZS5zdHJva2VOb1NjYWxlPSEwLGEuY3VsbGluZz0hMDt2YXIgZD1sLmdldCgic2hvdyIpLGY9dS5nZXQoInNob3ciKSxwPWImJmlzTmFOKGIuZ2V0KGIubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGkpKSxnPWImJmIuZ2V0SXRlbUxheW91dChpKTtpZih3fHxwJiYoZHx8Zil8fGcmJmcuc2hvd0xhYmVsKXt2YXIgbSx2PXc/dC5uYW1lOmk7KCFifHwwPD1pKSYmKG09Xyk7dmFyIHk9bmV3IEZyKHtwb3NpdGlvbjpjKHQuY2VudGVyLnNsaWNlKCkpLHNjYWxlOlsxL00uc2NhbGVbMF0sMS9NLnNjYWxlWzFdXSx6MjoxMCxzaWxlbnQ6ITB9KTskcyh5LnN0eWxlLHkuaG92ZXJTdHlsZT17fSxsLHUse2xhYmVsRmV0Y2hlcjptLGxhYmVsRGF0YUluZGV4OnYsZGVmYXVsdFRleHQ6dC5uYW1lLHVzZUluc2lkZVN0eWxlOiExfSx7dGV4dEFsaWduOiJjZW50ZXIiLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUifSksZS5hZGQoeSl9aWYoYiliLnNldEl0ZW1HcmFwaGljRWwoaSxlKTtlbHNle3ZhciB4PV8uZ2V0UmVnaW9uTW9kZWwodC5uYW1lKTthLmV2ZW50RGF0YT17Y29tcG9uZW50VHlwZToiZ2VvIixjb21wb25lbnRJbmRleDpfLmNvbXBvbmVudEluZGV4LGdlb0luZGV4Ol8uY29tcG9uZW50SW5kZXgsbmFtZTp0Lm5hbWUscmVnaW9uOngmJngub3B0aW9ufHx7fX19KGUuX19yZWdpb25zfHwoZS5fX3JlZ2lvbnM9W10pKS5wdXNoKHQpLGUuaGlnaERvd25TaWxlbnRPblRvdWNoPSEhXy5nZXQoInNlbGVjdGVkTW9kZSIpLFlzKGUscyksUy5hZGQoZSl9KSx0aGlzLl91cGRhdGVDb250cm9sbGVyKF8sdCxlKSxmdW5jdGlvbihuLG8sYSxyLHMpe2Eub2ZmKCJjbGljayIpLGEub2ZmKCJtb3VzZWRvd24iKSxvLmdldCgic2VsZWN0ZWRNb2RlIikmJihhLm9uKCJtb3VzZWRvd24iLGZ1bmN0aW9uKCl7bi5fbW91c2VEb3duRmxhZz0hMH0pLGEub24oImNsaWNrIixmdW5jdGlvbih0KXtpZihuLl9tb3VzZURvd25GbGFnKXtuLl9tb3VzZURvd25GbGFnPSExO2Zvcih2YXIgZT10LnRhcmdldDshZS5fX3JlZ2lvbnM7KWU9ZS5wYXJlbnQ7aWYoZSl7dmFyIGk9e3R5cGU6KCJnZW8iPT09by5tYWluVHlwZT8iZ2VvIjoibWFwIikrIlRvZ2dsZVNlbGVjdCIsYmF0Y2g6TihlLl9fcmVnaW9ucyxmdW5jdGlvbih0KXtyZXR1cm57bmFtZTp0Lm5hbWUsZnJvbTpzLnVpZH19KX07aVtvLm1haW5UeXBlKyJJZCJdPW8uaWQsci5kaXNwYXRjaEFjdGlvbihpKSxaeShvLGEpfX19KSl9KHRoaXMsXyxTLGUsaSksWnkoXyxTKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fcmVnaW9uc0dyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2JhY2tncm91bmRHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9jb250cm9sbGVyLmRpc3Bvc2UoKSx0aGlzLl9tYXBOYW1lJiZNeS5yZW1vdmVHcmFwaGljKHRoaXMuX21hcE5hbWUsdGhpcy51aWQpLHRoaXMuX21hcE5hbWU9bnVsbCx0aGlzLl9jb250cm9sbGVySG9zdD17fX0sX3VwZGF0ZUJhY2tncm91bmQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXA7dGhpcy5fbWFwTmFtZSE9PWUmJkUoTXkubWFrZUdyYXBoaWMoZSx0aGlzLnVpZCksZnVuY3Rpb24odCl7dGhpcy5fYmFja2dyb3VuZEdyb3VwLmFkZCh0KX0sdGhpcyksdGhpcy5fbWFwTmFtZT1lfSxfdXBkYXRlQ29udHJvbGxlcjpmdW5jdGlvbihuLHQsbyl7dmFyIGE9bi5jb29yZGluYXRlU3lzdGVtLGU9dGhpcy5fY29udHJvbGxlcixpPXRoaXMuX2NvbnRyb2xsZXJIb3N0O2kuem9vbUxpbWl0PW4uZ2V0KCJzY2FsZUxpbWl0IiksaS56b29tPWEuZ2V0Wm9vbSgpLGUuZW5hYmxlKG4uZ2V0KCJyb2FtIil8fCExKTt2YXIgcj1uLm1haW5UeXBlO2Z1bmN0aW9uIHMoKXt2YXIgdD17dHlwZToiZ2VvUm9hbSIsY29tcG9uZW50VHlwZTpyfTtyZXR1cm4gdFtyKyJJZCJdPW4uaWQsdH1lLm9mZigicGFuIikub24oInBhbiIsZnVuY3Rpb24odCl7dGhpcy5fbW91c2VEb3duRmxhZz0hMSxWeShpLHQuZHgsdC5keSksby5kaXNwYXRjaEFjdGlvbihMKHMoKSx7ZHg6dC5keCxkeTp0LmR5fSkpfSx0aGlzKSxlLm9mZigiem9vbSIpLm9uKCJ6b29tIixmdW5jdGlvbih0KXtpZih0aGlzLl9tb3VzZURvd25GbGFnPSExLEd5KGksdC5zY2FsZSx0Lm9yaWdpblgsdC5vcmlnaW5ZKSxvLmRpc3BhdGNoQWN0aW9uKEwocygpLHt6b29tOnQuc2NhbGUsb3JpZ2luWDp0Lm9yaWdpblgsb3JpZ2luWTp0Lm9yaWdpbll9KSksdGhpcy5fdXBkYXRlR3JvdXApe3ZhciBlPXRoaXMuZ3JvdXAuc2NhbGU7dGhpcy5fcmVnaW9uc0dyb3VwLnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyJ0ZXh0Ij09PXQudHlwZSYmdC5hdHRyKCJzY2FsZSIsWzEvZVswXSwxL2VbMV1dKX0pfX0sdGhpcyksZS5zZXRQb2ludGVyQ2hlY2tlcihmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGEuZ2V0Vmlld1JlY3RBZnRlclJvYW0oKS5jb250YWluKGUsaSkmJiFXeSh0LG8sbil9KX19O3ZhciBYeT0iX19zZXJpZXNNYXBIaWdoRG93biIsWXk9Il9fc2VyaWVzTWFwQ2FsbEtleSI7ZnVuY3Rpb24gankodCl7dmFyIGU9dGhpc1tYeV07ZSYmZS5yZWNvcmRWZXJzaW9uPT09dGhpc1tZeV0mJnF5KGUsdCl9ZnVuY3Rpb24gcXkodCxlKXt2YXIgaT10LmNpcmNsZSxuPXQubGFiZWxNb2RlbCxvPXQuaG92ZXJMYWJlbE1vZGVsLGE9dC5lbXBoYXNpc1RleHQscj10Lm5vcm1hbFRleHQ7ZT8oaS5zdHlsZS5leHRlbmRGcm9tKFFzKHt9LG8se3RleHQ6by5nZXQoInNob3ciKT9hOm51bGx9LHtpc1JlY3RUZXh0OiEwLHVzZUluc2lkZVN0eWxlOiExfSwhMCkpLGkuX19tYXBPcmlnaW5hbFoyPWkuejIsaS56Mis9eXMpOihRcyhpLnN0eWxlLG4se3RleHQ6bi5nZXQoInNob3ciKT9yOm51bGwsdGV4dFBvc2l0aW9uOm4uZ2V0U2hhbGxvdygicG9zaXRpb24iKXx8ImJvdHRvbSJ9LHtpc1JlY3RUZXh0OiEwLHVzZUluc2lkZVN0eWxlOiExfSksaS5kaXJ0eSghMSksbnVsbCE9aS5fX21hcE9yaWdpbmFsWjImJihpLnoyPWkuX19tYXBPcmlnaW5hbFoyLGkuX19tYXBPcmlnaW5hbFoyPW51bGwpKX1mdW5jdGlvbiBLeSh0LGUsaSl7dmFyIG49dC5nZXRab29tKCksbz10LmdldENlbnRlcigpLGE9ZS56b29tLHI9dC5kYXRhVG9Qb2ludChvKTtpZihudWxsIT1lLmR4JiZudWxsIT1lLmR5KXtyWzBdLT1lLmR4LHJbMV0tPWUuZHk7bz10LnBvaW50VG9EYXRhKHIpO3Quc2V0Q2VudGVyKG8pfWlmKG51bGwhPWEpe2lmKGkpe3ZhciBzPWkubWlufHwwLGw9aS5tYXh8fDEvMDthPU1hdGgubWF4KE1hdGgubWluKG4qYSxsKSxzKS9ufXQuc2NhbGVbMF0qPWEsdC5zY2FsZVsxXSo9YTt2YXIgdT10LnBvc2l0aW9uLGg9KGUub3JpZ2luWC11WzBdKSooYS0xKSxjPShlLm9yaWdpblktdVsxXSkqKGEtMSk7dVswXS09aCx1WzFdLT1jLHQudXBkYXRlVHJhbnNmb3JtKCk7bz10LnBvaW50VG9EYXRhKHIpO3Quc2V0Q2VudGVyKG8pLHQuc2V0Wm9vbShhKm4pfXJldHVybntjZW50ZXI6dC5nZXRDZW50ZXIoKSx6b29tOnQuZ2V0Wm9vbSgpfX1NZih7dHlwZToibWFwIixyZW5kZXI6ZnVuY3Rpb24odCxlLGksbil7aWYoIW58fCJtYXBUb2dnbGVTZWxlY3QiIT09bi50eXBlfHxuLmZyb20hPT10aGlzLnVpZCl7dmFyIG89dGhpcy5ncm91cDtpZihvLnJlbW92ZUFsbCgpLCF0LmdldEhvc3RHZW9Nb2RlbCgpKXtpZihuJiYiZ2VvUm9hbSI9PT1uLnR5cGUmJiJzZXJpZXMiPT09bi5jb21wb25lbnRUeXBlJiZuLnNlcmllc0lkPT09dC5pZCkoYT10aGlzLl9tYXBEcmF3KSYmby5hZGQoYS5ncm91cCk7ZWxzZSBpZih0Lm5lZWRzRHJhd01hcCl7dmFyIGE9dGhpcy5fbWFwRHJhd3x8bmV3IFV5KGksITApO28uYWRkKGEuZ3JvdXApLGEuZHJhdyh0LGUsaSx0aGlzLG4pLHRoaXMuX21hcERyYXc9YX1lbHNlIHRoaXMuX21hcERyYXcmJnRoaXMuX21hcERyYXcucmVtb3ZlKCksdGhpcy5fbWFwRHJhdz1udWxsO3QuZ2V0KCJzaG93TGVnZW5kU3ltYm9sIikmJmUuZ2V0Q29tcG9uZW50KCJsZWdlbmQiKSYmdGhpcy5fcmVuZGVyU3ltYm9scyh0LGUsaSl9fX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKSx0aGlzLl9tYXBEcmF3PW51bGwsdGhpcy5ncm91cC5yZW1vdmVBbGwoKX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuX21hcERyYXcmJnRoaXMuX21hcERyYXcucmVtb3ZlKCksdGhpcy5fbWFwRHJhdz1udWxsfSxfcmVuZGVyU3ltYm9sczpmdW5jdGlvbih4LHQsZSl7dmFyIF89eC5vcmlnaW5hbERhdGEsdz10aGlzLmdyb3VwO18uZWFjaChfLm1hcERpbWVuc2lvbigidmFsdWUiKSxmdW5jdGlvbih0LGUpe2lmKCFpc05hTih0KSl7dmFyIGk9Xy5nZXRJdGVtTGF5b3V0KGUpO2lmKGkmJmkucG9pbnQpe3ZhciBuPWkucG9pbnQsbz1pLm9mZnNldCxhPW5ldyBIcih7c3R5bGU6e2ZpbGw6eC5nZXREYXRhKCkuZ2V0VmlzdWFsKCJjb2xvciIpfSxzaGFwZTp7Y3g6blswXSs5Km8sY3k6blsxXSxyOjN9LHNpbGVudDohMCx6Mjo4KyhvPzA6eXMrMSl9KTtpZighbyl7dmFyIHI9eC5tYWluU2VyaWVzLmdldERhdGEoKSxzPV8uZ2V0TmFtZShlKSxsPXIuaW5kZXhPZk5hbWUocyksdT1fLmdldEl0ZW1Nb2RlbChlKSxoPXUuZ2V0TW9kZWwoImxhYmVsIiksYz11LmdldE1vZGVsKCJlbXBoYXNpcy5sYWJlbCIpLGQ9ci5nZXRJdGVtR3JhcGhpY0VsKGwpLGY9SCh4LmdldEZvcm1hdHRlZExhYmVsKGwsIm5vcm1hbCIpLHMpLHA9SCh4LmdldEZvcm1hdHRlZExhYmVsKGwsImVtcGhhc2lzIiksZiksZz1kW1h5XSxtPU1hdGgucmFuZG9tKCk7aWYoIWcpe2c9ZFtYeV09e307dmFyIHY9VChqeSwhMCkseT1UKGp5LCExKTtkLm9uKCJtb3VzZW92ZXIiLHYpLm9uKCJtb3VzZW91dCIseSkub24oImVtcGhhc2lzIix2KS5vbigibm9ybWFsIix5KX1MKGcse3JlY29yZFZlcnNpb246ZFtZeV09bSxjaXJjbGU6YSxsYWJlbE1vZGVsOmgsaG92ZXJMYWJlbE1vZGVsOmMsZW1waGFzaXNUZXh0OnAsbm9ybWFsVGV4dDpmfSkscXkoZywhMSl9dy5hZGQoYSl9fX0pfX0pLGdmKHt0eXBlOiJnZW9Sb2FtIixldmVudDoiZ2VvUm9hbSIsdXBkYXRlOiJ1cGRhdGVUcmFuc2Zvcm0ifSxmdW5jdGlvbihuLHQpe3ZhciBvPW4uY29tcG9uZW50VHlwZXx8InNlcmllcyI7dC5lYWNoQ29tcG9uZW50KHttYWluVHlwZTpvLHF1ZXJ5Om59LGZ1bmN0aW9uKHQpe3ZhciBlPXQuY29vcmRpbmF0ZVN5c3RlbTtpZigiZ2VvIj09PWUudHlwZSl7dmFyIGk9S3koZSxuLHQuZ2V0KCJzY2FsZUxpbWl0IikpO3Quc2V0Q2VudGVyJiZ0LnNldENlbnRlcihpLmNlbnRlciksdC5zZXRab29tJiZ0LnNldFpvb20oaS56b29tKSwic2VyaWVzIj09PW8mJkUodC5zZXJpZXNHcm91cCxmdW5jdGlvbih0KXt0LnNldENlbnRlcihpLmNlbnRlciksdC5zZXRab29tKGkuem9vbSl9KX19KX0pO3ZhciAkeT1idDtmdW5jdGlvbiBKeSgpe2ZlLmNhbGwodGhpcyl9ZnVuY3Rpb24gUXkodCl7dGhpcy5uYW1lPXQsdGhpcy56b29tTGltaXQsZmUuY2FsbCh0aGlzKSx0aGlzLl9yb2FtVHJhbnNmb3JtYWJsZT1uZXcgSnksdGhpcy5fcmF3VHJhbnNmb3JtYWJsZT1uZXcgSnksdGhpcy5fY2VudGVyLHRoaXMuX3pvb219ZnVuY3Rpb24gdHgodCxlLGksbil7dmFyIG89aS5zZXJpZXNNb2RlbCxhPW8/by5jb29yZGluYXRlU3lzdGVtOm51bGw7cmV0dXJuIGE9PT10aGlzP2FbdF0obik6bnVsbH1mdW5jdGlvbiBleCh0LGUsaSxuKXtReS5jYWxsKHRoaXMsdCksdGhpcy5tYXA9ZTt2YXIgbz1NeS5sb2FkKGUsaSk7dGhpcy5fbmFtZUNvb3JkTWFwPW8ubmFtZUNvb3JkTWFwLHRoaXMuX3JlZ2lvbnNNYXA9by5yZWdpb25zTWFwLHRoaXMuX2ludmVydExvbmdpdHV0ZT1udWxsPT1ufHxuLHRoaXMucmVnaW9ucz1vLnJlZ2lvbnMsdGhpcy5fcmVjdD1vLmJvdW5kaW5nUmVjdH1mdW5jdGlvbiBpeCh0LGUsaSxuKXt2YXIgbz1pLmdlb01vZGVsLGE9aS5zZXJpZXNNb2RlbCxyPW8/by5jb29yZGluYXRlU3lzdGVtOmE/YS5jb29yZGluYXRlU3lzdGVtfHwoYS5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJnZW8iKVswXXx8e30pLmNvb3JkaW5hdGVTeXN0ZW06bnVsbDtyZXR1cm4gcj09PXRoaXM/clt0XShuKTpudWxsfWZ1bmN0aW9uIG54KHQsZSl7dmFyIGk9dC5nZXQoImJvdW5kaW5nQ29vcmRzIik7aWYobnVsbCE9aSl7dmFyIG49aVswXSxvPWlbMV07aXNOYU4oblswXSl8fGlzTmFOKG5bMV0pfHxpc05hTihvWzBdKXx8aXNOYU4ob1sxXSl8fHRoaXMuc2V0Qm91bmRpbmdSZWN0KG5bMF0sblsxXSxvWzBdLW5bMF0sb1sxXS1uWzFdKX12YXIgYSxyPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkscz10LmdldCgibGF5b3V0Q2VudGVyIiksbD10LmdldCgibGF5b3V0U2l6ZSIpLHU9ZS5nZXRXaWR0aCgpLGg9ZS5nZXRIZWlnaHQoKSxjPXIud2lkdGgvci5oZWlnaHQqdGhpcy5hc3BlY3RTY2FsZSxkPSExO2lmKHMmJmwmJihzPVtQbChzWzBdLHUpLFBsKHNbMV0saCldLGw9UGwobCxNYXRoLm1pbih1LGgpKSxpc05hTihzWzBdKXx8aXNOYU4oc1sxXSl8fGlzTmFOKGwpfHwoZD0hMCkpLGQpe3ZhciBmPXt9OzE8Yz8oZi53aWR0aD1sLGYuaGVpZ2h0PWwvYyk6KGYuaGVpZ2h0PWwsZi53aWR0aD1sKmMpLGYueT1zWzFdLWYuaGVpZ2h0LzIsZi54PXNbMF0tZi53aWR0aC8yfWVsc2UoYT10LmdldEJveExheW91dFBhcmFtcygpKS5hc3BlY3Q9YyxmPXZ1KGEse3dpZHRoOnUsaGVpZ2h0Omh9KTt0aGlzLnNldFZpZXdSZWN0KGYueCxmLnksZi53aWR0aCxmLmhlaWdodCksdGhpcy5zZXRDZW50ZXIodC5nZXQoImNlbnRlciIpKSx0aGlzLnNldFpvb20odC5nZXQoInpvb20iKSl9ZnVuY3Rpb24gb3goaSx0KXtFKHQuZ2V0KCJnZW9Db29yZCIpLGZ1bmN0aW9uKHQsZSl7aS5hZGRHZW9Db29yZChlLHQpfSl9YihKeSxmZSksUXkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpReSx0eXBlOiJ2aWV3IixkaW1lbnNpb25zOlsieCIsInkiXSxzZXRCb3VuZGluZ1JlY3Q6ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHRoaXMuX3JlY3Q9bmV3IE1pKHQsZSxpLG4pLHRoaXMuX3JlY3R9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWN0fSxzZXRWaWV3UmVjdDpmdW5jdGlvbih0LGUsaSxuKXt0aGlzLnRyYW5zZm9ybVRvKHQsZSxpLG4pLHRoaXMuX3ZpZXdSZWN0PW5ldyBNaSh0LGUsaSxuKX0sdHJhbnNmb3JtVG86ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSxhPXRoaXMuX3Jhd1RyYW5zZm9ybWFibGU7YS50cmFuc2Zvcm09by5jYWxjdWxhdGVUcmFuc2Zvcm0obmV3IE1pKHQsZSxpLG4pKSxhLmRlY29tcG9zZVRyYW5zZm9ybSgpLHRoaXMuX3VwZGF0ZVRyYW5zZm9ybSgpfSxzZXRDZW50ZXI6ZnVuY3Rpb24odCl7dCYmKHRoaXMuX2NlbnRlcj10LHRoaXMuX3VwZGF0ZUNlbnRlckFuZFpvb20oKSl9LHNldFpvb206ZnVuY3Rpb24odCl7dD10fHwxO3ZhciBlPXRoaXMuem9vbUxpbWl0O2UmJihudWxsIT1lLm1heCYmKHQ9TWF0aC5taW4oZS5tYXgsdCkpLG51bGwhPWUubWluJiYodD1NYXRoLm1heChlLm1pbix0KSkpLHRoaXMuX3pvb209dCx0aGlzLl91cGRhdGVDZW50ZXJBbmRab29tKCl9LGdldERlZmF1bHRDZW50ZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEJvdW5kaW5nUmVjdCgpO3JldHVyblt0LngrdC53aWR0aC8yLHQueSt0LmhlaWdodC8yXX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NlbnRlcnx8dGhpcy5nZXREZWZhdWx0Q2VudGVyKCl9LGdldFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9vbXx8MX0sZ2V0Um9hbVRyYW5zZm9ybTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb2FtVHJhbnNmb3JtYWJsZS5nZXRMb2NhbFRyYW5zZm9ybSgpfSxfdXBkYXRlQ2VudGVyQW5kWm9vbTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Jhd1RyYW5zZm9ybWFibGUuZ2V0TG9jYWxUcmFuc2Zvcm0oKSxlPXRoaXMuX3JvYW1UcmFuc2Zvcm1hYmxlLGk9dGhpcy5nZXREZWZhdWx0Q2VudGVyKCksbj10aGlzLmdldENlbnRlcigpLG89dGhpcy5nZXRab29tKCk7bj1idChbXSxuLHQpLGk9YnQoW10saSx0KSxlLm9yaWdpbj1uLGUucG9zaXRpb249W2lbMF0tblswXSxpWzFdLW5bMV1dLGUuc2NhbGU9W28sb10sdGhpcy5fdXBkYXRlVHJhbnNmb3JtKCl9LF91cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yb2FtVHJhbnNmb3JtYWJsZSxlPXRoaXMuX3Jhd1RyYW5zZm9ybWFibGU7KGUucGFyZW50PXQpLnVwZGF0ZVRyYW5zZm9ybSgpLGUudXBkYXRlVHJhbnNmb3JtKCksbmUodGhpcy50cmFuc2Zvcm18fCh0aGlzLnRyYW5zZm9ybT1bXSksZS50cmFuc2Zvcm18fGVlKCkpLHRoaXMuX3Jhd1RyYW5zZm9ybT1lLmdldExvY2FsVHJhbnNmb3JtKCksdGhpcy5pbnZUcmFuc2Zvcm09dGhpcy5pbnZUcmFuc2Zvcm18fFtdLGxlKHRoaXMuaW52VHJhbnNmb3JtLHRoaXMudHJhbnNmb3JtKSx0aGlzLmRlY29tcG9zZVRyYW5zZm9ybSgpfSxnZXRWaWV3UmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3UmVjdH0sZ2V0Vmlld1JlY3RBZnRlclJvYW06ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7cmV0dXJuIHQuYXBwbHlUcmFuc2Zvcm0odGhpcy50cmFuc2Zvcm0pLHR9LGRhdGFUb1BvaW50OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lP3RoaXMuX3Jhd1RyYW5zZm9ybTp0aGlzLnRyYW5zZm9ybTtyZXR1cm4gaT1pfHxbXSxuPyR5KGksdCxuKTphdChpLHQpfSxwb2ludFRvRGF0YTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmludlRyYW5zZm9ybTtyZXR1cm4gZT8keShbXSx0LGUpOlt0WzBdLHRbMV1dfSxjb252ZXJ0VG9QaXhlbDpUKHR4LCJkYXRhVG9Qb2ludCIpLGNvbnZlcnRGcm9tUGl4ZWw6VCh0eCwicG9pbnRUb0RhdGEiKSxjb250YWluUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0Vmlld1JlY3RBZnRlclJvYW0oKS5jb250YWluKHRbMF0sdFsxXSl9fSxiKFF5LGZlKSxleC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmV4LHR5cGU6ImdlbyIsZGltZW5zaW9uczpbImxuZyIsImxhdCJdLGNvbnRhaW5Db29yZDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5yZWdpb25zLGk9MDtpPGUubGVuZ3RoO2krKylpZihlW2ldLmNvbnRhaW4odCkpcmV0dXJuITA7cmV0dXJuITF9LHRyYW5zZm9ybVRvOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCksYT10aGlzLl9pbnZlcnRMb25naXR1dGU7bz1vLmNsb25lKCksYSYmKG8ueT0tby55LW8uaGVpZ2h0KTt2YXIgcj10aGlzLl9yYXdUcmFuc2Zvcm1hYmxlO2lmKHIudHJhbnNmb3JtPW8uY2FsY3VsYXRlVHJhbnNmb3JtKG5ldyBNaSh0LGUsaSxuKSksci5kZWNvbXBvc2VUcmFuc2Zvcm0oKSxhKXt2YXIgcz1yLnNjYWxlO3NbMV09LXNbMV19ci51cGRhdGVUcmFuc2Zvcm0oKSx0aGlzLl91cGRhdGVUcmFuc2Zvcm0oKX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWdpb25zTWFwLmdldCh0KX0sZ2V0UmVnaW9uQnlDb29yZDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5yZWdpb25zLGk9MDtpPGUubGVuZ3RoO2krKylpZihlW2ldLmNvbnRhaW4odCkpcmV0dXJuIGVbaV19LGFkZEdlb0Nvb3JkOmZ1bmN0aW9uKHQsZSl7dGhpcy5fbmFtZUNvb3JkTWFwLnNldCh0LGUpfSxnZXRHZW9Db29yZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZUNvb3JkTWFwLmdldCh0KX0sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3R9LGRhdGFUb1BvaW50OmZ1bmN0aW9uKHQsZSxpKXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMuZ2V0R2VvQ29vcmQodCkpLHQpcmV0dXJuIFF5LnByb3RvdHlwZS5kYXRhVG9Qb2ludC5jYWxsKHRoaXMsdCxlLGkpfSxjb252ZXJ0VG9QaXhlbDpUKGl4LCJkYXRhVG9Qb2ludCIpLGNvbnZlcnRGcm9tUGl4ZWw6VChpeCwicG9pbnRUb0RhdGEiKX0sYihleCxReSk7dmFyIGF4PXtkaW1lbnNpb25zOmV4LnByb3RvdHlwZS5kaW1lbnNpb25zLGNyZWF0ZTpmdW5jdGlvbih0LHMpe3ZhciBsPVtdO3QuZWFjaENvbXBvbmVudCgiZ2VvIixmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0KCJtYXAiKSxuPXQuZ2V0KCJhc3BlY3RTY2FsZSIpLG89ITAsYT15ZC5yZXRyaWV2ZU1hcChpKTthJiZhWzBdJiYic3ZnIj09PWFbMF0udHlwZT8obnVsbD09biYmKG49MSksbz0hMSk6bnVsbD09biYmKG49Ljc1KTt2YXIgcj1uZXcgZXgoaStlLGksdC5nZXQoIm5hbWVNYXAiKSxvKTtyLmFzcGVjdFNjYWxlPW4sci56b29tTGltaXQ9dC5nZXQoInNjYWxlTGltaXQiKSxsLnB1c2gociksb3gocix0KSwodC5jb29yZGluYXRlU3lzdGVtPXIpLm1vZGVsPXQsci5yZXNpemU9bngsci5yZXNpemUodCxzKX0pLHQuZWFjaFNlcmllcyhmdW5jdGlvbih0KXtpZigiZ2VvIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikpe3ZhciBlPXQuZ2V0KCJnZW9JbmRleCIpfHwwO3QuY29vcmRpbmF0ZVN5c3RlbT1sW2VdfX0pO3ZhciBpPXt9O3JldHVybiB0LmVhY2hTZXJpZXNCeVR5cGUoIm1hcCIsZnVuY3Rpb24odCl7aWYoIXQuZ2V0SG9zdEdlb01vZGVsKCkpe3ZhciBlPXQuZ2V0TWFwVHlwZSgpO2lbZV09aVtlXXx8W10saVtlXS5wdXNoKHQpfX0pLEUoaSxmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBleChlLGUscChOKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0KCJuYW1lTWFwIil9KSkpO2kuem9vbUxpbWl0PVcuYXBwbHkobnVsbCxOKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0KCJzY2FsZUxpbWl0Iil9KSksbC5wdXNoKGkpLGkucmVzaXplPW54LGkuYXNwZWN0U2NhbGU9dFswXS5nZXQoImFzcGVjdFNjYWxlIiksaS5yZXNpemUodFswXSxzKSxFKHQsZnVuY3Rpb24odCl7b3godC5jb29yZGluYXRlU3lzdGVtPWksdCl9KX0pLGx9LGdldEZpbGxlZFJlZ2lvbnM6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbj0odHx8W10pLnNsaWNlKCksbz1RKCksYT0wO2E8bi5sZW5ndGg7YSsrKW8uc2V0KG5bYV0ubmFtZSxuW2FdKTtyZXR1cm4gRShNeS5sb2FkKGUsaSkucmVnaW9ucyxmdW5jdGlvbih0KXt2YXIgZT10Lm5hbWU7by5nZXQoZSl8fG4ucHVzaCh7bmFtZTplfSl9KSxufX07bWYoImdlbyIsYXgpO3ZmKGZ1bmN0aW9uKGkpe3ZhciBvPXt9O2kuZWFjaFNlcmllc0J5VHlwZSgibWFwIixmdW5jdGlvbih0KXt2YXIgZT10LmdldE1hcFR5cGUoKTtpZighdC5nZXRIb3N0R2VvTW9kZWwoKSYmIW9bZV0pe3ZhciBsPXt9O0UodC5zZXJpZXNHcm91cCxmdW5jdGlvbih0KXt2YXIgcj10LmNvb3JkaW5hdGVTeXN0ZW0scz10Lm9yaWdpbmFsRGF0YTt0LmdldCgic2hvd0xlZ2VuZFN5bWJvbCIpJiZpLmdldENvbXBvbmVudCgibGVnZW5kIikmJnMuZWFjaChzLm1hcERpbWVuc2lvbigidmFsdWUiKSxmdW5jdGlvbih0LGUpe3ZhciBpPXMuZ2V0TmFtZShlKSxuPXIuZ2V0UmVnaW9uKGkpO2lmKG4mJiFpc05hTih0KSl7dmFyIG89bFtpXXx8MCxhPXIuZGF0YVRvUG9pbnQobi5jZW50ZXIpO2xbaV09bysxLHMuc2V0SXRlbUxheW91dChlLHtwb2ludDphLG9mZnNldDpvfSl9fSl9KTt2YXIgbj10LmdldERhdGEoKTtuLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9bi5nZXROYW1lKHQpLGk9bi5nZXRJdGVtTGF5b3V0KHQpfHx7fTtpLnNob3dMYWJlbD0hbFtlXSxuLnNldEl0ZW1MYXlvdXQodCxpKX0pLG9bZV09ITB9fSl9KSx5ZihmdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoIm1hcCIsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImNvbG9yIiksaT10LmdldE1vZGVsKCJpdGVtU3R5bGUiKSxuPWkuZ2V0KCJhcmVhQ29sb3IiKSxvPWkuZ2V0KCJjb2xvciIpfHxlW3Quc2VyaWVzSW5kZXglZS5sZW5ndGhdO3QuZ2V0RGF0YSgpLnNldFZpc3VhbCh7YXJlYUNvbG9yOm4sY29sb3I6b30pfSl9KSxwZihJZC5QUk9DRVNTT1IuU1RBVElTVElDLGZ1bmN0aW9uKHQpe3ZhciBuPXt9O3QuZWFjaFNlcmllc0J5VHlwZSgibWFwIixmdW5jdGlvbih0KXt2YXIgZT10LmdldEhvc3RHZW9Nb2RlbCgpLGk9ZT8ibyIrZS5pZDoiaSIrdC5nZXRNYXBUeXBlKCk7KG5baV09bltpXXx8W10pLnB1c2godCl9KSxFKG4sZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9ZnVuY3Rpb24odSxoKXt2YXIgYz17fTtyZXR1cm4gRSh1LGZ1bmN0aW9uKG4pe24uZWFjaChuLm1hcERpbWVuc2lvbigidmFsdWUiKSxmdW5jdGlvbih0LGUpe3ZhciBpPSJlYy0iK24uZ2V0TmFtZShlKTtjW2ldPWNbaV18fFtdLGlzTmFOKHQpfHxjW2ldLnB1c2godCl9KX0pLHVbMF0ubWFwKHVbMF0ubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG49ImVjLSIrdVswXS5nZXROYW1lKGUpLG89MCxhPTEvMCxyPS0xLzAscz1jW25dLmxlbmd0aCxsPTA7bDxzO2wrKylhPU1hdGgubWluKGEsY1tuXVtsXSkscj1NYXRoLm1heChyLGNbbl1bbF0pLG8rPWNbbl1bbF07cmV0dXJuIGk9Im1pbiI9PT1oP2E6Im1heCI9PT1oP3I6ImF2ZXJhZ2UiPT09aD9vL3M6bywwPT09cz9OYU46aX0pfShOKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0YSgpfSksdFswXS5nZXQoIm1hcFZhbHVlQ2FsY3VsYXRpb24iKSksbj0wO248dC5sZW5ndGg7bisrKXRbbl0ub3JpZ2luYWxEYXRhPXRbbl0uZ2V0RGF0YSgpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspKHRbbl0uc2VyaWVzR3JvdXA9dClbbl0ubmVlZHNEcmF3TWFwPTA9PT1uJiYhdFtuXS5nZXRIb3N0R2VvTW9kZWwoKSx0W25dLnNldERhdGEoaS5jbG9uZVNoYWxsb3coKSksdFtuXS5tYWluU2VyaWVzPXRbMF19KX0pLGZmKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO0UodC5zZXJpZXMsZnVuY3Rpb24odCl7dCYmIm1hcCI9PT10LnR5cGUmJihlLnB1c2godCksdC5tYXA9dC5tYXB8fHQubWFwVHlwZSxDKHQsdC5tYXBMb2NhdGlvbikpfSl9KSxYdigibWFwIixbe3R5cGU6Im1hcFRvZ2dsZVNlbGVjdCIsZXZlbnQ6Im1hcHNlbGVjdGNoYW5nZWQiLG1ldGhvZDoidG9nZ2xlU2VsZWN0ZWQifSx7dHlwZToibWFwU2VsZWN0IixldmVudDoibWFwc2VsZWN0ZWQiLG1ldGhvZDoic2VsZWN0In0se3R5cGU6Im1hcFVuU2VsZWN0IixldmVudDoibWFwdW5zZWxlY3RlZCIsbWV0aG9kOiJ1blNlbGVjdCJ9XSk7dmFyIHJ4PUUsc3g9IlwwX19saW5rX2RhdGFzIixseD0iXDBfX2xpbmtfbWFpbkRhdGEiO2Z1bmN0aW9uIHV4KGkpe3ZhciBuPWkubWFpbkRhdGEsdD1pLmRhdGFzO3R8fCh0PXttYWluOm59LGkuZGF0YXNBdHRyPXttYWluOiJkYXRhIn0pLGkuZGF0YXM9aS5tYWluRGF0YT1udWxsLHB4KG4sdCxpKSxyeCh0LGZ1bmN0aW9uKGUpe3J4KG4uVFJBTlNGRVJBQkxFX01FVEhPRFMsZnVuY3Rpb24odCl7ZS53cmFwTWV0aG9kKHQsVChoeCxpKSl9KX0pLG4ud3JhcE1ldGhvZCgiY2xvbmVTaGFsbG93IixUKGR4LGkpKSxyeChuLkNIQU5HQUJMRV9NRVRIT0RTLGZ1bmN0aW9uKHQpe24ud3JhcE1ldGhvZCh0LFQoY3gsaSkpfSksWSh0W24uZGF0YVR5cGVdPT09bil9ZnVuY3Rpb24gaHgodCxlKXtpZihmdW5jdGlvbih0KXtyZXR1cm4gdFtseF09PT10fSh0aGlzKSl7dmFyIGk9TCh7fSx0aGlzW3N4XSk7cHgoaVt0aGlzLmRhdGFUeXBlXT1lLGksdCl9ZWxzZSBneChlLHRoaXMuZGF0YVR5cGUsdGhpc1tseF0sdCk7cmV0dXJuIGV9ZnVuY3Rpb24gY3godCxlKXtyZXR1cm4gdC5zdHJ1Y3QmJnQuc3RydWN0LnVwZGF0ZSh0aGlzKSxlfWZ1bmN0aW9uIGR4KGksbil7cmV0dXJuIHJ4KG5bc3hdLGZ1bmN0aW9uKHQsZSl7dCE9PW4mJmd4KHQuY2xvbmVTaGFsbG93KCksZSxuLGkpfSksbn1mdW5jdGlvbiBmeCh0KXt2YXIgZT10aGlzW2x4XTtyZXR1cm4gbnVsbD09dHx8bnVsbD09ZT9lOmVbc3hdW3RdfWZ1bmN0aW9uIHB4KGksdCxuKXtpW3N4XT17fSxyeCh0LGZ1bmN0aW9uKHQsZSl7Z3godCxlLGksbil9KX1mdW5jdGlvbiBneCh0LGUsaSxuKXsoaVtzeF1bZV09dClbbHhdPWksdC5kYXRhVHlwZT1lLG4uc3RydWN0JiYodFtuLnN0cnVjdEF0dHJdPW4uc3RydWN0LG4uc3RydWN0W24uZGF0YXNBdHRyW2VdXT10KSx0LmdldExpbmtlZERhdGE9Znh9ZnVuY3Rpb24gbXgodCxlKXt0aGlzLm5hbWU9dHx8IiIsdGhpcy5kZXB0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5kYXRhSW5kZXg9LTEsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnZpZXdDaGlsZHJlbj1bXSx0aGlzLmhvc3RUcmVlPWV9ZnVuY3Rpb24gdngoZSx0LGkpe3RoaXMucm9vdCx0aGlzLmRhdGEsdGhpcy5fbm9kZXM9W10sdGhpcy5ob3N0TW9kZWw9ZSx0aGlzLmxldmVsTW9kZWxzPU4odHx8W10sZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBJbCh0LGUsZS5lY01vZGVsKX0pLHRoaXMubGVhdmVzTW9kZWw9bmV3IElsKGl8fHt9LGUsZS5lY01vZGVsKX1mdW5jdGlvbiB5eCh0LGUpe3ZhciBpPWUuY2hpbGRyZW47dC5wYXJlbnROb2RlIT09ZSYmKGkucHVzaCh0KSx0LnBhcmVudE5vZGU9ZSl9ZnVuY3Rpb24geHgodCxlKXt2YXIgaT10LmlzRXhwYW5kP3QuY2hpbGRyZW46W10sbj10LnBhcmVudE5vZGUuY2hpbGRyZW4sbz10LmhpZXJOb2RlLmk/blt0LmhpZXJOb2RlLmktMV06bnVsbDtpZihpLmxlbmd0aCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2hpbGRyZW4saT1lLmxlbmd0aCxuPTAsbz0wO2Zvcig7MDw9LS1pOyl7dmFyIGE9ZVtpXTthLmhpZXJOb2RlLnByZWxpbSs9bixhLmhpZXJOb2RlLm1vZGlmaWVyKz1uLG8rPWEuaGllck5vZGUuY2hhbmdlLG4rPWEuaGllck5vZGUuc2hpZnQrb319KHQpO3ZhciBhPShpWzBdLmhpZXJOb2RlLnByZWxpbStpW2kubGVuZ3RoLTFdLmhpZXJOb2RlLnByZWxpbSkvMjtvPyh0LmhpZXJOb2RlLnByZWxpbT1vLmhpZXJOb2RlLnByZWxpbStlKHQsbyksdC5oaWVyTm9kZS5tb2RpZmllcj10LmhpZXJOb2RlLnByZWxpbS1hKTp0LmhpZXJOb2RlLnByZWxpbT1hfWVsc2UgbyYmKHQuaGllck5vZGUucHJlbGltPW8uaGllck5vZGUucHJlbGltK2UodCxvKSk7dC5wYXJlbnROb2RlLmhpZXJOb2RlLmRlZmF1bHRBbmNlc3Rvcj1mdW5jdGlvbih0LGUsaSxuKXtpZihlKXtmb3IodmFyIG89dCxhPXQscj1hLnBhcmVudE5vZGUuY2hpbGRyZW5bMF0scz1lLGw9by5oaWVyTm9kZS5tb2RpZmllcix1PWEuaGllck5vZGUubW9kaWZpZXIsaD1yLmhpZXJOb2RlLm1vZGlmaWVyLGM9cy5oaWVyTm9kZS5tb2RpZmllcjtzPU14KHMpLGE9SXgoYSkscyYmYTspe289TXgobykscj1JeChyKSxvLmhpZXJOb2RlLmFuY2VzdG9yPXQ7dmFyIGQ9cy5oaWVyTm9kZS5wcmVsaW0rYy1hLmhpZXJOb2RlLnByZWxpbS11K24ocyxhKTswPGQmJihUeCgocD10LGc9aSwoZj1zKS5oaWVyTm9kZS5hbmNlc3Rvci5wYXJlbnROb2RlPT09cC5wYXJlbnROb2RlP2YuaGllck5vZGUuYW5jZXN0b3I6ZyksdCxkKSx1Kz1kLGwrPWQpLGMrPXMuaGllck5vZGUubW9kaWZpZXIsdSs9YS5oaWVyTm9kZS5tb2RpZmllcixsKz1vLmhpZXJOb2RlLm1vZGlmaWVyLGgrPXIuaGllck5vZGUubW9kaWZpZXJ9cyYmIU14KG8pJiYoby5oaWVyTm9kZS50aHJlYWQ9cyxvLmhpZXJOb2RlLm1vZGlmaWVyKz1jLWwpLGEmJiFJeChyKSYmKHIuaGllck5vZGUudGhyZWFkPWEsci5oaWVyTm9kZS5tb2RpZmllcis9dS1oLGk9dCl9dmFyIGYscCxnO3JldHVybiBpfSh0LG8sdC5wYXJlbnROb2RlLmhpZXJOb2RlLmRlZmF1bHRBbmNlc3Rvcnx8blswXSxlKX1mdW5jdGlvbiBfeCh0KXt2YXIgZT10LmhpZXJOb2RlLnByZWxpbSt0LnBhcmVudE5vZGUuaGllck5vZGUubW9kaWZpZXI7dC5zZXRMYXlvdXQoe3g6ZX0sITApLHQuaGllck5vZGUubW9kaWZpZXIrPXQucGFyZW50Tm9kZS5oaWVyTm9kZS5tb2RpZmllcn1mdW5jdGlvbiBieCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90OkF4fWZ1bmN0aW9uIFN4KHQsZSl7dmFyIGk9e307cmV0dXJuIHQtPU1hdGguUEkvMixpLng9ZSpNYXRoLmNvcyh0KSxpLnk9ZSpNYXRoLnNpbih0KSxpfWZ1bmN0aW9uIE14KHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGUubGVuZ3RoJiZ0LmlzRXhwYW5kP2VbZS5sZW5ndGgtMV06dC5oaWVyTm9kZS50aHJlYWR9ZnVuY3Rpb24gSXgodCl7dmFyIGU9dC5jaGlsZHJlbjtyZXR1cm4gZS5sZW5ndGgmJnQuaXNFeHBhbmQ/ZVswXTp0LmhpZXJOb2RlLnRocmVhZH1mdW5jdGlvbiBUeCh0LGUsaSl7dmFyIG49aS8oZS5oaWVyTm9kZS5pLXQuaGllck5vZGUuaSk7ZS5oaWVyTm9kZS5jaGFuZ2UtPW4sZS5oaWVyTm9kZS5zaGlmdCs9aSxlLmhpZXJOb2RlLm1vZGlmaWVyKz1pLGUuaGllck5vZGUucHJlbGltKz1pLHQuaGllck5vZGUuY2hhbmdlKz1ufWZ1bmN0aW9uIEF4KHQsZSl7cmV0dXJuIHQucGFyZW50Tm9kZT09PWUucGFyZW50Tm9kZT8xOjJ9ZnVuY3Rpb24gRHgodCxlKXt2YXIgaT10LmdldEl0ZW1MYXlvdXQoZSk7cmV0dXJuIGkmJiFpc05hTihpLngpJiYhaXNOYU4oaS55KSYmIm5vbmUiIT09dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbCIpfWZ1bmN0aW9uIEN4KHQsZSxpKXtyZXR1cm4gaS5pdGVtTW9kZWw9ZSxpLml0ZW1TdHlsZT1lLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSxpLmhvdmVySXRlbVN0eWxlPWUuZ2V0TW9kZWwoImVtcGhhc2lzLml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpLGkubGluZVN0eWxlPWUuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLGkubGFiZWxNb2RlbD1lLmdldE1vZGVsKCJsYWJlbCIpLGkuaG92ZXJMYWJlbE1vZGVsPWUuZ2V0TW9kZWwoImVtcGhhc2lzLmxhYmVsIiksITE9PT10LmlzRXhwYW5kJiYwIT09dC5jaGlsZHJlbi5sZW5ndGg/aS5zeW1ib2xJbm5lckNvbG9yPWkuaXRlbVN0eWxlLmZpbGw6aS5zeW1ib2xJbm5lckNvbG9yPSIjZmZmIixpfWZ1bmN0aW9uIEx4KHQsZSxpLG4sbyxhKXt2YXIgcj0haSxzPXQudHJlZS5nZXROb2RlQnlEYXRhSW5kZXgoZSksbD1zLmdldE1vZGVsKCksdT0oYT1DeChzLGwsYSksdC50cmVlLnJvb3QpLGg9cy5wYXJlbnROb2RlPT09dT9zOnMucGFyZW50Tm9kZXx8cyxjPXQuZ2V0SXRlbUdyYXBoaWNFbChoLmRhdGFJbmRleCksZD1oLmdldExheW91dCgpLGY9Yz97eDpjLnBvc2l0aW9uWzBdLHk6Yy5wb3NpdGlvblsxXSxyYXdYOmMuX19yYWRpYWxPbGRSYXdYLHJhd1k6Yy5fX3JhZGlhbE9sZFJhd1l9OmQscD1zLmdldExheW91dCgpO3I/KGk9bmV3IEZnKHQsZSxhKSkuYXR0cigicG9zaXRpb24iLFtmLngsZi55XSk6aS51cGRhdGVEYXRhKHQsZSxhKSxpLl9fcmFkaWFsT2xkUmF3WD1pLl9fcmFkaWFsUmF3WCxpLl9fcmFkaWFsT2xkUmF3WT1pLl9fcmFkaWFsUmF3WSxpLl9fcmFkaWFsUmF3WD1wLnJhd1gsaS5fX3JhZGlhbFJhd1k9cC5yYXdZLG4uYWRkKGkpLHQuc2V0SXRlbUdyYXBoaWNFbChlLGkpLHNsKGkse3Bvc2l0aW9uOltwLngscC55XX0sbyk7dmFyIGc9aS5nZXRTeW1ib2xQYXRoKCk7aWYoInJhZGlhbCI9PT1hLmxheW91dCl7dmFyIG0sdix5PXUuY2hpbGRyZW5bMF0seD15LmdldExheW91dCgpLF89eS5jaGlsZHJlbi5sZW5ndGg7aWYocC54PT09eC54JiYhMD09PXMuaXNFeHBhbmQpe3ZhciB3PXt9O3cueD0oeS5jaGlsZHJlblswXS5nZXRMYXlvdXQoKS54K3kuY2hpbGRyZW5bXy0xXS5nZXRMYXlvdXQoKS54KS8yLHcueT0oeS5jaGlsZHJlblswXS5nZXRMYXlvdXQoKS55K3kuY2hpbGRyZW5bXy0xXS5nZXRMYXlvdXQoKS55KS8yLChtPU1hdGguYXRhbjIody55LXgueSx3LngteC54KSk8MCYmKG09MipNYXRoLlBJK20pLCh2PXcueDx4LngpJiYobS09TWF0aC5QSSl9ZWxzZShtPU1hdGguYXRhbjIocC55LXgueSxwLngteC54KSk8MCYmKG09MipNYXRoLlBJK20pLDA9PT1zLmNoaWxkcmVuLmxlbmd0aHx8MCE9PXMuY2hpbGRyZW4ubGVuZ3RoJiYhMT09PXMuaXNFeHBhbmQ/KHY9cC54PHgueCkmJihtLT1NYXRoLlBJKToodj1wLng+eC54KXx8KG0tPU1hdGguUEkpO3ZhciBiPXY/ImxlZnQiOiJyaWdodCIsUz1hLmxhYmVsTW9kZWwuZ2V0KCJyb3RhdGUiKSxNPVMqKE1hdGguUEkvMTgwKTtnLnNldFN0eWxlKHt0ZXh0UG9zaXRpb246YS5sYWJlbE1vZGVsLmdldCgicG9zaXRpb24iKXx8Yix0ZXh0Um90YXRpb246bnVsbD09Uz8tbTpNLHRleHRPcmlnaW46ImNlbnRlciIsdmVydGljYWxBbGlnbjoibWlkZGxlIn0pfWlmKHMucGFyZW50Tm9kZSYmcy5wYXJlbnROb2RlIT09dSl7dmFyIEk9aS5fX2VkZ2U7c2woST1JfHwoaS5fX2VkZ2U9bmV3IGxzKHtzaGFwZTpQeChhLGYsZiksc3R5bGU6Qyh7b3BhY2l0eTowLHN0cm9rZU5vU2NhbGU6ITB9LGEubGluZVN0eWxlKX0pKSx7c2hhcGU6UHgoYSxkLHApLHN0eWxlOntvcGFjaXR5OjF9fSxvKSxuLmFkZChJKX19ZnVuY3Rpb24ga3godCxlLGksbixvLGEpe2Zvcih2YXIgcixzPXQudHJlZS5nZXROb2RlQnlEYXRhSW5kZXgoZSksbD10LnRyZWUucm9vdCx1PXMuZ2V0TW9kZWwoKSxoPShhPUN4KHMsdSxhKSxzLnBhcmVudE5vZGU9PT1sP3M6cy5wYXJlbnROb2RlfHxzKTtudWxsPT0ocj1oLmdldExheW91dCgpKTspaD1oLnBhcmVudE5vZGU9PT1sP2g6aC5wYXJlbnROb2RlfHxoO3NsKGkse3Bvc2l0aW9uOltyLngrMSxyLnkrMV19LG8sZnVuY3Rpb24oKXtuLnJlbW92ZShpKSx0LnNldEl0ZW1HcmFwaGljRWwoZSxudWxsKX0pLGkuZmFkZU91dChudWxsLHtrZWVwTGFiZWw6ITB9KTt2YXIgYz1pLl9fZWRnZTtjJiZzbChjLHtzaGFwZTpQeChhLHIsciksc3R5bGU6e29wYWNpdHk6MH19LG8sZnVuY3Rpb24oKXtuLnJlbW92ZShjKX0pfWZ1bmN0aW9uIFB4KHQsZSxpKXt2YXIgbixvLGEscixzLGwsdSxoLGM9dC5vcmllbnQ7aWYoInJhZGlhbCIhPT10LmxheW91dClyZXR1cm4gcz1lLngsdT1lLnksbD1pLngsaD1pLnksIkxSIiE9PWMmJiJSTCIhPT1jfHwobj1zKyhsLXMpKnQuY3VydmF0dXJlLG89dSxhPWwrKHMtbCkqdC5jdXJ2YXR1cmUscj1oKSwiVEIiIT09YyYmIkJUIiE9PWN8fChuPXMsbz11KyhoLXUpKnQuY3VydmF0dXJlLGE9bCxyPWgrKHUtaCkqdC5jdXJ2YXR1cmUpLHt4MTpzLHkxOnUseDI6bCx5MjpoLGNweDE6bixjcHkxOm8sY3B4MjphLGNweTI6cn07cz1lLnJhd1gsdT1lLnJhd1ksbD1pLnJhd1gsaD1pLnJhd1k7dmFyIGQ9U3gocyx1KSxmPVN4KHMsdSsoaC11KSp0LmN1cnZhdHVyZSkscD1TeChsLGgrKHUtaCkqdC5jdXJ2YXR1cmUpLGc9U3gobCxoKTtyZXR1cm57eDE6ZC54LHkxOmQueSx4MjpnLngseTI6Zy55LGNweDE6Zi54LGNweTE6Zi55LGNweDI6cC54LGNweTI6cC55fX1mdW5jdGlvbiBOeCh0LGUpe2Zvcih2YXIgaSxuPVt0XTtpPW4ucG9wKCk7KWlmKGUoaSksaS5pc0V4cGFuZCl7dmFyIG89aS5jaGlsZHJlbjtpZihvLmxlbmd0aClmb3IodmFyIGE9by5sZW5ndGgtMTswPD1hO2EtLSluLnB1c2gob1thXSl9fW14LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bXgsaXNSZW1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YUluZGV4PDB9LGVhY2hOb2RlOmZ1bmN0aW9uKHQsZSxpKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKGk9ZSxlPXQsdD1udWxsKSx6KHQ9dHx8e30pJiYodD17b3JkZXI6dH0pO3ZhciBuLG89dC5vcmRlcnx8InByZW9yZGVyIixhPXRoaXNbdC5hdHRyfHwiY2hpbGRyZW4iXTsicHJlb3JkZXIiPT09byYmKG49ZS5jYWxsKGksdGhpcykpO2Zvcih2YXIgcj0wOyFuJiZyPGEubGVuZ3RoO3IrKylhW3JdLmVhY2hOb2RlKHQsZSxpKTsicG9zdG9yZGVyIj09PW8mJmUuY2FsbChpLHRoaXMpfSx1cGRhdGVEZXB0aEFuZEhlaWdodDpmdW5jdGlvbih0KXt2YXIgZT0wO3RoaXMuZGVwdGg9dDtmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2krKyl7dmFyIG49dGhpcy5jaGlsZHJlbltpXTtuLnVwZGF0ZURlcHRoQW5kSGVpZ2h0KHQrMSksbi5oZWlnaHQ+ZSYmKGU9bi5oZWlnaHQpfXRoaXMuaGVpZ2h0PWUrMX0sZ2V0Tm9kZUJ5SWQ6ZnVuY3Rpb24odCl7aWYodGhpcy5nZXRJZCgpPT09dClyZXR1cm4gdGhpcztmb3IodmFyIGU9MCxpPXRoaXMuY2hpbGRyZW4sbj1pLmxlbmd0aDtlPG47ZSsrKXt2YXIgbz1pW2VdLmdldE5vZGVCeUlkKHQpO2lmKG8pcmV0dXJuIG99fSxjb250YWluczpmdW5jdGlvbih0KXtpZih0PT09dGhpcylyZXR1cm4hMDtmb3IodmFyIGU9MCxpPXRoaXMuY2hpbGRyZW4sbj1pLmxlbmd0aDtlPG47ZSsrKXt2YXIgbz1pW2VdLmNvbnRhaW5zKHQpO2lmKG8pcmV0dXJuIG99fSxnZXRBbmNlc3RvcnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9dD90aGlzOnRoaXMucGFyZW50Tm9kZTtpOyllLnB1c2goaSksaT1pLnBhcmVudE5vZGU7cmV0dXJuIGUucmV2ZXJzZSgpLGV9LGdldFZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaG9zdFRyZWUuZGF0YTtyZXR1cm4gZS5nZXQoZS5nZXREaW1lbnNpb24odHx8InZhbHVlIiksdGhpcy5kYXRhSW5kZXgpfSxzZXRMYXlvdXQ6ZnVuY3Rpb24odCxlKXswPD10aGlzLmRhdGFJbmRleCYmdGhpcy5ob3N0VHJlZS5kYXRhLnNldEl0ZW1MYXlvdXQodGhpcy5kYXRhSW5kZXgsdCxlKX0sZ2V0TGF5b3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFRyZWUuZGF0YS5nZXRJdGVtTGF5b3V0KHRoaXMuZGF0YUluZGV4KX0sZ2V0TW9kZWw6ZnVuY3Rpb24odCl7aWYoISh0aGlzLmRhdGFJbmRleDwwKSl7dmFyIGUsaT10aGlzLmhvc3RUcmVlLG49aS5kYXRhLmdldEl0ZW1Nb2RlbCh0aGlzLmRhdGFJbmRleCksbz10aGlzLmdldExldmVsTW9kZWwoKTtyZXR1cm4gb3x8MCE9PXRoaXMuY2hpbGRyZW4ubGVuZ3RoJiYoMD09PXRoaXMuY2hpbGRyZW4ubGVuZ3RofHwhMSE9PXRoaXMuaXNFeHBhbmQpfHwoZT10aGlzLmdldExlYXZlc01vZGVsKCkpLG4uZ2V0TW9kZWwodCwob3x8ZXx8aS5ob3N0TW9kZWwpLmdldE1vZGVsKHQpKX19LGdldExldmVsTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5ob3N0VHJlZS5sZXZlbE1vZGVsc3x8W10pW3RoaXMuZGVwdGhdfSxnZXRMZWF2ZXNNb2RlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvc3RUcmVlLmxlYXZlc01vZGVsfSxzZXRWaXN1YWw6ZnVuY3Rpb24odCxlKXswPD10aGlzLmRhdGFJbmRleCYmdGhpcy5ob3N0VHJlZS5kYXRhLnNldEl0ZW1WaXN1YWwodGhpcy5kYXRhSW5kZXgsdCxlKX0sZ2V0VmlzdWFsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaG9zdFRyZWUuZGF0YS5nZXRJdGVtVmlzdWFsKHRoaXMuZGF0YUluZGV4LHQsZSl9LGdldFJhd0luZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFRyZWUuZGF0YS5nZXRSYXdJbmRleCh0aGlzLmRhdGFJbmRleCl9LGdldElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFRyZWUuZGF0YS5nZXRJZCh0aGlzLmRhdGFJbmRleCl9LGlzQW5jZXN0b3JPZjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5wYXJlbnROb2RlO2U7KXtpZihlPT09dGhpcylyZXR1cm4hMDtlPWUucGFyZW50Tm9kZX1yZXR1cm4hMX0saXNEZXNjZW5kYW50T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT10aGlzJiZ0LmlzQW5jZXN0b3JPZih0aGlzKX19LHZ4LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dngsdHlwZToidHJlZSIsZWFjaE5vZGU6ZnVuY3Rpb24odCxlLGkpe3RoaXMucm9vdC5lYWNoTm9kZSh0LGUsaSl9LGdldE5vZGVCeURhdGFJbmRleDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGEuZ2V0UmF3SW5kZXgodCk7cmV0dXJuIHRoaXMuX25vZGVzW2VdfSxnZXROb2RlQnlOYW1lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJvb3QuZ2V0Tm9kZUJ5TmFtZSh0KX0sdXBkYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZGF0YSxlPXRoaXMuX25vZGVzLGk9MCxuPWUubGVuZ3RoO2k8bjtpKyspZVtpXS5kYXRhSW5kZXg9LTE7Zm9yKGk9MCxuPXQuY291bnQoKTtpPG47aSsrKWVbdC5nZXRSYXdJbmRleChpKV0uZGF0YUluZGV4PWl9LGNsZWFyTGF5b3V0czpmdW5jdGlvbigpe3RoaXMuZGF0YS5jbGVhckl0ZW1MYXlvdXRzKCl9fSx2eC5jcmVhdGVUcmVlPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBzPW5ldyB2eChlLGkubGV2ZWxzLGkubGVhdmVzKSxsPVtdLHU9MTshZnVuY3Rpb24gdChlLGkpe3ZhciBuPWUudmFsdWU7dT1NYXRoLm1heCh1LGsobik/bi5sZW5ndGg6MSk7bC5wdXNoKGUpO3ZhciBvPW5ldyBteChlLm5hbWUscyk7aT95eChvLGkpOnMucm9vdD1vO3MuX25vZGVzLnB1c2gobyk7dmFyIGE9ZS5jaGlsZHJlbjtpZihhKWZvcih2YXIgcj0wO3I8YS5sZW5ndGg7cisrKXQoYVtyXSxvKX0odCkscy5yb290LnVwZGF0ZURlcHRoQW5kSGVpZ2h0KDApO3ZhciBvPW5wKGwse2Nvb3JkRGltZW5zaW9uczpbInZhbHVlIl0sZGltZW5zaW9uc0NvdW50OnV9KSxhPW5ldyBXZihvLGUpO3JldHVybiBhLmluaXREYXRhKGwpLHV4KHttYWluRGF0YTphLHN0cnVjdDpzLHN0cnVjdEF0dHI6InRyZWUifSkscy51cGRhdGUoKSxuJiZuKGEpLHN9LGljLmV4dGVuZCh7dHlwZToic2VyaWVzLnRyZWUiLGxheW91dEluZm86bnVsbCxsYXlvdXRNb2RlOiJib3giLGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXtuYW1lOnQubmFtZSxjaGlsZHJlbjp0LmRhdGF9LGk9dC5sZWF2ZXN8fHt9LG49e307bi5sZWF2ZXM9aTt2YXIgbz12eC5jcmVhdGVUcmVlKGUsdGhpcyxuLGZ1bmN0aW9uKHQpe3Qud3JhcE1ldGhvZCgiZ2V0SXRlbU1vZGVsIixmdW5jdGlvbih0LGUpe3ZhciBpPW8uZ2V0Tm9kZUJ5RGF0YUluZGV4KGUpLG49aS5nZXRMZWF2ZXNNb2RlbCgpO3JldHVybiBpLmNoaWxkcmVuLmxlbmd0aCYmaS5pc0V4cGFuZHx8KHQucGFyZW50TW9kZWw9biksdH0pfSk7dmFyIGE9MDtvLmVhY2hOb2RlKCJwcmVvcmRlciIsZnVuY3Rpb24odCl7dC5kZXB0aD5hJiYoYT10LmRlcHRoKX0pO3ZhciByPXQuZXhwYW5kQW5kQ29sbGFwc2UmJjA8PXQuaW5pdGlhbFRyZWVEZXB0aD90LmluaXRpYWxUcmVlRGVwdGg6YTtyZXR1cm4gby5yb290LmVhY2hOb2RlKCJwcmVvcmRlciIsZnVuY3Rpb24odCl7dmFyIGU9dC5ob3N0VHJlZS5kYXRhLmdldFJhd0RhdGFJdGVtKHQuZGF0YUluZGV4KTt0LmlzRXhwYW5kPWUmJm51bGwhPWUuY29sbGFwc2VkPyFlLmNvbGxhcHNlZDp0LmRlcHRoPD1yfSksby5kYXRhfSxnZXRPcmllbnQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldCgib3JpZW50Iik7cmV0dXJuImhvcml6b250YWwiPT09dD90PSJMUiI6InZlcnRpY2FsIj09PXQmJih0PSJUQiIpLHR9LHNldFpvb206ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uem9vbT10fSxzZXRDZW50ZXI6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uY2VudGVyPXR9LGZvcm1hdFRvb2x0aXA6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZ2V0RGF0YSgpLnRyZWUsaT1lLnJvb3QuY2hpbGRyZW5bMF0sbj1lLmdldE5vZGVCeURhdGFJbmRleCh0KSxvPW4uZ2V0VmFsdWUoKSxhPW4ubmFtZTtuJiZuIT09aTspYT1uLnBhcmVudE5vZGUubmFtZSsiLiIrYSxuPW4ucGFyZW50Tm9kZTtyZXR1cm4gZXUoYSsoaXNOYU4obyl8fG51bGw9PW8/IiI6IiA6ICIrbykpfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToidmlldyIsbGVmdDoiMTIlIix0b3A6IjEyJSIscmlnaHQ6IjEyJSIsYm90dG9tOiIxMiUiLGxheW91dDoib3J0aG9nb25hbCIscm9hbTohMSxub2RlU2NhbGVSYXRpbzouNCxjZW50ZXI6bnVsbCx6b29tOjEsb3JpZW50OiJMUiIsc3ltYm9sOiJlbXB0eUNpcmNsZSIsc3ltYm9sU2l6ZTo3LGV4cGFuZEFuZENvbGxhcHNlOiEwLGluaXRpYWxUcmVlRGVwdGg6MixsaW5lU3R5bGU6e2NvbG9yOiIjY2NjIix3aWR0aDoxLjUsY3VydmVuZXNzOi41fSxpdGVtU3R5bGU6e2NvbG9yOiJsaWdodHN0ZWVsYmx1ZSIsYm9yZGVyQ29sb3I6IiNjMjM1MzEiLGJvcmRlcldpZHRoOjEuNX0sbGFiZWw6e3Nob3c6ITAsY29sb3I6IiM1NTUifSxsZWF2ZXM6e2xhYmVsOntzaG93OiEwfX0sYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGFuaW1hdGlvbkR1cmF0aW9uOjcwMCxhbmltYXRpb25EdXJhdGlvblVwZGF0ZToxZTN9fSksTWYoe3R5cGU6InRyZWUiLGluaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLl9vbGRUcmVlLHRoaXMuX21haW5Hcm91cD1uZXcgSWksdGhpcy5fY29udHJvbGxlcj1uZXcgTHkoZS5nZXRacigpKSx0aGlzLl9jb250cm9sbGVySG9zdD17dGFyZ2V0OnRoaXMuZ3JvdXB9LHRoaXMuZ3JvdXAuYWRkKHRoaXMuX21haW5Hcm91cCl9LHJlbmRlcjpmdW5jdGlvbihuLHQsaSxlKXt2YXIgbz1uLmdldERhdGEoKSxhPW4ubGF5b3V0SW5mbyxyPXRoaXMuX21haW5Hcm91cCxzPW4uZ2V0KCJsYXlvdXQiKTsicmFkaWFsIj09PXM/ci5hdHRyKCJwb3NpdGlvbiIsW2EueCthLndpZHRoLzIsYS55K2EuaGVpZ2h0LzJdKTpyLmF0dHIoInBvc2l0aW9uIixbYS54LGEueV0pLHRoaXMuX3VwZGF0ZVZpZXdDb29yZFN5cyhuLGEscyksdGhpcy5fdXBkYXRlQ29udHJvbGxlcihuLHQsaSk7dmFyIGw9dGhpcy5fZGF0YSx1PXtleHBhbmRBbmRDb2xsYXBzZTpuLmdldCgiZXhwYW5kQW5kQ29sbGFwc2UiKSxsYXlvdXQ6cyxvcmllbnQ6bi5nZXRPcmllbnQoKSxjdXJ2YXR1cmU6bi5nZXQoImxpbmVTdHlsZS5jdXJ2ZW5lc3MiKSxzeW1ib2xSb3RhdGU6bi5nZXQoInN5bWJvbFJvdGF0ZSIpLHN5bWJvbE9mZnNldDpuLmdldCgic3ltYm9sT2Zmc2V0IiksaG92ZXJBbmltYXRpb246bi5nZXQoImhvdmVyQW5pbWF0aW9uIiksdXNlTmFtZUxhYmVsOiEwLGZhZGVJbjohMH07by5kaWZmKGwpLmFkZChmdW5jdGlvbih0KXtEeChvLHQpJiZMeChvLHQsbnVsbCxyLG4sdSl9KS51cGRhdGUoZnVuY3Rpb24odCxlKXt2YXIgaT1sLmdldEl0ZW1HcmFwaGljRWwoZSk7RHgobyx0KT9MeChvLHQsaSxyLG4sdSk6aSYma3gobCxlLGkscixuLHUpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPWwuZ2V0SXRlbUdyYXBoaWNFbCh0KTtlJiZreChsLHQsZSxyLG4sdSl9KS5leGVjdXRlKCksdGhpcy5fbm9kZVNjYWxlUmF0aW89bi5nZXQoIm5vZGVTY2FsZVJhdGlvIiksdGhpcy5fdXBkYXRlTm9kZUFuZExpbmtTY2FsZShuKSwhMD09PXUuZXhwYW5kQW5kQ29sbGFwc2UmJm8uZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCxlKXt0Lm9mZigiY2xpY2siKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7aS5kaXNwYXRjaEFjdGlvbih7dHlwZToidHJlZUV4cGFuZEFuZENvbGxhcHNlIixzZXJpZXNJZDpuLmlkLGRhdGFJbmRleDplfSl9KX0pLHRoaXMuX2RhdGE9b30sX3VwZGF0ZVZpZXdDb29yZFN5czpmdW5jdGlvbih0KXt2YXIgaT10LmdldERhdGEoKSxuPVtdO2kuZWFjaChmdW5jdGlvbih0KXt2YXIgZT1pLmdldEl0ZW1MYXlvdXQodCk7IWV8fGlzTmFOKGUueCl8fGlzTmFOKGUueSl8fG4ucHVzaChbK2UueCwrZS55XSl9KTt2YXIgZT1bXSxvPVtdO0JhKG4sZSxvKTt2YXIgYT10aGlzLl9taW4scj10aGlzLl9tYXg7b1swXS1lWzBdPT0wJiYoZVswXT1hP2FbMF06ZVswXS0xLG9bMF09cj9yWzBdOm9bMF0rMSksb1sxXS1lWzFdPT0wJiYoZVsxXT1hP2FbMV06ZVsxXS0xLG9bMV09cj9yWzFdOm9bMV0rMSk7dmFyIHM9dC5jb29yZGluYXRlU3lzdGVtPW5ldyBReTtzLnpvb21MaW1pdD10LmdldCgic2NhbGVMaW1pdCIpLHMuc2V0Qm91bmRpbmdSZWN0KGVbMF0sZVsxXSxvWzBdLWVbMF0sb1sxXS1lWzFdKSxzLnNldENlbnRlcih0LmdldCgiY2VudGVyIikpLHMuc2V0Wm9vbSh0LmdldCgiem9vbSIpKSx0aGlzLmdyb3VwLmF0dHIoe3Bvc2l0aW9uOnMucG9zaXRpb24sc2NhbGU6cy5zY2FsZX0pLHRoaXMuX3ZpZXdDb29yZFN5cz1zLHRoaXMuX21pbj1lLHRoaXMuX21heD1vfSxfdXBkYXRlQ29udHJvbGxlcjpmdW5jdGlvbihvLHQsYSl7dmFyIGU9dGhpcy5fY29udHJvbGxlcixpPXRoaXMuX2NvbnRyb2xsZXJIb3N0LHI9dGhpcy5ncm91cDtlLnNldFBvaW50ZXJDaGVja2VyKGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1yLmdldEJvdW5kaW5nUmVjdCgpO3JldHVybiBuLmFwcGx5VHJhbnNmb3JtKHIudHJhbnNmb3JtKSxuLmNvbnRhaW4oZSxpKSYmIVd5KHQsYSxvKX0pLGUuZW5hYmxlKG8uZ2V0KCJyb2FtIikpLGkuem9vbUxpbWl0PW8uZ2V0KCJzY2FsZUxpbWl0IiksaS56b29tPW8uY29vcmRpbmF0ZVN5c3RlbS5nZXRab29tKCksZS5vZmYoInBhbiIpLm9mZigiem9vbSIpLm9uKCJwYW4iLGZ1bmN0aW9uKHQpe1Z5KGksdC5keCx0LmR5KSxhLmRpc3BhdGNoQWN0aW9uKHtzZXJpZXNJZDpvLmlkLHR5cGU6InRyZWVSb2FtIixkeDp0LmR4LGR5OnQuZHl9KX0sdGhpcykub24oInpvb20iLGZ1bmN0aW9uKHQpe0d5KGksdC5zY2FsZSx0Lm9yaWdpblgsdC5vcmlnaW5ZKSxhLmRpc3BhdGNoQWN0aW9uKHtzZXJpZXNJZDpvLmlkLHR5cGU6InRyZWVSb2FtIix6b29tOnQuc2NhbGUsb3JpZ2luWDp0Lm9yaWdpblgsb3JpZ2luWTp0Lm9yaWdpbll9KSx0aGlzLl91cGRhdGVOb2RlQW5kTGlua1NjYWxlKG8pfSx0aGlzKX0sX3VwZGF0ZU5vZGVBbmRMaW5rU2NhbGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCksaT10aGlzLl9nZXROb2RlR2xvYmFsU2NhbGUodCksbj1baSxpXTtlLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsZSl7dC5hdHRyKCJzY2FsZSIsbil9KX0sX2dldE5vZGVHbG9iYWxTY2FsZTpmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoInZpZXciIT09ZS50eXBlKXJldHVybiAxO3ZhciBpPXRoaXMuX25vZGVTY2FsZVJhdGlvLG49ZS5zY2FsZSxvPW4mJm5bMF18fDE7cmV0dXJuKChlLmdldFpvb20oKS0xKSppKzEpL299LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sbGVyJiZ0aGlzLl9jb250cm9sbGVyLmRpc3Bvc2UoKSx0aGlzLl9jb250cm9sbGVySG9zdD17fX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fbWFpbkdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2RhdGE9bnVsbH19KSxnZih7dHlwZToidHJlZUV4cGFuZEFuZENvbGxhcHNlIixldmVudDoidHJlZUV4cGFuZEFuZENvbGxhcHNlIix1cGRhdGU6InVwZGF0ZSJ9LGZ1bmN0aW9uKG4sdCl7dC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToic2VyaWVzIixzdWJUeXBlOiJ0cmVlIixxdWVyeTpufSxmdW5jdGlvbih0KXt2YXIgZT1uLmRhdGFJbmRleCxpPXQuZ2V0RGF0YSgpLnRyZWUuZ2V0Tm9kZUJ5RGF0YUluZGV4KGUpO2kuaXNFeHBhbmQ9IWkuaXNFeHBhbmR9KX0pLGdmKHt0eXBlOiJ0cmVlUm9hbSIsZXZlbnQ6InRyZWVSb2FtIix1cGRhdGU6Im5vbmUifSxmdW5jdGlvbihpLHQpe3QuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToidHJlZSIscXVlcnk6aX0sZnVuY3Rpb24odCl7dmFyIGU9S3kodC5jb29yZGluYXRlU3lzdGVtLGkpO3Quc2V0Q2VudGVyJiZ0LnNldENlbnRlcihlLmNlbnRlciksdC5zZXRab29tJiZ0LnNldFpvb20oZS56b29tKX0pfSk7ZnVuY3Rpb24gT3godCxlLGkpe2lmKHQmJjA8PV8oZSx0LnR5cGUpKXt2YXIgbj1pLmdldERhdGEoKS50cmVlLnJvb3Qsbz10LnRhcmdldE5vZGU7aWYoInN0cmluZyI9PXR5cGVvZiBvJiYobz1uLmdldE5vZGVCeUlkKG8pKSxvJiZuLmNvbnRhaW5zKG8pKXJldHVybntub2RlOm99O3ZhciBhPXQudGFyZ2V0Tm9kZUlkO2lmKG51bGwhPWEmJihvPW4uZ2V0Tm9kZUJ5SWQoYSkpKXJldHVybntub2RlOm99fX1mdW5jdGlvbiBFeCh0KXtmb3IodmFyIGU9W107dDspKHQ9dC5wYXJlbnROb2RlKSYmZS5wdXNoKHQpO3JldHVybiBlLnJldmVyc2UoKX1mdW5jdGlvbiB6eCh0LGUpe3JldHVybiAwPD1fKEV4KHQpLGUpfWZ1bmN0aW9uIFJ4KHQsZSl7Zm9yKHZhciBpPVtdO3Q7KXt2YXIgbj10LmRhdGFJbmRleDtpLnB1c2goe25hbWU6dC5uYW1lLGRhdGFJbmRleDpuLHZhbHVlOmUuZ2V0UmF3VmFsdWUobil9KSx0PXQucGFyZW50Tm9kZX1yZXR1cm4gaS5yZXZlcnNlKCksaX15ZihNbSgidHJlZSIsImNpcmNsZSIpKSx2ZihmdW5jdGlvbih0LGUpe3QuZWFjaFNlcmllc0J5VHlwZSgidHJlZSIsZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdnUodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSl9KHQsZSk7dC5sYXlvdXRJbmZvPWk7dmFyIG49dC5nZXQoImxheW91dCIpLG89MCxhPTAscj1udWxsO3I9InJhZGlhbCI9PT1uPyhvPTIqTWF0aC5QSSxhPU1hdGgubWluKGkuaGVpZ2h0LGkud2lkdGgpLzIsYngoZnVuY3Rpb24odCxlKXtyZXR1cm4odC5wYXJlbnROb2RlPT09ZS5wYXJlbnROb2RlPzE6MikvdC5kZXB0aH0pKToobz1pLndpZHRoLGE9aS5oZWlnaHQsYngoKSk7dmFyIHM9dC5nZXREYXRhKCkudHJlZS5yb290LGw9cy5jaGlsZHJlblswXTtpZihsKXshZnVuY3Rpb24odCl7dC5oaWVyTm9kZT17ZGVmYXVsdEFuY2VzdG9yOm51bGwsYW5jZXN0b3I6dCxwcmVsaW06MCxtb2RpZmllcjowLGNoYW5nZTowLHNoaWZ0OjAsaTowLHRocmVhZDpudWxsfTtmb3IodmFyIGUsaSxuPVt0XTtlPW4ucG9wKCk7KWlmKGk9ZS5jaGlsZHJlbixlLmlzRXhwYW5kJiZpLmxlbmd0aClmb3IodmFyIG89aS5sZW5ndGgtMTswPD1vO28tLSl7dmFyIGE9aVtvXTthLmhpZXJOb2RlPXtkZWZhdWx0QW5jZXN0b3I6bnVsbCxhbmNlc3RvcjphLHByZWxpbTowLG1vZGlmaWVyOjAsY2hhbmdlOjAsc2hpZnQ6MCxpOm8sdGhyZWFkOm51bGx9LG4ucHVzaChhKX19KHMpLGZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG4sbz1bdF0sYT1bXTtuPW8ucG9wKCk7KWlmKGEucHVzaChuKSxuLmlzRXhwYW5kKXt2YXIgcj1uLmNoaWxkcmVuO2lmKHIubGVuZ3RoKWZvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKW8ucHVzaChyW3NdKX1mb3IoO249YS5wb3AoKTspZShuLGkpfShsLHh4LHIpLHMuaGllck5vZGUubW9kaWZpZXI9LWwuaGllck5vZGUucHJlbGltLE54KGwsX3gpO3ZhciB1PWwsaD1sLGM9bDtOeChsLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0TGF5b3V0KCkueDtlPHUuZ2V0TGF5b3V0KCkueCYmKHU9dCksZT5oLmdldExheW91dCgpLngmJihoPXQpLHQuZGVwdGg+Yy5kZXB0aCYmKGM9dCl9KTt2YXIgZD11PT09aD8xOnIodSxoKS8yLGY9ZC11LmdldExheW91dCgpLngscD0wLGc9MCxtPTAsdj0wO2lmKCJyYWRpYWwiPT09bilwPW8vKGguZ2V0TGF5b3V0KCkueCtkK2YpLGc9YS8oYy5kZXB0aC0xfHwxKSxOeChsLGZ1bmN0aW9uKHQpe209KHQuZ2V0TGF5b3V0KCkueCtmKSpwLHY9KHQuZGVwdGgtMSkqZzt2YXIgZT1TeChtLHYpO3Quc2V0TGF5b3V0KHt4OmUueCx5OmUueSxyYXdYOm0scmF3WTp2fSwhMCl9KTtlbHNle3ZhciB5PXQuZ2V0T3JpZW50KCk7IlJMIj09PXl8fCJMUiI9PT15PyhnPWEvKGguZ2V0TGF5b3V0KCkueCtkK2YpLHA9by8oYy5kZXB0aC0xfHwxKSxOeChsLGZ1bmN0aW9uKHQpe3Y9KHQuZ2V0TGF5b3V0KCkueCtmKSpnLG09IkxSIj09PXk/KHQuZGVwdGgtMSkqcDpvLSh0LmRlcHRoLTEpKnAsdC5zZXRMYXlvdXQoe3g6bSx5OnZ9LCEwKX0pKToiVEIiIT09eSYmIkJUIiE9PXl8fChwPW8vKGguZ2V0TGF5b3V0KCkueCtkK2YpLGc9YS8oYy5kZXB0aC0xfHwxKSxOeChsLGZ1bmN0aW9uKHQpe209KHQuZ2V0TGF5b3V0KCkueCtmKSpwLHY9IlRCIj09PXk/KHQuZGVwdGgtMSkqZzphLSh0LmRlcHRoLTEpKmcsdC5zZXRMYXlvdXQoe3g6bSx5OnZ9LCEwKX0pKX19fSh0LGUpfSl9KSxpYy5leHRlbmQoe3R5cGU6InNlcmllcy50cmVlbWFwIixsYXlvdXRNb2RlOiJib3giLGRlcGVuZGVuY2llczpbImdyaWQiLCJwb2xhciJdLHByZXZlbnRVc2luZ0hvdmVyTGF5ZXI6ITAsX3ZpZXdSb290Om51bGwsZGVmYXVsdE9wdGlvbjp7cHJvZ3Jlc3NpdmU6MCxsZWZ0OiJjZW50ZXIiLHRvcDoibWlkZGxlIixyaWdodDpudWxsLGJvdHRvbTpudWxsLHdpZHRoOiI4MCUiLGhlaWdodDoiODAlIixzb3J0OiEwLGNsaXBXaW5kb3c6Im9yaWdpbiIsc3F1YXJlUmF0aW86LjUqKDErTWF0aC5zcXJ0KDUpKSxsZWFmRGVwdGg6bnVsbCxkcmlsbERvd25JY29uOiLilrYiLHpvb21Ub05vZGVSYXRpbzouMTAyNCxyb2FtOiEwLG5vZGVDbGljazoiem9vbVRvTm9kZSIsYW5pbWF0aW9uOiEwLGFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlOjkwMCxhbmltYXRpb25FYXNpbmc6InF1aW50aWNJbk91dCIsYnJlYWRjcnVtYjp7c2hvdzohMCxoZWlnaHQ6MjIsbGVmdDoiY2VudGVyIix0b3A6ImJvdHRvbSIsZW1wdHlJdGVtV2lkdGg6MjUsaXRlbVN0eWxlOntjb2xvcjoicmdiYSgwLDAsMCwwLjcpIixib3JkZXJDb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjcpIixib3JkZXJXaWR0aDoxLHNoYWRvd0NvbG9yOiJyZ2JhKDE1MCwxNTAsMTUwLDEpIixzaGFkb3dCbHVyOjMsc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCx0ZXh0U3R5bGU6e2NvbG9yOiIjZmZmIn19LGVtcGhhc2lzOnt0ZXh0U3R5bGU6e319fSxsYWJlbDp7c2hvdzohMCxkaXN0YW5jZTowLHBhZGRpbmc6NSxwb3NpdGlvbjoiaW5zaWRlIixjb2xvcjoiI2ZmZiIsZWxsaXBzaXM6ITB9LHVwcGVyTGFiZWw6e3Nob3c6ITEscG9zaXRpb246WzAsIjUwJSJdLGhlaWdodDoyMCxjb2xvcjoiI2ZmZiIsZWxsaXBzaXM6ITAsdmVydGljYWxBbGlnbjoibWlkZGxlIn0saXRlbVN0eWxlOntjb2xvcjpudWxsLGNvbG9yQWxwaGE6bnVsbCxjb2xvclNhdHVyYXRpb246bnVsbCxib3JkZXJXaWR0aDowLGdhcFdpZHRoOjAsYm9yZGVyQ29sb3I6IiNmZmYiLGJvcmRlckNvbG9yU2F0dXJhdGlvbjpudWxsfSxlbXBoYXNpczp7dXBwZXJMYWJlbDp7c2hvdzohMCxwb3NpdGlvbjpbMCwiNTAlIl0sY29sb3I6IiNmZmYiLGVsbGlwc2lzOiEwLHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9fSx2aXN1YWxEaW1lbnNpb246MCx2aXN1YWxNaW46bnVsbCx2aXN1YWxNYXg6bnVsbCxjb2xvcjpbXSxjb2xvckFscGhhOm51bGwsY29sb3JTYXR1cmF0aW9uOm51bGwsY29sb3JNYXBwaW5nQnk6ImluZGV4Iix2aXNpYmxlTWluOjEwLGNoaWxkcmVuVmlzaWJsZU1pbjpudWxsLGxldmVsczpbXX0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaT17bmFtZTp0Lm5hbWUsY2hpbGRyZW46dC5kYXRhfTshZnVuY3Rpb24gaSh0KXt2YXIgbj0wO0UodC5jaGlsZHJlbixmdW5jdGlvbih0KXtpKHQpO3ZhciBlPXQudmFsdWU7ayhlKSYmKGU9ZVswXSksbis9ZX0pO3ZhciBlPXQudmFsdWU7ayhlKSYmKGU9ZVswXSk7bnVsbCE9ZSYmIWlzTmFOKGUpfHwoZT1uKTtlPDAmJihlPTApO2sodC52YWx1ZSk/dC52YWx1ZVswXT1lOnQudmFsdWU9ZX0oaSk7dmFyIG49dC5sZXZlbHN8fFtdO249dC5sZXZlbHM9ZnVuY3Rpb24odCxlKXt2YXIgbixpPWUuZ2V0KCJjb2xvciIpO2lmKCFpKXJldHVybjtpZihFKHQ9dHx8W10sZnVuY3Rpb24odCl7dmFyIGU9bmV3IElsKHQpLGk9ZS5nZXQoImNvbG9yIik7KGUuZ2V0KCJpdGVtU3R5bGUuY29sb3IiKXx8aSYmIm5vbmUiIT09aSkmJihuPSEwKX0pLCFuKXsodFswXXx8KHRbMF09e30pKS5jb2xvcj1pLnNsaWNlKCl9cmV0dXJuIHR9KG4sZSk7dmFyIG89e307cmV0dXJuIG8ubGV2ZWxzPW4sdnguY3JlYXRlVHJlZShpLHRoaXMsbykuZGF0YX0sb3B0aW9uVXBkYXRlZDpmdW5jdGlvbigpe3RoaXMucmVzZXRWaWV3Um9vdCgpfSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YSgpLGk9dGhpcy5nZXRSYXdWYWx1ZSh0KSxuPWsoaSk/S2woaVswXSk6S2woaSk7cmV0dXJuIGV1KGUuZ2V0TmFtZSh0KSsiOiAiK24pfSxnZXREYXRhUGFyYW1zOmZ1bmN0aW9uKHQpe3ZhciBlPWljLnByb3RvdHlwZS5nZXREYXRhUGFyYW1zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpPXRoaXMuZ2V0RGF0YSgpLnRyZWUuZ2V0Tm9kZUJ5RGF0YUluZGV4KHQpO3JldHVybiBlLnRyZWVQYXRoSW5mbz1SeChpLHRoaXMpLGV9LHNldExheW91dEluZm86ZnVuY3Rpb24odCl7dGhpcy5sYXlvdXRJbmZvPXRoaXMubGF5b3V0SW5mb3x8e30sTCh0aGlzLmxheW91dEluZm8sdCl9LG1hcElkVG9JbmRleDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pZEluZGV4TWFwO2V8fChlPXRoaXMuX2lkSW5kZXhNYXA9USgpLHRoaXMuX2lkSW5kZXhNYXBDb3VudD0wKTt2YXIgaT1lLmdldCh0KTtyZXR1cm4gbnVsbD09aSYmZS5zZXQodCxpPXRoaXMuX2lkSW5kZXhNYXBDb3VudCsrKSxpfSxnZXRWaWV3Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3Um9vdH0scmVzZXRWaWV3Um9vdDpmdW5jdGlvbih0KXt0P3RoaXMuX3ZpZXdSb290PXQ6dD10aGlzLl92aWV3Um9vdDt2YXIgZT10aGlzLmdldFJhd0RhdGEoKS50cmVlLnJvb3Q7dCYmKHQ9PT1lfHxlLmNvbnRhaW5zKHQpKXx8KHRoaXMuX3ZpZXdSb290PWUpfX0pO3ZhciBCeD01O2Z1bmN0aW9uIFZ4KHQpe3RoaXMuZ3JvdXA9bmV3IElpLHQuYWRkKHRoaXMuZ3JvdXApfWZ1bmN0aW9uIEd4KHQsZSxpLG4sbyxhKXt2YXIgcj1bW28/dDp0LUJ4LGVdLFt0K2ksZV0sW3QraSxlK25dLFtvP3Q6dC1CeCxlK25dXTtyZXR1cm4gYXx8ci5zcGxpY2UoMiwwLFt0K2krQngsZStuLzJdKSxvfHxyLnB1c2goW3QsZStuLzJdKSxyfVZ4LnByb3RvdHlwZT17Y29uc3RydWN0b3I6VngscmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXQuZ2V0TW9kZWwoImJyZWFkY3J1bWIiKSxhPXRoaXMuZ3JvdXA7aWYoYS5yZW1vdmVBbGwoKSxvLmdldCgic2hvdyIpJiZpKXt2YXIgcj1vLmdldE1vZGVsKCJpdGVtU3R5bGUiKSxzPXIuZ2V0TW9kZWwoInRleHRTdHlsZSIpLGw9e3Bvczp7bGVmdDpvLmdldCgibGVmdCIpLHJpZ2h0Om8uZ2V0KCJyaWdodCIpLHRvcDpvLmdldCgidG9wIiksYm90dG9tOm8uZ2V0KCJib3R0b20iKX0sYm94Ont3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9LGVtcHR5SXRlbVdpZHRoOm8uZ2V0KCJlbXB0eUl0ZW1XaWR0aCIpLHRvdGFsV2lkdGg6MCxyZW5kZXJMaXN0OltdfTt0aGlzLl9wcmVwYXJlKGksbCxzKSx0aGlzLl9yZW5kZXJDb250ZW50KHQsbCxyLHMsbikseXUoYSxsLnBvcyxsLmJveCl9fSxfcHJlcGFyZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPXQ7bjtuPW4ucGFyZW50Tm9kZSl7dmFyIG89bi5nZXRNb2RlbCgpLmdldCgibmFtZSIpLGE9aS5nZXRUZXh0UmVjdChvKSxyPU1hdGgubWF4KGEud2lkdGgrMTYsZS5lbXB0eUl0ZW1XaWR0aCk7ZS50b3RhbFdpZHRoKz1yKzgsZS5yZW5kZXJMaXN0LnB1c2goe25vZGU6bix0ZXh0Om8sd2lkdGg6cn0pfX0sX3JlbmRlckNvbnRlbnQ6ZnVuY3Rpb24odCxlLGksbixvKXtmb3IodmFyIGEscixzPTAsbD1lLmVtcHR5SXRlbVdpZHRoLHU9dC5nZXQoImJyZWFkY3J1bWIuaGVpZ2h0IiksaD1mdW5jdGlvbih0LGUsaSl7dmFyIG49ZS53aWR0aCxvPWUuaGVpZ2h0LGE9UGwodC54LG4pLHI9UGwodC55LG8pLHM9UGwodC54MixuKSxsPVBsKHQueTIsbyk7cmV0dXJuKGlzTmFOKGEpfHxpc05hTihwYXJzZUZsb2F0KHQueCkpKSYmKGE9MCksKGlzTmFOKHMpfHxpc05hTihwYXJzZUZsb2F0KHQueDIpKSkmJihzPW4pLChpc05hTihyKXx8aXNOYU4ocGFyc2VGbG9hdCh0LnkpKSkmJihyPTApLChpc05hTihsKXx8aXNOYU4ocGFyc2VGbG9hdCh0LnkyKSkpJiYobD1vKSxpPUpsKGl8fDApLHt3aWR0aDpNYXRoLm1heChzLWEtaVsxXS1pWzNdLDApLGhlaWdodDpNYXRoLm1heChsLXItaVswXS1pWzJdLDApfX0oZS5wb3MsZS5ib3gpLGM9ZS50b3RhbFdpZHRoLGQ9ZS5yZW5kZXJMaXN0LGY9ZC5sZW5ndGgtMTswPD1mO2YtLSl7dmFyIHA9ZFtmXSxnPXAubm9kZSxtPXAud2lkdGgsdj1wLnRleHQ7Yz5oLndpZHRoJiYoYy09bS1sLG09bCx2PW51bGwpO3ZhciB5PW5ldyBxcih7c2hhcGU6e3BvaW50czpHeChzLDAsbSx1LGY9PT1kLmxlbmd0aC0xLDA9PT1mKX0sc3R5bGU6QyhpLmdldEl0ZW1TdHlsZSgpLHtsaW5lSm9pbjoiYmV2ZWwiLHRleHQ6dix0ZXh0RmlsbDpuLmdldFRleHRDb2xvcigpLHRleHRGb250Om4uZ2V0Rm9udCgpfSksejoxMCxvbmNsaWNrOlQobyxnKX0pO3RoaXMuZ3JvdXAuYWRkKHkpLGE9dCxyPWcseS5ldmVudERhdGE9e2NvbXBvbmVudFR5cGU6InNlcmllcyIsY29tcG9uZW50U3ViVHlwZToidHJlZW1hcCIsY29tcG9uZW50SW5kZXg6YS5jb21wb25lbnRJbmRleCxzZXJpZXNJbmRleDphLmNvbXBvbmVudEluZGV4LHNlcmllc05hbWU6YS5uYW1lLHNlcmllc1R5cGU6InRyZWVtYXAiLHNlbGZUeXBlOiJicmVhZGNydW1iIixub2RlRGF0YTp7ZGF0YUluZGV4OnImJnIuZGF0YUluZGV4LG5hbWU6ciYmci5uYW1lfSx0cmVlUGF0aEluZm86ciYmUngocixhKX0scys9bSs4fX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKX19O2Z1bmN0aW9uIEZ4KHQpe3ZhciBlPSR4KHQpO3JldHVybiBlLnN0cm9rZT1lLmZpbGw9ZS5saW5lV2lkdGg9bnVsbCxlfXZhciBXeD1BLEh4PUlpLFp4PWlzLFV4PUUsWHg9WyJsYWJlbCJdLFl4PVsiZW1waGFzaXMiLCJsYWJlbCJdLGp4PVsidXBwZXJMYWJlbCJdLHF4PVsiZW1waGFzaXMiLCJ1cHBlckxhYmVsIl0sS3g9MTAsJHg9cmEoW1siZmlsbCIsImNvbG9yIl0sWyJzdHJva2UiLCJzdHJva2VDb2xvciJdLFsibGluZVdpZHRoIiwic3Ryb2tlV2lkdGgiXSxbInNoYWRvd0JsdXIiXSxbInNoYWRvd09mZnNldFgiXSxbInNoYWRvd09mZnNldFkiXSxbInNoYWRvd0NvbG9yIl1dKTtmdW5jdGlvbiBKeChkLHIscyxsLHUsaSxmLHQsZSxuKXtpZihmKXt2YXIgcD1mLmdldExheW91dCgpO2lmKHAmJnAuaXNJblZpZXcpe3ZhciBoPXAud2lkdGgsYz1wLmhlaWdodCxnPXAuYm9yZGVyV2lkdGgsbT1wLmludmlzaWJsZSx2PWYuZ2V0UmF3SW5kZXgoKSx5PXQmJnQuZ2V0UmF3SW5kZXgoKSxvPWYudmlld0NoaWxkcmVuLHg9cC51cHBlckhlaWdodCxhPW8mJm8ubGVuZ3RoLF89Zi5nZXRNb2RlbCgiaXRlbVN0eWxlIiksdz1mLmdldE1vZGVsKCJlbXBoYXNpcy5pdGVtU3R5bGUiKSxiPUEoIm5vZGVHcm91cCIsSHgpO2lmKGIpe2lmKGUuYWRkKGIpLGIuYXR0cigicG9zaXRpb24iLFtwLnh8fDAscC55fHwwXSksYi5fX3RtTm9kZVdpZHRoPWgsYi5fX3RtTm9kZUhlaWdodD1jLHAuaXNBYm92ZVZpZXdSb290KXJldHVybiBiO3ZhciBTPUEoImJhY2tncm91bmQiLFp4LG4sMSk7aWYoUyYmZnVuY3Rpb24odCxuLG8pe24uZGF0YUluZGV4PWYuZGF0YUluZGV4LG4uc2VyaWVzSW5kZXg9ZC5zZXJpZXNJbmRleCxuLnNldFNoYXBlKHt4OjAseTowLHdpZHRoOmgsaGVpZ2h0OmN9KTt2YXIgYT1mLmdldFZpc3VhbCgiYm9yZGVyQ29sb3IiLCEwKSxyPXcuZ2V0KCJib3JkZXJDb2xvciIpO0kobixmdW5jdGlvbigpe3ZhciB0PUZ4KF8pO3QuZmlsbD1hO3ZhciBlPSR4KHcpO2lmKGUuZmlsbD1yLG8pe3ZhciBpPWgtMipnO1QodCxlLGEsaSx4LHt4OmcseTowLHdpZHRoOmksaGVpZ2h0Onh9KX1lbHNlIHQudGV4dD1lLnRleHQ9bnVsbDtuLnNldFN0eWxlKHQpLFlzKG4sZSl9KSx0LmFkZChuKX0oYixTLGEmJnAudXBwZXJIZWlnaHQpLCFhKXt2YXIgTT1BKCJjb250ZW50IixaeCxuLDIpO00mJmZ1bmN0aW9uKHQsaSl7aS5kYXRhSW5kZXg9Zi5kYXRhSW5kZXgsaS5zZXJpZXNJbmRleD1kLnNlcmllc0luZGV4O3ZhciBuPU1hdGgubWF4KGgtMipnLDApLG89TWF0aC5tYXgoYy0yKmcsMCk7aS5jdWxsaW5nPSEwLGkuc2V0U2hhcGUoe3g6Zyx5Omcsd2lkdGg6bixoZWlnaHQ6b30pO3ZhciBhPWYuZ2V0VmlzdWFsKCJjb2xvciIsITApO0koaSxmdW5jdGlvbigpe3ZhciB0PUZ4KF8pO3QuZmlsbD1hO3ZhciBlPSR4KHcpO1QodCxlLGEsbixvKSxpLnNldFN0eWxlKHQpLFlzKGksZSl9KSx0LmFkZChpKX0oYixNKX1yZXR1cm4gYn19fWZ1bmN0aW9uIEkodCxlKXttP3QuaW52aXNpYmxlfHxpLnB1c2godCk6KGUoKSx0Ll9fdG1XaWxsVmlzaWJsZXx8KHQuaW52aXNpYmxlPSExKSl9ZnVuY3Rpb24gVCh0LGUsaSxuLG8sYSl7dmFyIHI9Zi5nZXRNb2RlbCgpLHM9VyhkLmdldEZvcm1hdHRlZExhYmVsKGYuZGF0YUluZGV4LCJub3JtYWwiLG51bGwsbnVsbCxhPyJ1cHBlckxhYmVsIjoibGFiZWwiKSxyLmdldCgibmFtZSIpKTtpZighYSYmcC5pc0xlYWZSb290KXt2YXIgbD1kLmdldCgiZHJpbGxEb3duSWNvbiIsITApO3M9bD9sKyIgIitzOnN9dmFyIHU9ci5nZXRNb2RlbChhP2p4Olh4KSxoPXIuZ2V0TW9kZWwoYT9xeDpZeCksYz11LmdldFNoYWxsb3coInNob3ciKTskcyh0LGUsdSxoLHtkZWZhdWx0VGV4dDpjP3M6bnVsbCxhdXRvQ29sb3I6aSxpc1JlY3RUZXh0OiEwfSksYSYmKHQudGV4dFJlY3Q9RChhKSksdC50cnVuY2F0ZT1jJiZ1LmdldCgiZWxsaXBzaXMiKT97b3V0ZXJXaWR0aDpuLG91dGVySGVpZ2h0Om8sbWluQ2hhcjoyfTpudWxsfWZ1bmN0aW9uIEEodCxlLGksbil7dmFyIG89bnVsbCE9eSYmc1t0XVt5XSxhPXVbdF07cmV0dXJuIG8/KHNbdF1beV09bnVsbCxmdW5jdGlvbih0LGUsaSl7KHRbdl09e30pLm9sZD0ibm9kZUdyb3VwIj09PWk/ZS5wb3NpdGlvbi5zbGljZSgpOkwoe30sZS5zaGFwZSl9KGEsbyx0KSk6bXx8KChvPW5ldyBlKHt6OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dCpLeCtlO3JldHVybihpLTEpL2l9KGksbil9KSkuX190bURlcHRoPWksZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRbdl09e30sbz1mLnBhcmVudE5vZGU7aWYobyYmKCFsfHwiZHJpbGxEb3duIj09PWwuZGlyZWN0aW9uKSl7dmFyIGE9MCxyPTAscz11LmJhY2tncm91bmRbby5nZXRSYXdJbmRleCgpXTshbCYmcyYmcy5vbGQmJihhPXMub2xkLndpZHRoLHI9cy5vbGQuaGVpZ2h0KSxuLm9sZD0ibm9kZUdyb3VwIj09PWk/WzAscl06e3g6YSx5OnIsd2lkdGg6MCxoZWlnaHQ6MH19bi5mYWRlaW49Im5vZGVHcm91cCIhPT1pfShhLDAsby5fX3RtU3RvcmFnZU5hbWU9dCkpLHJbdF1bdl09b319TWYoe3R5cGU6InRyZWVtYXAiLGluaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLl9jb250YWluZXJHcm91cCx0aGlzLl9zdG9yYWdlPXtub2RlR3JvdXA6W10sYmFja2dyb3VuZDpbXSxjb250ZW50OltdfSx0aGlzLl9vbGRUcmVlLHRoaXMuX2JyZWFkY3J1bWIsdGhpcy5fY29udHJvbGxlcix0aGlzLl9zdGF0ZT0icmVhZHkifSxyZW5kZXI6ZnVuY3Rpb24odCxlLGksbil7aWYoIShfKGUuZmluZENvbXBvbmVudHMoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6InRyZWVtYXAiLHF1ZXJ5Om59KSx0KTwwKSl7dGhpcy5zZXJpZXNNb2RlbD10LHRoaXMuYXBpPWksdGhpcy5lY01vZGVsPWU7dmFyIG89T3gobixbInRyZWVtYXBab29tVG9Ob2RlIiwidHJlZW1hcFJvb3RUb05vZGUiXSx0KSxhPW4mJm4udHlwZSxyPXQubGF5b3V0SW5mbyxzPSF0aGlzLl9vbGRUcmVlLGw9dGhpcy5fc3RvcmFnZSx1PSJ0cmVlbWFwUm9vdFRvTm9kZSI9PT1hJiZvJiZsP3tyb290Tm9kZUdyb3VwOmwubm9kZUdyb3VwW28ubm9kZS5nZXRSYXdJbmRleCgpXSxkaXJlY3Rpb246bi5kaXJlY3Rpb259Om51bGwsaD10aGlzLl9naXZlQ29udGFpbmVyR3JvdXAociksYz10aGlzLl9kb1JlbmRlcihoLHQsdSk7c3x8YSYmInRyZWVtYXBab29tVG9Ob2RlIiE9PWEmJiJ0cmVlbWFwUm9vdFRvTm9kZSIhPT1hP2MucmVuZGVyRmluYWxseSgpOnRoaXMuX2RvQW5pbWF0aW9uKGgsYyx0LHUpLHRoaXMuX3Jlc2V0Q29udHJvbGxlcihpKSx0aGlzLl9yZW5kZXJCcmVhZGNydW1iKHQsaSxvKX19LF9naXZlQ29udGFpbmVyR3JvdXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29udGFpbmVyR3JvdXA7cmV0dXJuIGV8fChlPXRoaXMuX2NvbnRhaW5lckdyb3VwPW5ldyBIeCx0aGlzLl9pbml0RXZlbnRzKGUpLHRoaXMuZ3JvdXAuYWRkKGUpKSxlLmF0dHIoInBvc2l0aW9uIixbdC54LHQueV0pLGV9LF9kb1JlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49ZS5nZXREYXRhKCkudHJlZSxvPXRoaXMuX29sZFRyZWUsYT17bm9kZUdyb3VwOltdLGJhY2tncm91bmQ6W10sY29udGVudDpbXX0scj17bm9kZUdyb3VwOltdLGJhY2tncm91bmQ6W10sY29udGVudDpbXX0scz10aGlzLl9zdG9yYWdlLGw9W10sYz1UKEp4LGUscixzLGksYSxsKTshZnVuY3Rpb24gYShyLHMsbCx1LGgpe3U/VXgocz1yLGZ1bmN0aW9uKHQsZSl7dC5pc1JlbW92ZWQoKXx8aShlLGUpfSk6bmV3IFRmKHMscix0LHQpLmFkZChpKS51cGRhdGUoaSkucmVtb3ZlKFQoaSxudWxsKSkuZXhlY3V0ZSgpO2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQuZ2V0SWQoKX1mdW5jdGlvbiBpKHQsZSl7dmFyIGk9bnVsbCE9dD9yW3RdOm51bGwsbj1udWxsIT1lP3NbZV06bnVsbCxvPWMoaSxuLGwsaCk7byYmYShpJiZpLnZpZXdDaGlsZHJlbnx8W10sbiYmbi52aWV3Q2hpbGRyZW58fFtdLG8sdSxoKzEpfX0obi5yb290P1tuLnJvb3RdOltdLG8mJm8ucm9vdD9bby5yb290XTpbXSx0LG49PT1vfHwhbywwKTt2YXIgdSxoLGQ9KGg9e25vZGVHcm91cDpbXSxiYWNrZ3JvdW5kOltdLGNvbnRlbnQ6W119LCh1PXMpJiZVeCh1LGZ1bmN0aW9uKHQsZSl7dmFyIGk9aFtlXTtVeCh0LGZ1bmN0aW9uKHQpe3QmJihpLnB1c2godCksdC5fX3RtV2lsbERlbGV0ZT0xKX0pfSksaCk7cmV0dXJuIHRoaXMuX29sZFRyZWU9bix0aGlzLl9zdG9yYWdlPXIse2xhc3RzRm9yQW5pbWF0aW9uOmEsd2lsbERlbGV0ZUVsczpkLHJlbmRlckZpbmFsbHk6ZnVuY3Rpb24oKXtVeChkLGZ1bmN0aW9uKHQpe1V4KHQsZnVuY3Rpb24odCl7dC5wYXJlbnQmJnQucGFyZW50LnJlbW92ZSh0KX0pfSksVXgobCxmdW5jdGlvbih0KXt0LmludmlzaWJsZT0hMCx0LmRpcnR5KCl9KX19fSxfZG9BbmltYXRpb246ZnVuY3Rpb24odCxhLGUscyl7aWYoZS5nZXQoImFuaW1hdGlvbiIpKXt2YXIgbD1lLmdldCgiYW5pbWF0aW9uRHVyYXRpb25VcGRhdGUiKSx1PWUuZ2V0KCJhbmltYXRpb25FYXNpbmciKSxoPWZ1bmN0aW9uKCl7dmFyIGEscj1bXSxzPXt9O3JldHVybnthZGQ6ZnVuY3Rpb24odCxlLGksbixvKXtyZXR1cm4geihuKSYmKG89bixuPTApLCFzW3QuaWRdJiYoc1t0LmlkXT0xLHIucHVzaCh7ZWw6dCx0YXJnZXQ6ZSx0aW1lOmksZGVsYXk6bixlYXNpbmc6b30pLCEwKX0sZG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gYT10LHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXIubGVuZ3RoLGU9MCxpPXIubGVuZ3RoO2U8aTtlKyspe3ZhciBuPXJbZV07bi5lbC5hbmltYXRlVG8obi50YXJnZXQsbi50aW1lLG4uZGVsYXksbi5lYXNpbmcsbyl9cmV0dXJuIHRoaXM7ZnVuY3Rpb24gbygpey0tdHx8KHIubGVuZ3RoPTAscz17fSxhJiZhKCkpfX19fSgpO1V4KGEud2lsbERlbGV0ZUVscyxmdW5jdGlvbih0LHIpe1V4KHQsZnVuY3Rpb24odCxlKXtpZighdC5pbnZpc2libGUpe3ZhciBpLG49dC5wYXJlbnQ7aWYocyYmImRyaWxsRG93biI9PT1zLmRpcmVjdGlvbilpPW49PT1zLnJvb3ROb2RlR3JvdXA/e3NoYXBlOnt4OjAseTowLHdpZHRoOm4uX190bU5vZGVXaWR0aCxoZWlnaHQ6bi5fX3RtTm9kZUhlaWdodH0sc3R5bGU6e29wYWNpdHk6MH19OntzdHlsZTp7b3BhY2l0eTowfX07ZWxzZXt2YXIgbz0wLGE9MDtuLl9fdG1XaWxsRGVsZXRlfHwobz1uLl9fdG1Ob2RlV2lkdGgvMixhPW4uX190bU5vZGVIZWlnaHQvMiksaT0ibm9kZUdyb3VwIj09PXI/e3Bvc2l0aW9uOltvLGFdLHN0eWxlOntvcGFjaXR5OjB9fTp7c2hhcGU6e3g6byx5OmEsd2lkdGg6MCxoZWlnaHQ6MH0sc3R5bGU6e29wYWNpdHk6MH19fWkmJmguYWRkKHQsaSxsLHUpfX0pfSksVXgodGhpcy5fc3RvcmFnZSxmdW5jdGlvbih0LG8pe1V4KHQsZnVuY3Rpb24odCxlKXt2YXIgaT1hLmxhc3RzRm9yQW5pbWF0aW9uW29dW2VdLG49e307aSYmKCJub2RlR3JvdXAiPT09bz9pLm9sZCYmKG4ucG9zaXRpb249dC5wb3NpdGlvbi5zbGljZSgpLHQuYXR0cigicG9zaXRpb24iLGkub2xkKSk6KGkub2xkJiYobi5zaGFwZT1MKHt9LHQuc2hhcGUpLHQuc2V0U2hhcGUoaS5vbGQpKSxpLmZhZGVpbj8odC5zZXRTdHlsZSgib3BhY2l0eSIsMCksbi5zdHlsZT17b3BhY2l0eToxfSk6MSE9PXQuc3R5bGUub3BhY2l0eSYmKG4uc3R5bGU9e29wYWNpdHk6MX0pKSxoLmFkZCh0LG4sbCx1KSl9KX0sdGhpcyksdGhpcy5fc3RhdGU9ImFuaW1hdGluZyIsaC5kb25lKFd4KGZ1bmN0aW9uKCl7dGhpcy5fc3RhdGU9InJlYWR5IixhLnJlbmRlckZpbmFsbHkoKX0sdGhpcykpLnN0YXJ0KCl9fSxfcmVzZXRDb250cm9sbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbnRyb2xsZXI7ZXx8KChlPXRoaXMuX2NvbnRyb2xsZXI9bmV3IEx5KHQuZ2V0WnIoKSkpLmVuYWJsZSh0aGlzLnNlcmllc01vZGVsLmdldCgicm9hbSIpKSxlLm9uKCJwYW4iLFd4KHRoaXMuX29uUGFuLHRoaXMpKSxlLm9uKCJ6b29tIixXeCh0aGlzLl9vblpvb20sdGhpcykpKTt2YXIgbj1uZXcgTWkoMCwwLHQuZ2V0V2lkdGgoKSx0LmdldEhlaWdodCgpKTtlLnNldFBvaW50ZXJDaGVja2VyKGZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbi5jb250YWluKGUsaSl9KX0sX2NsZWFyQ29udHJvbGxlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRyb2xsZXI7dCYmKHQuZGlzcG9zZSgpLHQ9bnVsbCl9LF9vblBhbjpmdW5jdGlvbih0KXtpZigiYW5pbWF0aW5nIiE9PXRoaXMuX3N0YXRlJiYoMzxNYXRoLmFicyh0LmR4KXx8MzxNYXRoLmFicyh0LmR5KSkpe3ZhciBlPXRoaXMuc2VyaWVzTW9kZWwuZ2V0RGF0YSgpLnRyZWUucm9vdDtpZighZSlyZXR1cm47dmFyIGk9ZS5nZXRMYXlvdXQoKTtpZighaSlyZXR1cm47dGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRyZWVtYXBNb3ZlIixmcm9tOnRoaXMudWlkLHNlcmllc0lkOnRoaXMuc2VyaWVzTW9kZWwuaWQscm9vdFJlY3Q6e3g6aS54K3QuZHgseTppLnkrdC5keSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodH19KX19LF9vblpvb206ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5YLGk9dC5vcmlnaW5ZO2lmKCJhbmltYXRpbmciIT09dGhpcy5fc3RhdGUpe3ZhciBuPXRoaXMuc2VyaWVzTW9kZWwuZ2V0RGF0YSgpLnRyZWUucm9vdDtpZighbilyZXR1cm47dmFyIG89bi5nZXRMYXlvdXQoKTtpZighbylyZXR1cm47dmFyIGE9bmV3IE1pKG8ueCxvLnksby53aWR0aCxvLmhlaWdodCkscj10aGlzLnNlcmllc01vZGVsLmxheW91dEluZm87ZS09ci54LGktPXIueTt2YXIgcz1lZSgpO2FlKHMscyxbLWUsLWldKSxzZShzLHMsW3Quc2NhbGUsdC5zY2FsZV0pLGFlKHMscyxbZSxpXSksYS5hcHBseVRyYW5zZm9ybShzKSx0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToidHJlZW1hcFJlbmRlciIsZnJvbTp0aGlzLnVpZCxzZXJpZXNJZDp0aGlzLnNlcmllc01vZGVsLmlkLHJvb3RSZWN0Ont4OmEueCx5OmEueSx3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH19KX19LF9pbml0RXZlbnRzOmZ1bmN0aW9uKHQpe3Qub24oImNsaWNrIixmdW5jdGlvbih0KXtpZigicmVhZHkiPT09dGhpcy5fc3RhdGUpe3ZhciBlPXRoaXMuc2VyaWVzTW9kZWwuZ2V0KCJub2RlQ2xpY2siLCEwKTtpZihlKXt2YXIgaT10aGlzLmZpbmRUYXJnZXQodC5vZmZzZXRYLHQub2Zmc2V0WSk7aWYoaSl7dmFyIG49aS5ub2RlO2lmKG4uZ2V0TGF5b3V0KCkuaXNMZWFmUm9vdCl0aGlzLl9yb290VG9Ob2RlKGkpO2Vsc2UgaWYoInpvb21Ub05vZGUiPT09ZSl0aGlzLl96b29tVG9Ob2RlKGkpO2Vsc2UgaWYoImxpbmsiPT09ZSl7dmFyIG89bi5ob3N0VHJlZS5kYXRhLmdldEl0ZW1Nb2RlbChuLmRhdGFJbmRleCksYT1vLmdldCgibGluayIsITApLHI9by5nZXQoInRhcmdldCIsITApfHwiYmxhbmsiO2EmJndpbmRvdy5vcGVuKGEscil9fX19fSx0aGlzKX0sX3JlbmRlckJyZWFkY3J1bWI6ZnVuY3Rpb24oZSx0LGkpe2k9aXx8KChpPW51bGwhPWUuZ2V0KCJsZWFmRGVwdGgiLCEwKT97bm9kZTplLmdldFZpZXdSb290KCl9OnRoaXMuZmluZFRhcmdldCh0LmdldFdpZHRoKCkvMix0LmdldEhlaWdodCgpLzIpKXx8e25vZGU6ZS5nZXREYXRhKCkudHJlZS5yb290fSksKHRoaXMuX2JyZWFkY3J1bWJ8fCh0aGlzLl9icmVhZGNydW1iPW5ldyBWeCh0aGlzLmdyb3VwKSkpLnJlbmRlcihlLHQsaS5ub2RlLFd4KGZ1bmN0aW9uKHQpeyJhbmltYXRpbmciIT09dGhpcy5fc3RhdGUmJih6eChlLmdldFZpZXdSb290KCksdCk/dGhpcy5fcm9vdFRvTm9kZSh7bm9kZTp0fSk6dGhpcy5fem9vbVRvTm9kZSh7bm9kZTp0fSkpfSx0aGlzKSl9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX2NsZWFyQ29udHJvbGxlcigpLHRoaXMuX2NvbnRhaW5lckdyb3VwJiZ0aGlzLl9jb250YWluZXJHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9zdG9yYWdlPXtub2RlR3JvdXA6W10sYmFja2dyb3VuZDpbXSxjb250ZW50OltdfSx0aGlzLl9zdGF0ZT0icmVhZHkiLHRoaXMuX2JyZWFkY3J1bWImJnRoaXMuX2JyZWFkY3J1bWIucmVtb3ZlKCl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckNvbnRyb2xsZXIoKX0sX3pvb21Ub05vZGU6ZnVuY3Rpb24odCl7dGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRyZWVtYXBab29tVG9Ob2RlIixmcm9tOnRoaXMudWlkLHNlcmllc0lkOnRoaXMuc2VyaWVzTW9kZWwuaWQsdGFyZ2V0Tm9kZTp0Lm5vZGV9KX0sX3Jvb3RUb05vZGU6ZnVuY3Rpb24odCl7dGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRyZWVtYXBSb290VG9Ob2RlIixmcm9tOnRoaXMudWlkLHNlcmllc0lkOnRoaXMuc2VyaWVzTW9kZWwuaWQsdGFyZ2V0Tm9kZTp0Lm5vZGV9KX0sZmluZFRhcmdldDpmdW5jdGlvbihvLGEpe3ZhciByO3JldHVybiB0aGlzLnNlcmllc01vZGVsLmdldFZpZXdSb290KCkuZWFjaE5vZGUoe2F0dHI6InZpZXdDaGlsZHJlbiIsb3JkZXI6InByZW9yZGVyIn0sZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3RvcmFnZS5iYWNrZ3JvdW5kW3QuZ2V0UmF3SW5kZXgoKV07aWYoZSl7dmFyIGk9ZS50cmFuc2Zvcm1Db29yZFRvTG9jYWwobyxhKSxuPWUuc2hhcGU7aWYoIShuLng8PWlbMF0mJmlbMF08PW4ueCtuLndpZHRoJiZuLnk8PWlbMV0mJmlbMV08PW4ueStuLmhlaWdodCkpcmV0dXJuITE7cj17bm9kZTp0LG9mZnNldFg6aVswXSxvZmZzZXRZOmlbMV19fX0sdGhpcykscn19KTtmb3IodmFyIFF4PWZ1bmN0aW9uKCl7fSx0Xz1bInRyZWVtYXBab29tVG9Ob2RlIiwidHJlZW1hcFJlbmRlciIsInRyZWVtYXBNb3ZlIl0sZV89MDtlXzx0Xy5sZW5ndGg7ZV8rKylnZih7dHlwZTp0X1tlX10sdXBkYXRlOiJ1cGRhdGVWaWV3In0sUXgpO2dmKHt0eXBlOiJ0cmVlbWFwUm9vdFRvTm9kZSIsdXBkYXRlOiJ1cGRhdGVWaWV3In0sZnVuY3Rpb24obyx0KXt0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6InRyZWVtYXAiLHF1ZXJ5Om99LGZ1bmN0aW9uKHQsZSl7dmFyIGk9T3gobyxbInRyZWVtYXBab29tVG9Ob2RlIiwidHJlZW1hcFJvb3RUb05vZGUiXSx0KTtpZihpKXt2YXIgbj10LmdldFZpZXdSb290KCk7biYmKG8uZGlyZWN0aW9uPXp4KG4saS5ub2RlKT8icm9sbFVwIjoiZHJpbGxEb3duIiksdC5yZXNldFZpZXdSb290KGkubm9kZSl9fSl9KTt2YXIgaV89RSxuXz1SLG9fPS0xLGFfPWZ1bmN0aW9uKHQpe3ZhciBlPXQubWFwcGluZ01ldGhvZCxpPXQudHlwZSxuPXRoaXMub3B0aW9uPUQodCk7dGhpcy50eXBlPWksdGhpcy5tYXBwaW5nTWV0aG9kPWUsdGhpcy5fbm9ybWFsaXplRGF0YT1tX1tlXTt2YXIgbz1yX1tpXTt0aGlzLmFwcGx5VmlzdWFsPW8uYXBwbHlWaXN1YWwsdGhpcy5nZXRDb2xvck1hcHBlcj1vLmdldENvbG9yTWFwcGVyLHRoaXMuX2RvTWFwPW8uX2RvTWFwW2VdLCJwaWVjZXdpc2UiPT09ZT8oc18obiksZnVuY3Rpb24oaSl7dmFyIHQ9aS5waWVjZUxpc3Q7aS5oYXNTcGVjaWFsVmlzdWFsPSExLEUodCxmdW5jdGlvbih0LGUpe3Qub3JpZ2luSW5kZXg9ZSxudWxsIT10LnZpc3VhbCYmKGkuaGFzU3BlY2lhbFZpc3VhbD0hMCl9KX0obikpOiJjYXRlZ29yeSI9PT1lP24uY2F0ZWdvcmllcz9mdW5jdGlvbih0KXt2YXIgZT10LmNhdGVnb3JpZXMsaT10LnZpc3VhbCxuPXQuY2F0ZWdvcnlNYXA9e307aWYoaV8oZSxmdW5jdGlvbih0LGUpe25bdF09ZX0pLCFrKGkpKXt2YXIgbz1bXTtSKGkpP2lfKGksZnVuY3Rpb24odCxlKXt2YXIgaT1uW2VdO29bbnVsbCE9aT9pOm9fXT10fSk6b1tvX109aSxpPWdfKHQsbyl9Zm9yKHZhciBhPWUubGVuZ3RoLTE7MDw9YTthLS0pbnVsbD09aVthXSYmKGRlbGV0ZSBuW2VbYV1dLGUucG9wKCkpfShuKTpzXyhuLCEwKTooWSgibGluZWFyIiE9PWV8fG4uZGF0YUV4dGVudCksc18obikpfTthXy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmFfLG1hcFZhbHVlVG9WaXN1YWw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbm9ybWFsaXplRGF0YSh0KTtyZXR1cm4gdGhpcy5fZG9NYXAoZSx0KX0sZ2V0Tm9ybWFsaXplcjpmdW5jdGlvbigpe3JldHVybiBBKHRoaXMuX25vcm1hbGl6ZURhdGEsdGhpcyl9fTt2YXIgcl89YV8udmlzdWFsSGFuZGxlcnM9e2NvbG9yOnthcHBseVZpc3VhbDpoXygiY29sb3IiKSxnZXRDb2xvck1hcHBlcjpmdW5jdGlvbigpe3ZhciBvPXRoaXMub3B0aW9uO3JldHVybiBBKCJjYXRlZ29yeSI9PT1vLm1hcHBpbmdNZXRob2Q/ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8KHQ9dGhpcy5fbm9ybWFsaXplRGF0YSh0KSksY18uY2FsbCh0aGlzLHQpfTpmdW5jdGlvbih0LGUsaSl7dmFyIG49ISFpO3JldHVybiBlfHwodD10aGlzLl9ub3JtYWxpemVEYXRhKHQpKSxpPUZlKHQsby5wYXJzZWRWaXN1YWwsaSksbj9pOlllKGksInJnYmEiKX0sdGhpcyl9LF9kb01hcDp7bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiBZZShGZSh0LHRoaXMub3B0aW9uLnBhcnNlZFZpc3VhbCksInJnYmEiKX0sY2F0ZWdvcnk6Y18scGllY2V3aXNlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9cF8uY2FsbCh0aGlzLGUpO3JldHVybiBudWxsPT1pJiYoaT1ZZShGZSh0LHRoaXMub3B0aW9uLnBhcnNlZFZpc3VhbCksInJnYmEiKSksaX0sZml4ZWQ6ZF99fSxjb2xvckh1ZTpsXyhmdW5jdGlvbih0LGUpe3JldHVybiBVZSh0LGUpfSksY29sb3JTYXR1cmF0aW9uOmxfKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFVlKHQsbnVsbCxlKX0pLGNvbG9yTGlnaHRuZXNzOmxfKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFVlKHQsbnVsbCxudWxsLGUpfSksY29sb3JBbHBoYTpsXyhmdW5jdGlvbih0LGUpe3JldHVybiBYZSh0LGUpfSksb3BhY2l0eTp7YXBwbHlWaXN1YWw6aF8oIm9wYWNpdHkiKSxfZG9NYXA6Zl8oWzAsMV0pfSxsaWZ0Wjp7YXBwbHlWaXN1YWw6aF8oImxpZnRaIiksX2RvTWFwOntsaW5lYXI6ZF8sY2F0ZWdvcnk6ZF8scGllY2V3aXNlOmRfLGZpeGVkOmRffX0sc3ltYm9sOnthcHBseVZpc3VhbDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5tYXBWYWx1ZVRvVmlzdWFsKHQpO2lmKHoobikpaSgic3ltYm9sIixuKTtlbHNlIGlmKG5fKG4pKWZvcih2YXIgbyBpbiBuKW4uaGFzT3duUHJvcGVydHkobykmJmkobyxuW29dKX0sX2RvTWFwOntsaW5lYXI6dV8sY2F0ZWdvcnk6Y18scGllY2V3aXNlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9cF8uY2FsbCh0aGlzLGUpO3JldHVybiBudWxsPT1pJiYoaT11Xy5jYWxsKHRoaXMsdCkpLGl9LGZpeGVkOmRffX0sc3ltYm9sU2l6ZTp7YXBwbHlWaXN1YWw6aF8oInN5bWJvbFNpemUiKSxfZG9NYXA6Zl8oWzAsMV0pfX07ZnVuY3Rpb24gc18odCxlKXt2YXIgaT10LnZpc3VhbCxuPVtdO1IoaSk/aV8oaSxmdW5jdGlvbih0KXtuLnB1c2godCl9KTpudWxsIT1pJiZuLnB1c2goaSk7ZXx8MSE9PW4ubGVuZ3RofHx7Y29sb3I6MSxzeW1ib2w6MX0uaGFzT3duUHJvcGVydHkodC50eXBlKXx8KG5bMV09blswXSksZ18odCxuKX1mdW5jdGlvbiBsXyhuKXtyZXR1cm57YXBwbHlWaXN1YWw6ZnVuY3Rpb24odCxlLGkpe3Q9dGhpcy5tYXBWYWx1ZVRvVmlzdWFsKHQpLGkoImNvbG9yIixuKGUoImNvbG9yIiksdCkpfSxfZG9NYXA6Zl8oWzAsMV0pfX1mdW5jdGlvbiB1Xyh0KXt2YXIgZT10aGlzLm9wdGlvbi52aXN1YWw7cmV0dXJuIGVbTWF0aC5yb3VuZChrbCh0LFswLDFdLFswLGUubGVuZ3RoLTFdLCEwKSldfHx7fX1mdW5jdGlvbiBoXyhuKXtyZXR1cm4gZnVuY3Rpb24odCxlLGkpe2kobix0aGlzLm1hcFZhbHVlVG9WaXN1YWwodCkpfX1mdW5jdGlvbiBjXyh0KXt2YXIgZT10aGlzLm9wdGlvbi52aXN1YWw7cmV0dXJuIGVbdGhpcy5vcHRpb24ubG9vcCYmdCE9PW9fP3QlZS5sZW5ndGg6dF19ZnVuY3Rpb24gZF8oKXtyZXR1cm4gdGhpcy5vcHRpb24udmlzdWFsWzBdfWZ1bmN0aW9uIGZfKG4pe3JldHVybntsaW5lYXI6ZnVuY3Rpb24odCl7cmV0dXJuIGtsKHQsbix0aGlzLm9wdGlvbi52aXN1YWwsITApfSxjYXRlZ29yeTpjXyxwaWVjZXdpc2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1wXy5jYWxsKHRoaXMsZSk7cmV0dXJuIG51bGw9PWkmJihpPWtsKHQsbix0aGlzLm9wdGlvbi52aXN1YWwsITApKSxpfSxmaXhlZDpkX319ZnVuY3Rpb24gcF8odCl7dmFyIGU9dGhpcy5vcHRpb24saT1lLnBpZWNlTGlzdDtpZihlLmhhc1NwZWNpYWxWaXN1YWwpe3ZhciBuPWlbYV8uZmluZFBpZWNlSW5kZXgodCxpKV07aWYobiYmbi52aXN1YWwpcmV0dXJuIG4udmlzdWFsW3RoaXMudHlwZV19fWZ1bmN0aW9uIGdfKHQsZSl7cmV0dXJuIHQudmlzdWFsPWUsImNvbG9yIj09PXQudHlwZSYmKHQucGFyc2VkVmlzdWFsPU4oZSxmdW5jdGlvbih0KXtyZXR1cm4gUmUodCl9KSksZX12YXIgbV89e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4ga2wodCx0aGlzLm9wdGlvbi5kYXRhRXh0ZW50LFswLDFdLCEwKX0scGllY2V3aXNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnBpZWNlTGlzdCxpPWFfLmZpbmRQaWVjZUluZGV4KHQsZSwhMCk7aWYobnVsbCE9aSlyZXR1cm4ga2woaSxbMCxlLmxlbmd0aC0xXSxbMCwxXSwhMCl9LGNhdGVnb3J5OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLmNhdGVnb3JpZXM/dGhpcy5vcHRpb24uY2F0ZWdvcnlNYXBbdF06dDtyZXR1cm4gbnVsbD09ZT9vXzplfSxmaXhlZDpldH07ZnVuY3Rpb24gdl8odCxlLGkpe3JldHVybiB0P2U8PWk6ZTxpfWFfLmxpc3RWaXN1YWxUeXBlcz1mdW5jdGlvbigpe3ZhciBpPVtdO3JldHVybiBFKHJfLGZ1bmN0aW9uKHQsZSl7aS5wdXNoKGUpfSksaX0sYV8uYWRkVmlzdWFsSGFuZGxlcj1mdW5jdGlvbih0LGUpe3JfW3RdPWV9LGFfLmlzVmFsaWRUeXBlPWZ1bmN0aW9uKHQpe3JldHVybiByXy5oYXNPd25Qcm9wZXJ0eSh0KX0sYV8uZWFjaFZpc3VhbD1mdW5jdGlvbih0LGUsaSl7Uih0KT9FKHQsZSxpKTplLmNhbGwoaSx0KX0sYV8ubWFwVmlzdWFsPWZ1bmN0aW9uKHQsbixvKXt2YXIgYSxyPWsodCk/W106Uih0KT97fTooYT0hMCxudWxsKTtyZXR1cm4gYV8uZWFjaFZpc3VhbCh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5jYWxsKG8sdCxlKTthP3I9aTpyW2VdPWl9KSxyfSxhXy5yZXRyaWV2ZVZpc3VhbHM9ZnVuY3Rpb24oaSl7dmFyIG4sbz17fTtyZXR1cm4gaSYmaV8ocl8sZnVuY3Rpb24odCxlKXtpLmhhc093blByb3BlcnR5KGUpJiYob1tlXT1pW2VdLG49ITApfSksbj9vOm51bGx9LGFfLnByZXBhcmVWaXN1YWxUeXBlcz1mdW5jdGlvbih0KXtpZihuXyh0KSl7dmFyIGk9W107aV8odCxmdW5jdGlvbih0LGUpe2kucHVzaChlKX0pLHQ9aX1lbHNle2lmKCFrKHQpKXJldHVybltdO3Q9dC5zbGljZSgpfXJldHVybiB0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4iY29sb3IiPT09ZSYmImNvbG9yIiE9PXQmJjA9PT10LmluZGV4T2YoImNvbG9yIik/MTotMX0pLHR9LGFfLmRlcGVuZHNPbj1mdW5jdGlvbih0LGUpe3JldHVybiJjb2xvciI9PT1lPyEoIXR8fDAhPT10LmluZGV4T2YoZSkpOnQ9PT1lfSxhXy5maW5kUGllY2VJbmRleD1mdW5jdGlvbihuLHQsZSl7Zm9yKHZhciBvLGE9MS8wLGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe3ZhciBzPXRbaV0udmFsdWU7aWYobnVsbCE9cyl7aWYocz09PW58fCJzdHJpbmciPT10eXBlb2YgcyYmcz09PW4rIiIpcmV0dXJuIGk7ZSYmYyhzLGkpfX1mb3IoaT0wLHI9dC5sZW5ndGg7aTxyO2krKyl7dmFyIGw9dFtpXSx1PWwuaW50ZXJ2YWwsaD1sLmNsb3NlO2lmKHUpe2lmKHVbMF09PT0tMS8wKXtpZih2XyhoWzFdLG4sdVsxXSkpcmV0dXJuIGl9ZWxzZSBpZih1WzFdPT09MS8wKXtpZih2XyhoWzBdLHVbMF0sbikpcmV0dXJuIGl9ZWxzZSBpZih2XyhoWzBdLHVbMF0sbikmJnZfKGhbMV0sbix1WzFdKSlyZXR1cm4gaTtlJiZjKHVbMF0saSksZSYmYyh1WzFdLGkpfX1pZihlKXJldHVybiBuPT09MS8wP3QubGVuZ3RoLTE6bj09PS0xLzA/MDpvO2Z1bmN0aW9uIGModCxlKXt2YXIgaT1NYXRoLmFicyh0LW4pO2k8YSYmKGE9aSxvPWUpfX07dmFyIHlfPWsseF89Iml0ZW1TdHlsZSIsX189e3Nlcmllc1R5cGU6InRyZWVtYXAiLHJlc2V0OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXQuZ2V0RGF0YSgpLnRyZWUsYT1vLnJvb3Qscj10LmdldE1vZGVsKHhfKTthLmlzUmVtb3ZlZCgpfHwhZnVuY3Rpb24gbih0LGUsbyxhLHIscyl7dmFyIGw9dC5nZXRNb2RlbCgpO3ZhciBpPXQuZ2V0TGF5b3V0KCk7aWYoIWl8fGkuaW52aXNpYmxlfHwhaS5pc0luVmlldylyZXR1cm47dmFyIHU9dC5nZXRNb2RlbCh4Xyk7dmFyIGg9b1t0LmRlcHRoXTt2YXIgYz13Xyh1LGUsaCxhKTt2YXIgZD11LmdldCgiYm9yZGVyQ29sb3IiKTt2YXIgZj11LmdldCgiYm9yZGVyQ29sb3JTYXR1cmF0aW9uIik7dmFyIHA7bnVsbCE9ZiYmKHA9Yl8oYyksZz1mLGQ9bnVsbCE9KG09cCk/VWUobSxudWxsLG51bGwsZyk6bnVsbCk7dmFyIGcsbTt0LnNldFZpc3VhbCgiYm9yZGVyQ29sb3IiLGQpO3ZhciB2PXQudmlld0NoaWxkcmVuO2lmKHYmJnYubGVuZ3RoKXt2YXIgeT1NXyh0LGwsaSx1LGMsdik7RSh2LGZ1bmN0aW9uKHQsZSl7aWYodC5kZXB0aD49ci5sZW5ndGh8fHQ9PT1yW3QuZGVwdGhdKXt2YXIgaT1UXyhsLGMsdCxlLHkscyk7bih0LGksbyxhLHIscyl9fSl9ZWxzZSBwPWJfKGMpLHQuc2V0VmlzdWFsKCJjb2xvciIscCl9KGEse30sTihvLmxldmVsTW9kZWxzLGZ1bmN0aW9uKHQpe3JldHVybiB0P3QuZ2V0KHhfKTpudWxsfSkscix0LmdldFZpZXdSb290KCkuZ2V0QW5jZXN0b3JzKCksdCl9fTtmdW5jdGlvbiB3XyhpLG4sbyxhKXt2YXIgcj1MKHt9LG4pO3JldHVybiBFKFsiY29sb3IiLCJjb2xvckFscGhhIiwiY29sb3JTYXR1cmF0aW9uIl0sZnVuY3Rpb24odCl7dmFyIGU9aS5nZXQodCwhMCk7bnVsbD09ZSYmbyYmKGU9b1t0XSksbnVsbD09ZSYmKGU9blt0XSksbnVsbD09ZSYmKGU9YS5nZXQodCkpLG51bGwhPWUmJihyW3RdPWUpfSkscn1mdW5jdGlvbiBiXyh0KXt2YXIgZT1TXyh0LCJjb2xvciIpO2lmKGUpe3ZhciBpPVNfKHQsImNvbG9yQWxwaGEiKSxuPVNfKHQsImNvbG9yU2F0dXJhdGlvbiIpO3JldHVybiBuJiYoZT1VZShlLG51bGwsbnVsbCxuKSksaSYmKGU9WGUoZSxpKSksZX19ZnVuY3Rpb24gU18odCxlKXt2YXIgaT10W2VdO2lmKG51bGwhPWkmJiJub25lIiE9PWkpcmV0dXJuIGl9ZnVuY3Rpb24gTV8odCxlLGksbixvLGEpe2lmKGEmJmEubGVuZ3RoKXt2YXIgcj1JXyhlLCJjb2xvciIpfHxudWxsIT1vLmNvbG9yJiYibm9uZSIhPT1vLmNvbG9yJiYoSV8oZSwiY29sb3JBbHBoYSIpfHxJXyhlLCJjb2xvclNhdHVyYXRpb24iKSk7aWYocil7dmFyIHM9ZS5nZXQoInZpc3VhbE1pbiIpLGw9ZS5nZXQoInZpc3VhbE1heCIpLHU9aS5kYXRhRXh0ZW50LnNsaWNlKCk7bnVsbCE9cyYmczx1WzBdJiYodVswXT1zKSxudWxsIT1sJiZsPnVbMV0mJih1WzFdPWwpO3ZhciBoPWUuZ2V0KCJjb2xvck1hcHBpbmdCeSIpLGM9e3R5cGU6ci5uYW1lLGRhdGFFeHRlbnQ6dSx2aXN1YWw6ci5yYW5nZX07ImNvbG9yIiE9PWMudHlwZXx8ImluZGV4IiE9PWgmJiJpZCIhPT1oP2MubWFwcGluZ01ldGhvZD0ibGluZWFyIjooYy5tYXBwaW5nTWV0aG9kPSJjYXRlZ29yeSIsYy5sb29wPSEwKTt2YXIgZD1uZXcgYV8oYyk7cmV0dXJuIGQuX19kckNvbG9yTWFwcGluZ0J5PWgsZH19fWZ1bmN0aW9uIElfKHQsZSl7dmFyIGk9dC5nZXQoZSk7cmV0dXJuIHlfKGkpJiZpLmxlbmd0aD97bmFtZTplLHJhbmdlOml9Om51bGx9ZnVuY3Rpb24gVF8odCxlLGksbixvLGEpe3ZhciByPUwoe30sZSk7aWYobyl7dmFyIHM9by50eXBlLGw9ImNvbG9yIj09PXMmJm8uX19kckNvbG9yTWFwcGluZ0J5LHU9ImluZGV4Ij09PWw/bjoiaWQiPT09bD9hLm1hcElkVG9JbmRleChpLmdldElkKCkpOmkuZ2V0VmFsdWUodC5nZXQoInZpc3VhbERpbWVuc2lvbiIpKTtyW3NdPW8ubWFwVmFsdWVUb1Zpc3VhbCh1KX1yZXR1cm4gcn12YXIgQV89TWF0aC5tYXgsRF89TWF0aC5taW4sQ189VyxMXz1FLGtfPVsiaXRlbVN0eWxlIiwiYm9yZGVyV2lkdGgiXSxQXz1bIml0ZW1TdHlsZSIsImdhcFdpZHRoIl0sTl89WyJ1cHBlckxhYmVsIiwic2hvdyJdLE9fPVsidXBwZXJMYWJlbCIsImhlaWdodCJdLEVfPXtzZXJpZXNUeXBlOiJ0cmVlbWFwIixyZXNldDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1pLmdldFdpZHRoKCksYT1pLmdldEhlaWdodCgpLHI9dC5vcHRpb24scz12dSh0LmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDppLmdldFdpZHRoKCksaGVpZ2h0OmkuZ2V0SGVpZ2h0KCl9KSxsPXIuc2l6ZXx8W10sdT1QbChDXyhzLndpZHRoLGxbMF0pLG8pLGg9UGwoQ18ocy5oZWlnaHQsbFsxXSksYSksYz1uJiZuLnR5cGUsZD1PeChuLFsidHJlZW1hcFpvb21Ub05vZGUiLCJ0cmVlbWFwUm9vdFRvTm9kZSJdLHQpLGY9InRyZWVtYXBSZW5kZXIiPT09Y3x8InRyZWVtYXBNb3ZlIj09PWM/bi5yb290UmVjdDpudWxsLHA9dC5nZXRWaWV3Um9vdCgpLGc9RXgocCk7aWYoInRyZWVtYXBNb3ZlIiE9PWMpe3ZhciBtPSJ0cmVlbWFwWm9vbVRvTm9kZSI9PT1jP2Z1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGEscj0oZXx8e30pLm5vZGUscz1bbixvXTtpZighcnx8cj09PWkpcmV0dXJuIHM7dmFyIGw9bipvLHU9bCp0Lm9wdGlvbi56b29tVG9Ob2RlUmF0aW87Zm9yKDthPXIucGFyZW50Tm9kZTspe2Zvcih2YXIgaD0wLGM9YS5jaGlsZHJlbixkPTAsZj1jLmxlbmd0aDtkPGY7ZCsrKWgrPWNbZF0uZ2V0VmFsdWUoKTt2YXIgcD1yLmdldFZhbHVlKCk7aWYoMD09PXApcmV0dXJuIHM7dSo9aC9wO3ZhciBnPWEuZ2V0TW9kZWwoKSxtPWcuZ2V0KGtfKSx2PU1hdGgubWF4KG0sVl8oZykpO3UrPTQqbSptKygzKm0rdikqTWF0aC5wb3codSwuNSksVmw8dSYmKHU9VmwpLHI9YX11PGwmJih1PWwpO3ZhciB5PU1hdGgucG93KHUvbCwuNSk7cmV0dXJuW24qeSxvKnldfSh0LGQscCx1LGgpOmY/W2Yud2lkdGgsZi5oZWlnaHRdOlt1LGhdLHY9ci5zb3J0O3YmJiJhc2MiIT09diYmImRlc2MiIT09diYmKHY9ImRlc2MiKTt2YXIgeT17c3F1YXJlUmF0aW86ci5zcXVhcmVSYXRpbyxzb3J0OnYsbGVhZkRlcHRoOnIubGVhZkRlcHRofTtwLmhvc3RUcmVlLmNsZWFyTGF5b3V0cygpO3ZhciB4PXt4OjAseTowLHdpZHRoOm1bMF0saGVpZ2h0Om1bMV0sYXJlYTptWzBdKm1bMV19O3Auc2V0TGF5b3V0KHgpLGZ1bmN0aW9uIHQoZSxpLG4sbyl7dmFyIGE7dmFyIHI7aWYoZS5pc1JlbW92ZWQoKSlyZXR1cm47dmFyIHM9ZS5nZXRMYXlvdXQoKTthPXMud2lkdGg7cj1zLmhlaWdodDt2YXIgbD1lLmdldE1vZGVsKCk7dmFyIHU9bC5nZXQoa18pO3ZhciBoPWwuZ2V0KFBfKS8yO3ZhciBjPVZfKGwpO3ZhciBkPU1hdGgubWF4KHUsYyk7dmFyIGY9dS1oO3ZhciBwPWQtaDt2YXIgbD1lLmdldE1vZGVsKCk7ZS5zZXRMYXlvdXQoe2JvcmRlcldpZHRoOnUsdXBwZXJIZWlnaHQ6ZCx1cHBlckxhYmVsSGVpZ2h0OmN9LCEwKTthPUFfKGEtMipmLDApO3I9QV8oci1mLXAsMCk7dmFyIGc9YSpyO3ZhciBtPXpfKGUsbCxnLGksbixvKTtpZighbS5sZW5ndGgpcmV0dXJuO3ZhciB2PXt4OmYseTpwLHdpZHRoOmEsaGVpZ2h0OnJ9O3ZhciB5PURfKGEscik7dmFyIHg9MS8wO3ZhciBfPVtdO18uYXJlYT0wO2Zvcih2YXIgdz0wLGI9bS5sZW5ndGg7dzxiOyl7dmFyIFM9bVt3XTtfLnB1c2goUyksXy5hcmVhKz1TLmdldExheW91dCgpLmFyZWE7dmFyIE09Ul8oXyx5LGkuc3F1YXJlUmF0aW8pO3g9TTw9eD8odysrLE0pOihfLmFyZWEtPV8ucG9wKCkuZ2V0TGF5b3V0KCkuYXJlYSxCXyhfLHksdixoLCExKSx5PURfKHYud2lkdGgsdi5oZWlnaHQpLF8ubGVuZ3RoPV8uYXJlYT0wLDEvMCl9Xy5sZW5ndGgmJkJfKF8seSx2LGgsITApO2lmKCFuKXt2YXIgST1sLmdldCgiY2hpbGRyZW5WaXNpYmxlTWluIik7bnVsbCE9SSYmZzxJJiYobj0hMCl9Zm9yKHZhciB3PTAsYj1tLmxlbmd0aDt3PGI7dysrKXQobVt3XSxpLG4sbysxKX0ocCx5LCExLDApO3g9cC5nZXRMYXlvdXQoKTtMXyhnLGZ1bmN0aW9uKHQsZSl7dmFyIGk9KGdbZSsxXXx8cCkuZ2V0VmFsdWUoKTt0LnNldExheW91dChMKHtkYXRhRXh0ZW50OltpLGldLGJvcmRlcldpZHRoOjAsdXBwZXJIZWlnaHQ6MH0seCkpfSl9dmFyIF89dC5nZXREYXRhKCkudHJlZS5yb290O18uc2V0TGF5b3V0KGZ1bmN0aW9uKHQsZSxpKXtpZihlKXJldHVybnt4OmUueCx5OmUueX07dmFyIG49e3g6MCx5OjB9O2lmKCFpKXJldHVybiBuO3ZhciBvPWkubm9kZSxhPW8uZ2V0TGF5b3V0KCk7aWYoIWEpcmV0dXJuIG47dmFyIHI9W2Eud2lkdGgvMixhLmhlaWdodC8yXSxzPW87Zm9yKDtzOyl7dmFyIGw9cy5nZXRMYXlvdXQoKTtyWzBdKz1sLngsclsxXSs9bC55LHM9cy5wYXJlbnROb2RlfXJldHVybnt4OnQud2lkdGgvMi1yWzBdLHk6dC5oZWlnaHQvMi1yWzFdfX0ocyxmLGQpLCEwKSx0LnNldExheW91dEluZm8ocyksZnVuY3Rpb24gZSh0LGksbixvLGEpe3ZhciByPXQuZ2V0TGF5b3V0KCk7dmFyIHM9blthXTt2YXIgbD1zJiZzPT09dDtpZihzJiYhbHx8YT09PW4ubGVuZ3RoJiZ0IT09bylyZXR1cm47dC5zZXRMYXlvdXQoe2lzSW5WaWV3OiEwLGludmlzaWJsZTohbCYmIWkuaW50ZXJzZWN0KHIpLGlzQWJvdmVWaWV3Um9vdDpsfSwhMCk7dmFyIHU9bmV3IE1pKGkueC1yLngsaS55LXIueSxpLndpZHRoLGkuaGVpZ2h0KTtMXyh0LnZpZXdDaGlsZHJlbnx8W10sZnVuY3Rpb24odCl7ZSh0LHUsbixvLGErMSl9KX0oXyxuZXcgTWkoLXMueCwtcy55LG8sYSksZyxwLDApfX07ZnVuY3Rpb24gel8odCxlLGksbixvLGEpe3ZhciByPXQuY2hpbGRyZW58fFtdLHM9bi5zb3J0OyJhc2MiIT09cyYmImRlc2MiIT09cyYmKHM9bnVsbCk7dmFyIGw9bnVsbCE9bi5sZWFmRGVwdGgmJm4ubGVhZkRlcHRoPD1hO2lmKG8mJiFsKXJldHVybiB0LnZpZXdDaGlsZHJlbj1bXTshZnVuY3Rpb24odCxuKXtuJiZ0LnNvcnQoZnVuY3Rpb24odCxlKXt2YXIgaT0iYXNjIj09PW4/dC5nZXRWYWx1ZSgpLWUuZ2V0VmFsdWUoKTplLmdldFZhbHVlKCktdC5nZXRWYWx1ZSgpO3JldHVybiAwPT1pPyJhc2MiPT09bj90LmRhdGFJbmRleC1lLmRhdGFJbmRleDplLmRhdGFJbmRleC10LmRhdGFJbmRleDppfSl9KHI9TShyLGZ1bmN0aW9uKHQpe3JldHVybiF0LmlzUmVtb3ZlZCgpfSkscyk7dmFyIHU9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbj0wLG89MCxhPWUubGVuZ3RoO288YTtvKyspbis9ZVtvXS5nZXRWYWx1ZSgpO3ZhciByPXQuZ2V0KCJ2aXN1YWxEaW1lbnNpb24iKTtpZihlJiZlLmxlbmd0aClpZigidmFsdWUiPT09ciYmaSlzPVtlW2UubGVuZ3RoLTFdLmdldFZhbHVlKCksZVswXS5nZXRWYWx1ZSgpXSwiYXNjIj09PWkmJnMucmV2ZXJzZSgpO2Vsc2V7dmFyIHM9WzEvMCwtMS8wXTtMXyhlLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0VmFsdWUocik7ZTxzWzBdJiYoc1swXT1lKSxlPnNbMV0mJihzWzFdPWUpfSl9ZWxzZSBzPVtOYU4sTmFOXTtyZXR1cm57c3VtOm4sZGF0YUV4dGVudDpzfX0oZSxyLHMpO2lmKDA9PT11LnN1bSlyZXR1cm4gdC52aWV3Q2hpbGRyZW49W107aWYodS5zdW09ZnVuY3Rpb24odCxlLGksbixvKXtpZighbilyZXR1cm4gaTtmb3IodmFyIGE9dC5nZXQoInZpc2libGVNaW4iKSxyPW8ubGVuZ3RoLHM9cixsPXItMTswPD1sO2wtLSl7dmFyIHU9b1siYXNjIj09PW4/ci1sLTE6bF0uZ2V0VmFsdWUoKTt1L2kqZTxhJiYocz1sLGktPXUpfXJldHVybiJhc2MiPT09bj9vLnNwbGljZSgwLHItcyk6by5zcGxpY2UocyxyLXMpLGl9KGUsaSx1LnN1bSxzLHIpLDA9PT11LnN1bSlyZXR1cm4gdC52aWV3Q2hpbGRyZW49W107Zm9yKHZhciBoPTAsYz1yLmxlbmd0aDtoPGM7aCsrKXt2YXIgZD1yW2hdLmdldFZhbHVlKCkvdS5zdW0qaTtyW2hdLnNldExheW91dCh7YXJlYTpkfSl9cmV0dXJuIGwmJihyLmxlbmd0aCYmdC5zZXRMYXlvdXQoe2lzTGVhZlJvb3Q6ITB9LCEwKSxyLmxlbmd0aD0wKSx0LnZpZXdDaGlsZHJlbj1yLHQuc2V0TGF5b3V0KHtkYXRhRXh0ZW50OnUuZGF0YUV4dGVudH0sITApLHJ9ZnVuY3Rpb24gUl8odCxlLGkpe2Zvcih2YXIgbixvPTAsYT0xLzAscj0wLHM9dC5sZW5ndGg7cjxzO3IrKykobj10W3JdLmdldExheW91dCgpLmFyZWEpJiYobjxhJiYoYT1uKSxvPG4mJihvPW4pKTt2YXIgbD10LmFyZWEqdC5hcmVhLHU9ZSplKmk7cmV0dXJuIGw/QV8odSpvL2wsbC8odSphKSk6MS8wfWZ1bmN0aW9uIEJfKHQsZSxpLG4sbyl7dmFyIGE9ZT09PWkud2lkdGg/MDoxLHI9MS1hLHM9WyJ4IiwieSJdLGw9WyJ3aWR0aCIsImhlaWdodCJdLHU9aVtzW2FdXSxoPWU/dC5hcmVhL2U6MDsob3x8aD5pW2xbcl1dKSYmKGg9aVtsW3JdXSk7Zm9yKHZhciBjPTAsZD10Lmxlbmd0aDtjPGQ7YysrKXt2YXIgZj10W2NdLHA9e30sZz1oP2YuZ2V0TGF5b3V0KCkuYXJlYS9oOjAsbT1wW2xbcl1dPUFfKGgtMipuLDApLHY9aVtzW2FdXStpW2xbYV1dLXUseT1jPT09ZC0xfHx2PGc/djpnLHg9cFtsW2FdXT1BXyh5LTIqbiwwKTtwW3Nbcl1dPWlbc1tyXV0rRF8obixtLzIpLHBbc1thXV09dStEXyhuLHgvMiksdSs9eSxmLnNldExheW91dChwLCEwKX1pW3Nbcl1dKz1oLGlbbFtyXV0tPWh9ZnVuY3Rpb24gVl8odCl7cmV0dXJuIHQuZ2V0KE5fKT90LmdldChPXyk6MH1mdW5jdGlvbiBHXyh0KXtyZXR1cm4iX0VDXyIrdH15ZihfXyksdmYoRV8pO2Z1bmN0aW9uIEZfKHQpe3RoaXMuX2RpcmVjdGVkPXR8fCExLHRoaXMubm9kZXM9W10sdGhpcy5lZGdlcz1bXSx0aGlzLl9ub2Rlc01hcD17fSx0aGlzLl9lZGdlc01hcD17fSx0aGlzLmRhdGEsdGhpcy5lZGdlRGF0YX12YXIgV189Rl8ucHJvdG90eXBlO2Z1bmN0aW9uIEhfKHQsZSl7dGhpcy5pZD1udWxsPT10PyIiOnQsdGhpcy5pbkVkZ2VzPVtdLHRoaXMub3V0RWRnZXM9W10sdGhpcy5lZGdlcz1bXSx0aGlzLmhvc3RHcmFwaCx0aGlzLmRhdGFJbmRleD1udWxsPT1lPy0xOmV9ZnVuY3Rpb24gWl8odCxlLGkpe3RoaXMubm9kZTE9dCx0aGlzLm5vZGUyPWUsdGhpcy5kYXRhSW5kZXg9bnVsbD09aT8tMTppfVdfLnR5cGU9ImdyYXBoIixXXy5pc0RpcmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGVkfSxXXy5hZGROb2RlPWZ1bmN0aW9uKHQsZSl7dD1udWxsPT10PyIiK2U6IiIrdDt2YXIgaT10aGlzLl9ub2Rlc01hcDtpZighaVtHXyh0KV0pe3ZhciBuPW5ldyBIXyh0LGUpO3JldHVybihuLmhvc3RHcmFwaD10aGlzKS5ub2Rlcy5wdXNoKG4pLGlbR18odCldPW59fSxXXy5nZXROb2RlQnlJbmRleD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGEuZ2V0UmF3SW5kZXgodCk7cmV0dXJuIHRoaXMubm9kZXNbZV19LFdfLmdldE5vZGVCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlc01hcFtHXyh0KV19LFdfLmFkZEVkZ2U9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX25vZGVzTWFwLG89dGhpcy5fZWRnZXNNYXA7aWYoIm51bWJlciI9PXR5cGVvZiB0JiYodD10aGlzLm5vZGVzW3RdKSwibnVtYmVyIj09dHlwZW9mIGUmJihlPXRoaXMubm9kZXNbZV0pLEhfLmlzSW5zdGFuY2UodCl8fCh0PW5bR18odCldKSxIXy5pc0luc3RhbmNlKGUpfHwoZT1uW0dfKGUpXSksdCYmZSl7dmFyIGE9dC5pZCsiLSIrZS5pZDtpZighb1thXSl7dmFyIHI9bmV3IFpfKHQsZSxpKTtyZXR1cm4oci5ob3N0R3JhcGg9dGhpcykuX2RpcmVjdGVkJiYodC5vdXRFZGdlcy5wdXNoKHIpLGUuaW5FZGdlcy5wdXNoKHIpKSx0LmVkZ2VzLnB1c2gociksdCE9PWUmJmUuZWRnZXMucHVzaChyKSx0aGlzLmVkZ2VzLnB1c2gociksb1thXT1yfX19LFdfLmdldEVkZ2VCeUluZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWRnZURhdGEuZ2V0UmF3SW5kZXgodCk7cmV0dXJuIHRoaXMuZWRnZXNbZV19LFdfLmdldEVkZ2U9ZnVuY3Rpb24odCxlKXtIXy5pc0luc3RhbmNlKHQpJiYodD10LmlkKSxIXy5pc0luc3RhbmNlKGUpJiYoZT1lLmlkKTt2YXIgaT10aGlzLl9lZGdlc01hcDtyZXR1cm4gdGhpcy5fZGlyZWN0ZWQ/aVt0KyItIitlXTppW3QrIi0iK2VdfHxpW2UrIi0iK3RdfSxXXy5lYWNoTm9kZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLm5vZGVzLG49aS5sZW5ndGgsbz0wO288bjtvKyspMDw9aVtvXS5kYXRhSW5kZXgmJnQuY2FsbChlLGlbb10sbyl9LFdfLmVhY2hFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuZWRnZXMsbj1pLmxlbmd0aCxvPTA7bzxuO28rKykwPD1pW29dLmRhdGFJbmRleCYmMDw9aVtvXS5ub2RlMS5kYXRhSW5kZXgmJjA8PWlbb10ubm9kZTIuZGF0YUluZGV4JiZ0LmNhbGwoZSxpW29dLG8pfSxXXy5icmVhZHRoRmlyc3RUcmF2ZXJzZT1mdW5jdGlvbih0LGUsaSxuKXtpZihIXy5pc0luc3RhbmNlKGUpfHwoZT10aGlzLl9ub2Rlc01hcFtHXyhlKV0pLGUpe2Zvcih2YXIgbz0ib3V0Ij09PWk/Im91dEVkZ2VzIjoiaW4iPT09aT8iaW5FZGdlcyI6ImVkZ2VzIixhPTA7YTx0aGlzLm5vZGVzLmxlbmd0aDthKyspdGhpcy5ub2Rlc1thXS5fX3Zpc2l0ZWQ9ITE7aWYoIXQuY2FsbChuLGUsbnVsbCkpZm9yKHZhciByPVtlXTtyLmxlbmd0aDspe3ZhciBzPXIuc2hpZnQoKSxsPXNbb107Zm9yKGE9MDthPGwubGVuZ3RoO2ErKyl7dmFyIHU9bFthXSxoPXUubm9kZTE9PT1zP3Uubm9kZTI6dS5ub2RlMTtpZighaC5fX3Zpc2l0ZWQpe2lmKHQuY2FsbChuLGgscykpcmV0dXJuO3IucHVzaChoKSxoLl9fdmlzaXRlZD0hMH19fX19LFdfLnVwZGF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmRhdGEsaT10aGlzLmVkZ2VEYXRhLGU9dGhpcy5ub2RlcyxuPXRoaXMuZWRnZXMsbz0wLGE9ZS5sZW5ndGg7bzxhO28rKyllW29dLmRhdGFJbmRleD0tMTtmb3Iobz0wLGE9dC5jb3VudCgpO288YTtvKyspZVt0LmdldFJhd0luZGV4KG8pXS5kYXRhSW5kZXg9bztpLmZpbHRlclNlbGYoZnVuY3Rpb24odCl7dmFyIGU9bltpLmdldFJhd0luZGV4KHQpXTtyZXR1cm4gMDw9ZS5ub2RlMS5kYXRhSW5kZXgmJjA8PWUubm9kZTIuZGF0YUluZGV4fSk7Zm9yKG89MCxhPW4ubGVuZ3RoO288YTtvKyspbltvXS5kYXRhSW5kZXg9LTE7Zm9yKG89MCxhPWkuY291bnQoKTtvPGE7bysrKW5baS5nZXRSYXdJbmRleChvKV0uZGF0YUluZGV4PW99LFdfLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBGXyh0aGlzLl9kaXJlY3RlZCksZT10aGlzLm5vZGVzLGk9dGhpcy5lZGdlcyxuPTA7bjxlLmxlbmd0aDtuKyspdC5hZGROb2RlKGVbbl0uaWQsZVtuXS5kYXRhSW5kZXgpO2ZvcihuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvPWlbbl07dC5hZGRFZGdlKG8ubm9kZTEuaWQsby5ub2RlMi5pZCxvLmRhdGFJbmRleCl9cmV0dXJuIHR9LEhfLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SF8sZGVncmVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMubGVuZ3RofSxpbkRlZ3JlZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluRWRnZXMubGVuZ3RofSxvdXREZWdyZWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdXRFZGdlcy5sZW5ndGh9LGdldE1vZGVsOmZ1bmN0aW9uKHQpe2lmKCEodGhpcy5kYXRhSW5kZXg8MCkpcmV0dXJuIHRoaXMuaG9zdEdyYXBoLmRhdGEuZ2V0SXRlbU1vZGVsKHRoaXMuZGF0YUluZGV4KS5nZXRNb2RlbCh0KX19LFpfLnByb3RvdHlwZS5nZXRNb2RlbD1mdW5jdGlvbih0KXtpZighKHRoaXMuZGF0YUluZGV4PDApKXJldHVybiB0aGlzLmhvc3RHcmFwaC5lZGdlRGF0YS5nZXRJdGVtTW9kZWwodGhpcy5kYXRhSW5kZXgpLmdldE1vZGVsKHQpfTtmdW5jdGlvbiBVXyhpLG4pe3JldHVybntnZXRWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzW2ldW25dO3JldHVybiBlLmdldChlLmdldERpbWVuc2lvbih0fHwidmFsdWUiKSx0aGlzLmRhdGFJbmRleCl9LHNldFZpc3VhbDpmdW5jdGlvbih0LGUpezA8PXRoaXMuZGF0YUluZGV4JiZ0aGlzW2ldW25dLnNldEl0ZW1WaXN1YWwodGhpcy5kYXRhSW5kZXgsdCxlKX0sZ2V0VmlzdWFsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbaV1bbl0uZ2V0SXRlbVZpc3VhbCh0aGlzLmRhdGFJbmRleCx0LGUpfSxzZXRMYXlvdXQ6ZnVuY3Rpb24odCxlKXswPD10aGlzLmRhdGFJbmRleCYmdGhpc1tpXVtuXS5zZXRJdGVtTGF5b3V0KHRoaXMuZGF0YUluZGV4LHQsZSl9LGdldExheW91dDpmdW5jdGlvbigpe3JldHVybiB0aGlzW2ldW25dLmdldEl0ZW1MYXlvdXQodGhpcy5kYXRhSW5kZXgpfSxnZXRHcmFwaGljRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tpXVtuXS5nZXRJdGVtR3JhcGhpY0VsKHRoaXMuZGF0YUluZGV4KX0sZ2V0UmF3SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tpXVtuXS5nZXRSYXdJbmRleCh0aGlzLmRhdGFJbmRleCl9fX1iKEhfLFVfKCJob3N0R3JhcGgiLCJkYXRhIikpLGIoWl8sVV8oImhvc3RHcmFwaCIsImVkZ2VEYXRhIikpLEZfLk5vZGU9SF8sRl8uRWRnZT1aXyxpYShIXyksaWEoWl8pO2Z1bmN0aW9uIFhfKHQsZSxpLG4sbyl7Zm9yKHZhciBhPW5ldyBGXyhuKSxyPTA7cjx0Lmxlbmd0aDtyKyspYS5hZGROb2RlKFcodFtyXS5pZCx0W3JdLm5hbWUscikscik7dmFyIHM9W10sbD1bXSx1PTA7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGg9ZVtyXSxjPWguc291cmNlLGQ9aC50YXJnZXQ7YS5hZGRFZGdlKGMsZCx1KSYmKGwucHVzaChoKSxzLnB1c2goVyhoLmlkLGMrIiA+ICIrZCkpLHUrKyl9dmFyIGYscD1pLmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpO2lmKCJjYXJ0ZXNpYW4yZCI9PT1wfHwicG9sYXIiPT09cClmPWhwKHQsaSk7ZWxzZXt2YXIgZz1uaC5nZXQocCksbT1nJiYidmlldyIhPT1nLnR5cGUmJmcuZGltZW5zaW9uc3x8W107XyhtLCJ2YWx1ZSIpPDAmJm0uY29uY2F0KFsidmFsdWUiXSk7dmFyIHY9bnAodCx7Y29vcmREaW1lbnNpb25zOm19KTsoZj1uZXcgV2YodixpKSkuaW5pdERhdGEodCl9dmFyIHk9bmV3IFdmKFsidmFsdWUiXSxpKTtyZXR1cm4geS5pbml0RGF0YShsLHMpLG8mJm8oZix5KSx1eCh7bWFpbkRhdGE6ZixzdHJ1Y3Q6YSxzdHJ1Y3RBdHRyOiJncmFwaCIsZGF0YXM6e25vZGU6ZixlZGdlOnl9LGRhdGFzQXR0cjp7bm9kZToiZGF0YSIsZWRnZToiZWRnZURhdGEifX0pLGEudXBkYXRlKCksYX12YXIgWV89U2Yoe3R5cGU6InNlcmllcy5ncmFwaCIsaW5pdDpmdW5jdGlvbih0KXtZXy5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyk7dmFyIGU9dGhpcztmdW5jdGlvbiBpKCl7cmV0dXJuIGUuX2NhdGVnb3JpZXNEYXRhfXRoaXMubGVnZW5kVmlzdWFsUHJvdmlkZXI9bmV3IEd2KGksaSksdGhpcy5maWxsRGF0YVRleHRTdHlsZSh0LmVkZ2VzfHx0LmxpbmtzKSx0aGlzLl91cGRhdGVDYXRlZ29yaWVzRGF0YSgpfSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0KXtZXy5zdXBlckFwcGx5KHRoaXMsIm1lcmdlT3B0aW9uIixhcmd1bWVudHMpLHRoaXMuZmlsbERhdGFUZXh0U3R5bGUodC5lZGdlc3x8dC5saW5rcyksdGhpcy5fdXBkYXRlQ2F0ZWdvcmllc0RhdGEoKX0sbWVyZ2VEZWZhdWx0QW5kVGhlbWU6ZnVuY3Rpb24odCl7WV8uc3VwZXJBcHBseSh0aGlzLCJtZXJnZURlZmF1bHRBbmRUaGVtZSIsYXJndW1lbnRzKSx6byh0LFsiZWRnZUxhYmVsIl0sWyJzaG93Il0pfSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LHMpe3ZhciBlPXQuZWRnZXN8fHQubGlua3N8fFtdLGk9dC5kYXRhfHx0Lm5vZGVzfHxbXSxsPXRoaXM7aWYoaSYmZSlyZXR1cm4gWF8oaSxlLHRoaXMsITAsZnVuY3Rpb24odCxlKXt0LndyYXBNZXRob2QoImdldEl0ZW1Nb2RlbCIsZnVuY3Rpb24odCl7dmFyIGU9bC5fY2F0ZWdvcmllc01vZGVsc1t0LmdldFNoYWxsb3coImNhdGVnb3J5IildO3JldHVybiBlJiYoZS5wYXJlbnRNb2RlbD10LnBhcmVudE1vZGVsLHQucGFyZW50TW9kZWw9ZSksdH0pO3ZhciBpPWwuZ2V0TW9kZWwoImVkZ2VMYWJlbCIpLG49bmV3IElsKHtsYWJlbDppLm9wdGlvbn0saS5wYXJlbnRNb2RlbCxzKSxvPWwuZ2V0TW9kZWwoImVtcGhhc2lzLmVkZ2VMYWJlbCIpLGE9bmV3IElsKHtlbXBoYXNpczp7bGFiZWw6by5vcHRpb259fSxvLnBhcmVudE1vZGVsLHMpO2Z1bmN0aW9uIHIodCl7cmV0dXJuKHQ9dGhpcy5wYXJzZVBhdGgodCkpJiYibGFiZWwiPT09dFswXT9uOnQmJiJlbXBoYXNpcyI9PT10WzBdJiYibGFiZWwiPT09dFsxXT9hOnRoaXMucGFyZW50TW9kZWx9ZS53cmFwTWV0aG9kKCJnZXRJdGVtTW9kZWwiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmN1c3RvbWl6ZUdldFBhcmVudChyKSx0fSl9KS5kYXRhfSxnZXRHcmFwaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldERhdGEoKS5ncmFwaH0sZ2V0RWRnZURhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRHcmFwaCgpLmVkZ2VEYXRhfSxnZXRDYXRlZ29yaWVzRGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXRlZ29yaWVzRGF0YX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0LGUsaSl7aWYoImVkZ2UiIT09aSlyZXR1cm4gWV8uc3VwZXJBcHBseSh0aGlzLCJmb3JtYXRUb29sdGlwIixhcmd1bWVudHMpO3ZhciBuPXRoaXMuZ2V0RGF0YSgpLG89dGhpcy5nZXREYXRhUGFyYW1zKHQsaSksYT1uLmdyYXBoLmdldEVkZ2VCeUluZGV4KHQpLHI9bi5nZXROYW1lKGEubm9kZTEuZGF0YUluZGV4KSxzPW4uZ2V0TmFtZShhLm5vZGUyLmRhdGFJbmRleCksbD1bXTtyZXR1cm4gbnVsbCE9ciYmbC5wdXNoKHIpLG51bGwhPXMmJmwucHVzaChzKSxsPWV1KGwuam9pbigiID4gIikpLG8udmFsdWUmJihsKz0iIDogIitldShvLnZhbHVlKSksbH0sX3VwZGF0ZUNhdGVnb3JpZXNEYXRhOmZ1bmN0aW9uKCl7dmFyIHQ9Tih0aGlzLm9wdGlvbi5jYXRlZ29yaWVzfHxbXSxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC52YWx1ZT90Okwoe3ZhbHVlOjB9LHQpfSksZT1uZXcgV2YoWyJ2YWx1ZSJdLHRoaXMpO2UuaW5pdERhdGEodCksdGhpcy5fY2F0ZWdvcmllc0RhdGE9ZSx0aGlzLl9jYXRlZ29yaWVzTW9kZWxzPWUubWFwQXJyYXkoZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0SXRlbU1vZGVsKHQsITApfSl9LHNldFpvb206ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uem9vbT10fSxzZXRDZW50ZXI6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uY2VudGVyPXR9LGlzQW5pbWF0aW9uRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBZXy5zdXBlckNhbGwodGhpcywiaXNBbmltYXRpb25FbmFibGVkIikmJiEoImZvcmNlIj09PXRoaXMuZ2V0KCJsYXlvdXQiKSYmdGhpcy5nZXQoImZvcmNlLmxheW91dEFuaW1hdGlvbiIpKX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06InZpZXciLGxlZ2VuZEhvdmVyTGluazohMCxob3ZlckFuaW1hdGlvbjohMCxsYXlvdXQ6bnVsbCxmb2N1c05vZGVBZGphY2VuY3k6ITEsY2lyY3VsYXI6e3JvdGF0ZUxhYmVsOiExfSxmb3JjZTp7aW5pdExheW91dDpudWxsLHJlcHVsc2lvbjpbMCw1MF0sZ3Jhdml0eTouMSxmcmljdGlvbjouNixlZGdlTGVuZ3RoOjMwLGxheW91dEFuaW1hdGlvbjohMH0sbGVmdDoiY2VudGVyIix0b3A6ImNlbnRlciIsc3ltYm9sOiJjaXJjbGUiLHN5bWJvbFNpemU6MTAsZWRnZVN5bWJvbDpbIm5vbmUiLCJub25lIl0sZWRnZVN5bWJvbFNpemU6MTAsZWRnZUxhYmVsOntwb3NpdGlvbjoibWlkZGxlIn0sZHJhZ2dhYmxlOiExLHJvYW06ITEsY2VudGVyOm51bGwsem9vbToxLG5vZGVTY2FsZVJhdGlvOi42LGxhYmVsOntzaG93OiExLGZvcm1hdHRlcjoie2J9In0saXRlbVN0eWxlOnt9LGxpbmVTdHlsZTp7Y29sb3I6IiNhYWEiLHdpZHRoOjEsY3VydmVuZXNzOjAsb3BhY2l0eTouNX0sZW1waGFzaXM6e2xhYmVsOntzaG93OiEwfX19fSksal89b3MucHJvdG90eXBlLHFfPWxzLnByb3RvdHlwZTtmdW5jdGlvbiBLXyh0KXtyZXR1cm4gaXNOYU4oK3QuY3B4MSl8fGlzTmFOKCt0LmNweTEpfXZhciAkXz1Jcyh7dHlwZToiZWMtbGluZSIsc3R5bGU6e3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfSxzaGFwZTp7eDE6MCx5MTowLHgyOjAseTI6MCxwZXJjZW50OjEsY3B4MTpudWxsLGNweTE6bnVsbH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dGhpc1tLXyhlKT8iX2J1aWxkUGF0aExpbmUiOiJfYnVpbGRQYXRoQ3VydmUiXSh0LGUpfSxfYnVpbGRQYXRoTGluZTpqXy5idWlsZFBhdGgsX2J1aWxkUGF0aEN1cnZlOnFfLmJ1aWxkUGF0aCxwb2ludEF0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW0tfKHRoaXMuc2hhcGUpPyJfcG9pbnRBdExpbmUiOiJfcG9pbnRBdEN1cnZlIl0odCl9LF9wb2ludEF0TGluZTpqXy5wb2ludEF0LF9wb2ludEF0Q3VydmU6cV8ucG9pbnRBdCx0YW5nZW50QXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zaGFwZSxpPUtfKGUpP1tlLngyLWUueDEsZS55Mi1lLnkxXTp0aGlzLl90YW5nZW50QXRDdXJ2ZSh0KTtyZXR1cm4gbXQoaSxpKX0sX3RhbmdlbnRBdEN1cnZlOnFfLnRhbmdlbnRBdH0pLEpfPVsiZnJvbVN5bWJvbCIsInRvU3ltYm9sIl07ZnVuY3Rpb24gUV8odCl7cmV0dXJuIl8iK3QrIlR5cGUifWZ1bmN0aW9uIHR3KHQsZSxpKXt2YXIgbj1lLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKSxvPWUuZ2V0SXRlbVZpc3VhbChpLHQpLGE9ZS5nZXRJdGVtVmlzdWFsKGksdCsiU2l6ZSIpO2lmKG8mJiJub25lIiE9PW8pe2soYSl8fChhPVthLGFdKTt2YXIgcj1tZyhvLC1hWzBdLzIsLWFbMV0vMixhWzBdLGFbMV0sbik7cmV0dXJuIHIubmFtZT10LHJ9fWZ1bmN0aW9uIGV3KHQsZSl7dC54MT1lWzBdWzBdLHQueTE9ZVswXVsxXSx0LngyPWVbMV1bMF0sdC55Mj1lWzFdWzFdLHQucGVyY2VudD0xO3ZhciBpPWVbMl07aT8odC5jcHgxPWlbMF0sdC5jcHkxPWlbMV0pOih0LmNweDE9TmFOLHQuY3B5MT1OYU4pfWZ1bmN0aW9uIGl3KHQsZSxpKXtJaS5jYWxsKHRoaXMpLHRoaXMuX2NyZWF0ZUxpbmUodCxlLGkpfXZhciBudz1pdy5wcm90b3R5cGU7ZnVuY3Rpb24gb3codCl7dGhpcy5fY3Rvcj10fHxpdyx0aGlzLmdyb3VwPW5ldyBJaX1udy5iZWZvcmVVcGRhdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNoaWxkT2ZOYW1lKCJmcm9tU3ltYm9sIiksZT10aGlzLmNoaWxkT2ZOYW1lKCJ0b1N5bWJvbCIpLGk9dGhpcy5jaGlsZE9mTmFtZSgibGFiZWwiKTtpZih0fHxlfHwhaS5pZ25vcmUpe2Zvcih2YXIgbj0xLG89dGhpcy5wYXJlbnQ7bzspby5zY2FsZSYmKG4vPW8uc2NhbGVbMF0pLG89by5wYXJlbnQ7dmFyIGE9dGhpcy5jaGlsZE9mTmFtZSgibGluZSIpO2lmKHRoaXMuX19kaXJ0eXx8YS5fX2RpcnR5KXt2YXIgcj1hLnNoYXBlLnBlcmNlbnQscz1hLnBvaW50QXQoMCksbD1hLnBvaW50QXQociksdT1odChbXSxsLHMpO2lmKG10KHUsdSksdCl7dC5hdHRyKCJwb3NpdGlvbiIscyk7dmFyIGg9YS50YW5nZW50QXQoMCk7dC5hdHRyKCJyb3RhdGlvbiIsTWF0aC5QSS8yLU1hdGguYXRhbjIoaFsxXSxoWzBdKSksdC5hdHRyKCJzY2FsZSIsW24qcixuKnJdKX1pZihlKXtlLmF0dHIoInBvc2l0aW9uIixsKTtoPWEudGFuZ2VudEF0KDEpO2UuYXR0cigicm90YXRpb24iLC1NYXRoLlBJLzItTWF0aC5hdGFuMihoWzFdLGhbMF0pKSxlLmF0dHIoInNjYWxlIixbbipyLG4qcl0pfWlmKCFpLmlnbm9yZSl7dmFyIGMsZCxmO2kuYXR0cigicG9zaXRpb24iLGwpO3ZhciBwPTUqbjtpZigiZW5kIj09PWkuX19wb3NpdGlvbiljPVt1WzBdKnArbFswXSx1WzFdKnArbFsxXV0sZD0uODx1WzBdPyJsZWZ0Ijp1WzBdPC0uOD8icmlnaHQiOiJjZW50ZXIiLGY9Ljg8dVsxXT8idG9wIjp1WzFdPC0uOD8iYm90dG9tIjoibWlkZGxlIjtlbHNlIGlmKCJtaWRkbGUiPT09aS5fX3Bvc2l0aW9uKXt2YXIgZz1yLzIsbT1bKGg9YS50YW5nZW50QXQoZykpWzFdLC1oWzBdXSx2PWEucG9pbnRBdChnKTswPG1bMV0mJihtWzBdPS1tWzBdLG1bMV09LW1bMV0pLGM9W3ZbMF0rbVswXSpwLHZbMV0rbVsxXSpwXSxkPSJjZW50ZXIiLGY9ImJvdHRvbSI7dmFyIHk9LU1hdGguYXRhbjIoaFsxXSxoWzBdKTtsWzBdPHNbMF0mJih5PU1hdGguUEkreSksaS5hdHRyKCJyb3RhdGlvbiIseSl9ZWxzZSBjPVstdVswXSpwK3NbMF0sLXVbMV0qcCtzWzFdXSxkPS44PHVbMF0/InJpZ2h0Ijp1WzBdPC0uOD8ibGVmdCI6ImNlbnRlciIsZj0uODx1WzFdPyJib3R0b20iOnVbMV08LS44PyJ0b3AiOiJtaWRkbGUiO2kuYXR0cih7c3R5bGU6e3RleHRWZXJ0aWNhbEFsaWduOmkuX192ZXJ0aWNhbEFsaWdufHxmLHRleHRBbGlnbjppLl9fdGV4dEFsaWdufHxkfSxwb3NpdGlvbjpjLHNjYWxlOltuLG5dfSl9fX19LG53Ll9jcmVhdGVMaW5lPWZ1bmN0aW9uKGksbix0KXt2YXIgZT1pLmhvc3RNb2RlbCxvPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyAkXyh7bmFtZToibGluZSIsc3ViUGl4ZWxPcHRpbWl6ZTohMH0pO3JldHVybiBldyhlLnNoYXBlLHQpLGV9KGkuZ2V0SXRlbUxheW91dChuKSk7by5zaGFwZS5wZXJjZW50PTAsbGwobyx7c2hhcGU6e3BlcmNlbnQ6MX19LGUsbiksdGhpcy5hZGQobyk7dmFyIGE9bmV3IEZyKHtuYW1lOiJsYWJlbCIsbGluZUxhYmVsT3JpZ2luYWxPcGFjaXR5OjF9KTt0aGlzLmFkZChhKSxFKEpfLGZ1bmN0aW9uKHQpe3ZhciBlPXR3KHQsaSxuKTt0aGlzLmFkZChlKSx0aGlzW1FfKHQpXT1pLmdldEl0ZW1WaXN1YWwobix0KX0sdGhpcyksdGhpcy5fdXBkYXRlQ29tbW9uU3RsKGksbix0KX0sbncudXBkYXRlRGF0YT1mdW5jdGlvbihvLGEsdCl7dmFyIGU9by5ob3N0TW9kZWwsaT10aGlzLmNoaWxkT2ZOYW1lKCJsaW5lIiksbj1vLmdldEl0ZW1MYXlvdXQoYSkscj17c2hhcGU6e319O2V3KHIuc2hhcGUsbiksc2woaSxyLGUsYSksRShKXyxmdW5jdGlvbih0KXt2YXIgZT1vLmdldEl0ZW1WaXN1YWwoYSx0KSxpPVFfKHQpO2lmKHRoaXNbaV0hPT1lKXt0aGlzLnJlbW92ZSh0aGlzLmNoaWxkT2ZOYW1lKHQpKTt2YXIgbj10dyh0LG8sYSk7dGhpcy5hZGQobil9dGhpc1tpXT1lfSx0aGlzKSx0aGlzLl91cGRhdGVDb21tb25TdGwobyxhLHQpfSxudy5fdXBkYXRlQ29tbW9uU3RsPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10Lmhvc3RNb2RlbCxvPXRoaXMuY2hpbGRPZk5hbWUoImxpbmUiKSxhPWkmJmkubGluZVN0eWxlLHI9aSYmaS5ob3ZlckxpbmVTdHlsZSxzPWkmJmkubGFiZWxNb2RlbCxsPWkmJmkuaG92ZXJMYWJlbE1vZGVsO2lmKCFpfHx0Lmhhc0l0ZW1PcHRpb24pe3ZhciB1PXQuZ2V0SXRlbU1vZGVsKGUpO2E9dS5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCkscj11LmdldE1vZGVsKCJlbXBoYXNpcy5saW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxzPXUuZ2V0TW9kZWwoImxhYmVsIiksbD11LmdldE1vZGVsKCJlbXBoYXNpcy5sYWJlbCIpfXZhciBoPXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpLGM9Wih0LmdldEl0ZW1WaXN1YWwoZSwib3BhY2l0eSIpLGEub3BhY2l0eSwxKTtvLnVzZVN0eWxlKEMoe3N0cm9rZU5vU2NhbGU6ITAsZmlsbDoibm9uZSIsc3Ryb2tlOmgsb3BhY2l0eTpjfSxhKSksby5ob3ZlclN0eWxlPXIsRShKXyxmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNoaWxkT2ZOYW1lKHQpO2UmJihlLnNldENvbG9yKGgpLGUuc2V0U3R5bGUoe29wYWNpdHk6Y30pKX0sdGhpcyk7dmFyIGQsZixwPXMuZ2V0U2hhbGxvdygic2hvdyIpLGc9bC5nZXRTaGFsbG93KCJzaG93IiksbT10aGlzLmNoaWxkT2ZOYW1lKCJsYWJlbCIpO2lmKChwfHxnKSYmKGQ9aHx8IiMwMDAiLG51bGw9PShmPW4uZ2V0Rm9ybWF0dGVkTGFiZWwoZSwibm9ybWFsIix0LmRhdGFUeXBlKSkpKXt2YXIgdj1uLmdldFJhd1ZhbHVlKGUpO2Y9bnVsbD09dj90LmdldE5hbWUoZSk6aXNGaW5pdGUodik/Tmwodik6dn12YXIgeT1wP2Y6bnVsbCx4PWc/SChuLmdldEZvcm1hdHRlZExhYmVsKGUsImVtcGhhc2lzIix0LmRhdGFUeXBlKSxmKTpudWxsLF89bS5zdHlsZTtudWxsPT15JiZudWxsPT14fHwoUXMobS5zdHlsZSxzLHt0ZXh0Onl9LHthdXRvQ29sb3I6ZH0pLG0uX190ZXh0QWxpZ249Xy50ZXh0QWxpZ24sbS5fX3ZlcnRpY2FsQWxpZ249Xy50ZXh0VmVydGljYWxBbGlnbixtLl9fcG9zaXRpb249cy5nZXQoInBvc2l0aW9uIil8fCJtaWRkbGUiKSxtLmhvdmVyU3R5bGU9bnVsbCE9eD97dGV4dDp4LHRleHRGaWxsOmwuZ2V0VGV4dENvbG9yKCEwKSxmb250U3R5bGU6bC5nZXRTaGFsbG93KCJmb250U3R5bGUiKSxmb250V2VpZ2h0OmwuZ2V0U2hhbGxvdygiZm9udFdlaWdodCIpLGZvbnRTaXplOmwuZ2V0U2hhbGxvdygiZm9udFNpemUiKSxmb250RmFtaWx5OmwuZ2V0U2hhbGxvdygiZm9udEZhbWlseSIpfTp7dGV4dDpudWxsfSxtLmlnbm9yZT0hcCYmIWcsWXModGhpcyl9LG53LmhpZ2hsaWdodD1mdW5jdGlvbigpe3RoaXMudHJpZ2dlcigiZW1waGFzaXMiKX0sbncuZG93bnBsYXk9ZnVuY3Rpb24oKXt0aGlzLnRyaWdnZXIoIm5vcm1hbCIpfSxudy51cGRhdGVMYXlvdXQ9ZnVuY3Rpb24odCxlKXt0aGlzLnNldExpbmVQb2ludHModC5nZXRJdGVtTGF5b3V0KGUpKX0sbncuc2V0TGluZVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNoaWxkT2ZOYW1lKCJsaW5lIik7ZXcoZS5zaGFwZSx0KSxlLmRpcnR5KCl9LHcoaXcsSWkpO3ZhciBhdz1vdy5wcm90b3R5cGU7ZnVuY3Rpb24gcncodCl7dmFyIGU9dC5ob3N0TW9kZWw7cmV0dXJue2xpbmVTdHlsZTplLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxob3ZlckxpbmVTdHlsZTplLmdldE1vZGVsKCJlbXBoYXNpcy5saW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxsYWJlbE1vZGVsOmUuZ2V0TW9kZWwoImxhYmVsIiksaG92ZXJMYWJlbE1vZGVsOmUuZ2V0TW9kZWwoImVtcGhhc2lzLmxhYmVsIil9fWZ1bmN0aW9uIHN3KHQpe3JldHVybiBpc05hTih0WzBdKXx8aXNOYU4odFsxXSl9ZnVuY3Rpb24gbHcodCl7cmV0dXJuIXN3KHRbMF0pJiYhc3codFsxXSl9ZnVuY3Rpb24gdXcodCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO2lmKCJ2aWV3IiE9PWUudHlwZSlyZXR1cm4gMTt2YXIgaT10Lm9wdGlvbi5ub2RlU2NhbGVSYXRpbyxuPWUuc2NhbGUsbz1uJiZuWzBdfHwxO3JldHVybigoZS5nZXRab29tKCktMSkqaSsxKS9vfWZ1bmN0aW9uIGh3KHQpe3ZhciBlPXQuZ2V0VmlzdWFsKCJzeW1ib2xTaXplIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheSYmKGU9KGVbMF0rZVsxXSkvMiksK2V9YXcuaXNQZXJzaXN0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuITB9LGF3LnVwZGF0ZURhdGE9ZnVuY3Rpb24oaSl7dmFyIG49dGhpcyxlPW4uZ3JvdXAsbz1uLl9saW5lRGF0YTtuLl9saW5lRGF0YT1pLG98fGUucmVtb3ZlQWxsKCk7dmFyIGE9cncoaSk7aS5kaWZmKG8pLmFkZChmdW5jdGlvbih0KXshZnVuY3Rpb24odCxlLGksbil7aWYoIWx3KGUuZ2V0SXRlbUxheW91dChpKSkpcmV0dXJuO3ZhciBvPW5ldyB0Ll9jdG9yKGUsaSxuKTtlLnNldEl0ZW1HcmFwaGljRWwoaSxvKSx0Lmdyb3VwLmFkZChvKX0obixpLHQsYSl9KS51cGRhdGUoZnVuY3Rpb24odCxlKXshZnVuY3Rpb24odCxlLGksbixvLGEpe3ZhciByPWUuZ2V0SXRlbUdyYXBoaWNFbChuKTtpZighbHcoaS5nZXRJdGVtTGF5b3V0KG8pKSlyZXR1cm4gdC5ncm91cC5yZW1vdmUocik7cj9yLnVwZGF0ZURhdGEoaSxvLGEpOnI9bmV3IHQuX2N0b3IoaSxvLGEpO2kuc2V0SXRlbUdyYXBoaWNFbChvLHIpLHQuZ3JvdXAuYWRkKHIpfShuLG8saSxlLHQsYSl9KS5yZW1vdmUoZnVuY3Rpb24odCl7ZS5yZW1vdmUoby5nZXRJdGVtR3JhcGhpY0VsKHQpKX0pLmV4ZWN1dGUoKX0sYXcudXBkYXRlTGF5b3V0PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5fbGluZURhdGE7aSYmaS5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LGUpe3QudXBkYXRlTGF5b3V0KGksZSl9LHRoaXMpfSxhdy5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fc2VyaWVzU2NvcGU9cncodCksdGhpcy5fbGluZURhdGE9bnVsbCx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxhdy5pbmNyZW1lbnRhbFVwZGF0ZT1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dC5pc0dyb3VwfHwodC5pbmNyZW1lbnRhbD10LnVzZUhvdmVyTGF5ZXI9ITApfWZvcih2YXIgbj10LnN0YXJ0O248dC5lbmQ7bisrKXtpZihsdyhlLmdldEl0ZW1MYXlvdXQobikpKXt2YXIgbz1uZXcgdGhpcy5fY3RvcihlLG4sdGhpcy5fc2VyaWVzU2NvcGUpO28udHJhdmVyc2UoaSksdGhpcy5ncm91cC5hZGQobyksZS5zZXRJdGVtR3JhcGhpY0VsKG4sbyl9fX0sYXcucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJJbmNyZW1lbnRhbCgpLHRoaXMuX2luY3JlbWVudGFsPW51bGwsdGhpcy5ncm91cC5yZW1vdmVBbGwoKX0sYXcuX2NsZWFySW5jcmVtZW50YWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbmNyZW1lbnRhbDt0JiZ0LmNsZWFyRGlzcGxheWJsZXMoKX07dmFyIGN3PVtdLGR3PVtdLGZ3PVtdLHB3PVRhLGd3PV90LG13PU1hdGguYWJzO2Z1bmN0aW9uIHZ3KHQsZSxpKXtmb3IodmFyIG4sbz10WzBdLGE9dFsxXSxyPXRbMl0scz0xLzAsbD1pKmksdT0uMSxoPS4xO2g8PS45O2grPS4xKXtjd1swXT1wdyhvWzBdLGFbMF0sclswXSxoKSxjd1sxXT1wdyhvWzFdLGFbMV0sclsxXSxoKSwoZj1tdyhndyhjdyxlKS1sKSk8cyYmKHM9ZixuPWgpfWZvcih2YXIgYz0wO2M8MzI7YysrKXt2YXIgZD1uK3U7ZHdbMF09cHcob1swXSxhWzBdLHJbMF0sbiksZHdbMV09cHcob1sxXSxhWzFdLHJbMV0sbiksZndbMF09cHcob1swXSxhWzBdLHJbMF0sZCksZndbMV09cHcob1sxXSxhWzFdLHJbMV0sZCk7dmFyIGY9Z3coZHcsZSktbDtpZihtdyhmKTwuMDEpYnJlYWs7dmFyIHA9Z3coZncsZSktbDt1Lz0yLGY8MD8wPD1wP24rPXU6bi09dTowPD1wP24tPXU6bis9dX1yZXR1cm4gbn1mdW5jdGlvbiB5dyh0LGwpe3ZhciB1PVtdLGg9Q2EsYz1bW10sW10sW11dLGQ9W1tdLFtdXSxmPVtdO2wvPTIsdC5lYWNoRWRnZShmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0TGF5b3V0KCksbj10LmdldFZpc3VhbCgiZnJvbVN5bWJvbCIpLG89dC5nZXRWaXN1YWwoInRvU3ltYm9sIik7aS5fX29yaWdpbmFsfHwoaS5fX29yaWdpbmFsPVtydChpWzBdKSxydChpWzFdKV0saVsyXSYmaS5fX29yaWdpbmFsLnB1c2gocnQoaVsyXSkpKTt2YXIgYT1pLl9fb3JpZ2luYWw7aWYobnVsbCE9aVsyXSl7aWYoYXQoY1swXSxhWzBdKSxhdChjWzFdLGFbMl0pLGF0KGNbMl0sYVsxXSksbiYmIm5vbmUiIT09bil7dmFyIHI9aHcodC5ub2RlMSkscz12dyhjLGFbMF0scipsKTtoKGNbMF1bMF0sY1sxXVswXSxjWzJdWzBdLHMsdSksY1swXVswXT11WzNdLGNbMV1bMF09dVs0XSxoKGNbMF1bMV0sY1sxXVsxXSxjWzJdWzFdLHMsdSksY1swXVsxXT11WzNdLGNbMV1bMV09dVs0XX1pZihvJiYibm9uZSIhPT1vKXtyPWh3KHQubm9kZTIpLHM9dncoYyxhWzFdLHIqbCk7aChjWzBdWzBdLGNbMV1bMF0sY1syXVswXSxzLHUpLGNbMV1bMF09dVsxXSxjWzJdWzBdPXVbMl0saChjWzBdWzFdLGNbMV1bMV0sY1syXVsxXSxzLHUpLGNbMV1bMV09dVsxXSxjWzJdWzFdPXVbMl19YXQoaVswXSxjWzBdKSxhdChpWzFdLGNbMl0pLGF0KGlbMl0sY1sxXSl9ZWxzZXtpZihhdChkWzBdLGFbMF0pLGF0KGRbMV0sYVsxXSksaHQoZixkWzFdLGRbMF0pLG10KGYsZiksbiYmIm5vbmUiIT09bil7cj1odyh0Lm5vZGUxKTt1dChkWzBdLGRbMF0sZixyKmwpfWlmKG8mJiJub25lIiE9PW8pe3I9aHcodC5ub2RlMik7dXQoZFsxXSxkWzFdLGYsLXIqbCl9YXQoaVswXSxkWzBdKSxhdChpWzFdLGRbMV0pfX0pfXZhciB4dz0iX19mb2N1c05vZGVBZGphY2VuY3kiLF93PSJfX3VuZm9jdXNOb2RlQWRqYWNlbmN5Iix3dz1bIml0ZW1TdHlsZSIsIm9wYWNpdHkiXSxidz1bImxpbmVTdHlsZSIsIm9wYWNpdHkiXTtmdW5jdGlvbiBTdyh0LGUpe3ZhciBpPXQuZ2V0VmlzdWFsKCJvcGFjaXR5Iik7cmV0dXJuIG51bGwhPWk/aTp0LmdldE1vZGVsKCkuZ2V0KGUpfWZ1bmN0aW9uIE13KHQsZSxpKXt2YXIgbj10LmdldEdyYXBoaWNFbCgpLG89U3codCxlKTtudWxsIT1pJiYobnVsbD09byYmKG89MSksbyo9aSksbi5kb3ducGxheSYmbi5kb3ducGxheSgpLG4udHJhdmVyc2UoZnVuY3Rpb24odCl7aWYoIXQuaXNHcm91cCl7dmFyIGU9dC5saW5lTGFiZWxPcmlnaW5hbE9wYWNpdHk7bnVsbCE9ZSYmbnVsbD09aXx8KGU9byksdC5zZXRTdHlsZSgib3BhY2l0eSIsZSl9fSl9ZnVuY3Rpb24gSXcodCxlKXt2YXIgaT1Tdyh0LGUpLG49dC5nZXRHcmFwaGljRWwoKTtuLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3QuaXNHcm91cHx8dC5zZXRTdHlsZSgib3BhY2l0eSIsaSl9KSxuLmhpZ2hsaWdodCYmbi5oaWdobGlnaHQoKX1NZih7dHlwZToiZ3JhcGgiLGluaXQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgJGcsbj1uZXcgb3csbz10aGlzLmdyb3VwO3RoaXMuX2NvbnRyb2xsZXI9bmV3IEx5KGUuZ2V0WnIoKSksdGhpcy5fY29udHJvbGxlckhvc3Q9e3RhcmdldDpvfSxvLmFkZChpLmdyb3VwKSxvLmFkZChuLmdyb3VwKSx0aGlzLl9zeW1ib2xEcmF3PWksdGhpcy5fbGluZURyYXc9bix0aGlzLl9maXJzdFJlbmRlcj0hMH0scmVuZGVyOmZ1bmN0aW9uKG8sdCxhKXt2YXIgcj10aGlzLGU9by5jb29yZGluYXRlU3lzdGVtO3RoaXMuX21vZGVsPW87dmFyIGk9dGhpcy5fc3ltYm9sRHJhdyxuPXRoaXMuX2xpbmVEcmF3LHM9dGhpcy5ncm91cDtpZigidmlldyI9PT1lLnR5cGUpe3ZhciBsPXtwb3NpdGlvbjplLnBvc2l0aW9uLHNjYWxlOmUuc2NhbGV9O3RoaXMuX2ZpcnN0UmVuZGVyP3MuYXR0cihsKTpzbChzLGwsbyl9eXcoby5nZXRHcmFwaCgpLHV3KG8pKTt2YXIgdT1vLmdldERhdGEoKTtpLnVwZGF0ZURhdGEodSk7dmFyIGg9by5nZXRFZGdlRGF0YSgpO24udXBkYXRlRGF0YShoKSx0aGlzLl91cGRhdGVOb2RlQW5kTGlua1NjYWxlKCksdGhpcy5fdXBkYXRlQ29udHJvbGxlcihvLHQsYSksY2xlYXJUaW1lb3V0KHRoaXMuX2xheW91dFRpbWVvdXQpO3ZhciBjPW8uZm9yY2VMYXlvdXQsZD1vLmdldCgiZm9yY2UubGF5b3V0QW5pbWF0aW9uIik7YyYmdGhpcy5fc3RhcnRGb3JjZUxheW91dEl0ZXJhdGlvbihjLGQpLHUuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCxlKXt2YXIgaT11LmdldEl0ZW1Nb2RlbChlKTt0Lm9mZigiZHJhZyIpLm9mZigiZHJhZ2VuZCIpO3ZhciBuPWkuZ2V0KCJkcmFnZ2FibGUiKTtuJiZ0Lm9uKCJkcmFnIixmdW5jdGlvbigpe2MmJihjLndhcm1VcCgpLHRoaXMuX2xheW91dGluZ3x8dGhpcy5fc3RhcnRGb3JjZUxheW91dEl0ZXJhdGlvbihjLGQpLGMuc2V0Rml4ZWQoZSksdS5zZXRJdGVtTGF5b3V0KGUsdC5wb3NpdGlvbikpfSx0aGlzKS5vbigiZHJhZ2VuZCIsZnVuY3Rpb24oKXtjJiZjLnNldFVuZml4ZWQoZSl9LHRoaXMpLHQuc2V0RHJhZ2dhYmxlKG4mJmMpLHRbeHddJiZ0Lm9mZigibW91c2VvdmVyIix0W3h3XSksdFtfd10mJnQub2ZmKCJtb3VzZW91dCIsdFtfd10pLGkuZ2V0KCJmb2N1c05vZGVBZGphY2VuY3kiKSYmKHQub24oIm1vdXNlb3ZlciIsdFt4d109ZnVuY3Rpb24oKXtyLl9jbGVhclRpbWVyKCksYS5kaXNwYXRjaEFjdGlvbih7dHlwZToiZm9jdXNOb2RlQWRqYWNlbmN5IixzZXJpZXNJZDpvLmlkLGRhdGFJbmRleDp0LmRhdGFJbmRleH0pfSksdC5vbigibW91c2VvdXQiLHRbX3ddPWZ1bmN0aW9uKCl7ci5fZGlzcGF0Y2hVbmZvY3VzKGEpfSkpfSx0aGlzKSx1LmdyYXBoLmVhY2hFZGdlKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0R3JhcGhpY0VsKCk7ZVt4d10mJmUub2ZmKCJtb3VzZW92ZXIiLGVbeHddKSxlW193XSYmZS5vZmYoIm1vdXNlb3V0IixlW193XSksdC5nZXRNb2RlbCgpLmdldCgiZm9jdXNOb2RlQWRqYWNlbmN5IikmJihlLm9uKCJtb3VzZW92ZXIiLGVbeHddPWZ1bmN0aW9uKCl7ci5fY2xlYXJUaW1lcigpLGEuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImZvY3VzTm9kZUFkamFjZW5jeSIsc2VyaWVzSWQ6by5pZCxlZGdlRGF0YUluZGV4OnQuZGF0YUluZGV4fSl9KSxlLm9uKCJtb3VzZW91dCIsZVtfd109ZnVuY3Rpb24oKXtyLl9kaXNwYXRjaFVuZm9jdXMoYSl9KSl9KTt2YXIgZj0iY2lyY3VsYXIiPT09by5nZXQoImxheW91dCIpJiZvLmdldCgiY2lyY3VsYXIucm90YXRlTGFiZWwiKSxwPXUuZ2V0TGF5b3V0KCJjeCIpLGc9dS5nZXRMYXlvdXQoImN5Iik7dS5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LGUpe3ZhciBpPXUuZ2V0SXRlbU1vZGVsKGUpLmdldCgibGFiZWwucm90YXRlIil8fDAsbj10LmdldFN5bWJvbFBhdGgoKTtpZihmKXt2YXIgbz11LmdldEl0ZW1MYXlvdXQoZSksYT1NYXRoLmF0YW4yKG9bMV0tZyxvWzBdLXApO2E8MCYmKGE9MipNYXRoLlBJK2EpO3ZhciByPW9bMF08cDtyJiYoYS09TWF0aC5QSSk7dmFyIHM9cj8ibGVmdCI6InJpZ2h0IjtKcyhuLHt0ZXh0Um90YXRpb246LWEsdGV4dFBvc2l0aW9uOnMsdGV4dE9yaWdpbjoiY2VudGVyIn0se3RleHRQb3NpdGlvbjpzfSl9ZWxzZSBKcyhuLHt0ZXh0Um90YXRpb246aSo9TWF0aC5QSS8xODB9KX0pLHRoaXMuX2ZpcnN0UmVuZGVyPSExfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbGxlciYmdGhpcy5fY29udHJvbGxlci5kaXNwb3NlKCksdGhpcy5fY29udHJvbGxlckhvc3Q9e30sdGhpcy5fY2xlYXJUaW1lcigpfSxfZGlzcGF0Y2hVbmZvY3VzOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpczt0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fdW5mb2N1c0RlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2kuX3VuZm9jdXNEZWxheVRpbWVyPW51bGwsdC5kaXNwYXRjaEFjdGlvbih7dHlwZToidW5mb2N1c05vZGVBZGphY2VuY3kiLHNlcmllc0lkOmkuX21vZGVsLmlkfSl9LDUwMCl9LF9jbGVhclRpbWVyOmZ1bmN0aW9uKCl7dGhpcy5fdW5mb2N1c0RlbGF5VGltZXImJihjbGVhclRpbWVvdXQodGhpcy5fdW5mb2N1c0RlbGF5VGltZXIpLHRoaXMuX3VuZm9jdXNEZWxheVRpbWVyPW51bGwpfSxmb2N1c05vZGVBZGphY2VuY3k6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dGhpcy5fbW9kZWwuZ2V0RGF0YSgpLmdyYXBoLGE9bi5kYXRhSW5kZXgscj1uLmVkZ2VEYXRhSW5kZXgscz1vLmdldE5vZGVCeUluZGV4KGEpLGw9by5nZXRFZGdlQnlJbmRleChyKTsoc3x8bCkmJihvLmVhY2hOb2RlKGZ1bmN0aW9uKHQpe013KHQsd3csLjEpfSksby5lYWNoRWRnZShmdW5jdGlvbih0KXtNdyh0LGJ3LC4xKX0pLHMmJihJdyhzLHd3KSxFKHMuZWRnZXMsZnVuY3Rpb24odCl7dC5kYXRhSW5kZXg8MHx8KEl3KHQsYncpLEl3KHQubm9kZTEsd3cpLEl3KHQubm9kZTIsd3cpKX0pKSxsJiYoSXcobCxidyksSXcobC5ub2RlMSx3dyksSXcobC5ub2RlMix3dykpKX0sdW5mb2N1c05vZGVBZGphY2VuY3k6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dGhpcy5fbW9kZWwuZ2V0RGF0YSgpLmdyYXBoO28uZWFjaE5vZGUoZnVuY3Rpb24odCl7TXcodCx3dyl9KSxvLmVhY2hFZGdlKGZ1bmN0aW9uKHQpe013KHQsYncpfSl9LF9zdGFydEZvcmNlTGF5b3V0SXRlcmF0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIG49dGhpczshZnVuY3Rpb24gZSgpe3Quc3RlcChmdW5jdGlvbih0KXtuLnVwZGF0ZUxheW91dChuLl9tb2RlbCksKG4uX2xheW91dGluZz0hdCkmJihpP24uX2xheW91dFRpbWVvdXQ9c2V0VGltZW91dChlLDE2KTplKCkpfSl9KCl9LF91cGRhdGVDb250cm9sbGVyOmZ1bmN0aW9uKG8sdCxhKXt2YXIgZT10aGlzLl9jb250cm9sbGVyLGk9dGhpcy5fY29udHJvbGxlckhvc3Qscj10aGlzLmdyb3VwO2Uuc2V0UG9pbnRlckNoZWNrZXIoZnVuY3Rpb24odCxlLGkpe3ZhciBuPXIuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuIG4uYXBwbHlUcmFuc2Zvcm0oci50cmFuc2Zvcm0pLG4uY29udGFpbihlLGkpJiYhV3kodCxhLG8pfSksInZpZXciPT09by5jb29yZGluYXRlU3lzdGVtLnR5cGU/KGUuZW5hYmxlKG8uZ2V0KCJyb2FtIikpLGkuem9vbUxpbWl0PW8uZ2V0KCJzY2FsZUxpbWl0IiksaS56b29tPW8uY29vcmRpbmF0ZVN5c3RlbS5nZXRab29tKCksZS5vZmYoInBhbiIpLm9mZigiem9vbSIpLm9uKCJwYW4iLGZ1bmN0aW9uKHQpe1Z5KGksdC5keCx0LmR5KSxhLmRpc3BhdGNoQWN0aW9uKHtzZXJpZXNJZDpvLmlkLHR5cGU6ImdyYXBoUm9hbSIsZHg6dC5keCxkeTp0LmR5fSl9KS5vbigiem9vbSIsZnVuY3Rpb24odCl7R3koaSx0LnNjYWxlLHQub3JpZ2luWCx0Lm9yaWdpblkpLGEuZGlzcGF0Y2hBY3Rpb24oe3Nlcmllc0lkOm8uaWQsdHlwZToiZ3JhcGhSb2FtIix6b29tOnQuc2NhbGUsb3JpZ2luWDp0Lm9yaWdpblgsb3JpZ2luWTp0Lm9yaWdpbll9KSx0aGlzLl91cGRhdGVOb2RlQW5kTGlua1NjYWxlKCkseXcoby5nZXRHcmFwaCgpLHV3KG8pKSx0aGlzLl9saW5lRHJhdy51cGRhdGVMYXlvdXQoKX0sdGhpcykpOmUuZGlzYWJsZSgpfSxfdXBkYXRlTm9kZUFuZExpbmtTY2FsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21vZGVsLGU9dC5nZXREYXRhKCksaT11dyh0KSxuPVtpLGldO2UuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCxlKXt0LmF0dHIoInNjYWxlIixuKX0pfSx1cGRhdGVMYXlvdXQ6ZnVuY3Rpb24odCl7eXcodC5nZXRHcmFwaCgpLHV3KHQpKSx0aGlzLl9zeW1ib2xEcmF3LnVwZGF0ZUxheW91dCgpLHRoaXMuX2xpbmVEcmF3LnVwZGF0ZUxheW91dCgpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt0aGlzLl9zeW1ib2xEcmF3JiZ0aGlzLl9zeW1ib2xEcmF3LnJlbW92ZSgpLHRoaXMuX2xpbmVEcmF3JiZ0aGlzLl9saW5lRHJhdy5yZW1vdmUoKX19KSxnZih7dHlwZToiZm9jdXNOb2RlQWRqYWNlbmN5IixldmVudDoiZm9jdXNOb2RlQWRqYWNlbmN5Iix1cGRhdGU6InNlcmllczpmb2N1c05vZGVBZGphY2VuY3kifSxmdW5jdGlvbigpe30pLGdmKHt0eXBlOiJ1bmZvY3VzTm9kZUFkamFjZW5jeSIsZXZlbnQ6InVuZm9jdXNOb2RlQWRqYWNlbmN5Iix1cGRhdGU6InNlcmllczp1bmZvY3VzTm9kZUFkamFjZW5jeSJ9LGZ1bmN0aW9uKCl7fSk7Z2Yoe3R5cGU6ImdyYXBoUm9hbSIsZXZlbnQ6ImdyYXBoUm9hbSIsdXBkYXRlOiJub25lIn0sZnVuY3Rpb24oaSx0KXt0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHF1ZXJ5Oml9LGZ1bmN0aW9uKHQpe3ZhciBlPUt5KHQuY29vcmRpbmF0ZVN5c3RlbSxpKTt0LnNldENlbnRlciYmdC5zZXRDZW50ZXIoZS5jZW50ZXIpLHQuc2V0Wm9vbSYmdC5zZXRab29tKGUuem9vbSl9KX0pO2Z1bmN0aW9uIFR3KHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXl8fCh0PVt0LHRdKSx0fWZ1bmN0aW9uIEF3KHQpe3ZhciBlPXQuY29vcmRpbmF0ZVN5c3RlbTtpZighZXx8InZpZXciPT09ZS50eXBlKXt2YXIgaT10LmdldEdyYXBoKCk7aS5lYWNoTm9kZShmdW5jdGlvbih0KXt2YXIgZT10LmdldE1vZGVsKCk7dC5zZXRMYXlvdXQoWytlLmdldCgieCIpLCtlLmdldCgieSIpXSl9KSxEdyhpKX19ZnVuY3Rpb24gRHcodCl7dC5lYWNoRWRnZShmdW5jdGlvbih0KXt2YXIgZT10LmdldE1vZGVsKCkuZ2V0KCJsaW5lU3R5bGUuY3VydmVuZXNzIil8fDAsaT1ydCh0Lm5vZGUxLmdldExheW91dCgpKSxuPXJ0KHQubm9kZTIuZ2V0TGF5b3V0KCkpLG89W2ksbl07K2UmJm8ucHVzaChbKGlbMF0rblswXSkvMi0oaVsxXS1uWzFdKSplLChpWzFdK25bMV0pLzItKG5bMF0taVswXSkqZV0pLHQuc2V0TGF5b3V0KG8pfSl9dmFyIEN3PU1hdGguUEksTHc9W107ZnVuY3Rpb24ga3codCxlKXt2YXIgaT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoIWl8fCJ2aWV3Ij09PWkudHlwZSl7dmFyIG49aS5nZXRCb3VuZGluZ1JlY3QoKSxvPXQuZ2V0RGF0YSgpLGE9by5ncmFwaCxzPW4ud2lkdGgvMituLngsbD1uLmhlaWdodC8yK24ueSxyPU1hdGgubWluKG4ud2lkdGgsbi5oZWlnaHQpLzIsdT1vLmNvdW50KCk7by5zZXRMYXlvdXQoe2N4OnMsY3k6bH0pLHUmJihQd1tlXSh0LGksYSxvLHIscyxsLHUpLGEuZWFjaEVkZ2UoZnVuY3Rpb24odCl7dmFyIGUsaT10LmdldE1vZGVsKCkuZ2V0KCJsaW5lU3R5bGUuY3VydmVuZXNzIil8fDAsbj1ydCh0Lm5vZGUxLmdldExheW91dCgpKSxvPXJ0KHQubm9kZTIuZ2V0TGF5b3V0KCkpLGE9KG5bMF0rb1swXSkvMixyPShuWzFdK29bMV0pLzI7K2kmJihlPVtzKihpKj0zKSthKigxLWkpLGwqaStyKigxLWkpXSksdC5zZXRMYXlvdXQoW24sbyxlXSl9KSl9fXZhciBQdz17dmFsdWU6ZnVuY3Rpb24odCxlLGksbixvLGEscixzKXt2YXIgbD0wLHU9bi5nZXRTdW0oInZhbHVlIiksaD0yKk1hdGguUEkvKHV8fHMpO2kuZWFjaE5vZGUoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRWYWx1ZSgidmFsdWUiKSxpPWgqKHU/ZToxKS8yO2wrPWksdC5zZXRMYXlvdXQoW28qTWF0aC5jb3MobCkrYSxvKk1hdGguc2luKGwpK3JdKSxsKz1pfSl9LHN5bWJvbFNpemU6ZnVuY3Rpb24odCxlLGksbixvLGEscixzKXt2YXIgbD0wO0x3Lmxlbmd0aD1zO3ZhciB1PXV3KHQpO2kuZWFjaE5vZGUoZnVuY3Rpb24odCl7dmFyIGU9aHcodCk7aXNOYU4oZSkmJihlPTIpLGU8MCYmKGU9MCksZSo9dTt2YXIgaT1NYXRoLmFzaW4oZS8yL28pO2lzTmFOKGkpJiYoaT1Ddy8yKSxMd1t0LmRhdGFJbmRleF09aSxsKz0yKml9KTt2YXIgaD0oMipDdy1sKS9zLzIsYz0wO2kuZWFjaE5vZGUoZnVuY3Rpb24odCl7dmFyIGU9aCtMd1t0LmRhdGFJbmRleF07Yys9ZSx0LnNldExheW91dChbbypNYXRoLmNvcyhjKSthLG8qTWF0aC5zaW4oYykrcl0pLGMrPWV9KX19LE53PXV0O3BmKGZ1bmN0aW9uKHQpe3ZhciBhPXQuZmluZENvbXBvbmVudHMoe21haW5UeXBlOiJsZWdlbmQifSk7YSYmYS5sZW5ndGgmJnQuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Q2F0ZWdvcmllc0RhdGEoKSxuPXQuZ2V0R3JhcGgoKS5kYXRhLG89ZS5tYXBBcnJheShlLmdldE5hbWUpO24uZmlsdGVyU2VsZihmdW5jdGlvbih0KXt2YXIgZT1uLmdldEl0ZW1Nb2RlbCh0KS5nZXRTaGFsbG93KCJjYXRlZ29yeSIpO2lmKG51bGwhPWUpeyJudW1iZXIiPT10eXBlb2YgZSYmKGU9b1tlXSk7Zm9yKHZhciBpPTA7aTxhLmxlbmd0aDtpKyspaWYoIWFbaV0uaXNTZWxlY3RlZChlKSlyZXR1cm4hMX1yZXR1cm4hMH0pfSx0aGlzKX0pLHlmKE1tKCJncmFwaCIsImNpcmNsZSIsbnVsbCkpLHlmKGZ1bmN0aW9uKHQpe3ZhciBoPXt9O3QuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLGZ1bmN0aW9uKHMpe3ZhciBsPXMuZ2V0Q2F0ZWdvcmllc0RhdGEoKSxvPXMuZ2V0RGF0YSgpLHU9e307bC5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWwuZ2V0TmFtZSh0KTt1WyJlYy0iK2VdPXQ7dmFyIGk9bC5nZXRJdGVtTW9kZWwodCksbj1pLmdldCgiaXRlbVN0eWxlLmNvbG9yIil8fHMuZ2V0Q29sb3JGcm9tUGFsZXR0ZShlLGgpO2wuc2V0SXRlbVZpc3VhbCh0LCJjb2xvciIsbik7Zm9yKHZhciBvPVsib3BhY2l0eSIsInN5bWJvbCIsInN5bWJvbFNpemUiLCJzeW1ib2xLZWVwQXNwZWN0Il0sYT0wO2E8by5sZW5ndGg7YSsrKXt2YXIgcj1pLmdldFNoYWxsb3cob1thXSwhMCk7bnVsbCE9ciYmbC5zZXRJdGVtVmlzdWFsKHQsb1thXSxyKX19KSxsLmNvdW50KCkmJm8uZWFjaChmdW5jdGlvbih0KXt2YXIgZT1vLmdldEl0ZW1Nb2RlbCh0KS5nZXRTaGFsbG93KCJjYXRlZ29yeSIpO2lmKG51bGwhPWUpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9dVsiZWMtIitlXSk7Zm9yKHZhciBpPVsiY29sb3IiLCJvcGFjaXR5Iiwic3ltYm9sIiwic3ltYm9sU2l6ZSIsInN5bWJvbEtlZXBBc3BlY3QiXSxuPTA7bjxpLmxlbmd0aDtuKyspbnVsbD09by5nZXRJdGVtVmlzdWFsKHQsaVtuXSwhMCkmJm8uc2V0SXRlbVZpc3VhbCh0LGlbbl0sbC5nZXRJdGVtVmlzdWFsKGUsaVtuXSkpfX0pfSl9KSx5ZihmdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIixmdW5jdGlvbih0KXt2YXIgcz10LmdldEdyYXBoKCksbD10LmdldEVkZ2VEYXRhKCksZT1Udyh0LmdldCgiZWRnZVN5bWJvbCIpKSxpPVR3KHQuZ2V0KCJlZGdlU3ltYm9sU2l6ZSIpKSx1PSJsaW5lU3R5bGUuY29sb3IiLnNwbGl0KCIuIiksaD0ibGluZVN0eWxlLm9wYWNpdHkiLnNwbGl0KCIuIik7bC5zZXRWaXN1YWwoImZyb21TeW1ib2wiLGUmJmVbMF0pLGwuc2V0VmlzdWFsKCJ0b1N5bWJvbCIsZSYmZVsxXSksbC5zZXRWaXN1YWwoImZyb21TeW1ib2xTaXplIixpJiZpWzBdKSxsLnNldFZpc3VhbCgidG9TeW1ib2xTaXplIixpJiZpWzFdKSxsLnNldFZpc3VhbCgiY29sb3IiLHQuZ2V0KHUpKSxsLnNldFZpc3VhbCgib3BhY2l0eSIsdC5nZXQoaCkpLGwuZWFjaChmdW5jdGlvbih0KXt2YXIgZT1sLmdldEl0ZW1Nb2RlbCh0KSxpPXMuZ2V0RWRnZUJ5SW5kZXgodCksbj1UdyhlLmdldFNoYWxsb3coInN5bWJvbCIsITApKSxvPVR3KGUuZ2V0U2hhbGxvdygic3ltYm9sU2l6ZSIsITApKSxhPWUuZ2V0KHUpLHI9ZS5nZXQoaCk7c3dpdGNoKGEpe2Nhc2Uic291cmNlIjphPWkubm9kZTEuZ2V0VmlzdWFsKCJjb2xvciIpO2JyZWFrO2Nhc2UidGFyZ2V0IjphPWkubm9kZTIuZ2V0VmlzdWFsKCJjb2xvciIpfW5bMF0mJmkuc2V0VmlzdWFsKCJmcm9tU3ltYm9sIixuWzBdKSxuWzFdJiZpLnNldFZpc3VhbCgidG9TeW1ib2wiLG5bMV0pLG9bMF0mJmkuc2V0VmlzdWFsKCJmcm9tU3ltYm9sU2l6ZSIsb1swXSksb1sxXSYmaS5zZXRWaXN1YWwoInRvU3ltYm9sU2l6ZSIsb1sxXSksaS5zZXRWaXN1YWwoImNvbG9yIixhKSxpLnNldFZpc3VhbCgib3BhY2l0eSIscil9KX0pfSksdmYoZnVuY3Rpb24odCxlKXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIixmdW5jdGlvbih0KXt2YXIgZT10LmdldCgibGF5b3V0IiksaT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoaSYmInZpZXciIT09aS50eXBlKXt2YXIgbj10LmdldERhdGEoKSxvPVtdO0UoaS5kaW1lbnNpb25zLGZ1bmN0aW9uKHQpe289by5jb25jYXQobi5tYXBEaW1lbnNpb24odCwhMCkpfSk7Zm9yKHZhciBhPTA7YTxuLmNvdW50KCk7YSsrKXtmb3IodmFyIHI9W10scz0hMSxsPTA7bDxvLmxlbmd0aDtsKyspe3ZhciB1PW4uZ2V0KG9bbF0sYSk7aXNOYU4odSl8fChzPSEwKSxyLnB1c2godSl9cz9uLnNldEl0ZW1MYXlvdXQoYSxpLmRhdGFUb1BvaW50KHIpKTpuLnNldEl0ZW1MYXlvdXQoYSxbTmFOLE5hTl0pfUR3KG4uZ3JhcGgpfWVsc2UgZSYmIm5vbmUiIT09ZXx8QXcodCl9KX0pLHZmKElkLlZJU1VBTC5QT1NUX0NIQVJUX0xBWU9VVCxmdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIixmdW5jdGlvbih0KXsiY2lyY3VsYXIiPT09dC5nZXQoImxheW91dCIpJiZrdyh0LCJzeW1ib2xTaXplIil9KX0pLHZmKGZ1bmN0aW9uKHQpe3QuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLGZ1bmN0aW9uKHQpe2lmKCEobD10LmNvb3JkaW5hdGVTeXN0ZW0pfHwidmlldyI9PT1sLnR5cGUpaWYoImZvcmNlIj09PXQuZ2V0KCJsYXlvdXQiKSl7dmFyIGM9dC5wcmVzZXJ2ZWRQb2ludHN8fHt9LGQ9dC5nZXRHcmFwaCgpLGY9ZC5kYXRhLGU9ZC5lZGdlRGF0YSxpPXQuZ2V0TW9kZWwoImZvcmNlIiksbj1pLmdldCgiaW5pdExheW91dCIpO3QucHJlc2VydmVkUG9pbnRzP2YuZWFjaChmdW5jdGlvbih0KXt2YXIgZT1mLmdldElkKHQpO2Yuc2V0SXRlbUxheW91dCh0LGNbZV18fFtOYU4sTmFOXSl9KTpuJiYibm9uZSIhPT1uPyJjaXJjdWxhciI9PT1uJiZrdyh0LCJ2YWx1ZSIpOkF3KHQpO3ZhciBvPWYuZ2V0RGF0YUV4dGVudCgidmFsdWUiKSxhPWUuZ2V0RGF0YUV4dGVudCgidmFsdWUiKSxyPWkuZ2V0KCJyZXB1bHNpb24iKSxzPWkuZ2V0KCJlZGdlTGVuZ3RoIik7ayhyKXx8KHI9W3Iscl0pLGsocyl8fChzPVtzLHNdKSxzPVtzWzFdLHNbMF1dO3ZhciBsLHU9Zi5tYXBBcnJheSgidmFsdWUiLGZ1bmN0aW9uKHQsZSl7dmFyIGk9Zi5nZXRJdGVtTGF5b3V0KGUpLG49a2wodCxvLHIpO3JldHVybiBpc05hTihuKSYmKG49KHJbMF0rclsxXSkvMikse3c6bixyZXA6bixmaXhlZDpmLmdldEl0ZW1Nb2RlbChlKS5nZXQoImZpeGVkIikscDohaXx8aXNOYU4oaVswXSl8fGlzTmFOKGlbMV0pP251bGw6aX19KSxoPWUubWFwQXJyYXkoInZhbHVlIixmdW5jdGlvbih0LGUpe3ZhciBpPWQuZ2V0RWRnZUJ5SW5kZXgoZSksbj1rbCh0LGEscyk7aXNOYU4obikmJihuPShzWzBdK3NbMV0pLzIpO3ZhciBvPWkuZ2V0TW9kZWwoKTtyZXR1cm57bjE6dVtpLm5vZGUxLmRhdGFJbmRleF0sbjI6dVtpLm5vZGUyLmRhdGFJbmRleF0sZDpuLGN1cnZlbmVzczpvLmdldCgibGluZVN0eWxlLmN1cnZlbmVzcyIpfHwwLGlnbm9yZUZvcmNlTGF5b3V0Om8uZ2V0KCJpZ25vcmVGb3JjZUxheW91dCIpfX0pLHA9KGw9dC5jb29yZGluYXRlU3lzdGVtKS5nZXRCb3VuZGluZ1JlY3QoKSxnPWZ1bmN0aW9uKGYscCx0KXtmb3IodmFyIGU9dC5yZWN0LGk9ZS53aWR0aCxuPWUuaGVpZ2h0LGc9W2UueCtpLzIsZS55K24vMl0sbT1udWxsPT10LmdyYXZpdHk/LjE6dC5ncmF2aXR5LG89MDtvPGYubGVuZ3RoO28rKyl7dmFyIGE9ZltvXTthLnB8fChhLnA9b3QoaSooTWF0aC5yYW5kb20oKS0uNSkrZ1swXSxuKihNYXRoLnJhbmRvbSgpLS41KStnWzFdKSksYS5wcD1ydChhLnApLGEuZWRnZXM9bnVsbH12YXIgcj1udWxsPT10LmZyaWN0aW9uPy42OnQuZnJpY3Rpb24sdj1yO3JldHVybnt3YXJtVXA6ZnVuY3Rpb24oKXt2PS44KnJ9LHNldEZpeGVkOmZ1bmN0aW9uKHQpe2ZbdF0uZml4ZWQ9ITB9LHNldFVuZml4ZWQ6ZnVuY3Rpb24odCl7Zlt0XS5maXhlZD0hMX0sc3RlcDpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT1mLmxlbmd0aCxuPTA7bjxwLmxlbmd0aDtuKyspe3ZhciBvPXBbbl07aWYoIW8uaWdub3JlRm9yY2VMYXlvdXQpe3ZhciBhPW8ubjE7aHQoZSwodT1vLm4yKS5wLGEucCk7dmFyIHI9Y3QoZSktby5kLHM9dS53LyhhLncrdS53KTtpc05hTihzKSYmKHM9MCksbXQoZSxlKSxhLmZpeGVkfHxOdyhhLnAsYS5wLGUscypyKnYpLHUuZml4ZWR8fE53KHUucCx1LnAsZSwtKDEtcykqcip2KX19Zm9yKG49MDtuPGk7bisrKXsoZD1mW25dKS5maXhlZHx8KGh0KGUsZyxkLnApLE53KGQucCxkLnAsZSxtKnYpKX1mb3Iobj0wO248aTtuKyspe2E9ZltuXTtmb3IodmFyIGw9bisxO2w8aTtsKyspe3ZhciB1O2h0KGUsKHU9ZltsXSkucCxhLnApLDA9PT0ocj1jdChlKSkmJihzdChlLE1hdGgucmFuZG9tKCktLjUsTWF0aC5yYW5kb20oKS0uNSkscj0xKTt2YXIgaD0oYS5yZXArdS5yZXApL3IvcjthLmZpeGVkfHxOdyhhLnBwLGEucHAsZSxoKSx1LmZpeGVkfHxOdyh1LnBwLHUucHAsZSwtaCl9fXZhciBjPVtdO2ZvcihuPTA7bjxpO24rKyl7dmFyIGQ7KGQ9ZltuXSkuZml4ZWR8fChodChjLGQucCxkLnBwKSxOdyhkLnAsZC5wLGMsdiksYXQoZC5wcCxkLnApKX12Kj0uOTkyLHQmJnQoZixwLHY8LjAxKX19fSh1LGgse3JlY3Q6cCxncmF2aXR5OmkuZ2V0KCJncmF2aXR5IiksZnJpY3Rpb246aS5nZXQoImZyaWN0aW9uIil9KSxtPWcuc3RlcDtnLnN0ZXA9ZnVuY3Rpb24oaCl7Zm9yKHZhciB0PTAsZT11Lmxlbmd0aDt0PGU7dCsrKXVbdF0uZml4ZWQmJmF0KHVbdF0ucCxkLmdldE5vZGVCeUluZGV4KHQpLmdldExheW91dCgpKTttKGZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG49MCxvPXQubGVuZ3RoO248bztuKyspdFtuXS5maXhlZHx8ZC5nZXROb2RlQnlJbmRleChuKS5zZXRMYXlvdXQodFtuXS5wKSxjW2YuZ2V0SWQobildPXRbbl0ucDtmb3Iobj0wLG89ZS5sZW5ndGg7bjxvO24rKyl7dmFyIGE9ZVtuXSxyPWQuZ2V0RWRnZUJ5SW5kZXgobikscz1hLm4xLnAsbD1hLm4yLnAsdT1yLmdldExheW91dCgpOyh1PXU/dS5zbGljZSgpOltdKVswXT11WzBdfHxbXSx1WzFdPXVbMV18fFtdLGF0KHVbMF0scyksYXQodVsxXSxsKSwrYS5jdXJ2ZW5lc3MmJih1WzJdPVsoc1swXStsWzBdKS8yLShzWzFdLWxbMV0pKmEuY3VydmVuZXNzLChzWzFdK2xbMV0pLzItKGxbMF0tc1swXSkqYS5jdXJ2ZW5lc3NdKSxyLnNldExheW91dCh1KX1oJiZoKGkpfSl9LHQuZm9yY2VMYXlvdXQ9Zyx0LnByZXNlcnZlZFBvaW50cz1jLGcuc3RlcCgpfWVsc2UgdC5mb3JjZUxheW91dD1udWxsfSl9KSxtZigiZ3JhcGhWaWV3Iix7Y3JlYXRlOmZ1bmN0aW9uKHQsZCl7dmFyIGY9W107cmV0dXJuIHQuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIik7aWYoIWV8fCJ2aWV3Ij09PWUpe3ZhciBpPXQuZ2V0RGF0YSgpLG49W10sbz1bXTtCYShpLm1hcEFycmF5KGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0SXRlbU1vZGVsKHQpO3JldHVyblsrZS5nZXQoIngiKSwrZS5nZXQoInkiKV19KSxuLG8pLG9bMF0tblswXT09MCYmKG9bMF0rPTEsblswXS09MSksb1sxXS1uWzFdPT0wJiYob1sxXSs9MSxuWzFdLT0xKTt2YXIgYT0ob1swXS1uWzBdKS8ob1sxXS1uWzFdKSxyPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldEJveExheW91dFBhcmFtcygpO3JldHVybiBuLmFzcGVjdD1pLHZ1KG4se3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0pfSh0LGQsYSk7aXNOYU4oYSkmJihuPVtyLngsci55XSxvPVtyLngrci53aWR0aCxyLnkrci5oZWlnaHRdKTt2YXIgcz1vWzBdLW5bMF0sbD1vWzFdLW5bMV0sdT1yLndpZHRoLGg9ci5oZWlnaHQsYz10LmNvb3JkaW5hdGVTeXN0ZW09bmV3IFF5O2Muem9vbUxpbWl0PXQuZ2V0KCJzY2FsZUxpbWl0IiksYy5zZXRCb3VuZGluZ1JlY3QoblswXSxuWzFdLHMsbCksYy5zZXRWaWV3UmVjdChyLngsci55LHUsaCksYy5zZXRDZW50ZXIodC5nZXQoImNlbnRlciIpKSxjLnNldFpvb20odC5nZXQoInpvb20iKSksZi5wdXNoKGMpfX0pLGZ9fSk7aWMuZXh0ZW5kKHt0eXBlOiJzZXJpZXMuZ2F1Z2UiLGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJ2KHRoaXMsWyJ2YWx1ZSJdKX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNlbnRlcjpbIjUwJSIsIjUwJSJdLGxlZ2VuZEhvdmVyTGluazohMCxyYWRpdXM6Ijc1JSIsc3RhcnRBbmdsZToyMjUsZW5kQW5nbGU6LTQ1LGNsb2Nrd2lzZTohMCxtaW46MCxtYXg6MTAwLHNwbGl0TnVtYmVyOjEwLGF4aXNMaW5lOntzaG93OiEwLGxpbmVTdHlsZTp7Y29sb3I6W1suMiwiIzkxYzdhZSJdLFsuOCwiIzYzODY5ZSJdLFsxLCIjYzIzNTMxIl1dLHdpZHRoOjMwfX0sc3BsaXRMaW5lOntzaG93OiEwLGxlbmd0aDozMCxsaW5lU3R5bGU6e2NvbG9yOiIjZWVlIix3aWR0aDoyLHR5cGU6InNvbGlkIn19LGF4aXNUaWNrOntzaG93OiEwLHNwbGl0TnVtYmVyOjUsbGVuZ3RoOjgsbGluZVN0eWxlOntjb2xvcjoiI2VlZSIsd2lkdGg6MSx0eXBlOiJzb2xpZCJ9fSxheGlzTGFiZWw6e3Nob3c6ITAsZGlzdGFuY2U6NSxjb2xvcjoiYXV0byJ9LHBvaW50ZXI6e3Nob3c6ITAsbGVuZ3RoOiI4MCUiLHdpZHRoOjh9LGl0ZW1TdHlsZTp7Y29sb3I6ImF1dG8ifSx0aXRsZTp7c2hvdzohMCxvZmZzZXRDZW50ZXI6WzAsIi00MCUiXSxjb2xvcjoiIzMzMyIsZm9udFNpemU6MTV9LGRldGFpbDp7c2hvdzohMCxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJvcmRlcldpZHRoOjAsYm9yZGVyQ29sb3I6IiNjY2MiLHdpZHRoOjEwMCxoZWlnaHQ6bnVsbCxwYWRkaW5nOls1LDEwXSxvZmZzZXRDZW50ZXI6WzAsIjQwJSJdLGNvbG9yOiJhdXRvIixmb250U2l6ZTozMH19fSk7dmFyIE93PVNyLmV4dGVuZCh7dHlwZToiZWNoYXJ0c0dhdWdlUG9pbnRlciIsc2hhcGU6e2FuZ2xlOjAsd2lkdGg6MTAscjoxMCx4OjAseTowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLmNvcyxuPU1hdGguc2luLG89ZS5yLGE9ZS53aWR0aCxyPWUuYW5nbGUscz1lLngtaShyKSphKihvLzM8PWE/MToyKSxsPWUueS1uKHIpKmEqKG8vMzw9YT8xOjIpO3I9ZS5hbmdsZS1NYXRoLlBJLzIsdC5tb3ZlVG8ocyxsKSx0LmxpbmVUbyhlLngraShyKSphLGUueStuKHIpKmEpLHQubGluZVRvKGUueCtpKGUuYW5nbGUpKm8sZS55K24oZS5hbmdsZSkqbyksdC5saW5lVG8oZS54LWkocikqYSxlLnktbihyKSphKSx0LmxpbmVUbyhzLGwpfX0pO2Z1bmN0aW9uIEV3KHQsZSl7cmV0dXJuIGUmJigic3RyaW5nIj09dHlwZW9mIGU/dD1lLnJlcGxhY2UoInt2YWx1ZX0iLG51bGwhPXQ/dDoiIik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJih0PWUodCkpKSx0fXZhciB6dz0yKk1hdGguUEksUnc9KGdjLmV4dGVuZCh7dHlwZToiZ2F1Z2UiLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgbj10LmdldCgiYXhpc0xpbmUubGluZVN0eWxlLmNvbG9yIiksbz1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0KCJjZW50ZXIiKSxuPWUuZ2V0V2lkdGgoKSxvPWUuZ2V0SGVpZ2h0KCksYT1NYXRoLm1pbihuLG8pO3JldHVybntjeDpQbChpWzBdLGUuZ2V0V2lkdGgoKSksY3k6UGwoaVsxXSxlLmdldEhlaWdodCgpKSxyOlBsKHQuZ2V0KCJyYWRpdXMiKSxhLzIpfX0odCxpKTt0aGlzLl9yZW5kZXJNYWluKHQsZSxpLG4sbyl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9LF9yZW5kZXJNYWluOmZ1bmN0aW9uKHQsZSxpLG4sbyl7Zm9yKHZhciBhPXRoaXMuZ3JvdXAscj10LmdldE1vZGVsKCJheGlzTGluZSIpLHM9ci5nZXRNb2RlbCgibGluZVN0eWxlIiksbD10LmdldCgiY2xvY2t3aXNlIiksdT0tdC5nZXQoInN0YXJ0QW5nbGUiKS8xODAqTWF0aC5QSSxoPSgoZz0tdC5nZXQoImVuZEFuZ2xlIikvMTgwKk1hdGguUEkpLXUpJXp3LGM9dSxkPXMuZ2V0KCJ3aWR0aCIpLGY9ci5nZXQoInNob3ciKSxwPTA7ZiYmcDxuLmxlbmd0aDtwKyspe3ZhciBnLG09TWF0aC5taW4oTWF0aC5tYXgobltwXVswXSwwKSwxKSx2PW5ldyBVcih7c2hhcGU6e3N0YXJ0QW5nbGU6YyxlbmRBbmdsZTpnPXUraCptLGN4Om8uY3gsY3k6by5jeSxjbG9ja3dpc2U6bCxyMDpvLnItZCxyOm8ucn0sc2lsZW50OiEwfSk7di5zZXRTdHlsZSh7ZmlsbDpuW3BdWzFdfSksdi5zZXRTdHlsZShzLmdldExpbmVTdHlsZShbImNvbG9yIiwiYm9yZGVyV2lkdGgiLCJib3JkZXJDb2xvciJdKSksYS5hZGQodiksYz1nfWZ1bmN0aW9uIHkodCl7aWYodDw9MClyZXR1cm4gblswXVsxXTtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoO2UrKylpZihuW2VdWzBdPj10JiYoMD09PWU/MDpuW2UtMV1bMF0pPHQpcmV0dXJuIG5bZV1bMV07cmV0dXJuIG5bZS0xXVsxXX1pZighbCl7dmFyIHg9dTt1PWcsZz14fXRoaXMuX3JlbmRlclRpY2tzKHQsZSxpLHksbyx1LGcsbCksdGhpcy5fcmVuZGVyUG9pbnRlcih0LGUsaSx5LG8sdSxnLGwpLHRoaXMuX3JlbmRlclRpdGxlKHQsZSxpLHksbyksdGhpcy5fcmVuZGVyRGV0YWlsKHQsZSxpLHksbyl9LF9yZW5kZXJUaWNrczpmdW5jdGlvbih0LGUsaSxuLG8sYSxyLHMpe2Zvcih2YXIgbD10aGlzLmdyb3VwLHU9by5jeCxoPW8uY3ksYz1vLnIsZD0rdC5nZXQoIm1pbiIpLGY9K3QuZ2V0KCJtYXgiKSxwPXQuZ2V0TW9kZWwoInNwbGl0TGluZSIpLGc9dC5nZXRNb2RlbCgiYXhpc1RpY2siKSxtPXQuZ2V0TW9kZWwoImF4aXNMYWJlbCIpLHY9dC5nZXQoInNwbGl0TnVtYmVyIikseT1nLmdldCgic3BsaXROdW1iZXIiKSx4PVBsKHAuZ2V0KCJsZW5ndGgiKSxjKSxfPVBsKGcuZ2V0KCJsZW5ndGgiKSxjKSx3PWEsYj0oci1hKS92LFM9Yi95LE09cC5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksST1nLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxUPTA7VDw9djtUKyspe3ZhciBBPU1hdGguY29zKHcpLEQ9TWF0aC5zaW4odyk7aWYocC5nZXQoInNob3ciKSl7dmFyIEM9bmV3IG9zKHtzaGFwZTp7eDE6QSpjK3UseTE6RCpjK2gseDI6QSooYy14KSt1LHkyOkQqKGMteCkraH0sc3R5bGU6TSxzaWxlbnQ6ITB9KTsiYXV0byI9PT1NLnN0cm9rZSYmQy5zZXRTdHlsZSh7c3Ryb2tlOm4oVC92KX0pLGwuYWRkKEMpfWlmKG0uZ2V0KCJzaG93Iikpe3ZhciBMPUV3KE5sKFQvdiooZi1kKStkKSxtLmdldCgiZm9ybWF0dGVyIikpLGs9bS5nZXQoImRpc3RhbmNlIiksUD1uKFQvdik7bC5hZGQobmV3IEZyKHtzdHlsZTpRcyh7fSxtLHt0ZXh0OkwseDpBKihjLXgtaykrdSx5OkQqKGMteC1rKStoLHRleHRWZXJ0aWNhbEFsaWduOkQ8LS40PyJ0b3AiOi40PEQ/ImJvdHRvbSI6Im1pZGRsZSIsdGV4dEFsaWduOkE8LS40PyJsZWZ0IjouNDxBPyJyaWdodCI6ImNlbnRlciJ9LHthdXRvQ29sb3I6UH0pLHNpbGVudDohMH0pKX1pZihnLmdldCgic2hvdyIpJiZUIT09dil7Zm9yKHZhciBOPTA7Tjw9eTtOKyspe0E9TWF0aC5jb3ModyksRD1NYXRoLnNpbih3KTt2YXIgTz1uZXcgb3Moe3NoYXBlOnt4MTpBKmMrdSx5MTpEKmMraCx4MjpBKihjLV8pK3UseTI6RCooYy1fKStofSxzaWxlbnQ6ITAsc3R5bGU6SX0pOyJhdXRvIj09PUkuc3Ryb2tlJiZPLnNldFN0eWxlKHtzdHJva2U6bigoVCtOL3kpL3YpfSksbC5hZGQoTyksdys9U313LT1TfWVsc2Ugdys9Yn19LF9yZW5kZXJQb2ludGVyOmZ1bmN0aW9uKG4sdCxlLG8sYSxpLHIscyl7dmFyIGw9dGhpcy5ncm91cCx1PXRoaXMuX2RhdGE7aWYobi5nZXQoInBvaW50ZXIuc2hvdyIpKXt2YXIgaD1bK24uZ2V0KCJtaW4iKSwrbi5nZXQoIm1heCIpXSxjPVtpLHJdLGQ9bi5nZXREYXRhKCksZj1kLm1hcERpbWVuc2lvbigidmFsdWUiKTtkLmRpZmYodSkuYWRkKGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBPdyh7c2hhcGU6e2FuZ2xlOml9fSk7bGwoZSx7c2hhcGU6e2FuZ2xlOmtsKGQuZ2V0KGYsdCksaCxjLCEwKX19LG4pLGwuYWRkKGUpLGQuc2V0SXRlbUdyYXBoaWNFbCh0LGUpfSkudXBkYXRlKGZ1bmN0aW9uKHQsZSl7dmFyIGk9dS5nZXRJdGVtR3JhcGhpY0VsKGUpO3NsKGkse3NoYXBlOnthbmdsZTprbChkLmdldChmLHQpLGgsYywhMCl9fSxuKSxsLmFkZChpKSxkLnNldEl0ZW1HcmFwaGljRWwodCxpKX0pLnJlbW92ZShmdW5jdGlvbih0KXt2YXIgZT11LmdldEl0ZW1HcmFwaGljRWwodCk7bC5yZW1vdmUoZSl9KS5leGVjdXRlKCksZC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LGUpe3ZhciBpPWQuZ2V0SXRlbU1vZGVsKGUpLG49aS5nZXRNb2RlbCgicG9pbnRlciIpO3Quc2V0U2hhcGUoe3g6YS5jeCx5OmEuY3ksd2lkdGg6UGwobi5nZXQoIndpZHRoIiksYS5yKSxyOlBsKG4uZ2V0KCJsZW5ndGgiKSxhLnIpfSksdC51c2VTdHlsZShpLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSksImF1dG8iPT09dC5zdHlsZS5maWxsJiZ0LnNldFN0eWxlKCJmaWxsIixvKGtsKGQuZ2V0KGYsZSksaCxbMCwxXSwhMCkpKSxZcyh0LGkuZ2V0TW9kZWwoImVtcGhhc2lzLml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpKX0pLHRoaXMuX2RhdGE9ZH1lbHNlIHUmJnUuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCl7bC5yZW1vdmUodCl9KX0sX3JlbmRlclRpdGxlOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9dC5nZXREYXRhKCkscj1hLm1hcERpbWVuc2lvbigidmFsdWUiKSxzPXQuZ2V0TW9kZWwoInRpdGxlIik7aWYocy5nZXQoInNob3ciKSl7dmFyIGw9cy5nZXQoIm9mZnNldENlbnRlciIpLHU9by5jeCtQbChsWzBdLG8uciksaD1vLmN5K1BsKGxbMV0sby5yKSxjPSt0LmdldCgibWluIiksZD0rdC5nZXQoIm1heCIpLGY9bihrbCh0LmdldERhdGEoKS5nZXQociwwKSxbYyxkXSxbMCwxXSwhMCkpO3RoaXMuZ3JvdXAuYWRkKG5ldyBGcih7c2lsZW50OiEwLHN0eWxlOlFzKHt9LHMse3g6dSx5OmgsdGV4dDphLmdldE5hbWUoMCksdGV4dEFsaWduOiJjZW50ZXIiLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUifSx7YXV0b0NvbG9yOmYsZm9yY2VSaWNoOiEwfSl9KSl9fSxfcmVuZGVyRGV0YWlsOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9dC5nZXRNb2RlbCgiZGV0YWlsIikscj0rdC5nZXQoIm1pbiIpLHM9K3QuZ2V0KCJtYXgiKTtpZihhLmdldCgic2hvdyIpKXt2YXIgbD1hLmdldCgib2Zmc2V0Q2VudGVyIiksdT1vLmN4K1BsKGxbMF0sby5yKSxoPW8uY3krUGwobFsxXSxvLnIpLGM9UGwoYS5nZXQoIndpZHRoIiksby5yKSxkPVBsKGEuZ2V0KCJoZWlnaHQiKSxvLnIpLGY9dC5nZXREYXRhKCkscD1mLmdldChmLm1hcERpbWVuc2lvbigidmFsdWUiKSwwKSxnPW4oa2wocCxbcixzXSxbMCwxXSwhMCkpO3RoaXMuZ3JvdXAuYWRkKG5ldyBGcih7c2lsZW50OiEwLHN0eWxlOlFzKHt9LGEse3g6dSx5OmgsdGV4dDpFdyhwLGEuZ2V0KCJmb3JtYXR0ZXIiKSksdGV4dFdpZHRoOmlzTmFOKGMpP251bGw6Yyx0ZXh0SGVpZ2h0OmlzTmFOKGQpP251bGw6ZCx0ZXh0QWxpZ246ImNlbnRlciIsdGV4dFZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LHthdXRvQ29sb3I6Zyxmb3JjZVJpY2g6ITB9KX0pKX19fSksU2Yoe3R5cGU6InNlcmllcy5mdW5uZWwiLGluaXQ6ZnVuY3Rpb24odCl7Uncuc3VwZXJBcHBseSh0aGlzLCJpbml0Iixhcmd1bWVudHMpLHRoaXMubGVnZW5kVmlzdWFsUHJvdmlkZXI9bmV3IEd2KEEodGhpcy5nZXREYXRhLHRoaXMpLEEodGhpcy5nZXRSYXdEYXRhLHRoaXMpKSx0aGlzLl9kZWZhdWx0TGFiZWxMaW5lKHQpfSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiBCdih0aGlzLHtjb29yZERpbWVuc2lvbnM6WyJ2YWx1ZSJdLGVuY29kZURlZmF1bHRlcjpUKFl1LHRoaXMpfSl9LF9kZWZhdWx0TGFiZWxMaW5lOmZ1bmN0aW9uKHQpe3pvKHQsImxhYmVsTGluZSIsWyJzaG93Il0pO3ZhciBlPXQubGFiZWxMaW5lLGk9dC5lbXBoYXNpcy5sYWJlbExpbmU7ZS5zaG93PWUuc2hvdyYmdC5sYWJlbC5zaG93LGkuc2hvdz1pLnNob3cmJnQuZW1waGFzaXMubGFiZWwuc2hvd30sZ2V0RGF0YVBhcmFtczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKSxpPVJ3LnN1cGVyQ2FsbCh0aGlzLCJnZXREYXRhUGFyYW1zIix0KSxuPWUubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLG89ZS5nZXRTdW0obik7cmV0dXJuIGkucGVyY2VudD1vPysoZS5nZXQobix0KS9vKjEwMCkudG9GaXhlZCgyKTowLGkuJHZhcnMucHVzaCgicGVyY2VudCIpLGl9LGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6MixsZWdlbmRIb3Zlckxpbms6ITAsbGVmdDo4MCx0b3A6NjAscmlnaHQ6ODAsYm90dG9tOjYwLG1pblNpemU6IjAlIixtYXhTaXplOiIxMDAlIixzb3J0OiJkZXNjZW5kaW5nIixnYXA6MCxmdW5uZWxBbGlnbjoiY2VudGVyIixsYWJlbDp7c2hvdzohMCxwb3NpdGlvbjoib3V0ZXIifSxsYWJlbExpbmU6e3Nob3c6ITAsbGVuZ3RoOjIwLGxpbmVTdHlsZTp7d2lkdGg6MSx0eXBlOiJzb2xpZCJ9fSxpdGVtU3R5bGU6e2JvcmRlckNvbG9yOiIjZmZmIixib3JkZXJXaWR0aDoxfSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITB9fX19KSk7ZnVuY3Rpb24gQncodCxlKXtJaS5jYWxsKHRoaXMpO3ZhciBpPW5ldyBxcixuPW5ldyBLcixvPW5ldyBGcjt0aGlzLmFkZChpKSx0aGlzLmFkZChuKSx0aGlzLmFkZChvKSx0aGlzLmhpZ2hEb3duT25VcGRhdGU9ZnVuY3Rpb24odCxlKXsiZW1waGFzaXMiPT09ZT8obi5pZ25vcmU9bi5ob3Zlcklnbm9yZSxvLmlnbm9yZT1vLmhvdmVySWdub3JlKToobi5pZ25vcmU9bi5ub3JtYWxJZ25vcmUsby5pZ25vcmU9by5ub3JtYWxJZ25vcmUpfSx0aGlzLnVwZGF0ZURhdGEodCxlLCEwKX12YXIgVnc9QncucHJvdG90eXBlLEd3PVsiaXRlbVN0eWxlIiwib3BhY2l0eSJdO1Z3LnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuY2hpbGRBdCgwKSxvPXQuaG9zdE1vZGVsLGE9dC5nZXRJdGVtTW9kZWwoZSkscj10LmdldEl0ZW1MYXlvdXQoZSkscz10LmdldEl0ZW1Nb2RlbChlKS5nZXQoR3cpO3M9bnVsbD09cz8xOnMsbi51c2VTdHlsZSh7fSksaT8obi5zZXRTaGFwZSh7cG9pbnRzOnIucG9pbnRzfSksbi5zZXRTdHlsZSh7b3BhY2l0eTowfSksbGwobix7c3R5bGU6e29wYWNpdHk6c319LG8sZSkpOnNsKG4se3N0eWxlOntvcGFjaXR5OnN9LHNoYXBlOntwb2ludHM6ci5wb2ludHN9fSxvLGUpO3ZhciBsPWEuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLHU9dC5nZXRJdGVtVmlzdWFsKGUsImNvbG9yIik7bi5zZXRTdHlsZShDKHtsaW5lSm9pbjoicm91bmQiLGZpbGw6dX0sbC5nZXRJdGVtU3R5bGUoWyJvcGFjaXR5Il0pKSksbi5ob3ZlclN0eWxlPWwuZ2V0TW9kZWwoImVtcGhhc2lzIikuZ2V0SXRlbVN0eWxlKCksdGhpcy5fdXBkYXRlTGFiZWwodCxlKSxZcyh0aGlzKX0sVncuX3VwZGF0ZUxhYmVsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jaGlsZEF0KDEpLG49dGhpcy5jaGlsZEF0KDIpLG89dC5ob3N0TW9kZWwsYT10LmdldEl0ZW1Nb2RlbChlKSxyPXQuZ2V0SXRlbUxheW91dChlKS5sYWJlbCxzPXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpO3NsKGkse3NoYXBlOntwb2ludHM6ci5saW5lUG9pbnRzfHxyLmxpbmVQb2ludHN9fSxvLGUpLHNsKG4se3N0eWxlOnt4OnIueCx5OnIueX19LG8sZSksbi5hdHRyKHtyb3RhdGlvbjpyLnJvdGF0aW9uLG9yaWdpbjpbci54LHIueV0sejI6MTB9KTt2YXIgbD1hLmdldE1vZGVsKCJsYWJlbCIpLHU9YS5nZXRNb2RlbCgiZW1waGFzaXMubGFiZWwiKSxoPWEuZ2V0TW9kZWwoImxhYmVsTGluZSIpLGM9YS5nZXRNb2RlbCgiZW1waGFzaXMubGFiZWxMaW5lIik7cz10LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKTskcyhuLnN0eWxlLG4uaG92ZXJTdHlsZT17fSxsLHUse2xhYmVsRmV0Y2hlcjp0Lmhvc3RNb2RlbCxsYWJlbERhdGFJbmRleDplLGRlZmF1bHRUZXh0OnQuZ2V0TmFtZShlKSxhdXRvQ29sb3I6cyx1c2VJbnNpZGVTdHlsZTohIXIuaW5zaWRlfSx7dGV4dEFsaWduOnIudGV4dEFsaWduLHRleHRWZXJ0aWNhbEFsaWduOnIudmVydGljYWxBbGlnbn0pLG4uaWdub3JlPW4ubm9ybWFsSWdub3JlPSFsLmdldCgic2hvdyIpLG4uaG92ZXJJZ25vcmU9IXUuZ2V0KCJzaG93IiksaS5pZ25vcmU9aS5ub3JtYWxJZ25vcmU9IWguZ2V0KCJzaG93IiksaS5ob3Zlcklnbm9yZT0hYy5nZXQoInNob3ciKSxpLnNldFN0eWxlKHtzdHJva2U6c30pLGkuc2V0U3R5bGUoaC5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCkpLGkuaG92ZXJTdHlsZT1jLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKX0sdyhCdyxJaSk7Z2MuZXh0ZW5kKHt0eXBlOiJmdW5uZWwiLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5nZXREYXRhKCksbz10aGlzLl9kYXRhLGE9dGhpcy5ncm91cDtuLmRpZmYobykuYWRkKGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBCdyhuLHQpO24uc2V0SXRlbUdyYXBoaWNFbCh0LGUpLGEuYWRkKGUpfSkudXBkYXRlKGZ1bmN0aW9uKHQsZSl7dmFyIGk9by5nZXRJdGVtR3JhcGhpY0VsKGUpO2kudXBkYXRlRGF0YShuLHQpLGEuYWRkKGkpLG4uc2V0SXRlbUdyYXBoaWNFbCh0LGkpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPW8uZ2V0SXRlbUdyYXBoaWNFbCh0KTthLnJlbW92ZShlKX0pLmV4ZWN1dGUoKSx0aGlzLl9kYXRhPW59LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fZGF0YT1udWxsfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pO3lmKFl2KCJmdW5uZWwiKSksdmYoZnVuY3Rpb24odCx3LGUpe3QuZWFjaFNlcmllc0J5VHlwZSgiZnVubmVsIixmdW5jdGlvbih0KXt2YXIgbz10LmdldERhdGEoKSxhPW8ubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGU9dC5nZXQoInNvcnQiKSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZ1KHQuZ2V0Qm94TGF5b3V0UGFyYW1zKCkse3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0pfSh0LHcpLGk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5tYXBEaW1lbnNpb24oInZhbHVlIiksbj10Lm1hcEFycmF5KGksZnVuY3Rpb24odCl7cmV0dXJuIHR9KSxvPVtdLGE9ImFzY2VuZGluZyI9PT1lLHI9MCxzPXQuY291bnQoKTtyPHM7cisrKW9bcl09cjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9vLnNvcnQoZSk6Im5vbmUiIT09ZSYmby5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGE/blt0XS1uW2VdOm5bZV0tblt0XX0pLG99KG8sZSkscz1bUGwodC5nZXQoIm1pblNpemUiKSxyLndpZHRoKSxQbCh0LmdldCgibWF4U2l6ZSIpLHIud2lkdGgpXSxuPW8uZ2V0RGF0YUV4dGVudChhKSxsPXQuZ2V0KCJtaW4iKSx1PXQuZ2V0KCJtYXgiKTtudWxsPT1sJiYobD1NYXRoLm1pbihuWzBdLDApKSxudWxsPT11JiYodT1uWzFdKTtmdW5jdGlvbiBoKHQsZSl7dmFyIGksbj1rbChvLmdldChhLHQpfHwwLFtsLHVdLHMsITApO3N3aXRjaChjKXtjYXNlImxlZnQiOmk9ci54O2JyZWFrO2Nhc2UiY2VudGVyIjppPXIueCsoci53aWR0aC1uKS8yO2JyZWFrO2Nhc2UicmlnaHQiOmk9ci54K3Iud2lkdGgtbn1yZXR1cm5bW2ksZV0sW2krbixlXV19dmFyIGM9dC5nZXQoImZ1bm5lbEFsaWduIiksZD10LmdldCgiZ2FwIiksZj0oci5oZWlnaHQtZCooby5jb3VudCgpLTEpKS9vLmNvdW50KCkscD1yLnk7ImFzY2VuZGluZyI9PT1lJiYoZj0tZixkPS1kLHArPXIuaGVpZ2h0LGk9aS5yZXZlcnNlKCkpO2Zvcih2YXIgZz0wO2c8aS5sZW5ndGg7ZysrKXt2YXIgbT1pW2ddLHY9aVtnKzFdLHk9by5nZXRJdGVtTW9kZWwobSkuZ2V0KCJpdGVtU3R5bGUuaGVpZ2h0Iik7bnVsbD09eT95PWY6KHk9UGwoeSxyLmhlaWdodCksImFzY2VuZGluZyI9PT1lJiYoeT0teSkpO3ZhciB4PWgobSxwKSxfPWgodixwK3kpO3ArPXkrZCxvLnNldEl0ZW1MYXlvdXQobSx7cG9pbnRzOnguY29uY2F0KF8uc2xpY2UoKS5yZXZlcnNlKCkpfSl9IWZ1bmN0aW9uKGcpe2cuZWFjaChmdW5jdGlvbih0KXt2YXIgZSxpLG4sbyxhPWcuZ2V0SXRlbU1vZGVsKHQpLHI9YS5nZXRNb2RlbCgibGFiZWwiKS5nZXQoInBvc2l0aW9uIikscz1hLmdldE1vZGVsKCJsYWJlbExpbmUiKSxsPWcuZ2V0SXRlbUxheW91dCh0KSx1PWwucG9pbnRzLGg9ImlubmVyIj09PXJ8fCJpbnNpZGUiPT09cnx8ImNlbnRlciI9PT1yfHwiaW5zaWRlTGVmdCI9PT1yfHwiaW5zaWRlUmlnaHQiPT09cjtpZihoKWU9Imluc2lkZUxlZnQiPT09cj8oaT0odVswXVswXSt1WzNdWzBdKS8yKzUsbj0odVswXVsxXSt1WzNdWzFdKS8yLCJsZWZ0Iik6Imluc2lkZVJpZ2h0Ij09PXI/KGk9KHVbMV1bMF0rdVsyXVswXSkvMi01LG49KHVbMV1bMV0rdVsyXVsxXSkvMiwicmlnaHQiKTooaT0odVswXVswXSt1WzFdWzBdK3VbMl1bMF0rdVszXVswXSkvNCxuPSh1WzBdWzFdK3VbMV1bMV0rdVsyXVsxXSt1WzNdWzFdKS80LCJjZW50ZXIiKSxvPVtbaSxuXSxbaSxuXV07ZWxzZXt2YXIgYyxkLGYscD1zLmdldCgibGVuZ3RoIik7ZT0ibGVmdCI9PT1yPyhjPSh1WzNdWzBdK3VbMF1bMF0pLzIsZD0odVszXVsxXSt1WzBdWzFdKS8yLGk9KGY9Yy1wKS01LCJyaWdodCIpOiJyaWdodCI9PT1yPyhjPSh1WzFdWzBdK3VbMl1bMF0pLzIsZD0odVsxXVsxXSt1WzJdWzFdKS8yLGk9KGY9YytwKSs1LCJsZWZ0Iik6InJpZ2h0VG9wIj09PXI/KGM9dVsxXVswXSxkPXVbMV1bMV0saT0oZj1jK3ApKzUsInRvcCIpOiJyaWdodEJvdHRvbSI9PT1yPyhjPXVbMl1bMF0sZD11WzJdWzFdLGk9KGY9YytwKSs1LCJib3R0b20iKToibGVmdFRvcCI9PT1yPyhjPXVbMF1bMF0sZD11WzFdWzFdLGk9KGY9Yy1wKS01LCJyaWdodCIpOiJsZWZ0Qm90dG9tIj09PXI/KGM9dVszXVswXSxkPXVbMl1bMV0saT0oZj1jLXApLTUsInJpZ2h0Iik6KGM9KHVbMV1bMF0rdVsyXVswXSkvMixkPSh1WzFdWzFdK3VbMl1bMV0pLzIsaT0oZj1jK3ApKzUsImxlZnQiKTtvPVtbYyxkXSxbZixkXV0sbj1kfWwubGFiZWw9e2xpbmVQb2ludHM6byx4OmkseTpuLHZlcnRpY2FsQWxpZ246Im1pZGRsZSIsdGV4dEFsaWduOmUsaW5zaWRlOmh9fSl9KG8pfSl9KSxwZih0eSgiZnVubmVsIikpO2Z1bmN0aW9uIEZ3KHQsZSxpLG4sbyl7RWcuY2FsbCh0aGlzLHQsZSxpKSx0aGlzLnR5cGU9bnx8InZhbHVlIix0aGlzLmF4aXNJbmRleD1vfUZ3LnByb3RvdHlwZT17Y29uc3RydWN0b3I6RncsbW9kZWw6bnVsbCxpc0hvcml6b250YWw6ZnVuY3Rpb24oKXtyZXR1cm4iaG9yaXpvbnRhbCIhPT10aGlzLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0TW9kZWwoKS5nZXQoImxheW91dCIpfX0sdyhGdyxFZyk7ZnVuY3Rpb24gV3codCxlLGksbixvLGEpe3Q9dHx8MDt2YXIgcj1pWzFdLWlbMF07aWYobnVsbCE9byYmKG89WncobyxbMCxyXSkpLG51bGwhPWEmJihhPU1hdGgubWF4KGEsbnVsbCE9bz9vOjApKSwiYWxsIj09PW4pe3ZhciBzPU1hdGguYWJzKGVbMV0tZVswXSk7bz1hPVp3KHM9WncocyxbMCxyXSksW28sYV0pLG49MH1lWzBdPVp3KGVbMF0saSksZVsxXT1adyhlWzFdLGkpO3ZhciBsPUh3KGUsbik7ZVtuXSs9dDt2YXIgdT1vfHwwLGg9aS5zbGljZSgpO2wuc2lnbjwwP2hbMF0rPXU6aFsxXS09dSxlW25dPVp3KGVbbl0saCk7dmFyIGM9SHcoZSxuKTtyZXR1cm4gbnVsbCE9byYmKGMuc2lnbiE9PWwuc2lnbnx8Yy5zcGFuPG8pJiYoZVsxLW5dPWVbbl0rbC5zaWduKm8pLGM9SHcoZSxuKSxudWxsIT1hJiZjLnNwYW4+YSYmKGVbMS1uXT1lW25dK2Muc2lnbiphKSxlfWZ1bmN0aW9uIEh3KHQsZSl7dmFyIGk9dFtlXS10WzEtZV07cmV0dXJue3NwYW46TWF0aC5hYnMoaSksc2lnbjowPGk/LTE6aTwwPzE6ZT8tMToxfX1mdW5jdGlvbiBadyh0LGUpe3JldHVybiBNYXRoLm1pbihudWxsIT1lWzFdP2VbMV06MS8wLE1hdGgubWF4KG51bGwhPWVbMF0/ZVswXTotMS8wLHQpKX12YXIgVXc9RSxYdz1NYXRoLm1pbixZdz1NYXRoLm1heCxqdz1NYXRoLmZsb29yLHF3PU1hdGguY2VpbCxLdz1ObCwkdz1NYXRoLlBJO2Z1bmN0aW9uIEp3KHQsZSxpKXt0aGlzLl9heGVzTWFwPVEoKSx0aGlzLl9heGVzTGF5b3V0PXt9LHRoaXMuZGltZW5zaW9ucz10LmRpbWVuc2lvbnMsdGhpcy5fcmVjdCx0aGlzLl9tb2RlbD10LHRoaXMuX2luaXQodCxlLGkpfWZ1bmN0aW9uIFF3KHQsZSl7cmV0dXJuIFh3KFl3KHQsZVswXSksZVsxXSl9SncucHJvdG90eXBlPXt0eXBlOiJwYXJhbGxlbCIsY29uc3RydWN0b3I6SncsX2luaXQ6ZnVuY3Rpb24odCxyLGUpe3ZhciBpPXQuZGltZW5zaW9ucyxzPXQucGFyYWxsZWxBeGlzSW5kZXg7VXcoaSxmdW5jdGlvbih0LGUpe3ZhciBpPXNbZV0sbj1yLmdldENvbXBvbmVudCgicGFyYWxsZWxBeGlzIixpKSxvPXRoaXMuX2F4ZXNNYXAuc2V0KHQsbmV3IEZ3KHQsaWcobiksWzAsMF0sbi5nZXQoInR5cGUiKSxpKSksYT0iY2F0ZWdvcnkiPT09by50eXBlO28ub25CYW5kPWEmJm4uZ2V0KCJib3VuZGFyeUdhcCIpLG8uaW52ZXJzZT1uLmdldCgiaW52ZXJzZSIpLChuLmF4aXM9bykubW9kZWw9bixvLmNvb3JkaW5hdGVTeXN0ZW09bi5jb29yZGluYXRlU3lzdGVtPXRoaXN9LHRoaXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXt0aGlzLl91cGRhdGVBeGVzRnJvbVNlcmllcyh0aGlzLl9tb2RlbCx0KX0sY29udGFpblBvaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21ha2VMYXlvdXRJbmZvKCksaT1lLmF4aXNCYXNlLG49ZS5sYXlvdXRCYXNlLG89ZS5waXhlbERpbUluZGV4LGE9dFsxLW9dLHI9dFtvXTtyZXR1cm4gaTw9YSYmYTw9aStlLmF4aXNMZW5ndGgmJm48PXImJnI8PW4rZS5sYXlvdXRMZW5ndGh9LGdldE1vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGVsfSxfdXBkYXRlQXhlc0Zyb21TZXJpZXM6ZnVuY3Rpb24oZSxuKXtuLmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7aWYoZS5jb250YWlucyh0LG4pKXt2YXIgaT10LmdldERhdGEoKTtVdyh0aGlzLmRpbWVuc2lvbnMsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYXhlc01hcC5nZXQodCk7ZS5zY2FsZS51bmlvbkV4dGVudEZyb21EYXRhKGksaS5tYXBEaW1lbnNpb24odCkpLGVnKGUuc2NhbGUsZS5tb2RlbCl9LHRoaXMpfX0sdGhpcyl9LHJlc2l6ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3JlY3Q9dnUodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSksdGhpcy5fbGF5b3V0QXhlcygpfSxnZXRSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3R9LF9tYWtlTGF5b3V0SW5mbzpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fbW9kZWwsaT10aGlzLl9yZWN0LG49WyJ4IiwieSJdLG89WyJ3aWR0aCIsImhlaWdodCJdLGE9ZS5nZXQoImxheW91dCIpLHI9Imhvcml6b250YWwiPT09YT8wOjEscz1pW29bcl1dLGw9WzAsc10sdT10aGlzLmRpbWVuc2lvbnMubGVuZ3RoLGg9UXcoZS5nZXQoImF4aXNFeHBhbmRXaWR0aCIpLGwpLGM9UXcoZS5nZXQoImF4aXNFeHBhbmRDb3VudCIpfHwwLFswLHVdKSxkPWUuZ2V0KCJheGlzRXhwYW5kYWJsZSIpJiYzPHUmJmM8dSYmMTxjJiYwPGgmJjA8cyxmPWUuZ2V0KCJheGlzRXhwYW5kV2luZG93Iik7Zj8odD1RdyhmWzFdLWZbMF0sbCksZlsxXT1mWzBdK3QpOih0PVF3KGgqKGMtMSksbCksKGY9W2gqKGUuZ2V0KCJheGlzRXhwYW5kQ2VudGVyIil8fGp3KHUvMikpLXQvMl0pWzFdPWZbMF0rdCk7dmFyIHA9KHMtdCkvKHUtYyk7cDwzJiYocD0wKTt2YXIgZz1bancoS3coZlswXS9oLDEpKSsxLHF3KEt3KGZbMV0vaCwxKSktMV0sbT1wL2gqZlswXTtyZXR1cm57bGF5b3V0OmEscGl4ZWxEaW1JbmRleDpyLGxheW91dEJhc2U6aVtuW3JdXSxsYXlvdXRMZW5ndGg6cyxheGlzQmFzZTppW25bMS1yXV0sYXhpc0xlbmd0aDppW29bMS1yXV0sYXhpc0V4cGFuZGFibGU6ZCxheGlzRXhwYW5kV2lkdGg6aCxheGlzQ29sbGFwc2VXaWR0aDpwLGF4aXNFeHBhbmRXaW5kb3c6ZixheGlzQ291bnQ6dSx3aW5Jbm5lckluZGljZXM6ZyxheGlzRXhwYW5kV2luZG93MFBvczptfX0sX2xheW91dEF4ZXM6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLl9yZWN0LHQ9dGhpcy5fYXhlc01hcCxlPXRoaXMuZGltZW5zaW9ucyx1PXRoaXMuX21ha2VMYXlvdXRJbmZvKCksaD11LmxheW91dDt0LmVhY2goZnVuY3Rpb24odCl7dmFyIGU9WzAsdS5heGlzTGVuZ3RoXSxpPXQuaW52ZXJzZT8xOjA7dC5zZXRFeHRlbnQoZVtpXSxlWzEtaV0pfSksVXcoZSxmdW5jdGlvbih0LGUpe3ZhciBpPSh1LmF4aXNFeHBhbmRhYmxlP2Z1bmN0aW9uKHQsZSl7dmFyIGksbixvPWUubGF5b3V0TGVuZ3RoLGE9ZS5heGlzRXhwYW5kV2lkdGgscj1lLmF4aXNDb3VudCxzPWUuYXhpc0NvbGxhcHNlV2lkdGgsbD1lLndpbklubmVySW5kaWNlcyx1PXMsaD0hMTt0PGxbMF0/KGk9dCpzLG49cyk6dDw9bFsxXT8oaT1lLmF4aXNFeHBhbmRXaW5kb3cwUG9zK3QqYS1lLmF4aXNFeHBhbmRXaW5kb3dbMF0sdT1hLGg9ITApOihpPW8tKHItMS10KSpzLG49cyk7cmV0dXJue3Bvc2l0aW9uOmksYXhpc05hbWVBdmFpbGFibGVXaWR0aDp1LGF4aXNMYWJlbFNob3c6aCxuYW1lVHJ1bmNhdGVNYXhXaWR0aDpufX06ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmxheW91dExlbmd0aC8oZS5heGlzQ291bnQtMSk7cmV0dXJue3Bvc2l0aW9uOmkqdCxheGlzTmFtZUF2YWlsYWJsZVdpZHRoOmksYXhpc0xhYmVsU2hvdzohMH19KShlLHUpLG49e2hvcml6b250YWw6e3g6aS5wb3NpdGlvbix5OnUuYXhpc0xlbmd0aH0sdmVydGljYWw6e3g6MCx5OmkucG9zaXRpb259fSxvPXtob3Jpem9udGFsOiR3LzIsdmVydGljYWw6MH0sYT1bbltoXS54K2wueCxuW2hdLnkrbC55XSxyPW9baF0scz1lZSgpO3JlKHMscyxyKSxhZShzLHMsYSksdGhpcy5fYXhlc0xheW91dFt0XT17cG9zaXRpb246YSxyb3RhdGlvbjpyLHRyYW5zZm9ybTpzLGF4aXNOYW1lQXZhaWxhYmxlV2lkdGg6aS5heGlzTmFtZUF2YWlsYWJsZVdpZHRoLGF4aXNMYWJlbFNob3c6aS5heGlzTGFiZWxTaG93LG5hbWVUcnVuY2F0ZU1heFdpZHRoOmkubmFtZVRydW5jYXRlTWF4V2lkdGgsdGlja0RpcmVjdGlvbjoxLGxhYmVsRGlyZWN0aW9uOjF9fSx0aGlzKX0sZ2V0QXhpczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXhlc01hcC5nZXQodCl9LGRhdGFUb1BvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYXhpc0Nvb3JkVG9Qb2ludCh0aGlzLl9heGVzTWFwLmdldChlKS5kYXRhVG9Db29yZCh0KSxlKX0sZWFjaEFjdGl2ZVN0YXRlOmZ1bmN0aW9uKGUsdCxpLG4pe251bGw9PWkmJihpPTApLG51bGw9PW4mJihuPWUuY291bnQoKSk7dmFyIG89dGhpcy5fYXhlc01hcCxhPXRoaXMuZGltZW5zaW9ucyxyPVtdLHM9W107RShhLGZ1bmN0aW9uKHQpe3IucHVzaChlLm1hcERpbWVuc2lvbih0KSkscy5wdXNoKG8uZ2V0KHQpLm1vZGVsKX0pO2Zvcih2YXIgbD10aGlzLmhhc0F4aXNCcnVzaGVkKCksdT1pO3U8bjt1Kyspe3ZhciBoO2lmKGwpe2g9ImFjdGl2ZSI7Zm9yKHZhciBjPWUuZ2V0VmFsdWVzKHIsdSksZD0wLGY9YS5sZW5ndGg7ZDxmO2QrKyl7aWYoImluYWN0aXZlIj09PXNbZF0uZ2V0QWN0aXZlU3RhdGUoY1tkXSkpe2g9ImluYWN0aXZlIjticmVha319fWVsc2UgaD0ibm9ybWFsIjt0KGgsdSl9fSxoYXNBeGlzQnJ1c2hlZDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmRpbWVuc2lvbnMsZT10aGlzLl9heGVzTWFwLGk9ITEsbj0wLG89dC5sZW5ndGg7bjxvO24rKykibm9ybWFsIiE9PWUuZ2V0KHRbbl0pLm1vZGVsLmdldEFjdGl2ZVN0YXRlKCkmJihpPSEwKTtyZXR1cm4gaX0sYXhpc0Nvb3JkVG9Qb2ludDpmdW5jdGlvbih0LGUpe3JldHVybiBobChbdCwwXSx0aGlzLl9heGVzTGF5b3V0W2VdLnRyYW5zZm9ybSl9LGdldEF4aXNMYXlvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIEQodGhpcy5fYXhlc0xheW91dFt0XSl9LGdldFNsaWRlZEF4aXNFeHBhbmRXaW5kb3c6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFrZUxheW91dEluZm8oKSxpPWUucGl4ZWxEaW1JbmRleCxuPWUuYXhpc0V4cGFuZFdpbmRvdy5zbGljZSgpLG89blsxXS1uWzBdLGE9WzAsZS5heGlzRXhwYW5kV2lkdGgqKGUuYXhpc0NvdW50LTEpXTtpZighdGhpcy5jb250YWluUG9pbnQodCkpcmV0dXJue2JlaGF2aW9yOiJub25lIixheGlzRXhwYW5kV2luZG93Om59O3ZhciByLHM9dFtpXS1lLmxheW91dEJhc2UtZS5heGlzRXhwYW5kV2luZG93MFBvcyxsPSJzbGlkZSIsdT1lLmF4aXNDb2xsYXBzZVdpZHRoLGg9dGhpcy5fbW9kZWwuZ2V0KCJheGlzRXhwYW5kU2xpZGVUcmlnZ2VyQXJlYSIpLGM9bnVsbCE9aFswXTtpZih1KWMmJnUmJnM8bypoWzBdPyhsPSJqdW1wIixyPXMtbypoWzJdKTpjJiZ1JiZzPm8qKDEtaFswXSk/KGw9Imp1bXAiLHI9cy1vKigxLWhbMl0pKTowPD0ocj1zLW8qaFsxXSkmJihyPXMtbyooMS1oWzFdKSk8PTAmJihyPTApLChyKj1lLmF4aXNFeHBhbmRXaWR0aC91KT9XdyhyLG4sYSwiYWxsIik6bD0ibm9uZSI7ZWxzZXtvPW5bMV0tblswXTsobj1bWXcoMCxhWzFdKnMvby1vLzIpXSlbMV09WHcoYVsxXSxuWzBdK28pLG5bMF09blsxXS1vfXJldHVybntheGlzRXhwYW5kV2luZG93Om4sYmVoYXZpb3I6bH19fSxuaC5yZWdpc3RlcigicGFyYWxsZWwiLHtjcmVhdGU6ZnVuY3Rpb24obixvKXt2YXIgYT1bXTtyZXR1cm4gbi5lYWNoQ29tcG9uZW50KCJwYXJhbGxlbCIsZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgSncodCxuLG8pO2kubmFtZT0icGFyYWxsZWxfIitlLGkucmVzaXplKHQsbyksKHQuY29vcmRpbmF0ZVN5c3RlbT1pKS5tb2RlbD10LGEucHVzaChpKX0pLG4uZWFjaFNlcmllcyhmdW5jdGlvbih0KXtpZigicGFyYWxsZWwiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSl7dmFyIGU9bi5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJwYXJhbGxlbCIsaW5kZXg6dC5nZXQoInBhcmFsbGVsSW5kZXgiKSxpZDp0LmdldCgicGFyYWxsZWxJZCIpfSlbMF07dC5jb29yZGluYXRlU3lzdGVtPWUuY29vcmRpbmF0ZVN5c3RlbX19KSxhfX0pO3ZhciB0Yj1UdS5leHRlbmQoe3R5cGU6ImJhc2VQYXJhbGxlbEF4aXMiLGF4aXM6bnVsbCxhY3RpdmVJbnRlcnZhbHM6W10sZ2V0QXJlYVNlbGVjdFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJuIHJhKFtbImZpbGwiLCJjb2xvciJdLFsibGluZVdpZHRoIiwiYm9yZGVyV2lkdGgiXSxbInN0cm9rZSIsImJvcmRlckNvbG9yIl0sWyJ3aWR0aCIsIndpZHRoIl0sWyJvcGFjaXR5Iiwib3BhY2l0eSJdXSkodGhpcy5nZXRNb2RlbCgiYXJlYVNlbGVjdFN0eWxlIikpfSxzZXRBY3RpdmVJbnRlcnZhbHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hY3RpdmVJbnRlcnZhbHM9RCh0KTtpZihlKWZvcih2YXIgaT1lLmxlbmd0aC0xOzA8PWk7aS0tKU9sKGVbaV0pfSxnZXRBY3RpdmVTdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmFjdGl2ZUludGVydmFscztpZighZS5sZW5ndGgpcmV0dXJuIm5vcm1hbCI7aWYobnVsbD09dHx8aXNOYU4odCkpcmV0dXJuImluYWN0aXZlIjtpZigxPT09ZS5sZW5ndGgpe3ZhciBpPWVbMF07aWYoaVswXTw9dCYmdDw9aVsxXSlyZXR1cm4iYWN0aXZlIn1lbHNlIGZvcih2YXIgbj0wLG89ZS5sZW5ndGg7bjxvO24rKylpZihlW25dWzBdPD10JiZ0PD1lW25dWzFdKXJldHVybiJhY3RpdmUiO3JldHVybiJpbmFjdGl2ZSJ9fSk7bSh0Yi5wcm90b3R5cGUsc2cpLE9tKCJwYXJhbGxlbCIsdGIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS50eXBlfHwoZS5kYXRhPyJjYXRlZ29yeSI6InZhbHVlIil9LHt0eXBlOiJ2YWx1ZSIsZGltOm51bGwsYXJlYVNlbGVjdFN0eWxlOnt3aWR0aDoyMCxib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiJyZ2JhKDE2MCwxOTcsMjMyKSIsY29sb3I6InJnYmEoMTYwLDE5NywyMzIpIixvcGFjaXR5Oi4zfSxyZWFsdGltZTohMCx6OjEwfSksVHUuZXh0ZW5kKHt0eXBlOiJwYXJhbGxlbCIsZGVwZW5kZW5jaWVzOlsicGFyYWxsZWxBeGlzIl0sY29vcmRpbmF0ZVN5c3RlbTpudWxsLGRpbWVuc2lvbnM6bnVsbCxwYXJhbGxlbEF4aXNJbmRleDpudWxsLGxheW91dE1vZGU6ImJveCIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejowLGxlZnQ6ODAsdG9wOjYwLHJpZ2h0OjgwLGJvdHRvbTo2MCxsYXlvdXQ6Imhvcml6b250YWwiLGF4aXNFeHBhbmRhYmxlOiExLGF4aXNFeHBhbmRDZW50ZXI6bnVsbCxheGlzRXhwYW5kQ291bnQ6MCxheGlzRXhwYW5kV2lkdGg6NTAsYXhpc0V4cGFuZFJhdGU6MTcsYXhpc0V4cGFuZERlYm91bmNlOjUwLGF4aXNFeHBhbmRTbGlkZVRyaWdnZXJBcmVhOlstLjE1LC4wNSwuNF0sYXhpc0V4cGFuZFRyaWdnZXJPbjoiY2xpY2siLHBhcmFsbGVsQXhpc0RlZmF1bHQ6bnVsbH0saW5pdDpmdW5jdGlvbigpe1R1LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLm1lcmdlT3B0aW9uKHt9KX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb247dCYmbShlLHQsITApLHRoaXMuX2luaXREaW1lbnNpb25zKCl9LGNvbnRhaW5zOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXQoInBhcmFsbGVsSW5kZXgiKTtyZXR1cm4gbnVsbCE9aSYmZS5nZXRDb21wb25lbnQoInBhcmFsbGVsIixpKT09PXRoaXN9LHNldEF4aXNFeHBhbmQ6ZnVuY3Rpb24oZSl7RShbImF4aXNFeHBhbmRhYmxlIiwiYXhpc0V4cGFuZENlbnRlciIsImF4aXNFeHBhbmRDb3VudCIsImF4aXNFeHBhbmRXaWR0aCIsImF4aXNFeHBhbmRXaW5kb3ciXSxmdW5jdGlvbih0KXtlLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5vcHRpb25bdF09ZVt0XSl9LHRoaXMpfSxfaW5pdERpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRpbWVuc2lvbnM9W10saT10aGlzLnBhcmFsbGVsQXhpc0luZGV4PVtdO0UoTSh0aGlzLmRlcGVuZGVudE1vZGVscy5wYXJhbGxlbEF4aXMsZnVuY3Rpb24odCl7cmV0dXJuKHQuZ2V0KCJwYXJhbGxlbEluZGV4Iil8fDApPT09dGhpcy5jb21wb25lbnRJbmRleH0sdGhpcyksZnVuY3Rpb24odCl7ZS5wdXNoKCJkaW0iK3QuZ2V0KCJkaW0iKSksaS5wdXNoKHQuY29tcG9uZW50SW5kZXgpfSl9fSk7Z2Yoe3R5cGU6ImF4aXNBcmVhU2VsZWN0IixldmVudDoiYXhpc0FyZWFTZWxlY3RlZCJ9LGZ1bmN0aW9uKGUsdCl7dC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToicGFyYWxsZWxBeGlzIixxdWVyeTplfSxmdW5jdGlvbih0KXt0LmF4aXMubW9kZWwuc2V0QWN0aXZlSW50ZXJ2YWxzKGUuaW50ZXJ2YWxzKX0pfSksZ2YoInBhcmFsbGVsQXhpc0V4cGFuZCIsZnVuY3Rpb24oZSx0KXt0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJwYXJhbGxlbCIscXVlcnk6ZX0sZnVuY3Rpb24odCl7dC5zZXRBeGlzRXhwYW5kKGUpfSl9KTt2YXIgZWI9VCxpYj1FLG5iPU4sb2I9TWF0aC5taW4sYWI9TWF0aC5tYXgscmI9TWF0aC5wb3csc2I9MWU0LGxiPTYsdWI9NixoYj0iZ2xvYmFsUGFuIixjYj17dzpbMCwwXSxlOlswLDFdLG46WzEsMF0sczpbMSwxXX0sZGI9e3c6ImV3IixlOiJldyIsbjoibnMiLHM6Im5zIixuZToibmVzdyIsc3c6Im5lc3ciLG53OiJud3NlIixzZToibndzZSJ9LGZiPXticnVzaFN0eWxlOntsaW5lV2lkdGg6MixzdHJva2U6InJnYmEoMCwwLDAsMC4zKSIsZmlsbDoicmdiYSgwLDAsMCwwLjEpIn0sdHJhbnNmb3JtYWJsZTohMCxicnVzaE1vZGU6InNpbmdsZSIscmVtb3ZlT25DbGljazohMX0scGI9MDtmdW5jdGlvbiBnYih0KXtDdC5jYWxsKHRoaXMpLHRoaXMuX3pyPXQsdGhpcy5ncm91cD1uZXcgSWksdGhpcy5fYnJ1c2hUeXBlLHRoaXMuX2JydXNoT3B0aW9uLHRoaXMuX3BhbmVscyx0aGlzLl90cmFjaz1bXSx0aGlzLl9kcmFnZ2luZyx0aGlzLl9jb3ZlcnM9W10sdGhpcy5fY3JlYXRpbmdDb3Zlcix0aGlzLl9jcmVhdGluZ1BhbmVsLHRoaXMuX2VuYWJsZUdsb2JhbFBhbix0aGlzLl91aWQ9ImJydXNoQ29udHJvbGxlcl8iK3BiKyssdGhpcy5faGFuZGxlcnM9e30saWIoRmIsZnVuY3Rpb24odCxlKXt0aGlzLl9oYW5kbGVyc1tlXT1BKHQsdGhpcyl9LHRoaXMpfWZ1bmN0aW9uIG1iKHQsZSl7dmFyIGk9SGJbZS5icnVzaFR5cGVdLmNyZWF0ZUNvdmVyKHQsZSk7cmV0dXJuIGkuX19icnVzaE9wdGlvbj1lLHhiKGksZSksdC5ncm91cC5hZGQoaSksaX1mdW5jdGlvbiB2Yih0LGUpe3ZhciBpPXdiKGUpO3JldHVybiBpLmVuZENyZWF0aW5nJiYoaS5lbmRDcmVhdGluZyh0LGUpLHhiKGUsZS5fX2JydXNoT3B0aW9uKSksZX1mdW5jdGlvbiB5Yih0LGUpe3ZhciBpPWUuX19icnVzaE9wdGlvbjt3YihlKS51cGRhdGVDb3ZlclNoYXBlKHQsZSxpLnJhbmdlLGkpfWZ1bmN0aW9uIHhiKHQsZSl7dmFyIGk9ZS56O251bGw9PWkmJihpPXNiKSx0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3Quej1pLHQuejI9aX0pfWZ1bmN0aW9uIF9iKHQsZSl7d2IoZSkudXBkYXRlQ29tbW9uKHQsZSkseWIodCxlKX1mdW5jdGlvbiB3Yih0KXtyZXR1cm4gSGJbdC5fX2JydXNoT3B0aW9uLmJydXNoVHlwZV19ZnVuY3Rpb24gYmIodCxlLGkpe3ZhciBuLG89dC5fcGFuZWxzO2lmKCFvKXJldHVybiEwO3ZhciBhPXQuX3RyYW5zZm9ybTtyZXR1cm4gaWIobyxmdW5jdGlvbih0KXt0LmlzVGFyZ2V0QnlDdXJzb3IoZSxpLGEpJiYobj10KX0pLG59ZnVuY3Rpb24gU2IodCxlKXt2YXIgaT10Ll9wYW5lbHM7aWYoIWkpcmV0dXJuITA7dmFyIG49ZS5fX2JydXNoT3B0aW9uLnBhbmVsSWQ7cmV0dXJuIG51bGw9PW58fGlbbl19ZnVuY3Rpb24gTWIoZSl7dmFyIHQ9ZS5fY292ZXJzLGk9dC5sZW5ndGg7cmV0dXJuIGliKHQsZnVuY3Rpb24odCl7ZS5ncm91cC5yZW1vdmUodCl9LGUpLHQubGVuZ3RoPTAsISFpfWZ1bmN0aW9uIEliKHQsZSl7dmFyIGk9bmIodC5fY292ZXJzLGZ1bmN0aW9uKHQpe3ZhciBlPXQuX19icnVzaE9wdGlvbixpPUQoZS5yYW5nZSk7cmV0dXJue2JydXNoVHlwZTplLmJydXNoVHlwZSxwYW5lbElkOmUucGFuZWxJZCxyYW5nZTppfX0pO3QudHJpZ2dlcigiYnJ1c2giLGkse2lzRW5kOiEhZS5pc0VuZCxyZW1vdmVPbkNsaWNrOiEhZS5yZW1vdmVPbkNsaWNrfSl9ZnVuY3Rpb24gVGIodCl7dmFyIGU9dC5sZW5ndGgtMTtyZXR1cm4gZTwwJiYoZT0wKSxbdFswXSx0W2VdXX1mdW5jdGlvbiBBYihlLGksdCxuKXt2YXIgbz1uZXcgSWk7cmV0dXJuIG8uYWRkKG5ldyBpcyh7bmFtZToibWFpbiIsc3R5bGU6a2IodCksc2lsZW50OiEwLGRyYWdnYWJsZTohMCxjdXJzb3I6Im1vdmUiLGRyaWZ0OmViKGUsaSxvLCJuc3dlIiksb25kcmFnZW5kOmViKEliLGkse2lzRW5kOiEwfSl9KSksaWIobixmdW5jdGlvbih0KXtvLmFkZChuZXcgaXMoe25hbWU6dCxzdHlsZTp7b3BhY2l0eTowfSxkcmFnZ2FibGU6ITAsc2lsZW50OiEwLGludmlzaWJsZTohMCxkcmlmdDplYihlLGksbyx0KSxvbmRyYWdlbmQ6ZWIoSWIsaSx7aXNFbmQ6ITB9KX0pKX0pLG99ZnVuY3Rpb24gRGIodCxlLGksbil7dmFyIG89bi5icnVzaFN0eWxlLmxpbmVXaWR0aHx8MCxhPWFiKG8sdWIpLHI9aVswXVswXSxzPWlbMV1bMF0sbD1yLW8vMix1PXMtby8yLGg9aVswXVsxXSxjPWlbMV1bMV0sZD1oLWErby8yLGY9Yy1hK28vMixwPWgtcixnPWMtcyxtPXArbyx2PWcrbztMYih0LGUsIm1haW4iLHIscyxwLGcpLG4udHJhbnNmb3JtYWJsZSYmKExiKHQsZSwidyIsbCx1LGEsdiksTGIodCxlLCJlIixkLHUsYSx2KSxMYih0LGUsIm4iLGwsdSxtLGEpLExiKHQsZSwicyIsbCxmLG0sYSksTGIodCxlLCJudyIsbCx1LGEsYSksTGIodCxlLCJuZSIsZCx1LGEsYSksTGIodCxlLCJzdyIsbCxmLGEsYSksTGIodCxlLCJzZSIsZCxmLGEsYSkpfWZ1bmN0aW9uIENiKG4sbyl7dmFyIHQ9by5fX2JydXNoT3B0aW9uLGE9dC50cmFuc2Zvcm1hYmxlLGU9by5jaGlsZEF0KDApO2UudXNlU3R5bGUoa2IodCkpLGUuYXR0cih7c2lsZW50OiFhLGN1cnNvcjphPyJtb3ZlIjoiZGVmYXVsdCJ9KSxpYihbInciLCJlIiwibiIsInMiLCJzZSIsInN3IiwibmUiLCJudyJdLGZ1bmN0aW9uKHQpe3ZhciBlPW8uY2hpbGRPZk5hbWUodCksaT1mdW5jdGlvbiB0KGUsaSl7e2lmKDE8aS5sZW5ndGgpe2k9aS5zcGxpdCgiIik7dmFyIG49W3QoZSxpWzBdKSx0KGUsaVsxXSldO3JldHVybiJlIiE9PW5bMF0mJiJ3IiE9PW5bMF18fG4ucmV2ZXJzZSgpLG4uam9pbigiIil9dmFyIG89e3c6ImxlZnQiLGU6InJpZ2h0IixuOiJ0b3AiLHM6ImJvdHRvbSJ9LGE9e2xlZnQ6InciLHJpZ2h0OiJlIix0b3A6Im4iLGJvdHRvbToicyJ9LG49Y2wob1tpXSx1bChlLmdyb3VwKSk7cmV0dXJuIGFbbl19fShuLHQpO2UmJmUuYXR0cih7c2lsZW50OiFhLGludmlzaWJsZTohYSxjdXJzb3I6YT9kYltpXSsiLXJlc2l6ZSI6bnVsbH0pfSl9ZnVuY3Rpb24gTGIodCxlLGksbixvLGEscil7dmFyIHM9ZS5jaGlsZE9mTmFtZShpKTtzJiZzLnNldFNoYXBlKGZ1bmN0aW9uKHQpe3ZhciBlPW9iKHRbMF1bMF0sdFsxXVswXSksaT1vYih0WzBdWzFdLHRbMV1bMV0pLG49YWIodFswXVswXSx0WzFdWzBdKSxvPWFiKHRbMF1bMV0sdFsxXVsxXSk7cmV0dXJue3g6ZSx5Omksd2lkdGg6bi1lLGhlaWdodDpvLWl9fSh6Yih0LGUsW1tuLG9dLFtuK2EsbytyXV0pKSl9ZnVuY3Rpb24ga2IodCl7cmV0dXJuIEMoe3N0cm9rZU5vU2NhbGU6ITB9LHQuYnJ1c2hTdHlsZSl9ZnVuY3Rpb24gUGIodCxlLGksbil7dmFyIG89W29iKHQsaSksb2IoZSxuKV0sYT1bYWIodCxpKSxhYihlLG4pXTtyZXR1cm5bW29bMF0sYVswXV0sW29bMV0sYVsxXV1dfWZ1bmN0aW9uIE5iKHQsZSxpLG4sbyxhLHIscyl7dmFyIGw9bi5fX2JydXNoT3B0aW9uLHU9dChsLnJhbmdlKSxoPUViKGksYSxyKTtpYihvLnNwbGl0KCIiKSxmdW5jdGlvbih0KXt2YXIgZT1jYlt0XTt1W2VbMF1dW2VbMV1dKz1oW2VbMF1dfSksbC5yYW5nZT1lKFBiKHVbMF1bMF0sdVsxXVswXSx1WzBdWzFdLHVbMV1bMV0pKSxfYihpLG4pLEliKGkse2lzRW5kOiExfSl9ZnVuY3Rpb24gT2IodCxlLGksbixvKXt2YXIgYT1lLl9fYnJ1c2hPcHRpb24ucmFuZ2Uscj1FYih0LGksbik7aWIoYSxmdW5jdGlvbih0KXt0WzBdKz1yWzBdLHRbMV0rPXJbMV19KSxfYih0LGUpLEliKHQse2lzRW5kOiExfSl9ZnVuY3Rpb24gRWIodCxlLGkpe3ZhciBuPXQuZ3JvdXAsbz1uLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbChlLGkpLGE9bi50cmFuc2Zvcm1Db29yZFRvTG9jYWwoMCwwKTtyZXR1cm5bb1swXS1hWzBdLG9bMV0tYVsxXV19ZnVuY3Rpb24gemIodCxlLGkpe3ZhciBuPVNiKHQsZSk7cmV0dXJuIG4mJiEwIT09bj9uLmNsaXBQYXRoKGksdC5fdHJhbnNmb3JtKTpEKGkpfWZ1bmN0aW9uIFJiKHQpe3ZhciBlPXQuZXZlbnQ7ZS5wcmV2ZW50RGVmYXVsdCYmZS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIEJiKHQsZSxpKXtyZXR1cm4gdC5jaGlsZE9mTmFtZSgibWFpbiIpLmNvbnRhaW4oZSxpKX1mdW5jdGlvbiBWYih0LGUsaSxuKXt2YXIgbyxhPXQuX2NyZWF0aW5nQ292ZXIscj10Ll9jcmVhdGluZ1BhbmVsLHM9dC5fYnJ1c2hPcHRpb247aWYodC5fdHJhY2sucHVzaChpLnNsaWNlKCkpLGZ1bmN0aW9uKHQpe3ZhciBlPXQuX3RyYWNrO2lmKCFlLmxlbmd0aClyZXR1cm4hMTt2YXIgaT1lW2UubGVuZ3RoLTFdLG49ZVswXSxvPWlbMF0tblswXSxhPWlbMV0tblsxXSxyPXJiKG8qbythKmEsLjUpO3JldHVybiBsYjxyfSh0KXx8YSl7aWYociYmIWEpeyJzaW5nbGUiPT09cy5icnVzaE1vZGUmJk1iKHQpO3ZhciBsPUQocyk7bC5icnVzaFR5cGU9R2IobC5icnVzaFR5cGUsciksbC5wYW5lbElkPSEwPT09cj9udWxsOnIucGFuZWxJZCxhPXQuX2NyZWF0aW5nQ292ZXI9bWIodCxsKSx0Ll9jb3ZlcnMucHVzaChhKX1pZihhKXt2YXIgdT1IYltHYih0Ll9icnVzaFR5cGUscildO2EuX19icnVzaE9wdGlvbi5yYW5nZT11LmdldENyZWF0aW5nUmFuZ2UoemIodCxhLHQuX3RyYWNrKSksbiYmKHZiKHQsYSksdS51cGRhdGVDb21tb24odCxhKSkseWIodCxhKSxvPXtpc0VuZDpufX19ZWxzZSBuJiYic2luZ2xlIj09PXMuYnJ1c2hNb2RlJiZzLnJlbW92ZU9uQ2xpY2smJmJiKHQsZSxpKSYmTWIodCkmJihvPXtpc0VuZDpuLHJlbW92ZU9uQ2xpY2s6ITB9KTtyZXR1cm4gb31mdW5jdGlvbiBHYih0LGUpe3JldHVybiJhdXRvIj09PXQ/ZS5kZWZhdWx0QnJ1c2hUeXBlOnR9Z2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnYixlbmFibGVCcnVzaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYnJ1c2hUeXBlJiZmdW5jdGlvbih0KXt2YXIgZT10Ll96cjsoZnVuY3Rpb24odCxlLGkpe3ZhciBuPUN5KHQpO25bZV09PT1pJiYobltlXT1udWxsKX0pKGUsaGIsdC5fdWlkKSxmdW5jdGlvbihpLHQpe2liKHQsZnVuY3Rpb24odCxlKXtpLm9mZihlLHQpfSl9KGUsdC5faGFuZGxlcnMpLHQuX2JydXNoVHlwZT10Ll9icnVzaE9wdGlvbj1udWxsfSh0aGlzKSx0LmJydXNoVHlwZSYmZnVuY3Rpb24odCxlKXt2YXIgaT10Ll96cjt0Ll9lbmFibGVHbG9iYWxQYW58fGZ1bmN0aW9uKHQsZSxpKXtDeSh0KVtlXT1pfShpLGhiLHQuX3VpZCk7KGZ1bmN0aW9uKGksdCl7aWIodCxmdW5jdGlvbih0LGUpe2kub24oZSx0KX0pfSkoaSx0Ll9oYW5kbGVycyksdC5fYnJ1c2hUeXBlPWUuYnJ1c2hUeXBlLHQuX2JydXNoT3B0aW9uPW0oRChmYiksZSwhMCl9KHRoaXMsdCksdGhpc30sc2V0UGFuZWxzOmZ1bmN0aW9uKHQpe2lmKHQmJnQubGVuZ3RoKXt2YXIgZT10aGlzLl9wYW5lbHM9e307RSh0LGZ1bmN0aW9uKHQpe2VbdC5wYW5lbElkXT1EKHQpfSl9ZWxzZSB0aGlzLl9wYW5lbHM9bnVsbDtyZXR1cm4gdGhpc30sbW91bnQ6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLl9lbmFibGVHbG9iYWxQYW49dC5lbmFibGVHbG9iYWxQYW47dmFyIGU9dGhpcy5ncm91cDtyZXR1cm4gdGhpcy5fenIuYWRkKGUpLGUuYXR0cih7cG9zaXRpb246dC5wb3NpdGlvbnx8WzAsMF0scm90YXRpb246dC5yb3RhdGlvbnx8MCxzY2FsZTp0LnNjYWxlfHxbMSwxXX0pLHRoaXMuX3RyYW5zZm9ybT1lLmdldExvY2FsVHJhbnNmb3JtKCksdGhpc30sZWFjaENvdmVyOmZ1bmN0aW9uKHQsZSl7aWIodGhpcy5fY292ZXJzLHQsZSl9LHVwZGF0ZUNvdmVyczpmdW5jdGlvbihvKXtvPU4obyxmdW5jdGlvbih0KXtyZXR1cm4gbShEKGZiKSx0LCEwKX0pO3ZhciBpPSJcMC1icnVzaC1pbmRleC0iLGE9dGhpcy5fY292ZXJzLHI9dGhpcy5fY292ZXJzPVtdLHM9dGhpcyxsPXRoaXMuX2NyZWF0aW5nQ292ZXI7cmV0dXJuIG5ldyBUZihhLG8sZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0Ll9fYnJ1c2hPcHRpb24sZSl9LG4pLmFkZCh0KS51cGRhdGUodCkucmVtb3ZlKGZ1bmN0aW9uKHQpe2FbdF0hPT1sJiZzLmdyb3VwLnJlbW92ZShhW3RdKX0pLmV4ZWN1dGUoKSx0aGlzO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4obnVsbCE9dC5pZD90LmlkOmkrZSkrIi0iK3QuYnJ1c2hUeXBlfWZ1bmN0aW9uIHQodCxlKXt2YXIgaT1vW3RdO2lmKG51bGwhPWUmJmFbZV09PT1sKXJbdF09YVtlXTtlbHNle3ZhciBuPXJbdF09bnVsbCE9ZT8oYVtlXS5fX2JydXNoT3B0aW9uPWksYVtlXSk6dmIocyxtYihzLGkpKTtfYihzLG4pfX19LHVubW91bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVCcnVzaCghMSksTWIodGhpcyksdGhpcy5fenIucmVtb3ZlKHRoaXMuZ3JvdXApLHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLnVubW91bnQoKSx0aGlzLm9mZigpfX0sYihnYixDdCk7dmFyIEZiPXttb3VzZWRvd246ZnVuY3Rpb24odCl7aWYodGhpcy5fZHJhZ2dpbmcpV2IodGhpcyx0KTtlbHNlIGlmKCF0LnRhcmdldHx8IXQudGFyZ2V0LmRyYWdnYWJsZSl7UmIodCk7dmFyIGU9dGhpcy5ncm91cC50cmFuc2Zvcm1Db29yZFRvTG9jYWwodC5vZmZzZXRYLHQub2Zmc2V0WSk7dGhpcy5fY3JlYXRpbmdDb3Zlcj1udWxsLCh0aGlzLl9jcmVhdGluZ1BhbmVsPWJiKHRoaXMsdCxlKSkmJih0aGlzLl9kcmFnZ2luZz0hMCx0aGlzLl90cmFjaz1bZS5zbGljZSgpXSl9fSxtb3VzZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5vZmZzZXRYLGk9dC5vZmZzZXRZLG49dGhpcy5ncm91cC50cmFuc2Zvcm1Db29yZFRvTG9jYWwoZSxpKTtpZihmdW5jdGlvbih0LGUsaSl7aWYodC5fYnJ1c2hUeXBlJiYhZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuX3pyO3JldHVybiBlPDB8fGU+bi5nZXRXaWR0aCgpfHxpPDB8fGk+bi5nZXRIZWlnaHQoKX0odCxlKSl7dmFyIG49dC5fenIsbz10Ll9jb3ZlcnMsYT1iYih0LGUsaSk7aWYoIXQuX2RyYWdnaW5nKWZvcih2YXIgcj0wO3I8by5sZW5ndGg7cisrKXt2YXIgcz1vW3JdLl9fYnJ1c2hPcHRpb247aWYoYSYmKCEwPT09YXx8cy5wYW5lbElkPT09YS5wYW5lbElkKSYmSGJbcy5icnVzaFR5cGVdLmNvbnRhaW4ob1tyXSxpWzBdLGlbMV0pKXJldHVybn1hJiZuLnNldEN1cnNvclN0eWxlKCJjcm9zc2hhaXIiKX19KHRoaXMsdCxuKSx0aGlzLl9kcmFnZ2luZyl7UmIodCk7dmFyIG89VmIodGhpcyx0LG4sITEpO28mJkliKHRoaXMsbyl9fSxtb3VzZXVwOmZ1bmN0aW9uKHQpe1diKHRoaXMsdCl9fTtmdW5jdGlvbiBXYih0LGUpe2lmKHQuX2RyYWdnaW5nKXtSYihlKTt2YXIgaT1lLm9mZnNldFgsbj1lLm9mZnNldFksbz10Lmdyb3VwLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbChpLG4pLGE9VmIodCxlLG8sITApO3QuX2RyYWdnaW5nPSExLHQuX3RyYWNrPVtdLHQuX2NyZWF0aW5nQ292ZXI9bnVsbCxhJiZJYih0LGEpfX12YXIgSGI9e2xpbmVYOlpiKDApLGxpbmVZOlpiKDEpLHJlY3Q6e2NyZWF0ZUNvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEFiKGViKE5iLGZ1bmN0aW9uKHQpe3JldHVybiB0fSxmdW5jdGlvbih0KXtyZXR1cm4gdH0pLHQsZSxbInciLCJlIiwibiIsInMiLCJzZSIsInN3IiwibmUiLCJudyJdKX0sZ2V0Q3JlYXRpbmdSYW5nZTpmdW5jdGlvbih0KXt2YXIgZT1UYih0KTtyZXR1cm4gUGIoZVsxXVswXSxlWzFdWzFdLGVbMF1bMF0sZVswXVsxXSl9LHVwZGF0ZUNvdmVyU2hhcGU6ZnVuY3Rpb24odCxlLGksbil7RGIodCxlLGksbil9LHVwZGF0ZUNvbW1vbjpDYixjb250YWluOkJifSxwb2x5Z29uOntjcmVhdGVDb3ZlcjpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBJaTtyZXR1cm4gaS5hZGQobmV3IEtyKHtuYW1lOiJtYWluIixzdHlsZTprYihlKSxzaWxlbnQ6ITB9KSksaX0sZ2V0Q3JlYXRpbmdSYW5nZTpmdW5jdGlvbih0KXtyZXR1cm4gdH0sZW5kQ3JlYXRpbmc6ZnVuY3Rpb24odCxlKXtlLnJlbW92ZShlLmNoaWxkQXQoMCkpLGUuYWRkKG5ldyBxcih7bmFtZToibWFpbiIsZHJhZ2dhYmxlOiEwLGRyaWZ0OmViKE9iLHQsZSksb25kcmFnZW5kOmViKEliLHQse2lzRW5kOiEwfSl9KSl9LHVwZGF0ZUNvdmVyU2hhcGU6ZnVuY3Rpb24odCxlLGksbil7ZS5jaGlsZEF0KDApLnNldFNoYXBlKHtwb2ludHM6emIodCxlLGkpfSl9LHVwZGF0ZUNvbW1vbjpDYixjb250YWluOkJifX07ZnVuY3Rpb24gWmIobCl7cmV0dXJue2NyZWF0ZUNvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEFiKGViKE5iLGZ1bmN0aW9uKHQpe3ZhciBlPVt0LFswLDEwMF1dO3JldHVybiBsJiZlLnJldmVyc2UoKSxlfSxmdW5jdGlvbih0KXtyZXR1cm4gdFtsXX0pLHQsZSxbWyJ3IiwiZSJdLFsibiIsInMiXV1bbF0pfSxnZXRDcmVhdGluZ1JhbmdlOmZ1bmN0aW9uKHQpe3ZhciBlPVRiKHQpO3JldHVybltvYihlWzBdW2xdLGVbMV1bbF0pLGFiKGVbMF1bbF0sZVsxXVtsXSldfSx1cGRhdGVDb3ZlclNoYXBlOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvLGE9U2IodCxlKTtpZighMCE9PWEmJmEuZ2V0TGluZWFyQnJ1c2hPdGhlckV4dGVudClvPWEuZ2V0TGluZWFyQnJ1c2hPdGhlckV4dGVudChsLHQuX3RyYW5zZm9ybSk7ZWxzZXt2YXIgcj10Ll96cjtvPVswLFtyLmdldFdpZHRoKCksci5nZXRIZWlnaHQoKV1bMS1sXV19dmFyIHM9W2ksb107bCYmcy5yZXZlcnNlKCksRGIodCxlLHMsbil9LHVwZGF0ZUNvbW1vbjpDYixjb250YWluOkJifX1mdW5jdGlvbiBVYihpKXtyZXR1cm4gaT1qYihpKSxmdW5jdGlvbih0LGUpe3JldHVybiBmbCh0LGkpfX1mdW5jdGlvbiBYYihvLGEpe3JldHVybiBvPWpiKG8pLGZ1bmN0aW9uKHQpe3ZhciBlPW51bGwhPWE/YTp0LGk9ZT9vLndpZHRoOm8uaGVpZ2h0LG49ZT9vLng6by55O3JldHVybltuLG4rKGl8fDApXX19ZnVuY3Rpb24gWWIobixvLGEpe3JldHVybiBuPWpiKG4pLGZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbi5jb250YWluKGVbMF0sZVsxXSkmJiFXeSh0LG8sYSl9fWZ1bmN0aW9uIGpiKHQpe3JldHVybiBNaS5jcmVhdGUodCl9dmFyIHFiPVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSxLYj1iZih7dHlwZToicGFyYWxsZWxBeGlzIixpbml0OmZ1bmN0aW9uKHQsZSl7S2Iuc3VwZXJBcHBseSh0aGlzLCJpbml0Iixhcmd1bWVudHMpLCh0aGlzLl9icnVzaENvbnRyb2xsZXI9bmV3IGdiKGUuZ2V0WnIoKSkpLm9uKCJicnVzaCIsQSh0aGlzLl9vbkJydXNoLHRoaXMpKX0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKCFmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGkmJiJheGlzQXJlYVNlbGVjdCI9PT1pLnR5cGUmJmUuZmluZENvbXBvbmVudHMoe21haW5UeXBlOiJwYXJhbGxlbEF4aXMiLHF1ZXJ5Oml9KVswXT09PXR9KHQsZSxuKSl7dGhpcy5heGlzTW9kZWw9dCx0aGlzLmFwaT1pLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIG89dGhpcy5fYXhpc0dyb3VwO2lmKHRoaXMuX2F4aXNHcm91cD1uZXcgSWksdGhpcy5ncm91cC5hZGQodGhpcy5fYXhpc0dyb3VwKSx0LmdldCgic2hvdyIpKXt2YXIgYT1mdW5jdGlvbih0LGUpe3JldHVybiBlLmdldENvbXBvbmVudCgicGFyYWxsZWwiLHQuZ2V0KCJwYXJhbGxlbEluZGV4IikpfSh0LGUpLHI9YS5jb29yZGluYXRlU3lzdGVtLHM9dC5nZXRBcmVhU2VsZWN0U3R5bGUoKSxsPXMud2lkdGgsdT10LmF4aXMuZGltLGg9TCh7c3Ryb2tlQ29udGFpblRocmVzaG9sZDpsfSxyLmdldEF4aXNMYXlvdXQodSkpLGM9bmV3IFltKHQsaCk7RShxYixjLmFkZCxjKSx0aGlzLl9heGlzR3JvdXAuYWRkKGMuZ2V0R3JvdXAoKSksdGhpcy5fcmVmcmVzaEJydXNoQ29udHJvbGxlcihoLHMsdCxhLGwsaSk7dmFyIGQ9biYmITE9PT1uLmFuaW1hdGlvbj9udWxsOnQ7ZGwobyx0aGlzLl9heGlzR3JvdXAsZCl9fX0sX3JlZnJlc2hCcnVzaENvbnRyb2xsZXI6ZnVuY3Rpb24odCxlLGksbixvLGEpe3ZhciByPWkuYXhpcy5nZXRFeHRlbnQoKSxzPXJbMV0tclswXSxsPU1hdGgubWluKDMwLC4xKk1hdGguYWJzKHMpKSx1PU1pLmNyZWF0ZSh7eDpyWzBdLHk6LW8vMix3aWR0aDpzLGhlaWdodDpvfSk7dS54LT1sLHUud2lkdGgrPTIqbCx0aGlzLl9icnVzaENvbnRyb2xsZXIubW91bnQoe2VuYWJsZUdsb2JhbFBhbjohMCxyb3RhdGlvbjp0LnJvdGF0aW9uLHBvc2l0aW9uOnQucG9zaXRpb259KS5zZXRQYW5lbHMoW3twYW5lbElkOiJwbCIsY2xpcFBhdGg6VWIodSksaXNUYXJnZXRCeUN1cnNvcjpZYih1LGEsbiksZ2V0TGluZWFyQnJ1c2hPdGhlckV4dGVudDpYYih1LDApfV0pLmVuYWJsZUJydXNoKHticnVzaFR5cGU6ImxpbmVYIixicnVzaFN0eWxlOmUscmVtb3ZlT25DbGljazohMH0pLnVwZGF0ZUNvdmVycyhmdW5jdGlvbih0KXt2YXIgZT10LmF4aXM7cmV0dXJuIE4odC5hY3RpdmVJbnRlcnZhbHMsZnVuY3Rpb24odCl7cmV0dXJue2JydXNoVHlwZToibGluZVgiLHBhbmVsSWQ6InBsIixyYW5nZTpbZS5kYXRhVG9Db29yZCh0WzBdLCEwKSxlLmRhdGFUb0Nvb3JkKHRbMV0sITApXX19KX0oaSkpfSxfb25CcnVzaDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuYXhpc01vZGVsLG49aS5heGlzLG89Tih0LGZ1bmN0aW9uKHQpe3JldHVybltuLmNvb3JkVG9EYXRhKHQucmFuZ2VbMF0sITApLG4uY29vcmRUb0RhdGEodC5yYW5nZVsxXSwhMCldfSk7IWkub3B0aW9uLnJlYWx0aW1lIT09ZS5pc0VuZCYmIWUucmVtb3ZlT25DbGlja3x8dGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImF4aXNBcmVhU2VsZWN0IixwYXJhbGxlbEF4aXNJZDppLmlkLGludGVydmFsczpvfSl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLl9icnVzaENvbnRyb2xsZXIuZGlzcG9zZSgpfX0pO2JmKHt0eXBlOiJwYXJhbGxlbCIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9tb2RlbD10LHRoaXMuX2FwaT1pLHRoaXMuX2hhbmRsZXJzfHwodGhpcy5faGFuZGxlcnM9e30sRSgkYixmdW5jdGlvbih0LGUpe2kuZ2V0WnIoKS5vbihlLHRoaXMuX2hhbmRsZXJzW2VdPUEodCx0aGlzKSl9LHRoaXMpKSxUYyh0aGlzLCJfdGhyb3R0bGVkRGlzcGF0Y2hFeHBhbmQiLHQuZ2V0KCJheGlzRXhwYW5kUmF0ZSIpLCJmaXhSYXRlIil9LGRpc3Bvc2U6ZnVuY3Rpb24odCxpKXtFKHRoaXMuX2hhbmRsZXJzLGZ1bmN0aW9uKHQsZSl7aS5nZXRacigpLm9mZihlLHQpfSksdGhpcy5faGFuZGxlcnM9bnVsbH0sX3Rocm90dGxlZERpc3BhdGNoRXhwYW5kOmZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3BhdGNoRXhwYW5kKHQpfSxfZGlzcGF0Y2hFeHBhbmQ6ZnVuY3Rpb24odCl7dCYmdGhpcy5fYXBpLmRpc3BhdGNoQWN0aW9uKEwoe3R5cGU6InBhcmFsbGVsQXhpc0V4cGFuZCJ9LHQpKX19KTt2YXIgJGI9e21vdXNlZG93bjpmdW5jdGlvbih0KXtKYih0aGlzLCJjbGljayIpJiYodGhpcy5fbW91c2VEb3duUG9pbnQ9W3Qub2Zmc2V0WCx0Lm9mZnNldFldKX0sbW91c2V1cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tb3VzZURvd25Qb2ludDtpZihKYih0aGlzLCJjbGljayIpJiZlKXt2YXIgaT1bdC5vZmZzZXRYLHQub2Zmc2V0WV07aWYoNTxNYXRoLnBvdyhlWzBdLWlbMF0sMikrTWF0aC5wb3coZVsxXS1pWzFdLDIpKXJldHVybjt2YXIgbj10aGlzLl9tb2RlbC5jb29yZGluYXRlU3lzdGVtLmdldFNsaWRlZEF4aXNFeHBhbmRXaW5kb3coW3Qub2Zmc2V0WCx0Lm9mZnNldFldKTsibm9uZSIhPT1uLmJlaGF2aW9yJiZ0aGlzLl9kaXNwYXRjaEV4cGFuZCh7YXhpc0V4cGFuZFdpbmRvdzpuLmF4aXNFeHBhbmRXaW5kb3d9KX10aGlzLl9tb3VzZURvd25Qb2ludD1udWxsfSxtb3VzZW1vdmU6ZnVuY3Rpb24odCl7aWYoIXRoaXMuX21vdXNlRG93blBvaW50JiZKYih0aGlzLCJtb3VzZW1vdmUiKSl7dmFyIGU9dGhpcy5fbW9kZWwsaT1lLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0U2xpZGVkQXhpc0V4cGFuZFdpbmRvdyhbdC5vZmZzZXRYLHQub2Zmc2V0WV0pLG49aS5iZWhhdmlvcjsianVtcCI9PT1uJiZ0aGlzLl90aHJvdHRsZWREaXNwYXRjaEV4cGFuZC5kZWJvdW5jZU5leHRDYWxsKGUuZ2V0KCJheGlzRXhwYW5kRGVib3VuY2UiKSksdGhpcy5fdGhyb3R0bGVkRGlzcGF0Y2hFeHBhbmQoIm5vbmUiPT09bj9udWxsOntheGlzRXhwYW5kV2luZG93OmkuYXhpc0V4cGFuZFdpbmRvdyxhbmltYXRpb246Imp1bXAiPT09biYmbnVsbH0pfX19O2Z1bmN0aW9uIEpiKHQsZSl7dmFyIGk9dC5fbW9kZWw7cmV0dXJuIGkuZ2V0KCJheGlzRXhwYW5kYWJsZSIpJiZpLmdldCgiYXhpc0V4cGFuZFRyaWdnZXJPbiIpPT09ZX1mZihmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7aWYodC5wYXJhbGxlbClyZXR1cm47dmFyIGU9ITE7RSh0LnNlcmllcyxmdW5jdGlvbih0KXt0JiYicGFyYWxsZWwiPT09dC50eXBlJiYoZT0hMCl9KSxlJiYodC5wYXJhbGxlbD1be31dKX0odCksZnVuY3Rpb24obil7RShFbyhuLnBhcmFsbGVsQXhpcyksZnVuY3Rpb24odCl7aWYoUih0KSl7dmFyIGU9dC5wYXJhbGxlbEluZGV4fHwwLGk9RW8obi5wYXJhbGxlbClbZV07aSYmaS5wYXJhbGxlbEF4aXNEZWZhdWx0JiZtKHQsaS5wYXJhbGxlbEF4aXNEZWZhdWx0LCExKX19KX0odCl9KSxpYy5leHRlbmQoe3R5cGU6InNlcmllcy5wYXJhbGxlbCIsZGVwZW5kZW5jaWVzOlsicGFyYWxsZWwiXSx2aXN1YWxDb2xvckFjY2Vzc1BhdGg6ImxpbmVTdHlsZS5jb2xvciIsZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldFNvdXJjZSgpO3JldHVybiBmdW5jdGlvbih0LGUpe2lmKHQuZW5jb2RlRGVmaW5lKXJldHVybjt2YXIgaT1lLmVjTW9kZWwuZ2V0Q29tcG9uZW50KCJwYXJhbGxlbCIsZS5nZXQoInBhcmFsbGVsSW5kZXgiKSk7aWYoIWkpcmV0dXJuO3ZhciBuPXQuZW5jb2RlRGVmaW5lPVEoKTtFKGkuZGltZW5zaW9ucyxmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtyZXR1cm4rdC5yZXBsYWNlKCJkaW0iLCIiKX0odCk7bi5zZXQodCxlKX0pfShpLHRoaXMpLGhwKGksdGhpcyl9LGdldFJhd0luZGljZXNCeUFjdGl2ZVN0YXRlOmZ1bmN0aW9uKGkpe3ZhciB0PXRoaXMuY29vcmRpbmF0ZVN5c3RlbSxuPXRoaXMuZ2V0RGF0YSgpLG89W107cmV0dXJuIHQuZWFjaEFjdGl2ZVN0YXRlKG4sZnVuY3Rpb24odCxlKXtpPT09dCYmby5wdXNoKG4uZ2V0UmF3SW5kZXgoZSkpfSksb30sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06InBhcmFsbGVsIixwYXJhbGxlbEluZGV4OjAsbGFiZWw6e3Nob3c6ITF9LGluYWN0aXZlT3BhY2l0eTouMDUsYWN0aXZlT3BhY2l0eToxLGxpbmVTdHlsZTp7d2lkdGg6MSxvcGFjaXR5Oi40NSx0eXBlOiJzb2xpZCJ9LGVtcGhhc2lzOntsYWJlbDp7c2hvdzohMX19LHByb2dyZXNzaXZlOjUwMCxzbW9vdGg6ITEsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIifX0pO2djLmV4dGVuZCh7dHlwZToicGFyYWxsZWwiLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhR3JvdXA9bmV3IElpLHRoaXMuZ3JvdXAuYWRkKHRoaXMuX2RhdGFHcm91cCksdGhpcy5fZGF0YSx0aGlzLl9pbml0aWFsaXplZH0scmVuZGVyOmZ1bmN0aW9uKGEsdCxlLHIpe3ZhciBpPXRoaXMuX2RhdGFHcm91cCxzPWEuZ2V0RGF0YSgpLGw9dGhpcy5fZGF0YSx1PWEuY29vcmRpbmF0ZVN5c3RlbSxoPXUuZGltZW5zaW9ucyxjPWVTKGEpO2lmKHMuZGlmZihsKS5hZGQoZnVuY3Rpb24odCl7aVModFMocyxpLHQsaCx1KSxzLHQsYyl9KS51cGRhdGUoZnVuY3Rpb24odCxlKXt2YXIgaT1sLmdldEl0ZW1HcmFwaGljRWwoZSksbj1RYihzLHQsaCx1KTtzLnNldEl0ZW1HcmFwaGljRWwodCxpKTt2YXIgbz1yJiYhMT09PXIuYW5pbWF0aW9uP251bGw6YTtzbChpLHtzaGFwZTp7cG9pbnRzOm59fSxvLHQpLGlTKGkscyx0LGMpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPWwuZ2V0SXRlbUdyYXBoaWNFbCh0KTtpLnJlbW92ZShlKX0pLmV4ZWN1dGUoKSwhdGhpcy5faW5pdGlhbGl6ZWQpe3RoaXMuX2luaXRpYWxpemVkPSEwO3ZhciBuPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10Lm1vZGVsLG89dC5nZXRSZWN0KCksYT1uZXcgaXMoe3NoYXBlOnt4Om8ueCx5Om8ueSx3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodH19KSxyPSJob3Jpem9udGFsIj09PW4uZ2V0KCJsYXlvdXQiKT8id2lkdGgiOiJoZWlnaHQiO3JldHVybiBhLnNldFNoYXBlKHIsMCksbGwoYSx7c2hhcGU6e3dpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fX0sZSxpKSxhfSh1LGEsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5yZW1vdmVDbGlwUGF0aCgpfSl9KTtpLnNldENsaXBQYXRoKG4pfXRoaXMuX2RhdGE9c30saW5jcmVtZW50YWxQcmVwYXJlUmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9kYXRhPW51bGwsdGhpcy5fZGF0YUdyb3VwLnJlbW92ZUFsbCgpfSxpbmNyZW1lbnRhbFJlbmRlcjpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPWUuZ2V0RGF0YSgpLG89ZS5jb29yZGluYXRlU3lzdGVtLGE9by5kaW1lbnNpb25zLHI9ZVMoZSkscz10LnN0YXJ0O3M8dC5lbmQ7cysrKXt2YXIgbD10UyhuLHRoaXMuX2RhdGFHcm91cCxzLGEsbyk7bC5pbmNyZW1lbnRhbD0hMCxpUyhsLG4scyxyKX19LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX2RhdGFHcm91cCYmdGhpcy5fZGF0YUdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2RhdGE9bnVsbH19KTtmdW5jdGlvbiBRYih0LGUsaSxuKXtmb3IodmFyIG8sYT1bXSxyPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBzPWlbcl0sbD10LmdldCh0Lm1hcERpbWVuc2lvbihzKSxlKTtvPWwsKCJjYXRlZ29yeSI9PT1uLmdldEF4aXMocykudHlwZT9udWxsPT1vOm51bGw9PW98fGlzTmFOKG8pKXx8YS5wdXNoKG4uZGF0YVRvUG9pbnQobCxzKSl9cmV0dXJuIGF9ZnVuY3Rpb24gdFModCxlLGksbixvKXt2YXIgYT1RYih0LGksbixvKSxyPW5ldyBLcih7c2hhcGU6e3BvaW50czphfSxzaWxlbnQ6ITAsejI6MTB9KTtyZXR1cm4gZS5hZGQociksdC5zZXRJdGVtR3JhcGhpY0VsKGkscikscn1mdW5jdGlvbiBlUyh0KXt2YXIgZT10LmdldCgic21vb3RoIiwhMCk7cmV0dXJuITA9PT1lJiYoZT0uMykse2xpbmVTdHlsZTp0LmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxzbW9vdGg6bnVsbCE9ZT9lOi4zfX1mdW5jdGlvbiBpUyh0LGUsaSxuKXt2YXIgbz1uLmxpbmVTdHlsZTtlLmhhc0l0ZW1PcHRpb24mJihvPWUuZ2V0SXRlbU1vZGVsKGkpLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSk7dC51c2VTdHlsZShvKTt2YXIgYT10LnN0eWxlO2EuZmlsbD1udWxsLGEuc3Ryb2tlPWUuZ2V0SXRlbVZpc3VhbChpLCJjb2xvciIpLGEub3BhY2l0eT1lLmdldEl0ZW1WaXN1YWwoaSwib3BhY2l0eSIpLG4uc21vb3RoJiYodC5zaGFwZS5zbW9vdGg9bi5zbW9vdGgpfXZhciBuUz1bImxpbmVTdHlsZSIsIm5vcm1hbCIsIm9wYWNpdHkiXTt5Zih7c2VyaWVzVHlwZToicGFyYWxsZWwiLHJlc2V0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldE1vZGVsKCJpdGVtU3R5bGUiKSxvPXQuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLGE9ZS5nZXQoImNvbG9yIikscj1vLmdldCgiY29sb3IiKXx8bi5nZXQoImNvbG9yIil8fGFbdC5zZXJpZXNJbmRleCVhLmxlbmd0aF0scz10LmdldCgiaW5hY3RpdmVPcGFjaXR5IiksbD10LmdldCgiYWN0aXZlT3BhY2l0eSIpLHU9dC5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksaD10LmNvb3JkaW5hdGVTeXN0ZW0sYz10LmdldERhdGEoKSxkPXtub3JtYWw6dS5vcGFjaXR5LGFjdGl2ZTpsLGluYWN0aXZlOnN9O3JldHVybiBjLnNldFZpc3VhbCgiY29sb3IiLHIpLHtwcm9ncmVzczpmdW5jdGlvbih0LG8pe2guZWFjaEFjdGl2ZVN0YXRlKG8sZnVuY3Rpb24odCxlKXt2YXIgaT1kW3RdO2lmKCJub3JtYWwiPT09dCYmby5oYXNJdGVtT3B0aW9uKXt2YXIgbj1vLmdldEl0ZW1Nb2RlbChlKS5nZXQoblMsITApO251bGwhPW4mJihpPW4pfW8uc2V0SXRlbVZpc3VhbChlLCJvcGFjaXR5IixpKX0sdC5zdGFydCx0LmVuZCl9fX19KTt2YXIgb1M9aWMuZXh0ZW5kKHt0eXBlOiJzZXJpZXMuc2Fua2V5IixsYXlvdXRJbmZvOm51bGwsbGV2ZWxNb2RlbHM6bnVsbCxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10LmVkZ2VzfHx0LmxpbmtzLG49dC5kYXRhfHx0Lm5vZGVzLG89dC5sZXZlbHMsYT10aGlzLmxldmVsTW9kZWxzPXt9LHI9MDtyPG8ubGVuZ3RoO3IrKyludWxsIT1vW3JdLmRlcHRoJiYwPD1vW3JdLmRlcHRoJiYoYVtvW3JdLmRlcHRoXT1uZXcgSWwob1tyXSx0aGlzLGUpKTtpZihuJiZpKXJldHVybiBYXyhuLGksdGhpcywhMCxmdW5jdGlvbih0LGUpe3Qud3JhcE1ldGhvZCgiZ2V0SXRlbU1vZGVsIixmdW5jdGlvbih0LG4pe3JldHVybiB0LmN1c3RvbWl6ZUdldFBhcmVudChmdW5jdGlvbih0KXt2YXIgZT10aGlzLnBhcmVudE1vZGVsLGk9ZS5nZXREYXRhKCkuZ2V0SXRlbUxheW91dChuKS5kZXB0aDtyZXR1cm4gZS5sZXZlbE1vZGVsc1tpXXx8dGhpcy5wYXJlbnRNb2RlbH0pLHR9KSxlLndyYXBNZXRob2QoImdldEl0ZW1Nb2RlbCIsZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5jdXN0b21pemVHZXRQYXJlbnQoZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXJlbnRNb2RlbCxpPWUuZ2V0R3JhcGgoKS5nZXRFZGdlQnlJbmRleChuKS5ub2RlMS5nZXRMYXlvdXQoKS5kZXB0aDtyZXR1cm4gZS5sZXZlbE1vZGVsc1tpXXx8dGhpcy5wYXJlbnRNb2RlbH0pLHR9KX0pLmRhdGF9LHNldE5vZGVQb3NpdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9uLmRhdGFbdF07aS5sb2NhbFg9ZVswXSxpLmxvY2FsWT1lWzFdfSxnZXRHcmFwaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldERhdGEoKS5ncmFwaH0sZ2V0RWRnZURhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRHcmFwaCgpLmVkZ2VEYXRhfSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKHQsZSxpKXtpZigiZWRnZSI9PT1pKXt2YXIgbj10aGlzLmdldERhdGFQYXJhbXModCxpKSxvPW4uZGF0YSxhPW8uc291cmNlKyIgLS0gIitvLnRhcmdldDtyZXR1cm4gbi52YWx1ZSYmKGErPSIgOiAiK24udmFsdWUpLGV1KGEpfWlmKCJub2RlIiE9PWkpcmV0dXJuIG9TLnN1cGVyQ2FsbCh0aGlzLCJmb3JtYXRUb29sdGlwIix0LGUpO3ZhciByPXRoaXMuZ2V0R3JhcGgoKS5nZXROb2RlQnlJbmRleCh0KS5nZXRMYXlvdXQoKS52YWx1ZSxzPXRoaXMuZ2V0RGF0YVBhcmFtcyh0LGkpLmRhdGEubmFtZTtpZihyKWE9cysiIDogIityO3JldHVybiBldShhKX0sb3B0aW9uVXBkYXRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uOyEwPT09dC5mb2N1c05vZGVBZGphY2VuY3kmJih0LmZvY3VzTm9kZUFkamFjZW5jeT0iYWxsRWRnZXMiKX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06InZpZXciLGxheW91dDpudWxsLGxlZnQ6IjUlIix0b3A6IjUlIixyaWdodDoiMjAlIixib3R0b206IjUlIixvcmllbnQ6Imhvcml6b250YWwiLG5vZGVXaWR0aDoyMCxub2RlR2FwOjgsZHJhZ2dhYmxlOiEwLGZvY3VzTm9kZUFkamFjZW5jeTohMSxsYXlvdXRJdGVyYXRpb25zOjMyLGxhYmVsOntzaG93OiEwLHBvc2l0aW9uOiJyaWdodCIsY29sb3I6IiMwMDAiLGZvbnRTaXplOjEyfSxsZXZlbHM6W10sbm9kZUFsaWduOiJqdXN0aWZ5IixpdGVtU3R5bGU6e2JvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IiMzMzMifSxsaW5lU3R5bGU6e2NvbG9yOiIjMzE0NjU2IixvcGFjaXR5Oi4yLGN1cnZlbmVzczouNX0sZW1waGFzaXM6e2xhYmVsOntzaG93OiEwfSxsaW5lU3R5bGU6e29wYWNpdHk6LjZ9fSxhbmltYXRpb25FYXNpbmc6ImxpbmVhciIsYW5pbWF0aW9uRHVyYXRpb246MWUzfX0pLGFTPVsiaXRlbVN0eWxlIiwib3BhY2l0eSJdLHJTPVsibGluZVN0eWxlIiwib3BhY2l0eSJdO2Z1bmN0aW9uIHNTKHQsZSl7cmV0dXJuIHQuZ2V0VmlzdWFsKCJvcGFjaXR5Iil8fHQuZ2V0TW9kZWwoKS5nZXQoZSl9ZnVuY3Rpb24gbFModCxlLGkpe3ZhciBuPXQuZ2V0R3JhcGhpY0VsKCksbz1zUyh0LGUpO251bGwhPWkmJihudWxsPT1vJiYobz0xKSxvKj1pKSxuLmRvd25wbGF5JiZuLmRvd25wbGF5KCksbi50cmF2ZXJzZShmdW5jdGlvbih0KXsiZ3JvdXAiIT09dC50eXBlJiZ0LnNldFN0eWxlKCJvcGFjaXR5IixvKX0pfWZ1bmN0aW9uIHVTKHQsZSl7dmFyIGk9c1ModCxlKSxuPXQuZ2V0R3JhcGhpY0VsKCk7bi5oaWdobGlnaHQmJm4uaGlnaGxpZ2h0KCksbi50cmF2ZXJzZShmdW5jdGlvbih0KXsiZ3JvdXAiIT09dC50eXBlJiZ0LnNldFN0eWxlKCJvcGFjaXR5IixpKX0pfXZhciBoUz1Jcyh7c2hhcGU6e3gxOjAseTE6MCx4MjowLHkyOjAsY3B4MTowLGNweTE6MCxjcHgyOjAsY3B5MjowLGV4dGVudDowLG9yaWVudDoiIn0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5leHRlbnQ7dC5tb3ZlVG8oZS54MSxlLnkxKSx0LmJlemllckN1cnZlVG8oZS5jcHgxLGUuY3B5MSxlLmNweDIsZS5jcHkyLGUueDIsZS55MiksInZlcnRpY2FsIj09PWUub3JpZW50Pyh0LmxpbmVUbyhlLngyK2ksZS55MiksdC5iZXppZXJDdXJ2ZVRvKGUuY3B4MitpLGUuY3B5MixlLmNweDEraSxlLmNweTEsZS54MStpLGUueTEpKToodC5saW5lVG8oZS54MixlLnkyK2kpLHQuYmV6aWVyQ3VydmVUbyhlLmNweDIsZS5jcHkyK2ksZS5jcHgxLGUuY3B5MStpLGUueDEsZS55MStpKSksdC5jbG9zZVBhdGgoKX19KTtNZih7dHlwZToic2Fua2V5IixfbW9kZWw6bnVsbCxfZm9jdXNBZGphY2VuY3lEaXNhYmxlZDohMSxyZW5kZXI6ZnVuY3Rpb24odyx0LG4pe3ZhciBvPXRoaXMsZT13LmdldEdyYXBoKCksYj10aGlzLmdyb3VwLGk9dy5sYXlvdXRJbmZvLFM9aS53aWR0aCxNPWkuaGVpZ2h0LHU9dy5nZXREYXRhKCksST13LmdldERhdGEoImVkZ2UiKSxUPXcuZ2V0KCJvcmllbnQiKTt0aGlzLl9tb2RlbD13LGIucmVtb3ZlQWxsKCksYi5hdHRyKCJwb3NpdGlvbiIsW2kueCxpLnldKSxlLmVhY2hFZGdlKGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBoUztlLmRhdGFJbmRleD10LmRhdGFJbmRleCxlLnNlcmllc0luZGV4PXcuc2VyaWVzSW5kZXgsZS5kYXRhVHlwZT0iZWRnZSI7dmFyIGksbixvLGEscixzLGwsdSxoPXQuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLGM9aC5nZXQoImN1cnZlbmVzcyIpLGQ9dC5ub2RlMS5nZXRMYXlvdXQoKSxmPXQubm9kZTEuZ2V0TW9kZWwoKSxwPWYuZ2V0KCJsb2NhbFgiKSxnPWYuZ2V0KCJsb2NhbFkiKSxtPXQubm9kZTIuZ2V0TGF5b3V0KCksdj10Lm5vZGUyLmdldE1vZGVsKCkseT12LmdldCgibG9jYWxYIikseD12LmdldCgibG9jYWxZIiksXz10LmdldExheW91dCgpO3N3aXRjaChlLnNoYXBlLmV4dGVudD1NYXRoLm1heCgxLF8uZHkpLHU9InZlcnRpY2FsIj09PShlLnNoYXBlLm9yaWVudD1UKT8oaT0obnVsbCE9cD9wKlM6ZC54KStfLnN5LG49KG51bGwhPWc/ZypNOmQueSkrZC5keSxvPShudWxsIT15P3kqUzptLngpK18udHkscj1pLHM9biooMS1jKSsoYT1udWxsIT14P3gqTTptLnkpKmMsbD1vLG4qYythKigxLWMpKTooaT0obnVsbCE9cD9wKlM6ZC54KStkLmR4LG49KG51bGwhPWc/ZypNOmQueSkrXy5zeSxyPWkqKDEtYykrKG89bnVsbCE9eT95KlM6bS54KSpjLHM9bixsPWkqYytvKigxLWMpLGE9KG51bGwhPXg/eCpNOm0ueSkrXy50eSksZS5zZXRTaGFwZSh7eDE6aSx5MTpuLHgyOm8seTI6YSxjcHgxOnIsY3B5MTpzLGNweDI6bCxjcHkyOnV9KSxlLnNldFN0eWxlKGguZ2V0SXRlbVN0eWxlKCkpLGUuc3R5bGUuZmlsbCl7Y2FzZSJzb3VyY2UiOmUuc3R5bGUuZmlsbD10Lm5vZGUxLmdldFZpc3VhbCgiY29sb3IiKTticmVhaztjYXNlInRhcmdldCI6ZS5zdHlsZS5maWxsPXQubm9kZTIuZ2V0VmlzdWFsKCJjb2xvciIpfVlzKGUsdC5nZXRNb2RlbCgiZW1waGFzaXMubGluZVN0eWxlIikuZ2V0SXRlbVN0eWxlKCkpLGIuYWRkKGUpLEkuc2V0SXRlbUdyYXBoaWNFbCh0LmRhdGFJbmRleCxlKX0pLGUuZWFjaE5vZGUoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRMYXlvdXQoKSxpPXQuZ2V0TW9kZWwoKSxuPWkuZ2V0KCJsb2NhbFgiKSxvPWkuZ2V0KCJsb2NhbFkiKSxhPWkuZ2V0TW9kZWwoImxhYmVsIikscj1pLmdldE1vZGVsKCJlbXBoYXNpcy5sYWJlbCIpLHM9bmV3IGlzKHtzaGFwZTp7eDpudWxsIT1uP24qUzplLngseTpudWxsIT1vP28qTTplLnksd2lkdGg6ZS5keCxoZWlnaHQ6ZS5keX0sc3R5bGU6aS5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCl9KSxsPXQuZ2V0TW9kZWwoImVtcGhhc2lzLml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpOyRzKHMuc3R5bGUsbCxhLHIse2xhYmVsRmV0Y2hlcjp3LGxhYmVsRGF0YUluZGV4OnQuZGF0YUluZGV4LGRlZmF1bHRUZXh0OnQuaWQsaXNSZWN0VGV4dDohMH0pLHMuc2V0U3R5bGUoImZpbGwiLHQuZ2V0VmlzdWFsKCJjb2xvciIpKSxZcyhzLGwpLGIuYWRkKHMpLHUuc2V0SXRlbUdyYXBoaWNFbCh0LmRhdGFJbmRleCxzKSxzLmRhdGFUeXBlPSJub2RlIn0pLHUuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCxpKXt2YXIgZT11LmdldEl0ZW1Nb2RlbChpKTtlLmdldCgiZHJhZ2dhYmxlIikmJih0LmRyaWZ0PWZ1bmN0aW9uKHQsZSl7by5fZm9jdXNBZGphY2VuY3lEaXNhYmxlZD0hMCx0aGlzLnNoYXBlLngrPXQsdGhpcy5zaGFwZS55Kz1lLHRoaXMuZGlydHkoKSxuLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJkcmFnTm9kZSIsc2VyaWVzSWQ6dy5pZCxkYXRhSW5kZXg6dS5nZXRSYXdJbmRleChpKSxsb2NhbFg6dGhpcy5zaGFwZS54L1MsbG9jYWxZOnRoaXMuc2hhcGUueS9NfSl9LHQub25kcmFnZW5kPWZ1bmN0aW9uKCl7by5fZm9jdXNBZGphY2VuY3lEaXNhYmxlZD0hMX0sdC5kcmFnZ2FibGU9ITAsdC5jdXJzb3I9Im1vdmUiKSxlLmdldCgiZm9jdXNOb2RlQWRqYWNlbmN5IikmJih0Lm9mZigibW91c2VvdmVyIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXtvLl9mb2N1c0FkamFjZW5jeURpc2FibGVkfHwoby5fY2xlYXJUaW1lcigpLG4uZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImZvY3VzTm9kZUFkamFjZW5jeSIsc2VyaWVzSWQ6dy5pZCxkYXRhSW5kZXg6dC5kYXRhSW5kZXh9KSl9KSx0Lm9mZigibW91c2VvdXQiKS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7by5fZm9jdXNBZGphY2VuY3lEaXNhYmxlZHx8by5fZGlzcGF0Y2hVbmZvY3VzKG4pfSkpfSksSS5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LGUpe0kuZ2V0SXRlbU1vZGVsKGUpLmdldCgiZm9jdXNOb2RlQWRqYWNlbmN5IikmJih0Lm9mZigibW91c2VvdmVyIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXtvLl9mb2N1c0FkamFjZW5jeURpc2FibGVkfHwoby5fY2xlYXJUaW1lcigpLG4uZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImZvY3VzTm9kZUFkamFjZW5jeSIsc2VyaWVzSWQ6dy5pZCxlZGdlRGF0YUluZGV4OnQuZGF0YUluZGV4fSkpfSksdC5vZmYoIm1vdXNlb3V0Iikub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe28uX2ZvY3VzQWRqYWNlbmN5RGlzYWJsZWR8fG8uX2Rpc3BhdGNoVW5mb2N1cyhuKX0pKX0pLCF0aGlzLl9kYXRhJiZ3LmdldCgiYW5pbWF0aW9uIikmJmIuc2V0Q2xpcFBhdGgoZnVuY3Rpb24odCxlLGkpe3ZhciBuPW5ldyBpcyh7c2hhcGU6e3g6dC54LTEwLHk6dC55LTEwLHdpZHRoOjAsaGVpZ2h0OnQuaGVpZ2h0KzIwfX0pO3JldHVybiBsbChuLHtzaGFwZTp7d2lkdGg6dC53aWR0aCsyMCxoZWlnaHQ6dC5oZWlnaHQrMjB9fSxlLGkpLG59KGIuZ2V0Qm91bmRpbmdSZWN0KCksdyxmdW5jdGlvbigpe2IucmVtb3ZlQ2xpcFBhdGgoKX0pKSx0aGlzLl9kYXRhPXcuZ2V0RGF0YSgpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJUaW1lcigpfSxfZGlzcGF0Y2hVbmZvY3VzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fY2xlYXJUaW1lcigpLHRoaXMuX3VuZm9jdXNEZWxheVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl91bmZvY3VzRGVsYXlUaW1lcj1udWxsLHQuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InVuZm9jdXNOb2RlQWRqYWNlbmN5IixzZXJpZXNJZDplLl9tb2RlbC5pZH0pfSw1MDApfSxfY2xlYXJUaW1lcjpmdW5jdGlvbigpe3RoaXMuX3VuZm9jdXNEZWxheVRpbWVyJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3VuZm9jdXNEZWxheVRpbWVyKSx0aGlzLl91bmZvY3VzRGVsYXlUaW1lcj1udWxsKX0sZm9jdXNOb2RlQWRqYWNlbmN5OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXRoaXMuX21vZGVsLmdldERhdGEoKSxhPW8uZ3JhcGgscj1uLmRhdGFJbmRleCxzPW8uZ2V0SXRlbU1vZGVsKHIpLGw9bi5lZGdlRGF0YUluZGV4O2lmKG51bGwhPXJ8fG51bGwhPWwpe3ZhciB1PWEuZ2V0Tm9kZUJ5SW5kZXgociksaD1hLmdldEVkZ2VCeUluZGV4KGwpO2lmKGEuZWFjaE5vZGUoZnVuY3Rpb24odCl7bFModCxhUywuMSl9KSxhLmVhY2hFZGdlKGZ1bmN0aW9uKHQpe2xTKHQsclMsLjEpfSksdSl7dVModSxhUyk7dmFyIGM9cy5nZXQoImZvY3VzTm9kZUFkamFjZW5jeSIpOyJvdXRFZGdlcyI9PT1jP0UodS5vdXRFZGdlcyxmdW5jdGlvbih0KXt0LmRhdGFJbmRleDwwfHwodVModCxyUyksdVModC5ub2RlMixhUykpfSk6ImluRWRnZXMiPT09Yz9FKHUuaW5FZGdlcyxmdW5jdGlvbih0KXt0LmRhdGFJbmRleDwwfHwodVModCxyUyksdVModC5ub2RlMSxhUykpfSk6ImFsbEVkZ2VzIj09PWMmJkUodS5lZGdlcyxmdW5jdGlvbih0KXt0LmRhdGFJbmRleDwwfHwodVModCxyUyksdVModC5ub2RlMSxhUyksdVModC5ub2RlMixhUykpfSl9aCYmKHVTKGgsclMpLHVTKGgubm9kZTEsYVMpLHVTKGgubm9kZTIsYVMpKX19LHVuZm9jdXNOb2RlQWRqYWNlbmN5OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXRoaXMuX21vZGVsLmdldEdyYXBoKCk7by5lYWNoTm9kZShmdW5jdGlvbih0KXtsUyh0LGFTKX0pLG8uZWFjaEVkZ2UoZnVuY3Rpb24odCl7bFModCxyUyl9KX19KSxnZih7dHlwZToiZHJhZ05vZGUiLGV2ZW50OiJkcmFnbm9kZSIsdXBkYXRlOiJ1cGRhdGUifSxmdW5jdGlvbihlLHQpe3QuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToic2Fua2V5IixxdWVyeTplfSxmdW5jdGlvbih0KXt0LnNldE5vZGVQb3NpdGlvbihlLmRhdGFJbmRleCxbZS5sb2NhbFgsZS5sb2NhbFldKX0pfSk7ZnVuY3Rpb24gY1ModCl7dmFyIGU9dC5ob3N0R3JhcGguZGF0YS5nZXRSYXdEYXRhSXRlbSh0LmRhdGFJbmRleCk7cmV0dXJuIG51bGwhPWUuZGVwdGgmJjA8PWUuZGVwdGh9ZnVuY3Rpb24gZFModCxsLHUsaCxjKXt2YXIgZD0idmVydGljYWwiPT09Yz8ieCI6InkiO0UodCxmdW5jdGlvbih0KXt2YXIgZSxpLG47dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0TGF5b3V0KClbZF0tZS5nZXRMYXlvdXQoKVtkXX0pO2Zvcih2YXIgbz0wLGE9dC5sZW5ndGgscj0idmVydGljYWwiPT09Yz8iZHgiOiJkeSIscz0wO3M8YTtzKyspMDwobj1vLShpPXRbc10pLmdldExheW91dCgpW2RdKSYmKGU9aS5nZXRMYXlvdXQoKVtkXStuLCJ2ZXJ0aWNhbCI9PT1jP2kuc2V0TGF5b3V0KHt4OmV9LCEwKTppLnNldExheW91dCh7eTplfSwhMCkpLG89aS5nZXRMYXlvdXQoKVtkXStpLmdldExheW91dCgpW3JdK2w7aWYoMDwobj1vLWwtKCJ2ZXJ0aWNhbCI9PT1jP2g6dSkpKWZvcihlPWkuZ2V0TGF5b3V0KClbZF0tbiwidmVydGljYWwiPT09Yz9pLnNldExheW91dCh7eDplfSwhMCk6aS5zZXRMYXlvdXQoe3k6ZX0sITApLG89ZSxzPWEtMjswPD1zOy0tcykwPChuPShpPXRbc10pLmdldExheW91dCgpW2RdK2kuZ2V0TGF5b3V0KClbcl0rbC1vKSYmKGU9aS5nZXRMYXlvdXQoKVtkXS1uLCJ2ZXJ0aWNhbCI9PT1jP2kuc2V0TGF5b3V0KHt4OmV9LCEwKTppLnNldExheW91dCh7eTplfSwhMCkpLG89aS5nZXRMYXlvdXQoKVtkXX0pfWZ1bmN0aW9uIGZTKHQsbyxhKXtFKHQuc2xpY2UoKS5yZXZlcnNlKCksZnVuY3Rpb24odCl7RSh0LGZ1bmN0aW9uKHQpe2lmKHQub3V0RWRnZXMubGVuZ3RoKXt2YXIgZT15Uyh0Lm91dEVkZ2VzLHBTLGEpL3lTKHQub3V0RWRnZXMsdlMsYSk7aWYoInZlcnRpY2FsIj09PWEpe3ZhciBpPXQuZ2V0TGF5b3V0KCkueCsoZS1tUyh0LGEpKSpvO3Quc2V0TGF5b3V0KHt4Oml9LCEwKX1lbHNle3ZhciBuPXQuZ2V0TGF5b3V0KCkueSsoZS1tUyh0LGEpKSpvO3Quc2V0TGF5b3V0KHt5Om59LCEwKX19fSl9KX1mdW5jdGlvbiBwUyh0LGUpe3JldHVybiBtUyh0Lm5vZGUyLGUpKnQuZ2V0VmFsdWUoKX1mdW5jdGlvbiBnUyh0LGUpe3JldHVybiBtUyh0Lm5vZGUxLGUpKnQuZ2V0VmFsdWUoKX1mdW5jdGlvbiBtUyh0LGUpe3JldHVybiJ2ZXJ0aWNhbCI9PT1lP3QuZ2V0TGF5b3V0KCkueCt0LmdldExheW91dCgpLmR4LzI6dC5nZXRMYXlvdXQoKS55K3QuZ2V0TGF5b3V0KCkuZHkvMn1mdW5jdGlvbiB2Uyh0KXtyZXR1cm4gdC5nZXRWYWx1ZSgpfWZ1bmN0aW9uIHlTKHQsZSxpKXtmb3IodmFyIG49MCxvPXQubGVuZ3RoLGE9LTE7KythPG87KXt2YXIgcj0rZS5jYWxsKHQsdFthXSxpKTtpc05hTihyKXx8KG4rPXIpfXJldHVybiBufWZ1bmN0aW9uIHhTKHQsbyxhKXtFKHQsZnVuY3Rpb24odCl7RSh0LGZ1bmN0aW9uKHQpe2lmKHQuaW5FZGdlcy5sZW5ndGgpe3ZhciBlPXlTKHQuaW5FZGdlcyxnUyxhKS95Uyh0LmluRWRnZXMsdlMsYSk7aWYoInZlcnRpY2FsIj09PWEpe3ZhciBpPXQuZ2V0TGF5b3V0KCkueCsoZS1tUyh0LGEpKSpvO3Quc2V0TGF5b3V0KHt4Oml9LCEwKX1lbHNle3ZhciBuPXQuZ2V0TGF5b3V0KCkueSsoZS1tUyh0LGEpKSpvO3Quc2V0TGF5b3V0KHt5Om59LCEwKX19fSl9KX12ZihmdW5jdGlvbih0LHUsZSl7dC5lYWNoU2VyaWVzQnlUeXBlKCJzYW5rZXkiLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KCJub2RlV2lkdGgiKSxpPXQuZ2V0KCJub2RlR2FwIiksbj1mdW5jdGlvbih0LGUpe3JldHVybiB2dSh0LmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KX0odCx1KSxvPSh0LmxheW91dEluZm89bikud2lkdGgsYT1uLmhlaWdodCxyPXQuZ2V0R3JhcGgoKSxzPXIubm9kZXMsbD1yLmVkZ2VzOyFmdW5jdGlvbih0KXtFKHQsZnVuY3Rpb24odCl7dmFyIGU9eVModC5vdXRFZGdlcyx2UyksaT15Uyh0LmluRWRnZXMsdlMpLG49TWF0aC5tYXgoZSxpKTt0LnNldExheW91dCh7dmFsdWU6bn0sITApfSl9KHMpLGZ1bmN0aW9uKHQsZSxpLG4sbyxhLHIscyxsKXsoZnVuY3Rpb24odCxlLGksbixvLGEscil7Zm9yKHZhciBzPVtdLGw9W10sdT1bXSxoPVtdLGM9MCxkPTA7ZDxlLmxlbmd0aDtkKyspc1tkXT0xO2ZvcihkPTA7ZDx0Lmxlbmd0aDtkKyspbFtkXT10W2RdLmluRWRnZXMubGVuZ3RoLDA9PT1sW2RdJiZ1LnB1c2godFtkXSk7dmFyIGY9LTE7Zm9yKDt1Lmxlbmd0aDspe2Zvcih2YXIgcD0wO3A8dS5sZW5ndGg7cCsrKXt2YXIgZz11W3BdLG09Zy5ob3N0R3JhcGguZGF0YS5nZXRSYXdEYXRhSXRlbShnLmRhdGFJbmRleCksdj1udWxsIT1tLmRlcHRoJiYwPD1tLmRlcHRoO3YmJm0uZGVwdGg+ZiYmKGY9bS5kZXB0aCksZy5zZXRMYXlvdXQoe2RlcHRoOnY/bS5kZXB0aDpjfSwhMCksInZlcnRpY2FsIj09PWE/Zy5zZXRMYXlvdXQoe2R5Oml9LCEwKTpnLnNldExheW91dCh7ZHg6aX0sITApO2Zvcih2YXIgeT0wO3k8Zy5vdXRFZGdlcy5sZW5ndGg7eSsrKXt2YXIgeD1nLm91dEVkZ2VzW3ldLF89ZS5pbmRleE9mKHgpO3NbX109MDt2YXIgdz14Lm5vZGUyLGI9dC5pbmRleE9mKHcpOzA9PS0tbFtiXSYmaC5pbmRleE9mKHcpPDAmJmgucHVzaCh3KX19KytjLHU9aCxoPVtdfWZvcihkPTA7ZDxzLmxlbmd0aDtkKyspaWYoMT09PXNbZF0pdGhyb3cgbmV3IEVycm9yKCJTYW5rZXkgaXMgYSBEQUcsIHRoZSBvcmlnaW5hbCBkYXRhIGhhcyBjeWNsZSEiKTt2YXIgUz1jLTE8Zj9mOmMtMTtyJiYibGVmdCIhPT1yJiZmdW5jdGlvbih0LGUsaSxuKXtpZigicmlnaHQiPT09ZSl7Zm9yKHZhciBvPVtdLGE9dCxyPTA7YS5sZW5ndGg7KXtmb3IodmFyIHM9MDtzPGEubGVuZ3RoO3MrKyl7dmFyIGw9YVtzXTtsLnNldExheW91dCh7c2tOb2RlSGVpZ2h0OnJ9LCEwKTtmb3IodmFyIHU9MDt1PGwuaW5FZGdlcy5sZW5ndGg7dSsrKXt2YXIgaD1sLmluRWRnZXNbdV07by5pbmRleE9mKGgubm9kZTEpPDAmJm8ucHVzaChoLm5vZGUxKX19YT1vLG89W10sKytyfUUodCxmdW5jdGlvbih0KXtjUyh0KXx8dC5zZXRMYXlvdXQoe2RlcHRoOk1hdGgubWF4KDAsbi10LmdldExheW91dCgpLnNrTm9kZUhlaWdodCl9LCEwKX0pfWVsc2UianVzdGlmeSI9PT1lJiZmdW5jdGlvbih0LGUpe0UodCxmdW5jdGlvbih0KXtjUyh0KXx8dC5vdXRFZGdlcy5sZW5ndGh8fHQuc2V0TGF5b3V0KHtkZXB0aDplfSwhMCl9KX0odCxuKX0odCxyLDAsUyk7IWZ1bmN0aW9uKHQsaSxuKXtFKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRMYXlvdXQoKS5kZXB0aCppOyJ2ZXJ0aWNhbCI9PT1uP3Quc2V0TGF5b3V0KHt5OmV9LCEwKTp0LnNldExheW91dCh7eDplfSwhMCl9KX0odCwidmVydGljYWwiPT09YT8oby1pKS9TOihuLWkpL1MsYSl9KSh0LGUsaSxvLGEscyxsKSxmdW5jdGlvbih0LGUsaSxuLG8sYSxyKXt2YXIgcz1mdW5jdGlvbih0LGUpe3ZhciBpPVtdLG49InZlcnRpY2FsIj09PWU/InkiOiJ4IixvPUtvKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TGF5b3V0KClbbl19KTtyZXR1cm4gby5rZXlzLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksRShvLmtleXMsZnVuY3Rpb24odCl7aS5wdXNoKG8uYnVja2V0cy5nZXQodCkpfSksaX0odCxyKTsoZnVuY3Rpb24odCxlLG8sYSxyLHMpe3ZhciBsPTEvMDtFKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgsaT0wO0UodCxmdW5jdGlvbih0KXtpKz10LmdldExheW91dCgpLnZhbHVlfSk7dmFyIG49InZlcnRpY2FsIj09PXM/KGEtKGUtMSkqcikvaTooby0oZS0xKSpyKS9pO248bCYmKGw9bil9KSxFKHQsZnVuY3Rpb24odCl7RSh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRMYXlvdXQoKS52YWx1ZSpsOyJ2ZXJ0aWNhbCI9PT1zPyh0LnNldExheW91dCh7eDplfSwhMCksdC5zZXRMYXlvdXQoe2R4Oml9LCEwKSk6KHQuc2V0TGF5b3V0KHt5OmV9LCEwKSx0LnNldExheW91dCh7ZHk6aX0sITApKX0pfSksRShlLGZ1bmN0aW9uKHQpe3ZhciBlPSt0LmdldFZhbHVlKCkqbDt0LnNldExheW91dCh7ZHk6ZX0sITApfSl9KShzLGUsaSxuLG8sciksZFMocyxvLGksbixyKTtmb3IodmFyIGw9MTswPGE7YS0tKWZTKHMsbCo9Ljk5LHIpLGRTKHMsbyxpLG4scikseFMocyxsLHIpLGRTKHMsbyxpLG4scil9KHQsZSxhLG8sbixyLHMpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9InZlcnRpY2FsIj09PWU/IngiOiJ5IjtFKHQsZnVuY3Rpb24odCl7dC5vdXRFZGdlcy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubm9kZTIuZ2V0TGF5b3V0KClbaV0tZS5ub2RlMi5nZXRMYXlvdXQoKVtpXX0pLHQuaW5FZGdlcy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubm9kZTEuZ2V0TGF5b3V0KClbaV0tZS5ub2RlMS5nZXRMYXlvdXQoKVtpXX0pfSksRSh0LGZ1bmN0aW9uKHQpe3ZhciBlPTAsaT0wO0UodC5vdXRFZGdlcyxmdW5jdGlvbih0KXt0LnNldExheW91dCh7c3k6ZX0sITApLGUrPXQuZ2V0TGF5b3V0KCkuZHl9KSxFKHQuaW5FZGdlcyxmdW5jdGlvbih0KXt0LnNldExheW91dCh7dHk6aX0sITApLGkrPXQuZ2V0TGF5b3V0KCkuZHl9KX0pfSh0LHMpfShzLGwsZSxpLG8sYSwwIT09TShzLGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5nZXRMYXlvdXQoKS52YWx1ZX0pLmxlbmd0aD8wOnQuZ2V0KCJsYXlvdXRJdGVyYXRpb25zIiksdC5nZXQoIm9yaWVudCIpLHQuZ2V0KCJub2RlQWxpZ24iKSl9KX0pLHlmKGZ1bmN0aW9uKHQsZSl7dC5lYWNoU2VyaWVzQnlUeXBlKCJzYW5rZXkiLGZ1bmN0aW9uKG4pe3ZhciB0PW4uZ2V0R3JhcGgoKS5ub2RlcztpZih0Lmxlbmd0aCl7dmFyIG89MS8wLGE9LTEvMDtFKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRMYXlvdXQoKS52YWx1ZTtlPG8mJihvPWUpLGE8ZSYmKGE9ZSl9KSxFKHQsZnVuY3Rpb24odCl7dmFyIGU9bmV3IGFfKHt0eXBlOiJjb2xvciIsbWFwcGluZ01ldGhvZDoibGluZWFyIixkYXRhRXh0ZW50OltvLGFdLHZpc3VhbDpuLmdldCgiY29sb3IiKX0pLm1hcFZhbHVlVG9WaXN1YWwodC5nZXRMYXlvdXQoKS52YWx1ZSksaT10LmdldE1vZGVsKCkuZ2V0KCJpdGVtU3R5bGUuY29sb3IiKTtudWxsIT1pP3Quc2V0VmlzdWFsKCJjb2xvciIsaSk6dC5zZXRWaXN1YWwoImNvbG9yIixlKX0pfX0pfSk7dmFyIF9TPXtfYmFzZUF4aXNEaW06bnVsbCxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpLG4sbz1lLmdldENvbXBvbmVudCgieEF4aXMiLHRoaXMuZ2V0KCJ4QXhpc0luZGV4IikpLGE9ZS5nZXRDb21wb25lbnQoInlBeGlzIix0aGlzLmdldCgieUF4aXNJbmRleCIpKSxyPW8uZ2V0KCJ0eXBlIikscz1hLmdldCgidHlwZSIpOyJjYXRlZ29yeSI9PT1yPyh0LmxheW91dD0iaG9yaXpvbnRhbCIsaT1vLmdldE9yZGluYWxNZXRhKCksbj0hMCk6ImNhdGVnb3J5Ij09PXM/KHQubGF5b3V0PSJ2ZXJ0aWNhbCIsaT1hLmdldE9yZGluYWxNZXRhKCksbj0hMCk6dC5sYXlvdXQ9dC5sYXlvdXR8fCJob3Jpem9udGFsIjt2YXIgbD1bIngiLCJ5Il0sdT0iaG9yaXpvbnRhbCI9PT10LmxheW91dD8wOjEsaD10aGlzLl9iYXNlQXhpc0RpbT1sW3VdLGM9bFsxLXVdLGQ9W28sYV0sZj1kW3VdLmdldCgidHlwZSIpLHA9ZFsxLXVdLmdldCgidHlwZSIpLGc9dC5kYXRhO2lmKGcmJm4pe3ZhciBtPVtdO0UoZyxmdW5jdGlvbih0LGUpe3ZhciBpO3QudmFsdWUmJmsodC52YWx1ZSk/KGk9dC52YWx1ZS5zbGljZSgpLHQudmFsdWUudW5zaGlmdChlKSk6ayh0KT8oaT10LnNsaWNlKCksdC51bnNoaWZ0KGUpKTppPXQsbS5wdXNoKGkpfSksdC5kYXRhPW19dmFyIHY9dGhpcy5kZWZhdWx0VmFsdWVEaW1lbnNpb25zLHk9W3tuYW1lOmgsdHlwZTpMZihmKSxvcmRpbmFsTWV0YTppLG90aGVyRGltczp7dG9vbHRpcDohMSxpdGVtTmFtZTowfSxkaW1zRGVmOlsiYmFzZSJdfSx7bmFtZTpjLHR5cGU6TGYocCksZGltc0RlZjp2LnNsaWNlKCl9XTtyZXR1cm4gQnYodGhpcyx7Y29vcmREaW1lbnNpb25zOnksZGltZW5zaW9uc0NvdW50OnYubGVuZ3RoKzEsZW5jb2RlRGVmYXVsdGVyOlQoWHUseSx0aGlzKX0pfSxnZXRCYXNlQXhpczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VBeGlzRGltO3JldHVybiB0aGlzLmVjTW9kZWwuZ2V0Q29tcG9uZW50KHQrIkF4aXMiLHRoaXMuZ2V0KHQrIkF4aXNJbmRleCIpKS5heGlzfX07YihpYy5leHRlbmQoe3R5cGU6InNlcmllcy5ib3hwbG90IixkZXBlbmRlbmNpZXM6WyJ4QXhpcyIsInlBeGlzIiwiZ3JpZCJdLGRlZmF1bHRWYWx1ZURpbWVuc2lvbnM6W3tuYW1lOiJtaW4iLGRlZmF1bHRUb29sdGlwOiEwfSx7bmFtZToiUTEiLGRlZmF1bHRUb29sdGlwOiEwfSx7bmFtZToibWVkaWFuIixkZWZhdWx0VG9vbHRpcDohMH0se25hbWU6IlEzIixkZWZhdWx0VG9vbHRpcDohMH0se25hbWU6Im1heCIsZGVmYXVsdFRvb2x0aXA6ITB9XSxkaW1lbnNpb25zOm51bGwsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06ImNhcnRlc2lhbjJkIixsZWdlbmRIb3Zlckxpbms6ITAsaG92ZXJBbmltYXRpb246ITAsbGF5b3V0Om51bGwsYm94V2lkdGg6WzcsNTBdLGl0ZW1TdHlsZTp7Y29sb3I6IiNmZmYiLGJvcmRlcldpZHRoOjF9LGVtcGhhc2lzOntpdGVtU3R5bGU6e2JvcmRlcldpZHRoOjIsc2hhZG93Qmx1cjo1LHNoYWRvd09mZnNldFg6MixzaGFkb3dPZmZzZXRZOjIsc2hhZG93Q29sb3I6InJnYmEoMCwwLDAsMC40KSJ9fSxhbmltYXRpb25FYXNpbmc6ImVsYXN0aWNPdXQiLGFuaW1hdGlvbkR1cmF0aW9uOjgwMH19KSxfUywhMCk7dmFyIHdTPVsiaXRlbVN0eWxlIl0sYlM9WyJlbXBoYXNpcyIsIml0ZW1TdHlsZSJdLFNTPShnYy5leHRlbmQoe3R5cGU6ImJveHBsb3QiLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5nZXREYXRhKCksYT10aGlzLmdyb3VwLHI9dGhpcy5fZGF0YTt0aGlzLl9kYXRhfHxhLnJlbW92ZUFsbCgpO3ZhciBzPSJob3Jpem9udGFsIj09PXQuZ2V0KCJsYXlvdXQiKT8xOjA7by5kaWZmKHIpLmFkZChmdW5jdGlvbih0KXtpZihvLmhhc1ZhbHVlKHQpKXt2YXIgZT1NUyhvLmdldEl0ZW1MYXlvdXQodCksbyx0LHMsITApO28uc2V0SXRlbUdyYXBoaWNFbCh0LGUpLGEuYWRkKGUpfX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPXIuZ2V0SXRlbUdyYXBoaWNFbChlKTtpZihvLmhhc1ZhbHVlKHQpKXt2YXIgbj1vLmdldEl0ZW1MYXlvdXQodCk7aT9JUyhuLGksbyx0KTppPU1TKG4sbyx0LHMpLGEuYWRkKGkpLG8uc2V0SXRlbUdyYXBoaWNFbCh0LGkpfWVsc2UgYS5yZW1vdmUoaSl9KS5yZW1vdmUoZnVuY3Rpb24odCl7dmFyIGU9ci5nZXRJdGVtR3JhcGhpY0VsKHQpO2UmJmEucmVtb3ZlKGUpfSkuZXhlY3V0ZSgpLHRoaXMuX2RhdGE9b30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXAsaT10aGlzLl9kYXRhO3RoaXMuX2RhdGE9bnVsbCxpJiZpLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQpe3QmJmUucmVtb3ZlKHQpfSl9LGRpc3Bvc2U6ZXR9KSxTci5leHRlbmQoe3R5cGU6ImJveHBsb3RCb3hQYXRoIixzaGFwZTp7fSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnBvaW50cyxuPTA7Zm9yKHQubW92ZVRvKGlbbl1bMF0saVtuXVsxXSksbisrO248NDtuKyspdC5saW5lVG8oaVtuXVswXSxpW25dWzFdKTtmb3IodC5jbG9zZVBhdGgoKTtuPGkubGVuZ3RoO24rKyl0Lm1vdmVUbyhpW25dWzBdLGlbbl1bMV0pLG4rKyx0LmxpbmVUbyhpW25dWzBdLGlbbl1bMV0pfX0pKTtmdW5jdGlvbiBNUyh0LGUsaSxuLG8pe3ZhciBhPXQuZW5kcyxyPW5ldyBTUyh7c2hhcGU6e3BvaW50czpvP2Z1bmN0aW9uKHQsZSxpKXtyZXR1cm4gTih0LGZ1bmN0aW9uKHQpe3JldHVybih0PXQuc2xpY2UoKSlbZV09aS5pbml0QmFzZWxpbmUsdH0pfShhLG4sdCk6YX19KTtyZXR1cm4gSVModCxyLGUsaSxvKSxyfWZ1bmN0aW9uIElTKHQsZSxpLG4sbyl7dmFyIGE9aS5ob3N0TW9kZWw7KDAseWxbbz8iaW5pdFByb3BzIjoidXBkYXRlUHJvcHMiXSkoZSx7c2hhcGU6e3BvaW50czp0LmVuZHN9fSxhLG4pO3ZhciByPWkuZ2V0SXRlbU1vZGVsKG4pLHM9ci5nZXRNb2RlbCh3UyksbD1pLmdldEl0ZW1WaXN1YWwobiwiY29sb3IiKSx1PXMuZ2V0SXRlbVN0eWxlKFsiYm9yZGVyQ29sb3IiXSk7dS5zdHJva2U9bCx1LnN0cm9rZU5vU2NhbGU9ITAsZS51c2VTdHlsZSh1KSxlLnoyPTEwMCxZcyhlLHIuZ2V0TW9kZWwoYlMpLmdldEl0ZW1TdHlsZSgpKX12YXIgVFM9WyJpdGVtU3R5bGUiLCJib3JkZXJDb2xvciJdLEFTPUU7eWYoZnVuY3Rpb24obix0KXt2YXIgbz1uLmdldCgiY29sb3IiKTtuLmVhY2hSYXdTZXJpZXNCeVR5cGUoImJveHBsb3QiLGZ1bmN0aW9uKHQpe3ZhciBlPW9bdC5zZXJpZXNJbmRleCVvLmxlbmd0aF0saT10LmdldERhdGEoKTtpLnNldFZpc3VhbCh7bGVnZW5kU3ltYm9sOiJyb3VuZFJlY3QiLGNvbG9yOnQuZ2V0KFRTKXx8ZX0pLG4uaXNTZXJpZXNGaWx0ZXJlZCh0KXx8aS5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0SXRlbU1vZGVsKHQpO2kuc2V0SXRlbVZpc3VhbCh0LHtjb2xvcjplLmdldChUUywhMCl9KX0pfSl9KSx2ZihmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgbj1bXSxvPVtdO3JldHVybiB0LmVhY2hTZXJpZXNCeVR5cGUoImJveHBsb3QiLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QmFzZUF4aXMoKSxpPV8obyxlKTtpPDAmJihpPW8ubGVuZ3RoLG9baV09ZSxuW2ldPXtheGlzOmUsc2VyaWVzTW9kZWxzOltdfSksbltpXS5zZXJpZXNNb2RlbHMucHVzaCh0KX0pLG59KHQpO0FTKGUsZnVuY3Rpb24oaSl7dmFyIHQ9aS5zZXJpZXNNb2RlbHM7dC5sZW5ndGgmJihmdW5jdGlvbih0KXt2YXIgZSxpLG49dC5heGlzLG89dC5zZXJpZXNNb2RlbHMsYT1vLmxlbmd0aCxyPXQuYm94V2lkdGhMaXN0PVtdLHM9dC5ib3hPZmZzZXRMaXN0PVtdLGw9W107aWYoImNhdGVnb3J5Ij09PW4udHlwZSlpPW4uZ2V0QmFuZFdpZHRoKCk7ZWxzZXt2YXIgdT0wO0FTKG8sZnVuY3Rpb24odCl7dT1NYXRoLm1heCh1LHQuZ2V0RGF0YSgpLmNvdW50KCkpfSksZT1uLmdldEV4dGVudCgpLE1hdGguYWJzKGVbMV0tZVswXSl9QVMobyxmdW5jdGlvbih0KXt2YXIgZT10LmdldCgiYm94V2lkdGgiKTtrKGUpfHwoZT1bZSxlXSksbC5wdXNoKFtQbChlWzBdLGkpfHwwLFBsKGVbMV0saSl8fDBdKX0pO3ZhciBoPS44KmktMixjPWgvYSouMyxkPShoLWMqKGEtMSkpL2EsZj1kLzItaC8yO0FTKG8sZnVuY3Rpb24odCxlKXtzLnB1c2goZiksZis9YytkLHIucHVzaChNYXRoLm1pbihNYXRoLm1heChkLGxbZV1bMF0pLGxbZV1bMV0pKX0pfShpKSxBUyh0LGZ1bmN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQscixlKXt2YXIgcz10LmNvb3JkaW5hdGVTeXN0ZW0sbD10LmdldERhdGEoKSxhPWUvMix1PSJob3Jpem9udGFsIj09PXQuZ2V0KCJsYXlvdXQiKT8wOjEsaD0xLXUsaT1bIngiLCJ5Il0sbj1sLm1hcERpbWVuc2lvbihpW3VdKSxvPWwubWFwRGltZW5zaW9uKGlbaF0sITApO2lmKG51bGw9PW58fG8ubGVuZ3RoPDUpcmV0dXJuO2Zvcih2YXIgYz0wO2M8bC5jb3VudCgpO2MrKyl7dmFyIGQ9bC5nZXQobixjKSxmPXgoZCxvWzJdLGMpLHA9eChkLG9bMF0sYyksZz14KGQsb1sxXSxjKSxtPXgoZCxvWzNdLGMpLHY9eChkLG9bNF0sYykseT1bXTtfKHksZywwKSxfKHksbSwxKSx5LnB1c2gocCxnLHYsbSksdyh5LHApLHcoeSx2KSx3KHksZiksbC5zZXRJdGVtTGF5b3V0KGMse2luaXRCYXNlbGluZTpmW2hdLGVuZHM6eX0pfWZ1bmN0aW9uIHgodCxlLGkpe3ZhciBuLG89bC5nZXQoZSxpKSxhPVtdO3JldHVybiBhW3VdPXQsYVtoXT1vLGlzTmFOKHQpfHxpc05hTihvKT9uPVtOYU4sTmFOXToobj1zLmRhdGFUb1BvaW50KGEpKVt1XSs9cixufWZ1bmN0aW9uIF8odCxlLGkpe3ZhciBuPWUuc2xpY2UoKSxvPWUuc2xpY2UoKTtuW3VdKz1hLG9bdV0tPWEsaT90LnB1c2gobixvKTp0LnB1c2gobyxuKX1mdW5jdGlvbiB3KHQsZSl7dmFyIGk9ZS5zbGljZSgpLG49ZS5zbGljZSgpO2lbdV0tPWEsblt1XSs9YSx0LnB1c2goaSxuKX19KHQsaS5ib3hPZmZzZXRMaXN0W2VdLGkuYm94V2lkdGhMaXN0W2VdKX0pKX0pfSksYihpYy5leHRlbmQoe3R5cGU6InNlcmllcy5jYW5kbGVzdGljayIsZGVwZW5kZW5jaWVzOlsieEF4aXMiLCJ5QXhpcyIsImdyaWQiXSxkZWZhdWx0VmFsdWVEaW1lbnNpb25zOlt7bmFtZToib3BlbiIsZGVmYXVsdFRvb2x0aXA6ITB9LHtuYW1lOiJjbG9zZSIsZGVmYXVsdFRvb2x0aXA6ITB9LHtuYW1lOiJsb3dlc3QiLGRlZmF1bHRUb29sdGlwOiEwfSx7bmFtZToiaGlnaGVzdCIsZGVmYXVsdFRvb2x0aXA6ITB9XSxkaW1lbnNpb25zOm51bGwsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06ImNhcnRlc2lhbjJkIixsZWdlbmRIb3Zlckxpbms6ITAsaG92ZXJBbmltYXRpb246ITAsbGF5b3V0Om51bGwsY2xpcDohMCxpdGVtU3R5bGU6e2NvbG9yOiIjYzIzNTMxIixjb2xvcjA6IiMzMTQ2NTYiLGJvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IiNjMjM1MzEiLGJvcmRlckNvbG9yMDoiIzMxNDY1NiJ9LGVtcGhhc2lzOntpdGVtU3R5bGU6e2JvcmRlcldpZHRoOjJ9fSxiYXJNYXhXaWR0aDpudWxsLGJhck1pbldpZHRoOm51bGwsYmFyV2lkdGg6bnVsbCxsYXJnZTohMCxsYXJnZVRocmVzaG9sZDo2MDAscHJvZ3Jlc3NpdmU6M2UzLHByb2dyZXNzaXZlVGhyZXNob2xkOjFlNCxwcm9ncmVzc2l2ZUNodW5rTW9kZToibW9kIixhbmltYXRpb25VcGRhdGU6ITEsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGFuaW1hdGlvbkR1cmF0aW9uOjMwMH0sZ2V0U2hhZG93RGltOmZ1bmN0aW9uKCl7cmV0dXJuIm9wZW4ifSxicnVzaFNlbGVjdG9yOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lLmdldEl0ZW1MYXlvdXQodCk7cmV0dXJuIG4mJmkucmVjdChuLmJydXNoUmVjdCl9fSksX1MsITApO3ZhciBEUz1bIml0ZW1TdHlsZSJdLENTPVsiZW1waGFzaXMiLCJpdGVtU3R5bGUiXSxMUz1bImNvbG9yIiwiY29sb3IwIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJDb2xvcjAiXSxrUz0oZ2MuZXh0ZW5kKHt0eXBlOiJjYW5kbGVzdGljayIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLmdyb3VwLnJlbW92ZUNsaXBQYXRoKCksdGhpcy5fdXBkYXRlRHJhd01vZGUodCksdGhpcy5faXNMYXJnZURyYXc/dGhpcy5fcmVuZGVyTGFyZ2UodCk6dGhpcy5fcmVuZGVyTm9ybWFsKHQpfSxpbmNyZW1lbnRhbFByZXBhcmVSZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2NsZWFyKCksdGhpcy5fdXBkYXRlRHJhd01vZGUodCl9LGluY3JlbWVudGFsUmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuX2lzTGFyZ2VEcmF3P3RoaXMuX2luY3JlbWVudGFsUmVuZGVyTGFyZ2UodCxlKTp0aGlzLl9pbmNyZW1lbnRhbFJlbmRlck5vcm1hbCh0LGUpfSxfdXBkYXRlRHJhd01vZGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5waXBlbGluZUNvbnRleHQubGFyZ2U7KG51bGw9PXRoaXMuX2lzTGFyZ2VEcmF3fHxlXnRoaXMuX2lzTGFyZ2VEcmF3KSYmKHRoaXMuX2lzTGFyZ2VEcmF3PWUsdGhpcy5fY2xlYXIoKSl9LF9yZW5kZXJOb3JtYWw6ZnVuY3Rpb24obyl7dmFyIGE9by5nZXREYXRhKCkscj10aGlzLl9kYXRhLHM9dGhpcy5ncm91cCxsPWEuZ2V0TGF5b3V0KCJpc1NpbXBsZUJveCIpLHU9by5nZXQoImNsaXAiLCEwKSx0PW8uY29vcmRpbmF0ZVN5c3RlbSxoPXQuZ2V0QXJlYSYmdC5nZXRBcmVhKCk7dGhpcy5fZGF0YXx8cy5yZW1vdmVBbGwoKSxhLmRpZmYocikuYWRkKGZ1bmN0aW9uKHQpe2lmKGEuaGFzVmFsdWUodCkpe3ZhciBlLGk9YS5nZXRJdGVtTGF5b3V0KHQpO2lmKHUmJk5TKGgsaSkpcmV0dXJuO2xsKGU9UFMoaSx0LCEwKSx7c2hhcGU6e3BvaW50czppLmVuZHN9fSxvLHQpLE9TKGUsYSx0LGwpLHMuYWRkKGUpLGEuc2V0SXRlbUdyYXBoaWNFbCh0LGUpfX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPXIuZ2V0SXRlbUdyYXBoaWNFbChlKTtpZihhLmhhc1ZhbHVlKHQpKXt2YXIgbj1hLmdldEl0ZW1MYXlvdXQodCk7dSYmTlMoaCxuKT9zLnJlbW92ZShpKTooaT9zbChpLHtzaGFwZTp7cG9pbnRzOm4uZW5kc319LG8sdCk6aT1QUyhuLHQpLE9TKGksYSx0LGwpLHMuYWRkKGkpLGEuc2V0SXRlbUdyYXBoaWNFbCh0LGkpKX1lbHNlIHMucmVtb3ZlKGkpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPXIuZ2V0SXRlbUdyYXBoaWNFbCh0KTtlJiZzLnJlbW92ZShlKX0pLmV4ZWN1dGUoKSx0aGlzLl9kYXRhPWF9LF9yZW5kZXJMYXJnZTpmdW5jdGlvbih0KXt0aGlzLl9jbGVhcigpLHpTKHQsdGhpcy5ncm91cCk7dmFyIGU9dC5nZXQoImNsaXAiLCEwKT95bSh0LmNvb3JkaW5hdGVTeXN0ZW0sITEsdCk6bnVsbDtlP3RoaXMuZ3JvdXAuc2V0Q2xpcFBhdGgoZSk6dGhpcy5ncm91cC5yZW1vdmVDbGlwUGF0aCgpfSxfaW5jcmVtZW50YWxSZW5kZXJOb3JtYWw6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGksbj1lLmdldERhdGEoKSxvPW4uZ2V0TGF5b3V0KCJpc1NpbXBsZUJveCIpO251bGwhPShpPXQubmV4dCgpKTspe3ZhciBhO09TKGE9UFMobi5nZXRJdGVtTGF5b3V0KGkpLGkpLG4saSxvKSxhLmluY3JlbWVudGFsPSEwLHRoaXMuZ3JvdXAuYWRkKGEpfX0sX2luY3JlbWVudGFsUmVuZGVyTGFyZ2U6ZnVuY3Rpb24odCxlKXt6UyhlLHRoaXMuZ3JvdXAsITApfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5fY2xlYXIoKX0sX2NsZWFyOmZ1bmN0aW9uKCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9LGRpc3Bvc2U6ZXR9KSxTci5leHRlbmQoe3R5cGU6Im5vcm1hbENhbmRsZXN0aWNrQm94IixzaGFwZTp7fSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnBvaW50czt0aGlzLl9fc2ltcGxlQm94Pyh0Lm1vdmVUbyhpWzRdWzBdLGlbNF1bMV0pLHQubGluZVRvKGlbNl1bMF0saVs2XVsxXSkpOih0Lm1vdmVUbyhpWzBdWzBdLGlbMF1bMV0pLHQubGluZVRvKGlbMV1bMF0saVsxXVsxXSksdC5saW5lVG8oaVsyXVswXSxpWzJdWzFdKSx0LmxpbmVUbyhpWzNdWzBdLGlbM11bMV0pLHQuY2xvc2VQYXRoKCksdC5tb3ZlVG8oaVs0XVswXSxpWzRdWzFdKSx0LmxpbmVUbyhpWzVdWzBdLGlbNV1bMV0pLHQubW92ZVRvKGlbNl1bMF0saVs2XVsxXSksdC5saW5lVG8oaVs3XVswXSxpWzddWzFdKSl9fSkpO2Z1bmN0aW9uIFBTKHQsZSxpKXt2YXIgbj10LmVuZHM7cmV0dXJuIG5ldyBrUyh7c2hhcGU6e3BvaW50czppP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIE4odCxmdW5jdGlvbih0KXtyZXR1cm4odD10LnNsaWNlKCkpWzFdPWUuaW5pdEJhc2VsaW5lLHR9KX0obix0KTpufSx6MjoxMDB9KX1mdW5jdGlvbiBOUyh0LGUpe2Zvcih2YXIgaT0hMCxuPTA7bjxlLmVuZHMubGVuZ3RoO24rKylpZih0LmNvbnRhaW4oZS5lbmRzW25dWzBdLGUuZW5kc1tuXVsxXSkpe2k9ITE7YnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gT1ModCxlLGksbil7dmFyIG89ZS5nZXRJdGVtTW9kZWwoaSksYT1vLmdldE1vZGVsKERTKSxyPWUuZ2V0SXRlbVZpc3VhbChpLCJjb2xvciIpLHM9ZS5nZXRJdGVtVmlzdWFsKGksImJvcmRlckNvbG9yIil8fHIsbD1hLmdldEl0ZW1TdHlsZShMUyk7dC51c2VTdHlsZShsKSx0LnN0eWxlLnN0cm9rZU5vU2NhbGU9ITAsdC5zdHlsZS5maWxsPXIsdC5zdHlsZS5zdHJva2U9cyx0Ll9fc2ltcGxlQm94PW4sWXModCxvLmdldE1vZGVsKENTKS5nZXRJdGVtU3R5bGUoKSl9dmFyIEVTPVNyLmV4dGVuZCh7dHlwZToibGFyZ2VDYW5kbGVzdGlja0JveCIsc2hhcGU6e30sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUucG9pbnRzLG49MDtuPGkubGVuZ3RoOylpZih0aGlzLl9fc2lnbj09PWlbbisrXSl7dmFyIG89aVtuKytdO3QubW92ZVRvKG8saVtuKytdKSx0LmxpbmVUbyhvLGlbbisrXSl9ZWxzZSBuKz0zfX0pO2Z1bmN0aW9uIHpTKHQsZSxpKXt2YXIgbj10LmdldERhdGEoKSxvPW4uZ2V0TGF5b3V0KCJsYXJnZVBvaW50cyIpLGE9bmV3IEVTKHtzaGFwZTp7cG9pbnRzOm99LF9fc2lnbjoxfSk7ZS5hZGQoYSk7dmFyIHI9bmV3IEVTKHtzaGFwZTp7cG9pbnRzOm99LF9fc2lnbjotMX0pO2UuYWRkKHIpLFJTKDEsYSx0LG4pLFJTKC0xLHIsdCxuKSxpJiYoYS5pbmNyZW1lbnRhbD0hMCxyLmluY3JlbWVudGFsPSEwKX1mdW5jdGlvbiBSUyh0LGUsaSxuKXt2YXIgbz0wPHQ/IlAiOiJOIixhPW4uZ2V0VmlzdWFsKCJib3JkZXJDb2xvciIrbyl8fG4uZ2V0VmlzdWFsKCJjb2xvciIrbykscj1pLmdldE1vZGVsKERTKS5nZXRJdGVtU3R5bGUoTFMpO2UudXNlU3R5bGUociksZS5zdHlsZS5maWxsPW51bGwsZS5zdHlsZS5zdHJva2U9YX12YXIgQlM9WyJpdGVtU3R5bGUiLCJib3JkZXJDb2xvciJdLFZTPVsiaXRlbVN0eWxlIiwiYm9yZGVyQ29sb3IwIl0sR1M9WyJpdGVtU3R5bGUiLCJjb2xvciJdLEZTPVsiaXRlbVN0eWxlIiwiY29sb3IwIl0sV1M9e3Nlcmllc1R5cGU6ImNhbmRsZXN0aWNrIixwbGFuOmRjKCkscGVyZm9ybVJhd1NlcmllczohMCxyZXNldDpmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0RGF0YSgpLG49dC5waXBlbGluZUNvbnRleHQubGFyZ2U7aWYoaS5zZXRWaXN1YWwoe2xlZ2VuZFN5bWJvbDoicm91bmRSZWN0Iixjb2xvclA6YSgxLHQpLGNvbG9yTjphKC0xLHQpLGJvcmRlckNvbG9yUDpyKDEsdCksYm9yZGVyQ29sb3JOOnIoLTEsdCl9KSwhZS5pc1Nlcmllc0ZpbHRlcmVkKHQpKXJldHVybiFuJiZ7cHJvZ3Jlc3M6ZnVuY3Rpb24odCxlKXt2YXIgaTtmb3IoO251bGwhPShpPXQubmV4dCgpKTspe3ZhciBuPWUuZ2V0SXRlbU1vZGVsKGkpLG89ZS5nZXRJdGVtTGF5b3V0KGkpLnNpZ247ZS5zZXRJdGVtVmlzdWFsKGkse2NvbG9yOmEobyxuKSxib3JkZXJDb2xvcjpyKG8sbil9KX19fTtmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGUuZ2V0KDA8dD9HUzpGUyl9ZnVuY3Rpb24gcih0LGUpe3JldHVybiBlLmdldCgwPHQ/QlM6VlMpfX19LEhTPSJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5P0Zsb2F0MzJBcnJheTpBcnJheSxaUz17c2VyaWVzVHlwZToiY2FuZGxlc3RpY2siLHBsYW46ZGMoKSxyZXNldDpmdW5jdGlvbih0KXt2YXIgeD10LmNvb3JkaW5hdGVTeXN0ZW0sZT10LmdldERhdGEoKSxfPWZ1bmN0aW9uKHQsZSl7dmFyIGksbj10LmdldEJhc2VBeGlzKCksbz0iY2F0ZWdvcnkiPT09bi50eXBlP24uZ2V0QmFuZFdpZHRoKCk6KGk9bi5nZXRFeHRlbnQoKSxNYXRoLmFicyhpWzFdLWlbMF0pL2UuY291bnQoKSksYT1QbChIKHQuZ2V0KCJiYXJNYXhXaWR0aCIpLG8pLG8pLHI9UGwoSCh0LmdldCgiYmFyTWluV2lkdGgiKSwxKSxvKSxzPXQuZ2V0KCJiYXJXaWR0aCIpO3JldHVybiBudWxsIT1zP1BsKHMsbyk6TWF0aC5tYXgoTWF0aC5taW4oby8yLGEpLHIpfSh0LGUpLGk9WyJ4IiwieSJdLHc9ZS5tYXBEaW1lbnNpb24oaVswXSksbj1lLm1hcERpbWVuc2lvbihpWzFdLCEwKSxiPW5bMF0sUz1uWzFdLE09blsyXSxJPW5bM107aWYoZS5zZXRMYXlvdXQoe2NhbmRsZVdpZHRoOl8saXNTaW1wbGVCb3g6Xzw9MS4zfSksIShudWxsPT13fHxuLmxlbmd0aDw0KSlyZXR1cm57cHJvZ3Jlc3M6dC5waXBlbGluZUNvbnRleHQubGFyZ2U/ZnVuY3Rpb24odCxlKXt2YXIgaSxuLG89bmV3IEhTKDQqdC5jb3VudCksYT0wLHI9W10scz1bXTtmb3IoO251bGwhPShuPXQubmV4dCgpKTspe3ZhciBsPWUuZ2V0KHcsbiksdT1lLmdldChiLG4pLGg9ZS5nZXQoUyxuKSxjPWUuZ2V0KE0sbiksZD1lLmdldChJLG4pO2lzTmFOKGwpfHxpc05hTihjKXx8aXNOYU4oZCk/KG9bYSsrXT1OYU4sYSs9Myk6KG9bYSsrXT1VUyhlLG4sdSxoLFMpLHJbMF09bCxyWzFdPWMsaT14LmRhdGFUb1BvaW50KHIsbnVsbCxzKSxvW2ErK109aT9pWzBdOk5hTixvW2ErK109aT9pWzFdOk5hTixyWzFdPWQsaT14LmRhdGFUb1BvaW50KHIsbnVsbCxzKSxvW2ErK109aT9pWzFdOk5hTil9ZS5zZXRMYXlvdXQoImxhcmdlUG9pbnRzIixvKX06ZnVuY3Rpb24odCxlKXt2YXIgaTtmb3IoO251bGwhPShpPXQubmV4dCgpKTspe3ZhciBuPWUuZ2V0KHcsaSksbz1lLmdldChiLGkpLGE9ZS5nZXQoUyxpKSxyPWUuZ2V0KE0saSkscz1lLmdldChJLGkpLGw9TWF0aC5taW4obyxhKSx1PU1hdGgubWF4KG8sYSksaD1nKGwsbiksYz1nKHUsbiksZD1nKHIsbiksZj1nKHMsbikscD1bXTttKHAsYywwKSxtKHAsaCwxKSxwLnB1c2goeShmKSx5KGMpLHkoZCkseShoKSksZS5zZXRJdGVtTGF5b3V0KGkse3NpZ246VVMoZSxpLG8sYSxTKSxpbml0QmFzZWxpbmU6YTxvP2NbMV06aFsxXSxlbmRzOnAsYnJ1c2hSZWN0OnYocixzLG4pfSl9ZnVuY3Rpb24gZyh0LGUpe3ZhciBpPVtdO3JldHVybiBpWzBdPWUsaVsxXT10LGlzTmFOKGUpfHxpc05hTih0KT9bTmFOLE5hTl06eC5kYXRhVG9Qb2ludChpKX1mdW5jdGlvbiBtKHQsZSxpKXt2YXIgbj1lLnNsaWNlKCksbz1lLnNsaWNlKCk7blswXT1OcyhuWzBdK18vMiwxLCExKSxvWzBdPU5zKG9bMF0tXy8yLDEsITApLGk/dC5wdXNoKG4sbyk6dC5wdXNoKG8sbil9ZnVuY3Rpb24gdih0LGUsaSl7dmFyIG49Zyh0LGkpLG89ZyhlLGkpO3JldHVybiBuWzBdLT1fLzIsb1swXS09Xy8yLHt4Om5bMF0seTpuWzFdLHdpZHRoOl8saGVpZ2h0Om9bMV0tblsxXX19ZnVuY3Rpb24geSh0KXtyZXR1cm4gdFswXT1Ocyh0WzBdLDEpLHR9fX19fTtmdW5jdGlvbiBVUyh0LGUsaSxuLG8pe3JldHVybiBuPGk/LTE6aTxuPzE6MDxlP3QuZ2V0KG8sZS0xKTw9bj8xOi0xOjF9ZmYoZnVuY3Rpb24odCl7dCYmayh0LnNlcmllcykmJkUodC5zZXJpZXMsZnVuY3Rpb24odCl7Uih0KSYmImsiPT09dC50eXBlJiYodC50eXBlPSJjYW5kbGVzdGljayIpfSl9KSx5ZihXUyksdmYoWlMpLGljLmV4dGVuZCh7dHlwZToic2VyaWVzLmVmZmVjdFNjYXR0ZXIiLGRlcGVuZGVuY2llczpbImdyaWQiLCJwb2xhciJdLGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhwKHRoaXMuZ2V0U291cmNlKCksdGhpcyx7dXNlRW5jb2RlRGVmYXVsdGVyOiEwfSl9LGJydXNoU2VsZWN0b3I6InBvaW50IixkZWZhdWx0T3B0aW9uOntjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsemxldmVsOjAsejoyLGxlZ2VuZEhvdmVyTGluazohMCxlZmZlY3RUeXBlOiJyaXBwbGUiLHByb2dyZXNzaXZlOjAsc2hvd0VmZmVjdE9uOiJyZW5kZXIiLHJpcHBsZUVmZmVjdDp7cGVyaW9kOjQsc2NhbGU6Mi41LGJydXNoVHlwZToiZmlsbCJ9LHN5bWJvbFNpemU6MTB9fSk7ZnVuY3Rpb24gWFModCxlKXt2YXIgaT1lLnJpcHBsZUVmZmVjdENvbG9yfHxlLmNvbG9yO3QuZWFjaENoaWxkKGZ1bmN0aW9uKHQpe3QuYXR0cih7ejplLnosemxldmVsOmUuemxldmVsLHN0eWxlOntzdHJva2U6InN0cm9rZSI9PT1lLmJydXNoVHlwZT9pOm51bGwsZmlsbDoiZmlsbCI9PT1lLmJydXNoVHlwZT9pOm51bGx9fSl9KX1mdW5jdGlvbiBZUyh0LGUpe0lpLmNhbGwodGhpcyk7dmFyIGk9bmV3IEZnKHQsZSksbj1uZXcgSWk7dGhpcy5hZGQoaSksdGhpcy5hZGQobiksbi5iZWZvcmVVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmF0dHIoaS5nZXRTY2FsZSgpKX0sdGhpcy51cGRhdGVEYXRhKHQsZSl9dmFyIGpTPVlTLnByb3RvdHlwZTtqUy5zdG9wRWZmZWN0QW5pbWF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZEF0KDEpLnJlbW92ZUFsbCgpfSxqUy5zdGFydEVmZmVjdEFuaW1hdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5zeW1ib2xUeXBlLGk9dC5jb2xvcixuPXRoaXMuY2hpbGRBdCgxKSxvPTA7bzwzO28rKyl7dmFyIGE9bWcoZSwtMSwtMSwyLDIsaSk7YS5hdHRyKHtzdHlsZTp7c3Ryb2tlTm9TY2FsZTohMH0sejI6OTksc2lsZW50OiEwLHNjYWxlOlsuNSwuNV19KTt2YXIgcj0tby8zKnQucGVyaW9kK3QuZWZmZWN0T2Zmc2V0O2EuYW5pbWF0ZSgiIiwhMCkud2hlbih0LnBlcmlvZCx7c2NhbGU6W3QucmlwcGxlU2NhbGUvMix0LnJpcHBsZVNjYWxlLzJdfSkuZGVsYXkocikuc3RhcnQoKSxhLmFuaW1hdGVTdHlsZSghMCkud2hlbih0LnBlcmlvZCx7b3BhY2l0eTowfSkuZGVsYXkocikuc3RhcnQoKSxuLmFkZChhKX1YUyhuLHQpfSxqUy51cGRhdGVFZmZlY3RBbmltYXRpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VmZmVjdENmZyxpPXRoaXMuY2hpbGRBdCgxKSxuPVsic3ltYm9sVHlwZSIsInBlcmlvZCIsInJpcHBsZVNjYWxlIl0sbz0wO288bi5sZW5ndGg7bysrKXt2YXIgYT1uW29dO2lmKGVbYV0hPT10W2FdKXJldHVybiB0aGlzLnN0b3BFZmZlY3RBbmltYXRpb24oKSx2b2lkIHRoaXMuc3RhcnRFZmZlY3RBbmltYXRpb24odCl9WFMoaSx0KX0salMuaGlnaGxpZ2h0PWZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJlbXBoYXNpcyIpfSxqUy5kb3ducGxheT1mdW5jdGlvbigpe3RoaXMudHJpZ2dlcigibm9ybWFsIil9LGpTLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlKXt2YXIgaT10Lmhvc3RNb2RlbDt0aGlzLmNoaWxkQXQoMCkudXBkYXRlRGF0YSh0LGUpO3ZhciBuPXRoaXMuY2hpbGRBdCgxKSxvPXQuZ2V0SXRlbU1vZGVsKGUpLGE9dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbCIpLHI9ZnVuY3Rpb24odCl7cmV0dXJuIGsodCl8fCh0PVsrdCwrdF0pLHR9KHQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIikpLHM9dC5nZXRJdGVtVmlzdWFsKGUsImNvbG9yIik7bi5hdHRyKCJzY2FsZSIsciksbi50cmF2ZXJzZShmdW5jdGlvbih0KXt0LmF0dHIoe2ZpbGw6c30pfSk7dmFyIGw9by5nZXRTaGFsbG93KCJzeW1ib2xPZmZzZXQiKTtpZihsKXt2YXIgdT1uLnBvc2l0aW9uO3VbMF09UGwobFswXSxyWzBdKSx1WzFdPVBsKGxbMV0sclsxXSl9bi5yb3RhdGlvbj0oby5nZXRTaGFsbG93KCJzeW1ib2xSb3RhdGUiKXx8MCkqTWF0aC5QSS8xODB8fDA7dmFyIGg9e307aWYoaC5zaG93RWZmZWN0T249aS5nZXQoInNob3dFZmZlY3RPbiIpLGgucmlwcGxlU2NhbGU9by5nZXQoInJpcHBsZUVmZmVjdC5zY2FsZSIpLGguYnJ1c2hUeXBlPW8uZ2V0KCJyaXBwbGVFZmZlY3QuYnJ1c2hUeXBlIiksaC5wZXJpb2Q9MWUzKm8uZ2V0KCJyaXBwbGVFZmZlY3QucGVyaW9kIiksaC5lZmZlY3RPZmZzZXQ9ZS90LmNvdW50KCksaC56PW8uZ2V0U2hhbGxvdygieiIpfHwwLGguemxldmVsPW8uZ2V0U2hhbGxvdygiemxldmVsIil8fDAsaC5zeW1ib2xUeXBlPWEsaC5jb2xvcj1zLGgucmlwcGxlRWZmZWN0Q29sb3I9by5nZXQoInJpcHBsZUVmZmVjdC5jb2xvciIpLHRoaXMub2ZmKCJtb3VzZW92ZXIiKS5vZmYoIm1vdXNlb3V0Iikub2ZmKCJlbXBoYXNpcyIpLm9mZigibm9ybWFsIiksInJlbmRlciI9PT1oLnNob3dFZmZlY3RPbil0aGlzLl9lZmZlY3RDZmc/dGhpcy51cGRhdGVFZmZlY3RBbmltYXRpb24oaCk6dGhpcy5zdGFydEVmZmVjdEFuaW1hdGlvbihoKSx0aGlzLl9lZmZlY3RDZmc9aDtlbHNle3RoaXMuX2VmZmVjdENmZz1udWxsLHRoaXMuc3RvcEVmZmVjdEFuaW1hdGlvbigpO3ZhciBjPXRoaXMuY2hpbGRBdCgwKSxkPWZ1bmN0aW9uKCl7Yy5oaWdobGlnaHQoKSwicmVuZGVyIiE9PWguc2hvd0VmZmVjdE9uJiZ0aGlzLnN0YXJ0RWZmZWN0QW5pbWF0aW9uKGgpfSxmPWZ1bmN0aW9uKCl7Yy5kb3ducGxheSgpLCJyZW5kZXIiIT09aC5zaG93RWZmZWN0T24mJnRoaXMuc3RvcEVmZmVjdEFuaW1hdGlvbigpfTt0aGlzLm9uKCJtb3VzZW92ZXIiLGQsdGhpcykub24oIm1vdXNlb3V0IixmLHRoaXMpLm9uKCJlbXBoYXNpcyIsZCx0aGlzKS5vbigibm9ybWFsIixmLHRoaXMpfXRoaXMuX2VmZmVjdENmZz1ofSxqUy5mYWRlT3V0PWZ1bmN0aW9uKHQpe3RoaXMub2ZmKCJtb3VzZW92ZXIiKS5vZmYoIm1vdXNlb3V0Iikub2ZmKCJlbXBoYXNpcyIpLm9mZigibm9ybWFsIiksdCYmdCgpfSx3KFlTLElpKSxNZih7dHlwZToiZWZmZWN0U2NhdHRlciIsaW5pdDpmdW5jdGlvbigpe3RoaXMuX3N5bWJvbERyYXc9bmV3ICRnKFlTKX0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldERhdGEoKSxvPXRoaXMuX3N5bWJvbERyYXc7by51cGRhdGVEYXRhKG4pLHRoaXMuZ3JvdXAuYWRkKG8uZ3JvdXApfSx1cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0RGF0YSgpO3RoaXMuZ3JvdXAuZGlydHkoKTt2YXIgbz1JbSgpLnJlc2V0KHQpO28ucHJvZ3Jlc3MmJm8ucHJvZ3Jlc3Moe3N0YXJ0OjAsZW5kOm4uY291bnQoKX0sbiksdGhpcy5fc3ltYm9sRHJhdy51cGRhdGVMYXlvdXQobil9LF91cGRhdGVHcm91cFRyYW5zZm9ybTpmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW07ZSYmZS5nZXRSb2FtVHJhbnNmb3JtJiYodGhpcy5ncm91cC50cmFuc2Zvcm09dWUoZS5nZXRSb2FtVHJhbnNmb3JtKCkpLHRoaXMuZ3JvdXAuZGVjb21wb3NlVHJhbnNmb3JtKCkpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt0aGlzLl9zeW1ib2xEcmF3JiZ0aGlzLl9zeW1ib2xEcmF3LnJlbW92ZShlKX0sZGlzcG9zZTpmdW5jdGlvbigpe319KSx5ZihNbSgiZWZmZWN0U2NhdHRlciIsImNpcmNsZSIpKSx2ZihJbSgiZWZmZWN0U2NhdHRlciIpKTt2YXIgcVM9InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50MzJBcnJheT9BcnJheTpVaW50MzJBcnJheSxLUz0idW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0NjRBcnJheT9BcnJheTpGbG9hdDY0QXJyYXk7ZnVuY3Rpb24gJFModCl7dmFyIGU9dC5kYXRhO2UmJmVbMF0mJmVbMF1bMF0mJmVbMF1bMF0uY29vcmQmJih0LmRhdGE9TihlLGZ1bmN0aW9uKHQpe3ZhciBlPXtjb29yZHM6W3RbMF0uY29vcmQsdFsxXS5jb29yZF19O3JldHVybiB0WzBdLm5hbWUmJihlLmZyb21OYW1lPXRbMF0ubmFtZSksdFsxXS5uYW1lJiYoZS50b05hbWU9dFsxXS5uYW1lKSxwKFtlLHRbMF0sdFsxXV0pfSkpfXZhciBKUz1pYy5leHRlbmQoe3R5cGU6InNlcmllcy5saW5lcyIsZGVwZW5kZW5jaWVzOlsiZ3JpZCIsInBvbGFyIl0sdmlzdWFsQ29sb3JBY2Nlc3NQYXRoOiJsaW5lU3R5bGUuY29sb3IiLGluaXQ6ZnVuY3Rpb24odCl7dC5kYXRhPXQuZGF0YXx8W10sJFModCk7dmFyIGU9dGhpcy5fcHJvY2Vzc0ZsYXRDb29yZHNBcnJheSh0LmRhdGEpO3RoaXMuX2ZsYXRDb29yZHM9ZS5mbGF0Q29vcmRzLHRoaXMuX2ZsYXRDb29yZHNPZmZzZXQ9ZS5mbGF0Q29vcmRzT2Zmc2V0LGUuZmxhdENvb3JkcyYmKHQuZGF0YT1uZXcgRmxvYXQzMkFycmF5KGUuY291bnQpKSxKUy5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQpe2lmKHQuZGF0YT10LmRhdGF8fFtdLCRTKHQpLHQuZGF0YSl7dmFyIGU9dGhpcy5fcHJvY2Vzc0ZsYXRDb29yZHNBcnJheSh0LmRhdGEpO3RoaXMuX2ZsYXRDb29yZHM9ZS5mbGF0Q29vcmRzLHRoaXMuX2ZsYXRDb29yZHNPZmZzZXQ9ZS5mbGF0Q29vcmRzT2Zmc2V0LGUuZmxhdENvb3JkcyYmKHQuZGF0YT1uZXcgRmxvYXQzMkFycmF5KGUuY291bnQpKX1KUy5zdXBlckFwcGx5KHRoaXMsIm1lcmdlT3B0aW9uIixhcmd1bWVudHMpfSxhcHBlbmREYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Byb2Nlc3NGbGF0Q29vcmRzQXJyYXkodC5kYXRhKTtlLmZsYXRDb29yZHMmJih0aGlzLl9mbGF0Q29vcmRzPyh0aGlzLl9mbGF0Q29vcmRzPXR0KHRoaXMuX2ZsYXRDb29yZHMsZS5mbGF0Q29vcmRzKSx0aGlzLl9mbGF0Q29vcmRzT2Zmc2V0PXR0KHRoaXMuX2ZsYXRDb29yZHNPZmZzZXQsZS5mbGF0Q29vcmRzT2Zmc2V0KSk6KHRoaXMuX2ZsYXRDb29yZHM9ZS5mbGF0Q29vcmRzLHRoaXMuX2ZsYXRDb29yZHNPZmZzZXQ9ZS5mbGF0Q29vcmRzT2Zmc2V0KSx0LmRhdGE9bmV3IEZsb2F0MzJBcnJheShlLmNvdW50KSksdGhpcy5nZXRSYXdEYXRhKCkuYXBwZW5kRGF0YSh0LmRhdGEpfSxfZ2V0Q29vcmRzRnJvbUl0ZW1Nb2RlbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKS5nZXRJdGVtTW9kZWwodCk7cmV0dXJuIGUub3B0aW9uIGluc3RhbmNlb2YgQXJyYXk/ZS5vcHRpb246ZS5nZXRTaGFsbG93KCJjb29yZHMiKX0sZ2V0TGluZUNvb3Jkc0NvdW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mbGF0Q29vcmRzT2Zmc2V0P3RoaXMuX2ZsYXRDb29yZHNPZmZzZXRbMip0KzFdOnRoaXMuX2dldENvb3Jkc0Zyb21JdGVtTW9kZWwodCkubGVuZ3RofSxnZXRMaW5lQ29vcmRzOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fZmxhdENvb3Jkc09mZnNldCl7Zm9yKHZhciBpPXRoaXMuX2ZsYXRDb29yZHNPZmZzZXRbMip0XSxuPXRoaXMuX2ZsYXRDb29yZHNPZmZzZXRbMip0KzFdLG89MDtvPG47bysrKWVbb109ZVtvXXx8W10sZVtvXVswXT10aGlzLl9mbGF0Q29vcmRzW2krMipvXSxlW29dWzFdPXRoaXMuX2ZsYXRDb29yZHNbaSsyKm8rMV07cmV0dXJuIG59dmFyIGE9dGhpcy5fZ2V0Q29vcmRzRnJvbUl0ZW1Nb2RlbCh0KTtmb3Iobz0wO288YS5sZW5ndGg7bysrKWVbb109ZVtvXXx8W10sZVtvXVswXT1hW29dWzBdLGVbb11bMV09YVtvXVsxXTtyZXR1cm4gYS5sZW5ndGh9LF9wcm9jZXNzRmxhdENvb3Jkc0FycmF5OmZ1bmN0aW9uKHQpe3ZhciBlPTA7aWYodGhpcy5fZmxhdENvb3JkcyYmKGU9dGhpcy5fZmxhdENvb3Jkcy5sZW5ndGgpLCJudW1iZXIiIT10eXBlb2YgdFswXSlyZXR1cm57ZmxhdENvb3Jkc09mZnNldDpudWxsLGZsYXRDb29yZHM6bnVsbCxjb3VudDp0Lmxlbmd0aH07Zm9yKHZhciBpPXQubGVuZ3RoLG49bmV3IHFTKGkpLG89bmV3IEtTKGkpLGE9MCxyPTAscz0wLGw9MDtsPGk7KXtzKys7dmFyIHU9dFtsKytdO25bcisrXT1hK2UsbltyKytdPXU7Zm9yKHZhciBoPTA7aDx1O2grKyl7dmFyIGM9dFtsKytdLGQ9dFtsKytdO29bYSsrXT1jLG9bYSsrXT1kfX1yZXR1cm57ZmxhdENvb3Jkc09mZnNldDpuZXcgVWludDMyQXJyYXkobi5idWZmZXIsMCxyKSxmbGF0Q29vcmRzOm8sY291bnQ6c319LGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIGE9bmV3IFdmKFsidmFsdWUiXSx0aGlzKTtyZXR1cm4gYS5oYXNJdGVtT3B0aW9uPSExLGEuaW5pdERhdGEodC5kYXRhLFtdLGZ1bmN0aW9uKHQsZSxpLG4pe2lmKHQgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gTmFOO2EuaGFzSXRlbU9wdGlvbj0hMDt2YXIgbz10LnZhbHVlO3JldHVybiBudWxsIT1vP28gaW5zdGFuY2VvZiBBcnJheT9vW25dOm86dm9pZCAwfSksYX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKS5nZXRJdGVtTW9kZWwodCksaT1lLmdldCgibmFtZSIpO2lmKGkpcmV0dXJuIGk7dmFyIG49ZS5nZXQoImZyb21OYW1lIiksbz1lLmdldCgidG9OYW1lIiksYT1bXTtyZXR1cm4gbnVsbCE9biYmYS5wdXNoKG4pLG51bGwhPW8mJmEucHVzaChvKSxldShhLmpvaW4oIiA+ICIpKX0scHJldmVudEluY3JlbWVudGFsOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmdldCgiZWZmZWN0LnNob3ciKX0sZ2V0UHJvZ3Jlc3NpdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbi5wcm9ncmVzc2l2ZTtyZXR1cm4gbnVsbD09dD90aGlzLm9wdGlvbi5sYXJnZT8xZTQ6dGhpcy5nZXQoInByb2dyZXNzaXZlIik6dH0sZ2V0UHJvZ3Jlc3NpdmVUaHJlc2hvbGQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbi5wcm9ncmVzc2l2ZVRocmVzaG9sZDtyZXR1cm4gbnVsbD09dD90aGlzLm9wdGlvbi5sYXJnZT8yZTQ6dGhpcy5nZXQoInByb2dyZXNzaXZlVGhyZXNob2xkIik6dH0sZGVmYXVsdE9wdGlvbjp7Y29vcmRpbmF0ZVN5c3RlbToiZ2VvIix6bGV2ZWw6MCx6OjIsbGVnZW5kSG92ZXJMaW5rOiEwLGhvdmVyQW5pbWF0aW9uOiEwLHhBeGlzSW5kZXg6MCx5QXhpc0luZGV4OjAsc3ltYm9sOlsibm9uZSIsIm5vbmUiXSxzeW1ib2xTaXplOlsxMCwxMF0sZ2VvSW5kZXg6MCxlZmZlY3Q6e3Nob3c6ITEscGVyaW9kOjQsY29uc3RhbnRTcGVlZDowLHN5bWJvbDoiY2lyY2xlIixzeW1ib2xTaXplOjMsbG9vcDohMCx0cmFpbExlbmd0aDouMn0sbGFyZ2U6ITEsbGFyZ2VUaHJlc2hvbGQ6MmUzLHBvbHlsaW5lOiExLGNsaXA6ITAsbGFiZWw6e3Nob3c6ITEscG9zaXRpb246ImVuZCJ9LGxpbmVTdHlsZTp7b3BhY2l0eTouNX19fSk7ZnVuY3Rpb24gUVModCxlLGkpe0lpLmNhbGwodGhpcyksdGhpcy5hZGQodGhpcy5jcmVhdGVMaW5lKHQsZSxpKSksdGhpcy5fdXBkYXRlRWZmZWN0U3ltYm9sKHQsZSl9dmFyIHRNPVFTLnByb3RvdHlwZTtmdW5jdGlvbiBlTSh0LGUsaSl7SWkuY2FsbCh0aGlzKSx0aGlzLl9jcmVhdGVQb2x5bGluZSh0LGUsaSl9dE0uY3JlYXRlTGluZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyBpdyh0LGUsaSl9LHRNLl91cGRhdGVFZmZlY3RTeW1ib2w9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEl0ZW1Nb2RlbChlKS5nZXRNb2RlbCgiZWZmZWN0Iiksbj1pLmdldCgic3ltYm9sU2l6ZSIpLG89aS5nZXQoInN5bWJvbCIpO2sobil8fChuPVtuLG5dKTt2YXIgYT1pLmdldCgiY29sb3IiKXx8dC5nZXRJdGVtVmlzdWFsKGUsImNvbG9yIikscj10aGlzLmNoaWxkQXQoMSk7dGhpcy5fc3ltYm9sVHlwZSE9PW8mJih0aGlzLnJlbW92ZShyKSwocj1tZyhvLC0uNSwtLjUsMSwxLGEpKS56Mj0xMDAsci5jdWxsaW5nPSEwLHRoaXMuYWRkKHIpKSxyJiYoci5zZXRTdHlsZSgic2hhZG93Q29sb3IiLGEpLHIuc2V0U3R5bGUoaS5nZXRJdGVtU3R5bGUoWyJjb2xvciJdKSksci5hdHRyKCJzY2FsZSIsbiksci5zZXRDb2xvcihhKSxyLmF0dHIoInNjYWxlIixuKSx0aGlzLl9zeW1ib2xUeXBlPW8sdGhpcy5fdXBkYXRlRWZmZWN0QW5pbWF0aW9uKHQsaSxlKSl9LHRNLl91cGRhdGVFZmZlY3RBbmltYXRpb249ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPXRoaXMuY2hpbGRBdCgxKTtpZihuKXt2YXIgbz10aGlzLGE9ZS5nZXRJdGVtTGF5b3V0KGkpLHI9MWUzKnQuZ2V0KCJwZXJpb2QiKSxzPXQuZ2V0KCJsb29wIiksbD10LmdldCgiY29uc3RhbnRTcGVlZCIpLHU9Vyh0LmdldCgiZGVsYXkiKSxmdW5jdGlvbih0KXtyZXR1cm4gdC9lLmNvdW50KCkqci8zfSksaD0iZnVuY3Rpb24iPT10eXBlb2YgdTtpZihuLmlnbm9yZT0hMCx0aGlzLnVwZGF0ZUFuaW1hdGlvblBvaW50cyhuLGEpLDA8bCYmKHI9dGhpcy5nZXRMaW5lTGVuZ3RoKG4pL2wqMWUzKSxyIT09dGhpcy5fcGVyaW9kfHxzIT09dGhpcy5fbG9vcCl7bi5zdG9wQW5pbWF0aW9uKCk7dmFyIGM9dTtoJiYoYz11KGkpKSwwPG4uX190JiYoYz0tcipuLl9fdCksbi5fX3Q9MDt2YXIgZD1uLmFuaW1hdGUoIiIscykud2hlbihyLHtfX3Q6MX0pLmRlbGF5KGMpLmR1cmluZyhmdW5jdGlvbigpe28udXBkYXRlU3ltYm9sUG9zaXRpb24obil9KTtzfHxkLmRvbmUoZnVuY3Rpb24oKXtvLnJlbW92ZShuKX0pLGQuc3RhcnQoKX10aGlzLl9wZXJpb2Q9cix0aGlzLl9sb29wPXN9fSx0TS5nZXRMaW5lTGVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiB5dCh0Ll9fcDEsdC5fX2NwMSkreXQodC5fX2NwMSx0Ll9fcDIpfSx0TS51cGRhdGVBbmltYXRpb25Qb2ludHM9ZnVuY3Rpb24odCxlKXt0Ll9fcDE9ZVswXSx0Ll9fcDI9ZVsxXSx0Ll9fY3AxPWVbMl18fFsoZVswXVswXStlWzFdWzBdKS8yLChlWzBdWzFdK2VbMV1bMV0pLzJdfSx0TS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmNoaWxkQXQoMCkudXBkYXRlRGF0YSh0LGUsaSksdGhpcy5fdXBkYXRlRWZmZWN0U3ltYm9sKHQsZSl9LHRNLnVwZGF0ZVN5bWJvbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXQuX19wMSxpPXQuX19wMixuPXQuX19jcDEsbz10Ll9fdCxhPXQucG9zaXRpb24scj1UYSxzPUFhO2FbMF09cihlWzBdLG5bMF0saVswXSxvKSxhWzFdPXIoZVsxXSxuWzFdLGlbMV0sbyk7dmFyIGw9cyhlWzBdLG5bMF0saVswXSxvKSx1PXMoZVsxXSxuWzFdLGlbMV0sbyk7dC5yb3RhdGlvbj0tTWF0aC5hdGFuMih1LGwpLU1hdGguUEkvMix0Lmlnbm9yZT0hMX0sdE0udXBkYXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5jaGlsZEF0KDApLnVwZGF0ZUxheW91dCh0LGUpO3ZhciBpPXQuZ2V0SXRlbU1vZGVsKGUpLmdldE1vZGVsKCJlZmZlY3QiKTt0aGlzLl91cGRhdGVFZmZlY3RBbmltYXRpb24odCxpLGUpfSx3KFFTLElpKTt2YXIgaU09ZU0ucHJvdG90eXBlO2Z1bmN0aW9uIG5NKHQsZSxpKXtRUy5jYWxsKHRoaXMsdCxlLGkpLHRoaXMuX2xhc3RGcmFtZT0wLHRoaXMuX2xhc3RGcmFtZVBlcmNlbnQ9MH1pTS5fY3JlYXRlUG9seWxpbmU9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0SXRlbUxheW91dChlKSxvPW5ldyBLcih7c2hhcGU6e3BvaW50czpufX0pO3RoaXMuYWRkKG8pLHRoaXMuX3VwZGF0ZUNvbW1vblN0bCh0LGUsaSl9LGlNLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuaG9zdE1vZGVsO3NsKHRoaXMuY2hpbGRBdCgwKSx7c2hhcGU6e3BvaW50czp0LmdldEl0ZW1MYXlvdXQoZSl9fSxuLGUpLHRoaXMuX3VwZGF0ZUNvbW1vblN0bCh0LGUsaSl9LGlNLl91cGRhdGVDb21tb25TdGw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuY2hpbGRBdCgwKSxvPXQuZ2V0SXRlbU1vZGVsKGUpLGE9dC5nZXRJdGVtVmlzdWFsKGUsImNvbG9yIikscj1pJiZpLmxpbmVTdHlsZSxzPWkmJmkuaG92ZXJMaW5lU3R5bGU7aSYmIXQuaGFzSXRlbU9wdGlvbnx8KHI9by5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCkscz1vLmdldE1vZGVsKCJlbXBoYXNpcy5saW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSksbi51c2VTdHlsZShDKHtzdHJva2VOb1NjYWxlOiEwLGZpbGw6Im5vbmUiLHN0cm9rZTphfSxyKSksbi5ob3ZlclN0eWxlPXMsWXModGhpcyl9LGlNLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0LGUpe3RoaXMuY2hpbGRBdCgwKS5zZXRTaGFwZSgicG9pbnRzIix0LmdldEl0ZW1MYXlvdXQoZSkpfSx3KGVNLElpKTt2YXIgb009bk0ucHJvdG90eXBlO29NLmNyZWF0ZUxpbmU9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgZU0odCxlLGkpfSxvTS51cGRhdGVBbmltYXRpb25Qb2ludHM9ZnVuY3Rpb24odCxlKXt0aGlzLl9wb2ludHM9ZTtmb3IodmFyIGk9WzBdLG49MCxvPTE7bzxlLmxlbmd0aDtvKyspe3ZhciBhPWVbby0xXSxyPWVbb107bis9eXQoYSxyKSxpLnB1c2gobil9aWYoMCE9PW4pe2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspaVtvXS89bjt0aGlzLl9vZmZzZXRzPWksdGhpcy5fbGVuZ3RoPW59fSxvTS5nZXRMaW5lTGVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZW5ndGh9LG9NLnVwZGF0ZVN5bWJvbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXQuX190LGk9dGhpcy5fcG9pbnRzLG49dGhpcy5fb2Zmc2V0cyxvPWkubGVuZ3RoO2lmKG4pe3ZhciBhPXRoaXMuX2xhc3RGcmFtZTtpZihlPHRoaXMuX2xhc3RGcmFtZVBlcmNlbnQpe2ZvcihyPU1hdGgubWluKGErMSxvLTEpOzA8PXImJiEobltyXTw9ZSk7ci0tKTtyPU1hdGgubWluKHIsby0yKX1lbHNle2Zvcih2YXIgcj1hO3I8byYmIShuW3JdPmUpO3IrKyk7cj1NYXRoLm1pbihyLTEsby0yKX13dCh0LnBvc2l0aW9uLGlbcl0saVtyKzFdLChlLW5bcl0pLyhuW3IrMV0tbltyXSkpO3ZhciBzPWlbcisxXVswXS1pW3JdWzBdLGw9aVtyKzFdWzFdLWlbcl1bMV07dC5yb3RhdGlvbj0tTWF0aC5hdGFuMihsLHMpLU1hdGguUEkvMix0aGlzLl9sYXN0RnJhbWU9cix0aGlzLl9sYXN0RnJhbWVQZXJjZW50PWUsdC5pZ25vcmU9ITF9fSx3KG5NLFFTKTt2YXIgYU09SXMoe3NoYXBlOntwb2x5bGluZTohMSxjdXJ2ZW5lc3M6MCxzZWdzOltdfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnNlZ3Msbj1lLmN1cnZlbmVzcztpZihlLnBvbHlsaW5lKWZvcih2YXIgbz0wO288aS5sZW5ndGg7KXt2YXIgYT1pW28rK107aWYoMDxhKXt0Lm1vdmVUbyhpW28rK10saVtvKytdKTtmb3IodmFyIHI9MTtyPGE7cisrKXQubGluZVRvKGlbbysrXSxpW28rK10pfX1lbHNlIGZvcihvPTA7bzxpLmxlbmd0aDspe3ZhciBzPWlbbysrXSxsPWlbbysrXSx1PWlbbysrXSxoPWlbbysrXTtpZih0Lm1vdmVUbyhzLGwpLDA8bil7dmFyIGM9KHMrdSkvMi0obC1oKSpuLGQ9KGwraCkvMi0odS1zKSpuO3QucXVhZHJhdGljQ3VydmVUbyhjLGQsdSxoKX1lbHNlIHQubGluZVRvKHUsaCl9fSxmaW5kRGF0YUluZGV4OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zaGFwZSxuPWkuc2VncyxvPWkuY3VydmVuZXNzO2lmKGkucG9seWxpbmUpZm9yKHZhciBhPTAscj0wO3I8bi5sZW5ndGg7KXt2YXIgcz1uW3IrK107aWYoMDxzKWZvcih2YXIgbD1uW3IrK10sdT1uW3IrK10saD0xO2g8cztoKyspe2lmKG5yKGwsdSxjPW5bcisrXSxkPW5bcisrXSkpcmV0dXJuIGF9YSsrfWVsc2UgZm9yKGE9MCxyPTA7cjxuLmxlbmd0aDspe2w9bltyKytdLHU9bltyKytdO3ZhciBjPW5bcisrXSxkPW5bcisrXTtpZigwPG8pe2lmKGFyKGwsdSwobCtjKS8yLSh1LWQpKm8sKHUrZCkvMi0oYy1sKSpvLGMsZCkpcmV0dXJuIGF9ZWxzZSBpZihucihsLHUsYyxkKSlyZXR1cm4gYTthKyt9cmV0dXJuLTF9fSk7ZnVuY3Rpb24gck0oKXt0aGlzLmdyb3VwPW5ldyBJaX12YXIgc009ck0ucHJvdG90eXBlO3NNLmlzUGVyc2lzdGVudD1mdW5jdGlvbigpe3JldHVybiF0aGlzLl9pbmNyZW1lbnRhbH0sc00udXBkYXRlRGF0YT1mdW5jdGlvbih0KXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpO3ZhciBlPW5ldyBhTSh7cmVjdEhvdmVyOiEwLGN1cnNvcjoiZGVmYXVsdCJ9KTtlLnNldFNoYXBlKHtzZWdzOnQuZ2V0TGF5b3V0KCJsaW5lc1BvaW50cyIpfSksdGhpcy5fc2V0Q29tbW9uKGUsdCksdGhpcy5ncm91cC5hZGQoZSksdGhpcy5faW5jcmVtZW50YWw9bnVsbH0sc00uaW5jcmVtZW50YWxQcmVwYXJlVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fY2xlYXJJbmNyZW1lbnRhbCgpLDVlNTx0LmNvdW50KCk/KHRoaXMuX2luY3JlbWVudGFsfHwodGhpcy5faW5jcmVtZW50YWw9bmV3IGZzKHtzaWxlbnQ6ITB9KSksdGhpcy5ncm91cC5hZGQodGhpcy5faW5jcmVtZW50YWwpKTp0aGlzLl9pbmNyZW1lbnRhbD1udWxsfSxzTS5pbmNyZW1lbnRhbFVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBhTTtpLnNldFNoYXBlKHtzZWdzOmUuZ2V0TGF5b3V0KCJsaW5lc1BvaW50cyIpfSksdGhpcy5fc2V0Q29tbW9uKGksZSwhIXRoaXMuX2luY3JlbWVudGFsKSx0aGlzLl9pbmNyZW1lbnRhbD90aGlzLl9pbmNyZW1lbnRhbC5hZGREaXNwbGF5YWJsZShpLCEwKTooaS5yZWN0SG92ZXI9ITAsaS5jdXJzb3I9ImRlZmF1bHQiLGkuX19zdGFydEluZGV4PXQuc3RhcnQsdGhpcy5ncm91cC5hZGQoaSkpfSxzTS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckluY3JlbWVudGFsKCksdGhpcy5faW5jcmVtZW50YWw9bnVsbCx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxzTS5fc2V0Q29tbW9uPWZ1bmN0aW9uKGksdCxlKXt2YXIgbj10Lmhvc3RNb2RlbDtpLnNldFNoYXBlKHtwb2x5bGluZTpuLmdldCgicG9seWxpbmUiKSxjdXJ2ZW5lc3M6bi5nZXQoImxpbmVTdHlsZS5jdXJ2ZW5lc3MiKX0pLGkudXNlU3R5bGUobi5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCkpLGkuc3R5bGUuc3Ryb2tlTm9TY2FsZT0hMDt2YXIgbz10LmdldFZpc3VhbCgiY29sb3IiKTtvJiZpLnNldFN0eWxlKCJzdHJva2UiLG8pLGkuc2V0U3R5bGUoImZpbGwiKSxlfHwoaS5zZXJpZXNJbmRleD1uLnNlcmllc0luZGV4LGkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7aS5kYXRhSW5kZXg9bnVsbDt2YXIgZT1pLmZpbmREYXRhSW5kZXgodC5vZmZzZXRYLHQub2Zmc2V0WSk7MDxlJiYoaS5kYXRhSW5kZXg9ZStpLl9fc3RhcnRJbmRleCl9KSl9LHNNLl9jbGVhckluY3JlbWVudGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW5jcmVtZW50YWw7dCYmdC5jbGVhckRpc3BsYXlibGVzKCl9O3ZhciBsTT17c2VyaWVzVHlwZToibGluZXMiLHBsYW46ZGMoKSxyZXNldDpmdW5jdGlvbihnKXt2YXIgbT1nLmNvb3JkaW5hdGVTeXN0ZW0sdj1nLmdldCgicG9seWxpbmUiKSx5PWcucGlwZWxpbmVDb250ZXh0LmxhcmdlO3JldHVybntwcm9ncmVzczpmdW5jdGlvbih0LGUpe3ZhciBpPVtdO2lmKHkpe3ZhciBuLG89dC5lbmQtdC5zdGFydDtpZih2KXtmb3IodmFyIGE9MCxyPXQuc3RhcnQ7cjx0LmVuZDtyKyspYSs9Zy5nZXRMaW5lQ29vcmRzQ291bnQocik7bj1uZXcgRmxvYXQzMkFycmF5KG8rMiphKX1lbHNlIG49bmV3IEZsb2F0MzJBcnJheSg0Km8pO3ZhciBzPTAsbD1bXTtmb3Iocj10LnN0YXJ0O3I8dC5lbmQ7cisrKXt2YXIgdT1nLmdldExpbmVDb29yZHMocixpKTt2JiYobltzKytdPXUpO2Zvcih2YXIgaD0wO2g8dTtoKyspbD1tLmRhdGFUb1BvaW50KGlbaF0sITEsbCksbltzKytdPWxbMF0sbltzKytdPWxbMV19ZS5zZXRMYXlvdXQoImxpbmVzUG9pbnRzIixuKX1lbHNlIGZvcihyPXQuc3RhcnQ7cjx0LmVuZDtyKyspe3ZhciBjPWUuZ2V0SXRlbU1vZGVsKHIpLGQ9KHU9Zy5nZXRMaW5lQ29vcmRzKHIsaSksW10pO2lmKHYpZm9yKHZhciBmPTA7Zjx1O2YrKylkLnB1c2gobS5kYXRhVG9Qb2ludChpW2ZdKSk7ZWxzZXtkWzBdPW0uZGF0YVRvUG9pbnQoaVswXSksZFsxXT1tLmRhdGFUb1BvaW50KGlbMV0pO3ZhciBwPWMuZ2V0KCJsaW5lU3R5bGUuY3VydmVuZXNzIik7K3AmJihkWzJdPVsoZFswXVswXStkWzFdWzBdKS8yLShkWzBdWzFdLWRbMV1bMV0pKnAsKGRbMF1bMV0rZFsxXVsxXSkvMi0oZFsxXVswXS1kWzBdWzBdKSpwXSl9ZS5zZXRJdGVtTGF5b3V0KHIsZCl9fX19fTtmdW5jdGlvbiB1TSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFycmF5fHwodD1bdCx0XSksdH1NZih7dHlwZToibGluZXMiLGluaXQ6ZnVuY3Rpb24oKXt9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5nZXREYXRhKCksbz10aGlzLl91cGRhdGVMaW5lRHJhdyhuLHQpLGE9dC5nZXQoInpsZXZlbCIpLHI9dC5nZXQoImVmZmVjdC50cmFpbExlbmd0aCIpLHM9aS5nZXRacigpLGw9InN2ZyI9PT1zLnBhaW50ZXIuZ2V0VHlwZSgpO2x8fHMucGFpbnRlci5nZXRMYXllcihhKS5jbGVhcighMCksbnVsbD09dGhpcy5fbGFzdFpsZXZlbHx8bHx8cy5jb25maWdMYXllcih0aGlzLl9sYXN0WmxldmVsLHttb3Rpb25CbHVyOiExfSksdGhpcy5fc2hvd0VmZmVjdCh0KSYmciYmKGx8fHMuY29uZmlnTGF5ZXIoYSx7bW90aW9uQmx1cjohMCxsYXN0RnJhbWVBbHBoYTpNYXRoLm1heChNYXRoLm1pbihyLzEwKy45LDEpLDApfSkpLG8udXBkYXRlRGF0YShuKTt2YXIgdT10LmdldCgiY2xpcCIsITApJiZ5bSh0LmNvb3JkaW5hdGVTeXN0ZW0sITEsdCk7dT90aGlzLmdyb3VwLnNldENsaXBQYXRoKHUpOnRoaXMuZ3JvdXAucmVtb3ZlQ2xpcFBhdGgoKSx0aGlzLl9sYXN0WmxldmVsPWEsdGhpcy5fZmluaXNoZWQ9ITB9LGluY3JlbWVudGFsUHJlcGFyZVJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5nZXREYXRhKCk7dGhpcy5fdXBkYXRlTGluZURyYXcobix0KS5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGUobiksdGhpcy5fY2xlYXJMYXllcihpKSx0aGlzLl9maW5pc2hlZD0hMX0saW5jcmVtZW50YWxSZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2xpbmVEcmF3LmluY3JlbWVudGFsVXBkYXRlKHQsZS5nZXREYXRhKCkpLHRoaXMuX2ZpbmlzaGVkPXQuZW5kPT09ZS5nZXREYXRhKCkuY291bnQoKX0sdXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldERhdGEoKSxvPXQucGlwZWxpbmVDb250ZXh0O2lmKCF0aGlzLl9maW5pc2hlZHx8by5sYXJnZXx8by5wcm9ncmVzc2l2ZVJlbmRlcilyZXR1cm57dXBkYXRlOiEwfTt2YXIgYT1sTS5yZXNldCh0KTthLnByb2dyZXNzJiZhLnByb2dyZXNzKHtzdGFydDowLGVuZDpuLmNvdW50KCl9LG4pLHRoaXMuX2xpbmVEcmF3LnVwZGF0ZUxheW91dCgpLHRoaXMuX2NsZWFyTGF5ZXIoaSl9LF91cGRhdGVMaW5lRHJhdzpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2xpbmVEcmF3LG49dGhpcy5fc2hvd0VmZmVjdChlKSxvPSEhZS5nZXQoInBvbHlsaW5lIiksYT1lLnBpcGVsaW5lQ29udGV4dC5sYXJnZTtyZXR1cm4gaSYmbj09PXRoaXMuX2hhc0VmZmV0JiZvPT09dGhpcy5faXNQb2x5bGluZSYmYT09PXRoaXMuX2lzTGFyZ2VEcmF3fHwoaSYmaS5yZW1vdmUoKSxpPXRoaXMuX2xpbmVEcmF3PWE/bmV3IHJNOm5ldyBvdyhvP24/bk06ZU06bj9RUzppdyksdGhpcy5faGFzRWZmZXQ9bix0aGlzLl9pc1BvbHlsaW5lPW8sdGhpcy5faXNMYXJnZURyYXc9YSx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpKSx0aGlzLmdyb3VwLmFkZChpLmdyb3VwKSxpfSxfc2hvd0VmZmVjdDpmdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KCJlZmZlY3Quc2hvdyIpfSxfY2xlYXJMYXllcjpmdW5jdGlvbih0KXt2YXIgZT10LmdldFpyKCk7InN2ZyI9PT1lLnBhaW50ZXIuZ2V0VHlwZSgpfHxudWxsPT10aGlzLl9sYXN0WmxldmVsfHxlLnBhaW50ZXIuZ2V0TGF5ZXIodGhpcy5fbGFzdFpsZXZlbCkuY2xlYXIoITApfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt0aGlzLl9saW5lRHJhdyYmdGhpcy5fbGluZURyYXcucmVtb3ZlKCksdGhpcy5fbGluZURyYXc9bnVsbCx0aGlzLl9jbGVhckxheWVyKGUpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pO3ZhciBoTT0ibGluZVN0eWxlLm9wYWNpdHkiLnNwbGl0KCIuIiksY009e3Nlcmllc1R5cGU6ImxpbmVzIixyZXNldDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dU0odC5nZXQoInN5bWJvbCIpKSxvPXVNKHQuZ2V0KCJzeW1ib2xTaXplIikpLGE9dC5nZXREYXRhKCk7cmV0dXJuIGEuc2V0VmlzdWFsKCJmcm9tU3ltYm9sIixuJiZuWzBdKSxhLnNldFZpc3VhbCgidG9TeW1ib2wiLG4mJm5bMV0pLGEuc2V0VmlzdWFsKCJmcm9tU3ltYm9sU2l6ZSIsbyYmb1swXSksYS5zZXRWaXN1YWwoInRvU3ltYm9sU2l6ZSIsbyYmb1sxXSksYS5zZXRWaXN1YWwoIm9wYWNpdHkiLHQuZ2V0KGhNKSkse2RhdGFFYWNoOmEuaGFzSXRlbU9wdGlvbj9mdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0SXRlbU1vZGVsKGUpLG49dU0oaS5nZXRTaGFsbG93KCJzeW1ib2wiLCEwKSksbz11TShpLmdldFNoYWxsb3coInN5bWJvbFNpemUiLCEwKSksYT1pLmdldChoTSk7blswXSYmdC5zZXRJdGVtVmlzdWFsKGUsImZyb21TeW1ib2wiLG5bMF0pLG5bMV0mJnQuc2V0SXRlbVZpc3VhbChlLCJ0b1N5bWJvbCIsblsxXSksb1swXSYmdC5zZXRJdGVtVmlzdWFsKGUsImZyb21TeW1ib2xTaXplIixvWzBdKSxvWzFdJiZ0LnNldEl0ZW1WaXN1YWwoZSwidG9TeW1ib2xTaXplIixvWzFdKSx0LnNldEl0ZW1WaXN1YWwoZSwib3BhY2l0eSIsYSl9Om51bGx9fX07dmYobE0pLHlmKGNNKSxpYy5leHRlbmQoe3R5cGU6InNlcmllcy5oZWF0bWFwIixnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiBocCh0aGlzLmdldFNvdXJjZSgpLHRoaXMse2dlbmVyYXRlQ29vcmQ6InZhbHVlIn0pfSxwcmV2ZW50SW5jcmVtZW50YWw6ZnVuY3Rpb24oKXt2YXIgdD1uaC5nZXQodGhpcy5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSk7aWYodCYmdC5kaW1lbnNpb25zKXJldHVybiJsbmciPT09dC5kaW1lbnNpb25zWzBdJiYibGF0Ij09PXQuZGltZW5zaW9uc1sxXX0sZGVmYXVsdE9wdGlvbjp7Y29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLHpsZXZlbDowLHo6MixnZW9JbmRleDowLGJsdXJTaXplOjMwLHBvaW50U2l6ZToyMCxtYXhPcGFjaXR5OjEsbWluT3BhY2l0eTowfX0pO2Z1bmN0aW9uIGRNKCl7dmFyIHQ9ZygpO3RoaXMuY2FudmFzPXQsdGhpcy5ibHVyU2l6ZT0zMCx0aGlzLnBvaW50U2l6ZT0yMCx0aGlzLm1heE9wYWNpdHk9MSx0aGlzLm1pbk9wYWNpdHk9MCx0aGlzLl9ncmFkaWVudFBpeGVscz17fX1kTS5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbih0LGUsaSxuLG8sYSl7dmFyIHI9dGhpcy5fZ2V0QnJ1c2goKSxzPXRoaXMuX2dldEdyYWRpZW50KHQsbywiaW5SYW5nZSIpLGw9dGhpcy5fZ2V0R3JhZGllbnQodCxvLCJvdXRPZlJhbmdlIiksdT10aGlzLnBvaW50U2l6ZSt0aGlzLmJsdXJTaXplLGg9dGhpcy5jYW52YXMsYz1oLmdldENvbnRleHQoIjJkIiksZD10Lmxlbmd0aDtoLndpZHRoPWUsaC5oZWlnaHQ9aTtmb3IodmFyIGY9MDtmPGQ7KytmKXt2YXIgcD10W2ZdLGc9cFswXSxtPXBbMV0sdj1uKHBbMl0pO2MuZ2xvYmFsQWxwaGE9dixjLmRyYXdJbWFnZShyLGctdSxtLXUpfWlmKCFoLndpZHRofHwhaC5oZWlnaHQpcmV0dXJuIGg7Zm9yKHZhciB5PWMuZ2V0SW1hZ2VEYXRhKDAsMCxoLndpZHRoLGguaGVpZ2h0KSx4PXkuZGF0YSxfPTAsdz14Lmxlbmd0aCxiPXRoaXMubWluT3BhY2l0eSxTPXRoaXMubWF4T3BhY2l0eS1iO188dzspe3Y9eFtfKzNdLzI1Njt2YXIgTT00Kk1hdGguZmxvb3IoMjU1KnYpO2lmKDA8dil7dmFyIEk9YSh2KT9zOmw7MDx2JiYodj12KlMrYikseFtfKytdPUlbTV0seFtfKytdPUlbMStNXSx4W18rK109SVsyK01dLHhbXysrXT1JWzMrTV0qdioyNTZ9ZWxzZSBfKz00fXJldHVybiBjLnB1dEltYWdlRGF0YSh5LDAsMCksaH0sX2dldEJydXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYnJ1c2hDYW52YXN8fCh0aGlzLl9icnVzaENhbnZhcz1nKCkpLGU9dGhpcy5wb2ludFNpemUrdGhpcy5ibHVyU2l6ZSxpPTIqZTt0LndpZHRoPWksdC5oZWlnaHQ9aTt2YXIgbj10LmdldENvbnRleHQoIjJkIik7cmV0dXJuIG4uY2xlYXJSZWN0KDAsMCxpLGkpLG4uc2hhZG93T2Zmc2V0WD1pLG4uc2hhZG93Qmx1cj10aGlzLmJsdXJTaXplLG4uc2hhZG93Q29sb3I9IiMwMDAiLG4uYmVnaW5QYXRoKCksbi5hcmMoLWUsZSx0aGlzLnBvaW50U2l6ZSwwLDIqTWF0aC5QSSwhMCksbi5jbG9zZVBhdGgoKSxuLmZpbGwoKSx0fSxfZ2V0R3JhZGllbnQ6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbj10aGlzLl9ncmFkaWVudFBpeGVscyxvPW5baV18fChuW2ldPW5ldyBVaW50OENsYW1wZWRBcnJheSgxMDI0KSksYT1bMCwwLDAsMF0scj0wLHM9MDtzPDI1NjtzKyspZVtpXShzLzI1NSwhMCxhKSxvW3IrK109YVswXSxvW3IrK109YVsxXSxvW3IrK109YVsyXSxvW3IrK109YVszXTtyZXR1cm4gb319LE1mKHt0eXBlOiJoZWF0bWFwIixyZW5kZXI6ZnVuY3Rpb24oaSx0LGUpe3ZhciBuO3QuZWFjaENvbXBvbmVudCgidmlzdWFsTWFwIixmdW5jdGlvbihlKXtlLmVhY2hUYXJnZXRTZXJpZXMoZnVuY3Rpb24odCl7dD09PWkmJihuPWUpfSl9KSx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2luY3JlbWVudGFsRGlzcGxheWFibGU9bnVsbDt2YXIgbz1pLmNvb3JkaW5hdGVTeXN0ZW07ImNhcnRlc2lhbjJkIj09PW8udHlwZXx8ImNhbGVuZGFyIj09PW8udHlwZT90aGlzLl9yZW5kZXJPbkNhcnRlc2lhbkFuZENhbGVuZGFyKGksZSwwLGkuZ2V0RGF0YSgpLmNvdW50KCkpOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGltZW5zaW9ucztyZXR1cm4ibG5nIj09PWVbMF0mJiJsYXQiPT09ZVsxXX0obykmJnRoaXMuX3JlbmRlck9uR2VvKG8saSxuLGUpfSxpbmNyZW1lbnRhbFByZXBhcmVSZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LGluY3JlbWVudGFsUmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe2UuY29vcmRpbmF0ZVN5c3RlbSYmdGhpcy5fcmVuZGVyT25DYXJ0ZXNpYW5BbmRDYWxlbmRhcihlLG4sdC5zdGFydCx0LmVuZCwhMCl9LF9yZW5kZXJPbkNhcnRlc2lhbkFuZENhbGVuZGFyOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGEscixzPXQuY29vcmRpbmF0ZVN5c3RlbTtpZigiY2FydGVzaWFuMmQiPT09cy50eXBlKXt2YXIgbD1zLmdldEF4aXMoIngiKSx1PXMuZ2V0QXhpcygieSIpO2E9bC5nZXRCYW5kV2lkdGgoKSxyPXUuZ2V0QmFuZFdpZHRoKCl9Zm9yKHZhciBoPXRoaXMuZ3JvdXAsYz10LmdldERhdGEoKSxkPSJlbXBoYXNpcy5pdGVtU3R5bGUiLGY9ImVtcGhhc2lzLmxhYmVsIixwPXQuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZShbImNvbG9yIl0pLGc9dC5nZXRNb2RlbChkKS5nZXRJdGVtU3R5bGUoKSxtPXQuZ2V0TW9kZWwoImxhYmVsIiksdj10LmdldE1vZGVsKGYpLHk9cy50eXBlLHg9ImNhcnRlc2lhbjJkIj09PXk/W2MubWFwRGltZW5zaW9uKCJ4IiksYy5tYXBEaW1lbnNpb24oInkiKSxjLm1hcERpbWVuc2lvbigidmFsdWUiKV06W2MubWFwRGltZW5zaW9uKCJ0aW1lIiksYy5tYXBEaW1lbnNpb24oInZhbHVlIildLF89aTtfPG47XysrKXt2YXIgdztpZigiY2FydGVzaWFuMmQiPT09eSl7aWYoaXNOYU4oYy5nZXQoeFsyXSxfKSkpY29udGludWU7dmFyIGI9cy5kYXRhVG9Qb2ludChbYy5nZXQoeFswXSxfKSxjLmdldCh4WzFdLF8pXSk7dz1uZXcgaXMoe3NoYXBlOnt4Ok1hdGguZmxvb3IoYlswXS1hLzIpLHk6TWF0aC5mbG9vcihiWzFdLXIvMiksd2lkdGg6TWF0aC5jZWlsKGEpLGhlaWdodDpNYXRoLmNlaWwocil9LHN0eWxlOntmaWxsOmMuZ2V0SXRlbVZpc3VhbChfLCJjb2xvciIpLG9wYWNpdHk6Yy5nZXRJdGVtVmlzdWFsKF8sIm9wYWNpdHkiKX19KX1lbHNle2lmKGlzTmFOKGMuZ2V0KHhbMV0sXykpKWNvbnRpbnVlO3c9bmV3IGlzKHt6MjoxLHNoYXBlOnMuZGF0YVRvUmVjdChbYy5nZXQoeFswXSxfKV0pLmNvbnRlbnRTaGFwZSxzdHlsZTp7ZmlsbDpjLmdldEl0ZW1WaXN1YWwoXywiY29sb3IiKSxvcGFjaXR5OmMuZ2V0SXRlbVZpc3VhbChfLCJvcGFjaXR5Iil9fSl9dmFyIFM9Yy5nZXRJdGVtTW9kZWwoXyk7Yy5oYXNJdGVtT3B0aW9uJiYocD1TLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoWyJjb2xvciJdKSxnPVMuZ2V0TW9kZWwoZCkuZ2V0SXRlbVN0eWxlKCksbT1TLmdldE1vZGVsKCJsYWJlbCIpLHY9Uy5nZXRNb2RlbChmKSk7dmFyIE09dC5nZXRSYXdWYWx1ZShfKSxJPSItIjtNJiZudWxsIT1NWzJdJiYoST1NWzJdKSwkcyhwLGcsbSx2LHtsYWJlbEZldGNoZXI6dCxsYWJlbERhdGFJbmRleDpfLGRlZmF1bHRUZXh0OkksaXNSZWN0VGV4dDohMH0pLHcuc2V0U3R5bGUocCksWXModyxjLmhhc0l0ZW1PcHRpb24/ZzpMKHt9LGcpKSwody5pbmNyZW1lbnRhbD1vKSYmKHcudXNlSG92ZXJMYXllcj0hMCksaC5hZGQodyksYy5zZXRJdGVtR3JhcGhpY0VsKF8sdyl9fSxfcmVuZGVyT25HZW86ZnVuY3Rpb24obyx0LGUsaSl7dmFyIG49ZS50YXJnZXRWaXN1YWxzLmluUmFuZ2UsYT1lLnRhcmdldFZpc3VhbHMub3V0T2ZSYW5nZSxyPXQuZ2V0RGF0YSgpLHM9dGhpcy5faG1MYXllcnx8dGhpcy5faG1MYXllcnx8bmV3IGRNO3MuYmx1clNpemU9dC5nZXQoImJsdXJTaXplIikscy5wb2ludFNpemU9dC5nZXQoInBvaW50U2l6ZSIpLHMubWluT3BhY2l0eT10LmdldCgibWluT3BhY2l0eSIpLHMubWF4T3BhY2l0eT10LmdldCgibWF4T3BhY2l0eSIpO3ZhciBsPW8uZ2V0Vmlld1JlY3QoKS5jbG9uZSgpLHU9by5nZXRSb2FtVHJhbnNmb3JtKCk7bC5hcHBseVRyYW5zZm9ybSh1KTt2YXIgaD1NYXRoLm1heChsLngsMCksYz1NYXRoLm1heChsLnksMCksZD1NYXRoLm1pbihsLndpZHRoK2wueCxpLmdldFdpZHRoKCkpLGY9TWF0aC5taW4obC5oZWlnaHQrbC55LGkuZ2V0SGVpZ2h0KCkpLHA9ZC1oLGc9Zi1jLG09W3IubWFwRGltZW5zaW9uKCJsbmciKSxyLm1hcERpbWVuc2lvbigibGF0Iiksci5tYXBEaW1lbnNpb24oInZhbHVlIildLHY9ci5tYXBBcnJheShtLGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1vLmRhdGFUb1BvaW50KFt0LGVdKTtyZXR1cm4gblswXS09aCxuWzFdLT1jLG4ucHVzaChpKSxufSkseT1lLmdldEV4dGVudCgpLHg9InZpc3VhbE1hcC5jb250aW51b3VzIj09PWUudHlwZT9mdW5jdGlvbih0LGUpe3ZhciBpPXRbMV0tdFswXTtyZXR1cm4gZT1bKGVbMF0tdFswXSkvaSwoZVsxXS10WzBdKS9pXSxmdW5jdGlvbih0KXtyZXR1cm4gdD49ZVswXSYmdDw9ZVsxXX19KHksZS5vcHRpb24ucmFuZ2UpOmZ1bmN0aW9uKGUsbixvKXt2YXIgaT1lWzFdLWVbMF0sYT0obj1OKG4sZnVuY3Rpb24odCl7cmV0dXJue2ludGVydmFsOlsodC5pbnRlcnZhbFswXS1lWzBdKS9pLCh0LmludGVydmFsWzFdLWVbMF0pL2ldfX0pKS5sZW5ndGgscj0wO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9cjtlPGE7ZSsrKXtpZigoaT1uW2VdLmludGVydmFsKVswXTw9dCYmdDw9aVsxXSl7cj1lO2JyZWFrfX1pZihlPT09YSlmb3IoZT1yLTE7MDw9ZTtlLS0pe3ZhciBpO2lmKChpPW5bZV0uaW50ZXJ2YWwpWzBdPD10JiZ0PD1pWzFdKXtyPWU7YnJlYWt9fXJldHVybiAwPD1lJiZlPGEmJm9bZV19fSh5LGUuZ2V0UGllY2VMaXN0KCksZS5vcHRpb24uc2VsZWN0ZWQpO3MudXBkYXRlKHYscCxnLG4uY29sb3IuZ2V0Tm9ybWFsaXplcigpLHtpblJhbmdlOm4uY29sb3IuZ2V0Q29sb3JNYXBwZXIoKSxvdXRPZlJhbmdlOmEuY29sb3IuZ2V0Q29sb3JNYXBwZXIoKX0seCk7dmFyIF89bmV3IHFuKHtzdHlsZTp7d2lkdGg6cCxoZWlnaHQ6Zyx4OmgseTpjLGltYWdlOnMuY2FudmFzfSxzaWxlbnQ6ITB9KTt0aGlzLmdyb3VwLmFkZChfKX0sZGlzcG9zZTpmdW5jdGlvbigpe319KTt2YXIgZk09eXYuZXh0ZW5kKHt0eXBlOiJzZXJpZXMucGljdG9yaWFsQmFyIixkZXBlbmRlbmNpZXM6WyJncmlkIl0sZGVmYXVsdE9wdGlvbjp7c3ltYm9sOiJjaXJjbGUiLHN5bWJvbFNpemU6bnVsbCxzeW1ib2xSb3RhdGU6bnVsbCxzeW1ib2xQb3NpdGlvbjpudWxsLHN5bWJvbE9mZnNldDpudWxsLHN5bWJvbE1hcmdpbjpudWxsLHN5bWJvbFJlcGVhdDohMSxzeW1ib2xSZXBlYXREaXJlY3Rpb246ImVuZCIsc3ltYm9sQ2xpcDohMSxzeW1ib2xCb3VuZGluZ0RhdGE6bnVsbCxzeW1ib2xQYXR0ZXJuU2l6ZTo0MDAsYmFyR2FwOiItMTAwJSIscHJvZ3Jlc3NpdmU6MCxob3ZlckFuaW1hdGlvbjohMX0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3RhY2s9bnVsbCxmTS5zdXBlckFwcGx5KHRoaXMsImdldEluaXRpYWxEYXRhIixhcmd1bWVudHMpfX0pLHBNPVsiaXRlbVN0eWxlIiwiYm9yZGVyV2lkdGgiXSxnTT1be3h5OiJ4Iix3aDoid2lkdGgiLGluZGV4OjAscG9zRGVzYzpbImxlZnQiLCJyaWdodCJdfSx7eHk6InkiLHdoOiJoZWlnaHQiLGluZGV4OjEscG9zRGVzYzpbInRvcCIsImJvdHRvbSJdfV0sbU09bmV3IEhyO01mKHt0eXBlOiJwaWN0b3JpYWxCYXIiLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy5ncm91cCxzPXQuZ2V0RGF0YSgpLGw9dGhpcy5fZGF0YSxuPXQuY29vcmRpbmF0ZVN5c3RlbSxvPSEhbi5nZXRCYXNlQXhpcygpLmlzSG9yaXpvbnRhbCgpLGE9bi5ncmlkLmdldFJlY3QoKSx1PXtlY1NpemU6e3dpZHRoOmkuZ2V0V2lkdGgoKSxoZWlnaHQ6aS5nZXRIZWlnaHQoKX0sc2VyaWVzTW9kZWw6dCxjb29yZFN5czpuLGNvb3JkU3lzRXh0ZW50OltbYS54LGEueCthLndpZHRoXSxbYS55LGEueSthLmhlaWdodF1dLGlzSG9yaXpvbnRhbDpvLHZhbHVlRGltOmdNWytvXSxjYXRlZ29yeURpbTpnTVsxLW9dfTtyZXR1cm4gcy5kaWZmKGwpLmFkZChmdW5jdGlvbih0KXtpZihzLmhhc1ZhbHVlKHQpKXt2YXIgZT1NTShzLHQpLGk9dk0ocyx0LGUsdSksbj1ETShzLHUsaSk7cy5zZXRJdGVtR3JhcGhpY0VsKHQsbiksci5hZGQobiksTk0obix1LGkpfX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPWwuZ2V0SXRlbUdyYXBoaWNFbChlKTtpZihzLmhhc1ZhbHVlKHQpKXt2YXIgbj1NTShzLHQpLG89dk0ocyx0LG4sdSksYT1MTShzLG8pO2kmJmEhPT1pLl9fcGljdG9yaWFsU2hhcGVTdHImJihyLnJlbW92ZShpKSxzLnNldEl0ZW1HcmFwaGljRWwodCxudWxsKSxpPW51bGwpLGk/ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkuYW5pbWF0aW9uTW9kZWwsbz1pLmRhdGFJbmRleDtzbCh0Ll9fcGljdG9yaWFsQnVuZGxlLHtwb3NpdGlvbjppLmJ1bmRsZVBvc2l0aW9uLnNsaWNlKCl9LG4sbyksaS5zeW1ib2xSZXBlYXQ/X00odCxlLGksITApOndNKHQsZSxpLCEwKTtiTSh0LGksITApLFNNKHQsZSxpLCEwKX0oaSx1LG8pOmk9RE0ocyx1LG8sITApLHMuc2V0SXRlbUdyYXBoaWNFbCh0LGkpLGkuX19waWN0b3JpYWxTeW1ib2xNZXRhPW8sci5hZGQoaSksTk0oaSx1LG8pfWVsc2Ugci5yZW1vdmUoaSl9KS5yZW1vdmUoZnVuY3Rpb24odCl7dmFyIGU9bC5nZXRJdGVtR3JhcGhpY0VsKHQpO2UmJkNNKGwsdCxlLl9fcGljdG9yaWFsU3ltYm9sTWV0YS5hbmltYXRpb25Nb2RlbCxlKX0pLmV4ZWN1dGUoKSx0aGlzLl9kYXRhPXMsdGhpcy5ncm91cH0sZGlzcG9zZTpldCxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLmdyb3VwLG49dGhpcy5fZGF0YTtlLmdldCgiYW5pbWF0aW9uIik/biYmbi5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0KXtDTShuLHQuZGF0YUluZGV4LGUsdCl9KTppLnJlbW92ZUFsbCgpfX0pO2Z1bmN0aW9uIHZNKHQsZSxpLG4pe3ZhciBvPXQuZ2V0SXRlbUxheW91dChlKSxhPWkuZ2V0KCJzeW1ib2xSZXBlYXQiKSxyPWkuZ2V0KCJzeW1ib2xDbGlwIikscz1pLmdldCgic3ltYm9sUG9zaXRpb24iKXx8InN0YXJ0IixsPShpLmdldCgic3ltYm9sUm90YXRlIil8fDApKk1hdGguUEkvMTgwfHwwLHU9aS5nZXQoInN5bWJvbFBhdHRlcm5TaXplIil8fDIsaD1pLmlzQW5pbWF0aW9uRW5hYmxlZCgpLGM9e2RhdGFJbmRleDplLGxheW91dDpvLGl0ZW1Nb2RlbDppLHN5bWJvbFR5cGU6dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbCIpfHwiY2lyY2xlIixjb2xvcjp0LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKSxzeW1ib2xDbGlwOnIsc3ltYm9sUmVwZWF0OmEsc3ltYm9sUmVwZWF0RGlyZWN0aW9uOmkuZ2V0KCJzeW1ib2xSZXBlYXREaXJlY3Rpb24iKSxzeW1ib2xQYXR0ZXJuU2l6ZTp1LHJvdGF0aW9uOmwsYW5pbWF0aW9uTW9kZWw6aD9pOm51bGwsaG92ZXJBbmltYXRpb246aCYmaS5nZXQoImhvdmVyQW5pbWF0aW9uIiksejI6aS5nZXRTaGFsbG93KCJ6IiwhMCl8fDB9OyFmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhLHI9bi52YWx1ZURpbSxzPXQuZ2V0KCJzeW1ib2xCb3VuZGluZ0RhdGEiKSxsPW4uY29vcmRTeXMuZ2V0T3RoZXJBeGlzKG4uY29vcmRTeXMuZ2V0QmFzZUF4aXMoKSksdT1sLnRvR2xvYmFsQ29vcmQobC5kYXRhVG9Db29yZCgwKSksaD0xLSsoaVtyLndoXTw9MCk7aWYoayhzKSl7dmFyIGM9W3lNKGwsc1swXSktdSx5TShsLHNbMV0pLXVdO2NbMV08Y1swXSYmYy5yZXZlcnNlKCksYT1jW2hdfWVsc2UgYT1udWxsIT1zP3lNKGwscyktdTplP24uY29vcmRTeXNFeHRlbnRbci5pbmRleF1baF0tdTppW3Iud2hdO28uYm91bmRpbmdMZW5ndGg9YSxlJiYoby5yZXBlYXRDdXRMZW5ndGg9aVtyLndoXSk7by5weFNpZ249MDxhPzE6YTwwPy0xOjB9KGksYSxvLG4sYyksZnVuY3Rpb24odCxlLGksbixvLGEscixzLGwsdSl7dmFyIGg9bC52YWx1ZURpbSxjPWwuY2F0ZWdvcnlEaW0sZD1NYXRoLmFicyhpW2Mud2hdKSxmPXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIik7Zj1rKGYpP2Yuc2xpY2UoKToobnVsbD09ZiYmKGY9IjEwMCUiKSxbZixmXSk7ZltjLmluZGV4XT1QbChmW2MuaW5kZXhdLGQpLGZbaC5pbmRleF09UGwoZltoLmluZGV4XSxuP2Q6TWF0aC5hYnMoYSkpLHUuc3ltYm9sU2l6ZT1mLCh1LnN5bWJvbFNjYWxlPVtmWzBdL3MsZlsxXS9zXSlbaC5pbmRleF0qPShsLmlzSG9yaXpvbnRhbD8tMToxKSpyfSh0LGUsbyxhLDAsYy5ib3VuZGluZ0xlbmd0aCxjLnB4U2lnbix1LG4sYyksZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT10LmdldChwTSl8fDA7YSYmKG1NLmF0dHIoe3NjYWxlOmUuc2xpY2UoKSxyb3RhdGlvbjppfSksbU0udXBkYXRlVHJhbnNmb3JtKCksYS89bU0uZ2V0TGluZVNjYWxlKCksYSo9ZVtuLnZhbHVlRGltLmluZGV4XSk7by52YWx1ZUxpbmVXaWR0aD1hfShpLGMuc3ltYm9sU2NhbGUsbCxuLGMpO3ZhciBkPWMuc3ltYm9sU2l6ZSxmPWkuZ2V0KCJzeW1ib2xPZmZzZXQiKTtyZXR1cm4gayhmKSYmKGY9W1BsKGZbMF0sZFswXSksUGwoZlsxXSxkWzFdKV0pLGZ1bmN0aW9uKHQsZSxpLG4sbyxhLHIscyxsLHUsaCxjKXt2YXIgZD1oLmNhdGVnb3J5RGltLGY9aC52YWx1ZURpbSxwPWMucHhTaWduLGc9TWF0aC5tYXgoZVtmLmluZGV4XStzLDApLG09ZztpZihuKXt2YXIgdj1NYXRoLmFicyhsKSx5PVcodC5nZXQoInN5bWJvbE1hcmdpbiIpLCIxNSUiKSsiIix4PSExO3kubGFzdEluZGV4T2YoIiEiKT09PXkubGVuZ3RoLTEmJih4PSEwLHk9eS5zbGljZSgwLHkubGVuZ3RoLTEpKSx5PVBsKHksZVtmLmluZGV4XSk7dmFyIF89TWF0aC5tYXgoZysyKnksMCksdz14PzA6Mip5LGI9amwobiksUz1iP246T00oKHYrdykvXyk7Xz1nKzIqKHk9KHYtUypnKS8yLyh4P1M6Uy0xKSksdz14PzA6Mip5LGJ8fCJmaXhlZCI9PT1ufHwoUz11P09NKChNYXRoLmFicyh1KSt3KS9fKTowKSxtPVMqXy13LGMucmVwZWF0VGltZXM9UyxjLnN5bWJvbE1hcmdpbj15fXZhciBNPXAqKG0vMiksST1jLnBhdGhQb3NpdGlvbj1bXTtJW2QuaW5kZXhdPWlbZC53aF0vMixJW2YuaW5kZXhdPSJzdGFydCI9PT1yP006ImVuZCI9PT1yP2wtTTpsLzIsYSYmKElbMF0rPWFbMF0sSVsxXSs9YVsxXSk7dmFyIFQ9Yy5idW5kbGVQb3NpdGlvbj1bXTtUW2QuaW5kZXhdPWlbZC54eV0sVFtmLmluZGV4XT1pW2YueHldO3ZhciBBPWMuYmFyUmVjdFNoYXBlPUwoe30saSk7QVtmLndoXT1wKk1hdGgubWF4KE1hdGguYWJzKGlbZi53aF0pLE1hdGguYWJzKElbZi5pbmRleF0rTSkpLEFbZC53aF09aVtkLndoXTt2YXIgRD1jLmNsaXBTaGFwZT17fTtEW2QueHldPS1pW2QueHldLERbZC53aF09aC5lY1NpemVbZC53aF0sRFtmLnh5XT0wLERbZi53aF09aVtmLndoXX0oaSxkLG8sYSwwLGYscyxjLnZhbHVlTGluZVdpZHRoLGMuYm91bmRpbmdMZW5ndGgsYy5yZXBlYXRDdXRMZW5ndGgsbixjKSxjfWZ1bmN0aW9uIHlNKHQsZSl7cmV0dXJuIHQudG9HbG9iYWxDb29yZCh0LmRhdGFUb0Nvb3JkKHQuc2NhbGUucGFyc2UoZSkpKX1mdW5jdGlvbiB4TSh0KXt2YXIgZT10LnN5bWJvbFBhdHRlcm5TaXplLGk9bWcodC5zeW1ib2xUeXBlLC1lLzIsLWUvMixlLGUsdC5jb2xvcik7cmV0dXJuIGkuYXR0cih7Y3VsbGluZzohMH0pLCJpbWFnZSIhPT1pLnR5cGUmJmkuc2V0U3R5bGUoe3N0cm9rZU5vU2NhbGU6ITB9KSxpfWZ1bmN0aW9uIF9NKHQsZSxvLGkpe3ZhciBuPXQuX19waWN0b3JpYWxCdW5kbGUsYT1vLnN5bWJvbFNpemUscj1vLnZhbHVlTGluZVdpZHRoLHM9by5wYXRoUG9zaXRpb24sbD1lLnZhbHVlRGltLHU9by5yZXBlYXRUaW1lc3x8MCxoPTAsYz1hW2UudmFsdWVEaW0uaW5kZXhdK3IrMipvLnN5bWJvbE1hcmdpbjtmb3Ioa00odCxmdW5jdGlvbih0KXt0Ll9fcGljdG9yaWFsQW5pbWF0aW9uSW5kZXg9aCx0Ll9fcGljdG9yaWFsUmVwZWF0VGltZXM9dSxoPHU/UE0odCxudWxsLHAoaCksbyxpKTpQTSh0LG51bGwse3NjYWxlOlswLDBdfSxvLGksZnVuY3Rpb24oKXtuLnJlbW92ZSh0KX0pLEFNKHQsbyksaCsrfSk7aDx1O2grKyl7dmFyIGQ9eE0obyk7ZC5fX3BpY3RvcmlhbEFuaW1hdGlvbkluZGV4PWgsZC5fX3BpY3RvcmlhbFJlcGVhdFRpbWVzPXUsbi5hZGQoZCk7dmFyIGY9cChoKTtQTShkLHtwb3NpdGlvbjpmLnBvc2l0aW9uLHNjYWxlOlswLDBdfSx7c2NhbGU6Zi5zY2FsZSxyb3RhdGlvbjpmLnJvdGF0aW9ufSxvLGkpLGQub24oIm1vdXNlb3ZlciIsZykub24oIm1vdXNlb3V0IixtKSxBTShkLG8pfWZ1bmN0aW9uIHAodCl7dmFyIGU9cy5zbGljZSgpLGk9by5weFNpZ24sbj10O3JldHVybigic3RhcnQiPT09by5zeW1ib2xSZXBlYXREaXJlY3Rpb24/MDxpOmk8MCkmJihuPXUtMS10KSxlW2wuaW5kZXhdPWMqKG4tdS8yKy41KStzW2wuaW5kZXhdLHtwb3NpdGlvbjplLHNjYWxlOm8uc3ltYm9sU2NhbGUuc2xpY2UoKSxyb3RhdGlvbjpvLnJvdGF0aW9ufX1mdW5jdGlvbiBnKCl7a00odCxmdW5jdGlvbih0KXt0LnRyaWdnZXIoImVtcGhhc2lzIil9KX1mdW5jdGlvbiBtKCl7a00odCxmdW5jdGlvbih0KXt0LnRyaWdnZXIoIm5vcm1hbCIpfSl9fWZ1bmN0aW9uIHdNKHQsZSxpLG4pe3ZhciBvPXQuX19waWN0b3JpYWxCdW5kbGUsYT10Ll9fcGljdG9yaWFsTWFpblBhdGg7YT9QTShhLG51bGwse3Bvc2l0aW9uOmkucGF0aFBvc2l0aW9uLnNsaWNlKCksc2NhbGU6aS5zeW1ib2xTY2FsZS5zbGljZSgpLHJvdGF0aW9uOmkucm90YXRpb259LGksbik6KGE9dC5fX3BpY3RvcmlhbE1haW5QYXRoPXhNKGkpLG8uYWRkKGEpLFBNKGEse3Bvc2l0aW9uOmkucGF0aFBvc2l0aW9uLnNsaWNlKCksc2NhbGU6WzAsMF0scm90YXRpb246aS5yb3RhdGlvbn0se3NjYWxlOmkuc3ltYm9sU2NhbGUuc2xpY2UoKX0saSxuKSxhLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJlbXBoYXNpcyIpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudHJpZ2dlcigibm9ybWFsIil9KSksQU0oYSxpKX1mdW5jdGlvbiBiTSh0LGUsaSl7dmFyIG49TCh7fSxlLmJhclJlY3RTaGFwZSksbz10Ll9fcGljdG9yaWFsQmFyUmVjdDtvP1BNKG8sbnVsbCx7c2hhcGU6bn0sZSxpKToobz10Ll9fcGljdG9yaWFsQmFyUmVjdD1uZXcgaXMoe3oyOjIsc2hhcGU6bixzaWxlbnQ6ITAsc3R5bGU6e3N0cm9rZToidHJhbnNwYXJlbnQiLGZpbGw6InRyYW5zcGFyZW50IixsaW5lV2lkdGg6MH19KSx0LmFkZChvKSl9ZnVuY3Rpb24gU00odCxlLGksbil7aWYoaS5zeW1ib2xDbGlwKXt2YXIgbz10Ll9fcGljdG9yaWFsQ2xpcFBhdGgsYT1MKHt9LGkuY2xpcFNoYXBlKSxyPWUudmFsdWVEaW0scz1pLmFuaW1hdGlvbk1vZGVsLGw9aS5kYXRhSW5kZXg7aWYobylzbChvLHtzaGFwZTphfSxzLGwpO2Vsc2V7YVtyLndoXT0wLG89bmV3IGlzKHtzaGFwZTphfSksdC5fX3BpY3RvcmlhbEJ1bmRsZS5zZXRDbGlwUGF0aChvKSx0Ll9fcGljdG9yaWFsQ2xpcFBhdGg9bzt2YXIgdT17fTt1W3Iud2hdPWkuY2xpcFNoYXBlW3Iud2hdLHlsW24/InVwZGF0ZVByb3BzIjoiaW5pdFByb3BzIl0obyx7c2hhcGU6dX0scyxsKX19fWZ1bmN0aW9uIE1NKHQsZSl7dmFyIGk9dC5nZXRJdGVtTW9kZWwoZSk7cmV0dXJuIGkuZ2V0QW5pbWF0aW9uRGVsYXlQYXJhbXM9SU0saS5pc0FuaW1hdGlvbkVuYWJsZWQ9VE0saX1mdW5jdGlvbiBJTSh0KXtyZXR1cm57aW5kZXg6dC5fX3BpY3RvcmlhbEFuaW1hdGlvbkluZGV4LGNvdW50OnQuX19waWN0b3JpYWxSZXBlYXRUaW1lc319ZnVuY3Rpb24gVE0oKXtyZXR1cm4gdGhpcy5wYXJlbnRNb2RlbC5pc0FuaW1hdGlvbkVuYWJsZWQoKSYmISF0aGlzLmdldFNoYWxsb3coImFuaW1hdGlvbiIpfWZ1bmN0aW9uIEFNKHQsZSl7dC5vZmYoImVtcGhhc2lzIikub2ZmKCJub3JtYWwiKTt2YXIgaT1lLnN5bWJvbFNjYWxlLnNsaWNlKCk7ZS5ob3ZlckFuaW1hdGlvbiYmdC5vbigiZW1waGFzaXMiLGZ1bmN0aW9uKCl7dGhpcy5hbmltYXRlVG8oe3NjYWxlOlsxLjEqaVswXSwxLjEqaVsxXV19LDQwMCwiZWxhc3RpY091dCIpfSkub24oIm5vcm1hbCIsZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGVUbyh7c2NhbGU6aS5zbGljZSgpfSw0MDAsImVsYXN0aWNPdXQiKX0pfWZ1bmN0aW9uIERNKHQsZSxpLG4pe3ZhciBvPW5ldyBJaSxhPW5ldyBJaTtyZXR1cm4gby5hZGQoYSksKG8uX19waWN0b3JpYWxCdW5kbGU9YSkuYXR0cigicG9zaXRpb24iLGkuYnVuZGxlUG9zaXRpb24uc2xpY2UoKSksaS5zeW1ib2xSZXBlYXQ/X00obyxlLGkpOndNKG8sMCxpKSxiTShvLGksbiksU00obyxlLGksbiksby5fX3BpY3RvcmlhbFNoYXBlU3RyPUxNKHQsaSksby5fX3BpY3RvcmlhbFN5bWJvbE1ldGE9aSxvfWZ1bmN0aW9uIENNKHQsZSxpLG4pe3ZhciBvPW4uX19waWN0b3JpYWxCYXJSZWN0O28mJihvLnN0eWxlLnRleHQ9bnVsbCk7dmFyIGE9W107a00obixmdW5jdGlvbih0KXthLnB1c2godCl9KSxuLl9fcGljdG9yaWFsTWFpblBhdGgmJmEucHVzaChuLl9fcGljdG9yaWFsTWFpblBhdGgpLG4uX19waWN0b3JpYWxDbGlwUGF0aCYmKGk9bnVsbCksRShhLGZ1bmN0aW9uKHQpe3NsKHQse3NjYWxlOlswLDBdfSxpLGUsZnVuY3Rpb24oKXtuLnBhcmVudCYmbi5wYXJlbnQucmVtb3ZlKG4pfSl9KSx0LnNldEl0ZW1HcmFwaGljRWwoZSxudWxsKX1mdW5jdGlvbiBMTSh0LGUpe3JldHVyblt0LmdldEl0ZW1WaXN1YWwoZS5kYXRhSW5kZXgsInN5bWJvbCIpfHwibm9uZSIsISFlLnN5bWJvbFJlcGVhdCwhIWUuc3ltYm9sQ2xpcF0uam9pbigiOiIpfWZ1bmN0aW9uIGtNKGUsaSxuKXtFKGUuX19waWN0b3JpYWxCdW5kbGUuY2hpbGRyZW4oKSxmdW5jdGlvbih0KXt0IT09ZS5fX3BpY3RvcmlhbEJhclJlY3QmJmkuY2FsbChuLHQpfSl9ZnVuY3Rpb24gUE0odCxlLGksbixvLGEpe2UmJnQuYXR0cihlKSxuLnN5bWJvbENsaXAmJiFvP2kmJnQuYXR0cihpKTppJiZ5bFtvPyJ1cGRhdGVQcm9wcyI6ImluaXRQcm9wcyJdKHQsaSxuLmFuaW1hdGlvbk1vZGVsLG4uZGF0YUluZGV4LGEpfWZ1bmN0aW9uIE5NKHQsZSxpKXt2YXIgbj1pLmNvbG9yLG89aS5kYXRhSW5kZXgsYT1pLml0ZW1Nb2RlbCxyPWEuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZShbImNvbG9yIl0pLHM9YS5nZXRNb2RlbCgiZW1waGFzaXMuaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksbD1hLmdldFNoYWxsb3coImN1cnNvciIpO2tNKHQsZnVuY3Rpb24odCl7dC5zZXRDb2xvcihuKSx0LnNldFN0eWxlKEMoe2ZpbGw6bixvcGFjaXR5Omkub3BhY2l0eX0scikpLFlzKHQscyksbCYmKHQuY3Vyc29yPWwpLHQuejI9aS56Mn0pO3ZhciB1PXt9LGg9KGUudmFsdWVEaW0ucG9zRGVzY1srKDA8aS5ib3VuZGluZ0xlbmd0aCldLHQuX19waWN0b3JpYWxCYXJSZWN0KTt4dihoLnN0eWxlLHUsYSxuLGUuc2VyaWVzTW9kZWwsbyksWXMoaCx1KX1mdW5jdGlvbiBPTSh0KXt2YXIgZT1NYXRoLnJvdW5kKHQpO3JldHVybiBNYXRoLmFicyh0LWUpPDFlLTQ/ZTpNYXRoLmNlaWwodCl9dmYoVChQcCwicGljdG9yaWFsQmFyIikpLHlmKE1tKCJwaWN0b3JpYWxCYXIiLCJyb3VuZFJlY3QiKSk7ZnVuY3Rpb24gRU0odCxlLGksbixvKXtFZy5jYWxsKHRoaXMsdCxlLGkpLHRoaXMudHlwZT1ufHwidmFsdWUiLHRoaXMucG9zaXRpb249b3x8ImJvdHRvbSIsdGhpcy5vcmllbnQ9bnVsbH1mdW5jdGlvbiB6TSh0LGUsaSl7dGhpcy5kaW1lbnNpb249InNpbmdsZSIsdGhpcy5kaW1lbnNpb25zPVsic2luZ2xlIl0sdGhpcy5fYXhpcz1udWxsLHRoaXMuX3JlY3QsdGhpcy5faW5pdCh0LGUsaSksdGhpcy5tb2RlbD10fWZ1bmN0aW9uIFJNKHQsZSl7ZT1lfHx7fTt2YXIgaT10LmNvb3JkaW5hdGVTeXN0ZW0sbj10LmF4aXMsbz17fSxhPW4ucG9zaXRpb24scj1uLm9yaWVudCxzPWkuZ2V0UmVjdCgpLGw9W3MueCxzLngrcy53aWR0aCxzLnkscy55K3MuaGVpZ2h0XSx1PXtob3Jpem9udGFsOnt0b3A6bFsyXSxib3R0b206bFszXX0sdmVydGljYWw6e2xlZnQ6bFswXSxyaWdodDpsWzFdfX07by5wb3NpdGlvbj1bInZlcnRpY2FsIj09PXI/dS52ZXJ0aWNhbFthXTpsWzBdLCJob3Jpem9udGFsIj09PXI/dS5ob3Jpem9udGFsW2FdOmxbM11dO28ucm90YXRpb249TWF0aC5QSS8yKntob3Jpem9udGFsOjAsdmVydGljYWw6MX1bcl07by5sYWJlbERpcmVjdGlvbj1vLnRpY2tEaXJlY3Rpb249by5uYW1lRGlyZWN0aW9uPXt0b3A6LTEsYm90dG9tOjEscmlnaHQ6MSxsZWZ0Oi0xfVthXSx0LmdldCgiYXhpc1RpY2suaW5zaWRlIikmJihvLnRpY2tEaXJlY3Rpb249LW8udGlja0RpcmVjdGlvbiksVyhlLmxhYmVsSW5zaWRlLHQuZ2V0KCJheGlzTGFiZWwuaW5zaWRlIikpJiYoby5sYWJlbERpcmVjdGlvbj0tby5sYWJlbERpcmVjdGlvbik7dmFyIGg9ZS5yb3RhdGU7cmV0dXJuIG51bGw9PWgmJihoPXQuZ2V0KCJheGlzTGFiZWwucm90YXRlIikpLG8ubGFiZWxSb3RhdGlvbj0idG9wIj09PWE/LWg6aCxvLnoyPTEsb31FTS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkVNLG1vZGVsOm51bGwsaXNIb3Jpem9udGFsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wb3NpdGlvbjtyZXR1cm4idG9wIj09PXR8fCJib3R0b20iPT09dH0scG9pbnRUb0RhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlU3lzdGVtLnBvaW50VG9EYXRhKHQsZSlbMF19LHRvR2xvYmFsQ29vcmQ6bnVsbCx0b0xvY2FsQ29vcmQ6bnVsbH0sdyhFTSxFZyksbmgucmVnaXN0ZXIoInNpbmdsZSIse2NyZWF0ZTpmdW5jdGlvbihuLG8pe3ZhciBhPVtdO3JldHVybiBuLmVhY2hDb21wb25lbnQoInNpbmdsZUF4aXMiLGZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IHpNKHQsbixvKTtpLm5hbWU9InNpbmdsZV8iK2UsaS5yZXNpemUodCxvKSx0LmNvb3JkaW5hdGVTeXN0ZW09aSxhLnB1c2goaSl9KSxuLmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7aWYoInNpbmdsZUF4aXMiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSl7dmFyIGU9bi5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJzaW5nbGVBeGlzIixpbmRleDp0LmdldCgic2luZ2xlQXhpc0luZGV4IiksaWQ6dC5nZXQoInNpbmdsZUF4aXNJZCIpfSlbMF07dC5jb29yZGluYXRlU3lzdGVtPWUmJmUuY29vcmRpbmF0ZVN5c3RlbX19KSxhfSxkaW1lbnNpb25zOih6TS5wcm90b3R5cGU9e3R5cGU6InNpbmdsZUF4aXMiLGF4aXNQb2ludGVyRW5hYmxlZDohMCxjb25zdHJ1Y3Rvcjp6TSxfaW5pdDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5kaW1lbnNpb24sbz1uZXcgRU0obixpZyh0KSxbMCwwXSx0LmdldCgidHlwZSIpLHQuZ2V0KCJwb3NpdGlvbiIpKSxhPSJjYXRlZ29yeSI9PT1vLnR5cGU7by5vbkJhbmQ9YSYmdC5nZXQoImJvdW5kYXJ5R2FwIiksby5pbnZlcnNlPXQuZ2V0KCJpbnZlcnNlIiksby5vcmllbnQ9dC5nZXQoIm9yaWVudCIpLCh0LmF4aXM9bykubW9kZWw9dCwoby5jb29yZGluYXRlU3lzdGVtPXRoaXMpLl9heGlzPW99LHVwZGF0ZTpmdW5jdGlvbih0LGUpe3QuZWFjaFNlcmllcyhmdW5jdGlvbih0KXtpZih0LmNvb3JkaW5hdGVTeXN0ZW09PT10aGlzKXt2YXIgZT10LmdldERhdGEoKTtFKGUubWFwRGltZW5zaW9uKHRoaXMuZGltZW5zaW9uLCEwKSxmdW5jdGlvbih0KXt0aGlzLl9heGlzLnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoZSx0KX0sdGhpcyksZWcodGhpcy5fYXhpcy5zY2FsZSx0aGlzLl9heGlzLm1vZGVsKX19LHRoaXMpfSxyZXNpemU6ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWN0PXZ1KHtsZWZ0OnQuZ2V0KCJsZWZ0IiksdG9wOnQuZ2V0KCJ0b3AiKSxyaWdodDp0LmdldCgicmlnaHQiKSxib3R0b206dC5nZXQoImJvdHRvbSIpLHdpZHRoOnQuZ2V0KCJ3aWR0aCIpLGhlaWdodDp0LmdldCgiaGVpZ2h0Iil9LHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KSx0aGlzLl9hZGp1c3RBeGlzKCl9LGdldFJlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdH0sX2FkanVzdEF4aXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWN0LGU9dGhpcy5fYXhpcyxpPWUuaXNIb3Jpem9udGFsKCksbj1pP1swLHQud2lkdGhdOlswLHQuaGVpZ2h0XSxvPWUucmV2ZXJzZT8xOjA7ZS5zZXRFeHRlbnQobltvXSxuWzEtb10pLHRoaXMuX3VwZGF0ZUF4aXNUcmFuc2Zvcm0oZSxpP3QueDp0LnkpfSxfdXBkYXRlQXhpc1RyYW5zZm9ybTpmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0RXh0ZW50KCksbj1pWzBdK2lbMV0sbz10LmlzSG9yaXpvbnRhbCgpO3QudG9HbG9iYWxDb29yZD1vP2Z1bmN0aW9uKHQpe3JldHVybiB0K2V9OmZ1bmN0aW9uKHQpe3JldHVybiBuLXQrZX0sdC50b0xvY2FsQ29vcmQ9bz9mdW5jdGlvbih0KXtyZXR1cm4gdC1lfTpmdW5jdGlvbih0KXtyZXR1cm4gbi10K2V9fSxnZXRBeGlzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F4aXN9LGdldEJhc2VBeGlzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F4aXN9LGdldEF4ZXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fYXhpc119LGdldFRvb2x0aXBBeGVzOmZ1bmN0aW9uKCl7cmV0dXJue2Jhc2VBeGVzOlt0aGlzLmdldEF4aXMoKV19fSxjb250YWluUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSZWN0KCksaT10aGlzLmdldEF4aXMoKTtyZXR1cm4iaG9yaXpvbnRhbCI9PT1pLm9yaWVudD9pLmNvbnRhaW4oaS50b0xvY2FsQ29vcmQodFswXSkpJiZ0WzFdPj1lLnkmJnRbMV08PWUueStlLmhlaWdodDppLmNvbnRhaW4oaS50b0xvY2FsQ29vcmQodFsxXSkpJiZ0WzBdPj1lLnkmJnRbMF08PWUueStlLmhlaWdodH0scG9pbnRUb0RhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRBeGlzKCk7cmV0dXJuW2UuY29vcmRUb0RhdGEoZS50b0xvY2FsQ29vcmQodFsiaG9yaXpvbnRhbCI9PT1lLm9yaWVudD8wOjFdKSldfSxkYXRhVG9Qb2ludDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEF4aXMoKSxpPXRoaXMuZ2V0UmVjdCgpLG49W10sbz0iaG9yaXpvbnRhbCI9PT1lLm9yaWVudD8wOjE7cmV0dXJuIHQgaW5zdGFuY2VvZiBBcnJheSYmKHQ9dFswXSksbltvXT1lLnRvR2xvYmFsQ29vcmQoZS5kYXRhVG9Db29yZCgrdCkpLG5bMS1vXT0wPT1vP2kueStpLmhlaWdodC8yOmkueCtpLndpZHRoLzIsbn19KS5kaW1lbnNpb25zfSk7dmFyIEJNPVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSxWTT0ic3BsaXRMaW5lIixHTT1odi5leHRlbmQoe3R5cGU6InNpbmdsZUF4aXMiLGF4aXNQb2ludGVyQ2xhc3M6IlNpbmdsZUF4aXNQb2ludGVyIixyZW5kZXI6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dGhpcy5ncm91cDtvLnJlbW92ZUFsbCgpO3ZhciBhPVJNKHQpLHI9bmV3IFltKHQsYSk7RShCTSxyLmFkZCxyKSxvLmFkZChyLmdldEdyb3VwKCkpLHQuZ2V0KFZNKyIuc2hvdyIpJiZ0aGlzWyJfIitWTV0odCksR00uc3VwZXJDYWxsKHRoaXMsInJlbmRlciIsdCxlLGksbil9LF9zcGxpdExpbmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5heGlzO2lmKCFlLnNjYWxlLmlzQmxhbmsoKSl7dmFyIGk9dC5nZXRNb2RlbCgic3BsaXRMaW5lIiksbj1pLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxvPW4uZ2V0KCJ3aWR0aCIpLGE9bi5nZXQoImNvbG9yIik7YT1hIGluc3RhbmNlb2YgQXJyYXk/YTpbYV07Zm9yKHZhciByPXQuY29vcmRpbmF0ZVN5c3RlbS5nZXRSZWN0KCkscz1lLmlzSG9yaXpvbnRhbCgpLGw9W10sdT0wLGg9ZS5nZXRUaWNrc0Nvb3Jkcyh7dGlja01vZGVsOml9KSxjPVtdLGQ9W10sZj0wO2Y8aC5sZW5ndGg7KytmKXt2YXIgcD1lLnRvR2xvYmFsQ29vcmQoaFtmXS5jb29yZCk7cz8oY1swXT1wLGNbMV09ci55LGRbMF09cCxkWzFdPXIueStyLmhlaWdodCk6KGNbMF09ci54LGNbMV09cCxkWzBdPXIueCtyLndpZHRoLGRbMV09cCk7dmFyIGc9dSsrJWEubGVuZ3RoO2xbZ109bFtnXXx8W10sbFtnXS5wdXNoKG5ldyBvcyh7c3ViUGl4ZWxPcHRpbWl6ZTohMCxzaGFwZTp7eDE6Y1swXSx5MTpjWzFdLHgyOmRbMF0seTI6ZFsxXX0sc3R5bGU6e2xpbmVXaWR0aDpvfSxzaWxlbnQ6ITB9KSl9Zm9yKGY9MDtmPGwubGVuZ3RoOysrZil0aGlzLmdyb3VwLmFkZChrcyhsW2ZdLHtzdHlsZTp7c3Ryb2tlOmFbZiVhLmxlbmd0aF0sbGluZURhc2g6bi5nZXRMaW5lRGFzaChvKSxsaW5lV2lkdGg6b30sc2lsZW50OiEwfSkpfX19KSxGTT1UdS5leHRlbmQoe3R5cGU6InNpbmdsZUF4aXMiLGxheW91dE1vZGU6ImJveCIsYXhpczpudWxsLGNvb3JkaW5hdGVTeXN0ZW06bnVsbCxnZXRDb29yZFN5c01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSk7bShGTS5wcm90b3R5cGUsc2cpLE9tKCJzaW5nbGUiLEZNLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudHlwZXx8KGUuZGF0YT8iY2F0ZWdvcnkiOiJ2YWx1ZSIpfSx7bGVmdDoiNSUiLHRvcDoiNSUiLHJpZ2h0OiI1JSIsYm90dG9tOiI1JSIsdHlwZToidmFsdWUiLHBvc2l0aW9uOiJib3R0b20iLG9yaWVudDoiaG9yaXpvbnRhbCIsYXhpc0xpbmU6e3Nob3c6ITAsbGluZVN0eWxlOnt3aWR0aDoxLHR5cGU6InNvbGlkIn19LHRvb2x0aXA6e3Nob3c6ITB9LGF4aXNUaWNrOntzaG93OiEwLGxlbmd0aDo2LGxpbmVTdHlsZTp7d2lkdGg6MX19LGF4aXNMYWJlbDp7c2hvdzohMCxpbnRlcnZhbDoiYXV0byJ9LHNwbGl0TGluZTp7c2hvdzohMCxsaW5lU3R5bGU6e3R5cGU6ImRhc2hlZCIsb3BhY2l0eTouMn19fSk7ZnVuY3Rpb24gV00odCxlKXt2YXIgaSxuPVtdLG89dC5zZXJpZXNJbmRleDtpZihudWxsPT1vfHwhKGk9ZS5nZXRTZXJpZXNCeUluZGV4KG8pKSlyZXR1cm57cG9pbnQ6W119O3ZhciBhPWkuZ2V0RGF0YSgpLHI9SG8oYSx0KTtpZihudWxsPT1yfHxyPDB8fGsocikpcmV0dXJue3BvaW50OltdfTt2YXIgcz1hLmdldEl0ZW1HcmFwaGljRWwociksbD1pLmNvb3JkaW5hdGVTeXN0ZW07aWYoaS5nZXRUb29sdGlwUG9zaXRpb24pbj1pLmdldFRvb2x0aXBQb3NpdGlvbihyKXx8W107ZWxzZSBpZihsJiZsLmRhdGFUb1BvaW50KW49bC5kYXRhVG9Qb2ludChhLmdldFZhbHVlcyhOKGwuZGltZW5zaW9ucyxmdW5jdGlvbih0KXtyZXR1cm4gYS5tYXBEaW1lbnNpb24odCl9KSxyLCEwKSl8fFtdO2Vsc2UgaWYocyl7dmFyIHU9cy5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpO3UuYXBwbHlUcmFuc2Zvcm0ocy50cmFuc2Zvcm0pLG49W3UueCt1LndpZHRoLzIsdS55K3UuaGVpZ2h0LzJdfXJldHVybntwb2ludDpuLGVsOnN9fXZhciBITT1FLFpNPVQsVU09Wm8oKTtmdW5jdGlvbiBYTSh0LGUsaSxuLG8pe3ZhciBhPXQuYXhpcztpZighYS5zY2FsZS5pc0JsYW5rKCkmJmEuY29udGFpbkRhdGEoZSkpaWYodC5pbnZvbHZlU2VyaWVzKXt2YXIgcj1mdW5jdGlvbihsLHQpe3ZhciB1PXQuYXhpcyxoPXUuZGltLGM9bCxkPVtdLGY9TnVtYmVyLk1BWF9WQUxVRSxwPS0xO3JldHVybiBITSh0LnNlcmllc01vZGVscyxmdW5jdGlvbihlLHQpe3ZhciBpLG4sbz1lLmdldERhdGEoKS5tYXBEaW1lbnNpb24oaCwhMCk7aWYoZS5nZXRBeGlzVG9vbHRpcERhdGEpe3ZhciBhPWUuZ2V0QXhpc1Rvb2x0aXBEYXRhKG8sbCx1KTtuPWEuZGF0YUluZGljZXMsaT1hLm5lc3Rlc3RWYWx1ZX1lbHNle2lmKCEobj1lLmdldERhdGEoKS5pbmRpY2VzT2ZOZWFyZXN0KG9bMF0sbCwiY2F0ZWdvcnkiPT09dS50eXBlPy41Om51bGwpKS5sZW5ndGgpcmV0dXJuO2k9ZS5nZXREYXRhKCkuZ2V0KG9bMF0sblswXSl9aWYobnVsbCE9aSYmaXNGaW5pdGUoaSkpe3ZhciByPWwtaSxzPU1hdGguYWJzKHIpO3M8PWYmJigoczxmfHwwPD1yJiZwPDApJiYoZj1zLHA9cixjPWksZC5sZW5ndGg9MCksSE0obixmdW5jdGlvbih0KXtkLnB1c2goe3Nlcmllc0luZGV4OmUuc2VyaWVzSW5kZXgsZGF0YUluZGV4SW5zaWRlOnQsZGF0YUluZGV4OmUuZ2V0RGF0YSgpLmdldFJhd0luZGV4KHQpfSl9KSl9fSkse3BheWxvYWRCYXRjaDpkLHNuYXBUb1ZhbHVlOmN9fShlLHQpLHM9ci5wYXlsb2FkQmF0Y2gsbD1yLnNuYXBUb1ZhbHVlO3NbMF0mJm51bGw9PW8uc2VyaWVzSW5kZXgmJkwobyxzWzBdKSwhbiYmdC5zbmFwJiZhLmNvbnRhaW5EYXRhKGwpJiZudWxsIT1sJiYoZT1sKSxpLnNob3dQb2ludGVyKHQsZSxzLG8pLGkuc2hvd1Rvb2x0aXAodCxyLGwpfWVsc2UgaS5zaG93UG9pbnRlcih0LGUpfWZ1bmN0aW9uIFlNKHQsZSxpLG4pe3RbZS5rZXldPXt2YWx1ZTppLHBheWxvYWRCYXRjaDpufX1mdW5jdGlvbiBqTSh0LGUsaSxuKXt2YXIgbz1pLnBheWxvYWRCYXRjaCxhPWUuYXhpcyxyPWEubW9kZWwscz1lLmF4aXNQb2ludGVyTW9kZWw7aWYoZS50cmlnZ2VyVG9vbHRpcCYmby5sZW5ndGgpe3ZhciBsPWUuY29vcmRTeXMubW9kZWwsdT11dihsKSxoPXQubWFwW3VdO2h8fChoPXQubWFwW3VdPXtjb29yZFN5c0lkOmwuaWQsY29vcmRTeXNJbmRleDpsLmNvbXBvbmVudEluZGV4LGNvb3JkU3lzVHlwZTpsLnR5cGUsY29vcmRTeXNNYWluVHlwZTpsLm1haW5UeXBlLGRhdGFCeUF4aXM6W119LHQubGlzdC5wdXNoKGgpKSxoLmRhdGFCeUF4aXMucHVzaCh7YXhpc0RpbTphLmRpbSxheGlzSW5kZXg6ci5jb21wb25lbnRJbmRleCxheGlzVHlwZTpyLnR5cGUsYXhpc0lkOnIuaWQsdmFsdWU6bix2YWx1ZUxhYmVsT3B0OntwcmVjaXNpb246cy5nZXQoImxhYmVsLnByZWNpc2lvbiIpLGZvcm1hdHRlcjpzLmdldCgibGFiZWwuZm9ybWF0dGVyIil9LHNlcmllc0RhdGFJbmRpY2VzOm8uc2xpY2UoKX0pfX1mdW5jdGlvbiBxTSh0KXt2YXIgZT10LmF4aXMubW9kZWwsaT17fSxuPWkuYXhpc0RpbT10LmF4aXMuZGltO3JldHVybiBpLmF4aXNJbmRleD1pW24rIkF4aXNJbmRleCJdPWUuY29tcG9uZW50SW5kZXgsaS5heGlzTmFtZT1pW24rIkF4aXNOYW1lIl09ZS5uYW1lLGkuYXhpc0lkPWlbbisiQXhpc0lkIl09ZS5pZCxpfWZ1bmN0aW9uIEtNKHQpe3JldHVybiF0fHxudWxsPT10WzBdfHxpc05hTih0WzBdKXx8bnVsbD09dFsxXXx8aXNOYU4odFsxXSl9d2Yoe3R5cGU6ImF4aXNQb2ludGVyIixjb29yZFN5c0F4ZXNJbmZvOm51bGwsZGVmYXVsdE9wdGlvbjp7c2hvdzoiYXV0byIsdHJpZ2dlck9uOm51bGwsemxldmVsOjAsejo1MCx0eXBlOiJsaW5lIixzbmFwOiExLHRyaWdnZXJUb29sdGlwOiEwLHZhbHVlOm51bGwsc3RhdHVzOm51bGwsbGluazpbXSxhbmltYXRpb246bnVsbCxhbmltYXRpb25EdXJhdGlvblVwZGF0ZToyMDAsbGluZVN0eWxlOntjb2xvcjoiI2FhYSIsd2lkdGg6MSx0eXBlOiJzb2xpZCJ9LHNoYWRvd1N0eWxlOntjb2xvcjoicmdiYSgxNTAsMTUwLDE1MCwwLjMpIn0sbGFiZWw6e3Nob3c6ITAsZm9ybWF0dGVyOm51bGwscHJlY2lzaW9uOiJhdXRvIixtYXJnaW46Myxjb2xvcjoiI2ZmZiIscGFkZGluZzpbNSw3LDUsN10sYmFja2dyb3VuZENvbG9yOiJhdXRvIixib3JkZXJDb2xvcjpudWxsLGJvcmRlcldpZHRoOjAsc2hhZG93Qmx1cjozLHNoYWRvd0NvbG9yOiIjYWFhIn0saGFuZGxlOntzaG93OiExLGljb246Ik0xMC43LDExLjl2LTEuM0g5LjN2MS4zYy00LjksMC4zLTguOCw0LjQtOC44LDkuNGMwLDUsMy45LDkuMSw4LjgsOS40aDEuM2M0LjktMC4zLDguOC00LjQsOC44LTkuNEMxOS41LDE2LjMsMTUuNiwxMi4yLDEwLjcsMTEuOXogTTEzLjMsMjQuNEg2Ljd2LTEuMmg2LjZ6IE0xMy4zLDIySDYuN3YtMS4yaDYuNnogTTEzLjMsMTkuNkg2Ljd2LTEuMmg2LjZ6IixzaXplOjQ1LG1hcmdpbjo1MCxjb2xvcjoiIzMzMyIsc2hhZG93Qmx1cjozLHNoYWRvd0NvbG9yOiIjYWFhIixzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WToyLHRocm90dGxlOjQwfX19KTt2YXIgJE09Wm8oKSxKTT1FO2Z1bmN0aW9uIFFNKHQsZSxpKXtpZighdi5ub2RlKXt2YXIgbj1lLmdldFpyKCk7JE0obikucmVjb3Jkc3x8KCRNKG4pLnJlY29yZHM9e30pLGZ1bmN0aW9uKG8sYSl7aWYoJE0obykuaW5pdGlhbGl6ZWQpcmV0dXJuO2Z1bmN0aW9uIHQodCxuKXtvLm9uKHQsZnVuY3Rpb24oZSl7dmFyIGk9ZnVuY3Rpb24oaSl7dmFyIG49e3Nob3dUaXA6W10saGlkZVRpcDpbXX0sbz1mdW5jdGlvbih0KXt2YXIgZT1uW3QudHlwZV07ZT9lLnB1c2godCk6KHQuZGlzcGF0Y2hBY3Rpb249byxpLmRpc3BhdGNoQWN0aW9uKHQpKX07cmV0dXJue2Rpc3BhdGNoQWN0aW9uOm8scGVuZGluZ3M6bn19KGEpO0pNKCRNKG8pLnJlY29yZHMsZnVuY3Rpb24odCl7dCYmbih0LGUsaS5kaXNwYXRjaEFjdGlvbil9KSxmdW5jdGlvbih0LGUpe3ZhciBpLG49dC5zaG93VGlwLmxlbmd0aCxvPXQuaGlkZVRpcC5sZW5ndGg7bj9pPXQuc2hvd1RpcFtuLTFdOm8mJihpPXQuaGlkZVRpcFtvLTFdKTtpJiYoaS5kaXNwYXRjaEFjdGlvbj1udWxsLGUuZGlzcGF0Y2hBY3Rpb24oaSkpfShpLnBlbmRpbmdzLGEpfSl9JE0obykuaW5pdGlhbGl6ZWQ9ITAsdCgiY2xpY2siLFQoZUksImNsaWNrIikpLHQoIm1vdXNlbW92ZSIsVChlSSwibW91c2Vtb3ZlIikpLHQoImdsb2JhbG91dCIsdEkpfShuLGUpLCgkTShuKS5yZWNvcmRzW3RdfHwoJE0obikucmVjb3Jkc1t0XT17fSkpLmhhbmRsZXI9aX19ZnVuY3Rpb24gdEkodCxlLGkpe3QuaGFuZGxlcigibGVhdmUiLG51bGwsaSl9ZnVuY3Rpb24gZUkodCxlLGksbil7ZS5oYW5kbGVyKHQsaSxuKX1mdW5jdGlvbiBpSSh0LGUpe2lmKCF2Lm5vZGUpe3ZhciBpPWUuZ2V0WnIoKTsoJE0oaSkucmVjb3Jkc3x8e30pW3RdJiYoJE0oaSkucmVjb3Jkc1t0XT1udWxsKX19dmFyIG5JPWJmKHt0eXBlOiJheGlzUG9pbnRlciIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lLmdldENvbXBvbmVudCgidG9vbHRpcCIpLG89dC5nZXQoInRyaWdnZXJPbiIpfHxuJiZuLmdldCgidHJpZ2dlck9uIil8fCJtb3VzZW1vdmV8Y2xpY2siO1FNKCJheGlzUG9pbnRlciIsaSxmdW5jdGlvbih0LGUsaSl7Im5vbmUiIT09byYmKCJsZWF2ZSI9PT10fHwwPD1vLmluZGV4T2YodCkpJiZpKHt0eXBlOiJ1cGRhdGVBeGlzUG9pbnRlciIsY3VyclRyaWdnZXI6dCx4OmUmJmUub2Zmc2V0WCx5OmUmJmUub2Zmc2V0WX0pfSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe2lJKGUuZ2V0WnIoKSwiYXhpc1BvaW50ZXIiKSxuSS5zdXBlckFwcGx5KHRoaXMuX21vZGVsLCJyZW1vdmUiLGFyZ3VtZW50cyl9LGRpc3Bvc2U6ZnVuY3Rpb24odCxlKXtpSSgiYXhpc1BvaW50ZXIiLGUpLG5JLnN1cGVyQXBwbHkodGhpcy5fbW9kZWwsImRpc3Bvc2UiLGFyZ3VtZW50cyl9fSksb0k9Wm8oKSxhST1ELHJJPUE7ZnVuY3Rpb24gc0koKXt9ZnVuY3Rpb24gbEkodCxlLGksbil7IWZ1bmN0aW9uIGkobix0KXt7aWYoUihuKSYmUih0KSl7dmFyIG89ITA7cmV0dXJuIEUodCxmdW5jdGlvbih0LGUpe289byYmaShuW2VdLHQpfSksISFvfXJldHVybiBuPT09dH19KG9JKGkpLmxhc3RQcm9wLG4pJiYob0koaSkubGFzdFByb3A9bixlP3NsKGksbix0KTooaS5zdG9wQW5pbWF0aW9uKCksaS5hdHRyKG4pKSl9ZnVuY3Rpb24gdUkodCxlKXt0W2UuZ2V0KCJsYWJlbC5zaG93Iik/InNob3ciOiJoaWRlIl0oKX1mdW5jdGlvbiBoSSh0KXtyZXR1cm57cG9zaXRpb246dC5wb3NpdGlvbi5zbGljZSgpLHJvdGF0aW9uOnQucm90YXRpb258fDB9fWZ1bmN0aW9uIGNJKHQsZSxpKXt2YXIgbj1lLmdldCgieiIpLG89ZS5nZXQoInpsZXZlbCIpO3QmJnQudHJhdmVyc2UoZnVuY3Rpb24odCl7Imdyb3VwIiE9PXQudHlwZSYmKG51bGwhPW4mJih0Lno9biksbnVsbCE9byYmKHQuemxldmVsPW8pLHQuc2lsZW50PWkpfSl9ZnVuY3Rpb24gZEkodCl7dmFyIGUsaT10LmdldCgidHlwZSIpLG49dC5nZXRNb2RlbChpKyJTdHlsZSIpO3JldHVybiJsaW5lIj09PWk/KGU9bi5nZXRMaW5lU3R5bGUoKSkuZmlsbD1udWxsOiJzaGFkb3ciPT09aSYmKChlPW4uZ2V0QXJlYVN0eWxlKCkpLnN0cm9rZT1udWxsKSxlfWZ1bmN0aW9uIGZJKHQsZSxpLG4sbyl7dmFyIGE9cEkoaS5nZXQoInZhbHVlIiksZS5heGlzLGUuZWNNb2RlbCxpLmdldCgic2VyaWVzRGF0YUluZGljZXMiKSx7cHJlY2lzaW9uOmkuZ2V0KCJsYWJlbC5wcmVjaXNpb24iKSxmb3JtYXR0ZXI6aS5nZXQoImxhYmVsLmZvcm1hdHRlciIpfSkscj1pLmdldE1vZGVsKCJsYWJlbCIpLHM9Smwoci5nZXQoInBhZGRpbmciKXx8MCksbD1yLmdldEZvbnQoKSx1PWNuKGEsbCksaD1vLnBvc2l0aW9uLGM9dS53aWR0aCtzWzFdK3NbM10sZD11LmhlaWdodCtzWzBdK3NbMl0sZj1vLmFsaWduOyJyaWdodCI9PT1mJiYoaFswXS09YyksImNlbnRlciI9PT1mJiYoaFswXS09Yy8yKTt2YXIgcD1vLnZlcnRpY2FsQWxpZ247ImJvdHRvbSI9PT1wJiYoaFsxXS09ZCksIm1pZGRsZSI9PT1wJiYoaFsxXS09ZC8yKSxmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1uLmdldFdpZHRoKCksYT1uLmdldEhlaWdodCgpO3RbMF09TWF0aC5taW4odFswXStlLG8pLWUsdFsxXT1NYXRoLm1pbih0WzFdK2ksYSktaSx0WzBdPU1hdGgubWF4KHRbMF0sMCksdFsxXT1NYXRoLm1heCh0WzFdLDApfShoLGMsZCxuKTt2YXIgZz1yLmdldCgiYmFja2dyb3VuZENvbG9yIik7ZyYmImF1dG8iIT09Z3x8KGc9ZS5nZXQoImF4aXNMaW5lLmxpbmVTdHlsZS5jb2xvciIpKSx0LmxhYmVsPXtzaGFwZTp7eDowLHk6MCx3aWR0aDpjLGhlaWdodDpkLHI6ci5nZXQoImJvcmRlclJhZGl1cyIpfSxwb3NpdGlvbjpoLnNsaWNlKCksc3R5bGU6e3RleHQ6YSx0ZXh0Rm9udDpsLHRleHRGaWxsOnIuZ2V0VGV4dENvbG9yKCksdGV4dFBvc2l0aW9uOiJpbnNpZGUiLHRleHRQYWRkaW5nOnMsZmlsbDpnLHN0cm9rZTpyLmdldCgiYm9yZGVyQ29sb3IiKXx8InRyYW5zcGFyZW50IixsaW5lV2lkdGg6ci5nZXQoImJvcmRlcldpZHRoIil8fDAsc2hhZG93Qmx1cjpyLmdldCgic2hhZG93Qmx1ciIpLHNoYWRvd0NvbG9yOnIuZ2V0KCJzaGFkb3dDb2xvciIpLHNoYWRvd09mZnNldFg6ci5nZXQoInNoYWRvd09mZnNldFgiKSxzaGFkb3dPZmZzZXRZOnIuZ2V0KCJzaGFkb3dPZmZzZXRZIil9LHoyOjEwfX1mdW5jdGlvbiBwSSh0LGUsbyxpLG4pe3Q9ZS5zY2FsZS5wYXJzZSh0KTt2YXIgYT1lLnNjYWxlLmdldExhYmVsKHQse3ByZWNpc2lvbjpuLnByZWNpc2lvbn0pLHI9bi5mb3JtYXR0ZXI7aWYocil7dmFyIHM9e3ZhbHVlOm9nKGUsdCksYXhpc0RpbWVuc2lvbjplLmRpbSxheGlzSW5kZXg6ZS5pbmRleCxzZXJpZXNEYXRhOltdfTtFKGksZnVuY3Rpb24odCl7dmFyIGU9by5nZXRTZXJpZXNCeUluZGV4KHQuc2VyaWVzSW5kZXgpLGk9dC5kYXRhSW5kZXhJbnNpZGUsbj1lJiZlLmdldERhdGFQYXJhbXMoaSk7biYmcy5zZXJpZXNEYXRhLnB1c2gobil9KSx6KHIpP2E9ci5yZXBsYWNlKCJ7dmFsdWV9IixhKTpPKHIpJiYoYT1yKHMpKX1yZXR1cm4gYX1mdW5jdGlvbiBnSSh0LGUsaSl7dmFyIG49ZWUoKTtyZXR1cm4gcmUobixuLGkucm90YXRpb24pLGFlKG4sbixpLnBvc2l0aW9uKSxobChbdC5kYXRhVG9Db29yZChlKSwoaS5sYWJlbE9mZnNldHx8MCkrKGkubGFiZWxEaXJlY3Rpb258fDEpKihpLmxhYmVsTWFyZ2lufHwwKV0sbil9ZnVuY3Rpb24gbUkodCxlLGksbixvLGEpe3ZhciByPVltLmlubmVyVGV4dExheW91dChpLnJvdGF0aW9uLDAsaS5sYWJlbERpcmVjdGlvbik7aS5sYWJlbE1hcmdpbj1vLmdldCgibGFiZWwubWFyZ2luIiksZkkoZSxuLG8sYSx7cG9zaXRpb246Z0kobi5heGlzLHQsaSksYWxpZ246ci50ZXh0QWxpZ24sdmVydGljYWxBbGlnbjpyLnRleHRWZXJ0aWNhbEFsaWdufSl9ZnVuY3Rpb24gdkkodCxlLGkpe3JldHVybnt4MTp0W2k9aXx8MF0seTE6dFsxLWldLHgyOmVbaV0seTI6ZVsxLWldfX1mdW5jdGlvbiB5SSh0LGUsaSl7cmV0dXJue3g6dFtpPWl8fDBdLHk6dFsxLWldLHdpZHRoOmVbaV0saGVpZ2h0OmVbMS1pXX19ZnVuY3Rpb24geEkodCxlLGksbixvLGEpe3JldHVybntjeDp0LGN5OmUscjA6aSxyOm4sc3RhcnRBbmdsZTpvLGVuZEFuZ2xlOmEsY2xvY2t3aXNlOiEwfX10YSgoc0kucHJvdG90eXBlPXtfZ3JvdXA6bnVsbCxfbGFzdEdyYXBoaWNLZXk6bnVsbCxfaGFuZGxlOm51bGwsX2RyYWdnaW5nOiExLF9sYXN0VmFsdWU6bnVsbCxfbGFzdFN0YXR1czpudWxsLF9wYXlsb2FkSW5mbzpudWxsLGFuaW1hdGlvblRocmVzaG9sZDoxNSxyZW5kZXI6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89ZS5nZXQoInZhbHVlIiksYT1lLmdldCgic3RhdHVzIik7aWYodGhpcy5fYXhpc01vZGVsPXQsdGhpcy5fYXhpc1BvaW50ZXJNb2RlbD1lLHRoaXMuX2FwaT1pLG58fHRoaXMuX2xhc3RWYWx1ZSE9PW98fHRoaXMuX2xhc3RTdGF0dXMhPT1hKXt0aGlzLl9sYXN0VmFsdWU9byx0aGlzLl9sYXN0U3RhdHVzPWE7dmFyIHI9dGhpcy5fZ3JvdXAscz10aGlzLl9oYW5kbGU7aWYoIWF8fCJoaWRlIj09PWEpcmV0dXJuIHImJnIuaGlkZSgpLHZvaWQocyYmcy5oaWRlKCkpO3ImJnIuc2hvdygpLHMmJnMuc2hvdygpO3ZhciBsPXt9O3RoaXMubWFrZUVsT3B0aW9uKGwsbyx0LGUsaSk7dmFyIHU9bC5ncmFwaGljS2V5O3UhPT10aGlzLl9sYXN0R3JhcGhpY0tleSYmdGhpcy5jbGVhcihpKSx0aGlzLl9sYXN0R3JhcGhpY0tleT11O3ZhciBoPXRoaXMuX21vdmVBbmltYXRpb249dGhpcy5kZXRlcm1pbmVBbmltYXRpb24odCxlKTtpZihyKXt2YXIgYz1UKGxJLGUsaCk7dGhpcy51cGRhdGVQb2ludGVyRWwocixsLGMsZSksdGhpcy51cGRhdGVMYWJlbEVsKHIsbCxjLGUpfWVsc2Ugcj10aGlzLl9ncm91cD1uZXcgSWksdGhpcy5jcmVhdGVQb2ludGVyRWwocixsLHQsZSksdGhpcy5jcmVhdGVMYWJlbEVsKHIsbCx0LGUpLGkuZ2V0WnIoKS5hZGQocik7Y0kocixlLCEwKSx0aGlzLl9yZW5kZXJIYW5kbGUobyl9fSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5jbGVhcih0KX0sZGlzcG9zZTpmdW5jdGlvbih0KXt0aGlzLmNsZWFyKHQpfSxkZXRlcm1pbmVBbmltYXRpb246ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldCgiYW5pbWF0aW9uIiksbj10LmF4aXMsbz0iY2F0ZWdvcnkiPT09bi50eXBlLGE9ZS5nZXQoInNuYXAiKTtpZighYSYmIW8pcmV0dXJuITE7aWYoImF1dG8iIT09aSYmbnVsbCE9aSlyZXR1cm4hMD09PWk7dmFyIHI9dGhpcy5hbmltYXRpb25UaHJlc2hvbGQ7aWYobyYmbi5nZXRCYW5kV2lkdGgoKT5yKXJldHVybiEwO2lmKGEpe3ZhciBzPXN2KHQpLnNlcmllc0RhdGFDb3VudCxsPW4uZ2V0RXh0ZW50KCk7cmV0dXJuIE1hdGguYWJzKGxbMF0tbFsxXSkvcz5yfXJldHVybiExfSxtYWtlRWxPcHRpb246ZnVuY3Rpb24odCxlLGksbixvKXt9LGNyZWF0ZVBvaW50ZXJFbDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1lLnBvaW50ZXI7aWYobyl7dmFyIGE9b0kodCkucG9pbnRlckVsPW5ldyB5bFtvLnR5cGVdKGFJKGUucG9pbnRlcikpO3QuYWRkKGEpfX0sY3JlYXRlTGFiZWxFbDpmdW5jdGlvbih0LGUsaSxuKXtpZihlLmxhYmVsKXt2YXIgbz1vSSh0KS5sYWJlbEVsPW5ldyBpcyhhSShlLmxhYmVsKSk7dC5hZGQobyksdUkobyxuKX19LHVwZGF0ZVBvaW50ZXJFbDpmdW5jdGlvbih0LGUsaSl7dmFyIG49b0kodCkucG9pbnRlckVsO24mJmUucG9pbnRlciYmKG4uc2V0U3R5bGUoZS5wb2ludGVyLnN0eWxlKSxpKG4se3NoYXBlOmUucG9pbnRlci5zaGFwZX0pKX0sdXBkYXRlTGFiZWxFbDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1vSSh0KS5sYWJlbEVsO28mJihvLnNldFN0eWxlKGUubGFiZWwuc3R5bGUpLGkobyx7c2hhcGU6ZS5sYWJlbC5zaGFwZSxwb3NpdGlvbjplLmxhYmVsLnBvc2l0aW9ufSksdUkobyxuKSl9LF9yZW5kZXJIYW5kbGU6ZnVuY3Rpb24odCl7aWYoIXRoaXMuX2RyYWdnaW5nJiZ0aGlzLnVwZGF0ZUhhbmRsZVRyYW5zZm9ybSl7dmFyIGUsaT10aGlzLl9heGlzUG9pbnRlck1vZGVsLG49dGhpcy5fYXBpLmdldFpyKCksbz10aGlzLl9oYW5kbGUsYT1pLmdldE1vZGVsKCJoYW5kbGUiKSxyPWkuZ2V0KCJzdGF0dXMiKTtpZighYS5nZXQoInNob3ciKXx8IXJ8fCJoaWRlIj09PXIpcmV0dXJuIG8mJm4ucmVtb3ZlKG8pLHZvaWQodGhpcy5faGFuZGxlPW51bGwpO3RoaXMuX2hhbmRsZXx8KGU9ITAsbz10aGlzLl9oYW5kbGU9cGwoYS5nZXQoImljb24iKSx7Y3Vyc29yOiJtb3ZlIixkcmFnZ2FibGU6ITAsb25tb3VzZW1vdmU6ZnVuY3Rpb24odCl7V3QodC5ldmVudCl9LG9ubW91c2Vkb3duOnJJKHRoaXMuX29uSGFuZGxlRHJhZ01vdmUsdGhpcywwLDApLGRyaWZ0OnJJKHRoaXMuX29uSGFuZGxlRHJhZ01vdmUsdGhpcyksb25kcmFnZW5kOnJJKHRoaXMuX29uSGFuZGxlRHJhZ0VuZCx0aGlzKX0pLG4uYWRkKG8pKSxjSShvLGksITEpO28uc2V0U3R5bGUoYS5nZXRJdGVtU3R5bGUobnVsbCxbImNvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsIm9wYWNpdHkiLCJzaGFkb3dDb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dPZmZzZXRYIiwic2hhZG93T2Zmc2V0WSJdKSk7dmFyIHM9YS5nZXQoInNpemUiKTtrKHMpfHwocz1bcyxzXSksby5hdHRyKCJzY2FsZSIsW3NbMF0vMixzWzFdLzJdKSxUYyh0aGlzLCJfZG9EaXNwYXRjaEF4aXNQb2ludGVyIixhLmdldCgidGhyb3R0bGUiKXx8MCwiZml4UmF0ZSIpLHRoaXMuX21vdmVIYW5kbGVUb1ZhbHVlKHQsZSl9fSxfbW92ZUhhbmRsZVRvVmFsdWU6ZnVuY3Rpb24odCxlKXtsSSh0aGlzLl9heGlzUG9pbnRlck1vZGVsLCFlJiZ0aGlzLl9tb3ZlQW5pbWF0aW9uLHRoaXMuX2hhbmRsZSxoSSh0aGlzLmdldEhhbmRsZVRyYW5zZm9ybSh0LHRoaXMuX2F4aXNNb2RlbCx0aGlzLl9heGlzUG9pbnRlck1vZGVsKSkpfSxfb25IYW5kbGVEcmFnTW92ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2hhbmRsZTtpZihpKXt0aGlzLl9kcmFnZ2luZz0hMDt2YXIgbj10aGlzLnVwZGF0ZUhhbmRsZVRyYW5zZm9ybShoSShpKSxbdCxlXSx0aGlzLl9heGlzTW9kZWwsdGhpcy5fYXhpc1BvaW50ZXJNb2RlbCk7dGhpcy5fcGF5bG9hZEluZm89bixpLnN0b3BBbmltYXRpb24oKSxpLmF0dHIoaEkobikpLG9JKGkpLmxhc3RQcm9wPW51bGwsdGhpcy5fZG9EaXNwYXRjaEF4aXNQb2ludGVyKCl9fSxfZG9EaXNwYXRjaEF4aXNQb2ludGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5faGFuZGxlKXt2YXIgdD10aGlzLl9wYXlsb2FkSW5mbyxlPXRoaXMuX2F4aXNNb2RlbDt0aGlzLl9hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InVwZGF0ZUF4aXNQb2ludGVyIix4OnQuY3Vyc29yUG9pbnRbMF0seTp0LmN1cnNvclBvaW50WzFdLHRvb2x0aXBPcHRpb246dC50b29sdGlwT3B0aW9uLGF4ZXNJbmZvOlt7YXhpc0RpbTplLmF4aXMuZGltLGF4aXNJbmRleDplLmNvbXBvbmVudEluZGV4fV19KX19LF9vbkhhbmRsZURyYWdFbmQ6ZnVuY3Rpb24odCl7aWYodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5faGFuZGxlKXt2YXIgZT10aGlzLl9heGlzUG9pbnRlck1vZGVsLmdldCgidmFsdWUiKTt0aGlzLl9tb3ZlSGFuZGxlVG9WYWx1ZShlKSx0aGlzLl9hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImhpZGVUaXAifSl9fSxnZXRIYW5kbGVUcmFuc2Zvcm06bnVsbCx1cGRhdGVIYW5kbGVUcmFuc2Zvcm06bnVsbCxjbGVhcjpmdW5jdGlvbih0KXt0aGlzLl9sYXN0VmFsdWU9bnVsbCx0aGlzLl9sYXN0U3RhdHVzPW51bGw7dmFyIGU9dC5nZXRacigpLGk9dGhpcy5fZ3JvdXAsbj10aGlzLl9oYW5kbGU7ZSYmaSYmKHRoaXMuX2xhc3RHcmFwaGljS2V5PW51bGwsaSYmZS5yZW1vdmUoaSksbiYmZS5yZW1vdmUobiksdGhpcy5fZ3JvdXA9bnVsbCx0aGlzLl9oYW5kbGU9bnVsbCx0aGlzLl9wYXlsb2FkSW5mbz1udWxsKX0sZG9DbGVhcjpmdW5jdGlvbigpe30sYnVpbGRMYWJlbDpmdW5jdGlvbih0LGUsaSl7cmV0dXJue3g6dFtpPWl8fDBdLHk6dFsxLWldLHdpZHRoOmVbaV0saGVpZ2h0OmVbMS1pXX19fSkuY29uc3RydWN0b3I9c0kpO3ZhciBfST1zSS5leHRlbmQoe21ha2VFbE9wdGlvbjpmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhPWkuYXhpcyxyPWEuZ3JpZCxzPW4uZ2V0KCJ0eXBlIiksbD13SShyLGEpLmdldE90aGVyQXhpcyhhKS5nZXRHbG9iYWxFeHRlbnQoKSx1PWEudG9HbG9iYWxDb29yZChhLmRhdGFUb0Nvb3JkKGUsITApKTtpZihzJiYibm9uZSIhPT1zKXt2YXIgaD1kSShuKSxjPWJJW3NdKGEsdSxsKTtjLnN0eWxlPWgsdC5ncmFwaGljS2V5PWMudHlwZSx0LnBvaW50ZXI9Y31tSShlLHQscHYoci5tb2RlbCxpKSxpLG4sbyl9LGdldEhhbmRsZVRyYW5zZm9ybTpmdW5jdGlvbih0LGUsaSl7dmFyIG49cHYoZS5heGlzLmdyaWQubW9kZWwsZSx7bGFiZWxJbnNpZGU6ITF9KTtyZXR1cm4gbi5sYWJlbE1hcmdpbj1pLmdldCgiaGFuZGxlLm1hcmdpbiIpLHtwb3NpdGlvbjpnSShlLmF4aXMsdCxuKSxyb3RhdGlvbjpuLnJvdGF0aW9uKyhuLmxhYmVsRGlyZWN0aW9uPDA/TWF0aC5QSTowKX19LHVwZGF0ZUhhbmRsZVRyYW5zZm9ybTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1pLmF4aXMsYT1vLmdyaWQscj1vLmdldEdsb2JhbEV4dGVudCghMCkscz13SShhLG8pLmdldE90aGVyQXhpcyhvKS5nZXRHbG9iYWxFeHRlbnQoKSxsPSJ4Ij09PW8uZGltPzA6MSx1PXQucG9zaXRpb247dVtsXSs9ZVtsXSx1W2xdPU1hdGgubWluKHJbMV0sdVtsXSksdVtsXT1NYXRoLm1heChyWzBdLHVbbF0pO3ZhciBoPShzWzFdK3NbMF0pLzIsYz1baCxoXTtjW2xdPXVbbF07cmV0dXJue3Bvc2l0aW9uOnUscm90YXRpb246dC5yb3RhdGlvbixjdXJzb3JQb2ludDpjLHRvb2x0aXBPcHRpb246W3t2ZXJ0aWNhbEFsaWduOiJtaWRkbGUifSx7YWxpZ246ImNlbnRlciJ9XVtsXX19fSk7ZnVuY3Rpb24gd0kodCxlKXt2YXIgaT17fTtyZXR1cm4gaVtlLmRpbSsiQXhpc0luZGV4Il09ZS5pbmRleCx0LmdldENhcnRlc2lhbihpKX12YXIgYkk9e2xpbmU6ZnVuY3Rpb24odCxlLGkpe3JldHVybnt0eXBlOiJMaW5lIixzdWJQaXhlbE9wdGltaXplOiEwLHNoYXBlOnZJKFtlLGlbMF1dLFtlLGlbMV1dLFNJKHQpKX19LHNoYWRvdzpmdW5jdGlvbih0LGUsaSl7dmFyIG49TWF0aC5tYXgoMSx0LmdldEJhbmRXaWR0aCgpKSxvPWlbMV0taVswXTtyZXR1cm57dHlwZToiUmVjdCIsc2hhcGU6eUkoW2Utbi8yLGlbMF1dLFtuLG9dLFNJKHQpKX19fTtmdW5jdGlvbiBTSSh0KXtyZXR1cm4ieCI9PT10LmRpbT8wOjF9aHYucmVnaXN0ZXJBeGlzUG9pbnRlckNsYXNzKCJDYXJ0ZXNpYW5BeGlzUG9pbnRlciIsX0kpLGZmKGZ1bmN0aW9uKHQpe2lmKHQpe3QuYXhpc1BvaW50ZXImJjAhPT10LmF4aXNQb2ludGVyLmxlbmd0aHx8KHQuYXhpc1BvaW50ZXI9e30pO3ZhciBlPXQuYXhpc1BvaW50ZXIubGluaztlJiYhayhlKSYmKHQuYXhpc1BvaW50ZXIubGluaz1bZV0pfX0pLHBmKElkLlBST0NFU1NPUi5TVEFUSVNUSUMsZnVuY3Rpb24odCxlKXt0LmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKS5jb29yZFN5c0F4ZXNJbmZvPWF2KHQsZSl9KSxnZih7dHlwZToidXBkYXRlQXhpc1BvaW50ZXIiLGV2ZW50OiJ1cGRhdGVBeGlzUG9pbnRlciIsdXBkYXRlOiI6dXBkYXRlQXhpc1BvaW50ZXIifSxmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5jdXJyVHJpZ2dlcixyPVt0LngsdC55XSxvPXQsYT10LmRpc3BhdGNoQWN0aW9ufHxBKGkuZGlzcGF0Y2hBY3Rpb24saSkscz1lLmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKS5jb29yZFN5c0F4ZXNJbmZvO2lmKHMpe0tNKHIpJiYocj1XTSh7c2VyaWVzSW5kZXg6by5zZXJpZXNJbmRleCxkYXRhSW5kZXg6by5kYXRhSW5kZXh9LGUpLnBvaW50KTt2YXIgbD1LTShyKSx1PW8uYXhlc0luZm8saD1zLmF4ZXNJbmZvLGM9ImxlYXZlIj09PW58fEtNKHIpLGQ9e30sZj17fSxwPXtsaXN0OltdLG1hcDp7fX0sZz17c2hvd1BvaW50ZXI6Wk0oWU0sZiksc2hvd1Rvb2x0aXA6Wk0oak0scCl9O0hNKHMuY29vcmRTeXNNYXAsZnVuY3Rpb24odCxlKXt2YXIgYT1sfHx0LmNvbnRhaW5Qb2ludChyKTtITShzLmNvb3JkU3lzQXhlc0luZm9bZV0sZnVuY3Rpb24odCxlKXt2YXIgaT10LmF4aXMsbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8KHR8fFtdKS5sZW5ndGg7aSsrKXt2YXIgbj10W2ldO2lmKGUuYXhpcy5kaW09PT1uLmF4aXNEaW0mJmUuYXhpcy5tb2RlbC5jb21wb25lbnRJbmRleD09PW4uYXhpc0luZGV4KXJldHVybiBufX0odSx0KTtpZighYyYmYSYmKCF1fHxuKSl7dmFyIG89biYmbi52YWx1ZTtudWxsIT1vfHxsfHwobz1pLnBvaW50VG9EYXRhKHIpKSxudWxsIT1vJiZYTSh0LG8sZywhMSxkKX19KX0pO3ZhciBtPXt9O3JldHVybiBITShoLGZ1bmN0aW9uKG8sdCl7dmFyIGE9by5saW5rR3JvdXA7YSYmIWZbdF0mJkhNKGEuYXhlc0luZm8sZnVuY3Rpb24odCxlKXt2YXIgaT1mW2VdO2lmKHQhPT1vJiZpKXt2YXIgbj1pLnZhbHVlO2EubWFwcGVyJiYobj1vLmF4aXMuc2NhbGUucGFyc2UoYS5tYXBwZXIobixxTSh0KSxxTShvKSkpKSxtW28ua2V5XT1ufX0pfSksSE0obSxmdW5jdGlvbih0LGUpe1hNKGhbZV0sdCxnLCEwLGQpfSksZnVuY3Rpb24obyx0LGUpe3ZhciBhPWUuYXhlc0luZm89W107SE0odCxmdW5jdGlvbih0LGUpe3ZhciBpPXQuYXhpc1BvaW50ZXJNb2RlbC5vcHRpb24sbj1vW2VdO24/KHQudXNlSGFuZGxlfHwoaS5zdGF0dXM9InNob3ciKSxpLnZhbHVlPW4udmFsdWUsaS5zZXJpZXNEYXRhSW5kaWNlcz0obi5wYXlsb2FkQmF0Y2h8fFtdKS5zbGljZSgpKTp0LnVzZUhhbmRsZXx8KGkuc3RhdHVzPSJoaWRlIiksInNob3ciPT09aS5zdGF0dXMmJmEucHVzaCh7YXhpc0RpbTp0LmF4aXMuZGltLGF4aXNJbmRleDp0LmF4aXMubW9kZWwuY29tcG9uZW50SW5kZXgsdmFsdWU6aS52YWx1ZX0pfSl9KGYsaCxkKSxmdW5jdGlvbih0LGUsaSxuKXtpZihLTShlKXx8IXQubGlzdC5sZW5ndGgpcmV0dXJuIG4oe3R5cGU6ImhpZGVUaXAifSk7dmFyIG89KCh0Lmxpc3RbMF0uZGF0YUJ5QXhpc1swXXx8e30pLnNlcmllc0RhdGFJbmRpY2VzfHxbXSlbMF18fHt9O24oe3R5cGU6InNob3dUaXAiLGVzY2FwZUNvbm5lY3Q6ITAseDplWzBdLHk6ZVsxXSx0b29sdGlwT3B0aW9uOmkudG9vbHRpcE9wdGlvbixwb3NpdGlvbjppLnBvc2l0aW9uLGRhdGFJbmRleEluc2lkZTpvLmRhdGFJbmRleEluc2lkZSxkYXRhSW5kZXg6by5kYXRhSW5kZXgsc2VyaWVzSW5kZXg6by5zZXJpZXNJbmRleCxkYXRhQnlDb29yZFN5czp0Lmxpc3R9KX0ocCxyLHQsYSksZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkuZ2V0WnIoKSxvPSJheGlzUG9pbnRlckxhc3RIaWdobGlnaHRzIixhPVVNKG4pW29dfHx7fSxyPVVNKG4pW29dPXt9O0hNKHQsZnVuY3Rpb24odCxlKXt2YXIgaT10LmF4aXNQb2ludGVyTW9kZWwub3B0aW9uOyJzaG93Ij09PWkuc3RhdHVzJiZITShpLnNlcmllc0RhdGFJbmRpY2VzLGZ1bmN0aW9uKHQpe3ZhciBlPXQuc2VyaWVzSW5kZXgrIiB8ICIrdC5kYXRhSW5kZXg7cltlXT10fSl9KTt2YXIgcz1bXSxsPVtdO0UoYSxmdW5jdGlvbih0LGUpe3JbZV18fGwucHVzaCh0KX0pLEUocixmdW5jdGlvbih0LGUpe2FbZV18fHMucHVzaCh0KX0pLGwubGVuZ3RoJiZpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJkb3ducGxheSIsZXNjYXBlQ29ubmVjdDohMCxiYXRjaDpsfSkscy5sZW5ndGgmJmkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImhpZ2hsaWdodCIsZXNjYXBlQ29ubmVjdDohMCxiYXRjaDpzfSl9KGgsMCxpKSxkfX0pO3ZhciBNST1bIngiLCJ5Il0sSUk9WyJ3aWR0aCIsImhlaWdodCJdLFRJPXNJLmV4dGVuZCh7bWFrZUVsT3B0aW9uOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9aS5heGlzLHI9YS5jb29yZGluYXRlU3lzdGVtLHM9Q0kociwxLURJKGEpKSxsPXIuZGF0YVRvUG9pbnQoZSlbMF0sdT1uLmdldCgidHlwZSIpO2lmKHUmJiJub25lIiE9PXUpe3ZhciBoPWRJKG4pLGM9QUlbdV0oYSxsLHMpO2Muc3R5bGU9aCx0LmdyYXBoaWNLZXk9Yy50eXBlLHQucG9pbnRlcj1jfW1JKGUsdCxSTShpKSxpLG4sbyl9LGdldEhhbmRsZVRyYW5zZm9ybTpmdW5jdGlvbih0LGUsaSl7dmFyIG49Uk0oZSx7bGFiZWxJbnNpZGU6ITF9KTtyZXR1cm4gbi5sYWJlbE1hcmdpbj1pLmdldCgiaGFuZGxlLm1hcmdpbiIpLHtwb3NpdGlvbjpnSShlLmF4aXMsdCxuKSxyb3RhdGlvbjpuLnJvdGF0aW9uKyhuLmxhYmVsRGlyZWN0aW9uPDA/TWF0aC5QSTowKX19LHVwZGF0ZUhhbmRsZVRyYW5zZm9ybTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1pLmF4aXMsYT1vLmNvb3JkaW5hdGVTeXN0ZW0scj1ESShvKSxzPUNJKGEsciksbD10LnBvc2l0aW9uO2xbcl0rPWVbcl0sbFtyXT1NYXRoLm1pbihzWzFdLGxbcl0pLGxbcl09TWF0aC5tYXgoc1swXSxsW3JdKTt2YXIgdT1DSShhLDEtciksaD0odVsxXSt1WzBdKS8yLGM9W2gsaF07cmV0dXJuIGNbcl09bFtyXSx7cG9zaXRpb246bCxyb3RhdGlvbjp0LnJvdGF0aW9uLGN1cnNvclBvaW50OmMsdG9vbHRpcE9wdGlvbjp7dmVydGljYWxBbGlnbjoibWlkZGxlIn19fX0pLEFJPXtsaW5lOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm57dHlwZToiTGluZSIsc3ViUGl4ZWxPcHRpbWl6ZTohMCxzaGFwZTp2SShbZSxpWzBdXSxbZSxpWzFdXSxESSh0KSl9fSxzaGFkb3c6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0QmFuZFdpZHRoKCksbz1pWzFdLWlbMF07cmV0dXJue3R5cGU6IlJlY3QiLHNoYXBlOnlJKFtlLW4vMixpWzBdXSxbbixvXSxESSh0KSl9fX07ZnVuY3Rpb24gREkodCl7cmV0dXJuIHQuaXNIb3Jpem9udGFsKCk/MDoxfWZ1bmN0aW9uIENJKHQsZSl7dmFyIGk9dC5nZXRSZWN0KCk7cmV0dXJuW2lbTUlbZV1dLGlbTUlbZV1dK2lbSUlbZV1dXX1odi5yZWdpc3RlckF4aXNQb2ludGVyQ2xhc3MoIlNpbmdsZUF4aXNQb2ludGVyIixUSSksYmYoe3R5cGU6InNpbmdsZSJ9KTt2YXIgTEk9aWMuZXh0ZW5kKHt0eXBlOiJzZXJpZXMudGhlbWVSaXZlciIsZGVwZW5kZW5jaWVzOlsic2luZ2xlQXhpcyJdLG5hbWVNYXA6bnVsbCxpbml0OmZ1bmN0aW9uKHQpe0xJLnN1cGVyQXBwbHkodGhpcywiaW5pdCIsYXJndW1lbnRzKSx0aGlzLmxlZ2VuZFZpc3VhbFByb3ZpZGVyPW5ldyBHdihBKHRoaXMuZ2V0RGF0YSx0aGlzKSxBKHRoaXMuZ2V0UmF3RGF0YSx0aGlzKSl9LGZpeERhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgsaT1Lbyh0LGZ1bmN0aW9uKHQpe3JldHVybiB0WzJdfSksbj1bXTtpLmJ1Y2tldHMuZWFjaChmdW5jdGlvbih0LGUpe24ucHVzaCh7bmFtZTplLGRhdGFMaXN0OnR9KX0pO2Zvcih2YXIgbz1uLmxlbmd0aCxhPS0xLHI9LTEscz0wO3M8bzsrK3Mpe3ZhciBsPW5bc10uZGF0YUxpc3QubGVuZ3RoO2E8bCYmKGE9bCxyPXMpfWZvcih2YXIgdT0wO3U8bzsrK3UpaWYodSE9PXIpZm9yKHZhciBoPW5bdV0ubmFtZSxjPTA7YzxhOysrYyl7Zm9yKHZhciBkPW5bcl0uZGF0YUxpc3RbY11bMF0sZj1uW3VdLmRhdGFMaXN0Lmxlbmd0aCxwPS0xLGc9MDtnPGY7KytnKXtpZihuW3VdLmRhdGFMaXN0W2ddWzBdPT09ZCl7cD1nO2JyZWFrfX0tMT09PXAmJih0W2VdPVtdLHRbZV1bMF09ZCx0W2VdWzFdPTAsdFtlXVsyXT1oLGUrKyl9cmV0dXJuIHR9LGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUucXVlcnlDb21wb25lbnRzKHttYWluVHlwZToic2luZ2xlQXhpcyIsaW5kZXg6dGhpcy5nZXQoInNpbmdsZUF4aXNJbmRleCIpLGlkOnRoaXMuZ2V0KCJzaW5nbGVBeGlzSWQiKX0pWzBdLmdldCgidHlwZSIpLG49TSh0LmRhdGEsZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRbMl19KSxvPXRoaXMuZml4RGF0YShufHxbXSksYT1bXSxyPXRoaXMubmFtZU1hcD1RKCkscz0wLGw9MDtsPG8ubGVuZ3RoOysrbClhLnB1c2gob1tsXVsyXSksci5nZXQob1tsXVsyXSl8fChyLnNldChvW2xdWzJdLHMpLHMrKyk7dmFyIHU9bnAobyx7Y29vcmREaW1lbnNpb25zOlsic2luZ2xlIl0sZGltZW5zaW9uc0RlZmluZTpbe25hbWU6InRpbWUiLHR5cGU6TGYoaSl9LHtuYW1lOiJ2YWx1ZSIsdHlwZToiZmxvYXQifSx7bmFtZToibmFtZSIsdHlwZToib3JkaW5hbCJ9XSxlbmNvZGVEZWZpbmU6e3NpbmdsZTowLHZhbHVlOjEsaXRlbU5hbWU6Mn19KSxoPW5ldyBXZih1LHRoaXMpO3JldHVybiBoLmluaXREYXRhKG8pLGh9LGdldExheWVyU2VyaWVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBpPXRoaXMuZ2V0RGF0YSgpLHQ9aS5jb3VudCgpLGU9W10sbj0wO248dDsrK24pZVtuXT1uO3ZhciBvPWkubWFwRGltZW5zaW9uKCJzaW5nbGUiKSxhPUtvKGUsZnVuY3Rpb24odCl7cmV0dXJuIGkuZ2V0KCJuYW1lIix0KX0pLHI9W107cmV0dXJuIGEuYnVja2V0cy5lYWNoKGZ1bmN0aW9uKHQsZSl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuZ2V0KG8sdCktaS5nZXQobyxlKX0pLHIucHVzaCh7bmFtZTplLGluZGljZXM6dH0pfSkscn0sZ2V0QXhpc1Rvb2x0aXBEYXRhOmZ1bmN0aW9uKHQsZSxpKXtrKHQpfHwodD10P1t0XTpbXSk7Zm9yKHZhciBuLG89dGhpcy5nZXREYXRhKCksYT10aGlzLmdldExheWVyU2VyaWVzKCkscj1bXSxzPWEubGVuZ3RoLGw9MDtsPHM7KytsKXtmb3IodmFyIHU9TnVtYmVyLk1BWF9WQUxVRSxoPS0xLGM9YVtsXS5pbmRpY2VzLmxlbmd0aCxkPTA7ZDxjOysrZCl7dmFyIGY9by5nZXQodFswXSxhW2xdLmluZGljZXNbZF0pLHA9TWF0aC5hYnMoZi1lKTtwPD11JiYobj1mLHU9cCxoPWFbbF0uaW5kaWNlc1tkXSl9ci5wdXNoKGgpfXJldHVybntkYXRhSW5kaWNlczpyLG5lc3Rlc3RWYWx1ZTpufX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKSxpPWUuZ2V0TmFtZSh0KSxuPWUuZ2V0KGUubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLHQpO3JldHVybiFpc05hTihuKSYmbnVsbCE9bnx8KG49Ii0iKSxldShpKyIgOiAiK24pfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToic2luZ2xlQXhpcyIsYm91bmRhcnlHYXA6WyIxMCUiLCIxMCUiXSxzaW5nbGVBeGlzSW5kZXg6MCxhbmltYXRpb25FYXNpbmc6ImxpbmVhciIsbGFiZWw6e21hcmdpbjo0LHNob3c6ITAscG9zaXRpb246ImxlZnQiLGNvbG9yOiIjMDAwIixmb250U2l6ZToxMX0sZW1waGFzaXM6e2xhYmVsOntzaG93OiEwfX19fSk7TWYoe3R5cGU6InRoZW1lUml2ZXIiLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9sYXllcnM9W119LHJlbmRlcjpmdW5jdGlvbihiLHQsZSl7dmFyIFM9Yi5nZXREYXRhKCksTT10aGlzLmdyb3VwLEk9Yi5nZXRMYXllclNlcmllcygpLGk9Uy5nZXRMYXlvdXQoImxheW91dEluZm8iKSxuPWkucmVjdCxvPWkuYm91bmRhcnlHYXA7ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdC5uYW1lfU0uYXR0cigicG9zaXRpb24iLFswLG4ueStvWzBdXSk7dmFyIHI9bmV3IFRmKHRoaXMuX2xheWVyc1Nlcmllc3x8W10sSSxhLGEpLFQ9e307ZnVuY3Rpb24gcyh0LGUsaSl7dmFyIG49dGhpcy5fbGF5ZXJzO2lmKCJyZW1vdmUiIT09dCl7Zm9yKHZhciBvLGEscixzPVtdLGw9W10sdT1JW2VdLmluZGljZXMsaD0wO2g8dS5sZW5ndGg7aCsrKXt2YXIgYz1TLmdldEl0ZW1MYXlvdXQodVtoXSksZD1jLngsZj1jLnkwLHA9Yy55O3MucHVzaChbZCxmXSksbC5wdXNoKFtkLGYrcF0pLG89Uy5nZXRJdGVtVmlzdWFsKHVbaF0sImNvbG9yIil9dmFyIGc9Uy5nZXRJdGVtTGF5b3V0KHVbMF0pLG09Uy5nZXRJdGVtTW9kZWwodVtoLTFdKSx2PW0uZ2V0TW9kZWwoImxhYmVsIikseT12LmdldCgibWFyZ2luIik7aWYoImFkZCI9PT10KXt2YXIgeD1UW2VdPW5ldyBJaTthPW5ldyBnbSh7c2hhcGU6e3BvaW50czpzLHN0YWNrZWRPblBvaW50czpsLHNtb290aDouNCxzdGFja2VkT25TbW9vdGg6LjQsc21vb3RoQ29uc3RyYWludDohMX0sejI6MH0pLHI9bmV3IEZyKHtzdHlsZTp7eDpnLngteSx5OmcueTArZy55LzJ9fSkseC5hZGQoYSkseC5hZGQociksTS5hZGQoeCksYS5zZXRDbGlwUGF0aChmdW5jdGlvbih0LGUsaSl7dmFyIG49bmV3IGlzKHtzaGFwZTp7eDp0LngtMTAseTp0LnktMTAsd2lkdGg6MCxoZWlnaHQ6dC5oZWlnaHQrMjB9fSk7cmV0dXJuIGxsKG4se3NoYXBlOnt3aWR0aDp0LndpZHRoKzIwLGhlaWdodDp0LmhlaWdodCsyMH19LGUsaSksbn0oYS5nZXRCb3VuZGluZ1JlY3QoKSxiLGZ1bmN0aW9uKCl7YS5yZW1vdmVDbGlwUGF0aCgpfSkpfWVsc2V7eD1uW2ldO2E9eC5jaGlsZEF0KDApLHI9eC5jaGlsZEF0KDEpLE0uYWRkKHgpLFRbZV09eCxzbChhLHtzaGFwZTp7cG9pbnRzOnMsc3RhY2tlZE9uUG9pbnRzOmx9fSxiKSxzbChyLHtzdHlsZTp7eDpnLngteSx5OmcueTArZy55LzJ9fSxiKX12YXIgXz1tLmdldE1vZGVsKCJlbXBoYXNpcy5pdGVtU3R5bGUiKSx3PW0uZ2V0TW9kZWwoIml0ZW1TdHlsZSIpO1FzKHIuc3R5bGUsdix7dGV4dDp2LmdldCgic2hvdyIpP2IuZ2V0Rm9ybWF0dGVkTGFiZWwodVtoLTFdLCJub3JtYWwiKXx8Uy5nZXROYW1lKHVbaC0xXSk6bnVsbCx0ZXh0VmVydGljYWxBbGlnbjoibWlkZGxlIn0pLGEuc2V0U3R5bGUoTCh7ZmlsbDpvfSx3LmdldEl0ZW1TdHlsZShbImNvbG9yIl0pKSksWXMoYSxfLmdldEl0ZW1TdHlsZSgpKX1lbHNlIE0ucmVtb3ZlKG5bZV0pfXIuYWRkKEEocyx0aGlzLCJhZGQiKSkudXBkYXRlKEEocyx0aGlzLCJ1cGRhdGUiKSkucmVtb3ZlKEEocyx0aGlzLCJyZW1vdmUiKSkuZXhlY3V0ZSgpLHRoaXMuX2xheWVyc1Nlcmllcz1JLHRoaXMuX2xheWVycz1UfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pO2Z1bmN0aW9uIGtJKGksdCxlKXtpZihpLmNvdW50KCkpZm9yKHZhciBuLG89dC5jb29yZGluYXRlU3lzdGVtLGE9dC5nZXRMYXllclNlcmllcygpLHI9aS5tYXBEaW1lbnNpb24oInNpbmdsZSIpLHM9aS5tYXBEaW1lbnNpb24oInZhbHVlIiksbD1OKGEsZnVuY3Rpb24odCl7cmV0dXJuIE4odC5pbmRpY2VzLGZ1bmN0aW9uKHQpe3ZhciBlPW8uZGF0YVRvUG9pbnQoaS5nZXQocix0KSk7cmV0dXJuIGVbMV09aS5nZXQocyx0KSxlfSl9KSx1PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxpPXRbMF0ubGVuZ3RoLG49W10sbz1bXSxhPTAscj17fSxzPTA7czxpOysrcyl7Zm9yKHZhciBsPTAsdT0wO2w8ZTsrK2wpdSs9dFtsXVtzXVsxXTthPHUmJihhPXUpLG4ucHVzaCh1KX1mb3IodmFyIGg9MDtoPGk7KytoKW9baF09KGEtbltoXSkvMjtmb3IodmFyIGM9YT0wO2M8aTsrK2Mpe3ZhciBkPW5bY10rb1tjXTthPGQmJihhPWQpfXJldHVybiByLnkwPW8sci5tYXg9YSxyfShsKSxoPXUueTAsYz1lL3UubWF4LGQ9YS5sZW5ndGgsZj1hWzBdLmluZGljZXMubGVuZ3RoLHA9MDtwPGY7KytwKXtuPWhbcF0qYyxpLnNldEl0ZW1MYXlvdXQoYVswXS5pbmRpY2VzW3BdLHtsYXllckluZGV4OjAseDpsWzBdW3BdWzBdLHkwOm4seTpsWzBdW3BdWzFdKmN9KTtmb3IodmFyIGc9MTtnPGQ7KytnKW4rPWxbZy0xXVtwXVsxXSpjLGkuc2V0SXRlbUxheW91dChhW2ddLmluZGljZXNbcF0se2xheWVySW5kZXg6Zyx4OmxbZ11bcF1bMF0seTA6bix5OmxbZ11bcF1bMV0qY30pfX12ZihmdW5jdGlvbih0LGUpe3QuZWFjaFNlcmllc0J5VHlwZSgidGhlbWVSaXZlciIsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCksaT10LmNvb3JkaW5hdGVTeXN0ZW0sbj17fSxvPWkuZ2V0UmVjdCgpO24ucmVjdD1vO3ZhciBhPXQuZ2V0KCJib3VuZGFyeUdhcCIpLHI9aS5nZXRBeGlzKCk7KG4uYm91bmRhcnlHYXA9YSwiaG9yaXpvbnRhbCI9PT1yLm9yaWVudCk/KGFbMF09UGwoYVswXSxvLmhlaWdodCksYVsxXT1QbChhWzFdLG8uaGVpZ2h0KSxrSShlLHQsby5oZWlnaHQtYVswXS1hWzFdKSk6KGFbMF09UGwoYVswXSxvLndpZHRoKSxhWzFdPVBsKGFbMV0sby53aWR0aCksa0koZSx0LG8ud2lkdGgtYVswXS1hWzFdKSk7ZS5zZXRMYXlvdXQoImxheW91dEluZm8iLG4pfSl9KSx5ZihmdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoInRoZW1lUml2ZXIiLGZ1bmN0aW9uKG8pe3ZhciBhPW8uZ2V0RGF0YSgpLHI9by5nZXRSYXdEYXRhKCkscz1vLmdldCgiY29sb3IiKSxsPVEoKTthLmVhY2goZnVuY3Rpb24odCl7bC5zZXQoYS5nZXRSYXdJbmRleCh0KSx0KX0pLHIuZWFjaChmdW5jdGlvbih0KXt2YXIgZT1yLmdldE5hbWUodCksaT1zWyhvLm5hbWVNYXAuZ2V0KGUpLTEpJXMubGVuZ3RoXTtyLnNldEl0ZW1WaXN1YWwodCwiY29sb3IiLGkpO3ZhciBuPWwuZ2V0KHQpO251bGwhPW4mJmEuc2V0SXRlbVZpc3VhbChuLCJjb2xvciIsaSl9KX0pfSkscGYodHkoInRoZW1lUml2ZXIiKSksaWMuZXh0ZW5kKHt0eXBlOiJzZXJpZXMuc3VuYnVyc3QiLF92aWV3Um9vdDpudWxsLGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIGk9e25hbWU6dC5uYW1lLGNoaWxkcmVuOnQuZGF0YX07IWZ1bmN0aW9uIGkodCl7dmFyIG49MDtFKHQuY2hpbGRyZW4sZnVuY3Rpb24odCl7aSh0KTt2YXIgZT10LnZhbHVlO2soZSkmJihlPWVbMF0pLG4rPWV9KTt2YXIgZT10LnZhbHVlO2soZSkmJihlPWVbMF0pO251bGwhPWUmJiFpc05hTihlKXx8KGU9bik7ZTwwJiYoZT0wKTtrKHQudmFsdWUpP3QudmFsdWVbMF09ZTp0LnZhbHVlPWV9KGkpO3ZhciBuPXQubGV2ZWxzfHxbXSxvPXt9O3JldHVybiBvLmxldmVscz1uLHZ4LmNyZWF0ZVRyZWUoaSx0aGlzLG8pLmRhdGF9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0Vmlld1Jvb3QoKX0sZ2V0RGF0YVBhcmFtczpmdW5jdGlvbih0KXt2YXIgZT1pYy5wcm90b3R5cGUuZ2V0RGF0YVBhcmFtcy5hcHBseSh0aGlzLGFyZ3VtZW50cyksaT10aGlzLmdldERhdGEoKS50cmVlLmdldE5vZGVCeURhdGFJbmRleCh0KTtyZXR1cm4gZS50cmVlUGF0aEluZm89UngoaSx0aGlzKSxlfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY2VudGVyOlsiNTAlIiwiNTAlIl0scmFkaXVzOlswLCI3NSUiXSxjbG9ja3dpc2U6ITAsc3RhcnRBbmdsZTo5MCxtaW5BbmdsZTowLHBlcmNlbnRQcmVjaXNpb246MixzdGlsbFNob3daZXJvU3VtOiEwLGhpZ2hsaWdodFBvbGljeToiZGVzY2VuZGFudCIsbm9kZUNsaWNrOiJyb290VG9Ob2RlIixyZW5kZXJMYWJlbEZvclplcm9EYXRhOiExLGxhYmVsOntyb3RhdGU6InJhZGlhbCIsc2hvdzohMCxvcGFjaXR5OjEsYWxpZ246ImNlbnRlciIscG9zaXRpb246Imluc2lkZSIsZGlzdGFuY2U6NSxzaWxlbnQ6ITAsZW1waGFzaXM6e319LGl0ZW1TdHlsZTp7Ym9yZGVyV2lkdGg6MSxib3JkZXJDb2xvcjoid2hpdGUiLGJvcmRlclR5cGU6InNvbGlkIixzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6InJnYmEoMCwgMCwgMCwgMC4yKSIsc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxvcGFjaXR5OjEsZW1waGFzaXM6e30saGlnaGxpZ2h0OntvcGFjaXR5OjF9LGRvd25wbGF5OntvcGFjaXR5Oi45fX0sYW5pbWF0aW9uVHlwZToiZXhwYW5zaW9uIixhbmltYXRpb25EdXJhdGlvbjoxZTMsYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6NTAwLGFuaW1hdGlvbkVhc2luZzoiY3ViaWNPdXQiLGRhdGE6W10sbGV2ZWxzOltdLHNvcnQ6ImRlc2MifSxnZXRWaWV3Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3Um9vdH0scmVzZXRWaWV3Um9vdDpmdW5jdGlvbih0KXt0P3RoaXMuX3ZpZXdSb290PXQ6dD10aGlzLl92aWV3Um9vdDt2YXIgZT10aGlzLmdldFJhd0RhdGEoKS50cmVlLnJvb3Q7dCYmKHQ9PT1lfHxlLmNvbnRhaW5zKHQpKXx8KHRoaXMuX3ZpZXdSb290PWUpfX0pO3ZhciBQST0ibm9uZSIsTkk9ImFuY2VzdG9yIixPST0ic2VsZiIsRUk9Mix6ST00O2Z1bmN0aW9uIFJJKHQsZSxpKXtJaS5jYWxsKHRoaXMpO3ZhciBuPW5ldyBVcih7ejI6RUl9KTtuLnNlcmllc0luZGV4PWUuc2VyaWVzSW5kZXg7dmFyIG89bmV3IEZyKHt6Mjp6SSxzaWxlbnQ6dC5nZXRNb2RlbCgibGFiZWwiKS5nZXQoInNpbGVudCIpfSk7ZnVuY3Rpb24gYSgpe28uaWdub3JlPW8uaG92ZXJJZ25vcmV9ZnVuY3Rpb24gcigpe28uaWdub3JlPW8ubm9ybWFsSWdub3JlfXRoaXMuYWRkKG4pLHRoaXMuYWRkKG8pLHRoaXMudXBkYXRlRGF0YSghMCx0LCJub3JtYWwiLGUsaSksdGhpcy5vbigiZW1waGFzaXMiLGEpLm9uKCJub3JtYWwiLHIpLm9uKCJtb3VzZW92ZXIiLGEpLm9uKCJtb3VzZW91dCIscil9dmFyIEJJPVJJLnByb3RvdHlwZTtCSS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxpLG4sbyl7KHRoaXMubm9kZT1lKS5waWVjZT10aGlzLG49bnx8dGhpcy5fc2VyaWVzTW9kZWwsbz1vfHx0aGlzLl9lY01vZGVsO3ZhciBhPXRoaXMuY2hpbGRBdCgwKTthLmRhdGFJbmRleD1lLmRhdGFJbmRleDt2YXIgcj1lLmdldE1vZGVsKCkscz1lLmdldExheW91dCgpLGw9TCh7fSxzKTtsLmxhYmVsPW51bGw7dmFyIHU9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0VmlzdWFsKCJjb2xvciIpLG89dC5nZXRWaXN1YWwoInZpc3VhbE1ldGEiKTtvJiYwIT09by5sZW5ndGh8fChuPW51bGwpO3ZhciBhPXQuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldCgiY29sb3IiKTt7aWYoYSlyZXR1cm4gYTtpZihuKXJldHVybiBuO2lmKDA9PT10LmRlcHRoKXJldHVybiBpLm9wdGlvbi5jb2xvclswXTt2YXIgcj1pLm9wdGlvbi5jb2xvci5sZW5ndGg7YT1pLm9wdGlvbi5jb2xvcltmdW5jdGlvbih0KXt2YXIgZT10O2Zvcig7MTxlLmRlcHRoOyllPWUucGFyZW50Tm9kZTtyZXR1cm4gXyh0LmdldEFuY2VzdG9ycygpWzBdLmNoaWxkcmVuLGUpfSh0KSVyXX1yZXR1cm4gYX0oZSwwLG8pOyFmdW5jdGlvbih0LGUsaSl7ZS5nZXREYXRhKCkuc2V0SXRlbVZpc3VhbCh0LmRhdGFJbmRleCwiY29sb3IiLGkpfShlLG4sdSk7dmFyIGgsYz1yLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKTsibm9ybWFsIj09PWk/aD1jOmg9bShyLmdldE1vZGVsKGkrIi5pdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSxjKTtoPUMoe2xpbmVKb2luOiJiZXZlbCIsZmlsbDpoLmZpbGx8fHV9LGgpLHQ/KGEuc2V0U2hhcGUobCksYS5zaGFwZS5yPXMucjAsc2woYSx7c2hhcGU6e3I6cy5yfX0sbixlLmRhdGFJbmRleCksYS51c2VTdHlsZShoKSk6Im9iamVjdCI9PXR5cGVvZiBoLmZpbGwmJmguZmlsbC50eXBlfHwib2JqZWN0Ij09dHlwZW9mIGEuc3R5bGUuZmlsbCYmYS5zdHlsZS5maWxsLnR5cGU/KHNsKGEse3NoYXBlOmx9LG4pLGEudXNlU3R5bGUoaCkpOnNsKGEse3NoYXBlOmwsc3R5bGU6aH0sbiksdGhpcy5fdXBkYXRlTGFiZWwobix1LGkpO3ZhciBkPXIuZ2V0U2hhbGxvdygiY3Vyc29yIik7aWYoZCYmYS5hdHRyKCJjdXJzb3IiLGQpLHQpe3ZhciBmPW4uZ2V0U2hhbGxvdygiaGlnaGxpZ2h0UG9saWN5Iik7dGhpcy5faW5pdEV2ZW50cyhhLGUsbixmKX10aGlzLl9zZXJpZXNNb2RlbD1ufHx0aGlzLl9zZXJpZXNNb2RlbCx0aGlzLl9lY01vZGVsPW98fHRoaXMuX2VjTW9kZWx9LEJJLm9uRW1waGFzaXM9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt0aGlzLm5vZGUuaG9zdFRyZWUucm9vdC5lYWNoTm9kZShmdW5jdGlvbih0KXt0LnBpZWNlJiYoaS5ub2RlPT09dD90LnBpZWNlLnVwZGF0ZURhdGEoITEsdCwiZW1waGFzaXMiKTohZnVuY3Rpb24odCxlLGkpe3JldHVybiBpIT09UEkmJihpPT09T0k/dD09PWU6aT09PU5JP3Q9PT1lfHx0LmlzQW5jZXN0b3JPZihlKTp0PT09ZXx8dC5pc0Rlc2NlbmRhbnRPZihlKSl9KHQsaS5ub2RlLGUpP2UhPT1QSSYmdC5waWVjZS5jaGlsZEF0KDApLnRyaWdnZXIoImRvd25wbGF5Iik6dC5waWVjZS5jaGlsZEF0KDApLnRyaWdnZXIoImhpZ2hsaWdodCIpKX0pfSxCSS5vbk5vcm1hbD1mdW5jdGlvbigpe3RoaXMubm9kZS5ob3N0VHJlZS5yb290LmVhY2hOb2RlKGZ1bmN0aW9uKHQpe3QucGllY2UmJnQucGllY2UudXBkYXRlRGF0YSghMSx0LCJub3JtYWwiKX0pfSxCSS5vbkhpZ2hsaWdodD1mdW5jdGlvbigpe3RoaXMudXBkYXRlRGF0YSghMSx0aGlzLm5vZGUsImhpZ2hsaWdodCIpfSxCSS5vbkRvd25wbGF5PWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVEYXRhKCExLHRoaXMubm9kZSwiZG93bnBsYXkiKX0sQkkuX3VwZGF0ZUxhYmVsPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLm5vZGUuZ2V0TW9kZWwoKSxvPW4uZ2V0TW9kZWwoImxhYmVsIiksYT0ibm9ybWFsIj09PWl8fCJlbXBoYXNpcyI9PT1pP286bi5nZXRNb2RlbChpKyIubGFiZWwiKSxyPW4uZ2V0TW9kZWwoImVtcGhhc2lzLmxhYmVsIikscz1XKHQuZ2V0Rm9ybWF0dGVkTGFiZWwodGhpcy5ub2RlLmRhdGFJbmRleCxpLG51bGwsbnVsbCwibGFiZWwiKSx0aGlzLm5vZGUubmFtZSk7ITE9PT1TKCJzaG93IikmJihzPSIiKTt2YXIgbD10aGlzLm5vZGUuZ2V0TGF5b3V0KCksdT1hLmdldCgibWluQW5nbGUiKTtudWxsPT11JiYodT1vLmdldCgibWluQW5nbGUiKSksdT11LzE4MCpNYXRoLlBJO3ZhciBoPWwuZW5kQW5nbGUtbC5zdGFydEFuZ2xlO251bGwhPXUmJk1hdGguYWJzKGgpPHUmJihzPSIiKTt2YXIgYz10aGlzLmNoaWxkQXQoMSk7JHMoYy5zdHlsZSxjLmhvdmVyU3R5bGV8fHt9LG8scix7ZGVmYXVsdFRleHQ6YS5nZXRTaGFsbG93KCJzaG93Iik/czpudWxsLGF1dG9Db2xvcjplLHVzZUluc2lkZVN0eWxlOiEwfSk7dmFyIGQsZj0obC5zdGFydEFuZ2xlK2wuZW5kQW5nbGUpLzIscD1NYXRoLmNvcyhmKSxnPU1hdGguc2luKGYpLG09UygicG9zaXRpb24iKSx2PVMoImRpc3RhbmNlIil8fDAseT1TKCJhbGlnbiIpOyJvdXRzaWRlIj09PW0/KGQ9bC5yK3YseT1mPk1hdGguUEkvMj8icmlnaHQiOiJsZWZ0Iik6eSYmImNlbnRlciIhPT15PyJsZWZ0Ij09PXk/KGQ9bC5yMCt2LGY+TWF0aC5QSS8yJiYoeT0icmlnaHQiKSk6InJpZ2h0Ij09PXkmJihkPWwuci12LGY+TWF0aC5QSS8yJiYoeT0ibGVmdCIpKTooZD0obC5yK2wucjApLzIseT0iY2VudGVyIiksYy5hdHRyKCJzdHlsZSIse3RleHQ6cyx0ZXh0QWxpZ246eSx0ZXh0VmVydGljYWxBbGlnbjpTKCJ2ZXJ0aWNhbEFsaWduIil8fCJtaWRkbGUiLG9wYWNpdHk6Uygib3BhY2l0eSIpfSk7dmFyIHg9ZCpwK2wuY3gsXz1kKmcrbC5jeTtjLmF0dHIoInBvc2l0aW9uIixbeCxfXSk7dmFyIHc9Uygicm90YXRlIiksYj0wO2Z1bmN0aW9uIFModCl7dmFyIGU9YS5nZXQodCk7cmV0dXJuIG51bGw9PWU/by5nZXQodCk6ZX0icmFkaWFsIj09PXc/KGI9LWYpPC1NYXRoLlBJLzImJihiKz1NYXRoLlBJKToidGFuZ2VudGlhbCI9PT13PyhiPU1hdGguUEkvMi1mKT5NYXRoLlBJLzI/Yi09TWF0aC5QSTpiPC1NYXRoLlBJLzImJihiKz1NYXRoLlBJKToibnVtYmVyIj09dHlwZW9mIHcmJihiPXcqTWF0aC5QSS8xODApLGMuYXR0cigicm90YXRpb24iLGIpfSxCSS5faW5pdEV2ZW50cz1mdW5jdGlvbih0LGUsaSxuKXt0Lm9mZigibW91c2VvdmVyIikub2ZmKCJtb3VzZW91dCIpLm9mZigiZW1waGFzaXMiKS5vZmYoIm5vcm1hbCIpO2Z1bmN0aW9uIG8oKXtyLm9uRW1waGFzaXMobil9ZnVuY3Rpb24gYSgpe3Iub25Ob3JtYWwoKX12YXIgcj10aGlzO2kuaXNBbmltYXRpb25FbmFibGVkKCkmJnQub24oIm1vdXNlb3ZlciIsbykub24oIm1vdXNlb3V0IixhKS5vbigiZW1waGFzaXMiLG8pLm9uKCJub3JtYWwiLGEpLm9uKCJkb3ducGxheSIsZnVuY3Rpb24oKXtyLm9uRG93bnBsYXkoKX0pLm9uKCJoaWdobGlnaHQiLGZ1bmN0aW9uKCl7ci5vbkhpZ2hsaWdodCgpfSl9LHcoUkksSWkpO2djLmV4dGVuZCh7dHlwZToic3VuYnVyc3QiLGluaXQ6ZnVuY3Rpb24oKXt9LHJlbmRlcjpmdW5jdGlvbihvLGEsdCxlKXt2YXIgbj10aGlzO3RoaXMuc2VyaWVzTW9kZWw9byx0aGlzLmFwaT10LHRoaXMuZWNNb2RlbD1hO3ZhciByPW8uZ2V0RGF0YSgpLHM9ci50cmVlLnJvb3QsaT1vLmdldFZpZXdSb290KCksbD10aGlzLmdyb3VwLHU9by5nZXQoInJlbmRlckxhYmVsRm9yWmVyb0RhdGEiKSxoPVtdO2kuZWFjaE5vZGUoZnVuY3Rpb24odCl7aC5wdXNoKHQpfSk7dmFyIGM9dGhpcy5fb2xkQ2hpbGRyZW58fFtdO2lmKGZ1bmN0aW9uKGksbil7aWYoMD09PWkubGVuZ3RoJiYwPT09bi5sZW5ndGgpcmV0dXJuO2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQuZ2V0SWQoKX1mdW5jdGlvbiBlKHQsZSl7IWZ1bmN0aW9uKHQsZSl7dXx8IXR8fHQuZ2V0VmFsdWUoKXx8KHQ9bnVsbCk7aWYodCE9PXMmJmUhPT1zKWlmKGUmJmUucGllY2UpdD8oZS5waWVjZS51cGRhdGVEYXRhKCExLHQsIm5vcm1hbCIsbyxhKSxyLnNldEl0ZW1HcmFwaGljRWwodC5kYXRhSW5kZXgsZS5waWVjZSkpOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybjt0LnBpZWNlJiYobC5yZW1vdmUodC5waWVjZSksdC5waWVjZT1udWxsKX0oZSk7ZWxzZSBpZih0KXt2YXIgaT1uZXcgUkkodCxvLGEpO2wuYWRkKGkpLHIuc2V0SXRlbUdyYXBoaWNFbCh0LmRhdGFJbmRleCxpKX19KG51bGw9PXQ/bnVsbDppW3RdLG51bGw9PWU/bnVsbDpuW2VdKX1uZXcgVGYobixpLHQsdCkuYWRkKGUpLnVwZGF0ZShlKS5yZW1vdmUoVChlLG51bGwpKS5leGVjdXRlKCl9KGgsYyksZnVuY3Rpb24odCxlKXtpZigwPGUuZGVwdGgpe24udmlydHVhbFBpZWNlP24udmlydHVhbFBpZWNlLnVwZGF0ZURhdGEoITEsdCwibm9ybWFsIixvLGEpOihuLnZpcnR1YWxQaWVjZT1uZXcgUkkodCxvLGEpLGwuYWRkKG4udmlydHVhbFBpZWNlKSksZS5waWVjZS5fb25jbGlja0V2ZW50JiZlLnBpZWNlLm9mZigiY2xpY2siLGUucGllY2UuX29uY2xpY2tFdmVudCk7dmFyIGk9ZnVuY3Rpb24odCl7bi5fcm9vdFRvTm9kZShlLnBhcmVudE5vZGUpfTtlLnBpZWNlLl9vbmNsaWNrRXZlbnQ9aSxuLnZpcnR1YWxQaWVjZS5vbigiY2xpY2siLGkpfWVsc2Ugbi52aXJ0dWFsUGllY2UmJihsLnJlbW92ZShuLnZpcnR1YWxQaWVjZSksbi52aXJ0dWFsUGllY2U9bnVsbCl9KHMsaSksZSYmZS5oaWdobGlnaHQmJmUuaGlnaGxpZ2h0LnBpZWNlKXt2YXIgZD1vLmdldFNoYWxsb3coImhpZ2hsaWdodFBvbGljeSIpO2UuaGlnaGxpZ2h0LnBpZWNlLm9uRW1waGFzaXMoZCl9ZWxzZSBpZihlJiZlLnVuaGlnaGxpZ2h0KXt2YXIgZj10aGlzLnZpcnR1YWxQaWVjZTshZiYmcy5jaGlsZHJlbi5sZW5ndGgmJihmPXMuY2hpbGRyZW5bMF0ucGllY2UpLGYmJmYub25Ob3JtYWwoKX10aGlzLl9pbml0RXZlbnRzKCksdGhpcy5fb2xkQ2hpbGRyZW49aH0sZGlzcG9zZTpmdW5jdGlvbigpe30sX2luaXRFdmVudHM6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGEpe3ZhciByPSExO3Muc2VyaWVzTW9kZWwuZ2V0Vmlld1Jvb3QoKS5lYWNoTm9kZShmdW5jdGlvbih0KXtpZighciYmdC5waWVjZSYmdC5waWVjZS5jaGlsZEF0KDApPT09YS50YXJnZXQpe3ZhciBlPXQuZ2V0TW9kZWwoKS5nZXQoIm5vZGVDbGljayIpO2lmKCJyb290VG9Ob2RlIj09PWUpcy5fcm9vdFRvTm9kZSh0KTtlbHNlIGlmKCJsaW5rIj09PWUpe3ZhciBpPXQuZ2V0TW9kZWwoKSxuPWkuZ2V0KCJsaW5rIik7aWYobil7dmFyIG89aS5nZXQoInRhcmdldCIsITApfHwiX2JsYW5rIjt3aW5kb3cub3BlbihuLG8pfX1yPSEwfX0pfXZhciBzPXRoaXM7dGhpcy5ncm91cC5fb25jbGlja0V2ZW50JiZ0aGlzLmdyb3VwLm9mZigiY2xpY2siLHRoaXMuZ3JvdXAuX29uY2xpY2tFdmVudCksdGhpcy5ncm91cC5vbigiY2xpY2siLHQpLHRoaXMuZ3JvdXAuX29uY2xpY2tFdmVudD10fSxfcm9vdFRvTm9kZTpmdW5jdGlvbih0KXt0IT09dGhpcy5zZXJpZXNNb2RlbC5nZXRWaWV3Um9vdCgpJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToic3VuYnVyc3RSb290VG9Ob2RlIixmcm9tOnRoaXMudWlkLHNlcmllc0lkOnRoaXMuc2VyaWVzTW9kZWwuaWQsdGFyZ2V0Tm9kZTp0fSl9LGNvbnRhaW5Qb2ludDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0RGF0YSgpLmdldEl0ZW1MYXlvdXQoMCk7aWYoaSl7dmFyIG49dFswXS1pLmN4LG89dFsxXS1pLmN5LGE9TWF0aC5zcXJ0KG4qbitvKm8pO3JldHVybiBhPD1pLnImJmE+PWkucjB9fX0pO3ZhciBWST0ic3VuYnVyc3RSb290VG9Ob2RlIjtnZih7dHlwZTpWSSx1cGRhdGU6InVwZGF0ZVZpZXcifSxmdW5jdGlvbihvLHQpe3QuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToic3VuYnVyc3QiLHF1ZXJ5Om99LGZ1bmN0aW9uKHQsZSl7dmFyIGk9T3gobyxbVkldLHQpO2lmKGkpe3ZhciBuPXQuZ2V0Vmlld1Jvb3QoKTtuJiYoby5kaXJlY3Rpb249engobixpLm5vZGUpPyJyb2xsVXAiOiJkcmlsbERvd24iKSx0LnJlc2V0Vmlld1Jvb3QoaS5ub2RlKX19KX0pO3ZhciBHST0ic3VuYnVyc3RIaWdobGlnaHQiO2dmKHt0eXBlOkdJLHVwZGF0ZToidXBkYXRlVmlldyJ9LGZ1bmN0aW9uKG4sdCl7dC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToic2VyaWVzIixzdWJUeXBlOiJzdW5idXJzdCIscXVlcnk6bn0sZnVuY3Rpb24odCxlKXt2YXIgaT1PeChuLFtHSV0sdCk7aSYmKG4uaGlnaGxpZ2h0PWkubm9kZSl9KX0pO2dmKHt0eXBlOiJzdW5idXJzdFVuaGlnaGxpZ2h0Iix1cGRhdGU6InVwZGF0ZVZpZXcifSxmdW5jdGlvbihpLHQpe3QuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToic3VuYnVyc3QiLHF1ZXJ5Oml9LGZ1bmN0aW9uKHQsZSl7aS51bmhpZ2hsaWdodD0hMH0pfSk7dmFyIEZJPU1hdGguUEkvMTgwO2Z1bmN0aW9uIFdJKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIHQuc29ydChlKTt2YXIgbj0iYXNjIj09PWU7cmV0dXJuIHQuc29ydChmdW5jdGlvbih0LGUpe3ZhciBpPSh0LmdldFZhbHVlKCktZS5nZXRWYWx1ZSgpKSoobj8xOi0xKTtyZXR1cm4gMD09aT8odC5kYXRhSW5kZXgtZS5kYXRhSW5kZXgpKihuPy0xOjEpOml9KX1mdW5jdGlvbiBISShhLHIpe3JldHVybiByPXJ8fFswLDBdLE4oWyJ4IiwieSJdLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRBeGlzKHQpLG49cltlXSxvPWFbZV0vMjtyZXR1cm4iY2F0ZWdvcnkiPT09aS50eXBlP2kuZ2V0QmFuZFdpZHRoKCk6TWF0aC5hYnMoaS5kYXRhVG9Db29yZChuLW8pLWkuZGF0YVRvQ29vcmQobitvKSl9LHRoaXMpfXlmKFQoWXYsInN1bmJ1cnN0IikpLHZmKFQoZnVuY3Rpb24odCxlLEMsaSl7ZS5lYWNoU2VyaWVzQnlUeXBlKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImNlbnRlciIpLGk9dC5nZXQoInJhZGl1cyIpO2soaSl8fChpPVswLGldKSxrKGUpfHwoZT1bZSxlXSk7dmFyIG49Qy5nZXRXaWR0aCgpLG89Qy5nZXRIZWlnaHQoKSxoPU1hdGgubWluKG4sbyksYz1QbChlWzBdLG4pLGQ9UGwoZVsxXSxvKSxmPVBsKGlbMF0saC8yKSxhPVBsKGlbMV0saC8yKSxyPS10LmdldCgic3RhcnRBbmdsZSIpKkZJLHA9dC5nZXQoIm1pbkFuZ2xlIikqRkksZz10LmdldERhdGEoKS50cmVlLnJvb3Qscz10LmdldFZpZXdSb290KCksbT1zLmRlcHRoLGw9dC5nZXQoInNvcnQiKTtudWxsIT1sJiYhZnVuY3Rpb24gZSh0LGkpe3ZhciBuPXQuY2hpbGRyZW58fFtdO3QuY2hpbGRyZW49V0kobixpKTtuLmxlbmd0aCYmRSh0LmNoaWxkcmVuLGZ1bmN0aW9uKHQpe2UodCxpKX0pfShzLGwpO3ZhciB1PTA7RShzLmNoaWxkcmVuLGZ1bmN0aW9uKHQpe2lzTmFOKHQuZ2V0VmFsdWUoKSl8fHUrK30pO3ZhciB2PXMuZ2V0VmFsdWUoKSx5PU1hdGguUEkvKHZ8fHUpKjIseD0wPHMuZGVwdGgsXz1zLmhlaWdodC0oeD8tMToxKSx3PShhLWYpLyhffHwxKSxiPXQuZ2V0KCJjbG9ja3dpc2UiKSxTPXQuZ2V0KCJzdGlsbFNob3daZXJvU3VtIiksTT1iPzE6LTEsST1mdW5jdGlvbih0LGUpe2lmKHQpe3ZhciBpPWU7aWYodCE9PWcpe3ZhciBuPXQuZ2V0VmFsdWUoKSxvPTA9PT12JiZTP3k6bip5O288cCYmKG89cCksaT1lK00qbzt2YXIgYT10LmRlcHRoLW0tKHg/LTE6MSkscj1mK3cqYSxzPWYrdyooMSthKSxsPXQuZ2V0TW9kZWwoKTtudWxsIT1sLmdldCgicjAiKSYmKHI9UGwobC5nZXQoInIwIiksaC8yKSksbnVsbCE9bC5nZXQoInIiKSYmKHM9UGwobC5nZXQoInIiKSxoLzIpKSx0LnNldExheW91dCh7YW5nbGU6byxzdGFydEFuZ2xlOmUsZW5kQW5nbGU6aSxjbG9ja3dpc2U6YixjeDpjLGN5OmQscjA6cixyOnN9KX1pZih0LmNoaWxkcmVuJiZ0LmNoaWxkcmVuLmxlbmd0aCl7dmFyIHU9MDtFKHQuY2hpbGRyZW4sZnVuY3Rpb24odCl7dSs9SSh0LGUrdSl9KX1yZXR1cm4gaS1lfX07aWYoeCl7dmFyIFQ9ZixBPWYrdyxEPTIqTWF0aC5QSTtnLnNldExheW91dCh7YW5nbGU6RCxzdGFydEFuZ2xlOnIsZW5kQW5nbGU6citELGNsb2Nrd2lzZTpiLGN4OmMsY3k6ZCxyMDpULHI6QX0pfUkocyxyKX0pfSwic3VuYnVyc3QiKSkscGYoVCh0eSwic3VuYnVyc3QiKSk7ZnVuY3Rpb24gWkkoYSxyKXtyZXR1cm4gcj1yfHxbMCwwXSxOKFswLDFdLGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF0saT1hW3RdLzIsbj1bXSxvPVtdO3JldHVybiBuW3RdPWUtaSxvW3RdPWUraSxuWzEtdF09b1sxLXRdPXJbMS10XSxNYXRoLmFicyh0aGlzLmRhdGFUb1BvaW50KG4pW3RdLXRoaXMuZGF0YVRvUG9pbnQobylbdF0pfSx0aGlzKX1mdW5jdGlvbiBVSSh0LGUpe3ZhciBpPXRoaXMuZ2V0QXhpcygpLG49ZSBpbnN0YW5jZW9mIEFycmF5P2VbMF06ZSxvPSh0IGluc3RhbmNlb2YgQXJyYXk/dFswXTp0KS8yO3JldHVybiJjYXRlZ29yeSI9PT1pLnR5cGU/aS5nZXRCYW5kV2lkdGgoKTpNYXRoLmFicyhpLmRhdGFUb0Nvb3JkKG4tbyktaS5kYXRhVG9Db29yZChuK28pKX1mdW5jdGlvbiBYSShzLGwpe3JldHVybiBOKFsiUmFkaXVzIiwiQW5nbGUiXSxmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXNbImdldCIrdCsiQXhpcyJdKCksbj1sW2VdLG89c1tlXS8yLGE9ImRhdGFUbyIrdCxyPSJjYXRlZ29yeSI9PT1pLnR5cGU/aS5nZXRCYW5kV2lkdGgoKTpNYXRoLmFicyhpW2FdKG4tbyktaVthXShuK28pKTtyZXR1cm4iQW5nbGUiPT09dCYmKHI9cipNYXRoLlBJLzE4MCkscn0sdGhpcyl9dmFyIFlJPXhzLGpJPVsiaXRlbVN0eWxlIl0scUk9WyJlbXBoYXNpcyIsIml0ZW1TdHlsZSJdLEtJPVsibGFiZWwiXSwkST1bImVtcGhhc2lzIiwibGFiZWwiXSxKST0iZVwwXDAiLFFJPXtjYXJ0ZXNpYW4yZDpmdW5jdGlvbihlKXt2YXIgdD1lLmdyaWQuZ2V0UmVjdCgpO3JldHVybntjb29yZFN5czp7dHlwZToiY2FydGVzaWFuMmQiLHg6dC54LHk6dC55LHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fSxhcGk6e2Nvb3JkOmZ1bmN0aW9uKHQpe3JldHVybiBlLmRhdGFUb1BvaW50KHQpfSxzaXplOkEoSEksZSl9fX0sZ2VvOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJue2Nvb3JkU3lzOnt0eXBlOiJnZW8iLHg6dC54LHk6dC55LHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0LHpvb206ZS5nZXRab29tKCl9LGFwaTp7Y29vcmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGUuZGF0YVRvUG9pbnQodCl9LHNpemU6QShaSSxlKX19fSxzaW5nbGVBeGlzOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0UmVjdCgpO3JldHVybntjb29yZFN5czp7dHlwZToic2luZ2xlQXhpcyIseDp0LngseTp0Lnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9LGFwaTp7Y29vcmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGUuZGF0YVRvUG9pbnQodCl9LHNpemU6QShVSSxlKX19fSxwb2xhcjpmdW5jdGlvbihvKXt2YXIgYT1vLmdldFJhZGl1c0F4aXMoKSxyPW8uZ2V0QW5nbGVBeGlzKCksdD1hLmdldEV4dGVudCgpO3JldHVybiB0WzBdPnRbMV0mJnQucmV2ZXJzZSgpLHtjb29yZFN5czp7dHlwZToicG9sYXIiLGN4Om8uY3gsY3k6by5jeSxyOnRbMV0scjA6dFswXX0sYXBpOntjb29yZDpBKGZ1bmN0aW9uKHQpe3ZhciBlPWEuZGF0YVRvUmFkaXVzKHRbMF0pLGk9ci5kYXRhVG9BbmdsZSh0WzFdKSxuPW8uY29vcmRUb1BvaW50KFtlLGldKTtyZXR1cm4gbi5wdXNoKGUsaSpNYXRoLlBJLzE4MCksbn0pLHNpemU6QShYSSxvKX19fSxjYWxlbmRhcjpmdW5jdGlvbihpKXt2YXIgdD1pLmdldFJlY3QoKSxlPWkuZ2V0UmFuZ2VJbmZvKCk7cmV0dXJue2Nvb3JkU3lzOnt0eXBlOiJjYWxlbmRhciIseDp0LngseTp0Lnksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsY2VsbFdpZHRoOmkuZ2V0Q2VsbFdpZHRoKCksY2VsbEhlaWdodDppLmdldENlbGxIZWlnaHQoKSxyYW5nZUluZm86e3N0YXJ0OmUuc3RhcnQsZW5kOmUuZW5kLHdlZWtzOmUud2Vla3MsZGF5Q291bnQ6ZS5hbGxEYXl9fSxhcGk6e2Nvb3JkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuZGF0YVRvUG9pbnQodCxlKX19fX19O2Z1bmN0aW9uIHRUKHQsZSxpLG4sbyl7bnVsbD09aVt0XXx8b3x8KGVbdF09aVt0XSxpW3RdPW5bdF0pfWZ1bmN0aW9uIGVUKGEscixlLHQpe3ZhciBpPWEuZ2V0KCJyZW5kZXJJdGVtIiksbj1hLmNvb3JkaW5hdGVTeXN0ZW0sbz17fTtuJiYobz1uLnByZXBhcmVDdXN0b21zP24ucHJlcGFyZUN1c3RvbXMoKTpRSVtuLnR5cGVdKG4pKTt2YXIgcyxsLHUsaCxjLGQ9Qyh7Z2V0V2lkdGg6dC5nZXRXaWR0aCxnZXRIZWlnaHQ6dC5nZXRIZWlnaHQsZ2V0WnI6dC5nZXRacixnZXREZXZpY2VQaXhlbFJhdGlvOnQuZ2V0RGV2aWNlUGl4ZWxSYXRpbyx2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lJiYoZT1zKSxyLmdldChyLmdldERpbWVuc2lvbih0fHwwKSxlKX0sc3R5bGU6ZnVuY3Rpb24odCxlKXtudWxsPT1lJiYoZT1zKSxnKGUpO3ZhciBpPWwuZ2V0TW9kZWwoakkpLmdldEl0ZW1TdHlsZSgpO251bGwhPWMmJihpLmZpbGw9Yyk7dmFyIG49ci5nZXRJdGVtVmlzdWFsKGUsIm9wYWNpdHkiKTtudWxsIT1uJiYoaS5vcGFjaXR5PW4pO3ZhciBvPXQ/clQodCx1KTp1O3JldHVybiBRcyhpLG8sbnVsbCx7YXV0b0NvbG9yOmMsaXNSZWN0VGV4dDohMH0pLGkudGV4dD1vLmdldFNoYWxsb3coInNob3ciKT9IKGEuZ2V0Rm9ybWF0dGVkTGFiZWwoZSwibm9ybWFsIiksR2cocixlKSk6bnVsbCx0JiZzVChpLHQpLGl9LHN0eWxlRW1waGFzaXM6ZnVuY3Rpb24odCxlKXtudWxsPT1lJiYoZT1zKSxnKGUpO3ZhciBpPWwuZ2V0TW9kZWwocUkpLmdldEl0ZW1TdHlsZSgpLG49dD9yVCh0LGgpOmg7cmV0dXJuIFFzKGksbixudWxsLHtpc1JlY3RUZXh0OiEwfSwhMCksaS50ZXh0PW4uZ2V0U2hhbGxvdygic2hvdyIpP1ooYS5nZXRGb3JtYXR0ZWRMYWJlbChlLCJlbXBoYXNpcyIpLGEuZ2V0Rm9ybWF0dGVkTGFiZWwoZSwibm9ybWFsIiksR2cocixlKSk6bnVsbCx0JiZzVChpLHQpLGl9LHZpc3VhbDpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lJiYoZT1zKSxyLmdldEl0ZW1WaXN1YWwoZSx0KX0sYmFyTGF5b3V0OmZ1bmN0aW9uKHQpe2lmKG4uZ2V0QmFzZUF4aXMpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1bXSxpPXQuYXhpcztpZigiY2F0ZWdvcnkiPT09aS50eXBlKXtmb3IodmFyIG49aS5nZXRCYW5kV2lkdGgoKSxvPTA7bzx0LmNvdW50O28rKyllLnB1c2goQyh7YmFuZFdpZHRoOm4sYXhpc0tleToiYXhpczAiLHN0YWNrSWQ6TXArb30sdCkpO3ZhciBhPUxwKGUpLHI9W107Zm9yKG89MDtvPHQuY291bnQ7bysrKXt2YXIgcz1hLmF4aXMwW01wK29dO3Mub2Zmc2V0Q2VudGVyPXMub2Zmc2V0K3Mud2lkdGgvMixyLnB1c2gocyl9cmV0dXJuIHJ9fShDKHtheGlzOm4uZ2V0QmFzZUF4aXMoKX0sdCkpfX0sY3VycmVudFNlcmllc0luZGljZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRDdXJyZW50U2VyaWVzSW5kaWNlcygpfSxmb250OmZ1bmN0aW9uKHQpe3JldHVybiBhbCh0LGUpfX0sby5hcGl8fHt9KSxmPXtjb250ZXh0Ont9LHNlcmllc0lkOmEuaWQsc2VyaWVzTmFtZTphLm5hbWUsc2VyaWVzSW5kZXg6YS5zZXJpZXNJbmRleCxjb29yZFN5czpvLmNvb3JkU3lzLGRhdGFJbnNpZGVMZW5ndGg6ci5jb3VudCgpLGVuY29kZTpmdW5jdGlvbihvKXt2YXIgYT17fTtyZXR1cm4gRShvLmRpbWVuc2lvbnMsZnVuY3Rpb24odCxlKXt2YXIgaT1vLmdldERpbWVuc2lvbkluZm8odCk7aWYoIWkuaXNFeHRyYUNvb3JkKXt2YXIgbj1pLmNvb3JkRGltOyhhW25dPWFbbl18fFtdKVtpLmNvb3JkRGltSW5kZXhdPWV9fSksYX0oYS5nZXREYXRhKCkpfSxwPSEwO3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBzPXQscD0hMCxpJiZpKEMoe2RhdGFJbmRleEluc2lkZTp0LGRhdGFJbmRleDpyLmdldFJhd0luZGV4KHQpLGFjdGlvblR5cGU6ZT9lLnR5cGU6bnVsbH0sZiksZCl9O2Z1bmN0aW9uIGcodCl7bnVsbD09dCYmKHQ9cykscCYmKGw9ci5nZXRJdGVtTW9kZWwodCksdT1sLmdldE1vZGVsKEtJKSxoPWwuZ2V0TW9kZWwoJEkpLGM9ci5nZXRJdGVtVmlzdWFsKHQsImNvbG9yIikscD0hMSl9fWZ1bmN0aW9uIGlUKHQsZSxpLG4sbyxhKXtyZXR1cm4odD1uVCh0LGUsaSxuLG8sYSwhMCkpJiZhLnNldEl0ZW1HcmFwaGljRWwoZSx0KSx0fWZ1bmN0aW9uIG5UKHQsZSxpLG4sbyxhLHIpe3ZhciBzPSFpLGw9KGk9aXx8e30pLnR5cGUsdT1pLnNoYXBlLGg9aS5zdHlsZTtpZih0JiYoc3x8bnVsbCE9bCYmbCE9PXQuX19jdXN0b21HcmFwaGljVHlwZXx8InBhdGgiPT09bCYmZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0Lmhhc093blByb3BlcnR5KCJwYXRoRGF0YSIpfHx0Lmhhc093blByb3BlcnR5KCJkIikpfSh1KSYmdVQodSkhPT10Ll9fY3VzdG9tUGF0aERhdGF8fCJpbWFnZSI9PT1sJiZoVChoLCJpbWFnZSIpJiZoLmltYWdlIT09dC5fX2N1c3RvbUltYWdlUGF0aHx8InRleHQiPT09bCYmaFQodSwidGV4dCIpJiZoLnRleHQhPT10Ll9fY3VzdG9tVGV4dCkmJihvLnJlbW92ZSh0KSx0PW51bGwpLCFzKXt2YXIgYz0hdDtyZXR1cm4gZnVuY3Rpb24oZSx0LGksbixvLGEscil7dmFyIHM9e30sbD1pLnN0eWxlfHx7fTtpZihpLnNoYXBlJiYocy5zaGFwZT1EKGkuc2hhcGUpKSxpLnBvc2l0aW9uJiYocy5wb3NpdGlvbj1pLnBvc2l0aW9uLnNsaWNlKCkpLGkuc2NhbGUmJihzLnNjYWxlPWkuc2NhbGUuc2xpY2UoKSksaS5vcmlnaW4mJihzLm9yaWdpbj1pLm9yaWdpbi5zbGljZSgpKSxpLnJvdGF0aW9uJiYocy5yb3RhdGlvbj1pLnJvdGF0aW9uKSwiaW1hZ2UiPT09ZS50eXBlJiZpLnN0eWxlKXt2YXIgdT1zLnN0eWxlPXt9O0UoWyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24odCl7dFQodCx1LGwsZS5zdHlsZSxhKX0pfWlmKCJ0ZXh0Ij09PWUudHlwZSYmaS5zdHlsZSl7dT1zLnN0eWxlPXt9O0UoWyJ4IiwieSJdLGZ1bmN0aW9uKHQpe3RUKHQsdSxsLGUuc3R5bGUsYSl9KSwhbC5oYXNPd25Qcm9wZXJ0eSgidGV4dEZpbGwiKSYmbC5maWxsJiYobC50ZXh0RmlsbD1sLmZpbGwpLCFsLmhhc093blByb3BlcnR5KCJ0ZXh0U3Ryb2tlIikmJmwuc3Ryb2tlJiYobC50ZXh0U3Ryb2tlPWwuc3Ryb2tlKX1pZigiZ3JvdXAiIT09ZS50eXBlJiYoZS51c2VTdHlsZShsKSxhKSl7ZS5zdHlsZS5vcGFjaXR5PTA7dmFyIGg9bC5vcGFjaXR5O251bGw9PWgmJihoPTEpLGxsKGUse3N0eWxlOntvcGFjaXR5Omh9fSxuLHQpfWE/ZS5hdHRyKHMpOnNsKGUscyxuLHQpLGkuaGFzT3duUHJvcGVydHkoInoyIikmJmUuYXR0cigiejIiLGkuejJ8fDApLGkuaGFzT3duUHJvcGVydHkoInNpbGVudCIpJiZlLmF0dHIoInNpbGVudCIsaS5zaWxlbnQpLGkuaGFzT3duUHJvcGVydHkoImludmlzaWJsZSIpJiZlLmF0dHIoImludmlzaWJsZSIsaS5pbnZpc2libGUpLGkuaGFzT3duUHJvcGVydHkoImlnbm9yZSIpJiZlLmF0dHIoImlnbm9yZSIsaS5pZ25vcmUpLGkuaGFzT3duUHJvcGVydHkoImluZm8iKSYmZS5hdHRyKCJpbmZvIixpLmluZm8pO3ZhciBjPWkuc3R5bGVFbXBoYXNpcztGcyhlLGMpLHImJmpzKGUsITEhPT1jKX0odD10fHxmdW5jdGlvbih0KXt2YXIgZSxpPXQudHlwZTtpZigicGF0aCI9PT1pKXt2YXIgbj10LnNoYXBlLG89bnVsbCE9bi53aWR0aCYmbnVsbCE9bi5oZWlnaHQ/e3g6bi54fHwwLHk6bi55fHwwLHdpZHRoOm4ud2lkdGgsaGVpZ2h0Om4uaGVpZ2h0fTpudWxsLGE9dVQobik7KGU9RHMoYSxudWxsLG8sbi5sYXlvdXR8fCJjZW50ZXIiKSkuX19jdXN0b21QYXRoRGF0YT1hfWVsc2UgaWYoImltYWdlIj09PWkpKGU9bmV3IHFuKHt9KSkuX19jdXN0b21JbWFnZVBhdGg9dC5zdHlsZS5pbWFnZTtlbHNlIGlmKCJ0ZXh0Ij09PWkpKGU9bmV3IEZyKHt9KSkuX19jdXN0b21UZXh0PXQuc3R5bGUudGV4dDtlbHNlIGlmKCJncm91cCI9PT1pKWU9bmV3IElpO2Vsc2V7aWYoImNvbXBvdW5kUGF0aCI9PT1pKXRocm93IG5ldyBFcnJvcignImNvbXBvdW5kUGF0aCIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7ZT1uZXcoQXMoaSkpfXJldHVybiBlLl9fY3VzdG9tR3JhcGhpY1R5cGU9aSxlLm5hbWU9dC5uYW1lLGV9KGkpLGUsaSxuLDAsYyxyKSwiZ3JvdXAiPT09bCYmZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1pLmNoaWxkcmVuLHI9YT9hLmxlbmd0aDowLHM9aS4kbWVyZ2VDaGlsZHJlbixsPSJieU5hbWUiPT09c3x8aS5kaWZmQ2hpbGRyZW5CeU5hbWUsdT0hMT09PXM7aWYoIXImJiFsJiYhdSlyZXR1cm47aWYobClyZXR1cm4gZnVuY3Rpb24odCl7bmV3IFRmKHQub2xkQ2hpbGRyZW4sdC5uZXdDaGlsZHJlbixvVCxvVCx0KS5hZGQoYVQpLnVwZGF0ZShhVCkucmVtb3ZlKGxUKS5leGVjdXRlKCl9KHtvbGRDaGlsZHJlbjp0LmNoaWxkcmVuKCl8fFtdLG5ld0NoaWxkcmVuOmF8fFtdLGRhdGFJbmRleDplLGFuaW1hdGFibGVNb2RlbDpuLGdyb3VwOnQsZGF0YTpvfSk7dSYmdC5yZW1vdmVBbGwoKTtmb3IodmFyIGg9MDtoPHI7aCsrKWFbaF0mJm5UKHQuY2hpbGRBdChoKSxlLGFbaF0sbix0LG8pfSh0LGUsaSxuLGEpLG8uYWRkKHQpLHR9fWZ1bmN0aW9uIG9UKHQsZSl7dmFyIGk9dCYmdC5uYW1lO3JldHVybiBudWxsIT1pP2k6SkkrZX1mdW5jdGlvbiBhVCh0LGUpe3ZhciBpPXRoaXMuY29udGV4dCxuPW51bGwhPXQ/aS5uZXdDaGlsZHJlblt0XTpudWxsO25UKG51bGwhPWU/aS5vbGRDaGlsZHJlbltlXTpudWxsLGkuZGF0YUluZGV4LG4saS5hbmltYXRhYmxlTW9kZWwsaS5ncm91cCxpLmRhdGEpfWZ1bmN0aW9uIHJUKGksdCl7dmFyIG49bmV3IElsKHt9LHQpO3JldHVybiBFKFlJLGZ1bmN0aW9uKHQsZSl7aS5oYXNPd25Qcm9wZXJ0eSh0KSYmKG4ub3B0aW9uW2VdPWlbdF0pfSksbn1mdW5jdGlvbiBzVCh0LGUpe2Zvcih2YXIgaSBpbiBlKSFlLmhhc093blByb3BlcnR5KGkpJiZZSS5oYXNPd25Qcm9wZXJ0eShpKXx8KHRbaV09ZVtpXSl9ZnVuY3Rpb24gbFQodCl7dmFyIGU9dGhpcy5jb250ZXh0LGk9ZS5vbGRDaGlsZHJlblt0XTtpJiZlLmdyb3VwLnJlbW92ZShpKX1mdW5jdGlvbiB1VCh0KXtyZXR1cm4gdCYmKHQucGF0aERhdGF8fHQuZCl9ZnVuY3Rpb24gaFQodCxlKXtyZXR1cm4gdCYmdC5oYXNPd25Qcm9wZXJ0eShlKX1mdW5jdGlvbiBjVCh0KXtyZXR1cm4gdC5nZXQoInN0YWNrIil8fCJfX2VjX3N0YWNrXyIrdC5zZXJpZXNJbmRleH1mdW5jdGlvbiBkVCh0LGUpe3JldHVybiBlLmRpbSt0Lm1vZGVsLmNvbXBvbmVudEluZGV4fWZ1bmN0aW9uIGZUKHQsZSl7RWcuY2FsbCh0aGlzLCJyYWRpdXMiLHQsZSksdGhpcy50eXBlPSJjYXRlZ29yeSJ9aWMuZXh0ZW5kKHt0eXBlOiJzZXJpZXMuY3VzdG9tIixkZXBlbmRlbmNpZXM6WyJncmlkIiwicG9sYXIiLCJnZW8iLCJzaW5nbGVBeGlzIiwiY2FsZW5kYXIiXSxkZWZhdWx0T3B0aW9uOntjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsemxldmVsOjAsejoyLGxlZ2VuZEhvdmVyTGluazohMCx1c2VUcmFuc2Zvcm06ITAsY2xpcDohMX0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHAodGhpcy5nZXRTb3VyY2UoKSx0aGlzKX0sZ2V0RGF0YVBhcmFtczpmdW5jdGlvbih0LGUsaSl7dmFyIG49aWMucHJvdG90eXBlLmdldERhdGFQYXJhbXMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpJiYobi5pbmZvPWkuaW5mbyksbn19KSxnYy5leHRlbmQoe3R5cGU6ImN1c3RvbSIsX2RhdGE6bnVsbCxyZW5kZXI6ZnVuY3Rpb24oaSx0LGUsbil7dmFyIG89dGhpcy5fZGF0YSxhPWkuZ2V0RGF0YSgpLHI9dGhpcy5ncm91cCxzPWVUKGksYSx0LGUpO2EuZGlmZihvKS5hZGQoZnVuY3Rpb24odCl7aVQobnVsbCx0LHModCxuKSxpLHIsYSl9KS51cGRhdGUoZnVuY3Rpb24odCxlKXtpVChvLmdldEl0ZW1HcmFwaGljRWwoZSksdCxzKHQsbiksaSxyLGEpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPW8uZ2V0SXRlbUdyYXBoaWNFbCh0KTtlJiZyLnJlbW92ZShlKX0pLmV4ZWN1dGUoKTt2YXIgbD1pLmdldCgiY2xpcCIsITApP3ltKGkuY29vcmRpbmF0ZVN5c3RlbSwhMSxpKTpudWxsO2w/ci5zZXRDbGlwUGF0aChsKTpyLnJlbW92ZUNsaXBQYXRoKCksdGhpcy5fZGF0YT1hfSxpbmNyZW1lbnRhbFByZXBhcmVSZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fZGF0YT1udWxsfSxpbmNyZW1lbnRhbFJlbmRlcjpmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhPWUuZ2V0RGF0YSgpLHI9ZVQoZSxhLGksbik7ZnVuY3Rpb24gcyh0KXt0LmlzR3JvdXB8fCh0LmluY3JlbWVudGFsPSEwLHQudXNlSG92ZXJMYXllcj0hMCl9Zm9yKHZhciBsPXQuc3RhcnQ7bDx0LmVuZDtsKyspe2lUKG51bGwsbCxyKGwsbyksZSx0aGlzLmdyb3VwLGEpLnRyYXZlcnNlKHMpfX0sZGlzcG9zZTpldCxmaWx0ZXJGb3JFeHBvc2VkRXZlbnQ6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89ZS5lbGVtZW50O2lmKG51bGw9PW98fGkubmFtZT09PW8pcmV0dXJuITA7Zm9yKDsoaT1pLnBhcmVudCkmJmkhPT10aGlzLmdyb3VwOylpZihpLm5hbWU9PT1vKXJldHVybiEwO3JldHVybiExfX0pLGZULnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZlQscG9pbnRUb0RhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wb2xhci5wb2ludFRvRGF0YSh0LGUpWyJyYWRpdXMiPT09dGhpcy5kaW0/MDoxXX0sZGF0YVRvUmFkaXVzOkVnLnByb3RvdHlwZS5kYXRhVG9Db29yZCxyYWRpdXNUb0RhdGE6RWcucHJvdG90eXBlLmNvb3JkVG9EYXRhfSx3KGZULEVnKTt2YXIgcFQ9Wm8oKTtmdW5jdGlvbiBnVCh0LGUpe2U9ZXx8WzAsMzYwXSxFZy5jYWxsKHRoaXMsImFuZ2xlIix0LGUpLHRoaXMudHlwZT0iY2F0ZWdvcnkifWdULnByb3RvdHlwZT17Y29uc3RydWN0b3I6Z1QscG9pbnRUb0RhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wb2xhci5wb2ludFRvRGF0YSh0LGUpWyJyYWRpdXMiPT09dGhpcy5kaW0/MDoxXX0sZGF0YVRvQW5nbGU6RWcucHJvdG90eXBlLmRhdGFUb0Nvb3JkLGFuZ2xlVG9EYXRhOkVnLnByb3RvdHlwZS5jb29yZFRvRGF0YSxjYWxjdWxhdGVDYXRlZ29yeUludGVydmFsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRMYWJlbE1vZGVsKCksZT10aGlzLnNjYWxlLGk9ZS5nZXRFeHRlbnQoKSxuPWUuY291bnQoKTtpZihpWzFdLWlbMF08MSlyZXR1cm4gMDt2YXIgbz1pWzBdLGE9dGhpcy5kYXRhVG9Db29yZChvKzEpLXRoaXMuZGF0YVRvQ29vcmQobykscj1NYXRoLmFicyhhKSxzPWNuKG8sdC5nZXRGb250KCksImNlbnRlciIsInRvcCIpLGw9TWF0aC5tYXgocy5oZWlnaHQsNykvcjtpc05hTihsKSYmKGw9MS8wKTt2YXIgdT1NYXRoLm1heCgwLE1hdGguZmxvb3IobCkpLGg9cFQodGhpcy5tb2RlbCksYz1oLmxhc3RBdXRvSW50ZXJ2YWwsZD1oLmxhc3RUaWNrQ291bnQ7cmV0dXJuIG51bGwhPWMmJm51bGwhPWQmJk1hdGguYWJzKGMtdSk8PTEmJk1hdGguYWJzKGQtbik8PTEmJnU8Yz91PWM6KGgubGFzdFRpY2tDb3VudD1uLGgubGFzdEF1dG9JbnRlcnZhbD11KSx1fX0sdyhnVCxFZyk7ZnVuY3Rpb24gbVQodCl7dGhpcy5uYW1lPXR8fCIiLHRoaXMuY3g9MCx0aGlzLmN5PTAsdGhpcy5fcmFkaXVzQXhpcz1uZXcgZlQsdGhpcy5fYW5nbGVBeGlzPW5ldyBnVCx0aGlzLl9yYWRpdXNBeGlzLnBvbGFyPXRoaXMuX2FuZ2xlQXhpcy5wb2xhcj10aGlzfW1ULnByb3RvdHlwZT17dHlwZToicG9sYXIiLGF4aXNQb2ludGVyRW5hYmxlZDohMCxjb25zdHJ1Y3RvcjptVCxkaW1lbnNpb25zOlsicmFkaXVzIiwiYW5nbGUiXSxtb2RlbDpudWxsLGNvbnRhaW5Qb2ludDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnBvaW50VG9Db29yZCh0KTtyZXR1cm4gdGhpcy5fcmFkaXVzQXhpcy5jb250YWluKGVbMF0pJiZ0aGlzLl9hbmdsZUF4aXMuY29udGFpbihlWzFdKX0sY29udGFpbkRhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1c0F4aXMuY29udGFpbkRhdGEodFswXSkmJnRoaXMuX2FuZ2xlQXhpcy5jb250YWluRGF0YSh0WzFdKX0sZ2V0QXhpczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1siXyIrdCsiQXhpcyJdfSxnZXRBeGVzOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuX3JhZGl1c0F4aXMsdGhpcy5fYW5nbGVBeGlzXX0sZ2V0QXhlc0J5U2NhbGU6ZnVuY3Rpb24odCl7dmFyIGU9W10saT10aGlzLl9hbmdsZUF4aXMsbj10aGlzLl9yYWRpdXNBeGlzO3JldHVybiBpLnNjYWxlLnR5cGU9PT10JiZlLnB1c2goaSksbi5zY2FsZS50eXBlPT09dCYmZS5wdXNoKG4pLGV9LGdldEFuZ2xlQXhpczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmdsZUF4aXN9LGdldFJhZGl1c0F4aXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaXVzQXhpc30sZ2V0T3RoZXJBeGlzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2FuZ2xlQXhpcztyZXR1cm4gdD09PWU/dGhpcy5fcmFkaXVzQXhpczplfSxnZXRCYXNlQXhpczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEF4ZXNCeVNjYWxlKCJvcmRpbmFsIilbMF18fHRoaXMuZ2V0QXhlc0J5U2NhbGUoInRpbWUiKVswXXx8dGhpcy5nZXRBbmdsZUF4aXMoKX0sZ2V0VG9vbHRpcEF4ZXM6ZnVuY3Rpb24odCl7dmFyIGU9bnVsbCE9dCYmImF1dG8iIT09dD90aGlzLmdldEF4aXModCk6dGhpcy5nZXRCYXNlQXhpcygpO3JldHVybntiYXNlQXhlczpbZV0sb3RoZXJBeGVzOlt0aGlzLmdldE90aGVyQXhpcyhlKV19fSxkYXRhVG9Qb2ludDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvb3JkVG9Qb2ludChbdGhpcy5fcmFkaXVzQXhpcy5kYXRhVG9SYWRpdXModFswXSxlKSx0aGlzLl9hbmdsZUF4aXMuZGF0YVRvQW5nbGUodFsxXSxlKV0pfSxwb2ludFRvRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMucG9pbnRUb0Nvb3JkKHQpO3JldHVyblt0aGlzLl9yYWRpdXNBeGlzLnJhZGl1c1RvRGF0YShpWzBdLGUpLHRoaXMuX2FuZ2xlQXhpcy5hbmdsZVRvRGF0YShpWzFdLGUpXX0scG9pbnRUb0Nvb3JkOmZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0tdGhpcy5jeCxpPXRbMV0tdGhpcy5jeSxuPXRoaXMuZ2V0QW5nbGVBeGlzKCksbz1uLmdldEV4dGVudCgpLGE9TWF0aC5taW4ob1swXSxvWzFdKSxyPU1hdGgubWF4KG9bMF0sb1sxXSk7bi5pbnZlcnNlP2E9ci0zNjA6cj1hKzM2MDt2YXIgcz1NYXRoLnNxcnQoZSplK2kqaSk7ZS89cyxpLz1zO2Zvcih2YXIgbD1NYXRoLmF0YW4yKC1pLGUpL01hdGguUEkqMTgwLHU9bDxhPzE6LTE7bDxhfHxyPGw7KWwrPTM2MCp1O3JldHVybltzLGxdfSxjb29yZFRvUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxpPXRbMV0vMTgwKk1hdGguUEk7cmV0dXJuW01hdGguY29zKGkpKmUrdGhpcy5jeCwtTWF0aC5zaW4oaSkqZSt0aGlzLmN5XX0sZ2V0QXJlYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0QW5nbGVBeGlzKCksZT10aGlzLmdldFJhZGl1c0F4aXMoKS5nZXRFeHRlbnQoKS5zbGljZSgpO2VbMF0+ZVsxXSYmZS5yZXZlcnNlKCk7dmFyIGk9dC5nZXRFeHRlbnQoKSxuPU1hdGguUEkvMTgwO3JldHVybntjeDp0aGlzLmN4LGN5OnRoaXMuY3kscjA6ZVswXSxyOmVbMV0sc3RhcnRBbmdsZTotaVswXSpuLGVuZEFuZ2xlOi1pWzFdKm4sY2xvY2t3aXNlOnQuaW52ZXJzZSxjb250YWluOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC10aGlzLmN4LG49ZS10aGlzLmN5LG89aSppK24qbixhPXRoaXMucixyPXRoaXMucjA7cmV0dXJuIG88PWEqYSYmcipyPD1vfX19fTt2YXIgdlQ9VHUuZXh0ZW5kKHt0eXBlOiJwb2xhckF4aXMiLGF4aXM6bnVsbCxnZXRDb29yZFN5c01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWNNb2RlbC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJwb2xhciIsaW5kZXg6dGhpcy5vcHRpb24ucG9sYXJJbmRleCxpZDp0aGlzLm9wdGlvbi5wb2xhcklkfSlbMF19fSk7bSh2VC5wcm90b3R5cGUsc2cpO3ZhciB5VD17c3BsaXROdW1iZXI6NX07ZnVuY3Rpb24geFQodCxlKXtyZXR1cm4gZS50eXBlfHwoZS5kYXRhPyJjYXRlZ29yeSI6InZhbHVlIil9ZnVuY3Rpb24gX1QodCxlKXt2YXIgaT10aGlzLG49aS5nZXRBbmdsZUF4aXMoKSxvPWkuZ2V0UmFkaXVzQXhpcygpO2lmKG4uc2NhbGUuc2V0RXh0ZW50KDEvMCwtMS8wKSxvLnNjYWxlLnNldEV4dGVudCgxLzAsLTEvMCksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe2lmKHQuY29vcmRpbmF0ZVN5c3RlbT09PWkpe3ZhciBlPXQuZ2V0RGF0YSgpO0UoZS5tYXBEaW1lbnNpb24oInJhZGl1cyIsITApLGZ1bmN0aW9uKHQpe28uc2NhbGUudW5pb25FeHRlbnRGcm9tRGF0YShlLHVwKGUsdCkpfSksRShlLm1hcERpbWVuc2lvbigiYW5nbGUiLCEwKSxmdW5jdGlvbih0KXtuLnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoZSx1cChlLHQpKX0pfX0pLGVnKG4uc2NhbGUsbi5tb2RlbCksZWcoby5zY2FsZSxvLm1vZGVsKSwiY2F0ZWdvcnkiPT09bi50eXBlJiYhbi5vbkJhbmQpe3ZhciBhPW4uZ2V0RXh0ZW50KCkscj0zNjAvbi5zY2FsZS5jb3VudCgpO24uaW52ZXJzZT9hWzFdKz1yOmFbMV0tPXIsbi5zZXRFeHRlbnQoYVswXSxhWzFdKX19ZnVuY3Rpb24gd1QodCxlKXtpZih0LnR5cGU9ZS5nZXQoInR5cGUiKSx0LnNjYWxlPWlnKGUpLHQub25CYW5kPWUuZ2V0KCJib3VuZGFyeUdhcCIpJiYiY2F0ZWdvcnkiPT09dC50eXBlLHQuaW52ZXJzZT1lLmdldCgiaW52ZXJzZSIpLCJhbmdsZUF4aXMiPT09ZS5tYWluVHlwZSl7dC5pbnZlcnNlXj1lLmdldCgiY2xvY2t3aXNlIik7dmFyIGk9ZS5nZXQoInN0YXJ0QW5nbGUiKTt0LnNldEV4dGVudChpLGkrKHQuaW52ZXJzZT8tMzYwOjM2MCkpfShlLmF4aXM9dCkubW9kZWw9ZX1PbSgiYW5nbGUiLHZULHhULHtzdGFydEFuZ2xlOjkwLGNsb2Nrd2lzZTohMCxzcGxpdE51bWJlcjoxMixheGlzTGFiZWw6e3JvdGF0ZTohMX19KSxPbSgicmFkaXVzIix2VCx4VCx5VCksd2Yoe3R5cGU6InBvbGFyIixkZXBlbmRlbmNpZXM6WyJwb2xhckF4aXMiLCJhbmdsZUF4aXMiXSxjb29yZGluYXRlU3lzdGVtOm51bGwsZmluZEF4aXNNb2RlbDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdGhpcy5lY01vZGVsLmVhY2hDb21wb25lbnQodCxmdW5jdGlvbih0KXt0LmdldENvb3JkU3lzTW9kZWwoKT09PXRoaXMmJihlPXQpfSx0aGlzKSxlfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjAsY2VudGVyOlsiNTAlIiwiNTAlIl0scmFkaXVzOiI4MCUifX0pLG5oLnJlZ2lzdGVyKCJwb2xhciIse2RpbWVuc2lvbnM6bVQucHJvdG90eXBlLmRpbWVuc2lvbnMsY3JlYXRlOmZ1bmN0aW9uKGkscyl7dmFyIGw9W107cmV0dXJuIGkuZWFjaENvbXBvbmVudCgicG9sYXIiLGZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IG1UKGUpO2kudXBkYXRlPV9UO3ZhciBuPWkuZ2V0UmFkaXVzQXhpcygpLG89aS5nZXRBbmdsZUF4aXMoKSxhPXQuZmluZEF4aXNNb2RlbCgicmFkaXVzQXhpcyIpLHI9dC5maW5kQXhpc01vZGVsKCJhbmdsZUF4aXMiKTt3VChuLGEpLHdUKG8sciksZnVuY3Rpb24odCxlLGkpe3ZhciBuPWUuZ2V0KCJjZW50ZXIiKSxvPWkuZ2V0V2lkdGgoKSxhPWkuZ2V0SGVpZ2h0KCk7dC5jeD1QbChuWzBdLG8pLHQuY3k9UGwoblsxXSxhKTt2YXIgcj10LmdldFJhZGl1c0F4aXMoKSxzPU1hdGgubWluKG8sYSkvMixsPWUuZ2V0KCJyYWRpdXMiKTtudWxsPT1sP2w9WzAsIjEwMCUiXTprKGwpfHwobD1bMCxsXSksbD1bUGwobFswXSxzKSxQbChsWzFdLHMpXSxyLmludmVyc2U/ci5zZXRFeHRlbnQobFsxXSxsWzBdKTpyLnNldEV4dGVudChsWzBdLGxbMV0pfShpLHQscyksbC5wdXNoKGkpLCh0LmNvb3JkaW5hdGVTeXN0ZW09aSkubW9kZWw9dH0pLGkuZWFjaFNlcmllcyhmdW5jdGlvbih0KXtpZigicG9sYXIiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSl7dmFyIGU9aS5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJwb2xhciIsaW5kZXg6dC5nZXQoInBvbGFySW5kZXgiKSxpZDp0LmdldCgicG9sYXJJZCIpfSlbMF07dC5jb29yZGluYXRlU3lzdGVtPWUuY29vcmRpbmF0ZVN5c3RlbX19KSxsfX0pO3ZhciBiVD1bImF4aXNMaW5lIiwiYXhpc0xhYmVsIiwiYXhpc1RpY2siLCJtaW5vclRpY2siLCJzcGxpdExpbmUiLCJtaW5vclNwbGl0TGluZSIsInNwbGl0QXJlYSJdO2Z1bmN0aW9uIFNUKHQsZSxpKXtlWzFdPmVbMF0mJihlPWUuc2xpY2UoKS5yZXZlcnNlKCkpO3ZhciBuPXQuY29vcmRUb1BvaW50KFtlWzBdLGldKSxvPXQuY29vcmRUb1BvaW50KFtlWzFdLGldKTtyZXR1cm57eDE6blswXSx5MTpuWzFdLHgyOm9bMF0seTI6b1sxXX19ZnVuY3Rpb24gTVQodCl7cmV0dXJuIHQuZ2V0UmFkaXVzQXhpcygpLmludmVyc2U/MDoxfWZ1bmN0aW9uIElUKHQpe3ZhciBlPXRbMF0saT10W3QubGVuZ3RoLTFdO2UmJmkmJk1hdGguYWJzKE1hdGguYWJzKGUuY29vcmQtaS5jb29yZCktMzYwKTwxZS00JiZ0LnBvcCgpfWh2LmV4dGVuZCh7dHlwZToiYW5nbGVBeGlzIixheGlzUG9pbnRlckNsYXNzOiJQb2xhckF4aXNQb2ludGVyIixyZW5kZXI6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLGUuZ2V0KCJzaG93Iikpe3ZhciBpPWUuYXhpcyxuPWkucG9sYXIsbz1uLmdldFJhZGl1c0F4aXMoKS5nZXRFeHRlbnQoKSxhPWkuZ2V0VGlja3NDb29yZHMoKSxyPWkuZ2V0TWlub3JUaWNrc0Nvb3JkcygpLHM9TihpLmdldFZpZXdMYWJlbHMoKSxmdW5jdGlvbih0KXtyZXR1cm4odD1EKHQpKS5jb29yZD1pLmRhdGFUb0Nvb3JkKHQudGlja1ZhbHVlKSx0fSk7SVQocyksSVQoYSksRShiVCxmdW5jdGlvbih0KXshZS5nZXQodCsiLnNob3ciKXx8aS5zY2FsZS5pc0JsYW5rKCkmJiJheGlzTGluZSIhPT10fHx0aGlzWyJfIit0XShlLG4sYSxyLG8scyl9LHRoaXMpfX0sX2F4aXNMaW5lOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGEscj10LmdldE1vZGVsKCJheGlzTGluZS5saW5lU3R5bGUiKSxzPU1UKGUpLGw9cz8wOjE7KGE9MD09PW9bbF0/bmV3IEhyKHtzaGFwZTp7Y3g6ZS5jeCxjeTplLmN5LHI6b1tzXX0sc3R5bGU6ci5nZXRMaW5lU3R5bGUoKSx6MjoxLHNpbGVudDohMH0pOm5ldyBYcih7c2hhcGU6e2N4OmUuY3gsY3k6ZS5jeSxyOm9bc10scjA6b1tsXX0sc3R5bGU6ci5nZXRMaW5lU3R5bGUoKSx6MjoxLHNpbGVudDohMH0pKS5zdHlsZS5maWxsPW51bGwsdGhpcy5ncm91cC5hZGQoYSl9LF9heGlzVGljazpmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhPXQuZ2V0TW9kZWwoImF4aXNUaWNrIikscj0oYS5nZXQoImluc2lkZSIpPy0xOjEpKmEuZ2V0KCJsZW5ndGgiKSxzPW9bTVQoZSldLGw9TihpLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgb3Moe3NoYXBlOlNUKGUsW3MscytyXSx0LmNvb3JkKX0pfSk7dGhpcy5ncm91cC5hZGQoa3MobCx7c3R5bGU6QyhhLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSx7c3Ryb2tlOnQuZ2V0KCJheGlzTGluZS5saW5lU3R5bGUuY29sb3IiKX0pfSkpfSxfbWlub3JUaWNrOmZ1bmN0aW9uKHQsZSxpLG4sbyl7aWYobi5sZW5ndGgpe2Zvcih2YXIgYT10LmdldE1vZGVsKCJheGlzVGljayIpLHI9dC5nZXRNb2RlbCgibWlub3JUaWNrIikscz0oYS5nZXQoImluc2lkZSIpPy0xOjEpKnIuZ2V0KCJsZW5ndGgiKSxsPW9bTVQoZSldLHU9W10saD0wO2g8bi5sZW5ndGg7aCsrKWZvcih2YXIgYz0wO2M8bltoXS5sZW5ndGg7YysrKXUucHVzaChuZXcgb3Moe3NoYXBlOlNUKGUsW2wsbCtzXSxuW2hdW2NdLmNvb3JkKX0pKTt0aGlzLmdyb3VwLmFkZChrcyh1LHtzdHlsZTpDKHIuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLEMoYS5nZXRMaW5lU3R5bGUoKSx7c3Ryb2tlOnQuZ2V0KCJheGlzTGluZS5saW5lU3R5bGUuY29sb3IiKX0pKX0pKX19LF9heGlzTGFiZWw6ZnVuY3Rpb24oYyxkLHQsZSxmLGkpe3ZhciBwPWMuZ2V0Q2F0ZWdvcmllcyghMCksZz1jLmdldE1vZGVsKCJheGlzTGFiZWwiKSxtPWcuZ2V0KCJtYXJnaW4iKSx2PWMuZ2V0KCJ0cmlnZ2VyRXZlbnQiKTtFKGksZnVuY3Rpb24odCxlKXt2YXIgaT1nLG49dC50aWNrVmFsdWUsbz1mW01UKGQpXSxhPWQuY29vcmRUb1BvaW50KFtvK20sdC5jb29yZF0pLHI9ZC5jeCxzPWQuY3ksbD1NYXRoLmFicyhhWzBdLXIpL288LjM/ImNlbnRlciI6YVswXT5yPyJsZWZ0IjoicmlnaHQiLHU9TWF0aC5hYnMoYVsxXS1zKS9vPC4zPyJtaWRkbGUiOmFbMV0+cz8idG9wIjoiYm90dG9tIjtwJiZwW25dJiZwW25dLnRleHRTdHlsZSYmKGk9bmV3IElsKHBbbl0udGV4dFN0eWxlLGcsZy5lY01vZGVsKSk7dmFyIGg9bmV3IEZyKHtzaWxlbnQ6WW0uaXNMYWJlbFNpbGVudChjKX0pO3RoaXMuZ3JvdXAuYWRkKGgpLFFzKGguc3R5bGUsaSx7eDphWzBdLHk6YVsxXSx0ZXh0RmlsbDppLmdldFRleHRDb2xvcigpfHxjLmdldCgiYXhpc0xpbmUubGluZVN0eWxlLmNvbG9yIiksdGV4dDp0LmZvcm1hdHRlZExhYmVsLHRleHRBbGlnbjpsLHRleHRWZXJ0aWNhbEFsaWduOnV9KSx2JiYoaC5ldmVudERhdGE9WW0ubWFrZUF4aXNFdmVudERhdGFCYXNlKGMpLGguZXZlbnREYXRhLnRhcmdldFR5cGU9ImF4aXNMYWJlbCIsaC5ldmVudERhdGEudmFsdWU9dC5yYXdMYWJlbCl9LHRoaXMpfSxfc3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9dC5nZXRNb2RlbCgic3BsaXRMaW5lIikuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLHI9YS5nZXQoImNvbG9yIikscz0wO3I9ciBpbnN0YW5jZW9mIEFycmF5P3I6W3JdO2Zvcih2YXIgbD1bXSx1PTA7dTxpLmxlbmd0aDt1Kyspe3ZhciBoPXMrKyVyLmxlbmd0aDtsW2hdPWxbaF18fFtdLGxbaF0ucHVzaChuZXcgb3Moe3NoYXBlOlNUKGUsbyxpW3VdLmNvb3JkKX0pKX1mb3IodT0wO3U8bC5sZW5ndGg7dSsrKXRoaXMuZ3JvdXAuYWRkKGtzKGxbdV0se3N0eWxlOkMoe3N0cm9rZTpyW3Ulci5sZW5ndGhdfSxhLmdldExpbmVTdHlsZSgpKSxzaWxlbnQ6ITAsejp0LmdldCgieiIpfSkpfSxfbWlub3JTcGxpdExpbmU6ZnVuY3Rpb24odCxlLGksbixvKXtpZihuLmxlbmd0aCl7Zm9yKHZhciBhPXQuZ2V0TW9kZWwoIm1pbm9yU3BsaXRMaW5lIikuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLHI9W10scz0wO3M8bi5sZW5ndGg7cysrKWZvcih2YXIgbD0wO2w8bltzXS5sZW5ndGg7bCsrKXIucHVzaChuZXcgb3Moe3NoYXBlOlNUKGUsbyxuW3NdW2xdLmNvb3JkKX0pKTt0aGlzLmdyb3VwLmFkZChrcyhyLHtzdHlsZTphLmdldExpbmVTdHlsZSgpLHNpbGVudDohMCx6OnQuZ2V0KCJ6Iil9KSl9fSxfc3BsaXRBcmVhOmZ1bmN0aW9uKHQsZSxpLG4sbyl7aWYoaS5sZW5ndGgpe3ZhciBhPXQuZ2V0TW9kZWwoInNwbGl0QXJlYSIpLmdldE1vZGVsKCJhcmVhU3R5bGUiKSxyPWEuZ2V0KCJjb2xvciIpLHM9MDtyPXIgaW5zdGFuY2VvZiBBcnJheT9yOltyXTtmb3IodmFyIGw9W10sdT1NYXRoLlBJLzE4MCxoPS1pWzBdLmNvb3JkKnUsYz1NYXRoLm1pbihvWzBdLG9bMV0pLGQ9TWF0aC5tYXgob1swXSxvWzFdKSxmPXQuZ2V0KCJjbG9ja3dpc2UiKSxwPTE7cDxpLmxlbmd0aDtwKyspe3ZhciBnPXMrKyVyLmxlbmd0aDtsW2ddPWxbZ118fFtdLGxbZ10ucHVzaChuZXcgVXIoe3NoYXBlOntjeDplLmN4LGN5OmUuY3kscjA6YyxyOmQsc3RhcnRBbmdsZTpoLGVuZEFuZ2xlOi1pW3BdLmNvb3JkKnUsY2xvY2t3aXNlOmZ9LHNpbGVudDohMH0pKSxoPS1pW3BdLmNvb3JkKnV9Zm9yKHA9MDtwPGwubGVuZ3RoO3ArKyl0aGlzLmdyb3VwLmFkZChrcyhsW3BdLHtzdHlsZTpDKHtmaWxsOnJbcCVyLmxlbmd0aF19LGEuZ2V0QXJlYVN0eWxlKCkpLHNpbGVudDohMH0pKX19fSk7dmFyIFRUPVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSxBVD1bInNwbGl0TGluZSIsInNwbGl0QXJlYSIsIm1pbm9yU3BsaXRMaW5lIl07aHYuZXh0ZW5kKHt0eXBlOiJyYWRpdXNBeGlzIixheGlzUG9pbnRlckNsYXNzOiJQb2xhckF4aXNQb2ludGVyIixyZW5kZXI6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLGUuZ2V0KCJzaG93Iikpe3ZhciBpPWUuYXhpcyxuPWkucG9sYXIsbz1uLmdldEFuZ2xlQXhpcygpLGE9aS5nZXRUaWNrc0Nvb3JkcygpLHI9aS5nZXRNaW5vclRpY2tzQ29vcmRzKCkscz1vLmdldEV4dGVudCgpWzBdLGw9aS5nZXRFeHRlbnQoKSx1PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm57cG9zaXRpb246W3QuY3gsdC5jeV0scm90YXRpb246aS8xODAqTWF0aC5QSSxsYWJlbERpcmVjdGlvbjotMSx0aWNrRGlyZWN0aW9uOi0xLG5hbWVEaXJlY3Rpb246MSxsYWJlbFJvdGF0ZTplLmdldE1vZGVsKCJheGlzTGFiZWwiKS5nZXQoInJvdGF0ZSIpLHoyOjF9fShuLGUscyksaD1uZXcgWW0oZSx1KTtFKFRULGguYWRkLGgpLHRoaXMuZ3JvdXAuYWRkKGguZ2V0R3JvdXAoKSksRShBVCxmdW5jdGlvbih0KXtlLmdldCh0KyIuc2hvdyIpJiYhaS5zY2FsZS5pc0JsYW5rKCkmJnRoaXNbIl8iK3RdKGUsbixzLGwsYSxyKX0sdGhpcyl9fSxfc3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9dC5nZXRNb2RlbCgic3BsaXRMaW5lIikuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLHI9YS5nZXQoImNvbG9yIikscz0wO3I9ciBpbnN0YW5jZW9mIEFycmF5P3I6W3JdO2Zvcih2YXIgbD1bXSx1PTA7dTxvLmxlbmd0aDt1Kyspe3ZhciBoPXMrKyVyLmxlbmd0aDtsW2hdPWxbaF18fFtdLGxbaF0ucHVzaChuZXcgSHIoe3NoYXBlOntjeDplLmN4LGN5OmUuY3kscjpvW3VdLmNvb3JkfX0pKX1mb3IodT0wO3U8bC5sZW5ndGg7dSsrKXRoaXMuZ3JvdXAuYWRkKGtzKGxbdV0se3N0eWxlOkMoe3N0cm9rZTpyW3Ulci5sZW5ndGhdLGZpbGw6bnVsbH0sYS5nZXRMaW5lU3R5bGUoKSksc2lsZW50OiEwfSkpfSxfbWlub3JTcGxpdExpbmU6ZnVuY3Rpb24odCxlLGksbixvLGEpe2lmKGEubGVuZ3RoKXtmb3IodmFyIHI9dC5nZXRNb2RlbCgibWlub3JTcGxpdExpbmUiKS5nZXRNb2RlbCgibGluZVN0eWxlIikscz1bXSxsPTA7bDxhLmxlbmd0aDtsKyspZm9yKHZhciB1PTA7dTxhW2xdLmxlbmd0aDt1Kyspcy5wdXNoKG5ldyBIcih7c2hhcGU6e2N4OmUuY3gsY3k6ZS5jeSxyOmFbbF1bdV0uY29vcmR9fSkpO3RoaXMuZ3JvdXAuYWRkKGtzKHMse3N0eWxlOkMoe2ZpbGw6bnVsbH0sci5nZXRMaW5lU3R5bGUoKSksc2lsZW50OiEwfSkpfX0sX3NwbGl0QXJlYTpmdW5jdGlvbih0LGUsaSxuLG8pe2lmKG8ubGVuZ3RoKXt2YXIgYT10LmdldE1vZGVsKCJzcGxpdEFyZWEiKS5nZXRNb2RlbCgiYXJlYVN0eWxlIikscj1hLmdldCgiY29sb3IiKSxzPTA7cj1yIGluc3RhbmNlb2YgQXJyYXk/cjpbcl07Zm9yKHZhciBsPVtdLHU9b1swXS5jb29yZCxoPTE7aDxvLmxlbmd0aDtoKyspe3ZhciBjPXMrKyVyLmxlbmd0aDtsW2NdPWxbY118fFtdLGxbY10ucHVzaChuZXcgVXIoe3NoYXBlOntjeDplLmN4LGN5OmUuY3kscjA6dSxyOm9baF0uY29vcmQsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjIqTWF0aC5QSX0sc2lsZW50OiEwfSkpLHU9b1toXS5jb29yZH1mb3IoaD0wO2g8bC5sZW5ndGg7aCsrKXRoaXMuZ3JvdXAuYWRkKGtzKGxbaF0se3N0eWxlOkMoe2ZpbGw6cltoJXIubGVuZ3RoXX0sYS5nZXRBcmVhU3R5bGUoKSksc2lsZW50OiEwfSkpfX19KTt2YXIgRFQ9c0kuZXh0ZW5kKHttYWtlRWxPcHRpb246ZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1pLmF4aXM7ImFuZ2xlIj09PWEuZGltJiYodGhpcy5hbmltYXRpb25UaHJlc2hvbGQ9TWF0aC5QSS8xOCk7dmFyIHIscz1hLnBvbGFyLGw9cy5nZXRPdGhlckF4aXMoYSkuZ2V0RXh0ZW50KCk7cj1hWyJkYXRhVG8iK3V1KGEuZGltKV0oZSk7dmFyIHU9bi5nZXQoInR5cGUiKTtpZih1JiYibm9uZSIhPT11KXt2YXIgaD1kSShuKSxjPUNUW3VdKGEscyxyLGwsaCk7Yy5zdHlsZT1oLHQuZ3JhcGhpY0tleT1jLnR5cGUsdC5wb2ludGVyPWN9dmFyIGQ9bi5nZXQoImxhYmVsLm1hcmdpbiIpO2ZJKHQsaSxuLG8sZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1lLmF4aXMscj1hLmRhdGFUb0Nvb3JkKHQpLHM9bi5nZXRBbmdsZUF4aXMoKS5nZXRFeHRlbnQoKVswXTtzPXMvMTgwKk1hdGguUEk7dmFyIGwsdSxoLGM9bi5nZXRSYWRpdXNBeGlzKCkuZ2V0RXh0ZW50KCk7aWYoInJhZGl1cyI9PT1hLmRpbSl7dmFyIGQ9ZWUoKTtyZShkLGQscyksYWUoZCxkLFtuLmN4LG4uY3ldKSxsPWhsKFtyLC1vXSxkKTt2YXIgZj1lLmdldE1vZGVsKCJheGlzTGFiZWwiKS5nZXQoInJvdGF0ZSIpfHwwLHA9WW0uaW5uZXJUZXh0TGF5b3V0KHMsZipNYXRoLlBJLzE4MCwtMSk7dT1wLnRleHRBbGlnbixoPXAudGV4dFZlcnRpY2FsQWxpZ259ZWxzZXt2YXIgZz1jWzFdO2w9bi5jb29yZFRvUG9pbnQoW2crbyxyXSk7dmFyIG09bi5jeCx2PW4uY3k7dT1NYXRoLmFicyhsWzBdLW0pL2c8LjM/ImNlbnRlciI6bFswXT5tPyJsZWZ0IjoicmlnaHQiLGg9TWF0aC5hYnMobFsxXS12KS9nPC4zPyJtaWRkbGUiOmxbMV0+dj8idG9wIjoiYm90dG9tIn1yZXR1cm57cG9zaXRpb246bCxhbGlnbjp1LHZlcnRpY2FsQWxpZ246aH19KGUsaSwwLHMsZCkpfX0pO3ZhciBDVD17bGluZTpmdW5jdGlvbih0LGUsaSxuLG8pe3JldHVybiJhbmdsZSI9PT10LmRpbT97dHlwZToiTGluZSIsc2hhcGU6dkkoZS5jb29yZFRvUG9pbnQoW25bMF0saV0pLGUuY29vcmRUb1BvaW50KFtuWzFdLGldKSl9Ont0eXBlOiJDaXJjbGUiLHNoYXBlOntjeDplLmN4LGN5OmUuY3kscjppfX19LHNoYWRvdzpmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhPU1hdGgubWF4KDEsdC5nZXRCYW5kV2lkdGgoKSkscj1NYXRoLlBJLzE4MDtyZXR1cm4iYW5nbGUiPT09dC5kaW0/e3R5cGU6IlNlY3RvciIsc2hhcGU6eEkoZS5jeCxlLmN5LG5bMF0sblsxXSwoLWktYS8yKSpyLChhLzItaSkqcil9Ont0eXBlOiJTZWN0b3IiLHNoYXBlOnhJKGUuY3gsZS5jeSxpLWEvMixpK2EvMiwwLDIqTWF0aC5QSSl9fX07ZnVuY3Rpb24gTFQobix0KXt0LnVwZGF0ZT0idXBkYXRlVmlldyIsZ2YodCxmdW5jdGlvbih0LGUpe3ZhciBpPXt9O3JldHVybiBlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJnZW8iLHF1ZXJ5OnR9LGZ1bmN0aW9uKGUpe2Vbbl0odC5uYW1lKSxFKGUuY29vcmRpbmF0ZVN5c3RlbS5yZWdpb25zLGZ1bmN0aW9uKHQpe2lbdC5uYW1lXT1lLmlzU2VsZWN0ZWQodC5uYW1lKXx8ITF9KX0pLHtzZWxlY3RlZDppLG5hbWU6dC5uYW1lfX0pfWh2LnJlZ2lzdGVyQXhpc1BvaW50ZXJDbGFzcygiUG9sYXJBeGlzUG9pbnRlciIsRFQpLHZmKFQoZnVuY3Rpb24odCxlLGkpe3ZhciBOPXt9LE89ZnVuY3Rpb24odCl7dmFyIGc9e307RSh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXREYXRhKCksbj10LmNvb3JkaW5hdGVTeXN0ZW0sbz1uLmdldEJhc2VBeGlzKCksYT1kVChuLG8pLHI9by5nZXRFeHRlbnQoKSxzPSJjYXRlZ29yeSI9PT1vLnR5cGU/by5nZXRCYW5kV2lkdGgoKTpNYXRoLmFicyhyWzFdLXJbMF0pL2kuY291bnQoKSxsPWdbYV18fHtiYW5kV2lkdGg6cyxyZW1haW5lZFdpZHRoOnMsYXV0b1dpZHRoQ291bnQ6MCxjYXRlZ29yeUdhcDoiMjAlIixnYXA6IjMwJSIsc3RhY2tzOnt9fSx1PWwuc3RhY2tzO2dbYV09bDt2YXIgaD1jVCh0KTt1W2hdfHxsLmF1dG9XaWR0aENvdW50KyssdVtoXT11W2hdfHx7d2lkdGg6MCxtYXhXaWR0aDowfTt2YXIgYz1QbCh0LmdldCgiYmFyV2lkdGgiKSxzKSxkPVBsKHQuZ2V0KCJiYXJNYXhXaWR0aCIpLHMpLGY9dC5nZXQoImJhckdhcCIpLHA9dC5nZXQoImJhckNhdGVnb3J5R2FwIik7YyYmIXVbaF0ud2lkdGgmJihjPU1hdGgubWluKGwucmVtYWluZWRXaWR0aCxjKSx1W2hdLndpZHRoPWMsbC5yZW1haW5lZFdpZHRoLT1jKSxkJiYodVtoXS5tYXhXaWR0aD1kKSxudWxsIT1mJiYobC5nYXA9ZiksbnVsbCE9cCYmKGwuY2F0ZWdvcnlHYXA9cCl9KTt2YXIgZD17fTtyZXR1cm4gRShnLGZ1bmN0aW9uKHQsaSl7ZFtpXT17fTt2YXIgZT10LnN0YWNrcyxuPXQuYmFuZFdpZHRoLG89UGwodC5jYXRlZ29yeUdhcCxuKSxhPVBsKHQuZ2FwLDEpLHI9dC5yZW1haW5lZFdpZHRoLHM9dC5hdXRvV2lkdGhDb3VudCxsPShyLW8pLyhzKyhzLTEpKmEpO2w9TWF0aC5tYXgobCwwKSxFKGUsZnVuY3Rpb24odCxlKXt2YXIgaT10Lm1heFdpZHRoO2kmJmk8bCYmKGk9TWF0aC5taW4oaSxyKSx0LndpZHRoJiYoaT1NYXRoLm1pbihpLHQud2lkdGgpKSxyLT1pLHQud2lkdGg9aSxzLS0pfSksbD0oci1vKS8ocysocy0xKSphKSxsPU1hdGgubWF4KGwsMCk7dmFyIHUsaD0wO0UoZSxmdW5jdGlvbih0LGUpe3Qud2lkdGh8fCh0LndpZHRoPWwpLGgrPSh1PXQpLndpZHRoKigxK2EpfSksdSYmKGgtPXUud2lkdGgqYSk7dmFyIGM9LWgvMjtFKGUsZnVuY3Rpb24odCxlKXtkW2ldW2VdPWRbaV1bZV18fHtvZmZzZXQ6Yyx3aWR0aDp0LndpZHRofSxjKz10LndpZHRoKigxK2EpfSl9KSxkfShNKGUuZ2V0U2VyaWVzQnlUeXBlKHQpLGZ1bmN0aW9uKHQpe3JldHVybiFlLmlzU2VyaWVzRmlsdGVyZWQodCkmJnQuY29vcmRpbmF0ZVN5c3RlbSYmInBvbGFyIj09PXQuY29vcmRpbmF0ZVN5c3RlbS50eXBlfSkpO2UuZWFjaFNlcmllc0J5VHlwZSh0LGZ1bmN0aW9uKHQpe2lmKCJwb2xhciI9PT10LmNvb3JkaW5hdGVTeXN0ZW0udHlwZSl7dmFyIGU9dC5nZXREYXRhKCksaT10LmNvb3JkaW5hdGVTeXN0ZW0sbj1pLmdldEJhc2VBeGlzKCksbz1kVChpLG4pLGE9Y1QodCkscj1PW29dW2FdLHM9ci5vZmZzZXQsbD1yLndpZHRoLHU9aS5nZXRPdGhlckF4aXMobiksaD10LmNvb3JkaW5hdGVTeXN0ZW0uY3gsYz10LmNvb3JkaW5hdGVTeXN0ZW0uY3ksZD10LmdldCgiYmFyTWluSGVpZ2h0Iil8fDAsZj10LmdldCgiYmFyTWluQW5nbGUiKXx8MDtOW2FdPU5bYV18fFtdO2Zvcih2YXIgcD1lLm1hcERpbWVuc2lvbih1LmRpbSksZz1lLm1hcERpbWVuc2lvbihuLmRpbSksbT1scChlLHApLHY9InJhZGl1cyIhPT1uLmRpbXx8IXQuZ2V0KCJyb3VuZENhcCIsITApLHk9dS5nZXRFeHRlbnQoKVswXSx4PTAsXz1lLmNvdW50KCk7eDxfO3grKyl7dmFyIHc9ZS5nZXQocCx4KSxiPWUuZ2V0KGcseCk7aWYoIWlzTmFOKHcpKXt2YXIgUyxNLEksVCxBPTA8PXc/InAiOiJuIixEPXk7aWYobSYmKE5bYV1bYl18fChOW2FdW2JdPXtwOnksbjp5fSksRD1OW2FdW2JdW0FdKSwicmFkaXVzIj09PXUuZGltKXt2YXIgQz11LmRhdGFUb1JhZGl1cyh3KS15LEw9bi5kYXRhVG9BbmdsZShiKTtNYXRoLmFicyhDKTxkJiYoQz0oQzwwPy0xOjEpKmQpLE09KFM9RCkrQyxUPShJPUwtcyktbCxtJiYoTlthXVtiXVtBXT1NKX1lbHNle3ZhciBrPXUuZGF0YVRvQW5nbGUodyx2KS15LFA9bi5kYXRhVG9SYWRpdXMoYik7TWF0aC5hYnMoayk8ZiYmKGs9KGs8MD8tMToxKSpmKSxNPShTPVArcykrbCxUPShJPUQpK2ssbSYmKE5bYV1bYl1bQV09VCl9ZS5zZXRJdGVtTGF5b3V0KHgse2N4OmgsY3k6YyxyMDpTLHI6TSxzdGFydEFuZ2xlOi1JKk1hdGguUEkvMTgwLGVuZEFuZ2xlOi1UKk1hdGguUEkvMTgwfSl9fX19LHRoaXMpfSwiYmFyIikpLGJmKHt0eXBlOiJwb2xhciJ9KSxiKFR1LmV4dGVuZCh7dHlwZToiZ2VvIixjb29yZGluYXRlU3lzdGVtOm51bGwsbGF5b3V0TW9kZToiYm94Iixpbml0OmZ1bmN0aW9uKHQpe1R1LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx6byh0LCJsYWJlbCIsWyJzaG93Il0pfSxvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb24saT10aGlzO3QucmVnaW9ucz1heC5nZXRGaWxsZWRSZWdpb25zKHQucmVnaW9ucyx0Lm1hcCx0Lm5hbWVNYXApLHRoaXMuX29wdGlvbk1vZGVsTWFwPVModC5yZWdpb25zfHxbXSxmdW5jdGlvbih0LGUpe3JldHVybiBlLm5hbWUmJnQuc2V0KGUubmFtZSxuZXcgSWwoZSxpKSksdH0sUSgpKSx0aGlzLnVwZGF0ZVNlbGVjdGVkTWFwKHQucmVnaW9ucyl9LGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6MCxzaG93OiEwLGxlZnQ6ImNlbnRlciIsdG9wOiJjZW50ZXIiLGFzcGVjdFNjYWxlOm51bGwsc2lsZW50OiExLG1hcDoiIixib3VuZGluZ0Nvb3JkczpudWxsLGNlbnRlcjpudWxsLHpvb206MSxzY2FsZUxpbWl0Om51bGwsbGFiZWw6e3Nob3c6ITEsY29sb3I6IiMwMDAifSxpdGVtU3R5bGU6e2JvcmRlcldpZHRoOi41LGJvcmRlckNvbG9yOiIjNDQ0Iixjb2xvcjoiI2VlZSJ9LGVtcGhhc2lzOntsYWJlbDp7c2hvdzohMCxjb2xvcjoicmdiKDEwMCwwLDApIn0saXRlbVN0eWxlOntjb2xvcjoicmdiYSgyNTUsMjE1LDAsMC44KSJ9fSxyZWdpb25zOltdfSxnZXRSZWdpb25Nb2RlbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb3B0aW9uTW9kZWxNYXAuZ2V0KHQpfHxuZXcgSWwobnVsbCx0aGlzLHRoaXMuZWNNb2RlbCl9LGdldEZvcm1hdHRlZExhYmVsOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRSZWdpb25Nb2RlbCh0KS5nZXQoImxhYmVsIisoIm5vcm1hbCI9PT1lPyIuIjplKyIuIikrImZvcm1hdHRlciIpLG49e25hbWU6dH07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGk/KG4uc3RhdHVzPWUsaShuKSk6InN0cmluZyI9PXR5cGVvZiBpP2kucmVwbGFjZSgie2F9IixudWxsIT10P3Q6IiIpOnZvaWQgMH0sc2V0Wm9vbTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbi56b29tPXR9LHNldENlbnRlcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbi5jZW50ZXI9dH19KSxWdiksYmYoe3R5cGU6ImdlbyIsaW5pdDpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBVeShlLCEwKTt0aGlzLl9tYXBEcmF3PWksdGhpcy5ncm91cC5hZGQoaS5ncm91cCl9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXtpZighbnx8Imdlb1RvZ2dsZVNlbGVjdCIhPT1uLnR5cGV8fG4uZnJvbSE9PXRoaXMudWlkKXt2YXIgbz10aGlzLl9tYXBEcmF3O3QuZ2V0KCJzaG93Iik/by5kcmF3KHQsZSxpLHRoaXMsbik6dGhpcy5fbWFwRHJhdy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLmdyb3VwLnNpbGVudD10LmdldCgic2lsZW50Iil9fSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKX19KSxMVCgidG9nZ2xlU2VsZWN0ZWQiLHt0eXBlOiJnZW9Ub2dnbGVTZWxlY3QiLGV2ZW50OiJnZW9zZWxlY3RjaGFuZ2VkIn0pLExUKCJzZWxlY3QiLHt0eXBlOiJnZW9TZWxlY3QiLGV2ZW50OiJnZW9zZWxlY3RlZCJ9KSxMVCgidW5TZWxlY3QiLHt0eXBlOiJnZW9VblNlbGVjdCIsZXZlbnQ6Imdlb3Vuc2VsZWN0ZWQifSk7ZnVuY3Rpb24ga1QodCxlLGkpe3RoaXMuX21vZGVsPXR9ZnVuY3Rpb24gUFQodCxlLGksbil7dmFyIG89aS5jYWxlbmRhck1vZGVsLGE9aS5zZXJpZXNNb2RlbCxyPW8/by5jb29yZGluYXRlU3lzdGVtOmE/YS5jb29yZGluYXRlU3lzdGVtOm51bGw7cmV0dXJuIHI9PT10aGlzP3JbdF0obik6bnVsbH1rVC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmtULHR5cGU6ImNhbGVuZGFyIixkaW1lbnNpb25zOlsidGltZSIsInZhbHVlIl0sZ2V0RGltZW5zaW9uc0luZm86ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6InRpbWUiLHR5cGU6InRpbWUifSwidmFsdWUiXX0sZ2V0UmFuZ2VJbmZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlSW5mb30sZ2V0TW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWx9LGdldFJlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdH0sZ2V0Q2VsbFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N3fSxnZXRDZWxsSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NofSxnZXRPcmllbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50fSxnZXRGaXJzdERheU9mV2VlazpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXJzdERheU9mV2Vla30sZ2V0RGF0ZUluZm86ZnVuY3Rpb24odCl7dmFyIGU9KHQ9SGwodCkpLmdldEZ1bGxZZWFyKCksaT10LmdldE1vbnRoKCkrMTtpPWk8MTA/IjAiK2k6aTt2YXIgbj10LmdldERhdGUoKTtuPW48MTA/IjAiK246bjt2YXIgbz10LmdldERheSgpO3JldHVybnt5OmUsbTppLGQ6bixkYXk6bz1NYXRoLmFicygobys3LXRoaXMuZ2V0Rmlyc3REYXlPZldlZWsoKSklNyksdGltZTp0LmdldFRpbWUoKSxmb3JtYXRlZERhdGU6ZSsiLSIraSsiLSIrbixkYXRlOnR9fSxnZXROZXh0TkRheTpmdW5jdGlvbih0LGUpe3JldHVybiAwPT09KGU9ZXx8MCl8fCh0PW5ldyBEYXRlKHRoaXMuZ2V0RGF0ZUluZm8odCkudGltZSkpLnNldERhdGUodC5nZXREYXRlKCkrZSksdGhpcy5nZXREYXRlSW5mbyh0KX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7dGhpcy5fZmlyc3REYXlPZldlZWs9K3RoaXMuX21vZGVsLmdldE1vZGVsKCJkYXlMYWJlbCIpLmdldCgiZmlyc3REYXkiKSx0aGlzLl9vcmllbnQ9dGhpcy5fbW9kZWwuZ2V0KCJvcmllbnQiKSx0aGlzLl9saW5lV2lkdGg9dGhpcy5fbW9kZWwuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpLmxpbmVXaWR0aHx8MCx0aGlzLl9yYW5nZUluZm89dGhpcy5fZ2V0UmFuZ2VJbmZvKHRoaXMuX2luaXRSYW5nZU9wdGlvbigpKTt2YXIgaT10aGlzLl9yYW5nZUluZm8ud2Vla3N8fDEsbj1bIndpZHRoIiwiaGVpZ2h0Il0sbz10aGlzLl9tb2RlbC5nZXQoImNlbGxTaXplIikuc2xpY2UoKSxhPXRoaXMuX21vZGVsLmdldEJveExheW91dFBhcmFtcygpLHI9Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50P1tpLDddOls3LGldO0UoWzAsMV0sZnVuY3Rpb24odCl7dShvLHQpJiYoYVtuW3RdXT1vW3RdKnJbdF0pfSk7dmFyIHM9e3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0sbD10aGlzLl9yZWN0PXZ1KGEscyk7ZnVuY3Rpb24gdSh0LGUpe3JldHVybiBudWxsIT10W2VdJiYiYXV0byIhPT10W2VdfUUoWzAsMV0sZnVuY3Rpb24odCl7dShvLHQpfHwob1t0XT1sW25bdF1dL3JbdF0pfSksdGhpcy5fc3c9b1swXSx0aGlzLl9zaD1vWzFdfSxkYXRhVG9Qb2ludDpmdW5jdGlvbih0LGUpe2sodCkmJih0PXRbMF0pLG51bGw9PWUmJihlPSEwKTt2YXIgaT10aGlzLmdldERhdGVJbmZvKHQpLG49dGhpcy5fcmFuZ2VJbmZvLG89aS5mb3JtYXRlZERhdGU7aWYoZSYmIShpLnRpbWU+PW4uc3RhcnQudGltZSYmaS50aW1lPG4uZW5kLnRpbWUrODY0ZTUpKXJldHVybltOYU4sTmFOXTt2YXIgYT1pLmRheSxyPXRoaXMuX2dldFJhbmdlSW5mbyhbbi5zdGFydC50aW1lLG9dKS5udGhXZWVrO3JldHVybiJ2ZXJ0aWNhbCI9PT10aGlzLl9vcmllbnQ/W3RoaXMuX3JlY3QueCthKnRoaXMuX3N3K3RoaXMuX3N3LzIsdGhpcy5fcmVjdC55K3IqdGhpcy5fc2grdGhpcy5fc2gvMl06W3RoaXMuX3JlY3QueCtyKnRoaXMuX3N3K3RoaXMuX3N3LzIsdGhpcy5fcmVjdC55K2EqdGhpcy5fc2grdGhpcy5fc2gvMl19LHBvaW50VG9EYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucG9pbnRUb0RhdGUodCk7cmV0dXJuIGUmJmUudGltZX0sZGF0YVRvUmVjdDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZGF0YVRvUG9pbnQodCxlKTtyZXR1cm57Y29udGVudFNoYXBlOnt4OmlbMF0tKHRoaXMuX3N3LXRoaXMuX2xpbmVXaWR0aCkvMix5OmlbMV0tKHRoaXMuX3NoLXRoaXMuX2xpbmVXaWR0aCkvMix3aWR0aDp0aGlzLl9zdy10aGlzLl9saW5lV2lkdGgsaGVpZ2h0OnRoaXMuX3NoLXRoaXMuX2xpbmVXaWR0aH0sY2VudGVyOmksdGw6W2lbMF0tdGhpcy5fc3cvMixpWzFdLXRoaXMuX3NoLzJdLHRyOltpWzBdK3RoaXMuX3N3LzIsaVsxXS10aGlzLl9zaC8yXSxicjpbaVswXSt0aGlzLl9zdy8yLGlbMV0rdGhpcy5fc2gvMl0sYmw6W2lbMF0tdGhpcy5fc3cvMixpWzFdK3RoaXMuX3NoLzJdfX0scG9pbnRUb0RhdGU6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5mbG9vcigodFswXS10aGlzLl9yZWN0LngpL3RoaXMuX3N3KSsxLGk9TWF0aC5mbG9vcigodFsxXS10aGlzLl9yZWN0LnkpL3RoaXMuX3NoKSsxLG49dGhpcy5fcmFuZ2VJbmZvLnJhbmdlO3JldHVybiJ2ZXJ0aWNhbCI9PT10aGlzLl9vcmllbnQ/dGhpcy5fZ2V0RGF0ZUJ5V2Vla3NBbmREYXkoaSxlLTEsbik6dGhpcy5fZ2V0RGF0ZUJ5V2Vla3NBbmREYXkoZSxpLTEsbil9LGNvbnZlcnRUb1BpeGVsOlQoUFQsImRhdGFUb1BvaW50IiksY29udmVydEZyb21QaXhlbDpUKFBULCJwb2ludFRvRGF0YSIpLF9pbml0UmFuZ2VPcHRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tb2RlbC5nZXQoInJhbmdlIiksZT10O2lmKGsoZSkmJjE9PT1lLmxlbmd0aCYmKGU9ZVswXSksL15cZHs0fSQvLnRlc3QoZSkmJih0PVtlKyItMDEtMDEiLGUrIi0xMi0zMSJdKSwvXlxkezR9W1wvfC1dXGR7MSwyfSQvLnRlc3QoZSkpe3ZhciBpPXRoaXMuZ2V0RGF0ZUluZm8oZSksbj1pLmRhdGU7bi5zZXRNb250aChuLmdldE1vbnRoKCkrMSk7dmFyIG89dGhpcy5nZXROZXh0TkRheShuLC0xKTt0PVtpLmZvcm1hdGVkRGF0ZSxvLmZvcm1hdGVkRGF0ZV19L15cZHs0fVtcL3wtXVxkezEsMn1bXC98LV1cZHsxLDJ9JC8udGVzdChlKSYmKHQ9W2UsZV0pO3ZhciBhPXRoaXMuX2dldFJhbmdlSW5mbyh0KTtyZXR1cm4gYS5zdGFydC50aW1lPmEuZW5kLnRpbWUmJnQucmV2ZXJzZSgpLHR9LF9nZXRSYW5nZUluZm86ZnVuY3Rpb24odCl7dmFyIGU7KHQ9W3RoaXMuZ2V0RGF0ZUluZm8odFswXSksdGhpcy5nZXREYXRlSW5mbyh0WzFdKV0pWzBdLnRpbWU+dFsxXS50aW1lJiYoZT0hMCx0LnJldmVyc2UoKSk7dmFyIGk9TWF0aC5mbG9vcih0WzFdLnRpbWUvODY0ZTUpLU1hdGguZmxvb3IodFswXS50aW1lLzg2NGU1KSsxLG49bmV3IERhdGUodFswXS50aW1lKSxvPW4uZ2V0RGF0ZSgpLGE9dFsxXS5kYXRlLmdldERhdGUoKTtpZihuLnNldERhdGUobytpLTEpLG4uZ2V0RGF0ZSgpIT09YSlmb3IodmFyIHI9MDxuLmdldFRpbWUoKS10WzFdLnRpbWU/MTotMTtuLmdldERhdGUoKSE9PWEmJjA8KG4uZ2V0VGltZSgpLXRbMV0udGltZSkqcjspaS09cixuLnNldERhdGUobytpLTEpO3ZhciBzPU1hdGguZmxvb3IoKGkrdFswXS5kYXkrNikvNyksbD1lPzEtczpzLTE7cmV0dXJuIGUmJnQucmV2ZXJzZSgpLHtyYW5nZTpbdFswXS5mb3JtYXRlZERhdGUsdFsxXS5mb3JtYXRlZERhdGVdLHN0YXJ0OnRbMF0sZW5kOnRbMV0sYWxsRGF5Omksd2Vla3M6cyxudGhXZWVrOmwsZndlZWs6dFswXS5kYXksbHdlZWs6dFsxXS5kYXl9fSxfZ2V0RGF0ZUJ5V2Vla3NBbmREYXk6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2dldFJhbmdlSW5mbyhpKTtpZih0Pm4ud2Vla3N8fDA9PT10JiZlPG4uZndlZWt8fHQ9PT1uLndlZWtzJiZlPm4ubHdlZWspcmV0dXJuITE7dmFyIG89NyoodC0xKS1uLmZ3ZWVrK2UsYT1uZXcgRGF0ZShuLnN0YXJ0LnRpbWUpO3JldHVybiBhLnNldERhdGUobi5zdGFydC5kK28pLHRoaXMuZ2V0RGF0ZUluZm8oYSl9fSxrVC5kaW1lbnNpb25zPWtULnByb3RvdHlwZS5kaW1lbnNpb25zLGtULmdldERpbWVuc2lvbnNJbmZvPWtULnByb3RvdHlwZS5nZXREaW1lbnNpb25zSW5mbyxrVC5jcmVhdGU9ZnVuY3Rpb24oaSxuKXt2YXIgbz1bXTtyZXR1cm4gaS5lYWNoQ29tcG9uZW50KCJjYWxlbmRhciIsZnVuY3Rpb24odCl7dmFyIGU9bmV3IGtUKHQsaSxuKTtvLnB1c2goZSksdC5jb29yZGluYXRlU3lzdGVtPWV9KSxpLmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7ImNhbGVuZGFyIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikmJih0LmNvb3JkaW5hdGVTeXN0ZW09b1t0LmdldCgiY2FsZW5kYXJJbmRleCIpfHwwXSl9KSxvfSxuaC5yZWdpc3RlcigiY2FsZW5kYXIiLGtUKTt2YXIgTlQ9VHUuZXh0ZW5kKHt0eXBlOiJjYWxlbmRhciIsY29vcmRpbmF0ZVN5c3RlbTpudWxsLGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6MixsZWZ0OjgwLHRvcDo2MCxjZWxsU2l6ZToyMCxvcmllbnQ6Imhvcml6b250YWwiLHNwbGl0TGluZTp7c2hvdzohMCxsaW5lU3R5bGU6e2NvbG9yOiIjMDAwIix3aWR0aDoxLHR5cGU6InNvbGlkIn19LGl0ZW1TdHlsZTp7Y29sb3I6IiNmZmYiLGJvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IiNjY2MifSxkYXlMYWJlbDp7c2hvdzohMCxmaXJzdERheTowLHBvc2l0aW9uOiJzdGFydCIsbWFyZ2luOiI1MCUiLG5hbWVNYXA6ImVuIixjb2xvcjoiIzAwMCJ9LG1vbnRoTGFiZWw6e3Nob3c6ITAscG9zaXRpb246InN0YXJ0IixtYXJnaW46NSxhbGlnbjoiY2VudGVyIixuYW1lTWFwOiJlbiIsZm9ybWF0dGVyOm51bGwsY29sb3I6IiMwMDAifSx5ZWFyTGFiZWw6e3Nob3c6ITAscG9zaXRpb246bnVsbCxtYXJnaW46MzAsZm9ybWF0dGVyOm51bGwsY29sb3I6IiNjY2MiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYiLGZvbnRXZWlnaHQ6ImJvbGRlciIsZm9udFNpemU6MjB9fSxpbml0OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPV91KHQpO05ULnN1cGVyQXBwbHkodGhpcywiaW5pdCIsYXJndW1lbnRzKSxPVCh0LG8pfSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0LGUpe05ULnN1cGVyQXBwbHkodGhpcywibWVyZ2VPcHRpb24iLGFyZ3VtZW50cyksT1QodGhpcy5vcHRpb24sdCl9fSk7ZnVuY3Rpb24gT1QodCxlKXt2YXIgaT10LmNlbGxTaXplO2soaSk/MT09PWkubGVuZ3RoJiYoaVsxXT1pWzBdKTppPXQuY2VsbFNpemU9W2ksaV07dmFyIG49TihbMCwxXSxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dFtwdVtlXVswXV18fG51bGwhPXRbcHVbZV1bMV1dJiZudWxsIT10W3B1W2VdWzJdXX0oZSx0KSYmKGlbdF09ImF1dG8iKSxudWxsIT1pW3RdJiYiYXV0byIhPT1pW3RdfSk7eHUodCxlLHt0eXBlOiJib3giLGlnbm9yZVNpemU6bn0pfXZhciBFVD17RU46WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxDTjpbIuS4gOaciCIsIuS6jOaciCIsIuS4ieaciCIsIuWbm+aciCIsIuS6lOaciCIsIuWFreaciCIsIuS4g+aciCIsIuWFq+aciCIsIuS5neaciCIsIuWNgeaciCIsIuWNgeS4gOaciCIsIuWNgeS6jOaciCJdfSx6VD17RU46WyJTIiwiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIl0sQ046WyLml6UiLCLkuIAiLCLkuowiLCLkuIkiLCLlm5siLCLkupQiLCLlha0iXX07YmYoe3R5cGU6ImNhbGVuZGFyIixfdGxwb2ludHM6bnVsbCxfYmxwb2ludHM6bnVsbCxfZmlyc3REYXlPZk1vbnRoOm51bGwsX2ZpcnN0RGF5UG9pbnRzOm51bGwscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLmdyb3VwO24ucmVtb3ZlQWxsKCk7dmFyIG89dC5jb29yZGluYXRlU3lzdGVtLGE9by5nZXRSYW5nZUluZm8oKSxyPW8uZ2V0T3JpZW50KCk7dGhpcy5fcmVuZGVyRGF5UmVjdCh0LGEsbiksdGhpcy5fcmVuZGVyTGluZXModCxhLHIsbiksdGhpcy5fcmVuZGVyWWVhclRleHQodCxhLHIsbiksdGhpcy5fcmVuZGVyTW9udGhUZXh0KHQscixuKSx0aGlzLl9yZW5kZXJXZWVrVGV4dCh0LGEscixuKX0sX3JlbmRlckRheVJlY3Q6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVTeXN0ZW0sbz10LmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSxhPW4uZ2V0Q2VsbFdpZHRoKCkscj1uLmdldENlbGxIZWlnaHQoKSxzPWUuc3RhcnQudGltZTtzPD1lLmVuZC50aW1lO3M9bi5nZXROZXh0TkRheShzLDEpLnRpbWUpe3ZhciBsPW4uZGF0YVRvUmVjdChbc10sITEpLnRsLHU9bmV3IGlzKHtzaGFwZTp7eDpsWzBdLHk6bFsxXSx3aWR0aDphLGhlaWdodDpyfSxjdXJzb3I6ImRlZmF1bHQiLHN0eWxlOm99KTtpLmFkZCh1KX19LF9yZW5kZXJMaW5lczpmdW5jdGlvbihpLHQsbixvKXt2YXIgYT10aGlzLHI9aS5jb29yZGluYXRlU3lzdGVtLHM9aS5nZXRNb2RlbCgic3BsaXRMaW5lLmxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLGw9aS5nZXQoInNwbGl0TGluZS5zaG93IiksZT1zLmxpbmVXaWR0aDt0aGlzLl90bHBvaW50cz1bXSx0aGlzLl9ibHBvaW50cz1bXSx0aGlzLl9maXJzdERheU9mTW9udGg9W10sdGhpcy5fZmlyc3REYXlQb2ludHM9W107Zm9yKHZhciB1PXQuc3RhcnQsaD0wO3UudGltZTw9dC5lbmQudGltZTtoKyspe2QodS5mb3JtYXRlZERhdGUpLDA9PT1oJiYodT1yLmdldERhdGVJbmZvKHQuc3RhcnQueSsiLSIrdC5zdGFydC5tKSk7dmFyIGM9dS5kYXRlO2Muc2V0TW9udGgoYy5nZXRNb250aCgpKzEpLHU9ci5nZXREYXRlSW5mbyhjKX1mdW5jdGlvbiBkKHQpe2EuX2ZpcnN0RGF5T2ZNb250aC5wdXNoKHIuZ2V0RGF0ZUluZm8odCkpLGEuX2ZpcnN0RGF5UG9pbnRzLnB1c2goci5kYXRhVG9SZWN0KFt0XSwhMSkudGwpO3ZhciBlPWEuX2dldExpbmVQb2ludHNPZk9uZVdlZWsoaSx0LG4pO2EuX3RscG9pbnRzLnB1c2goZVswXSksYS5fYmxwb2ludHMucHVzaChlW2UubGVuZ3RoLTFdKSxsJiZhLl9kcmF3U3BsaXRsaW5lKGUscyxvKX1kKHIuZ2V0TmV4dE5EYXkodC5lbmQudGltZSwxKS5mb3JtYXRlZERhdGUpLGwmJnRoaXMuX2RyYXdTcGxpdGxpbmUoYS5fZ2V0RWRnZXNQb2ludHMoYS5fdGxwb2ludHMsZSxuKSxzLG8pLGwmJnRoaXMuX2RyYXdTcGxpdGxpbmUoYS5fZ2V0RWRnZXNQb2ludHMoYS5fYmxwb2ludHMsZSxuKSxzLG8pfSxfZ2V0RWRnZXNQb2ludHM6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPVt0WzBdLnNsaWNlKCksdFt0Lmxlbmd0aC0xXS5zbGljZSgpXSxvPSJob3Jpem9udGFsIj09PWk/MDoxO3JldHVybiBuWzBdW29dPW5bMF1bb10tZS8yLG5bMV1bb109blsxXVtvXStlLzIsbn0sX2RyYXdTcGxpdGxpbmU6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPW5ldyBLcih7ejI6MjAsc2hhcGU6e3BvaW50czp0fSxzdHlsZTplfSk7aS5hZGQobil9LF9nZXRMaW5lUG9pbnRzT2ZPbmVXZWVrOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmNvb3JkaW5hdGVTeXN0ZW07ZT1uLmdldERhdGVJbmZvKGUpO2Zvcih2YXIgbz1bXSxhPTA7YTw3O2ErKyl7dmFyIHI9bi5nZXROZXh0TkRheShlLnRpbWUsYSkscz1uLmRhdGFUb1JlY3QoW3IudGltZV0sITEpO29bMipyLmRheV09cy50bCxvWzIqci5kYXkrMV09c1siaG9yaXpvbnRhbCI9PT1pPyJibCI6InRyIl19cmV0dXJuIG99LF9mb3JtYXR0ZXJMYWJlbDpmdW5jdGlvbih0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdD9hdSh0LGUpOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoZSk6ZS5uYW1lTWFwfSxfeWVhclRleHRQb3NpdGlvbkNvbnRyb2w6ZnVuY3Rpb24odCxlLGksbixvKXtlPWUuc2xpY2UoKTt2YXIgYT1bImNlbnRlciIsImJvdHRvbSJdOyJib3R0b20iPT09bj8oZVsxXSs9byxhPVsiY2VudGVyIiwidG9wIl0pOiJsZWZ0Ij09PW4/ZVswXS09bzoicmlnaHQiPT09bj8oZVswXSs9byxhPVsiY2VudGVyIiwidG9wIl0pOmVbMV0tPW87dmFyIHI9MDtyZXR1cm4ibGVmdCIhPT1uJiYicmlnaHQiIT09bnx8KHI9TWF0aC5QSS8yKSx7cm90YXRpb246cixwb3NpdGlvbjplLHN0eWxlOnt0ZXh0QWxpZ246YVswXSx0ZXh0VmVydGljYWxBbGlnbjphWzFdfX19LF9yZW5kZXJZZWFyVGV4dDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10LmdldE1vZGVsKCJ5ZWFyTGFiZWwiKTtpZihvLmdldCgic2hvdyIpKXt2YXIgYT1vLmdldCgibWFyZ2luIikscj1vLmdldCgicG9zaXRpb24iKTtyPXJ8fCgiaG9yaXpvbnRhbCIhPT1pPyJ0b3AiOiJsZWZ0Iik7dmFyIHM9W3RoaXMuX3RscG9pbnRzW3RoaXMuX3RscG9pbnRzLmxlbmd0aC0xXSx0aGlzLl9ibHBvaW50c1swXV0sbD0oc1swXVswXStzWzFdWzBdKS8yLHU9KHNbMF1bMV0rc1sxXVsxXSkvMixoPSJob3Jpem9udGFsIj09PWk/MDoxLGM9e3RvcDpbbCxzW2hdWzFdXSxib3R0b206W2wsc1sxLWhdWzFdXSxsZWZ0OltzWzEtaF1bMF0sdV0scmlnaHQ6W3NbaF1bMF0sdV19LGQ9ZS5zdGFydC55OytlLmVuZC55PitlLnN0YXJ0LnkmJihkPWQrIi0iK2UuZW5kLnkpO3ZhciBmPW8uZ2V0KCJmb3JtYXR0ZXIiKSxwPXtzdGFydDplLnN0YXJ0LnksZW5kOmUuZW5kLnksbmFtZU1hcDpkfSxnPXRoaXMuX2Zvcm1hdHRlckxhYmVsKGYscCksbT1uZXcgRnIoe3oyOjMwfSk7UXMobS5zdHlsZSxvLHt0ZXh0Omd9KSxtLmF0dHIodGhpcy5feWVhclRleHRQb3NpdGlvbkNvbnRyb2wobSxjW3JdLGkscixhKSksbi5hZGQobSl9fSxfbW9udGhUZXh0UG9zaXRpb25Db250cm9sOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9ImxlZnQiLHI9InRvcCIscz10WzBdLGw9dFsxXTtyZXR1cm4iaG9yaXpvbnRhbCI9PT1pPyhsKz1vLGUmJihhPSJjZW50ZXIiKSwic3RhcnQiPT09biYmKHI9ImJvdHRvbSIpKToocys9byxlJiYocj0ibWlkZGxlIiksInN0YXJ0Ij09PW4mJihhPSJyaWdodCIpKSx7eDpzLHk6bCx0ZXh0QWxpZ246YSx0ZXh0VmVydGljYWxBbGlnbjpyfX0sX3JlbmRlck1vbnRoVGV4dDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5nZXRNb2RlbCgibW9udGhMYWJlbCIpO2lmKG4uZ2V0KCJzaG93Iikpe3ZhciBvPW4uZ2V0KCJuYW1lTWFwIiksYT1uLmdldCgibWFyZ2luIikscj1uLmdldCgicG9zaXRpb24iKSxzPW4uZ2V0KCJhbGlnbiIpLGw9W3RoaXMuX3RscG9pbnRzLHRoaXMuX2JscG9pbnRzXTt6KG8pJiYobz1FVFtvLnRvVXBwZXJDYXNlKCldfHxbXSk7dmFyIHU9InN0YXJ0Ij09PXI/MDoxLGg9Imhvcml6b250YWwiPT09ZT8wOjE7YT0ic3RhcnQiPT09cj8tYTphO2Zvcih2YXIgYz0iY2VudGVyIj09PXMsZD0wO2Q8bFt1XS5sZW5ndGgtMTtkKyspe3ZhciBmPWxbdV1bZF0uc2xpY2UoKSxwPXRoaXMuX2ZpcnN0RGF5T2ZNb250aFtkXTtpZihjKXt2YXIgZz10aGlzLl9maXJzdERheVBvaW50c1tkXTtmW2hdPShnW2hdK2xbMF1bZCsxXVtoXSkvMn12YXIgbT1uLmdldCgiZm9ybWF0dGVyIiksdj1vWytwLm0tMV0seT17eXl5eTpwLnkseXk6KHAueSsiIikuc2xpY2UoMiksTU06cC5tLE06K3AubSxuYW1lTWFwOnZ9LHg9dGhpcy5fZm9ybWF0dGVyTGFiZWwobSx5KSxfPW5ldyBGcih7ejI6MzB9KTtMKFFzKF8uc3R5bGUsbix7dGV4dDp4fSksdGhpcy5fbW9udGhUZXh0UG9zaXRpb25Db250cm9sKGYsYyxlLHIsYSkpLGkuYWRkKF8pfX19LF93ZWVrVGV4dFBvc2l0aW9uQ29udHJvbDpmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhPSJjZW50ZXIiLHI9Im1pZGRsZSIscz10WzBdLGw9dFsxXSx1PSJzdGFydCI9PT1pO3JldHVybiJob3Jpem9udGFsIj09PWU/KHM9cytuKyh1PzE6LTEpKm9bMF0vMixhPXU/InJpZ2h0IjoibGVmdCIpOihsPWwrbisodT8xOi0xKSpvWzFdLzIscj11PyJib3R0b20iOiJ0b3AiKSx7eDpzLHk6bCx0ZXh0QWxpZ246YSx0ZXh0VmVydGljYWxBbGlnbjpyfX0sX3JlbmRlcldlZWtUZXh0OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXQuZ2V0TW9kZWwoImRheUxhYmVsIik7aWYoby5nZXQoInNob3ciKSl7dmFyIGE9dC5jb29yZGluYXRlU3lzdGVtLHI9by5nZXQoInBvc2l0aW9uIikscz1vLmdldCgibmFtZU1hcCIpLGw9by5nZXQoIm1hcmdpbiIpLHU9YS5nZXRGaXJzdERheU9mV2VlaygpO3oocykmJihzPXpUW3MudG9VcHBlckNhc2UoKV18fFtdKTt2YXIgaD1hLmdldE5leHRORGF5KGUuZW5kLnRpbWUsNy1lLmx3ZWVrKS50aW1lLGM9W2EuZ2V0Q2VsbFdpZHRoKCksYS5nZXRDZWxsSGVpZ2h0KCldO2w9UGwobCxjWyJob3Jpem9udGFsIj09PWk/MDoxXSksInN0YXJ0Ij09PXImJihoPWEuZ2V0TmV4dE5EYXkoZS5zdGFydC50aW1lLC0oNytlLmZ3ZWVrKSkudGltZSxsPS1sKTtmb3IodmFyIGQ9MDtkPDc7ZCsrKXt2YXIgZixwPWEuZ2V0TmV4dE5EYXkoaCxkKSxnPWEuZGF0YVRvUmVjdChbcC50aW1lXSwhMSkuY2VudGVyO2Y9TWF0aC5hYnMoKGQrdSklNyk7dmFyIG09bmV3IEZyKHt6MjozMH0pO0woUXMobS5zdHlsZSxvLHt0ZXh0OnNbZl19KSx0aGlzLl93ZWVrVGV4dFBvc2l0aW9uQ29udHJvbChnLGkscixsLGMpKSxuLmFkZChtKX19fX0pO3ZhciBSVD17cGF0aDpudWxsLGNvbXBvdW5kUGF0aDpudWxsLGdyb3VwOklpLGltYWdlOnFuLHRleHQ6RnJ9O2ZmKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ3JhcGhpYztrKGUpP2VbMF0mJmVbMF0uZWxlbWVudHM/dC5ncmFwaGljPVt0LmdyYXBoaWNbMF1dOnQuZ3JhcGhpYz1be2VsZW1lbnRzOmV9XTplJiYhZS5lbGVtZW50cyYmKHQuZ3JhcGhpYz1be2VsZW1lbnRzOltlXX1dKX0pO3ZhciBCVD13Zih7dHlwZToiZ3JhcGhpYyIsZGVmYXVsdE9wdGlvbjp7ZWxlbWVudHM6W10scGFyZW50SWQ6bnVsbH0sX2VsT3B0aW9uc1RvVXBkYXRlOm51bGwsbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24uZWxlbWVudHM7dGhpcy5vcHRpb24uZWxlbWVudHM9bnVsbCxCVC5zdXBlckFwcGx5KHRoaXMsIm1lcmdlT3B0aW9uIixhcmd1bWVudHMpLHRoaXMub3B0aW9uLmVsZW1lbnRzPWV9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbixuPShlP2k6dCkuZWxlbWVudHMsbz1pLmVsZW1lbnRzPWU/W106aS5lbGVtZW50cyxhPVtdO3RoaXMuX2ZsYXR0ZW4obixhKTt2YXIgcj1WbyhvLGEpO0dvKHIpO3ZhciBzPXRoaXMuX2VsT3B0aW9uc1RvVXBkYXRlPVtdO0UocixmdW5jdGlvbih0LGUpe3ZhciBpPXQub3B0aW9uO2kmJihzLnB1c2goaSksZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4aXN0O2lmKGUuaWQ9dC5rZXlJbmZvLmlkLCFlLnR5cGUmJmkmJihlLnR5cGU9aS50eXBlKSxudWxsPT1lLnBhcmVudElkKXt2YXIgbj1lLnBhcmVudE9wdGlvbjtuP2UucGFyZW50SWQ9bi5pZDppJiYoZS5wYXJlbnRJZD1pLnBhcmVudElkKX1lLnBhcmVudE9wdGlvbj1udWxsfSh0LGkpLGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1MKHt9LGkpLG89dFtlXSxhPWkuJGFjdGlvbnx8Im1lcmdlIjsibWVyZ2UiPT09YT9vPyhtKG8sbiwhMCkseHUobyxuLHtpZ25vcmVTaXplOiEwfSksd3UoaSxvKSk6dFtlXT1uOiJyZXBsYWNlIj09PWE/dFtlXT1uOiJyZW1vdmUiPT09YSYmbyYmKHRbZV09bnVsbCl9KG8sZSxpKSxmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybjt0Lmh2PWUuaHY9W0ZUKGUsWyJsZWZ0IiwicmlnaHQiXSksRlQoZSxbInRvcCIsImJvdHRvbSJdKV0sImdyb3VwIj09PXQudHlwZSYmKG51bGw9PXQud2lkdGgmJih0LndpZHRoPWUud2lkdGg9MCksbnVsbD09dC5oZWlnaHQmJih0LmhlaWdodD1lLmhlaWdodD0wKSl9KG9bZV0saSkpfSx0aGlzKTtmb3IodmFyIGw9by5sZW5ndGgtMTswPD1sO2wtLSludWxsPT1vW2xdP28uc3BsaWNlKGwsMSk6ZGVsZXRlIG9bbF0uJGFjdGlvbn0sX2ZsYXR0ZW46ZnVuY3Rpb24odCxpLG4pe0UodCxmdW5jdGlvbih0KXtpZih0KXtuJiYodC5wYXJlbnRPcHRpb249biksaS5wdXNoKHQpO3ZhciBlPXQuY2hpbGRyZW47Imdyb3VwIj09PXQudHlwZSYmZSYmdGhpcy5fZmxhdHRlbihlLGksdCksZGVsZXRlIHQuY2hpbGRyZW59fSx0aGlzKX0sdXNlRWxPcHRpb25zVG9VcGRhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lbE9wdGlvbnNUb1VwZGF0ZTtyZXR1cm4gdGhpcy5fZWxPcHRpb25zVG9VcGRhdGU9bnVsbCx0fX0pO2Z1bmN0aW9uIFZUKHQsZSxpLG4pe3ZhciBvPWkudHlwZSxhPW5ldyhSVC5oYXNPd25Qcm9wZXJ0eShvKT9SVFtvXTpBcyhvKSkoaSk7ZS5hZGQoYSksbi5zZXQodCxhKSxhLl9fZWNHcmFwaGljSWQ9dH1mdW5jdGlvbiBHVCh0LGUpe3ZhciBpPXQmJnQucGFyZW50O2kmJigiZ3JvdXAiPT09dC50eXBlJiZ0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpe0dUKHQsZSl9KSxlLnJlbW92ZUtleSh0Ll9fZWNHcmFwaGljSWQpLGkucmVtb3ZlKHQpKX1mdW5jdGlvbiBGVChlLHQpe3ZhciBpO3JldHVybiBFKHQsZnVuY3Rpb24odCl7bnVsbCE9ZVt0XSYmImF1dG8iIT09ZVt0XSYmKGk9ITApfSksaX1iZih7dHlwZToiZ3JhcGhpYyIsaW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuX2VsTWFwPVEoKSx0aGlzLl9sYXN0R3JhcGhpY01vZGVsfSxyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3QhPT10aGlzLl9sYXN0R3JhcGhpY01vZGVsJiZ0aGlzLl9jbGVhcigpLHRoaXMuX2xhc3RHcmFwaGljTW9kZWw9dCx0aGlzLl91cGRhdGVFbGVtZW50cyh0KSx0aGlzLl9yZWxvY2F0ZSh0LGkpfSxfdXBkYXRlRWxlbWVudHM6ZnVuY3Rpb24odSl7dmFyIHQ9dS51c2VFbE9wdGlvbnNUb1VwZGF0ZSgpO2lmKHQpe3ZhciBoPXRoaXMuX2VsTWFwLGM9dGhpcy5ncm91cDtFKHQsZnVuY3Rpb24odCl7dmFyIGU9dC4kYWN0aW9uLGk9dC5pZCxuPWguZ2V0KGkpLG89dC5wYXJlbnRJZCxhPW51bGwhPW8/aC5nZXQobyk6YyxyPXQuc3R5bGU7InRleHQiPT09dC50eXBlJiZyJiYodC5odiYmdC5odlsxXSYmKHIudGV4dFZlcnRpY2FsQWxpZ249ci50ZXh0QmFzZWxpbmU9bnVsbCksIXIuaGFzT3duUHJvcGVydHkoInRleHRGaWxsIikmJnIuZmlsbCYmKHIudGV4dEZpbGw9ci5maWxsKSwhci5oYXNPd25Qcm9wZXJ0eSgidGV4dFN0cm9rZSIpJiZyLnN0cm9rZSYmKHIudGV4dFN0cm9rZT1yLnN0cm9rZSkpO3ZhciBzPWZ1bmN0aW9uKGUpe3JldHVybiBlPUwoe30sZSksRShbImlkIiwicGFyZW50SWQiLCIkYWN0aW9uIiwiaHYiLCJib3VuZGluZyJdLmNvbmNhdChmdSksZnVuY3Rpb24odCl7ZGVsZXRlIGVbdF19KSxlfSh0KTtlJiYibWVyZ2UiIT09ZT8icmVwbGFjZSI9PT1lPyhHVChuLGgpLFZUKGksYSxzLGgpKToicmVtb3ZlIj09PWUmJkdUKG4saCk6bj9uLmF0dHIocyk6VlQoaSxhLHMsaCk7dmFyIGw9aC5nZXQoaSk7bCYmKGwuX19lY0dyYXBoaWNXaWR0aE9wdGlvbj10LndpZHRoLGwuX19lY0dyYXBoaWNIZWlnaHRPcHRpb249dC5oZWlnaHQsZnVuY3Rpb24odCxlKXt2YXIgaT10LmV2ZW50RGF0YTt0LnNpbGVudHx8dC5pZ25vcmV8fGl8fChpPXQuZXZlbnREYXRhPXtjb21wb25lbnRUeXBlOiJncmFwaGljIixjb21wb25lbnRJbmRleDplLmNvbXBvbmVudEluZGV4LG5hbWU6dC5uYW1lfSk7aSYmKGkuaW5mbz10LmluZm8pfShsLHUpKX0pfX0sX3JlbG9jYXRlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQub3B0aW9uLmVsZW1lbnRzLG49dGhpcy5ncm91cCxvPXRoaXMuX2VsTWFwLGE9ZS5nZXRXaWR0aCgpLHI9ZS5nZXRIZWlnaHQoKSxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBsPWlbc107aWYoKGg9by5nZXQobC5pZCkpJiZoLmlzR3JvdXApe3ZhciB1PShjPWgucGFyZW50KT09PW47aC5fX2VjR3JhcGhpY1dpZHRoPVBsKGguX19lY0dyYXBoaWNXaWR0aE9wdGlvbix1P2E6Yy5fX2VjR3JhcGhpY1dpZHRoKXx8MCxoLl9fZWNHcmFwaGljSGVpZ2h0PVBsKGguX19lY0dyYXBoaWNIZWlnaHRPcHRpb24sdT9yOmMuX19lY0dyYXBoaWNIZWlnaHQpfHwwfX1mb3Iocz1pLmxlbmd0aC0xOzA8PXM7cy0tKXt2YXIgaCxjO2w9aVtzXTtpZihoPW8uZ2V0KGwuaWQpKXl1KGgsbCwoYz1oLnBhcmVudCk9PT1uP3t3aWR0aDphLGhlaWdodDpyfTp7d2lkdGg6Yy5fX2VjR3JhcGhpY1dpZHRoLGhlaWdodDpjLl9fZWNHcmFwaGljSGVpZ2h0fSxudWxsLHtodjpsLmh2LGJvdW5kaW5nTW9kZTpsLmJvdW5kaW5nfSl9fSxfY2xlYXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9lbE1hcDtlLmVhY2goZnVuY3Rpb24odCl7R1QodCxlKX0pLHRoaXMuX2VsTWFwPVEoKX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuX2NsZWFyKCl9fSk7dmFyIFdUPXt9O2Z1bmN0aW9uIEhUKHQsZSl7V1RbdF09ZX1mdW5jdGlvbiBaVCh0KXtyZXR1cm4gV1RbdF19dmFyIFVUPXdmKHt0eXBlOiJ0b29sYm94IixsYXlvdXRNb2RlOnt0eXBlOiJib3giLGlnbm9yZVNpemU6ITB9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24oKXtVVC5zdXBlckFwcGx5KHRoaXMsIm9wdGlvblVwZGF0ZWQiLGFyZ3VtZW50cyksRSh0aGlzLm9wdGlvbi5mZWF0dXJlLGZ1bmN0aW9uKHQsZSl7dmFyIGk9WlQoZSk7aSYmbSh0LGkuZGVmYXVsdE9wdGlvbil9KX0sZGVmYXVsdE9wdGlvbjp7c2hvdzohMCx6OjYsemxldmVsOjAsb3JpZW50OiJob3Jpem9udGFsIixsZWZ0OiJyaWdodCIsdG9wOiJ0b3AiLGJhY2tncm91bmRDb2xvcjoidHJhbnNwYXJlbnQiLGJvcmRlckNvbG9yOiIjY2NjIixib3JkZXJSYWRpdXM6MCxib3JkZXJXaWR0aDowLHBhZGRpbmc6NSxpdGVtU2l6ZToxNSxpdGVtR2FwOjgsc2hvd1RpdGxlOiEwLGljb25TdHlsZTp7Ym9yZGVyQ29sb3I6IiM2NjYiLGNvbG9yOiJub25lIn0sZW1waGFzaXM6e2ljb25TdHlsZTp7Ym9yZGVyQ29sb3I6IiMzRTk4QzUifX0sdG9vbHRpcDp7c2hvdzohMX19fSk7ZnVuY3Rpb24gWFQodCxlKXt2YXIgaT1KbChlLmdldCgicGFkZGluZyIpKSxuPWUuZ2V0SXRlbVN0eWxlKFsiY29sb3IiLCJvcGFjaXR5Il0pO3JldHVybiBuLmZpbGw9ZS5nZXQoImJhY2tncm91bmRDb2xvciIpLHQ9bmV3IGlzKHtzaGFwZTp7eDp0LngtaVszXSx5OnQueS1pWzBdLHdpZHRoOnQud2lkdGgraVsxXStpWzNdLGhlaWdodDp0LmhlaWdodCtpWzBdK2lbMl0scjplLmdldCgiYm9yZGVyUmFkaXVzIil9LHN0eWxlOm4sc2lsZW50OiEwLHoyOi0xfSl9YmYoe3R5cGU6InRvb2xib3giLHJlbmRlcjpmdW5jdGlvbihoLGMsZCxsKXt2YXIgZj10aGlzLmdyb3VwO2lmKGYucmVtb3ZlQWxsKCksaC5nZXQoInNob3ciKSl7dmFyIHA9K2guZ2V0KCJpdGVtU2l6ZSIpLHU9aC5nZXQoImZlYXR1cmUiKXx8e30sZz10aGlzLl9mZWF0dXJlc3x8KHRoaXMuX2ZlYXR1cmVzPXt9KSxtPVtdO0UodSxmdW5jdGlvbih0LGUpe20ucHVzaChlKX0pLG5ldyBUZih0aGlzLl9mZWF0dXJlTmFtZXN8fFtdLG0pLmFkZCh0KS51cGRhdGUodCkucmVtb3ZlKFQodCxudWxsKSkuZXhlY3V0ZSgpLHRoaXMuX2ZlYXR1cmVOYW1lcz1tLGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lLmdldEJveExheW91dFBhcmFtcygpLG89ZS5nZXQoInBhZGRpbmciKSxhPXt3aWR0aDppLmdldFdpZHRoKCksaGVpZ2h0OmkuZ2V0SGVpZ2h0KCl9LHI9dnUobixhLG8pO211KGUuZ2V0KCJvcmllbnQiKSx0LGUuZ2V0KCJpdGVtR2FwIiksci53aWR0aCxyLmhlaWdodCkseXUodCxuLGEsbyl9KGYsaCxkKSxmLmFkZChYVChmLmdldEJvdW5kaW5nUmVjdCgpLGgpKSxmLmVhY2hDaGlsZChmdW5jdGlvbih0KXt2YXIgZT10Ll9fdGl0bGUsaT10LmhvdmVyU3R5bGU7aWYoaSYmZSl7dmFyIG49Y24oZSxTbihpKSksbz10LnBvc2l0aW9uWzBdK2YucG9zaXRpb25bMF0sYT0hMTt0LnBvc2l0aW9uWzFdK2YucG9zaXRpb25bMV0rcCtuLmhlaWdodD5kLmdldEhlaWdodCgpJiYoaS50ZXh0UG9zaXRpb249InRvcCIsYT0hMCk7dmFyIHI9YT8tNS1uLmhlaWdodDpwKzg7bytuLndpZHRoLzI+ZC5nZXRXaWR0aCgpPyhpLnRleHRQb3NpdGlvbj1bIjEwMCUiLHJdLGkudGV4dEFsaWduPSJyaWdodCIpOm8tbi53aWR0aC8yPDAmJihpLnRleHRQb3NpdGlvbj1bMCxyXSxpLnRleHRBbGlnbj0ibGVmdCIpfX0pfWZ1bmN0aW9uIHQodCxlKXt2YXIgaSxuPW1bdF0sbz1tW2VdLGE9dVtuXSxyPW5ldyBJbChhLGgsaC5lY01vZGVsKTtpZihsJiZudWxsIT1sLm5ld1RpdGxlJiYoYS50aXRsZT1sLm5ld1RpdGxlKSxuJiYhbyl7aWYoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LmluZGV4T2YoIm15Iil9KG4pKWk9e21vZGVsOnIsb25jbGljazpyLm9wdGlvbi5vbmNsaWNrLGZlYXR1cmVOYW1lOm59O2Vsc2V7dmFyIHM9WlQobik7aWYoIXMpcmV0dXJuO2k9bmV3IHMocixjLGQpfWdbbl09aX1lbHNle2lmKCEoaT1nW29dKSlyZXR1cm47aS5tb2RlbD1yLGkuZWNNb2RlbD1jLGkuYXBpPWR9bnx8IW8/ci5nZXQoInNob3ciKSYmIWkudW51c2FibGU/KGZ1bmN0aW9uKG8sYSx0KXt2YXIgcj1vLmdldE1vZGVsKCJpY29uU3R5bGUiKSxzPW8uZ2V0TW9kZWwoImVtcGhhc2lzLmljb25TdHlsZSIpLGU9YS5nZXRJY29ucz9hLmdldEljb25zKCk6by5nZXQoImljb24iKSxsPW8uZ2V0KCJ0aXRsZSIpfHx7fTtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBpPWUsbj1sO2w9e30sKGU9e30pW3RdPWksbFt0XT1ufXZhciB1PW8uaWNvblBhdGhzPXt9O0UoZSxmdW5jdGlvbih0LGUpe3ZhciBpPXBsKHQse30se3g6LXAvMix5Oi1wLzIsd2lkdGg6cCxoZWlnaHQ6cH0pO2kuc2V0U3R5bGUoci5nZXRJdGVtU3R5bGUoKSksaS5ob3ZlclN0eWxlPXMuZ2V0SXRlbVN0eWxlKCksaS5zZXRTdHlsZSh7dGV4dDpsW2VdLHRleHRBbGlnbjpzLmdldCgidGV4dEFsaWduIiksdGV4dEJvcmRlclJhZGl1czpzLmdldCgidGV4dEJvcmRlclJhZGl1cyIpLHRleHRQYWRkaW5nOnMuZ2V0KCJ0ZXh0UGFkZGluZyIpLHRleHRGaWxsOm51bGx9KTt2YXIgbj1oLmdldE1vZGVsKCJ0b29sdGlwIik7biYmbi5nZXQoInNob3ciKSYmaS5hdHRyKCJ0b29sdGlwIixMKHtjb250ZW50OmxbZV0sZm9ybWF0dGVyOm4uZ2V0KCJmb3JtYXR0ZXIiLCEwKXx8ZnVuY3Rpb24oKXtyZXR1cm4gbFtlXX0sZm9ybWF0dGVyUGFyYW1zOntjb21wb25lbnRUeXBlOiJ0b29sYm94IixuYW1lOmUsdGl0bGU6bFtlXSwkdmFyczpbIm5hbWUiLCJ0aXRsZSJdfSxwb3NpdGlvbjpuLmdldCgicG9zaXRpb24iLCEwKXx8ImJvdHRvbSJ9LG4ub3B0aW9uKSksWXMoaSksaC5nZXQoInNob3dUaXRsZSIpJiYoaS5fX3RpdGxlPWxbZV0saS5vbigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciB0PXMuZ2V0SXRlbVN0eWxlKCksZT0idmVydGljYWwiPT09aC5nZXQoIm9yaWVudCIpP251bGw9PWguZ2V0KCJyaWdodCIpPyJyaWdodCI6ImxlZnQiOm51bGw9PWguZ2V0KCJib3R0b20iKT8iYm90dG9tIjoidG9wIjtpLnNldFN0eWxlKHt0ZXh0RmlsbDpzLmdldCgidGV4dEZpbGwiKXx8dC5maWxsfHx0LnN0cm9rZXx8IiMwMDAiLHRleHRCYWNrZ3JvdW5kQ29sb3I6cy5nZXQoInRleHRCYWNrZ3JvdW5kQ29sb3IiKSx0ZXh0UG9zaXRpb246cy5nZXQoInRleHRQb3NpdGlvbiIpfHxlfSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7aS5zZXRTdHlsZSh7dGV4dEZpbGw6bnVsbCx0ZXh0QmFja2dyb3VuZENvbG9yOm51bGx9KX0pKSxpLnRyaWdnZXIoby5nZXQoImljb25TdGF0dXMuIitlKXx8Im5vcm1hbCIpLGYuYWRkKGkpLGkub24oImNsaWNrIixBKGEub25jbGljayxhLGMsZCxlKSksdVtlXT1pfSl9KHIsaSxuKSxyLnNldEljb25TdGF0dXM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbixuPXRoaXMuaWNvblBhdGhzO2kuaWNvblN0YXR1cz1pLmljb25TdGF0dXN8fHt9LGkuaWNvblN0YXR1c1t0XT1lLG5bdF0mJm5bdF0udHJpZ2dlcihlKX0saS5yZW5kZXImJmkucmVuZGVyKHIsYyxkLGwpKTppLnJlbW92ZSYmaS5yZW1vdmUoYyxkKTppLmRpc3Bvc2UmJmkuZGlzcG9zZShjLGQpfX0sdXBkYXRlVmlldzpmdW5jdGlvbih0LGUsaSxuKXtFKHRoaXMuX2ZlYXR1cmVzLGZ1bmN0aW9uKHQpe3QudXBkYXRlVmlldyYmdC51cGRhdGVWaWV3KHQubW9kZWwsZSxpLG4pfSl9LHJlbW92ZTpmdW5jdGlvbihlLGkpe0UodGhpcy5fZmVhdHVyZXMsZnVuY3Rpb24odCl7dC5yZW1vdmUmJnQucmVtb3ZlKGUsaSl9KSx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxkaXNwb3NlOmZ1bmN0aW9uKGUsaSl7RSh0aGlzLl9mZWF0dXJlcyxmdW5jdGlvbih0KXt0LmRpc3Bvc2UmJnQuZGlzcG9zZShlLGkpfSl9fSk7dmFyIFlUPUNjLnRvb2xib3guc2F2ZUFzSW1hZ2U7ZnVuY3Rpb24galQodCl7dGhpcy5tb2RlbD10fWpULmRlZmF1bHRPcHRpb249e3Nob3c6ITAsaWNvbjoiTTQuNywyMi45TDI5LjMsNDUuNUw1NC43LDIzLjRNNC42LDQzLjZMNC42LDU4TDUzLjgsNThMNTMuOCw0My42TTI5LjIsNDUuMUwyOS4yLDAiLHRpdGxlOllULnRpdGxlLHR5cGU6InBuZyIsY29ubmVjdGVkQmFja2dyb3VuZENvbG9yOiIjZmZmIixuYW1lOiIiLGV4Y2x1ZGVDb21wb25lbnRzOlsidG9vbGJveCJdLHBpeGVsUmF0aW86MSxsYW5nOllULmxhbmcuc2xpY2UoKX0salQucHJvdG90eXBlLnVudXNhYmxlPSF2LmNhbnZhc1N1cHBvcnRlZCxqVC5wcm90b3R5cGUub25jbGljaz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMubW9kZWwsbj1pLmdldCgibmFtZSIpfHx0LmdldCgidGl0bGUuMC50ZXh0Iil8fCJlY2hhcnRzIixvPWkuZ2V0KCJ0eXBlIiwhMCl8fCJwbmciLGE9ZS5nZXRDb25uZWN0ZWREYXRhVVJMKHt0eXBlOm8sYmFja2dyb3VuZENvbG9yOmkuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiLCEwKXx8dC5nZXQoImJhY2tncm91bmRDb2xvciIpfHwiI2ZmZiIsY29ubmVjdGVkQmFja2dyb3VuZENvbG9yOmkuZ2V0KCJjb25uZWN0ZWRCYWNrZ3JvdW5kQ29sb3IiKSxleGNsdWRlQ29tcG9uZW50czppLmdldCgiZXhjbHVkZUNvbXBvbmVudHMiKSxwaXhlbFJhdGlvOmkuZ2V0KCJwaXhlbFJhdGlvIil9KTtpZigiZnVuY3Rpb24iIT10eXBlb2YgTW91c2VFdmVudHx8di5icm93c2VyLmllfHx2LmJyb3dzZXIuZWRnZSlpZih3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2Ipe2Zvcih2YXIgcj1hdG9iKGEuc3BsaXQoIiwiKVsxXSkscz1yLmxlbmd0aCxsPW5ldyBVaW50OEFycmF5KHMpO3MtLTspbFtzXT1yLmNoYXJDb2RlQXQocyk7dmFyIHU9bmV3IEJsb2IoW2xdKTt3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IodSxuKyIuIitvKX1lbHNle3ZhciBoPWkuZ2V0KCJsYW5nIiksYz0nPGJvZHkgc3R5bGU9Im1hcmdpbjowOyI+PGltZyBzcmM9IicrYSsnIiBzdHlsZT0ibWF4LXdpZHRoOjEwMCU7IiB0aXRsZT0iJysoaCYmaFswXXx8IiIpKyciIC8+PC9ib2R5Pic7d2luZG93Lm9wZW4oKS5kb2N1bWVudC53cml0ZShjKX1lbHNle3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtkLmRvd25sb2FkPW4rIi4iK28sZC50YXJnZXQ9Il9ibGFuayIsZC5ocmVmPWE7dmFyIGY9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7dmlldzp3aW5kb3csYnViYmxlczohMCxjYW5jZWxhYmxlOiExfSk7ZC5kaXNwYXRjaEV2ZW50KGYpfX0sSFQoInNhdmVBc0ltYWdlIixqVCk7dmFyIHFUPUNjLnRvb2xib3gubWFnaWNUeXBlLEtUPSJfX2VjX21hZ2ljVHlwZV9zdGFja19fIjtmdW5jdGlvbiAkVCh0KXt0aGlzLm1vZGVsPXR9JFQuZGVmYXVsdE9wdGlvbj17c2hvdzohMCx0eXBlOltdLGljb246e2xpbmU6Ik00LjEsMjguOWg3LjFsOS4zLTIybDcuNCwzOGw5LjctMTkuN2wzLDEyLjhoMTQuOU00LjEsNThoNTEuNCIsYmFyOiJNNi43LDIyLjloMTBWNDhoLTEwVjIyLjl6TTI0LjksMTNoMTB2MzVoLTEwVjEzek00My4yLDJoMTB2NDZoLTEwVjJ6TTMuMSw1OGg1My43IixzdGFjazoiTTguMiwzOC40bC04LjQsNC4xbDMwLjYsMTUuM0w2MCw0Mi41bC04LjEtNC4xbC0yMS41LDExTDguMiwzOC40eiBNNTEuOSwzMGwtOC4xLDQuMmwtMTMuNCw2LjlsLTEzLjktNi45TDguMiwzMGwtOC40LDQuMmw4LjQsNC4ybDIyLjIsMTFsMjEuNS0xMWw4LjEtNC4yTDUxLjksMzB6IE01MS45LDIxLjdsLTguMSw0LjJMMzUuNywzMGwtNS4zLDIuOEwyNC45LDMwbC04LjQtNC4xbC04LjMtNC4ybC04LjQsNC4yTDguMiwzMGw4LjMsNC4ybDEzLjksNi45bDEzLjQtNi45bDguMS00LjJsOC4xLTQuMUw1MS45LDIxLjd6TTMwLjQsMi4yTC0wLjIsMTcuNWw4LjQsNC4xbDguMyw0LjJsOC40LDQuMmw1LjUsMi43bDUuMy0yLjdsOC4xLTQuMmw4LjEtNC4ybDguMS00LjFMMzAuNCwyLjJ6In0sdGl0bGU6RChxVC50aXRsZSksb3B0aW9uOnt9LHNlcmllc0luZGV4Ont9fTt2YXIgSlQ9JFQucHJvdG90eXBlO0pULmdldEljb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tb2RlbCxlPXQuZ2V0KCJpY29uIiksaT17fTtyZXR1cm4gRSh0LmdldCgidHlwZSIpLGZ1bmN0aW9uKHQpe2VbdF0mJihpW3RdPWVbdF0pfSksaX07dmFyIFFUPXtsaW5lOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKCJiYXIiPT09dClyZXR1cm4gbSh7aWQ6ZSx0eXBlOiJsaW5lIixkYXRhOmkuZ2V0KCJkYXRhIiksc3RhY2s6aS5nZXQoInN0YWNrIiksbWFya1BvaW50OmkuZ2V0KCJtYXJrUG9pbnQiKSxtYXJrTGluZTppLmdldCgibWFya0xpbmUiKX0sbi5nZXQoIm9wdGlvbi5saW5lIil8fHt9LCEwKX0sYmFyOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKCJsaW5lIj09PXQpcmV0dXJuIG0oe2lkOmUsdHlwZToiYmFyIixkYXRhOmkuZ2V0KCJkYXRhIiksc3RhY2s6aS5nZXQoInN0YWNrIiksbWFya1BvaW50OmkuZ2V0KCJtYXJrUG9pbnQiKSxtYXJrTGluZTppLmdldCgibWFya0xpbmUiKX0sbi5nZXQoIm9wdGlvbi5iYXIiKXx8e30sITApfSxzdGFjazpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1pLmdldCgic3RhY2siKT09PUtUO2lmKCJsaW5lIj09PXR8fCJiYXIiPT09dClyZXR1cm4gbi5zZXRJY29uU3RhdHVzKCJzdGFjayIsbz8ibm9ybWFsIjoiZW1waGFzaXMiKSxtKHtpZDplLHN0YWNrOm8/IiI6S1R9LG4uZ2V0KCJvcHRpb24uc3RhY2siKXx8e30sITApfX0sdEE9W1sibGluZSIsImJhciJdLFsic3RhY2siXV07SlQub25jbGljaz1mdW5jdGlvbih1LHQsaCl7dmFyIGM9dGhpcy5tb2RlbCxlPWMuZ2V0KCJzZXJpZXNJbmRleC4iK2gpO2lmKFFUW2hdKXt2YXIgaSxkPXtzZXJpZXM6W119O2lmKEUodEEsZnVuY3Rpb24odCl7MDw9Xyh0LGgpJiZFKHQsZnVuY3Rpb24odCl7Yy5zZXRJY29uU3RhdHVzKHQsIm5vcm1hbCIpfSl9KSxjLnNldEljb25TdGF0dXMoaCwiZW1waGFzaXMiKSx1LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHF1ZXJ5Om51bGw9PWU/bnVsbDp7c2VyaWVzSW5kZXg6ZX19LGZ1bmN0aW9uKHQpe3ZhciBlPXQuc3ViVHlwZSxpPXQuaWQsbj1RVFtoXShlLGksdCxjKTtuJiYoQyhuLHQub3B0aW9uKSxkLnNlcmllcy5wdXNoKG4pKTt2YXIgbz10LmNvb3JkaW5hdGVTeXN0ZW07aWYobyYmImNhcnRlc2lhbjJkIj09PW8udHlwZSYmKCJsaW5lIj09PWh8fCJiYXIiPT09aCkpe3ZhciBhPW8uZ2V0QXhlc0J5U2NhbGUoIm9yZGluYWwiKVswXTtpZihhKXt2YXIgcj1hLmRpbSsiQXhpcyIscz11LnF1ZXJ5Q29tcG9uZW50cyh7bWFpblR5cGU6cixpbmRleDp0LmdldChuYW1lKyJJbmRleCIpLGlkOnQuZ2V0KG5hbWUrIklkIil9KVswXS5jb21wb25lbnRJbmRleDtkW3JdPWRbcl18fFtdO2Zvcih2YXIgbD0wO2w8PXM7bCsrKWRbcl1bc109ZFtyXVtzXXx8e307ZFtyXVtzXS5ib3VuZGFyeUdhcD0iYmFyIj09PWh9fX0pLCJzdGFjayI9PT1oKWk9ZC5zZXJpZXMmJmQuc2VyaWVzWzBdJiZkLnNlcmllc1swXS5zdGFjaz09PUtUP20oe3N0YWNrOnFULnRpdGxlLnRpbGVkfSxxVC50aXRsZSk6RChxVC50aXRsZSk7dC5kaXNwYXRjaEFjdGlvbih7dHlwZToiY2hhbmdlTWFnaWNUeXBlIixjdXJyZW50VHlwZTpoLG5ld09wdGlvbjpkLG5ld1RpdGxlOml9KX19LGdmKHt0eXBlOiJjaGFuZ2VNYWdpY1R5cGUiLGV2ZW50OiJtYWdpY1R5cGVDaGFuZ2VkIix1cGRhdGU6InByZXBhcmVBbmRVcGRhdGUifSxmdW5jdGlvbih0LGUpe2UubWVyZ2VPcHRpb24odC5uZXdPcHRpb24pfSksSFQoIm1hZ2ljVHlwZSIsJFQpO3ZhciBlQT1DYy50b29sYm94LmRhdGFWaWV3LGlBPW5ldyBBcnJheSg2MCkuam9pbigiLSIpLG5BPSJcdCI7ZnVuY3Rpb24gb0EodCl7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIG89e30sYT1bXSxyPVtdO3JldHVybiB0LmVhY2hSYXdTZXJpZXMoZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO2lmKCFlfHwiY2FydGVzaWFuMmQiIT09ZS50eXBlJiYicG9sYXIiIT09ZS50eXBlKWEucHVzaCh0KTtlbHNle3ZhciBpPWUuZ2V0QmFzZUF4aXMoKTtpZigiY2F0ZWdvcnkiPT09aS50eXBlKXt2YXIgbj1pLmRpbSsiXyIraS5pbmRleDtvW25dfHwob1tuXT17Y2F0ZWdvcnlBeGlzOmksdmFsdWVBeGlzOmUuZ2V0T3RoZXJBeGlzKGkpLHNlcmllczpbXX0sci5wdXNoKHtheGlzRGltOmkuZGltLGF4aXNJbmRleDppLmluZGV4fSkpLG9bbl0uc2VyaWVzLnB1c2godCl9ZWxzZSBhLnB1c2godCl9fSkse3Nlcmllc0dyb3VwQnlDYXRlZ29yeUF4aXM6byxvdGhlcjphLG1ldGE6cn19KHQpO3JldHVybnt2YWx1ZTpNKFtmdW5jdGlvbih0KXt2YXIgaD1bXTtyZXR1cm4gRSh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5jYXRlZ29yeUF4aXMsbj10LnZhbHVlQXhpcy5kaW0sbz1bIiAiXS5jb25jYXQoTih0LnNlcmllcyxmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lfSkpLGE9W2kubW9kZWwuZ2V0Q2F0ZWdvcmllcygpXTtFKHQuc2VyaWVzLGZ1bmN0aW9uKHQpe2EucHVzaCh0LmdldFJhd0RhdGEoKS5tYXBBcnJheShuLGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpfSk7Zm9yKHZhciByPVtvLmpvaW4obkEpXSxzPTA7czxhWzBdLmxlbmd0aDtzKyspe2Zvcih2YXIgbD1bXSx1PTA7dTxhLmxlbmd0aDt1KyspbC5wdXNoKGFbdV1bc10pO3IucHVzaChsLmpvaW4obkEpKX1oLnB1c2goci5qb2luKCJcbiIpKX0pLGguam9pbigiXG5cbiIraUErIlxuXG4iKX0oZS5zZXJpZXNHcm91cEJ5Q2F0ZWdvcnlBeGlzKSxmdW5jdGlvbih0KXtyZXR1cm4gTih0LGZ1bmN0aW9uKHQpe3ZhciBvPXQuZ2V0UmF3RGF0YSgpLGE9W3QubmFtZV0scj1bXTtyZXR1cm4gby5lYWNoKG8uZGltZW5zaW9ucyxmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9YXJndW1lbnRzW3QtMV0saT1vLmdldE5hbWUoZSksbj0wO248dC0xO24rKylyW25dPWFyZ3VtZW50c1tuXTthLnB1c2goKGk/aStuQToiIikrci5qb2luKG5BKSl9KSxhLmpvaW4oIlxuIil9KS5qb2luKCJcblxuIitpQSsiXG5cbiIpfShlLm90aGVyKV0sZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvW1xuXHRcc10vZywiIil9KS5qb2luKCJcblxuIitpQSsiXG5cbiIpLG1ldGE6ZS5tZXRhfX1mdW5jdGlvbiBhQSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9eXHNccyovLCIiKS5yZXBsYWNlKC9cc1xzKiQvLCIiKX12YXIgckE9bmV3IFJlZ0V4cCgiWyIrbkErIl0rIiwiZyIpO2Z1bmN0aW9uIHNBKHQsYSl7dmFyIGU9dC5zcGxpdChuZXcgUmVnRXhwKCJcbioiK2lBKyJcbioiLCJnIikpLHI9e3NlcmllczpbXX07cmV0dXJuIEUoZSxmdW5jdGlvbih0LGUpe2lmKGZ1bmN0aW9uKHQpe2lmKDA8PXQuc2xpY2UoMCx0LmluZGV4T2YoIlxuIikpLmluZGV4T2YobkEpKXJldHVybiEwfSh0KSl7dmFyIGk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuc3BsaXQoL1xuKy9nKSxpPVtdLG49TihhQShlLnNoaWZ0KCkpLnNwbGl0KHJBKSxmdW5jdGlvbih0KXtyZXR1cm57bmFtZTp0LGRhdGE6W119fSksbz0wO288ZS5sZW5ndGg7bysrKXt2YXIgYT1hQShlW29dKS5zcGxpdChyQSk7aS5wdXNoKGEuc2hpZnQoKSk7Zm9yKHZhciByPTA7cjxhLmxlbmd0aDtyKyspbltyXSYmKG5bcl0uZGF0YVtvXT1hW3JdKX1yZXR1cm57c2VyaWVzOm4sY2F0ZWdvcmllczppfX0odCksbj1hW2VdLG89bi5heGlzRGltKyJBeGlzIjtuJiYocltvXT1yW29dfHxbXSxyW29dW24uYXhpc0luZGV4XT17ZGF0YTppLmNhdGVnb3JpZXN9LHIuc2VyaWVzPXIuc2VyaWVzLmNvbmNhdChpLnNlcmllcykpfWVsc2V7aT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5zcGxpdCgvXG4rL2cpLGk9YUEoZS5zaGlmdCgpKSxuPVtdLG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIGEscj1hQShlW29dKS5zcGxpdChyQSkscz0iIixsPSExO2E9aXNOYU4oclswXSk/KGw9ITAscz1yWzBdLHI9ci5zbGljZSgxKSxuW29dPXtuYW1lOnMsdmFsdWU6W119LG5bb10udmFsdWUpOm5bb109W107Zm9yKHZhciB1PTA7dTxyLmxlbmd0aDt1KyspYS5wdXNoKCtyW3VdKTsxPT09YS5sZW5ndGgmJihsP25bb10udmFsdWU9YVswXTpuW29dPWFbMF0pfXJldHVybntuYW1lOmksZGF0YTpufX0odCk7ci5zZXJpZXMucHVzaChpKX19KSxyfWZ1bmN0aW9uIGxBKHQpe3RoaXMuX2RvbT1udWxsLHRoaXMubW9kZWw9dH1sQS5kZWZhdWx0T3B0aW9uPXtzaG93OiEwLHJlYWRPbmx5OiExLG9wdGlvblRvQ29udGVudDpudWxsLGNvbnRlbnRUb09wdGlvbjpudWxsLGljb246Ik0xNy41LDE3LjNIMzMgTTE3LjUsMTcuM0gzMyBNNDUuNCwyOS41aC0yOCBNMTEuNSwydjU2SDUxVjE0LjhMMzguNCwySDExLjV6IE0zOC40LDIuMnYxMi43SDUxIE00NS40LDQxLjdoLTI4Iix0aXRsZTpEKGVBLnRpdGxlKSxsYW5nOkQoZUEubGFuZyksYmFja2dyb3VuZENvbG9yOiIjZmZmIix0ZXh0Q29sb3I6IiMwMDAiLHRleHRhcmVhQ29sb3I6IiNmZmYiLHRleHRhcmVhQm9yZGVyQ29sb3I6IiMzMzMiLGJ1dHRvbkNvbG9yOiIjYzIzNTMxIixidXR0b25UZXh0Q29sb3I6IiNmZmYifSxsQS5wcm90b3R5cGUub25jbGljaz1mdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0RG9tKCksbj10aGlzLm1vZGVsO3RoaXMuX2RvbSYmaS5yZW1vdmVDaGlsZCh0aGlzLl9kb20pO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDo1cHg7dG9wOjVweDtib3R0b206NXB4O3JpZ2h0OjVweDsiLG8uc3R5bGUuYmFja2dyb3VuZENvbG9yPW4uZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKXx8IiNmZmYiO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImg0Iikscj1uLmdldCgibGFuZyIpfHxbXTthLmlubmVySFRNTD1yWzBdfHxuLmdldCgidGl0bGUiKSxhLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjogMTBweCAyMHB4OyIsYS5zdHlsZS5jb2xvcj1uLmdldCgidGV4dENvbG9yIik7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3Muc3R5bGUuY3NzVGV4dD0iZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG87Ijt2YXIgdT1uLmdldCgib3B0aW9uVG9Db250ZW50IiksaD1uLmdldCgiY29udGVudFRvT3B0aW9uIiksYz1vQSh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdSl7dmFyIGQ9dShlLmdldE9wdGlvbigpKTsic3RyaW5nIj09dHlwZW9mIGQ/cy5pbm5lckhUTUw9ZDpHKGQpJiZzLmFwcGVuZENoaWxkKGQpfWVsc2Ugcy5hcHBlbmRDaGlsZChsKSxsLnJlYWRPbmx5PW4uZ2V0KCJyZWFkT25seSIpLGwuc3R5bGUuY3NzVGV4dD0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42cmVtOyIsbC5zdHlsZS5jb2xvcj1uLmdldCgidGV4dENvbG9yIiksbC5zdHlsZS5ib3JkZXJDb2xvcj1uLmdldCgidGV4dGFyZWFCb3JkZXJDb2xvciIpLGwuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4uZ2V0KCJ0ZXh0YXJlYUNvbG9yIiksbC52YWx1ZT1jLnZhbHVlO3ZhciBmPWMubWV0YSxwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Auc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7Ijt2YXIgZz0iZmxvYXQ6cmlnaHQ7bWFyZ2luLXJpZ2h0OjIwcHg7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoycHggNXB4O2ZvbnQtc2l6ZToxMnB4O2JvcmRlci1yYWRpdXM6M3B4IixtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zys9IjtiYWNrZ3JvdW5kLWNvbG9yOiIrbi5nZXQoImJ1dHRvbkNvbG9yIiksZys9Ijtjb2xvcjoiK24uZ2V0KCJidXR0b25UZXh0Q29sb3IiKTt2YXIgeT10aGlzO2Z1bmN0aW9uIHgoKXtpLnJlbW92ZUNoaWxkKG8pLHkuX2RvbT1udWxsfUZ0KG0sImNsaWNrIix4KSxGdCh2LCJjbGljayIsZnVuY3Rpb24oKXt2YXIgdDt0cnl7dD0iZnVuY3Rpb24iPT10eXBlb2YgaD9oKHMsZS5nZXRPcHRpb24oKSk6c0EobC52YWx1ZSxmKX1jYXRjaCh0KXt0aHJvdyB4KCksbmV3IEVycm9yKCJEYXRhIHZpZXcgZm9ybWF0IGVycm9yICIrdCl9dCYmZS5kaXNwYXRjaEFjdGlvbih7dHlwZToiY2hhbmdlRGF0YVZpZXciLG5ld09wdGlvbjp0fSkseCgpfSksbS5pbm5lckhUTUw9clsxXSx2LmlubmVySFRNTD1yWzJdLHYuc3R5bGUuY3NzVGV4dD1nLG0uc3R5bGUuY3NzVGV4dD1nLG4uZ2V0KCJyZWFkT25seSIpfHxwLmFwcGVuZENoaWxkKHYpLHAuYXBwZW5kQ2hpbGQobSksby5hcHBlbmRDaGlsZChhKSxvLmFwcGVuZENoaWxkKHMpLG8uYXBwZW5kQ2hpbGQocCkscy5zdHlsZS5oZWlnaHQ9aS5jbGllbnRIZWlnaHQtODArInB4IixpLmFwcGVuZENoaWxkKG8pLHRoaXMuX2RvbT1vfSxsQS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZG9tJiZlLmdldERvbSgpLnJlbW92ZUNoaWxkKHRoaXMuX2RvbSl9LGxBLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKHQsZSl7dGhpcy5yZW1vdmUodCxlKX0sSFQoImRhdGFWaWV3IixsQSksZ2Yoe3R5cGU6ImNoYW5nZURhdGFWaWV3IixldmVudDoiZGF0YVZpZXdDaGFuZ2VkIix1cGRhdGU6InByZXBhcmVBbmRVcGRhdGUifSxmdW5jdGlvbih0LG4pe3ZhciBvPVtdO0UodC5uZXdPcHRpb24uc2VyaWVzLGZ1bmN0aW9uKHQpe3ZhciBlPW4uZ2V0U2VyaWVzQnlOYW1lKHQubmFtZSlbMF07aWYoZSl7dmFyIGk9ZS5nZXQoImRhdGEiKTtvLnB1c2goe25hbWU6dC5uYW1lLGRhdGE6ZnVuY3Rpb24odCxuKXtyZXR1cm4gTih0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9biYmbltlXTtyZXR1cm4gUihpKSYmIWsoaSk/KFIodCkmJiFrKHQpJiYodD10LnZhbHVlKSxDKHt2YWx1ZTp0fSxpKSk6dH0pfSh0LmRhdGEsaSl9KX1lbHNlIG8ucHVzaChMKHt0eXBlOiJzY2F0dGVyIn0sdCkpfSksbi5tZXJnZU9wdGlvbihDKHtzZXJpZXM6b30sdC5uZXdPcHRpb24pKX0pO3ZhciB1QT1FLGhBPV8sY0E9VCxkQT1bImRhdGFUb1BvaW50IiwicG9pbnRUb0RhdGEiXSxmQT1bImdyaWQiLCJ4QXhpcyIsInlBeGlzIiwiZ2VvIiwiZ3JhcGgiLCJwb2xhciIsInJhZGl1c0F4aXMiLCJhbmdsZUF4aXMiLCJibWFwIl07ZnVuY3Rpb24gcEEodCxlLGkpe3ZhciBuPXRoaXMuX3RhcmdldEluZm9MaXN0PVtdLG89e30sYT12QShlLHQpO3VBKHlBLGZ1bmN0aW9uKHQsZSl7aSYmaS5pbmNsdWRlJiYhKDA8PWhBKGkuaW5jbHVkZSxlKSl8fHQoYSxuLG8pfSl9dmFyIGdBPXBBLnByb3RvdHlwZTtmdW5jdGlvbiBtQSh0KXtyZXR1cm4gdFswXT50WzFdJiZ0LnJldmVyc2UoKSx0fWZ1bmN0aW9uIHZBKHQsZSl7cmV0dXJuIFhvKHQsZSx7aW5jbHVkZU1haW5UeXBlczpmQX0pfWdBLnNldE91dHB1dFJhbmdlcz1mdW5jdGlvbih0LGUpe3RoaXMubWF0Y2hPdXRwdXRSYW5nZXModCxlLGZ1bmN0aW9uKHQsZSxpKXtpZigodC5jb29yZFJhbmdlc3x8KHQuY29vcmRSYW5nZXM9W10pKS5wdXNoKGUpLCF0LmNvb3JkUmFuZ2Upe3QuY29vcmRSYW5nZT1lO3ZhciBuPXdBW3QuYnJ1c2hUeXBlXSgwLGksZSk7dC5fX3JhbmdlT2Zmc2V0PXtvZmZzZXQ6U0FbdC5icnVzaFR5cGVdKG4udmFsdWVzLHQucmFuZ2UsWzEsMV0pLHh5TWluTWF4Om4ueHlNaW5NYXh9fX0pfSxnQS5tYXRjaE91dHB1dFJhbmdlcz1mdW5jdGlvbih0LG4sbyl7dUEodCxmdW5jdGlvbihpKXt2YXIgdD10aGlzLmZpbmRUYXJnZXRJbmZvKGksbik7dCYmITAhPT10JiZFKHQuY29vcmRTeXNlcyxmdW5jdGlvbih0KXt2YXIgZT13QVtpLmJydXNoVHlwZV0oMSx0LGkucmFuZ2UpO28oaSxlLnZhbHVlcyx0LG4pfSl9LHRoaXMpfSxnQS5zZXRJbnB1dFJhbmdlcz1mdW5jdGlvbih0LG8pe3VBKHQsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5maW5kVGFyZ2V0SW5mbyh0LG8pO2lmKHQucmFuZ2U9dC5yYW5nZXx8W10sZSYmITAhPT1lKXt0LnBhbmVsSWQ9ZS5wYW5lbElkO3ZhciBpPXdBW3QuYnJ1c2hUeXBlXSgwLGUuY29vcmRTeXMsdC5jb29yZFJhbmdlKSxuPXQuX19yYW5nZU9mZnNldDt0LnJhbmdlPW4/U0FbdC5icnVzaFR5cGVdKGkudmFsdWVzLG4ub2Zmc2V0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9SUEodCksbj1JQShlKSxvPVtpWzBdL25bMF0saVsxXS9uWzFdXTtyZXR1cm4gaXNOYU4ob1swXSkmJihvWzBdPTEpLGlzTmFOKG9bMV0pJiYob1sxXT0xKSxvfShpLnh5TWluTWF4LG4ueHlNaW5NYXgpKTppLnZhbHVlc319LHRoaXMpfSxnQS5tYWtlUGFuZWxPcHRzPWZ1bmN0aW9uKGksbil7cmV0dXJuIE4odGhpcy5fdGFyZ2V0SW5mb0xpc3QsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRQYW5lbFJlY3QoKTtyZXR1cm57cGFuZWxJZDp0LnBhbmVsSWQsZGVmYXVsdEJydXNoVHlwZTpuJiZuKHQpLGNsaXBQYXRoOlViKGUpLGlzVGFyZ2V0QnlDdXJzb3I6WWIoZSxpLHQuY29vcmRTeXNNb2RlbCksZ2V0TGluZWFyQnJ1c2hPdGhlckV4dGVudDpYYihlKX19KX0sZ0EuY29udHJvbFNlcmllcz1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5maW5kVGFyZ2V0SW5mbyh0LGkpO3JldHVybiEwPT09bnx8biYmMDw9aEEobi5jb29yZFN5c2VzLGUuY29vcmRpbmF0ZVN5c3RlbSl9LGdBLmZpbmRUYXJnZXRJbmZvPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuX3RhcmdldEluZm9MaXN0LG49dkEoZSx0KSxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb10scj10LnBhbmVsSWQ7aWYocil7aWYoYS5wYW5lbElkPT09cilyZXR1cm4gYX1lbHNlIGZvcihvPTA7bzx4QS5sZW5ndGg7bysrKWlmKHhBW29dKG4sYSkpcmV0dXJuIGF9cmV0dXJuITB9O3ZhciB5QT17Z3JpZDpmdW5jdGlvbih0LG4pe3ZhciBvPXQueEF4aXNNb2RlbHMsYT10LnlBeGlzTW9kZWxzLGU9dC5ncmlkTW9kZWxzLGk9USgpLHI9e30scz17fTsob3x8YXx8ZSkmJih1QShvLGZ1bmN0aW9uKHQpe3ZhciBlPXQuYXhpcy5ncmlkLm1vZGVsO2kuc2V0KGUuaWQsZSkscltlLmlkXT0hMH0pLHVBKGEsZnVuY3Rpb24odCl7dmFyIGU9dC5heGlzLmdyaWQubW9kZWw7aS5zZXQoZS5pZCxlKSxzW2UuaWRdPSEwfSksdUEoZSxmdW5jdGlvbih0KXtpLnNldCh0LmlkLHQpLHJbdC5pZF09ITAsc1t0LmlkXT0hMH0pLGkuZWFjaChmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW0saT1bXTt1QShlLmdldENhcnRlc2lhbnMoKSxmdW5jdGlvbih0LGUpeygwPD1oQShvLHQuZ2V0QXhpcygieCIpLm1vZGVsKXx8MDw9aEEoYSx0LmdldEF4aXMoInkiKS5tb2RlbCkpJiZpLnB1c2godCl9KSxuLnB1c2goe3BhbmVsSWQ6ImdyaWQtLSIrdC5pZCxncmlkTW9kZWw6dCxjb29yZFN5c01vZGVsOnQsY29vcmRTeXM6aVswXSxjb29yZFN5c2VzOmksZ2V0UGFuZWxSZWN0Ol9BLmdyaWQseEF4aXNEZWNsYXJlZDpyW3QuaWRdLHlBeGlzRGVjbGFyZWQ6c1t0LmlkXX0pfSkpfSxnZW86ZnVuY3Rpb24odCxpKXt1QSh0Lmdlb01vZGVscyxmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW07aS5wdXNoKHtwYW5lbElkOiJnZW8tLSIrdC5pZCxnZW9Nb2RlbDp0LGNvb3JkU3lzTW9kZWw6dCxjb29yZFN5czplLGNvb3JkU3lzZXM6W2VdLGdldFBhbmVsUmVjdDpfQS5nZW99KX0pfX0seEE9W2Z1bmN0aW9uKHQsZSl7dmFyIGk9dC54QXhpc01vZGVsLG49dC55QXhpc01vZGVsLG89dC5ncmlkTW9kZWw7cmV0dXJuIW8mJmkmJihvPWkuYXhpcy5ncmlkLm1vZGVsKSwhbyYmbiYmKG89bi5heGlzLmdyaWQubW9kZWwpLG8mJm89PT1lLmdyaWRNb2RlbH0sZnVuY3Rpb24odCxlKXt2YXIgaT10Lmdlb01vZGVsO3JldHVybiBpJiZpPT09ZS5nZW9Nb2RlbH1dLF9BPXtncmlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmRTeXMuZ3JpZC5nZXRSZWN0KCkuY2xvbmUoKX0sZ2VvOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb29yZFN5cyxlPXQuZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKTtyZXR1cm4gZS5hcHBseVRyYW5zZm9ybSh1bCh0KSksZX19LHdBPXtsaW5lWDpjQShiQSwwKSxsaW5lWTpjQShiQSwxKSxyZWN0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lW2RBW3RdXShbaVswXVswXSxpWzFdWzBdXSksbz1lW2RBW3RdXShbaVswXVsxXSxpWzFdWzFdXSksYT1bbUEoW25bMF0sb1swXV0pLG1BKFtuWzFdLG9bMV1dKV07cmV0dXJue3ZhbHVlczphLHh5TWluTWF4OmF9fSxwb2x5Z29uOmZ1bmN0aW9uKGksbix0KXt2YXIgbz1bWzEvMCwtMS8wXSxbMS8wLC0xLzBdXTtyZXR1cm57dmFsdWVzOk4odCxmdW5jdGlvbih0KXt2YXIgZT1uW2RBW2ldXSh0KTtyZXR1cm4gb1swXVswXT1NYXRoLm1pbihvWzBdWzBdLGVbMF0pLG9bMV1bMF09TWF0aC5taW4ob1sxXVswXSxlWzFdKSxvWzBdWzFdPU1hdGgubWF4KG9bMF1bMV0sZVswXSksb1sxXVsxXT1NYXRoLm1heChvWzFdWzFdLGVbMV0pLGV9KSx4eU1pbk1heDpvfX19O2Z1bmN0aW9uIGJBKHQsZSxpLG4pe3ZhciBvPWkuZ2V0QXhpcyhbIngiLCJ5Il1bdF0pLGE9bUEoTihbMCwxXSxmdW5jdGlvbih0KXtyZXR1cm4gZT9vLmNvb3JkVG9EYXRhKG8udG9Mb2NhbENvb3JkKG5bdF0pKTpvLnRvR2xvYmFsQ29vcmQoby5kYXRhVG9Db29yZChuW3RdKSl9KSkscj1bXTtyZXR1cm4gclt0XT1hLHJbMS10XT1bTmFOLE5hTl0se3ZhbHVlczphLHh5TWluTWF4OnJ9fXZhciBTQT17bGluZVg6Y0EoTUEsMCksbGluZVk6Y0EoTUEsMSkscmVjdDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuW1t0WzBdWzBdLWlbMF0qZVswXVswXSx0WzBdWzFdLWlbMF0qZVswXVsxXV0sW3RbMV1bMF0taVsxXSplWzFdWzBdLHRbMV1bMV0taVsxXSplWzFdWzFdXV19LHBvbHlnb246ZnVuY3Rpb24odCxpLG4pe3JldHVybiBOKHQsZnVuY3Rpb24odCxlKXtyZXR1cm5bdFswXS1uWzBdKmlbZV1bMF0sdFsxXS1uWzFdKmlbZV1bMV1dfSl9fTtmdW5jdGlvbiBNQSh0LGUsaSxuKXtyZXR1cm5bZVswXS1uW3RdKmlbMF0sZVsxXS1uW3RdKmlbMV1dfWZ1bmN0aW9uIElBKHQpe3JldHVybiB0P1t0WzBdWzFdLXRbMF1bMF0sdFsxXVsxXS10WzFdWzBdXTpbTmFOLE5hTl19dmFyIFRBPUUsQUE9IlwwX2VjX2hpc3Rfc3RvcmUiO2Z1bmN0aW9uIERBKHQpe3ZhciBlPXRbQUFdO3JldHVybiBlPWV8fCh0W0FBXT1be31dKX1UdS5yZWdpc3RlclN1YlR5cGVEZWZhdWx0ZXIoImRhdGFab29tIixmdW5jdGlvbigpe3JldHVybiJzbGlkZXIifSk7dmFyIENBPVsiY2FydGVzaWFuMmQiLCJwb2xhciIsInNpbmdsZUF4aXMiXTt2YXIgTEEsa0EsUEEsTkEsT0E9KGtBPVsiYXhpc0luZGV4IiwiYXhpcyIsImluZGV4IiwiaWQiXSxQQT1OKExBPShMQT1bIngiLCJ5IiwieiIsInJhZGl1cyIsImFuZ2xlIiwic2luZ2xlIl0pLnNsaWNlKCksdXUpLE5BPU4oa0E9KGtBfHxbXSkuc2xpY2UoKSx1dSksZnVuY3Rpb24obyxhKXtFKExBLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXtuYW1lOnQsY2FwaXRhbDpQQVtlXX0sbj0wO248a0EubGVuZ3RoO24rKylpW2tBW25dXT10K05BW25dO28uY2FsbChhLGkpfSl9KTtmdW5jdGlvbiBFQShvLGEscil7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlLGk9e25vZGVzOltdLHJlY29yZHM6e319O2lmKGEoZnVuY3Rpb24odCl7aS5yZWNvcmRzW3QubmFtZV09e319KSwhdClyZXR1cm4gaTtmb3Iocyh0LGkpO2U9ITEsbyhuKSxlOyk7ZnVuY3Rpb24gbih0KXshZnVuY3Rpb24odCxlKXtyZXR1cm4gMDw9XyhlLm5vZGVzLHQpfSh0LGkpJiZmdW5jdGlvbih0LGkpe3ZhciBuPSExO3JldHVybiBhKGZ1bmN0aW9uKGUpe0Uocih0LGUpfHxbXSxmdW5jdGlvbih0KXtpLnJlY29yZHNbZS5uYW1lXVt0XSYmKG49ITApfSl9KSxufSh0LGkpJiYocyh0LGkpLGU9ITApfXJldHVybiBpfTtmdW5jdGlvbiBzKHQsaSl7aS5ub2Rlcy5wdXNoKHQpLGEoZnVuY3Rpb24oZSl7RShyKHQsZSl8fFtdLGZ1bmN0aW9uKHQpe2kucmVjb3Jkc1tlLm5hbWVdW3RdPSEwfSl9KX19ZnVuY3Rpb24gekEodCxlLGksbil7dGhpcy5fZGltTmFtZT10LHRoaXMuX2F4aXNJbmRleD1lLHRoaXMuX3ZhbHVlV2luZG93LHRoaXMuX3BlcmNlbnRXaW5kb3csdGhpcy5fZGF0YUV4dGVudCx0aGlzLl9taW5NYXhTcGFuLHRoaXMuZWNNb2RlbD1uLHRoaXMuX2RhdGFab29tTW9kZWw9aX12YXIgUkE9RSxCQT1PbDtmdW5jdGlvbiBWQSh0LGUpe3ZhciBpPXQuZ2V0QXhpc01vZGVsKCksbj10Ll9wZXJjZW50V2luZG93LG89dC5fdmFsdWVXaW5kb3c7aWYobil7dmFyIGE9UmwobyxbMCw1MDBdKTthPU1hdGgubWluKGEsMjApO3ZhciByPWV8fDA9PT1uWzBdJiYxMDA9PT1uWzFdO2kuc2V0UmFuZ2Uocj9udWxsOitvWzBdLnRvRml4ZWQoYSkscj9udWxsOitvWzFdLnRvRml4ZWQoYSkpfX16QS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnpBLGhvc3RlZEJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kYXRhWm9vbU1vZGVsPT09dH0sZ2V0RGF0YVZhbHVlV2luZG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlV2luZG93LnNsaWNlKCl9LGdldERhdGFQZXJjZW50V2luZG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BlcmNlbnRXaW5kb3cuc2xpY2UoKX0sZ2V0VGFyZ2V0U2VyaWVzTW9kZWxzOmZ1bmN0aW9uKCl7dmFyIG49W10sbz10aGlzLmVjTW9kZWw7cmV0dXJuIG8uZWFjaFNlcmllcyhmdW5jdGlvbih0KXtpZihmdW5jdGlvbih0KXtyZXR1cm4gMDw9XyhDQSx0KX0odC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSkpe3ZhciBlPXRoaXMuX2RpbU5hbWUsaT1vLnF1ZXJ5Q29tcG9uZW50cyh7bWFpblR5cGU6ZSsiQXhpcyIsaW5kZXg6dC5nZXQoZSsiQXhpc0luZGV4IiksaWQ6dC5nZXQoZSsiQXhpc0lkIil9KVswXTt0aGlzLl9heGlzSW5kZXg9PT0oaSYmaS5jb21wb25lbnRJbmRleCkmJm4ucHVzaCh0KX19LHRoaXMpLG59LGdldEF4aXNNb2RlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjTW9kZWwuZ2V0Q29tcG9uZW50KHRoaXMuX2RpbU5hbWUrIkF4aXMiLHRoaXMuX2F4aXNJbmRleCl9LGdldE90aGVyQXhpc01vZGVsOmZ1bmN0aW9uKCl7dmFyIHQsZSxpLG49dGhpcy5fZGltTmFtZSxvPXRoaXMuZWNNb2RlbCxhPXRoaXMuZ2V0QXhpc01vZGVsKCk7cmV0dXJuIHQ9IngiPT09bnx8InkiPT09bj8oZT0iZ3JpZEluZGV4IiwieCI9PT1uPyJ5IjoieCIpOihlPSJwb2xhckluZGV4IiwiYW5nbGUiPT09bj8icmFkaXVzIjoiYW5nbGUiKSxvLmVhY2hDb21wb25lbnQodCsiQXhpcyIsZnVuY3Rpb24odCl7KHQuZ2V0KGUpfHwwKT09PShhLmdldChlKXx8MCkmJihpPXQpfSksaX0sZ2V0TWluTWF4U3BhbjpmdW5jdGlvbigpe3JldHVybiBEKHRoaXMuX21pbk1heFNwYW4pfSxjYWxjdWxhdGVEYXRhV2luZG93OmZ1bmN0aW9uKG8pe3ZhciBhLHI9dGhpcy5fZGF0YUV4dGVudCxzPXRoaXMuZ2V0QXhpc01vZGVsKCkuYXhpcy5zY2FsZSxsPXRoaXMuX2RhdGFab29tTW9kZWwuZ2V0UmFuZ2VQcm9wTW9kZSgpLHU9WzAsMTAwXSxoPVtdLGM9W107UkEoWyJzdGFydCIsImVuZCJdLGZ1bmN0aW9uKHQsZSl7dmFyIGk9b1t0XSxuPW9bdCsiVmFsdWUiXTsicGVyY2VudCI9PT1sW2VdPyhudWxsPT1pJiYoaT11W2VdKSxuPXMucGFyc2Uoa2woaSx1LHIpKSk6KGE9ITAsaT1rbChuPW51bGw9PW4/cltlXTpzLnBhcnNlKG4pLHIsdSkpLGNbZV09bixoW2VdPWl9KSxCQShjKSxCQShoKTt2YXIgZD10aGlzLl9taW5NYXhTcGFuO2Z1bmN0aW9uIHQodCxlLGksbixvKXt2YXIgYT1vPyJTcGFuIjoiVmFsdWVTcGFuIjtXdygwLHQsaSwiYWxsIixkWyJtaW4iK2FdLGRbIm1heCIrYV0pO2Zvcih2YXIgcj0wO3I8MjtyKyspZVtyXT1rbCh0W3JdLGksbiwhMCksbyYmKGVbcl09cy5wYXJzZShlW3JdKSl9cmV0dXJuIGE/dChjLGgscix1LCExKTp0KGgsYyx1LHIsITApLHt2YWx1ZVdpbmRvdzpjLHBlcmNlbnRXaW5kb3c6aH19LHJlc2V0OmZ1bmN0aW9uKHQpe2lmKHQ9PT10aGlzLl9kYXRhWm9vbU1vZGVsKXt2YXIgZT10aGlzLmdldFRhcmdldFNlcmllc01vZGVscygpO3RoaXMuX2RhdGFFeHRlbnQ9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPVsxLzAsLTEvMF07UkEoaSxmdW5jdGlvbih0KXt2YXIgaT10LmdldERhdGEoKTtpJiZSQShpLm1hcERpbWVuc2lvbihlLCEwKSxmdW5jdGlvbih0KXt2YXIgZT1pLmdldEFwcHJveGltYXRlRXh0ZW50KHQpO2VbMF08blswXSYmKG5bMF09ZVswXSksZVsxXT5uWzFdJiYoblsxXT1lWzFdKX0pfSksblsxXTxuWzBdJiYobj1bTmFOLE5hTl0pO3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0QXhpc01vZGVsKCksbj1pLmdldE1pbighMCksbz0iY2F0ZWdvcnkiPT09aS5nZXQoInR5cGUiKSxhPW8mJmkuZ2V0Q2F0ZWdvcmllcygpLmxlbmd0aDtudWxsIT1uJiYiZGF0YU1pbiIhPT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbj9lWzBdPW46byYmKGVbMF09MDxhPzA6TmFOKTt2YXIgcj1pLmdldE1heCghMCk7bnVsbCE9ciYmImRhdGFNYXgiIT09ciYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZVsxXT1yOm8mJihlWzFdPTA8YT9hLTE6TmFOKTtpLmdldCgic2NhbGUiLCEwKXx8KDA8ZVswXSYmKGVbMF09MCksZVsxXTwwJiYoZVsxXT0wKSl9KHQsbiksbn0odGhpcyx0aGlzLl9kaW1OYW1lLGUpLGZ1bmN0aW9uKG4pe3ZhciBvPW4uX21pbk1heFNwYW49e30sYT1uLl9kYXRhWm9vbU1vZGVsLHI9bi5fZGF0YUV4dGVudDtSQShbIm1pbiIsIm1heCJdLGZ1bmN0aW9uKHQpe3ZhciBlPWEuZ2V0KHQrIlNwYW4iKSxpPWEuZ2V0KHQrIlZhbHVlU3BhbiIpO251bGwhPWkmJihpPW4uZ2V0QXhpc01vZGVsKCkuYXhpcy5zY2FsZS5wYXJzZShpKSksbnVsbCE9aT9lPWtsKHJbMF0raSxyLFswLDEwMF0sITApOm51bGwhPWUmJihpPWtsKGUsWzAsMTAwXSxyLCEwKS1yWzBdKSxvW3QrIlNwYW4iXT1lLG9bdCsiVmFsdWVTcGFuIl09aX0pfSh0aGlzKTt2YXIgaT10aGlzLmNhbGN1bGF0ZURhdGFXaW5kb3codC5zZXR0bGVkT3B0aW9uKTt0aGlzLl92YWx1ZVdpbmRvdz1pLnZhbHVlV2luZG93LHRoaXMuX3BlcmNlbnRXaW5kb3c9aS5wZXJjZW50V2luZG93LFZBKHRoaXMpfX0scmVzdG9yZTpmdW5jdGlvbih0KXt0PT09dGhpcy5fZGF0YVpvb21Nb2RlbCYmKHRoaXMuX3ZhbHVlV2luZG93PXRoaXMuX3BlcmNlbnRXaW5kb3c9bnVsbCxWQSh0aGlzLCEwKSl9LGZpbHRlckRhdGE6ZnVuY3Rpb24odCxlKXtpZih0PT09dGhpcy5fZGF0YVpvb21Nb2RlbCl7dmFyIG49dGhpcy5fZGltTmFtZSxpPXRoaXMuZ2V0VGFyZ2V0U2VyaWVzTW9kZWxzKCksbz10LmdldCgiZmlsdGVyTW9kZSIpLGM9dGhpcy5fdmFsdWVXaW5kb3c7Im5vbmUiIT09byYmUkEoaSxmdW5jdGlvbihpKXt2YXIgdT1pLmdldERhdGEoKSxoPXUubWFwRGltZW5zaW9uKG4sITApO2gubGVuZ3RoJiYoIndlYWtGaWx0ZXIiPT09bz91LmZpbHRlclNlbGYoZnVuY3Rpb24odCl7Zm9yKHZhciBlLGksbixvPTA7bzxoLmxlbmd0aDtvKyspe3ZhciBhPXUuZ2V0KGhbb10sdCkscj0haXNOYU4oYSkscz1hPGNbMF0sbD1hPmNbMV07aWYociYmIXMmJiFsKXJldHVybiEwO3ImJihuPSEwKSxzJiYoZT0hMCksbCYmKGk9ITApfXJldHVybiBuJiZlJiZpfSk6UkEoaCxmdW5jdGlvbih0KXtpZigiZW1wdHkiPT09bylpLnNldERhdGEodT11Lm1hcCh0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdD49Y1swXSYmdDw9Y1sxXX0odCk/dDpOYU59KSk7ZWxzZXt2YXIgZT17fTtlW3RdPWMsdS5zZWxlY3RSYW5nZShlKX19KSxSQShoLGZ1bmN0aW9uKHQpe3Uuc2V0QXBwcm94aW1hdGVFeHRlbnQoYyx0KX0pKX0pfX19O3ZhciBHQT1FLEZBPU9BLFdBPXdmKHt0eXBlOiJkYXRhWm9vbSIsZGVwZW5kZW5jaWVzOlsieEF4aXMiLCJ5QXhpcyIsInpBeGlzIiwicmFkaXVzQXhpcyIsImFuZ2xlQXhpcyIsInNpbmdsZUF4aXMiLCJzZXJpZXMiXSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjQsb3JpZW50Om51bGwseEF4aXNJbmRleDpudWxsLHlBeGlzSW5kZXg6bnVsbCxmaWx0ZXJNb2RlOiJmaWx0ZXIiLHRocm90dGxlOm51bGwsc3RhcnQ6MCxlbmQ6MTAwLHN0YXJ0VmFsdWU6bnVsbCxlbmRWYWx1ZTpudWxsLG1pblNwYW46bnVsbCxtYXhTcGFuOm51bGwsbWluVmFsdWVTcGFuOm51bGwsbWF4VmFsdWVTcGFuOm51bGwscmFuZ2VNb2RlOm51bGx9LGluaXQ6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2RhdGFJbnRlcnZhbEJ5QXhpcz17fSx0aGlzLl9kYXRhSW5mbz17fSx0aGlzLl9heGlzUHJveGllcz17fSx0aGlzLnRleHRTdHlsZU1vZGVsLHRoaXMuX2F1dG9UaHJvdHRsZT0hMCx0aGlzLl9yYW5nZVByb3BNb2RlPVsicGVyY2VudCIsInBlcmNlbnQiXTt2YXIgbj1IQSh0KTt0aGlzLnNldHRsZWRPcHRpb249bix0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsaSksdGhpcy5kb0luaXQobil9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPUhBKHQpO20odGhpcy5vcHRpb24sdCwhMCksbSh0aGlzLnNldHRsZWRPcHRpb24sZSwhMCksdGhpcy5kb0luaXQoZSl9LGRvSW5pdDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbjt2LmNhbnZhc1N1cHBvcnRlZHx8KGkucmVhbHRpbWU9ITEpLHRoaXMuX3NldERlZmF1bHRUaHJvdHRsZSh0KSxaQSh0aGlzLHQpO3ZhciBuPXRoaXMuc2V0dGxlZE9wdGlvbjtHQShbWyJzdGFydCIsInN0YXJ0VmFsdWUiXSxbImVuZCIsImVuZFZhbHVlIl1dLGZ1bmN0aW9uKHQsZSl7InZhbHVlIj09PXRoaXMuX3JhbmdlUHJvcE1vZGVbZV0mJihpW3RbMF1dPW5bdFswXV09bnVsbCl9LHRoaXMpLHRoaXMudGV4dFN0eWxlTW9kZWw9dGhpcy5nZXRNb2RlbCgidGV4dFN0eWxlIiksdGhpcy5fcmVzZXRUYXJnZXQoKSx0aGlzLl9naXZlQXhpc1Byb3hpZXMoKX0sX2dpdmVBeGlzUHJveGllczpmdW5jdGlvbigpe3ZhciByPXRoaXMuX2F4aXNQcm94aWVzO3RoaXMuZWFjaFRhcmdldEF4aXMoZnVuY3Rpb24odCxlLGksbil7dmFyIG89dGhpcy5kZXBlbmRlbnRNb2RlbHNbdC5heGlzXVtlXSxhPW8uX19kekF4aXNQcm94eXx8KG8uX19kekF4aXNQcm94eT1uZXcgekEodC5uYW1lLGUsdGhpcyxuKSk7clt0Lm5hbWUrIl8iK2VdPWF9LHRoaXMpfSxfcmVzZXRUYXJnZXQ6ZnVuY3Rpb24oKXt2YXIgaT10aGlzLm9wdGlvbix0PXRoaXMuX2p1ZGdlQXV0b01vZGUoKTtGQShmdW5jdGlvbih0KXt2YXIgZT10LmF4aXNJbmRleDtpW2VdPUVvKGlbZV0pfSx0aGlzKSwiYXhpc0luZGV4Ij09PXQ/dGhpcy5fYXV0b1NldEF4aXNJbmRleCgpOiJvcmllbnQiPT09dCYmdGhpcy5fYXV0b1NldE9yaWVudCgpfSxfanVkZ2VBdXRvTW9kZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9uLGk9ITE7RkEoZnVuY3Rpb24odCl7bnVsbCE9ZVt0LmF4aXNJbmRleF0mJihpPSEwKX0sdGhpcyk7dmFyIHQ9ZS5vcmllbnQ7cmV0dXJuIG51bGw9PXQmJmk/Im9yaWVudCI6aT92b2lkIDA6KG51bGw9PXQmJihlLm9yaWVudD0iaG9yaXpvbnRhbCIpLCJheGlzSW5kZXgiKX0sX2F1dG9TZXRBeGlzSW5kZXg6ZnVuY3Rpb24oKXt2YXIgYT0hMCxlPXRoaXMuZ2V0KCJvcmllbnQiLCEwKSxyPXRoaXMub3B0aW9uLHQ9dGhpcy5kZXBlbmRlbnRNb2RlbHM7aWYoYSl7dmFyIGk9InZlcnRpY2FsIj09PWU/InkiOiJ4Ijt0W2krIkF4aXMiXS5sZW5ndGg/KHJbaSsiQXhpc0luZGV4Il09WzBdLGE9ITEpOkdBKHQuc2luZ2xlQXhpcyxmdW5jdGlvbih0KXthJiZ0LmdldCgib3JpZW50IiwhMCk9PT1lJiYoci5zaW5nbGVBeGlzSW5kZXg9W3QuY29tcG9uZW50SW5kZXhdLGE9ITEpfSl9YSYmRkEoZnVuY3Rpb24odCl7aWYoYSl7dmFyIGU9W10saT10aGlzLmRlcGVuZGVudE1vZGVsc1t0LmF4aXNdO2lmKGkubGVuZ3RoJiYhZS5sZW5ndGgpZm9yKHZhciBuPTAsbz1pLmxlbmd0aDtuPG87bisrKSJjYXRlZ29yeSI9PT1pW25dLmdldCgidHlwZSIpJiZlLnB1c2gobik7KHJbdC5heGlzSW5kZXhdPWUpLmxlbmd0aCYmKGE9ITEpfX0sdGhpcyksYSYmdGhpcy5lY01vZGVsLmVhY2hTZXJpZXMoZnVuY3Rpb24obyl7dGhpcy5faXNTZXJpZXNIYXNBbGxBeGVzVHlwZU9mKG8sInZhbHVlIikmJkZBKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdC5heGlzSW5kZXhdLGk9by5nZXQodC5heGlzSW5kZXgpLG49by5nZXQodC5heGlzSWQpO18oZSxpPW8uZWNNb2RlbC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOnQuYXhpcyxpbmRleDppLGlkOm59KVswXS5jb21wb25lbnRJbmRleCk8MCYmZS5wdXNoKGkpfSl9LHRoaXMpfSxfYXV0b1NldE9yaWVudDpmdW5jdGlvbigpe3ZhciBlO3RoaXMuZWFjaFRhcmdldEF4aXMoZnVuY3Rpb24odCl7ZT1lfHx0Lm5hbWV9LHRoaXMpLHRoaXMub3B0aW9uLm9yaWVudD0ieSI9PT1lPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfaXNTZXJpZXNIYXNBbGxBeGVzVHlwZU9mOmZ1bmN0aW9uKG4sbyl7dmFyIGE9ITA7cmV0dXJuIEZBKGZ1bmN0aW9uKHQpe3ZhciBlPW4uZ2V0KHQuYXhpc0luZGV4KSxpPXRoaXMuZGVwZW5kZW50TW9kZWxzW3QuYXhpc11bZV07aSYmaS5nZXQoInR5cGUiKT09PW98fChhPSExKX0sdGhpcyksYX0sX3NldERlZmF1bHRUaHJvdHRsZTpmdW5jdGlvbih0KXtpZih0Lmhhc093blByb3BlcnR5KCJ0aHJvdHRsZSIpJiYodGhpcy5fYXV0b1Rocm90dGxlPSExKSx0aGlzLl9hdXRvVGhyb3R0bGUpe3ZhciBlPXRoaXMuZWNNb2RlbC5vcHRpb247dGhpcy5vcHRpb24udGhyb3R0bGU9ZS5hbmltYXRpb24mJjA8ZS5hbmltYXRpb25EdXJhdGlvblVwZGF0ZT8xMDA6MjB9fSxnZXRGaXJzdFRhcmdldEF4aXNNb2RlbDpmdW5jdGlvbigpe3ZhciBpO3JldHVybiBGQShmdW5jdGlvbih0KXtpZihudWxsPT1pKXt2YXIgZT10aGlzLmdldCh0LmF4aXNJbmRleCk7ZS5sZW5ndGgmJihpPXRoaXMuZGVwZW5kZW50TW9kZWxzW3QuYXhpc11bZVswXV0pfX0sdGhpcyksaX0sZWFjaFRhcmdldEF4aXM6ZnVuY3Rpb24oaSxuKXt2YXIgbz10aGlzLmVjTW9kZWw7RkEoZnVuY3Rpb24oZSl7R0EodGhpcy5nZXQoZS5heGlzSW5kZXgpLGZ1bmN0aW9uKHQpe2kuY2FsbChuLGUsdCx0aGlzLG8pfSx0aGlzKX0sdGhpcyl9LGdldEF4aXNQcm94eTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9heGlzUHJveGllc1t0KyJfIitlXX0sZ2V0QXhpc01vZGVsOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRBeGlzUHJveHkodCxlKTtyZXR1cm4gaSYmaS5nZXRBeGlzTW9kZWwoKX0sc2V0UmF3UmFuZ2U6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb24sbj10aGlzLnNldHRsZWRPcHRpb247R0EoW1sic3RhcnQiLCJzdGFydFZhbHVlIl0sWyJlbmQiLCJlbmRWYWx1ZSJdXSxmdW5jdGlvbih0KXtudWxsPT1lW3RbMF1dJiZudWxsPT1lW3RbMV1dfHwoaVt0WzBdXT1uW3RbMF1dPWVbdFswXV0saVt0WzFdXT1uW3RbMV1dPWVbdFsxXV0pfSx0aGlzKSxaQSh0aGlzLGUpfSxzZXRDYWxjdWxhdGVkUmFuZ2U6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb247R0EoWyJzdGFydCIsInN0YXJ0VmFsdWUiLCJlbmQiLCJlbmRWYWx1ZSJdLGZ1bmN0aW9uKHQpe2lbdF09ZVt0XX0pfSxnZXRQZXJjZW50UmFuZ2U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZpbmRSZXByZXNlbnRhdGl2ZUF4aXNQcm94eSgpO2lmKHQpcmV0dXJuIHQuZ2V0RGF0YVBlcmNlbnRXaW5kb3coKX0sZ2V0VmFsdWVSYW5nZTpmdW5jdGlvbih0LGUpe2lmKG51bGwhPXR8fG51bGwhPWUpcmV0dXJuIHRoaXMuZ2V0QXhpc1Byb3h5KHQsZSkuZ2V0RGF0YVZhbHVlV2luZG93KCk7dmFyIGk9dGhpcy5maW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHkoKTtyZXR1cm4gaT9pLmdldERhdGFWYWx1ZVdpbmRvdygpOnZvaWQgMH0sZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5OmZ1bmN0aW9uKHQpe2lmKHQpcmV0dXJuIHQuX19kekF4aXNQcm94eTt2YXIgZT10aGlzLl9heGlzUHJveGllcztmb3IodmFyIGkgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGkpJiZlW2ldLmhvc3RlZEJ5KHRoaXMpKXJldHVybiBlW2ldO2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkmJiFlW2ldLmhvc3RlZEJ5KHRoaXMpKXJldHVybiBlW2ldfSxnZXRSYW5nZVByb3BNb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlUHJvcE1vZGUuc2xpY2UoKX19KTtmdW5jdGlvbiBIQShlKXt2YXIgaT17fTtyZXR1cm4gR0EoWyJzdGFydCIsImVuZCIsInN0YXJ0VmFsdWUiLCJlbmRWYWx1ZSIsInRocm90dGxlIl0sZnVuY3Rpb24odCl7ZS5oYXNPd25Qcm9wZXJ0eSh0KSYmKGlbdF09ZVt0XSl9KSxpfWZ1bmN0aW9uIFpBKHQsbyl7dmFyIGE9dC5fcmFuZ2VQcm9wTW9kZSxyPXQuZ2V0KCJyYW5nZU1vZGUiKTtHQShbWyJzdGFydCIsInN0YXJ0VmFsdWUiXSxbImVuZCIsImVuZFZhbHVlIl1dLGZ1bmN0aW9uKHQsZSl7dmFyIGk9bnVsbCE9b1t0WzBdXSxuPW51bGwhPW9bdFsxXV07aSYmIW4/YVtlXT0icGVyY2VudCI6IWkmJm4/YVtlXT0idmFsdWUiOnI/YVtlXT1yW2VdOmkmJihhW2VdPSJwZXJjZW50Iil9KX12YXIgVUE9aGMuZXh0ZW5kKHt0eXBlOiJkYXRhWm9vbSIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuZGF0YVpvb21Nb2RlbD10LHRoaXMuZWNNb2RlbD1lLHRoaXMuYXBpPWl9LGdldFRhcmdldENvb3JkSW5mbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YVpvb21Nb2RlbCxvPXRoaXMuZWNNb2RlbCxhPXt9O3JldHVybiB0LmVhY2hUYXJnZXRBeGlzKGZ1bmN0aW9uKHQsZSl7dmFyIGk9by5nZXRDb21wb25lbnQodC5heGlzLGUpO2lmKGkpe3ZhciBuPWkuZ2V0Q29vcmRTeXNNb2RlbCgpO24mJmZ1bmN0aW9uKHQsZSxpLG4pe2Zvcih2YXIgbyxhPTA7YTxpLmxlbmd0aDthKyspaWYoaVthXS5tb2RlbD09PXQpe289aVthXTticmVha31vfHxpLnB1c2gobz17bW9kZWw6dCxheGlzTW9kZWxzOltdLGNvb3JkSW5kZXg6bn0pO28uYXhpc01vZGVscy5wdXNoKGUpfShuLGksYVtuLm1haW5UeXBlXXx8KGFbbi5tYWluVHlwZV09W10pLG4uY29tcG9uZW50SW5kZXgpfX0sdGhpcyksYX19KTtXQS5leHRlbmQoe3R5cGU6ImRhdGFab29tLnNlbGVjdCJ9KSxVQS5leHRlbmQoe3R5cGU6ImRhdGFab29tLnNlbGVjdCJ9KSxwZih7Z2V0VGFyZ2V0U2VyaWVzOmZ1bmN0aW9uKHQpe3ZhciBuPVEoKTtyZXR1cm4gdC5lYWNoQ29tcG9uZW50KCJkYXRhWm9vbSIsZnVuY3Rpb24odCl7dC5lYWNoVGFyZ2V0QXhpcyhmdW5jdGlvbih0LGUsaSl7RShpLmdldEF4aXNQcm94eSh0Lm5hbWUsZSkuZ2V0VGFyZ2V0U2VyaWVzTW9kZWxzKCksZnVuY3Rpb24odCl7bi5zZXQodC51aWQsdCl9KX0pfSksbn0sbW9kaWZ5T3V0cHV0RW5kOiEwLG92ZXJhbGxSZXNldDpmdW5jdGlvbih0LG4pe3QuZWFjaENvbXBvbmVudCgiZGF0YVpvb20iLGZ1bmN0aW9uKHQpe3QuZWFjaFRhcmdldEF4aXMoZnVuY3Rpb24odCxlLGkpe2kuZ2V0QXhpc1Byb3h5KHQubmFtZSxlKS5yZXNldChpLG4pfSksdC5lYWNoVGFyZ2V0QXhpcyhmdW5jdGlvbih0LGUsaSl7aS5nZXRBeGlzUHJveHkodC5uYW1lLGUpLmZpbHRlckRhdGEoaSxuKX0pfSksdC5lYWNoQ29tcG9uZW50KCJkYXRhWm9vbSIsZnVuY3Rpb24odCl7dmFyIGU9dC5maW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHkoKSxpPWUuZ2V0RGF0YVBlcmNlbnRXaW5kb3coKSxuPWUuZ2V0RGF0YVZhbHVlV2luZG93KCk7dC5zZXRDYWxjdWxhdGVkUmFuZ2Uoe3N0YXJ0OmlbMF0sZW5kOmlbMV0sc3RhcnRWYWx1ZTpuWzBdLGVuZFZhbHVlOm5bMV19KX0pfX0pLGdmKCJkYXRhWm9vbSIsZnVuY3Rpb24oaSx0KXt2YXIgbj1FQShBKHQuZWFjaENvbXBvbmVudCx0LCJkYXRhWm9vbSIpLE9BLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0KGUuYXhpc0luZGV4KX0pLG89W107dC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToiZGF0YVpvb20iLHF1ZXJ5Oml9LGZ1bmN0aW9uKHQsZSl7by5wdXNoLmFwcGx5KG8sbih0KS5ub2Rlcyl9KSxFKG8sZnVuY3Rpb24odCxlKXt0LnNldFJhd1JhbmdlKHtzdGFydDppLnN0YXJ0LGVuZDppLmVuZCxzdGFydFZhbHVlOmkuc3RhcnRWYWx1ZSxlbmRWYWx1ZTppLmVuZFZhbHVlfSl9KX0pO3ZhciBYQT1DYy50b29sYm94LmRhdGFab29tLFlBPUU7ZnVuY3Rpb24gakEodCxlLGkpeyh0aGlzLl9icnVzaENvbnRyb2xsZXI9bmV3IGdiKGkuZ2V0WnIoKSkpLm9uKCJicnVzaCIsQSh0aGlzLl9vbkJydXNoLHRoaXMpKS5tb3VudCgpLHRoaXMuX2lzWm9vbUFjdGl2ZX1qQS5kZWZhdWx0T3B0aW9uPXtzaG93OiEwLGZpbHRlck1vZGU6ImZpbHRlciIsaWNvbjp7em9vbToiTTAsMTMuNWgyNi45IE0xMy41LDI2LjlWMCBNMzIuMSwxMy41SDU4VjU4SDEzLjUgVjMyLjEiLGJhY2s6Ik0yMiwxLjRMOS45LDEzLjVsMTIuMywxMi4zIE0xMC4zLDEzLjVINTQuOXY0NC42IEgxMC4zdi0yNiJ9LHRpdGxlOkQoWEEudGl0bGUpfTt2YXIgcUE9akEucHJvdG90eXBlO3FBLnJlbmRlcj1mdW5jdGlvbih0LGUsaSxuKXt0aGlzLm1vZGVsPXQsdGhpcy5lY01vZGVsPWUsdGhpcy5hcGk9aSxmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhPWkuX2lzWm9vbUFjdGl2ZTtuJiYidGFrZUdsb2JhbEN1cnNvciI9PT1uLnR5cGUmJihhPSJkYXRhWm9vbVNlbGVjdCI9PT1uLmtleSYmbi5kYXRhWm9vbVNlbGVjdEFjdGl2ZSk7aS5faXNab29tQWN0aXZlPWEsdC5zZXRJY29uU3RhdHVzKCJ6b29tIixhPyJlbXBoYXNpcyI6Im5vcm1hbCIpO3ZhciByPW5ldyBwQSgkQSh0Lm9wdGlvbiksZSx7aW5jbHVkZTpbImdyaWQiXX0pO2kuX2JydXNoQ29udHJvbGxlci5zZXRQYW5lbHMoci5tYWtlUGFuZWxPcHRzKG8sZnVuY3Rpb24odCl7cmV0dXJuIHQueEF4aXNEZWNsYXJlZCYmIXQueUF4aXNEZWNsYXJlZD8ibGluZVgiOiF0LnhBeGlzRGVjbGFyZWQmJnQueUF4aXNEZWNsYXJlZD8ibGluZVkiOiJyZWN0In0pKS5lbmFibGVCcnVzaCghIWEmJnticnVzaFR5cGU6ImF1dG8iLGJydXNoU3R5bGU6e2xpbmVXaWR0aDowLGZpbGw6InJnYmEoMCwwLDAsMC4yKSJ9fSl9KHQsZSx0aGlzLG4saSksZnVuY3Rpb24odCxlKXt0LnNldEljb25TdGF0dXMoImJhY2siLDE8ZnVuY3Rpb24odCl7cmV0dXJuIERBKHQpLmxlbmd0aH0oZSk/ImVtcGhhc2lzIjoibm9ybWFsIil9KHQsZSl9LHFBLm9uY2xpY2s9ZnVuY3Rpb24odCxlLGkpe0tBW2ldLmNhbGwodGhpcyl9LHFBLnJlbW92ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2JydXNoQ29udHJvbGxlci51bm1vdW50KCl9LHFBLmRpc3Bvc2U9ZnVuY3Rpb24odCxlKXt0aGlzLl9icnVzaENvbnRyb2xsZXIuZGlzcG9zZSgpfTt2YXIgS0E9e3pvb206ZnVuY3Rpb24oKXt2YXIgdD0hdGhpcy5faXNab29tQWN0aXZlO3RoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0YWtlR2xvYmFsQ3Vyc29yIixrZXk6ImRhdGFab29tU2VsZWN0IixkYXRhWm9vbVNlbGVjdEFjdGl2ZTp0fSl9LGJhY2s6ZnVuY3Rpb24oKXt0aGlzLl9kaXNwYXRjaFpvb21BY3Rpb24oZnVuY3Rpb24odCl7dmFyIG49REEodCksZT1uW24ubGVuZ3RoLTFdOzE8bi5sZW5ndGgmJm4ucG9wKCk7dmFyIG89e307cmV0dXJuIFRBKGUsZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9bi5sZW5ndGgtMTswPD1pO2ktLSl7aWYodD1uW2ldW2VdKXtvW2VdPXQ7YnJlYWt9fX0pLG99KHRoaXMuZWNNb2RlbCkpfX07ZnVuY3Rpb24gJEEoZSl7dmFyIGk9e307cmV0dXJuIEUoWyJ4QXhpc0luZGV4IiwieUF4aXNJbmRleCJdLGZ1bmN0aW9uKHQpe2lbdF09ZVt0XSxudWxsPT1pW3RdJiYoaVt0XT0iYWxsIiksITEhPT1pW3RdJiYibm9uZSIhPT1pW3RdfHwoaVt0XT1bXSl9KSxpfXFBLl9vbkJydXNoPWZ1bmN0aW9uKHQsZSl7aWYoZS5pc0VuZCYmdC5sZW5ndGgpe3ZhciBzPXt9LGw9dGhpcy5lY01vZGVsO3RoaXMuX2JydXNoQ29udHJvbGxlci51cGRhdGVDb3ZlcnMoW10pLG5ldyBwQSgkQSh0aGlzLm1vZGVsLm9wdGlvbiksbCx7aW5jbHVkZTpbImdyaWQiXX0pLm1hdGNoT3V0cHV0UmFuZ2VzKHQsbCxmdW5jdGlvbih0LGUsaSl7aWYoImNhcnRlc2lhbjJkIj09PWkudHlwZSl7dmFyIG49dC5icnVzaFR5cGU7InJlY3QiPT09bj8obygieCIsaSxlWzBdKSxvKCJ5IixpLGVbMV0pKTpvKHtsaW5lWDoieCIsbGluZVk6InkifVtuXSxpLGUpfX0pLGZ1bmN0aW9uKGEsdCl7dmFyIHI9REEoYSk7VEEodCxmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1yLmxlbmd0aC0xOzA8PWk7aS0tKXtpZihyW2ldW2VdKWJyZWFrfWlmKGk8MCl7dmFyIG49YS5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJkYXRhWm9vbSIsc3ViVHlwZToic2VsZWN0IixpZDplfSlbMF07aWYobil7dmFyIG89bi5nZXRQZXJjZW50UmFuZ2UoKTtyWzBdW2VdPXtkYXRhWm9vbUlkOmUsc3RhcnQ6b1swXSxlbmQ6b1sxXX19fX0pLHIucHVzaCh0KX0obCxzKSx0aGlzLl9kaXNwYXRjaFpvb21BY3Rpb24ocyl9ZnVuY3Rpb24gbyh0LGUsaSl7dmFyIG49ZS5nZXRBeGlzKHQpLG89bi5tb2RlbCxhPWZ1bmN0aW9uKGUsaSx0KXt2YXIgbjtyZXR1cm4gdC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToiZGF0YVpvb20iLHN1YlR5cGU6InNlbGVjdCJ9LGZ1bmN0aW9uKHQpe3QuZ2V0QXhpc01vZGVsKGUsaS5jb21wb25lbnRJbmRleCkmJihuPXQpfSksbn0odCxvLGwpLHI9YS5maW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHkobykuZ2V0TWluTWF4U3BhbigpO251bGw9PXIubWluVmFsdWVTcGFuJiZudWxsPT1yLm1heFZhbHVlU3Bhbnx8KGk9V3coMCxpLnNsaWNlKCksbi5zY2FsZS5nZXRFeHRlbnQoKSwwLHIubWluVmFsdWVTcGFuLHIubWF4VmFsdWVTcGFuKSksYSYmKHNbYS5pZF09e2RhdGFab29tSWQ6YS5pZCxzdGFydFZhbHVlOmlbMF0sZW5kVmFsdWU6aVsxXX0pfX0scUEuX2Rpc3BhdGNoWm9vbUFjdGlvbj1mdW5jdGlvbih0KXt2YXIgaT1bXTtZQSh0LGZ1bmN0aW9uKHQsZSl7aS5wdXNoKEQodCkpfSksaS5sZW5ndGgmJnRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJkYXRhWm9vbSIsZnJvbTp0aGlzLnVpZCxiYXRjaDppfSl9LEhUKCJkYXRhWm9vbSIsakEpLGZmKGZ1bmN0aW9uKHMpe2lmKHMpe3ZhciBsPXMuZGF0YVpvb218fChzLmRhdGFab29tPVtdKTtrKGwpfHwocy5kYXRhWm9vbT1sPVtsXSk7dmFyIHQ9cy50b29sYm94O2lmKHQmJihrKHQpJiYodD10WzBdKSx0JiZ0LmZlYXR1cmUpKXt2YXIgZT10LmZlYXR1cmUuZGF0YVpvb207aSgieEF4aXMiLGUpLGkoInlBeGlzIixlKX19ZnVuY3Rpb24gaShuLG8pe2lmKG8pe3ZhciBhPW4rIkluZGV4IixyPW9bYV07bnVsbD09cnx8ImFsbCI9PT1yfHxrKHIpfHwocj0hMT09PXJ8fCJub25lIj09PXI/W106W3JdKSxmdW5jdGlvbih0LGUpe3ZhciBpPXNbdF07ayhpKXx8KGk9aT9baV06W10pO1lBKGksZSl9KG4sZnVuY3Rpb24odCxlKXtpZihudWxsPT1yfHwiYWxsIj09PXJ8fC0xIT09XyhyLGUpKXt2YXIgaT17dHlwZToic2VsZWN0IiwkZnJvbVRvb2xib3g6ITAsZmlsdGVyTW9kZTpvLmZpbHRlck1vZGV8fCJmaWx0ZXIiLGlkOiJcMF9lY19cMHRvb2xib3gtZGF0YVpvb21fIituK2V9O2lbYV09ZSxsLnB1c2goaSl9fSl9fX0pO3ZhciBKQT1DYy50b29sYm94LnJlc3RvcmU7ZnVuY3Rpb24gUUEodCl7dGhpcy5tb2RlbD10fVFBLmRlZmF1bHRPcHRpb249e3Nob3c6ITAsaWNvbjoiTTMuOCwzMy40IE00NywxOC45aDkuOFY4LjcgTTU2LjMsMjAuMSBDNTIuMSw5LDQwLjUsMC42LDI2LjgsMi4xQzEyLjYsMy43LDEuNiwxNi4yLDIuMSwzMC42IE0xMyw0MS4xSDMuMXYxMC4yIE0zLjcsMzkuOWM0LjIsMTEuMSwxNS44LDE5LjUsMjkuNSwxOCBjMTQuMi0xLjYsMjUuMi0xNC4xLDI0LjctMjguNSIsdGl0bGU6SkEudGl0bGV9LFFBLnByb3RvdHlwZS5vbmNsaWNrPWZ1bmN0aW9uKHQsZSxpKXshZnVuY3Rpb24odCl7dFtBQV09bnVsbH0odCksZS5kaXNwYXRjaEFjdGlvbih7dHlwZToicmVzdG9yZSIsZnJvbTp0aGlzLnVpZH0pfSxIVCgicmVzdG9yZSIsUUEpLGdmKHt0eXBlOiJyZXN0b3JlIixldmVudDoicmVzdG9yZSIsdXBkYXRlOiJwcmVwYXJlQW5kVXBkYXRlIn0sZnVuY3Rpb24odCxlKXtlLnJlc2V0T3B0aW9uKCJyZWNyZWF0ZSIpfSksd2Yoe3R5cGU6InRvb2x0aXAiLGRlcGVuZGVuY2llczpbImF4aXNQb2ludGVyIl0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo2MCxzaG93OiEwLHNob3dDb250ZW50OiEwLHRyaWdnZXI6Iml0ZW0iLHRyaWdnZXJPbjoibW91c2Vtb3ZlfGNsaWNrIixhbHdheXNTaG93Q29udGVudDohMSxkaXNwbGF5TW9kZToic2luZ2xlIixyZW5kZXJNb2RlOiJhdXRvIixjb25maW5lOiExLHNob3dEZWxheTowLGhpZGVEZWxheToxMDAsdHJhbnNpdGlvbkR1cmF0aW9uOi40LGVudGVyYWJsZTohMSxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoNTAsNTAsNTAsMC43KSIsYm9yZGVyQ29sb3I6IiMzMzMiLGJvcmRlclJhZGl1czo0LGJvcmRlcldpZHRoOjAscGFkZGluZzo1LGV4dHJhQ3NzVGV4dDoiIixheGlzUG9pbnRlcjp7dHlwZToibGluZSIsYXhpczoiYXV0byIsYW5pbWF0aW9uOiJhdXRvIixhbmltYXRpb25EdXJhdGlvblVwZGF0ZToyMDAsYW5pbWF0aW9uRWFzaW5nVXBkYXRlOiJleHBvbmVudGlhbE91dCIsY3Jvc3NTdHlsZTp7Y29sb3I6IiM5OTkiLHdpZHRoOjEsdHlwZToiZGFzaGVkIix0ZXh0U3R5bGU6e319fSx0ZXh0U3R5bGU6e2NvbG9yOiIjZmZmIixmb250U2l6ZToxNH19fSk7dmFyIHREPUUsZUQ9JGwsaUQ9WyIiLCItd2Via2l0LSIsIi1tb3otIiwiLW8tIl07ZnVuY3Rpb24gbkQobyl7dmFyIGE9W10sdD1vLmdldCgidHJhbnNpdGlvbkR1cmF0aW9uIiksZT1vLmdldCgiYmFja2dyb3VuZENvbG9yIiksaT1vLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKSxuPW8uZ2V0KCJwYWRkaW5nIik7cmV0dXJuIHQmJmEucHVzaChmdW5jdGlvbih0KXt2YXIgZT0iY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpIixpPSJsZWZ0ICIrdCsicyAiK2UrIix0b3AgIit0KyJzICIrZTtyZXR1cm4gTihpRCxmdW5jdGlvbih0KXtyZXR1cm4gdCsidHJhbnNpdGlvbjoiK2l9KS5qb2luKCI7Iil9KHQpKSxlJiYodi5jYW52YXNTdXBwb3J0ZWQ/YS5wdXNoKCJiYWNrZ3JvdW5kLUNvbG9yOiIrZSk6KGEucHVzaCgiYmFja2dyb3VuZC1Db2xvcjojIitHZShlKSksYS5wdXNoKCJmaWx0ZXI6YWxwaGEob3BhY2l0eT03MCkiKSkpLHREKFsid2lkdGgiLCJjb2xvciIsInJhZGl1cyJdLGZ1bmN0aW9uKHQpe3ZhciBlPSJib3JkZXItIit0LGk9ZUQoZSksbj1vLmdldChpKTtudWxsIT1uJiZhLnB1c2goZSsiOiIrbisoImNvbG9yIj09PXQ/IiI6InB4IikpfSksYS5wdXNoKGZ1bmN0aW9uKGkpe3ZhciBuPVtdLHQ9aS5nZXQoImZvbnRTaXplIiksZT1pLmdldFRleHRDb2xvcigpO3JldHVybiBlJiZuLnB1c2goImNvbG9yOiIrZSksbi5wdXNoKCJmb250OiIraS5nZXRGb250KCkpLHQmJm4ucHVzaCgibGluZS1oZWlnaHQ6IitNYXRoLnJvdW5kKDMqdC8yKSsicHgiKSx0RChbImRlY29yYXRpb24iLCJhbGlnbiJdLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0KHQpO2UmJm4ucHVzaCgidGV4dC0iK3QrIjoiK2UpfSksbi5qb2luKCI7Iil9KGkpKSxudWxsIT1uJiZhLnB1c2goInBhZGRpbmc6IitKbChuKS5qb2luKCJweCAiKSsicHgiKSxhLmpvaW4oIjsiKSsiOyJ9ZnVuY3Rpb24gb0QoaSx0KXtpZih2Lnd4YSlyZXR1cm4gbnVsbDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXRoaXMuX3pyPXQuZ2V0WnIoKTt0aGlzLmVsPWUsdGhpcy5feD10LmdldFdpZHRoKCkvMix0aGlzLl95PXQuZ2V0SGVpZ2h0KCkvMixpLmFwcGVuZENoaWxkKGUpLHRoaXMuX2NvbnRhaW5lcj1pLHRoaXMuX3Nob3c9ITEsdGhpcy5faGlkZVRpbWVvdXQ7dmFyIG89dGhpcztlLm9ubW91c2VlbnRlcj1mdW5jdGlvbigpe28uX2VudGVyYWJsZSYmKGNsZWFyVGltZW91dChvLl9oaWRlVGltZW91dCksby5fc2hvdz0hMCksby5faW5Db250ZW50PSEwfSxlLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKHQpe2lmKHQ9dHx8d2luZG93LmV2ZW50LCFvLl9lbnRlcmFibGUpe3ZhciBlPW4uaGFuZGxlcjtHdChpLHQsITApLGUuZGlzcGF0Y2goIm1vdXNlbW92ZSIsdCl9fSxlLm9ubW91c2VsZWF2ZT1mdW5jdGlvbigpe28uX2VudGVyYWJsZSYmby5fc2hvdyYmby5oaWRlTGF0ZXIoby5faGlkZURlbGF5KSxvLl9pbkNvbnRlbnQ9ITF9fWZ1bmN0aW9uIGFEKHQpe3RoaXMuX3pyPXQuZ2V0WnIoKSx0aGlzLl9zaG93PSExLHRoaXMuX2hpZGVUaW1lb3V0fW9ELnByb3RvdHlwZT17Y29uc3RydWN0b3I6b0QsX2VudGVyYWJsZTohMCx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250YWluZXIsZT10LmN1cnJlbnRTdHlsZXx8ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0KSxpPXQuc3R5bGU7ImFic29sdXRlIiE9PWkucG9zaXRpb24mJiJhYnNvbHV0ZSIhPT1lLnBvc2l0aW9uJiYoaS5wb3NpdGlvbj0icmVsYXRpdmUiKX0sc2hvdzpmdW5jdGlvbih0KXtjbGVhclRpbWVvdXQodGhpcy5faGlkZVRpbWVvdXQpO3ZhciBlPXRoaXMuZWw7ZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO2JvcmRlci1zdHlsZTpzb2xpZDt3aGl0ZS1zcGFjZTpub3dyYXA7ei1pbmRleDo5OTk5OTk5OyIrbkQodCkrIjtsZWZ0OiIrdGhpcy5feCsicHg7dG9wOiIrdGhpcy5feSsicHg7IisodC5nZXQoImV4dHJhQ3NzVGV4dCIpfHwiIiksZS5zdHlsZS5kaXNwbGF5PWUuaW5uZXJIVE1MPyJibG9jayI6Im5vbmUiLGUuc3R5bGUucG9pbnRlckV2ZW50cz10aGlzLl9lbnRlcmFibGU/ImF1dG8iOiJub25lIix0aGlzLl9zaG93PSEwfSxzZXRDb250ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZWwuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH0sc2V0RW50ZXJhYmxlOmZ1bmN0aW9uKHQpe3RoaXMuX2VudGVyYWJsZT10fSxnZXRTaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbDtyZXR1cm5bdC5jbGllbnRXaWR0aCx0LmNsaWVudEhlaWdodF19LG1vdmVUbzpmdW5jdGlvbih0LGUpe3ZhciBpLG49dGhpcy5fenI7biYmbi5wYWludGVyJiYoaT1uLnBhaW50ZXIuZ2V0Vmlld3BvcnRSb290T2Zmc2V0KCkpJiYodCs9aS5vZmZzZXRMZWZ0LGUrPWkub2Zmc2V0VG9wKTt2YXIgbz10aGlzLmVsLnN0eWxlO28ubGVmdD10KyJweCIsby50b3A9ZSsicHgiLHRoaXMuX3g9dCx0aGlzLl95PWV9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmVsLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX3Nob3c9ITF9LGhpZGVMYXRlcjpmdW5jdGlvbih0KXshdGhpcy5fc2hvd3x8dGhpcy5faW5Db250ZW50JiZ0aGlzLl9lbnRlcmFibGV8fCh0Pyh0aGlzLl9oaWRlRGVsYXk9dCx0aGlzLl9zaG93PSExLHRoaXMuX2hpZGVUaW1lb3V0PXNldFRpbWVvdXQoQSh0aGlzLmhpZGUsdGhpcyksdCkpOnRoaXMuaGlkZSgpKX0saXNTaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nob3d9LGdldE91dGVyU2l6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWwuY2xpZW50V2lkdGgsZT10aGlzLmVsLmNsaWVudEhlaWdodDtpZihkb2N1bWVudC5kZWZhdWx0VmlldyYmZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSl7dmFyIGk9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsKTtpJiYodCs9cGFyc2VJbnQoaS5ib3JkZXJMZWZ0V2lkdGgsMTApK3BhcnNlSW50KGkuYm9yZGVyUmlnaHRXaWR0aCwxMCksZSs9cGFyc2VJbnQoaS5ib3JkZXJUb3BXaWR0aCwxMCkrcGFyc2VJbnQoaS5ib3JkZXJCb3R0b21XaWR0aCwxMCkpfXJldHVybnt3aWR0aDp0LGhlaWdodDplfX19LGFELnByb3RvdHlwZT17Y29uc3RydWN0b3I6YUQsX2VudGVyYWJsZTohMCx1cGRhdGU6ZnVuY3Rpb24oKXt9LHNob3c6ZnVuY3Rpb24odCl7dGhpcy5faGlkZVRpbWVvdXQmJmNsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZW91dCksdGhpcy5lbC5hdHRyKCJzaG93IiwhMCksdGhpcy5fc2hvdz0hMH0sc2V0Q29udGVudDpmdW5jdGlvbih0LGUsaSl7dGhpcy5lbCYmdGhpcy5fenIucmVtb3ZlKHRoaXMuZWwpO2Zvcih2YXIgbj17fSxvPXQsYT0ie21hcmtlciIscj1vLmluZGV4T2YoYSk7MDw9cjspe3ZhciBzPW8uaW5kZXhPZigifH0iKSxsPW8uc3Vic3RyKHIrYS5sZW5ndGgscy1yLWEubGVuZ3RoKTstMTxsLmluZGV4T2YoInN1YiIpP25bIm1hcmtlciIrbF09e3RleHRXaWR0aDo0LHRleHRIZWlnaHQ6NCx0ZXh0Qm9yZGVyUmFkaXVzOjIsdGV4dEJhY2tncm91bmRDb2xvcjplW2xdLHRleHRPZmZzZXQ6WzMsMF19Om5bIm1hcmtlciIrbF09e3RleHRXaWR0aDoxMCx0ZXh0SGVpZ2h0OjEwLHRleHRCb3JkZXJSYWRpdXM6NSx0ZXh0QmFja2dyb3VuZENvbG9yOmVbbF19LHI9KG89by5zdWJzdHIocysxKSkuaW5kZXhPZigie21hcmtlciIpfXRoaXMuZWw9bmV3IEZyKHtzdHlsZTp7cmljaDpuLHRleHQ6dCx0ZXh0TGluZUhlaWdodDoyMCx0ZXh0QmFja2dyb3VuZENvbG9yOmkuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKSx0ZXh0Qm9yZGVyUmFkaXVzOmkuZ2V0KCJib3JkZXJSYWRpdXMiKSx0ZXh0RmlsbDppLmdldCgidGV4dFN0eWxlLmNvbG9yIiksdGV4dFBhZGRpbmc6aS5nZXQoInBhZGRpbmciKX0sejppLmdldCgieiIpfSksdGhpcy5fenIuYWRkKHRoaXMuZWwpO3ZhciB1PXRoaXM7dGhpcy5lbC5vbigibW91c2VvdmVyIixmdW5jdGlvbigpe3UuX2VudGVyYWJsZSYmKGNsZWFyVGltZW91dCh1Ll9oaWRlVGltZW91dCksdS5fc2hvdz0hMCksdS5faW5Db250ZW50PSEwfSksdGhpcy5lbC5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dS5fZW50ZXJhYmxlJiZ1Ll9zaG93JiZ1LmhpZGVMYXRlcih1Ll9oaWRlRGVsYXkpLHUuX2luQ29udGVudD0hMX0pfSxzZXRFbnRlcmFibGU6ZnVuY3Rpb24odCl7dGhpcy5fZW50ZXJhYmxlPXR9LGdldFNpemU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsLmdldEJvdW5kaW5nUmVjdCgpO3JldHVyblt0LndpZHRoLHQuaGVpZ2h0XX0sbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5lbCYmdGhpcy5lbC5hdHRyKCJwb3NpdGlvbiIsW3QsZV0pfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5lbCYmdGhpcy5lbC5oaWRlKCksdGhpcy5fc2hvdz0hMX0saGlkZUxhdGVyOmZ1bmN0aW9uKHQpeyF0aGlzLl9zaG93fHx0aGlzLl9pbkNvbnRlbnQmJnRoaXMuX2VudGVyYWJsZXx8KHQ/KHRoaXMuX2hpZGVEZWxheT10LHRoaXMuX3Nob3c9ITEsdGhpcy5faGlkZVRpbWVvdXQ9c2V0VGltZW91dChBKHRoaXMuaGlkZSx0aGlzKSx0KSk6dGhpcy5oaWRlKCkpfSxpc1Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd30sZ2V0T3V0ZXJTaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRTaXplKCk7cmV0dXJue3dpZHRoOnRbMF0saGVpZ2h0OnRbMV19fX07dmFyIHJEPUEsc0Q9RSxsRD1QbCx1RD1uZXcgaXMoe3NoYXBlOnt4Oi0xLHk6LTEsd2lkdGg6MixoZWlnaHQ6Mn19KTtmdW5jdGlvbiBoRCh0KXtmb3IodmFyIGU9dC5wb3AoKTt0Lmxlbmd0aDspe3ZhciBpPXQucG9wKCk7aSYmKElsLmlzSW5zdGFuY2UoaSkmJihpPWkuZ2V0KCJ0b29sdGlwIiwhMCkpLCJzdHJpbmciPT10eXBlb2YgaSYmKGk9e2Zvcm1hdHRlcjppfSksZT1uZXcgSWwoaSxlLGUuZWNNb2RlbCkpfXJldHVybiBlfWZ1bmN0aW9uIGNEKHQsZSl7cmV0dXJuIHQuZGlzcGF0Y2hBY3Rpb258fEEoZS5kaXNwYXRjaEFjdGlvbixlKX1mdW5jdGlvbiBkRCh0KXtyZXR1cm4iY2VudGVyIj09PXR8fCJtaWRkbGUiPT09dH1iZih7dHlwZToidG9vbHRpcCIsaW5pdDpmdW5jdGlvbih0LGUpe2lmKCF2Lm5vZGUpe3ZhciBpLG49dC5nZXRDb21wb25lbnQoInRvb2x0aXAiKS5nZXQoInJlbmRlck1vZGUiKTt0aGlzLl9yZW5kZXJNb2RlPXFvKG4pLCJodG1sIj09PXRoaXMuX3JlbmRlck1vZGU/KGk9bmV3IG9EKGUuZ2V0RG9tKCksZSksdGhpcy5fbmV3TGluZT0iPGJyLz4iKTooaT1uZXcgYUQoZSksdGhpcy5fbmV3TGluZT0iXG4iKSx0aGlzLl90b29sdGlwQ29udGVudD1pfX0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXtpZighdi5ub2RlKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX3Rvb2x0aXBNb2RlbD10LHRoaXMuX2VjTW9kZWw9ZSx0aGlzLl9hcGk9aSx0aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXM9bnVsbCx0aGlzLl9hbHdheXNTaG93Q29udGVudD10LmdldCgiYWx3YXlzU2hvd0NvbnRlbnQiKTt2YXIgbj10aGlzLl90b29sdGlwQ29udGVudDtuLnVwZGF0ZSgpLG4uc2V0RW50ZXJhYmxlKHQuZ2V0KCJlbnRlcmFibGUiKSksdGhpcy5faW5pdEdsb2JhbExpc3RlbmVyKCksdGhpcy5fa2VlcFNob3coKX19LF9pbml0R2xvYmFsTGlzdGVuZXI6ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl90b29sdGlwTW9kZWwuZ2V0KCJ0cmlnZ2VyT24iKTtRTSgiaXRlbVRvb2x0aXAiLHRoaXMuX2FwaSxyRChmdW5jdGlvbih0LGUsaSl7Im5vbmUiIT09biYmKDA8PW4uaW5kZXhPZih0KT90aGlzLl90cnlTaG93KGUsaSk6ImxlYXZlIj09PXQmJnRoaXMuX2hpZGUoaSkpfSx0aGlzKSl9LF9rZWVwU2hvdzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Rvb2x0aXBNb2RlbCxlPXRoaXMuX2VjTW9kZWwsaT10aGlzLl9hcGk7aWYobnVsbCE9dGhpcy5fbGFzdFgmJm51bGwhPXRoaXMuX2xhc3RZJiYibm9uZSIhPT10LmdldCgidHJpZ2dlck9uIikpe3ZhciBuPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMuX3JlZnJlc2hVcGRhdGVUaW1lb3V0KSx0aGlzLl9yZWZyZXNoVXBkYXRlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5pc0Rpc3Bvc2VkKCl8fG4ubWFudWFsbHlTaG93VGlwKHQsZSxpLHt4Om4uX2xhc3RYLHk6bi5fbGFzdFl9KX0pfX0sbWFudWFsbHlTaG93VGlwOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKG4uZnJvbSE9PXRoaXMudWlkJiYhdi5ub2RlKXt2YXIgbz1jRChuLGkpO3RoaXMuX3RpY2tldD0iIjt2YXIgYT1uLmRhdGFCeUNvb3JkU3lzO2lmKG4udG9vbHRpcCYmbnVsbCE9bi54JiZudWxsIT1uLnkpe3ZhciByPXVEO3IucG9zaXRpb249W24ueCxuLnldLHIudXBkYXRlKCksci50b29sdGlwPW4udG9vbHRpcCx0aGlzLl90cnlTaG93KHtvZmZzZXRYOm4ueCxvZmZzZXRZOm4ueSx0YXJnZXQ6cn0sbyl9ZWxzZSBpZihhKXRoaXMuX3RyeVNob3coe29mZnNldFg6bi54LG9mZnNldFk6bi55LHBvc2l0aW9uOm4ucG9zaXRpb24sZXZlbnQ6e30sZGF0YUJ5Q29vcmRTeXM6bi5kYXRhQnlDb29yZFN5cyx0b29sdGlwT3B0aW9uOm4udG9vbHRpcE9wdGlvbn0sbyk7ZWxzZSBpZihudWxsIT1uLnNlcmllc0luZGV4KXtpZih0aGlzLl9tYW51YWxseUF4aXNTaG93VGlwKHQsZSxpLG4pKXJldHVybjt2YXIgcz1XTShuLGUpLGw9cy5wb2ludFswXSx1PXMucG9pbnRbMV07bnVsbCE9bCYmbnVsbCE9dSYmdGhpcy5fdHJ5U2hvdyh7b2Zmc2V0WDpsLG9mZnNldFk6dSxwb3NpdGlvbjpuLnBvc2l0aW9uLHRhcmdldDpzLmVsLGV2ZW50Ont9fSxvKX1lbHNlIG51bGwhPW4ueCYmbnVsbCE9bi55JiYoaS5kaXNwYXRjaEFjdGlvbih7dHlwZToidXBkYXRlQXhpc1BvaW50ZXIiLHg6bi54LHk6bi55fSksdGhpcy5fdHJ5U2hvdyh7b2Zmc2V0WDpuLngsb2Zmc2V0WTpuLnkscG9zaXRpb246bi5wb3NpdGlvbix0YXJnZXQ6aS5nZXRacigpLmZpbmRIb3ZlcihuLngsbi55KS50YXJnZXQsZXZlbnQ6e319LG8pKX19LG1hbnVhbGx5SGlkZVRpcDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10aGlzLl90b29sdGlwQ29udGVudDshdGhpcy5fYWx3YXlzU2hvd0NvbnRlbnQmJnRoaXMuX3Rvb2x0aXBNb2RlbCYmby5oaWRlTGF0ZXIodGhpcy5fdG9vbHRpcE1vZGVsLmdldCgiaGlkZURlbGF5IikpLHRoaXMuX2xhc3RYPXRoaXMuX2xhc3RZPW51bGwsbi5mcm9tIT09dGhpcy51aWQmJnRoaXMuX2hpZGUoY0QobixpKSl9LF9tYW51YWxseUF4aXNTaG93VGlwOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPW4uc2VyaWVzSW5kZXgsYT1uLmRhdGFJbmRleCxyPWUuZ2V0Q29tcG9uZW50KCJheGlzUG9pbnRlciIpLmNvb3JkU3lzQXhlc0luZm87aWYobnVsbCE9byYmbnVsbCE9YSYmbnVsbCE9cil7dmFyIHM9ZS5nZXRTZXJpZXNCeUluZGV4KG8pO2lmKHMpaWYoImF4aXMiPT09KHQ9aEQoW3MuZ2V0RGF0YSgpLmdldEl0ZW1Nb2RlbChhKSxzLChzLmNvb3JkaW5hdGVTeXN0ZW18fHt9KS5tb2RlbCx0XSkpLmdldCgidHJpZ2dlciIpKXJldHVybiBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ1cGRhdGVBeGlzUG9pbnRlciIsc2VyaWVzSW5kZXg6byxkYXRhSW5kZXg6YSxwb3NpdGlvbjpuLnBvc2l0aW9ufSksITB9fSxfdHJ5U2hvdzpmdW5jdGlvbih0LGUpe3ZhciBpPXQudGFyZ2V0O2lmKHRoaXMuX3Rvb2x0aXBNb2RlbCl7dGhpcy5fbGFzdFg9dC5vZmZzZXRYLHRoaXMuX2xhc3RZPXQub2Zmc2V0WTt2YXIgbj10LmRhdGFCeUNvb3JkU3lzO24mJm4ubGVuZ3RoP3RoaXMuX3Nob3dBeGlzVG9vbHRpcChuLHQpOmkmJm51bGwhPWkuZGF0YUluZGV4Pyh0aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXM9bnVsbCx0aGlzLl9zaG93U2VyaWVzSXRlbVRvb2x0aXAodCxpLGUpKTppJiZpLnRvb2x0aXA/KHRoaXMuX2xhc3REYXRhQnlDb29yZFN5cz1udWxsLHRoaXMuX3Nob3dDb21wb25lbnRJdGVtVG9vbHRpcCh0LGksZSkpOih0aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXM9bnVsbCx0aGlzLl9oaWRlKGUpKX19LF9zaG93T3JNb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXQoInNob3dEZWxheSIpO2U9QShlLHRoaXMpLGNsZWFyVGltZW91dCh0aGlzLl9zaG93VGltb3V0KSwwPGk/dGhpcy5fc2hvd1RpbW91dD1zZXRUaW1lb3V0KGUsaSk6ZSgpfSxfc2hvd0F4aXNUb29sdGlwOmZ1bmN0aW9uKHQsZSl7dmFyIGQ9dGhpcy5fZWNNb2RlbCxpPXRoaXMuX3Rvb2x0aXBNb2RlbCxuPVtlLm9mZnNldFgsZS5vZmZzZXRZXSxvPVtdLGY9W10sYT1oRChbZS50b29sdGlwT3B0aW9uLGldKSxwPXRoaXMuX3JlbmRlck1vZGUscj10aGlzLl9uZXdMaW5lLGc9e307c0QodCxmdW5jdGlvbih0KXtzRCh0LmRhdGFCeUF4aXMsZnVuY3Rpb24ocyl7dmFyIGw9ZC5nZXRDb21wb25lbnQocy5heGlzRGltKyJBeGlzIixzLmF4aXNJbmRleCksdT1zLnZhbHVlLGg9W107aWYobCYmbnVsbCE9dSl7dmFyIGM9cEkodSxsLmF4aXMsZCxzLnNlcmllc0RhdGFJbmRpY2VzLHMudmFsdWVMYWJlbE9wdCk7RShzLnNlcmllc0RhdGFJbmRpY2VzLGZ1bmN0aW9uKHQpe3ZhciBlPWQuZ2V0U2VyaWVzQnlJbmRleCh0LnNlcmllc0luZGV4KSxpPXQuZGF0YUluZGV4SW5zaWRlLG49ZSYmZS5nZXREYXRhUGFyYW1zKGkpO2lmKG4uYXhpc0RpbT1zLmF4aXNEaW0sbi5heGlzSW5kZXg9cy5heGlzSW5kZXgsbi5heGlzVHlwZT1zLmF4aXNUeXBlLG4uYXhpc0lkPXMuYXhpc0lkLG4uYXhpc1ZhbHVlPW9nKGwuYXhpcyx1KSxuLmF4aXNWYWx1ZUxhYmVsPWMsbil7Zi5wdXNoKG4pO3ZhciBvLGE9ZS5mb3JtYXRUb29sdGlwKGksITAsbnVsbCxwKTtpZihSKGEpKXtvPWEuaHRtbDt2YXIgcj1hLm1hcmtlcnM7bShnLHIpfWVsc2Ugbz1hO2gucHVzaChvKX19KTt2YXIgdD1jOyJodG1sIiE9PXA/by5wdXNoKGguam9pbihyKSk6by5wdXNoKCh0P2V1KHQpK3I6IiIpK2guam9pbihyKSl9fSl9LHRoaXMpLG8ucmV2ZXJzZSgpLG89by5qb2luKHRoaXMuX25ld0xpbmUrdGhpcy5fbmV3TGluZSk7dmFyIHM9ZS5wb3NpdGlvbjt0aGlzLl9zaG93T3JNb3ZlKGEsZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDb250ZW50Tm90Q2hhbmdlZE9uQXhpcyh0KT90aGlzLl91cGRhdGVQb3NpdGlvbihhLHMsblswXSxuWzFdLHRoaXMuX3Rvb2x0aXBDb250ZW50LGYpOnRoaXMuX3Nob3dUb29sdGlwQ29udGVudChhLG8sZixNYXRoLnJhbmRvbSgpLG5bMF0sblsxXSxzLHZvaWQgMCxnKX0pfSxfc2hvd1Nlcmllc0l0ZW1Ub29sdGlwOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9lY01vZGVsLG89ZS5zZXJpZXNJbmRleCxhPW4uZ2V0U2VyaWVzQnlJbmRleChvKSxyPWUuZGF0YU1vZGVsfHxhLHM9ZS5kYXRhSW5kZXgsbD1lLmRhdGFUeXBlLHU9ci5nZXREYXRhKCksaD1oRChbdS5nZXRJdGVtTW9kZWwocykscixhJiYoYS5jb29yZGluYXRlU3lzdGVtfHx7fSkubW9kZWwsdGhpcy5fdG9vbHRpcE1vZGVsXSksYz1oLmdldCgidHJpZ2dlciIpO2lmKG51bGw9PWN8fCJpdGVtIj09PWMpe3ZhciBkLGYscD1yLmdldERhdGFQYXJhbXMocyxsKSxnPXIuZm9ybWF0VG9vbHRpcChzLCExLGwsdGhpcy5fcmVuZGVyTW9kZSk7Zj1SKGcpPyhkPWcuaHRtbCxnLm1hcmtlcnMpOihkPWcsbnVsbCk7dmFyIG09Iml0ZW1fIityLm5hbWUrIl8iK3M7dGhpcy5fc2hvd09yTW92ZShoLGZ1bmN0aW9uKCl7dGhpcy5fc2hvd1Rvb2x0aXBDb250ZW50KGgsZCxwLG0sdC5vZmZzZXRYLHQub2Zmc2V0WSx0LnBvc2l0aW9uLHQudGFyZ2V0LGYpfSksaSh7dHlwZToic2hvd1RpcCIsZGF0YUluZGV4SW5zaWRlOnMsZGF0YUluZGV4OnUuZ2V0UmF3SW5kZXgocyksc2VyaWVzSW5kZXg6byxmcm9tOnRoaXMudWlkfSl9fSxfc2hvd0NvbXBvbmVudEl0ZW1Ub29sdGlwOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lLnRvb2x0aXA7aWYoInN0cmluZyI9PXR5cGVvZiBuKXtuPXtjb250ZW50Om4sZm9ybWF0dGVyOm59fXZhciBvPW5ldyBJbChuLHRoaXMuX3Rvb2x0aXBNb2RlbCx0aGlzLl9lY01vZGVsKSxhPW8uZ2V0KCJjb250ZW50Iikscj1NYXRoLnJhbmRvbSgpO3RoaXMuX3Nob3dPck1vdmUobyxmdW5jdGlvbigpe3RoaXMuX3Nob3dUb29sdGlwQ29udGVudChvLGEsby5nZXQoImZvcm1hdHRlclBhcmFtcyIpfHx7fSxyLHQub2Zmc2V0WCx0Lm9mZnNldFksdC5wb3NpdGlvbixlKX0pLGkoe3R5cGU6InNob3dUaXAiLGZyb206dGhpcy51aWR9KX0sX3Nob3dUb29sdGlwQ29udGVudDpmdW5jdGlvbihpLHQsbixlLG8sYSxyLHMsbCl7aWYodGhpcy5fdGlja2V0PSIiLGkuZ2V0KCJzaG93Q29udGVudCIpJiZpLmdldCgic2hvdyIpKXt2YXIgdT10aGlzLl90b29sdGlwQ29udGVudCxoPWkuZ2V0KCJmb3JtYXR0ZXIiKTtyPXJ8fGkuZ2V0KCJwb3NpdGlvbiIpO3ZhciBjPXQ7aWYoaCYmInN0cmluZyI9PXR5cGVvZiBoKWM9b3UoaCxuLCEwKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBoKXt2YXIgZD1yRChmdW5jdGlvbih0LGUpe3Q9PT10aGlzLl90aWNrZXQmJih1LnNldENvbnRlbnQoZSxsLGkpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKGkscixvLGEsdSxuLHMpKX0sdGhpcyk7dGhpcy5fdGlja2V0PWUsYz1oKG4sZSxkKX11LnNldENvbnRlbnQoYyxsLGkpLHUuc2hvdyhpKSx0aGlzLl91cGRhdGVQb3NpdGlvbihpLHIsbyxhLHUsbixzKX19LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbih0LGUsaSxuLG8sYSxyKXt2YXIgcz10aGlzLl9hcGkuZ2V0V2lkdGgoKSxsPXRoaXMuX2FwaS5nZXRIZWlnaHQoKTtlPWV8fHQuZ2V0KCJwb3NpdGlvbiIpO3ZhciB1PW8uZ2V0U2l6ZSgpLGg9dC5nZXQoImFsaWduIiksYz10LmdldCgidmVydGljYWxBbGlnbiIpLGQ9ciYmci5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpO2lmKHImJmQuYXBwbHlUcmFuc2Zvcm0oci50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1lKFtpLG5dLGEsby5lbCxkLHt2aWV3U2l6ZTpbcyxsXSxjb250ZW50U2l6ZTp1LnNsaWNlKCl9KSksayhlKSlpPWxEKGVbMF0scyksbj1sRChlWzFdLGwpO2Vsc2UgaWYoUihlKSl7ZS53aWR0aD11WzBdLGUuaGVpZ2h0PXVbMV07dmFyIGY9dnUoZSx7d2lkdGg6cyxoZWlnaHQ6bH0pO2k9Zi54LG49Zi55LGM9aD1udWxsfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBlJiZyKXtpPShwPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pWzBdLG89aVsxXSxhPTAscj0wLHM9ZS53aWR0aCxsPWUuaGVpZ2h0O3N3aXRjaCh0KXtjYXNlImluc2lkZSI6YT1lLngrcy8yLW4vMixyPWUueStsLzItby8yO2JyZWFrO2Nhc2UidG9wIjphPWUueCtzLzItbi8yLHI9ZS55LW8tNTticmVhaztjYXNlImJvdHRvbSI6YT1lLngrcy8yLW4vMixyPWUueStsKzU7YnJlYWs7Y2FzZSJsZWZ0IjphPWUueC1uLTUscj1lLnkrbC8yLW8vMjticmVhaztjYXNlInJpZ2h0IjphPWUueCtzKzUscj1lLnkrbC8yLW8vMn1yZXR1cm5bYSxyXX0oZSxkLHUpKVswXSxuPXBbMV19ZWxzZXt2YXIgcDtpPShwPWZ1bmN0aW9uKHQsZSxpLG4sbyxhLHIpe3ZhciBzPWkuZ2V0T3V0ZXJTaXplKCksbD1zLndpZHRoLHU9cy5oZWlnaHQ7bnVsbCE9YSYmKG48dCtsK2E/dC09bCthOnQrPWEpO251bGwhPXImJihvPGUrdStyP2UtPXUrcjplKz1yKTtyZXR1cm5bdCxlXX0oaSxuLG8scyxsLGg/bnVsbDoyMCxjP251bGw6MjApKVswXSxuPXBbMV19aCYmKGktPWREKGgpP3VbMF0vMjoicmlnaHQiPT09aD91WzBdOjApLGMmJihuLT1kRChjKT91WzFdLzI6ImJvdHRvbSI9PT1jP3VbMV06MCksdC5nZXQoImNvbmZpbmUiKSYmKGk9KHA9ZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1pLmdldE91dGVyU2l6ZSgpLHI9YS53aWR0aCxzPWEuaGVpZ2h0O3JldHVybiB0PU1hdGgubWluKHQrcixuKS1yLGU9TWF0aC5taW4oZStzLG8pLXMsdD1NYXRoLm1heCh0LDApLGU9TWF0aC5tYXgoZSwwKSxbdCxlXX0oaSxuLG8scyxsKSlbMF0sbj1wWzFdKTtvLm1vdmVUbyhpLG4pfSxfdXBkYXRlQ29udGVudE5vdENoYW5nZWRPbkF4aXM6ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5fbGFzdERhdGFCeUNvb3JkU3lzLHI9ISF0JiZ0Lmxlbmd0aD09PW4ubGVuZ3RoO3JldHVybiByJiZzRCh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5kYXRhQnlBeGlzfHx7fSxhPShuW2VdfHx7fSkuZGF0YUJ5QXhpc3x8W107KHImPWkubGVuZ3RoPT09YS5sZW5ndGgpJiZzRChpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9YVtlXXx8e30sbj10LnNlcmllc0RhdGFJbmRpY2VzfHxbXSxvPWkuc2VyaWVzRGF0YUluZGljZXN8fFtdOyhyJj10LnZhbHVlPT09aS52YWx1ZSYmdC5heGlzVHlwZT09PWkuYXhpc1R5cGUmJnQuYXhpc0lkPT09aS5heGlzSWQmJm4ubGVuZ3RoPT09by5sZW5ndGgpJiZzRChuLGZ1bmN0aW9uKHQsZSl7dmFyIGk9b1tlXTtyJj10LnNlcmllc0luZGV4PT09aS5zZXJpZXNJbmRleCYmdC5kYXRhSW5kZXg9PT1pLmRhdGFJbmRleH0pfSl9KSx0aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXM9biwhIXJ9LF9oaWRlOmZ1bmN0aW9uKHQpe3RoaXMuX2xhc3REYXRhQnlDb29yZFN5cz1udWxsLHQoe3R5cGU6ImhpZGVUaXAiLGZyb206dGhpcy51aWR9KX0sZGlzcG9zZTpmdW5jdGlvbih0LGUpe3Yubm9kZXx8KHRoaXMuX3Rvb2x0aXBDb250ZW50LmhpZGUoKSxpSSgiaXRlbVRvb2x0aXAiLGUpKX19KSxnZih7dHlwZToic2hvd1RpcCIsZXZlbnQ6InNob3dUaXAiLHVwZGF0ZToidG9vbHRpcDptYW51YWxseVNob3dUaXAifSxmdW5jdGlvbigpe30pLGdmKHt0eXBlOiJoaWRlVGlwIixldmVudDoiaGlkZVRpcCIsdXBkYXRlOiJ0b29sdGlwOm1hbnVhbGx5SGlkZVRpcCJ9LGZ1bmN0aW9uKCl7fSk7dmFyIGZEPVsicmVjdCIsInBvbHlnb24iLCJrZWVwIiwiY2xlYXIiXTt2YXIgcEQ9RTtmdW5jdGlvbiBnRCh0KXtpZih0KWZvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITB9ZnVuY3Rpb24gbUQodCxlLGEpe3ZhciBpPXt9O3JldHVybiBwRChlLGZ1bmN0aW9uKG4pe3ZhciBvPWlbbl09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5fX2hpZGRlbj10LnByb3RvdHlwZSxuZXcgdH0oKTtwRCh0W25dLGZ1bmN0aW9uKHQsZSl7aWYoYV8uaXNWYWxpZFR5cGUoZSkpe3ZhciBpPXt0eXBlOmUsdmlzdWFsOnR9O2EmJmEoaSxuKSxvW2VdPW5ldyBhXyhpKSwib3BhY2l0eSI9PT1lJiYoKGk9RChpKSkudHlwZT0iY29sb3JBbHBoYSIsby5fX2hpZGRlbi5fX2FscGhhRm9yT3BhY2l0eT1uZXcgYV8oaSkpfX0pfSksaX1mdW5jdGlvbiB2RChlLGksdCl7dmFyIG47RSh0LGZ1bmN0aW9uKHQpe2kuaGFzT3duUHJvcGVydHkodCkmJmdEKGlbdF0pJiYobj0hMCl9KSxuJiZFKHQsZnVuY3Rpb24odCl7aS5oYXNPd25Qcm9wZXJ0eSh0KSYmZ0QoaVt0XSk/ZVt0XT1EKGlbdF0pOmRlbGV0ZSBlW3RdfSl9dmFyIHlEPXtsaW5lWDp4RCgwKSxsaW5lWTp4RCgxKSxyZWN0Ontwb2ludDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQmJmkuYm91bmRpbmdSZWN0LmNvbnRhaW4odFswXSx0WzFdKX0scmVjdDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQmJmkuYm91bmRpbmdSZWN0LmludGVyc2VjdCh0KX19LHBvbHlnb246e3BvaW50OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdCYmaS5ib3VuZGluZ1JlY3QuY29udGFpbih0WzBdLHRbMV0pJiZ3ZyhpLnJhbmdlLHRbMF0sdFsxXSl9LHJlY3Q6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkucmFuZ2U7aWYoIXR8fG4ubGVuZ3RoPD0xKXJldHVybiExO3ZhciBvPXQueCxhPXQueSxyPXQud2lkdGgscz10LmhlaWdodCxsPW5bMF07cmV0dXJuISEod2cobixvLGEpfHx3ZyhuLG8rcixhKXx8d2cobixvLGErcyl8fHdnKG4sbytyLGErcyl8fE1pLmNyZWF0ZSh0KS5jb250YWluKGxbMF0sbFsxXSl8fGdsKG8sYSxvK3IsYSxuKXx8Z2wobyxhLG8sYStzLG4pfHxnbChvK3IsYSxvK3IsYStzLG4pfHxnbChvLGErcyxvK3IsYStzLG4pKXx8dm9pZCAwfX19O2Z1bmN0aW9uIHhEKGEpe3ZhciByPVsieCIsInkiXSxzPVsid2lkdGgiLCJoZWlnaHQiXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24odCxlLGkpe2lmKHQpe3ZhciBuPWkucmFuZ2U7cmV0dXJuIF9EKHRbYV0sbil9fSxyZWN0OmZ1bmN0aW9uKHQsZSxpKXtpZih0KXt2YXIgbj1pLnJhbmdlLG89W3RbclthXV0sdFtyW2FdXSt0W3NbYV1dXTtyZXR1cm4gb1sxXTxvWzBdJiZvLnJldmVyc2UoKSxfRChvWzBdLG4pfHxfRChvWzFdLG4pfHxfRChuWzBdLG8pfHxfRChuWzFdLG8pfX19fWZ1bmN0aW9uIF9EKHQsZSl7cmV0dXJuIGVbMF08PXQmJnQ8PWVbMV19dmFyIHdEPVsiaW5CcnVzaCIsIm91dE9mQnJ1c2giXSxiRD0iX19lY0JydXNoU2VsZWN0IixTRD0iX19lY0luQnJ1c2hTZWxlY3RFdmVudCIsTUQ9SWQuVklTVUFMLkJSVVNIO2Z1bmN0aW9uIElEKHQsZSl7aWYoIXQuaXNEaXNwb3NlZCgpKXt2YXIgaT10LmdldFpyKCk7aVtTRF09ITAsdC5kaXNwYXRjaEFjdGlvbih7dHlwZToiYnJ1c2hTZWxlY3QiLGJhdGNoOmV9KSxpW1NEXT0hMX19ZnVuY3Rpb24gVEQodCxlLGksbil7Zm9yKHZhciBvPTAsYT1lLmxlbmd0aDtvPGE7bysrKXt2YXIgcj1lW29dO2lmKHRbci5icnVzaFR5cGVdKG4saSxyLnNlbGVjdG9ycyxyKSlyZXR1cm4hMH19ZnVuY3Rpb24gQUQodCl7dmFyIHI9dC5icnVzaFNlbGVjdG9yO2lmKHoocikpe3ZhciBlPVtdO3JldHVybiBFKHlELGZ1bmN0aW9uKGEsdCl7ZVt0XT1mdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1lLmdldEl0ZW1MYXlvdXQodCk7cmV0dXJuIGFbcl0obyxpLG4pfX0pLGV9aWYoTyhyKSl7dmFyIGk9e307cmV0dXJuIEUoeUQsZnVuY3Rpb24odCxlKXtpW2VdPXJ9KSxpfXJldHVybiByfXZmKE1ELGZ1bmN0aW9uKGUsdCxpKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJicnVzaCJ9LGZ1bmN0aW9uKHQpe2kmJiJ0YWtlR2xvYmFsQ3Vyc29yIj09PWkudHlwZSYmdC5zZXRCcnVzaE9wdGlvbigiYnJ1c2giPT09aS5rZXk/aS5icnVzaE9wdGlvbjp7YnJ1c2hUeXBlOiExfSksKHQuYnJ1c2hUYXJnZXRNYW5hZ2VyPW5ldyBwQSh0Lm9wdGlvbixlKSkuc2V0SW5wdXRSYW5nZXModC5hcmVhcyxlKX0pfSkseWYoTUQsZnVuY3Rpb24ocCx0LGUpe3ZhciBvLGcsbT1bXTtwLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJicnVzaCJ9LGZ1bmN0aW9uKGEsdCl7dmFyIHM9e2JydXNoSWQ6YS5pZCxicnVzaEluZGV4OnQsYnJ1c2hOYW1lOmEubmFtZSxhcmVhczpEKGEuYXJlYXMpLHNlbGVjdGVkOltdfTttLnB1c2gocyk7dmFyIGU9YS5vcHRpb24saT1lLmJydXNoTGluayxuPVtdLGw9W10sdT1bXSxoPTA7dHx8KG89ZS50aHJvdHRsZVR5cGUsZz1lLnRocm90dGxlRGVsYXkpO3ZhciByPU4oYS5hcmVhcyxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG49aS5zZWxlY3RvcnM9e307cmV0dXJuIEUoeURbaS5icnVzaFR5cGVdLGZ1bmN0aW9uKGUsdCl7blt0XT1mdW5jdGlvbih0KXtyZXR1cm4gZSh0LG4saSl9fSksaX0oQyh7Ym91bmRpbmdSZWN0OkREW3QuYnJ1c2hUeXBlXSh0KX0sdCkpfSksYz1tRChhLm9wdGlvbix3RCxmdW5jdGlvbih0KXt0Lm1hcHBpbmdNZXRob2Q9ImZpeGVkIn0pO2Z1bmN0aW9uIGQodCl7cmV0dXJuImFsbCI9PT1pfHxuW3RdfWZ1bmN0aW9uIGYodCl7cmV0dXJuISF0Lmxlbmd0aH1rKGkpJiZFKGksZnVuY3Rpb24odCl7blt0XT0xfSkscC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQsZSl7dmFyIGk9dVtlXT1bXTsicGFyYWxsZWwiPT09dC5zdWJUeXBlP2Z1bmN0aW9uKHQsZSl7dmFyIGk9dC5jb29yZGluYXRlU3lzdGVtO2h8PWkuaGFzQXhpc0JydXNoZWQoKSxkKGUpJiZpLmVhY2hBY3RpdmVTdGF0ZSh0LmdldERhdGEoKSxmdW5jdGlvbih0LGUpeyJhY3RpdmUiPT09dCYmKGxbZV09MSl9KX0odCxlKTpmdW5jdGlvbihlLHQsaSl7dmFyIG49QUQoZSk7aWYoIW58fGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5vcHRpb24uc2VyaWVzSW5kZXg7cmV0dXJuIG51bGwhPWkmJiJhbGwiIT09aSYmKGsoaSk/XyhpLGUpPDA6ZSE9PWkpfShhLHQpKXJldHVybjtpZihFKHIsZnVuY3Rpb24odCl7blt0LmJydXNoVHlwZV0mJmEuYnJ1c2hUYXJnZXRNYW5hZ2VyLmNvbnRyb2xTZXJpZXModCxlLHApJiZpLnB1c2godCksaHw9ZihpKX0pLGQodCkmJmYoaSkpe3ZhciBvPWUuZ2V0RGF0YSgpO28uZWFjaChmdW5jdGlvbih0KXtURChuLGksbyx0KSYmKGxbdF09MSl9KX19KHQsZSxpKX0pLHAuZWFjaFNlcmllcyhmdW5jdGlvbih0LGUpe3ZhciBpPXtzZXJpZXNJZDp0LmlkLHNlcmllc0luZGV4OmUsc2VyaWVzTmFtZTp0Lm5hbWUsZGF0YUluZGV4OltdfTtzLnNlbGVjdGVkLnB1c2goaSk7dmFyIG49QUQodCksbz11W2VdLGE9dC5nZXREYXRhKCkscj1kKGUpP2Z1bmN0aW9uKHQpe3JldHVybiBsW3RdPyhpLmRhdGFJbmRleC5wdXNoKGEuZ2V0UmF3SW5kZXgodCkpLCJpbkJydXNoIik6Im91dE9mQnJ1c2gifTpmdW5jdGlvbih0KXtyZXR1cm4gVEQobixvLGEsdCk/KGkuZGF0YUluZGV4LnB1c2goYS5nZXRSYXdJbmRleCh0KSksImluQnJ1c2giKToib3V0T2ZCcnVzaCJ9OyhkKGUpP2g6ZihvKSkmJmZ1bmN0aW9uKHQsdSxoLGMsZCxmKXt2YXIgcCxnPXt9O2Z1bmN0aW9uIG0odCl7cmV0dXJuIGguZ2V0SXRlbVZpc3VhbChwLHQpfWZ1bmN0aW9uIHYodCxlKXtoLnNldEl0ZW1WaXN1YWwocCx0LGUpfWZ1bmN0aW9uIGUodCxlKXtwPW51bGw9PWY/dDplO3ZhciBpPWguZ2V0UmF3RGF0YUl0ZW0ocCk7aWYoIWl8fCExIT09aS52aXN1YWxNYXApZm9yKHZhciBuPWMuY2FsbChkLHQpLG89dVtuXSxhPWdbbl0scj0wLHM9YS5sZW5ndGg7cjxzO3IrKyl7dmFyIGw9YVtyXTtvW2xdJiZvW2xdLmFwcGx5VmlzdWFsKHQsbSx2KX19RSh0LGZ1bmN0aW9uKHQpe3ZhciBlPWFfLnByZXBhcmVWaXN1YWxUeXBlcyh1W3RdKTtnW3RdPWV9KSxudWxsPT1mP2guZWFjaChlKTpoLmVhY2goW2ZdLGUpfSh3RCxjLGEscil9KX0pLGZ1bmN0aW9uKHQsZSxpLG4sbyl7aWYoIW8pcmV0dXJuO3ZhciBhPXQuZ2V0WnIoKTtpZihhW1NEXSlyZXR1cm47YVtiRF18fChhW2JEXT1JRCk7VGMoYSxiRCxpLGUpKHQsbil9KHQsbyxnLG0sZSl9KTt2YXIgREQ9e2xpbmVYOmV0LGxpbmVZOmV0LHJlY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIENEKHQucmFuZ2UpfSxwb2x5Z29uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXQucmFuZ2Usbj0wLG89aS5sZW5ndGg7bjxvO24rKyl7ZT1lfHxbWzEvMCwtMS8wXSxbMS8wLC0xLzBdXTt2YXIgYT1pW25dO2FbMF08ZVswXVswXSYmKGVbMF1bMF09YVswXSksYVswXT5lWzBdWzFdJiYoZVswXVsxXT1hWzBdKSxhWzFdPGVbMV1bMF0mJihlWzFdWzBdPWFbMV0pLGFbMV0+ZVsxXVsxXSYmKGVbMV1bMV09YVsxXSl9cmV0dXJuIGUmJkNEKGUpfX07ZnVuY3Rpb24gQ0QodCl7cmV0dXJuIG5ldyBNaSh0WzBdWzBdLHRbMV1bMF0sdFswXVsxXS10WzBdWzBdLHRbMV1bMV0tdFsxXVswXSl9dmFyIExEPVsiI2RkZCJdO3dmKHt0eXBlOiJicnVzaCIsZGVwZW5kZW5jaWVzOlsiZ2VvIiwiZ3JpZCIsInhBeGlzIiwieUF4aXMiLCJwYXJhbGxlbCIsInNlcmllcyJdLGRlZmF1bHRPcHRpb246e3Rvb2xib3g6bnVsbCxicnVzaExpbms6bnVsbCxzZXJpZXNJbmRleDoiYWxsIixnZW9JbmRleDpudWxsLHhBeGlzSW5kZXg6bnVsbCx5QXhpc0luZGV4Om51bGwsYnJ1c2hUeXBlOiJyZWN0IixicnVzaE1vZGU6InNpbmdsZSIsdHJhbnNmb3JtYWJsZTohMCxicnVzaFN0eWxlOntib3JkZXJXaWR0aDoxLGNvbG9yOiJyZ2JhKDEyMCwxNDAsMTgwLDAuMykiLGJvcmRlckNvbG9yOiJyZ2JhKDEyMCwxNDAsMTgwLDAuOCkifSx0aHJvdHRsZVR5cGU6ImZpeFJhdGUiLHRocm90dGxlRGVsYXk6MCxyZW1vdmVPbkNsaWNrOiEwLHo6MWU0fSxhcmVhczpbXSxicnVzaFR5cGU6bnVsbCxicnVzaE9wdGlvbjp7fSxjb29yZEluZm9MaXN0OltdLG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbjtlfHx2RChpLHQsWyJpbkJydXNoIiwib3V0T2ZCcnVzaCJdKTt2YXIgbj1pLmluQnJ1c2g9aS5pbkJydXNofHx7fTtpLm91dE9mQnJ1c2g9aS5vdXRPZkJydXNofHx7Y29sb3I6TER9LG4uaGFzT3duUHJvcGVydHkoImxpZnRaIil8fChuLmxpZnRaPTUpfSxzZXRBcmVhczpmdW5jdGlvbih0KXt0JiYodGhpcy5hcmVhcz1OKHQsZnVuY3Rpb24odCl7cmV0dXJuIGtEKHRoaXMub3B0aW9uLHQpfSx0aGlzKSl9LHNldEJydXNoT3B0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuYnJ1c2hPcHRpb249a0QodGhpcy5vcHRpb24sdCksdGhpcy5icnVzaFR5cGU9dGhpcy5icnVzaE9wdGlvbi5icnVzaFR5cGV9fSk7ZnVuY3Rpb24ga0QodCxlKXtyZXR1cm4gbSh7YnJ1c2hUeXBlOnQuYnJ1c2hUeXBlLGJydXNoTW9kZTp0LmJydXNoTW9kZSx0cmFuc2Zvcm1hYmxlOnQudHJhbnNmb3JtYWJsZSxicnVzaFN0eWxlOm5ldyBJbCh0LmJydXNoU3R5bGUpLmdldEl0ZW1TdHlsZSgpLHJlbW92ZU9uQ2xpY2s6dC5yZW1vdmVPbkNsaWNrLHo6dC56fSxlLCEwKX1mdW5jdGlvbiBQRCh0LGUsaSxuKXtuJiZuLiRmcm9tPT09dC5pZHx8dGhpcy5fYnJ1c2hDb250cm9sbGVyLnNldFBhbmVscyh0LmJydXNoVGFyZ2V0TWFuYWdlci5tYWtlUGFuZWxPcHRzKGkpKS5lbmFibGVCcnVzaCh0LmJydXNoT3B0aW9uKS51cGRhdGVDb3ZlcnModC5hcmVhcy5zbGljZSgpKX1iZih7dHlwZToiYnJ1c2giLGluaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLmVjTW9kZWw9dCx0aGlzLmFwaT1lLHRoaXMubW9kZWwsKHRoaXMuX2JydXNoQ29udHJvbGxlcj1uZXcgZ2IoZS5nZXRacigpKSkub24oImJydXNoIixBKHRoaXMuX29uQnJ1c2gsdGhpcykpLm1vdW50KCl9LHJlbmRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tb2RlbD10LFBELmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdXBkYXRlVHJhbnNmb3JtOlBELHVwZGF0ZVZpZXc6UEQsZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuX2JydXNoQ29udHJvbGxlci5kaXNwb3NlKCl9LF9vbkJydXNoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5tb2RlbC5pZDt0aGlzLm1vZGVsLmJydXNoVGFyZ2V0TWFuYWdlci5zZXRPdXRwdXRSYW5nZXModCx0aGlzLmVjTW9kZWwpLGUuaXNFbmQmJiFlLnJlbW92ZU9uQ2xpY2t8fHRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJicnVzaCIsYnJ1c2hJZDppLGFyZWFzOkQodCksJGZyb206aX0pLGUuaXNFbmQmJnRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJicnVzaEVuZCIsYnJ1c2hJZDppLGFyZWFzOkQodCksJGZyb206aX0pfX0pLGdmKHt0eXBlOiJicnVzaCIsZXZlbnQ6ImJydXNoIn0sZnVuY3Rpb24oZSx0KXt0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJicnVzaCIscXVlcnk6ZX0sZnVuY3Rpb24odCl7dC5zZXRBcmVhcyhlLmFyZWFzKX0pfSksZ2Yoe3R5cGU6ImJydXNoU2VsZWN0IixldmVudDoiYnJ1c2hTZWxlY3RlZCIsdXBkYXRlOiJub25lIn0sZnVuY3Rpb24oKXt9KSxnZih7dHlwZToiYnJ1c2hFbmQiLGV2ZW50OiJicnVzaEVuZCIsdXBkYXRlOiJub25lIn0sZnVuY3Rpb24oKXt9KTt2YXIgTkQ9Q2MudG9vbGJveC5icnVzaDtmdW5jdGlvbiBPRCh0LGUsaSl7dGhpcy5tb2RlbD10LHRoaXMuZWNNb2RlbD1lLHRoaXMuYXBpPWksdGhpcy5fYnJ1c2hUeXBlLHRoaXMuX2JydXNoTW9kZX1PRC5kZWZhdWx0T3B0aW9uPXtzaG93OiEwLHR5cGU6WyJyZWN0IiwicG9seWdvbiIsImxpbmVYIiwibGluZVkiLCJrZWVwIiwiY2xlYXIiXSxpY29uOntyZWN0OiJNNy4zLDM0LjcgTTAuNCwxMFYtMC4yaDkuOCBNODkuNiwxMFYtMC4yaC05LjggTTAuNCw2MHYxMC4yaDkuOCBNODkuNiw2MHYxMC4yaC05LjggTTEyLjMsMjIuNFYxMC41aDEzLjEgTTMzLjYsMTAuNWg3LjggTTQ5LjEsMTAuNWg3LjggTTc3LjUsMjIuNFYxMC41aC0xMyBNMTIuMywzMS4xdjguMiBNNzcuNywzMS4xdjguMiBNMTIuMyw0Ny42djExLjloMTMuMSBNMzMuNiw1OS41aDcuNiBNNDkuMSw1OS41IGg3LjcgTTc3LjUsNDcuNnYxMS45aC0xMyIscG9seWdvbjoiTTU1LjIsMzQuOWMxLjcsMCwzLjEsMS40LDMuMSwzLjFzLTEuNCwzLjEtMy4xLDMuMSBzLTMuMS0xLjQtMy4xLTMuMVM1My41LDM0LjksNTUuMiwzNC45eiBNNTAuNCw1MWMxLjcsMCwzLjEsMS40LDMuMSwzLjFjMCwxLjctMS40LDMuMS0zLjEsMy4xYy0xLjcsMC0zLjEtMS40LTMuMS0zLjEgQzQ3LjMsNTIuNCw0OC43LDUxLDUwLjQsNTF6IE01NS42LDM3LjFsMS41LTcuOCBNNjAuMSwxMy41bDEuNi04LjdsLTcuOCw0IE01OSwxOWwtMSw1LjMgTTI0LDE2LjFsNi40LDQuOWw2LjQtMy4zIE00OC41LDExLjYgbC01LjksMy4xIE0xOS4xLDEyLjhMOS43LDUuMWwxLjEsNy43IE0xMy40LDI5LjhsMSw3LjNsNi42LDEuNiBNMTEuNiwxOC40bDEsNi4xIE0zMi44LDQxLjkgTTI2LjYsNDAuNCBNMjcuMyw0MC4ybDYuMSwxLjYgTTQ5LjksNTIuMWwtNS42LTcuNmwtNC45LTEuMiIsbGluZVg6Ik0xNS4yLDMwIE0xOS43LDE1LjZWMS45SDI5IE0zNC44LDEuOUg0MC40IE01NS4zLDE1LjZWMS45SDQ1LjkgTTE5LjcsNDQuNFY1OC4xSDI5IE0zNC44LDU4LjFINDAuNCBNNTUuMyw0NC40IFY1OC4xSDQ1LjkgTTEyLjUsMjAuM2wtOS40LDkuNmw5LjYsOS44IE0zLjEsMjkuOWgxNi41IE02Mi41LDIwLjNsOS40LDkuNkw2Mi4zLDM5LjcgTTcxLjksMjkuOUg1NS40IixsaW5lWToiTTM4LjgsNy43IE01Mi43LDEyaDEzLjJ2OSBNNjUuOSwyNi42VjMyIE01Mi43LDQ2LjNoMTMuMnYtOSBNMjQuOSwxMkgxMS44djkgTTExLjgsMjYuNlYzMiBNMjQuOSw0Ni4zSDExLjh2LTkgTTQ4LjIsNS4xbC05LjMtOWwtOS40LDkuMiBNMzguOS0zLjlWMTIgTTQ4LjIsNTMuM2wtOS4zLDlsLTkuNC05LjIgTTM4LjksNjIuM1Y0Ni40IixrZWVwOiJNNCwxMC41VjFoMTAuMyBNMjAuNywxaDYuMSBNMzMsMWg2LjEgTTU1LjQsMTAuNVYxSDQ1LjIgTTQsMTcuM3Y2LjYgTTU1LjYsMTcuM3Y2LjYgTTQsMzAuNVY0MGgxMC4zIE0yMC43LDQwIGg2LjEgTTMzLDQwaDYuMSBNNTUuNCwzMC41VjQwSDQ1LjIgTTIxLDE4LjloNjIuOXY0OC42SDIxVjE4Ljl6IixjbGVhcjoiTTIyLDE0LjdsMzAuOSwzMSBNNTIuOSwxNC43TDIyLDQ1LjcgTTQuNywxNi44VjQuMmgxMy4xIE0yNiw0LjJoNy44IE00MS42LDQuMmg3LjggTTcwLjMsMTYuOFY0LjJINTcuMiBNNC43LDI1Ljl2OC42IE03MC4zLDI1Ljl2OC42IE00LjcsNDMuMnYxMi42aDEzLjEgTTI2LDU1LjhoNy44IE00MS42LDU1LjhoNy44IE03MC4zLDQzLjJ2MTIuNkg1Ny4yIn0sdGl0bGU6RChORC50aXRsZSl9O3ZhciBFRD1PRC5wcm90b3R5cGU7RUQucmVuZGVyPUVELnVwZGF0ZVZpZXc9ZnVuY3Rpb24oZSx0LGkpe3ZhciBuLG8sYTt0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJicnVzaCJ9LGZ1bmN0aW9uKHQpe249dC5icnVzaFR5cGUsbz10LmJydXNoT3B0aW9uLmJydXNoTW9kZXx8InNpbmdsZSIsYXw9dC5hcmVhcy5sZW5ndGh9KSx0aGlzLl9icnVzaFR5cGU9bix0aGlzLl9icnVzaE1vZGU9byxFKGUuZ2V0KCJ0eXBlIiwhMCksZnVuY3Rpb24odCl7ZS5zZXRJY29uU3RhdHVzKHQsKCJrZWVwIj09PXQ/Im11bHRpcGxlIj09PW86ImNsZWFyIj09PXQ/YTp0PT09bik/ImVtcGhhc2lzIjoibm9ybWFsIil9KX0sRUQuZ2V0SWNvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLGU9dC5nZXQoImljb24iLCEwKSxpPXt9O3JldHVybiBFKHQuZ2V0KCJ0eXBlIiwhMCksZnVuY3Rpb24odCl7ZVt0XSYmKGlbdF09ZVt0XSl9KSxpfSxFRC5vbmNsaWNrPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9icnVzaFR5cGUsbz10aGlzLl9icnVzaE1vZGU7ImNsZWFyIj09PWk/KGUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImF4aXNBcmVhU2VsZWN0IixpbnRlcnZhbHM6W119KSxlLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJicnVzaCIsY29tbWFuZDoiY2xlYXIiLGFyZWFzOltdfSkpOmUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRha2VHbG9iYWxDdXJzb3IiLGtleToiYnJ1c2giLGJydXNoT3B0aW9uOnticnVzaFR5cGU6ImtlZXAiPT09aT9uOm4hPT1pJiZpLGJydXNoTW9kZToia2VlcCI9PT1pPyJtdWx0aXBsZSI9PT1vPyJzaW5nbGUiOiJtdWx0aXBsZSI6b319KX0sSFQoImJydXNoIixPRCksZmYoZnVuY3Rpb24odCxlKXt2YXIgaT10JiZ0LmJydXNoO2lmKGsoaSl8fChpPWk/W2ldOltdKSxpLmxlbmd0aCl7dmFyIG49W107RShpLGZ1bmN0aW9uKHQpe3ZhciBlPXQuaGFzT3duUHJvcGVydHkoInRvb2xib3giKT90LnRvb2xib3g6W107ZSBpbnN0YW5jZW9mIEFycmF5JiYobj1uLmNvbmNhdChlKSl9KTt2YXIgbz10JiZ0LnRvb2xib3g7ayhvKSYmKG89b1swXSksb3x8KG89e2ZlYXR1cmU6e319LHQudG9vbGJveD1bb10pO3ZhciBhPW8uZmVhdHVyZXx8KG8uZmVhdHVyZT17fSkscj1hLmJydXNofHwoYS5icnVzaD17fSkscz1yLnR5cGV8fChyLnR5cGU9W10pO3MucHVzaC5hcHBseShzLG4pLGZ1bmN0aW9uKGkpe3ZhciBlPXt9O0UoaSxmdW5jdGlvbih0KXtlW3RdPTF9KSxpLmxlbmd0aD0wLEUoZSxmdW5jdGlvbih0LGUpe2kucHVzaChlKX0pfShzKSxlJiYhcy5sZW5ndGgmJnMucHVzaC5hcHBseShzLGZEKX19KSx3Zih7dHlwZToidGl0bGUiLGxheW91dE1vZGU6e3R5cGU6ImJveCIsaWdub3JlU2l6ZTohMH0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo2LHNob3c6ITAsdGV4dDoiIix0YXJnZXQ6ImJsYW5rIixzdWJ0ZXh0OiIiLHN1YnRhcmdldDoiYmxhbmsiLGxlZnQ6MCx0b3A6MCxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJvcmRlckNvbG9yOiIjY2NjIixib3JkZXJXaWR0aDowLHBhZGRpbmc6NSxpdGVtR2FwOjEwLHRleHRTdHlsZTp7Zm9udFNpemU6MTgsZm9udFdlaWdodDoiYm9sZGVyIixjb2xvcjoiIzMzMyJ9LHN1YnRleHRTdHlsZTp7Y29sb3I6IiNhYWEifX19KSxiZih7dHlwZToidGl0bGUiLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7aWYodGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0LmdldCgic2hvdyIpKXt2YXIgbj10aGlzLmdyb3VwLG89dC5nZXRNb2RlbCgidGV4dFN0eWxlIiksYT10LmdldE1vZGVsKCJzdWJ0ZXh0U3R5bGUiKSxyPXQuZ2V0KCJ0ZXh0QWxpZ24iKSxzPUgodC5nZXQoInRleHRCYXNlbGluZSIpLHQuZ2V0KCJ0ZXh0VmVydGljYWxBbGlnbiIpKSxsPW5ldyBGcih7c3R5bGU6UXMoe30sbyx7dGV4dDp0LmdldCgidGV4dCIpLHRleHRGaWxsOm8uZ2V0VGV4dENvbG9yKCl9LHtkaXNhYmxlQm94OiEwfSksejI6MTB9KSx1PWwuZ2V0Qm91bmRpbmdSZWN0KCksaD10LmdldCgic3VidGV4dCIpLGM9bmV3IEZyKHtzdHlsZTpRcyh7fSxhLHt0ZXh0OmgsdGV4dEZpbGw6YS5nZXRUZXh0Q29sb3IoKSx5OnUuaGVpZ2h0K3QuZ2V0KCJpdGVtR2FwIiksdGV4dFZlcnRpY2FsQWxpZ246InRvcCJ9LHtkaXNhYmxlQm94OiEwfSksejI6MTB9KSxkPXQuZ2V0KCJsaW5rIiksZj10LmdldCgic3VibGluayIpLHA9dC5nZXQoInRyaWdnZXJFdmVudCIsITApO2wuc2lsZW50PSFkJiYhcCxjLnNpbGVudD0hZiYmIXAsZCYmbC5vbigiY2xpY2siLGZ1bmN0aW9uKCl7d2luZG93Lm9wZW4oZCwiXyIrdC5nZXQoInRhcmdldCIpKX0pLGYmJmMub24oImNsaWNrIixmdW5jdGlvbigpe3dpbmRvdy5vcGVuKGYsIl8iK3QuZ2V0KCJzdWJ0YXJnZXQiKSl9KSxsLmV2ZW50RGF0YT1jLmV2ZW50RGF0YT1wP3tjb21wb25lbnRUeXBlOiJ0aXRsZSIsY29tcG9uZW50SW5kZXg6dC5jb21wb25lbnRJbmRleH06bnVsbCxuLmFkZChsKSxoJiZuLmFkZChjKTt2YXIgZz1uLmdldEJvdW5kaW5nUmVjdCgpLG09dC5nZXRCb3hMYXlvdXRQYXJhbXMoKTttLndpZHRoPWcud2lkdGgsbS5oZWlnaHQ9Zy5oZWlnaHQ7dmFyIHY9dnUobSx7d2lkdGg6aS5nZXRXaWR0aCgpLGhlaWdodDppLmdldEhlaWdodCgpfSx0LmdldCgicGFkZGluZyIpKTtyfHwoIm1pZGRsZSI9PT0ocj10LmdldCgibGVmdCIpfHx0LmdldCgicmlnaHQiKSkmJihyPSJjZW50ZXIiKSwicmlnaHQiPT09cj92LngrPXYud2lkdGg6ImNlbnRlciI9PT1yJiYodi54Kz12LndpZHRoLzIpKSxzfHwoImNlbnRlciI9PT0ocz10LmdldCgidG9wIil8fHQuZ2V0KCJib3R0b20iKSkmJihzPSJtaWRkbGUiKSwiYm90dG9tIj09PXM/di55Kz12LmhlaWdodDoibWlkZGxlIj09PXMmJih2LnkrPXYuaGVpZ2h0LzIpLHM9c3x8InRvcCIpLG4uYXR0cigicG9zaXRpb24iLFt2Lngsdi55XSk7dmFyIHk9e3RleHRBbGlnbjpyLHRleHRWZXJ0aWNhbEFsaWduOnN9O2wuc2V0U3R5bGUoeSksYy5zZXRTdHlsZSh5KSxnPW4uZ2V0Qm91bmRpbmdSZWN0KCk7dmFyIHg9di5tYXJnaW4sXz10LmdldEl0ZW1TdHlsZShbImNvbG9yIiwib3BhY2l0eSJdKTtfLmZpbGw9dC5nZXQoImJhY2tncm91bmRDb2xvciIpO3ZhciB3PW5ldyBpcyh7c2hhcGU6e3g6Zy54LXhbM10seTpnLnkteFswXSx3aWR0aDpnLndpZHRoK3hbMV0reFszXSxoZWlnaHQ6Zy5oZWlnaHQreFswXSt4WzJdLHI6dC5nZXQoImJvcmRlclJhZGl1cyIpfSxzdHlsZTpfLHN1YlBpeGVsT3B0aW1pemU6ITAsc2lsZW50OiEwfSk7bi5hZGQodyl9fX0pO2Z1bmN0aW9uIHpEKHQpe3ZhciBlPXQuaXRlbVN0eWxlfHwodC5pdGVtU3R5bGU9e30pLGk9ZS5lbXBoYXNpc3x8KGUuZW1waGFzaXM9e30pLG49dC5sYWJlbHx8dC5sYWJlbHx8e30sbz1uLm5vcm1hbHx8KG4ubm9ybWFsPXt9KSxhPXtub3JtYWw6MSxlbXBoYXNpczoxfTtFKG4sZnVuY3Rpb24odCxlKXthW2VdfHxSRChvLGUpfHwob1tlXT10KX0pLGkubGFiZWwmJiFSRChuLCJlbXBoYXNpcyIpJiYobi5lbXBoYXNpcz1pLmxhYmVsLGRlbGV0ZSBpLmxhYmVsKX1mdW5jdGlvbiBSRCh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpfVR1LnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcigidGltZWxpbmUiLGZ1bmN0aW9uKCl7cmV0dXJuInNsaWRlciJ9KSxnZih7dHlwZToidGltZWxpbmVDaGFuZ2UiLGV2ZW50OiJ0aW1lbGluZUNoYW5nZWQiLHVwZGF0ZToicHJlcGFyZUFuZFVwZGF0ZSJ9LGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5nZXRDb21wb25lbnQoInRpbWVsaW5lIik7cmV0dXJuIGkmJm51bGwhPXQuY3VycmVudEluZGV4JiYoaS5zZXRDdXJyZW50SW5kZXgodC5jdXJyZW50SW5kZXgpLCFpLmdldCgibG9vcCIsITApJiZpLmlzSW5kZXhNYXgoKSYmaS5zZXRQbGF5U3RhdGUoITEpKSxlLnJlc2V0T3B0aW9uKCJ0aW1lbGluZSIpLEMoe2N1cnJlbnRJbmRleDppLm9wdGlvbi5jdXJyZW50SW5kZXh9LHQpfSksZ2Yoe3R5cGU6InRpbWVsaW5lUGxheUNoYW5nZSIsZXZlbnQ6InRpbWVsaW5lUGxheUNoYW5nZWQiLHVwZGF0ZToidXBkYXRlIn0sZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldENvbXBvbmVudCgidGltZWxpbmUiKTtpJiZudWxsIT10LnBsYXlTdGF0ZSYmaS5zZXRQbGF5U3RhdGUodC5wbGF5U3RhdGUpfSk7dmFyIEJEPVR1LmV4dGVuZCh7dHlwZToidGltZWxpbmUiLGxheW91dE1vZGU6ImJveCIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo0LHNob3c6ITAsYXhpc1R5cGU6InRpbWUiLHJlYWx0aW1lOiEwLGxlZnQ6IjIwJSIsdG9wOm51bGwscmlnaHQ6IjIwJSIsYm90dG9tOjAsd2lkdGg6bnVsbCxoZWlnaHQ6NDAscGFkZGluZzo1LGNvbnRyb2xQb3NpdGlvbjoibGVmdCIsYXV0b1BsYXk6ITEscmV3aW5kOiExLGxvb3A6ITAscGxheUludGVydmFsOjJlMyxjdXJyZW50SW5kZXg6MCxpdGVtU3R5bGU6e30sbGFiZWw6e2NvbG9yOiIjMDAwIn0sZGF0YTpbXX0saW5pdDpmdW5jdGlvbih0LGUsaSl7dGhpcy5fZGF0YSx0aGlzLl9uYW1lcyx0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsaSksdGhpcy5faW5pdERhdGEoKX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7QkQuc3VwZXJBcHBseSh0aGlzLCJtZXJnZU9wdGlvbiIsYXJndW1lbnRzKSx0aGlzLl9pbml0RGF0YSgpfSxzZXRDdXJyZW50SW5kZXg6ZnVuY3Rpb24odCl7bnVsbD09dCYmKHQ9dGhpcy5vcHRpb24uY3VycmVudEluZGV4KTt2YXIgZT10aGlzLl9kYXRhLmNvdW50KCk7dGhpcy5vcHRpb24ubG9vcD90PSh0JWUrZSklZTooZTw9dCYmKHQ9ZS0xKSx0PDAmJih0PTApKSx0aGlzLm9wdGlvbi5jdXJyZW50SW5kZXg9dH0sZ2V0Q3VycmVudEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uLmN1cnJlbnRJbmRleH0saXNJbmRleE1heDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEN1cnJlbnRJbmRleCgpPj10aGlzLl9kYXRhLmNvdW50KCktMX0sc2V0UGxheVN0YXRlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9uLmF1dG9QbGF5PSEhdH0sZ2V0UGxheVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLm9wdGlvbi5hdXRvUGxheX0sX2luaXREYXRhOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb24sZT10LmRhdGF8fFtdLGk9dC5heGlzVHlwZSxvPXRoaXMuX25hbWVzPVtdO2lmKCJjYXRlZ29yeSI9PT1pKXt2YXIgYT1bXTtFKGUsZnVuY3Rpb24odCxlKXt2YXIgaSxuPUJvKHQpO1IodCk/KGk9RCh0KSkudmFsdWU9ZTppPWUsYS5wdXNoKGkpLHoobil8fG51bGwhPW4mJiFpc05hTihuKXx8KG49IiIpLG8ucHVzaChuKyIiKX0pLGU9YX12YXIgbj17Y2F0ZWdvcnk6Im9yZGluYWwiLHRpbWU6InRpbWUifVtpXXx8Im51bWJlciI7KHRoaXMuX2RhdGE9bmV3IFdmKFt7bmFtZToidmFsdWUiLHR5cGU6bn1dLHRoaXMpKS5pbml0RGF0YShlLG8pfSxnZXREYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LGdldENhdGVnb3JpZXM6ZnVuY3Rpb24oKXtpZigiY2F0ZWdvcnkiPT09dGhpcy5nZXQoImF4aXNUeXBlIikpcmV0dXJuIHRoaXMuX25hbWVzLnNsaWNlKCl9fSk7YihCRC5leHRlbmQoe3R5cGU6InRpbWVsaW5lLnNsaWRlciIsZGVmYXVsdE9wdGlvbjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJDb2xvcjoiI2NjYyIsYm9yZGVyV2lkdGg6MCxvcmllbnQ6Imhvcml6b250YWwiLGludmVyc2U6ITEsdG9vbHRpcDp7dHJpZ2dlcjoiaXRlbSJ9LHN5bWJvbDoiZW1wdHlDaXJjbGUiLHN5bWJvbFNpemU6MTAsbGluZVN0eWxlOntzaG93OiEwLHdpZHRoOjIsY29sb3I6IiMzMDQ2NTQifSxsYWJlbDp7cG9zaXRpb246ImF1dG8iLHNob3c6ITAsaW50ZXJ2YWw6ImF1dG8iLHJvdGF0ZTowLGNvbG9yOiIjMzA0NjU0In0saXRlbVN0eWxlOntjb2xvcjoiIzMwNDY1NCIsYm9yZGVyV2lkdGg6MX0sY2hlY2twb2ludFN0eWxlOntzeW1ib2w6ImNpcmNsZSIsc3ltYm9sU2l6ZToxMyxjb2xvcjoiI2MyMzUzMSIsYm9yZGVyV2lkdGg6NSxib3JkZXJDb2xvcjoicmdiYSgxOTQsNTMsNDksIDAuNSkiLGFuaW1hdGlvbjohMCxhbmltYXRpb25EdXJhdGlvbjozMDAsYW5pbWF0aW9uRWFzaW5nOiJxdWludGljSW5PdXQifSxjb250cm9sU3R5bGU6e3Nob3c6ITAsc2hvd1BsYXlCdG46ITAsc2hvd1ByZXZCdG46ITAsc2hvd05leHRCdG46ITAsaXRlbVNpemU6MjIsaXRlbUdhcDoxMixwb3NpdGlvbjoibGVmdCIscGxheUljb246InBhdGg6Ly9NMzEuNiw1M0MxNy41LDUzLDYsNDEuNSw2LDI3LjRTMTcuNSwxLjgsMzEuNiwxLjhDNDUuNywxLjgsNTcuMiwxMy4zLDU3LjIsMjcuNFM0NS43LDUzLDMxLjYsNTN6IE0zMS42LDMuMyBDMTguNCwzLjMsNy41LDE0LjEsNy41LDI3LjRjMCwxMy4zLDEwLjgsMjQuMSwyNC4xLDI0LjFDNDQuOSw1MS41LDU1LjcsNDAuNyw1NS43LDI3LjRDNTUuNywxNC4xLDQ0LjksMy4zLDMxLjYsMy4zeiBNMjQuOSwyMS4zIGMwLTIuMiwxLjYtMy4xLDMuNS0ybDEwLjUsNi4xYzEuODk5LDEuMSwxLjg5OSwyLjksMCw0bC0xMC41LDYuMWMtMS45LDEuMS0zLjUsMC4yLTMuNS0yVjIxLjN6IixzdG9wSWNvbjoicGF0aDovL00zMC45LDUzLjJDMTYuOCw1My4yLDUuMyw0MS43LDUuMywyNy42UzE2LjgsMiwzMC45LDJDNDUsMiw1Ni40LDEzLjUsNTYuNCwyNy42UzQ1LDUzLjIsMzAuOSw1My4yeiBNMzAuOSwzLjVDMTcuNiwzLjUsNi44LDE0LjQsNi44LDI3LjZjMCwxMy4zLDEwLjgsMjQuMSwyNC4xMDEsMjQuMUM0NC4yLDUxLjcsNTUsNDAuOSw1NSwyNy42QzU0LjksMTQuNCw0NC4xLDMuNSwzMC45LDMuNXogTTM2LjksMzUuOGMwLDAuNjAxLTAuNCwxLTAuOSwxaC0xLjNjLTAuNSwwLTAuOS0wLjM5OS0wLjktMVYxOS41YzAtMC42LDAuNC0xLDAuOS0xSDM2YzAuNSwwLDAuOSwwLjQsMC45LDFWMzUuOHogTTI3LjgsMzUuOCBjMCwwLjYwMS0wLjQsMS0wLjksMWgtMS4zYy0wLjUsMC0wLjktMC4zOTktMC45LTFWMTkuNWMwLTAuNiwwLjQtMSwwLjktMUgyN2MwLjUsMCwwLjksMC40LDAuOSwxTDI3LjgsMzUuOEwyNy44LDM1Ljh6IixuZXh0SWNvbjoicGF0aDovL00xOC42LDUwLjhsMjIuNS0yMi41YzAuMi0wLjIsMC4zLTAuNCwwLjMtMC43YzAtMC4zLTAuMS0wLjUtMC4zLTAuN0wxOC43LDQuNGMtMC4xLTAuMS0wLjItMC4zLTAuMi0wLjUgYzAtMC40LDAuMy0wLjgsMC44LTAuOGMwLjIsMCwwLjUsMC4xLDAuNiwwLjNsMjMuNSwyMy41bDAsMGMwLjIsMC4yLDAuMywwLjQsMC4zLDAuN2MwLDAuMy0wLjEsMC41LTAuMywwLjdsLTAuMSwwLjFMMTkuNyw1MiBjLTAuMSwwLjEtMC4zLDAuMi0wLjUsMC4yYy0wLjQsMC0wLjgtMC4zLTAuOC0wLjhDMTguNCw1MS4yLDE4LjUsNTEsMTguNiw1MC44eiIscHJldkljb246InBhdGg6Ly9NNDMsNTIuOEwyMC40LDMwLjNjLTAuMi0wLjItMC4zLTAuNC0wLjMtMC43YzAtMC4zLDAuMS0wLjUsMC4zLTAuN0w0Mi45LDYuNGMwLjEtMC4xLDAuMi0wLjMsMC4yLTAuNSBjMC0wLjQtMC4zLTAuOC0wLjgtMC44Yy0wLjIsMC0wLjUsMC4xLTAuNiwwLjNMMTguMywyOC44bDAsMGMtMC4yLDAuMi0wLjMsMC40LTAuMywwLjdjMCwwLjMsMC4xLDAuNSwwLjMsMC43bDAuMSwwLjFMNDEuOSw1NCBjMC4xLDAuMSwwLjMsMC4yLDAuNSwwLjJjMC40LDAsMC44LTAuMywwLjgtMC44QzQzLjIsNTMuMiw0My4xLDUzLDQzLDUyLjh6Iixjb2xvcjoiIzMwNDY1NCIsYm9yZGVyQ29sb3I6IiMzMDQ2NTQiLGJvcmRlcldpZHRoOjF9LGVtcGhhc2lzOntsYWJlbDp7c2hvdzohMCxjb2xvcjoiI2MyMzUzMSJ9LGl0ZW1TdHlsZTp7Y29sb3I6IiNjMjM1MzEifSxjb250cm9sU3R5bGU6e2NvbG9yOiIjYzIzNTMxIixib3JkZXJDb2xvcjoiI2MyMzUzMSIsYm9yZGVyV2lkdGg6Mn19LGRhdGE6W119fSksRmgpO2Z1bmN0aW9uIFZEKHQsZSxpLG4pe0VnLmNhbGwodGhpcyx0LGUsaSksdGhpcy50eXBlPW58fCJ2YWx1ZSIsdGhpcy5tb2RlbD1udWxsfXZhciBHRD1oYy5leHRlbmQoe3R5cGU6InRpbWVsaW5lIn0pO1ZELnByb3RvdHlwZT17Y29uc3RydWN0b3I6VkQsZ2V0TGFiZWxNb2RlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZGVsLmdldE1vZGVsKCJsYWJlbCIpfSxpc0hvcml6b250YWw6ZnVuY3Rpb24oKXtyZXR1cm4iaG9yaXpvbnRhbCI9PT10aGlzLm1vZGVsLmdldCgib3JpZW50Iil9fSx3KFZELEVnKTt2YXIgRkQ9QSxXRD1FLEhEPU1hdGguUEk7ZnVuY3Rpb24gWkQodCxlLGksbixvLGEpe3ZhciByPWUuZ2V0KCJjb2xvciIpO28/KG8uc2V0Q29sb3IociksaS5hZGQobyksYSYmYS5vblVwZGF0ZShvKSk6KChvPW1nKHQuZ2V0KCJzeW1ib2wiKSwtMSwtMSwyLDIscikpLnNldFN0eWxlKCJzdHJva2VOb1NjYWxlIiwhMCksaS5hZGQobyksYSYmYS5vbkNyZWF0ZShvKSk7dmFyIHM9ZS5nZXRJdGVtU3R5bGUoWyJjb2xvciIsInN5bWJvbCIsInN5bWJvbFNpemUiXSk7by5zZXRTdHlsZShzKSxuPW0oe3JlY3RIb3ZlcjohMCx6MjoxMDB9LG4sITApO3ZhciBsPXQuZ2V0KCJzeW1ib2xTaXplIik7KGw9bCBpbnN0YW5jZW9mIEFycmF5P2wuc2xpY2UoKTpbK2wsK2xdKVswXS89MixsWzFdLz0yLG4uc2NhbGU9bDt2YXIgdT10LmdldCgic3ltYm9sT2Zmc2V0Iik7aWYodSl7dmFyIGg9bi5wb3NpdGlvbj1uLnBvc2l0aW9ufHxbMCwwXTtoWzBdKz1QbCh1WzBdLGxbMF0pLGhbMV0rPVBsKHVbMV0sbFsxXSl9dmFyIGM9dC5nZXQoInN5bWJvbFJvdGF0ZSIpO3JldHVybiBuLnJvdGF0aW9uPShjfHwwKSpNYXRoLlBJLzE4MHx8MCxvLmF0dHIobiksby51cGRhdGVUcmFuc2Zvcm0oKSxvfWZ1bmN0aW9uIFVEKHQsZSxpLG4sbyl7aWYoIXQuZHJhZ2dpbmcpe3ZhciBhPW4uZ2V0TW9kZWwoImNoZWNrcG9pbnRTdHlsZSIpLHI9aS5kYXRhVG9Db29yZChuLmdldERhdGEoKS5nZXQoWyJ2YWx1ZSJdLGUpKTtvfHwhYS5nZXQoImFuaW1hdGlvbiIsITApP3QuYXR0cih7cG9zaXRpb246W3IsMF19KToodC5zdG9wQW5pbWF0aW9uKCEwKSx0LmFuaW1hdGVUbyh7cG9zaXRpb246W3IsMF19LGEuZ2V0KCJhbmltYXRpb25EdXJhdGlvbiIsITApLGEuZ2V0KCJhbmltYXRpb25FYXNpbmciLCEwKSkpfX1HRC5leHRlbmQoe3R5cGU6InRpbWVsaW5lLnNsaWRlciIsaW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuYXBpPWUsdGhpcy5fYXhpcyx0aGlzLl92aWV3UmVjdCx0aGlzLl90aW1lcix0aGlzLl9jdXJyZW50UG9pbnRlcix0aGlzLl9tYWluR3JvdXAsdGhpcy5fbGFiZWxHcm91cH0scmVuZGVyOmZ1bmN0aW9uKGUsdCxpLG4pe2lmKHRoaXMubW9kZWw9ZSx0aGlzLmFwaT1pLHRoaXMuZWNNb2RlbD10LHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCksZS5nZXQoInNob3ciLCEwKSl7dmFyIG89dGhpcy5fbGF5b3V0KGUsaSksYT10aGlzLl9jcmVhdGVHcm91cCgibWFpbkdyb3VwIikscj10aGlzLl9jcmVhdGVHcm91cCgibGFiZWxHcm91cCIpLHM9dGhpcy5fYXhpcz10aGlzLl9jcmVhdGVBeGlzKG8sZSk7ZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQpe3JldHVybiBldShzLnNjYWxlLmdldExhYmVsKHQpKX0sV0QoWyJBeGlzTGluZSIsIkF4aXNUaWNrIiwiQ29udHJvbCIsIkN1cnJlbnRQb2ludGVyIl0sZnVuY3Rpb24odCl7dGhpc1siX3JlbmRlciIrdF0obyxhLHMsZSl9LHRoaXMpLHRoaXMuX3JlbmRlckF4aXNMYWJlbChvLHIscyxlKSx0aGlzLl9wb3NpdGlvbihvLGUpfXRoaXMuX2RvUGxheVN0b3AoKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJUaW1lcigpLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLl9jbGVhclRpbWVyKCl9LF9sYXlvdXQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldCgibGFiZWwucG9zaXRpb24iKSxuPXQuZ2V0KCJvcmllbnQiKSxvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZ1KHQuZ2V0Qm94TGF5b3V0UGFyYW1zKCkse3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0sdC5nZXQoInBhZGRpbmciKSl9KHQsZSk7bnVsbD09aXx8ImF1dG8iPT09aT9pPSJob3Jpem9udGFsIj09PW4/by55K28uaGVpZ2h0LzI8ZS5nZXRIZWlnaHQoKS8yPyItIjoiKyI6by54K28ud2lkdGgvMjxlLmdldFdpZHRoKCkvMj8iKyI6Ii0iOmlzTmFOKGkpJiYoaT17aG9yaXpvbnRhbDp7dG9wOiItIixib3R0b206IisifSx2ZXJ0aWNhbDp7bGVmdDoiLSIscmlnaHQ6IisifX1bbl1baV0pO3ZhciBhLHIscyxsLHU9e2hvcml6b250YWw6ImNlbnRlciIsdmVydGljYWw6MDw9aXx8IisiPT09aT8ibGVmdCI6InJpZ2h0In0saD17aG9yaXpvbnRhbDowPD1pfHwiKyI9PT1pPyJ0b3AiOiJib3R0b20iLHZlcnRpY2FsOiJtaWRkbGUifSxjPXtob3Jpem9udGFsOjAsdmVydGljYWw6SEQvMn0sZD0idmVydGljYWwiPT09bj9vLmhlaWdodDpvLndpZHRoLGY9dC5nZXRNb2RlbCgiY29udHJvbFN0eWxlIikscD1mLmdldCgic2hvdyIsITApLGc9cD9mLmdldCgiaXRlbVNpemUiKTowLG09cD9mLmdldCgiaXRlbUdhcCIpOjAsdj1nK20seT10LmdldCgibGFiZWwucm90YXRlIil8fDA7eT15KkhELzE4MDt2YXIgeD1mLmdldCgicG9zaXRpb24iLCEwKSxfPXAmJmYuZ2V0KCJzaG93UGxheUJ0biIsITApLHc9cCYmZi5nZXQoInNob3dQcmV2QnRuIiwhMCksYj1wJiZmLmdldCgic2hvd05leHRCdG4iLCEwKSxTPTAsTT1kO3JldHVybiJsZWZ0Ij09PXh8fCJib3R0b20iPT09eD8oXyYmKGE9WzAsMF0sUys9diksdyYmKHI9W1MsMF0sUys9dikpOihfJiYoYT1bTS1nLDBdLE0tPXYpLHcmJihyPVswLDBdLFMrPXYpKSxiJiYocz1bTS1nLDBdLE0tPXYpLGw9W1MsTV0sdC5nZXQoImludmVyc2UiKSYmbC5yZXZlcnNlKCkse3ZpZXdSZWN0Om8sbWFpbkxlbmd0aDpkLG9yaWVudDpuLHJvdGF0aW9uOmNbbl0sbGFiZWxSb3RhdGlvbjp5LGxhYmVsUG9zT3B0OmksbGFiZWxBbGlnbjp0LmdldCgibGFiZWwuYWxpZ24iKXx8dVtuXSxsYWJlbEJhc2VsaW5lOnQuZ2V0KCJsYWJlbC52ZXJ0aWNhbEFsaWduIil8fHQuZ2V0KCJsYWJlbC5iYXNlbGluZSIpfHxoW25dLHBsYXlQb3NpdGlvbjphLHByZXZCdG5Qb3NpdGlvbjpyLG5leHRCdG5Qb3NpdGlvbjpzLGF4aXNFeHRlbnQ6bCxjb250cm9sU2l6ZTpnLGNvbnRyb2xHYXA6bX19LF9wb3NpdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX21haW5Hcm91cCxuPXRoaXMuX2xhYmVsR3JvdXAsbz10LnZpZXdSZWN0O2lmKCJ2ZXJ0aWNhbCI9PT10Lm9yaWVudCl7dmFyIGE9ZWUoKSxyPW8ueCxzPW8ueStvLmhlaWdodDthZShhLGEsWy1yLC1zXSkscmUoYSxhLC1IRC8yKSxhZShhLGEsW3Isc10pLChvPW8uY2xvbmUoKSkuYXBwbHlUcmFuc2Zvcm0oYSl9dmFyIGw9bShvKSx1PW0oaS5nZXRCb3VuZGluZ1JlY3QoKSksaD1tKG4uZ2V0Qm91bmRpbmdSZWN0KCkpLGM9aS5wb3NpdGlvbixkPW4ucG9zaXRpb247ZFswXT1jWzBdPWxbMF1bMF07dmFyIGYscD10LmxhYmVsUG9zT3B0O2lzTmFOKHApPyh2KGMsdSxsLDEsZj0iKyI9PT1wPzA6MSksdihkLGgsbCwxLDEtZikpOih2KGMsdSxsLDEsZj0wPD1wPzA6MSksZFsxXT1jWzFdK3ApO2Z1bmN0aW9uIGcodCl7dmFyIGU9dC5wb3NpdGlvbjt0Lm9yaWdpbj1bbFswXVswXS1lWzBdLGxbMV1bMF0tZVsxXV19ZnVuY3Rpb24gbSh0KXtyZXR1cm5bW3QueCx0LngrdC53aWR0aF0sW3QueSx0LnkrdC5oZWlnaHRdXX1mdW5jdGlvbiB2KHQsZSxpLG4sbyl7dFtuXSs9aVtuXVtvXS1lW25dW29dfWkuYXR0cigicG9zaXRpb24iLGMpLG4uYXR0cigicG9zaXRpb24iLGQpLGkucm90YXRpb249bi5yb3RhdGlvbj10LnJvdGF0aW9uLGcoaSksZyhuKX0sX2NyZWF0ZUF4aXM6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldERhdGEoKSxuPWUuZ2V0KCJheGlzVHlwZSIpLG89aWcoZSxuKTtvLmdldFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGkubWFwQXJyYXkoWyJ2YWx1ZSJdLGZ1bmN0aW9uKHQpe3JldHVybiB0fSl9O3ZhciBhPWkuZ2V0RGF0YUV4dGVudCgidmFsdWUiKTtvLnNldEV4dGVudChhWzBdLGFbMV0pLG8ubmljZVRpY2tzKCk7dmFyIHI9bmV3IFZEKCJ2YWx1ZSIsbyx0LmF4aXNFeHRlbnQsbik7cmV0dXJuIHIubW9kZWw9ZSxyfSxfY3JlYXRlR3JvdXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc1siXyIrdF09bmV3IElpO3JldHVybiB0aGlzLmdyb3VwLmFkZChlKSxlfSxfcmVuZGVyQXhpc0xpbmU6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89aS5nZXRFeHRlbnQoKTtuLmdldCgibGluZVN0eWxlLnNob3ciKSYmZS5hZGQobmV3IG9zKHtzaGFwZTp7eDE6b1swXSx5MTowLHgyOm9bMV0seTI6MH0sc3R5bGU6TCh7bGluZUNhcDoicm91bmQifSxuLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSksc2lsZW50OiEwLHoyOjF9KSl9LF9yZW5kZXJBeGlzVGljazpmdW5jdGlvbih0LHMsbCx1KXt2YXIgaD11LmdldERhdGEoKSxlPWwuc2NhbGUuZ2V0VGlja3MoKTtXRChlLGZ1bmN0aW9uKHQpe3ZhciBlPWwuZGF0YVRvQ29vcmQodCksaT1oLmdldEl0ZW1Nb2RlbCh0KSxuPWkuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLG89aS5nZXRNb2RlbCgiZW1waGFzaXMuaXRlbVN0eWxlIiksYT17cG9zaXRpb246W2UsMF0sb25jbGljazpGRCh0aGlzLl9jaGFuZ2VUaW1lbGluZSx0aGlzLHQpfSxyPVpEKGksbixzLGEpO1lzKHIsby5nZXRJdGVtU3R5bGUoKSksaS5nZXQoInRvb2x0aXAiKT8oci5kYXRhSW5kZXg9dCxyLmRhdGFNb2RlbD11KTpyLmRhdGFJbmRleD1yLmRhdGFNb2RlbD1udWxsfSx0aGlzKX0sX3JlbmRlckF4aXNMYWJlbDpmdW5jdGlvbihzLGwsdSx0KXtpZih1LmdldExhYmVsTW9kZWwoKS5nZXQoInNob3ciKSl7dmFyIGg9dC5nZXREYXRhKCksZT11LmdldFZpZXdMYWJlbHMoKTtXRChlLGZ1bmN0aW9uKHQpe3ZhciBlPXQudGlja1ZhbHVlLGk9aC5nZXRJdGVtTW9kZWwoZSksbj1pLmdldE1vZGVsKCJsYWJlbCIpLG89aS5nZXRNb2RlbCgiZW1waGFzaXMubGFiZWwiKSxhPXUuZGF0YVRvQ29vcmQodC50aWNrVmFsdWUpLHI9bmV3IEZyKHtwb3NpdGlvbjpbYSwwXSxyb3RhdGlvbjpzLmxhYmVsUm90YXRpb24tcy5yb3RhdGlvbixvbmNsaWNrOkZEKHRoaXMuX2NoYW5nZVRpbWVsaW5lLHRoaXMsZSksc2lsZW50OiExfSk7UXMoci5zdHlsZSxuLHt0ZXh0OnQuZm9ybWF0dGVkTGFiZWwsdGV4dEFsaWduOnMubGFiZWxBbGlnbix0ZXh0VmVydGljYWxBbGlnbjpzLmxhYmVsQmFzZWxpbmV9KSxsLmFkZChyKSxZcyhyLFFzKHt9LG8pKX0sdGhpcyl9fSxfcmVuZGVyQ29udHJvbDpmdW5jdGlvbih0LGEsZSxyKXt2YXIgcz10LmNvbnRyb2xTaXplLGw9dC5yb3RhdGlvbix1PXIuZ2V0TW9kZWwoImNvbnRyb2xTdHlsZSIpLmdldEl0ZW1TdHlsZSgpLGg9ci5nZXRNb2RlbCgiZW1waGFzaXMuY29udHJvbFN0eWxlIikuZ2V0SXRlbVN0eWxlKCksYz1bMCwtcy8yLHMsc10saT1yLmdldFBsYXlTdGF0ZSgpLG49ci5nZXQoImludmVyc2UiLCEwKTtmdW5jdGlvbiBvKHQsZSxpLG4pe2lmKHQpe3ZhciBvPWZ1bmN0aW9uKHQsZSxpLG4pe3JldHVybiBEcyh0LmdldChlKS5yZXBsYWNlKC9ecGF0aDpcL1wvLywiIiksRChufHx7fSksbmV3IE1pKGlbMF0saVsxXSxpWzJdLGlbM10pLCJjZW50ZXIiKX0ocixlLGMse3Bvc2l0aW9uOnQsb3JpZ2luOltzLzIsMF0scm90YXRpb246bj8tbDowLHJlY3RIb3ZlcjohMCxzdHlsZTp1LG9uY2xpY2s6aX0pO2EuYWRkKG8pLFlzKG8saCl9fW8odC5uZXh0QnRuUG9zaXRpb24sImNvbnRyb2xTdHlsZS5uZXh0SWNvbiIsRkQodGhpcy5fY2hhbmdlVGltZWxpbmUsdGhpcyxuPyItIjoiKyIpKSxvKHQucHJldkJ0blBvc2l0aW9uLCJjb250cm9sU3R5bGUucHJldkljb24iLEZEKHRoaXMuX2NoYW5nZVRpbWVsaW5lLHRoaXMsbj8iKyI6Ii0iKSksbyh0LnBsYXlQb3NpdGlvbiwiY29udHJvbFN0eWxlLiIrKGk/InN0b3BJY29uIjoicGxheUljb24iKSxGRCh0aGlzLl9oYW5kbGVQbGF5Q2xpY2ssdGhpcywhaSksITApfSxfcmVuZGVyQ3VycmVudFBvaW50ZXI6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89bi5nZXREYXRhKCksYT1uLmdldEN1cnJlbnRJbmRleCgpLHI9by5nZXRJdGVtTW9kZWwoYSkuZ2V0TW9kZWwoImNoZWNrcG9pbnRTdHlsZSIpLHM9dGhpcyxsPXtvbkNyZWF0ZTpmdW5jdGlvbih0KXt0LmRyYWdnYWJsZT0hMCx0LmRyaWZ0PUZEKHMuX2hhbmRsZVBvaW50ZXJEcmFnLHMpLHQub25kcmFnZW5kPUZEKHMuX2hhbmRsZVBvaW50ZXJEcmFnZW5kLHMpLFVEKHQsYSxpLG4sITApfSxvblVwZGF0ZTpmdW5jdGlvbih0KXtVRCh0LGEsaSxuKX19O3RoaXMuX2N1cnJlbnRQb2ludGVyPVpEKHIscix0aGlzLl9tYWluR3JvdXAse30sdGhpcy5fY3VycmVudFBvaW50ZXIsbCl9LF9oYW5kbGVQbGF5Q2xpY2s6ZnVuY3Rpb24odCl7dGhpcy5fY2xlYXJUaW1lcigpLHRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0aW1lbGluZVBsYXlDaGFuZ2UiLHBsYXlTdGF0ZTp0LGZyb206dGhpcy51aWR9KX0sX2hhbmRsZVBvaW50ZXJEcmFnOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fcG9pbnRlckNoYW5nZVRpbWVsaW5lKFtpLm9mZnNldFgsaS5vZmZzZXRZXSl9LF9oYW5kbGVQb2ludGVyRHJhZ2VuZDpmdW5jdGlvbih0KXt0aGlzLl9wb2ludGVyQ2hhbmdlVGltZWxpbmUoW3Qub2Zmc2V0WCx0Lm9mZnNldFldLCEwKX0sX3BvaW50ZXJDaGFuZ2VUaW1lbGluZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3RvQXhpc0Nvb3JkKHQpWzBdLG49T2wodGhpcy5fYXhpcy5nZXRFeHRlbnQoKS5zbGljZSgpKTtpPm5bMV0mJihpPW5bMV0pLGk8blswXSYmKGk9blswXSksdGhpcy5fY3VycmVudFBvaW50ZXIucG9zaXRpb25bMF09aSx0aGlzLl9jdXJyZW50UG9pbnRlci5kaXJ0eSgpO3ZhciBvPXRoaXMuX2ZpbmROZWFyZXN0VGljayhpKSxhPXRoaXMubW9kZWw7KGV8fG8hPT1hLmdldEN1cnJlbnRJbmRleCgpJiZhLmdldCgicmVhbHRpbWUiKSkmJnRoaXMuX2NoYW5nZVRpbWVsaW5lKG8pfSxfZG9QbGF5U3RvcDpmdW5jdGlvbigpe3RoaXMuX2NsZWFyVGltZXIoKSx0aGlzLm1vZGVsLmdldFBsYXlTdGF0ZSgpJiYodGhpcy5fdGltZXI9c2V0VGltZW91dChGRChmdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWw7dGhpcy5fY2hhbmdlVGltZWxpbmUodC5nZXRDdXJyZW50SW5kZXgoKSsodC5nZXQoInJld2luZCIsITApPy0xOjEpKX0sdGhpcyksdGhpcy5tb2RlbC5nZXQoInBsYXlJbnRlcnZhbCIpKSl9LF90b0F4aXNDb29yZDpmdW5jdGlvbih0KXtyZXR1cm4gaGwodCx0aGlzLl9tYWluR3JvdXAuZ2V0TG9jYWxUcmFuc2Zvcm0oKSwhMCl9LF9maW5kTmVhcmVzdFRpY2s6ZnVuY3Rpb24obyl7dmFyIGEsdD10aGlzLm1vZGVsLmdldERhdGEoKSxyPTEvMCxzPXRoaXMuX2F4aXM7cmV0dXJuIHQuZWFjaChbInZhbHVlIl0sZnVuY3Rpb24odCxlKXt2YXIgaT1zLmRhdGFUb0Nvb3JkKHQpLG49TWF0aC5hYnMoaS1vKTtuPHImJihyPW4sYT1lKX0pLGF9LF9jbGVhclRpbWVyOmZ1bmN0aW9uKCl7dGhpcy5fdGltZXImJihjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpfSxfY2hhbmdlVGltZWxpbmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tb2RlbC5nZXRDdXJyZW50SW5kZXgoKTsiKyI9PT10P3Q9ZSsxOiItIj09PXQmJih0PWUtMSksdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRpbWVsaW5lQ2hhbmdlIixjdXJyZW50SW5kZXg6dCxmcm9tOnRoaXMudWlkfSl9fSksZmYoZnVuY3Rpb24odCl7dmFyIGU9dCYmdC50aW1lbGluZTtrKGUpfHwoZT1lP1tlXTpbXSksRShlLGZ1bmN0aW9uKHQpe3QmJmZ1bmN0aW9uKHQpe3ZhciBlPXQudHlwZSxpPXtudW1iZXI6InZhbHVlIix0aW1lOiJ0aW1lIn07aVtlXSYmKHQuYXhpc1R5cGU9aVtlXSxkZWxldGUgdC50eXBlKTtpZih6RCh0KSxSRCh0LCJjb250cm9sUG9zaXRpb24iKSl7dmFyIG49dC5jb250cm9sU3R5bGV8fCh0LmNvbnRyb2xTdHlsZT17fSk7UkQobiwicG9zaXRpb24iKXx8KG4ucG9zaXRpb249dC5jb250cm9sUG9zaXRpb24pLCJub25lIiE9PW4ucG9zaXRpb258fFJEKG4sInNob3ciKXx8KG4uc2hvdz0hMSxkZWxldGUgbi5wb3NpdGlvbiksZGVsZXRlIHQuY29udHJvbFBvc2l0aW9ufUUodC5kYXRhfHxbXSxmdW5jdGlvbih0KXtSKHQpJiYhayh0KSYmKCFSRCh0LCJ2YWx1ZSIpJiZSRCh0LCJuYW1lIikmJih0LnZhbHVlPXQubmFtZSksekQodCkpfSl9KHQpfSl9KTt2YXIgWEQ9S2wsWUQ9ZXU7ZnVuY3Rpb24gakQodCl7em8odCwibGFiZWwiLFsic2hvdyJdKX12YXIgcUQ9d2Yoe3R5cGU6Im1hcmtlciIsZGVwZW5kZW5jaWVzOlsic2VyaWVzIiwiZ3JpZCIsInBvbGFyIiwiZ2VvIl0saW5pdDpmdW5jdGlvbih0LGUsaSl7dGhpcy5tZXJnZURlZmF1bHRBbmRUaGVtZSh0LGkpLHRoaXMuX21lcmdlT3B0aW9uKHQsaSwhMSwhMCl9LGlzQW5pbWF0aW9uRW5hYmxlZDpmdW5jdGlvbigpe2lmKHYubm9kZSlyZXR1cm4hMTt2YXIgdD10aGlzLl9faG9zdFNlcmllcztyZXR1cm4gdGhpcy5nZXRTaGFsbG93KCJhbmltYXRpb24iKSYmdCYmdC5pc0FuaW1hdGlvbkVuYWJsZWQoKX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCxlKXt0aGlzLl9tZXJnZU9wdGlvbih0LGUsITEsITEpfSxfbWVyZ2VPcHRpb246ZnVuY3Rpb24odCxuLGUsbyl7dmFyIGE9dGhpcy5jb25zdHJ1Y3RvcixyPXRoaXMubWFpblR5cGUrIk1vZGVsIjtlfHxuLmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQodGhpcy5tYWluVHlwZSwhMCksaT10W3JdO2UmJmUuZGF0YT8oaT9pLl9tZXJnZU9wdGlvbihlLG4sITApOihvJiZqRChlKSxFKGUuZGF0YSxmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgQXJyYXk/KGpEKHRbMF0pLGpEKHRbMV0pKTpqRCh0KX0pLEwoaT1uZXcgYShlLHRoaXMsbikse21haW5UeXBlOnRoaXMubWFpblR5cGUsc2VyaWVzSW5kZXg6dC5zZXJpZXNJbmRleCxuYW1lOnQubmFtZSxjcmVhdGVkQnlTZWxmOiEwfSksaS5fX2hvc3RTZXJpZXM9dCksdFtyXT1pKTp0W3JdPW51bGx9LHRoaXMpfSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YSgpLGk9dGhpcy5nZXRSYXdWYWx1ZSh0KSxuPWsoaSk/TihpLFhEKS5qb2luKCIsICIpOlhEKGkpLG89ZS5nZXROYW1lKHQpLGE9WUQodGhpcy5uYW1lKTtyZXR1cm4gbnVsbD09aSYmIW98fChhKz0iPGJyIC8+IiksbyYmKGErPVlEKG8pLG51bGwhPWkmJihhKz0iIDogIikpLG51bGwhPWkmJihhKz1ZRChuKSksYX0sZ2V0RGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxzZXREYXRhOmZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH19KTtiKHFELEZoKSxxRC5leHRlbmQoe3R5cGU6Im1hcmtQb2ludCIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo1LHN5bWJvbDoicGluIixzeW1ib2xTaXplOjUwLHRvb2x0aXA6e3RyaWdnZXI6Iml0ZW0ifSxsYWJlbDp7c2hvdzohMCxwb3NpdGlvbjoiaW5zaWRlIn0saXRlbVN0eWxlOntib3JkZXJXaWR0aDoyfSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITB9fX19KTt2YXIgS0Q9XztmdW5jdGlvbiAkRCh0LGUsaSxuLG8sYSl7dmFyIHI9W10scz1scChlLG4pP2UuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja1Jlc3VsdERpbWVuc2lvbiIpOm4sbD1vQyhlLHMsdCksdT1lLmluZGljZXNPZk5lYXJlc3QocyxsKVswXTtyW29dPWUuZ2V0KGksdSksclthXT1lLmdldChuLHUpO3ZhciBoPUVsKGUuZ2V0KG4sdSkpO3JldHVybiAwPD0oaD1NYXRoLm1pbihoLDIwKSkmJihyW2FdPStyW2FdLnRvRml4ZWQoaCkpLHJ9dmFyIEpEPVQsUUQ9e21pbjpKRCgkRCwibWluIiksbWF4OkpEKCRELCJtYXgiKSxhdmVyYWdlOkpEKCRELCJhdmVyYWdlIil9O2Z1bmN0aW9uIHRDKHQsZSl7dmFyIGk9dC5nZXREYXRhKCksbj10LmNvb3JkaW5hdGVTeXN0ZW07aWYoZSYmIWZ1bmN0aW9uKHQpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KHQueCkpJiYhaXNOYU4ocGFyc2VGbG9hdCh0LnkpKX0oZSkmJiFrKGUuY29vcmQpJiZuKXt2YXIgbz1uLmRpbWVuc2lvbnMsYT1lQyhlLGksbix0KTtpZigoZT1EKGUpKS50eXBlJiZRRFtlLnR5cGVdJiZhLmJhc2VBeGlzJiZhLnZhbHVlQXhpcyl7dmFyIHI9S0QobyxhLmJhc2VBeGlzLmRpbSkscz1LRChvLGEudmFsdWVBeGlzLmRpbSk7ZS5jb29yZD1RRFtlLnR5cGVdKGksYS5iYXNlRGF0YURpbSxhLnZhbHVlRGF0YURpbSxyLHMpLGUudmFsdWU9ZS5jb29yZFtzXX1lbHNle2Zvcih2YXIgbD1bbnVsbCE9ZS54QXhpcz9lLnhBeGlzOmUucmFkaXVzQXhpcyxudWxsIT1lLnlBeGlzP2UueUF4aXM6ZS5hbmdsZUF4aXNdLHU9MDt1PDI7dSsrKVFEW2xbdV1dJiYobFt1XT1vQyhpLGkubWFwRGltZW5zaW9uKG9bdV0pLGxbdV0pKTtlLmNvb3JkPWx9fXJldHVybiBlfWZ1bmN0aW9uIGVDKHQsZSxpLG4pe3ZhciBvPXt9O3JldHVybiBudWxsIT10LnZhbHVlSW5kZXh8fG51bGwhPXQudmFsdWVEaW0/KG8udmFsdWVEYXRhRGltPW51bGwhPXQudmFsdWVJbmRleD9lLmdldERpbWVuc2lvbih0LnZhbHVlSW5kZXgpOnQudmFsdWVEaW0sby52YWx1ZUF4aXM9aS5nZXRBeGlzKGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXREYXRhKCksbj1pLmRpbWVuc2lvbnM7ZT1pLmdldERpbWVuc2lvbihlKTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIGE9aS5nZXREaW1lbnNpb25JbmZvKG5bb10pO2lmKGEubmFtZT09PWUpcmV0dXJuIGEuY29vcmREaW19fShuLG8udmFsdWVEYXRhRGltKSksby5iYXNlQXhpcz1pLmdldE90aGVyQXhpcyhvLnZhbHVlQXhpcyksby5iYXNlRGF0YURpbT1lLm1hcERpbWVuc2lvbihvLmJhc2VBeGlzLmRpbSkpOihvLmJhc2VBeGlzPW4uZ2V0QmFzZUF4aXMoKSxvLnZhbHVlQXhpcz1pLmdldE90aGVyQXhpcyhvLmJhc2VBeGlzKSxvLmJhc2VEYXRhRGltPWUubWFwRGltZW5zaW9uKG8uYmFzZUF4aXMuZGltKSxvLnZhbHVlRGF0YURpbT1lLm1hcERpbWVuc2lvbihvLnZhbHVlQXhpcy5kaW0pKSxvfWZ1bmN0aW9uIGlDKHQsZSl7cmV0dXJuISh0JiZ0LmNvbnRhaW5EYXRhJiZlLmNvb3JkJiYhZnVuY3Rpb24odCl7cmV0dXJuIShpc05hTihwYXJzZUZsb2F0KHQueCkpJiZpc05hTihwYXJzZUZsb2F0KHQueSkpKX0oZSkpfHx0LmNvbnRhaW5EYXRhKGUuY29vcmQpfWZ1bmN0aW9uIG5DKHQsZSxpLG4pe3JldHVybiBuPDI/dC5jb29yZCYmdC5jb29yZFtuXTp0LnZhbHVlfWZ1bmN0aW9uIG9DKHQsZSxpKXtpZigiYXZlcmFnZSIhPT1pKXJldHVybiJtZWRpYW4iPT09aT90LmdldE1lZGlhbihlKTp0LmdldERhdGFFeHRlbnQoZSwhMClbIm1heCI9PT1pPzE6MF07dmFyIG49MCxvPTA7cmV0dXJuIHQuZWFjaChlLGZ1bmN0aW9uKHQsZSl7aXNOYU4odCl8fChuKz10LG8rKyl9KSxuL299dmFyIGFDPWJmKHt0eXBlOiJtYXJrZXIiLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLm1hcmtlckdyb3VwTWFwPVEoKX0scmVuZGVyOmZ1bmN0aW9uKHQsaSxuKXt2YXIgZT10aGlzLm1hcmtlckdyb3VwTWFwO2UuZWFjaChmdW5jdGlvbih0KXt0Ll9fa2VlcD0hMX0pO3ZhciBvPXRoaXMudHlwZSsiTW9kZWwiO2kuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt2YXIgZT10W29dO2UmJnRoaXMucmVuZGVyU2VyaWVzKHQsZSxpLG4pfSx0aGlzKSxlLmVhY2goZnVuY3Rpb24odCl7dC5fX2tlZXB8fHRoaXMuZ3JvdXAucmVtb3ZlKHQuZ3JvdXApfSx0aGlzKX0scmVuZGVyU2VyaWVzOmZ1bmN0aW9uKCl7fX0pO2Z1bmN0aW9uIHJDKHMsbCx1KXt2YXIgaD1sLmNvb3JkaW5hdGVTeXN0ZW07cy5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLGk9cy5nZXRJdGVtTW9kZWwodCksbj1QbChpLmdldCgieCIpLHUuZ2V0V2lkdGgoKSksbz1QbChpLmdldCgieSIpLHUuZ2V0SGVpZ2h0KCkpO2lmKGlzTmFOKG4pfHxpc05hTihvKSl7aWYobC5nZXRNYXJrZXJQb3NpdGlvbillPWwuZ2V0TWFya2VyUG9zaXRpb24ocy5nZXRWYWx1ZXMocy5kaW1lbnNpb25zLHQpKTtlbHNlIGlmKGgpe3ZhciBhPXMuZ2V0KGguZGltZW5zaW9uc1swXSx0KSxyPXMuZ2V0KGguZGltZW5zaW9uc1sxXSx0KTtlPWguZGF0YVRvUG9pbnQoW2Escl0pfX1lbHNlIGU9W24sb107aXNOYU4obil8fChlWzBdPW4pLGlzTmFOKG8pfHwoZVsxXT1vKSxzLnNldEl0ZW1MYXlvdXQodCxlKX0pfWFDLmV4dGVuZCh7dHlwZToibWFya1BvaW50Iix1cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLGkpe2UuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt2YXIgZT10Lm1hcmtQb2ludE1vZGVsO2UmJihyQyhlLmdldERhdGEoKSx0LGkpLHRoaXMubWFya2VyR3JvdXBNYXAuZ2V0KHQuaWQpLnVwZGF0ZUxheW91dChlKSl9LHRoaXMpfSxyZW5kZXJTZXJpZXM6ZnVuY3Rpb24odCxsLGUsaSl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtLG89dC5pZCx1PXQuZ2V0RGF0YSgpLGE9dGhpcy5tYXJrZXJHcm91cE1hcCxyPWEuZ2V0KG8pfHxhLnNldChvLG5ldyAkZyksaD1mdW5jdGlvbih0LGUsaSl7dmFyIG47bj10P04odCYmdC5kaW1lbnNpb25zLGZ1bmN0aW9uKHQpe3JldHVybiBDKHtuYW1lOnR9LGUuZ2V0RGF0YSgpLmdldERpbWVuc2lvbkluZm8oZS5nZXREYXRhKCkubWFwRGltZW5zaW9uKHQpKXx8e30pfSk6W3tuYW1lOiJ2YWx1ZSIsdHlwZToiZmxvYXQifV07dmFyIG89bmV3IFdmKG4saSksYT1OKGkuZ2V0KCJkYXRhIiksVCh0QyxlKSk7dCYmKGE9TShhLFQoaUMsdCkpKTtyZXR1cm4gby5pbml0RGF0YShhLG51bGwsdD9uQzpmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pLG99KG4sdCxsKTtsLnNldERhdGEoaCksckMobC5nZXREYXRhKCksdCxpKSxoLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9aC5nZXRJdGVtTW9kZWwodCksaT1lLmdldFNoYWxsb3coInN5bWJvbCIpLG49ZS5nZXRTaGFsbG93KCJzeW1ib2xTaXplIiksbz1PKGkpLGE9TyhuKTtpZihvfHxhKXt2YXIgcj1sLmdldFJhd1ZhbHVlKHQpLHM9bC5nZXREYXRhUGFyYW1zKHQpO28mJihpPWkocixzKSksYSYmKG49bihyLHMpKX1oLnNldEl0ZW1WaXN1YWwodCx7c3ltYm9sOmksc3ltYm9sU2l6ZTpuLGNvbG9yOmUuZ2V0KCJpdGVtU3R5bGUuY29sb3IiKXx8dS5nZXRWaXN1YWwoImNvbG9yIil9KX0pLHIudXBkYXRlRGF0YShoKSx0aGlzLmdyb3VwLmFkZChyLmdyb3VwKSxoLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQpe3QudHJhdmVyc2UoZnVuY3Rpb24odCl7dC5kYXRhTW9kZWw9bH0pfSksci5fX2tlZXA9ITAsci5ncm91cC5zaWxlbnQ9bC5nZXQoInNpbGVudCIpfHx0LmdldCgic2lsZW50Iil9fSksZmYoZnVuY3Rpb24odCl7dC5tYXJrUG9pbnQ9dC5tYXJrUG9pbnR8fHt9fSkscUQuZXh0ZW5kKHt0eXBlOiJtYXJrTGluZSIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo1LHN5bWJvbDpbImNpcmNsZSIsImFycm93Il0sc3ltYm9sU2l6ZTpbOCwxNl0scHJlY2lzaW9uOjIsdG9vbHRpcDp7dHJpZ2dlcjoiaXRlbSJ9LGxhYmVsOntzaG93OiEwLHBvc2l0aW9uOiJlbmQifSxsaW5lU3R5bGU6e3R5cGU6ImRhc2hlZCJ9LGVtcGhhc2lzOntsYWJlbDp7c2hvdzohMH0sbGluZVN0eWxlOnt3aWR0aDozfX0sYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIifX0pO2Z1bmN0aW9uIHNDKHQsZSxpLG4pe3ZhciBvPXQuZ2V0RGF0YSgpLGE9bi50eXBlO2lmKCFrKG4pJiYoIm1pbiI9PT1hfHwibWF4Ij09PWF8fCJhdmVyYWdlIj09PWF8fCJtZWRpYW4iPT09YXx8bnVsbCE9bi54QXhpc3x8bnVsbCE9bi55QXhpcykpe3ZhciByLHM7aWYobnVsbCE9bi55QXhpc3x8bnVsbCE9bi54QXhpcylyPWUuZ2V0QXhpcyhudWxsIT1uLnlBeGlzPyJ5IjoieCIpLHM9VyhuLnlBeGlzLG4ueEF4aXMpO2Vsc2V7dmFyIGw9ZUMobixvLGUsdCk7cj1sLnZhbHVlQXhpcyxzPW9DKG8sdXAobyxsLnZhbHVlRGF0YURpbSksYSl9dmFyIHU9IngiPT09ci5kaW0/MDoxLGg9MS11LGM9RChuKSxkPXt9O2MudHlwZT1udWxsLGMuY29vcmQ9W10sZC5jb29yZD1bXSxjLmNvb3JkW2hdPS0xLzAsZC5jb29yZFtoXT0xLzA7dmFyIGY9aS5nZXQoInByZWNpc2lvbiIpOzA8PWYmJiJudW1iZXIiPT10eXBlb2YgcyYmKHM9K3MudG9GaXhlZChNYXRoLm1pbihmLDIwKSkpLGMuY29vcmRbdV09ZC5jb29yZFt1XT1zLG49W2MsZCx7dHlwZTphLHZhbHVlSW5kZXg6bi52YWx1ZUluZGV4LHZhbHVlOnN9XX1yZXR1cm4obj1bdEModCxuWzBdKSx0Qyh0LG5bMV0pLEwoe30sblsyXSldKVsyXS50eXBlPW5bMl0udHlwZXx8IiIsbShuWzJdLG5bMF0pLG0oblsyXSxuWzFdKSxufWZ1bmN0aW9uIGxDKHQpe3JldHVybiFpc05hTih0KSYmIWlzRmluaXRlKHQpfWZ1bmN0aW9uIHVDKHQsZSxpLG4pe3ZhciBvPTEtdCxhPW4uZGltZW5zaW9uc1t0XTtyZXR1cm4gbEMoZVtvXSkmJmxDKGlbb10pJiZlW3RdPT09aVt0XSYmbi5nZXRBeGlzKGEpLmNvbnRhaW5EYXRhKGVbdF0pfWZ1bmN0aW9uIGhDKHQsZSl7aWYoImNhcnRlc2lhbjJkIj09PXQudHlwZSl7dmFyIGk9ZVswXS5jb29yZCxuPWVbMV0uY29vcmQ7aWYoaSYmbiYmKHVDKDEsaSxuLHQpfHx1QygwLGksbix0KSkpcmV0dXJuITB9cmV0dXJuIGlDKHQsZVswXSkmJmlDKHQsZVsxXSl9ZnVuY3Rpb24gY0ModCxlLGksbixvKXt2YXIgYSxyPW4uY29vcmRpbmF0ZVN5c3RlbSxzPXQuZ2V0SXRlbU1vZGVsKGUpLGw9UGwocy5nZXQoIngiKSxvLmdldFdpZHRoKCkpLHU9UGwocy5nZXQoInkiKSxvLmdldEhlaWdodCgpKTtpZihpc05hTihsKXx8aXNOYU4odSkpe2lmKG4uZ2V0TWFya2VyUG9zaXRpb24pYT1uLmdldE1hcmtlclBvc2l0aW9uKHQuZ2V0VmFsdWVzKHQuZGltZW5zaW9ucyxlKSk7ZWxzZXt2YXIgaD1yLmRpbWVuc2lvbnMsYz10LmdldChoWzBdLGUpLGQ9dC5nZXQoaFsxXSxlKTthPXIuZGF0YVRvUG9pbnQoW2MsZF0pfWlmKCJjYXJ0ZXNpYW4yZCI9PT1yLnR5cGUpe3ZhciBmPXIuZ2V0QXhpcygieCIpLHA9ci5nZXRBeGlzKCJ5Iik7aD1yLmRpbWVuc2lvbnM7bEModC5nZXQoaFswXSxlKSk/YVswXT1mLnRvR2xvYmFsQ29vcmQoZi5nZXRFeHRlbnQoKVtpPzA6MV0pOmxDKHQuZ2V0KGhbMV0sZSkpJiYoYVsxXT1wLnRvR2xvYmFsQ29vcmQocC5nZXRFeHRlbnQoKVtpPzA6MV0pKX1pc05hTihsKXx8KGFbMF09bCksaXNOYU4odSl8fChhWzFdPXUpfWVsc2UgYT1bbCx1XTt0LnNldEl0ZW1MYXlvdXQoZSxhKX1hQy5leHRlbmQoe3R5cGU6Im1hcmtMaW5lIix1cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLGEpe2UuZWFjaFNlcmllcyhmdW5jdGlvbihlKXt2YXIgdD1lLm1hcmtMaW5lTW9kZWw7aWYodCl7dmFyIGk9dC5nZXREYXRhKCksbj10Ll9fZnJvbSxvPXQuX190bztuLmVhY2goZnVuY3Rpb24odCl7Y0Mobix0LCEwLGUsYSksY0Mobyx0LCExLGUsYSl9KSxpLmVhY2goZnVuY3Rpb24odCl7aS5zZXRJdGVtTGF5b3V0KHQsW24uZ2V0SXRlbUxheW91dCh0KSxvLmdldEl0ZW1MYXlvdXQodCldKX0pLHRoaXMubWFya2VyR3JvdXBNYXAuZ2V0KGUuaWQpLnVwZGF0ZUxheW91dCgpfX0sdGhpcyl9LHJlbmRlclNlcmllczpmdW5jdGlvbihvLGksdCxhKXt2YXIgZT1vLmNvb3JkaW5hdGVTeXN0ZW0sbj1vLmlkLHI9by5nZXREYXRhKCkscz10aGlzLm1hcmtlckdyb3VwTWFwLGw9cy5nZXQobil8fHMuc2V0KG4sbmV3IG93KTt0aGlzLmdyb3VwLmFkZChsLmdyb3VwKTt2YXIgdT1mdW5jdGlvbih0LGUsaSl7dmFyIG47bj10P04odCYmdC5kaW1lbnNpb25zLGZ1bmN0aW9uKHQpe3JldHVybiBDKHtuYW1lOnR9LGUuZ2V0RGF0YSgpLmdldERpbWVuc2lvbkluZm8oZS5nZXREYXRhKCkubWFwRGltZW5zaW9uKHQpKXx8e30pfSk6W3tuYW1lOiJ2YWx1ZSIsdHlwZToiZmxvYXQifV07dmFyIG89bmV3IFdmKG4saSksYT1uZXcgV2YobixpKSxyPW5ldyBXZihbXSxpKSxzPU4oaS5nZXQoImRhdGEiKSxUKHNDLGUsdCxpKSk7dCYmKHM9TShzLFQoaEMsdCkpKTt2YXIgbD10P25DOmZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfTtyZXR1cm4gby5pbml0RGF0YShOKHMsZnVuY3Rpb24odCl7cmV0dXJuIHRbMF19KSxudWxsLGwpLGEuaW5pdERhdGEoTihzLGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSksbnVsbCxsKSxyLmluaXREYXRhKE4ocyxmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pKSxyLmhhc0l0ZW1PcHRpb249ITAse2Zyb206byx0bzphLGxpbmU6cn19KGUsbyxpKSxoPXUuZnJvbSxjPXUudG8sZD11LmxpbmU7aS5fX2Zyb209aCxpLl9fdG89YyxpLnNldERhdGEoZCk7dmFyIGY9aS5nZXQoInN5bWJvbCIpLHA9aS5nZXQoInN5bWJvbFNpemUiKTtmdW5jdGlvbiBnKHQsZSxpKXt2YXIgbj10LmdldEl0ZW1Nb2RlbChlKTtjQyh0LGUsaSxvLGEpLHQuc2V0SXRlbVZpc3VhbChlLHtzeW1ib2xTaXplOm4uZ2V0KCJzeW1ib2xTaXplIil8fHBbaT8wOjFdLHN5bWJvbDpuLmdldCgic3ltYm9sIiwhMCl8fGZbaT8wOjFdLGNvbG9yOm4uZ2V0KCJpdGVtU3R5bGUuY29sb3IiKXx8ci5nZXRWaXN1YWwoImNvbG9yIil9KX1rKGYpfHwoZj1bZixmXSksIm51bWJlciI9PXR5cGVvZiBwJiYocD1bcCxwXSksdS5mcm9tLmVhY2goZnVuY3Rpb24odCl7ZyhoLHQsITApLGcoYyx0LCExKX0pLGQuZWFjaChmdW5jdGlvbih0KXt2YXIgZT1kLmdldEl0ZW1Nb2RlbCh0KS5nZXQoImxpbmVTdHlsZS5jb2xvciIpO2Quc2V0SXRlbVZpc3VhbCh0LHtjb2xvcjplfHxoLmdldEl0ZW1WaXN1YWwodCwiY29sb3IiKX0pLGQuc2V0SXRlbUxheW91dCh0LFtoLmdldEl0ZW1MYXlvdXQodCksYy5nZXRJdGVtTGF5b3V0KHQpXSksZC5zZXRJdGVtVmlzdWFsKHQse2Zyb21TeW1ib2xTaXplOmguZ2V0SXRlbVZpc3VhbCh0LCJzeW1ib2xTaXplIiksZnJvbVN5bWJvbDpoLmdldEl0ZW1WaXN1YWwodCwic3ltYm9sIiksdG9TeW1ib2xTaXplOmMuZ2V0SXRlbVZpc3VhbCh0LCJzeW1ib2xTaXplIiksdG9TeW1ib2w6Yy5nZXRJdGVtVmlzdWFsKHQsInN5bWJvbCIpfSl9KSxsLnVwZGF0ZURhdGEoZCksdS5saW5lLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsZSl7dC50cmF2ZXJzZShmdW5jdGlvbih0KXt0LmRhdGFNb2RlbD1pfSl9KSxsLl9fa2VlcD0hMCxsLmdyb3VwLnNpbGVudD1pLmdldCgic2lsZW50Iil8fG8uZ2V0KCJzaWxlbnQiKX19KSxmZihmdW5jdGlvbih0KXt0Lm1hcmtMaW5lPXQubWFya0xpbmV8fHt9fSkscUQuZXh0ZW5kKHt0eXBlOiJtYXJrQXJlYSIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoxLHRvb2x0aXA6e3RyaWdnZXI6Iml0ZW0ifSxhbmltYXRpb246ITEsbGFiZWw6e3Nob3c6ITAscG9zaXRpb246InRvcCJ9LGl0ZW1TdHlsZTp7Ym9yZGVyV2lkdGg6MH0sZW1waGFzaXM6e2xhYmVsOntzaG93OiEwLHBvc2l0aW9uOiJ0b3AifX19fSk7ZnVuY3Rpb24gZEModCxlLGksbil7dmFyIG89dEModCxuWzBdKSxhPXRDKHQsblsxXSkscj1XLHM9by5jb29yZCxsPWEuY29vcmQ7c1swXT1yKHNbMF0sLTEvMCksc1sxXT1yKHNbMV0sLTEvMCksbFswXT1yKGxbMF0sMS8wKSxsWzFdPXIobFsxXSwxLzApO3ZhciB1PXAoW3t9LG8sYV0pO3JldHVybiB1LmNvb3JkPVtvLmNvb3JkLGEuY29vcmRdLHUueDA9by54LHUueTA9by55LHUueDE9YS54LHUueTE9YS55LHV9ZnVuY3Rpb24gZkModCl7cmV0dXJuIWlzTmFOKHQpJiYhaXNGaW5pdGUodCl9ZnVuY3Rpb24gcEModCxlLGkpe3ZhciBuPTEtdDtyZXR1cm4gZkMoZVtuXSkmJmZDKGlbbl0pfWZ1bmN0aW9uIGdDKHQsZSl7dmFyIGk9ZS5jb29yZFswXSxuPWUuY29vcmRbMV07cmV0dXJuISgiY2FydGVzaWFuMmQiIT09dC50eXBlfHwhaXx8IW58fCFwQygxLGksbikmJiFwQygwLGksbikpfHwoaUModCx7Y29vcmQ6aSx4OmUueDAseTplLnkwfSl8fGlDKHQse2Nvb3JkOm4seDplLngxLHk6ZS55MX0pKX1mdW5jdGlvbiBtQyh0LGUsaSxuLG8pe3ZhciBhLHI9bi5jb29yZGluYXRlU3lzdGVtLHM9dC5nZXRJdGVtTW9kZWwoZSksbD1QbChzLmdldChpWzBdKSxvLmdldFdpZHRoKCkpLHU9UGwocy5nZXQoaVsxXSksby5nZXRIZWlnaHQoKSk7aWYoaXNOYU4obCl8fGlzTmFOKHUpKXtpZihuLmdldE1hcmtlclBvc2l0aW9uKWE9bi5nZXRNYXJrZXJQb3NpdGlvbih0LmdldFZhbHVlcyhpLGUpKTtlbHNle3ZhciBoPVtmPXQuZ2V0KGlbMF0sZSkscD10LmdldChpWzFdLGUpXTtyLmNsYW1wRGF0YSYmci5jbGFtcERhdGEoaCxoKSxhPXIuZGF0YVRvUG9pbnQoaCwhMCl9aWYoImNhcnRlc2lhbjJkIj09PXIudHlwZSl7dmFyIGM9ci5nZXRBeGlzKCJ4IiksZD1yLmdldEF4aXMoInkiKSxmPXQuZ2V0KGlbMF0sZSkscD10LmdldChpWzFdLGUpO2ZDKGYpP2FbMF09Yy50b0dsb2JhbENvb3JkKGMuZ2V0RXh0ZW50KClbIngwIj09PWlbMF0/MDoxXSk6ZkMocCkmJihhWzFdPWQudG9HbG9iYWxDb29yZChkLmdldEV4dGVudCgpWyJ5MCI9PT1pWzFdPzA6MV0pKX1pc05hTihsKXx8KGFbMF09bCksaXNOYU4odSl8fChhWzFdPXUpfWVsc2UgYT1bbCx1XTtyZXR1cm4gYX12YXIgdkM9W1sieDAiLCJ5MCJdLFsieDEiLCJ5MCJdLFsieDEiLCJ5MSJdLFsieDAiLCJ5MSJdXTthQy5leHRlbmQoe3R5cGU6Im1hcmtBcmVhIix1cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLG8pe2UuZWFjaFNlcmllcyhmdW5jdGlvbihpKXt2YXIgdD1pLm1hcmtBcmVhTW9kZWw7aWYodCl7dmFyIG49dC5nZXREYXRhKCk7bi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PU4odkMsZnVuY3Rpb24odCl7cmV0dXJuIG1DKG4sZSx0LGksbyl9KTtuLnNldEl0ZW1MYXlvdXQoZSx0KSxuLmdldEl0ZW1HcmFwaGljRWwoZSkuc2V0U2hhcGUoInBvaW50cyIsdCl9KX19LHRoaXMpfSxyZW5kZXJTZXJpZXM6ZnVuY3Rpb24oaSxyLHQsbil7dmFyIGU9aS5jb29yZGluYXRlU3lzdGVtLG89aS5pZCxhPWkuZ2V0RGF0YSgpLHM9dGhpcy5tYXJrZXJHcm91cE1hcCxsPXMuZ2V0KG8pfHxzLnNldChvLHtncm91cDpuZXcgSWl9KTt0aGlzLmdyb3VwLmFkZChsLmdyb3VwKSxsLl9fa2VlcD0hMDt2YXIgdT1mdW5jdGlvbih0LGksZSl7dmFyIG4sbztvPXQ/KG49Tih0JiZ0LmRpbWVuc2lvbnMsZnVuY3Rpb24odCl7dmFyIGU9aS5nZXREYXRhKCk7cmV0dXJuIEMoe25hbWU6dH0sZS5nZXREaW1lbnNpb25JbmZvKGUubWFwRGltZW5zaW9uKHQpKXx8e30pfSksbmV3IFdmKE4oWyJ4MCIsInkwIiwieDEiLCJ5MSJdLGZ1bmN0aW9uKHQsZSl7cmV0dXJue25hbWU6dCx0eXBlOm5bZSUyXS50eXBlfX0pLGUpKTpuZXcgV2Yobj1be25hbWU6InZhbHVlIix0eXBlOiJmbG9hdCJ9XSxlKTt2YXIgYT1OKGUuZ2V0KCJkYXRhIiksVChkQyxpLHQsZSkpO3QmJihhPU0oYSxUKGdDLHQpKSk7dmFyIHI9dD9mdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gdC5jb29yZFtNYXRoLmZsb29yKG4vMildW24lMl19OmZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfTtyZXR1cm4gby5pbml0RGF0YShhLG51bGwsciksby5oYXNJdGVtT3B0aW9uPSEwLG99KGUsaSxyKTtyLnNldERhdGEodSksdS5lYWNoKGZ1bmN0aW9uKGUpe3Uuc2V0SXRlbUxheW91dChlLE4odkMsZnVuY3Rpb24odCl7cmV0dXJuIG1DKHUsZSx0LGksbil9KSksdS5zZXRJdGVtVmlzdWFsKGUse2NvbG9yOmEuZ2V0VmlzdWFsKCJjb2xvciIpfSl9KSx1LmRpZmYobC5fX2RhdGEpLmFkZChmdW5jdGlvbih0KXt2YXIgZT1uZXcgcXIoe3NoYXBlOntwb2ludHM6dS5nZXRJdGVtTGF5b3V0KHQpfX0pO3Uuc2V0SXRlbUdyYXBoaWNFbCh0LGUpLGwuZ3JvdXAuYWRkKGUpfSkudXBkYXRlKGZ1bmN0aW9uKHQsZSl7dmFyIGk9bC5fX2RhdGEuZ2V0SXRlbUdyYXBoaWNFbChlKTtzbChpLHtzaGFwZTp7cG9pbnRzOnUuZ2V0SXRlbUxheW91dCh0KX19LHIsdCksbC5ncm91cC5hZGQoaSksdS5zZXRJdGVtR3JhcGhpY0VsKHQsaSl9KS5yZW1vdmUoZnVuY3Rpb24odCl7dmFyIGU9bC5fX2RhdGEuZ2V0SXRlbUdyYXBoaWNFbCh0KTtsLmdyb3VwLnJlbW92ZShlKX0pLmV4ZWN1dGUoKSx1LmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsZSl7dmFyIGk9dS5nZXRJdGVtTW9kZWwoZSksbj1pLmdldE1vZGVsKCJsYWJlbCIpLG89aS5nZXRNb2RlbCgiZW1waGFzaXMubGFiZWwiKSxhPXUuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpO3QudXNlU3R5bGUoQyhpLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSx7ZmlsbDpYZShhLC40KSxzdHJva2U6YX0pKSx0LmhvdmVyU3R5bGU9aS5nZXRNb2RlbCgiZW1waGFzaXMuaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksJHModC5zdHlsZSx0LmhvdmVyU3R5bGUsbixvLHtsYWJlbEZldGNoZXI6cixsYWJlbERhdGFJbmRleDplLGRlZmF1bHRUZXh0OnUuZ2V0TmFtZShlKXx8IiIsaXNSZWN0VGV4dDohMCxhdXRvQ29sb3I6YX0pLFlzKHQse30pLHQuZGF0YU1vZGVsPXJ9KSxsLl9fZGF0YT11LGwuZ3JvdXAuc2lsZW50PXIuZ2V0KCJzaWxlbnQiKXx8aS5nZXQoInNpbGVudCIpfX0pLGZmKGZ1bmN0aW9uKHQpe3QubWFya0FyZWE9dC5tYXJrQXJlYXx8e319KTt2YXIgeUM9Q2MubGVnZW5kLnNlbGVjdG9yLHhDPXthbGw6e3R5cGU6ImFsbCIsdGl0bGU6RCh5Qy5hbGwpfSxpbnZlcnNlOnt0eXBlOiJpbnZlcnNlIix0aXRsZTpEKHlDLmludmVyc2UpfX0sX0M9d2Yoe3R5cGU6ImxlZ2VuZC5wbGFpbiIsZGVwZW5kZW5jaWVzOlsic2VyaWVzIl0sbGF5b3V0TW9kZTp7dHlwZToiYm94IixpZ25vcmVTaXplOiEwfSxpbml0OmZ1bmN0aW9uKHQsZSxpKXt0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsaSksdC5zZWxlY3RlZD10LnNlbGVjdGVkfHx7fSx0aGlzLl91cGRhdGVTZWxlY3Rvcih0KX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7X0Muc3VwZXJDYWxsKHRoaXMsIm1lcmdlT3B0aW9uIix0KSx0aGlzLl91cGRhdGVTZWxlY3Rvcih0KX0sX3VwZGF0ZVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3ZhciBpPXQuc2VsZWN0b3I7ITA9PT1pJiYoaT10LnNlbGVjdG9yPVsiYWxsIiwiaW52ZXJzZSJdKSxrKGkpJiZFKGksZnVuY3Rpb24odCxlKXt6KHQpJiYodD17dHlwZTp0fSksaVtlXT1tKHQseENbdC50eXBlXSl9KX0sb3B0aW9uVXBkYXRlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZURhdGEodGhpcy5lY01vZGVsKTt2YXIgdD10aGlzLl9kYXRhO2lmKHRbMF0mJiJzaW5nbGUiPT09dGhpcy5nZXQoInNlbGVjdGVkTW9kZSIpKXtmb3IodmFyIGU9ITEsaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbj10W2ldLmdldCgibmFtZSIpO2lmKHRoaXMuaXNTZWxlY3RlZChuKSl7dGhpcy5zZWxlY3QobiksZT0hMDticmVha319ZXx8dGhpcy5zZWxlY3QodFswXS5nZXQoIm5hbWUiKSl9fSxfdXBkYXRlRGF0YTpmdW5jdGlvbihvKXt2YXIgYT1bXSxyPVtdO28uZWFjaFJhd1NlcmllcyhmdW5jdGlvbih0KXt2YXIgZSxpPXQubmFtZTtpZihyLnB1c2goaSksdC5sZWdlbmRWaXN1YWxQcm92aWRlcil7dmFyIG49dC5sZWdlbmRWaXN1YWxQcm92aWRlci5nZXRBbGxOYW1lcygpO28uaXNTZXJpZXNGaWx0ZXJlZCh0KXx8KHI9ci5jb25jYXQobikpLG4ubGVuZ3RoP2E9YS5jb25jYXQobik6ZT0hMH1lbHNlIGU9ITA7ZSYmRm8odCkmJmEucHVzaCh0Lm5hbWUpfSksdGhpcy5fYXZhaWxhYmxlTmFtZXM9cjt2YXIgdD1OKHRoaXMuZ2V0KCJkYXRhIil8fGEsZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYibnVtYmVyIiE9dHlwZW9mIHR8fCh0PXtuYW1lOnR9KSxuZXcgSWwodCx0aGlzLHRoaXMuZWNNb2RlbCl9LHRoaXMpO3RoaXMuX2RhdGE9dH0sZ2V0RGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxzZWxlY3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24uc2VsZWN0ZWQ7InNpbmdsZSI9PT10aGlzLmdldCgic2VsZWN0ZWRNb2RlIikmJkUodGhpcy5fZGF0YSxmdW5jdGlvbih0KXtlW3QuZ2V0KCJuYW1lIildPSExfSk7ZVt0XT0hMH0sdW5TZWxlY3Q6ZnVuY3Rpb24odCl7InNpbmdsZSIhPT10aGlzLmdldCgic2VsZWN0ZWRNb2RlIikmJih0aGlzLm9wdGlvbi5zZWxlY3RlZFt0XT0hMSl9LHRvZ2dsZVNlbGVjdGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnNlbGVjdGVkO2UuaGFzT3duUHJvcGVydHkodCl8fChlW3RdPSEwKSx0aGlzW2VbdF0/InVuU2VsZWN0Ijoic2VsZWN0Il0odCl9LGFsbFNlbGVjdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10aGlzLm9wdGlvbi5zZWxlY3RlZDtFKHQsZnVuY3Rpb24odCl7ZVt0LmdldCgibmFtZSIsITApXT0hMH0pfSxpbnZlcnNlU2VsZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZGF0YSxpPXRoaXMub3B0aW9uLnNlbGVjdGVkO0UodCxmdW5jdGlvbih0KXt2YXIgZT10LmdldCgibmFtZSIsITApO2kuaGFzT3duUHJvcGVydHkoZSl8fChpW2VdPSEwKSxpW2VdPSFpW2VdfSl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24uc2VsZWN0ZWQ7cmV0dXJuIShlLmhhc093blByb3BlcnR5KHQpJiYhZVt0XSkmJjA8PV8odGhpcy5fYXZhaWxhYmxlTmFtZXMsdCl9LGdldE9yaWVudDpmdW5jdGlvbigpe3JldHVybiJ2ZXJ0aWNhbCI9PT10aGlzLmdldCgib3JpZW50Iik/e2luZGV4OjEsbmFtZToidmVydGljYWwifTp7aW5kZXg6MCxuYW1lOiJob3Jpem9udGFsIn19LGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6NCxzaG93OiEwLG9yaWVudDoiaG9yaXpvbnRhbCIsbGVmdDoiY2VudGVyIix0b3A6MCxhbGlnbjoiYXV0byIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJDb2xvcjoiI2NjYyIsYm9yZGVyUmFkaXVzOjAsYm9yZGVyV2lkdGg6MCxwYWRkaW5nOjUsaXRlbUdhcDoxMCxpdGVtV2lkdGg6MjUsaXRlbUhlaWdodDoxNCxpbmFjdGl2ZUNvbG9yOiIjY2NjIixpbmFjdGl2ZUJvcmRlckNvbG9yOiIjY2NjIixpdGVtU3R5bGU6e2JvcmRlcldpZHRoOjB9LHRleHRTdHlsZTp7Y29sb3I6IiMzMzMifSxzZWxlY3RlZE1vZGU6ITAsc2VsZWN0b3I6ITEsc2VsZWN0b3JMYWJlbDp7c2hvdzohMCxib3JkZXJSYWRpdXM6MTAscGFkZGluZzpbMyw1LDMsNV0sZm9udFNpemU6MTIsZm9udEZhbWlseToiIHNhbnMtc2VyaWYiLGNvbG9yOiIjNjY2Iixib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiIjNjY2In0sZW1waGFzaXM6e3NlbGVjdG9yTGFiZWw6e3Nob3c6ITAsY29sb3I6IiNlZWUiLGJhY2tncm91bmRDb2xvcjoiIzY2NiJ9fSxzZWxlY3RvclBvc2l0aW9uOiJhdXRvIixzZWxlY3Rvckl0ZW1HYXA6NyxzZWxlY3RvckJ1dHRvbkdhcDoxMCx0b29sdGlwOntzaG93OiExfX19KTtmdW5jdGlvbiB3Qyh0LGUsaSl7dmFyIG8sYT17fSxyPSJ0b2dnbGVTZWxlY3RlZCI9PT10O3JldHVybiBpLmVhY2hDb21wb25lbnQoImxlZ2VuZCIsZnVuY3Rpb24obil7ciYmbnVsbCE9bz9uW28/InNlbGVjdCI6InVuU2VsZWN0Il0oZS5uYW1lKToiYWxsU2VsZWN0Ij09PXR8fCJpbnZlcnNlU2VsZWN0Ij09PXQ/blt0XSgpOihuW3RdKGUubmFtZSksbz1uLmlzU2VsZWN0ZWQoZS5uYW1lKSksRShuLmdldERhdGEoKSxmdW5jdGlvbih0KXt2YXIgZT10LmdldCgibmFtZSIpO2lmKCJcbiIhPT1lJiYiIiE9PWUpe3ZhciBpPW4uaXNTZWxlY3RlZChlKTthLmhhc093blByb3BlcnR5KGUpP2FbZV09YVtlXSYmaTphW2VdPWl9fSl9KSwiYWxsU2VsZWN0Ij09PXR8fCJpbnZlcnNlU2VsZWN0Ij09PXQ/e3NlbGVjdGVkOmF9OntuYW1lOmUubmFtZSxzZWxlY3RlZDphfX1nZigibGVnZW5kVG9nZ2xlU2VsZWN0IiwibGVnZW5kc2VsZWN0Y2hhbmdlZCIsVCh3QywidG9nZ2xlU2VsZWN0ZWQiKSksZ2YoImxlZ2VuZEFsbFNlbGVjdCIsImxlZ2VuZHNlbGVjdGFsbCIsVCh3QywiYWxsU2VsZWN0IikpLGdmKCJsZWdlbmRJbnZlcnNlU2VsZWN0IiwibGVnZW5kaW52ZXJzZXNlbGVjdCIsVCh3QywiaW52ZXJzZVNlbGVjdCIpKSxnZigibGVnZW5kU2VsZWN0IiwibGVnZW5kc2VsZWN0ZWQiLFQod0MsInNlbGVjdCIpKSxnZigibGVnZW5kVW5TZWxlY3QiLCJsZWdlbmR1bnNlbGVjdGVkIixUKHdDLCJ1blNlbGVjdCIpKTt2YXIgYkM9VCxTQz1FLE1DPUlpLElDPWJmKHt0eXBlOiJsZWdlbmQucGxhaW4iLG5ld2xpbmVEaXNhYmxlZDohMSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5ncm91cC5hZGQodGhpcy5fY29udGVudEdyb3VwPW5ldyBNQyksdGhpcy5fYmFja2dyb3VuZEVsLHRoaXMuZ3JvdXAuYWRkKHRoaXMuX3NlbGVjdG9yR3JvdXA9bmV3IE1DKSx0aGlzLl9pc0ZpcnN0UmVuZGVyPSEwfSxnZXRDb250ZW50R3JvdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudEdyb3VwfSxnZXRTZWxlY3Rvckdyb3VwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yR3JvdXB9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5faXNGaXJzdFJlbmRlcjtpZih0aGlzLl9pc0ZpcnN0UmVuZGVyPSExLHRoaXMucmVzZXRJbm5lcigpLHQuZ2V0KCJzaG93IiwhMCkpe3ZhciBvPXQuZ2V0KCJhbGlnbiIpLGE9dC5nZXQoIm9yaWVudCIpO28mJiJhdXRvIiE9PW98fChvPSJyaWdodCI9PT10LmdldCgibGVmdCIpJiYidmVydGljYWwiPT09YT8icmlnaHQiOiJsZWZ0Iik7dmFyIHI9dC5nZXQoInNlbGVjdG9yIiwhMCkscz10LmdldCgic2VsZWN0b3JQb3NpdGlvbiIsITApOyFyfHxzJiYiYXV0byIhPT1zfHwocz0iaG9yaXpvbnRhbCI9PT1hPyJlbmQiOiJzdGFydCIpLHRoaXMucmVuZGVySW5uZXIobyx0LGUsaSxyLGEscyk7dmFyIGw9dC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx1PXt3aWR0aDppLmdldFdpZHRoKCksaGVpZ2h0OmkuZ2V0SGVpZ2h0KCl9LGg9dC5nZXQoInBhZGRpbmciKSxjPXZ1KGwsdSxoKSxkPXRoaXMubGF5b3V0SW5uZXIodCxvLGMsbixyLHMpLGY9dnUoQyh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9LGwpLHUsaCk7dGhpcy5ncm91cC5hdHRyKCJwb3NpdGlvbiIsW2YueC1kLngsZi55LWQueV0pLHRoaXMuZ3JvdXAuYWRkKHRoaXMuX2JhY2tncm91bmRFbD1YVChkLHQpKX19LHJlc2V0SW5uZXI6ZnVuY3Rpb24oKXt0aGlzLmdldENvbnRlbnRHcm91cCgpLnJlbW92ZUFsbCgpLHRoaXMuX2JhY2tncm91bmRFbCYmdGhpcy5ncm91cC5yZW1vdmUodGhpcy5fYmFja2dyb3VuZEVsKSx0aGlzLmdldFNlbGVjdG9yR3JvdXAoKS5yZW1vdmVBbGwoKX0scmVuZGVySW5uZXI6ZnVuY3Rpb24odSxoLGMsZCx0LGUsaSl7dmFyIGY9dGhpcy5nZXRDb250ZW50R3JvdXAoKSxwPVEoKSxnPWguZ2V0KCJzZWxlY3RlZE1vZGUiKSxtPVtdO2MuZWFjaFJhd1NlcmllcyhmdW5jdGlvbih0KXt0LmdldCgibGVnZW5kSG92ZXJMaW5rIil8fG0ucHVzaCh0LmlkKX0pLFNDKGguZ2V0RGF0YSgpLGZ1bmN0aW9uKGEscil7dmFyIHM9YS5nZXQoIm5hbWUiKTtpZih0aGlzLm5ld2xpbmVEaXNhYmxlZHx8IiIhPT1zJiYiXG4iIT09cyl7dmFyIHQ9Yy5nZXRTZXJpZXNCeU5hbWUocylbMF07aWYoIXAuZ2V0KHMpKWlmKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLGk9ZS5nZXRWaXN1YWwoImNvbG9yIiksbj1lLmdldFZpc3VhbCgiYm9yZGVyQ29sb3IiKTsiZnVuY3Rpb24iPT10eXBlb2YgaSYmKGk9aSh0LmdldERhdGFQYXJhbXMoMCkpKSwiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49bih0LmdldERhdGFQYXJhbXMoMCkpKTt2YXIgbz1lLmdldFZpc3VhbCgibGVnZW5kU3ltYm9sIil8fCJyb3VuZFJlY3QiLGw9ZS5nZXRWaXN1YWwoInN5bWJvbCIpO3RoaXMuX2NyZWF0ZUl0ZW0ocyxyLGEsaCxvLGwsdSxpLG4sZykub24oImNsaWNrIixiQyhBQyxzLG51bGwsZCxtKSkub24oIm1vdXNlb3ZlciIsYkMoREMsdC5uYW1lLG51bGwsZCxtKSkub24oIm1vdXNlb3V0IixiQyhDQyx0Lm5hbWUsbnVsbCxkLG0pKSxwLnNldChzLCEwKX1lbHNlIGMuZWFjaFJhd1NlcmllcyhmdW5jdGlvbih0KXtpZighcC5nZXQocykmJnQubGVnZW5kVmlzdWFsUHJvdmlkZXIpe3ZhciBlPXQubGVnZW5kVmlzdWFsUHJvdmlkZXI7aWYoIWUuY29udGFpbk5hbWUocykpcmV0dXJuO3ZhciBpPWUuaW5kZXhPZk5hbWUocyksbj1lLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKSxvPWUuZ2V0SXRlbVZpc3VhbChpLCJib3JkZXJDb2xvciIpO3RoaXMuX2NyZWF0ZUl0ZW0ocyxyLGEsaCwicm91bmRSZWN0IixudWxsLHUsbixvLGcpLm9uKCJjbGljayIsYkMoQUMsbnVsbCxzLGQsbSkpLm9uKCJtb3VzZW92ZXIiLGJDKERDLG51bGwscyxkLG0pKS5vbigibW91c2VvdXQiLGJDKENDLG51bGwscyxkLG0pKSxwLnNldChzLCEwKX19LHRoaXMpfWVsc2UgZi5hZGQobmV3IE1DKHtuZXdsaW5lOiEwfSkpfSx0aGlzKSx0JiZ0aGlzLl9jcmVhdGVTZWxlY3Rvcih0LGgsZCxlLGkpfSxfY3JlYXRlU2VsZWN0b3I6ZnVuY3Rpb24odCxhLHIsZSxpKXt2YXIgcz10aGlzLmdldFNlbGVjdG9yR3JvdXAoKTtTQyh0LGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXt2YXIgZT10LnR5cGUsaT1uZXcgRnIoe3N0eWxlOnt4OjAseTowLGFsaWduOiJjZW50ZXIiLHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LG9uY2xpY2s6ZnVuY3Rpb24oKXtyLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJhbGwiPT09ZT8ibGVnZW5kQWxsU2VsZWN0IjoibGVnZW5kSW52ZXJzZVNlbGVjdCJ9KX19KTtzLmFkZChpKTt2YXIgbj1hLmdldE1vZGVsKCJzZWxlY3RvckxhYmVsIiksbz1hLmdldE1vZGVsKCJlbXBoYXNpcy5zZWxlY3RvckxhYmVsIik7JHMoaS5zdHlsZSxpLmhvdmVyU3R5bGU9e30sbixvLHtkZWZhdWx0VGV4dDp0LnRpdGxlLGlzUmVjdFRleHQ6ITF9KSxZcyhpKX0odCl9KX0sX2NyZWF0ZUl0ZW06ZnVuY3Rpb24odCxlLGksbixvLGEscixzLGwsdSl7dmFyIGg9bi5nZXQoIml0ZW1XaWR0aCIpLGM9bi5nZXQoIml0ZW1IZWlnaHQiKSxkPW4uZ2V0KCJpbmFjdGl2ZUNvbG9yIiksZj1uLmdldCgiaW5hY3RpdmVCb3JkZXJDb2xvciIpLHA9bi5nZXQoInN5bWJvbEtlZXBBc3BlY3QiKSxnPW4uZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLG09bi5pc1NlbGVjdGVkKHQpLHY9bmV3IE1DLHk9aS5nZXRNb2RlbCgidGV4dFN0eWxlIikseD1pLmdldCgiaWNvbiIpLF89aS5nZXRNb2RlbCgidG9vbHRpcCIpLHc9Xy5wYXJlbnRNb2RlbCxiPW1nKG89eHx8bywwLDAsaCxjLG0/czpkLG51bGw9PXB8fHApO2lmKHYuYWRkKFRDKGIsbyxnLGwsZixtKSksIXgmJmEmJihhIT09b3x8Im5vbmUiPT09YSkpe3ZhciBTPS44KmM7Im5vbmUiPT09YSYmKGE9ImNpcmNsZSIpO3ZhciBNPW1nKGEsKGgtUykvMiwoYy1TKS8yLFMsUyxtP3M6ZCxudWxsPT1wfHxwKTt2LmFkZChUQyhNLGEsZyxsLGYsbSkpfXZhciBJPSJsZWZ0Ij09PXI/aCs1Oi01LFQ9cixBPW4uZ2V0KCJmb3JtYXR0ZXIiKSxEPXQ7InN0cmluZyI9PXR5cGVvZiBBJiZBP0Q9QS5yZXBsYWNlKCJ7bmFtZX0iLG51bGwhPXQ/dDoiIik6ImZ1bmN0aW9uIj09dHlwZW9mIEEmJihEPUEodCkpLHYuYWRkKG5ldyBGcih7c3R5bGU6UXMoe30seSx7dGV4dDpELHg6SSx5OmMvMix0ZXh0RmlsbDptP3kuZ2V0VGV4dENvbG9yKCk6ZCx0ZXh0QWxpZ246VCx0ZXh0VmVydGljYWxBbGlnbjoibWlkZGxlIn0pfSkpO3ZhciBDPW5ldyBpcyh7c2hhcGU6di5nZXRCb3VuZGluZ1JlY3QoKSxpbnZpc2libGU6ITAsdG9vbHRpcDpfLmdldCgic2hvdyIpP0woe2NvbnRlbnQ6dCxmb3JtYXR0ZXI6dy5nZXQoImZvcm1hdHRlciIsITApfHxmdW5jdGlvbigpe3JldHVybiB0fSxmb3JtYXR0ZXJQYXJhbXM6e2NvbXBvbmVudFR5cGU6ImxlZ2VuZCIsbGVnZW5kSW5kZXg6bi5jb21wb25lbnRJbmRleCxuYW1lOnQsJHZhcnM6WyJuYW1lIl19fSxfLm9wdGlvbik6bnVsbH0pO3JldHVybiB2LmFkZChDKSx2LmVhY2hDaGlsZChmdW5jdGlvbih0KXt0LnNpbGVudD0hMH0pLEMuc2lsZW50PSF1LHRoaXMuZ2V0Q29udGVudEdyb3VwKCkuYWRkKHYpLFlzKHYpLHYuX19sZWdlbmREYXRhSW5kZXg9ZSx2fSxsYXlvdXRJbm5lcjpmdW5jdGlvbih0LGUsaSxuLG8sYSl7dmFyIHI9dGhpcy5nZXRDb250ZW50R3JvdXAoKSxzPXRoaXMuZ2V0U2VsZWN0b3JHcm91cCgpO211KHQuZ2V0KCJvcmllbnQiKSxyLHQuZ2V0KCJpdGVtR2FwIiksaS53aWR0aCxpLmhlaWdodCk7dmFyIGw9ci5nZXRCb3VuZGluZ1JlY3QoKSx1PVstbC54LC1sLnldO2lmKG8pe211KCJob3Jpem9udGFsIixzLHQuZ2V0KCJzZWxlY3Rvckl0ZW1HYXAiLCEwKSk7dmFyIGg9cy5nZXRCb3VuZGluZ1JlY3QoKSxjPVstaC54LC1oLnldLGQ9dC5nZXQoInNlbGVjdG9yQnV0dG9uR2FwIiwhMCksZj10LmdldE9yaWVudCgpLmluZGV4LHA9MD09PWY/IndpZHRoIjoiaGVpZ2h0IixnPTA9PT1mPyJoZWlnaHQiOiJ3aWR0aCIsbT0wPT09Zj8ieSI6IngiOyJlbmQiPT09YT9jW2ZdKz1sW3BdK2Q6dVtmXSs9aFtwXStkLGNbMS1mXSs9bFtnXS8yLWhbZ10vMixzLmF0dHIoInBvc2l0aW9uIixjKSxyLmF0dHIoInBvc2l0aW9uIix1KTt2YXIgdj17eDowLHk6MH07cmV0dXJuIHZbcF09bFtwXStkK2hbcF0sdltnXT1NYXRoLm1heChsW2ddLGhbZ10pLHZbbV09TWF0aC5taW4oMCxoW21dK2NbMS1mXSksdn1yZXR1cm4gci5hdHRyKCJwb3NpdGlvbiIsdSksdGhpcy5ncm91cC5nZXRCb3VuZGluZ1JlY3QoKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5nZXRDb250ZW50R3JvdXAoKS5yZW1vdmVBbGwoKSx0aGlzLl9pc0ZpcnN0UmVuZGVyPSEwfX0pO2Z1bmN0aW9uIFRDKHQsZSxpLG4sbyxhKXt2YXIgcjtyZXR1cm4ibGluZSIhPT1lJiZlLmluZGV4T2YoImVtcHR5Iik8MD8ocj1pLmdldEl0ZW1TdHlsZSgpLHQuc3R5bGUuc3Ryb2tlPW4sYXx8KHIuc3Ryb2tlPW8pKTpyPWkuZ2V0SXRlbVN0eWxlKFsiYm9yZGVyV2lkdGgiLCJib3JkZXJDb2xvciJdKSx0LnNldFN0eWxlKHIpfWZ1bmN0aW9uIEFDKHQsZSxpLG4pe0NDKHQsZSxpLG4pLGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImxlZ2VuZFRvZ2dsZVNlbGVjdCIsbmFtZTpudWxsIT10P3Q6ZX0pLERDKHQsZSxpLG4pfWZ1bmN0aW9uIERDKHQsZSxpLG4pe3ZhciBvPWkuZ2V0WnIoKS5zdG9yYWdlLmdldERpc3BsYXlMaXN0KClbMF07byYmby51c2VIb3ZlckxheWVyfHxpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJoaWdobGlnaHQiLHNlcmllc05hbWU6dCxuYW1lOmUsZXhjbHVkZVNlcmllc0lkOm59KX1mdW5jdGlvbiBDQyh0LGUsaSxuKXt2YXIgbz1pLmdldFpyKCkuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCgpWzBdO28mJm8udXNlSG92ZXJMYXllcnx8aS5kaXNwYXRjaEFjdGlvbih7dHlwZToiZG93bnBsYXkiLHNlcmllc05hbWU6dCxuYW1lOmUsZXhjbHVkZVNlcmllc0lkOm59KX1wZihJZC5QUk9DRVNTT1IuU0VSSUVTX0ZJTFRFUixmdW5jdGlvbih0KXt2YXIgaT10LmZpbmRDb21wb25lbnRzKHttYWluVHlwZToibGVnZW5kIn0pO2kmJmkubGVuZ3RoJiZ0LmZpbHRlclNlcmllcyhmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGkubGVuZ3RoO2UrKylpZighaVtlXS5pc1NlbGVjdGVkKHQubmFtZSkpcmV0dXJuITE7cmV0dXJuITB9KX0pLFR1LnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcigibGVnZW5kIixmdW5jdGlvbigpe3JldHVybiJwbGFpbiJ9KTt2YXIgTEM9X0MuZXh0ZW5kKHt0eXBlOiJsZWdlbmQuc2Nyb2xsIixzZXRTY3JvbGxEYXRhSW5kZXg6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uc2Nyb2xsRGF0YUluZGV4PXR9LGRlZmF1bHRPcHRpb246e3Njcm9sbERhdGFJbmRleDowLHBhZ2VCdXR0b25JdGVtR2FwOjUscGFnZUJ1dHRvbkdhcDpudWxsLHBhZ2VCdXR0b25Qb3NpdGlvbjoiZW5kIixwYWdlRm9ybWF0dGVyOiJ7Y3VycmVudH0ve3RvdGFsfSIscGFnZUljb25zOntob3Jpem9udGFsOlsiTTAsMEwxMiwtMTBMMTIsMTB6IiwiTTAsMEwtMTIsLTEwTC0xMiwxMHoiXSx2ZXJ0aWNhbDpbIk0wLDBMMjAsMEwxMCwtMjB6IiwiTTAsMEwyMCwwTDEwLDIweiJdfSxwYWdlSWNvbkNvbG9yOiIjMmY0NTU0IixwYWdlSWNvbkluYWN0aXZlQ29sb3I6IiNhYWEiLHBhZ2VJY29uU2l6ZToxNSxwYWdlVGV4dFN0eWxlOntjb2xvcjoiIzMzMyJ9LGFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlOjgwMH0saW5pdDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1fdSh0KTtMQy5zdXBlckNhbGwodGhpcywiaW5pdCIsdCxlLGksbiksa0ModGhpcyx0LG8pfSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0LGUpe0xDLnN1cGVyQ2FsbCh0aGlzLCJtZXJnZU9wdGlvbiIsdCxlKSxrQyh0aGlzLHRoaXMub3B0aW9uLHQpfX0pO2Z1bmN0aW9uIGtDKHQsZSxpKXt2YXIgbj1bMSwxXTtuW3QuZ2V0T3JpZW50KCkuaW5kZXhdPTAseHUoZSxpLHt0eXBlOiJib3giLGlnbm9yZVNpemU6bn0pfXZhciBQQz1JaSxOQz1bIndpZHRoIiwiaGVpZ2h0Il0sT0M9WyJ4IiwieSJdLEVDPUlDLmV4dGVuZCh7dHlwZToibGVnZW5kLnNjcm9sbCIsbmV3bGluZURpc2FibGVkOiEwLGluaXQ6ZnVuY3Rpb24oKXtFQy5zdXBlckNhbGwodGhpcywiaW5pdCIpLHRoaXMuX2N1cnJlbnRJbmRleD0wLHRoaXMuZ3JvdXAuYWRkKHRoaXMuX2NvbnRhaW5lckdyb3VwPW5ldyBQQyksdGhpcy5fY29udGFpbmVyR3JvdXAuYWRkKHRoaXMuZ2V0Q29udGVudEdyb3VwKCkpLHRoaXMuZ3JvdXAuYWRkKHRoaXMuX2NvbnRyb2xsZXJHcm91cD1uZXcgUEMpLHRoaXMuX3Nob3dDb250cm9sbGVyfSxyZXNldElubmVyOmZ1bmN0aW9uKCl7RUMuc3VwZXJDYWxsKHRoaXMsInJlc2V0SW5uZXIiKSx0aGlzLl9jb250cm9sbGVyR3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fY29udGFpbmVyR3JvdXAucmVtb3ZlQ2xpcFBhdGgoKSx0aGlzLl9jb250YWluZXJHcm91cC5fX3JlY3RTaXplPW51bGx9LHJlbmRlcklubmVyOmZ1bmN0aW9uKHQsbyxlLGEsaSxuLHIpe3ZhciBzPXRoaXM7RUMuc3VwZXJDYWxsKHRoaXMsInJlbmRlcklubmVyIix0LG8sZSxhLGksbixyKTt2YXIgbD10aGlzLl9jb250cm9sbGVyR3JvdXAsdT1vLmdldCgicGFnZUljb25TaXplIiwhMCk7ayh1KXx8KHU9W3UsdV0pLGMoInBhZ2VQcmV2IiwwKTt2YXIgaD1vLmdldE1vZGVsKCJwYWdlVGV4dFN0eWxlIik7ZnVuY3Rpb24gYyh0LGUpe3ZhciBpPXQrIkRhdGFJbmRleCIsbj1wbChvLmdldCgicGFnZUljb25zIiwhMClbby5nZXRPcmllbnQoKS5uYW1lXVtlXSx7b25jbGljazpBKHMuX3BhZ2VHbyxzLGksbyxhKX0se3g6LXVbMF0vMix5Oi11WzFdLzIsd2lkdGg6dVswXSxoZWlnaHQ6dVsxXX0pO24ubmFtZT10LGwuYWRkKG4pfWwuYWRkKG5ldyBGcih7bmFtZToicGFnZVRleHQiLHN0eWxlOnt0ZXh0RmlsbDpoLmdldFRleHRDb2xvcigpLGZvbnQ6aC5nZXRGb250KCksdGV4dFZlcnRpY2FsQWxpZ246Im1pZGRsZSIsdGV4dEFsaWduOiJjZW50ZXIifSxzaWxlbnQ6ITB9KSksYygicGFnZU5leHQiLDEpfSxsYXlvdXRJbm5lcjpmdW5jdGlvbih0LGUsaSxuLG8sYSl7dmFyIHI9dGhpcy5nZXRTZWxlY3Rvckdyb3VwKCkscz10LmdldE9yaWVudCgpLmluZGV4LGw9TkNbc10sdT1PQ1tzXSxoPU5DWzEtc10sYz1PQ1sxLXNdO28mJm11KCJob3Jpem9udGFsIixyLHQuZ2V0KCJzZWxlY3Rvckl0ZW1HYXAiLCEwKSk7dmFyIGQ9dC5nZXQoInNlbGVjdG9yQnV0dG9uR2FwIiwhMCksZj1yLmdldEJvdW5kaW5nUmVjdCgpLHA9Wy1mLngsLWYueV0sZz1EKGkpO28mJihnW2xdPWlbbF0tZltsXS1kKTt2YXIgbT10aGlzLl9sYXlvdXRDb250ZW50QW5kQ29udHJvbGxlcih0LG4sZyxzLGwsaCxjKTtpZihvKXtpZigiZW5kIj09PWEpcFtzXSs9bVtsXStkO2Vsc2V7dmFyIHY9ZltsXStkO3Bbc10tPXYsbVt1XS09dn1tW2xdKz1mW2xdK2QscFsxLXNdKz1tW2NdK21baF0vMi1mW2hdLzIsbVtoXT1NYXRoLm1heChtW2hdLGZbaF0pLG1bY109TWF0aC5taW4obVtjXSxmW2NdK3BbMS1zXSksci5hdHRyKCJwb3NpdGlvbiIscCl9cmV0dXJuIG19LF9sYXlvdXRDb250ZW50QW5kQ29udHJvbGxlcjpmdW5jdGlvbih0LGUsaSxuLG8sYSxyKXt2YXIgcz10aGlzLmdldENvbnRlbnRHcm91cCgpLGw9dGhpcy5fY29udGFpbmVyR3JvdXAsdT10aGlzLl9jb250cm9sbGVyR3JvdXA7bXUodC5nZXQoIm9yaWVudCIpLHMsdC5nZXQoIml0ZW1HYXAiKSxuP2kud2lkdGg6bnVsbCxuP251bGw6aS5oZWlnaHQpLG11KCJob3Jpem9udGFsIix1LHQuZ2V0KCJwYWdlQnV0dG9uSXRlbUdhcCIsITApKTt2YXIgaD1zLmdldEJvdW5kaW5nUmVjdCgpLGM9dS5nZXRCb3VuZGluZ1JlY3QoKSxkPXRoaXMuX3Nob3dDb250cm9sbGVyPWhbb10+aVtvXSxmPVstaC54LC1oLnldO2V8fChmW25dPXMucG9zaXRpb25bbl0pO3ZhciBwPVswLDBdLGc9Wy1jLngsLWMueV0sbT1IKHQuZ2V0KCJwYWdlQnV0dG9uR2FwIiwhMCksdC5nZXQoIml0ZW1HYXAiLCEwKSk7ZCYmKCJlbmQiPT09dC5nZXQoInBhZ2VCdXR0b25Qb3NpdGlvbiIsITApP2dbbl0rPWlbb10tY1tvXTpwW25dKz1jW29dK20pO2dbMS1uXSs9aFthXS8yLWNbYV0vMixzLmF0dHIoInBvc2l0aW9uIixmKSxsLmF0dHIoInBvc2l0aW9uIixwKSx1LmF0dHIoInBvc2l0aW9uIixnKTt2YXIgdj17eDowLHk6MH07aWYodltvXT1kP2lbb106aFtvXSx2W2FdPU1hdGgubWF4KGhbYV0sY1thXSksdltyXT1NYXRoLm1pbigwLGNbcl0rZ1sxLW5dKSxsLl9fcmVjdFNpemU9aVtvXSxkKXt2YXIgeT17eDowLHk6MH07eVtvXT1NYXRoLm1heChpW29dLWNbb10tbSwwKSx5W2FdPXZbYV0sbC5zZXRDbGlwUGF0aChuZXcgaXMoe3NoYXBlOnl9KSksbC5fX3JlY3RTaXplPXlbb119ZWxzZSB1LmVhY2hDaGlsZChmdW5jdGlvbih0KXt0LmF0dHIoe2ludmlzaWJsZTohMCxzaWxlbnQ6ITB9KX0pO3ZhciB4PXRoaXMuX2dldFBhZ2VJbmZvKHQpO3JldHVybiBudWxsIT14LnBhZ2VJbmRleCYmc2wocyx7cG9zaXRpb246eC5jb250ZW50UG9zaXRpb259LGQmJnQpLHRoaXMuX3VwZGF0ZVBhZ2VJbmZvVmlldyh0LHgpLHZ9LF9wYWdlR286ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2dldFBhZ2VJbmZvKGUpW3RdO251bGwhPW4mJmkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImxlZ2VuZFNjcm9sbCIsc2Nyb2xsRGF0YUluZGV4Om4sbGVnZW5kSWQ6ZS5pZH0pfSxfdXBkYXRlUGFnZUluZm9WaWV3OmZ1bmN0aW9uKG4sbyl7dmFyIGE9dGhpcy5fY29udHJvbGxlckdyb3VwO0UoWyJwYWdlUHJldiIsInBhZ2VOZXh0Il0sZnVuY3Rpb24odCl7dmFyIGU9bnVsbCE9b1t0KyJEYXRhSW5kZXgiXSxpPWEuY2hpbGRPZk5hbWUodCk7aSYmKGkuc2V0U3R5bGUoImZpbGwiLGU/bi5nZXQoInBhZ2VJY29uQ29sb3IiLCEwKTpuLmdldCgicGFnZUljb25JbmFjdGl2ZUNvbG9yIiwhMCkpLGkuY3Vyc29yPWU/InBvaW50ZXIiOiJkZWZhdWx0Iil9KTt2YXIgdD1hLmNoaWxkT2ZOYW1lKCJwYWdlVGV4dCIpLGU9bi5nZXQoInBhZ2VGb3JtYXR0ZXIiKSxpPW8ucGFnZUluZGV4LHI9bnVsbCE9aT9pKzE6MCxzPW8ucGFnZUNvdW50O3QmJmUmJnQuc2V0U3R5bGUoInRleHQiLHooZSk/ZS5yZXBsYWNlKCJ7Y3VycmVudH0iLHIpLnJlcGxhY2UoInt0b3RhbH0iLHMpOmUoe2N1cnJlbnQ6cix0b3RhbDpzfSkpfSxfZ2V0UGFnZUluZm86ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoInNjcm9sbERhdGFJbmRleCIsITApLGk9dGhpcy5nZXRDb250ZW50R3JvdXAoKSxuPXRoaXMuX2NvbnRhaW5lckdyb3VwLl9fcmVjdFNpemUsbz10LmdldE9yaWVudCgpLmluZGV4LGE9TkNbb10scj1PQ1tvXSxzPXRoaXMuX2ZpbmRUYXJnZXRJdGVtSW5kZXgoZSksbD1pLmNoaWxkcmVuKCksdT1sW3NdLGg9bC5sZW5ndGgsYz1oPzE6MCxkPXtjb250ZW50UG9zaXRpb246aS5wb3NpdGlvbi5zbGljZSgpLHBhZ2VDb3VudDpjLHBhZ2VJbmRleDpjLTEscGFnZVByZXZEYXRhSW5kZXg6bnVsbCxwYWdlTmV4dERhdGFJbmRleDpudWxsfTtpZighdSlyZXR1cm4gZDt2YXIgZj15KHUpO2QuY29udGVudFBvc2l0aW9uW29dPS1mLnM7Zm9yKHZhciBwPXMrMSxnPWYsbT1mLHY9bnVsbDtwPD1oOysrcCkoISh2PXkobFtwXSkpJiZtLmU+Zy5zK258fHYmJiF4KHYsZy5zKSkmJihnPW0uaT5nLmk/bTp2KSYmKG51bGw9PWQucGFnZU5leHREYXRhSW5kZXgmJihkLnBhZ2VOZXh0RGF0YUluZGV4PWcuaSksKytkLnBhZ2VDb3VudCksbT12O2ZvcihwPXMtMSxnPWYsbT1mLHY9bnVsbDstMTw9cDstLXApKHY9eShsW3BdKSkmJngobSx2LnMpfHwhKGcuaTxtLmkpfHwobT1nLG51bGw9PWQucGFnZVByZXZEYXRhSW5kZXgmJihkLnBhZ2VQcmV2RGF0YUluZGV4PWcuaSksKytkLnBhZ2VDb3VudCwrK2QucGFnZUluZGV4KSxnPXY7cmV0dXJuIGQ7ZnVuY3Rpb24geSh0KXtpZih0KXt2YXIgZT10LmdldEJvdW5kaW5nUmVjdCgpLGk9ZVtyXSt0LnBvc2l0aW9uW29dO3JldHVybntzOmksZTppK2VbYV0saTp0Ll9fbGVnZW5kRGF0YUluZGV4fX19ZnVuY3Rpb24geCh0LGUpe3JldHVybiB0LmU+PWUmJnQuczw9ZStufX0sX2ZpbmRUYXJnZXRJdGVtSW5kZXg6ZnVuY3Rpb24obil7dmFyIG8sYSx0PXRoaXMuZ2V0Q29udGVudEdyb3VwKCk7cmV0dXJuIHRoaXMuX3Nob3dDb250cm9sbGVyJiZ0LmVhY2hDaGlsZChmdW5jdGlvbih0LGUpe3ZhciBpPXQuX19sZWdlbmREYXRhSW5kZXg7bnVsbD09YSYmbnVsbCE9aSYmKGE9ZSksaT09PW4mJihvPWUpfSksbnVsbCE9bz9vOmF9fSk7Z2YoImxlZ2VuZFNjcm9sbCIsImxlZ2VuZHNjcm9sbCIsZnVuY3Rpb24odCxlKXt2YXIgaT10LnNjcm9sbERhdGFJbmRleDtudWxsIT1pJiZlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJsZWdlbmQiLHN1YlR5cGU6InNjcm9sbCIscXVlcnk6dH0sZnVuY3Rpb24odCl7dC5zZXRTY3JvbGxEYXRhSW5kZXgoaSl9KX0pO1dBLmV4dGVuZCh7dHlwZToiZGF0YVpvb20uc2xpZGVyIixsYXlvdXRNb2RlOiJib3giLGRlZmF1bHRPcHRpb246e3Nob3c6ITAscmlnaHQ6InBoIix0b3A6InBoIix3aWR0aDoicGgiLGhlaWdodDoicGgiLGxlZnQ6bnVsbCxib3R0b206bnVsbCxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoNDcsNjksODQsMCkiLGRhdGFCYWNrZ3JvdW5kOntsaW5lU3R5bGU6e2NvbG9yOiIjMmY0NTU0Iix3aWR0aDouNSxvcGFjaXR5Oi4zfSxhcmVhU3R5bGU6e2NvbG9yOiJyZ2JhKDQ3LDY5LDg0LDAuMykiLG9wYWNpdHk6LjN9fSxib3JkZXJDb2xvcjoiI2RkZCIsZmlsbGVyQ29sb3I6InJnYmEoMTY3LDE4MywyMDQsMC40KSIsaGFuZGxlSWNvbjoiTTguMiwxMy42VjMuOUg2LjN2OS43SDMuMXYxNC45aDMuM3Y5LjdoMS44di05LjdoMy4zVjEzLjZIOC4yeiBNOS43LDI0LjRINC44di0xLjRoNC45VjI0LjR6IE05LjcsMTkuMUg0Ljh2LTEuNGg0LjlWMTkuMXoiLGhhbmRsZVNpemU6IjEwMCUiLGhhbmRsZVN0eWxlOntjb2xvcjoiI2E3YjdjYyJ9LGxhYmVsUHJlY2lzaW9uOm51bGwsbGFiZWxGb3JtYXR0ZXI6bnVsbCxzaG93RGV0YWlsOiEwLHNob3dEYXRhU2hhZG93OiJhdXRvIixyZWFsdGltZTohMCx6b29tTG9jazohMSx0ZXh0U3R5bGU6e2NvbG9yOiIjMzMzIn19fSk7dmFyIHpDPWlzLFJDPWtsLEJDPU9sLFZDPUEsR0M9RSxGQz0iaG9yaXpvbnRhbCIsV0M9InZlcnRpY2FsIixIQz1bImxpbmUiLCJiYXIiLCJjYW5kbGVzdGljayIsInNjYXR0ZXIiXSxaQz1VQS5leHRlbmQoe3R5cGU6ImRhdGFab29tLnNsaWRlciIsaW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuX2Rpc3BsYXlhYmxlcz17fSx0aGlzLl9vcmllbnQsdGhpcy5fcmFuZ2UsdGhpcy5faGFuZGxlRW5kcyx0aGlzLl9zaXplLHRoaXMuX2hhbmRsZVdpZHRoLHRoaXMuX2hhbmRsZUhlaWdodCx0aGlzLl9sb2NhdGlvbix0aGlzLl9kcmFnZ2luZyx0aGlzLl9kYXRhU2hhZG93SW5mbyx0aGlzLmFwaT1lfSxyZW5kZXI6ZnVuY3Rpb24odCxlLGksbil7WkMuc3VwZXJBcHBseSh0aGlzLCJyZW5kZXIiLGFyZ3VtZW50cyksVGModGhpcywiX2Rpc3BhdGNoWm9vbUFjdGlvbiIsdGhpcy5kYXRhWm9vbU1vZGVsLmdldCgidGhyb3R0bGUiKSwiZml4UmF0ZSIpLHRoaXMuX29yaWVudD10LmdldCgib3JpZW50IiksITEhPT10aGlzLmRhdGFab29tTW9kZWwuZ2V0KCJzaG93Iik/KG4mJiJkYXRhWm9vbSI9PT1uLnR5cGUmJm4uZnJvbT09PXRoaXMudWlkfHx0aGlzLl9idWlsZFZpZXcoKSx0aGlzLl91cGRhdGVWaWV3KCkpOnRoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LHJlbW92ZTpmdW5jdGlvbigpe1pDLnN1cGVyQXBwbHkodGhpcywicmVtb3ZlIixhcmd1bWVudHMpLEFjKHRoaXMsIl9kaXNwYXRjaFpvb21BY3Rpb24iKX0sZGlzcG9zZTpmdW5jdGlvbigpe1pDLnN1cGVyQXBwbHkodGhpcywiZGlzcG9zZSIsYXJndW1lbnRzKSxBYyh0aGlzLCJfZGlzcGF0Y2hab29tQWN0aW9uIil9LF9idWlsZFZpZXc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyb3VwO3QucmVtb3ZlQWxsKCksdGhpcy5fcmVzZXRMb2NhdGlvbigpLHRoaXMuX3Jlc2V0SW50ZXJ2YWwoKTt2YXIgZT10aGlzLl9kaXNwbGF5YWJsZXMuYmFyR3JvdXA9bmV3IElpO3RoaXMuX3JlbmRlckJhY2tncm91bmQoKSx0aGlzLl9yZW5kZXJIYW5kbGUoKSx0aGlzLl9yZW5kZXJEYXRhU2hhZG93KCksdC5hZGQoZSksdGhpcy5fcG9zaXRpb25Hcm91cCgpfSxfcmVzZXRMb2NhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YVpvb21Nb2RlbCxlPXRoaXMuYXBpLGk9dGhpcy5fZmluZENvb3JkUmVjdCgpLG49e3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0sbz10aGlzLl9vcmllbnQ9PT1GQz97cmlnaHQ6bi53aWR0aC1pLngtaS53aWR0aCx0b3A6bi5oZWlnaHQtMzAtNyx3aWR0aDppLndpZHRoLGhlaWdodDozMH06e3JpZ2h0OjcsdG9wOmkueSx3aWR0aDozMCxoZWlnaHQ6aS5oZWlnaHR9LGE9X3UodC5vcHRpb24pO0UoWyJyaWdodCIsInRvcCIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24odCl7InBoIj09PWFbdF0mJihhW3RdPW9bdF0pfSk7dmFyIHI9dnUoYSxuLHQucGFkZGluZyk7dGhpcy5fbG9jYXRpb249e3g6ci54LHk6ci55fSx0aGlzLl9zaXplPVtyLndpZHRoLHIuaGVpZ2h0XSx0aGlzLl9vcmllbnQ9PT1XQyYmdGhpcy5fc2l6ZS5yZXZlcnNlKCl9LF9wb3NpdGlvbkdyb3VwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncm91cCxlPXRoaXMuX2xvY2F0aW9uLGk9dGhpcy5fb3JpZW50LG49dGhpcy5kYXRhWm9vbU1vZGVsLmdldEZpcnN0VGFyZ2V0QXhpc01vZGVsKCksbz1uJiZuLmdldCgiaW52ZXJzZSIpLGE9dGhpcy5fZGlzcGxheWFibGVzLmJhckdyb3VwLHI9KHRoaXMuX2RhdGFTaGFkb3dJbmZvfHx7fSkub3RoZXJBeGlzSW52ZXJzZTthLmF0dHIoaSE9PUZDfHxvP2k9PT1GQyYmbz97c2NhbGU6cj9bLTEsMV06Wy0xLC0xXX06aSE9PVdDfHxvP3tzY2FsZTpyP1stMSwtMV06Wy0xLDFdLHJvdGF0aW9uOk1hdGguUEkvMn06e3NjYWxlOnI/WzEsLTFdOlsxLDFdLHJvdGF0aW9uOk1hdGguUEkvMn06e3NjYWxlOnI/WzEsMV06WzEsLTFdfSk7dmFyIHM9dC5nZXRCb3VuZGluZ1JlY3QoW2FdKTt0LmF0dHIoInBvc2l0aW9uIixbZS54LXMueCxlLnktcy55XSl9LF9nZXRWaWV3RXh0ZW50OmZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fc2l6ZVswXV19LF9yZW5kZXJCYWNrZ3JvdW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhWm9vbU1vZGVsLGU9dGhpcy5fc2l6ZSxpPXRoaXMuX2Rpc3BsYXlhYmxlcy5iYXJHcm91cDtpLmFkZChuZXcgekMoe3NpbGVudDohMCxzaGFwZTp7eDowLHk6MCx3aWR0aDplWzBdLGhlaWdodDplWzFdfSxzdHlsZTp7ZmlsbDp0LmdldCgiYmFja2dyb3VuZENvbG9yIil9LHoyOi00MH0pKSxpLmFkZChuZXcgekMoe3NoYXBlOnt4OjAseTowLHdpZHRoOmVbMF0saGVpZ2h0OmVbMV19LHN0eWxlOntmaWxsOiJ0cmFuc3BhcmVudCJ9LHoyOjAsb25jbGljazpBKHRoaXMuX29uQ2xpY2tQYW5lbENsaWNrLHRoaXMpfSkpfSxfcmVuZGVyRGF0YVNoYWRvdzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGFTaGFkb3dJbmZvPXRoaXMuX3ByZXBhcmVEYXRhU2hhZG93SW5mbygpO2lmKHQpe3ZhciBlPXRoaXMuX3NpemUsaT10LnNlcmllcyxuPWkuZ2V0UmF3RGF0YSgpLG89aS5nZXRTaGFkb3dEaW0/aS5nZXRTaGFkb3dEaW0oKTp0Lm90aGVyRGltO2lmKG51bGwhPW8pe3ZhciBhPW4uZ2V0RGF0YUV4dGVudChvKSxyPS4zKihhWzFdLWFbMF0pO2E9W2FbMF0tcixhWzFdK3JdO3ZhciBzLGw9WzAsZVsxXV0sdT1bMCxlWzBdXSxoPVtbZVswXSwwXSxbMCwwXV0sYz1bXSxkPXVbMV0vKG4uY291bnQoKS0xKSxmPTAscD1NYXRoLnJvdW5kKG4uY291bnQoKS9lWzBdKTtuLmVhY2goW29dLGZ1bmN0aW9uKHQsZSl7aWYoMDxwJiZlJXApZis9ZDtlbHNle3ZhciBpPW51bGw9PXR8fGlzTmFOKHQpfHwiIj09PXQsbj1pPzA6UkModCxhLGwsITApO2kmJiFzJiZlPyhoLnB1c2goW2hbaC5sZW5ndGgtMV1bMF0sMF0pLGMucHVzaChbY1tjLmxlbmd0aC0xXVswXSwwXSkpOiFpJiZzJiYoaC5wdXNoKFtmLDBdKSxjLnB1c2goW2YsMF0pKSxoLnB1c2goW2Ysbl0pLGMucHVzaChbZixuXSksZis9ZCxzPWl9fSk7dmFyIGc9dGhpcy5kYXRhWm9vbU1vZGVsO3RoaXMuX2Rpc3BsYXlhYmxlcy5iYXJHcm91cC5hZGQobmV3IHFyKHtzaGFwZTp7cG9pbnRzOmh9LHN0eWxlOkMoe2ZpbGw6Zy5nZXQoImRhdGFCYWNrZ3JvdW5kQ29sb3IiKX0sZy5nZXRNb2RlbCgiZGF0YUJhY2tncm91bmQuYXJlYVN0eWxlIikuZ2V0QXJlYVN0eWxlKCkpLHNpbGVudDohMCx6MjotMjB9KSksdGhpcy5fZGlzcGxheWFibGVzLmJhckdyb3VwLmFkZChuZXcgS3Ioe3NoYXBlOntwb2ludHM6Y30sc3R5bGU6Zy5nZXRNb2RlbCgiZGF0YUJhY2tncm91bmQubGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksc2lsZW50OiEwLHoyOi0xOX0pKX19fSxfcHJlcGFyZURhdGFTaGFkb3dJbmZvOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhWm9vbU1vZGVsLHM9dC5nZXQoInNob3dEYXRhU2hhZG93Iik7aWYoITEhPT1zKXt2YXIgbCx1PXRoaXMuZWNNb2RlbDtyZXR1cm4gdC5lYWNoVGFyZ2V0QXhpcyhmdW5jdGlvbihhLHIpe0UodC5nZXRBeGlzUHJveHkoYS5uYW1lLHIpLmdldFRhcmdldFNlcmllc01vZGVscygpLGZ1bmN0aW9uKHQpe2lmKCEobHx8ITAhPT1zJiZfKEhDLHQuZ2V0KCJ0eXBlIikpPDApKXt2YXIgZSxpPXUuZ2V0Q29tcG9uZW50KGEuYXhpcyxyKS5heGlzLG49ZnVuY3Rpb24odCl7cmV0dXJue3g6InkiLHk6IngiLHJhZGl1czoiYW5nbGUiLGFuZ2xlOiJyYWRpdXMifVt0XX0oYS5uYW1lKSxvPXQuY29vcmRpbmF0ZVN5c3RlbTtudWxsIT1uJiZvLmdldE90aGVyQXhpcyYmKGU9by5nZXRPdGhlckF4aXMoaSkuaW52ZXJzZSksbj10LmdldERhdGEoKS5tYXBEaW1lbnNpb24obiksbD17dGhpc0F4aXM6aSxzZXJpZXM6dCx0aGlzRGltOmEubmFtZSxvdGhlckRpbTpuLG90aGVyQXhpc0ludmVyc2U6ZX19fSx0aGlzKX0sdGhpcyksbH19LF9yZW5kZXJIYW5kbGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9kaXNwbGF5YWJsZXMsYT10LmhhbmRsZXM9W10scj10LmhhbmRsZUxhYmVscz1bXSxzPXRoaXMuX2Rpc3BsYXlhYmxlcy5iYXJHcm91cCxlPXRoaXMuX3NpemUsbD10aGlzLmRhdGFab29tTW9kZWw7cy5hZGQodC5maWxsZXI9bmV3IHpDKHtkcmFnZ2FibGU6ITAsY3Vyc29yOlVDKHRoaXMuX29yaWVudCksZHJpZnQ6VkModGhpcy5fb25EcmFnTW92ZSx0aGlzLCJhbGwiKSxvbmRyYWdzdGFydDpWQyh0aGlzLl9zaG93RGF0YUluZm8sdGhpcywhMCksb25kcmFnZW5kOlZDKHRoaXMuX29uRHJhZ0VuZCx0aGlzKSxvbm1vdXNlb3ZlcjpWQyh0aGlzLl9zaG93RGF0YUluZm8sdGhpcywhMCksb25tb3VzZW91dDpWQyh0aGlzLl9zaG93RGF0YUluZm8sdGhpcywhMSksc3R5bGU6e2ZpbGw6bC5nZXQoImZpbGxlckNvbG9yIiksdGV4dFBvc2l0aW9uOiJpbnNpZGUifX0pKSxzLmFkZChuZXcgekMoe3NpbGVudDohMCxzdWJQaXhlbE9wdGltaXplOiEwLHNoYXBlOnt4OjAseTowLHdpZHRoOmVbMF0saGVpZ2h0OmVbMV19LHN0eWxlOntzdHJva2U6bC5nZXQoImRhdGFCYWNrZ3JvdW5kQ29sb3IiKXx8bC5nZXQoImJvcmRlckNvbG9yIiksbGluZVdpZHRoOjEsZmlsbDoicmdiYSgwLDAsMCwwKSJ9fSkpLEdDKFswLDFdLGZ1bmN0aW9uKHQpe3ZhciBlPXBsKGwuZ2V0KCJoYW5kbGVJY29uIikse2N1cnNvcjpVQyh0aGlzLl9vcmllbnQpLGRyYWdnYWJsZTohMCxkcmlmdDpWQyh0aGlzLl9vbkRyYWdNb3ZlLHRoaXMsdCksb25kcmFnZW5kOlZDKHRoaXMuX29uRHJhZ0VuZCx0aGlzKSxvbm1vdXNlb3ZlcjpWQyh0aGlzLl9zaG93RGF0YUluZm8sdGhpcywhMCksb25tb3VzZW91dDpWQyh0aGlzLl9zaG93RGF0YUluZm8sdGhpcywhMSl9LHt4Oi0xLHk6MCx3aWR0aDoyLGhlaWdodDoyfSksaT1lLmdldEJvdW5kaW5nUmVjdCgpO3RoaXMuX2hhbmRsZUhlaWdodD1QbChsLmdldCgiaGFuZGxlU2l6ZSIpLHRoaXMuX3NpemVbMV0pLHRoaXMuX2hhbmRsZVdpZHRoPWkud2lkdGgvaS5oZWlnaHQqdGhpcy5faGFuZGxlSGVpZ2h0LGUuc2V0U3R5bGUobC5nZXRNb2RlbCgiaGFuZGxlU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSk7dmFyIG49bC5nZXQoImhhbmRsZUNvbG9yIik7bnVsbCE9biYmKGUuc3R5bGUuZmlsbD1uKSxzLmFkZChhW3RdPWUpO3ZhciBvPWwudGV4dFN0eWxlTW9kZWw7dGhpcy5ncm91cC5hZGQoclt0XT1uZXcgRnIoe3NpbGVudDohMCxpbnZpc2libGU6ITAsc3R5bGU6e3g6MCx5OjAsdGV4dDoiIix0ZXh0VmVydGljYWxBbGlnbjoibWlkZGxlIix0ZXh0QWxpZ246ImNlbnRlciIsdGV4dEZpbGw6by5nZXRUZXh0Q29sb3IoKSx0ZXh0Rm9udDpvLmdldEZvbnQoKX0sejI6MTB9KSl9LHRoaXMpfSxfcmVzZXRJbnRlcnZhbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JhbmdlPXRoaXMuZGF0YVpvb21Nb2RlbC5nZXRQZXJjZW50UmFuZ2UoKSxlPXRoaXMuX2dldFZpZXdFeHRlbnQoKTt0aGlzLl9oYW5kbGVFbmRzPVtSQyh0WzBdLFswLDEwMF0sZSwhMCksUkModFsxXSxbMCwxMDBdLGUsITApXX0sX3VwZGF0ZUludGVydmFsOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5kYXRhWm9vbU1vZGVsLG49dGhpcy5faGFuZGxlRW5kcyxvPXRoaXMuX2dldFZpZXdFeHRlbnQoKSxhPWkuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCkuZ2V0TWluTWF4U3BhbigpLHI9WzAsMTAwXTtXdyhlLG4sbyxpLmdldCgiem9vbUxvY2siKT8iYWxsIjp0LG51bGwhPWEubWluU3Bhbj9SQyhhLm1pblNwYW4scixvLCEwKTpudWxsLG51bGwhPWEubWF4U3Bhbj9SQyhhLm1heFNwYW4scixvLCEwKTpudWxsKTt2YXIgcz10aGlzLl9yYW5nZSxsPXRoaXMuX3JhbmdlPUJDKFtSQyhuWzBdLG8sciwhMCksUkMoblsxXSxvLHIsITApXSk7cmV0dXJuIXN8fHNbMF0hPT1sWzBdfHxzWzFdIT09bFsxXX0sX3VwZGF0ZVZpZXc6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZGlzcGxheWFibGVzLG89dGhpcy5faGFuZGxlRW5kcyxlPUJDKG8uc2xpY2UoKSksYT10aGlzLl9zaXplO0dDKFswLDFdLGZ1bmN0aW9uKHQpe3ZhciBlPW4uaGFuZGxlc1t0XSxpPXRoaXMuX2hhbmRsZUhlaWdodDtlLmF0dHIoe3NjYWxlOltpLzIsaS8yXSxwb3NpdGlvbjpbb1t0XSxhWzFdLzItaS8yXX0pfSx0aGlzKSxuLmZpbGxlci5zZXRTaGFwZSh7eDplWzBdLHk6MCx3aWR0aDplWzFdLWVbMF0saGVpZ2h0OmFbMV19KSx0aGlzLl91cGRhdGVEYXRhSW5mbyh0KX0sX3VwZGF0ZURhdGFJbmZvOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YVpvb21Nb2RlbCxhPXRoaXMuX2Rpc3BsYXlhYmxlcyxyPWEuaGFuZGxlTGFiZWxzLHM9dGhpcy5fb3JpZW50LGw9WyIiLCIiXTtpZihlLmdldCgic2hvd0RldGFpbCIpKXt2YXIgaT1lLmZpbmRSZXByZXNlbnRhdGl2ZUF4aXNQcm94eSgpO2lmKGkpe3ZhciBuPWkuZ2V0QXhpc01vZGVsKCkuYXhpcyxvPXRoaXMuX3JhbmdlLHU9dD9pLmNhbGN1bGF0ZURhdGFXaW5kb3coe3N0YXJ0Om9bMF0sZW5kOm9bMV19KS52YWx1ZVdpbmRvdzppLmdldERhdGFWYWx1ZVdpbmRvdygpO2w9W3RoaXMuX2Zvcm1hdExhYmVsKHVbMF0sbiksdGhpcy5fZm9ybWF0TGFiZWwodVsxXSxuKV19fXZhciBoPUJDKHRoaXMuX2hhbmRsZUVuZHMuc2xpY2UoKSk7ZnVuY3Rpb24gYyh0KXt2YXIgZT11bChhLmhhbmRsZXNbdF0ucGFyZW50LHRoaXMuZ3JvdXApLGk9Y2woMD09PXQ/InJpZ2h0IjoibGVmdCIsZSksbj10aGlzLl9oYW5kbGVXaWR0aC8yKzUsbz1obChbaFt0XSsoMD09PXQ/LW46biksdGhpcy5fc2l6ZVsxXS8yXSxlKTtyW3RdLnNldFN0eWxlKHt4Om9bMF0seTpvWzFdLHRleHRWZXJ0aWNhbEFsaWduOnM9PT1GQz8ibWlkZGxlIjppLHRleHRBbGlnbjpzPT09RkM/aToiY2VudGVyIix0ZXh0OmxbdF19KX1jLmNhbGwodGhpcywwKSxjLmNhbGwodGhpcywxKX0sX2Zvcm1hdExhYmVsOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5kYXRhWm9vbU1vZGVsLG49aS5nZXQoImxhYmVsRm9ybWF0dGVyIiksbz1pLmdldCgibGFiZWxQcmVjaXNpb24iKTtudWxsIT1vJiYiYXV0byIhPT1vfHwobz1lLmdldFBpeGVsUHJlY2lzaW9uKCkpO3ZhciBhPW51bGw9PXR8fGlzTmFOKHQpPyIiOiJjYXRlZ29yeSI9PT1lLnR5cGV8fCJ0aW1lIj09PWUudHlwZT9lLnNjYWxlLmdldExhYmVsKE1hdGgucm91bmQodCkpOnQudG9GaXhlZChNYXRoLm1pbihvLDIwKSk7cmV0dXJuIE8obik/bih0LGEpOnoobik/bi5yZXBsYWNlKCJ7dmFsdWV9IixhKTphfSxfc2hvd0RhdGFJbmZvOmZ1bmN0aW9uKHQpe3Q9dGhpcy5fZHJhZ2dpbmd8fHQ7dmFyIGU9dGhpcy5fZGlzcGxheWFibGVzLmhhbmRsZUxhYmVscztlWzBdLmF0dHIoImludmlzaWJsZSIsIXQpLGVbMV0uYXR0cigiaW52aXNpYmxlIiwhdCl9LF9vbkRyYWdNb3ZlOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuX2RyYWdnaW5nPSEwLFd0KG4uZXZlbnQpO3ZhciBvPWhsKFtlLGldLHRoaXMuX2Rpc3BsYXlhYmxlcy5iYXJHcm91cC5nZXRMb2NhbFRyYW5zZm9ybSgpLCEwKSxhPXRoaXMuX3VwZGF0ZUludGVydmFsKHQsb1swXSkscj10aGlzLmRhdGFab29tTW9kZWwuZ2V0KCJyZWFsdGltZSIpO3RoaXMuX3VwZGF0ZVZpZXcoIXIpLGEmJnImJnRoaXMuX2Rpc3BhdGNoWm9vbUFjdGlvbigpfSxfb25EcmFnRW5kOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fc2hvd0RhdGFJbmZvKCExKSx0aGlzLmRhdGFab29tTW9kZWwuZ2V0KCJyZWFsdGltZSIpfHx0aGlzLl9kaXNwYXRjaFpvb21BY3Rpb24oKX0sX29uQ2xpY2tQYW5lbENsaWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3NpemUsaT10aGlzLl9kaXNwbGF5YWJsZXMuYmFyR3JvdXAudHJhbnNmb3JtQ29vcmRUb0xvY2FsKHQub2Zmc2V0WCx0Lm9mZnNldFkpO2lmKCEoaVswXTwwfHxpWzBdPmVbMF18fGlbMV08MHx8aVsxXT5lWzFdKSl7dmFyIG49dGhpcy5faGFuZGxlRW5kcyxvPShuWzBdK25bMV0pLzIsYT10aGlzLl91cGRhdGVJbnRlcnZhbCgiYWxsIixpWzBdLW8pO3RoaXMuX3VwZGF0ZVZpZXcoKSxhJiZ0aGlzLl9kaXNwYXRjaFpvb21BY3Rpb24oKX19LF9kaXNwYXRjaFpvb21BY3Rpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yYW5nZTt0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiZGF0YVpvb20iLGZyb206dGhpcy51aWQsZGF0YVpvb21JZDp0aGlzLmRhdGFab29tTW9kZWwuaWQsc3RhcnQ6dFswXSxlbmQ6dFsxXX0pfSxfZmluZENvb3JkUmVjdDpmdW5jdGlvbigpe3ZhciBpO2lmKEdDKHRoaXMuZ2V0VGFyZ2V0Q29vcmRJbmZvKCksZnVuY3Rpb24odCl7aWYoIWkmJnQubGVuZ3RoKXt2YXIgZT10WzBdLm1vZGVsLmNvb3JkaW5hdGVTeXN0ZW07aT1lLmdldFJlY3QmJmUuZ2V0UmVjdCgpfX0pLCFpKXt2YXIgdD10aGlzLmFwaS5nZXRXaWR0aCgpLGU9dGhpcy5hcGkuZ2V0SGVpZ2h0KCk7aT17eDouMip0LHk6LjIqZSx3aWR0aDouNip0LGhlaWdodDouNiplfX1yZXR1cm4gaX19KTtmdW5jdGlvbiBVQyh0KXtyZXR1cm4idmVydGljYWwiPT09dD8ibnMtcmVzaXplIjoiZXctcmVzaXplIn1XQS5leHRlbmQoe3R5cGU6ImRhdGFab29tLmluc2lkZSIsZGVmYXVsdE9wdGlvbjp7ZGlzYWJsZWQ6ITEsem9vbUxvY2s6ITEsem9vbU9uTW91c2VXaGVlbDohMCxtb3ZlT25Nb3VzZU1vdmU6ITAsbW92ZU9uTW91c2VXaGVlbDohMSxwcmV2ZW50RGVmYXVsdE1vdXNlTW92ZTohMH19KTt2YXIgWEM9IlwwX2VjX2RhdGFab29tX3JvYW1zIjtmdW5jdGlvbiBZQyh0LG4pe3ZhciBlPXFDKHQpLG89bi5kYXRhWm9vbUlkLGE9bi5jb29yZElkO0UoZSxmdW5jdGlvbih0LGUpe3ZhciBpPXQuZGF0YVpvb21JbmZvcztpW29dJiZfKG4uYWxsQ29vcmRJZHMsYSk8MCYmKGRlbGV0ZSBpW29dLHQuY291bnQtLSl9KSxLQyhlKTt2YXIgaT1lW2FdO2l8fCgoaT1lW2FdPXtjb29yZElkOmEsZGF0YVpvb21JbmZvczp7fSxjb3VudDowfSkuY29udHJvbGxlcj1mdW5jdGlvbih0LHIpe3ZhciBlPW5ldyBMeSh0LmdldFpyKCkpO3JldHVybiBFKFsicGFuIiwiem9vbSIsInNjcm9sbE1vdmUiXSxmdW5jdGlvbihhKXtlLm9uKGEsZnVuY3Rpb24obil7dmFyIG89W107RShyLmRhdGFab29tSW5mb3MsZnVuY3Rpb24odCl7aWYobi5pc0F2YWlsYWJsZUJlaGF2aW9yKHQuZGF0YVpvb21Nb2RlbC5vcHRpb24pKXt2YXIgZT0odC5nZXRSYW5nZXx8e30pW2FdLGk9ZSYmZShyLmNvbnRyb2xsZXIsbik7IXQuZGF0YVpvb21Nb2RlbC5nZXQoImRpc2FibGVkIiwhMCkmJmkmJm8ucHVzaCh7ZGF0YVpvb21JZDp0LmRhdGFab29tSWQsc3RhcnQ6aVswXSxlbmQ6aVsxXX0pfX0pLG8ubGVuZ3RoJiZyLmRpc3BhdGNoQWN0aW9uKG8pfSl9KSxlfSh0LGkpLGkuZGlzcGF0Y2hBY3Rpb249VCgkQyx0KSksaS5kYXRhWm9vbUluZm9zW29dfHxpLmNvdW50KyssaS5kYXRhWm9vbUluZm9zW29dPW47dmFyIHI9ZnVuY3Rpb24odCl7dmFyIG4sbz17dHlwZV90cnVlOjIsdHlwZV9tb3ZlOjEsdHlwZV9mYWxzZTowLHR5cGVfdW5kZWZpbmVkOi0xfSxhPSEwO3JldHVybiBFKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRhWm9vbU1vZGVsLGk9IWUuZ2V0KCJkaXNhYmxlZCIsITApJiYoIWUuZ2V0KCJ6b29tTG9jayIsITApfHwibW92ZSIpO29bInR5cGVfIituXTxvWyJ0eXBlXyIraV0mJihuPWkpLGEmPWUuZ2V0KCJwcmV2ZW50RGVmYXVsdE1vdXNlTW92ZSIsITApfSkse2NvbnRyb2xUeXBlOm4sb3B0Ont6b29tT25Nb3VzZVdoZWVsOiEwLG1vdmVPbk1vdXNlTW92ZTohMCxtb3ZlT25Nb3VzZVdoZWVsOiEwLHByZXZlbnREZWZhdWx0TW91c2VNb3ZlOiEhYX19fShpLmRhdGFab29tSW5mb3MpO2kuY29udHJvbGxlci5lbmFibGUoci5jb250cm9sVHlwZSxyLm9wdCksaS5jb250cm9sbGVyLnNldFBvaW50ZXJDaGVja2VyKG4uY29udGFpbnNQb2ludCksVGMoaSwiZGlzcGF0Y2hBY3Rpb24iLG4uZGF0YVpvb21Nb2RlbC5nZXQoInRocm90dGxlIiwhMCksImZpeFJhdGUiKX1mdW5jdGlvbiBqQyh0KXtyZXR1cm4gdC50eXBlKyJcMF8iK3QuaWR9ZnVuY3Rpb24gcUModCl7dmFyIGU9dC5nZXRacigpO3JldHVybiBlW1hDXXx8KGVbWENdPXt9KX1mdW5jdGlvbiBLQyhpKXtFKGksZnVuY3Rpb24odCxlKXt0LmNvdW50fHwodC5jb250cm9sbGVyLmRpc3Bvc2UoKSxkZWxldGUgaVtlXSl9KX1mdW5jdGlvbiAkQyh0LGUpe3QuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImRhdGFab29tIixiYXRjaDplfSl9dmFyIEpDPUEsUUM9VUEuZXh0ZW5kKHt0eXBlOiJkYXRhWm9vbS5pbnNpZGUiLGluaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLl9yYW5nZX0scmVuZGVyOmZ1bmN0aW9uKHIsdCxzLGUpe1FDLnN1cGVyQXBwbHkodGhpcywicmVuZGVyIixhcmd1bWVudHMpLHRoaXMuX3JhbmdlPXIuZ2V0UGVyY2VudFJhbmdlKCksRSh0aGlzLmdldFRhcmdldENvb3JkSW5mbygpLGZ1bmN0aW9uKHQsbyl7dmFyIGE9Tih0LGZ1bmN0aW9uKHQpe3JldHVybiBqQyh0Lm1vZGVsKX0pO0UodCxmdW5jdGlvbihlKXt2YXIgbj1lLm1vZGVsLGk9e307RShbInBhbiIsInpvb20iLCJzY3JvbGxNb3ZlIl0sZnVuY3Rpb24odCl7aVt0XT1KQyh0TFt0XSx0aGlzLGUsbyl9LHRoaXMpLFlDKHMse2Nvb3JkSWQ6akMobiksYWxsQ29vcmRJZHM6YSxjb250YWluc1BvaW50OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbi5jb29yZGluYXRlU3lzdGVtLmNvbnRhaW5Qb2ludChbZSxpXSl9LGRhdGFab29tSWQ6ci5pZCxkYXRhWm9vbU1vZGVsOnIsZ2V0UmFuZ2U6aX0pfSx0aGlzKX0sdGhpcyl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXshZnVuY3Rpb24odCxpKXt2YXIgZT1xQyh0KTtFKGUsZnVuY3Rpb24odCl7dC5jb250cm9sbGVyLmRpc3Bvc2UoKTt2YXIgZT10LmRhdGFab29tSW5mb3M7ZVtpXSYmKGRlbGV0ZSBlW2ldLHQuY291bnQtLSl9KSxLQyhlKX0odGhpcy5hcGksdGhpcy5kYXRhWm9vbU1vZGVsLmlkKSxRQy5zdXBlckFwcGx5KHRoaXMsImRpc3Bvc2UiLGFyZ3VtZW50cyksdGhpcy5fcmFuZ2U9bnVsbH19KSx0TD17em9vbTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10aGlzLl9yYW5nZSxhPW8uc2xpY2UoKSxyPXQuYXhpc01vZGVsc1swXTtpZihyKXt2YXIgcz1uTFtlXShudWxsLFtuLm9yaWdpblgsbi5vcmlnaW5ZXSxyLGksdCksbD0oMDxzLnNpZ25hbD9zLnBpeGVsU3RhcnQrcy5waXhlbExlbmd0aC1zLnBpeGVsOnMucGl4ZWwtcy5waXhlbFN0YXJ0KS9zLnBpeGVsTGVuZ3RoKihhWzFdLWFbMF0pK2FbMF0sdT1NYXRoLm1heCgxL24uc2NhbGUsMCk7YVswXT0oYVswXS1sKSp1K2wsYVsxXT0oYVsxXS1sKSp1K2w7dmFyIGg9dGhpcy5kYXRhWm9vbU1vZGVsLmZpbmRSZXByZXNlbnRhdGl2ZUF4aXNQcm94eSgpLmdldE1pbk1heFNwYW4oKTtyZXR1cm4gV3coMCxhLFswLDEwMF0sMCxoLm1pblNwYW4saC5tYXhTcGFuKSx0aGlzLl9yYW5nZT1hLG9bMF0hPT1hWzBdfHxvWzFdIT09YVsxXT9hOnZvaWQgMH19LHBhbjplTChmdW5jdGlvbih0LGUsaSxuLG8sYSl7dmFyIHI9bkxbbl0oW2Eub2xkWCxhLm9sZFldLFthLm5ld1gsYS5uZXdZXSxlLG8saSk7cmV0dXJuIHIuc2lnbmFsKih0WzFdLXRbMF0pKnIucGl4ZWwvci5waXhlbExlbmd0aH0pLHNjcm9sbE1vdmU6ZUwoZnVuY3Rpb24odCxlLGksbixvLGEpe3JldHVybiBuTFtuXShbMCwwXSxbYS5zY3JvbGxEZWx0YSxhLnNjcm9sbERlbHRhXSxlLG8saSkuc2lnbmFsKih0WzFdLXRbMF0pKmEuc2Nyb2xsRGVsdGF9KX07ZnVuY3Rpb24gZUwobCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXRoaXMuX3JhbmdlLGE9by5zbGljZSgpLHI9dC5heGlzTW9kZWxzWzBdO2lmKHIpe3ZhciBzPWwoYSxyLHQsZSxpLG4pO3JldHVybiBXdyhzLGEsWzAsMTAwXSwiYWxsIiksdGhpcy5fcmFuZ2U9YSxvWzBdIT09YVswXXx8b1sxXSE9PWFbMV0/YTp2b2lkIDB9fX1mdW5jdGlvbiBpTCh0KXt2YXIgZT10JiZ0LnZpc3VhbE1hcDtrKGUpfHwoZT1lP1tlXTpbXSksb0woZSxmdW5jdGlvbih0KXtpZih0KXthTCh0LCJzcGxpdExpc3QiKSYmIWFMKHQsInBpZWNlcyIpJiYodC5waWVjZXM9dC5zcGxpdExpc3QsZGVsZXRlIHQuc3BsaXRMaXN0KTt2YXIgZT10LnBpZWNlcztlJiZrKGUpJiZvTChlLGZ1bmN0aW9uKHQpe1IodCkmJihhTCh0LCJzdGFydCIpJiYhYUwodCwibWluIikmJih0Lm1pbj10LnN0YXJ0KSxhTCh0LCJlbmQiKSYmIWFMKHQsIm1heCIpJiYodC5tYXg9dC5lbmQpKX0pfX0pfXZhciBuTD17Z3JpZDpmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBhPWkuYXhpcyxyPXt9LHM9by5tb2RlbC5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKTtyZXR1cm4gdD10fHxbMCwwXSwieCI9PT1hLmRpbT8oci5waXhlbD1lWzBdLXRbMF0sci5waXhlbExlbmd0aD1zLndpZHRoLHIucGl4ZWxTdGFydD1zLngsci5zaWduYWw9YS5pbnZlcnNlPzE6LTEpOihyLnBpeGVsPWVbMV0tdFsxXSxyLnBpeGVsTGVuZ3RoPXMuaGVpZ2h0LHIucGl4ZWxTdGFydD1zLnksci5zaWduYWw9YS5pbnZlcnNlPy0xOjEpLHJ9LHBvbGFyOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9aS5heGlzLHI9e30scz1vLm1vZGVsLmNvb3JkaW5hdGVTeXN0ZW0sbD1zLmdldFJhZGl1c0F4aXMoKS5nZXRFeHRlbnQoKSx1PXMuZ2V0QW5nbGVBeGlzKCkuZ2V0RXh0ZW50KCk7cmV0dXJuIHQ9dD9zLnBvaW50VG9Db29yZCh0KTpbMCwwXSxlPXMucG9pbnRUb0Nvb3JkKGUpLCJyYWRpdXNBeGlzIj09PWkubWFpblR5cGU/KHIucGl4ZWw9ZVswXS10WzBdLHIucGl4ZWxMZW5ndGg9bFsxXS1sWzBdLHIucGl4ZWxTdGFydD1sWzBdLHIuc2lnbmFsPWEuaW52ZXJzZT8xOi0xKTooci5waXhlbD1lWzFdLXRbMV0sci5waXhlbExlbmd0aD11WzFdLXVbMF0sci5waXhlbFN0YXJ0PXVbMF0sci5zaWduYWw9YS5pbnZlcnNlPy0xOjEpLHJ9LHNpbmdsZUF4aXM6ZnVuY3Rpb24odCxlLGksbixvKXt2YXIgYT1pLmF4aXMscj1vLm1vZGVsLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0UmVjdCgpLHM9e307cmV0dXJuIHQ9dHx8WzAsMF0sImhvcml6b250YWwiPT09YS5vcmllbnQ/KHMucGl4ZWw9ZVswXS10WzBdLHMucGl4ZWxMZW5ndGg9ci53aWR0aCxzLnBpeGVsU3RhcnQ9ci54LHMuc2lnbmFsPWEuaW52ZXJzZT8xOi0xKToocy5waXhlbD1lWzFdLXRbMV0scy5waXhlbExlbmd0aD1yLmhlaWdodCxzLnBpeGVsU3RhcnQ9ci55LHMuc2lnbmFsPWEuaW52ZXJzZT8tMToxKSxzfX0sb0w9RTtmdW5jdGlvbiBhTCh0LGUpe3JldHVybiB0JiZ0Lmhhc093blByb3BlcnR5JiZ0Lmhhc093blByb3BlcnR5KGUpfVR1LnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcigidmlzdWFsTWFwIixmdW5jdGlvbih0KXtyZXR1cm4gdC5jYXRlZ29yaWVzfHwodC5waWVjZXM/MDx0LnBpZWNlcy5sZW5ndGg6MDx0LnNwbGl0TnVtYmVyKSYmIXQuY2FsY3VsYWJsZT8icGllY2V3aXNlIjoiY29udGludW91cyJ9KTt2YXIgckw9SWQuVklTVUFMLkNPTVBPTkVOVDtmdW5jdGlvbiBzTCh0LGUsaSxuKXtmb3IodmFyIG89ZS50YXJnZXRWaXN1YWxzW25dLGE9YV8ucHJlcGFyZVZpc3VhbFR5cGVzKG8pLHI9e2NvbG9yOnQuZ2V0RGF0YSgpLmdldFZpc3VhbCgiY29sb3IiKX0scz0wLGw9YS5sZW5ndGg7czxsO3MrKyl7dmFyIHU9YVtzXSxoPW9bIm9wYWNpdHkiPT09dT8iX19hbHBoYUZvck9wYWNpdHkiOnVdO2gmJmguYXBwbHlWaXN1YWwoaSxjLGQpfXJldHVybiByLmNvbG9yO2Z1bmN0aW9uIGModCl7cmV0dXJuIHJbdF19ZnVuY3Rpb24gZCh0LGUpe3JbdF09ZX19eWYockwse2NyZWF0ZU9uQWxsU2VyaWVzOiEwLHJlc2V0OmZ1bmN0aW9uKGksdCl7dmFyIG49W107cmV0dXJuIHQuZWFjaENvbXBvbmVudCgidmlzdWFsTWFwIixmdW5jdGlvbih0KXt2YXIgZT1pLnBpcGVsaW5lQ29udGV4dDshdC5pc1RhcmdldFNlcmllcyhpKXx8ZSYmZS5sYXJnZXx8bi5wdXNoKGZ1bmN0aW9uKHQsZixwLGcpe3ZhciBtPXt9O3JldHVybiBFKHQsZnVuY3Rpb24odCl7dmFyIGU9YV8ucHJlcGFyZVZpc3VhbFR5cGVzKGZbdF0pO21bdF09ZX0pLHtwcm9ncmVzczpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGkuZ2V0SXRlbVZpc3VhbChvLHQpfWZ1bmN0aW9uIG4odCxlKXtpLnNldEl0ZW1WaXN1YWwobyx0LGUpfXZhciBvO2ZvcihudWxsIT1nJiYoZz1pLmdldERpbWVuc2lvbihnKSk7bnVsbCE9KG89dC5uZXh0KCkpOyl7dmFyIGE9aS5nZXRSYXdEYXRhSXRlbShvKTtpZighYXx8ITEhPT1hLnZpc3VhbE1hcClmb3IodmFyIHI9bnVsbCE9Zz9pLmdldChnLG8sITApOm8scz1wKHIpLGw9ZltzXSx1PW1bc10saD0wLGM9dS5sZW5ndGg7aDxjO2grKyl7dmFyIGQ9dVtoXTtsW2RdJiZsW2RdLmFwcGx5VmlzdWFsKHIsZSxuKX19fX19KHQuc3RhdGVMaXN0LHQudGFyZ2V0VmlzdWFscyxBKHQuZ2V0VmFsdWVTdGF0ZSx0KSx0LmdldERhdGFEaW1lbnNpb24oaS5nZXREYXRhKCkpKSl9KSxufX0pLHlmKHJMLHtjcmVhdGVPbkFsbFNlcmllczohMCxyZXNldDpmdW5jdGlvbihvLHQpe3ZhciBhPW8uZ2V0RGF0YSgpLHI9W107dC5lYWNoQ29tcG9uZW50KCJ2aXN1YWxNYXAiLGZ1bmN0aW9uKHQpe2lmKHQuaXNUYXJnZXRTZXJpZXMobykpe3ZhciBlPXQuZ2V0VmlzdWFsTWV0YShBKHNMLG51bGwsbyx0KSl8fHtzdG9wczpbXSxvdXRlckNvbG9yczpbXX0saT10LmdldERhdGFEaW1lbnNpb24oYSksbj1hLmdldERpbWVuc2lvbkluZm8oaSk7bnVsbCE9biYmKGUuZGltZW5zaW9uPW4uaW5kZXgsci5wdXNoKGUpKX19KSxvLmdldERhdGEoKS5zZXRWaXN1YWwoInZpc3VhbE1ldGEiLHIpfX0pO3ZhciBsTD1mdW5jdGlvbih0LGUsaSl7dmFyIG49RCgodUxbdF18fHt9KVtlXSk7cmV0dXJuIGkmJmsobik/bltuLmxlbmd0aC0xXTpufSx1TD17Y29sb3I6e2FjdGl2ZTpbIiMwMDZlZGQiLCIjZTBmZmZmIl0saW5hY3RpdmU6WyJyZ2JhKDAsMCwwLDApIl19LGNvbG9ySHVlOnthY3RpdmU6WzAsMzYwXSxpbmFjdGl2ZTpbMCwwXX0sY29sb3JTYXR1cmF0aW9uOnthY3RpdmU6Wy4zLDFdLGluYWN0aXZlOlswLDBdfSxjb2xvckxpZ2h0bmVzczp7YWN0aXZlOlsuOSwuNV0saW5hY3RpdmU6WzAsMF19LGNvbG9yQWxwaGE6e2FjdGl2ZTpbLjMsMV0saW5hY3RpdmU6WzAsMF19LG9wYWNpdHk6e2FjdGl2ZTpbLjMsMV0saW5hY3RpdmU6WzAsMF19LHN5bWJvbDp7YWN0aXZlOlsiY2lyY2xlIiwicm91bmRSZWN0IiwiZGlhbW9uZCJdLGluYWN0aXZlOlsibm9uZSJdfSxzeW1ib2xTaXplOnthY3RpdmU6WzEwLDUwXSxpbmFjdGl2ZTpbMCwwXX19LGhMPWFfLm1hcFZpc3VhbCxjTD1hXy5lYWNoVmlzdWFsLGRMPWssZkw9RSxwTD1PbCxnTD1rbCxtTD13Zih7dHlwZToidmlzdWFsTWFwIixkZXBlbmRlbmNpZXM6WyJzZXJpZXMiXSxzdGF0ZUxpc3Q6WyJpblJhbmdlIiwib3V0T2ZSYW5nZSJdLHJlcGxhY2FibGVPcHRpb25LZXlzOlsiaW5SYW5nZSIsIm91dE9mUmFuZ2UiLCJ0YXJnZXQiLCJjb250cm9sbGVyIiwiY29sb3IiXSxkYXRhQm91bmQ6Wy0xLzAsMS8wXSxsYXlvdXRNb2RlOnt0eXBlOiJib3giLGlnbm9yZVNpemU6ITB9LGRlZmF1bHRPcHRpb246e3Nob3c6ITAsemxldmVsOjAsejo0LHNlcmllc0luZGV4OiJhbGwiLG1pbjowLG1heDoyMDAsZGltZW5zaW9uOm51bGwsaW5SYW5nZTpudWxsLG91dE9mUmFuZ2U6bnVsbCxsZWZ0OjAscmlnaHQ6bnVsbCx0b3A6bnVsbCxib3R0b206MCxpdGVtV2lkdGg6bnVsbCxpdGVtSGVpZ2h0Om51bGwsaW52ZXJzZTohMSxvcmllbnQ6InZlcnRpY2FsIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJvcmRlckNvbG9yOiIjY2NjIixjb250ZW50Q29sb3I6IiM1NzkzZjMiLGluYWN0aXZlQ29sb3I6IiNhYWEiLGJvcmRlcldpZHRoOjAscGFkZGluZzo1LHRleHRHYXA6MTAscHJlY2lzaW9uOjAsY29sb3I6bnVsbCxmb3JtYXR0ZXI6bnVsbCx0ZXh0Om51bGwsdGV4dFN0eWxlOntjb2xvcjoiIzMzMyJ9fSxpbml0OmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9kYXRhRXh0ZW50LHRoaXMudGFyZ2V0VmlzdWFscz17fSx0aGlzLmNvbnRyb2xsZXJWaXN1YWxzPXt9LHRoaXMudGV4dFN0eWxlTW9kZWwsdGhpcy5pdGVtU2l6ZSx0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsaSl9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbjt2LmNhbnZhc1N1cHBvcnRlZHx8KGkucmVhbHRpbWU9ITEpLGV8fHZEKGksdCx0aGlzLnJlcGxhY2FibGVPcHRpb25LZXlzKSx0aGlzLnRleHRTdHlsZU1vZGVsPXRoaXMuZ2V0TW9kZWwoInRleHRTdHlsZSIpLHRoaXMucmVzZXRJdGVtU2l6ZSgpLHRoaXMuY29tcGxldGVWaXN1YWxPcHRpb24oKX0scmVzZXRWaXN1YWw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdGF0ZUxpc3Q7dD1BKHQsdGhpcyksdGhpcy5jb250cm9sbGVyVmlzdWFscz1tRCh0aGlzLm9wdGlvbi5jb250cm9sbGVyLGUsdCksdGhpcy50YXJnZXRWaXN1YWxzPW1EKHRoaXMub3B0aW9uLnRhcmdldCxlLHQpfSxnZXRUYXJnZXRTZXJpZXNJbmRpY2VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb24uc2VyaWVzSW5kZXgsaT1bXTtyZXR1cm4gbnVsbD09dHx8ImFsbCI9PT10P3RoaXMuZWNNb2RlbC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQsZSl7aS5wdXNoKGUpfSk6aT1Fbyh0KSxpfSxlYWNoVGFyZ2V0U2VyaWVzOmZ1bmN0aW9uKGUsaSl7RSh0aGlzLmdldFRhcmdldFNlcmllc0luZGljZXMoKSxmdW5jdGlvbih0KXtlLmNhbGwoaSx0aGlzLmVjTW9kZWwuZ2V0U2VyaWVzQnlJbmRleCh0KSl9LHRoaXMpfSxpc1RhcmdldFNlcmllczpmdW5jdGlvbihlKXt2YXIgaT0hMTtyZXR1cm4gdGhpcy5lYWNoVGFyZ2V0U2VyaWVzKGZ1bmN0aW9uKHQpe3Q9PT1lJiYoaT0hMCl9KSxpfSxmb3JtYXRWYWx1ZVRleHQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8sYT10aGlzLm9wdGlvbixyPWEucHJlY2lzaW9uLHM9dGhpcy5kYXRhQm91bmQsbD1hLmZvcm1hdHRlcjtyZXR1cm4gaT1pfHxbIjwiLCI+Il0sayh0KSYmKHQ9dC5zbGljZSgpLG49ITApLG89ZT90Om4/W3UodFswXSksdSh0WzFdKV06dSh0KSx6KGwpP2wucmVwbGFjZSgie3ZhbHVlfSIsbj9vWzBdOm8pLnJlcGxhY2UoInt2YWx1ZTJ9IixuP29bMV06byk6TyhsKT9uP2wodFswXSx0WzFdKTpsKHQpOm4/dFswXT09PXNbMF0/aVswXSsiICIrb1sxXTp0WzFdPT09c1sxXT9pWzFdKyIgIitvWzBdOm9bMF0rIiAtICIrb1sxXTpvO2Z1bmN0aW9uIHUodCl7cmV0dXJuIHQ9PT1zWzBdPyJtaW4iOnQ9PT1zWzFdPyJtYXgiOigrdCkudG9GaXhlZChNYXRoLm1pbihyLDIwKSl9fSxyZXNldEV4dGVudDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLGU9cEwoW3QubWluLHQubWF4XSk7dGhpcy5fZGF0YUV4dGVudD1lfSxnZXREYXRhRGltZW5zaW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLmRpbWVuc2lvbixpPXQuZGltZW5zaW9ucztpZihudWxsIT1lfHxpLmxlbmd0aCl7aWYobnVsbCE9ZSlyZXR1cm4gdC5nZXREaW1lbnNpb24oZSk7Zm9yKHZhciBuPXQuZGltZW5zaW9ucyxvPW4ubGVuZ3RoLTE7MDw9bztvLS0pe3ZhciBhPW5bb107aWYoIXQuZ2V0RGltZW5zaW9uSW5mbyhhKS5pc0NhbGN1bGF0aW9uQ29vcmQpcmV0dXJuIGF9fX0sZ2V0RXh0ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFFeHRlbnQuc2xpY2UoKX0sY29tcGxldGVWaXN1YWxPcHRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVjTW9kZWwsZT10aGlzLm9wdGlvbixpPXtpblJhbmdlOmUuaW5SYW5nZSxvdXRPZlJhbmdlOmUub3V0T2ZSYW5nZX0sbj1lLnRhcmdldHx8KGUudGFyZ2V0PXt9KSxvPWUuY29udHJvbGxlcnx8KGUuY29udHJvbGxlcj17fSk7bShuLGkpLG0obyxpKTt2YXIgdT10aGlzLmlzQ2F0ZWdvcnkoKTtmdW5jdGlvbiBhKG4pe2RMKGUuY29sb3IpJiYhbi5pblJhbmdlJiYobi5pblJhbmdlPXtjb2xvcjplLmNvbG9yLnNsaWNlKCkucmV2ZXJzZSgpfSksbi5pblJhbmdlPW4uaW5SYW5nZXx8e2NvbG9yOnQuZ2V0KCJncmFkaWVudENvbG9yIil9LGZMKHRoaXMuc3RhdGVMaXN0LGZ1bmN0aW9uKHQpe3ZhciBlPW5bdF07aWYoeihlKSl7dmFyIGk9bEwoZSwiYWN0aXZlIix1KTtpPyhuW3RdPXt9LG5bdF1bZV09aSk6ZGVsZXRlIG5bdF19fSx0aGlzKX1hLmNhbGwodGhpcyxuKSxhLmNhbGwodGhpcyxvKSxmdW5jdGlvbih0LGUsaSl7dmFyIG49dFtlXSxvPXRbaV07biYmIW8mJihvPXRbaV09e30sZkwobixmdW5jdGlvbih0LGUpe2lmKGFfLmlzVmFsaWRUeXBlKGUpKXt2YXIgaT1sTChlLCJpbmFjdGl2ZSIsdSk7bnVsbCE9aSYmKG9bZV09aSwiY29sb3IiIT09ZXx8by5oYXNPd25Qcm9wZXJ0eSgib3BhY2l0eSIpfHxvLmhhc093blByb3BlcnR5KCJjb2xvckFscGhhIil8fChvLm9wYWNpdHk9WzAsMF0pKX19KSl9LmNhbGwodGhpcyxuLCJpblJhbmdlIiwib3V0T2ZSYW5nZSIpLGZ1bmN0aW9uKGEpe3ZhciByPShhLmluUmFuZ2V8fHt9KS5zeW1ib2x8fChhLm91dE9mUmFuZ2V8fHt9KS5zeW1ib2wscz0oYS5pblJhbmdlfHx7fSkuc3ltYm9sU2l6ZXx8KGEub3V0T2ZSYW5nZXx8e30pLnN5bWJvbFNpemUsbD10aGlzLmdldCgiaW5hY3RpdmVDb2xvciIpO2ZMKHRoaXMuc3RhdGVMaXN0LGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaXRlbVNpemUsaT1hW3RdO251bGw9PShpPWl8fChhW3RdPXtjb2xvcjp1P2w6W2xdfSkpLnN5bWJvbCYmKGkuc3ltYm9sPXImJkQocil8fCh1PyJyb3VuZFJlY3QiOlsicm91bmRSZWN0Il0pKSxudWxsPT1pLnN5bWJvbFNpemUmJihpLnN5bWJvbFNpemU9cyYmRChzKXx8KHU/ZVswXTpbZVswXSxlWzBdXSkpLGkuc3ltYm9sPWhMKGkuc3ltYm9sLGZ1bmN0aW9uKHQpe3JldHVybiJub25lIj09PXR8fCJzcXVhcmUiPT09dD8icm91bmRSZWN0Ijp0fSk7dmFyIG49aS5zeW1ib2xTaXplO2lmKG51bGwhPW4pe3ZhciBvPS0xLzA7Y0wobixmdW5jdGlvbih0KXtvPHQmJihvPXQpfSksaS5zeW1ib2xTaXplPWhMKG4sZnVuY3Rpb24odCl7cmV0dXJuIGdMKHQsWzAsb10sWzAsZVswXV0sITApfSl9fSx0aGlzKX0uY2FsbCh0aGlzLG8pfSxyZXNldEl0ZW1TaXplOmZ1bmN0aW9uKCl7dGhpcy5pdGVtU2l6ZT1bcGFyc2VGbG9hdCh0aGlzLmdldCgiaXRlbVdpZHRoIikpLHBhcnNlRmxvYXQodGhpcy5nZXQoIml0ZW1IZWlnaHQiKSldfSxpc0NhdGVnb3J5OmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLm9wdGlvbi5jYXRlZ29yaWVzfSxzZXRTZWxlY3RlZDpldCxnZXRWYWx1ZVN0YXRlOmV0LGdldFZpc3VhbE1ldGE6ZXR9KSx2TD1bMjAsMTQwXSx5TD1tTC5leHRlbmQoe3R5cGU6InZpc3VhbE1hcC5jb250aW51b3VzIixkZWZhdWx0T3B0aW9uOnthbGlnbjoiYXV0byIsY2FsY3VsYWJsZTohMSxyYW5nZTpudWxsLHJlYWx0aW1lOiEwLGl0ZW1IZWlnaHQ6bnVsbCxpdGVtV2lkdGg6bnVsbCxob3Zlckxpbms6ITAsaG92ZXJMaW5rRGF0YVNpemU6bnVsbCxob3ZlckxpbmtPbkhhbmRsZTpudWxsfSxvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKHQsZSl7eUwuc3VwZXJBcHBseSh0aGlzLCJvcHRpb25VcGRhdGVkIixhcmd1bWVudHMpLHRoaXMucmVzZXRFeHRlbnQoKSx0aGlzLnJlc2V0VmlzdWFsKGZ1bmN0aW9uKHQpe3QubWFwcGluZ01ldGhvZD0ibGluZWFyIix0LmRhdGFFeHRlbnQ9dGhpcy5nZXRFeHRlbnQoKX0pLHRoaXMuX3Jlc2V0UmFuZ2UoKX0scmVzZXRJdGVtU2l6ZTpmdW5jdGlvbigpe3lMLnN1cGVyQXBwbHkodGhpcywicmVzZXRJdGVtU2l6ZSIsYXJndW1lbnRzKTt2YXIgdD10aGlzLml0ZW1TaXplOyJob3Jpem9udGFsIj09PXRoaXMuX29yaWVudCYmdC5yZXZlcnNlKCksbnVsbCE9dFswXSYmIWlzTmFOKHRbMF0pfHwodFswXT12TFswXSksbnVsbCE9dFsxXSYmIWlzTmFOKHRbMV0pfHwodFsxXT12TFsxXSl9LF9yZXNldFJhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFeHRlbnQoKSxlPXRoaXMub3B0aW9uLnJhbmdlOyFlfHxlLmF1dG8/KHQuYXV0bz0xLHRoaXMub3B0aW9uLnJhbmdlPXQpOmsoZSkmJihlWzBdPmVbMV0mJmUucmV2ZXJzZSgpLGVbMF09TWF0aC5tYXgoZVswXSx0WzBdKSxlWzFdPU1hdGgubWluKGVbMV0sdFsxXSkpfSxjb21wbGV0ZVZpc3VhbE9wdGlvbjpmdW5jdGlvbigpe21MLnByb3RvdHlwZS5jb21wbGV0ZVZpc3VhbE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksRSh0aGlzLnN0YXRlTGlzdCxmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbi5jb250cm9sbGVyW3RdLnN5bWJvbFNpemU7ZSYmZVswXSE9PWVbMV0mJihlWzBdPTApfSx0aGlzKX0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24ucmFuZ2U9dC5zbGljZSgpLHRoaXMuX3Jlc2V0UmFuZ2UoKX0sZ2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEV4dGVudCgpLGU9T2woKHRoaXMuZ2V0KCJyYW5nZSIpfHxbXSkuc2xpY2UoKSk7cmV0dXJuIGVbMF0+dFsxXSYmKGVbMF09dFsxXSksZVsxXT50WzFdJiYoZVsxXT10WzFdKSxlWzBdPHRbMF0mJihlWzBdPXRbMF0pLGVbMV08dFswXSYmKGVbMV09dFswXSksZX0sZ2V0VmFsdWVTdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbi5yYW5nZSxpPXRoaXMuZ2V0RXh0ZW50KCk7cmV0dXJuKGVbMF08PWlbMF18fGVbMF08PXQpJiYoZVsxXT49aVsxXXx8dDw9ZVsxXSk/ImluUmFuZ2UiOiJvdXRPZlJhbmdlIn0sZmluZFRhcmdldERhdGFJbmRpY2VzOmZ1bmN0aW9uKG4pe3ZhciBvPVtdO3JldHVybiB0aGlzLmVhY2hUYXJnZXRTZXJpZXMoZnVuY3Rpb24odCl7dmFyIGk9W10sZT10LmdldERhdGEoKTtlLmVhY2godGhpcy5nZXREYXRhRGltZW5zaW9uKGUpLGZ1bmN0aW9uKHQsZSl7blswXTw9dCYmdDw9blsxXSYmaS5wdXNoKGUpfSx0aGlzKSxvLnB1c2goe3Nlcmllc0lkOnQuaWQsZGF0YUluZGV4Oml9KX0sdGhpcyksb30sZ2V0VmlzdWFsTWV0YTpmdW5jdGlvbihpKXt2YXIgdD14TCh0aGlzLCJvdXRPZlJhbmdlIix0aGlzLmdldEV4dGVudCgpKSxlPXhMKHRoaXMsImluUmFuZ2UiLHRoaXMub3B0aW9uLnJhbmdlLnNsaWNlKCkpLG49W107ZnVuY3Rpb24gbyh0LGUpe24ucHVzaCh7dmFsdWU6dCxjb2xvcjppKHQsZSl9KX1mb3IodmFyIGE9MCxyPTAscz1lLmxlbmd0aCxsPXQubGVuZ3RoO3I8bCYmKCFlLmxlbmd0aHx8dFtyXTw9ZVswXSk7cisrKXRbcl08ZVthXSYmbyh0W3JdLCJvdXRPZlJhbmdlIik7Zm9yKHZhciB1PTE7YTxzO2ErKyx1PTApdSYmbi5sZW5ndGgmJm8oZVthXSwib3V0T2ZSYW5nZSIpLG8oZVthXSwiaW5SYW5nZSIpO2Zvcih1PTE7cjxsO3IrKykoIWUubGVuZ3RofHxlW2UubGVuZ3RoLTFdPHRbcl0pJiYodSYmKG4ubGVuZ3RoJiZvKG5bbi5sZW5ndGgtMV0udmFsdWUsIm91dE9mUmFuZ2UiKSx1PTApLG8odFtyXSwib3V0T2ZSYW5nZSIpKTt2YXIgaD1uLmxlbmd0aDtyZXR1cm57c3RvcHM6bixvdXRlckNvbG9yczpbaD9uWzBdLmNvbG9yOiJ0cmFuc3BhcmVudCIsaD9uW2gtMV0uY29sb3I6InRyYW5zcGFyZW50Il19fX0pO2Z1bmN0aW9uIHhMKHQsZSxpKXtpZihpWzBdPT09aVsxXSlyZXR1cm4gaS5zbGljZSgpO2Zvcih2YXIgbj0oaVsxXS1pWzBdKS8yMDAsbz1pWzBdLGE9W10scj0wO3I8PTIwMCYmbzxpWzFdO3IrKylhLnB1c2gobyksbys9bjtyZXR1cm4gYS5wdXNoKGlbMV0pLGF9dmFyIF9MPWJmKHt0eXBlOiJ2aXN1YWxNYXAiLGF1dG9Qb3NpdGlvblZhbHVlczp7bGVmdDoxLHJpZ2h0OjEsdG9wOjEsYm90dG9tOjF9LGluaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLmVjTW9kZWw9dCx0aGlzLmFwaT1lLHRoaXMudmlzdWFsTWFwTW9kZWx9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXshMSE9PSh0aGlzLnZpc3VhbE1hcE1vZGVsPXQpLmdldCgic2hvdyIpP3RoaXMuZG9SZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LHJlbmRlckJhY2tncm91bmQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aXN1YWxNYXBNb2RlbCxpPUpsKGUuZ2V0KCJwYWRkaW5nIil8fDApLG49dC5nZXRCb3VuZGluZ1JlY3QoKTt0LmFkZChuZXcgaXMoe3oyOi0xLHNpbGVudDohMCxzaGFwZTp7eDpuLngtaVszXSx5Om4ueS1pWzBdLHdpZHRoOm4ud2lkdGgraVszXStpWzFdLGhlaWdodDpuLmhlaWdodCtpWzBdK2lbMl19LHN0eWxlOntmaWxsOmUuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKSxzdHJva2U6ZS5nZXQoImJvcmRlckNvbG9yIiksbGluZVdpZHRoOmUuZ2V0KCJib3JkZXJXaWR0aCIpfX0pKX0sZ2V0Q29udHJvbGxlclZpc3VhbDpmdW5jdGlvbihpLG4sbyl7dmFyIHQ9KG89b3x8e30pLmZvcmNlU3RhdGUsZT10aGlzLnZpc3VhbE1hcE1vZGVsLGE9e307aWYoInN5bWJvbCI9PT1uJiYoYS5zeW1ib2w9ZS5nZXQoIml0ZW1TeW1ib2wiKSksImNvbG9yIj09PW4pe3ZhciByPWUuZ2V0KCJjb250ZW50Q29sb3IiKTthLmNvbG9yPXJ9ZnVuY3Rpb24gcyh0KXtyZXR1cm4gYVt0XX1mdW5jdGlvbiBsKHQsZSl7YVt0XT1lfXZhciB1PWUuY29udHJvbGxlclZpc3VhbHNbdHx8ZS5nZXRWYWx1ZVN0YXRlKGkpXTtyZXR1cm4gRShhXy5wcmVwYXJlVmlzdWFsVHlwZXModSksZnVuY3Rpb24odCl7dmFyIGU9dVt0XTtvLmNvbnZlcnRPcGFjaXR5VG9BbHBoYSYmIm9wYWNpdHkiPT09dCYmKHQ9ImNvbG9yQWxwaGEiLGU9dS5fX2FscGhhRm9yT3BhY2l0eSksYV8uZGVwZW5kc09uKHQsbikmJmUmJmUuYXBwbHlWaXN1YWwoaSxzLGwpfSksYVtuXX0scG9zaXRpb25Hcm91cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpc3VhbE1hcE1vZGVsLGk9dGhpcy5hcGk7eXUodCxlLmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDppLmdldFdpZHRoKCksaGVpZ2h0OmkuZ2V0SGVpZ2h0KCl9KX0sZG9SZW5kZXI6ZXR9KTtmdW5jdGlvbiB3TCh0LGUsaSl7dmFyIG49dC5vcHRpb24sbz1uLmFsaWduO2lmKG51bGwhPW8mJiJhdXRvIiE9PW8pcmV0dXJuIG87Zm9yKHZhciBhPXt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9LHI9Imhvcml6b250YWwiPT09bi5vcmllbnQ/MTowLHM9W1sibGVmdCIsInJpZ2h0Iiwid2lkdGgiXSxbInRvcCIsImJvdHRvbSIsImhlaWdodCJdXSxsPXNbcl0sdT1bMCxudWxsLDEwXSxoPXt9LGM9MDtjPDM7YysrKWhbc1sxLXJdW2NdXT11W2NdLGhbbFtjXV09Mj09PWM/aVswXTpuW2xbY11dO3ZhciBkPVtbIngiLCJ3aWR0aCIsM10sWyJ5IiwiaGVpZ2h0IiwwXV1bcl0sZj12dShoLGEsbi5wYWRkaW5nKTtyZXR1cm4gbFsoZi5tYXJnaW5bZFsyXV18fDApK2ZbZFswXV0rLjUqZltkWzFdXTwuNSphW2RbMV1dPzA6MV19ZnVuY3Rpb24gYkwodCxlKXtyZXR1cm4gRSh0fHxbXSxmdW5jdGlvbih0KXtudWxsIT10LmRhdGFJbmRleCYmKHQuZGF0YUluZGV4SW5zaWRlPXQuZGF0YUluZGV4LHQuZGF0YUluZGV4PW51bGwpLHQuaGlnaGxpZ2h0S2V5PSJ2aXN1YWxNYXAiKyhlP2UuY29tcG9uZW50SW5kZXg6IiIpfSksdH12YXIgU0w9a2wsTUw9RSxJTD1NYXRoLm1pbixUTD1NYXRoLm1heCxBTD1fTC5leHRlbmQoe3R5cGU6InZpc3VhbE1hcC5jb250aW51b3VzIixpbml0OmZ1bmN0aW9uKCl7QUwuc3VwZXJBcHBseSh0aGlzLCJpbml0Iixhcmd1bWVudHMpLHRoaXMuX3NoYXBlcz17fSx0aGlzLl9kYXRhSW50ZXJ2YWw9W10sdGhpcy5faGFuZGxlRW5kcz1bXSx0aGlzLl9vcmllbnQsdGhpcy5fdXNlSGFuZGxlLHRoaXMuX2hvdmVyTGlua0RhdGFJbmRpY2VzPVtdLHRoaXMuX2RyYWdnaW5nLHRoaXMuX2hvdmVyaW5nfSxkb1JlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXtuJiYic2VsZWN0RGF0YVJhbmdlIj09PW4udHlwZSYmbi5mcm9tPT09dGhpcy51aWR8fHRoaXMuX2J1aWxkVmlldygpfSxfYnVpbGRWaWV3OmZ1bmN0aW9uKCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgdD10aGlzLnZpc3VhbE1hcE1vZGVsLGU9dGhpcy5ncm91cDt0aGlzLl9vcmllbnQ9dC5nZXQoIm9yaWVudCIpLHRoaXMuX3VzZUhhbmRsZT10LmdldCgiY2FsY3VsYWJsZSIpLHRoaXMuX3Jlc2V0SW50ZXJ2YWwoKSx0aGlzLl9yZW5kZXJCYXIoZSk7dmFyIGk9dC5nZXQoInRleHQiKTt0aGlzLl9yZW5kZXJFbmRzVGV4dChlLGksMCksdGhpcy5fcmVuZGVyRW5kc1RleHQoZSxpLDEpLHRoaXMuX3VwZGF0ZVZpZXcoITApLHRoaXMucmVuZGVyQmFja2dyb3VuZChlKSx0aGlzLl91cGRhdGVWaWV3KCksdGhpcy5fZW5hYmxlSG92ZXJMaW5rVG9TZXJpZXMoKSx0aGlzLl9lbmFibGVIb3ZlckxpbmtGcm9tU2VyaWVzKCksdGhpcy5wb3NpdGlvbkdyb3VwKGUpfSxfcmVuZGVyRW5kc1RleHQ6ZnVuY3Rpb24odCxlLGkpe2lmKGUpe3ZhciBuPWVbMS1pXTtuPW51bGwhPW4/bisiIjoiIjt2YXIgbz10aGlzLnZpc3VhbE1hcE1vZGVsLGE9by5nZXQoInRleHRHYXAiKSxyPW8uaXRlbVNpemUscz10aGlzLl9zaGFwZXMuYmFyR3JvdXAsbD10aGlzLl9hcHBseVRyYW5zZm9ybShbclswXS8yLDA9PT1pPy1hOnJbMV0rYV0scyksdT10aGlzLl9hcHBseVRyYW5zZm9ybSgwPT09aT8iYm90dG9tIjoidG9wIixzKSxoPXRoaXMuX29yaWVudCxjPXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWw7dGhpcy5ncm91cC5hZGQobmV3IEZyKHtzdHlsZTp7eDpsWzBdLHk6bFsxXSx0ZXh0VmVydGljYWxBbGlnbjoiaG9yaXpvbnRhbCI9PT1oPyJtaWRkbGUiOnUsdGV4dEFsaWduOiJob3Jpem9udGFsIj09PWg/dToiY2VudGVyIix0ZXh0Om4sdGV4dEZvbnQ6Yy5nZXRGb250KCksdGV4dEZpbGw6Yy5nZXRUZXh0Q29sb3IoKX19KSl9fSxfcmVuZGVyQmFyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWwsaT10aGlzLl9zaGFwZXMsbj1lLml0ZW1TaXplLG89dGhpcy5fb3JpZW50LGE9dGhpcy5fdXNlSGFuZGxlLHI9d0woZSx0aGlzLmFwaSxuKSxzPWkuYmFyR3JvdXA9dGhpcy5fY3JlYXRlQmFyR3JvdXAocik7cy5hZGQoaS5vdXRPZlJhbmdlPURMKCkpLHMuYWRkKGkuaW5SYW5nZT1ETChudWxsLGE/TEwodGhpcy5fb3JpZW50KTpudWxsLEEodGhpcy5fZHJhZ0hhbmRsZSx0aGlzLCJhbGwiLCExKSxBKHRoaXMuX2RyYWdIYW5kbGUsdGhpcywiYWxsIiwhMCkpKTt2YXIgbD1lLnRleHRTdHlsZU1vZGVsLmdldFRleHRSZWN0KCLlm70iKSx1PVRMKGwud2lkdGgsbC5oZWlnaHQpO2EmJihpLmhhbmRsZVRodW1icz1bXSxpLmhhbmRsZUxhYmVscz1bXSxpLmhhbmRsZUxhYmVsUG9pbnRzPVtdLHRoaXMuX2NyZWF0ZUhhbmRsZShzLDAsbix1LG8sciksdGhpcy5fY3JlYXRlSGFuZGxlKHMsMSxuLHUsbyxyKSksdGhpcy5fY3JlYXRlSW5kaWNhdG9yKHMsbix1LG8pLHQuYWRkKHMpfSxfY3JlYXRlSGFuZGxlOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIGE9QSh0aGlzLl9kcmFnSGFuZGxlLHRoaXMsZSwhMSkscj1BKHRoaXMuX2RyYWdIYW5kbGUsdGhpcyxlLCEwKSxzPURMKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PT10P1tbMCwwXSxbZSwwXSxbZSwtZV1dOltbMCwwXSxbZSwwXSxbZSxlXV19KGUsbiksTEwodGhpcy5fb3JpZW50KSxhLHIpO3MucG9zaXRpb25bMF09aVswXSx0LmFkZChzKTt2YXIgbD10aGlzLnZpc3VhbE1hcE1vZGVsLnRleHRTdHlsZU1vZGVsLHU9bmV3IEZyKHtkcmFnZ2FibGU6ITAsZHJpZnQ6YSxvbm1vdXNlbW92ZTpmdW5jdGlvbih0KXtXdCh0LmV2ZW50KX0sb25kcmFnZW5kOnIsc3R5bGU6e3g6MCx5OjAsdGV4dDoiIix0ZXh0Rm9udDpsLmdldEZvbnQoKSx0ZXh0RmlsbDpsLmdldFRleHRDb2xvcigpfX0pO3RoaXMuZ3JvdXAuYWRkKHUpO3ZhciBoPVsiaG9yaXpvbnRhbCI9PT1vP24vMjoxLjUqbiwiaG9yaXpvbnRhbCI9PT1vPzA9PT1lPy0xLjUqbjoxLjUqbjowPT09ZT8tbi8yOm4vMl0sYz10aGlzLl9zaGFwZXM7Yy5oYW5kbGVUaHVtYnNbZV09cyxjLmhhbmRsZUxhYmVsUG9pbnRzW2VdPWgsYy5oYW5kbGVMYWJlbHNbZV09dX0sX2NyZWF0ZUluZGljYXRvcjpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1ETChbWzAsMF1dLCJtb3ZlIik7by5wb3NpdGlvblswXT1lWzBdLG8uYXR0cih7aW52aXNpYmxlOiEwLHNpbGVudDohMH0pLHQuYWRkKG8pO3ZhciBhPXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWwscj1uZXcgRnIoe3NpbGVudDohMCxpbnZpc2libGU6ITAsc3R5bGU6e3g6MCx5OjAsdGV4dDoiIix0ZXh0Rm9udDphLmdldEZvbnQoKSx0ZXh0RmlsbDphLmdldFRleHRDb2xvcigpfX0pO3RoaXMuZ3JvdXAuYWRkKHIpO3ZhciBzPVsiaG9yaXpvbnRhbCI9PT1uP2kvMjo5LDBdLGw9dGhpcy5fc2hhcGVzO2wuaW5kaWNhdG9yPW8sbC5pbmRpY2F0b3JMYWJlbD1yLGwuaW5kaWNhdG9yTGFiZWxQb2ludD1zfSxfZHJhZ0hhbmRsZTpmdW5jdGlvbih0LGUsaSxuKXtpZih0aGlzLl91c2VIYW5kbGUpe2lmKHRoaXMuX2RyYWdnaW5nPSFlLCFlKXt2YXIgbz10aGlzLl9hcHBseVRyYW5zZm9ybShbaSxuXSx0aGlzLl9zaGFwZXMuYmFyR3JvdXAsITApO3RoaXMuX3VwZGF0ZUludGVydmFsKHQsb1sxXSksdGhpcy5fdXBkYXRlVmlldygpfWU9PT0hdGhpcy52aXN1YWxNYXBNb2RlbC5nZXQoInJlYWx0aW1lIikmJnRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJzZWxlY3REYXRhUmFuZ2UiLGZyb206dGhpcy51aWQsdmlzdWFsTWFwSWQ6dGhpcy52aXN1YWxNYXBNb2RlbC5pZCxzZWxlY3RlZDp0aGlzLl9kYXRhSW50ZXJ2YWwuc2xpY2UoKX0pLGU/dGhpcy5faG92ZXJpbmd8fHRoaXMuX2NsZWFySG92ZXJMaW5rVG9TZXJpZXMoKTpDTCh0aGlzLnZpc3VhbE1hcE1vZGVsKSYmdGhpcy5fZG9Ib3ZlckxpbmtUb1Nlcmllcyh0aGlzLl9oYW5kbGVFbmRzW3RdLCExKX19LF9yZXNldEludGVydmFsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aXN1YWxNYXBNb2RlbCxlPXRoaXMuX2RhdGFJbnRlcnZhbD10LmdldFNlbGVjdGVkKCksaT10LmdldEV4dGVudCgpLG49WzAsdC5pdGVtU2l6ZVsxXV07dGhpcy5faGFuZGxlRW5kcz1bU0woZVswXSxpLG4sITApLFNMKGVbMV0saSxuLCEwKV19LF91cGRhdGVJbnRlcnZhbDpmdW5jdGlvbih0LGUpe2U9ZXx8MDt2YXIgaT10aGlzLnZpc3VhbE1hcE1vZGVsLG49dGhpcy5faGFuZGxlRW5kcyxvPVswLGkuaXRlbVNpemVbMV1dO1d3KGUsbixvLHQsMCk7dmFyIGE9aS5nZXRFeHRlbnQoKTt0aGlzLl9kYXRhSW50ZXJ2YWw9W1NMKG5bMF0sbyxhLCEwKSxTTChuWzFdLG8sYSwhMCldfSxfdXBkYXRlVmlldzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpc3VhbE1hcE1vZGVsLGk9ZS5nZXRFeHRlbnQoKSxuPXRoaXMuX3NoYXBlcyxvPVswLGUuaXRlbVNpemVbMV1dLGE9dD9vOnRoaXMuX2hhbmRsZUVuZHMscj10aGlzLl9jcmVhdGVCYXJWaXN1YWwodGhpcy5fZGF0YUludGVydmFsLGksYSwiaW5SYW5nZSIpLHM9dGhpcy5fY3JlYXRlQmFyVmlzdWFsKGksaSxvLCJvdXRPZlJhbmdlIik7bi5pblJhbmdlLnNldFN0eWxlKHtmaWxsOnIuYmFyQ29sb3Isb3BhY2l0eTpyLm9wYWNpdHl9KS5zZXRTaGFwZSgicG9pbnRzIixyLmJhclBvaW50cyksbi5vdXRPZlJhbmdlLnNldFN0eWxlKHtmaWxsOnMuYmFyQ29sb3Isb3BhY2l0eTpzLm9wYWNpdHl9KS5zZXRTaGFwZSgicG9pbnRzIixzLmJhclBvaW50cyksdGhpcy5fdXBkYXRlSGFuZGxlKGEscil9LF9jcmVhdGVCYXJWaXN1YWw6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89e2ZvcmNlU3RhdGU6bixjb252ZXJ0T3BhY2l0eVRvQWxwaGE6ITB9LGE9dGhpcy5fbWFrZUNvbG9yR3JhZGllbnQodCxvKSxyPVt0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwodFswXSwic3ltYm9sU2l6ZSIsbyksdGhpcy5nZXRDb250cm9sbGVyVmlzdWFsKHRbMV0sInN5bWJvbFNpemUiLG8pXSxzPXRoaXMuX2NyZWF0ZUJhclBvaW50cyhpLHIpO3JldHVybntiYXJDb2xvcjpuZXcgY3MoMCwwLDAsMSxhKSxiYXJQb2ludHM6cyxoYW5kbGVzQ29sb3I6W2FbMF0uY29sb3IsYVthLmxlbmd0aC0xXS5jb2xvcl19fSxfbWFrZUNvbG9yR3JhZGllbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1bXSxuPSh0WzFdLXRbMF0pLzEwMDtpLnB1c2goe2NvbG9yOnRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbCh0WzBdLCJjb2xvciIsZSksb2Zmc2V0OjB9KTtmb3IodmFyIG89MTtvPDEwMDtvKyspe3ZhciBhPXRbMF0rbipvO2lmKGE+dFsxXSlicmVhaztpLnB1c2goe2NvbG9yOnRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbChhLCJjb2xvciIsZSksb2Zmc2V0Om8vMTAwfSl9cmV0dXJuIGkucHVzaCh7Y29sb3I6dGhpcy5nZXRDb250cm9sbGVyVmlzdWFsKHRbMV0sImNvbG9yIixlKSxvZmZzZXQ6MX0pLGl9LF9jcmVhdGVCYXJQb2ludHM6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnZpc3VhbE1hcE1vZGVsLml0ZW1TaXplO3JldHVybltbaVswXS1lWzBdLHRbMF1dLFtpWzBdLHRbMF1dLFtpWzBdLHRbMV1dLFtpWzBdLWVbMV0sdFsxXV1dfSxfY3JlYXRlQmFyR3JvdXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fb3JpZW50LGk9dGhpcy52aXN1YWxNYXBNb2RlbC5nZXQoImludmVyc2UiKTtyZXR1cm4gbmV3IElpKCJob3Jpem9udGFsIiE9PWV8fGk/Imhvcml6b250YWwiPT09ZSYmaT97c2NhbGU6ImJvdHRvbSI9PT10P1stMSwxXTpbMSwxXSxyb3RhdGlvbjotTWF0aC5QSS8yfToidmVydGljYWwiIT09ZXx8aT97c2NhbGU6ImxlZnQiPT09dD9bMSwxXTpbLTEsMV19OntzY2FsZToibGVmdCI9PT10P1sxLC0xXTpbLTEsLTFdfTp7c2NhbGU6ImJvdHRvbSI9PT10P1sxLDFdOlstMSwxXSxyb3RhdGlvbjpNYXRoLlBJLzJ9KX0sX3VwZGF0ZUhhbmRsZTpmdW5jdGlvbihuLG8pe2lmKHRoaXMuX3VzZUhhbmRsZSl7dmFyIGE9dGhpcy5fc2hhcGVzLHI9dGhpcy52aXN1YWxNYXBNb2RlbCxzPWEuaGFuZGxlVGh1bWJzLGw9YS5oYW5kbGVMYWJlbHM7TUwoWzAsMV0sZnVuY3Rpb24odCl7dmFyIGU9c1t0XTtlLnNldFN0eWxlKCJmaWxsIixvLmhhbmRsZXNDb2xvclt0XSksZS5wb3NpdGlvblsxXT1uW3RdO3ZhciBpPWhsKGEuaGFuZGxlTGFiZWxQb2ludHNbdF0sdWwoZSx0aGlzLmdyb3VwKSk7bFt0XS5zZXRTdHlsZSh7eDppWzBdLHk6aVsxXSx0ZXh0OnIuZm9ybWF0VmFsdWVUZXh0KHRoaXMuX2RhdGFJbnRlcnZhbFt0XSksdGV4dFZlcnRpY2FsQWxpZ246Im1pZGRsZSIsdGV4dEFsaWduOnRoaXMuX2FwcGx5VHJhbnNmb3JtKCJob3Jpem9udGFsIj09PXRoaXMuX29yaWVudD8wPT09dD8iYm90dG9tIjoidG9wIjoibGVmdCIsYS5iYXJHcm91cCl9KX0sdGhpcyl9fSxfc2hvd0luZGljYXRvcjpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10aGlzLnZpc3VhbE1hcE1vZGVsLGE9by5nZXRFeHRlbnQoKSxyPW8uaXRlbVNpemUscz1bMCxyWzFdXSxsPVNMKHQsYSxzLCEwKSx1PXRoaXMuX3NoYXBlcyxoPXUuaW5kaWNhdG9yO2lmKGgpe2gucG9zaXRpb25bMV09bCxoLmF0dHIoImludmlzaWJsZSIsITEpLGguc2V0U2hhcGUoInBvaW50cyIsZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHQ/W1swLC1JTChlLFRMKGksMCkpXSxbNiwwXSxbMCxJTChlLFRMKG4taSwwKSldXTpbWzAsMF0sWzUsLTVdLFs1LDVdXX0oISFpLG4sbCxyWzFdKSk7dmFyIGM9dGhpcy5nZXRDb250cm9sbGVyVmlzdWFsKHQsImNvbG9yIix7Y29udmVydE9wYWNpdHlUb0FscGhhOiEwfSk7aC5zZXRTdHlsZSgiZmlsbCIsYyk7dmFyIGQ9aGwodS5pbmRpY2F0b3JMYWJlbFBvaW50LHVsKGgsdGhpcy5ncm91cCkpLGY9dS5pbmRpY2F0b3JMYWJlbDtmLmF0dHIoImludmlzaWJsZSIsITEpO3ZhciBwPXRoaXMuX2FwcGx5VHJhbnNmb3JtKCJsZWZ0Iix1LmJhckdyb3VwKSxnPXRoaXMuX29yaWVudDtmLnNldFN0eWxlKHt0ZXh0OihpfHwiIikrby5mb3JtYXRWYWx1ZVRleHQoZSksdGV4dFZlcnRpY2FsQWxpZ246Imhvcml6b250YWwiPT09Zz9wOiJtaWRkbGUiLHRleHRBbGlnbjoiaG9yaXpvbnRhbCI9PT1nPyJjZW50ZXIiOnAseDpkWzBdLHk6ZFsxXX0pfX0sX2VuYWJsZUhvdmVyTGlua1RvU2VyaWVzOmZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLl9zaGFwZXMuYmFyR3JvdXAub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7aWYobi5faG92ZXJpbmc9ITAsIW4uX2RyYWdnaW5nKXt2YXIgZT1uLnZpc3VhbE1hcE1vZGVsLml0ZW1TaXplLGk9bi5fYXBwbHlUcmFuc2Zvcm0oW3Qub2Zmc2V0WCx0Lm9mZnNldFldLG4uX3NoYXBlcy5iYXJHcm91cCwhMCwhMCk7aVsxXT1JTChUTCgwLGlbMV0pLGVbMV0pLG4uX2RvSG92ZXJMaW5rVG9TZXJpZXMoaVsxXSwwPD1pWzBdJiZpWzBdPD1lWzBdKX19KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7bi5faG92ZXJpbmc9ITEsbi5fZHJhZ2dpbmd8fG4uX2NsZWFySG92ZXJMaW5rVG9TZXJpZXMoKX0pfSxfZW5hYmxlSG92ZXJMaW5rRnJvbVNlcmllczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYXBpLmdldFpyKCk7dGhpcy52aXN1YWxNYXBNb2RlbC5vcHRpb24uaG92ZXJMaW5rPyh0Lm9uKCJtb3VzZW92ZXIiLHRoaXMuX2hvdmVyTGlua0Zyb21TZXJpZXNNb3VzZU92ZXIsdGhpcyksdC5vbigibW91c2VvdXQiLHRoaXMuX2hpZGVJbmRpY2F0b3IsdGhpcykpOnRoaXMuX2NsZWFySG92ZXJMaW5rRnJvbVNlcmllcygpfSxfZG9Ib3ZlckxpbmtUb1NlcmllczpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudmlzdWFsTWFwTW9kZWwsbj1pLml0ZW1TaXplO2lmKGkub3B0aW9uLmhvdmVyTGluayl7dmFyIG89WzAsblsxXV0sYT1pLmdldEV4dGVudCgpO3Q9SUwoVEwob1swXSx0KSxvWzFdKTt2YXIgcj1mdW5jdGlvbih0LGUsaSl7dmFyIG49NixvPXQuZ2V0KCJob3ZlckxpbmtEYXRhU2l6ZSIpO28mJihuPVNMKG8sZSxpLCEwKS8yKTtyZXR1cm4gbn0oaSxhLG8pLHM9W3Qtcix0K3JdLGw9U0wodCxvLGEsITApLHU9W1NMKHNbMF0sbyxhLCEwKSxTTChzWzFdLG8sYSwhMCldO3NbMF08b1swXSYmKHVbMF09LTEvMCksb1sxXTxzWzFdJiYodVsxXT0xLzApLGUmJih1WzBdPT09LTEvMD90aGlzLl9zaG93SW5kaWNhdG9yKGwsdVsxXSwiPCAiLHIpOnVbMV09PT0xLzA/dGhpcy5fc2hvd0luZGljYXRvcihsLHVbMF0sIj4gIixyKTp0aGlzLl9zaG93SW5kaWNhdG9yKGwsbCwi4omIICIscikpO3ZhciBoPXRoaXMuX2hvdmVyTGlua0RhdGFJbmRpY2VzLGM9W107KGV8fENMKGkpKSYmKGM9dGhpcy5faG92ZXJMaW5rRGF0YUluZGljZXM9aS5maW5kVGFyZ2V0RGF0YUluZGljZXModSkpO3ZhciBkPWZ1bmN0aW9uKHQsZSl7dmFyIGk9e30sbj17fTtyZXR1cm4gbyh0fHxbXSxpKSxvKGV8fFtdLG4saSksW2EoaSksYShuKV07ZnVuY3Rpb24gbyh0LGUsaSl7Zm9yKHZhciBuPTAsbz10Lmxlbmd0aDtuPG87bisrKWZvcih2YXIgYT10W25dLnNlcmllc0lkLHI9RW8odFtuXS5kYXRhSW5kZXgpLHM9aSYmaVthXSxsPTAsdT1yLmxlbmd0aDtsPHU7bCsrKXt2YXIgaD1yW2xdO3MmJnNbaF0/c1toXT1udWxsOihlW2FdfHwoZVthXT17fSkpW2hdPTF9fWZ1bmN0aW9uIGEodCxlKXt2YXIgaT1bXTtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZudWxsIT10W25dKWlmKGUpaS5wdXNoKCtuKTtlbHNle3ZhciBvPWEodFtuXSwhMCk7by5sZW5ndGgmJmkucHVzaCh7c2VyaWVzSWQ6bixkYXRhSW5kZXg6b30pfXJldHVybiBpfX0oaCxjKTt0aGlzLl9kaXNwYXRjaEhpZ2hEb3duKCJkb3ducGxheSIsYkwoZFswXSxpKSksdGhpcy5fZGlzcGF0Y2hIaWdoRG93bigiaGlnaGxpZ2h0IixiTChkWzFdLGkpKX19LF9ob3ZlckxpbmtGcm9tU2VyaWVzTW91c2VPdmVyOmZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0LGk9dGhpcy52aXN1YWxNYXBNb2RlbDtpZihlJiZudWxsIT1lLmRhdGFJbmRleCl7dmFyIG49dGhpcy5lY01vZGVsLmdldFNlcmllc0J5SW5kZXgoZS5zZXJpZXNJbmRleCk7aWYoaS5pc1RhcmdldFNlcmllcyhuKSl7dmFyIG89bi5nZXREYXRhKGUuZGF0YVR5cGUpLGE9by5nZXQoaS5nZXREYXRhRGltZW5zaW9uKG8pLGUuZGF0YUluZGV4LCEwKTtpc05hTihhKXx8dGhpcy5fc2hvd0luZGljYXRvcihhLGEpfX19LF9oaWRlSW5kaWNhdG9yOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc2hhcGVzO3QuaW5kaWNhdG9yJiZ0LmluZGljYXRvci5hdHRyKCJpbnZpc2libGUiLCEwKSx0LmluZGljYXRvckxhYmVsJiZ0LmluZGljYXRvckxhYmVsLmF0dHIoImludmlzaWJsZSIsITApfSxfY2xlYXJIb3ZlckxpbmtUb1NlcmllczpmdW5jdGlvbigpe3RoaXMuX2hpZGVJbmRpY2F0b3IoKTt2YXIgdD10aGlzLl9ob3ZlckxpbmtEYXRhSW5kaWNlczt0aGlzLl9kaXNwYXRjaEhpZ2hEb3duKCJkb3ducGxheSIsYkwodCx0aGlzLnZpc3VhbE1hcE1vZGVsKSksdC5sZW5ndGg9MH0sX2NsZWFySG92ZXJMaW5rRnJvbVNlcmllczpmdW5jdGlvbigpe3RoaXMuX2hpZGVJbmRpY2F0b3IoKTt2YXIgdD10aGlzLmFwaS5nZXRacigpO3Qub2ZmKCJtb3VzZW92ZXIiLHRoaXMuX2hvdmVyTGlua0Zyb21TZXJpZXNNb3VzZU92ZXIpLHQub2ZmKCJtb3VzZW91dCIsdGhpcy5faGlkZUluZGljYXRvcil9LF9hcHBseVRyYW5zZm9ybTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz11bChlLG4/bnVsbDp0aGlzLmdyb3VwKTtyZXR1cm4geWxbayh0KT8iYXBwbHlUcmFuc2Zvcm0iOiJ0cmFuc2Zvcm1EaXJlY3Rpb24iXSh0LG8saSl9LF9kaXNwYXRjaEhpZ2hEb3duOmZ1bmN0aW9uKHQsZSl7ZSYmZS5sZW5ndGgmJnRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOnQsYmF0Y2g6ZX0pfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJIb3ZlckxpbmtGcm9tU2VyaWVzKCksdGhpcy5fY2xlYXJIb3ZlckxpbmtUb1NlcmllcygpfSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckhvdmVyTGlua0Zyb21TZXJpZXMoKSx0aGlzLl9jbGVhckhvdmVyTGlua1RvU2VyaWVzKCl9fSk7ZnVuY3Rpb24gREwodCxlLGksbil7cmV0dXJuIG5ldyBxcih7c2hhcGU6e3BvaW50czp0fSxkcmFnZ2FibGU6ISFpLGN1cnNvcjplLGRyaWZ0Omksb25tb3VzZW1vdmU6ZnVuY3Rpb24odCl7V3QodC5ldmVudCl9LG9uZHJhZ2VuZDpufSl9ZnVuY3Rpb24gQ0wodCl7dmFyIGU9dC5nZXQoImhvdmVyTGlua09uSGFuZGxlIik7cmV0dXJuISEobnVsbD09ZT90LmdldCgicmVhbHRpbWUiKTplKX1mdW5jdGlvbiBMTCh0KXtyZXR1cm4idmVydGljYWwiPT09dD8ibnMtcmVzaXplIjoiZXctcmVzaXplIn1nZih7dHlwZToic2VsZWN0RGF0YVJhbmdlIixldmVudDoiZGF0YVJhbmdlU2VsZWN0ZWQiLHVwZGF0ZToidXBkYXRlIn0sZnVuY3Rpb24oZSx0KXt0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJ2aXN1YWxNYXAiLHF1ZXJ5OmV9LGZ1bmN0aW9uKHQpe3Quc2V0U2VsZWN0ZWQoZS5zZWxlY3RlZCl9KX0pLGZmKGlMKTt2YXIga0w9bUwuZXh0ZW5kKHt0eXBlOiJ2aXN1YWxNYXAucGllY2V3aXNlIixkZWZhdWx0T3B0aW9uOntzZWxlY3RlZDpudWxsLG1pbk9wZW46ITEsbWF4T3BlbjohMSxhbGlnbjoiYXV0byIsaXRlbVdpZHRoOjIwLGl0ZW1IZWlnaHQ6MTQsaXRlbVN5bWJvbDoicm91bmRSZWN0IixwaWVjZUxpc3Q6bnVsbCxjYXRlZ29yaWVzOm51bGwsc3BsaXROdW1iZXI6NSxzZWxlY3RlZE1vZGU6Im11bHRpcGxlIixpdGVtR2FwOjEwLGhvdmVyTGluazohMCxzaG93TGFiZWw6bnVsbH0sb3B0aW9uVXBkYXRlZDpmdW5jdGlvbih0LGUpe2tMLnN1cGVyQXBwbHkodGhpcywib3B0aW9uVXBkYXRlZCIsYXJndW1lbnRzKSx0aGlzLl9waWVjZUxpc3Q9W10sdGhpcy5yZXNldEV4dGVudCgpO3ZhciBpPXRoaXMuX21vZGU9dGhpcy5fZGV0ZXJtaW5lTW9kZSgpO1BMW3RoaXMuX21vZGVdLmNhbGwodGhpcyksdGhpcy5fcmVzZXRTZWxlY3RlZCh0LGUpO3ZhciBuPXRoaXMub3B0aW9uLmNhdGVnb3JpZXM7dGhpcy5yZXNldFZpc3VhbChmdW5jdGlvbih0LGUpeyJjYXRlZ29yaWVzIj09PWk/KHQubWFwcGluZ01ldGhvZD0iY2F0ZWdvcnkiLHQuY2F0ZWdvcmllcz1EKG4pKToodC5kYXRhRXh0ZW50PXRoaXMuZ2V0RXh0ZW50KCksdC5tYXBwaW5nTWV0aG9kPSJwaWVjZXdpc2UiLHQucGllY2VMaXN0PU4odGhpcy5fcGllY2VMaXN0LGZ1bmN0aW9uKHQpe3Q9RCh0KTtyZXR1cm4iaW5SYW5nZSIhPT1lJiYodC52aXN1YWw9bnVsbCksdH0pKX0pfSxjb21wbGV0ZVZpc3VhbE9wdGlvbjpmdW5jdGlvbigpe3ZhciBuPXRoaXMub3B0aW9uLGk9e30sdD1hXy5saXN0VmlzdWFsVHlwZXMoKSxvPXRoaXMuaXNDYXRlZ29yeSgpO2Z1bmN0aW9uIGEodCxlLGkpe3JldHVybiB0JiZ0W2VdJiYoUih0W2VdKT90W2VdLmhhc093blByb3BlcnR5KGkpOnRbZV09PT1pKX1FKG4ucGllY2VzLGZ1bmN0aW9uKGUpe0UodCxmdW5jdGlvbih0KXtlLmhhc093blByb3BlcnR5KHQpJiYoaVt0XT0xKX0pfSksRShpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9MDtFKHRoaXMuc3RhdGVMaXN0LGZ1bmN0aW9uKHQpe2l8PWEobix0LGUpfHxhKG4udGFyZ2V0LHQsZSl9LHRoaXMpLGl8fEUodGhpcy5zdGF0ZUxpc3QsZnVuY3Rpb24odCl7KG5bdF18fChuW3RdPXt9KSlbZV09bEwoZSwiaW5SYW5nZSI9PT10PyJhY3RpdmUiOiJpbmFjdGl2ZSIsbyl9KX0sdGhpcyksbUwucHJvdG90eXBlLmNvbXBsZXRlVmlzdWFsT3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3Jlc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbixuPXRoaXMuX3BpZWNlTGlzdCxvPShlP2k6dCkuc2VsZWN0ZWR8fHt9O2lmKGkuc2VsZWN0ZWQ9byxFKG4sZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldFNlbGVjdGVkTWFwS2V5KHQpO28uaGFzT3duUHJvcGVydHkoaSl8fChvW2ldPSEwKX0sdGhpcyksInNpbmdsZSI9PT1pLnNlbGVjdGVkTW9kZSl7dmFyIGE9ITE7RShuLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRTZWxlY3RlZE1hcEtleSh0KTtvW2ldJiYoYT9vW2ldPSExOmE9ITApfSx0aGlzKX19LGdldFNlbGVjdGVkTWFwS2V5OmZ1bmN0aW9uKHQpe3JldHVybiJjYXRlZ29yaWVzIj09PXRoaXMuX21vZGU/dC52YWx1ZSsiIjp0LmluZGV4KyIifSxnZXRQaWVjZUxpc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGllY2VMaXN0fSxfZGV0ZXJtaW5lTW9kZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uO3JldHVybiB0LnBpZWNlcyYmMDx0LnBpZWNlcy5sZW5ndGg/InBpZWNlcyI6dGhpcy5vcHRpb24uY2F0ZWdvcmllcz8iY2F0ZWdvcmllcyI6InNwbGl0TnVtYmVyIn0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uc2VsZWN0ZWQ9RCh0KX0sZ2V0VmFsdWVTdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT1hXy5maW5kUGllY2VJbmRleCh0LHRoaXMuX3BpZWNlTGlzdCk7cmV0dXJuIG51bGwhPWUmJnRoaXMub3B0aW9uLnNlbGVjdGVkW3RoaXMuZ2V0U2VsZWN0ZWRNYXBLZXkodGhpcy5fcGllY2VMaXN0W2VdKV0/ImluUmFuZ2UiOiJvdXRPZlJhbmdlIn0sZmluZFRhcmdldERhdGFJbmRpY2VzOmZ1bmN0aW9uKG4pe3ZhciBvPVtdO3JldHVybiB0aGlzLmVhY2hUYXJnZXRTZXJpZXMoZnVuY3Rpb24odCl7dmFyIGk9W10sZT10LmdldERhdGEoKTtlLmVhY2godGhpcy5nZXREYXRhRGltZW5zaW9uKGUpLGZ1bmN0aW9uKHQsZSl7YV8uZmluZFBpZWNlSW5kZXgodCx0aGlzLl9waWVjZUxpc3QpPT09biYmaS5wdXNoKGUpfSx0aGlzKSxvLnB1c2goe3Nlcmllc0lkOnQuaWQsZGF0YUluZGV4Oml9KX0sdGhpcyksb30sZ2V0UmVwcmVzZW50VmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU7aWYodGhpcy5pc0NhdGVnb3J5KCkpZT10LnZhbHVlO2Vsc2UgaWYobnVsbCE9dC52YWx1ZSllPXQudmFsdWU7ZWxzZXt2YXIgaT10LmludGVydmFsfHxbXTtlPWlbMF09PT0tMS8wJiZpWzFdPT09MS8wPzA6KGlbMF0raVsxXSkvMn1yZXR1cm4gZX0sZ2V0VmlzdWFsTWV0YTpmdW5jdGlvbihvKXtpZighdGhpcy5pc0NhdGVnb3J5KCkpe3ZhciBhPVtdLHI9W10scz10aGlzLHQ9dGhpcy5fcGllY2VMaXN0LnNsaWNlKCk7aWYodC5sZW5ndGgpe3ZhciBlPXRbMF0uaW50ZXJ2YWxbMF07ZSE9PS0xLzAmJnQudW5zaGlmdCh7aW50ZXJ2YWw6Wy0xLzAsZV19KSwoZT10W3QubGVuZ3RoLTFdLmludGVydmFsWzFdKSE9PTEvMCYmdC5wdXNoKHtpbnRlcnZhbDpbZSwxLzBdfSl9ZWxzZSB0LnB1c2goe2ludGVydmFsOlstMS8wLDEvMF19KTt2YXIgaT0tMS8wO3JldHVybiBFKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5pbnRlcnZhbDtlJiYoZVswXT5pJiZuKFtpLGVbMF1dLCJvdXRPZlJhbmdlIiksbihlLnNsaWNlKCkpLGk9ZVsxXSl9LHRoaXMpLHtzdG9wczphLG91dGVyQ29sb3JzOnJ9fWZ1bmN0aW9uIG4odCxlKXt2YXIgaT1zLmdldFJlcHJlc2VudFZhbHVlKHtpbnRlcnZhbDp0fSk7ZT1lfHxzLmdldFZhbHVlU3RhdGUoaSk7dmFyIG49byhpLGUpO3RbMF09PT0tMS8wP3JbMF09bjp0WzFdPT09MS8wP3JbMV09bjphLnB1c2goe3ZhbHVlOnRbMF0sY29sb3I6bn0se3ZhbHVlOnRbMV0sY29sb3I6bn0pfX19KSxQTD17c3BsaXROdW1iZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbixlPXRoaXMuX3BpZWNlTGlzdCxpPU1hdGgubWluKHQucHJlY2lzaW9uLDIwKSxuPXRoaXMuZ2V0RXh0ZW50KCksbz10LnNwbGl0TnVtYmVyO289TWF0aC5tYXgocGFyc2VJbnQobywxMCksMSksdC5zcGxpdE51bWJlcj1vO2Zvcih2YXIgYT0oblsxXS1uWzBdKS9vOythLnRvRml4ZWQoaSkhPT1hJiZpPDU7KWkrKzt0LnByZWNpc2lvbj1pLGE9K2EudG9GaXhlZChpKTt2YXIgcj0wO3QubWluT3BlbiYmZS5wdXNoKHtpbmRleDpyKyssaW50ZXJ2YWw6Wy0xLzAsblswXV0sY2xvc2U6WzAsMF19KTtmb3IodmFyIHM9blswXSxsPXIrbztyPGw7cys9YSl7dmFyIHU9cj09PW8tMT9uWzFdOnMrYTtlLnB1c2goe2luZGV4OnIrKyxpbnRlcnZhbDpbcyx1XSxjbG9zZTpbMSwxXX0pfXQubWF4T3BlbiYmZS5wdXNoKHtpbmRleDpyKyssaW50ZXJ2YWw6W25bMV0sMS8wXSxjbG9zZTpbMCwwXX0pLFlsKGUpLEUoZSxmdW5jdGlvbih0KXt0LnRleHQ9dGhpcy5mb3JtYXRWYWx1ZVRleHQodC5pbnRlcnZhbCl9LHRoaXMpfSxjYXRlZ29yaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb247RSh0LmNhdGVnb3JpZXMsZnVuY3Rpb24odCl7dGhpcy5fcGllY2VMaXN0LnB1c2goe3RleHQ6dGhpcy5mb3JtYXRWYWx1ZVRleHQodCwhMCksdmFsdWU6dH0pfSx0aGlzKSxOTCh0LHRoaXMuX3BpZWNlTGlzdCl9LHBpZWNlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLGQ9dGhpcy5fcGllY2VMaXN0O0UodC5waWVjZXMsZnVuY3Rpb24odCxlKXtSKHQpfHwodD17dmFsdWU6dH0pO3ZhciBpPXt0ZXh0OiIiLGluZGV4OmV9O2lmKG51bGwhPXQubGFiZWwmJihpLnRleHQ9dC5sYWJlbCksdC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSl7dmFyIG49aS52YWx1ZT10LnZhbHVlO2kuaW50ZXJ2YWw9W24sbl0saS5jbG9zZT1bMSwxXX1lbHNle2Zvcih2YXIgbz1pLmludGVydmFsPVtdLGE9aS5jbG9zZT1bMCwwXSxyPVsxLDAsMV0scz1bLTEvMCwxLzBdLGw9W10sdT0wO3U8Mjt1Kyspe2Zvcih2YXIgaD1bWyJndGUiLCJndCIsIm1pbiJdLFsibHRlIiwibHQiLCJtYXgiXV1bdV0sYz0wO2M8MyYmbnVsbD09b1t1XTtjKyspb1t1XT10W2hbY11dLGFbdV09cltjXSxsW3VdPTI9PT1jO251bGw9PW9bdV0mJihvW3VdPXNbdV0pfWxbMF0mJm9bMV09PT0xLzAmJihhWzBdPTApLGxbMV0mJm9bMF09PT0tMS8wJiYoYVsxXT0wKSxvWzBdPT09b1sxXSYmYVswXSYmYVsxXSYmKGkudmFsdWU9b1swXSl9aS52aXN1YWw9YV8ucmV0cmlldmVWaXN1YWxzKHQpLGQucHVzaChpKX0sdGhpcyksTkwodCxkKSxZbChkKSxFKGQsZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9zZSxpPVtbIjwiLCLiiaQiXVtlWzFdXSxbIj4iLCLiiaUiXVtlWzBdXV07dC50ZXh0PXQudGV4dHx8dGhpcy5mb3JtYXRWYWx1ZVRleHQobnVsbCE9dC52YWx1ZT90LnZhbHVlOnQuaW50ZXJ2YWwsITEsaSl9LHRoaXMpfX07ZnVuY3Rpb24gTkwodCxlKXt2YXIgaT10LmludmVyc2U7KCJ2ZXJ0aWNhbCI9PT10Lm9yaWVudD8haTppKSYmZS5yZXZlcnNlKCl9X0wuZXh0ZW5kKHt0eXBlOiJ2aXN1YWxNYXAucGllY2V3aXNlIixkb1JlbmRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ3JvdXA7YS5yZW1vdmVBbGwoKTt2YXIgcj10aGlzLnZpc3VhbE1hcE1vZGVsLHM9ci5nZXQoInRleHRHYXAiKSx0PXIudGV4dFN0eWxlTW9kZWwsbD10LmdldEZvbnQoKSx1PXQuZ2V0VGV4dENvbG9yKCksaD10aGlzLl9nZXRJdGVtQWxpZ24oKSxjPXIuaXRlbVNpemUsZT10aGlzLl9nZXRWaWV3RGF0YSgpLGk9ZS5lbmRzVGV4dCxkPVcoci5nZXQoInNob3dMYWJlbCIsITApLCFpKTtpJiZ0aGlzLl9yZW5kZXJFbmRzVGV4dChhLGlbMF0sYyxkLGgpLEUoZS52aWV3UGllY2VMaXN0LGZ1bmN0aW9uKHQpe3ZhciBlPXQucGllY2UsaT1uZXcgSWk7aS5vbmNsaWNrPUEodGhpcy5fb25JdGVtQ2xpY2ssdGhpcyxlKSx0aGlzLl9lbmFibGVIb3ZlckxpbmsoaSx0LmluZGV4SW5Nb2RlbFBpZWNlTGlzdCk7dmFyIG49ci5nZXRSZXByZXNlbnRWYWx1ZShlKTtpZih0aGlzLl9jcmVhdGVJdGVtU3ltYm9sKGksbixbMCwwLGNbMF0sY1sxXV0pLGQpe3ZhciBvPXRoaXMudmlzdWFsTWFwTW9kZWwuZ2V0VmFsdWVTdGF0ZShuKTtpLmFkZChuZXcgRnIoe3N0eWxlOnt4OiJyaWdodCI9PT1oPy1zOmNbMF0rcyx5OmNbMV0vMix0ZXh0OmUudGV4dCx0ZXh0VmVydGljYWxBbGlnbjoibWlkZGxlIix0ZXh0QWxpZ246aCx0ZXh0Rm9udDpsLHRleHRGaWxsOnUsb3BhY2l0eToib3V0T2ZSYW5nZSI9PT1vPy41OjF9fSkpfWEuYWRkKGkpfSx0aGlzKSxpJiZ0aGlzLl9yZW5kZXJFbmRzVGV4dChhLGlbMV0sYyxkLGgpLG11KHIuZ2V0KCJvcmllbnQiKSxhLHIuZ2V0KCJpdGVtR2FwIikpLHRoaXMucmVuZGVyQmFja2dyb3VuZChhKSx0aGlzLnBvc2l0aW9uR3JvdXAoYSl9LF9lbmFibGVIb3Zlckxpbms6ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBlKHQpe3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWw7ZS5vcHRpb24uaG92ZXJMaW5rJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZTp0LGJhdGNoOmJMKGUuZmluZFRhcmdldERhdGFJbmRpY2VzKGkpLGUpfSl9dC5vbigibW91c2VvdmVyIixBKGUsdGhpcywiaGlnaGxpZ2h0IikpLm9uKCJtb3VzZW91dCIsQShlLHRoaXMsImRvd25wbGF5IikpfSxfZ2V0SXRlbUFsaWduOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aXN1YWxNYXBNb2RlbCxlPXQub3B0aW9uO2lmKCJ2ZXJ0aWNhbCI9PT1lLm9yaWVudClyZXR1cm4gd0wodCx0aGlzLmFwaSx0Lml0ZW1TaXplKTt2YXIgaT1lLmFsaWduO3JldHVybiBpJiYiYXV0byIhPT1pfHwoaT0ibGVmdCIpLGl9LF9yZW5kZXJFbmRzVGV4dDpmdW5jdGlvbih0LGUsaSxuLG8pe2lmKGUpe3ZhciBhPW5ldyBJaSxyPXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWw7YS5hZGQobmV3IEZyKHtzdHlsZTp7eDpuPyJyaWdodCI9PT1vP2lbMF06MDppWzBdLzIseTppWzFdLzIsdGV4dFZlcnRpY2FsQWxpZ246Im1pZGRsZSIsdGV4dEFsaWduOm4/bzoiY2VudGVyIix0ZXh0OmUsdGV4dEZvbnQ6ci5nZXRGb250KCksdGV4dEZpbGw6ci5nZXRUZXh0Q29sb3IoKX19KSksdC5hZGQoYSl9fSxfZ2V0Vmlld0RhdGE6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpc3VhbE1hcE1vZGVsLGU9Tih0LmdldFBpZWNlTGlzdCgpLGZ1bmN0aW9uKHQsZSl7cmV0dXJue3BpZWNlOnQsaW5kZXhJbk1vZGVsUGllY2VMaXN0OmV9fSksaT10LmdldCgidGV4dCIpLG49dC5nZXQoIm9yaWVudCIpLG89dC5nZXQoImludmVyc2UiKTtyZXR1cm4oImhvcml6b250YWwiPT09bj9vOiFvKT9lLnJldmVyc2UoKTppPWkmJmkuc2xpY2UoKS5yZXZlcnNlKCkse3ZpZXdQaWVjZUxpc3Q6ZSxlbmRzVGV4dDppfX0sX2NyZWF0ZUl0ZW1TeW1ib2w6ZnVuY3Rpb24odCxlLGkpe3QuYWRkKG1nKHRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbChlLCJzeW1ib2wiKSxpWzBdLGlbMV0saVsyXSxpWzNdLHRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbChlLCJjb2xvciIpKSl9LF9vbkl0ZW1DbGljazpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpc3VhbE1hcE1vZGVsLGk9ZS5vcHRpb24sbj1EKGkuc2VsZWN0ZWQpLG89ZS5nZXRTZWxlY3RlZE1hcEtleSh0KTsic2luZ2xlIj09PWkuc2VsZWN0ZWRNb2RlPyhuW29dPSEwLEUobixmdW5jdGlvbih0LGUpe25bZV09ZT09PW99KSk6bltvXT0hbltvXSx0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToic2VsZWN0RGF0YVJhbmdlIixmcm9tOnRoaXMudWlkLHZpc3VhbE1hcElkOnRoaXMudmlzdWFsTWFwTW9kZWwuaWQsc2VsZWN0ZWQ6bn0pfX0pO2ZmKGlMKTt2YXIgT0wsRUw9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIix6TD0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9udWxsOndpbmRvdyxSTD0hMSxCTD16TCYmekwuZG9jdW1lbnQ7ZnVuY3Rpb24gVkwodCl7cmV0dXJuIE9MKHQpfWlmKEJMJiYhdi5jYW52YXNTdXBwb3J0ZWQpdHJ5e0JMLm5hbWVzcGFjZXMuenJ2bWx8fEJMLm5hbWVzcGFjZXMuYWRkKCJ6cnZtbCIsRUwpLE9MPWZ1bmN0aW9uKHQpe3JldHVybiBCTC5jcmVhdGVFbGVtZW50KCI8enJ2bWw6Iit0KycgY2xhc3M9Inpydm1sIj4nKX19Y2F0Y2godCl7T0w9ZnVuY3Rpb24odCl7cmV0dXJuIEJMLmNyZWF0ZUVsZW1lbnQoIjwiK3QrJyB4bWxucz0iJytFTCsnIiBjbGFzcz0ienJ2bWwiPicpfX12YXIgR0wsRkw9aXIuQ01ELFdMPU1hdGgucm91bmQsSEw9TWF0aC5zcXJ0LFpMPU1hdGguYWJzLFVMPU1hdGguY29zLFhMPU1hdGguc2luLFlMPU1hdGgubWF4O2lmKCF2LmNhbnZhc1N1cHBvcnRlZCl7dmFyIGpMPSIsIixxTD0icHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0IixLTD0yMTYwMCwkTD1LTC8yLEpMPWZ1bmN0aW9uKHQpe3Quc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyIsdC5jb29yZHNpemU9S0wrIiwiK0tMLHQuY29vcmRvcmlnaW49IjAsMCJ9LFFMPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4icmdiKCIrW3QsZSxpXS5qb2luKCIsIikrIikifSx0az1mdW5jdGlvbih0LGUpe2UmJnQmJmUucGFyZW50Tm9kZSE9PXQmJnQuYXBwZW5kQ2hpbGQoZSl9LGVrPWZ1bmN0aW9uKHQsZSl7ZSYmdCYmZS5wYXJlbnROb2RlPT09dCYmdC5yZW1vdmVDaGlsZChlKX0saWs9ZnVuY3Rpb24odCxlLGkpe3JldHVybiAxZTUqKHBhcnNlRmxvYXQodCl8fDApKzFlMyoocGFyc2VGbG9hdChlKXx8MCkraX0sbms9SG4sb2s9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPVJlKGUpO2k9K2ksaXNOYU4oaSkmJihpPTEpLG4mJih0LmNvbG9yPVFMKG5bMF0sblsxXSxuWzJdKSx0Lm9wYWNpdHk9aSpuWzNdKX0sYWs9ZnVuY3Rpb24odCxlLGksbil7dmFyIG89ImZpbGwiPT09ZSxhPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSlbMF07bnVsbCE9aVtlXSYmIm5vbmUiIT09aVtlXSYmKG98fCFvJiZpLmxpbmVXaWR0aCk/KHRbbz8iZmlsbGVkIjoic3Ryb2tlZCJdPSJ0cnVlIixpW2VdaW5zdGFuY2VvZiBzcyYmZWsodCxhKSxhPWF8fFZMKGUpLG8/ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8sYT1lLmZpbGw7aWYobnVsbCE9YSlpZihhIGluc3RhbmNlb2Ygc3Mpe3ZhciByLHM9MCxsPVswLDBdLHU9MCxoPTEsYz1pLmdldEJvdW5kaW5nUmVjdCgpLGQ9Yy53aWR0aCxmPWMuaGVpZ2h0O2lmKCJsaW5lYXIiPT09YS50eXBlKXtyPSJncmFkaWVudCI7dmFyIHA9aS50cmFuc2Zvcm0sZz1bYS54KmQsYS55KmZdLG09W2EueDIqZCxhLnkyKmZdO3AmJihidChnLGcscCksYnQobSxtLHApKTt2YXIgdj1tWzBdLWdbMF0seT1tWzFdLWdbMV07KHM9MTgwKk1hdGguYXRhbjIodix5KS9NYXRoLlBJKTwwJiYocys9MzYwKSxzPDFlLTYmJihzPTApfWVsc2V7cj0iZ3JhZGllbnRyYWRpYWwiO2c9W2EueCpkLGEueSpmXSxwPWkudHJhbnNmb3JtO3ZhciB4PWkuc2NhbGUsXz1kLHc9ZjtsPVsoZ1swXS1jLngpL18sKGdbMV0tYy55KS93XSxwJiZidChnLGcscCksXy89eFswXSpLTCx3Lz14WzFdKktMO3ZhciBiPVlMKF8sdyk7dT0wL2IsaD0yKmEuci9iLXV9dmFyIFM9YS5jb2xvclN0b3BzLnNsaWNlKCk7Uy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQub2Zmc2V0LWUub2Zmc2V0fSk7Zm9yKHZhciBNPVMubGVuZ3RoLEk9W10sVD1bXSxBPTA7QTxNO0ErKyl7dmFyIEQ9U1tBXSxDPShuPUQuY29sb3Isdm9pZCAwLG89UmUobiksW1FMKG9bMF0sb1sxXSxvWzJdKSxvWzNdXSk7VC5wdXNoKEQub2Zmc2V0KmgrdSsiICIrQ1swXSksMCE9PUEmJkEhPT1NLTF8fEkucHVzaChDKX1pZigyPD1NKXt2YXIgTD1JWzBdWzBdLGs9SVsxXVswXSxQPUlbMF1bMV0qZS5vcGFjaXR5LE49SVsxXVsxXSplLm9wYWNpdHk7dC50eXBlPXIsdC5tZXRob2Q9Im5vbmUiLHQuZm9jdXM9IjEwMCUiLHQuYW5nbGU9cyx0LmNvbG9yPUwsdC5jb2xvcjI9ayx0LmNvbG9ycz1ULmpvaW4oIiwiKSx0Lm9wYWNpdHk9Tix0Lm9wYWNpdHkyPVB9InJhZGlhbCI9PT1yJiYodC5mb2N1c3Bvc2l0aW9uPWwuam9pbigiLCIpKX1lbHNlIG9rKHQsYSxlLm9wYWNpdHkpfShhLGksbik6ZnVuY3Rpb24odCxlKXtlLmxpbmVEYXNoJiYodC5kYXNoc3R5bGU9ZS5saW5lRGFzaC5qb2luKCIgIikpLG51bGw9PWUuc3Ryb2tlfHxlLnN0cm9rZSBpbnN0YW5jZW9mIHNzfHxvayh0LGUuc3Ryb2tlLGUub3BhY2l0eSl9KGEsaSksdGsodCxhKSk6KHRbbz8iZmlsbGVkIjoic3Ryb2tlZCJdPSJmYWxzZSIsZWsodCxhKSl9LHJrPVtbXSxbXSxbXV07U3IucHJvdG90eXBlLmJydXNoVk1MPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3R5bGUsaT10aGlzLl92bWxFbDtpfHwoaT1WTCgic2hhcGUiKSxKTChpKSx0aGlzLl92bWxFbD1pKSxhayhpLCJmaWxsIixlLHRoaXMpLGFrKGksInN0cm9rZSIsZSx0aGlzKTt2YXIgbj10aGlzLnRyYW5zZm9ybSxvPW51bGwhPW4sYT1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHJva2UiKVswXTtpZihhKXt2YXIgcj1lLmxpbmVXaWR0aDtpZihvJiYhZS5zdHJva2VOb1NjYWxlKXt2YXIgcz1uWzBdKm5bM10tblsxXSpuWzJdO3IqPUhMKFpMKHMpKX1hLndlaWdodD1yKyJweCJ9dmFyIGw9dGhpcy5wYXRofHwodGhpcy5wYXRoPW5ldyBpcik7dGhpcy5fX2RpcnR5UGF0aCYmKGwuYmVnaW5QYXRoKCksbC5zdWJQaXhlbE9wdGltaXplPSExLHRoaXMuYnVpbGRQYXRoKGwsdGhpcy5zaGFwZSksbC50b1N0YXRpYygpLHRoaXMuX19kaXJ0eVBhdGg9ITEpLGkucGF0aD1mdW5jdGlvbih0LGUpe3ZhciBpLG4sbyxhLHIscyxsPUZMLk0sdT1GTC5DLGg9RkwuTCxjPUZMLkEsZD1GTC5RLGY9W10scD10LmRhdGEsZz10LmxlbigpO2ZvcihhPTA7YTxnOyl7c3dpdGNoKG49IiIsaT0wLG89cFthKytdKXtjYXNlIGw6bj0iIG0gIixpPTEscj1wW2ErK10scz1wW2ErK10scmtbMF1bMF09cixya1swXVsxXT1zO2JyZWFrO2Nhc2UgaDpuPSIgbCAiLGk9MSxyPXBbYSsrXSxzPXBbYSsrXSxya1swXVswXT1yLHJrWzBdWzFdPXM7YnJlYWs7Y2FzZSBkOmNhc2UgdTpuPSIgYyAiLGk9Mzt2YXIgbSx2LHk9cFthKytdLHg9cFthKytdLF89cFthKytdLHc9cFthKytdO289PT1kPyhfPSgobT1fKSsyKnkpLzMsdz0oKHY9dykrMip4KS8zLHk9KHIrMip5KS8zLHg9KHMrMip4KS8zKToobT1wW2ErK10sdj1wW2ErK10pLHJrWzBdWzBdPXkscmtbMF1bMV09eCxya1sxXVswXT1fLHJrWzFdWzFdPXcscj1ya1syXVswXT1tLHM9cmtbMl1bMV09djticmVhaztjYXNlIGM6dmFyIGI9MCxTPTAsTT0xLEk9MSxUPTA7ZSYmKGI9ZVs0XSxTPWVbNV0sTT1ITChlWzBdKmVbMF0rZVsxXSplWzFdKSxJPUhMKGVbMl0qZVsyXStlWzNdKmVbM10pLFQ9TWF0aC5hdGFuMigtZVsxXS9JLGVbMF0vTSkpO3ZhciBBPXBbYSsrXSxEPXBbYSsrXSxDPXBbYSsrXSxMPXBbYSsrXSxrPXBbYSsrXStULFA9cFthKytdK2srVDthKys7dmFyIE49cFthKytdLE89QStVTChrKSpDLEU9RCtYTChrKSpMLHo9KHk9QStVTChQKSpDLHg9RCtYTChQKSpMLE4/IiB3YSAiOiIgYXQgIik7TWF0aC5hYnMoTy15KTwxZS00JiYoLjAxPE1hdGguYWJzKFAtayk/TiYmKE8rPS4wMTI1KTpNYXRoLmFicyhFLUQpPDFlLTQ/TiYmTzxBfHwhTiYmQTxPP3gtPS4wMTI1OngrPS4wMTI1Ok4mJkU8RHx8IU4mJkQ8RT95Kz0uMDEyNTp5LT0uMDEyNSksZi5wdXNoKHosV0woKChBLUMpKk0rYikqS0wtJEwpLGpMLFdMKCgoRC1MKSpJK1MpKktMLSRMKSxqTCxXTCgoKEErQykqTStiKSpLTC0kTCksakwsV0woKChEK0wpKkkrUykqS0wtJEwpLGpMLFdMKChPKk0rYikqS0wtJEwpLGpMLFdMKChFKkkrUykqS0wtJEwpLGpMLFdMKCh5Kk0rYikqS0wtJEwpLGpMLFdMKCh4KkkrUykqS0wtJEwpKSxyPXkscz14O2JyZWFrO2Nhc2UgRkwuUjp2YXIgUj1ya1swXSxCPXJrWzFdO1JbMF09cFthKytdLFJbMV09cFthKytdLEJbMF09UlswXStwW2ErK10sQlsxXT1SWzFdK3BbYSsrXSxlJiYoYnQoUixSLGUpLGJ0KEIsQixlKSksUlswXT1XTChSWzBdKktMLSRMKSxCWzBdPVdMKEJbMF0qS0wtJEwpLFJbMV09V0woUlsxXSpLTC0kTCksQlsxXT1XTChCWzFdKktMLSRMKSxmLnB1c2goIiBtICIsUlswXSxqTCxSWzFdLCIgbCAiLEJbMF0sakwsUlsxXSwiIGwgIixCWzBdLGpMLEJbMV0sIiBsICIsUlswXSxqTCxCWzFdKTticmVhaztjYXNlIEZMLlo6Zi5wdXNoKCIgeCAiKX1pZigwPGkpe2YucHVzaChuKTtmb3IodmFyIFY9MDtWPGk7VisrKXt2YXIgRz1ya1tWXTtlJiZidChHLEcsZSksZi5wdXNoKFdMKEdbMF0qS0wtJEwpLGpMLFdMKEdbMV0qS0wtJEwpLFY8aS0xP2pMOiIiKX19fXJldHVybiBmLmpvaW4oIiIpfShsLHRoaXMudHJhbnNmb3JtKSxpLnN0eWxlLnpJbmRleD1payh0aGlzLnpsZXZlbCx0aGlzLnosdGhpcy56MiksdGsodCxpKSxudWxsIT1lLnRleHQ/dGhpcy5kcmF3UmVjdFRleHQodCx0aGlzLmdldEJvdW5kaW5nUmVjdCgpKTp0aGlzLnJlbW92ZVJlY3RUZXh0KHQpfSxTci5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24odCl7ZWsodCx0aGlzLl92bWxFbCksdGhpcy5yZW1vdmVSZWN0VGV4dCh0KX0sU3IucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKHQpe3RrKHQsdGhpcy5fdm1sRWwpLHRoaXMuYXBwZW5kUmVjdFRleHQodCl9O3FuLnByb3RvdHlwZS5icnVzaFZNTD1mdW5jdGlvbih0KXt2YXIgZSxpLG49dGhpcy5zdHlsZSxvPW4uaW1hZ2U7aWYoZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZ0LnRhZ05hbWUmJiJJTUciPT09dC50YWdOYW1lLnRvVXBwZXJDYXNlKCl9KG8pKXt2YXIgYT1vLnNyYztpZihhPT09dGhpcy5faW1hZ2VTcmMpZT10aGlzLl9pbWFnZVdpZHRoLGk9dGhpcy5faW1hZ2VIZWlnaHQ7ZWxzZXt2YXIgcj1vLnJ1bnRpbWVTdHlsZSxzPXIud2lkdGgsbD1yLmhlaWdodDtyLndpZHRoPSJhdXRvIixyLmhlaWdodD0iYXV0byIsZT1vLndpZHRoLGk9by5oZWlnaHQsci53aWR0aD1zLHIuaGVpZ2h0PWwsdGhpcy5faW1hZ2VTcmM9YSx0aGlzLl9pbWFnZVdpZHRoPWUsdGhpcy5faW1hZ2VIZWlnaHQ9aX1vPWF9ZWxzZSBvPT09dGhpcy5faW1hZ2VTcmMmJihlPXRoaXMuX2ltYWdlV2lkdGgsaT10aGlzLl9pbWFnZUhlaWdodCk7aWYobyl7dmFyIHU9bi54fHwwLGg9bi55fHwwLGM9bi53aWR0aCxkPW4uaGVpZ2h0LGY9bi5zV2lkdGgscD1uLnNIZWlnaHQsZz1uLnN4fHwwLG09bi5zeXx8MCx2PWYmJnAseT10aGlzLl92bWxFbDt5fHwoeT1CTC5jcmVhdGVFbGVtZW50KCJkaXYiKSxKTCh5KSx0aGlzLl92bWxFbD15KTt2YXIgeCxfPXkuc3R5bGUsdz0hMSxiPTEsUz0xO2lmKHRoaXMudHJhbnNmb3JtJiYoeD10aGlzLnRyYW5zZm9ybSxiPUhMKHhbMF0qeFswXSt4WzFdKnhbMV0pLFM9SEwoeFsyXSp4WzJdK3hbM10qeFszXSksdz14WzFdfHx4WzJdKSx3KXt2YXIgTT1bdSxoXSxJPVt1K2MsaF0sVD1bdSxoK2RdLEE9W3UrYyxoK2RdO2J0KE0sTSx4KSxidChJLEkseCksYnQoVCxULHgpLGJ0KEEsQSx4KTt2YXIgRD1ZTChNWzBdLElbMF0sVFswXSxBWzBdKSxDPVlMKE1bMV0sSVsxXSxUWzFdLEFbMV0pLEw9W107TC5wdXNoKCJNMTE9Iix4WzBdL2IsakwsIk0xMj0iLHhbMl0vUyxqTCwiTTIxPSIseFsxXS9iLGpMLCJNMjI9Iix4WzNdL1MsakwsIkR4PSIsV0wodSpiK3hbNF0pLGpMLCJEeT0iLFdMKGgqUyt4WzVdKSksXy5wYWRkaW5nPSIwICIrV0woRCkrInB4ICIrV0woQykrInB4IDAiLF8uZmlsdGVyPXFMKyIuTWF0cml4KCIrTC5qb2luKCIiKSsiLCBTaXppbmdNZXRob2Q9Y2xpcCkifWVsc2UgeCYmKHU9dSpiK3hbNF0saD1oKlMreFs1XSksXy5maWx0ZXI9IiIsXy5sZWZ0PVdMKHUpKyJweCIsXy50b3A9V0woaCkrInB4Ijt2YXIgaz10aGlzLl9pbWFnZUVsLFA9dGhpcy5fY3JvcEVsO2t8fChrPUJMLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuX2ltYWdlRWw9ayk7dmFyIE49ay5zdHlsZTtpZih2KXtpZihlJiZpKU4ud2lkdGg9V0woYiplKmMvZikrInB4IixOLmhlaWdodD1XTChTKmkqZC9wKSsicHgiO2Vsc2V7dmFyIE89bmV3IEltYWdlLEU9dGhpcztPLm9ubG9hZD1mdW5jdGlvbigpe08ub25sb2FkPW51bGwsZT1PLndpZHRoLGk9Ty5oZWlnaHQsTi53aWR0aD1XTChiKmUqYy9mKSsicHgiLE4uaGVpZ2h0PVdMKFMqaSpkL3ApKyJweCIsRS5faW1hZ2VXaWR0aD1lLEUuX2ltYWdlSGVpZ2h0PWksRS5faW1hZ2VTcmM9b30sTy5zcmM9b31QfHwoKFA9QkwuY3JlYXRlRWxlbWVudCgiZGl2IikpLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHRoaXMuX2Nyb3BFbD1QKTt2YXIgej1QLnN0eWxlO3oud2lkdGg9V0woKGMrZypjL2YpKmIpLHouaGVpZ2h0PVdMKChkK20qZC9wKSpTKSx6LmZpbHRlcj1xTCsiLk1hdHJpeChEeD0iKy1nKmMvZipiKyIsRHk9IistbSpkL3AqUysiKSIsUC5wYXJlbnROb2RlfHx5LmFwcGVuZENoaWxkKFApLGsucGFyZW50Tm9kZSE9PVAmJlAuYXBwZW5kQ2hpbGQoayl9ZWxzZSBOLndpZHRoPVdMKGIqYykrInB4IixOLmhlaWdodD1XTChTKmQpKyJweCIseS5hcHBlbmRDaGlsZChrKSxQJiZQLnBhcmVudE5vZGUmJih5LnJlbW92ZUNoaWxkKFApLHRoaXMuX2Nyb3BFbD1udWxsKTt2YXIgUj0iIixCPW4ub3BhY2l0eTtCPDEmJihSKz0iLkFscGhhKG9wYWNpdHk9IitXTCgxMDAqQikrIikgIiksUis9cUwrIi5BbHBoYUltYWdlTG9hZGVyKHNyYz0iK28rIiwgU2l6aW5nTWV0aG9kPXNjYWxlKSIsTi5maWx0ZXI9Uix5LnN0eWxlLnpJbmRleD1payh0aGlzLnpsZXZlbCx0aGlzLnosdGhpcy56MiksdGsodCx5KSxudWxsIT1uLnRleHQmJnRoaXMuZHJhd1JlY3RUZXh0KHQsdGhpcy5nZXRCb3VuZGluZ1JlY3QoKSl9fSxxbi5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24odCl7ZWsodCx0aGlzLl92bWxFbCksdGhpcy5fdm1sRWw9bnVsbCx0aGlzLl9jcm9wRWw9bnVsbCx0aGlzLl9pbWFnZUVsPW51bGwsdGhpcy5yZW1vdmVSZWN0VGV4dCh0KX0scW4ucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKHQpe3RrKHQsdGhpcy5fdm1sRWwpLHRoaXMuYXBwZW5kUmVjdFRleHQodCl9O3ZhciBzayxsaz0ibm9ybWFsIix1az17fSxoaz0wLGNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0dMPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Qkw7c2t8fCgoc2s9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7dG9wOi0yMDAwMHB4O2xlZnQ6MDtwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOm5vbmU7d2hpdGUtc3BhY2U6cHJlOyIsQkwuYm9keS5hcHBlbmRDaGlsZChzaykpO3RyeXtzay5zdHlsZS5mb250PWV9Y2F0Y2godCl7fXJldHVybiBzay5pbm5lckhUTUw9IiIsc2suYXBwZW5kQ2hpbGQoaS5jcmVhdGVUZXh0Tm9kZSh0KSkse3dpZHRoOnNrLm9mZnNldFdpZHRofX0sdW5bIm1lYXN1cmVUZXh0Il09R0w7Zm9yKHZhciBkaz1uZXcgTWksZms9ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dGhpcy5zdHlsZTt0aGlzLl9fZGlydHkmJmtuKG8pO3ZhciBhPW8udGV4dDtpZihudWxsIT1hJiYoYSs9IiIpLGEpe2lmKG8ucmljaCl7dmFyIHI9d24oYSxvKTthPVtdO2Zvcih2YXIgcz0wO3M8ci5saW5lcy5sZW5ndGg7cysrKXtmb3IodmFyIGw9ci5saW5lc1tzXS50b2tlbnMsdT1bXSxoPTA7aDxsLmxlbmd0aDtoKyspdS5wdXNoKGxbaF0udGV4dCk7YS5wdXNoKHUuam9pbigiIikpfWE9YS5qb2luKCJcbiIpfXZhciBjLGQsZj1vLnRleHRBbGlnbixwPW8udGV4dFZlcnRpY2FsQWxpZ24sZz1mdW5jdGlvbih0KXt2YXIgZT11a1t0XTtpZighZSl7MTAwPGhrJiYoaGs9MCx1az17fSk7dmFyIGksbj1jay5zdHlsZTt0cnl7bi5mb250PXQsaT1uLmZvbnRGYW1pbHkuc3BsaXQoIiwiKVswXX1jYXRjaCh0KXt9ZT17c3R5bGU6bi5mb250U3R5bGV8fGxrLHZhcmlhbnQ6bi5mb250VmFyaWFudHx8bGssd2VpZ2h0Om4uZm9udFdlaWdodHx8bGssc2l6ZTowfHBhcnNlRmxvYXQobi5mb250U2l6ZXx8MTIpLGZhbWlseTppfHwiTWljcm9zb2Z0IFlhSGVpIn0sdWtbdF09ZSxoaysrfXJldHVybiBlfShvLmZvbnQpLG09Zy5zdHlsZSsiICIrZy52YXJpYW50KyIgIitnLndlaWdodCsiICIrZy5zaXplKydweCAiJytnLmZhbWlseSsnIic7aT1pfHxjbihhLG0sZixwLG8udGV4dFBhZGRpbmcsby50ZXh0TGluZUhlaWdodCk7dmFyIHY9dGhpcy50cmFuc2Zvcm07aWYodiYmIW4mJihkay5jb3B5KGUpLGRrLmFwcGx5VHJhbnNmb3JtKHYpLGU9ZGspLG4pYz1lLngsZD1lLnk7ZWxzZXt2YXIgeT1vLnRleHRQb3NpdGlvbjtpZih5IGluc3RhbmNlb2YgQXJyYXkpYz1lLngrbmsoeVswXSxlLndpZHRoKSxkPWUueStuayh5WzFdLGUuaGVpZ2h0KSxmPWZ8fCJsZWZ0IjtlbHNle3ZhciB4PXRoaXMuY2FsY3VsYXRlVGV4dFBvc2l0aW9uP3RoaXMuY2FsY3VsYXRlVGV4dFBvc2l0aW9uKHt9LG8sZSk6cG4oe30sbyxlKTtjPXgueCxkPXgueSxmPWZ8fHgudGV4dEFsaWduLHA9cHx8eC50ZXh0VmVydGljYWxBbGlnbn19Yz1kbihjLGkud2lkdGgsZiksZD1mbihkLGkuaGVpZ2h0LHApLGQrPWkuaGVpZ2h0LzI7dmFyIF8sdyxiLFM9VkwsTT10aGlzLl90ZXh0Vm1sRWw7TT93PShfPShiPU0uZmlyc3RDaGlsZCkubmV4dFNpYmxpbmcpLm5leHRTaWJsaW5nOihNPVMoImxpbmUiKSxfPVMoInBhdGgiKSx3PVMoInRleHRwYXRoIiksYj1TKCJza2V3Iiksdy5zdHlsZVsidi10ZXh0LWFsaWduIl09ImxlZnQiLEpMKE0pLF8udGV4dHBhdGhvaz0hMCx3Lm9uPSEwLE0uZnJvbT0iMCAwIixNLnRvPSIxMDAwIDAuMDUiLHRrKE0sYiksdGsoTSxfKSx0ayhNLHcpLHRoaXMuX3RleHRWbWxFbD1NKTt2YXIgST1bYyxkXSxUPU0uc3R5bGU7diYmbj8oYnQoSSxJLHYpLGIub249ITAsYi5tYXRyaXg9dlswXS50b0ZpeGVkKDMpK2pMK3ZbMl0udG9GaXhlZCgzKStqTCt2WzFdLnRvRml4ZWQoMykrakwrdlszXS50b0ZpeGVkKDMpKyIsMCwwIixiLm9mZnNldD0oV0woSVswXSl8fDApKyIsIisoV0woSVsxXSl8fDApLGIub3JpZ2luPSIwIDAiLFQubGVmdD0iMHB4IixULnRvcD0iMHB4Iik6KGIub249ITEsVC5sZWZ0PVdMKGMpKyJweCIsVC50b3A9V0woZCkrInB4Iiksdy5zdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX0oYSk7dHJ5e3cuc3R5bGUuZm9udD1tfWNhdGNoKHQpe31hayhNLCJmaWxsIix7ZmlsbDpvLnRleHRGaWxsLG9wYWNpdHk6by5vcGFjaXR5fSx0aGlzKSxhayhNLCJzdHJva2UiLHtzdHJva2U6by50ZXh0U3Ryb2tlLG9wYWNpdHk6by5vcGFjaXR5LGxpbmVEYXNoOm8ubGluZURhc2h8fG51bGx9LHRoaXMpLE0uc3R5bGUuekluZGV4PWlrKHRoaXMuemxldmVsLHRoaXMueix0aGlzLnoyKSx0ayh0LE0pfX0scGs9ZnVuY3Rpb24odCl7ZWsodCx0aGlzLl90ZXh0Vm1sRWwpLHRoaXMuX3RleHRWbWxFbD1udWxsfSxnaz1mdW5jdGlvbih0KXt0ayh0LHRoaXMuX3RleHRWbWxFbCl9LG1rPVtYbixqbixxbixTcixGcl0sdms9MDt2azxtay5sZW5ndGg7dmsrKyl7dmFyIHlrPW1rW3ZrXS5wcm90b3R5cGU7eWsuZHJhd1JlY3RUZXh0PWZrLHlrLnJlbW92ZVJlY3RUZXh0PXBrLHlrLmFwcGVuZFJlY3RUZXh0PWdrfUZyLnByb3RvdHlwZS5icnVzaFZNTD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0eWxlO251bGwhPWUudGV4dD90aGlzLmRyYXdSZWN0VGV4dCh0LHt4OmUueHx8MCx5OmUueXx8MCx3aWR0aDowLGhlaWdodDowfSx0aGlzLmdldEJvdW5kaW5nUmVjdCgpLCEwKTp0aGlzLnJlbW92ZVJlY3RUZXh0KHQpfSxGci5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVSZWN0VGV4dCh0KX0sRnIucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKHQpe3RoaXMuYXBwZW5kUmVjdFRleHQodCl9fWZ1bmN0aW9uIHhrKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX1mdW5jdGlvbiBfayh0LGUpeyFmdW5jdGlvbigpe2lmKCFSTCYmQkwpe1JMPSEwO3ZhciB0PUJMLnN0eWxlU2hlZXRzO3QubGVuZ3RoPDMxP0JMLmNyZWF0ZVN0eWxlU2hlZXQoKS5hZGRSdWxlKCIuenJ2bWwiLCJiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKSIpOnRbMF0uYWRkUnVsZSgiLnpydm1sIiwiYmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCkiKX19KCksdGhpcy5yb290PXQsdGhpcy5zdG9yYWdlPWU7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDozMDBweDtoZWlnaHQ6MTUwcHg7IixuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDsiLHQuYXBwZW5kQ2hpbGQoaSksdGhpcy5fdm1sUm9vdD1uLHRoaXMuX3ZtbFZpZXdwb3J0PWksdGhpcy5yZXNpemUoKTt2YXIgbz1lLmRlbEZyb21TdG9yYWdlLGE9ZS5hZGRUb1N0b3JhZ2U7ZS5kZWxGcm9tU3RvcmFnZT1mdW5jdGlvbih0KXtvLmNhbGwoZSx0KSx0JiZ0Lm9uUmVtb3ZlJiZ0Lm9uUmVtb3ZlKG4pfSxlLmFkZFRvU3RvcmFnZT1mdW5jdGlvbih0KXt0Lm9uQWRkJiZ0Lm9uQWRkKG4pLGEuY2FsbChlLHQpfSx0aGlzLl9maXJzdFBhaW50PSEwfV9rLnByb3RvdHlwZT17Y29uc3RydWN0b3I6X2ssZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiJ2bWwifSxnZXRWaWV3cG9ydFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdm1sVmlld3BvcnR9LGdldFZpZXdwb3J0Um9vdE9mZnNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Vmlld3BvcnRSb290KCk7aWYodClyZXR1cm57b2Zmc2V0TGVmdDp0Lm9mZnNldExlZnR8fDAsb2Zmc2V0VG9wOnQub2Zmc2V0VG9wfHwwfX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCghMCwhMCk7dGhpcy5fcGFpbnRMaXN0KHQpfSxfcGFpbnRMaXN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl92bWxSb290LGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG49dFtpXTtuLmludmlzaWJsZXx8bi5pZ25vcmU/KG4uX19hbHJlYWR5Tm90VmlzaWJsZXx8bi5vblJlbW92ZShlKSxuLl9fYWxyZWFkeU5vdFZpc2libGU9ITApOihuLl9fYWxyZWFkeU5vdFZpc2libGUmJm4ub25BZGQoZSksbi5fX2FscmVhZHlOb3RWaXNpYmxlPSExLG4uX19kaXJ0eSYmKG4uYmVmb3JlQnJ1c2gmJm4uYmVmb3JlQnJ1c2goKSwobi5icnVzaFZNTHx8bi5icnVzaCkuY2FsbChuLGUpLG4uYWZ0ZXJCcnVzaCYmbi5hZnRlckJydXNoKCkpKSxuLl9fZGlydHk9ITF9dGhpcy5fZmlyc3RQYWludCYmKHRoaXMuX3ZtbFZpZXdwb3J0LmFwcGVuZENoaWxkKGUpLHRoaXMuX2ZpcnN0UGFpbnQ9ITEpfSxyZXNpemU6ZnVuY3Rpb24odCxlKXt0PW51bGw9PXQ/dGhpcy5fZ2V0V2lkdGgoKTp0LGU9bnVsbD09ZT90aGlzLl9nZXRIZWlnaHQoKTplO2lmKHRoaXMuX3dpZHRoIT09dHx8dGhpcy5faGVpZ2h0IT09ZSl7dGhpcy5fd2lkdGg9dCx0aGlzLl9oZWlnaHQ9ZTt2YXIgaT10aGlzLl92bWxWaWV3cG9ydC5zdHlsZTtpLndpZHRoPXQrInB4IixpLmhlaWdodD1lKyJweCJ9fSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5yb290LmlubmVySFRNTD0iIix0aGlzLl92bWxSb290PXRoaXMuX3ZtbFZpZXdwb3J0PXRoaXMuc3RvcmFnZT1udWxsfSxnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWR0aH0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlaWdodH0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLl92bWxWaWV3cG9ydCYmdGhpcy5yb290LnJlbW92ZUNoaWxkKHRoaXMuX3ZtbFZpZXdwb3J0KX0sX2dldFdpZHRoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yb290LGU9dC5jdXJyZW50U3R5bGU7cmV0dXJuKHQuY2xpZW50V2lkdGh8fHhrKGUud2lkdGgpKS14ayhlLnBhZGRpbmdMZWZ0KS14ayhlLnBhZGRpbmdSaWdodCl8MH0sX2dldEhlaWdodDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucm9vdCxlPXQuY3VycmVudFN0eWxlO3JldHVybih0LmNsaWVudEhlaWdodHx8eGsoZS5oZWlnaHQpKS14ayhlLnBhZGRpbmdUb3ApLXhrKGUucGFkZGluZ0JvdHRvbSl8MH19LEUoWyJnZXRMYXllciIsImluc2VydExheWVyIiwiZWFjaExheWVyIiwiZWFjaEJ1aWx0aW5MYXllciIsImVhY2hPdGhlckxheWVyIiwiZ2V0TGF5ZXJzIiwibW9kTGF5ZXIiLCJkZWxMYXllciIsImNsZWFyTGF5ZXIiLCJ0b0RhdGFVUkwiLCJwYXRoVG9JbWFnZSJdLGZ1bmN0aW9uKHQpe19rLnByb3RvdHlwZVt0XT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtmaSgnSW4gSUU4LjAgVk1MIG1vZGUgcGFpbnRlciBub3Qgc3VwcG9ydCBtZXRob2QgIicrdCsnIicpfX0odCl9KSxEbygidm1sIixfayk7ZnVuY3Rpb24gd2sodCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHQpfXZhciBiaz1pci5DTUQsU2s9QXJyYXkucHJvdG90eXBlLmpvaW4sTWs9Im5vbmUiLElrPU1hdGgucm91bmQsVGs9TWF0aC5zaW4sQWs9TWF0aC5jb3MsRGs9TWF0aC5QSSxDaz0yKk1hdGguUEksTGs9MTgwL0RrLGtrPTFlLTQ7ZnVuY3Rpb24gUGsodCl7cmV0dXJuIElrKDFlNCp0KS8xZTR9ZnVuY3Rpb24gTmsodCl7cmV0dXJuIHQ8a2smJi1razx0fWZ1bmN0aW9uIE9rKHQsZSl7ZSYmRWsodCwidHJhbnNmb3JtIiwibWF0cml4KCIrU2suY2FsbChlLCIsIikrIikiKX1mdW5jdGlvbiBFayh0LGUsaSl7aSYmKCJsaW5lYXIiPT09aS50eXBlfHwicmFkaWFsIj09PWkudHlwZSl8fHQuc2V0QXR0cmlidXRlKGUsaSl9ZnVuY3Rpb24gemsodCxlLGksbil7aWYoZnVuY3Rpb24odCxlKXt2YXIgaT1lP3QudGV4dEZpbGw6dC5maWxsO3JldHVybiBudWxsIT1pJiZpIT09TWt9KGUsaSkpe3ZhciBvPWk/ZS50ZXh0RmlsbDplLmZpbGw7RWsodCwiZmlsbCIsbz0idHJhbnNwYXJlbnQiPT09bz9NazpvKSxFayh0LCJmaWxsLW9wYWNpdHkiLG51bGwhPWUuZmlsbE9wYWNpdHk/ZS5maWxsT3BhY2l0eSplLm9wYWNpdHk6ZS5vcGFjaXR5KX1lbHNlIEVrKHQsImZpbGwiLE1rKTtpZihmdW5jdGlvbih0LGUpe3ZhciBpPWU/dC50ZXh0U3Ryb2tlOnQuc3Ryb2tlO3JldHVybiBudWxsIT1pJiZpIT09TWt9KGUsaSkpe3ZhciBhPWk/ZS50ZXh0U3Ryb2tlOmUuc3Ryb2tlO0VrKHQsInN0cm9rZSIsYT0idHJhbnNwYXJlbnQiPT09YT9NazphKSxFayh0LCJzdHJva2Utd2lkdGgiLChpP2UudGV4dFN0cm9rZVdpZHRoOmUubGluZVdpZHRoKS8oIWkmJmUuc3Ryb2tlTm9TY2FsZT9uLmdldExpbmVTY2FsZSgpOjEpKSxFayh0LCJwYWludC1vcmRlciIsaT8ic3Ryb2tlIjoiZmlsbCIpLEVrKHQsInN0cm9rZS1vcGFjaXR5IixudWxsIT1lLnN0cm9rZU9wYWNpdHk/ZS5zdHJva2VPcGFjaXR5OmUub3BhY2l0eSksZS5saW5lRGFzaD8oRWsodCwic3Ryb2tlLWRhc2hhcnJheSIsZS5saW5lRGFzaC5qb2luKCIsIikpLEVrKHQsInN0cm9rZS1kYXNob2Zmc2V0IixJayhlLmxpbmVEYXNoT2Zmc2V0fHwwKSkpOkVrKHQsInN0cm9rZS1kYXNoYXJyYXkiLCIiKSxlLmxpbmVDYXAmJkVrKHQsInN0cm9rZS1saW5lY2FwIixlLmxpbmVDYXApLGUubGluZUpvaW4mJkVrKHQsInN0cm9rZS1saW5lam9pbiIsZS5saW5lSm9pbiksZS5taXRlckxpbWl0JiZFayh0LCJzdHJva2UtbWl0ZXJsaW1pdCIsZS5taXRlckxpbWl0KX1lbHNlIEVrKHQsInN0cm9rZSIsTWspfXZhciBSaz17fTtSay5icnVzaD1mdW5jdGlvbih0KXt2YXIgZT10LnN0eWxlLGk9dC5fX3N2Z0VsO2l8fChpPXdrKCJwYXRoIiksdC5fX3N2Z0VsPWkpLHQucGF0aHx8dC5jcmVhdGVQYXRoUHJveHkoKTt2YXIgbj10LnBhdGg7aWYodC5fX2RpcnR5UGF0aCl7bi5iZWdpblBhdGgoKSxuLnN1YlBpeGVsT3B0aW1pemU9ITEsdC5idWlsZFBhdGgobix0LnNoYXBlKSx0Ll9fZGlydHlQYXRoPSExO3ZhciBvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPXQuZGF0YSxuPXQubGVuKCksbz0wO288bjspe3ZhciBhPSIiLHI9MDtzd2l0Y2goaVtvKytdKXtjYXNlIGJrLk06YT0iTSIscj0yO2JyZWFrO2Nhc2UgYmsuTDphPSJMIixyPTI7YnJlYWs7Y2FzZSBiay5ROmE9IlEiLHI9NDticmVhaztjYXNlIGJrLkM6YT0iQyIscj02O2JyZWFrO2Nhc2UgYmsuQTp2YXIgcz1pW28rK10sbD1pW28rK10sdT1pW28rK10saD1pW28rK10sYz1pW28rK10sZD1pW28rK10sZj1pW28rK10scD1pW28rK10sZz1NYXRoLmFicyhkKSxtPU5rKGctQ2spfHwocD9Dazw9ZDpDazw9LWQpLHY9MDxkP2QlQ2s6ZCVDaytDayx5PSExO3k9ISFtfHwhTmsoZykmJkRrPD12PT0hIXA7dmFyIHg9UGsocyt1KkFrKGMpKSxfPVBrKGwraCpUayhjKSk7bSYmKGQ9cD9Day0xZS00OjFlLTQtQ2sseT0hMCw5PT09byYmZS5wdXNoKCJNIix4LF8pKTt2YXIgdz1QayhzK3UqQWsoYytkKSksYj1QayhsK2gqVGsoYytkKSk7ZS5wdXNoKCJBIixQayh1KSxQayhoKSxJayhmKkxrKSwreSwrcCx3LGIpO2JyZWFrO2Nhc2UgYmsuWjphPSJaIjticmVhaztjYXNlIGJrLlI6dz1QayhpW28rK10pLGI9UGsoaVtvKytdKTt2YXIgUz1QayhpW28rK10pLE09UGsoaVtvKytdKTtlLnB1c2goIk0iLHcsYiwiTCIsdytTLGIsIkwiLHcrUyxiK00sIkwiLHcsYitNLCJMIix3LGIpfWEmJmUucHVzaChhKTtmb3IodmFyIEk9MDtJPHI7SSsrKWUucHVzaChQayhpW28rK10pKX1yZXR1cm4gZS5qb2luKCIgIil9KG4pO28uaW5kZXhPZigiTmFOIik8MCYmRWsoaSwiZCIsbyl9emsoaSxlLCExLHQpLE9rKGksdC50cmFuc2Zvcm0pLG51bGwhPWUudGV4dD9aayh0LHQuZ2V0Qm91bmRpbmdSZWN0KCkpOlhrKHQpfTt2YXIgQms9e2JydXNoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3R5bGUsaT1lLmltYWdlO2kgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50JiYoaT1pLnNyYyk7aWYoaSl7dmFyIG49ZS54fHwwLG89ZS55fHwwLGE9ZS53aWR0aCxyPWUuaGVpZ2h0LHM9dC5fX3N2Z0VsO3N8fChzPXdrKCJpbWFnZSIpLHQuX19zdmdFbD1zKSxpIT09dC5fX2ltYWdlU3JjJiYoZnVuY3Rpb24odCxlLGkpe3Quc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLGUsaSl9KHMsImhyZWYiLGkpLHQuX19pbWFnZVNyYz1pKSxFayhzLCJ3aWR0aCIsYSksRWsocywiaGVpZ2h0IixyKSxFayhzLCJ4IixuKSxFayhzLCJ5IixvKSxPayhzLHQudHJhbnNmb3JtKSxudWxsIT1lLnRleHQ/WmsodCx0LmdldEJvdW5kaW5nUmVjdCgpKTpYayh0KX19fSxWaz17fSxHaz1uZXcgTWksRms9e30sV2s9W10sSGs9e2xlZnQ6InN0YXJ0IixyaWdodDoiZW5kIixjZW50ZXI6Im1pZGRsZSIsbWlkZGxlOiJtaWRkbGUifSxaaz1mdW5jdGlvbih0LGUpe3ZhciBpPXQuc3R5bGUsbj10LnRyYW5zZm9ybSxvPXQgaW5zdGFuY2VvZiBGcnx8aS50cmFuc2Zvcm1UZXh0O3QuX19kaXJ0eSYma24oaSk7dmFyIGE9aS50ZXh0O2lmKG51bGwhPWEmJihhKz0iIiksVW4oYSxpKSl7bnVsbD09YSYmKGE9IiIpLCFvJiZuJiYoR2suY29weShlKSxHay5hcHBseVRyYW5zZm9ybShuKSxlPUdrKTt2YXIgcj10Ll9fdGV4dFN2Z0VsO3J8fChyPXdrKCJ0ZXh0IiksdC5fX3RleHRTdmdFbD1yKTt2YXIgcz1yLnN0eWxlLGw9aS5mb250fHxsbix1PXIuX19jb21wdXRlZEZvbnQ7bCE9PXIuX19zdHlsZUZvbnQmJihzLmZvbnQ9ci5fX3N0eWxlRm9udD1sLHU9ci5fX2NvbXB1dGVkRm9udD1zLmZvbnQpO3ZhciBoPWkudGV4dFBhZGRpbmcsYz1pLnRleHRMaW5lSGVpZ2h0LGQ9dC5fX3RleHRDb3RlbnRCbG9jaztkJiYhdC5fX2RpcnR5VGV4dHx8KGQ9dC5fX3RleHRDb3RlbnRCbG9jaz1fbihhLHUsaCxjLGkudHJ1bmNhdGUpKTt2YXIgZj1kLm91dGVySGVpZ2h0LHA9ZC5saW5lSGVpZ2h0O1ZuKEZrLHQsaSxlKTt2YXIgZz1Gay5iYXNlWCxtPUZrLmJhc2VZLHY9RmsudGV4dEFsaWdufHwibGVmdCIseT1Gay50ZXh0VmVydGljYWxBbGlnbjshZnVuY3Rpb24odCxlLGksbixvLGEscil7aWUoV2spLGUmJmkmJm5lKFdrLGkpO3ZhciBzPW4udGV4dFJvdGF0aW9uO2lmKG8mJnMpe3ZhciBsPW4udGV4dE9yaWdpbjsiY2VudGVyIj09PWw/KGE9by53aWR0aC8yK28ueCxyPW8uaGVpZ2h0LzIrby55KTpsJiYoYT1sWzBdK28ueCxyPWxbMV0rby55KSxXa1s0XS09YSxXa1s1XS09cixyZShXayxXayxzKSxXa1s0XSs9YSxXa1s1XSs9cn1Payh0LFdrKX0ocixvLG4saSxlLGcsbSk7dmFyIHg9ZyxfPWZuKG0sZix5KTtoJiYoeD1mdW5jdGlvbih0LGUsaSl7cmV0dXJuInJpZ2h0Ij09PWU/dC1pWzFdOiJjZW50ZXIiPT09ZT90K2lbM10vMi1pWzFdLzI6dCtpWzNdfShnLHYsaCksXys9aFswXSksXys9cC8yLHprKHIsaSwhMCx0KTt2YXIgdz1kLmNhbkNhY2hlQnlUZXh0U3RyaW5nLGI9dC5fX3RzcGFuTGlzdHx8KHQuX190c3Bhbkxpc3Q9W10pLFM9Yi5sZW5ndGg7aWYodyYmdC5fX2NhbkNhY2hlQnlUZXh0U3RyaW5nJiZ0Ll9fdGV4dD09PWEpe2lmKHQuX19kaXJ0eVRleHQmJlMpZm9yKHZhciBNPTA7TTxTOysrTSlVayhiW01dLHYseCxfK00qcCl9ZWxzZXt0Ll9fdGV4dD1hLHQuX19jYW5DYWNoZUJ5VGV4dFN0cmluZz13O3ZhciBJPWQubGluZXMsVD1JLmxlbmd0aDtmb3IoTT0wO008VDtNKyspe3ZhciBBPWJbTV0sRD1JW01dO0E/QS5fX3pyVGV4dCE9PUQmJihBLmlubmVySFRNTD0iIixBLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKEQpKSk6KEE9YltNXT13aygidHNwYW4iKSxyLmFwcGVuZENoaWxkKEEpLEEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoRCkpKSxVayhBLHYseCxfK00qcCl9aWYoVDxTKXtmb3IoO008UztNKyspci5yZW1vdmVDaGlsZChiW01dKTtiLmxlbmd0aD1UfX19fTtmdW5jdGlvbiBVayh0LGUsaSxuKXtFayh0LCJkb21pbmFudC1iYXNlbGluZSIsIm1pZGRsZSIpLEVrKHQsInRleHQtYW5jaG9yIixIa1tlXSksRWsodCwieCIsaSksRWsodCwieSIsbil9ZnVuY3Rpb24gWGsodCl7dCYmdC5fX3RleHRTdmdFbCYmKHQuX190ZXh0U3ZnRWwucGFyZW50Tm9kZSYmdC5fX3RleHRTdmdFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQuX190ZXh0U3ZnRWwpLHQuX190ZXh0U3ZnRWw9bnVsbCx0Ll9fdHNwYW5MaXN0PVtdLHQuX190ZXh0PW51bGwpfWZ1bmN0aW9uIFlrKCl7fWZ1bmN0aW9uIGprKHQsZSl7Zm9yKHZhciBpPTAsbj1lLmxlbmd0aCxvPTAsYT0wO2k8bjtpKyspe3ZhciByPWVbaV07aWYoci5yZW1vdmVkKXtmb3Iocz1bXSxsPWE7bDxhK3IuY291bnQ7bCsrKXMucHVzaChsKTtyLmluZGljZXM9cyxhKz1yLmNvdW50fWVsc2V7Zm9yKHZhciBzPVtdLGw9bztsPG8rci5jb3VudDtsKyspcy5wdXNoKGwpO3IuaW5kaWNlcz1zLG8rPXIuY291bnQsci5hZGRlZHx8KGErPXIuY291bnQpfX1yZXR1cm4gZX1Way5kcmF3UmVjdFRleHQ9WmssVmsuYnJ1c2g9ZnVuY3Rpb24odCl7bnVsbCE9dC5zdHlsZS50ZXh0P1prKHQsITEpOlhrKHQpfSxZay5wcm90b3R5cGU9e2RpZmY6ZnVuY3Rpb24obCx1LHQpe3Q9dHx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV9LHRoaXMuZXF1YWxzPXQ7dmFyIGg9dGhpcztsPWwuc2xpY2UoKTt2YXIgYz0odT11LnNsaWNlKCkpLmxlbmd0aCxkPWwubGVuZ3RoLGY9MSxlPWMrZCxwPVt7bmV3UG9zOi0xLGNvbXBvbmVudHM6W119XSxpPXRoaXMuZXh0cmFjdENvbW1vbihwWzBdLHUsbCwwKTtpZihwWzBdLm5ld1BvcysxPj1jJiZkPD1pKzEpe2Zvcih2YXIgbj1bXSxvPTA7bzx1Lmxlbmd0aDtvKyspbi5wdXNoKG8pO3JldHVyblt7aW5kaWNlczpuLGNvdW50OnUubGVuZ3RofV19ZnVuY3Rpb24gYSgpe2Zvcih2YXIgdD0tMSpmO3Q8PWY7dCs9Mil7dmFyIGUsaT1wW3QtMV0sbj1wW3QrMV0sbz0obj9uLm5ld1BvczowKS10O2kmJihwW3QtMV09dm9pZCAwKTt2YXIgYT1pJiZpLm5ld1BvcysxPGMscj1uJiYwPD1vJiZvPGQ7aWYoYXx8cil7aWYoIWF8fHImJmkubmV3UG9zPG4ubmV3UG9zPyhlPXtuZXdQb3M6KHM9bikubmV3UG9zLGNvbXBvbmVudHM6cy5jb21wb25lbnRzLnNsaWNlKDApfSxoLnB1c2hDb21wb25lbnQoZS5jb21wb25lbnRzLHZvaWQgMCwhMCkpOigoZT1pKS5uZXdQb3MrKyxoLnB1c2hDb21wb25lbnQoZS5jb21wb25lbnRzLCEwLHZvaWQgMCkpLG89aC5leHRyYWN0Q29tbW9uKGUsdSxsLHQpLGUubmV3UG9zKzE+PWMmJmQ8PW8rMSlyZXR1cm4gamsoaCxlLmNvbXBvbmVudHMsdSxsKTtwW3RdPWV9ZWxzZSBwW3RdPXZvaWQgMH12YXIgcztmKyt9Zm9yKDtmPD1lOyl7dmFyIHI9YSgpO2lmKHIpcmV0dXJuIHJ9fSxwdXNoQ29tcG9uZW50OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10W3QubGVuZ3RoLTFdO24mJm4uYWRkZWQ9PT1lJiZuLnJlbW92ZWQ9PT1pP3RbdC5sZW5ndGgtMV09e2NvdW50Om4uY291bnQrMSxhZGRlZDplLHJlbW92ZWQ6aX06dC5wdXNoKHtjb3VudDoxLGFkZGVkOmUscmVtb3ZlZDppfSl9LGV4dHJhY3RDb21tb246ZnVuY3Rpb24odCxlLGksbil7Zm9yKHZhciBvPWUubGVuZ3RoLGE9aS5sZW5ndGgscj10Lm5ld1BvcyxzPXItbixsPTA7cisxPG8mJnMrMTxhJiZ0aGlzLmVxdWFscyhlW3IrMV0saVtzKzFdKTspcisrLHMrKyxsKys7cmV0dXJuIGwmJnQuY29tcG9uZW50cy5wdXNoKHtjb3VudDpsfSksdC5uZXdQb3M9cixzfSx0b2tlbml6ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5zbGljZSgpfSxqb2luOmZ1bmN0aW9uKHQpe3JldHVybiB0LnNsaWNlKCl9fTt2YXIgcWs9bmV3IFlrO2Z1bmN0aW9uIEtrKHQsZSxpLG4sbyl7dGhpcy5fenJJZD10LHRoaXMuX3N2Z1Jvb3Q9ZSx0aGlzLl90YWdOYW1lcz0ic3RyaW5nIj09dHlwZW9mIGk/W2ldOmksdGhpcy5fbWFya0xhYmVsPW4sdGhpcy5fZG9tTmFtZT1vfHwiX2RvbSIsdGhpcy5uZXh0SWQ9MH1mdW5jdGlvbiAkayh0LGUpe0trLmNhbGwodGhpcyx0LGUsWyJsaW5lYXJHcmFkaWVudCIsInJhZGlhbEdyYWRpZW50Il0sIl9fZ3JhZGllbnRfaW5fdXNlX18iKX1mdW5jdGlvbiBKayh0LGUpe0trLmNhbGwodGhpcyx0LGUsImNsaXBQYXRoIiwiX19jbGlwcGF0aF9pbl91c2VfXyIpfWZ1bmN0aW9uIFFrKHQsZSl7S2suY2FsbCh0aGlzLHQsZSxbImZpbHRlciJdLCJfX2ZpbHRlcl9pbl91c2VfXyIsIl9zaGFkb3dEb20iKX1mdW5jdGlvbiB0UCh0KXtyZXR1cm4gdCYmKHQuc2hhZG93Qmx1cnx8dC5zaGFkb3dPZmZzZXRYfHx0LnNoYWRvd09mZnNldFl8fHQudGV4dFNoYWRvd0JsdXJ8fHQudGV4dFNoYWRvd09mZnNldFh8fHQudGV4dFNoYWRvd09mZnNldFkpfWZ1bmN0aW9uIGVQKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX1mdW5jdGlvbiBpUCh0LGUpe3JldHVybiBlJiZ0JiZlLnBhcmVudE5vZGUhPT10fWZ1bmN0aW9uIG5QKHQsZSxpKXtpZihpUCh0LGUpJiZpKXt2YXIgbj1pLm5leHRTaWJsaW5nO24/dC5pbnNlcnRCZWZvcmUoZSxuKTp0LmFwcGVuZENoaWxkKGUpfX1mdW5jdGlvbiBvUCh0LGUpe2lmKGlQKHQsZSkpe3ZhciBpPXQuZmlyc3RDaGlsZDtpP3QuaW5zZXJ0QmVmb3JlKGUsaSk6dC5hcHBlbmRDaGlsZChlKX19ZnVuY3Rpb24gYVAodCxlKXtlJiZ0JiZlLnBhcmVudE5vZGU9PT10JiZ0LnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHJQKHQpe3JldHVybiB0Ll9fdGV4dFN2Z0VsfWZ1bmN0aW9uIHNQKHQpe3JldHVybiB0Ll9fc3ZnRWx9S2sucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9d2ssS2sucHJvdG90eXBlLmdldERlZnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3ZnUm9vdCxuPXRoaXMuX3N2Z1Jvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRlZnMiKTtyZXR1cm4gMD09PW4ubGVuZ3RoP3Q/KChuPWUuaW5zZXJ0QmVmb3JlKHRoaXMuY3JlYXRlRWxlbWVudCgiZGVmcyIpLGUuZmlyc3RDaGlsZCkpLmNvbnRhaW5zfHwobi5jb250YWlucz1mdW5jdGlvbih0KXt2YXIgZT1uLmNoaWxkcmVuO2lmKCFlKXJldHVybiExO2Zvcih2YXIgaT1lLmxlbmd0aC0xOzA8PWk7LS1pKWlmKGVbaV09PT10KXJldHVybiEwO3JldHVybiExfSksbik6bnVsbDpuWzBdfSxLay5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSl7aWYodCl7dmFyIGk9dGhpcy5nZXREZWZzKCExKTtpZih0W3RoaXMuX2RvbU5hbWVdJiZpLmNvbnRhaW5zKHRbdGhpcy5fZG9tTmFtZV0pKSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHQpO2Vsc2V7dmFyIG49dGhpcy5hZGQodCk7biYmKHRbdGhpcy5fZG9tTmFtZV09bil9fX0sS2sucHJvdG90eXBlLmFkZERvbT1mdW5jdGlvbih0KXt0aGlzLmdldERlZnMoITApLmFwcGVuZENoaWxkKHQpfSxLay5wcm90b3R5cGUucmVtb3ZlRG9tPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGVmcyghMSk7ZSYmdFt0aGlzLl9kb21OYW1lXSYmKGUucmVtb3ZlQ2hpbGQodFt0aGlzLl9kb21OYW1lXSksdFt0aGlzLl9kb21OYW1lXT1udWxsKX0sS2sucHJvdG90eXBlLmdldERvbXM9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmdldERlZnMoITEpO2lmKCFpKXJldHVybltdO3ZhciBuPVtdO3JldHVybiBFKHRoaXMuX3RhZ05hbWVzLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk7bj1uLmNvbmNhdChbXS5zbGljZS5jYWxsKGUpKX0pLG59LEtrLnByb3RvdHlwZS5tYXJrQWxsVW51c2VkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXREb21zKCksZT10aGlzO0UodCxmdW5jdGlvbih0KXt0W2UuX21hcmtMYWJlbF09IjAifSl9LEtrLnByb3RvdHlwZS5tYXJrVXNlZD1mdW5jdGlvbih0KXt0JiYodFt0aGlzLl9tYXJrTGFiZWxdPSIxIil9LEtrLnByb3RvdHlwZS5yZW1vdmVVbnVzZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldERlZnMoITEpO2lmKGUpe3ZhciB0PXRoaXMuZ2V0RG9tcygpLGk9dGhpcztFKHQsZnVuY3Rpb24odCl7IjEiIT09dFtpLl9tYXJrTGFiZWxdJiZlLnJlbW92ZUNoaWxkKHQpfSl9fSxLay5wcm90b3R5cGUuZ2V0U3ZnUHJveHk9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBTcj9Sazp0IGluc3RhbmNlb2YgcW4/Qms6dCBpbnN0YW5jZW9mIEZyP1ZrOlJrfSxLay5wcm90b3R5cGUuZ2V0VGV4dFN2Z0VsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX190ZXh0U3ZnRWx9LEtrLnByb3RvdHlwZS5nZXRTdmdFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fc3ZnRWx9LHcoJGssS2spLCRrLnByb3RvdHlwZS5hZGRXaXRob3V0VXBkYXRlPWZ1bmN0aW9uKGEscil7aWYociYmci5zdHlsZSl7dmFyIHM9dGhpcztFKFsiZmlsbCIsInN0cm9rZSJdLGZ1bmN0aW9uKHQpe2lmKHIuc3R5bGVbdF0mJigibGluZWFyIj09PXIuc3R5bGVbdF0udHlwZXx8InJhZGlhbCI9PT1yLnN0eWxlW3RdLnR5cGUpKXt2YXIgZSxpPXIuc3R5bGVbdF0sbj1zLmdldERlZnMoITApO2kuX2RvbT8oZT1pLl9kb20sbi5jb250YWlucyhpLl9kb20pfHxzLmFkZERvbShlKSk6ZT1zLmFkZChpKSxzLm1hcmtVc2VkKHIpO3ZhciBvPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2Euc2V0QXR0cmlidXRlKHQsInVybCgjIitvKyIpIil9fSl9fSwkay5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCJsaW5lYXIiPT09dC50eXBlKWU9dGhpcy5jcmVhdGVFbGVtZW50KCJsaW5lYXJHcmFkaWVudCIpO2Vsc2V7aWYoInJhZGlhbCIhPT10LnR5cGUpcmV0dXJuIGZpKCJJbGxlZ2FsIGdyYWRpZW50IHR5cGUuIiksbnVsbDtlPXRoaXMuY3JlYXRlRWxlbWVudCgicmFkaWFsR3JhZGllbnQiKX1yZXR1cm4gdC5pZD10LmlkfHx0aGlzLm5leHRJZCsrLGUuc2V0QXR0cmlidXRlKCJpZCIsInpyIit0aGlzLl96cklkKyItZ3JhZGllbnQtIit0LmlkKSx0aGlzLnVwZGF0ZURvbSh0LGUpLHRoaXMuYWRkRG9tKGUpLGV9LCRrLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oaSl7dmFyIG49dGhpcztLay5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxpLGZ1bmN0aW9uKCl7dmFyIHQ9aS50eXBlLGU9aS5fZG9tLnRhZ05hbWU7ImxpbmVhciI9PT10JiYibGluZWFyR3JhZGllbnQiPT09ZXx8InJhZGlhbCI9PT10JiYicmFkaWFsR3JhZGllbnQiPT09ZT9uLnVwZGF0ZURvbShpLGkuX2RvbSk6KG4ucmVtb3ZlRG9tKGkpLG4uYWRkKGkpKX0pfSwkay5wcm90b3R5cGUudXBkYXRlRG9tPWZ1bmN0aW9uKHQsZSl7aWYoImxpbmVhciI9PT10LnR5cGUpZS5zZXRBdHRyaWJ1dGUoIngxIix0LngpLGUuc2V0QXR0cmlidXRlKCJ5MSIsdC55KSxlLnNldEF0dHJpYnV0ZSgieDIiLHQueDIpLGUuc2V0QXR0cmlidXRlKCJ5MiIsdC55Mik7ZWxzZXtpZigicmFkaWFsIiE9PXQudHlwZSlyZXR1cm4gdm9pZCBmaSgiSWxsZWdhbCBncmFkaWVudCB0eXBlLiIpO2Uuc2V0QXR0cmlidXRlKCJjeCIsdC54KSxlLnNldEF0dHJpYnV0ZSgiY3kiLHQueSksZS5zZXRBdHRyaWJ1dGUoInIiLHQucil9dC5nbG9iYWw/ZS5zZXRBdHRyaWJ1dGUoImdyYWRpZW50VW5pdHMiLCJ1c2VyU3BhY2VPblVzZSIpOmUuc2V0QXR0cmlidXRlKCJncmFkaWVudFVuaXRzIiwib2JqZWN0Qm91bmRpbmdCb3giKSxlLmlubmVySFRNTD0iIjtmb3IodmFyIGk9dC5jb2xvclN0b3BzLG49MCxvPWkubGVuZ3RoO248bzsrK24pe3ZhciBhPXRoaXMuY3JlYXRlRWxlbWVudCgic3RvcCIpO2Euc2V0QXR0cmlidXRlKCJvZmZzZXQiLDEwMCppW25dLm9mZnNldCsiJSIpO3ZhciByPWlbbl0uY29sb3I7aWYoci5pbmRleE9mKCExKSl7dmFyIHM9UmUocilbM10sbD1HZShyKTthLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsIiMiK2wpLGEuc2V0QXR0cmlidXRlKCJzdG9wLW9wYWNpdHkiLHMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGlbbl0uY29sb3IpO2UuYXBwZW5kQ2hpbGQoYSl9dC5fZG9tPWV9LCRrLnByb3RvdHlwZS5tYXJrVXNlZD1mdW5jdGlvbih0KXtpZih0LnN0eWxlKXt2YXIgZT10LnN0eWxlLmZpbGw7ZSYmZS5fZG9tJiZLay5wcm90b3R5cGUubWFya1VzZWQuY2FsbCh0aGlzLGUuX2RvbSksKGU9dC5zdHlsZS5zdHJva2UpJiZlLl9kb20mJktrLnByb3RvdHlwZS5tYXJrVXNlZC5jYWxsKHRoaXMsZS5fZG9tKX19LHcoSmssS2spLEprLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRTdmdFbGVtZW50KHQpO2UmJnRoaXMudXBkYXRlRG9tKGUsdC5fX2NsaXBQYXRocywhMSk7dmFyIGk9dGhpcy5nZXRUZXh0U3ZnRWxlbWVudCh0KTtpJiZ0aGlzLnVwZGF0ZURvbShpLHQuX19jbGlwUGF0aHMsITApLHRoaXMubWFya1VzZWQodCl9LEprLnByb3RvdHlwZS51cGRhdGVEb209ZnVuY3Rpb24odCxlLGkpe2lmKGUmJjA8ZS5sZW5ndGgpe3ZhciBuLG8sYT10aGlzLmdldERlZnMoITApLHI9ZVswXSxzPWk/Il90ZXh0RG9tIjoiX2RvbSI7cltzXT8obz1yW3NdLmdldEF0dHJpYnV0ZSgiaWQiKSxuPXJbc10sYS5jb250YWlucyhuKXx8YS5hcHBlbmRDaGlsZChuKSk6KG89InpyIit0aGlzLl96cklkKyItY2xpcC0iK3RoaXMubmV4dElkLCsrdGhpcy5uZXh0SWQsKG49dGhpcy5jcmVhdGVFbGVtZW50KCJjbGlwUGF0aCIpKS5zZXRBdHRyaWJ1dGUoImlkIixvKSxhLmFwcGVuZENoaWxkKG4pLHJbc109bik7dmFyIGw9dGhpcy5nZXRTdmdQcm94eShyKTtpZihyLnRyYW5zZm9ybSYmci5wYXJlbnQuaW52VHJhbnNmb3JtJiYhaSl7dmFyIHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoci50cmFuc2Zvcm0pO29lKHIudHJhbnNmb3JtLHIucGFyZW50LmludlRyYW5zZm9ybSxyLnRyYW5zZm9ybSksbC5icnVzaChyKSxyLnRyYW5zZm9ybT11fWVsc2UgbC5icnVzaChyKTt2YXIgaD10aGlzLmdldFN2Z0VsZW1lbnQocik7bi5pbm5lckhUTUw9IiIsbi5hcHBlbmRDaGlsZChoLmNsb25lTm9kZSgpKSx0LnNldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIiwidXJsKCMiK28rIikiKSwxPGUubGVuZ3RoJiZ0aGlzLnVwZGF0ZURvbShuLGUuc2xpY2UoMSksaSl9ZWxzZSB0JiZ0LnNldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIiwibm9uZSIpfSxKay5wcm90b3R5cGUubWFya1VzZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0Ll9fY2xpcFBhdGhzJiZFKHQuX19jbGlwUGF0aHMsZnVuY3Rpb24odCl7dC5fZG9tJiZLay5wcm90b3R5cGUubWFya1VzZWQuY2FsbChlLHQuX2RvbSksdC5fdGV4dERvbSYmS2sucHJvdG90eXBlLm1hcmtVc2VkLmNhbGwoZSx0Ll90ZXh0RG9tKX0pfSx3KFFrLEtrKSxRay5wcm90b3R5cGUuYWRkV2l0aG91dFVwZGF0ZT1mdW5jdGlvbih0LGUpe2lmKGUmJnRQKGUuc3R5bGUpKXt2YXIgaTtpZihlLl9zaGFkb3dEb20paT1lLl9zaGFkb3dEb20sdGhpcy5nZXREZWZzKCEwKS5jb250YWlucyhlLl9zaGFkb3dEb20pfHx0aGlzLmFkZERvbShpKTtlbHNlIGk9dGhpcy5hZGQoZSk7dGhpcy5tYXJrVXNlZChlKTt2YXIgbj1pLmdldEF0dHJpYnV0ZSgiaWQiKTt0LnN0eWxlLmZpbHRlcj0idXJsKCMiK24rIikifX0sUWsucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNyZWF0ZUVsZW1lbnQoImZpbHRlciIpO3JldHVybiB0Ll9zaGFkb3dEb21JZD10Ll9zaGFkb3dEb21JZHx8dGhpcy5uZXh0SWQrKyxlLnNldEF0dHJpYnV0ZSgiaWQiLCJ6ciIrdGhpcy5fenJJZCsiLXNoYWRvdy0iK3QuX3NoYWRvd0RvbUlkKSx0aGlzLnVwZGF0ZURvbSh0LGUpLHRoaXMuYWRkRG9tKGUpLGV9LFFrLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtpZih0UChlLnN0eWxlKSl7dmFyIGk9dGhpcztLay5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxlLGZ1bmN0aW9uKCl7aS51cGRhdGVEb20oZSxlLl9zaGFkb3dEb20pfSl9ZWxzZSB0aGlzLnJlbW92ZSh0LGUpfSxRay5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7bnVsbCE9ZS5fc2hhZG93RG9tSWQmJih0aGlzLnJlbW92ZURvbSh0KSx0LnN0eWxlLmZpbHRlcj0iIil9LFFrLnByb3RvdHlwZS51cGRhdGVEb209ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmZURyb3BTaGFkb3ciKTtpPTA9PT1pLmxlbmd0aD90aGlzLmNyZWF0ZUVsZW1lbnQoImZlRHJvcFNoYWRvdyIpOmlbMF07dmFyIG4sbyxhLHIscz10LnN0eWxlLGw9dC5zY2FsZSYmdC5zY2FsZVswXXx8MSx1PXQuc2NhbGUmJnQuc2NhbGVbMV18fDE7aWYocy5zaGFkb3dCbHVyfHxzLnNoYWRvd09mZnNldFh8fHMuc2hhZG93T2Zmc2V0WSluPXMuc2hhZG93T2Zmc2V0WHx8MCxvPXMuc2hhZG93T2Zmc2V0WXx8MCxhPXMuc2hhZG93Qmx1cixyPXMuc2hhZG93Q29sb3I7ZWxzZXtpZighcy50ZXh0U2hhZG93Qmx1cilyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZURvbShlLHMpO249cy50ZXh0U2hhZG93T2Zmc2V0WHx8MCxvPXMudGV4dFNoYWRvd09mZnNldFl8fDAsYT1zLnRleHRTaGFkb3dCbHVyLHI9cy50ZXh0U2hhZG93Q29sb3J9aS5zZXRBdHRyaWJ1dGUoImR4IixuL2wpLGkuc2V0QXR0cmlidXRlKCJkeSIsby91KSxpLnNldEF0dHJpYnV0ZSgiZmxvb2QtY29sb3IiLHIpO3ZhciBoPWEvMi9sKyIgIithLzIvdTtpLnNldEF0dHJpYnV0ZSgic3RkRGV2aWF0aW9uIixoKSxlLnNldEF0dHJpYnV0ZSgieCIsIi0xMDAlIiksZS5zZXRBdHRyaWJ1dGUoInkiLCItMTAwJSIpLGUuc2V0QXR0cmlidXRlKCJ3aWR0aCIsTWF0aC5jZWlsKGEvMioyMDApKyIlIiksZS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsTWF0aC5jZWlsKGEvMioyMDApKyIlIiksZS5hcHBlbmRDaGlsZChpKSx0Ll9zaGFkb3dEb209ZX0sUWsucHJvdG90eXBlLm1hcmtVc2VkPWZ1bmN0aW9uKHQpe3QuX3NoYWRvd0RvbSYmS2sucHJvdG90eXBlLm1hcmtVc2VkLmNhbGwodGhpcyx0Ll9zaGFkb3dEb20pfTtmdW5jdGlvbiBsUCh0LGUsaSxuKXt0aGlzLnJvb3Q9dCx0aGlzLnN0b3JhZ2U9ZSx0aGlzLl9vcHRzPWk9TCh7fSxpfHx7fSk7dmFyIG89d2soInN2ZyIpO28uc2V0QXR0cmlidXRlKCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiksby5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCIxLjEiKSxvLnNldEF0dHJpYnV0ZSgiYmFzZVByb2ZpbGUiLCJmdWxsIiksby5zdHlsZS5jc3NUZXh0PSJ1c2VyLXNlbGVjdDpub25lO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDsiLHRoaXMuZ3JhZGllbnRNYW5hZ2VyPW5ldyAkayhuLG8pLHRoaXMuY2xpcFBhdGhNYW5hZ2VyPW5ldyBKayhuLG8pLHRoaXMuc2hhZG93TWFuYWdlcj1uZXcgUWsobixvKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlLmNzc1RleHQ9Im92ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZSIsdGhpcy5fc3ZnUm9vdD1vLHRoaXMuX3ZpZXdwb3J0PWEsdC5hcHBlbmRDaGlsZChhKSxhLmFwcGVuZENoaWxkKG8pLHRoaXMucmVzaXplKGkud2lkdGgsaS5oZWlnaHQpLHRoaXMuX3Zpc2libGVMaXN0PVtdfWxQLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bFAsZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiJzdmcifSxnZXRWaWV3cG9ydFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmlld3BvcnR9LGdldFZpZXdwb3J0Um9vdE9mZnNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Vmlld3BvcnRSb290KCk7aWYodClyZXR1cm57b2Zmc2V0TGVmdDp0Lm9mZnNldExlZnR8fDAsb2Zmc2V0VG9wOnQub2Zmc2V0VG9wfHwwfX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCghMCk7dGhpcy5fcGFpbnRMaXN0KHQpfSxzZXRCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24odCl7dGhpcy5fdmlld3BvcnQuc3R5bGUuYmFja2dyb3VuZD10fSxfcGFpbnRMaXN0OmZ1bmN0aW9uKHQpe3RoaXMuZ3JhZGllbnRNYW5hZ2VyLm1hcmtBbGxVbnVzZWQoKSx0aGlzLmNsaXBQYXRoTWFuYWdlci5tYXJrQWxsVW51c2VkKCksdGhpcy5zaGFkb3dNYW5hZ2VyLm1hcmtBbGxVbnVzZWQoKTt2YXIgZSxpLG49dGhpcy5fc3ZnUm9vdCxvPXRoaXMuX3Zpc2libGVMaXN0LGE9dC5sZW5ndGgscj1bXTtmb3IoZT0wO2U8YTtlKyspe3ZhciBzPXRbZV0sbD0oaT1zKWluc3RhbmNlb2YgU3I/Ums6aSBpbnN0YW5jZW9mIHFuP0JrOmkgaW5zdGFuY2VvZiBGcj9WazpSayx1PXNQKHMpfHxyUChzKTtzLmludmlzaWJsZXx8KHMuX19kaXJ0eSYmKGwmJmwuYnJ1c2gocyksdGhpcy5jbGlwUGF0aE1hbmFnZXIudXBkYXRlKHMpLHMuc3R5bGUmJih0aGlzLmdyYWRpZW50TWFuYWdlci51cGRhdGUocy5zdHlsZS5maWxsKSx0aGlzLmdyYWRpZW50TWFuYWdlci51cGRhdGUocy5zdHlsZS5zdHJva2UpLHRoaXMuc2hhZG93TWFuYWdlci51cGRhdGUodSxzKSkscy5fX2RpcnR5PSExKSxyLnB1c2gocykpfXZhciBoLGM9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBxay5kaWZmKHQsZSxpKX0obyxyKTtmb3IoZT0wO2U8Yy5sZW5ndGg7ZSsrKXtpZigocD1jW2VdKS5yZW1vdmVkKWZvcih2YXIgZD0wO2Q8cC5jb3VudDtkKyspe3U9c1Aocz1vW3AuaW5kaWNlc1tkXV0pO3ZhciBmPXJQKHMpO2FQKG4sdSksYVAobixmKX19Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIHA7aWYoKHA9Y1tlXSkuYWRkZWQpZm9yKGQ9MDtkPHAuY291bnQ7ZCsrKXt1PXNQKHM9cltwLmluZGljZXNbZF1dKSxmPXJQKHMpO2g/blAobix1LGgpOm9QKG4sdSksdT9uUChuLGYsdSk6aD9uUChuLGYsaCk6b1AobixmKSxuUChuLGYsdSksaD1mfHx1fHxoLHRoaXMuZ3JhZGllbnRNYW5hZ2VyLmFkZFdpdGhvdXRVcGRhdGUodXx8ZixzKSx0aGlzLnNoYWRvd01hbmFnZXIuYWRkV2l0aG91dFVwZGF0ZSh1fHxmLHMpLHRoaXMuY2xpcFBhdGhNYW5hZ2VyLm1hcmtVc2VkKHMpfWVsc2UgaWYoIXAucmVtb3ZlZClmb3IoZD0wO2Q8cC5jb3VudDtkKyspe3U9c1Aocz1yW3AuaW5kaWNlc1tkXV0pLGY9clAocyksdT1zUChzKSxmPXJQKHMpO3RoaXMuZ3JhZGllbnRNYW5hZ2VyLm1hcmtVc2VkKHMpLHRoaXMuZ3JhZGllbnRNYW5hZ2VyLmFkZFdpdGhvdXRVcGRhdGUodXx8ZixzKSx0aGlzLnNoYWRvd01hbmFnZXIubWFya1VzZWQocyksdGhpcy5zaGFkb3dNYW5hZ2VyLmFkZFdpdGhvdXRVcGRhdGUodXx8ZixzKSx0aGlzLmNsaXBQYXRoTWFuYWdlci5tYXJrVXNlZChzKSxmJiZuUChuLGYsdSksaD11fHxmfHxofX10aGlzLmdyYWRpZW50TWFuYWdlci5yZW1vdmVVbnVzZWQoKSx0aGlzLmNsaXBQYXRoTWFuYWdlci5yZW1vdmVVbnVzZWQoKSx0aGlzLnNoYWRvd01hbmFnZXIucmVtb3ZlVW51c2VkKCksdGhpcy5fdmlzaWJsZUxpc3Q9cn0sX2dldERlZnM6ZnVuY3Rpb24odCl7dmFyIG4sZT10aGlzLl9zdmdSb290O3JldHVybiAwIT09KG49dGhpcy5fc3ZnUm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGVmcyIpKS5sZW5ndGg/blswXTp0Pygobj1lLmluc2VydEJlZm9yZSh3aygiZGVmcyIpLGUuZmlyc3RDaGlsZCkpLmNvbnRhaW5zfHwobi5jb250YWlucz1mdW5jdGlvbih0KXt2YXIgZT1uLmNoaWxkcmVuO2lmKCFlKXJldHVybiExO2Zvcih2YXIgaT1lLmxlbmd0aC0xOzA8PWk7LS1pKWlmKGVbaV09PT10KXJldHVybiEwO3JldHVybiExfSksbik6bnVsbH0scmVzaXplOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fdmlld3BvcnQ7aS5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgbj10aGlzLl9vcHRzO2lmKG51bGwhPXQmJihuLndpZHRoPXQpLG51bGwhPWUmJihuLmhlaWdodD1lKSx0PXRoaXMuX2dldFNpemUoMCksZT10aGlzLl9nZXRTaXplKDEpLGkuc3R5bGUuZGlzcGxheT0iIix0aGlzLl93aWR0aCE9PXR8fHRoaXMuX2hlaWdodCE9PWUpe3RoaXMuX3dpZHRoPXQsdGhpcy5faGVpZ2h0PWU7dmFyIG89aS5zdHlsZTtvLndpZHRoPXQrInB4IixvLmhlaWdodD1lKyJweCI7dmFyIGE9dGhpcy5fc3ZnUm9vdDthLnNldEF0dHJpYnV0ZSgid2lkdGgiLHQpLGEuc2V0QXR0cmlidXRlKCJoZWlnaHQiLGUpfX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9oZWlnaHR9LF9nZXRTaXplOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29wdHMsaT1bIndpZHRoIiwiaGVpZ2h0Il1bdF0sbj1bImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0Il1bdF0sbz1bInBhZGRpbmdMZWZ0IiwicGFkZGluZ1RvcCJdW3RdLGE9WyJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIl1bdF07aWYobnVsbCE9ZVtpXSYmImF1dG8iIT09ZVtpXSlyZXR1cm4gcGFyc2VGbG9hdChlW2ldKTt2YXIgcj10aGlzLnJvb3Qscz1kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHIpO3JldHVybihyW25dfHxlUChzW2ldKXx8ZVAoci5zdHlsZVtpXSkpLShlUChzW29dKXx8MCktKGVQKHNbYV0pfHwwKXwwfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5yb290LmlubmVySFRNTD0iIix0aGlzLl9zdmdSb290PXRoaXMuX3ZpZXdwb3J0PXRoaXMuc3RvcmFnZT1udWxsfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuX3ZpZXdwb3J0JiZ0aGlzLnJvb3QucmVtb3ZlQ2hpbGQodGhpcy5fdmlld3BvcnQpfSxwYXRoVG9EYXRhVXJsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVmcmVzaCgpLCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD1VVEYtOCwiK3RoaXMuX3N2Z1Jvb3Qub3V0ZXJIVE1MfX0sRShbImdldExheWVyIiwiaW5zZXJ0TGF5ZXIiLCJlYWNoTGF5ZXIiLCJlYWNoQnVpbHRpbkxheWVyIiwiZWFjaE90aGVyTGF5ZXIiLCJnZXRMYXllcnMiLCJtb2RMYXllciIsImRlbExheWVyIiwiY2xlYXJMYXllciIsInRvRGF0YVVSTCIsInBhdGhUb0ltYWdlIl0sZnVuY3Rpb24odCl7bFAucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2ZpKCdJbiBTVkcgbW9kZSBwYWludGVyIG5vdCBzdXBwb3J0IG1ldGhvZCAiJyt0KyciJyl9fSh0KX0pLERvKCJzdmciLGxQKSx0LnZlcnNpb249IjQuNi4wIix0LmRlcGVuZGVuY2llcz17enJlbmRlcjoiNC4yLjAifSx0LlBSSU9SSVRZPUlkLHQuaW5pdD1mdW5jdGlvbih0LGUsaSl7dmFyIG49Y2YodCk7aWYobilyZXR1cm4gbjt2YXIgbz1uZXcga2QodCxlLGkpO3JldHVybiBvLmlkPSJlY18iK3JmKyssb2Zbby5pZF09byxqbyh0LGxmLG8uaWQpLGZ1bmN0aW9uKG4pe3ZhciBvPSJfX2Nvbm5lY3RVcGRhdGVTdGF0dXMiO2Z1bmN0aW9uIGEodCxlKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl7dFtpXVtvXT1lfX13ZChLZCxmdW5jdGlvbih0LGUpe24uX21lc3NhZ2VDZW50ZXIub24oZSxmdW5jdGlvbih0KXtpZihhZltuLmdyb3VwXSYmMCE9PW5bb10pe2lmKHQmJnQuZXNjYXBlQ29ubmVjdClyZXR1cm47dmFyIGU9bi5tYWtlQWN0aW9uRnJvbUV2ZW50KHQpLGk9W107d2Qob2YsZnVuY3Rpb24odCl7dCE9PW4mJnQuZ3JvdXA9PT1uLmdyb3VwJiZpLnB1c2godCl9KSxhKGksMCksd2QoaSxmdW5jdGlvbih0KXsxIT09dFtvXSYmdC5kaXNwYXRjaEFjdGlvbihlKX0pLGEoaSwyKX19KX0pfShvKSxvfSx0LmNvbm5lY3Q9ZnVuY3Rpb24oZSl7aWYoayhlKSl7dmFyIHQ9ZTtlPW51bGwsd2QodCxmdW5jdGlvbih0KXtudWxsIT10Lmdyb3VwJiYoZT10Lmdyb3VwKX0pLGU9ZXx8ImdfIitzZisrLHdkKHQsZnVuY3Rpb24odCl7dC5ncm91cD1lfSl9cmV0dXJuIGFmW2VdPSEwLGV9LHQuZGlzQ29ubmVjdD11Zix0LmRpc2Nvbm5lY3Q9aGYsdC5kaXNwb3NlPWZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdD90PW9mW3RdOnQgaW5zdGFuY2VvZiBrZHx8KHQ9Y2YodCkpLHQgaW5zdGFuY2VvZiBrZCYmIXQuaXNEaXNwb3NlZCgpJiZ0LmRpc3Bvc2UoKX0sdC5nZXRJbnN0YW5jZUJ5RG9tPWNmLHQuZ2V0SW5zdGFuY2VCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiBvZlt0XX0sdC5yZWdpc3RlclRoZW1lPWRmLHQucmVnaXN0ZXJQcmVwcm9jZXNzb3I9ZmYsdC5yZWdpc3RlclByb2Nlc3Nvcj1wZix0LnJlZ2lzdGVyUG9zdFVwZGF0ZT1mdW5jdGlvbih0KXtRZC5wdXNoKHQpfSx0LnJlZ2lzdGVyQWN0aW9uPWdmLHQucmVnaXN0ZXJDb29yZGluYXRlU3lzdGVtPW1mLHQuZ2V0Q29vcmRpbmF0ZVN5c3RlbURpbWVuc2lvbnM9ZnVuY3Rpb24odCl7dmFyIGU9bmguZ2V0KHQpO2lmKGUpcmV0dXJuIGUuZ2V0RGltZW5zaW9uc0luZm8/ZS5nZXREaW1lbnNpb25zSW5mbygpOmUuZGltZW5zaW9ucy5zbGljZSgpfSx0LnJlZ2lzdGVyTGF5b3V0PXZmLHQucmVnaXN0ZXJWaXN1YWw9eWYsdC5yZWdpc3RlckxvYWRpbmc9X2YsdC5leHRlbmRDb21wb25lbnRNb2RlbD13Zix0LmV4dGVuZENvbXBvbmVudFZpZXc9YmYsdC5leHRlbmRTZXJpZXNNb2RlbD1TZix0LmV4dGVuZENoYXJ0Vmlldz1NZix0LnNldENhbnZhc0NyZWF0b3I9ZnVuY3Rpb24odCl7ZigiY3JlYXRlQ2FudmFzIix0KX0sdC5yZWdpc3Rlck1hcD1mdW5jdGlvbih0LGUsaSl7eWQucmVnaXN0ZXJNYXAodCxlLGkpfSx0LmdldE1hcD1mdW5jdGlvbih0KXt2YXIgZT15ZC5yZXRyaWV2ZU1hcCh0KTtyZXR1cm4gZSYmZVswXSYme2dlb0pzb246ZVswXS5nZW9KU09OLHNwZWNpYWxBcmVhczplWzBdLnNwZWNpYWxBcmVhc319LHQuZGF0YVRvb2w9e30sdC56cmVuZGVyPUxvLHQubnVtYmVyPXFsLHQuZm9ybWF0PWN1LHQudGhyb3R0bGU9SWMsdC5oZWxwZXI9eWcsdC5tYXRyaXg9aGUsdC52ZWN0b3I9SXQsdC5jb2xvcj1qZSx0LnBhcnNlR2VvSlNPTj1NZyx0LnBhcnNlR2VvSnNvbj1SZyx0LnV0aWw9QmcsdC5ncmFwaGljPVZnLHQuTGlzdD1XZix0Lk1vZGVsPUlsLHQuQXhpcz1FZyx0LmVudj12fSk7Cg=="},{"meta":{"name":"layer.js","url":"https://lib.baomitu.com/layer/2.3/layer.js","ts":1637743664561,"mimetype":"text/javascript"},"source":"LyohIGxheWVyLXYyLjMg5by55bGC57uE5Lu2IExpY2Vuc2UgTEdQTCAgaHR0cDovL2xheWVyLmxheXVpLmNvbS8gQnkg6LSk5b+DICovCjshZnVuY3Rpb24oYSxiKXsidXNlIHN0cmljdCI7dmFyIGMsZCxlPXtnZXRQYXRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuc2NyaXB0cyxiPWFbYS5sZW5ndGgtMV0sYz1iLnNyYztpZighYi5nZXRBdHRyaWJ1dGUoIm1lcmdlIikpcmV0dXJuIGMuc3Vic3RyaW5nKDAsYy5sYXN0SW5kZXhPZigiLyIpKzEpfSgpLGVudGVyOmZ1bmN0aW9uKGEpezEzPT09YS5rZXlDb2RlJiZhLnByZXZlbnREZWZhdWx0KCl9LGNvbmZpZzp7fSxlbmQ6e30sYnRuOlsiJiN4Nzg2RTsmI3g1QjlBOyIsIiYjeDUzRDY7JiN4NkQ4ODsiXSx0eXBlOlsiZGlhbG9nIiwicGFnZSIsImlmcmFtZSIsImxvYWRpbmciLCJ0aXBzIl19LGY9e3Y6IjIuMyIsaWU2OiEhYS5BY3RpdmVYT2JqZWN0JiYhYS5YTUxIdHRwUmVxdWVzdCxpbmRleDowLHBhdGg6ZS5nZXRQYXRoLGNvbmZpZzpmdW5jdGlvbihhLGIpe3ZhciBkPTA7cmV0dXJuIGE9YXx8e30sZi5jYWNoZT1lLmNvbmZpZz1jLmV4dGVuZChlLmNvbmZpZyxhKSxmLnBhdGg9ZS5jb25maWcucGF0aHx8Zi5wYXRoLCJzdHJpbmciPT10eXBlb2YgYS5leHRlbmQmJihhLmV4dGVuZD1bYS5leHRlbmRdKSxmLnVzZSgic2tpbi9sYXllci5jc3MiLGEuZXh0ZW5kJiZhLmV4dGVuZC5sZW5ndGg+MD9mdW5jdGlvbiBnKCl7dmFyIGM9YS5leHRlbmQ7Zi51c2UoY1tjW2RdP2Q6ZC0xXSxkPGMubGVuZ3RoP2Z1bmN0aW9uKCl7cmV0dXJuKytkLGd9KCk6Yil9KCk6YiksdGhpc30sdXNlOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1jKCJoZWFkIilbMF0sYT1hLnJlcGxhY2UoL1xzL2csIiIpLGc9L1wuY3NzJC8udGVzdChhKSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZz8ibGluayI6InNjcmlwdCIpLGk9ImxheXVpX2xheWVyXyIrYS5yZXBsYWNlKC9cLnxcLy9nLCIiKTtyZXR1cm4gZi5wYXRoPyhnJiYoaC5yZWw9InN0eWxlc2hlZXQiKSxoW2c/ImhyZWYiOiJzcmMiXT0vXmh0dHA6XC9cLy8udGVzdChhKT9hOmYucGF0aCthLGguaWQ9aSxjKCIjIitpKVswXXx8ZS5hcHBlbmRDaGlsZChoKSxmdW5jdGlvbiBqKCl7KGc/MTk4OT09PXBhcnNlSW50KGMoIiMiK2kpLmNzcygid2lkdGgiKSk6ZltkfHxpXSk/ZnVuY3Rpb24oKXtiJiZiKCk7dHJ5e2d8fGUucmVtb3ZlQ2hpbGQoaCl9Y2F0Y2goYSl7fX0oKTpzZXRUaW1lb3V0KGosMTAwKX0oKSx0aGlzKTp2b2lkIDB9LHJlYWR5OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ImZ1bmN0aW9uIj09dHlwZW9mIGE7cmV0dXJuIGQmJihiPWEpLGYuY29uZmlnKGMuZXh0ZW5kKGUuY29uZmlnLGZ1bmN0aW9uKCl7cmV0dXJuIGQ/e306e3BhdGg6YX19KCkpLGIpLHRoaXN9LGFsZXJ0OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgYjtyZXR1cm4gZSYmKGQ9YiksZi5vcGVuKGMuZXh0ZW5kKHtjb250ZW50OmEseWVzOmR9LGU/e306YikpfSxjb25maXJtOmZ1bmN0aW9uKGEsYixkLGcpe3ZhciBoPSJmdW5jdGlvbiI9PXR5cGVvZiBiO3JldHVybiBoJiYoZz1kLGQ9YiksZi5vcGVuKGMuZXh0ZW5kKHtjb250ZW50OmEsYnRuOmUuYnRuLHllczpkLGJ0bjI6Z30saD97fTpiKSl9LG1zZzpmdW5jdGlvbihhLGQsZyl7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGQsaj1lLmNvbmZpZy5za2luLGs9KGo/aisiICIraisiLW1zZyI6IiIpfHwibGF5dWktbGF5ZXItbXNnIixsPWguYW5pbS5sZW5ndGgtMTtyZXR1cm4gaSYmKGc9ZCksZi5vcGVuKGMuZXh0ZW5kKHtjb250ZW50OmEsdGltZTozZTMsc2hhZGU6ITEsc2tpbjprLHRpdGxlOiExLGNsb3NlQnRuOiExLGJ0bjohMSxlbmQ6Z30saSYmIWUuY29uZmlnLnNraW4/e3NraW46aysiIGxheXVpLWxheWVyLWh1aSIsc2hpZnQ6bH06ZnVuY3Rpb24oKXtyZXR1cm4gZD1kfHx7fSwoLTE9PT1kLmljb258fGQuaWNvbj09PWImJiFlLmNvbmZpZy5za2luKSYmKGQuc2tpbj1rKyIgIisoZC5za2lufHwibGF5dWktbGF5ZXItaHVpIikpLGR9KCkpKX0sbG9hZDpmdW5jdGlvbihhLGIpe3JldHVybiBmLm9wZW4oYy5leHRlbmQoe3R5cGU6MyxpY29uOmF8fDAsc2hhZGU6LjAxfSxiKSl9LHRpcHM6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmLm9wZW4oYy5leHRlbmQoe3R5cGU6NCxjb250ZW50OlthLGJdLGNsb3NlQnRuOiExLHRpbWU6M2UzLHNoYWRlOiExLG1heFdpZHRoOjIxMH0sZCkpfX0sZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2IuaW5kZXg9KytmLmluZGV4LGIuY29uZmlnPWMuZXh0ZW5kKHt9LGIuY29uZmlnLGUuY29uZmlnLGEpLGIuY3JlYXQoKX07Zy5wdD1nLnByb3RvdHlwZTt2YXIgaD1bImxheXVpLWxheWVyIiwiLmxheXVpLWxheWVyLXRpdGxlIiwiLmxheXVpLWxheWVyLW1haW4iLCIubGF5dWktbGF5ZXItZGlhbG9nIiwibGF5dWktbGF5ZXItaWZyYW1lIiwibGF5dWktbGF5ZXItY29udGVudCIsImxheXVpLWxheWVyLWJ0biIsImxheXVpLWxheWVyLWNsb3NlIl07aC5hbmltPVsibGF5ZXItYW5pbSIsImxheWVyLWFuaW0tMDEiLCJsYXllci1hbmltLTAyIiwibGF5ZXItYW5pbS0wMyIsImxheWVyLWFuaW0tMDQiLCJsYXllci1hbmltLTA1IiwibGF5ZXItYW5pbS0wNiJdLGcucHQuY29uZmlnPXt0eXBlOjAsc2hhZGU6LjMsZml4OiEwLG1vdmU6aFsxXSx0aXRsZToiJiN4NEZFMTsmI3g2MDZGOyIsb2Zmc2V0OiJhdXRvIixhcmVhOiJhdXRvIixjbG9zZUJ0bjoxLHRpbWU6MCx6SW5kZXg6MTk4OTEwMTQsbWF4V2lkdGg6MzYwLHNoaWZ0OjAsaWNvbjotMSxzY3JvbGxiYXI6ITAsdGlwczoyfSxnLnB0LnZlc3NlbD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD1jLmluZGV4LGY9Yy5jb25maWcsZz1mLnpJbmRleCtkLGk9Im9iamVjdCI9PXR5cGVvZiBmLnRpdGxlLGo9Zi5tYXhtaW4mJigxPT09Zi50eXBlfHwyPT09Zi50eXBlKSxrPWYudGl0bGU/JzxkaXYgY2xhc3M9ImxheXVpLWxheWVyLXRpdGxlIiBzdHlsZT0iJysoaT9mLnRpdGxlWzFdOiIiKSsnIj4nKyhpP2YudGl0bGVbMF06Zi50aXRsZSkrIjwvZGl2PiI6IiI7cmV0dXJuIGYuekluZGV4PWcsYihbZi5zaGFkZT8nPGRpdiBjbGFzcz0ibGF5dWktbGF5ZXItc2hhZGUiIGlkPSJsYXl1aS1sYXllci1zaGFkZScrZCsnIiB0aW1lcz0iJytkKyciIHN0eWxlPSInKygiei1pbmRleDoiKyhnLTEpKyI7IGJhY2tncm91bmQtY29sb3I6IisoZi5zaGFkZVsxXXx8IiMwMDAiKSsiOyBvcGFjaXR5OiIrKGYuc2hhZGVbMF18fGYuc2hhZGUpKyI7IGZpbHRlcjphbHBoYShvcGFjaXR5PSIrKDEwMCpmLnNoYWRlWzBdfHwxMDAqZi5zaGFkZSkrIik7IikrJyI+PC9kaXY+JzoiIiwnPGRpdiBjbGFzcz0iJytoWzBdKyIgIisoaC5hbmltW2Yuc2hpZnRdfHwiIikrKCIgbGF5dWktbGF5ZXItIitlLnR5cGVbZi50eXBlXSkrKDAhPWYudHlwZSYmMiE9Zi50eXBlfHxmLnNoYWRlPyIiOiIgbGF5dWktbGF5ZXItYm9yZGVyIikrIiAiKyhmLnNraW58fCIiKSsnIiBpZD0iJytoWzBdK2QrJyIgdHlwZT0iJytlLnR5cGVbZi50eXBlXSsnIiB0aW1lcz0iJytkKyciIHNob3d0aW1lPSInK2YudGltZSsnIiBjb25UeXBlPSInKyhhPyJvYmplY3QiOiJzdHJpbmciKSsnIiBzdHlsZT0iei1pbmRleDogJytnKyI7IHdpZHRoOiIrZi5hcmVhWzBdKyI7aGVpZ2h0OiIrZi5hcmVhWzFdKyhmLmZpeD8iIjoiO3Bvc2l0aW9uOmFic29sdXRlOyIpKyciPicrKGEmJjIhPWYudHlwZT8iIjprKSsnPGRpdiBpZD0iJysoZi5pZHx8IiIpKyciIGNsYXNzPSJsYXl1aS1sYXllci1jb250ZW50JysoMD09Zi50eXBlJiYtMSE9PWYuaWNvbj8iIGxheXVpLWxheWVyLXBhZGRpbmciOiIiKSsoMz09Zi50eXBlPyIgbGF5dWktbGF5ZXItbG9hZGluZyIrZi5pY29uOiIiKSsnIj4nKygwPT1mLnR5cGUmJi0xIT09Zi5pY29uPyc8aSBjbGFzcz0ibGF5dWktbGF5ZXItaWNvIGxheXVpLWxheWVyLWljbycrZi5pY29uKyciPjwvaT4nOiIiKSsoMT09Zi50eXBlJiZhPyIiOmYuY29udGVudHx8IiIpKyc8L2Rpdj48c3BhbiBjbGFzcz0ibGF5dWktbGF5ZXItc2V0d2luIj4nK2Z1bmN0aW9uKCl7dmFyIGE9aj8nPGEgY2xhc3M9ImxheXVpLWxheWVyLW1pbiIgaHJlZj0iamF2YXNjcmlwdDo7Ij48Y2l0ZT48L2NpdGU+PC9hPjxhIGNsYXNzPSJsYXl1aS1sYXllci1pY28gbGF5dWktbGF5ZXItbWF4IiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT4nOiIiO3JldHVybiBmLmNsb3NlQnRuJiYoYSs9JzxhIGNsYXNzPSJsYXl1aS1sYXllci1pY28gJytoWzddKyIgIitoWzddKyhmLnRpdGxlP2YuY2xvc2VCdG46ND09Zi50eXBlPyIxIjoiMiIpKyciIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPicpLGF9KCkrIjwvc3Bhbj4iKyhmLmJ0bj9mdW5jdGlvbigpe3ZhciBhPSIiOyJzdHJpbmciPT10eXBlb2YgZi5idG4mJihmLmJ0bj1bZi5idG5dKTtmb3IodmFyIGI9MCxjPWYuYnRuLmxlbmd0aDtjPmI7YisrKWErPSc8YSBjbGFzcz0iJytoWzZdK2IrJyI+JytmLmJ0bltiXSsiPC9hPiI7cmV0dXJuJzxkaXYgY2xhc3M9IicraFs2XSsnIj4nK2ErIjwvZGl2PiJ9KCk6IiIpKyI8L2Rpdj4iXSxrKSxjfSxnLnB0LmNyZWF0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuY29uZmlnLGc9YS5pbmRleCxpPWIuY29udGVudCxqPSJvYmplY3QiPT10eXBlb2YgaTtpZighYygiIyIrYi5pZClbMF0pe3N3aXRjaCgic3RyaW5nIj09dHlwZW9mIGIuYXJlYSYmKGIuYXJlYT0iYXV0byI9PT1iLmFyZWE/WyIiLCIiXTpbYi5hcmVhLCIiXSksYi50eXBlKXtjYXNlIDA6Yi5idG49ImJ0biJpbiBiP2IuYnRuOmUuYnRuWzBdLGYuY2xvc2VBbGwoImRpYWxvZyIpO2JyZWFrO2Nhc2UgMjp2YXIgaT1iLmNvbnRlbnQ9aj9iLmNvbnRlbnQ6W2IuY29udGVudHx8Imh0dHA6Ly9sYXllci5sYXl1aS5jb20iLCJhdXRvIl07Yi5jb250ZW50PSc8aWZyYW1lIHNjcm9sbGluZz0iJysoYi5jb250ZW50WzFdfHwiYXV0byIpKyciIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIiBpZD0iJytoWzRdK2crJyIgbmFtZT0iJytoWzRdK2crJyIgb25sb2FkPSJ0aGlzLmNsYXNzTmFtZT1cJ1wnOyIgY2xhc3M9ImxheXVpLWxheWVyLWxvYWQiIGZyYW1lYm9yZGVyPSIwIiBzcmM9IicrYi5jb250ZW50WzBdKyciPjwvaWZyYW1lPic7YnJlYWs7Y2FzZSAzOmIudGl0bGU9ITEsYi5jbG9zZUJ0bj0hMSwtMT09PWIuaWNvbiYmMD09PWIuaWNvbixmLmNsb3NlQWxsKCJsb2FkaW5nIik7YnJlYWs7Y2FzZSA0Omp8fChiLmNvbnRlbnQ9W2IuY29udGVudCwiYm9keSJdKSxiLmZvbGxvdz1iLmNvbnRlbnRbMV0sYi5jb250ZW50PWIuY29udGVudFswXSsnPGkgY2xhc3M9ImxheXVpLWxheWVyLVRpcHNHIj48L2k+JyxiLnRpdGxlPSExLGIuZml4PSExLGIudGlwcz0ib2JqZWN0Ij09dHlwZW9mIGIudGlwcz9iLnRpcHM6W2IudGlwcywhMF0sYi50aXBzTW9yZXx8Zi5jbG9zZUFsbCgidGlwcyIpfWEudmVzc2VsKGosZnVuY3Rpb24oZCxlKXtjKCJib2R5IikuYXBwZW5kKGRbMF0pLGo/ZnVuY3Rpb24oKXsyPT1iLnR5cGV8fDQ9PWIudHlwZT9mdW5jdGlvbigpe2MoImJvZHkiKS5hcHBlbmQoZFsxXSl9KCk6ZnVuY3Rpb24oKXtpLnBhcmVudHMoIi4iK2hbMF0pWzBdfHwoaS5zaG93KCkuYWRkQ2xhc3MoImxheXVpLWxheWVyLXdyYXAiKS53cmFwKGRbMV0pLGMoIiMiK2hbMF0rZykuZmluZCgiLiIraFs1XSkuYmVmb3JlKGUpKX0oKX0oKTpjKCJib2R5IikuYXBwZW5kKGRbMV0pLGEubGF5ZXJvPWMoIiMiK2hbMF0rZyksYi5zY3JvbGxiYXJ8fGguaHRtbC5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikuYXR0cigibGF5ZXItZnVsbCIsZyl9KS5hdXRvKGcpLDI9PWIudHlwZSYmZi5pZTYmJmEubGF5ZXJvLmZpbmQoImlmcmFtZSIpLmF0dHIoInNyYyIsaVswXSksYyhkb2N1bWVudCkub2ZmKCJrZXlkb3duIixlLmVudGVyKS5vbigia2V5ZG93biIsZS5lbnRlciksYS5sYXllcm8ub24oImtleWRvd24iLGZ1bmN0aW9uKGEpe2MoZG9jdW1lbnQpLm9mZigia2V5ZG93biIsZS5lbnRlcil9KSw0PT1iLnR5cGU/YS50aXBzKCk6YS5vZmZzZXQoKSxiLmZpeCYmZC5vbigicmVzaXplIixmdW5jdGlvbigpe2Eub2Zmc2V0KCksKC9eXGQrJSQvLnRlc3QoYi5hcmVhWzBdKXx8L15cZCslJC8udGVzdChiLmFyZWFbMV0pKSYmYS5hdXRvKGcpLDQ9PWIudHlwZSYmYS50aXBzKCl9KSxiLnRpbWU8PTB8fHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmNsb3NlKGEuaW5kZXgpfSxiLnRpbWUpLGEubW92ZSgpLmNhbGxiYWNrKCl9fSxnLnB0LmF1dG89ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXthPWcuZmluZChhKSxhLmhlaWdodChpWzFdLWotay0yKigwfHBhcnNlRmxvYXQoYS5jc3MoInBhZGRpbmciKSkpKX12YXIgZT10aGlzLGY9ZS5jb25maWcsZz1jKCIjIitoWzBdK2EpOyIiPT09Zi5hcmVhWzBdJiZmLm1heFdpZHRoPjAmJigvTVNJRSA3Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmLmJ0biYmZy53aWR0aChnLmlubmVyV2lkdGgoKSksZy5vdXRlcldpZHRoKCk+Zi5tYXhXaWR0aCYmZy53aWR0aChmLm1heFdpZHRoKSk7dmFyIGk9W2cuaW5uZXJXaWR0aCgpLGcuaW5uZXJIZWlnaHQoKV0saj1nLmZpbmQoaFsxXSkub3V0ZXJIZWlnaHQoKXx8MCxrPWcuZmluZCgiLiIraFs2XSkub3V0ZXJIZWlnaHQoKXx8MDtzd2l0Y2goZi50eXBlKXtjYXNlIDI6YigiaWZyYW1lIik7YnJlYWs7ZGVmYXVsdDoiIj09PWYuYXJlYVsxXT9mLmZpeCYmaVsxXT49ZC5oZWlnaHQoKSYmKGlbMV09ZC5oZWlnaHQoKSxiKCIuIitoWzVdKSk6YigiLiIraFs1XSl9cmV0dXJuIGV9LGcucHQub2Zmc2V0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuY29uZmlnLGM9YS5sYXllcm8sZT1bYy5vdXRlcldpZHRoKCksYy5vdXRlckhlaWdodCgpXSxmPSJvYmplY3QiPT10eXBlb2YgYi5vZmZzZXQ7YS5vZmZzZXRUb3A9KGQuaGVpZ2h0KCktZVsxXSkvMixhLm9mZnNldExlZnQ9KGQud2lkdGgoKS1lWzBdKS8yLGY/KGEub2Zmc2V0VG9wPWIub2Zmc2V0WzBdLGEub2Zmc2V0TGVmdD1iLm9mZnNldFsxXXx8YS5vZmZzZXRMZWZ0KToiYXV0byIhPT1iLm9mZnNldCYmKGEub2Zmc2V0VG9wPWIub2Zmc2V0LCJyYiI9PT1iLm9mZnNldCYmKGEub2Zmc2V0VG9wPWQuaGVpZ2h0KCktZVsxXSxhLm9mZnNldExlZnQ9ZC53aWR0aCgpLWVbMF0pKSxiLmZpeHx8KGEub2Zmc2V0VG9wPS8lJC8udGVzdChhLm9mZnNldFRvcCk/ZC5oZWlnaHQoKSpwYXJzZUZsb2F0KGEub2Zmc2V0VG9wKS8xMDA6cGFyc2VGbG9hdChhLm9mZnNldFRvcCksYS5vZmZzZXRMZWZ0PS8lJC8udGVzdChhLm9mZnNldExlZnQpP2Qud2lkdGgoKSpwYXJzZUZsb2F0KGEub2Zmc2V0TGVmdCkvMTAwOnBhcnNlRmxvYXQoYS5vZmZzZXRMZWZ0KSxhLm9mZnNldFRvcCs9ZC5zY3JvbGxUb3AoKSxhLm9mZnNldExlZnQrPWQuc2Nyb2xsTGVmdCgpKSxjLmNzcyh7dG9wOmEub2Zmc2V0VG9wLGxlZnQ6YS5vZmZzZXRMZWZ0fSl9LGcucHQudGlwcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNvbmZpZyxlPWEubGF5ZXJvLGY9W2Uub3V0ZXJXaWR0aCgpLGUub3V0ZXJIZWlnaHQoKV0sZz1jKGIuZm9sbG93KTtnWzBdfHwoZz1jKCJib2R5IikpO3ZhciBpPXt3aWR0aDpnLm91dGVyV2lkdGgoKSxoZWlnaHQ6Zy5vdXRlckhlaWdodCgpLHRvcDpnLm9mZnNldCgpLnRvcCxsZWZ0Omcub2Zmc2V0KCkubGVmdH0saj1lLmZpbmQoIi5sYXl1aS1sYXllci1UaXBzRyIpLGs9Yi50aXBzWzBdO2IudGlwc1sxXXx8ai5yZW1vdmUoKSxpLmF1dG9MZWZ0PWZ1bmN0aW9uKCl7aS5sZWZ0K2ZbMF0tZC53aWR0aCgpPjA/KGkudGlwTGVmdD1pLmxlZnQraS53aWR0aC1mWzBdLGouY3NzKHtyaWdodDoxMixsZWZ0OiJhdXRvIn0pKTppLnRpcExlZnQ9aS5sZWZ0fSxpLndoZXJlPVtmdW5jdGlvbigpe2kuYXV0b0xlZnQoKSxpLnRpcFRvcD1pLnRvcC1mWzFdLTEwLGoucmVtb3ZlQ2xhc3MoImxheXVpLWxheWVyLVRpcHNCIikuYWRkQ2xhc3MoImxheXVpLWxheWVyLVRpcHNUIikuY3NzKCJib3JkZXItcmlnaHQtY29sb3IiLGIudGlwc1sxXSl9LGZ1bmN0aW9uKCl7aS50aXBMZWZ0PWkubGVmdCtpLndpZHRoKzEwLGkudGlwVG9wPWkudG9wLGoucmVtb3ZlQ2xhc3MoImxheXVpLWxheWVyLVRpcHNMIikuYWRkQ2xhc3MoImxheXVpLWxheWVyLVRpcHNSIikuY3NzKCJib3JkZXItYm90dG9tLWNvbG9yIixiLnRpcHNbMV0pfSxmdW5jdGlvbigpe2kuYXV0b0xlZnQoKSxpLnRpcFRvcD1pLnRvcCtpLmhlaWdodCsxMCxqLnJlbW92ZUNsYXNzKCJsYXl1aS1sYXllci1UaXBzVCIpLmFkZENsYXNzKCJsYXl1aS1sYXllci1UaXBzQiIpLmNzcygiYm9yZGVyLXJpZ2h0LWNvbG9yIixiLnRpcHNbMV0pfSxmdW5jdGlvbigpe2kudGlwTGVmdD1pLmxlZnQtZlswXS0xMCxpLnRpcFRvcD1pLnRvcCxqLnJlbW92ZUNsYXNzKCJsYXl1aS1sYXllci1UaXBzUiIpLmFkZENsYXNzKCJsYXl1aS1sYXllci1UaXBzTCIpLmNzcygiYm9yZGVyLWJvdHRvbS1jb2xvciIsYi50aXBzWzFdKX1dLGkud2hlcmVbay0xXSgpLDE9PT1rP2kudG9wLShkLnNjcm9sbFRvcCgpK2ZbMV0rMTYpPDAmJmkud2hlcmVbMl0oKToyPT09az9kLndpZHRoKCktKGkubGVmdCtpLndpZHRoK2ZbMF0rMTYpPjB8fGkud2hlcmVbM10oKTozPT09az9pLnRvcC1kLnNjcm9sbFRvcCgpK2kuaGVpZ2h0K2ZbMV0rMTYtZC5oZWlnaHQoKT4wJiZpLndoZXJlWzBdKCk6ND09PWsmJmZbMF0rMTYtaS5sZWZ0PjAmJmkud2hlcmVbMV0oKSxlLmZpbmQoIi4iK2hbNV0pLmNzcyh7ImJhY2tncm91bmQtY29sb3IiOmIudGlwc1sxXSwicGFkZGluZy1yaWdodCI6Yi5jbG9zZUJ0bj8iMzBweCI6IiJ9KSxlLmNzcyh7bGVmdDppLnRpcExlZnQsdG9wOmkudGlwVG9wfSl9LGcucHQubW92ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNvbmZpZyxlPXtzZXRZOjAsbW92ZUxheWVyOmZ1bmN0aW9uKCl7dmFyIGE9ZS5sYXllcm8sYj1wYXJzZUludChhLmNzcygibWFyZ2luLWxlZnQiKSksYz1wYXJzZUludChlLm1vdmUuY3NzKCJsZWZ0IikpOzA9PT1ifHwoYy09YiksImZpeGVkIiE9PWEuY3NzKCJwb3NpdGlvbiIpJiYoYy09YS5wYXJlbnQoKS5vZmZzZXQoKS5sZWZ0LGUuc2V0WT0wKSxhLmNzcyh7bGVmdDpjLHRvcDpwYXJzZUludChlLm1vdmUuY3NzKCJ0b3AiKSktZS5zZXRZfSl9fSxmPWEubGF5ZXJvLmZpbmQoYi5tb3ZlKTtyZXR1cm4gYi5tb3ZlJiZmLmF0dHIoIm1vdmUiLCJvayIpLGYuY3NzKHtjdXJzb3I6Yi5tb3ZlPyJtb3ZlIjoiYXV0byJ9KSxjKGIubW92ZSkub24oIm1vdXNlZG93biIsZnVuY3Rpb24oYSl7aWYoYS5wcmV2ZW50RGVmYXVsdCgpLCJvayI9PT1jKHRoaXMpLmF0dHIoIm1vdmUiKSl7ZS5pc21vdmU9ITAsZS5sYXllcm89Yyh0aGlzKS5wYXJlbnRzKCIuIitoWzBdKTt2YXIgZj1lLmxheWVyby5vZmZzZXQoKS5sZWZ0LGc9ZS5sYXllcm8ub2Zmc2V0KCkudG9wLGk9ZS5sYXllcm8ub3V0ZXJXaWR0aCgpLTYsaj1lLmxheWVyby5vdXRlckhlaWdodCgpLTY7YygiI2xheXVpLWxheWVyLW1vdmVzIilbMF18fGMoImJvZHkiKS5hcHBlbmQoJzxkaXYgaWQ9ImxheXVpLWxheWVyLW1vdmVzIiBjbGFzcz0ibGF5dWktbGF5ZXItbW92ZXMiIHN0eWxlPSJsZWZ0OicrZisicHg7IHRvcDoiK2crInB4OyB3aWR0aDoiK2krInB4OyBoZWlnaHQ6IitqKydweDsgei1pbmRleDoyMTQ3NDgzNTg0Ij48L2Rpdj4nKSxlLm1vdmU9YygiI2xheXVpLWxheWVyLW1vdmVzIiksYi5tb3ZlVHlwZSYmZS5tb3ZlLmNzcyh7dmlzaWJpbGl0eToiaGlkZGVuIn0pLGUubW92ZVg9YS5wYWdlWC1lLm1vdmUucG9zaXRpb24oKS5sZWZ0LGUubW92ZVk9YS5wYWdlWS1lLm1vdmUucG9zaXRpb24oKS50b3AsImZpeGVkIiE9PWUubGF5ZXJvLmNzcygicG9zaXRpb24iKXx8KGUuc2V0WT1kLnNjcm9sbFRvcCgpKX19KSxjKGRvY3VtZW50KS5tb3VzZW1vdmUoZnVuY3Rpb24oYSl7aWYoZS5pc21vdmUpe3ZhciBjPWEucGFnZVgtZS5tb3ZlWCxmPWEucGFnZVktZS5tb3ZlWTtpZihhLnByZXZlbnREZWZhdWx0KCksIWIubW92ZU91dCl7ZS5zZXRZPWQuc2Nyb2xsVG9wKCk7dmFyIGc9ZC53aWR0aCgpLWUubW92ZS5vdXRlcldpZHRoKCksaD1lLnNldFk7MD5jJiYoYz0wKSxjPmcmJihjPWcpLGg+ZiYmKGY9aCksZj5kLmhlaWdodCgpLWUubW92ZS5vdXRlckhlaWdodCgpK2Uuc2V0WSYmKGY9ZC5oZWlnaHQoKS1lLm1vdmUub3V0ZXJIZWlnaHQoKStlLnNldFkpfWUubW92ZS5jc3Moe2xlZnQ6Yyx0b3A6Zn0pLGIubW92ZVR5cGUmJmUubW92ZUxheWVyKCksYz1mPWc9aD1udWxsfX0pLm1vdXNldXAoZnVuY3Rpb24oKXt0cnl7ZS5pc21vdmUmJihlLm1vdmVMYXllcigpLGUubW92ZS5yZW1vdmUoKSxiLm1vdmVFbmQmJmIubW92ZUVuZCgpKSxlLmlzbW92ZT0hMX1jYXRjaChhKXtlLmlzbW92ZT0hMX19KSxhfSxnLnB0LmNhbGxiYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3ZhciBhPWcuY2FuY2VsJiZnLmNhbmNlbChiLmluZGV4LGQpO2E9PT0hMXx8Zi5jbG9zZShiLmluZGV4KX12YXIgYj10aGlzLGQ9Yi5sYXllcm8sZz1iLmNvbmZpZztiLm9wZW5MYXllcigpLGcuc3VjY2VzcyYmKDI9PWcudHlwZT9kLmZpbmQoImlmcmFtZSIpLm9uKCJsb2FkIixmdW5jdGlvbigpe2cuc3VjY2VzcyhkLGIuaW5kZXgpfSk6Zy5zdWNjZXNzKGQsYi5pbmRleCkpLGYuaWU2JiZiLklFNihkKSxkLmZpbmQoIi4iK2hbNl0pLmNoaWxkcmVuKCJhIikub24oImNsaWNrIixmdW5jdGlvbigpe3ZhciBhPWModGhpcykuaW5kZXgoKTtpZigwPT09YSlnLnllcz9nLnllcyhiLmluZGV4LGQpOmcuYnRuMT9nLmJ0bjEoYi5pbmRleCxkKTpmLmNsb3NlKGIuaW5kZXgpO2Vsc2V7dmFyIGU9Z1siYnRuIisoYSsxKV0mJmdbImJ0biIrKGErMSldKGIuaW5kZXgsZCk7ZT09PSExfHxmLmNsb3NlKGIuaW5kZXgpfX0pLGQuZmluZCgiLiIraFs3XSkub24oImNsaWNrIixhKSxnLnNoYWRlQ2xvc2UmJmMoIiNsYXl1aS1sYXllci1zaGFkZSIrYi5pbmRleCkub24oImNsaWNrIixmdW5jdGlvbigpe2YuY2xvc2UoYi5pbmRleCl9KSxkLmZpbmQoIi5sYXl1aS1sYXllci1taW4iKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7Zi5taW4oYi5pbmRleCxnKSxnLm1pbiYmZy5taW4oZCl9KSxkLmZpbmQoIi5sYXl1aS1sYXllci1tYXgiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7Yyh0aGlzKS5oYXNDbGFzcygibGF5dWktbGF5ZXItbWF4bWluIik/KGYucmVzdG9yZShiLmluZGV4KSxnLnJlc3RvcmUmJmcucmVzdG9yZShkKSk6KGYuZnVsbChiLmluZGV4LGcpLGcuZnVsbCYmZy5mdWxsKGQpKX0pLGcuZW5kJiYoZS5lbmRbYi5pbmRleF09Zy5lbmQpfSxlLnJlc2VsZWN0PWZ1bmN0aW9uKCl7Yy5lYWNoKGMoInNlbGVjdCIpLGZ1bmN0aW9uKGEsYil7dmFyIGQ9Yyh0aGlzKTtkLnBhcmVudHMoIi4iK2hbMF0pWzBdfHwxPT1kLmF0dHIoImxheWVyIikmJmMoIi4iK2hbMF0pLmxlbmd0aDwxJiZkLnJlbW92ZUF0dHIoImxheWVyIikuc2hvdygpLGQ9bnVsbH0pfSxnLnB0LklFNj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7YS5jc3Moe3RvcDpmKyhlLmNvbmZpZy5maXg/ZC5zY3JvbGxUb3AoKTowKX0pfXZhciBlPXRoaXMsZj1hLm9mZnNldCgpLnRvcDtiKCksZC5zY3JvbGwoYiksYygic2VsZWN0IikuZWFjaChmdW5jdGlvbihhLGIpe3ZhciBkPWModGhpcyk7ZC5wYXJlbnRzKCIuIitoWzBdKVswXXx8Im5vbmUiPT09ZC5jc3MoImRpc3BsYXkiKXx8ZC5hdHRyKHtsYXllcjoiMSJ9KS5oaWRlKCksZD1udWxsfSl9LGcucHQub3BlbkxheWVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztmLnpJbmRleD1hLmNvbmZpZy56SW5kZXgsZi5zZXRUb3A9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXtmLnpJbmRleCsrLGEuY3NzKCJ6LWluZGV4IixmLnpJbmRleCsxKX07cmV0dXJuIGYuekluZGV4PXBhcnNlSW50KGFbMF0uc3R5bGUuekluZGV4KSxhLm9uKCJtb3VzZWRvd24iLGIpLGYuekluZGV4fX0sZS5yZWNvcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9W2Eub3V0ZXJXaWR0aCgpLGEub3V0ZXJIZWlnaHQoKSxhLnBvc2l0aW9uKCkudG9wLGEucG9zaXRpb24oKS5sZWZ0K3BhcnNlRmxvYXQoYS5jc3MoIm1hcmdpbi1sZWZ0IikpXTthLmZpbmQoIi5sYXl1aS1sYXllci1tYXgiKS5hZGRDbGFzcygibGF5dWktbGF5ZXItbWF4bWluIiksYS5hdHRyKHthcmVhOmJ9KX0sZS5yZXNjb2xsYmFyPWZ1bmN0aW9uKGEpe2guaHRtbC5hdHRyKCJsYXllci1mdWxsIik9PWEmJihoLmh0bWxbMF0uc3R5bGUucmVtb3ZlUHJvcGVydHk/aC5odG1sWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvdmVyZmxvdyIpOmguaHRtbFswXS5zdHlsZS5yZW1vdmVBdHRyaWJ1dGUoIm92ZXJmbG93IiksaC5odG1sLnJlbW92ZUF0dHIoImxheWVyLWZ1bGwiKSl9LGEubGF5ZXI9ZixmLmdldENoaWxkRnJhbWU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1ifHxjKCIuIitoWzRdKS5hdHRyKCJ0aW1lcyIpLGMoIiMiK2hbMF0rYikuZmluZCgiaWZyYW1lIikuY29udGVudHMoKS5maW5kKGEpfSxmLmdldEZyYW1lSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGMoIiMiK2EpLnBhcmVudHMoIi4iK2hbNF0pLmF0dHIoInRpbWVzIil9LGYuaWZyYW1lQXV0bz1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1mLmdldENoaWxkRnJhbWUoImh0bWwiLGEpLm91dGVySGVpZ2h0KCksZD1jKCIjIitoWzBdK2EpLGU9ZC5maW5kKGhbMV0pLm91dGVySGVpZ2h0KCl8fDAsZz1kLmZpbmQoIi4iK2hbNl0pLm91dGVySGVpZ2h0KCl8fDA7ZC5jc3Moe2hlaWdodDpiK2UrZ30pLGQuZmluZCgiaWZyYW1lIikuY3NzKHtoZWlnaHQ6Yn0pfX0sZi5pZnJhbWVTcmM9ZnVuY3Rpb24oYSxiKXtjKCIjIitoWzBdK2EpLmZpbmQoImlmcmFtZSIpLmF0dHIoInNyYyIsYil9LGYuc3R5bGU9ZnVuY3Rpb24oYSxiKXt2YXIgZD1jKCIjIitoWzBdK2EpLGY9ZC5hdHRyKCJ0eXBlIiksZz1kLmZpbmQoaFsxXSkub3V0ZXJIZWlnaHQoKXx8MCxpPWQuZmluZCgiLiIraFs2XSkub3V0ZXJIZWlnaHQoKXx8MDsoZj09PWUudHlwZVsxXXx8Zj09PWUudHlwZVsyXSkmJihkLmNzcyhiKSxmPT09ZS50eXBlWzJdJiZkLmZpbmQoImlmcmFtZSIpLmNzcyh7aGVpZ2h0OnBhcnNlRmxvYXQoYi5oZWlnaHQpLWctaX0pKX0sZi5taW49ZnVuY3Rpb24oYSxiKXt2YXIgZD1jKCIjIitoWzBdK2EpLGc9ZC5maW5kKGhbMV0pLm91dGVySGVpZ2h0KCl8fDA7ZS5yZWNvcmQoZCksZi5zdHlsZShhLHt3aWR0aDoxODAsaGVpZ2h0Omcsb3ZlcmZsb3c6ImhpZGRlbiJ9KSxkLmZpbmQoIi5sYXl1aS1sYXllci1taW4iKS5oaWRlKCksInBhZ2UiPT09ZC5hdHRyKCJ0eXBlIikmJmQuZmluZChoWzRdKS5oaWRlKCksZS5yZXNjb2xsYmFyKGEpfSxmLnJlc3RvcmU9ZnVuY3Rpb24oYSl7dmFyIGI9YygiIyIraFswXSthKSxkPWIuYXR0cigiYXJlYSIpLnNwbGl0KCIsIik7Yi5hdHRyKCJ0eXBlIik7Zi5zdHlsZShhLHt3aWR0aDpwYXJzZUZsb2F0KGRbMF0pLGhlaWdodDpwYXJzZUZsb2F0KGRbMV0pLHRvcDpwYXJzZUZsb2F0KGRbMl0pLGxlZnQ6cGFyc2VGbG9hdChkWzNdKSxvdmVyZmxvdzoidmlzaWJsZSJ9KSxiLmZpbmQoIi5sYXl1aS1sYXllci1tYXgiKS5yZW1vdmVDbGFzcygibGF5dWktbGF5ZXItbWF4bWluIiksYi5maW5kKCIubGF5dWktbGF5ZXItbWluIikuc2hvdygpLCJwYWdlIj09PWIuYXR0cigidHlwZSIpJiZiLmZpbmQoaFs0XSkuc2hvdygpLGUucmVzY29sbGJhcihhKX0sZi5mdWxsPWZ1bmN0aW9uKGEpe3ZhciBiLGc9YygiIyIraFswXSthKTtlLnJlY29yZChnKSxoLmh0bWwuYXR0cigibGF5ZXItZnVsbCIpfHxoLmh0bWwuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpLmF0dHIoImxheWVyLWZ1bGwiLGEpLGNsZWFyVGltZW91dChiKSxiPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj0iZml4ZWQiPT09Zy5jc3MoInBvc2l0aW9uIik7Zi5zdHlsZShhLHt0b3A6Yj8wOmQuc2Nyb2xsVG9wKCksbGVmdDpiPzA6ZC5zY3JvbGxMZWZ0KCksd2lkdGg6ZC53aWR0aCgpLGhlaWdodDpkLmhlaWdodCgpfSksZy5maW5kKCIubGF5dWktbGF5ZXItbWluIikuaGlkZSgpfSwxMDApfSxmLnRpdGxlPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YygiIyIraFswXSsoYnx8Zi5pbmRleCkpLmZpbmQoaFsxXSk7ZC5odG1sKGEpfSxmLmNsb3NlPWZ1bmN0aW9uKGEpe3ZhciBiPWMoIiMiK2hbMF0rYSksZD1iLmF0dHIoInR5cGUiKTtpZihiWzBdKXtpZihkPT09ZS50eXBlWzFdJiYib2JqZWN0Ij09PWIuYXR0cigiY29uVHlwZSIpKXtiLmNoaWxkcmVuKCI6bm90KC4iK2hbNV0rIikiKS5yZW1vdmUoKTtmb3IodmFyIGc9MDsyPmc7ZysrKWIuZmluZCgiLmxheXVpLWxheWVyLXdyYXAiKS51bndyYXAoKS5oaWRlKCl9ZWxzZXtpZihkPT09ZS50eXBlWzJdKXRyeXt2YXIgaT1jKCIjIitoWzRdK2EpWzBdO2kuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZSgiIiksaS5jb250ZW50V2luZG93LmNsb3NlKCksYi5maW5kKCIuIitoWzVdKVswXS5yZW1vdmVDaGlsZChpKX1jYXRjaChqKXt9YlswXS5pbm5lckhUTUw9IiIsYi5yZW1vdmUoKX1jKCIjbGF5dWktbGF5ZXItbW92ZXMsICNsYXl1aS1sYXllci1zaGFkZSIrYSkucmVtb3ZlKCksZi5pZTYmJmUucmVzZWxlY3QoKSxlLnJlc2NvbGxiYXIoYSksYyhkb2N1bWVudCkub2ZmKCJrZXlkb3duIixlLmVudGVyKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5lbmRbYV0mJmUuZW5kW2FdKCksZGVsZXRlIGUuZW5kW2FdfX0sZi5jbG9zZUFsbD1mdW5jdGlvbihhKXtjLmVhY2goYygiLiIraFswXSksZnVuY3Rpb24oKXt2YXIgYj1jKHRoaXMpLGQ9YT9iLmF0dHIoInR5cGUiKT09PWE6MTtkJiZmLmNsb3NlKGIuYXR0cigidGltZXMiKSksZD1udWxsfSl9O3ZhciBpPWYuY2FjaGV8fHt9LGo9ZnVuY3Rpb24oYSl7cmV0dXJuIGkuc2tpbj8iICIraS5za2luKyIgIitpLnNraW4rIi0iK2E6IiJ9O2YucHJvbXB0PWZ1bmN0aW9uKGEsYil7YT1hfHx7fSwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGI9YSk7dmFyIGQsZT0yPT1hLmZvcm1UeXBlPyc8dGV4dGFyZWEgY2xhc3M9ImxheXVpLWxheWVyLWlucHV0Ij4nKyhhLnZhbHVlfHwiIikrIjwvdGV4dGFyZWE+IjpmdW5jdGlvbigpe3JldHVybic8aW5wdXQgdHlwZT0iJysoMT09YS5mb3JtVHlwZT8icGFzc3dvcmQiOiJ0ZXh0IikrJyIgY2xhc3M9ImxheXVpLWxheWVyLWlucHV0IiB2YWx1ZT0iJysoYS52YWx1ZXx8IiIpKyciPid9KCk7cmV0dXJuIGYub3BlbihjLmV4dGVuZCh7YnRuOlsiJiN4Nzg2RTsmI3g1QjlBOyIsIiYjeDUzRDY7JiN4NkQ4ODsiXSxjb250ZW50OmUsc2tpbjoibGF5dWktbGF5ZXItcHJvbXB0IitqKCJwcm9tcHQiKSxzdWNjZXNzOmZ1bmN0aW9uKGEpe2Q9YS5maW5kKCIubGF5dWktbGF5ZXItaW5wdXQiKSxkLmZvY3VzKCl9LHllczpmdW5jdGlvbihjKXt2YXIgZT1kLnZhbCgpOyIiPT09ZT9kLmZvY3VzKCk6ZS5sZW5ndGg+KGEubWF4bGVuZ3RofHw1MDApP2YudGlwcygiJiN4NjcwMDsmI3g1OTFBOyYjeDhGOTM7JiN4NTE2NTsiKyhhLm1heGxlbmd0aHx8NTAwKSsiJiN4NEUyQTsmI3g1QjU3OyYjeDY1NzA7IixkLHt0aXBzOjF9KTpiJiZiKGUsYyxkKX19LGEpKX0sZi50YWI9ZnVuY3Rpb24oYSl7YT1hfHx7fTt2YXIgYj1hLnRhYnx8e307cmV0dXJuIGYub3BlbihjLmV4dGVuZCh7dHlwZToxLHNraW46ImxheXVpLWxheWVyLXRhYiIraigidGFiIiksdGl0bGU6ZnVuY3Rpb24oKXt2YXIgYT1iLmxlbmd0aCxjPTEsZD0iIjtpZihhPjApZm9yKGQ9JzxzcGFuIGNsYXNzPSJsYXl1aS1sYXllci10YWJub3ciPicrYlswXS50aXRsZSsiPC9zcGFuPiI7YT5jO2MrKylkKz0iPHNwYW4+IitiW2NdLnRpdGxlKyI8L3NwYW4+IjtyZXR1cm4gZH0oKSxjb250ZW50Oic8dWwgY2xhc3M9ImxheXVpLWxheWVyLXRhYm1haW4iPicrZnVuY3Rpb24oKXt2YXIgYT1iLmxlbmd0aCxjPTEsZD0iIjtpZihhPjApZm9yKGQ9JzxsaSBjbGFzcz0ibGF5dWktbGF5ZXItdGFibGkgeHVib3hfdGFiX2xheWVyIj4nKyhiWzBdLmNvbnRlbnR8fCJubyBjb250ZW50IikrIjwvbGk+IjthPmM7YysrKWQrPSc8bGkgY2xhc3M9ImxheXVpLWxheWVyLXRhYmxpIj4nKyhiW2NdLmNvbnRlbnR8fCJubyAgY29udGVudCIpKyI8L2xpPiI7cmV0dXJuIGR9KCkrIjwvdWw+IixzdWNjZXNzOmZ1bmN0aW9uKGIpe3ZhciBkPWIuZmluZCgiLmxheXVpLWxheWVyLXRpdGxlIikuY2hpbGRyZW4oKSxlPWIuZmluZCgiLmxheXVpLWxheWVyLXRhYm1haW4iKS5jaGlsZHJlbigpO2Qub24oIm1vdXNlZG93biIsZnVuY3Rpb24oYil7Yi5zdG9wUHJvcGFnYXRpb24/Yi5zdG9wUHJvcGFnYXRpb24oKTpiLmNhbmNlbEJ1YmJsZT0hMDt2YXIgZD1jKHRoaXMpLGY9ZC5pbmRleCgpO2QuYWRkQ2xhc3MoImxheXVpLWxheWVyLXRhYm5vdyIpLnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3MoImxheXVpLWxheWVyLXRhYm5vdyIpLGUuZXEoZikuc2hvdygpLnNpYmxpbmdzKCkuaGlkZSgpLCJmdW5jdGlvbiI9PXR5cGVvZiBhLmNoYW5nZSYmYS5jaGFuZ2UoZil9KX19LGEpKX0sZi5waG90b3M9ZnVuY3Rpb24oYixkLGUpe2Z1bmN0aW9uIGcoYSxiLGMpe3ZhciBkPW5ldyBJbWFnZTtyZXR1cm4gZC5zcmM9YSxkLmNvbXBsZXRlP2IoZCk6KGQub25sb2FkPWZ1bmN0aW9uKCl7ZC5vbmxvYWQ9bnVsbCxiKGQpfSx2b2lkKGQub25lcnJvcj1mdW5jdGlvbihhKXtkLm9uZXJyb3I9bnVsbCxjKGEpfSkpfXZhciBoPXt9O2lmKGI9Ynx8e30sYi5waG90b3Mpe3ZhciBpPWIucGhvdG9zLmNvbnN0cnVjdG9yPT09T2JqZWN0LGs9aT9iLnBob3Rvczp7fSxsPWsuZGF0YXx8W10sbT1rLnN0YXJ0fHwwO2lmKGguaW1nSW5kZXg9KDB8bSkrMSxiLmltZz1iLmltZ3x8ImltZyIsaSl7aWYoMD09PWwubGVuZ3RoKXJldHVybiBmLm1zZygiJiN4NkNBMTsmI3g2NzA5OyYjeDU2RkU7JiN4NzI0NzsiKX1lbHNle3ZhciBuPWMoYi5waG90b3MpLG89ZnVuY3Rpb24oKXtsPVtdLG4uZmluZChiLmltZykuZWFjaChmdW5jdGlvbihhKXt2YXIgYj1jKHRoaXMpO2IuYXR0cigibGF5ZXItaW5kZXgiLGEpLGwucHVzaCh7YWx0OmIuYXR0cigiYWx0IikscGlkOmIuYXR0cigibGF5ZXItcGlkIiksc3JjOmIuYXR0cigibGF5ZXItc3JjIil8fGIuYXR0cigic3JjIiksdGh1bWI6Yi5hdHRyKCJzcmMiKX0pfSl9O2lmKG8oKSwwPT09bC5sZW5ndGgpcmV0dXJuO2lmKGR8fG4ub24oImNsaWNrIixiLmltZyxmdW5jdGlvbigpe3ZhciBhPWModGhpcyksZD1hLmF0dHIoImxheWVyLWluZGV4Iik7Zi5waG90b3MoYy5leHRlbmQoYix7cGhvdG9zOntzdGFydDpkLGRhdGE6bCx0YWI6Yi50YWJ9LGZ1bGw6Yi5mdWxsfSksITApLG8oKX0pLCFkKXJldHVybn1oLmltZ3ByZXY9ZnVuY3Rpb24oYSl7aC5pbWdJbmRleC0tLGguaW1nSW5kZXg8MSYmKGguaW1nSW5kZXg9bC5sZW5ndGgpLGgudGFiaW1nKGEpfSxoLmltZ25leHQ9ZnVuY3Rpb24oYSxiKXtoLmltZ0luZGV4KyssaC5pbWdJbmRleD5sLmxlbmd0aCYmKGguaW1nSW5kZXg9MSxiKXx8aC50YWJpbWcoYSl9LGgua2V5dXA9ZnVuY3Rpb24oYSl7aWYoIWguZW5kKXt2YXIgYj1hLmtleUNvZGU7YS5wcmV2ZW50RGVmYXVsdCgpLDM3PT09Yj9oLmltZ3ByZXYoITApOjM5PT09Yj9oLmltZ25leHQoITApOjI3PT09YiYmZi5jbG9zZShoLmluZGV4KX19LGgudGFiaW1nPWZ1bmN0aW9uKGEpe2wubGVuZ3RoPD0xfHwoay5zdGFydD1oLmltZ0luZGV4LTEsZi5jbG9zZShoLmluZGV4KSxmLnBob3RvcyhiLCEwLGEpKX0saC5ldmVudD1mdW5jdGlvbigpe2guYmlnaW1nLmhvdmVyKGZ1bmN0aW9uKCl7aC5pbWdzZWUuc2hvdygpfSxmdW5jdGlvbigpe2guaW1nc2VlLmhpZGUoKX0pLGguYmlnaW1nLmZpbmQoIi5sYXl1aS1sYXllci1pbWdwcmV2Iikub24oImNsaWNrIixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCksaC5pbWdwcmV2KCl9KSxoLmJpZ2ltZy5maW5kKCIubGF5dWktbGF5ZXItaW1nbmV4dCIpLm9uKCJjbGljayIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpLGguaW1nbmV4dCgpfSksYyhkb2N1bWVudCkub24oImtleXVwIixoLmtleXVwKX0saC5sb2FkaT1mLmxvYWQoMSx7c2hhZGU6InNoYWRlImluIGI/ITE6Ljksc2Nyb2xsYmFyOiExfSksZyhsW21dLnNyYyxmdW5jdGlvbihkKXtmLmNsb3NlKGgubG9hZGkpLGguaW5kZXg9Zi5vcGVuKGMuZXh0ZW5kKHt0eXBlOjEsYXJlYTpmdW5jdGlvbigpe3ZhciBlPVtkLndpZHRoLGQuaGVpZ2h0XSxmPVtjKGEpLndpZHRoKCktNTAsYyhhKS5oZWlnaHQoKS01MF07cmV0dXJuIWIuZnVsbCYmZVswXT5mWzBdJiYoZVswXT1mWzBdLGVbMV09ZVswXSpkLmhlaWdodC9kLndpZHRoKSxbZVswXSsicHgiLGVbMV0rInB4Il19KCksdGl0bGU6ITEsc2hhZGU6Ljksc2hhZGVDbG9zZTohMCxjbG9zZUJ0bjohMSxtb3ZlOiIubGF5dWktbGF5ZXItcGhpbWcgaW1nIixtb3ZlVHlwZToxLHNjcm9sbGJhcjohMSxtb3ZlT3V0OiEwLHNoaWZ0OjUqTWF0aC5yYW5kb20oKXwwLHNraW46ImxheXVpLWxheWVyLXBob3RvcyIraigicGhvdG9zIiksY29udGVudDonPGRpdiBjbGFzcz0ibGF5dWktbGF5ZXItcGhpbWciPjxpbWcgc3JjPSInK2xbbV0uc3JjKyciIGFsdD0iJysobFttXS5hbHR8fCIiKSsnIiBsYXllci1waWQ9IicrbFttXS5waWQrJyI+PGRpdiBjbGFzcz0ibGF5dWktbGF5ZXItaW1nc2VlIj4nKyhsLmxlbmd0aD4xPyc8c3BhbiBjbGFzcz0ibGF5dWktbGF5ZXItaW1ndWlkZSI+PGEgaHJlZj0iamF2YXNjcmlwdDo7IiBjbGFzcz0ibGF5dWktbGF5ZXItaWNvbmV4dCBsYXl1aS1sYXllci1pbWdwcmV2Ij48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDo7IiBjbGFzcz0ibGF5dWktbGF5ZXItaWNvbmV4dCBsYXl1aS1sYXllci1pbWduZXh0Ij48L2E+PC9zcGFuPic6IiIpKyc8ZGl2IGNsYXNzPSJsYXl1aS1sYXllci1pbWdiYXIiIHN0eWxlPSJkaXNwbGF5OicrKGU/ImJsb2NrIjoiIikrJyI+PHNwYW4gY2xhc3M9ImxheXVpLWxheWVyLWltZ3RpdCI+PGEgaHJlZj0iamF2YXNjcmlwdDo7Ij4nKyhsW21dLmFsdHx8IiIpKyI8L2E+PGVtPiIraC5pbWdJbmRleCsiLyIrbC5sZW5ndGgrIjwvZW0+PC9zcGFuPjwvZGl2PjwvZGl2PjwvZGl2PiIsc3VjY2VzczpmdW5jdGlvbihhLGMpe2guYmlnaW1nPWEuZmluZCgiLmxheXVpLWxheWVyLXBoaW1nIiksaC5pbWdzZWU9YS5maW5kKCIubGF5dWktbGF5ZXItaW1ndWlkZSwubGF5dWktbGF5ZXItaW1nYmFyIiksaC5ldmVudChhKSxiLnRhYiYmYi50YWIobFttXSxhKX0sZW5kOmZ1bmN0aW9uKCl7aC5lbmQ9ITAsYyhkb2N1bWVudCkub2ZmKCJrZXl1cCIsaC5rZXl1cCl9fSxiKSl9LGZ1bmN0aW9uKCl7Zi5jbG9zZShoLmxvYWRpKSxmLm1zZygiJiN4NUY1MzsmI3g1MjREOyYjeDU2RkU7JiN4NzI0NzsmI3g1NzMwOyYjeDU3NDA7JiN4NUYwMjsmI3g1RTM4Ozxicj4mI3g2NjJGOyYjeDU0MjY7JiN4N0VFNzsmI3g3RUVEOyYjeDY3RTU7JiN4NzcwQjsmI3g0RTBCOyYjeDRFMDA7JiN4NUYyMDsmI3hGRjFGOyIse3RpbWU6M2U0LGJ0bjpbIiYjeDRFMEI7JiN4NEUwMDsmI3g1RjIwOyIsIiYjeDRFMEQ7JiN4NzcwQjsmI3g0RTg2OyJdLHllczpmdW5jdGlvbigpe2wubGVuZ3RoPjEmJmguaW1nbmV4dCghMCwhMCl9fSl9KX19LGUucnVuPWZ1bmN0aW9uKCl7Yz1qUXVlcnksZD1jKGEpLGguaHRtbD1jKCJodG1sIiksZi5vcGVuPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBnKGEpO3JldHVybiBiLmluZGV4fX0sImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZT9kZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gZS5ydW4oKSxmfSk6ZnVuY3Rpb24oKXtlLnJ1bigpLGYudXNlKCJza2luL2xheWVyLmNzcyIpfSgpfSh3aW5kb3cpOw=="},{"meta":{"name":"Reflect.min.js","url":"https://lib.baomitu.com/reflect-metadata/0.1.13/Reflect.min.js","ts":1637743664589,"mimetype":"text/javascript"},"source":"dmFyIFJlZmxlY3Q7IWZ1bmN0aW9uKG8peyFmdW5jdGlvbih0KXt2YXIgZT0ib2JqZWN0Ij09dHlwZW9mIGdsb2JhbD9nbG9iYWw6Im9iamVjdCI9PXR5cGVvZiBzZWxmP3NlbGY6Im9iamVjdCI9PXR5cGVvZiB0aGlzP3RoaXM6RnVuY3Rpb24oInJldHVybiB0aGlzOyIpKCkscj1uKG8pO2Z1bmN0aW9uIG4ocixuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iIT10eXBlb2Ygclt0XSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsdCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KSxuJiZuKHQsZSl9fXZvaWQgMD09PWUuUmVmbGVjdD9lLlJlZmxlY3Q9bzpyPW4oZS5SZWZsZWN0LHIpLGZ1bmN0aW9uKHQpe3ZhciBmPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sLGk9ZSYmdm9pZCAwIT09U3ltYm9sLnRvUHJpbWl0aXZlP1N5bWJvbC50b1ByaW1pdGl2ZToiQEB0b1ByaW1pdGl2ZSIscz1lJiZ2b2lkIDAhPT1TeW1ib2wuaXRlcmF0b3I/U3ltYm9sLml0ZXJhdG9yOiJAQGl0ZXJhdG9yIixyPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlLG49e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5LG89IXImJiFuLGM9e2NyZWF0ZTpyP2Z1bmN0aW9uKCl7cmV0dXJuIFUoT2JqZWN0LmNyZWF0ZShudWxsKSl9Om4/ZnVuY3Rpb24oKXtyZXR1cm4gVSh7X19wcm90b19fOm51bGx9KX06ZnVuY3Rpb24oKXtyZXR1cm4gVSh7fSl9LGhhczpvP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIGYuY2FsbCh0LGUpfTpmdW5jdGlvbih0LGUpe3JldHVybiBlIGluIHR9LGdldDpvP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIGYuY2FsbCh0LGUpP3RbZV06dm9pZCAwfTpmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdfX0sdT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pLGE9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiZwcm9jZXNzLmVudiYmInRydWUiPT09cHJvY2Vzcy5lbnYuUkVGTEVDVF9NRVRBREFUQV9VU0VfTUFQX1BPTFlGSUxMLGg9YXx8ImZ1bmN0aW9uIiE9dHlwZW9mIE1hcHx8ImZ1bmN0aW9uIiE9dHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcz9mdW5jdGlvbigpe3ZhciBvPXt9LHI9W10sZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLHIpe3RoaXMuX2luZGV4PTAsdGhpcy5fa2V5cz10LHRoaXMuX3ZhbHVlcz1lLHRoaXMuX3NlbGVjdG9yPXJ9cmV0dXJuIHQucHJvdG90eXBlWyJAQGl0ZXJhdG9yIl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGVbc109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2luZGV4O2lmKDA8PXQmJnQ8dGhpcy5fa2V5cy5sZW5ndGgpe3ZhciBlPXRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbdF0sdGhpcy5fdmFsdWVzW3RdKTtyZXR1cm4gdCsxPj10aGlzLl9rZXlzLmxlbmd0aD8odGhpcy5faW5kZXg9LTEsdGhpcy5fa2V5cz1yLHRoaXMuX3ZhbHVlcz1yKTp0aGlzLl9pbmRleCsrLHt2YWx1ZTplLGRvbmU6ITF9fXJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19LHQucHJvdG90eXBlLnRocm93PWZ1bmN0aW9uKHQpe3Rocm93IDA8PXRoaXMuX2luZGV4JiYodGhpcy5faW5kZXg9LTEsdGhpcy5fa2V5cz1yLHRoaXMuX3ZhbHVlcz1yKSx0fSx0LnByb3RvdHlwZS5yZXR1cm49ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXRoaXMuX2luZGV4JiYodGhpcy5faW5kZXg9LTEsdGhpcy5fa2V5cz1yLHRoaXMuX3ZhbHVlcz1yKSx7dmFsdWU6dCxkb25lOiEwfX0sdH0oKTtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fY2FjaGVLZXk9byx0aGlzLl9jYWNoZUluZGV4PS0yfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGh9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiAwPD10aGlzLl9maW5kKHQsITEpfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZmluZCh0LCExKTtyZXR1cm4gMDw9ZT90aGlzLl92YWx1ZXNbZV06dm9pZCAwfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9maW5kKHQsITApO3JldHVybiB0aGlzLl92YWx1ZXNbcl09ZSx0aGlzfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZmluZCh0LCExKTtpZigwPD1lKXtmb3IodmFyIHI9dGhpcy5fa2V5cy5sZW5ndGgsbj1lKzE7bjxyO24rKyl0aGlzLl9rZXlzW24tMV09dGhpcy5fa2V5c1tuXSx0aGlzLl92YWx1ZXNbbi0xXT10aGlzLl92YWx1ZXNbbl07cmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoLS0sdGhpcy5fdmFsdWVzLmxlbmd0aC0tLHQ9PT10aGlzLl9jYWNoZUtleSYmKHRoaXMuX2NhY2hlS2V5PW8sdGhpcy5fY2FjaGVJbmRleD0tMiksITB9cmV0dXJuITF9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fa2V5cy5sZW5ndGg9MCx0aGlzLl92YWx1ZXMubGVuZ3RoPTAsdGhpcy5fY2FjaGVLZXk9byx0aGlzLl9jYWNoZUluZGV4PS0yfSx0LnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzLG4pfSx0LnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fa2V5cyx0aGlzLl92YWx1ZXMsaSl9LHQucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fa2V5cyx0aGlzLl92YWx1ZXMsdSl9LHQucHJvdG90eXBlWyJAQGl0ZXJhdG9yIl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9LHQucHJvdG90eXBlW3NdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW50cmllcygpfSx0LnByb3RvdHlwZS5fZmluZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9jYWNoZUtleSE9PXQmJih0aGlzLl9jYWNoZUluZGV4PXRoaXMuX2tleXMuaW5kZXhPZih0aGlzLl9jYWNoZUtleT10KSksdGhpcy5fY2FjaGVJbmRleDwwJiZlJiYodGhpcy5fY2FjaGVJbmRleD10aGlzLl9rZXlzLmxlbmd0aCx0aGlzLl9rZXlzLnB1c2godCksdGhpcy5fdmFsdWVzLnB1c2godm9pZCAwKSksdGhpcy5fY2FjaGVJbmRleH0sdH0oKTtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHR9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiBlfWZ1bmN0aW9uIHUodCxlKXtyZXR1cm5bdCxlXX19KCk6TWFwLHk9YXx8ImZ1bmN0aW9uIiE9dHlwZW9mIFNldHx8ImZ1bmN0aW9uIiE9dHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcz9mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9tYXA9bmV3IGh9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAuc2l6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcC5oYXModCl9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLnNldCh0LHQpLHRoaXN9LHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh0KX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9tYXAuY2xlYXIoKX0sdC5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAua2V5cygpfSx0LnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpfSx0LnByb3RvdHlwZS5lbnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5lbnRyaWVzKCl9LHQucHJvdG90eXBlWyJAQGl0ZXJhdG9yIl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXlzKCl9LHQucHJvdG90eXBlW3NdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5cygpfSx0fSgpOlNldCxwPW5ldyhhfHwiZnVuY3Rpb24iIT10eXBlb2YgV2Vha01hcD9mdW5jdGlvbigpe3ZhciBpPTE2LGU9Yy5jcmVhdGUoKSxyPW4oKTtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fa2V5PW4oKX1yZXR1cm4gdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCwhMSk7cmV0dXJuIHZvaWQgMCE9PWUmJmMuaGFzKGUsdGhpcy5fa2V5KX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPW8odCwhMSk7cmV0dXJuIHZvaWQgMCE9PWU/Yy5nZXQoZSx0aGlzLl9rZXkpOnZvaWQgMH0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9byh0LCEwKTtyZXR1cm4gclt0aGlzLl9rZXldPWUsdGhpc30sdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCwhMSk7cmV0dXJuIHZvaWQgMCE9PWUmJmRlbGV0ZSBlW3RoaXMuX2tleV19LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fa2V5PW4oKX0sdH0oKTtmdW5jdGlvbiBuKCl7Zm9yKHZhciB0O3Q9IkBAV2Vha01hcEBAIithKCksYy5oYXMoZSx0KTspO3JldHVybiBlW3RdPSEwLHR9ZnVuY3Rpb24gbyh0LGUpe2lmKCFmLmNhbGwodCxyKSl7aWYoIWUpcmV0dXJuO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIse3ZhbHVlOmMuY3JlYXRlKCl9KX1yZXR1cm4gdFtyXX1mdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciByPTA7cjxlOysrcil0W3JdPTI1NSpNYXRoLnJhbmRvbSgpfDA7cmV0dXJuIHR9ZnVuY3Rpb24gYSgpe3ZhciB0LGU9KHQ9aSwiZnVuY3Rpb24iIT10eXBlb2YgVWludDhBcnJheT91KG5ldyBBcnJheSh0KSx0KToidW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0bz9jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHQpKToidW5kZWZpbmVkIiE9dHlwZW9mIG1zQ3J5cHRvP21zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSh0KSk6dShuZXcgVWludDhBcnJheSh0KSx0KSk7ZVs2XT03OSZlWzZdfDY0LGVbOF09MTkxJmVbOF18MTI4O2Zvcih2YXIgcj0iIixuPTA7bjxpOysrbil7dmFyIG89ZVtuXTs0IT09biYmNiE9PW4mJjghPT1ufHwocis9Ii0iKSxvPDE2JiYocis9IjAiKSxyKz1vLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpfXJldHVybiByfX0oKTpXZWFrTWFwKTtmdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLTE7MDw9cjstLXIpe3ZhciBuPXRbcl0sbz1uKGUpO2lmKCFPKG8pJiYhaihvKSl7aWYoIVIobykpdGhyb3cgbmV3IFR5cGVFcnJvcjtlPW99fXJldHVybiBlfWZ1bmN0aW9uIHYodCxlLHIsbil7Zm9yKHZhciBvPXQubGVuZ3RoLTE7MDw9bzstLW8pe3ZhciBpPXRbb10sdT1pKGUscixuKTtpZighTyh1KSYmIWoodSkpe2lmKCF4KHUpKXRocm93IG5ldyBUeXBlRXJyb3I7bj11fX1yZXR1cm4gbn1mdW5jdGlvbiBfKHQsZSxyKXt2YXIgbj1wLmdldCh0KTtpZihPKG4pKXtpZighcilyZXR1cm47bj1uZXcgaCxwLnNldCh0LG4pfXZhciBvPW4uZ2V0KGUpO2lmKE8obykpe2lmKCFyKXJldHVybjtvPW5ldyBoLG4uc2V0KGUsbyl9cmV0dXJuIG99ZnVuY3Rpb24gZCh0LGUscil7dmFyIG49dyh0LGUscik7aWYobilyZXR1cm4hMDt2YXIgbz1MKGUpO3JldHVybiFqKG8pJiZkKHQsbyxyKX1mdW5jdGlvbiB3KHQsZSxyKXt2YXIgbj1fKGUsciwhMSk7cmV0dXJuIU8obikmJiEhbi5oYXModCl9ZnVuY3Rpb24gZyh0LGUscil7dmFyIG49dyh0LGUscik7aWYobilyZXR1cm4gYih0LGUscik7dmFyIG89TChlKTtyZXR1cm4gaihvKT92b2lkIDA6Zyh0LG8scil9ZnVuY3Rpb24gYih0LGUscil7dmFyIG49XyhlLHIsITEpO2lmKCFPKG4pKXJldHVybiBuLmdldCh0KX1mdW5jdGlvbiBrKHQsZSxyLG4pe3ZhciBvPV8ocixuLCEwKTtvLnNldCh0LGUpfWZ1bmN0aW9uIG0odCxlKXt2YXIgcj1FKHQsZSksbj1MKHQpO2lmKG51bGw9PT1uKXJldHVybiByO3ZhciBvPW0obixlKTtpZihvLmxlbmd0aDw9MClyZXR1cm4gcjtpZihyLmxlbmd0aDw9MClyZXR1cm4gbztmb3IodmFyIGk9bmV3IHksdT1bXSxhPTAsZj1yO2E8Zi5sZW5ndGg7YSsrKXt2YXIgYz1mW2FdLHM9aS5oYXMoYyk7c3x8KGkuYWRkKGMpLHUucHVzaChjKSl9Zm9yKHZhciBoPTAscD1vO2g8cC5sZW5ndGg7aCsrKXt2YXIgYz1wW2hdLHM9aS5oYXMoYyk7c3x8KGkuYWRkKGMpLHUucHVzaChjKSl9cmV0dXJuIHV9ZnVuY3Rpb24gRSh0LGUpe3ZhciByPVtdLG49Xyh0LGUsITEpO2lmKE8obikpcmV0dXJuIHI7Zm9yKHZhciBvLGk9bi5rZXlzKCksdT1mdW5jdGlvbih0KXt2YXIgZT1LKHQscyk7aWYoIVMoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgcj1lLmNhbGwodCk7aWYoIXgocikpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gcn0oaSksYT0wOzspe3ZhciBmPSh2b2lkIDAsIShvPXUubmV4dCgpKS5kb25lJiZvKTtpZighZilyZXR1cm4gci5sZW5ndGg9YSxyO3ZhciBjPWYudmFsdWU7dHJ5e3JbYV09Y31jYXRjaCh0KXt0cnl7eih1KX1maW5hbGx5e3Rocm93IHR9fWErK319ZnVuY3Rpb24gVCh0KXtpZihudWxsPT09dClyZXR1cm4gMTtzd2l0Y2godHlwZW9mIHQpe2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gMDtjYXNlImJvb2xlYW4iOnJldHVybiAyO2Nhc2Uic3RyaW5nIjpyZXR1cm4gMztjYXNlInN5bWJvbCI6cmV0dXJuIDQ7Y2FzZSJudW1iZXIiOnJldHVybiA1O2Nhc2Uib2JqZWN0IjpyZXR1cm4gbnVsbD09PXQ/MTo2O2RlZmF1bHQ6cmV0dXJuIDZ9fWZ1bmN0aW9uIE8odCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gaih0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24geCh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gTSh0LGUpe3N3aXRjaChUKHQpKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpyZXR1cm4gdH12YXIgcj0zPT09ZT8ic3RyaW5nIjo1PT09ZT8ibnVtYmVyIjoiZGVmYXVsdCIsbj1LKHQsaSk7aWYodm9pZCAwPT09bilyZXR1cm4gZnVuY3Rpb24odCxlKXtpZigic3RyaW5nIj09PWUpe3ZhciByPXQudG9TdHJpbmc7aWYoUyhyKSl7dmFyIG49ci5jYWxsKHQpO2lmKCF4KG4pKXJldHVybiBufXZhciBvPXQudmFsdWVPZjtpZihTKG8pKXt2YXIgbj1vLmNhbGwodCk7aWYoIXgobikpcmV0dXJuIG59fWVsc2V7dmFyIG89dC52YWx1ZU9mO2lmKFMobykpe3ZhciBuPW8uY2FsbCh0KTtpZigheChuKSlyZXR1cm4gbn12YXIgaT10LnRvU3RyaW5nO2lmKFMoaSkpe3ZhciBuPWkuY2FsbCh0KTtpZigheChuKSlyZXR1cm4gbn19dGhyb3cgbmV3IFR5cGVFcnJvcn0odCwiZGVmYXVsdCI9PT1yPyJudW1iZXIiOnIpO3ZhciBvPW4uY2FsbCh0LHIpO2lmKHgobykpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gb31mdW5jdGlvbiBBKHQpe3ZhciBlPU0odCwzKTtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGU/ZToiIitlfWZ1bmN0aW9uIFAodCl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheSh0KTp0IGluc3RhbmNlb2YgT2JqZWN0P3QgaW5zdGFuY2VvZiBBcnJheToiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFModCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gUih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBJKHQpe3N3aXRjaChUKHQpKXtjYXNlIDM6Y2FzZSA0OnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIEsodCxlKXt2YXIgcj10W2VdO2lmKG51bGwhPXIpe2lmKCFTKHIpKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIHJ9fWZ1bmN0aW9uIHoodCl7dmFyIGU9dC5yZXR1cm47ZSYmZS5jYWxsKHQpfWZ1bmN0aW9uIEwodCl7dmFyIGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0PT09dSlyZXR1cm4gZTtpZihlIT09dSlyZXR1cm4gZTt2YXIgcj10LnByb3RvdHlwZSxuPXImJk9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtpZihudWxsPT1ufHxuPT09T2JqZWN0LnByb3RvdHlwZSlyZXR1cm4gZTt2YXIgbz1uLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBvP2U6bz09PXQ/ZTpvfWZ1bmN0aW9uIFUodCl7cmV0dXJuIHQuX189dm9pZCAwLGRlbGV0ZSB0Ll9fLHR9dCgiZGVjb3JhdGUiLGZ1bmN0aW9uKHQsZSxyLG4pe3tpZihPKHIpKXtpZighUCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yO2lmKCFSKGUpKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIGwodCxlKX1pZighUCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yO2lmKCF4KGUpKXRocm93IG5ldyBUeXBlRXJyb3I7aWYoIXgobikmJiFPKG4pJiYhaihuKSl0aHJvdyBuZXcgVHlwZUVycm9yO3JldHVybiBqKG4pJiYobj12b2lkIDApLHI9QShyKSx2KHQsZSxyLG4pfX0pLHQoIm1ldGFkYXRhIixmdW5jdGlvbihyLG4pe2Z1bmN0aW9uIHQodCxlKXtpZigheCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yO2lmKCFPKGUpJiYhSShlKSl0aHJvdyBuZXcgVHlwZUVycm9yO2socixuLHQsZSl9cmV0dXJuIHR9KSx0KCJkZWZpbmVNZXRhZGF0YSIsZnVuY3Rpb24odCxlLHIsbil7aWYoIXgocikpdGhyb3cgbmV3IFR5cGVFcnJvcjtPKG4pfHwobj1BKG4pKTtyZXR1cm4gayh0LGUscixuKX0pLHQoImhhc01ldGFkYXRhIixmdW5jdGlvbih0LGUscil7aWYoIXgoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjtPKHIpfHwocj1BKHIpKTtyZXR1cm4gZCh0LGUscil9KSx0KCJoYXNPd25NZXRhZGF0YSIsZnVuY3Rpb24odCxlLHIpe2lmKCF4KGUpKXRocm93IG5ldyBUeXBlRXJyb3I7TyhyKXx8KHI9QShyKSk7cmV0dXJuIHcodCxlLHIpfSksdCgiZ2V0TWV0YWRhdGEiLGZ1bmN0aW9uKHQsZSxyKXtpZigheChlKSl0aHJvdyBuZXcgVHlwZUVycm9yO08ocil8fChyPUEocikpO3JldHVybiBnKHQsZSxyKX0pLHQoImdldE93bk1ldGFkYXRhIixmdW5jdGlvbih0LGUscil7aWYoIXgoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjtPKHIpfHwocj1BKHIpKTtyZXR1cm4gYih0LGUscil9KSx0KCJnZXRNZXRhZGF0YUtleXMiLGZ1bmN0aW9uKHQsZSl7aWYoIXgodCkpdGhyb3cgbmV3IFR5cGVFcnJvcjtPKGUpfHwoZT1BKGUpKTtyZXR1cm4gbSh0LGUpfSksdCgiZ2V0T3duTWV0YWRhdGFLZXlzIixmdW5jdGlvbih0LGUpe2lmKCF4KHQpKXRocm93IG5ldyBUeXBlRXJyb3I7TyhlKXx8KGU9QShlKSk7cmV0dXJuIEUodCxlKX0pLHQoImRlbGV0ZU1ldGFkYXRhIixmdW5jdGlvbih0LGUscil7aWYoIXgoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjtPKHIpfHwocj1BKHIpKTt2YXIgbj1fKGUsciwhMSk7aWYoTyhuKSlyZXR1cm4hMTtpZighbi5kZWxldGUodCkpcmV0dXJuITE7aWYoMDxuLnNpemUpcmV0dXJuITA7dmFyIG89cC5nZXQoZSk7cmV0dXJuIG8uZGVsZXRlKHIpLDA8by5zaXplfHxwLmRlbGV0ZShlKSwhMH0pfShyKX0oKX0oUmVmbGVjdHx8KFJlZmxlY3Q9e30pKTs="},{"meta":{"name":"vue.min.js","url":"https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js","ts":1637743664292,"mimetype":"text/javascript"},"source":"LyohCiAqIFZ1ZS5qcyB2Mi42LjExCiAqIChjKSAyMDE0LTIwMTkgRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KIWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuVnVlPXQoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiB0KGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gcihlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBzKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09YS5jYWxsKGUpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiB0Pj0wJiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbihlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxzKGUpJiZlLnRvU3RyaW5nPT09YT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHAoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19dmFyIGQ9cCgic2xvdCxjb21wb25lbnQiLCEwKSx2PXAoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gaChlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB5KGUsdCl7cmV0dXJuIG0uY2FsbChlLHQpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbbl18fCh0W25dPWUobikpfX12YXIgXz0vLShcdykvZyxiPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShfLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSwkPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLHc9L1xCKFtBLVpdKS9nLEM9ZyhmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgeD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByP3I+MT9lLmFwcGx5KHQsYXJndW1lbnRzKTplLmNhbGwodCxuKTplLmNhbGwodCl9cmV0dXJuIG4uX2xlbmd0aD1lLmxlbmd0aCxufTtmdW5jdGlvbiBrKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmQSh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFMoZSx0LG4pe312YXIgVD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LEU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIE4oZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj1vKGUpLHI9byh0KTtpZighbnx8IXIpcmV0dXJuIW4mJiFyJiZTdHJpbmcoZSk9PT1TdHJpbmcodCk7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkoZSksYT1BcnJheS5pc0FycmF5KHQpO2lmKGkmJmEpcmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuZXZlcnkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gTihlLHRbbl0pfSk7aWYoZSBpbnN0YW5jZW9mIERhdGUmJnQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO2lmKGl8fGEpcmV0dXJuITE7dmFyIHM9T2JqZWN0LmtleXMoZSksYz1PYmplY3Qua2V5cyh0KTtyZXR1cm4gcy5sZW5ndGg9PT1jLmxlbmd0aCYmcy5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gTihlW25dLHRbbl0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGooZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihOKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gRChlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsTT1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLEk9WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLEY9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpULGlzUmVzZXJ2ZWRBdHRyOlQsaXNVbmtub3duRWxlbWVudDpULGdldFRhZ05hbWVzcGFjZTpTLHBhcnNlUGxhdGZvcm1UYWdOYW1lOkUsbXVzdFVzZVByb3A6VCxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6SX0sUD0vYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvO2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgSD1uZXcgUmVnRXhwKCJbXiIrUC5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgQixVPSJfX3Byb3RvX18iaW57fSx6PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFY9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSz1WJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSj16JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHE9SiYmL21zaWV8dHJpZGVudC8udGVzdChKKSxXPUomJkouaW5kZXhPZigibXNpZSA5LjAiKT4wLFo9SiYmSi5pbmRleE9mKCJlZGdlLyIpPjAsRz0oSiYmSi5pbmRleE9mKCJhbmRyb2lkIiksSiYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEopfHwiaW9zIj09PUspLFg9KEomJi9jaHJvbWVcL1xkKy8udGVzdChKKSxKJiYvcGhhbnRvbWpzLy50ZXN0KEopLEomJkoubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykpLFk9e30ud2F0Y2gsUT0hMTtpZih6KXRyeXt2YXIgZWU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGVlLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7UT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLGVlKX1jYXRjaChlKXt9dmFyIHRlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PUImJihCPSF6JiYhViYmInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLEJ9LG5lPXomJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIHJlKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgaWUsb2U9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnJlKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmcmUoUmVmbGVjdC5vd25LZXlzKTtpZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmcmUoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBhZT1TLHNlPTAsY2U9ZnVuY3Rpb24oKXt0aGlzLmlkPXNlKyssdGhpcy5zdWJzPVtdfTtjZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxjZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2godGhpcy5zdWJzLGUpfSxjZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Y2UudGFyZ2V0JiZjZS50YXJnZXQuYWRkRGVwKHRoaXMpfSxjZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0sY2UudGFyZ2V0PW51bGw7dmFyIHVlPVtdO2Z1bmN0aW9uIGxlKGUpe3VlLnB1c2goZSksY2UudGFyZ2V0PWV9ZnVuY3Rpb24gZmUoKXt1ZS5wb3AoKSxjZS50YXJnZXQ9dWVbdWUubGVuZ3RoLTFdfXZhciBwZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sZGU9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtkZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGUucHJvdG90eXBlLGRlKTt2YXIgdmU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBwZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIG5ldyBwZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW5ldyBwZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIHllPUFycmF5LnByb3RvdHlwZSxnZT1PYmplY3QuY3JlYXRlKHllKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9eWVbZV07UihnZSxlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09YXJndW1lbnRzW3JdO3ZhciBpLG89dC5hcHBseSh0aGlzLG4pLGE9dGhpcy5fX29iX187c3dpdGNoKGUpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjppPW47YnJlYWs7Y2FzZSJzcGxpY2UiOmk9bi5zbGljZSgyKX1yZXR1cm4gaSYmYS5vYnNlcnZlQXJyYXkoaSksYS5kZXAubm90aWZ5KCksb30pfSk7dmFyIF9lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGdlKSxiZT0hMDtmdW5jdGlvbiAkZShlKXtiZT1lfXZhciB3ZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGNlLHRoaXMudm1Db3VudD0wLFIoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhVPyh0PWdlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07UihlLG8sdFtvXSl9fShlLGdlLF9lKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiBDZShlLHQpe3ZhciBuO2lmKG8oZSkmJiEoZSBpbnN0YW5jZW9mIHBlKSlyZXR1cm4geShlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiB3ZT9uPWUuX19vYl9fOmJlJiYhdGUoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHMoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyB3ZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiB4ZShlLHQsbixyLGkpe3ZhciBvPW5ldyBjZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChuPWVbdF0pO3ZhciB1PSFpJiZDZShuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1zP3MuY2FsbChlKTpuO3JldHVybiBjZS50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KHQpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfSh0KSkpLHR9LHNldDpmdW5jdGlvbih0KXt2YXIgcj1zP3MuY2FsbChlKTpuO3Q9PT1yfHx0IT10JiZyIT1yfHxzJiYhY3x8KGM/Yy5jYWxsKGUsdCk6bj10LHU9IWkmJkNlKHQpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmYyh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bixuO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8oeGUoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOihlW3RdPW4sbil9ZnVuY3Rpb24gQWUoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZjKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHx5KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fXdlLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspeGUoZSx0W25dKX0sd2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspQ2UoZVt0XSl9O3ZhciBPZT1GLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1vZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLHkoZSxuKT9yIT09aSYmcyhyKSYmcyhpKSYmU2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gbj9mdW5jdGlvbigpe3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChuLG4pOnQsaT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmNhbGwobixuKTplO3JldHVybiByP1NlKHIsaSk6aX06dD9lP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnQsImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5jYWxsKHRoaXMsdGhpcyk6ZSl9OnQ6ZX1mdW5jdGlvbiBFZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIE5lKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/QShpLHQpOml9T2UuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/VGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sSS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2VdPUVlfSksTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2UrInMiXT1OZX0pLE9lLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1ZJiYoZT12b2lkIDApLHQ9PT1ZJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBBKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LE9lLnByb3BzPU9lLm1ldGhvZHM9T2UuaW5qZWN0PU9lLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEEoaSxlKSx0JiZBKGksdCksaX0sT2UucHJvdmlkZT1UZTt2YXIgamU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIERlKGUsdCxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dC5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2IoaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHMobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bYihhKV09cyhpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHQpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYocyhuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXMoYSk/QSh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fSh0KSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0odCksIXQuX2Jhc2UmJih0LmV4dGVuZHMmJihlPURlKGUsdC5leHRlbmRzLG4pKSx0Lm1peGlucykpZm9yKHZhciByPTAsaT10Lm1peGlucy5sZW5ndGg7cjxpO3IrKyllPURlKGUsdC5taXhpbnNbcl0sbik7dmFyIG8sYT17fTtmb3IobyBpbiBlKWMobyk7Zm9yKG8gaW4gdCl5KGUsbyl8fGMobyk7ZnVuY3Rpb24gYyhyKXt2YXIgaT1PZVtyXXx8amU7YVtyXT1pKGVbcl0sdFtyXSxuLHIpfXJldHVybiBhfWZ1bmN0aW9uIExlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZih5KGksbikpcmV0dXJuIGlbbl07dmFyIG89YihuKTtpZih5KGksbykpcmV0dXJuIGlbb107dmFyIGE9JChvKTtyZXR1cm4geShpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gTWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSF5KG4sZSksYT1uW2VdLHM9UGUoQm9vbGVhbixpLnR5cGUpO2lmKHM+LTEpaWYobyYmIXkoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1DKGUpKXt2YXIgYz1QZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIXkodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1JZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9YmU7JGUoITApLENlKGEpLCRlKHUpfXJldHVybiBhfWZ1bmN0aW9uIEllKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBGZShlLHQpe3JldHVybiBJZShlKT09PUllKHQpfWZ1bmN0aW9uIFBlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEZlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoRmUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBSZShlLHQsbil7bGUoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7QmUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19QmUoZSx0LG4pfWZpbmFsbHl7ZmUoKX19ZnVuY3Rpb24gSGUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZ1KG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIFJlKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtSZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gQmUoZSx0LG4pe2lmKEYuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gRi5lcnJvckhhbmRsZXIuY2FsbChudWxsLGUsdCxuKX1jYXRjaCh0KXt0IT09ZSYmVWUodCxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9VWUoZSx0LG4pfWZ1bmN0aW9uIFVlKGUsdCxuKXtpZigheiYmIVZ8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIHplLFZlPSExLEtlPVtdLEplPSExO2Z1bmN0aW9uIHFlKCl7SmU9ITE7dmFyIGU9S2Uuc2xpY2UoMCk7S2UubGVuZ3RoPTA7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmcmUoUHJvbWlzZSkpe3ZhciBXZT1Qcm9taXNlLnJlc29sdmUoKTt6ZT1mdW5jdGlvbigpe1dlLnRoZW4ocWUpLEcmJnNldFRpbWVvdXQoUyl9LFZlPSEwfWVsc2UgaWYocXx8InVuZGVmaW5lZCI9PXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyfHwhcmUoTXV0YXRpb25PYnNlcnZlcikmJiJbb2JqZWN0IE11dGF0aW9uT2JzZXJ2ZXJDb25zdHJ1Y3Rvcl0iIT09TXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpKXplPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZyZShzZXRJbW1lZGlhdGUpP2Z1bmN0aW9uKCl7c2V0SW1tZWRpYXRlKHFlKX06ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHFlLDApfTtlbHNle3ZhciBaZT0xLEdlPW5ldyBNdXRhdGlvbk9ic2VydmVyKHFlKSxYZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoWmUpKTtHZS5vYnNlcnZlKFhlLHtjaGFyYWN0ZXJEYXRhOiEwfSksemU9ZnVuY3Rpb24oKXtaZT0oWmUrMSklMixYZS5kYXRhPVN0cmluZyhaZSl9LFZlPSEwfWZ1bmN0aW9uIFllKGUsdCl7dmFyIG47aWYoS2UucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtSZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksSmV8fChKZT0hMCx6ZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgUWU9bmV3IGllO2Z1bmN0aW9uIGV0KGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgYT1BcnJheS5pc0FycmF5KHQpO2lmKCFhJiYhbyh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgcGUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgcz10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMocykpcmV0dXJuO24uYWRkKHMpfWlmKGEpZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFFlKSxRZS5jbGVhcigpfXZhciB0dD1nKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBudChlLHQpe2Z1bmN0aW9uIG4oKXt2YXIgZT1hcmd1bWVudHMscj1uLmZucztpZighQXJyYXkuaXNBcnJheShyKSlyZXR1cm4gSGUocixudWxsLGFyZ3VtZW50cyx0LCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIGk9ci5zbGljZSgpLG89MDtvPGkubGVuZ3RoO28rKylIZShpW29dLG51bGwsZSx0LCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gbi5mbnM9ZSxufWZ1bmN0aW9uIHJ0KGUsbixpLG8sYSxzKXt2YXIgYyx1LGwsZjtmb3IoYyBpbiBlKXU9ZVtjXSxsPW5bY10sZj10dChjKSx0KHUpfHwodChsKT8odCh1LmZucykmJih1PWVbY109bnQodSxzKSkscihmLm9uY2UpJiYodT1lW2NdPWEoZi5uYW1lLHUsZi5jYXB0dXJlKSksaShmLm5hbWUsdSxmLmNhcHR1cmUsZi5wYXNzaXZlLGYucGFyYW1zKSk6dSE9PWwmJihsLmZucz11LGVbY109bCkpO2ZvcihjIGluIG4pdChlW2NdKSYmbygoZj10dChjKSkubmFtZSxuW2NdLGYuY2FwdHVyZSl9ZnVuY3Rpb24gaXQoZSxpLG8pe3ZhciBhO2UgaW5zdGFuY2VvZiBwZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBzPWVbaV07ZnVuY3Rpb24gYygpe28uYXBwbHkodGhpcyxhcmd1bWVudHMpLGgoYS5mbnMsYyl9dChzKT9hPW50KFtjXSk6bihzLmZucykmJnIocy5tZXJnZWQpPyhhPXMpLmZucy5wdXNoKGMpOmE9bnQoW3MsY10pLGEubWVyZ2VkPSEwLGVbaV09YX1mdW5jdGlvbiBvdChlLHQscixpLG8pe2lmKG4odCkpe2lmKHkodCxyKSlyZXR1cm4gZVtyXT10W3JdLG98fGRlbGV0ZSB0W3JdLCEwO2lmKHkodCxpKSlyZXR1cm4gZVtyXT10W2ldLG98fGRlbGV0ZSB0W2ldLCEwfXJldHVybiExfWZ1bmN0aW9uIGF0KGUpe3JldHVybiBpKGUpP1toZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKG8sYSl7dmFyIHM9W107dmFyIGMsdSxsLGY7Zm9yKGM9MDtjPG8ubGVuZ3RoO2MrKyl0KHU9b1tjXSl8fCJib29sZWFuIj09dHlwZW9mIHV8fChsPXMubGVuZ3RoLTEsZj1zW2xdLEFycmF5LmlzQXJyYXkodSk/dS5sZW5ndGg+MCYmKHN0KCh1PWUodSwoYXx8IiIpKyJfIitjKSlbMF0pJiZzdChmKSYmKHNbbF09aGUoZi50ZXh0K3VbMF0udGV4dCksdS5zaGlmdCgpKSxzLnB1c2guYXBwbHkocyx1KSk6aSh1KT9zdChmKT9zW2xdPWhlKGYudGV4dCt1KToiIiE9PXUmJnMucHVzaChoZSh1KSk6c3QodSkmJnN0KGYpP3NbbF09aGUoZi50ZXh0K3UudGV4dCk6KHIoby5faXNWTGlzdCkmJm4odS50YWcpJiZ0KHUua2V5KSYmbihhKSYmKHUua2V5PSJfX3ZsaXN0IithKyJfIitjKyJfXyIpLHMucHVzaCh1KSkpO3JldHVybiBzfShlKTp2b2lkIDB9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIG4oZSkmJm4oZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBjdChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9b2U/UmVmbGVjdC5vd25LZXlzKGUpOk9iamVjdC5rZXlzKGUpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZigiX19vYl9fIiE9PW8pe2Zvcih2YXIgYT1lW29dLmZyb20scz10O3M7KXtpZihzLl9wcm92aWRlZCYmeShzLl9wcm92aWRlZCxhKSl7bltvXT1zLl9wcm92aWRlZFthXTticmVha31zPXMuJHBhcmVudH1pZighcyYmImRlZmF1bHQiaW4gZVtvXSl7dmFyIGM9ZVtvXS5kZWZhdWx0O25bb109ImZ1bmN0aW9uIj09dHlwZW9mIGM/Yy5jYWxsKHQpOmN9fX1yZXR1cm4gbn19ZnVuY3Rpb24gdXQoZSx0KXtpZighZXx8IWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3QpKG4uZGVmYXVsdHx8KG4uZGVmYXVsdD1bXSkpLnB1c2gobyk7ZWxzZXt2YXIgcz1hLnNsb3QsYz1uW3NdfHwobltzXT1bXSk7InRlbXBsYXRlIj09PW8udGFnP2MucHVzaC5hcHBseShjLG8uY2hpbGRyZW58fFtdKTpjLnB1c2gobyl9fWZvcih2YXIgdSBpbiBuKW5bdV0uZXZlcnkobHQpJiZkZWxldGUgblt1XTtyZXR1cm4gbn1mdW5jdGlvbiBsdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJiFlLmFzeW5jRmFjdG9yeXx8IiAiPT09ZS50ZXh0fWZ1bmN0aW9uIGZ0KHQsbixyKXt2YXIgaSxvPU9iamVjdC5rZXlzKG4pLmxlbmd0aD4wLGE9dD8hIXQuJHN0YWJsZTohbyxzPXQmJnQuJGtleTtpZih0KXtpZih0Ll9ub3JtYWxpemVkKXJldHVybiB0Ll9ub3JtYWxpemVkO2lmKGEmJnImJnIhPT1lJiZzPT09ci4ka2V5JiYhbyYmIXIuJGhhc05vcm1hbClyZXR1cm4gcjtmb3IodmFyIGMgaW4gaT17fSx0KXRbY10mJiIkIiE9PWNbMF0mJihpW2NdPXB0KG4sYyx0W2NdKSl9ZWxzZSBpPXt9O2Zvcih2YXIgdSBpbiBuKXUgaW4gaXx8KGlbdV09ZHQobix1KSk7cmV0dXJuIHQmJk9iamVjdC5pc0V4dGVuc2libGUodCkmJih0Ll9ub3JtYWxpemVkPWkpLFIoaSwiJHN0YWJsZSIsYSksUihpLCIka2V5IixzKSxSKGksIiRoYXNOb3JtYWwiLG8pLGl9ZnVuY3Rpb24gcHQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KTtyZXR1cm4oZT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiFBcnJheS5pc0FycmF5KGUpP1tlXTphdChlKSkmJigwPT09ZS5sZW5ndGh8fDE9PT1lLmxlbmd0aCYmZVswXS5pc0NvbW1lbnQpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uIGR0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIHZ0KGUsdCl7dmFyIHIsaSxhLHMsYztpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXJbaV09dChlW2ldLGkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihyPW5ldyBBcnJheShlKSxpPTA7aTxlO2krKylyW2ldPXQoaSsxLGkpO2Vsc2UgaWYobyhlKSlpZihvZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtyPVtdO2Zvcih2YXIgdT1lW1N5bWJvbC5pdGVyYXRvcl0oKSxsPXUubmV4dCgpOyFsLmRvbmU7KXIucHVzaCh0KGwudmFsdWUsci5sZW5ndGgpKSxsPXUubmV4dCgpfWVsc2UgZm9yKHM9T2JqZWN0LmtleXMoZSkscj1uZXcgQXJyYXkocy5sZW5ndGgpLGk9MCxhPXMubGVuZ3RoO2k8YTtpKyspYz1zW2ldLHJbaV09dChlW2NdLGMsaSk7cmV0dXJuIG4ocil8fChyPVtdKSxyLl9pc1ZMaXN0PSEwLHJ9ZnVuY3Rpb24gaHQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPUEoQSh7fSxyKSxuKSksaT1vKG4pfHx0KTppPXRoaXMuJHNsb3RzW2VdfHx0O3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6YX0saSk6aX1mdW5jdGlvbiBtdChlKXtyZXR1cm4gTGUodGhpcy4kb3B0aW9ucywiZmlsdGVycyIsZSl8fEV9ZnVuY3Rpb24geXQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBndChlLHQsbixyLGkpe3ZhciBvPUYua2V5Q29kZXNbdF18fG47cmV0dXJuIGkmJnImJiFGLmtleUNvZGVzW3RdP3l0KGkscik6bz95dChvLGUpOnI/QyhyKSE9PXQ6dm9pZCAwfWZ1bmN0aW9uIF90KGUsdCxuLHIsaSl7aWYobilpZihvKG4pKXt2YXIgYTtBcnJheS5pc0FycmF5KG4pJiYobj1PKG4pKTt2YXIgcz1mdW5jdGlvbihvKXtpZigiY2xhc3MiPT09b3x8InN0eWxlIj09PW98fHYobykpYT1lO2Vsc2V7dmFyIHM9ZS5hdHRycyYmZS5hdHRycy50eXBlO2E9cnx8Ri5tdXN0VXNlUHJvcCh0LHMsbyk/ZS5kb21Qcm9wc3x8KGUuZG9tUHJvcHM9e30pOmUuYXR0cnN8fChlLmF0dHJzPXt9KX12YXIgYz1iKG8pLHU9QyhvKTtjIGluIGF8fHUgaW4gYXx8KGFbb109bltvXSxpJiYoKGUub258fChlLm9uPXt9KSlbInVwZGF0ZToiK29dPWZ1bmN0aW9uKGUpe25bb109ZX0pKX07Zm9yKHZhciBjIGluIG4pcyhjKX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIGJ0KGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdD9yOih3dChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyKX1mdW5jdGlvbiAkdChlLHQsbil7cmV0dXJuIHd0KGUsIl9fb25jZV9fIit0KyhuPyJfIituOiIiKSwhMCksZX1mdW5jdGlvbiB3dChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYic3RyaW5nIiE9dHlwZW9mIGVbcl0mJkN0KGVbcl0sdCsiXyIrcixuKTtlbHNlIEN0KGUsdCxuKX1mdW5jdGlvbiBDdChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24geHQoZSx0KXtpZih0KWlmKHModCkpe3ZhciBuPWUub249ZS5vbj9BKHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgaT1uW3JdLG89dFtyXTtuW3JdPWk/W10uY29uY2F0KGksbyk6b319ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBrdChlLHQsbixyKXt0PXR8fHskc3RhYmxlOiFufTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtBcnJheS5pc0FycmF5KG8pP2t0KG8sdCxuKTpvJiYoby5wcm94eSYmKG8uZm4ucHJveHk9ITApLHRbby5rZXldPW8uZm4pfXJldHVybiByJiYodC4ka2V5PXIpLHR9ZnVuY3Rpb24gQXQoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl07InN0cmluZyI9PXR5cGVvZiByJiZyJiYoZVt0W25dXT10W24rMV0pfXJldHVybiBlfWZ1bmN0aW9uIE90KGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP3QrZTplfWZ1bmN0aW9uIFN0KGUpe2UuX289JHQsZS5fbj1mLGUuX3M9bCxlLl9sPXZ0LGUuX3Q9aHQsZS5fcT1OLGUuX2k9aixlLl9tPWJ0LGUuX2Y9bXQsZS5faz1ndCxlLl9iPV90LGUuX3Y9aGUsZS5fZT12ZSxlLl91PWt0LGUuX2c9eHQsZS5fZD1BdCxlLl9wPU90fWZ1bmN0aW9uIFR0KHQsbixpLG8sYSl7dmFyIHMsYz10aGlzLHU9YS5vcHRpb25zO3kobywiX3VpZCIpPyhzPU9iamVjdC5jcmVhdGUobykpLl9vcmlnaW5hbD1vOihzPW8sbz1vLl9vcmlnaW5hbCk7dmFyIGw9cih1Ll9jb21waWxlZCksZj0hbDt0aGlzLmRhdGE9dCx0aGlzLnByb3BzPW4sdGhpcy5jaGlsZHJlbj1pLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9dC5vbnx8ZSx0aGlzLmluamVjdGlvbnM9Y3QodS5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBjLiRzbG90c3x8ZnQodC5zY29wZWRTbG90cyxjLiRzbG90cz11dChpLG8pKSxjLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnQodC5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGwmJih0aGlzLiRvcHRpb25zPXUsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPWZ0KHQuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSx1Ll9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9UHQocyxlLHQsbixyLGYpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXUuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gUHQocyxlLHQsbixyLGYpfX1mdW5jdGlvbiBFdChlLHQsbixyLGkpe3ZhciBvPW1lKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIE50KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtiKG4pXT10W25dfVN0KFR0LnByb3RvdHlwZSk7dmFyIGp0PXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgcj1lO2p0LnByZXBhdGNoKHIscil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciByPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnR9LGk9ZS5kYXRhLmlubGluZVRlbXBsYXRlO24oaSkmJihyLnJlbmRlcj1pLnJlbmRlcixyLnN0YXRpY1JlbmRlckZucz1pLnN0YXRpY1JlbmRlckZucyk7cmV0dXJuIG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihyKX0oZSxXdCkpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKHQsbil7dmFyIHI9bi5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbih0LG4scixpLG8pe3ZhciBhPWkuZGF0YS5zY29wZWRTbG90cyxzPXQuJHNjb3BlZFNsb3RzLGM9ISEoYSYmIWEuJHN0YWJsZXx8cyE9PWUmJiFzLiRzdGFibGV8fGEmJnQuJHNjb3BlZFNsb3RzLiRrZXkhPT1hLiRrZXkpLHU9ISEob3x8dC4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fGMpO3QuJG9wdGlvbnMuX3BhcmVudFZub2RlPWksdC4kdm5vZGU9aSx0Ll92bm9kZSYmKHQuX3Zub2RlLnBhcmVudD1pKTtpZih0LiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1vLHQuJGF0dHJzPWkuZGF0YS5hdHRyc3x8ZSx0LiRsaXN0ZW5lcnM9cnx8ZSxuJiZ0LiRvcHRpb25zLnByb3BzKXskZSghMSk7Zm9yKHZhciBsPXQuX3Byb3BzLGY9dC4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLHA9MDtwPGYubGVuZ3RoO3ArKyl7dmFyIGQ9ZltwXSx2PXQuJG9wdGlvbnMucHJvcHM7bFtkXT1NZShkLHYsbix0KX0kZSghMCksdC4kb3B0aW9ucy5wcm9wc0RhdGE9bn1yPXJ8fGU7dmFyIGg9dC4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1yLHF0KHQscixoKSx1JiYodC4kc2xvdHM9dXQobyxpLmNvbnRleHQpLHQuJGZvcmNlVXBkYXRlKCkpfShuLmNvbXBvbmVudEluc3RhbmNlPXQuY29tcG9uZW50SW5zdGFuY2Usci5wcm9wc0RhdGEsci5saXN0ZW5lcnMsbixyLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsWXQociwibW91bnRlZCIpKSxlLmRhdGEua2VlcEFsaXZlJiYobi5faXNNb3VudGVkPygodD1yKS5faW5hY3RpdmU9ITEsZW4ucHVzaCh0KSk6WHQociwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP2Z1bmN0aW9uIGUodCxuKXtpZihuJiYodC5fZGlyZWN0SW5hY3RpdmU9ITAsR3QodCkpKXJldHVybjtpZighdC5faW5hY3RpdmUpe3QuX2luYWN0aXZlPSEwO2Zvcih2YXIgcj0wO3I8dC4kY2hpbGRyZW4ubGVuZ3RoO3IrKyllKHQuJGNoaWxkcmVuW3JdKTtZdCh0LCJkZWFjdGl2YXRlZCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LER0PU9iamVjdC5rZXlzKGp0KTtmdW5jdGlvbiBMdChpLGEscyxjLGwpe2lmKCF0KGkpKXt2YXIgZj1zLiRvcHRpb25zLl9iYXNlO2lmKG8oaSkmJihpPWYuZXh0ZW5kKGkpKSwiZnVuY3Rpb24iPT10eXBlb2YgaSl7dmFyIHA7aWYodChpLmNpZCkmJnZvaWQgMD09PShpPWZ1bmN0aW9uKGUsaSl7aWYocihlLmVycm9yKSYmbihlLmVycm9yQ29tcCkpcmV0dXJuIGUuZXJyb3JDb21wO2lmKG4oZS5yZXNvbHZlZCkpcmV0dXJuIGUucmVzb2x2ZWQ7dmFyIGE9SHQ7YSYmbihlLm93bmVycykmJi0xPT09ZS5vd25lcnMuaW5kZXhPZihhKSYmZS5vd25lcnMucHVzaChhKTtpZihyKGUubG9hZGluZykmJm4oZS5sb2FkaW5nQ29tcCkpcmV0dXJuIGUubG9hZGluZ0NvbXA7aWYoYSYmIW4oZS5vd25lcnMpKXt2YXIgcz1lLm93bmVycz1bYV0sYz0hMCxsPW51bGwsZj1udWxsO2EuJG9uKCJob29rOmRlc3Ryb3llZCIsZnVuY3Rpb24oKXtyZXR1cm4gaChzLGEpfSk7dmFyIHA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1zLmxlbmd0aDt0PG47dCsrKXNbdF0uJGZvcmNlVXBkYXRlKCk7ZSYmKHMubGVuZ3RoPTAsbnVsbCE9PWwmJihjbGVhclRpbWVvdXQobCksbD1udWxsKSxudWxsIT09ZiYmKGNsZWFyVGltZW91dChmKSxmPW51bGwpKX0sZD1EKGZ1bmN0aW9uKHQpe2UucmVzb2x2ZWQ9QnQodCxpKSxjP3MubGVuZ3RoPTA6cCghMCl9KSx2PUQoZnVuY3Rpb24odCl7bihlLmVycm9yQ29tcCkmJihlLmVycm9yPSEwLHAoITApKX0pLG09ZShkLHYpO3JldHVybiBvKG0pJiYodShtKT90KGUucmVzb2x2ZWQpJiZtLnRoZW4oZCx2KTp1KG0uY29tcG9uZW50KSYmKG0uY29tcG9uZW50LnRoZW4oZCx2KSxuKG0uZXJyb3IpJiYoZS5lcnJvckNvbXA9QnQobS5lcnJvcixpKSksbihtLmxvYWRpbmcpJiYoZS5sb2FkaW5nQ29tcD1CdChtLmxvYWRpbmcsaSksMD09PW0uZGVsYXk/ZS5sb2FkaW5nPSEwOmw9c2V0VGltZW91dChmdW5jdGlvbigpe2w9bnVsbCx0KGUucmVzb2x2ZWQpJiZ0KGUuZXJyb3IpJiYoZS5sb2FkaW5nPSEwLHAoITEpKX0sbS5kZWxheXx8MjAwKSksbihtLnRpbWVvdXQpJiYoZj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zj1udWxsLHQoZS5yZXNvbHZlZCkmJnYobnVsbCl9LG0udGltZW91dCkpKSksYz0hMSxlLmxvYWRpbmc/ZS5sb2FkaW5nQ29tcDplLnJlc29sdmVkfX0ocD1pLGYpKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz12ZSgpO3JldHVybiBvLmFzeW5jRmFjdG9yeT1lLG8uYXN5bmNNZXRhPXtkYXRhOnQsY29udGV4dDpuLGNoaWxkcmVuOnIsdGFnOml9LG99KHAsYSxzLGMsbCk7YT1hfHx7fSwkbihpKSxuKGEubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciByPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixpPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbcl09dC5tb2RlbC52YWx1ZTt2YXIgbz10Lm9ufHwodC5vbj17fSksYT1vW2ldLHM9dC5tb2RlbC5jYWxsYmFjaztuKGEpPyhBcnJheS5pc0FycmF5KGEpPy0xPT09YS5pbmRleE9mKHMpOmEhPT1zKSYmKG9baV09W3NdLmNvbmNhdChhKSk6b1tpXT1zfShpLm9wdGlvbnMsYSk7dmFyIGQ9ZnVuY3Rpb24oZSxyLGkpe3ZhciBvPXIub3B0aW9ucy5wcm9wcztpZighdChvKSl7dmFyIGE9e30scz1lLmF0dHJzLGM9ZS5wcm9wcztpZihuKHMpfHxuKGMpKWZvcih2YXIgdSBpbiBvKXt2YXIgbD1DKHUpO290KGEsYyx1LGwsITApfHxvdChhLHMsdSxsLCExKX1yZXR1cm4gYX19KGEsaSk7aWYocihpLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKHQscixpLG8sYSl7dmFyIHM9dC5vcHRpb25zLGM9e30sdT1zLnByb3BzO2lmKG4odSkpZm9yKHZhciBsIGluIHUpY1tsXT1NZShsLHUscnx8ZSk7ZWxzZSBuKGkuYXR0cnMpJiZOdChjLGkuYXR0cnMpLG4oaS5wcm9wcykmJk50KGMsaS5wcm9wcyk7dmFyIGY9bmV3IFR0KGksYyxhLG8sdCkscD1zLnJlbmRlci5jYWxsKG51bGwsZi5fYyxmKTtpZihwIGluc3RhbmNlb2YgcGUpcmV0dXJuIEV0KHAsaSxmLnBhcmVudCxzKTtpZihBcnJheS5pc0FycmF5KHApKXtmb3IodmFyIGQ9YXQocCl8fFtdLHY9bmV3IEFycmF5KGQubGVuZ3RoKSxoPTA7aDxkLmxlbmd0aDtoKyspdltoXT1FdChkW2hdLGksZi5wYXJlbnQscyk7cmV0dXJuIHZ9fShpLGQsYSxzLGMpO3ZhciB2PWEub247aWYoYS5vbj1hLm5hdGl2ZU9uLHIoaS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIG09YS5zbG90O2E9e30sbSYmKGEuc2xvdD1tKX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248RHQubGVuZ3RoO24rKyl7dmFyIHI9RHRbbl0saT10W3JdLG89anRbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9NdChvLGkpOm8pfX0oYSk7dmFyIHk9aS5vcHRpb25zLm5hbWV8fGw7cmV0dXJuIG5ldyBwZSgidnVlLWNvbXBvbmVudC0iK2kuY2lkKyh5PyItIit5OiIiKSxhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHMse0N0b3I6aSxwcm9wc0RhdGE6ZCxsaXN0ZW5lcnM6dix0YWc6bCxjaGlsZHJlbjpjfSxwKX19fWZ1bmN0aW9uIE10KGUsdCl7dmFyIG49ZnVuY3Rpb24obixyKXtlKG4sciksdChuLHIpfTtyZXR1cm4gbi5fbWVyZ2VkPSEwLG59dmFyIEl0PTEsRnQ9MjtmdW5jdGlvbiBQdChlLGEscyxjLHUsbCl7cmV0dXJuKEFycmF5LmlzQXJyYXkocyl8fGkocykpJiYodT1jLGM9cyxzPXZvaWQgMCkscihsKSYmKHU9RnQpLGZ1bmN0aW9uKGUsaSxhLHMsYyl7aWYobihhKSYmbihhLl9fb2JfXykpcmV0dXJuIHZlKCk7bihhKSYmbihhLmlzKSYmKGk9YS5pcyk7aWYoIWkpcmV0dXJuIHZlKCk7QXJyYXkuaXNBcnJheShzKSYmImZ1bmN0aW9uIj09dHlwZW9mIHNbMF0mJigoYT1hfHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6c1swXX0scy5sZW5ndGg9MCk7Yz09PUZ0P3M9YXQocyk6Yz09PUl0JiYocz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShzKSk7dmFyIHUsbDtpZigic3RyaW5nIj09dHlwZW9mIGkpe3ZhciBmO2w9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxGLmdldFRhZ05hbWVzcGFjZShpKSx1PUYuaXNSZXNlcnZlZFRhZyhpKT9uZXcgcGUoRi5wYXJzZVBsYXRmb3JtVGFnTmFtZShpKSxhLHMsdm9pZCAwLHZvaWQgMCxlKTphJiZhLnByZXx8IW4oZj1MZShlLiRvcHRpb25zLCJjb21wb25lbnRzIixpKSk/bmV3IHBlKGksYSxzLHZvaWQgMCx2b2lkIDAsZSk6THQoZixhLGUscyxpKX1lbHNlIHU9THQoaSxhLGUscyk7cmV0dXJuIEFycmF5LmlzQXJyYXkodSk/dTpuKHUpPyhuKGwpJiZmdW5jdGlvbiBlKGksbyxhKXtpLm5zPW87ImZvcmVpZ25PYmplY3QiPT09aS50YWcmJihvPXZvaWQgMCxhPSEwKTtpZihuKGkuY2hpbGRyZW4pKWZvcih2YXIgcz0wLGM9aS5jaGlsZHJlbi5sZW5ndGg7czxjO3MrKyl7dmFyIHU9aS5jaGlsZHJlbltzXTtuKHUudGFnKSYmKHQodS5ucyl8fHIoYSkmJiJzdmciIT09dS50YWcpJiZlKHUsbyxhKX19KHUsbCksbihhKSYmZnVuY3Rpb24oZSl7byhlLnN0eWxlKSYmZXQoZS5zdHlsZSk7byhlLmNsYXNzKSYmZXQoZS5jbGFzcyl9KGEpLHUpOnZlKCl9KGUsYSxzLGMsdSl9dmFyIFJ0LEh0PW51bGw7ZnVuY3Rpb24gQnQoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxvZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLG8oZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBVdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIHp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF07aWYobihyKSYmKG4oci5jb21wb25lbnRPcHRpb25zKXx8VXQocikpKXJldHVybiByfX1mdW5jdGlvbiBWdChlLHQpe1J0LiRvbihlLHQpfWZ1bmN0aW9uIEt0KGUsdCl7UnQuJG9mZihlLHQpfWZ1bmN0aW9uIEp0KGUsdCl7dmFyIG49UnQ7cmV0dXJuIGZ1bmN0aW9uIHIoKXtudWxsIT09dC5hcHBseShudWxsLGFyZ3VtZW50cykmJm4uJG9mZihlLHIpfX1mdW5jdGlvbiBxdChlLHQsbil7UnQ9ZSxydCh0LG58fHt9LFZ0LEt0LEp0LGUpLFJ0PXZvaWQgMH12YXIgV3Q9bnVsbDtmdW5jdGlvbiBadChlKXt2YXIgdD1XdDtyZXR1cm4gV3Q9ZSxmdW5jdGlvbigpe1d0PXR9fWZ1bmN0aW9uIEd0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWHQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxHdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVh0KGUuJGNoaWxkcmVuW25dKTtZdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gWXQoZSx0KXtsZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspSGUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxmZSgpfXZhciBRdD1bXSxlbj1bXSx0bj17fSxubj0hMSxybj0hMSxvbj0wO3ZhciBhbj0wLHNuPURhdGUubm93O2lmKHomJiFxKXt2YXIgY249d2luZG93LnBlcmZvcm1hbmNlO2NuJiYiZnVuY3Rpb24iPT10eXBlb2YgY24ubm93JiZzbigpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHNuPWZ1bmN0aW9uKCl7cmV0dXJuIGNuLm5vdygpfSl9ZnVuY3Rpb24gdW4oKXt2YXIgZSx0O2Zvcihhbj1zbigpLHJuPSEwLFF0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksb249MDtvbjxRdC5sZW5ndGg7b24rKykoZT1RdFtvbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdG5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWVuLnNsaWNlKCkscj1RdC5zbGljZSgpO29uPVF0Lmxlbmd0aD1lbi5sZW5ndGg9MCx0bj17fSxubj1ybj0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxYdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJll0KHIsInVwZGF0ZWQiKX19KHIpLG5lJiZGLmRldnRvb2xzJiZuZS5lbWl0KCJmbHVzaCIpfXZhciBsbj0wLGZuPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytsbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBpZSx0aGlzLm5ld0RlcElkcz1uZXcgaWUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFILnRlc3QoZSkpe3ZhciB0PWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2lmKCFlKXJldHVybjtlPWVbdFtuXV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1TKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O2ZuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtsZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7UmUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJmV0KGUpLGZlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxmbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxmbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LGZuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXRuW3RdKXtpZih0blt0XT0hMCxybil7Zm9yKHZhciBuPVF0Lmxlbmd0aC0xO24+b24mJlF0W25dLmlkPmUuaWQ7KW4tLTtRdC5zcGxpY2UobisxLDAsZSl9ZWxzZSBRdC5wdXNoKGUpO25ufHwobm49ITAsWWUodW4pKX19KHRoaXMpfSxmbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fG8oZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe1JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LGZuLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxmbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LGZuLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxoKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciBwbj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OlMsc2V0OlN9O2Z1bmN0aW9uIGRuKGUsdCxuKXtwbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0scG4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixwbil9ZnVuY3Rpb24gdm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxyPWUuX3Byb3BzPXt9LGk9ZS4kb3B0aW9ucy5fcHJvcEtleXM9W107ZS4kcGFyZW50JiYkZSghMSk7dmFyIG89ZnVuY3Rpb24obyl7aS5wdXNoKG8pO3ZhciBhPU1lKG8sdCxuLGUpO3hlKHIsbyxhKSxvIGluIGV8fGRuKGUsIl9wcm9wcyIsbyl9O2Zvcih2YXIgYSBpbiB0KW8oYSk7JGUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/Uzp4KHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO3ModD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCl7bGUoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBSZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7ZmUoKX19KHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJnkocixvKXx8KGE9dm9pZCAwLDM2IT09KGE9KG8rIiIpLmNoYXJDb2RlQXQoMCkpJiY5NSE9PWEmJmRuKGUsIl9kYXRhIixvKSl9dmFyIGE7Q2UodCwhMCl9KGUpOkNlKGUuX2RhdGE9e30sITApLHQuY29tcHV0ZWQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fY29tcHV0ZWRXYXRjaGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGUoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IGZuKGUsYXx8UyxTLGhuKSksaSBpbiBlfHxtbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1ZJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspX24oZSxuLHJbaV0pO2Vsc2UgX24oZSxuLHIpfX0oZSx0LndhdGNoKX12YXIgaG49e2xhenk6ITB9O2Z1bmN0aW9uIG1uKGUsdCxuKXt2YXIgcj0hdGUoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8ocG4uZ2V0PXI/eW4odCk6Z24obikscG4uc2V0PVMpOihwbi5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3luKHQpOmduKG4uZ2V0KTpTLHBuLnNldD1uLnNldHx8UyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxwbil9ZnVuY3Rpb24geW4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1tlXTtpZih0KXJldHVybiB0LmRpcnR5JiZ0LmV2YWx1YXRlKCksY2UudGFyZ2V0JiZ0LmRlcGVuZCgpLHQudmFsdWV9fWZ1bmN0aW9uIGduKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gX24oZSx0LG4scil7cmV0dXJuIHMobikmJihyPW4sbj1uLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBibj0wO2Z1bmN0aW9uICRuKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj0kbihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmQShlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPURlKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIENuKGUpe2UuY2lkPTA7dmFyIHQ9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciBuPXRoaXMscj1uLmNpZCxpPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihpW3JdKXJldHVybiBpW3JdO3ZhciBvPWUubmFtZXx8bi5vcHRpb25zLm5hbWUsYT1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWEsYS5jaWQ9dCsrLGEub3B0aW9ucz1EZShuLm9wdGlvbnMsZSksYS5zdXBlcj1uLGEub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWRuKGUucHJvdG90eXBlLCJfcHJvcHMiLG4pfShhKSxhLm9wdGlvbnMuY29tcHV0ZWQmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5jb21wdXRlZDtmb3IodmFyIG4gaW4gdCltbihlLnByb3RvdHlwZSxuLHRbbl0pfShhKSxhLmV4dGVuZD1uLmV4dGVuZCxhLm1peGluPW4ubWl4aW4sYS51c2U9bi51c2UsTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2FbZV09bltlXX0pLG8mJihhLm9wdGlvbnMuY29tcG9uZW50c1tvXT1hKSxhLnN1cGVyT3B0aW9ucz1uLm9wdGlvbnMsYS5leHRlbmRPcHRpb25zPWUsYS5zZWFsZWRPcHRpb25zPUEoe30sYS5vcHRpb25zKSxpW3JdPWEsYX19ZnVuY3Rpb24geG4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24ga24oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmluZGV4T2YodCk+LTE6InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiwiKS5pbmRleE9mKHQpPi0xOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1hLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gQW4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9eG4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmT24obixvLHIsaSl9fX1mdW5jdGlvbiBPbihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGgobix0KX0hZnVuY3Rpb24odCl7dC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztuLl91aWQ9Ym4rKyxuLl9pc1Z1ZT0hMCx0JiZ0Ll9pc0NvbXBvbmVudD9mdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnM9T2JqZWN0LmNyZWF0ZShlLmNvbnN0cnVjdG9yLm9wdGlvbnMpLHI9dC5fcGFyZW50Vm5vZGU7bi5wYXJlbnQ9dC5wYXJlbnQsbi5fcGFyZW50Vm5vZGU9cjt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfShuLHQpOm4uJG9wdGlvbnM9RGUoJG4obi5jb25zdHJ1Y3RvciksdHx8e30sbiksbi5fcmVuZGVyUHJveHk9bixuLl9zZWxmPW4sZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9KG4pLGZ1bmN0aW9uKGUpe2UuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLGUuX2hhc0hvb2tFdmVudD0hMTt2YXIgdD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dCYmcXQoZSx0KX0obiksZnVuY3Rpb24odCl7dC5fdm5vZGU9bnVsbCx0Ll9zdGF0aWNUcmVlcz1udWxsO3ZhciBuPXQuJG9wdGlvbnMscj10LiR2bm9kZT1uLl9wYXJlbnRWbm9kZSxpPXImJnIuY29udGV4dDt0LiRzbG90cz11dChuLl9yZW5kZXJDaGlsZHJlbixpKSx0LiRzY29wZWRTbG90cz1lLHQuX2M9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIFB0KHQsZSxuLHIsaSwhMSl9LHQuJGNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIFB0KHQsZSxuLHIsaSwhMCl9O3ZhciBvPXImJnIuZGF0YTt4ZSh0LCIkYXR0cnMiLG8mJm8uYXR0cnN8fGUsbnVsbCwhMCkseGUodCwiJGxpc3RlbmVycyIsbi5fcGFyZW50TGlzdGVuZXJzfHxlLG51bGwsITApfShuKSxZdChuLCJiZWZvcmVDcmVhdGUiKSxmdW5jdGlvbihlKXt2YXIgdD1jdChlLiRvcHRpb25zLmluamVjdCxlKTt0JiYoJGUoITEpLE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7eGUoZSxuLHRbbl0pfSksJGUoITApKX0obiksdm4obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5wcm92aWRlO3QmJihlLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgdD90LmNhbGwoZSk6dCl9KG4pLFl0KG4sImNyZWF0ZWQiKSxuLiRvcHRpb25zLmVsJiZuLiRtb3VudChuLiRvcHRpb25zLmVsKX19KHduKSxmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSxuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIiRkYXRhIix0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIiRwcm9wcyIsbiksZS5wcm90b3R5cGUuJHNldD1rZSxlLnByb3RvdHlwZS4kZGVsZXRlPUFlLGUucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7aWYocyh0KSlyZXR1cm4gX24odGhpcyxlLHQsbik7KG49bnx8e30pLnVzZXI9ITA7dmFyIHI9bmV3IGZuKHRoaXMsZSx0LG4pO2lmKG4uaW1tZWRpYXRlKXRyeXt0LmNhbGwodGhpcyxyLnZhbHVlKX1jYXRjaChlKXtSZShlLHRoaXMsJ2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytyLmV4cHJlc3Npb24rJyInKX1yZXR1cm4gZnVuY3Rpb24oKXtyLnRlYXJkb3duKCl9fX0od24pLGZ1bmN0aW9uKGUpe3ZhciB0PS9eaG9vazovO2UucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGk9MCxvPWUubGVuZ3RoO2k8bztpKyspci4kb24oZVtpXSxuKTtlbHNlKHIuX2V2ZW50c1tlXXx8KHIuX2V2ZW50c1tlXT1bXSkpLnB1c2gobiksdC50ZXN0KGUpJiYoci5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gcn0sZS5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sZS5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG4uX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLG47aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPTAsaT1lLmxlbmd0aDtyPGk7cisrKW4uJG9mZihlW3JdLHQpO3JldHVybiBufXZhciBvLGE9bi5fZXZlbnRzW2VdO2lmKCFhKXJldHVybiBuO2lmKCF0KXJldHVybiBuLl9ldmVudHNbZV09bnVsbCxuO2Zvcih2YXIgcz1hLmxlbmd0aDtzLS07KWlmKChvPWFbc10pPT09dHx8by5mbj09PXQpe2Euc3BsaWNlKHMsMSk7YnJlYWt9cmV0dXJuIG59LGUucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PXQubGVuZ3RoPjE/ayh0KTp0O2Zvcih2YXIgbj1rKGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKUhlKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9fSh3biksZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj1uLiRlbCxpPW4uX3Zub2RlLG89WnQobik7bi5fdm5vZGU9ZSxuLiRlbD1pP24uX19wYXRjaF9fKGksZSk6bi5fX3BhdGNoX18obi4kZWwsZSx0LCExKSxvKCksciYmKHIuX192dWVfXz1udWxsKSxuLiRlbCYmKG4uJGVsLl9fdnVlX189biksbi4kdm5vZGUmJm4uJHBhcmVudCYmbi4kdm5vZGU9PT1uLiRwYXJlbnQuX3Zub2RlJiYobi4kcGFyZW50LiRlbD1uLiRlbCl9LGUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LGUucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7WXQoZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxoKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLFl0KGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19fSh3biksZnVuY3Rpb24oZSl7U3QoZS5wcm90b3R5cGUpLGUucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gWWUoZSx0aGlzKX0sZS5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcyxuPXQuJG9wdGlvbnMscj1uLnJlbmRlcixpPW4uX3BhcmVudFZub2RlO2kmJih0LiRzY29wZWRTbG90cz1mdChpLmRhdGEuc2NvcGVkU2xvdHMsdC4kc2xvdHMsdC4kc2NvcGVkU2xvdHMpKSx0LiR2bm9kZT1pO3RyeXtIdD10LGU9ci5jYWxsKHQuX3JlbmRlclByb3h5LHQuJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKG4pe1JlKG4sdCwicmVuZGVyIiksZT10Ll92bm9kZX1maW5hbGx5e0h0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJjE9PT1lLmxlbmd0aCYmKGU9ZVswXSksZSBpbnN0YW5jZW9mIHBlfHwoZT12ZSgpKSxlLnBhcmVudD1pLGV9fSh3bik7dmFyIFNuPVtTdHJpbmcsUmVnRXhwLEFycmF5XSxUbj17S2VlcEFsaXZlOntuYW1lOiJrZWVwLWFsaXZlIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTpTbixleGNsdWRlOlNuLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSlPbih0aGlzLmNhY2hlLGUsdGhpcy5rZXlzKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kd2F0Y2goImluY2x1ZGUiLGZ1bmN0aW9uKHQpe0FuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGtuKHQsZSl9KX0pLHRoaXMuJHdhdGNoKCJleGNsdWRlIixmdW5jdGlvbih0KXtBbihlLGZ1bmN0aW9uKGUpe3JldHVybiFrbih0LGUpfSl9KX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PXp0KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPXhuKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IWtuKGkscikpfHxvJiZyJiZrbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsaChzLGMpLHMucHVzaChjKSk6KGFbY109dCxzLnB1c2goYyksdGhpcy5tYXgmJnMubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmT24oYSxzWzBdLHMsdGhpcy5fdm5vZGUpKSx0LmRhdGEua2VlcEFsaXZlPSEwfXJldHVybiB0fHxlJiZlWzBdfX19OyFmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEZ9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY29uZmlnIix0KSxlLnV0aWw9e3dhcm46YWUsZXh0ZW5kOkEsbWVyZ2VPcHRpb25zOkRlLGRlZmluZVJlYWN0aXZlOnhlfSxlLnNldD1rZSxlLmRlbGV0ZT1BZSxlLm5leHRUaWNrPVllLGUub2JzZXJ2YWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gQ2UoZSksZX0sZS5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksTS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Uub3B0aW9uc1t0KyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLGUub3B0aW9ucy5fYmFzZT1lLEEoZS5vcHRpb25zLmNvbXBvbmVudHMsVG4pLGZ1bmN0aW9uKGUpe2UudXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZih0LmluZGV4T2YoZSk+LTEpcmV0dXJuIHRoaXM7dmFyIG49ayhhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9fShlKSxmdW5jdGlvbihlKXtlLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9RGUodGhpcy5vcHRpb25zLGUpLHRoaXN9fShlKSxDbihlKSxmdW5jdGlvbihlKXtNLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBuPygiY29tcG9uZW50Ij09PXQmJnMobikmJihuLm5hbWU9bi5uYW1lfHxlLG49dGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZChuKSksImRpcmVjdGl2ZSI9PT10JiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49e2JpbmQ6bix1cGRhdGU6bn0pLHRoaXMub3B0aW9uc1t0KyJzIl1bZV09bixuKTp0aGlzLm9wdGlvbnNbdCsicyJdW2VdfX0pfShlKX0od24pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDp0ZX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bi5wcm90b3R5cGUsIiRzc3JDb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3biwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLHt2YWx1ZTpUdH0pLHduLnZlcnNpb249IjIuNi4xMSI7dmFyIEVuPXAoInN0eWxlLGNsYXNzIiksTm49cCgiaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcyIpLGpuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4idmFsdWUiPT09biYmTm4oZSkmJiJidXR0b24iIT09dHx8InNlbGVjdGVkIj09PW4mJiJvcHRpb24iPT09ZXx8ImNoZWNrZWQiPT09biYmImlucHV0Ij09PWV8fCJtdXRlZCI9PT1uJiYidmlkZW8iPT09ZX0sRG49cCgiY29udGVudGVkaXRhYmxlLGRyYWdnYWJsZSxzcGVsbGNoZWNrIiksTG49cCgiZXZlbnRzLGNhcmV0LHR5cGluZyxwbGFpbnRleHQtb25seSIpLE1uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEhuKHQpfHwiZmFsc2UiPT09dD8iZmFsc2UiOiJjb250ZW50ZWRpdGFibGUiPT09ZSYmTG4odCk/dDoidHJ1ZSJ9LEluPXAoImFsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLGVuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSxyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLHRydWVzcGVlZCx0eXBlbXVzdG1hdGNoLHZpc2libGUiKSxGbj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsUG49ZnVuY3Rpb24oZSl7cmV0dXJuIjoiPT09ZS5jaGFyQXQoNSkmJiJ4bGluayI9PT1lLnNsaWNlKDAsNSl9LFJuPWZ1bmN0aW9uKGUpe3JldHVybiBQbihlKT9lLnNsaWNlKDYsZS5sZW5ndGgpOiIifSxIbj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZXx8ITE9PT1lfTtmdW5jdGlvbiBCbihlKXtmb3IodmFyIHQ9ZS5kYXRhLHI9ZSxpPWU7bihpLmNvbXBvbmVudEluc3RhbmNlKTspKGk9aS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZpLmRhdGEmJih0PVVuKGkuZGF0YSx0KSk7Zm9yKDtuKHI9ci5wYXJlbnQpOylyJiZyLmRhdGEmJih0PVVuKHQsci5kYXRhKSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobihlKXx8bih0KSlyZXR1cm4gem4oZSxWbih0KSk7cmV0dXJuIiJ9KHQuc3RhdGljQ2xhc3MsdC5jbGFzcyl9ZnVuY3Rpb24gVW4oZSx0KXtyZXR1cm57c3RhdGljQ2xhc3M6em4oZS5zdGF0aWNDbGFzcyx0LnN0YXRpY0NsYXNzKSxjbGFzczpuKGUuY2xhc3MpP1tlLmNsYXNzLHQuY2xhc3NdOnQuY2xhc3N9fWZ1bmN0aW9uIHpuKGUsdCl7cmV0dXJuIGU/dD9lKyIgIit0OmU6dHx8IiJ9ZnVuY3Rpb24gVm4oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9IiIsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyluKHQ9Vm4oZVtpXSkpJiYiIiE9PXQmJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn0oZSk6byhlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifXZhciBLbj17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsbWF0aDoiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCJ9LEpuPXAoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IikscW49cCgic3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLGZvcmVpZ25PYmplY3QsZyxnbHlwaCxpbWFnZSxsaW5lLG1hcmtlcixtYXNrLG1pc3NpbmctZ2x5cGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXciLCEwKSxXbj1mdW5jdGlvbihlKXtyZXR1cm4gSm4oZSl8fHFuKGUpfTtmdW5jdGlvbiBabihlKXtyZXR1cm4gcW4oZSk/InN2ZyI6Im1hdGgiPT09ZT8ibWF0aCI6dm9pZCAwfXZhciBHbj1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBYbj1wKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpO2Z1bmN0aW9uIFluKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKTtyZXR1cm4gdHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9cmV0dXJuIGV9dmFyIFFuPU9iamVjdC5mcmVlemUoe2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiJzZWxlY3QiIT09ZT9uOih0LmRhdGEmJnQuZGF0YS5hdHRycyYmdm9pZCAwIT09dC5kYXRhLmF0dHJzLm11bHRpcGxlJiZuLnNldEF0dHJpYnV0ZSgibXVsdGlwbGUiLCJtdWx0aXBsZSIpLG4pfSxjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKEtuW2VdLHQpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSl9LGNyZWF0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnTmFtZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnRleHRDb250ZW50PXR9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZSh0LCIiKX19KSxlcj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7dHIodCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYodHIoZSwhMCksdHIodCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3RyKGUsITApfX07ZnVuY3Rpb24gdHIoZSx0KXt2YXIgcj1lLmRhdGEucmVmO2lmKG4ocikpe3ZhciBpPWUuY29udGV4dCxvPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLGE9aS4kcmVmczt0P0FycmF5LmlzQXJyYXkoYVtyXSk/aChhW3JdLG8pOmFbcl09PT1vJiYoYVtyXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KGFbcl0pP2Fbcl0uaW5kZXhPZihvKTwwJiZhW3JdLnB1c2gobyk6YVtyXT1bb106YVtyXT1vfX12YXIgbnI9bmV3IHBlKCIiLHt9LFtdKSxycj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIGlyKGUsaSl7cmV0dXJuIGUua2V5PT09aS5rZXkmJihlLnRhZz09PWkudGFnJiZlLmlzQ29tbWVudD09PWkuaXNDb21tZW50JiZuKGUuZGF0YSk9PT1uKGkuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciByLGk9bihyPWUuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlLG89bihyPXQuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlO3JldHVybiBpPT09b3x8WG4oaSkmJlhuKG8pfShlLGkpfHxyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT1pLmFzeW5jRmFjdG9yeSYmdChpLmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIG9yKGUsdCxyKXt2YXIgaSxvLGE9e307Zm9yKGk9dDtpPD1yOysraSluKG89ZVtpXS5rZXkpJiYoYVtvXT1pKTtyZXR1cm4gYX12YXIgYXI9e2NyZWF0ZTpzcix1cGRhdGU6c3IsZGVzdHJveTpmdW5jdGlvbihlKXtzcihlLG5yKX19O2Z1bmN0aW9uIHNyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG89ZT09PW5yLGE9dD09PW5yLHM9dXIoZS5kYXRhLmRpcmVjdGl2ZXMsZS5jb250ZXh0KSxjPXVyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksdT1bXSxsPVtdO2ZvcihuIGluIGMpcj1zW25dLGk9Y1tuXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsZnIoaSwidXBkYXRlIix0LGUpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOihmcihpLCJiaW5kIix0LGUpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGY9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPHUubGVuZ3RoO24rKylmcih1W25dLCJpbnNlcnRlZCIsdCxlKX07bz9pdCh0LCJpbnNlcnQiLGYpOmYoKX1sLmxlbmd0aCYmaXQodCwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgbj0wO248bC5sZW5ndGg7bisrKWZyKGxbbl0sImNvbXBvbmVudFVwZGF0ZWQiLHQsZSl9KTtpZighbylmb3IobiBpbiBzKWNbbl18fGZyKHNbbl0sInVuYmluZCIsZSxlLGEpfShlLHQpfXZhciBjcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHVyKGUsdCl7dmFyIG4scixpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIGk7Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1jciksaVtscihyKV09cixyLmRlZj1MZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBpfWZ1bmN0aW9uIGxyKGUpe3JldHVybiBlLnJhd05hbWV8fGUubmFtZSsiLiIrT2JqZWN0LmtleXMoZS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIil9ZnVuY3Rpb24gZnIoZSx0LG4scixpKXt2YXIgbz1lLmRlZiYmZS5kZWZbdF07aWYobyl0cnl7byhuLmVsbSxlLG4scixpKX1jYXRjaChyKXtSZShyLG4uY29udGV4dCwiZGlyZWN0aXZlICIrZS5uYW1lKyIgIit0KyIgaG9vayIpfX12YXIgcHI9W2VyLGFyXTtmdW5jdGlvbiBkcihlLHIpe3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztpZighKG4oaSkmJiExPT09aS5DdG9yLm9wdGlvbnMuaW5oZXJpdEF0dHJzfHx0KGUuZGF0YS5hdHRycykmJnQoci5kYXRhLmF0dHJzKSkpe3ZhciBvLGEscz1yLmVsbSxjPWUuZGF0YS5hdHRyc3x8e30sdT1yLmRhdGEuYXR0cnN8fHt9O2ZvcihvIGluIG4odS5fX29iX18pJiYodT1yLmRhdGEuYXR0cnM9QSh7fSx1KSksdSlhPXVbb10sY1tvXSE9PWEmJnZyKHMsbyxhKTtmb3IobyBpbihxfHxaKSYmdS52YWx1ZSE9PWMudmFsdWUmJnZyKHMsInZhbHVlIix1LnZhbHVlKSxjKXQodVtvXSkmJihQbihvKT9zLnJlbW92ZUF0dHJpYnV0ZU5TKEZuLFJuKG8pKTpEbihvKXx8cy5yZW1vdmVBdHRyaWJ1dGUobykpfX1mdW5jdGlvbiB2cihlLHQsbil7ZS50YWdOYW1lLmluZGV4T2YoIi0iKT4tMT9ocihlLHQsbik6SW4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG49ImFsbG93ZnVsbHNjcmVlbiI9PT10JiYiRU1CRUQiPT09ZS50YWdOYW1lPyJ0cnVlIjp0LGUuc2V0QXR0cmlidXRlKHQsbikpOkRuKHQpP2Uuc2V0QXR0cmlidXRlKHQsTW4odCxuKSk6UG4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGVOUyhGbixSbih0KSk6ZS5zZXRBdHRyaWJ1dGVOUyhGbix0LG4pOmhyKGUsdCxuKX1mdW5jdGlvbiBocihlLHQsbil7aWYoSG4obikpZS5yZW1vdmVBdHRyaWJ1dGUodCk7ZWxzZXtpZihxJiYhVyYmIlRFWFRBUkVBIj09PWUudGFnTmFtZSYmInBsYWNlaG9sZGVyIj09PXQmJiIiIT09biYmIWUuX19pZXBoKXt2YXIgcj1mdW5jdGlvbih0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpfTtlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixyKSxlLl9faWVwaD0hMH1lLnNldEF0dHJpYnV0ZSh0LG4pfX12YXIgbXI9e2NyZWF0ZTpkcix1cGRhdGU6ZHJ9O2Z1bmN0aW9uIHlyKGUscil7dmFyIGk9ci5lbG0sbz1yLmRhdGEsYT1lLmRhdGE7aWYoISh0KG8uc3RhdGljQ2xhc3MpJiZ0KG8uY2xhc3MpJiYodChhKXx8dChhLnN0YXRpY0NsYXNzKSYmdChhLmNsYXNzKSkpKXt2YXIgcz1CbihyKSxjPWkuX3RyYW5zaXRpb25DbGFzc2VzO24oYykmJihzPXpuKHMsVm4oYykpKSxzIT09aS5fcHJldkNsYXNzJiYoaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKSxpLl9wcmV2Q2xhc3M9cyl9fXZhciBncixfcixiciwkcix3cixDcix4cj17Y3JlYXRlOnlyLHVwZGF0ZTp5cn0sa3I9L1tcdykuK1wtXyRcXV0vO2Z1bmN0aW9uIEFyKGUpe3ZhciB0LG4scixpLG8sYT0hMSxzPSExLGM9ITEsdT0hMSxsPTAsZj0wLHA9MCxkPTA7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylpZihuPXQsdD1lLmNoYXJDb2RlQXQociksYSkzOT09PXQmJjkyIT09biYmKGE9ITEpO2Vsc2UgaWYocykzND09PXQmJjkyIT09biYmKHM9ITEpO2Vsc2UgaWYoYyk5Nj09PXQmJjkyIT09biYmKGM9ITEpO2Vsc2UgaWYodSk0Nz09PXQmJjkyIT09biYmKHU9ITEpO2Vsc2UgaWYoMTI0IT09dHx8MTI0PT09ZS5jaGFyQ29kZUF0KHIrMSl8fDEyND09PWUuY2hhckNvZGVBdChyLTEpfHxsfHxmfHxwKXtzd2l0Y2godCl7Y2FzZSAzNDpzPSEwO2JyZWFrO2Nhc2UgMzk6YT0hMDticmVhaztjYXNlIDk2OmM9ITA7YnJlYWs7Y2FzZSA0MDpwKys7YnJlYWs7Y2FzZSA0MTpwLS07YnJlYWs7Y2FzZSA5MTpmKys7YnJlYWs7Y2FzZSA5MzpmLS07YnJlYWs7Y2FzZSAxMjM6bCsrO2JyZWFrO2Nhc2UgMTI1OmwtLX1pZig0Nz09PXQpe2Zvcih2YXIgdj1yLTEsaD12b2lkIDA7dj49MCYmIiAiPT09KGg9ZS5jaGFyQXQodikpO3YtLSk7aCYma3IudGVzdChoKXx8KHU9ITApfX1lbHNlIHZvaWQgMD09PWk/KGQ9cisxLGk9ZS5zbGljZSgwLHIpLnRyaW0oKSk6bSgpO2Z1bmN0aW9uIG0oKXsob3x8KG89W10pKS5wdXNoKGUuc2xpY2UoZCxyKS50cmltKCkpLGQ9cisxfWlmKHZvaWQgMD09PWk/aT1lLnNsaWNlKDAscikudHJpbSgpOjAhPT1kJiZtKCksbylmb3Iocj0wO3I8by5sZW5ndGg7cisrKWk9T3IoaSxvW3JdKTtyZXR1cm4gaX1mdW5jdGlvbiBPcihlLHQpe3ZhciBuPXQuaW5kZXhPZigiKCIpO2lmKG48MClyZXR1cm4nX2YoIicrdCsnIikoJytlKyIpIjt2YXIgcj10LnNsaWNlKDAsbiksaT10LnNsaWNlKG4rMSk7cmV0dXJuJ19mKCInK3IrJyIpKCcrZSsoIikiIT09aT8iLCIraTppKX1mdW5jdGlvbiBTcihlLHQpe2NvbnNvbGUuZXJyb3IoIltWdWUgY29tcGlsZXJdOiAiK2UpfWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIGU/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbdF19KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KTpbXX1mdW5jdGlvbiBFcihlLHQsbixyLGkpeyhlLnByb3BzfHwoZS5wcm9wcz1bXSkpLnB1c2goUnIoe25hbWU6dCx2YWx1ZTpuLGR5bmFtaWM6aX0scikpLGUucGxhaW49ITF9ZnVuY3Rpb24gTnIoZSx0LG4scixpKXsoaT9lLmR5bmFtaWNBdHRyc3x8KGUuZHluYW1pY0F0dHJzPVtdKTplLmF0dHJzfHwoZS5hdHRycz1bXSkpLnB1c2goUnIoe25hbWU6dCx2YWx1ZTpuLGR5bmFtaWM6aX0scikpLGUucGxhaW49ITF9ZnVuY3Rpb24ganIoZSx0LG4scil7ZS5hdHRyc01hcFt0XT1uLGUuYXR0cnNMaXN0LnB1c2goUnIoe25hbWU6dCx2YWx1ZTpufSxyKSl9ZnVuY3Rpb24gRHIoZSx0LG4scixpLG8sYSxzKXsoZS5kaXJlY3RpdmVzfHwoZS5kaXJlY3RpdmVzPVtdKSkucHVzaChScih7bmFtZTp0LHJhd05hbWU6bix2YWx1ZTpyLGFyZzppLGlzRHluYW1pY0FyZzpvLG1vZGlmaWVyczphfSxzKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBMcihlLHQsbil7cmV0dXJuIG4/Il9wKCIrdCsnLCInK2UrJyIpJzplK3R9ZnVuY3Rpb24gTXIodCxuLHIsaSxvLGEscyxjKXt2YXIgdTsoaT1pfHxlKS5yaWdodD9jP249IigiK24rIik9PT0nY2xpY2snPydjb250ZXh0bWVudSc6KCIrbisiKSI6ImNsaWNrIj09PW4mJihuPSJjb250ZXh0bWVudSIsZGVsZXRlIGkucmlnaHQpOmkubWlkZGxlJiYoYz9uPSIoIituKyIpPT09J2NsaWNrJz8nbW91c2V1cCc6KCIrbisiKSI6ImNsaWNrIj09PW4mJihuPSJtb3VzZXVwIikpLGkuY2FwdHVyZSYmKGRlbGV0ZSBpLmNhcHR1cmUsbj1McigiISIsbixjKSksaS5vbmNlJiYoZGVsZXRlIGkub25jZSxuPUxyKCJ+IixuLGMpKSxpLnBhc3NpdmUmJihkZWxldGUgaS5wYXNzaXZlLG49THIoIiYiLG4sYykpLGkubmF0aXZlPyhkZWxldGUgaS5uYXRpdmUsdT10Lm5hdGl2ZUV2ZW50c3x8KHQubmF0aXZlRXZlbnRzPXt9KSk6dT10LmV2ZW50c3x8KHQuZXZlbnRzPXt9KTt2YXIgbD1Scih7dmFsdWU6ci50cmltKCksZHluYW1pYzpjfSxzKTtpIT09ZSYmKGwubW9kaWZpZXJzPWkpO3ZhciBmPXVbbl07QXJyYXkuaXNBcnJheShmKT9vP2YudW5zaGlmdChsKTpmLnB1c2gobCk6dVtuXT1mP28/W2wsZl06W2YsbF06bCx0LnBsYWluPSExfWZ1bmN0aW9uIElyKGUsdCxuKXt2YXIgcj1GcihlLCI6Iit0KXx8RnIoZSwidi1iaW5kOiIrdCk7aWYobnVsbCE9cilyZXR1cm4gQXIocik7aWYoITEhPT1uKXt2YXIgaT1GcihlLHQpO2lmKG51bGwhPWkpcmV0dXJuIEpTT04uc3RyaW5naWZ5KGkpfX1mdW5jdGlvbiBGcihlLHQsbil7dmFyIHI7aWYobnVsbCE9KHI9ZS5hdHRyc01hcFt0XSkpZm9yKHZhciBpPWUuYXR0cnNMaXN0LG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYoaVtvXS5uYW1lPT09dCl7aS5zcGxpY2UobywxKTticmVha31yZXR1cm4gbiYmZGVsZXRlIGUuYXR0cnNNYXBbdF0scn1mdW5jdGlvbiBQcihlLHQpe2Zvcih2YXIgbj1lLmF0dHJzTGlzdCxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO2lmKHQudGVzdChvLm5hbWUpKXJldHVybiBuLnNwbGljZShyLDEpLG99fWZ1bmN0aW9uIFJyKGUsdCl7cmV0dXJuIHQmJihudWxsIT10LnN0YXJ0JiYoZS5zdGFydD10LnN0YXJ0KSxudWxsIT10LmVuZCYmKGUuZW5kPXQuZW5kKSksZX1mdW5jdGlvbiBIcihlLHQsbil7dmFyIHI9bnx8e30saT1yLm51bWJlcixvPSIkJHYiO3IudHJpbSYmKG89Iih0eXBlb2YgJCR2ID09PSAnc3RyaW5nJz8gJCR2LnRyaW0oKTogJCR2KSIpLGkmJihvPSJfbigiK28rIikiKTt2YXIgYT1Ccih0LG8pO2UubW9kZWw9e3ZhbHVlOiIoIit0KyIpIixleHByZXNzaW9uOkpTT04uc3RyaW5naWZ5KHQpLGNhbGxiYWNrOiJmdW5jdGlvbiAoJCR2KSB7IithKyJ9In19ZnVuY3Rpb24gQnIoZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtpZihlPWUudHJpbSgpLGdyPWUubGVuZ3RoLGUuaW5kZXhPZigiWyIpPDB8fGUubGFzdEluZGV4T2YoIl0iKTxnci0xKXJldHVybigkcj1lLmxhc3RJbmRleE9mKCIuIikpPi0xP3tleHA6ZS5zbGljZSgwLCRyKSxrZXk6JyInK2Uuc2xpY2UoJHIrMSkrJyInfTp7ZXhwOmUsa2V5Om51bGx9O19yPWUsJHI9d3I9Q3I9MDtmb3IoOyF6cigpOylWcihicj1VcigpKT9Kcihicik6OTE9PT1iciYmS3IoYnIpO3JldHVybntleHA6ZS5zbGljZSgwLHdyKSxrZXk6ZS5zbGljZSh3cisxLENyKX19KGUpO3JldHVybiBudWxsPT09bi5rZXk/ZSsiPSIrdDoiJHNldCgiK24uZXhwKyIsICIrbi5rZXkrIiwgIit0KyIpIn1mdW5jdGlvbiBVcigpe3JldHVybiBfci5jaGFyQ29kZUF0KCsrJHIpfWZ1bmN0aW9uIHpyKCl7cmV0dXJuICRyPj1ncn1mdW5jdGlvbiBWcihlKXtyZXR1cm4gMzQ9PT1lfHwzOT09PWV9ZnVuY3Rpb24gS3IoZSl7dmFyIHQ9MTtmb3Iod3I9JHI7IXpyKCk7KWlmKFZyKGU9VXIoKSkpSnIoZSk7ZWxzZSBpZig5MT09PWUmJnQrKyw5Mz09PWUmJnQtLSwwPT09dCl7Q3I9JHI7YnJlYWt9fWZ1bmN0aW9uIEpyKGUpe2Zvcih2YXIgdD1lOyF6cigpJiYoZT1VcigpKSE9PXQ7KTt9dmFyIHFyLFdyPSJfX3IiLFpyPSJfX2MiO2Z1bmN0aW9uIEdyKGUsdCxuKXt2YXIgcj1xcjtyZXR1cm4gZnVuY3Rpb24gaSgpe251bGwhPT10LmFwcGx5KG51bGwsYXJndW1lbnRzKSYmUXIoZSxpLG4scil9fXZhciBYcj1WZSYmIShYJiZOdW1iZXIoWFsxXSk8PTUzKTtmdW5jdGlvbiBZcihlLHQsbixyKXtpZihYcil7dmFyIGk9YW4sbz10O3Q9by5fd3JhcHBlcj1mdW5jdGlvbihlKXtpZihlLnRhcmdldD09PWUuY3VycmVudFRhcmdldHx8ZS50aW1lU3RhbXA+PWl8fGUudGltZVN0YW1wPD0wfHxlLnRhcmdldC5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQpcmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1xci5hZGRFdmVudExpc3RlbmVyKGUsdCxRP3tjYXB0dXJlOm4scGFzc2l2ZTpyfTpuKX1mdW5jdGlvbiBRcihlLHQsbixyKXsocnx8cXIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0Ll93cmFwcGVyfHx0LG4pfWZ1bmN0aW9uIGVpKGUscil7aWYoIXQoZS5kYXRhLm9uKXx8IXQoci5kYXRhLm9uKSl7dmFyIGk9ci5kYXRhLm9ufHx7fSxvPWUuZGF0YS5vbnx8e307cXI9ci5lbG0sZnVuY3Rpb24oZSl7aWYobihlW1dyXSkpe3ZhciB0PXE/ImNoYW5nZSI6ImlucHV0IjtlW3RdPVtdLmNvbmNhdChlW1dyXSxlW3RdfHxbXSksZGVsZXRlIGVbV3JdfW4oZVtacl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbWnJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbWnJdKX0oaSkscnQoaSxvLFlyLFFyLEdyLHIuY29udGV4dCkscXI9dm9pZCAwfX12YXIgdGksbmk9e2NyZWF0ZTplaSx1cGRhdGU6ZWl9O2Z1bmN0aW9uIHJpKGUscil7aWYoIXQoZS5kYXRhLmRvbVByb3BzKXx8IXQoci5kYXRhLmRvbVByb3BzKSl7dmFyIGksbyxhPXIuZWxtLHM9ZS5kYXRhLmRvbVByb3BzfHx7fSxjPXIuZGF0YS5kb21Qcm9wc3x8e307Zm9yKGkgaW4gbihjLl9fb2JfXykmJihjPXIuZGF0YS5kb21Qcm9wcz1BKHt9LGMpKSxzKWkgaW4gY3x8KGFbaV09IiIpO2ZvcihpIGluIGMpe2lmKG89Y1tpXSwidGV4dENvbnRlbnQiPT09aXx8ImlubmVySFRNTCI9PT1pKXtpZihyLmNoaWxkcmVuJiYoci5jaGlsZHJlbi5sZW5ndGg9MCksbz09PXNbaV0pY29udGludWU7MT09PWEuY2hpbGROb2Rlcy5sZW5ndGgmJmEucmVtb3ZlQ2hpbGQoYS5jaGlsZE5vZGVzWzBdKX1pZigidmFsdWUiPT09aSYmIlBST0dSRVNTIiE9PWEudGFnTmFtZSl7YS5fdmFsdWU9bzt2YXIgdT10KG8pPyIiOlN0cmluZyhvKTtpaShhLHUpJiYoYS52YWx1ZT11KX1lbHNlIGlmKCJpbm5lckhUTUwiPT09aSYmcW4oYS50YWdOYW1lKSYmdChhLmlubmVySFRNTCkpeyh0aT10aXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD0iPHN2Zz4iK28rIjwvc3ZnPiI7Zm9yKHZhciBsPXRpLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtsLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQobC5maXJzdENoaWxkKX1lbHNlIGlmKG8hPT1zW2ldKXRyeXthW2ldPW99Y2F0Y2goZSl7fX19fWZ1bmN0aW9uIGlpKGUsdCl7cmV0dXJuIWUuY29tcG9zaW5nJiYoIk9QVElPTiI9PT1lLnRhZ05hbWV8fGZ1bmN0aW9uKGUsdCl7dmFyIG49ITA7dHJ5e249ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWV9Y2F0Y2goZSl7fXJldHVybiBuJiZlLnZhbHVlIT09dH0oZSx0KXx8ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLnZhbHVlLGk9ZS5fdk1vZGlmaWVycztpZihuKGkpKXtpZihpLm51bWJlcilyZXR1cm4gZihyKSE9PWYodCk7aWYoaS50cmltKXJldHVybiByLnRyaW0oKSE9PXQudHJpbSgpfXJldHVybiByIT09dH0oZSx0KSl9dmFyIG9pPXtjcmVhdGU6cmksdXBkYXRlOnJpfSxhaT1nKGZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHI9ZS5zcGxpdChuKTtyLmxlbmd0aD4xJiYodFtyWzBdLnRyaW0oKV09clsxXS50cmltKCkpfX0pLHR9KTtmdW5jdGlvbiBzaShlKXt2YXIgdD1jaShlLnN0eWxlKTtyZXR1cm4gZS5zdGF0aWNTdHlsZT9BKGUuc3RhdGljU3R5bGUsdCk6dH1mdW5jdGlvbiBjaShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9PKGUpOiJzdHJpbmciPT10eXBlb2YgZT9haShlKTplfXZhciB1aSxsaT0vXi0tLyxmaT0vXHMqIWltcG9ydGFudCQvLHBpPWZ1bmN0aW9uKGUsdCxuKXtpZihsaS50ZXN0KHQpKWUuc3R5bGUuc2V0UHJvcGVydHkodCxuKTtlbHNlIGlmKGZpLnRlc3QobikpZS5zdHlsZS5zZXRQcm9wZXJ0eShDKHQpLG4ucmVwbGFjZShmaSwiIiksImltcG9ydGFudCIpO2Vsc2V7dmFyIHI9dmkodCk7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspZS5zdHlsZVtyXT1uW2ldO2Vsc2UgZS5zdHlsZVtyXT1ufX0sZGk9WyJXZWJraXQiLCJNb3oiLCJtcyJdLHZpPWcoZnVuY3Rpb24oZSl7aWYodWk9dWl8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJmaWx0ZXIiIT09KGU9YihlKSkmJmUgaW4gdWkpcmV0dXJuIGU7Zm9yKHZhciB0PWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPTA7bjxkaS5sZW5ndGg7bisrKXt2YXIgcj1kaVtuXSt0O2lmKHIgaW4gdWkpcmV0dXJuIHJ9fSk7ZnVuY3Rpb24gaGkoZSxyKXt2YXIgaT1yLmRhdGEsbz1lLmRhdGE7aWYoISh0KGkuc3RhdGljU3R5bGUpJiZ0KGkuc3R5bGUpJiZ0KG8uc3RhdGljU3R5bGUpJiZ0KG8uc3R5bGUpKSl7dmFyIGEscyxjPXIuZWxtLHU9by5zdGF0aWNTdHlsZSxsPW8ubm9ybWFsaXplZFN0eWxlfHxvLnN0eWxlfHx7fSxmPXV8fGwscD1jaShyLmRhdGEuc3R5bGUpfHx7fTtyLmRhdGEubm9ybWFsaXplZFN0eWxlPW4ocC5fX29iX18pP0Eoe30scCk6cDt2YXIgZD1mdW5jdGlvbihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIGk9ZTtpLmNvbXBvbmVudEluc3RhbmNlOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKG49c2koaS5kYXRhKSkmJkEocixuKTsobj1zaShlLmRhdGEpKSYmQShyLG4pO2Zvcih2YXIgbz1lO289by5wYXJlbnQ7KW8uZGF0YSYmKG49c2koby5kYXRhKSkmJkEocixuKTtyZXR1cm4gcn0ociwhMCk7Zm9yKHMgaW4gZil0KGRbc10pJiZwaShjLHMsIiIpO2ZvcihzIGluIGQpKGE9ZFtzXSkhPT1mW3NdJiZwaShjLHMsbnVsbD09YT8iIjphKX19dmFyIG1pPXtjcmVhdGU6aGksdXBkYXRlOmhpfSx5aT0vXHMrLztmdW5jdGlvbiBnaShlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoIiAiKT4tMT90LnNwbGl0KHlpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5hZGQodCl9KTplLmNsYXNzTGlzdC5hZGQodCk7ZWxzZXt2YXIgbj0iICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiO24uaW5kZXhPZigiICIrdCsiICIpPDAmJmUuc2V0QXR0cmlidXRlKCJjbGFzcyIsKG4rdCkudHJpbSgpKX19ZnVuY3Rpb24gX2koZSx0KXtpZih0JiYodD10LnRyaW0oKSkpaWYoZS5jbGFzc0xpc3QpdC5pbmRleE9mKCIgIik+LTE/dC5zcGxpdCh5aSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpLGUuY2xhc3NMaXN0Lmxlbmd0aHx8ZS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIik7ZWxzZXtmb3IodmFyIG49IiAiKyhlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpKyIgIixyPSIgIit0KyIgIjtuLmluZGV4T2Yocik+PTA7KW49bi5yZXBsYWNlKHIsIiAiKTsobj1uLnRyaW0oKSk/ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixuKTplLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKX19ZnVuY3Rpb24gYmkoZSl7aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZBKHQsJGkoZS5uYW1lfHwidiIpKSxBKHQsZSksdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/JGkoZSk6dm9pZCAwfX12YXIgJGk9ZyhmdW5jdGlvbihlKXtyZXR1cm57ZW50ZXJDbGFzczplKyItZW50ZXIiLGVudGVyVG9DbGFzczplKyItZW50ZXItdG8iLGVudGVyQWN0aXZlQ2xhc3M6ZSsiLWVudGVyLWFjdGl2ZSIsbGVhdmVDbGFzczplKyItbGVhdmUiLGxlYXZlVG9DbGFzczplKyItbGVhdmUtdG8iLGxlYXZlQWN0aXZlQ2xhc3M6ZSsiLWxlYXZlLWFjdGl2ZSJ9fSksd2k9eiYmIVcsQ2k9InRyYW5zaXRpb24iLHhpPSJhbmltYXRpb24iLGtpPSJ0cmFuc2l0aW9uIixBaT0idHJhbnNpdGlvbmVuZCIsT2k9ImFuaW1hdGlvbiIsU2k9ImFuaW1hdGlvbmVuZCI7d2kmJih2b2lkIDA9PT13aW5kb3cub250cmFuc2l0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kJiYoa2k9IldlYmtpdFRyYW5zaXRpb24iLEFpPSJ3ZWJraXRUcmFuc2l0aW9uRW5kIiksdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQmJihPaT0iV2Via2l0QW5pbWF0aW9uIixTaT0id2Via2l0QW5pbWF0aW9uRW5kIikpO3ZhciBUaT16P3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6c2V0VGltZW91dDpmdW5jdGlvbihlKXtyZXR1cm4gZSgpfTtmdW5jdGlvbiBFaShlKXtUaShmdW5jdGlvbigpe1RpKGUpfSl9ZnVuY3Rpb24gTmkoZSx0KXt2YXIgbj1lLl90cmFuc2l0aW9uQ2xhc3Nlc3x8KGUuX3RyYW5zaXRpb25DbGFzc2VzPVtdKTtuLmluZGV4T2YodCk8MCYmKG4ucHVzaCh0KSxnaShlLHQpKX1mdW5jdGlvbiBqaShlLHQpe2UuX3RyYW5zaXRpb25DbGFzc2VzJiZoKGUuX3RyYW5zaXRpb25DbGFzc2VzLHQpLF9pKGUsdCl9ZnVuY3Rpb24gRGkoZSx0LG4pe3ZhciByPU1pKGUsdCksaT1yLnR5cGUsbz1yLnRpbWVvdXQsYT1yLnByb3BDb3VudDtpZighaSlyZXR1cm4gbigpO3ZhciBzPWk9PT1DaT9BaTpTaSxjPTAsdT1mdW5jdGlvbigpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGwpLG4oKX0sbD1mdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJisrYz49YSYmdSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YzxhJiZ1KCl9LG8rMSksZS5hZGRFdmVudExpc3RlbmVyKHMsbCl9dmFyIExpPS9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLztmdW5jdGlvbiBNaShlLHQpe3ZhciBuLHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksaT0ocltraSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLG89KHJba2krIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSxhPUlpKGksbykscz0ocltPaSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLGM9KHJbT2krIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSx1PUlpKHMsYyksbD0wLGY9MDtyZXR1cm4gdD09PUNpP2E+MCYmKG49Q2ksbD1hLGY9by5sZW5ndGgpOnQ9PT14aT91PjAmJihuPXhpLGw9dSxmPWMubGVuZ3RoKTpmPShuPShsPU1hdGgubWF4KGEsdSkpPjA/YT51P0NpOnhpOm51bGwpP249PT1DaT9vLmxlbmd0aDpjLmxlbmd0aDowLHt0eXBlOm4sdGltZW91dDpsLHByb3BDb3VudDpmLGhhc1RyYW5zZm9ybTpuPT09Q2kmJkxpLnRlc3QocltraSsiUHJvcGVydHkiXSl9fWZ1bmN0aW9uIElpKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCx0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBGaSh0KStGaShlW25dKX0pKX1mdW5jdGlvbiBGaShlKXtyZXR1cm4gMWUzKk51bWJlcihlLnNsaWNlKDAsLTEpLnJlcGxhY2UoIiwiLCIuIikpfWZ1bmN0aW9uIFBpKGUscil7dmFyIGk9ZS5lbG07bihpLl9sZWF2ZUNiKSYmKGkuX2xlYXZlQ2IuY2FuY2VsbGVkPSEwLGkuX2xlYXZlQ2IoKSk7dmFyIGE9YmkoZS5kYXRhLnRyYW5zaXRpb24pO2lmKCF0KGEpJiYhbihpLl9lbnRlckNiKSYmMT09PWkubm9kZVR5cGUpe2Zvcih2YXIgcz1hLmNzcyxjPWEudHlwZSx1PWEuZW50ZXJDbGFzcyxsPWEuZW50ZXJUb0NsYXNzLHA9YS5lbnRlckFjdGl2ZUNsYXNzLGQ9YS5hcHBlYXJDbGFzcyx2PWEuYXBwZWFyVG9DbGFzcyxoPWEuYXBwZWFyQWN0aXZlQ2xhc3MsbT1hLmJlZm9yZUVudGVyLHk9YS5lbnRlcixnPWEuYWZ0ZXJFbnRlcixfPWEuZW50ZXJDYW5jZWxsZWQsYj1hLmJlZm9yZUFwcGVhciwkPWEuYXBwZWFyLHc9YS5hZnRlckFwcGVhcixDPWEuYXBwZWFyQ2FuY2VsbGVkLHg9YS5kdXJhdGlvbixrPVd0LEE9V3QuJHZub2RlO0EmJkEucGFyZW50OylrPUEuY29udGV4dCxBPUEucGFyZW50O3ZhciBPPSFrLl9pc01vdW50ZWR8fCFlLmlzUm9vdEluc2VydDtpZighT3x8JHx8IiI9PT0kKXt2YXIgUz1PJiZkP2Q6dSxUPU8mJmg/aDpwLEU9TyYmdj92OmwsTj1PJiZifHxtLGo9TyYmImZ1bmN0aW9uIj09dHlwZW9mICQ/JDp5LEw9TyYmd3x8ZyxNPU8mJkN8fF8sST1mKG8oeCk/eC5lbnRlcjp4KSxGPSExIT09cyYmIVcsUD1CaShqKSxSPWkuX2VudGVyQ2I9RChmdW5jdGlvbigpe0YmJihqaShpLEUpLGppKGksVCkpLFIuY2FuY2VsbGVkPyhGJiZqaShpLFMpLE0mJk0oaSkpOkwmJkwoaSksaS5fZW50ZXJDYj1udWxsfSk7ZS5kYXRhLnNob3d8fGl0KGUsImluc2VydCIsZnVuY3Rpb24oKXt2YXIgdD1pLnBhcmVudE5vZGUsbj10JiZ0Ll9wZW5kaW5nJiZ0Ll9wZW5kaW5nW2Uua2V5XTtuJiZuLnRhZz09PWUudGFnJiZuLmVsbS5fbGVhdmVDYiYmbi5lbG0uX2xlYXZlQ2IoKSxqJiZqKGksUil9KSxOJiZOKGkpLEYmJihOaShpLFMpLE5pKGksVCksRWkoZnVuY3Rpb24oKXtqaShpLFMpLFIuY2FuY2VsbGVkfHwoTmkoaSxFKSxQfHwoSGkoSSk/c2V0VGltZW91dChSLEkpOkRpKGksYyxSKSkpfSkpLGUuZGF0YS5zaG93JiYociYmcigpLGomJmooaSxSKSksRnx8UHx8UigpfX19ZnVuY3Rpb24gUmkoZSxyKXt2YXIgaT1lLmVsbTtuKGkuX2VudGVyQ2IpJiYoaS5fZW50ZXJDYi5jYW5jZWxsZWQ9ITAsaS5fZW50ZXJDYigpKTt2YXIgYT1iaShlLmRhdGEudHJhbnNpdGlvbik7aWYodChhKXx8MSE9PWkubm9kZVR5cGUpcmV0dXJuIHIoKTtpZighbihpLl9sZWF2ZUNiKSl7dmFyIHM9YS5jc3MsYz1hLnR5cGUsdT1hLmxlYXZlQ2xhc3MsbD1hLmxlYXZlVG9DbGFzcyxwPWEubGVhdmVBY3RpdmVDbGFzcyxkPWEuYmVmb3JlTGVhdmUsdj1hLmxlYXZlLGg9YS5hZnRlckxlYXZlLG09YS5sZWF2ZUNhbmNlbGxlZCx5PWEuZGVsYXlMZWF2ZSxnPWEuZHVyYXRpb24sXz0hMSE9PXMmJiFXLGI9QmkodiksJD1mKG8oZyk/Zy5sZWF2ZTpnKSx3PWkuX2xlYXZlQ2I9RChmdW5jdGlvbigpe2kucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLl9wZW5kaW5nJiYoaS5wYXJlbnROb2RlLl9wZW5kaW5nW2Uua2V5XT1udWxsKSxfJiYoamkoaSxsKSxqaShpLHApKSx3LmNhbmNlbGxlZD8oXyYmamkoaSx1KSxtJiZtKGkpKToocigpLGgmJmgoaSkpLGkuX2xlYXZlQ2I9bnVsbH0pO3k/eShDKTpDKCl9ZnVuY3Rpb24gQygpe3cuY2FuY2VsbGVkfHwoIWUuZGF0YS5zaG93JiZpLnBhcmVudE5vZGUmJigoaS5wYXJlbnROb2RlLl9wZW5kaW5nfHwoaS5wYXJlbnROb2RlLl9wZW5kaW5nPXt9KSlbZS5rZXldPWUpLGQmJmQoaSksXyYmKE5pKGksdSksTmkoaSxwKSxFaShmdW5jdGlvbigpe2ppKGksdSksdy5jYW5jZWxsZWR8fChOaShpLGwpLGJ8fChIaSgkKT9zZXRUaW1lb3V0KHcsJCk6RGkoaSxjLHcpKSl9KSksdiYmdihpLHcpLF98fGJ8fHcoKSl9fWZ1bmN0aW9uIEhpKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmIWlzTmFOKGUpfWZ1bmN0aW9uIEJpKGUpe2lmKHQoZSkpcmV0dXJuITE7dmFyIHI9ZS5mbnM7cmV0dXJuIG4ocik/QmkoQXJyYXkuaXNBcnJheShyKT9yWzBdOnIpOihlLl9sZW5ndGh8fGUubGVuZ3RoKT4xfWZ1bmN0aW9uIFVpKGUsdCl7ITAhPT10LmRhdGEuc2hvdyYmUGkodCl9dmFyIHppPWZ1bmN0aW9uKGUpe3ZhciBvLGEscz17fSxjPWUubW9kdWxlcyx1PWUubm9kZU9wcztmb3Iobz0wO288cnIubGVuZ3RoOysrbylmb3Ioc1tycltvXV09W10sYT0wO2E8Yy5sZW5ndGg7KythKW4oY1thXVtycltvXV0pJiZzW3JyW29dXS5wdXNoKGNbYV1bcnJbb11dKTtmdW5jdGlvbiBsKGUpe3ZhciB0PXUucGFyZW50Tm9kZShlKTtuKHQpJiZ1LnJlbW92ZUNoaWxkKHQsZSl9ZnVuY3Rpb24gZihlLHQsaSxvLGEsYyxsKXtpZihuKGUuZWxtKSYmbihjKSYmKGU9Y1tsXT1tZShlKSksZS5pc1Jvb3RJbnNlcnQ9IWEsIWZ1bmN0aW9uKGUsdCxpLG8pe3ZhciBhPWUuZGF0YTtpZihuKGEpKXt2YXIgYz1uKGUuY29tcG9uZW50SW5zdGFuY2UpJiZhLmtlZXBBbGl2ZTtpZihuKGE9YS5ob29rKSYmbihhPWEuaW5pdCkmJmEoZSwhMSksbihlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gZChlLHQpLHYoaSxlLmVsbSxvKSxyKGMpJiZmdW5jdGlvbihlLHQscixpKXtmb3IodmFyIG8sYT1lO2EuY29tcG9uZW50SW5zdGFuY2U7KWlmKGE9YS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsbihvPWEuZGF0YSkmJm4obz1vLnRyYW5zaXRpb24pKXtmb3Iobz0wO288cy5hY3RpdmF0ZS5sZW5ndGg7KytvKXMuYWN0aXZhdGVbb10obnIsYSk7dC5wdXNoKGEpO2JyZWFrfXYocixlLmVsbSxpKX0oZSx0LGksbyksITB9fShlLHQsaSxvKSl7dmFyIGY9ZS5kYXRhLHA9ZS5jaGlsZHJlbixtPWUudGFnO24obSk/KGUuZWxtPWUubnM/dS5jcmVhdGVFbGVtZW50TlMoZS5ucyxtKTp1LmNyZWF0ZUVsZW1lbnQobSxlKSxnKGUpLGgoZSxwLHQpLG4oZikmJnkoZSx0KSx2KGksZS5lbG0sbykpOnIoZS5pc0NvbW1lbnQpPyhlLmVsbT11LmNyZWF0ZUNvbW1lbnQoZS50ZXh0KSx2KGksZS5lbG0sbykpOihlLmVsbT11LmNyZWF0ZVRleHROb2RlKGUudGV4dCksdihpLGUuZWxtLG8pKX19ZnVuY3Rpb24gZChlLHQpe24oZS5kYXRhLnBlbmRpbmdJbnNlcnQpJiYodC5wdXNoLmFwcGx5KHQsZS5kYXRhLnBlbmRpbmdJbnNlcnQpLGUuZGF0YS5wZW5kaW5nSW5zZXJ0PW51bGwpLGUuZWxtPWUuY29tcG9uZW50SW5zdGFuY2UuJGVsLG0oZSk/KHkoZSx0KSxnKGUpKToodHIoZSksdC5wdXNoKGUpKX1mdW5jdGlvbiB2KGUsdCxyKXtuKGUpJiYobihyKT91LnBhcmVudE5vZGUocik9PT1lJiZ1Lmluc2VydEJlZm9yZShlLHQscik6dS5hcHBlbmRDaGlsZChlLHQpKX1mdW5jdGlvbiBoKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKWYodFtyXSxuLGUuZWxtLG51bGwsITAsdCxyKTtlbHNlIGkoZS50ZXh0KSYmdS5hcHBlbmRDaGlsZChlLmVsbSx1LmNyZWF0ZVRleHROb2RlKFN0cmluZyhlLnRleHQpKSl9ZnVuY3Rpb24gbShlKXtmb3IoO2UuY29tcG9uZW50SW5zdGFuY2U7KWU9ZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7cmV0dXJuIG4oZS50YWcpfWZ1bmN0aW9uIHkoZSx0KXtmb3IodmFyIHI9MDtyPHMuY3JlYXRlLmxlbmd0aDsrK3Ipcy5jcmVhdGVbcl0obnIsZSk7bihvPWUuZGF0YS5ob29rKSYmKG4oby5jcmVhdGUpJiZvLmNyZWF0ZShucixlKSxuKG8uaW5zZXJ0KSYmdC5wdXNoKGUpKX1mdW5jdGlvbiBnKGUpe3ZhciB0O2lmKG4odD1lLmZuU2NvcGVJZCkpdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpO2Vsc2UgZm9yKHZhciByPWU7cjspbih0PXIuY29udGV4dCkmJm4odD10LiRvcHRpb25zLl9zY29wZUlkKSYmdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpLHI9ci5wYXJlbnQ7bih0PVd0KSYmdCE9PWUuY29udGV4dCYmdCE9PWUuZm5Db250ZXh0JiZuKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJnUuc2V0U3R5bGVTY29wZShlLmVsbSx0KX1mdW5jdGlvbiBfKGUsdCxuLHIsaSxvKXtmb3IoO3I8PWk7KytyKWYobltyXSxvLGUsdCwhMSxuLHIpfWZ1bmN0aW9uIGIoZSl7dmFyIHQscixpPWUuZGF0YTtpZihuKGkpKWZvcihuKHQ9aS5ob29rKSYmbih0PXQuZGVzdHJveSkmJnQoZSksdD0wO3Q8cy5kZXN0cm95Lmxlbmd0aDsrK3Qpcy5kZXN0cm95W3RdKGUpO2lmKG4odD1lLmNoaWxkcmVuKSlmb3Iocj0wO3I8ZS5jaGlsZHJlbi5sZW5ndGg7KytyKWIoZS5jaGlsZHJlbltyXSl9ZnVuY3Rpb24gJChlLHQscil7Zm9yKDt0PD1yOysrdCl7dmFyIGk9ZVt0XTtuKGkpJiYobihpLnRhZyk/KHcoaSksYihpKSk6bChpLmVsbSkpfX1mdW5jdGlvbiB3KGUsdCl7aWYobih0KXx8bihlLmRhdGEpKXt2YXIgcixpPXMucmVtb3ZlLmxlbmd0aCsxO2ZvcihuKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbChlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxuKHI9ZS5jb21wb25lbnRJbnN0YW5jZSkmJm4ocj1yLl92bm9kZSkmJm4oci5kYXRhKSYmdyhyLHQpLHI9MDtyPHMucmVtb3ZlLmxlbmd0aDsrK3Ipcy5yZW1vdmVbcl0oZSx0KTtuKHI9ZS5kYXRhLmhvb2spJiZuKHI9ci5yZW1vdmUpP3IoZSx0KTp0KCl9ZWxzZSBsKGUuZWxtKX1mdW5jdGlvbiBDKGUsdCxyLGkpe2Zvcih2YXIgbz1yO288aTtvKyspe3ZhciBhPXRbb107aWYobihhKSYmaXIoZSxhKSlyZXR1cm4gb319ZnVuY3Rpb24geChlLGksbyxhLGMsbCl7aWYoZSE9PWkpe24oaS5lbG0pJiZuKGEpJiYoaT1hW2NdPW1lKGkpKTt2YXIgcD1pLmVsbT1lLmVsbTtpZihyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSluKGkuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLGksbyk6aS5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihyKGkuaXNTdGF0aWMpJiZyKGUuaXNTdGF0aWMpJiZpLmtleT09PWUua2V5JiYocihpLmlzQ2xvbmVkKXx8cihpLmlzT25jZSkpKWkuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBkLHY9aS5kYXRhO24odikmJm4oZD12Lmhvb2spJiZuKGQ9ZC5wcmVwYXRjaCkmJmQoZSxpKTt2YXIgaD1lLmNoaWxkcmVuLHk9aS5jaGlsZHJlbjtpZihuKHYpJiZtKGkpKXtmb3IoZD0wO2Q8cy51cGRhdGUubGVuZ3RoOysrZClzLnVwZGF0ZVtkXShlLGkpO24oZD12Lmhvb2spJiZuKGQ9ZC51cGRhdGUpJiZkKGUsaSl9dChpLnRleHQpP24oaCkmJm4oeSk/aCE9PXkmJmZ1bmN0aW9uKGUscixpLG8sYSl7Zm9yKHZhciBzLGMsbCxwPTAsZD0wLHY9ci5sZW5ndGgtMSxoPXJbMF0sbT1yW3ZdLHk9aS5sZW5ndGgtMSxnPWlbMF0sYj1pW3ldLHc9IWE7cDw9diYmZDw9eTspdChoKT9oPXJbKytwXTp0KG0pP209clstLXZdOmlyKGgsZyk/KHgoaCxnLG8saSxkKSxoPXJbKytwXSxnPWlbKytkXSk6aXIobSxiKT8oeChtLGIsbyxpLHkpLG09clstLXZdLGI9aVstLXldKTppcihoLGIpPyh4KGgsYixvLGkseSksdyYmdS5pbnNlcnRCZWZvcmUoZSxoLmVsbSx1Lm5leHRTaWJsaW5nKG0uZWxtKSksaD1yWysrcF0sYj1pWy0teV0pOmlyKG0sZyk/KHgobSxnLG8saSxkKSx3JiZ1Lmluc2VydEJlZm9yZShlLG0uZWxtLGguZWxtKSxtPXJbLS12XSxnPWlbKytkXSk6KHQocykmJihzPW9yKHIscCx2KSksdChjPW4oZy5rZXkpP3NbZy5rZXldOkMoZyxyLHAsdikpP2YoZyxvLGUsaC5lbG0sITEsaSxkKTppcihsPXJbY10sZyk/KHgobCxnLG8saSxkKSxyW2NdPXZvaWQgMCx3JiZ1Lmluc2VydEJlZm9yZShlLGwuZWxtLGguZWxtKSk6ZihnLG8sZSxoLmVsbSwhMSxpLGQpLGc9aVsrK2RdKTtwPnY/XyhlLHQoaVt5KzFdKT9udWxsOmlbeSsxXS5lbG0saSxkLHksbyk6ZD55JiYkKHIscCx2KX0ocCxoLHksbyxsKTpuKHkpPyhuKGUudGV4dCkmJnUuc2V0VGV4dENvbnRlbnQocCwiIiksXyhwLG51bGwseSwwLHkubGVuZ3RoLTEsbykpOm4oaCk/JChoLDAsaC5sZW5ndGgtMSk6bihlLnRleHQpJiZ1LnNldFRleHRDb250ZW50KHAsIiIpOmUudGV4dCE9PWkudGV4dCYmdS5zZXRUZXh0Q29udGVudChwLGkudGV4dCksbih2KSYmbihkPXYuaG9vaykmJm4oZD1kLnBvc3RwYXRjaCkmJmQoZSxpKX19fWZ1bmN0aW9uIGsoZSx0LGkpe2lmKHIoaSkmJm4oZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciBvPTA7bzx0Lmxlbmd0aDsrK28pdFtvXS5kYXRhLmhvb2suaW5zZXJ0KHRbb10pfXZhciBBPXAoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LGksbyl7dmFyIGEscz10LnRhZyxjPXQuZGF0YSx1PXQuY2hpbGRyZW47aWYobz1vfHxjJiZjLnByZSx0LmVsbT1lLHIodC5pc0NvbW1lbnQpJiZuKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITAsITA7aWYobihjKSYmKG4oYT1jLmhvb2spJiZuKGE9YS5pbml0KSYmYSh0LCEwKSxuKGE9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBkKHQsaSksITA7aWYobihzKSl7aWYobih1KSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihuKGE9YykmJm4oYT1hLmRvbVByb3BzKSYmbihhPWEuaW5uZXJIVE1MKSl7aWYoYSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBsPSEwLGY9ZS5maXJzdENoaWxkLHA9MDtwPHUubGVuZ3RoO3ArKyl7aWYoIWZ8fCFPKGYsdVtwXSxpLG8pKXtsPSExO2JyZWFrfWY9Zi5uZXh0U2libGluZ31pZighbHx8ZilyZXR1cm4hMX1lbHNlIGgodCx1LGkpO2lmKG4oYykpe3ZhciB2PSExO2Zvcih2YXIgbSBpbiBjKWlmKCFBKG0pKXt2PSEwLHkodCxpKTticmVha30hdiYmYy5jbGFzcyYmZXQoYy5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsaSxvLGEpe2lmKCF0KGkpKXt2YXIgYyxsPSExLHA9W107aWYodChlKSlsPSEwLGYoaSxwKTtlbHNle3ZhciBkPW4oZS5ub2RlVHlwZSk7aWYoIWQmJmlyKGUsaSkpeChlLGkscCxudWxsLG51bGwsYSk7ZWxzZXtpZihkKXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoTCkmJihlLnJlbW92ZUF0dHJpYnV0ZShMKSxvPSEwKSxyKG8pJiZPKGUsaSxwKSlyZXR1cm4gayhpLHAsITApLGU7Yz1lLGU9bmV3IHBlKHUudGFnTmFtZShjKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxjKX12YXIgdj1lLmVsbSxoPXUucGFyZW50Tm9kZSh2KTtpZihmKGkscCx2Ll9sZWF2ZUNiP251bGw6aCx1Lm5leHRTaWJsaW5nKHYpKSxuKGkucGFyZW50KSlmb3IodmFyIHk9aS5wYXJlbnQsZz1tKGkpO3k7KXtmb3IodmFyIF89MDtfPHMuZGVzdHJveS5sZW5ndGg7KytfKXMuZGVzdHJveVtfXSh5KTtpZih5LmVsbT1pLmVsbSxnKXtmb3IodmFyIHc9MDt3PHMuY3JlYXRlLmxlbmd0aDsrK3cpcy5jcmVhdGVbd10obnIseSk7dmFyIEM9eS5kYXRhLmhvb2suaW5zZXJ0O2lmKEMubWVyZ2VkKWZvcih2YXIgQT0xO0E8Qy5mbnMubGVuZ3RoO0ErKylDLmZuc1tBXSgpfWVsc2UgdHIoeSk7eT15LnBhcmVudH1uKGgpPyQoW2VdLDAsMCk6bihlLnRhZykmJmIoZSl9fXJldHVybiBrKGkscCxsKSxpLmVsbX1uKGUpJiZiKGUpfX0oe25vZGVPcHM6UW4sbW9kdWxlczpbbXIseHIsbmksb2ksbWksej97Y3JlYXRlOlVpLGFjdGl2YXRlOlVpLHJlbW92ZTpmdW5jdGlvbihlLHQpeyEwIT09ZS5kYXRhLnNob3c/UmkoZSx0KTp0KCl9fTp7fV0uY29uY2F0KHByKX0pO1cmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2UmJmUudm1vZGVsJiZYaShlLCJpbnB1dCIpfSk7dmFyIFZpPXtpbnNlcnRlZDpmdW5jdGlvbihlLHQsbixyKXsic2VsZWN0Ij09PW4udGFnPyhyLmVsbSYmIXIuZWxtLl92T3B0aW9ucz9pdChuLCJwb3N0cGF0Y2giLGZ1bmN0aW9uKCl7VmkuY29tcG9uZW50VXBkYXRlZChlLHQsbil9KTpLaShlLHQsbi5jb250ZXh0KSxlLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpKTooInRleHRhcmVhIj09PW4udGFnfHxYbihlLnR5cGUpKSYmKGUuX3ZNb2RpZmllcnM9dC5tb2RpZmllcnMsdC5tb2RpZmllcnMubGF6eXx8KGUuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25zdGFydCIsWmkpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25lbmQiLEdpKSxlLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsR2kpLFcmJihlLnZtb2RlbD0hMCkpKX0sY29tcG9uZW50VXBkYXRlZDpmdW5jdGlvbihlLHQsbil7aWYoInNlbGVjdCI9PT1uLnRhZyl7S2koZSx0LG4uY29udGV4dCk7dmFyIHI9ZS5fdk9wdGlvbnMsaT1lLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpO2lmKGkuc29tZShmdW5jdGlvbihlLHQpe3JldHVybiFOKGUsclt0XSl9KSkoZS5tdWx0aXBsZT90LnZhbHVlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHFpKGUsaSl9KTp0LnZhbHVlIT09dC5vbGRWYWx1ZSYmcWkodC52YWx1ZSxpKSkmJlhpKGUsImNoYW5nZSIpfX19O2Z1bmN0aW9uIEtpKGUsdCxuKXtKaShlLHQsbiksKHF8fFopJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7SmkoZSx0LG4pfSwwKX1mdW5jdGlvbiBKaShlLHQsbil7dmFyIHI9dC52YWx1ZSxpPWUubXVsdGlwbGU7aWYoIWl8fEFycmF5LmlzQXJyYXkocikpe2Zvcih2YXIgbyxhLHM9MCxjPWUub3B0aW9ucy5sZW5ndGg7czxjO3MrKylpZihhPWUub3B0aW9uc1tzXSxpKW89aihyLFdpKGEpKT4tMSxhLnNlbGVjdGVkIT09byYmKGEuc2VsZWN0ZWQ9byk7ZWxzZSBpZihOKFdpKGEpLHIpKXJldHVybiB2b2lkKGUuc2VsZWN0ZWRJbmRleCE9PXMmJihlLnNlbGVjdGVkSW5kZXg9cykpO2l8fChlLnNlbGVjdGVkSW5kZXg9LTEpfX1mdW5jdGlvbiBxaShlLHQpe3JldHVybiB0LmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiFOKHQsZSl9KX1mdW5jdGlvbiBXaShlKXtyZXR1cm4iX3ZhbHVlImluIGU/ZS5fdmFsdWU6ZS52YWx1ZX1mdW5jdGlvbiBaaShlKXtlLnRhcmdldC5jb21wb3Npbmc9ITB9ZnVuY3Rpb24gR2koZSl7ZS50YXJnZXQuY29tcG9zaW5nJiYoZS50YXJnZXQuY29tcG9zaW5nPSExLFhpKGUudGFyZ2V0LCJpbnB1dCIpKX1mdW5jdGlvbiBYaShlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIik7bi5pbml0RXZlbnQodCwhMCwhMCksZS5kaXNwYXRjaEV2ZW50KG4pfWZ1bmN0aW9uIFlpKGUpe3JldHVybiFlLmNvbXBvbmVudEluc3RhbmNlfHxlLmRhdGEmJmUuZGF0YS50cmFuc2l0aW9uP2U6WWkoZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpfXZhciBRaT17bW9kZWw6Vmksc2hvdzp7YmluZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZSxpPShuPVlpKG4pKS5kYXRhJiZuLmRhdGEudHJhbnNpdGlvbixvPWUuX192T3JpZ2luYWxEaXNwbGF5PSJub25lIj09PWUuc3R5bGUuZGlzcGxheT8iIjplLnN0eWxlLmRpc3BsYXk7ciYmaT8obi5kYXRhLnNob3c9ITAsUGkobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1vfSkpOmUuc3R5bGUuZGlzcGxheT1yP286Im5vbmUifSx1cGRhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQudmFsdWU7IXIhPSF0Lm9sZFZhbHVlJiYoKG49WWkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uPyhuLmRhdGEuc2hvdz0hMCxyP1BpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXl9KTpSaShuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PSJub25lIn0pKTplLnN0eWxlLmRpc3BsYXk9cj9lLl9fdk9yaWdpbmFsRGlzcGxheToibm9uZSIpfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0LG4scixpKXtpfHwoZS5zdHlsZS5kaXNwbGF5PWUuX192T3JpZ2luYWxEaXNwbGF5KX19fSxlbz17bmFtZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4sY3NzOkJvb2xlYW4sbW9kZTpTdHJpbmcsdHlwZTpTdHJpbmcsZW50ZXJDbGFzczpTdHJpbmcsbGVhdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhckNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsZHVyYXRpb246W051bWJlcixTdHJpbmcsT2JqZWN0XX07ZnVuY3Rpb24gdG8oZSl7dmFyIHQ9ZSYmZS5jb21wb25lbnRPcHRpb25zO3JldHVybiB0JiZ0LkN0b3Iub3B0aW9ucy5hYnN0cmFjdD90byh6dCh0LmNoaWxkcmVuKSk6ZX1mdW5jdGlvbiBubyhlKXt2YXIgdD17fSxuPWUuJG9wdGlvbnM7Zm9yKHZhciByIGluIG4ucHJvcHNEYXRhKXRbcl09ZVtyXTt2YXIgaT1uLl9wYXJlbnRMaXN0ZW5lcnM7Zm9yKHZhciBvIGluIGkpdFtiKG8pXT1pW29dO3JldHVybiB0fWZ1bmN0aW9uIHJvKGUsdCl7aWYoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHQudGFnKSlyZXR1cm4gZSgia2VlcC1hbGl2ZSIse3Byb3BzOnQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGF9KX12YXIgaW89ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnfHxVdChlKX0sb289ZnVuY3Rpb24oZSl7cmV0dXJuInNob3ciPT09ZS5uYW1lfSxhbz17bmFtZToidHJhbnNpdGlvbiIscHJvcHM6ZW8sYWJzdHJhY3Q6ITAscmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRzbG90cy5kZWZhdWx0O2lmKG4mJihuPW4uZmlsdGVyKGlvKSkubGVuZ3RoKXt2YXIgcj10aGlzLm1vZGUsbz1uWzBdO2lmKGZ1bmN0aW9uKGUpe2Zvcig7ZT1lLnBhcmVudDspaWYoZS5kYXRhLnRyYW5zaXRpb24pcmV0dXJuITB9KHRoaXMuJHZub2RlKSlyZXR1cm4gbzt2YXIgYT10byhvKTtpZighYSlyZXR1cm4gbztpZih0aGlzLl9sZWF2aW5nKXJldHVybiBybyhlLG8pO3ZhciBzPSJfX3RyYW5zaXRpb24tIit0aGlzLl91aWQrIi0iO2Eua2V5PW51bGw9PWEua2V5P2EuaXNDb21tZW50P3MrImNvbW1lbnQiOnMrYS50YWc6aShhLmtleSk/MD09PVN0cmluZyhhLmtleSkuaW5kZXhPZihzKT9hLmtleTpzK2Eua2V5OmEua2V5O3ZhciBjPShhLmRhdGF8fChhLmRhdGE9e30pKS50cmFuc2l0aW9uPW5vKHRoaXMpLHU9dGhpcy5fdm5vZGUsbD10byh1KTtpZihhLmRhdGEuZGlyZWN0aXZlcyYmYS5kYXRhLmRpcmVjdGl2ZXMuc29tZShvbykmJihhLmRhdGEuc2hvdz0hMCksbCYmbC5kYXRhJiYhZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5rZXk9PT1lLmtleSYmdC50YWc9PT1lLnRhZ30oYSxsKSYmIVV0KGwpJiYoIWwuY29tcG9uZW50SW5zdGFuY2V8fCFsLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1sLmRhdGEudHJhbnNpdGlvbj1BKHt9LGMpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxpdChmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLHJvKGUsbyk7aWYoImluLW91dCI9PT1yKXtpZihVdChhKSlyZXR1cm4gdTt2YXIgcCxkPWZ1bmN0aW9uKCl7cCgpfTtpdChjLCJhZnRlckVudGVyIixkKSxpdChjLCJlbnRlckNhbmNlbGxlZCIsZCksaXQoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBvfX19LHNvPUEoe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sZW8pO2Z1bmN0aW9uIGNvKGUpe2UuZWxtLl9tb3ZlQ2ImJmUuZWxtLl9tb3ZlQ2IoKSxlLmVsbS5fZW50ZXJDYiYmZS5lbG0uX2VudGVyQ2IoKX1mdW5jdGlvbiB1byhlKXtlLmRhdGEubmV3UG9zPWUuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWZ1bmN0aW9uIGxvKGUpe3ZhciB0PWUuZGF0YS5wb3Msbj1lLmRhdGEubmV3UG9zLHI9dC5sZWZ0LW4ubGVmdCxpPXQudG9wLW4udG9wO2lmKHJ8fGkpe2UuZGF0YS5tb3ZlZD0hMDt2YXIgbz1lLmVsbS5zdHlsZTtvLnRyYW5zZm9ybT1vLldlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIrcisicHgsIitpKyJweCkiLG8udHJhbnNpdGlvbkR1cmF0aW9uPSIwcyJ9fWRlbGV0ZSBzby5tb2RlO3ZhciBmbz17VHJhbnNpdGlvbjphbyxUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOnNvLGJlZm9yZU1vdW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuX3VwZGF0ZTt0aGlzLl91cGRhdGU9ZnVuY3Rpb24obixyKXt2YXIgaT1adChlKTtlLl9fcGF0Y2hfXyhlLl92bm9kZSxlLmtlcHQsITEsITApLGUuX3Zub2RlPWUua2VwdCxpKCksdC5jYWxsKGUsbixyKX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPW5vKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSxuW2Mua2V5XT1jLChjLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe2Zvcih2YXIgdT1bXSxsPVtdLGY9MDtmPHIubGVuZ3RoO2YrKyl7dmFyIHA9cltmXTtwLmRhdGEudHJhbnNpdGlvbj1hLHAuZGF0YS5wb3M9cC5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbltwLmtleV0/dS5wdXNoKHApOmwucHVzaChwKX10aGlzLmtlcHQ9ZSh0LG51bGwsdSksdGhpcy5yZW1vdmVkPWx9cmV0dXJuIGUodCxudWxsLG8pfSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmhhc01vdmUoZVswXS5lbG0sdCkmJihlLmZvckVhY2goY28pLGUuZm9yRWFjaCh1byksZS5mb3JFYWNoKGxvKSx0aGlzLl9yZWZsb3c9ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUuZGF0YS5tb3ZlZCl7dmFyIG49ZS5lbG0scj1uLnN0eWxlO05pKG4sdCksci50cmFuc2Zvcm09ci5XZWJraXRUcmFuc2Zvcm09ci50cmFuc2l0aW9uRHVyYXRpb249IiIsbi5hZGRFdmVudExpc3RlbmVyKEFpLG4uX21vdmVDYj1mdW5jdGlvbiBlKHIpe3ImJnIudGFyZ2V0IT09bnx8ciYmIS90cmFuc2Zvcm0kLy50ZXN0KHIucHJvcGVydHlOYW1lKXx8KG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihBaSxlKSxuLl9tb3ZlQ2I9bnVsbCxqaShuLHQpKX0pfX0pKX0sbWV0aG9kczp7aGFzTW92ZTpmdW5jdGlvbihlLHQpe2lmKCF3aSlyZXR1cm4hMTtpZih0aGlzLl9oYXNNb3ZlKXJldHVybiB0aGlzLl9oYXNNb3ZlO3ZhciBuPWUuY2xvbmVOb2RlKCk7ZS5fdHJhbnNpdGlvbkNsYXNzZXMmJmUuX3RyYW5zaXRpb25DbGFzc2VzLmZvckVhY2goZnVuY3Rpb24oZSl7X2kobixlKX0pLGdpKG4sdCksbi5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLiRlbC5hcHBlbmRDaGlsZChuKTt2YXIgcj1NaShuKTtyZXR1cm4gdGhpcy4kZWwucmVtb3ZlQ2hpbGQobiksdGhpcy5faGFzTW92ZT1yLmhhc1RyYW5zZm9ybX19fX07d24uY29uZmlnLm11c3RVc2VQcm9wPWpuLHduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPVduLHduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj1Fbix3bi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPVpuLHduLmNvbmZpZy5pc1Vua25vd25FbGVtZW50PWZ1bmN0aW9uKGUpe2lmKCF6KXJldHVybiEwO2lmKFduKGUpKXJldHVybiExO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGwhPUduW2VdKXJldHVybiBHbltlXTt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBlLmluZGV4T2YoIi0iKT4tMT9HbltlXT10LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxVbmtub3duRWxlbWVudHx8dC5jb25zdHJ1Y3Rvcj09PXdpbmRvdy5IVE1MRWxlbWVudDpHbltlXT0vSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KHQudG9TdHJpbmcoKSl9LEEod24ub3B0aW9ucy5kaXJlY3RpdmVzLFFpKSxBKHduLm9wdGlvbnMuY29tcG9uZW50cyxmbyksd24ucHJvdG90eXBlLl9fcGF0Y2hfXz16P3ppOlMsd24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIGUuJGVsPXQsZS4kb3B0aW9ucy5yZW5kZXJ8fChlLiRvcHRpb25zLnJlbmRlcj12ZSksWXQoZSwiYmVmb3JlTW91bnQiKSxyPWZ1bmN0aW9uKCl7ZS5fdXBkYXRlKGUuX3JlbmRlcigpLG4pfSxuZXcgZm4oZSxyLFMse2JlZm9yZTpmdW5jdGlvbigpe2UuX2lzTW91bnRlZCYmIWUuX2lzRGVzdHJveWVkJiZZdChlLCJiZWZvcmVVcGRhdGUiKX19LCEwKSxuPSExLG51bGw9PWUuJHZub2RlJiYoZS5faXNNb3VudGVkPSEwLFl0KGUsIm1vdW50ZWQiKSksZX0odGhpcyxlPWUmJno/WW4oZSk6dm9pZCAwLHQpfSx6JiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ri5kZXZ0b29scyYmbmUmJm5lLmVtaXQoImluaXQiLHduKX0sMCk7dmFyIHBvPS9ce1x7KCg/Oi58XHI/XG4pKz8pXH1cfS9nLHZvPS9bLS4qKz9eJHt9KCl8W1xdXC9cXF0vZyxobz1nKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0ucmVwbGFjZSh2bywiXFwkJiIpLG49ZVsxXS5yZXBsYWNlKHZvLCJcXCQmIik7cmV0dXJuIG5ldyBSZWdFeHAodCsiKCg/Oi58XFxuKSs/KSIrbiwiZyIpfSk7dmFyIG1vPXtzdGF0aWNLZXlzOlsic3RhdGljQ2xhc3MiXSx0cmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7dC53YXJuO3ZhciBuPUZyKGUsImNsYXNzIik7biYmKGUuc3RhdGljQ2xhc3M9SlNPTi5zdHJpbmdpZnkobikpO3ZhciByPUlyKGUsImNsYXNzIiwhMSk7ciYmKGUuY2xhc3NCaW5kaW5nPXIpfSxnZW5EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlLnN0YXRpY0NsYXNzJiYodCs9InN0YXRpY0NsYXNzOiIrZS5zdGF0aWNDbGFzcysiLCIpLGUuY2xhc3NCaW5kaW5nJiYodCs9ImNsYXNzOiIrZS5jbGFzc0JpbmRpbmcrIiwiKSx0fX07dmFyIHlvLGdvPXtzdGF0aWNLZXlzOlsic3RhdGljU3R5bGUiXSx0cmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7dC53YXJuO3ZhciBuPUZyKGUsInN0eWxlIik7biYmKGUuc3RhdGljU3R5bGU9SlNPTi5zdHJpbmdpZnkoYWkobikpKTt2YXIgcj1JcihlLCJzdHlsZSIsITEpO3ImJihlLnN0eWxlQmluZGluZz1yKX0sZ2VuRGF0YTpmdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZS5zdGF0aWNTdHlsZSYmKHQrPSJzdGF0aWNTdHlsZToiK2Uuc3RhdGljU3R5bGUrIiwiKSxlLnN0eWxlQmluZGluZyYmKHQrPSJzdHlsZTooIitlLnN0eWxlQmluZGluZysiKSwiKSx0fX0sX289ZnVuY3Rpb24oZSl7cmV0dXJuKHlvPXlvfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPWUseW8udGV4dENvbnRlbnR9LGJvPXAoImFyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLGxpbmssbWV0YSxwYXJhbSxzb3VyY2UsdHJhY2ssd2JyIiksJG89cCgiY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZSIpLHdvPXAoImFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxiYXNlLGJsb2NrcXVvdGUsYm9keSxjYXB0aW9uLGNvbCxjb2xncm91cCxkZCxkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0saDEsaDIsaDMsaDQsaDUsaDYsaGVhZCxoZWFkZXIsaGdyb3VwLGhyLGh0bWwsbGVnZW5kLGxpLG1lbnVpdGVtLG1ldGEsb3B0Z3JvdXAsb3B0aW9uLHBhcmFtLHJwLHJ0LHNvdXJjZSxzdHlsZSxzdW1tYXJ5LHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRpdGxlLHRyLHRyYWNrIiksQ289L15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vLHhvPS9eXHMqKCg/OnYtW1x3LV0rOnxAfDp8IylcW1tePV0rXF1bXlxzIic8PlwvPV0qKSg/OlxzKig9KVxzKig/OiIoW14iXSopIit8JyhbXiddKiknK3woW15ccyInPTw+YF0rKSkpPy8sa289IlthLXpBLVpfXVtcXC1cXC4wLTlfYS16QS1aIitQLnNvdXJjZSsiXSoiLEFvPSIoKD86IitrbysiXFw6KT8iK2tvKyIpIixPbz1uZXcgUmVnRXhwKCJePCIrQW8pLFNvPS9eXHMqKFwvPyk+LyxUbz1uZXcgUmVnRXhwKCJePFxcLyIrQW8rIltePl0qPiIpLEVvPS9ePCFET0NUWVBFIFtePl0rPi9pLE5vPS9ePCFcLS0vLGpvPS9ePCFcWy8sRG89cCgic2NyaXB0LHN0eWxlLHRleHRhcmVhIiwhMCksTG89e30sTW89eyImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiZhbXA7IjoiJiIsIiYjMTA7IjoiXG4iLCImIzk7IjoiXHQiLCImIzM5OyI6IicifSxJbz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOSk7L2csRm89LyYoPzpsdHxndHxxdW90fGFtcHwjMzl8IzEwfCM5KTsvZyxQbz1wKCJwcmUsdGV4dGFyZWEiLCEwKSxSbz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZQbyhlKSYmIlxuIj09PXRbMF19O2Z1bmN0aW9uIEhvKGUsdCl7dmFyIG49dD9GbzpJbztyZXR1cm4gZS5yZXBsYWNlKG4sZnVuY3Rpb24oZSl7cmV0dXJuIE1vW2VdfSl9dmFyIEJvLFVvLHpvLFZvLEtvLEpvLHFvLFdvLFpvPS9eQHxedi1vbjovLEdvPS9edi18XkB8Xjp8XiMvLFhvPS8oW1xzXFNdKj8pXHMrKD86aW58b2YpXHMrKFtcc1xTXSopLyxZbz0vLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLyxRbz0vXlwofFwpJC9nLGVhPS9eXFsuKlxdJC8sdGE9LzooLiopJC8sbmE9L146fF5cLnxedi1iaW5kOi8scmE9L1wuW14uXF1dKyg/PVteXF1dKiQpL2csaWE9L152LXNsb3QoOnwkKXxeIy8sb2E9L1tcclxuXS8sYWE9L1xzKy9nLHNhPWcoX28pLGNhPSJfZW1wdHlfIjtmdW5jdGlvbiB1YShlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDptYSh0KSxyYXdBdHRyc01hcDp7fSxwYXJlbnQ6bixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gbGEoZSx0KXtCbz10Lndhcm58fFNyLEpvPXQuaXNQcmVUYWd8fFQscW89dC5tdXN0VXNlUHJvcHx8VCxXbz10LmdldFRhZ05hbWVzcGFjZXx8VDt0LmlzUmVzZXJ2ZWRUYWc7em89VHIodC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksVm89VHIodC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksS289VHIodC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLFVvPXQuZGVsaW1pdGVyczt2YXIgbixyLGk9W10sbz0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLGE9dC53aGl0ZXNwYWNlLHM9ITEsYz0hMTtmdW5jdGlvbiB1KGUpe2lmKGwoZSksc3x8ZS5wcm9jZXNzZWR8fChlPWZhKGUsdCkpLGkubGVuZ3RofHxlPT09bnx8bi5pZiYmKGUuZWxzZWlmfHxlLmVsc2UpJiZkYShuLHtleHA6ZS5lbHNlaWYsYmxvY2s6ZX0pLHImJiFlLmZvcmJpZGRlbilpZihlLmVsc2VpZnx8ZS5lbHNlKWE9ZSwodT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe2lmKDE9PT1lW3RdLnR5cGUpcmV0dXJuIGVbdF07ZS5wb3AoKX19KHIuY2hpbGRyZW4pKSYmdS5pZiYmZGEodSx7ZXhwOmEuZWxzZWlmLGJsb2NrOmF9KTtlbHNle2lmKGUuc2xvdFNjb3BlKXt2YXIgbz1lLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInOyhyLnNjb3BlZFNsb3RzfHwoci5zY29wZWRTbG90cz17fSkpW29dPWV9ci5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PXJ9dmFyIGEsdTtlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnNsb3RTY29wZX0pLGwoZSksZS5wcmUmJihzPSExKSxKbyhlLnRhZykmJihjPSExKTtmb3IodmFyIGY9MDtmPEtvLmxlbmd0aDtmKyspS29bZl0oZSx0KX1mdW5jdGlvbiBsKGUpe2lmKCFjKWZvcih2YXIgdDsodD1lLmNoaWxkcmVuW2UuY2hpbGRyZW4ubGVuZ3RoLTFdKSYmMz09PXQudHlwZSYmIiAiPT09dC50ZXh0OyllLmNoaWxkcmVuLnBvcCgpfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGk9W10sbz10LmV4cGVjdEhUTUwsYT10LmlzVW5hcnlUYWd8fFQscz10LmNhbkJlTGVmdE9wZW5UYWd8fFQsYz0wO2U7KXtpZihuPWUsciYmRG8ocikpe3ZhciB1PTAsbD1yLnRvTG93ZXJDYXNlKCksZj1Mb1tsXXx8KExvW2xdPW5ldyBSZWdFeHAoIihbXFxzXFxTXSo/KSg8LyIrbCsiW14+XSo+KSIsImkiKSkscD1lLnJlcGxhY2UoZixmdW5jdGlvbihlLG4scil7cmV0dXJuIHU9ci5sZW5ndGgsRG8obCl8fCJub3NjcmlwdCI9PT1sfHwobj1uLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCIkMSIpLnJlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSIpKSxSbyhsLG4pJiYobj1uLnNsaWNlKDEpKSx0LmNoYXJzJiZ0LmNoYXJzKG4pLCIifSk7Yys9ZS5sZW5ndGgtcC5sZW5ndGgsZT1wLEEobCxjLXUsYyl9ZWxzZXt2YXIgZD1lLmluZGV4T2YoIjwiKTtpZigwPT09ZCl7aWYoTm8udGVzdChlKSl7dmFyIHY9ZS5pbmRleE9mKCItLVx4M2UiKTtpZih2Pj0wKXt0LnNob3VsZEtlZXBDb21tZW50JiZ0LmNvbW1lbnQoZS5zdWJzdHJpbmcoNCx2KSxjLGMrdiszKSxDKHYrMyk7Y29udGludWV9fWlmKGpvLnRlc3QoZSkpe3ZhciBoPWUuaW5kZXhPZigiXT4iKTtpZihoPj0wKXtDKGgrMik7Y29udGludWV9fXZhciBtPWUubWF0Y2goRW8pO2lmKG0pe0MobVswXS5sZW5ndGgpO2NvbnRpbnVlfXZhciB5PWUubWF0Y2goVG8pO2lmKHkpe3ZhciBnPWM7Qyh5WzBdLmxlbmd0aCksQSh5WzFdLGcsYyk7Y29udGludWV9dmFyIF89eCgpO2lmKF8pe2soXyksUm8oXy50YWdOYW1lLGUpJiZDKDEpO2NvbnRpbnVlfX12YXIgYj12b2lkIDAsJD12b2lkIDAsdz12b2lkIDA7aWYoZD49MCl7Zm9yKCQ9ZS5zbGljZShkKTshKFRvLnRlc3QoJCl8fE9vLnRlc3QoJCl8fE5vLnRlc3QoJCl8fGpvLnRlc3QoJCl8fCh3PSQuaW5kZXhPZigiPCIsMSkpPDApOylkKz13LCQ9ZS5zbGljZShkKTtiPWUuc3Vic3RyaW5nKDAsZCl9ZDwwJiYoYj1lKSxiJiZDKGIubGVuZ3RoKSx0LmNoYXJzJiZiJiZ0LmNoYXJzKGIsYy1iLmxlbmd0aCxjKX1pZihlPT09bil7dC5jaGFycyYmdC5jaGFycyhlKTticmVha319ZnVuY3Rpb24gQyh0KXtjKz10LGU9ZS5zdWJzdHJpbmcodCl9ZnVuY3Rpb24geCgpe3ZhciB0PWUubWF0Y2goT28pO2lmKHQpe3ZhciBuLHIsaT17dGFnTmFtZTp0WzFdLGF0dHJzOltdLHN0YXJ0OmN9O2ZvcihDKHRbMF0ubGVuZ3RoKTshKG49ZS5tYXRjaChTbykpJiYocj1lLm1hdGNoKHhvKXx8ZS5tYXRjaChDbykpOylyLnN0YXJ0PWMsQyhyWzBdLmxlbmd0aCksci5lbmQ9YyxpLmF0dHJzLnB1c2gocik7aWYobilyZXR1cm4gaS51bmFyeVNsYXNoPW5bMV0sQyhuWzBdLmxlbmd0aCksaS5lbmQ9YyxpfX1mdW5jdGlvbiBrKGUpe3ZhciBuPWUudGFnTmFtZSxjPWUudW5hcnlTbGFzaDtvJiYoInAiPT09ciYmd28obikmJkEocikscyhuKSYmcj09PW4mJkEobikpO2Zvcih2YXIgdT1hKG4pfHwhIWMsbD1lLmF0dHJzLmxlbmd0aCxmPW5ldyBBcnJheShsKSxwPTA7cDxsO3ArKyl7dmFyIGQ9ZS5hdHRyc1twXSx2PWRbM118fGRbNF18fGRbNV18fCIiLGg9ImEiPT09biYmImhyZWYiPT09ZFsxXT90LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzO2ZbcF09e25hbWU6ZFsxXSx2YWx1ZTpIbyh2LGgpfX11fHwoaS5wdXNoKHt0YWc6bixsb3dlckNhc2VkVGFnOm4udG9Mb3dlckNhc2UoKSxhdHRyczpmLHN0YXJ0OmUuc3RhcnQsZW5kOmUuZW5kfSkscj1uKSx0LnN0YXJ0JiZ0LnN0YXJ0KG4sZix1LGUuc3RhcnQsZS5lbmQpfWZ1bmN0aW9uIEEoZSxuLG8pe3ZhciBhLHM7aWYobnVsbD09biYmKG49YyksbnVsbD09byYmKG89YyksZSlmb3Iocz1lLnRvTG93ZXJDYXNlKCksYT1pLmxlbmd0aC0xO2E+PTAmJmlbYV0ubG93ZXJDYXNlZFRhZyE9PXM7YS0tKTtlbHNlIGE9MDtpZihhPj0wKXtmb3IodmFyIHU9aS5sZW5ndGgtMTt1Pj1hO3UtLSl0LmVuZCYmdC5lbmQoaVt1XS50YWcsbixvKTtpLmxlbmd0aD1hLHI9YSYmaVthLTFdLnRhZ31lbHNlImJyIj09PXM/dC5zdGFydCYmdC5zdGFydChlLFtdLCEwLG4sbyk6InAiPT09cyYmKHQuc3RhcnQmJnQuc3RhcnQoZSxbXSwhMSxuLG8pLHQuZW5kJiZ0LmVuZChlLG4sbykpfUEoKX0oZSx7d2FybjpCbyxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLG91dHB1dFNvdXJjZVJhbmdlOnQub3V0cHV0U291cmNlUmFuZ2Usc3RhcnQ6ZnVuY3Rpb24oZSxvLGEsbCxmKXt2YXIgcD1yJiZyLm5zfHxXbyhlKTtxJiYic3ZnIj09PXAmJihvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07eWEudGVzdChyLm5hbWUpfHwoci5uYW1lPXIubmFtZS5yZXBsYWNlKGdhLCIiKSx0LnB1c2gocikpfXJldHVybiB0fShvKSk7dmFyIGQsdj11YShlLG8scik7cCYmKHYubnM9cCksInN0eWxlIiE9PShkPXYpLnRhZyYmKCJzY3JpcHQiIT09ZC50YWd8fGQuYXR0cnNNYXAudHlwZSYmInRleHQvamF2YXNjcmlwdCIhPT1kLmF0dHJzTWFwLnR5cGUpfHx0ZSgpfHwodi5mb3JiaWRkZW49ITApO2Zvcih2YXIgaD0wO2g8Vm8ubGVuZ3RoO2grKyl2PVZvW2hdKHYsdCl8fHY7c3x8KCFmdW5jdGlvbihlKXtudWxsIT1GcihlLCJ2LXByZSIpJiYoZS5wcmU9ITApfSh2KSx2LnByZSYmKHM9ITApKSxKbyh2LnRhZykmJihjPSEwKSxzP2Z1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cnNMaXN0LG49dC5sZW5ndGg7aWYobilmb3IodmFyIHI9ZS5hdHRycz1uZXcgQXJyYXkobiksaT0wO2k8bjtpKyspcltpXT17bmFtZTp0W2ldLm5hbWUsdmFsdWU6SlNPTi5zdHJpbmdpZnkodFtpXS52YWx1ZSl9LG51bGwhPXRbaV0uc3RhcnQmJihyW2ldLnN0YXJ0PXRbaV0uc3RhcnQscltpXS5lbmQ9dFtpXS5lbmQpO2Vsc2UgZS5wcmV8fChlLnBsYWluPSEwKX0odik6di5wcm9jZXNzZWR8fChwYSh2KSxmdW5jdGlvbihlKXt2YXIgdD1GcihlLCJ2LWlmIik7aWYodCllLmlmPXQsZGEoZSx7ZXhwOnQsYmxvY2s6ZX0pO2Vsc2V7bnVsbCE9RnIoZSwidi1lbHNlIikmJihlLmVsc2U9ITApO3ZhciBuPUZyKGUsInYtZWxzZS1pZiIpO24mJihlLmVsc2VpZj1uKX19KHYpLGZ1bmN0aW9uKGUpe251bGwhPUZyKGUsInYtb25jZSIpJiYoZS5vbmNlPSEwKX0odikpLG58fChuPXYpLGE/dSh2KToocj12LGkucHVzaCh2KSl9LGVuZDpmdW5jdGlvbihlLHQsbil7dmFyIG89aVtpLmxlbmd0aC0xXTtpLmxlbmd0aC09MSxyPWlbaS5sZW5ndGgtMV0sdShvKX0sY2hhcnM6ZnVuY3Rpb24oZSx0LG4pe2lmKHImJighcXx8InRleHRhcmVhIiE9PXIudGFnfHxyLmF0dHJzTWFwLnBsYWNlaG9sZGVyIT09ZSkpe3ZhciBpLHUsbCxmPXIuY2hpbGRyZW47aWYoZT1jfHxlLnRyaW0oKT8ic2NyaXB0Ij09PShpPXIpLnRhZ3x8InN0eWxlIj09PWkudGFnP2U6c2EoZSk6Zi5sZW5ndGg/YT8iY29uZGVuc2UiPT09YSYmb2EudGVzdChlKT8iIjoiICI6bz8iICI6IiI6IiIpY3x8ImNvbmRlbnNlIiE9PWF8fChlPWUucmVwbGFjZShhYSwiICIpKSwhcyYmIiAiIT09ZSYmKHU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P2hvKHQpOnBvO2lmKG4udGVzdChlKSl7Zm9yKHZhciByLGksbyxhPVtdLHM9W10sYz1uLmxhc3RJbmRleD0wO3I9bi5leGVjKGUpOyl7KGk9ci5pbmRleCk+YyYmKHMucHVzaChvPWUuc2xpY2UoYyxpKSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KG8pKSk7dmFyIHU9QXIoclsxXS50cmltKCkpO2EucHVzaCgiX3MoIit1KyIpIikscy5wdXNoKHsiQGJpbmRpbmciOnV9KSxjPWkrclswXS5sZW5ndGh9cmV0dXJuIGM8ZS5sZW5ndGgmJihzLnB1c2gobz1lLnNsaWNlKGMpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkobykpKSx7ZXhwcmVzc2lvbjphLmpvaW4oIisiKSx0b2tlbnM6c319fShlLFVvKSk/bD17dHlwZToyLGV4cHJlc3Npb246dS5leHByZXNzaW9uLHRva2Vuczp1LnRva2Vucyx0ZXh0OmV9OiIgIj09PWUmJmYubGVuZ3RoJiYiICI9PT1mW2YubGVuZ3RoLTFdLnRleHR8fChsPXt0eXBlOjMsdGV4dDplfSksbCYmZi5wdXNoKGwpfX0sY29tbWVudDpmdW5jdGlvbihlLHQsbil7aWYocil7dmFyIGk9e3R5cGU6Myx0ZXh0OmUsaXNDb21tZW50OiEwfTtyLmNoaWxkcmVuLnB1c2goaSl9fX0pLG59ZnVuY3Rpb24gZmEoZSx0KXt2YXIgbixyOyhyPUlyKG49ZSwia2V5IikpJiYobi5rZXk9ciksZS5wbGFpbj0hZS5rZXkmJiFlLnNjb3BlZFNsb3RzJiYhZS5hdHRyc0xpc3QubGVuZ3RoLGZ1bmN0aW9uKGUpe3ZhciB0PUlyKGUsInJlZiIpO3QmJihlLnJlZj10LGUucmVmSW5Gb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtmb3IoO3Q7KXtpZih2b2lkIDAhPT10LmZvcilyZXR1cm4hMDt0PXQucGFyZW50fXJldHVybiExfShlKSl9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0OyJ0ZW1wbGF0ZSI9PT1lLnRhZz8odD1GcihlLCJzY29wZSIpLGUuc2xvdFNjb3BlPXR8fEZyKGUsInNsb3Qtc2NvcGUiKSk6KHQ9RnIoZSwic2xvdC1zY29wZSIpKSYmKGUuc2xvdFNjb3BlPXQpO3ZhciBuPUlyKGUsInNsb3QiKTtuJiYoZS5zbG90VGFyZ2V0PSciIic9PT1uPyciZGVmYXVsdCInOm4sZS5zbG90VGFyZ2V0RHluYW1pYz0hKCFlLmF0dHJzTWFwWyI6c2xvdCJdJiYhZS5hdHRyc01hcFsidi1iaW5kOnNsb3QiXSksInRlbXBsYXRlIj09PWUudGFnfHxlLnNsb3RTY29wZXx8TnIoZSwic2xvdCIsbixmdW5jdGlvbihlLHQpe3JldHVybiBlLnJhd0F0dHJzTWFwWyI6Iit0XXx8ZS5yYXdBdHRyc01hcFsidi1iaW5kOiIrdF18fGUucmF3QXR0cnNNYXBbdF19KGUsInNsb3QiKSkpO2lmKCJ0ZW1wbGF0ZSI9PT1lLnRhZyl7dmFyIHI9UHIoZSxpYSk7aWYocil7dmFyIGk9dmEociksbz1pLm5hbWUsYT1pLmR5bmFtaWM7ZS5zbG90VGFyZ2V0PW8sZS5zbG90VGFyZ2V0RHluYW1pYz1hLGUuc2xvdFNjb3BlPXIudmFsdWV8fGNhfX1lbHNle3ZhciBzPVByKGUsaWEpO2lmKHMpe3ZhciBjPWUuc2NvcGVkU2xvdHN8fChlLnNjb3BlZFNsb3RzPXt9KSx1PXZhKHMpLGw9dS5uYW1lLGY9dS5keW5hbWljLHA9Y1tsXT11YSgidGVtcGxhdGUiLFtdLGUpO3Auc2xvdFRhcmdldD1sLHAuc2xvdFRhcmdldER5bmFtaWM9ZixwLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKCFlLnNsb3RTY29wZSlyZXR1cm4gZS5wYXJlbnQ9cCwhMH0pLHAuc2xvdFNjb3BlPXMudmFsdWV8fGNhLGUuY2hpbGRyZW49W10sZS5wbGFpbj0hMX19fShlKSxmdW5jdGlvbihlKXsic2xvdCI9PT1lLnRhZyYmKGUuc2xvdE5hbWU9SXIoZSwibmFtZSIpKX0oZSksZnVuY3Rpb24oZSl7dmFyIHQ7KHQ9SXIoZSwiaXMiKSkmJihlLmNvbXBvbmVudD10KTtudWxsIT1GcihlLCJpbmxpbmUtdGVtcGxhdGUiKSYmKGUuaW5saW5lVGVtcGxhdGU9ITApfShlKTtmb3IodmFyIGk9MDtpPHpvLmxlbmd0aDtpKyspZT16b1tpXShlLHQpfHxlO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHU9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYocj1pPXVbdF0ubmFtZSxvPXVbdF0udmFsdWUsR28udGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLChhPWhhKHIucmVwbGFjZShHbywiIikpKSYmKHI9ci5yZXBsYWNlKHJhLCIiKSksbmEudGVzdChyKSlyPXIucmVwbGFjZShuYSwiIiksbz1BcihvKSwoYz1lYS50ZXN0KHIpKSYmKHI9ci5zbGljZSgxLC0xKSksYSYmKGEucHJvcCYmIWMmJiJpbm5lckh0bWwiPT09KHI9YihyKSkmJihyPSJpbm5lckhUTUwiKSxhLmNhbWVsJiYhYyYmKHI9YihyKSksYS5zeW5jJiYocz1CcihvLCIkZXZlbnQiKSxjP01yKGUsJyJ1cGRhdGU6IisoJytyKyIpIixzLG51bGwsITEsMCx1W3RdLCEwKTooTXIoZSwidXBkYXRlOiIrYihyKSxzLG51bGwsITEsMCx1W3RdKSxDKHIpIT09YihyKSYmTXIoZSwidXBkYXRlOiIrQyhyKSxzLG51bGwsITEsMCx1W3RdKSkpKSxhJiZhLnByb3B8fCFlLmNvbXBvbmVudCYmcW8oZS50YWcsZS5hdHRyc01hcC50eXBlLHIpP0VyKGUscixvLHVbdF0sYyk6TnIoZSxyLG8sdVt0XSxjKTtlbHNlIGlmKFpvLnRlc3Qocikpcj1yLnJlcGxhY2UoWm8sIiIpLChjPWVhLnRlc3QocikpJiYocj1yLnNsaWNlKDEsLTEpKSxNcihlLHIsbyxhLCExLDAsdVt0XSxjKTtlbHNle3ZhciBsPShyPXIucmVwbGFjZShHbywiIikpLm1hdGNoKHRhKSxmPWwmJmxbMV07Yz0hMSxmJiYocj1yLnNsaWNlKDAsLShmLmxlbmd0aCsxKSksZWEudGVzdChmKSYmKGY9Zi5zbGljZSgxLC0xKSxjPSEwKSksRHIoZSxyLGksbyxmLGMsYSx1W3RdKX1lbHNlIE5yKGUscixKU09OLnN0cmluZ2lmeShvKSx1W3RdKSwhZS5jb21wb25lbnQmJiJtdXRlZCI9PT1yJiZxbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscikmJkVyKGUsciwidHJ1ZSIsdVt0XSl9KGUpLGV9ZnVuY3Rpb24gcGEoZSl7dmFyIHQ7aWYodD1GcihlLCJ2LWZvciIpKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKFhvKTtpZighdClyZXR1cm47dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShRbywiIiksaT1yLm1hdGNoKFlvKTtpPyhuLmFsaWFzPXIucmVwbGFjZShZbywiIikudHJpbSgpLG4uaXRlcmF0b3IxPWlbMV0udHJpbSgpLGlbMl0mJihuLml0ZXJhdG9yMj1pWzJdLnRyaW0oKSkpOm4uYWxpYXM9cjtyZXR1cm4gbn0odCk7biYmQShlLG4pfX1mdW5jdGlvbiBkYShlLHQpe2UuaWZDb25kaXRpb25zfHwoZS5pZkNvbmRpdGlvbnM9W10pLGUuaWZDb25kaXRpb25zLnB1c2godCl9ZnVuY3Rpb24gdmEoZSl7dmFyIHQ9ZS5uYW1lLnJlcGxhY2UoaWEsIiIpO3JldHVybiB0fHwiIyIhPT1lLm5hbWVbMF0mJih0PSJkZWZhdWx0IiksZWEudGVzdCh0KT97bmFtZTp0LnNsaWNlKDEsLTEpLGR5bmFtaWM6ITB9OntuYW1lOiciJyt0KyciJyxkeW5hbWljOiExfX1mdW5jdGlvbiBoYShlKXt2YXIgdD1lLm1hdGNoKHJhKTtpZih0KXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZS5zbGljZSgxKV09ITB9KSxufX1mdW5jdGlvbiBtYShlKXtmb3IodmFyIHQ9e30sbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W2Vbbl0ubmFtZV09ZVtuXS52YWx1ZTtyZXR1cm4gdH12YXIgeWE9L154bWxuczpOU1xkKy8sZ2E9L15OU1xkKzovO2Z1bmN0aW9uIF9hKGUpe3JldHVybiB1YShlLnRhZyxlLmF0dHJzTGlzdC5zbGljZSgpLGUucGFyZW50KX12YXIgYmE9W21vLGdvLHtwcmVUcmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0Ij09PWUudGFnKXt2YXIgbixyPWUuYXR0cnNNYXA7aWYoIXJbInYtbW9kZWwiXSlyZXR1cm47aWYoKHJbIjp0eXBlIl18fHJbInYtYmluZDp0eXBlIl0pJiYobj1JcihlLCJ0eXBlIikpLHIudHlwZXx8bnx8IXJbInYtYmluZCJdfHwobj0iKCIrclsidi1iaW5kIl0rIikudHlwZSIpLG4pe3ZhciBpPUZyKGUsInYtaWYiLCEwKSxvPWk/IiYmKCIraSsiKSI6IiIsYT1udWxsIT1GcihlLCJ2LWVsc2UiLCEwKSxzPUZyKGUsInYtZWxzZS1pZiIsITApLGM9X2EoZSk7cGEoYyksanIoYywidHlwZSIsImNoZWNrYm94IiksZmEoYyx0KSxjLnByb2Nlc3NlZD0hMCxjLmlmPSIoIituKyIpPT09J2NoZWNrYm94JyIrbyxkYShjLHtleHA6Yy5pZixibG9jazpjfSk7dmFyIHU9X2EoZSk7RnIodSwidi1mb3IiLCEwKSxqcih1LCJ0eXBlIiwicmFkaW8iKSxmYSh1LHQpLGRhKGMse2V4cDoiKCIrbisiKT09PSdyYWRpbyciK28sYmxvY2s6dX0pO3ZhciBsPV9hKGUpO3JldHVybiBGcihsLCJ2LWZvciIsITApLGpyKGwsIjp0eXBlIixuKSxmYShsLHQpLGRhKGMse2V4cDppLGJsb2NrOmx9KSxhP2MuZWxzZT0hMDpzJiYoYy5lbHNlaWY9cyksY319fX1dO3ZhciAkYSx3YSxDYT17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOmJhLGRpcmVjdGl2ZXM6e21vZGVsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9dC5tb2RpZmllcnMsbz1lLnRhZyxhPWUuYXR0cnNNYXAudHlwZTtpZihlLmNvbXBvbmVudClyZXR1cm4gSHIoZSxyLGkpLCExO2lmKCJzZWxlY3QiPT09bykhZnVuY3Rpb24oZSx0LG4pe3ZhciByPSd2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VsZWN0ZWR9KS5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9ICJfdmFsdWUiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7cmV0dXJuICcrKG4mJm4ubnVtYmVyPyJfbih2YWwpIjoidmFsIikrIn0pOyI7cj1yKyIgIitCcih0LCIkZXZlbnQudGFyZ2V0Lm11bHRpcGxlID8gJCRzZWxlY3RlZFZhbCA6ICQkc2VsZWN0ZWRWYWxbMF0iKSxNcihlLCJjaGFuZ2UiLHIsbnVsbCwhMCl9KGUscixpKTtlbHNlIGlmKCJpbnB1dCI9PT1vJiYiY2hlY2tib3giPT09YSkhZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4mJm4ubnVtYmVyLGk9SXIoZSwidmFsdWUiKXx8Im51bGwiLG89SXIoZSwidHJ1ZS12YWx1ZSIpfHwidHJ1ZSIsYT1JcihlLCJmYWxzZS12YWx1ZSIpfHwiZmFsc2UiO0VyKGUsImNoZWNrZWQiLCJBcnJheS5pc0FycmF5KCIrdCsiKT9faSgiK3QrIiwiK2krIik+LTEiKygidHJ1ZSI9PT1vPyI6KCIrdCsiKSI6IjpfcSgiK3QrIiwiK28rIikiKSksTXIoZSwiY2hhbmdlIiwidmFyICQkYT0iK3QrIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oIitvKyIpOigiK2ErIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PSIrKHI/Il9uKCIraSsiKSI6aSkrIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIrQnIodCwiJCRhLmNvbmNhdChbJCR2XSkiKSsiKX1lbHNleyQkaT4tMSYmKCIrQnIodCwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkiKSsiKX19ZWxzZXsiK0JyKHQsIiQkYyIpKyJ9IixudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW8mJiJyYWRpbyI9PT1hKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsaT1JcihlLCJ2YWx1ZSIpfHwibnVsbCI7RXIoZSwiY2hlY2tlZCIsIl9xKCIrdCsiLCIrKGk9cj8iX24oIitpKyIpIjppKSsiKSIpLE1yKGUsImNoYW5nZSIsQnIodCxpKSxudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW98fCJ0ZXh0YXJlYSI9PT1vKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5hdHRyc01hcC50eXBlLGk9bnx8e30sbz1pLmxhenksYT1pLm51bWJlcixzPWkudHJpbSxjPSFvJiYicmFuZ2UiIT09cix1PW8/ImNoYW5nZSI6InJhbmdlIj09PXI/V3I6ImlucHV0IixsPSIkZXZlbnQudGFyZ2V0LnZhbHVlIjtzJiYobD0iJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKCkiKSxhJiYobD0iX24oIitsKyIpIik7dmFyIGY9QnIodCxsKTtjJiYoZj0iaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIrZiksRXIoZSwidmFsdWUiLCIoIit0KyIpIiksTXIoZSx1LGYsbnVsbCwhMCksKHN8fGEpJiZNcihlLCJibHVyIiwiJGZvcmNlVXBkYXRlKCkiKX0oZSxyLGkpO2Vsc2UgaWYoIUYuaXNSZXNlcnZlZFRhZyhvKSlyZXR1cm4gSHIoZSxyLGkpLCExO3JldHVybiEwfSx0ZXh0OmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwidGV4dENvbnRlbnQiLCJfcygiK3QudmFsdWUrIikiLHQpfSxodG1sOmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwiaW5uZXJIVE1MIiwiX3MoIit0LnZhbHVlKyIpIix0KX19LGlzUHJlVGFnOmZ1bmN0aW9uKGUpe3JldHVybiJwcmUiPT09ZX0saXNVbmFyeVRhZzpibyxtdXN0VXNlUHJvcDpqbixjYW5CZUxlZnRPcGVuVGFnOiRvLGlzUmVzZXJ2ZWRUYWc6V24sZ2V0VGFnTmFtZXNwYWNlOlpuLHN0YXRpY0tleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQuc3RhdGljS2V5c3x8W10pfSxbXSkuam9pbigiLCIpfShiYSl9LHhhPWcoZnVuY3Rpb24oZSl7cmV0dXJuIHAoInR5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMsc3RhcnQsZW5kLHJhd0F0dHJzTWFwIisoZT8iLCIrZToiIikpfSk7ZnVuY3Rpb24ga2EoZSx0KXtlJiYoJGE9eGEodC5zdGF0aWNLZXlzfHwiIiksd2E9dC5pc1Jlc2VydmVkVGFnfHxULGZ1bmN0aW9uIGUodCl7dC5zdGF0aWM9ZnVuY3Rpb24oZSl7aWYoMj09PWUudHlwZSlyZXR1cm4hMTtpZigzPT09ZS50eXBlKXJldHVybiEwO3JldHVybiEoIWUucHJlJiYoZS5oYXNCaW5kaW5nc3x8ZS5pZnx8ZS5mb3J8fGQoZS50YWcpfHwhd2EoZS50YWcpfHxmdW5jdGlvbihlKXtmb3IoO2UucGFyZW50Oyl7aWYoInRlbXBsYXRlIiE9PShlPWUucGFyZW50KS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9KGUpfHwhT2JqZWN0LmtleXMoZSkuZXZlcnkoJGEpKSl9KHQpO2lmKDE9PT10LnR5cGUpe2lmKCF3YSh0LnRhZykmJiJzbG90IiE9PXQudGFnJiZudWxsPT10LmF0dHJzTWFwWyJpbmxpbmUtdGVtcGxhdGUiXSlyZXR1cm47Zm9yKHZhciBuPTAscj10LmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXt2YXIgaT10LmNoaWxkcmVuW25dO2UoaSksaS5zdGF0aWN8fCh0LnN0YXRpYz0hMSl9aWYodC5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsYT10LmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxhO28rKyl7dmFyIHM9dC5pZkNvbmRpdGlvbnNbb10uYmxvY2s7ZShzKSxzLnN0YXRpY3x8KHQuc3RhdGljPSExKX19fShlKSxmdW5jdGlvbiBlKHQsbil7aWYoMT09PXQudHlwZSl7aWYoKHQuc3RhdGljfHx0Lm9uY2UpJiYodC5zdGF0aWNJbkZvcj1uKSx0LnN0YXRpYyYmdC5jaGlsZHJlbi5sZW5ndGgmJigxIT09dC5jaGlsZHJlbi5sZW5ndGh8fDMhPT10LmNoaWxkcmVuWzBdLnR5cGUpKXJldHVybiB2b2lkKHQuc3RhdGljUm9vdD0hMCk7aWYodC5zdGF0aWNSb290PSExLHQuY2hpbGRyZW4pZm9yKHZhciByPTAsaT10LmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWUodC5jaGlsZHJlbltyXSxufHwhIXQuZm9yKTtpZih0LmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxhPXQuaWZDb25kaXRpb25zLmxlbmd0aDtvPGE7bysrKWUodC5pZkNvbmRpdGlvbnNbb10uYmxvY2ssbil9fShlLCExKSl9dmFyIEFhPS9eKFtcdyRfXSt8XChbXildKj9cKSlccyo9PnxeZnVuY3Rpb24oPzpccytbXHckXSspP1xzKlwoLyxPYT0vXChbXildKj9cKTsqJC8sU2E9L15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLyxUYT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxFYT17ZXNjOlsiRXNjIiwiRXNjYXBlIl0sdGFiOiJUYWIiLGVudGVyOiJFbnRlciIsc3BhY2U6WyIgIiwiU3BhY2ViYXIiXSx1cDpbIlVwIiwiQXJyb3dVcCJdLGxlZnQ6WyJMZWZ0IiwiQXJyb3dMZWZ0Il0scmlnaHQ6WyJSaWdodCIsIkFycm93UmlnaHQiXSxkb3duOlsiRG93biIsIkFycm93RG93biJdLGRlbGV0ZTpbIkJhY2tzcGFjZSIsIkRlbGV0ZSIsIkRlbCJdfSxOYT1mdW5jdGlvbihlKXtyZXR1cm4iaWYoIitlKyIpcmV0dXJuIG51bGw7In0samE9e3N0b3A6IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiLHByZXZlbnQ6IiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIsc2VsZjpOYSgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSxjdHJsOk5hKCIhJGV2ZW50LmN0cmxLZXkiKSxzaGlmdDpOYSgiISRldmVudC5zaGlmdEtleSIpLGFsdDpOYSgiISRldmVudC5hbHRLZXkiKSxtZXRhOk5hKCIhJGV2ZW50Lm1ldGFLZXkiKSxsZWZ0Ok5hKCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMCIpLG1pZGRsZTpOYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSxyaWdodDpOYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDIiKX07ZnVuY3Rpb24gRGEoZSx0KXt2YXIgbj10PyJuYXRpdmVPbjoiOiJvbjoiLHI9IiIsaT0iIjtmb3IodmFyIG8gaW4gZSl7dmFyIGE9TGEoZVtvXSk7ZVtvXSYmZVtvXS5keW5hbWljP2krPW8rIiwiK2ErIiwiOnIrPSciJytvKyciOicrYSsiLCJ9cmV0dXJuIHI9InsiK3Iuc2xpY2UoMCwtMSkrIn0iLGk/bisiX2QoIityKyIsWyIraS5zbGljZSgwLC0xKSsiXSkiOm4rcn1mdW5jdGlvbiBMYShlKXtpZighZSlyZXR1cm4iZnVuY3Rpb24oKXt9IjtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiJbIitlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTGEoZSl9KS5qb2luKCIsIikrIl0iO3ZhciB0PVNhLnRlc3QoZS52YWx1ZSksbj1BYS50ZXN0KGUudmFsdWUpLHI9U2EudGVzdChlLnZhbHVlLnJlcGxhY2UoT2EsIiIpKTtpZihlLm1vZGlmaWVycyl7dmFyIGk9IiIsbz0iIixhPVtdO2Zvcih2YXIgcyBpbiBlLm1vZGlmaWVycylpZihqYVtzXSlvKz1qYVtzXSxUYVtzXSYmYS5wdXNoKHMpO2Vsc2UgaWYoImV4YWN0Ij09PXMpe3ZhciBjPWUubW9kaWZpZXJzO28rPU5hKFsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hY1tlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJGV2ZW50LiIrZSsiS2V5In0pLmpvaW4oInx8IikpfWVsc2UgYS5wdXNoKHMpO3JldHVybiBhLmxlbmd0aCYmKGkrPWZ1bmN0aW9uKGUpe3JldHVybiJpZighJGV2ZW50LnR5cGUuaW5kZXhPZigna2V5JykmJiIrZS5tYXAoTWEpLmpvaW4oIiYmIikrIilyZXR1cm4gbnVsbDsifShhKSksbyYmKGkrPW8pLCJmdW5jdGlvbigkZXZlbnQpeyIraSsodD8icmV0dXJuICIrZS52YWx1ZSsiKCRldmVudCkiOm4/InJldHVybiAoIitlLnZhbHVlKyIpKCRldmVudCkiOnI/InJldHVybiAiK2UudmFsdWU6ZS52YWx1ZSkrIn0ifXJldHVybiB0fHxuP2UudmFsdWU6ImZ1bmN0aW9uKCRldmVudCl7Iisocj8icmV0dXJuICIrZS52YWx1ZTplLnZhbHVlKSsifSJ9ZnVuY3Rpb24gTWEoZSl7dmFyIHQ9cGFyc2VJbnQoZSwxMCk7aWYodClyZXR1cm4iJGV2ZW50LmtleUNvZGUhPT0iK3Q7dmFyIG49VGFbZV0scj1FYVtlXTtyZXR1cm4iX2soJGV2ZW50LmtleUNvZGUsIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkobikrIiwkZXZlbnQua2V5LCIrSlNPTi5zdHJpbmdpZnkocikrIikifXZhciBJYT17b246ZnVuY3Rpb24oZSx0KXtlLndyYXBMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIl9nKCIrZSsiLCIrdC52YWx1ZSsiKSJ9fSxiaW5kOmZ1bmN0aW9uKGUsdCl7ZS53cmFwRGF0YT1mdW5jdGlvbihuKXtyZXR1cm4iX2IoIituKyIsJyIrZS50YWcrIicsIit0LnZhbHVlKyIsIisodC5tb2RpZmllcnMmJnQubW9kaWZpZXJzLnByb3A/InRydWUiOiJmYWxzZSIpKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMuc3luYz8iLHRydWUiOiIiKSsiKSJ9fSxjbG9hazpTfSxGYT1mdW5jdGlvbihlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLndhcm49ZS53YXJufHxTcix0aGlzLnRyYW5zZm9ybXM9VHIoZS5tb2R1bGVzLCJ0cmFuc2Zvcm1Db2RlIiksdGhpcy5kYXRhR2VuRm5zPVRyKGUubW9kdWxlcywiZ2VuRGF0YSIpLHRoaXMuZGlyZWN0aXZlcz1BKEEoe30sSWEpLGUuZGlyZWN0aXZlcyk7dmFyIHQ9ZS5pc1Jlc2VydmVkVGFnfHxUO3RoaXMubWF5YmVDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmNvbXBvbmVudHx8IXQoZS50YWcpfSx0aGlzLm9uY2VJZD0wLHRoaXMuc3RhdGljUmVuZGVyRm5zPVtdLHRoaXMucHJlPSExfTtmdW5jdGlvbiBQYShlLHQpe3ZhciBuPW5ldyBGYSh0KTtyZXR1cm57cmVuZGVyOiJ3aXRoKHRoaXMpe3JldHVybiAiKyhlP1JhKGUsbik6J19jKCJkaXYiKScpKyJ9IixzdGF0aWNSZW5kZXJGbnM6bi5zdGF0aWNSZW5kZXJGbnN9fWZ1bmN0aW9uIFJhKGUsdCl7aWYoZS5wYXJlbnQmJihlLnByZT1lLnByZXx8ZS5wYXJlbnQucHJlKSxlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gSGEoZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIEJhKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0KTtpZihlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVWEoZSx0KTtpZigidGVtcGxhdGUiIT09ZS50YWd8fGUuc2xvdFRhcmdldHx8dC5wcmUpe2lmKCJzbG90Ij09PWUudGFnKXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2xvdE5hbWV8fCciZGVmYXVsdCInLHI9cWEoZSx0KSxpPSJfdCgiK24rKHI/IiwiK3I6IiIpLG89ZS5hdHRyc3x8ZS5keW5hbWljQXR0cnM/R2EoKGUuYXR0cnN8fFtdKS5jb25jYXQoZS5keW5hbWljQXR0cnN8fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6YihlLm5hbWUpLHZhbHVlOmUudmFsdWUsZHluYW1pYzplLmR5bmFtaWN9fSkpOm51bGwsYT1lLmF0dHJzTWFwWyJ2LWJpbmQiXTshbyYmIWF8fHJ8fChpKz0iLG51bGwiKTtvJiYoaSs9IiwiK28pO2EmJihpKz0obz8iIjoiLG51bGwiKSsiLCIrYSk7cmV0dXJuIGkrIikifShlLHQpO3ZhciBuO2lmKGUuY29tcG9uZW50KW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuaW5saW5lVGVtcGxhdGU/bnVsbDpxYSh0LG4sITApO3JldHVybiJfYygiK2UrIiwiK1ZhKHQsbikrKHI/IiwiK3I6IiIpKyIpIn0oZS5jb21wb25lbnQsZSx0KTtlbHNle3ZhciByOyghZS5wbGFpbnx8ZS5wcmUmJnQubWF5YmVDb21wb25lbnQoZSkpJiYocj1WYShlLHQpKTt2YXIgaT1lLmlubGluZVRlbXBsYXRlP251bGw6cWEoZSx0LCEwKTtuPSJfYygnIitlLnRhZysiJyIrKHI/IiwiK3I6IiIpKyhpPyIsIitpOiIiKSsiKSJ9Zm9yKHZhciBvPTA7bzx0LnRyYW5zZm9ybXMubGVuZ3RoO28rKyluPXQudHJhbnNmb3Jtc1tvXShlLG4pO3JldHVybiBufXJldHVybiBxYShlLHQpfHwidm9pZCAwIn1mdW5jdGlvbiBIYShlLHQpe2Uuc3RhdGljUHJvY2Vzc2VkPSEwO3ZhciBuPXQucHJlO3JldHVybiBlLnByZSYmKHQucHJlPWUucHJlKSx0LnN0YXRpY1JlbmRlckZucy5wdXNoKCJ3aXRoKHRoaXMpe3JldHVybiAiK1JhKGUsdCkrIn0iKSx0LnByZT1uLCJfbSgiKyh0LnN0YXRpY1JlbmRlckZucy5sZW5ndGgtMSkrKGUuc3RhdGljSW5Gb3I/Iix0cnVlIjoiIikrIikifWZ1bmN0aW9uIEJhKGUsdCl7aWYoZS5vbmNlUHJvY2Vzc2VkPSEwLGUuaWYmJiFlLmlmUHJvY2Vzc2VkKXJldHVybiBVYShlLHQpO2lmKGUuc3RhdGljSW5Gb3Ipe2Zvcih2YXIgbj0iIixyPWUucGFyZW50O3I7KXtpZihyLmZvcil7bj1yLmtleTticmVha31yPXIucGFyZW50fXJldHVybiBuPyJfbygiK1JhKGUsdCkrIiwiK3Qub25jZUlkKysrIiwiK24rIikiOlJhKGUsdCl9cmV0dXJuIEhhKGUsdCl9ZnVuY3Rpb24gVWEoZSx0LG4scil7cmV0dXJuIGUuaWZQcm9jZXNzZWQ9ITAsZnVuY3Rpb24gZSh0LG4scixpKXtpZighdC5sZW5ndGgpcmV0dXJuIGl8fCJfZSgpIjt2YXIgbz10LnNoaWZ0KCk7cmV0dXJuIG8uZXhwPyIoIitvLmV4cCsiKT8iK2Eoby5ibG9jaykrIjoiK2UodCxuLHIsaSk6IiIrYShvLmJsb2NrKTtmdW5jdGlvbiBhKGUpe3JldHVybiByP3IoZSxuKTplLm9uY2U/QmEoZSxuKTpSYShlLG4pfX0oZS5pZkNvbmRpdGlvbnMuc2xpY2UoKSx0LG4scil9ZnVuY3Rpb24gemEoZSx0LG4scil7dmFyIGk9ZS5mb3Isbz1lLmFsaWFzLGE9ZS5pdGVyYXRvcjE/IiwiK2UuaXRlcmF0b3IxOiIiLHM9ZS5pdGVyYXRvcjI/IiwiK2UuaXRlcmF0b3IyOiIiO3JldHVybiBlLmZvclByb2Nlc3NlZD0hMCwocnx8Il9sIikrIigoIitpKyIpLGZ1bmN0aW9uKCIrbythK3MrIil7cmV0dXJuICIrKG58fFJhKShlLHQpKyJ9KSJ9ZnVuY3Rpb24gVmEoZSx0KXt2YXIgbj0ieyIscj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZGlyZWN0aXZlcztpZighbilyZXR1cm47dmFyIHIsaSxvLGEscz0iZGlyZWN0aXZlczpbIixjPSExO2ZvcihyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXtvPW5bcl0sYT0hMDt2YXIgdT10LmRpcmVjdGl2ZXNbby5uYW1lXTt1JiYoYT0hIXUoZSxvLHQud2FybikpLGEmJihjPSEwLHMrPSd7bmFtZToiJytvLm5hbWUrJyIscmF3TmFtZToiJytvLnJhd05hbWUrJyInKyhvLnZhbHVlPyIsdmFsdWU6KCIrby52YWx1ZSsiKSxleHByZXNzaW9uOiIrSlNPTi5zdHJpbmdpZnkoby52YWx1ZSk6IiIpKyhvLmFyZz8iLGFyZzoiKyhvLmlzRHluYW1pY0FyZz9vLmFyZzonIicrby5hcmcrJyInKToiIikrKG8ubW9kaWZpZXJzPyIsbW9kaWZpZXJzOiIrSlNPTi5zdHJpbmdpZnkoby5tb2RpZmllcnMpOiIiKSsifSwiKX1pZihjKXJldHVybiBzLnNsaWNlKDAsLTEpKyJdIn0oZSx0KTtyJiYobis9cisiLCIpLGUua2V5JiYobis9ImtleToiK2Uua2V5KyIsIiksZS5yZWYmJihuKz0icmVmOiIrZS5yZWYrIiwiKSxlLnJlZkluRm9yJiYobis9InJlZkluRm9yOnRydWUsIiksZS5wcmUmJihuKz0icHJlOnRydWUsIiksZS5jb21wb25lbnQmJihuKz0ndGFnOiInK2UudGFnKyciLCcpO2Zvcih2YXIgaT0wO2k8dC5kYXRhR2VuRm5zLmxlbmd0aDtpKyspbis9dC5kYXRhR2VuRm5zW2ldKGUpO2lmKGUuYXR0cnMmJihuKz0iYXR0cnM6IitHYShlLmF0dHJzKSsiLCIpLGUucHJvcHMmJihuKz0iZG9tUHJvcHM6IitHYShlLnByb3BzKSsiLCIpLGUuZXZlbnRzJiYobis9RGEoZS5ldmVudHMsITEpKyIsIiksZS5uYXRpdmVFdmVudHMmJihuKz1EYShlLm5hdGl2ZUV2ZW50cywhMCkrIiwiKSxlLnNsb3RUYXJnZXQmJiFlLnNsb3RTY29wZSYmKG4rPSJzbG90OiIrZS5zbG90VGFyZ2V0KyIsIiksZS5zY29wZWRTbG90cyYmKG4rPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmZvcnx8T2JqZWN0LmtleXModCkuc29tZShmdW5jdGlvbihlKXt2YXIgbj10W2VdO3JldHVybiBuLnNsb3RUYXJnZXREeW5hbWljfHxuLmlmfHxuLmZvcnx8S2Eobil9KSxpPSEhZS5pZjtpZighcilmb3IodmFyIG89ZS5wYXJlbnQ7bzspe2lmKG8uc2xvdFNjb3BlJiZvLnNsb3RTY29wZSE9PWNhfHxvLmZvcil7cj0hMDticmVha31vLmlmJiYoaT0hMCksbz1vLnBhcmVudH12YXIgYT1PYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIEphKHRbZV0sbil9KS5qb2luKCIsIik7cmV0dXJuInNjb3BlZFNsb3RzOl91KFsiK2ErIl0iKyhyPyIsbnVsbCx0cnVlIjoiIikrKCFyJiZpPyIsbnVsbCxmYWxzZSwiK2Z1bmN0aW9uKGUpe3ZhciB0PTUzODEsbj1lLmxlbmd0aDtmb3IoO247KXQ9MzMqdF5lLmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gdD4+PjB9KGEpOiIiKSsiKSJ9KGUsZS5zY29wZWRTbG90cyx0KSsiLCIpLGUubW9kZWwmJihuKz0ibW9kZWw6e3ZhbHVlOiIrZS5tb2RlbC52YWx1ZSsiLGNhbGxiYWNrOiIrZS5tb2RlbC5jYWxsYmFjaysiLGV4cHJlc3Npb246IitlLm1vZGVsLmV4cHJlc3Npb24rIn0sIiksZS5pbmxpbmVUZW1wbGF0ZSl7dmFyIG89ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuWzBdO2lmKG4mJjE9PT1uLnR5cGUpe3ZhciByPVBhKG4sdC5vcHRpb25zKTtyZXR1cm4iaW5saW5lVGVtcGxhdGU6e3JlbmRlcjpmdW5jdGlvbigpeyIrci5yZW5kZXIrIn0sc3RhdGljUmVuZGVyRm5zOlsiK3Iuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24oKXsiK2UrIn0ifSkuam9pbigiLCIpKyJdfSJ9fShlLHQpO28mJihuKz1vKyIsIil9cmV0dXJuIG49bi5yZXBsYWNlKC8sJC8sIiIpKyJ9IixlLmR5bmFtaWNBdHRycyYmKG49Il9iKCIrbisnLCInK2UudGFnKyciLCcrR2EoZS5keW5hbWljQXR0cnMpKyIpIiksZS53cmFwRGF0YSYmKG49ZS53cmFwRGF0YShuKSksZS53cmFwTGlzdGVuZXJzJiYobj1lLndyYXBMaXN0ZW5lcnMobikpLG59ZnVuY3Rpb24gS2EoZSl7cmV0dXJuIDE9PT1lLnR5cGUmJigic2xvdCI9PT1lLnRhZ3x8ZS5jaGlsZHJlbi5zb21lKEthKSl9ZnVuY3Rpb24gSmEoZSx0KXt2YXIgbj1lLmF0dHJzTWFwWyJzbG90LXNjb3BlIl07aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQmJiFuKXJldHVybiBVYShlLHQsSmEsIm51bGwiKTtpZihlLmZvciYmIWUuZm9yUHJvY2Vzc2VkKXJldHVybiB6YShlLHQsSmEpO3ZhciByPWUuc2xvdFNjb3BlPT09Y2E/IiI6U3RyaW5nKGUuc2xvdFNjb3BlKSxpPSJmdW5jdGlvbigiK3IrIil7cmV0dXJuICIrKCJ0ZW1wbGF0ZSI9PT1lLnRhZz9lLmlmJiZuPyIoIitlLmlmKyIpPyIrKHFhKGUsdCl8fCJ1bmRlZmluZWQiKSsiOnVuZGVmaW5lZCI6cWEoZSx0KXx8InVuZGVmaW5lZCI6UmEoZSx0KSkrIn0iLG89cj8iIjoiLHByb3h5OnRydWUiO3JldHVybiJ7a2V5OiIrKGUuc2xvdFRhcmdldHx8JyJkZWZhdWx0IicpKyIsZm46IitpK28rIn0ifWZ1bmN0aW9uIHFhKGUsdCxuLHIsaSl7dmFyIG89ZS5jaGlsZHJlbjtpZihvLmxlbmd0aCl7dmFyIGE9b1swXTtpZigxPT09by5sZW5ndGgmJmEuZm9yJiYidGVtcGxhdGUiIT09YS50YWcmJiJzbG90IiE9PWEudGFnKXt2YXIgcz1uP3QubWF5YmVDb21wb25lbnQoYSk/IiwxIjoiLDAiOiIiO3JldHVybiIiKyhyfHxSYSkoYSx0KStzfXZhciBjPW4/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aWYoMT09PWkudHlwZSl7aWYoV2EoaSl8fGkuaWZDb25kaXRpb25zJiZpLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBXYShlLmJsb2NrKX0pKXtuPTI7YnJlYWt9KHQoaSl8fGkuaWZDb25kaXRpb25zJiZpLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUuYmxvY2spfSkpJiYobj0xKX19cmV0dXJuIG59KG8sdC5tYXliZUNvbXBvbmVudCk6MCx1PWl8fFphO3JldHVybiJbIitvLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdShlLHQpfSkuam9pbigiLCIpKyJdIisoYz8iLCIrYzoiIil9fWZ1bmN0aW9uIFdhKGUpe3JldHVybiB2b2lkIDAhPT1lLmZvcnx8InRlbXBsYXRlIj09PWUudGFnfHwic2xvdCI9PT1lLnRhZ31mdW5jdGlvbiBaYShlLHQpe3JldHVybiAxPT09ZS50eXBlP1JhKGUsdCk6Mz09PWUudHlwZSYmZS5pc0NvbW1lbnQ/KHI9ZSwiX2UoIitKU09OLnN0cmluZ2lmeShyLnRleHQpKyIpIik6Il92KCIrKDI9PT0obj1lKS50eXBlP24uZXhwcmVzc2lvbjpYYShKU09OLnN0cmluZ2lmeShuLnRleHQpKSkrIikiO3ZhciBuLHJ9ZnVuY3Rpb24gR2EoZSl7Zm9yKHZhciB0PSIiLG49IiIscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdLG89WGEoaS52YWx1ZSk7aS5keW5hbWljP24rPWkubmFtZSsiLCIrbysiLCI6dCs9JyInK2kubmFtZSsnIjonK28rIiwifXJldHVybiB0PSJ7Iit0LnNsaWNlKDAsLTEpKyJ9IixuPyJfZCgiK3QrIixbIituLnNsaWNlKDAsLTEpKyJdKSI6dH1mdW5jdGlvbiBYYShlKXtyZXR1cm4gZS5yZXBsYWNlKC9cdTIwMjgvZywiXFx1MjAyOCIpLnJlcGxhY2UoL1x1MjAyOS9nLCJcXHUyMDI5Iil9bmV3IFJlZ0V4cCgiXFxiIisiZG8saWYsZm9yLGxldCxuZXcsdHJ5LHZhcixjYXNlLGVsc2Usd2l0aCxhd2FpdCxicmVhayxjYXRjaCxjbGFzcyxjb25zdCxzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsZXh0ZW5kcyxmaW5hbGx5LGNvbnRpbnVlLGRlYnVnZ2VyLGZ1bmN0aW9uLGFyZ3VtZW50cyIuc3BsaXQoIiwiKS5qb2luKCJcXGJ8XFxiIikrIlxcYiIpO2Z1bmN0aW9uIFlhKGUsdCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oZSl9Y2F0Y2gobil7cmV0dXJuIHQucHVzaCh7ZXJyOm4sY29kZTplfSksU319ZnVuY3Rpb24gUWEoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obixyLGkpeyhyPUEoe30scikpLndhcm47ZGVsZXRlIHIud2Fybjt2YXIgbz1yLmRlbGltaXRlcnM/U3RyaW5nKHIuZGVsaW1pdGVycykrbjpuO2lmKHRbb10pcmV0dXJuIHRbb107dmFyIGE9ZShuLHIpLHM9e30sYz1bXTtyZXR1cm4gcy5yZW5kZXI9WWEoYS5yZW5kZXIsYykscy5zdGF0aWNSZW5kZXJGbnM9YS5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBZYShlLGMpfSksdFtvXT1zfX12YXIgZXMsdHMsbnM9KGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bGEoZS50cmltKCksdCk7ITEhPT10Lm9wdGltaXplJiZrYShuLHQpO3ZhciByPVBhKG4sdCk7cmV0dXJue2FzdDpuLHJlbmRlcjpyLnJlbmRlcixzdGF0aWNSZW5kZXJGbnM6ci5zdGF0aWNSZW5kZXJGbnN9fSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbil7dmFyIHI9T2JqZWN0LmNyZWF0ZShlKSxpPVtdLG89W107aWYobilmb3IodmFyIGEgaW4gbi5tb2R1bGVzJiYoci5tb2R1bGVzPShlLm1vZHVsZXN8fFtdKS5jb25jYXQobi5tb2R1bGVzKSksbi5kaXJlY3RpdmVzJiYoci5kaXJlY3RpdmVzPUEoT2JqZWN0LmNyZWF0ZShlLmRpcmVjdGl2ZXN8fG51bGwpLG4uZGlyZWN0aXZlcykpLG4pIm1vZHVsZXMiIT09YSYmImRpcmVjdGl2ZXMiIT09YSYmKHJbYV09blthXSk7ci53YXJuPWZ1bmN0aW9uKGUsdCxuKXsobj9vOmkpLnB1c2goZSl9O3ZhciBzPWVzKHQudHJpbSgpLHIpO3JldHVybiBzLmVycm9ycz1pLHMudGlwcz1vLHN9cmV0dXJue2NvbXBpbGU6dCxjb21waWxlVG9GdW5jdGlvbnM6UWEodCl9fSkoQ2EpLHJzPShucy5jb21waWxlLG5zLmNvbXBpbGVUb0Z1bmN0aW9ucyk7ZnVuY3Rpb24gaXMoZSl7cmV0dXJuKHRzPXRzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPWU/JzxhIGhyZWY9IlxuIi8+JzonPGRpdiBhPSJcbiIvPicsdHMuaW5uZXJIVE1MLmluZGV4T2YoIiYjMTA7Iik+MH12YXIgb3M9ISF6JiZpcyghMSksYXM9ISF6JiZpcyghMCksc3M9ZyhmdW5jdGlvbihlKXt2YXIgdD1ZbihlKTtyZXR1cm4gdCYmdC5pbm5lckhUTUx9KSxjcz13bi5wcm90b3R5cGUuJG1vdW50O3JldHVybiB3bi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7aWYoKGU9ZSYmWW4oZSkpPT09ZG9jdW1lbnQuYm9keXx8ZT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudClyZXR1cm4gdGhpczt2YXIgbj10aGlzLiRvcHRpb25zO2lmKCFuLnJlbmRlcil7dmFyIHI9bi50ZW1wbGF0ZTtpZihyKWlmKCJzdHJpbmciPT10eXBlb2YgcikiIyI9PT1yLmNoYXJBdCgwKSYmKHI9c3MocikpO2Vsc2V7aWYoIXIubm9kZVR5cGUpcmV0dXJuIHRoaXM7cj1yLmlubmVySFRNTH1lbHNlIGUmJihyPWZ1bmN0aW9uKGUpe2lmKGUub3V0ZXJIVE1MKXJldHVybiBlLm91dGVySFRNTDt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5hcHBlbmRDaGlsZChlLmNsb25lTm9kZSghMCkpLHQuaW5uZXJIVE1MfShlKSk7aWYocil7dmFyIGk9cnMocix7b3V0cHV0U291cmNlUmFuZ2U6ITEsc2hvdWxkRGVjb2RlTmV3bGluZXM6b3Msc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOmFzLGRlbGltaXRlcnM6bi5kZWxpbWl0ZXJzLGNvbW1lbnRzOm4uY29tbWVudHN9LHRoaXMpLG89aS5yZW5kZXIsYT1pLnN0YXRpY1JlbmRlckZucztuLnJlbmRlcj1vLG4uc3RhdGljUmVuZGVyRm5zPWF9fXJldHVybiBjcy5jYWxsKHRoaXMsZSx0KX0sd24uY29tcGlsZT1ycyx3bn0pOw=="},{"meta":{"name":"vuex.min.js","url":"https://cdn.jsdelivr.net/npm/vuex@3.4.0/dist/vuex.min.js","ts":1637743664268,"mimetype":"text/javascript"},"source":"LyohCiAqIHZ1ZXggdjMuNC4wCiAqIChjKSAyMDIwIEV2YW4gWW91CiAqIEBsaWNlbnNlIE1JVAogKi8KIWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9dHx8c2VsZikuVnVleD1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOnt9KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIGUodCxlKXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXtyZXR1cm4gZSh0W25dLG4pfSkpfWZ1bmN0aW9uIG4odCl7cmV0dXJuIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR9dmFyIG89ZnVuY3Rpb24odCxlKXt0aGlzLnJ1bnRpbWU9ZSx0aGlzLl9jaGlsZHJlbj1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX3Jhd01vZHVsZT10O3ZhciBuPXQuc3RhdGU7dGhpcy5zdGF0ZT0oImZ1bmN0aW9uIj09dHlwZW9mIG4/bigpOm4pfHx7fX0saT17bmFtZXNwYWNlZDp7Y29uZmlndXJhYmxlOiEwfX07aS5uYW1lc3BhY2VkLmdldD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWR9LG8ucHJvdG90eXBlLmFkZENoaWxkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fY2hpbGRyZW5bdF09ZX0sby5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RdfSxvLnByb3RvdHlwZS5nZXRDaGlsZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2hpbGRyZW5bdF19LG8ucHJvdG90eXBlLmhhc0NoaWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluIHRoaXMuX2NoaWxkcmVufSxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWQ9dC5uYW1lc3BhY2VkLHQuYWN0aW9ucyYmKHRoaXMuX3Jhd01vZHVsZS5hY3Rpb25zPXQuYWN0aW9ucyksdC5tdXRhdGlvbnMmJih0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zPXQubXV0YXRpb25zKSx0LmdldHRlcnMmJih0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycz10LmdldHRlcnMpfSxvLnByb3RvdHlwZS5mb3JFYWNoQ2hpbGQ9ZnVuY3Rpb24odCl7ZSh0aGlzLl9jaGlsZHJlbix0KX0sby5wcm90b3R5cGUuZm9yRWFjaEdldHRlcj1mdW5jdGlvbih0KXt0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycyYmZSh0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycyx0KX0sby5wcm90b3R5cGUuZm9yRWFjaEFjdGlvbj1mdW5jdGlvbih0KXt0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucyYmZSh0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucyx0KX0sby5wcm90b3R5cGUuZm9yRWFjaE11dGF0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMmJmUodGhpcy5fcmF3TW9kdWxlLm11dGF0aW9ucyx0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoby5wcm90b3R5cGUsaSk7dmFyIHIscz1mdW5jdGlvbih0KXt0aGlzLnJlZ2lzdGVyKFtdLHQsITEpfTtzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0LmdldENoaWxkKGUpfSksdGhpcy5yb290KX0scy5wcm90b3R5cGUuZ2V0TmFtZXNwYWNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucm9vdDtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQrKChlPWUuZ2V0Q2hpbGQobikpLm5hbWVzcGFjZWQ/bisiLyI6IiIpfSksIiIpfSxzLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uIHQoZSxuLG8pe2lmKG4udXBkYXRlKG8pLG8ubW9kdWxlcylmb3IodmFyIGkgaW4gby5tb2R1bGVzKXtpZighbi5nZXRDaGlsZChpKSlyZXR1cm47dChlLmNvbmNhdChpKSxuLmdldENoaWxkKGkpLG8ubW9kdWxlc1tpXSl9fShbXSx0aGlzLnJvb3QsdCl9LHMucHJvdG90eXBlLnJlZ2lzdGVyPWZ1bmN0aW9uKHQsbixpKXt2YXIgcj10aGlzO3ZvaWQgMD09PWkmJihpPSEwKTt2YXIgcz1uZXcgbyhuLGkpOzA9PT10Lmxlbmd0aD90aGlzLnJvb3Q9czp0aGlzLmdldCh0LnNsaWNlKDAsLTEpKS5hZGRDaGlsZCh0W3QubGVuZ3RoLTFdLHMpO24ubW9kdWxlcyYmZShuLm1vZHVsZXMsKGZ1bmN0aW9uKGUsbil7ci5yZWdpc3Rlcih0LmNvbmNhdChuKSxlLGkpfSkpfSxzLnByb3RvdHlwZS51bnJlZ2lzdGVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KHQuc2xpY2UoMCwtMSkpLG49dFt0Lmxlbmd0aC0xXTtlLmdldENoaWxkKG4pLnJ1bnRpbWUmJmUucmVtb3ZlQ2hpbGQobil9LHMucHJvdG90eXBlLmlzUmVnaXN0ZXJlZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldCh0LnNsaWNlKDAsLTEpKSxuPXRbdC5sZW5ndGgtMV07cmV0dXJuIGUuaGFzQ2hpbGQobil9O3ZhciBjPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dm9pZCAwPT09ZSYmKGU9e30pLCFyJiYidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LlZ1ZSYmbSh3aW5kb3cuVnVlKTt2YXIgbz1lLnBsdWdpbnM7dm9pZCAwPT09byYmKG89W10pO3ZhciBpPWUuc3RyaWN0O3ZvaWQgMD09PWkmJihpPSExKSx0aGlzLl9jb21taXR0aW5nPSExLHRoaXMuX2FjdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9hY3Rpb25TdWJzY3JpYmVycz1bXSx0aGlzLl9tdXRhdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl93cmFwcGVkR2V0dGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX21vZHVsZXM9bmV3IHMoZSksdGhpcy5fbW9kdWxlc05hbWVzcGFjZU1hcD1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX3N1YnNjcmliZXJzPVtdLHRoaXMuX3dhdGNoZXJWTT1uZXcgcix0aGlzLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgYz10aGlzLGE9dGhpcy5kaXNwYXRjaCx1PXRoaXMuY29tbWl0O3RoaXMuZGlzcGF0Y2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYS5jYWxsKGMsdCxlKX0sdGhpcy5jb21taXQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LmNhbGwoYyx0LGUsbil9LHRoaXMuc3RyaWN0PWk7dmFyIGY9dGhpcy5fbW9kdWxlcy5yb290LnN0YXRlO3AodGhpcyxmLFtdLHRoaXMuX21vZHVsZXMucm9vdCksaCh0aGlzLGYpLG8uZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQobil9KSksKHZvaWQgMCE9PWUuZGV2dG9vbHM/ZS5kZXZ0b29sczpyLmNvbmZpZy5kZXZ0b29scykmJmZ1bmN0aW9uKGUpe3QmJihlLl9kZXZ0b29sSG9vaz10LHQuZW1pdCgidnVleDppbml0IixlKSx0Lm9uKCJ2dWV4OnRyYXZlbC10by1zdGF0ZSIsKGZ1bmN0aW9uKHQpe2UucmVwbGFjZVN0YXRlKHQpfSkpLGUuc3Vic2NyaWJlKChmdW5jdGlvbihlLG4pe3QuZW1pdCgidnVleDptdXRhdGlvbiIsZSxuKX0pLHtwcmVwZW5kOiEwfSksZS5zdWJzY3JpYmVBY3Rpb24oKGZ1bmN0aW9uKGUsbil7dC5lbWl0KCJ2dWV4OmFjdGlvbiIsZSxuKX0pLHtwcmVwZW5kOiEwfSkpfSh0aGlzKX0sYT17c3RhdGU6e2NvbmZpZ3VyYWJsZTohMH19O2Z1bmN0aW9uIHUodCxlLG4pe3JldHVybiBlLmluZGV4T2YodCk8MCYmKG4mJm4ucHJlcGVuZD9lLnVuc2hpZnQodCk6ZS5wdXNoKHQpKSxmdW5jdGlvbigpe3ZhciBuPWUuaW5kZXhPZih0KTtuPi0xJiZlLnNwbGljZShuLDEpfX1mdW5jdGlvbiBmKHQsZSl7dC5fYWN0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLHQuX211dGF0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLHQuX3dyYXBwZWRHZXR0ZXJzPU9iamVjdC5jcmVhdGUobnVsbCksdC5fbW9kdWxlc05hbWVzcGFjZU1hcD1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBuPXQuc3RhdGU7cCh0LG4sW10sdC5fbW9kdWxlcy5yb290LCEwKSxoKHQsbixlKX1mdW5jdGlvbiBoKHQsbixvKXt2YXIgaT10Ll92bTt0LmdldHRlcnM9e30sdC5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCk7dmFyIHM9dC5fd3JhcHBlZEdldHRlcnMsYz17fTtlKHMsKGZ1bmN0aW9uKGUsbil7Y1tuXT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KGUpfX0oZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5nZXR0ZXJzLG4se2dldDpmdW5jdGlvbigpe3JldHVybiB0Ll92bVtuXX0sZW51bWVyYWJsZTohMH0pfSkpO3ZhciBhPXIuY29uZmlnLnNpbGVudDtyLmNvbmZpZy5zaWxlbnQ9ITAsdC5fdm09bmV3IHIoe2RhdGE6eyQkc3RhdGU6bn0sY29tcHV0ZWQ6Y30pLHIuY29uZmlnLnNpbGVudD1hLHQuc3RyaWN0JiZmdW5jdGlvbih0KXt0Ll92bS4kd2F0Y2goKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGEuJCRzdGF0ZX0pLChmdW5jdGlvbigpe30pLHtkZWVwOiEwLHN5bmM6ITB9KX0odCksaSYmKG8mJnQuX3dpdGhDb21taXQoKGZ1bmN0aW9uKCl7aS5fZGF0YS4kJHN0YXRlPW51bGx9KSksci5uZXh0VGljaygoZnVuY3Rpb24oKXtyZXR1cm4gaS4kZGVzdHJveSgpfSkpKX1mdW5jdGlvbiBwKHQsZSxuLG8saSl7dmFyIHM9IW4ubGVuZ3RoLGM9dC5fbW9kdWxlcy5nZXROYW1lc3BhY2Uobik7aWYoby5uYW1lc3BhY2VkJiYodC5fbW9kdWxlc05hbWVzcGFjZU1hcFtjXSx0Ll9tb2R1bGVzTmFtZXNwYWNlTWFwW2NdPW8pLCFzJiYhaSl7dmFyIGE9bChlLG4uc2xpY2UoMCwtMSkpLHU9bltuLmxlbmd0aC0xXTt0Ll93aXRoQ29tbWl0KChmdW5jdGlvbigpe3Iuc2V0KGEsdSxvLnN0YXRlKX0pKX12YXIgZj1vLmNvbnRleHQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPSIiPT09ZSxpPXtkaXNwYXRjaDpvP3QuZGlzcGF0Y2g6ZnVuY3Rpb24obixvLGkpe3ZhciByPWQobixvLGkpLHM9ci5wYXlsb2FkLGM9ci5vcHRpb25zLGE9ci50eXBlO3JldHVybiBjJiZjLnJvb3R8fChhPWUrYSksdC5kaXNwYXRjaChhLHMpfSxjb21taXQ6bz90LmNvbW1pdDpmdW5jdGlvbihuLG8saSl7dmFyIHI9ZChuLG8saSkscz1yLnBheWxvYWQsYz1yLm9wdGlvbnMsYT1yLnR5cGU7YyYmYy5yb290fHwoYT1lK2EpLHQuY29tbWl0KGEscyxjKX19O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLHtnZXR0ZXJzOntnZXQ6bz9mdW5jdGlvbigpe3JldHVybiB0LmdldHRlcnN9OmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIXQuX21ha2VMb2NhbEdldHRlcnNDYWNoZVtlXSl7dmFyIG49e30sbz1lLmxlbmd0aDtPYmplY3Qua2V5cyh0LmdldHRlcnMpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2lmKGkuc2xpY2UoMCxvKT09PWUpe3ZhciByPWkuc2xpY2Uobyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4scix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0dGVyc1tpXX0sZW51bWVyYWJsZTohMH0pfX0pKSx0Ll9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGVbZV09bn1yZXR1cm4gdC5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlW2VdfSh0LGUpfX0sc3RhdGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBsKHQuc3RhdGUsbil9fX0pLGl9KHQsYyxuKTtvLmZvckVhY2hNdXRhdGlvbigoZnVuY3Rpb24oZSxuKXshZnVuY3Rpb24odCxlLG4sbyl7KHQuX211dGF0aW9uc1tlXXx8KHQuX211dGF0aW9uc1tlXT1bXSkpLnB1c2goKGZ1bmN0aW9uKGUpe24uY2FsbCh0LG8uc3RhdGUsZSl9KSl9KHQsYytuLGUsZil9KSksby5mb3JFYWNoQWN0aW9uKChmdW5jdGlvbihlLG4pe3ZhciBvPWUucm9vdD9uOmMrbixpPWUuaGFuZGxlcnx8ZTshZnVuY3Rpb24odCxlLG4sbyl7KHQuX2FjdGlvbnNbZV18fCh0Ll9hY3Rpb25zW2VdPVtdKSkucHVzaCgoZnVuY3Rpb24oZSl7dmFyIGkscj1uLmNhbGwodCx7ZGlzcGF0Y2g6by5kaXNwYXRjaCxjb21taXQ6by5jb21taXQsZ2V0dGVyczpvLmdldHRlcnMsc3RhdGU6by5zdGF0ZSxyb290R2V0dGVyczp0LmdldHRlcnMscm9vdFN0YXRlOnQuc3RhdGV9LGUpO3JldHVybihpPXIpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS50aGVufHwocj1Qcm9taXNlLnJlc29sdmUocikpLHQuX2RldnRvb2xIb29rP3IuY2F0Y2goKGZ1bmN0aW9uKGUpe3Rocm93IHQuX2RldnRvb2xIb29rLmVtaXQoInZ1ZXg6ZXJyb3IiLGUpLGV9KSk6cn0pKX0odCxvLGksZil9KSksby5mb3JFYWNoR2V0dGVyKChmdW5jdGlvbihlLG4peyFmdW5jdGlvbih0LGUsbixvKXtpZih0Ll93cmFwcGVkR2V0dGVyc1tlXSlyZXR1cm47dC5fd3JhcHBlZEdldHRlcnNbZV09ZnVuY3Rpb24odCl7cmV0dXJuIG4oby5zdGF0ZSxvLmdldHRlcnMsdC5zdGF0ZSx0LmdldHRlcnMpfX0odCxjK24sZSxmKX0pKSxvLmZvckVhY2hDaGlsZCgoZnVuY3Rpb24obyxyKXtwKHQsZSxuLmNvbmNhdChyKSxvLGkpfSkpfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gZS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV19KSx0KX1mdW5jdGlvbiBkKHQsZSxvKXtyZXR1cm4gbih0KSYmdC50eXBlJiYobz1lLGU9dCx0PXQudHlwZSkse3R5cGU6dCxwYXlsb2FkOmUsb3B0aW9uczpvfX1mdW5jdGlvbiBtKHQpe3ImJnQ9PT1yfHxmdW5jdGlvbih0KXtpZihOdW1iZXIodC52ZXJzaW9uLnNwbGl0KCIuIilbMF0pPj0yKXQubWl4aW4oe2JlZm9yZUNyZWF0ZTpufSk7ZWxzZXt2YXIgZT10LnByb3RvdHlwZS5faW5pdDt0LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD17fSksdC5pbml0PXQuaW5pdD9bbl0uY29uY2F0KHQuaW5pdCk6bixlLmNhbGwodGhpcyx0KX19ZnVuY3Rpb24gbigpe3ZhciB0PXRoaXMuJG9wdGlvbnM7dC5zdG9yZT90aGlzLiRzdG9yZT0iZnVuY3Rpb24iPT10eXBlb2YgdC5zdG9yZT90LnN0b3JlKCk6dC5zdG9yZTp0LnBhcmVudCYmdC5wYXJlbnQuJHN0b3JlJiYodGhpcy4kc3RvcmU9dC5wYXJlbnQuJHN0b3JlKX19KHI9dCl9YS5zdGF0ZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdm0uX2RhdGEuJCRzdGF0ZX0sYS5zdGF0ZS5zZXQ9ZnVuY3Rpb24odCl7fSxjLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPXRoaXMsaT1kKHQsZSxuKSxyPWkudHlwZSxzPWkucGF5bG9hZCxjPXt0eXBlOnIscGF5bG9hZDpzfSxhPXRoaXMuX211dGF0aW9uc1tyXTthJiYodGhpcy5fd2l0aENvbW1pdCgoZnVuY3Rpb24oKXthLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Qocyl9KSl9KSksdGhpcy5fc3Vic2NyaWJlcnMuc2xpY2UoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdChjLG8uc3RhdGUpfSkpKX0sYy5wcm90b3R5cGUuZGlzcGF0Y2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLG89ZCh0LGUpLGk9by50eXBlLHI9by5wYXlsb2FkLHM9e3R5cGU6aSxwYXlsb2FkOnJ9LGM9dGhpcy5fYWN0aW9uc1tpXTtpZihjKXt0cnl7dGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMuc2xpY2UoKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJlZm9yZX0pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5iZWZvcmUocyxuLnN0YXRlKX0pKX1jYXRjaCh0KXt9dmFyIGE9Yy5sZW5ndGg+MT9Qcm9taXNlLmFsbChjLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQocil9KSkpOmNbMF0ocik7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LGUpe2EudGhlbigoZnVuY3Rpb24oZSl7dHJ5e24uX2FjdGlvblN1YnNjcmliZXJzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWZ0ZXJ9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWZ0ZXIocyxuLnN0YXRlKX0pKX1jYXRjaCh0KXt9dChlKX0pLChmdW5jdGlvbih0KXt0cnl7bi5fYWN0aW9uU3Vic2NyaWJlcnMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5lcnJvcn0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gZS5lcnJvcihzLG4uc3RhdGUsdCl9KSl9Y2F0Y2godCl7fWUodCl9KSl9KSl9fSxjLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0LHRoaXMuX3N1YnNjcmliZXJzLGUpfSxjLnByb3RvdHlwZS5zdWJzY3JpYmVBY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSgiZnVuY3Rpb24iPT10eXBlb2YgdD97YmVmb3JlOnR9OnQsdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMsZSl9LGMucHJvdG90eXBlLndhdGNoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz10aGlzO3JldHVybiB0aGlzLl93YXRjaGVyVk0uJHdhdGNoKChmdW5jdGlvbigpe3JldHVybiB0KG8uc3RhdGUsby5nZXR0ZXJzKX0pLGUsbil9LGMucHJvdG90eXBlLnJlcGxhY2VTdGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3dpdGhDb21taXQoKGZ1bmN0aW9uKCl7ZS5fdm0uX2RhdGEuJCRzdGF0ZT10fSkpfSxjLnByb3RvdHlwZS5yZWdpc3Rlck1vZHVsZT1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49e30pLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0aGlzLl9tb2R1bGVzLnJlZ2lzdGVyKHQsZSkscCh0aGlzLHRoaXMuc3RhdGUsdCx0aGlzLl9tb2R1bGVzLmdldCh0KSxuLnByZXNlcnZlU3RhdGUpLGgodGhpcyx0aGlzLnN0YXRlKX0sYy5wcm90b3R5cGUudW5yZWdpc3Rlck1vZHVsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0aGlzLl9tb2R1bGVzLnVucmVnaXN0ZXIodCksdGhpcy5fd2l0aENvbW1pdCgoZnVuY3Rpb24oKXt2YXIgbj1sKGUuc3RhdGUsdC5zbGljZSgwLC0xKSk7ci5kZWxldGUobix0W3QubGVuZ3RoLTFdKX0pKSxmKHRoaXMpfSxjLnByb3RvdHlwZS5oYXNNb2R1bGU9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHRoaXMuX21vZHVsZXMuaXNSZWdpc3RlcmVkKHQpfSxjLnByb3RvdHlwZS5ob3RVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxlcy51cGRhdGUodCksZih0aGlzLCEwKX0sYy5wcm90b3R5cGUuX3dpdGhDb21taXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29tbWl0dGluZzt0aGlzLl9jb21taXR0aW5nPSEwLHQoKSx0aGlzLl9jb21taXR0aW5nPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGMucHJvdG90eXBlLGEpO3ZhciB2PXcoKGZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGIoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89ZS5rZXksaT1lLnZhbDtuW29dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc3RvcmUuc3RhdGUsbj10aGlzLiRzdG9yZS5nZXR0ZXJzO2lmKHQpe3ZhciBvPSQodGhpcy4kc3RvcmUsIm1hcFN0YXRlIix0KTtpZighbylyZXR1cm47ZT1vLmNvbnRleHQuc3RhdGUsbj1vLmNvbnRleHQuZ2V0dGVyc31yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaT9pLmNhbGwodGhpcyxlLG4pOmVbaV19LG5bb10udnVleD0hMH0pKSxufSkpLF89dygoZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gYihlKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbz1lLmtleSxpPWUudmFsO25bb109ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspZVtuXT1hcmd1bWVudHNbbl07dmFyIG89dGhpcy4kc3RvcmUuY29tbWl0O2lmKHQpe3ZhciByPSQodGhpcy4kc3RvcmUsIm1hcE11dGF0aW9ucyIsdCk7aWYoIXIpcmV0dXJuO289ci5jb250ZXh0LmNvbW1pdH1yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsW29dLmNvbmNhdChlKSk6by5hcHBseSh0aGlzLiRzdG9yZSxbaV0uY29uY2F0KGUpKX19KSksbn0pKSx5PXcoKGZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGIoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89ZS5rZXksaT1lLnZhbDtpPXQraSxuW29dPWZ1bmN0aW9uKCl7aWYoIXR8fCQodGhpcy4kc3RvcmUsIm1hcEdldHRlcnMiLHQpKXJldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzW2ldfSxuW29dLnZ1ZXg9ITB9KSksbn0pKSxnPXcoKGZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGIoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89ZS5rZXksaT1lLnZhbDtuW29dPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KWVbbl09YXJndW1lbnRzW25dO3ZhciBvPXRoaXMuJHN0b3JlLmRpc3BhdGNoO2lmKHQpe3ZhciByPSQodGhpcy4kc3RvcmUsIm1hcEFjdGlvbnMiLHQpO2lmKCFyKXJldHVybjtvPXIuY29udGV4dC5kaXNwYXRjaH1yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsW29dLmNvbmNhdChlKSk6by5hcHBseSh0aGlzLiRzdG9yZSxbaV0uY29uY2F0KGUpKX19KSksbn0pKTtmdW5jdGlvbiBiKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KXx8bih0KX0odCk/QXJyYXkuaXNBcnJheSh0KT90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue2tleTp0LHZhbDp0fX0pKTpPYmplY3Qua2V5cyh0KS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybntrZXk6ZSx2YWw6dFtlXX19KSk6W119ZnVuY3Rpb24gdyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/KG49ZSxlPSIiKToiLyIhPT1lLmNoYXJBdChlLmxlbmd0aC0xKSYmKGUrPSIvIiksdChlLG4pfX1mdW5jdGlvbiAkKHQsZSxuKXtyZXR1cm4gdC5fbW9kdWxlc05hbWVzcGFjZU1hcFtuXX1yZXR1cm57U3RvcmU6YyxpbnN0YWxsOm0sdmVyc2lvbjoiMy40LjAiLG1hcFN0YXRlOnYsbWFwTXV0YXRpb25zOl8sbWFwR2V0dGVyczp5LG1hcEFjdGlvbnM6ZyxjcmVhdGVOYW1lc3BhY2VkSGVscGVyczpmdW5jdGlvbih0KXtyZXR1cm57bWFwU3RhdGU6di5iaW5kKG51bGwsdCksbWFwR2V0dGVyczp5LmJpbmQobnVsbCx0KSxtYXBNdXRhdGlvbnM6Xy5iaW5kKG51bGwsdCksbWFwQWN0aW9uczpnLmJpbmQobnVsbCx0KX19fX0pKTsK"},{"meta":{"name":"qrcode.min.js","url":"https://cdn.jsdelivr.net/npm/qrcode@1.4.4/build/qrcode.min.js","ts":1637743664267,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKHQpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9dCgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sdCk7ZWxzZXt2YXIgcjtyPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxyLlFSQ29kZT10KCl9fShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIHQocixlLG4pe2Z1bmN0aW9uIG8odSxhKXtpZighZVt1XSl7aWYoIXJbdV0pe3ZhciBmPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFhJiZmKXJldHVybiBmKHUsITApO2lmKGkpcmV0dXJuIGkodSwhMCk7dmFyIHM9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrdSsiJyIpO3Rocm93IHMuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsc312YXIgaD1lW3VdPXtleHBvcnRzOnt9fTtyW3VdWzBdLmNhbGwoaC5leHBvcnRzLGZ1bmN0aW9uKHQpe3JldHVybiBvKHJbdV1bMV1bdF18fHQpfSxoLGguZXhwb3J0cyx0LHIsZSxuKX1yZXR1cm4gZVt1XS5leHBvcnRzfWZvcih2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSx1PTA7dTxuLmxlbmd0aDt1KyspbyhuW3VdKTtyZXR1cm4gb31yZXR1cm4gdH0oKSh7MTpbZnVuY3Rpb24odCxyLGUpe3IuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlJiZQcm9taXNlLnByb3RvdHlwZSYmUHJvbWlzZS5wcm90b3R5cGUudGhlbn19LHt9XSwyOltmdW5jdGlvbih0LHIsZSl7dmFyIG49dCgiLi91dGlscyIpLmdldFN5bWJvbFNpemU7ZS5nZXRSb3dDb2xDb29yZHM9ZnVuY3Rpb24odCl7aWYoMT09PXQpcmV0dXJuW107Zm9yKHZhciByPU1hdGguZmxvb3IodC83KSsyLGU9bih0KSxvPTE0NT09PWU/MjY6MipNYXRoLmNlaWwoKGUtMTMpLygyKnItMikpLGk9W2UtN10sdT0xO3U8ci0xO3UrKylpW3VdPWlbdS0xXS1vO3JldHVybiBpLnB1c2goNiksaS5yZXZlcnNlKCl9LGUuZ2V0UG9zaXRpb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXSxuPWUuZ2V0Um93Q29sQ29vcmRzKHQpLG89bi5sZW5ndGgsaT0wO2k8bztpKyspZm9yKHZhciB1PTA7dTxvO3UrKykwPT09aSYmMD09PXV8fDA9PT1pJiZ1PT09by0xfHxpPT09by0xJiYwPT09dXx8ci5wdXNoKFtuW2ldLG5bdV1dKTtyZXR1cm4gcn19LHsiLi91dGlscyI6MjF9XSwzOltmdW5jdGlvbih0LHIsZSl7ZnVuY3Rpb24gbih0KXt0aGlzLm1vZGU9by5BTFBIQU5VTUVSSUMsdGhpcy5kYXRhPXR9dmFyIG89dCgiLi9tb2RlIiksaT1bIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiAiLCIkIiwiJSIsIioiLCIrIiwiLSIsIi4iLCIvIiwiOiJdO24uZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gMTEqTWF0aC5mbG9vcih0LzIpK3QlMio2fSxuLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmxlbmd0aH0sbi5wcm90b3R5cGUuZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiBuLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aCl9LG4ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciByO2ZvcihyPTA7cisyPD10aGlzLmRhdGEubGVuZ3RoO3IrPTIpe3ZhciBlPTQ1KmkuaW5kZXhPZih0aGlzLmRhdGFbcl0pO2UrPWkuaW5kZXhPZih0aGlzLmRhdGFbcisxXSksdC5wdXQoZSwxMSl9dGhpcy5kYXRhLmxlbmd0aCUyJiZ0LnB1dChpLmluZGV4T2YodGhpcy5kYXRhW3JdKSw2KX0sci5leHBvcnRzPW59LHsiLi9tb2RlIjoxNH1dLDQ6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKCl7dGhpcy5idWZmZXI9W10sdGhpcy5sZW5ndGg9MH1uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKHQpe3ZhciByPU1hdGguZmxvb3IodC84KTtyZXR1cm4gMT09KHRoaXMuYnVmZmVyW3JdPj4+Ny10JTgmMSl9LHB1dDpmdW5jdGlvbih0LHIpe2Zvcih2YXIgZT0wO2U8cjtlKyspdGhpcy5wdXRCaXQoMT09KHQ+Pj5yLWUtMSYxKSl9LGdldExlbmd0aEluQml0czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0scHV0Qml0OmZ1bmN0aW9uKHQpe3ZhciByPU1hdGguZmxvb3IodGhpcy5sZW5ndGgvOCk7dGhpcy5idWZmZXIubGVuZ3RoPD1yJiZ0aGlzLmJ1ZmZlci5wdXNoKDApLHQmJih0aGlzLmJ1ZmZlcltyXXw9MTI4Pj4+dGhpcy5sZW5ndGglOCksdGhpcy5sZW5ndGgrK319LHIuZXhwb3J0cz1ufSx7fV0sNTpbZnVuY3Rpb24odCxyLGUpe2Z1bmN0aW9uIG4odCl7aWYoIXR8fHQ8MSl0aHJvdyBuZXcgRXJyb3IoIkJpdE1hdHJpeCBzaXplIG11c3QgYmUgZGVmaW5lZCBhbmQgZ3JlYXRlciB0aGFuIDAiKTt0aGlzLnNpemU9dCx0aGlzLmRhdGE9by5hbGxvYyh0KnQpLHRoaXMucmVzZXJ2ZWRCaXQ9by5hbGxvYyh0KnQpfXZhciBvPXQoIi4uL3V0aWxzL2J1ZmZlciIpO24ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LHIsZSxuKXt2YXIgbz10KnRoaXMuc2l6ZStyO3RoaXMuZGF0YVtvXT1lLG4mJih0aGlzLnJlc2VydmVkQml0W29dPSEwKX0sbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMuZGF0YVt0KnRoaXMuc2l6ZStyXX0sbi5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQscixlKXt0aGlzLmRhdGFbdCp0aGlzLnNpemUrcl1ePWV9LG4ucHJvdG90eXBlLmlzUmVzZXJ2ZWQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5yZXNlcnZlZEJpdFt0KnRoaXMuc2l6ZStyXX0sci5leHBvcnRzPW59LHsiLi4vdXRpbHMvYnVmZmVyIjoyOH1dLDY6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQpe3RoaXMubW9kZT1pLkJZVEUsdGhpcy5kYXRhPW8uZnJvbSh0KX12YXIgbz10KCIuLi91dGlscy9idWZmZXIiKSxpPXQoIi4vbW9kZSIpO24uZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gOCp0fSxuLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmxlbmd0aH0sbi5wcm90b3R5cGUuZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiBuLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aCl9LG4ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wLGU9dGhpcy5kYXRhLmxlbmd0aDtyPGU7cisrKXQucHV0KHRoaXMuZGF0YVtyXSw4KX0sci5leHBvcnRzPW59LHsiLi4vdXRpbHMvYnVmZmVyIjoyOCwiLi9tb2RlIjoxNH1dLDc6W2Z1bmN0aW9uKHQscixlKXt2YXIgbj10KCIuL2Vycm9yLWNvcnJlY3Rpb24tbGV2ZWwiKSxvPVsxLDEsMSwxLDEsMSwxLDEsMSwxLDIsMiwxLDIsMiw0LDEsMiw0LDQsMiw0LDQsNCwyLDQsNiw1LDIsNCw2LDYsMiw1LDgsOCw0LDUsOCw4LDQsNSw4LDExLDQsOCwxMCwxMSw0LDksMTIsMTYsNCw5LDE2LDE2LDYsMTAsMTIsMTgsNiwxMCwxNywxNiw2LDExLDE2LDE5LDYsMTMsMTgsMjEsNywxNCwyMSwyNSw4LDE2LDIwLDI1LDgsMTcsMjMsMjUsOSwxNywyMywzNCw5LDE4LDI1LDMwLDEwLDIwLDI3LDMyLDEyLDIxLDI5LDM1LDEyLDIzLDM0LDM3LDEyLDI1LDM0LDQwLDEzLDI2LDM1LDQyLDE0LDI4LDM4LDQ1LDE1LDI5LDQwLDQ4LDE2LDMxLDQzLDUxLDE3LDMzLDQ1LDU0LDE4LDM1LDQ4LDU3LDE5LDM3LDUxLDYwLDE5LDM4LDUzLDYzLDIwLDQwLDU2LDY2LDIxLDQzLDU5LDcwLDIyLDQ1LDYyLDc0LDI0LDQ3LDY1LDc3LDI1LDQ5LDY4LDgxXSxpPVs3LDEwLDEzLDE3LDEwLDE2LDIyLDI4LDE1LDI2LDM2LDQ0LDIwLDM2LDUyLDY0LDI2LDQ4LDcyLDg4LDM2LDY0LDk2LDExMiw0MCw3MiwxMDgsMTMwLDQ4LDg4LDEzMiwxNTYsNjAsMTEwLDE2MCwxOTIsNzIsMTMwLDE5MiwyMjQsODAsMTUwLDIyNCwyNjQsOTYsMTc2LDI2MCwzMDgsMTA0LDE5OCwyODgsMzUyLDEyMCwyMTYsMzIwLDM4NCwxMzIsMjQwLDM2MCw0MzIsMTQ0LDI4MCw0MDgsNDgwLDE2OCwzMDgsNDQ4LDUzMiwxODAsMzM4LDUwNCw1ODgsMTk2LDM2NCw1NDYsNjUwLDIyNCw0MTYsNjAwLDcwMCwyMjQsNDQyLDY0NCw3NTAsMjUyLDQ3Niw2OTAsODE2LDI3MCw1MDQsNzUwLDkwMCwzMDAsNTYwLDgxMCw5NjAsMzEyLDU4OCw4NzAsMTA1MCwzMzYsNjQ0LDk1MiwxMTEwLDM2MCw3MDAsMTAyMCwxMjAwLDM5MCw3MjgsMTA1MCwxMjYwLDQyMCw3ODQsMTE0MCwxMzUwLDQ1MCw4MTIsMTIwMCwxNDQwLDQ4MCw4NjgsMTI5MCwxNTMwLDUxMCw5MjQsMTM1MCwxNjIwLDU0MCw5ODAsMTQ0MCwxNzEwLDU3MCwxMDM2LDE1MzAsMTgwMCw1NzAsMTA2NCwxNTkwLDE4OTAsNjAwLDExMjAsMTY4MCwxOTgwLDYzMCwxMjA0LDE3NzAsMjEwMCw2NjAsMTI2MCwxODYwLDIyMjAsNzIwLDEzMTYsMTk1MCwyMzEwLDc1MCwxMzcyLDIwNDAsMjQzMF07ZS5nZXRCbG9ja3NDb3VudD1mdW5jdGlvbih0LHIpe3N3aXRjaChyKXtjYXNlIG4uTDpyZXR1cm4gb1s0Kih0LTEpKzBdO2Nhc2Ugbi5NOnJldHVybiBvWzQqKHQtMSkrMV07Y2FzZSBuLlE6cmV0dXJuIG9bNCoodC0xKSsyXTtjYXNlIG4uSDpyZXR1cm4gb1s0Kih0LTEpKzNdO2RlZmF1bHQ6cmV0dXJufX0sZS5nZXRUb3RhbENvZGV3b3Jkc0NvdW50PWZ1bmN0aW9uKHQscil7c3dpdGNoKHIpe2Nhc2Ugbi5MOnJldHVybiBpWzQqKHQtMSkrMF07Y2FzZSBuLk06cmV0dXJuIGlbNCoodC0xKSsxXTtjYXNlIG4uUTpyZXR1cm4gaVs0Kih0LTEpKzJdO2Nhc2Ugbi5IOnJldHVybiBpWzQqKHQtMSkrM107ZGVmYXVsdDpyZXR1cm59fX0seyIuL2Vycm9yLWNvcnJlY3Rpb24tbGV2ZWwiOjh9XSw4OltmdW5jdGlvbih0LHIsZSl7ZnVuY3Rpb24gbih0KXtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJQYXJhbSBpcyBub3QgYSBzdHJpbmciKTtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImwiOmNhc2UibG93IjpyZXR1cm4gZS5MO2Nhc2UibSI6Y2FzZSJtZWRpdW0iOnJldHVybiBlLk07Y2FzZSJxIjpjYXNlInF1YXJ0aWxlIjpyZXR1cm4gZS5RO2Nhc2UiaCI6Y2FzZSJoaWdoIjpyZXR1cm4gZS5IO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEVDIExldmVsOiAiK3QpfX1lLkw9e2JpdDoxfSxlLk09e2JpdDowfSxlLlE9e2JpdDozfSxlLkg9e2JpdDoyfSxlLmlzVmFsaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnZvaWQgMCE9PXQuYml0JiZ0LmJpdD49MCYmdC5iaXQ8NH0sZS5mcm9tPWZ1bmN0aW9uKHQscil7aWYoZS5pc1ZhbGlkKHQpKXJldHVybiB0O3RyeXtyZXR1cm4gbih0KX1jYXRjaCh0KXtyZXR1cm4gcn19fSx7fV0sOTpbZnVuY3Rpb24odCxyLGUpe3ZhciBuPXQoIi4vdXRpbHMiKS5nZXRTeW1ib2xTaXplO2UuZ2V0UG9zaXRpb25zPWZ1bmN0aW9uKHQpe3ZhciByPW4odCk7cmV0dXJuW1swLDBdLFtyLTcsMF0sWzAsci03XV19fSx7Ii4vdXRpbHMiOjIxfV0sMTA6W2Z1bmN0aW9uKHQscixlKXt2YXIgbj10KCIuL3V0aWxzIiksbz1uLmdldEJDSERpZ2l0KDEzMzUpO2UuZ2V0RW5jb2RlZEJpdHM9ZnVuY3Rpb24odCxyKXtmb3IodmFyIGU9dC5iaXQ8PDN8cixpPWU8PDEwO24uZ2V0QkNIRGlnaXQoaSktbz49MDspaV49MTMzNTw8bi5nZXRCQ0hEaWdpdChpKS1vO3JldHVybiAyMTUyMl4oZTw8MTB8aSl9fSx7Ii4vdXRpbHMiOjIxfV0sMTE6W2Z1bmN0aW9uKHQscixlKXt2YXIgbj10KCIuLi91dGlscy9idWZmZXIiKSxvPW4uYWxsb2MoNTEyKSxpPW4uYWxsb2MoMjU2KTshZnVuY3Rpb24oKXtmb3IodmFyIHQ9MSxyPTA7cjwyNTU7cisrKW9bcl09dCxpW3RdPXIsMjU2Jih0PDw9MSkmJih0Xj0yODUpO2ZvcihyPTI1NTtyPDUxMjtyKyspb1tyXT1vW3ItMjU1XX0oKSxlLmxvZz1mdW5jdGlvbih0KXtpZih0PDEpdGhyb3cgbmV3IEVycm9yKCJsb2coIit0KyIpIik7cmV0dXJuIGlbdF19LGUuZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfSxlLm11bD1mdW5jdGlvbih0LHIpe3JldHVybiAwPT09dHx8MD09PXI/MDpvW2lbdF0raVtyXV19fSx7Ii4uL3V0aWxzL2J1ZmZlciI6Mjh9XSwxMjpbZnVuY3Rpb24odCxyLGUpe2Z1bmN0aW9uIG4odCl7dGhpcy5tb2RlPW8uS0FOSkksdGhpcy5kYXRhPXR9dmFyIG89dCgiLi9tb2RlIiksaT10KCIuL3V0aWxzIik7bi5nZXRCaXRzTGVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiAxMyp0fSxuLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmxlbmd0aH0sbi5wcm90b3R5cGUuZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiBuLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aCl9LG4ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciByO2ZvcihyPTA7cjx0aGlzLmRhdGEubGVuZ3RoO3IrKyl7dmFyIGU9aS50b1NKSVModGhpcy5kYXRhW3JdKTtpZihlPj0zMzA4OCYmZTw9NDA5NTYpZS09MzMwODg7ZWxzZXtpZighKGU+PTU3NDA4JiZlPD02MDM1MSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNKSVMgY2hhcmFjdGVyOiAiK3RoaXMuZGF0YVtyXSsiXG5NYWtlIHN1cmUgeW91ciBjaGFyc2V0IGlzIFVURi04Iik7ZS09NDk0NzJ9ZT0xOTIqKGU+Pj44JjI1NSkrKDI1NSZlKSx0LnB1dChlLDEzKX19LHIuZXhwb3J0cz1ufSx7Ii4vbW9kZSI6MTQsIi4vdXRpbHMiOjIxfV0sMTM6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQscixuKXtzd2l0Y2godCl7Y2FzZSBlLlBhdHRlcm5zLlBBVFRFUk4wMDA6cmV0dXJuKHIrbiklMj09MDtjYXNlIGUuUGF0dGVybnMuUEFUVEVSTjAwMTpyZXR1cm4gciUyPT0wO2Nhc2UgZS5QYXR0ZXJucy5QQVRURVJOMDEwOnJldHVybiBuJTM9PTA7Y2FzZSBlLlBhdHRlcm5zLlBBVFRFUk4wMTE6cmV0dXJuKHIrbiklMz09MDtjYXNlIGUuUGF0dGVybnMuUEFUVEVSTjEwMDpyZXR1cm4oTWF0aC5mbG9vcihyLzIpK01hdGguZmxvb3Iobi8zKSklMj09MDtjYXNlIGUuUGF0dGVybnMuUEFUVEVSTjEwMTpyZXR1cm4gcipuJTIrcipuJTM9PTA7Y2FzZSBlLlBhdHRlcm5zLlBBVFRFUk4xMTA6cmV0dXJuKHIqbiUyK3IqbiUzKSUyPT0wO2Nhc2UgZS5QYXR0ZXJucy5QQVRURVJOMTExOnJldHVybihyKm4lMysocituKSUyKSUyPT0wO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJiYWQgbWFza1BhdHRlcm46Iit0KX19ZS5QYXR0ZXJucz17UEFUVEVSTjAwMDowLFBBVFRFUk4wMDE6MSxQQVRURVJOMDEwOjIsUEFUVEVSTjAxMTozLFBBVFRFUk4xMDA6NCxQQVRURVJOMTAxOjUsUEFUVEVSTjExMDo2LFBBVFRFUk4xMTE6N307dmFyIG89e04xOjMsTjI6MyxOMzo0MCxONDoxMH07ZS5pc1ZhbGlkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYiIiE9PXQmJiFpc05hTih0KSYmdD49MCYmdDw9N30sZS5mcm9tPWZ1bmN0aW9uKHQpe3JldHVybiBlLmlzVmFsaWQodCk/cGFyc2VJbnQodCwxMCk6dm9pZCAwfSxlLmdldFBlbmFsdHlOMT1mdW5jdGlvbih0KXtmb3IodmFyIHI9dC5zaXplLGU9MCxuPTAsaT0wLHU9bnVsbCxhPW51bGwsZj0wO2Y8cjtmKyspe249aT0wLHU9YT1udWxsO2Zvcih2YXIgcz0wO3M8cjtzKyspe3ZhciBoPXQuZ2V0KGYscyk7aD09PXU/bisrOihuPj01JiYoZSs9by5OMSsobi01KSksdT1oLG49MSksaD10LmdldChzLGYpLGg9PT1hP2krKzooaT49NSYmKGUrPW8uTjErKGktNSkpLGE9aCxpPTEpfW4+PTUmJihlKz1vLk4xKyhuLTUpKSxpPj01JiYoZSs9by5OMSsoaS01KSl9cmV0dXJuIGV9LGUuZ2V0UGVuYWx0eU4yPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj10LnNpemUsZT0wLG49MDtuPHItMTtuKyspZm9yKHZhciBpPTA7aTxyLTE7aSsrKXt2YXIgdT10LmdldChuLGkpK3QuZ2V0KG4saSsxKSt0LmdldChuKzEsaSkrdC5nZXQobisxLGkrMSk7NCE9PXUmJjAhPT11fHxlKyt9cmV0dXJuIGUqby5OMn0sZS5nZXRQZW5hbHR5TjM9ZnVuY3Rpb24odCl7Zm9yKHZhciByPXQuc2l6ZSxlPTAsbj0wLGk9MCx1PTA7dTxyO3UrKyl7bj1pPTA7Zm9yKHZhciBhPTA7YTxyO2ErKyluPW48PDEmMjA0N3x0LmdldCh1LGEpLGE+PTEwJiYoMTQ4OD09PW58fDkzPT09bikmJmUrKyxpPWk8PDEmMjA0N3x0LmdldChhLHUpLGE+PTEwJiYoMTQ4OD09PWl8fDkzPT09aSkmJmUrK31yZXR1cm4gZSpvLk4zfSxlLmdldFBlbmFsdHlOND1mdW5jdGlvbih0KXtmb3IodmFyIHI9MCxlPXQuZGF0YS5sZW5ndGgsbj0wO248ZTtuKyspcis9dC5kYXRhW25dO3JldHVybiBNYXRoLmFicyhNYXRoLmNlaWwoMTAwKnIvZS81KS0xMCkqby5ONH0sZS5hcHBseU1hc2s9ZnVuY3Rpb24odCxyKXtmb3IodmFyIGU9ci5zaXplLG89MDtvPGU7bysrKWZvcih2YXIgaT0wO2k8ZTtpKyspci5pc1Jlc2VydmVkKGksbyl8fHIueG9yKGksbyxuKHQsaSxvKSl9LGUuZ2V0QmVzdE1hc2s9ZnVuY3Rpb24odCxyKXtmb3IodmFyIG49T2JqZWN0LmtleXMoZS5QYXR0ZXJucykubGVuZ3RoLG89MCxpPTEvMCx1PTA7dTxuO3UrKyl7cih1KSxlLmFwcGx5TWFzayh1LHQpO3ZhciBhPWUuZ2V0UGVuYWx0eU4xKHQpK2UuZ2V0UGVuYWx0eU4yKHQpK2UuZ2V0UGVuYWx0eU4zKHQpK2UuZ2V0UGVuYWx0eU40KHQpO2UuYXBwbHlNYXNrKHUsdCksYTxpJiYoaT1hLG89dSl9cmV0dXJuIG99fSx7fV0sMTQ6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIlBhcmFtIGlzIG5vdCBhIHN0cmluZyIpO3N3aXRjaCh0LnRvTG93ZXJDYXNlKCkpe2Nhc2UibnVtZXJpYyI6cmV0dXJuIGUuTlVNRVJJQztjYXNlImFscGhhbnVtZXJpYyI6cmV0dXJuIGUuQUxQSEFOVU1FUklDO2Nhc2Uia2FuamkiOnJldHVybiBlLktBTkpJO2Nhc2UiYnl0ZSI6cmV0dXJuIGUuQllURTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBtb2RlOiAiK3QpfX12YXIgbz10KCIuL3ZlcnNpb24tY2hlY2siKSxpPXQoIi4vcmVnZXgiKTtlLk5VTUVSSUM9e2lkOiJOdW1lcmljIixiaXQ6MSxjY0JpdHM6WzEwLDEyLDE0XX0sZS5BTFBIQU5VTUVSSUM9e2lkOiJBbHBoYW51bWVyaWMiLGJpdDoyLGNjQml0czpbOSwxMSwxM119LGUuQllURT17aWQ6IkJ5dGUiLGJpdDo0LGNjQml0czpbOCwxNiwxNl19LGUuS0FOSkk9e2lkOiJLYW5qaSIsYml0OjgsY2NCaXRzOls4LDEwLDEyXX0sZS5NSVhFRD17Yml0Oi0xfSxlLmdldENoYXJDb3VudEluZGljYXRvcj1mdW5jdGlvbih0LHIpe2lmKCF0LmNjQml0cyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbW9kZTogIit0KTtpZighby5pc1ZhbGlkKHIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2ZXJzaW9uOiAiK3IpO3JldHVybiByPj0xJiZyPDEwP3QuY2NCaXRzWzBdOnI8Mjc/dC5jY0JpdHNbMV06dC5jY0JpdHNbMl19LGUuZ2V0QmVzdE1vZGVGb3JEYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBpLnRlc3ROdW1lcmljKHQpP2UuTlVNRVJJQzppLnRlc3RBbHBoYW51bWVyaWModCk/ZS5BTFBIQU5VTUVSSUM6aS50ZXN0S2FuamkodCk/ZS5LQU5KSTplLkJZVEV9LGUudG9TdHJpbmc9ZnVuY3Rpb24odCl7aWYodCYmdC5pZClyZXR1cm4gdC5pZDt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbW9kZSIpfSxlLmlzVmFsaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuYml0JiZ0LmNjQml0c30sZS5mcm9tPWZ1bmN0aW9uKHQscil7aWYoZS5pc1ZhbGlkKHQpKXJldHVybiB0O3RyeXtyZXR1cm4gbih0KX1jYXRjaCh0KXtyZXR1cm4gcn19fSx7Ii4vcmVnZXgiOjE5LCIuL3ZlcnNpb24tY2hlY2siOjIyfV0sMTU6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQpe3RoaXMubW9kZT1vLk5VTUVSSUMsdGhpcy5kYXRhPXQudG9TdHJpbmcoKX12YXIgbz10KCIuL21vZGUiKTtuLmdldEJpdHNMZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIDEwKk1hdGguZmxvb3IodC8zKSsodCUzP3QlMyozKzE6MCl9LG4ucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEubGVuZ3RofSxuLnByb3RvdHlwZS5nZXRCaXRzTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0Qml0c0xlbmd0aCh0aGlzLmRhdGEubGVuZ3RoKX0sbi5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dmFyIHIsZSxuO2ZvcihyPTA7ciszPD10aGlzLmRhdGEubGVuZ3RoO3IrPTMpZT10aGlzLmRhdGEuc3Vic3RyKHIsMyksbj1wYXJzZUludChlLDEwKSx0LnB1dChuLDEwKTt2YXIgbz10aGlzLmRhdGEubGVuZ3RoLXI7bz4wJiYoZT10aGlzLmRhdGEuc3Vic3RyKHIpLG49cGFyc2VJbnQoZSwxMCksdC5wdXQobiwzKm8rMSkpfSxyLmV4cG9ydHM9bn0seyIuL21vZGUiOjE0fV0sMTY6W2Z1bmN0aW9uKHQscixlKXt2YXIgbj10KCIuLi91dGlscy9idWZmZXIiKSxvPXQoIi4vZ2Fsb2lzLWZpZWxkIik7ZS5tdWw9ZnVuY3Rpb24odCxyKXtmb3IodmFyIGU9bi5hbGxvYyh0Lmxlbmd0aCtyLmxlbmd0aC0xKSxpPTA7aTx0Lmxlbmd0aDtpKyspZm9yKHZhciB1PTA7dTxyLmxlbmd0aDt1KyspZVtpK3VdXj1vLm11bCh0W2ldLHJbdV0pO3JldHVybiBlfSxlLm1vZD1mdW5jdGlvbih0LHIpe2Zvcih2YXIgZT1uLmZyb20odCk7ZS5sZW5ndGgtci5sZW5ndGg+PTA7KXtmb3IodmFyIGk9ZVswXSx1PTA7dTxyLmxlbmd0aDt1KyspZVt1XV49by5tdWwoclt1XSxpKTtmb3IodmFyIGE9MDthPGUubGVuZ3RoJiYwPT09ZVthXTspYSsrO2U9ZS5zbGljZShhKX1yZXR1cm4gZX0sZS5nZW5lcmF0ZUVDUG9seW5vbWlhbD1mdW5jdGlvbih0KXtmb3IodmFyIHI9bi5mcm9tKFsxXSksaT0wO2k8dDtpKyspcj1lLm11bChyLFsxLG8uZXhwKGkpXSk7cmV0dXJuIHJ9fSx7Ii4uL3V0aWxzL2J1ZmZlciI6MjgsIi4vZ2Fsb2lzLWZpZWxkIjoxMX1dLDE3OltmdW5jdGlvbih0LHIsZSl7ZnVuY3Rpb24gbih0LHIpe2Zvcih2YXIgZT10LnNpemUsbj13LmdldFBvc2l0aW9ucyhyKSxvPTA7bzxuLmxlbmd0aDtvKyspZm9yKHZhciBpPW5bb11bMF0sdT1uW29dWzFdLGE9LTE7YTw9NzthKyspaWYoIShpK2E8PS0xfHxlPD1pK2EpKWZvcih2YXIgZj0tMTtmPD03O2YrKyl1K2Y8PS0xfHxlPD11K2Z8fChhPj0wJiZhPD02JiYoMD09PWZ8fDY9PT1mKXx8Zj49MCYmZjw9NiYmKDA9PT1hfHw2PT09YSl8fGE+PTImJmE8PTQmJmY+PTImJmY8PTQ/dC5zZXQoaSthLHUrZiwhMCwhMCk6dC5zZXQoaSthLHUrZiwhMSwhMCkpfWZ1bmN0aW9uIG8odCl7Zm9yKHZhciByPXQuc2l6ZSxlPTg7ZTxyLTg7ZSsrKXt2YXIgbj1lJTI9PTA7dC5zZXQoZSw2LG4sITApLHQuc2V0KDYsZSxuLCEwKX19ZnVuY3Rpb24gaSh0LHIpe2Zvcih2YXIgZT12LmdldFBvc2l0aW9ucyhyKSxuPTA7bjxlLmxlbmd0aDtuKyspZm9yKHZhciBvPWVbbl1bMF0saT1lW25dWzFdLHU9LTI7dTw9Mjt1KyspZm9yKHZhciBhPS0yO2E8PTI7YSsrKS0yPT09dXx8Mj09PXV8fC0yPT09YXx8Mj09PWF8fDA9PT11JiYwPT09YT90LnNldChvK3UsaSthLCEwLCEwKTp0LnNldChvK3UsaSthLCExLCEwKX1mdW5jdGlvbiB1KHQscil7Zm9yKHZhciBlLG4sbyxpPXQuc2l6ZSx1PUEuZ2V0RW5jb2RlZEJpdHMociksYT0wO2E8MTg7YSsrKWU9TWF0aC5mbG9vcihhLzMpLG49YSUzK2ktOC0zLG89MT09KHU+PmEmMSksdC5zZXQoZSxuLG8sITApLHQuc2V0KG4sZSxvLCEwKX1mdW5jdGlvbiBhKHQscixlKXt2YXIgbixvLGk9dC5zaXplLHU9Qi5nZXRFbmNvZGVkQml0cyhyLGUpO2ZvcihuPTA7bjwxNTtuKyspbz0xPT0odT4+biYxKSxuPDY/dC5zZXQobiw4LG8sITApOm48OD90LnNldChuKzEsOCxvLCEwKTp0LnNldChpLTE1K24sOCxvLCEwKSxuPDg/dC5zZXQoOCxpLW4tMSxvLCEwKTpuPDk/dC5zZXQoOCwxNS1uLTErMSxvLCEwKTp0LnNldCg4LDE1LW4tMSxvLCEwKTt0LnNldChpLTgsOCwxLCEwKX1mdW5jdGlvbiBmKHQscil7Zm9yKHZhciBlPXQuc2l6ZSxuPS0xLG89ZS0xLGk9Nyx1PTAsYT1lLTE7YT4wO2EtPTIpZm9yKDY9PT1hJiZhLS07Oyl7Zm9yKHZhciBmPTA7ZjwyO2YrKylpZighdC5pc1Jlc2VydmVkKG8sYS1mKSl7dmFyIHM9ITE7dTxyLmxlbmd0aCYmKHM9MT09KHJbdV0+Pj5pJjEpKSx0LnNldChvLGEtZixzKSxpLS0sLTE9PT1pJiYodSsrLGk9Nyl9aWYoKG8rPW4pPDB8fGU8PW8pe28tPW4sbj0tbjticmVha319fWZ1bmN0aW9uIHModCxyLGUpe3ZhciBuPW5ldyBkO2UuZm9yRWFjaChmdW5jdGlvbihyKXtuLnB1dChyLm1vZGUuYml0LDQpLG4ucHV0KHIuZ2V0TGVuZ3RoKCksVC5nZXRDaGFyQ291bnRJbmRpY2F0b3Ioci5tb2RlLHQpKSxyLndyaXRlKG4pfSk7dmFyIG89Zy5nZXRTeW1ib2xUb3RhbENvZGV3b3Jkcyh0KSxpPWIuZ2V0VG90YWxDb2Rld29yZHNDb3VudCh0LHIpLHU9OCooby1pKTtmb3Iobi5nZXRMZW5ndGhJbkJpdHMoKSs0PD11JiZuLnB1dCgwLDQpO24uZ2V0TGVuZ3RoSW5CaXRzKCklOCE9MDspbi5wdXRCaXQoMCk7Zm9yKHZhciBhPSh1LW4uZ2V0TGVuZ3RoSW5CaXRzKCkpLzgsZj0wO2Y8YTtmKyspbi5wdXQoZiUyPzE3OjIzNiw4KTtyZXR1cm4gaChuLHQscil9ZnVuY3Rpb24gaCh0LHIsZSl7Zm9yKHZhciBuPWcuZ2V0U3ltYm9sVG90YWxDb2Rld29yZHMociksbz1iLmdldFRvdGFsQ29kZXdvcmRzQ291bnQocixlKSxpPW4tbyx1PWIuZ2V0QmxvY2tzQ291bnQocixlKSxhPW4ldSxmPXUtYSxzPU1hdGguZmxvb3Iobi91KSxoPU1hdGguZmxvb3IoaS91KSxjPWgrMSxwPXMtaCxkPW5ldyBFKHApLHk9MCx2PW5ldyBBcnJheSh1KSx3PW5ldyBBcnJheSh1KSxtPTAsQT1sLmZyb20odC5idWZmZXIpLEI9MDtCPHU7QisrKXt2YXIgVD1CPGY/aDpjO3ZbQl09QS5zbGljZSh5LHkrVCksd1tCXT1kLmVuY29kZSh2W0JdKSx5Kz1ULG09TWF0aC5tYXgobSxUKX12YXIgUixDLFA9bC5hbGxvYyhuKSxJPTA7Zm9yKFI9MDtSPG07UisrKWZvcihDPTA7Qzx1O0MrKylSPHZbQ10ubGVuZ3RoJiYoUFtJKytdPXZbQ11bUl0pO2ZvcihSPTA7UjxwO1IrKylmb3IoQz0wO0M8dTtDKyspUFtJKytdPXdbQ11bUl07cmV0dXJuIFB9ZnVuY3Rpb24gYyh0LHIsZSxoKXt2YXIgYztpZihDKHQpKWM9Ui5mcm9tQXJyYXkodCk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGEiKTt2YXIgbD1yO2lmKCFsKXt2YXIgcD1SLnJhd1NwbGl0KHQpO2w9QS5nZXRCZXN0VmVyc2lvbkZvckRhdGEocCxlKX1jPVIuZnJvbVN0cmluZyh0LGx8fDQwKX12YXIgZD1BLmdldEJlc3RWZXJzaW9uRm9yRGF0YShjLGUpO2lmKCFkKXRocm93IG5ldyBFcnJvcigiVGhlIGFtb3VudCBvZiBkYXRhIGlzIHRvbyBiaWcgdG8gYmUgc3RvcmVkIGluIGEgUVIgQ29kZSIpO2lmKHIpe2lmKHI8ZCl0aHJvdyBuZXcgRXJyb3IoIlxuVGhlIGNob3NlbiBRUiBDb2RlIHZlcnNpb24gY2Fubm90IGNvbnRhaW4gdGhpcyBhbW91bnQgb2YgZGF0YS5cbk1pbmltdW0gdmVyc2lvbiByZXF1aXJlZCB0byBzdG9yZSBjdXJyZW50IGRhdGEgaXM6ICIrZCsiLlxuIil9ZWxzZSByPWQ7dmFyIHY9cyhyLGUsYyksdz1nLmdldFN5bWJvbFNpemUociksYj1uZXcgeSh3KTtyZXR1cm4gbihiLHIpLG8oYiksaShiLHIpLGEoYixlLDApLHI+PTcmJnUoYixyKSxmKGIsdiksaXNOYU4oaCkmJihoPW0uZ2V0QmVzdE1hc2soYixhLmJpbmQobnVsbCxiLGUpKSksbS5hcHBseU1hc2soaCxiKSxhKGIsZSxoKSx7bW9kdWxlczpiLHZlcnNpb246cixlcnJvckNvcnJlY3Rpb25MZXZlbDplLG1hc2tQYXR0ZXJuOmgsc2VnbWVudHM6Y319dmFyIGw9dCgiLi4vdXRpbHMvYnVmZmVyIiksZz10KCIuL3V0aWxzIikscD10KCIuL2Vycm9yLWNvcnJlY3Rpb24tbGV2ZWwiKSxkPXQoIi4vYml0LWJ1ZmZlciIpLHk9dCgiLi9iaXQtbWF0cml4Iiksdj10KCIuL2FsaWdubWVudC1wYXR0ZXJuIiksdz10KCIuL2ZpbmRlci1wYXR0ZXJuIiksbT10KCIuL21hc2stcGF0dGVybiIpLGI9dCgiLi9lcnJvci1jb3JyZWN0aW9uLWNvZGUiKSxFPXQoIi4vcmVlZC1zb2xvbW9uLWVuY29kZXIiKSxBPXQoIi4vdmVyc2lvbiIpLEI9dCgiLi9mb3JtYXQtaW5mbyIpLFQ9dCgiLi9tb2RlIiksUj10KCIuL3NlZ21lbnRzIiksQz10KCJpc2FycmF5Iik7ZS5jcmVhdGU9ZnVuY3Rpb24odCxyKXtpZih2b2lkIDA9PT10fHwiIj09PXQpdGhyb3cgbmV3IEVycm9yKCJObyBpbnB1dCB0ZXh0Iik7dmFyIGUsbixvPXAuTTtyZXR1cm4gdm9pZCAwIT09ciYmKG89cC5mcm9tKHIuZXJyb3JDb3JyZWN0aW9uTGV2ZWwscC5NKSxlPUEuZnJvbShyLnZlcnNpb24pLG49bS5mcm9tKHIubWFza1BhdHRlcm4pLHIudG9TSklTRnVuYyYmZy5zZXRUb1NKSVNGdW5jdGlvbihyLnRvU0pJU0Z1bmMpKSxjKHQsZSxvLG4pfX0seyIuLi91dGlscy9idWZmZXIiOjI4LCIuL2FsaWdubWVudC1wYXR0ZXJuIjoyLCIuL2JpdC1idWZmZXIiOjQsIi4vYml0LW1hdHJpeCI6NSwiLi9lcnJvci1jb3JyZWN0aW9uLWNvZGUiOjcsIi4vZXJyb3ItY29ycmVjdGlvbi1sZXZlbCI6OCwiLi9maW5kZXItcGF0dGVybiI6OSwiLi9mb3JtYXQtaW5mbyI6MTAsIi4vbWFzay1wYXR0ZXJuIjoxMywiLi9tb2RlIjoxNCwiLi9yZWVkLXNvbG9tb24tZW5jb2RlciI6MTgsIi4vc2VnbWVudHMiOjIwLCIuL3V0aWxzIjoyMSwiLi92ZXJzaW9uIjoyMyxpc2FycmF5OjMzfV0sMTg6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQpe3RoaXMuZ2VuUG9seT12b2lkIDAsdGhpcy5kZWdyZWU9dCx0aGlzLmRlZ3JlZSYmdGhpcy5pbml0aWFsaXplKHRoaXMuZGVncmVlKX12YXIgbz10KCIuLi91dGlscy9idWZmZXIiKSxpPXQoIi4vcG9seW5vbWlhbCIpLHU9dCgiYnVmZmVyIikuQnVmZmVyO24ucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7dGhpcy5kZWdyZWU9dCx0aGlzLmdlblBvbHk9aS5nZW5lcmF0ZUVDUG9seW5vbWlhbCh0aGlzLmRlZ3JlZSl9LG4ucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbih0KXtpZighdGhpcy5nZW5Qb2x5KXRocm93IG5ldyBFcnJvcigiRW5jb2RlciBub3QgaW5pdGlhbGl6ZWQiKTt2YXIgcj1vLmFsbG9jKHRoaXMuZGVncmVlKSxlPXUuY29uY2F0KFt0LHJdLHQubGVuZ3RoK3RoaXMuZGVncmVlKSxuPWkubW9kKGUsdGhpcy5nZW5Qb2x5KSxhPXRoaXMuZGVncmVlLW4ubGVuZ3RoO2lmKGE+MCl7dmFyIGY9by5hbGxvYyh0aGlzLmRlZ3JlZSk7cmV0dXJuIG4uY29weShmLGEpLGZ9cmV0dXJuIG59LHIuZXhwb3J0cz1ufSx7Ii4uL3V0aWxzL2J1ZmZlciI6MjgsIi4vcG9seW5vbWlhbCI6MTYsYnVmZmVyOjMwfV0sMTk6W2Z1bmN0aW9uKHQscixlKXt2YXIgbj0iKD86W3UzMDAwLXUzMDNGXXxbdTMwNDAtdTMwOUZdfFt1MzBBMC11MzBGRl18W3VGRjAwLXVGRkVGXXxbdTRFMDAtdTlGQUZdfFt1MjYwNS11MjYwNl18W3UyMTkwLXUyMTk1XXx1MjAzQnxbdTIwMTB1MjAxNXUyMDE4dTIwMTl1MjAyNXUyMDI2dTIwMUN1MjAxRHUyMjI1dTIyNjBdfFt1MDM5MS11MDQ1MV18W3UwMEE3dTAwQTh1MDBCMXUwMEI0dTAwRDd1MDBGN10pKyI7bj1uLnJlcGxhY2UoL3UvZywiXFx1Iik7dmFyIG89Iig/Oig/IVtBLVowLTkgJCUqK1xcLS4vOl18IituKyIpKD86LnxbXHJcbl0pKSsiO2UuS0FOSkk9bmV3IFJlZ0V4cChuLCJnIiksZS5CWVRFX0tBTkpJPW5ldyBSZWdFeHAoIlteQS1aMC05ICQlKitcXC0uLzpdKyIsImciKSxlLkJZVEU9bmV3IFJlZ0V4cChvLCJnIiksZS5OVU1FUklDPW5ldyBSZWdFeHAoIlswLTldKyIsImciKSxlLkFMUEhBTlVNRVJJQz1uZXcgUmVnRXhwKCJbQS1aICQlKitcXC0uLzpdKyIsImciKTt2YXIgaT1uZXcgUmVnRXhwKCJeIituKyIkIiksdT1uZXcgUmVnRXhwKCJeWzAtOV0rJCIpLGE9bmV3IFJlZ0V4cCgiXltBLVowLTkgJCUqK1xcLS4vOl0rJCIpO2UudGVzdEthbmppPWZ1bmN0aW9uKHQpe3JldHVybiBpLnRlc3QodCl9LGUudGVzdE51bWVyaWM9ZnVuY3Rpb24odCl7cmV0dXJuIHUudGVzdCh0KX0sZS50ZXN0QWxwaGFudW1lcmljPWZ1bmN0aW9uKHQpe3JldHVybiBhLnRlc3QodCl9fSx7fV0sMjA6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodCkpLmxlbmd0aH1mdW5jdGlvbiBvKHQscixlKXtmb3IodmFyIG4sbz1bXTtudWxsIT09KG49dC5leGVjKGUpKTspby5wdXNoKHtkYXRhOm5bMF0saW5kZXg6bi5pbmRleCxtb2RlOnIsbGVuZ3RoOm5bMF0ubGVuZ3RofSk7cmV0dXJuIG99ZnVuY3Rpb24gaSh0KXt2YXIgcixlLG49byh5Lk5VTUVSSUMsYy5OVU1FUklDLHQpLGk9byh5LkFMUEhBTlVNRVJJQyxjLkFMUEhBTlVNRVJJQyx0KTtyZXR1cm4gdi5pc0thbmppTW9kZUVuYWJsZWQoKT8ocj1vKHkuQllURSxjLkJZVEUsdCksZT1vKHkuS0FOSkksYy5LQU5KSSx0KSk6KHI9byh5LkJZVEVfS0FOSkksYy5CWVRFLHQpLGU9W10pLG4uY29uY2F0KGkscixlKS5zb3J0KGZ1bmN0aW9uKHQscil7cmV0dXJuIHQuaW5kZXgtci5pbmRleH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57ZGF0YTp0LmRhdGEsbW9kZTp0Lm1vZGUsbGVuZ3RoOnQubGVuZ3RofX0pfWZ1bmN0aW9uIHUodCxyKXtzd2l0Y2gocil7Y2FzZSBjLk5VTUVSSUM6cmV0dXJuIGwuZ2V0Qml0c0xlbmd0aCh0KTtjYXNlIGMuQUxQSEFOVU1FUklDOnJldHVybiBnLmdldEJpdHNMZW5ndGgodCk7Y2FzZSBjLktBTkpJOnJldHVybiBkLmdldEJpdHNMZW5ndGgodCk7Y2FzZSBjLkJZVEU6cmV0dXJuIHAuZ2V0Qml0c0xlbmd0aCh0KX19ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24odCxyKXt2YXIgZT10Lmxlbmd0aC0xPj0wP3RbdC5sZW5ndGgtMV06bnVsbDtyZXR1cm4gZSYmZS5tb2RlPT09ci5tb2RlPyh0W3QubGVuZ3RoLTFdLmRhdGErPXIuZGF0YSx0KToodC5wdXNoKHIpLHQpfSxbXSl9ZnVuY3Rpb24gZih0KXtmb3IodmFyIHI9W10sZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbz10W2VdO3N3aXRjaChvLm1vZGUpe2Nhc2UgYy5OVU1FUklDOnIucHVzaChbbyx7ZGF0YTpvLmRhdGEsbW9kZTpjLkFMUEhBTlVNRVJJQyxsZW5ndGg6by5sZW5ndGh9LHtkYXRhOm8uZGF0YSxtb2RlOmMuQllURSxsZW5ndGg6by5sZW5ndGh9XSk7YnJlYWs7Y2FzZSBjLkFMUEhBTlVNRVJJQzpyLnB1c2goW28se2RhdGE6by5kYXRhLG1vZGU6Yy5CWVRFLGxlbmd0aDpvLmxlbmd0aH1dKTticmVhaztjYXNlIGMuS0FOSkk6ci5wdXNoKFtvLHtkYXRhOm8uZGF0YSxtb2RlOmMuQllURSxsZW5ndGg6bihvLmRhdGEpfV0pO2JyZWFrO2Nhc2UgYy5CWVRFOnIucHVzaChbe2RhdGE6by5kYXRhLG1vZGU6Yy5CWVRFLGxlbmd0aDpuKG8uZGF0YSl9XSl9fXJldHVybiByfWZ1bmN0aW9uIHModCxyKXtmb3IodmFyIGU9e30sbj17c3RhcnQ6e319LG89WyJzdGFydCJdLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBhPXRbaV0sZj1bXSxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBoPWFbc10sbD0iIitpK3M7Zi5wdXNoKGwpLGVbbF09e25vZGU6aCxsYXN0Q291bnQ6MH0sbltsXT17fTtmb3IodmFyIGc9MDtnPG8ubGVuZ3RoO2crKyl7dmFyIHA9b1tnXTtlW3BdJiZlW3BdLm5vZGUubW9kZT09PWgubW9kZT8obltwXVtsXT11KGVbcF0ubGFzdENvdW50K2gubGVuZ3RoLGgubW9kZSktdShlW3BdLmxhc3RDb3VudCxoLm1vZGUpLGVbcF0ubGFzdENvdW50Kz1oLmxlbmd0aCk6KGVbcF0mJihlW3BdLmxhc3RDb3VudD1oLmxlbmd0aCksbltwXVtsXT11KGgubGVuZ3RoLGgubW9kZSkrNCtjLmdldENoYXJDb3VudEluZGljYXRvcihoLm1vZGUscikpfX1vPWZ9Zm9yKGc9MDtnPG8ubGVuZ3RoO2crKyluW29bZ11dLmVuZD0wO3JldHVybnttYXA6bix0YWJsZTplfX1mdW5jdGlvbiBoKHQscil7dmFyIGUsbj1jLmdldEJlc3RNb2RlRm9yRGF0YSh0KTtpZigoZT1jLmZyb20ocixuKSkhPT1jLkJZVEUmJmUuYml0PG4uYml0KXRocm93IG5ldyBFcnJvcignIicrdCsnIiBjYW5ub3QgYmUgZW5jb2RlZCB3aXRoIG1vZGUgJytjLnRvU3RyaW5nKGUpKyIuXG4gU3VnZ2VzdGVkIG1vZGUgaXM6ICIrYy50b1N0cmluZyhuKSk7c3dpdGNoKGUhPT1jLktBTkpJfHx2LmlzS2FuamlNb2RlRW5hYmxlZCgpfHwoZT1jLkJZVEUpLGUpe2Nhc2UgYy5OVU1FUklDOnJldHVybiBuZXcgbCh0KTtjYXNlIGMuQUxQSEFOVU1FUklDOnJldHVybiBuZXcgZyh0KTtjYXNlIGMuS0FOSkk6cmV0dXJuIG5ldyBkKHQpO2Nhc2UgYy5CWVRFOnJldHVybiBuZXcgcCh0KX19dmFyIGM9dCgiLi9tb2RlIiksbD10KCIuL251bWVyaWMtZGF0YSIpLGc9dCgiLi9hbHBoYW51bWVyaWMtZGF0YSIpLHA9dCgiLi9ieXRlLWRhdGEiKSxkPXQoIi4va2FuamktZGF0YSIpLHk9dCgiLi9yZWdleCIpLHY9dCgiLi91dGlscyIpLHc9dCgiZGlqa3N0cmFqcyIpO2UuZnJvbUFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LHIpe3JldHVybiJzdHJpbmciPT10eXBlb2Ygcj90LnB1c2goaChyLG51bGwpKTpyLmRhdGEmJnQucHVzaChoKHIuZGF0YSxyLm1vZGUpKSx0fSxbXSl9LGUuZnJvbVN0cmluZz1mdW5jdGlvbih0LHIpe2Zvcih2YXIgbj1pKHQsdi5pc0thbmppTW9kZUVuYWJsZWQoKSksbz1mKG4pLHU9cyhvLHIpLGg9dy5maW5kX3BhdGgodS5tYXAsInN0YXJ0IiwiZW5kIiksYz1bXSxsPTE7bDxoLmxlbmd0aC0xO2wrKyljLnB1c2godS50YWJsZVtoW2xdXS5ub2RlKTtyZXR1cm4gZS5mcm9tQXJyYXkoYShjKSl9LGUucmF3U3BsaXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGUuZnJvbUFycmF5KGkodCx2LmlzS2FuamlNb2RlRW5hYmxlZCgpKSl9fSx7Ii4vYWxwaGFudW1lcmljLWRhdGEiOjMsIi4vYnl0ZS1kYXRhIjo2LCIuL2thbmppLWRhdGEiOjEyLCIuL21vZGUiOjE0LCIuL251bWVyaWMtZGF0YSI6MTUsIi4vcmVnZXgiOjE5LCIuL3V0aWxzIjoyMSxkaWprc3RyYWpzOjMxfV0sMjE6W2Z1bmN0aW9uKHQscixlKXt2YXIgbixvPVswLDI2LDQ0LDcwLDEwMCwxMzQsMTcyLDE5NiwyNDIsMjkyLDM0Niw0MDQsNDY2LDUzMiw1ODEsNjU1LDczMyw4MTUsOTAxLDk5MSwxMDg1LDExNTYsMTI1OCwxMzY0LDE0NzQsMTU4OCwxNzA2LDE4MjgsMTkyMSwyMDUxLDIxODUsMjMyMywyNDY1LDI2MTEsMjc2MSwyODc2LDMwMzQsMzE5NiwzMzYyLDM1MzIsMzcwNl07ZS5nZXRTeW1ib2xTaXplPWZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcignInZlcnNpb24iIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCcpO2lmKHQ8MXx8dD40MCl0aHJvdyBuZXcgRXJyb3IoJyJ2ZXJzaW9uIiBzaG91bGQgYmUgaW4gcmFuZ2UgZnJvbSAxIHRvIDQwJyk7cmV0dXJuIDQqdCsxN30sZS5nZXRTeW1ib2xUb3RhbENvZGV3b3Jkcz1mdW5jdGlvbih0KXtyZXR1cm4gb1t0XX0sZS5nZXRCQ0hEaWdpdD1mdW5jdGlvbih0KXtmb3IodmFyIHI9MDswIT09dDspcisrLHQ+Pj49MTtyZXR1cm4gcn0sZS5zZXRUb1NKSVNGdW5jdGlvbj1mdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoJyJ0b1NKSVNGdW5jIiBpcyBub3QgYSB2YWxpZCBmdW5jdGlvbi4nKTtuPXR9LGUuaXNLYW5qaU1vZGVFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PW59LGUudG9TSklTPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQpfX0se31dLDIyOltmdW5jdGlvbih0LHIsZSl7ZS5pc1ZhbGlkPWZ1bmN0aW9uKHQpe3JldHVybiFpc05hTih0KSYmdD49MSYmdDw9NDB9fSx7fV0sMjM6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQscixuKXtmb3IodmFyIG89MTtvPD00MDtvKyspaWYocjw9ZS5nZXRDYXBhY2l0eShvLG4sdCkpcmV0dXJuIG99ZnVuY3Rpb24gbyh0LHIpe3JldHVybiBoLmdldENoYXJDb3VudEluZGljYXRvcih0LHIpKzR9ZnVuY3Rpb24gaSh0LHIpe3ZhciBlPTA7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj1vKHQubW9kZSxyKTtlKz1uK3QuZ2V0Qml0c0xlbmd0aCgpfSksZX1mdW5jdGlvbiB1KHQscil7Zm9yKHZhciBuPTE7bjw9NDA7bisrKXtpZihpKHQsbik8PWUuZ2V0Q2FwYWNpdHkobixyLGguTUlYRUQpKXJldHVybiBufX12YXIgYT10KCIuL3V0aWxzIiksZj10KCIuL2Vycm9yLWNvcnJlY3Rpb24tY29kZSIpLHM9dCgiLi9lcnJvci1jb3JyZWN0aW9uLWxldmVsIiksaD10KCIuL21vZGUiKSxjPXQoIi4vdmVyc2lvbi1jaGVjayIpLGw9dCgiaXNhcnJheSIpLGc9YS5nZXRCQ0hEaWdpdCg3OTczKTtlLmZyb209ZnVuY3Rpb24odCxyKXtyZXR1cm4gYy5pc1ZhbGlkKHQpP3BhcnNlSW50KHQsMTApOnJ9LGUuZ2V0Q2FwYWNpdHk9ZnVuY3Rpb24odCxyLGUpe2lmKCFjLmlzVmFsaWQodCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFFSIENvZGUgdmVyc2lvbiIpO3ZvaWQgMD09PWUmJihlPWguQllURSk7dmFyIG49YS5nZXRTeW1ib2xUb3RhbENvZGV3b3Jkcyh0KSxpPWYuZ2V0VG90YWxDb2Rld29yZHNDb3VudCh0LHIpLHU9OCoobi1pKTtpZihlPT09aC5NSVhFRClyZXR1cm4gdTt2YXIgcz11LW8oZSx0KTtzd2l0Y2goZSl7Y2FzZSBoLk5VTUVSSUM6cmV0dXJuIE1hdGguZmxvb3Iocy8xMCozKTtjYXNlIGguQUxQSEFOVU1FUklDOnJldHVybiBNYXRoLmZsb29yKHMvMTEqMik7Y2FzZSBoLktBTkpJOnJldHVybiBNYXRoLmZsb29yKHMvMTMpO2Nhc2UgaC5CWVRFOmRlZmF1bHQ6cmV0dXJuIE1hdGguZmxvb3Iocy84KX19LGUuZ2V0QmVzdFZlcnNpb25Gb3JEYXRhPWZ1bmN0aW9uKHQscil7dmFyIGUsbz1zLmZyb20ocixzLk0pO2lmKGwodCkpe2lmKHQubGVuZ3RoPjEpcmV0dXJuIHUodCxvKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIDE7ZT10WzBdfWVsc2UgZT10O3JldHVybiBuKGUubW9kZSxlLmdldExlbmd0aCgpLG8pfSxlLmdldEVuY29kZWRCaXRzPWZ1bmN0aW9uKHQpe2lmKCFjLmlzVmFsaWQodCl8fHQ8Nyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgUVIgQ29kZSB2ZXJzaW9uIik7Zm9yKHZhciByPXQ8PDEyO2EuZ2V0QkNIRGlnaXQociktZz49MDspcl49Nzk3Mzw8YS5nZXRCQ0hEaWdpdChyKS1nO3JldHVybiB0PDwxMnxyfX0seyIuL2Vycm9yLWNvcnJlY3Rpb24tY29kZSI6NywiLi9lcnJvci1jb3JyZWN0aW9uLWxldmVsIjo4LCIuL21vZGUiOjE0LCIuL3V0aWxzIjoyMSwiLi92ZXJzaW9uLWNoZWNrIjoyMixpc2FycmF5OjMzfV0sMjQ6W2Z1bmN0aW9uKHQscixlKXtmdW5jdGlvbiBuKHQscixlLG4sdSl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZj1hLmxlbmd0aCxzPSJmdW5jdGlvbiI9PXR5cGVvZiBhW2YtMV07aWYoIXMmJiFvKCkpdGhyb3cgbmV3IEVycm9yKCJDYWxsYmFjayByZXF1aXJlZCBhcyBsYXN0IGFyZ3VtZW50Iik7aWYoIXMpe2lmKGY8MSl0aHJvdyBuZXcgRXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHByb3ZpZGVkIik7cmV0dXJuIDE9PT1mPyhlPXIscj1uPXZvaWQgMCk6MiE9PWZ8fHIuZ2V0Q29udGV4dHx8KG49ZSxlPXIscj12b2lkIDApLG5ldyBQcm9taXNlKGZ1bmN0aW9uKG8sdSl7dHJ5e3ZhciBhPWkuY3JlYXRlKGUsbik7byh0KGEscixuKSl9Y2F0Y2godCl7dSh0KX19KX1pZihmPDIpdGhyb3cgbmV3IEVycm9yKCJUb28gZmV3IGFyZ3VtZW50cyBwcm92aWRlZCIpOzI9PT1mPyh1PWUsZT1yLHI9bj12b2lkIDApOjM9PT1mJiYoci5nZXRDb250ZXh0JiZ2b2lkIDA9PT11Pyh1PW4sbj12b2lkIDApOih1PW4sbj1lLGU9cixyPXZvaWQgMCkpO3RyeXt2YXIgaD1pLmNyZWF0ZShlLG4pO3UobnVsbCx0KGgscixuKSl9Y2F0Y2godCl7dSh0KX19dmFyIG89dCgiLi9jYW4tcHJvbWlzZSIpLGk9dCgiLi9jb3JlL3FyY29kZSIpLHU9dCgiLi9yZW5kZXJlci9jYW52YXMiKSxhPXQoIi4vcmVuZGVyZXIvc3ZnLXRhZy5qcyIpO2UuY3JlYXRlPWkuY3JlYXRlLGUudG9DYW52YXM9bi5iaW5kKG51bGwsdS5yZW5kZXIpLGUudG9EYXRhVVJMPW4uYmluZChudWxsLHUucmVuZGVyVG9EYXRhVVJMKSxlLnRvU3RyaW5nPW4uYmluZChudWxsLGZ1bmN0aW9uKHQscixlKXtyZXR1cm4gYS5yZW5kZXIodCxlKX0pfSx7Ii4vY2FuLXByb21pc2UiOjEsIi4vY29yZS9xcmNvZGUiOjE3LCIuL3JlbmRlcmVyL2NhbnZhcyI6MjUsIi4vcmVuZGVyZXIvc3ZnLXRhZy5qcyI6MjZ9XSwyNTpbZnVuY3Rpb24odCxyLGUpe2Z1bmN0aW9uIG4odCxyLGUpe3QuY2xlYXJSZWN0KDAsMCxyLndpZHRoLHIuaGVpZ2h0KSxyLnN0eWxlfHwoci5zdHlsZT17fSksci5oZWlnaHQ9ZSxyLndpZHRoPWUsci5zdHlsZS5oZWlnaHQ9ZSsicHgiLHIuc3R5bGUud2lkdGg9ZSsicHgifWZ1bmN0aW9uIG8oKXt0cnl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpfWNhdGNoKHQpe3Rocm93IG5ldyBFcnJvcigiWW91IG5lZWQgdG8gc3BlY2lmeSBhIGNhbnZhcyBlbGVtZW50Iil9fXZhciBpPXQoIi4vdXRpbHMiKTtlLnJlbmRlcj1mdW5jdGlvbih0LHIsZSl7dmFyIHU9ZSxhPXI7dm9pZCAwIT09dXx8ciYmci5nZXRDb250ZXh0fHwodT1yLHI9dm9pZCAwKSxyfHwoYT1vKCkpLHU9aS5nZXRPcHRpb25zKHUpO3ZhciBmPWkuZ2V0SW1hZ2VXaWR0aCh0Lm1vZHVsZXMuc2l6ZSx1KSxzPWEuZ2V0Q29udGV4dCgiMmQiKSxoPXMuY3JlYXRlSW1hZ2VEYXRhKGYsZik7cmV0dXJuIGkucXJUb0ltYWdlRGF0YShoLmRhdGEsdCx1KSxuKHMsYSxmKSxzLnB1dEltYWdlRGF0YShoLDAsMCksYX0sZS5yZW5kZXJUb0RhdGFVUkw9ZnVuY3Rpb24odCxyLG4pe3ZhciBvPW47dm9pZCAwIT09b3x8ciYmci5nZXRDb250ZXh0fHwobz1yLHI9dm9pZCAwKSxvfHwobz17fSk7dmFyIGk9ZS5yZW5kZXIodCxyLG8pLHU9by50eXBlfHwiaW1hZ2UvcG5nIixhPW8ucmVuZGVyZXJPcHRzfHx7fTtyZXR1cm4gaS50b0RhdGFVUkwodSxhLnF1YWxpdHkpfX0seyIuL3V0aWxzIjoyN31dLDI2OltmdW5jdGlvbih0LHIsZSl7ZnVuY3Rpb24gbih0LHIpe3ZhciBlPXQuYS8yNTUsbj1yKyc9IicrdC5oZXgrJyInO3JldHVybiBlPDE/bisiICIrcisnLW9wYWNpdHk9IicrZS50b0ZpeGVkKDIpLnNsaWNlKDEpKyciJzpufWZ1bmN0aW9uIG8odCxyLGUpe3ZhciBuPXQrcjtyZXR1cm4gdm9pZCAwIT09ZSYmKG4rPSIgIitlKSxufWZ1bmN0aW9uIGkodCxyLGUpe2Zvcih2YXIgbj0iIixpPTAsdT0hMSxhPTAsZj0wO2Y8dC5sZW5ndGg7ZisrKXt2YXIgcz1NYXRoLmZsb29yKGYlciksaD1NYXRoLmZsb29yKGYvcik7c3x8dXx8KHU9ITApLHRbZl0/KGErKyxmPjAmJnM+MCYmdFtmLTFdfHwobis9dT9vKCJNIixzK2UsLjUraCtlKTpvKCJtIixpLDApLGk9MCx1PSExKSxzKzE8ciYmdFtmKzFdfHwobis9bygiaCIsYSksYT0wKSk6aSsrfXJldHVybiBufXZhciB1PXQoIi4vdXRpbHMiKTtlLnJlbmRlcj1mdW5jdGlvbih0LHIsZSl7dmFyIG89dS5nZXRPcHRpb25zKHIpLGE9dC5tb2R1bGVzLnNpemUsZj10Lm1vZHVsZXMuZGF0YSxzPWErMipvLm1hcmdpbixoPW8uY29sb3IubGlnaHQuYT8iPHBhdGggIituKG8uY29sb3IubGlnaHQsImZpbGwiKSsnIGQ9Ik0wIDBoJytzKyJ2IitzKydIMHoiLz4nOiIiLGM9IjxwYXRoICIrbihvLmNvbG9yLmRhcmssInN0cm9rZSIpKycgZD0iJytpKGYsYSxvLm1hcmdpbikrJyIvPicsbD0ndmlld0JveD0iMCAwICcrcysiICIrcysnIicsZz1vLndpZHRoPyd3aWR0aD0iJytvLndpZHRoKyciIGhlaWdodD0iJytvLndpZHRoKyciICc6IiIscD0nPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICcrZytsKycgc2hhcGUtcmVuZGVyaW5nPSJjcmlzcEVkZ2VzIj4nK2grYysiPC9zdmc+XG4iO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKG51bGwscCkscH19LHsiLi91dGlscyI6Mjd9XSwyNzpbZnVuY3Rpb24odCxyLGUpe2Z1bmN0aW9uIG4odCl7aWYoIm51bWJlciI9PXR5cGVvZiB0JiYodD10LnRvU3RyaW5nKCkpLCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIkNvbG9yIHNob3VsZCBiZSBkZWZpbmVkIGFzIGhleCBzdHJpbmciKTt2YXIgcj10LnNsaWNlKCkucmVwbGFjZSgiIyIsIiIpLnNwbGl0KCIiKTtpZihyLmxlbmd0aDwzfHw1PT09ci5sZW5ndGh8fHIubGVuZ3RoPjgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGhleCBjb2xvcjogIit0KTszIT09ci5sZW5ndGgmJjQhPT1yLmxlbmd0aHx8KHI9QXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxyLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdCx0XX0pKSksNj09PXIubGVuZ3RoJiZyLnB1c2goIkYiLCJGIik7dmFyIGU9cGFyc2VJbnQoci5qb2luKCIiKSwxNik7cmV0dXJue3I6ZT4+MjQmMjU1LGc6ZT4+MTYmMjU1LGI6ZT4+OCYyNTUsYToyNTUmZSxoZXg6IiMiK3Iuc2xpY2UoMCw2KS5qb2luKCIiKX19ZS5nZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3R8fCh0PXt9KSx0LmNvbG9yfHwodC5jb2xvcj17fSk7dmFyIHI9dm9pZCAwPT09dC5tYXJnaW58fG51bGw9PT10Lm1hcmdpbnx8dC5tYXJnaW48MD80OnQubWFyZ2luLGU9dC53aWR0aCYmdC53aWR0aD49MjE/dC53aWR0aDp2b2lkIDAsbz10LnNjYWxlfHw0O3JldHVybnt3aWR0aDplLHNjYWxlOmU/NDpvLG1hcmdpbjpyLGNvbG9yOntkYXJrOm4odC5jb2xvci5kYXJrfHwiIzAwMDAwMGZmIiksbGlnaHQ6bih0LmNvbG9yLmxpZ2h0fHwiI2ZmZmZmZmZmIil9LHR5cGU6dC50eXBlLHJlbmRlcmVyT3B0czp0LnJlbmRlcmVyT3B0c3x8e319fSxlLmdldFNjYWxlPWZ1bmN0aW9uKHQscil7cmV0dXJuIHIud2lkdGgmJnIud2lkdGg+PXQrMipyLm1hcmdpbj9yLndpZHRoLyh0KzIqci5tYXJnaW4pOnIuc2NhbGV9LGUuZ2V0SW1hZ2VXaWR0aD1mdW5jdGlvbih0LHIpe3ZhciBuPWUuZ2V0U2NhbGUodCxyKTtyZXR1cm4gTWF0aC5mbG9vcigodCsyKnIubWFyZ2luKSpuKX0sZS5xclRvSW1hZ2VEYXRhPWZ1bmN0aW9uKHQscixuKXtmb3IodmFyIG89ci5tb2R1bGVzLnNpemUsaT1yLm1vZHVsZXMuZGF0YSx1PWUuZ2V0U2NhbGUobyxuKSxhPU1hdGguZmxvb3IoKG8rMipuLm1hcmdpbikqdSksZj1uLm1hcmdpbip1LHM9W24uY29sb3IubGlnaHQsbi5jb2xvci5kYXJrXSxoPTA7aDxhO2grKylmb3IodmFyIGM9MDtjPGE7YysrKXt2YXIgbD00KihoKmErYyksZz1uLmNvbG9yLmxpZ2h0O2lmKGg+PWYmJmM+PWYmJmg8YS1mJiZjPGEtZil7dmFyIHA9TWF0aC5mbG9vcigoaC1mKS91KSxkPU1hdGguZmxvb3IoKGMtZikvdSk7Zz1zW2lbcCpvK2RdPzE6MF19dFtsKytdPWcucix0W2wrK109Zy5nLHRbbCsrXT1nLmIsdFtsXT1nLmF9fX0se31dLDI4OltmdW5jdGlvbih0LHIsZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxyLGUpe3JldHVybiBuLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBuPyJudW1iZXIiPT10eXBlb2YgdD9hKHRoaXMsdCk6eSh0aGlzLHQscixlKTpuZXcgbih0LHIsZSl9ZnVuY3Rpb24gbyh0KXtpZih0Pj13KXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4Iit3LnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBpKHQpe3JldHVybiB0IT09dH1mdW5jdGlvbiB1KHQscil7dmFyIGU7cmV0dXJuIG4uVFlQRURfQVJSQVlfU1VQUE9SVD8oZT1uZXcgVWludDhBcnJheShyKSxlLl9fcHJvdG9fXz1uLnByb3RvdHlwZSk6KGU9dCxudWxsPT09ZSYmKGU9bmV3IG4ocikpLGUubGVuZ3RoPXIpLGV9ZnVuY3Rpb24gYSh0LHIpe3ZhciBlPXUodCxyPDA/MDowfG8ocikpO2lmKCFuLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBpPTA7aTxyOysraSllW2ldPTA7cmV0dXJuIGV9ZnVuY3Rpb24gZih0LHIpe3ZhciBlPTB8ZyhyKSxuPXUodCxlKSxvPW4ud3JpdGUocik7cmV0dXJuIG8hPT1lJiYobj1uLnNsaWNlKDAsbykpLG59ZnVuY3Rpb24gcyh0LHIpe2Zvcih2YXIgZT1yLmxlbmd0aDwwPzA6MHxvKHIubGVuZ3RoKSxuPXUodCxlKSxpPTA7aTxlO2krPTEpbltpXT0yNTUmcltpXTtyZXR1cm4gbn1mdW5jdGlvbiBoKHQscixlLG8pe2lmKGU8MHx8ci5ieXRlTGVuZ3RoPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihyLmJ5dGVMZW5ndGg8ZSsob3x8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTt2YXIgaTtyZXR1cm4gaT12b2lkIDA9PT1lJiZ2b2lkIDA9PT1vP25ldyBVaW50OEFycmF5KHIpOnZvaWQgMD09PW8/bmV3IFVpbnQ4QXJyYXkocixlKTpuZXcgVWludDhBcnJheShyLGUsbyksbi5UWVBFRF9BUlJBWV9TVVBQT1JUP2kuX19wcm90b19fPW4ucHJvdG90eXBlOmk9cyh0LGkpLGl9ZnVuY3Rpb24gYyh0LHIpe2lmKG4uaXNCdWZmZXIocikpe3ZhciBlPTB8byhyLmxlbmd0aCksYT11KHQsZSk7cmV0dXJuIDA9PT1hLmxlbmd0aD9hOihyLmNvcHkoYSwwLDAsZSksYSl9aWYocil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmci5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiByKXJldHVybiJudW1iZXIiIT10eXBlb2Ygci5sZW5ndGh8fGkoci5sZW5ndGgpP3UodCwwKTpzKHQscik7aWYoIkJ1ZmZlciI9PT1yLnR5cGUmJkFycmF5LmlzQXJyYXkoci5kYXRhKSlyZXR1cm4gcyh0LHIuZGF0YSl9dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfWZ1bmN0aW9uIGwodCxyKXtyPXJ8fDEvMDtmb3IodmFyIGUsbj10Lmxlbmd0aCxvPW51bGwsaT1bXSx1PTA7dTxuOysrdSl7aWYoKGU9dC5jaGFyQ29kZUF0KHUpKT41NTI5NSYmZTw1NzM0NCl7aWYoIW8pe2lmKGU+NTYzMTkpeyhyLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZih1KzE9PT1uKXsoci09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bz1lO2NvbnRpbnVlfWlmKGU8NTYzMjApeyhyLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxvPWU7Y29udGludWV9ZT02NTUzNisoby01NTI5Njw8MTB8ZS01NjMyMCl9ZWxzZSBvJiYoci09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYobz1udWxsLGU8MTI4KXtpZigoci09MSk8MClicmVhaztpLnB1c2goZSl9ZWxzZSBpZihlPDIwNDgpe2lmKChyLT0yKTwwKWJyZWFrO2kucHVzaChlPj42fDE5Miw2MyZlfDEyOCl9ZWxzZSBpZihlPDY1NTM2KXtpZigoci09Myk8MClicmVhaztpLnB1c2goZT4+MTJ8MjI0LGU+PjYmNjN8MTI4LDYzJmV8MTI4KX1lbHNle2lmKCEoZTwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChyLT00KTwwKWJyZWFrO2kucHVzaChlPj4xOHwyNDAsZT4+MTImNjN8MTI4LGU+PjYmNjN8MTI4LDYzJmV8MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gbi5pc0J1ZmZlcih0KT90Lmxlbmd0aDoidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpP3QuYnl0ZUxlbmd0aDooInN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KSwwPT09dC5sZW5ndGg/MDpsKHQpLmxlbmd0aCl9ZnVuY3Rpb24gcCh0LHIsZSxuKXtmb3IodmFyIG89MDtvPG4mJiEobytlPj1yLmxlbmd0aHx8bz49dC5sZW5ndGgpOysrbylyW28rZV09dFtvXTtyZXR1cm4gb31mdW5jdGlvbiBkKHQscixlLG4pe3JldHVybiBwKGwocix0Lmxlbmd0aC1lKSx0LGUsbil9ZnVuY3Rpb24geSh0LHIsZSxuKXtpZigibnVtYmVyIj09dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9oKHQscixlLG4pOiJzdHJpbmciPT10eXBlb2Ygcj9mKHQscixlKTpjKHQscil9dmFyIHY9dCgiaXNhcnJheSIpO24uVFlQRURfQVJSQVlfU1VQUE9SVD1mdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PXQuZm9vKCl9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3ZhciB3PW4uVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjM7bi5UWVBFRF9BUlJBWV9TVVBQT1JUJiYobi5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLG4uX19wcm90b19fPVVpbnQ4QXJyYXksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZuW1N5bWJvbC5zcGVjaWVzXT09PW4mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiExfSkpLG4ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQscixlKXt2b2lkIDA9PT1yPyhlPXRoaXMubGVuZ3RoLHI9MCk6dm9pZCAwPT09ZSYmInN0cmluZyI9PXR5cGVvZiByPyhlPXRoaXMubGVuZ3RoLHI9MCk6aXNGaW5pdGUocikmJihyfD0wLGlzRmluaXRlKGUpP2V8PTA6ZT12b2lkIDApO3ZhciBuPXRoaXMubGVuZ3RoLXI7aWYoKHZvaWQgMD09PWV8fGU+bikmJihlPW4pLHQubGVuZ3RoPjAmJihlPDB8fHI8MCl8fHI+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cmV0dXJuIGQodGhpcyx0LHIsZSl9LG4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQscil7dmFyIGU9dGhpcy5sZW5ndGg7dD1+fnQscj12b2lkIDA9PT1yP2U6fn5yLHQ8MD8odCs9ZSk8MCYmKHQ9MCk6dD5lJiYodD1lKSxyPDA/KHIrPWUpPDAmJihyPTApOnI+ZSYmKHI9ZSkscjx0JiYocj10KTt2YXIgbztpZihuLlRZUEVEX0FSUkFZX1NVUFBPUlQpbz10aGlzLnN1YmFycmF5KHQsciksby5fX3Byb3RvX189bi5wcm90b3R5cGU7ZWxzZXt2YXIgaT1yLXQ7bz1uZXcgbihpLHZvaWQgMCk7Zm9yKHZhciB1PTA7dTxpOysrdSlvW3VdPXRoaXNbdSt0XX1yZXR1cm4gb30sbi5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LHIsZSxvKXtpZihlfHwoZT0wKSxvfHwwPT09b3x8KG89dGhpcy5sZW5ndGgpLHI+PXQubGVuZ3RoJiYocj10Lmxlbmd0aCkscnx8KHI9MCksbz4wJiZvPGUmJihvPWUpLG89PT1lKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKGU8MHx8ZT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihvPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bz50aGlzLmxlbmd0aCYmKG89dGhpcy5sZW5ndGgpLHQubGVuZ3RoLXI8by1lJiYobz10Lmxlbmd0aC1yK2UpO3ZhciBpLHU9by1lO2lmKHRoaXM9PT10JiZlPHImJnI8bylmb3IoaT11LTE7aT49MDstLWkpdFtpK3JdPXRoaXNbaStlXTtlbHNlIGlmKHU8MWUzfHwhbi5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTx1OysraSl0W2krcl09dGhpc1tpK2VdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KGUsZSt1KSxyKTtyZXR1cm4gdX0sbi5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LHIsZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIHI/KHI9MCxlPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIGUmJihlPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBvPXQuY2hhckNvZGVBdCgwKTtvPDI1NiYmKHQ9byl9fWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKHI8MHx8dGhpcy5sZW5ndGg8cnx8dGhpcy5sZW5ndGg8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYoZTw9cilyZXR1cm4gdGhpcztyPj4+PTAsZT12b2lkIDA9PT1lP3RoaXMubGVuZ3RoOmU+Pj4wLHR8fCh0PTApO3ZhciBpO2lmKCJudW1iZXIiPT10eXBlb2YgdClmb3IoaT1yO2k8ZTsrK2kpdGhpc1tpXT10O2Vsc2V7dmFyIHU9bi5pc0J1ZmZlcih0KT90Om5ldyBuKHQpLGE9dS5sZW5ndGg7Zm9yKGk9MDtpPGUtcjsrK2kpdGhpc1tpK3JdPXVbaSVhXX1yZXR1cm4gdGhpc30sbi5jb25jYXQ9ZnVuY3Rpb24odCxyKXtpZighdih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB1KG51bGwsMCk7dmFyIGU7aWYodm9pZCAwPT09cilmb3Iocj0wLGU9MDtlPHQubGVuZ3RoOysrZSlyKz10W2VdLmxlbmd0aDt2YXIgbz1hKG51bGwsciksaT0wO2ZvcihlPTA7ZTx0Lmxlbmd0aDsrK2Upe3ZhciBmPXRbZV07aWYoIW4uaXNCdWZmZXIoZikpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2YuY29weShvLGkpLGkrPWYubGVuZ3RofXJldHVybiBvfSxuLmJ5dGVMZW5ndGg9ZyxuLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsbi5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9LHIuZXhwb3J0cy5hbGxvYz1mdW5jdGlvbih0KXt2YXIgcj1uZXcgbih0KTtyZXR1cm4gci5maWxsKDApLHJ9LHIuZXhwb3J0cy5mcm9tPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KX19LHtpc2FycmF5OjMzfV0sMjk6W2Z1bmN0aW9uKHQscixlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgcj10Lmxlbmd0aDtpZihyJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgZT10LmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PWUmJihlPXIpLFtlLGU9PT1yPzA6NC1lJTRdfWZ1bmN0aW9uIG8odCl7dmFyIHI9bih0KSxlPXJbMF0sbz1yWzFdO3JldHVybiAzKihlK28pLzQtb31mdW5jdGlvbiBpKHQscixlKXtyZXR1cm4gMyoocitlKS80LWV9ZnVuY3Rpb24gdSh0KXt2YXIgcixlLG89bih0KSx1PW9bMF0sYT1vWzFdLGY9bmV3IGwoaSh0LHUsYSkpLHM9MCxoPWE+MD91LTQ6dTtmb3IoZT0wO2U8aDtlKz00KXI9Y1t0LmNoYXJDb2RlQXQoZSldPDwxOHxjW3QuY2hhckNvZGVBdChlKzEpXTw8MTJ8Y1t0LmNoYXJDb2RlQXQoZSsyKV08PDZ8Y1t0LmNoYXJDb2RlQXQoZSszKV0sZltzKytdPXI+PjE2JjI1NSxmW3MrK109cj4+OCYyNTUsZltzKytdPTI1NSZyO3JldHVybiAyPT09YSYmKHI9Y1t0LmNoYXJDb2RlQXQoZSldPDwyfGNbdC5jaGFyQ29kZUF0KGUrMSldPj40LGZbcysrXT0yNTUmciksMT09PWEmJihyPWNbdC5jaGFyQ29kZUF0KGUpXTw8MTB8Y1t0LmNoYXJDb2RlQXQoZSsxKV08PDR8Y1t0LmNoYXJDb2RlQXQoZSsyKV0+PjIsZltzKytdPXI+PjgmMjU1LGZbcysrXT0yNTUmciksZn1mdW5jdGlvbiBhKHQpe3JldHVybiBoW3Q+PjE4JjYzXStoW3Q+PjEyJjYzXStoW3Q+PjYmNjNdK2hbNjMmdF19ZnVuY3Rpb24gZih0LHIsZSl7Zm9yKHZhciBuLG89W10saT1yO2k8ZTtpKz0zKW49KHRbaV08PDE2JjE2NzExNjgwKSsodFtpKzFdPDw4JjY1MjgwKSsoMjU1JnRbaSsyXSksby5wdXNoKGEobikpO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIHModCl7Zm9yKHZhciByLGU9dC5sZW5ndGgsbj1lJTMsbz1bXSxpPTAsdT1lLW47aTx1O2krPTE2MzgzKW8ucHVzaChmKHQsaSxpKzE2MzgzPnU/dTppKzE2MzgzKSk7cmV0dXJuIDE9PT1uPyhyPXRbZS0xXSxvLnB1c2goaFtyPj4yXStoW3I8PDQmNjNdKyI9PSIpKToyPT09biYmKHI9KHRbZS0yXTw8OCkrdFtlLTFdLG8ucHVzaChoW3I+PjEwXStoW3I+PjQmNjNdK2hbcjw8MiY2M10rIj0iKSksby5qb2luKCIiKX1lLmJ5dGVMZW5ndGg9byxlLnRvQnl0ZUFycmF5PXUsZS5mcm9tQnl0ZUFycmF5PXMKO2Zvcih2YXIgaD1bXSxjPVtdLGw9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksZz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIscD0wLGQ9Zy5sZW5ndGg7cDxkOysrcCloW3BdPWdbcF0sY1tnLmNoYXJDb2RlQXQocCldPXA7Y1siLSIuY2hhckNvZGVBdCgwKV09NjIsY1siXyIuY2hhckNvZGVBdCgwKV09NjN9LHt9XSwzMDpbZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe2lmKHQ+JCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlICInK3QrJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICJzaXplIicpO3ZhciByPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YocixvLnByb3RvdHlwZSkscn1mdW5jdGlvbiBvKHQscixlKXtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInN0cmluZyIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtyZXR1cm4gZih0KX1yZXR1cm4gaSh0LHIsZSl9ZnVuY3Rpb24gaSh0LHIsZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBzKHQscik7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpKXJldHVybiBoKHQpO2lmKG51bGw9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgIit0eXBlb2YgdCk7aWYoSih0LEFycmF5QnVmZmVyKXx8dCYmSih0LmJ1ZmZlcixBcnJheUJ1ZmZlcikpcmV0dXJuIGModCxyLGUpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTt2YXIgbj10LnZhbHVlT2YmJnQudmFsdWVPZigpO2lmKG51bGwhPW4mJm4hPT10KXJldHVybiBvLmZyb20obixyLGUpO3ZhciBpPWwodCk7aWYoaSlyZXR1cm4gaTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmbnVsbCE9U3ltYm9sLnRvUHJpbWl0aXZlJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtTeW1ib2wudG9QcmltaXRpdmVdKXJldHVybiBvLmZyb20odFtTeW1ib2wudG9QcmltaXRpdmVdKCJzdHJpbmciKSxyLGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICIrdHlwZW9mIHQpfWZ1bmN0aW9uIHUodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgIicrdCsnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gInNpemUiJyl9ZnVuY3Rpb24gYSh0LHIsZSl7cmV0dXJuIHUodCksdDw9MD9uKHQpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBlP24odCkuZmlsbChyLGUpOm4odCkuZmlsbChyKTpuKHQpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHUodCksbih0PDA/MDowfGcodCkpfWZ1bmN0aW9uIHModCxyKXtpZigic3RyaW5nIj09dHlwZW9mIHImJiIiIT09cnx8KHI9InV0ZjgiKSwhby5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7dmFyIGU9MHxkKHQsciksaT1uKGUpLHU9aS53cml0ZSh0LHIpO3JldHVybiB1IT09ZSYmKGk9aS5zbGljZSgwLHUpKSxpfWZ1bmN0aW9uIGgodCl7Zm9yKHZhciByPXQubGVuZ3RoPDA/MDowfGcodC5sZW5ndGgpLGU9bihyKSxvPTA7bzxyO28rPTEpZVtvXT0yNTUmdFtvXTtyZXR1cm4gZX1mdW5jdGlvbiBjKHQscixlKXtpZihyPDB8fHQuYnl0ZUxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCcib2Zmc2V0IiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtpZih0LmJ5dGVMZW5ndGg8cisoZXx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJsZW5ndGgiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO3ZhciBuO3JldHVybiBuPXZvaWQgMD09PXImJnZvaWQgMD09PWU/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09ZT9uZXcgVWludDhBcnJheSh0LHIpOm5ldyBVaW50OEFycmF5KHQscixlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YobixvLnByb3RvdHlwZSksbn1mdW5jdGlvbiBsKHQpe2lmKG8uaXNCdWZmZXIodCkpe3ZhciByPTB8Zyh0Lmxlbmd0aCksZT1uKHIpO3JldHVybiAwPT09ZS5sZW5ndGg/ZToodC5jb3B5KGUsMCwwLHIpLGUpfXJldHVybiB2b2lkIDAhPT10Lmxlbmd0aD8ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHxLKHQubGVuZ3RoKT9uKDApOmgodCk6IkJ1ZmZlciI9PT10LnR5cGUmJkFycmF5LmlzQXJyYXkodC5kYXRhKT9oKHQuZGF0YSk6dm9pZCAwfWZ1bmN0aW9uIGcodCl7aWYodD49JCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrJC50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gcCh0KXtyZXR1cm4rdCE9dCYmKHQ9MCksby5hbGxvYygrdCl9ZnVuY3Rpb24gZCh0LHIpe2lmKG8uaXNCdWZmZXIodCkpcmV0dXJuIHQubGVuZ3RoO2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8Sih0LEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInN0cmluZyIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCk7dmFyIGU9dC5sZW5ndGgsbj1hcmd1bWVudHMubGVuZ3RoPjImJiEwPT09YXJndW1lbnRzWzJdO2lmKCFuJiYwPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9ITE7Oylzd2l0Y2gocil7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gZTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBEKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqZTtjYXNlImhleCI6cmV0dXJuIGU+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4geih0KS5sZW5ndGg7ZGVmYXVsdDppZihpKXJldHVybiBuPy0xOkQodCkubGVuZ3RoO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksaT0hMH19ZnVuY3Rpb24geSh0LHIsZSl7dmFyIG49ITE7aWYoKHZvaWQgMD09PXJ8fHI8MCkmJihyPTApLHI+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PWV8fGU+dGhpcy5sZW5ndGgpJiYoZT10aGlzLmxlbmd0aCksZTw9MClyZXR1cm4iIjtpZihlPj4+PTAscj4+Pj0wLGU8PXIpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBOKHRoaXMscixlKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBQKHRoaXMscixlKTtjYXNlImFzY2lpIjpyZXR1cm4gTSh0aGlzLHIsZSk7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gVSh0aGlzLHIsZSk7Y2FzZSJiYXNlNjQiOnJldHVybiBDKHRoaXMscixlKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFModGhpcyxyLGUpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gdih0LHIsZSl7dmFyIG49dFtyXTt0W3JdPXRbZV0sdFtlXT1ufWZ1bmN0aW9uIHcodCxyLGUsbixpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhuPWUsZT0wKTplPjIxNDc0ODM2NDc/ZT0yMTQ3NDgzNjQ3OmU8LTIxNDc0ODM2NDgmJihlPS0yMTQ3NDgzNjQ4KSxlPStlLEsoZSkmJihlPWk/MDp0Lmxlbmd0aC0xKSxlPDAmJihlPXQubGVuZ3RoK2UpLGU+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO2U9dC5sZW5ndGgtMX1lbHNlIGlmKGU8MCl7aWYoIWkpcmV0dXJuLTE7ZT0wfWlmKCJzdHJpbmciPT10eXBlb2YgciYmKHI9by5mcm9tKHIsbikpLG8uaXNCdWZmZXIocikpcmV0dXJuIDA9PT1yLmxlbmd0aD8tMTptKHQscixlLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiByKXJldHVybiByJj0yNTUsImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxyLGUpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxyLGUpOm0odCxbcl0sZSxuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIG0odCxyLGUsbixvKXtmdW5jdGlvbiBpKHQscil7cmV0dXJuIDE9PT11P3Rbcl06dC5yZWFkVUludDE2QkUocip1KX12YXIgdT0xLGE9dC5sZW5ndGgsZj1yLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxyLmxlbmd0aDwyKXJldHVybi0xO3U9MixhLz0yLGYvPTIsZS89Mn12YXIgcztpZihvKXt2YXIgaD0tMTtmb3Iocz1lO3M8YTtzKyspaWYoaSh0LHMpPT09aShyLC0xPT09aD8wOnMtaCkpe2lmKC0xPT09aCYmKGg9cykscy1oKzE9PT1mKXJldHVybiBoKnV9ZWxzZS0xIT09aCYmKHMtPXMtaCksaD0tMX1lbHNlIGZvcihlK2Y+YSYmKGU9YS1mKSxzPWU7cz49MDtzLS0pe2Zvcih2YXIgYz0hMCxsPTA7bDxmO2wrKylpZihpKHQscytsKSE9PWkocixsKSl7Yz0hMTticmVha31pZihjKXJldHVybiBzfXJldHVybi0xfWZ1bmN0aW9uIGIodCxyLGUsbil7ZT1OdW1iZXIoZSl8fDA7dmFyIG89dC5sZW5ndGgtZTtuPyhuPU51bWJlcihuKSk+byYmKG49byk6bj1vO3ZhciBpPXIubGVuZ3RoO24+aS8yJiYobj1pLzIpO2Zvcih2YXIgdT0wO3U8bjsrK3Upe3ZhciBhPXBhcnNlSW50KHIuc3Vic3RyKDIqdSwyKSwxNik7aWYoSyhhKSlyZXR1cm4gdTt0W2UrdV09YX1yZXR1cm4gdX1mdW5jdGlvbiBFKHQscixlLG4pe3JldHVybiBIKEQocix0Lmxlbmd0aC1lKSx0LGUsbil9ZnVuY3Rpb24gQSh0LHIsZSxuKXtyZXR1cm4gSChqKHIpLHQsZSxuKX1mdW5jdGlvbiBCKHQscixlLG4pe3JldHVybiBBKHQscixlLG4pfWZ1bmN0aW9uIFQodCxyLGUsbil7cmV0dXJuIEgoeihyKSx0LGUsbil9ZnVuY3Rpb24gUih0LHIsZSxuKXtyZXR1cm4gSChGKHIsdC5sZW5ndGgtZSksdCxlLG4pfWZ1bmN0aW9uIEModCxyLGUpe3JldHVybiAwPT09ciYmZT09PXQubGVuZ3RoP3EuZnJvbUJ5dGVBcnJheSh0KTpxLmZyb21CeXRlQXJyYXkodC5zbGljZShyLGUpKX1mdW5jdGlvbiBQKHQscixlKXtlPU1hdGgubWluKHQubGVuZ3RoLGUpO2Zvcih2YXIgbj1bXSxvPXI7bzxlOyl7dmFyIGk9dFtvXSx1PW51bGwsYT1pPjIzOT80Omk+MjIzPzM6aT4xOTE/MjoxO2lmKG8rYTw9ZSl7dmFyIGYscyxoLGM7c3dpdGNoKGEpe2Nhc2UgMTppPDEyOCYmKHU9aSk7YnJlYWs7Y2FzZSAyOmY9dFtvKzFdLDEyOD09KDE5MiZmKSYmKGM9KDMxJmkpPDw2fDYzJmYpPjEyNyYmKHU9Yyk7YnJlYWs7Y2FzZSAzOmY9dFtvKzFdLHM9dFtvKzJdLDEyOD09KDE5MiZmKSYmMTI4PT0oMTkyJnMpJiYoYz0oMTUmaSk8PDEyfCg2MyZmKTw8Nnw2MyZzKT4yMDQ3JiYoYzw1NTI5Nnx8Yz41NzM0MykmJih1PWMpO2JyZWFrO2Nhc2UgNDpmPXRbbysxXSxzPXRbbysyXSxoPXRbbyszXSwxMjg9PSgxOTImZikmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmgpJiYoYz0oMTUmaSk8PDE4fCg2MyZmKTw8MTJ8KDYzJnMpPDw2fDYzJmgpPjY1NTM1JiZjPDExMTQxMTImJih1PWMpfX1udWxsPT09dT8odT02NTUzMyxhPTEpOnU+NjU1MzUmJih1LT02NTUzNixuLnB1c2godT4+PjEwJjEwMjN8NTUyOTYpLHU9NTYzMjB8MTAyMyZ1KSxuLnB1c2godSksbys9YX1yZXR1cm4gSShuKX1mdW5jdGlvbiBJKHQpe3ZhciByPXQubGVuZ3RoO2lmKHI8PVgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO2Zvcih2YXIgZT0iIixuPTA7bjxyOyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKG4sbis9WCkpO3JldHVybiBlfWZ1bmN0aW9uIE0odCxyLGUpe3ZhciBuPSIiO2U9TWF0aC5taW4odC5sZW5ndGgsZSk7Zm9yKHZhciBvPXI7bzxlOysrbyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W29dKTtyZXR1cm4gbn1mdW5jdGlvbiBVKHQscixlKXt2YXIgbj0iIjtlPU1hdGgubWluKHQubGVuZ3RoLGUpO2Zvcih2YXIgbz1yO288ZTsrK28pbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W29dKTtyZXR1cm4gbn1mdW5jdGlvbiBOKHQscixlKXt2YXIgbj10Lmxlbmd0aDsoIXJ8fHI8MCkmJihyPTApLCghZXx8ZTwwfHxlPm4pJiYoZT1uKTtmb3IodmFyIG89IiIsaT1yO2k8ZTsrK2kpbys9V1t0W2ldXTtyZXR1cm4gb31mdW5jdGlvbiBTKHQscixlKXtmb3IodmFyIG49dC5zbGljZShyLGUpLG89IiIsaT0wO2k8bi5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5baV0rMjU2Km5baSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gTCh0LHIsZSl7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrcj5lKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24geCh0LHIsZSxuLGksdSl7aWYoIW8uaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHI+aXx8cjx1KXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihlK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIF8odCxyLGUsbixvLGkpe2lmKGUrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBrKHQscixlLG4sbyl7cmV0dXJuIHI9K3IsZT4+Pj0wLG98fF8odCxyLGUsNCwzLjQwMjgyMzQ2NjM4NTI4ODZlMzgsLTMuNDAyODIzNDY2Mzg1Mjg4NmUzOCksVi53cml0ZSh0LHIsZSxuLDIzLDQpLGUrNH1mdW5jdGlvbiBPKHQscixlLG4sbyl7cmV0dXJuIHI9K3IsZT4+Pj0wLG98fF8odCxyLGUsOCwxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LC0xLjc5NzY5MzEzNDg2MjMxNTdlMzA4KSxWLndyaXRlKHQscixlLG4sNTIsOCksZSs4fWZ1bmN0aW9uIFkodCl7aWYodD10LnNwbGl0KCI9IilbMF0sdD10LnRyaW0oKS5yZXBsYWNlKFosIiIpLHQubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9ZnVuY3Rpb24gRCh0LHIpe3I9cnx8MS8wO2Zvcih2YXIgZSxuPXQubGVuZ3RoLG89bnVsbCxpPVtdLHU9MDt1PG47Kyt1KXtpZigoZT10LmNoYXJDb2RlQXQodSkpPjU1Mjk1JiZlPDU3MzQ0KXtpZighbyl7aWYoZT41NjMxOSl7KHItPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHUrMT09PW4peyhyLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1vPWU7Y29udGludWV9aWYoZTw1NjMyMCl7KHItPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpLG89ZTtjb250aW51ZX1lPTY1NTM2KyhvLTU1Mjk2PDwxMHxlLTU2MzIwKX1lbHNlIG8mJihyLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtpZihvPW51bGwsZTwxMjgpe2lmKChyLT0xKTwwKWJyZWFrO2kucHVzaChlKX1lbHNlIGlmKGU8MjA0OCl7aWYoKHItPTIpPDApYnJlYWs7aS5wdXNoKGU+PjZ8MTkyLDYzJmV8MTI4KX1lbHNlIGlmKGU8NjU1MzYpe2lmKChyLT0zKTwwKWJyZWFrO2kucHVzaChlPj4xMnwyMjQsZT4+NiY2M3wxMjgsNjMmZXwxMjgpfWVsc2V7aWYoIShlPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHItPTQpPDApYnJlYWs7aS5wdXNoKGU+PjE4fDI0MCxlPj4xMiY2M3wxMjgsZT4+NiY2M3wxMjgsNjMmZXwxMjgpfX1yZXR1cm4gaX1mdW5jdGlvbiBqKHQpe2Zvcih2YXIgcj1bXSxlPTA7ZTx0Lmxlbmd0aDsrK2Upci5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQoZSkpO3JldHVybiByfWZ1bmN0aW9uIEYodCxyKXtmb3IodmFyIGUsbixvLGk9W10sdT0wO3U8dC5sZW5ndGgmJiEoKHItPTIpPDApOysrdSllPXQuY2hhckNvZGVBdCh1KSxuPWU+Pjgsbz1lJTI1NixpLnB1c2gobyksaS5wdXNoKG4pO3JldHVybiBpfWZ1bmN0aW9uIHoodCl7cmV0dXJuIHEudG9CeXRlQXJyYXkoWSh0KSl9ZnVuY3Rpb24gSCh0LHIsZSxuKXtmb3IodmFyIG89MDtvPG4mJiEobytlPj1yLmxlbmd0aHx8bz49dC5sZW5ndGgpOysrbylyW28rZV09dFtvXTtyZXR1cm4gb31mdW5jdGlvbiBKKHQscil7cmV0dXJuIHQgaW5zdGFuY2VvZiByfHxudWxsIT10JiZudWxsIT10LmNvbnN0cnVjdG9yJiZudWxsIT10LmNvbnN0cnVjdG9yLm5hbWUmJnQuY29uc3RydWN0b3IubmFtZT09PXIubmFtZX1mdW5jdGlvbiBLKHQpe3JldHVybiB0IT09dH12YXIgcT10KCJiYXNlNjQtanMiKSxWPXQoImllZWU3NTQiKSxRPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wuZm9yP1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIik6bnVsbDtlLkJ1ZmZlcj1vLGUuU2xvd0J1ZmZlcj1wLGUuSU5TUEVDVF9NQVhfQllURVM9NTA7dmFyICQ9MjE0NzQ4MzY0NztlLmtNYXhMZW5ndGg9JCxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMSkscj17Zm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX07cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLFVpbnQ4QXJyYXkucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodCxyKSw0Mj09PXQuZm9vKCl9Y2F0Y2godCl7cmV0dXJuITF9fSgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVHx8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlfHwiZnVuY3Rpb24iIT10eXBlb2YgY29uc29sZS5lcnJvcnx8Y29uc29sZS5lcnJvcigiVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5IGBidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuIiksT2JqZWN0LmRlZmluZVByb3BlcnR5KG8ucHJvdG90eXBlLCJwYXJlbnQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKG8uaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnVmZmVyfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwib2Zmc2V0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZihvLmlzQnVmZmVyKHRoaXMpKXJldHVybiB0aGlzLmJ5dGVPZmZzZXR9fSksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPVN5bWJvbC5zcGVjaWVzJiZvW1N5bWJvbC5zcGVjaWVzXT09PW8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiExfSksby5wb29sU2l6ZT04MTkyLG8uZnJvbT1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIGkodCxyLGUpfSxPYmplY3Quc2V0UHJvdG90eXBlT2Yoby5wcm90b3R5cGUsVWludDhBcnJheS5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihvLFVpbnQ4QXJyYXkpLG8uYWxsb2M9ZnVuY3Rpb24odCxyLGUpe3JldHVybiBhKHQscixlKX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gZih0KX0sby5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGYodCl9LG8uaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiEwPT09dC5faXNCdWZmZXImJnQhPT1vLnByb3RvdHlwZX0sby5jb21wYXJlPWZ1bmN0aW9uKHQscil7aWYoSih0LFVpbnQ4QXJyYXkpJiYodD1vLmZyb20odCx0Lm9mZnNldCx0LmJ5dGVMZW5ndGgpKSxKKHIsVWludDhBcnJheSkmJihyPW8uZnJvbShyLHIub2Zmc2V0LHIuYnl0ZUxlbmd0aCkpLCFvLmlzQnVmZmVyKHQpfHwhby5pc0J1ZmZlcihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImJ1ZjEiLCAiYnVmMiIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtpZih0PT09cilyZXR1cm4gMDtmb3IodmFyIGU9dC5sZW5ndGgsbj1yLmxlbmd0aCxpPTAsdT1NYXRoLm1pbihlLG4pO2k8dTsrK2kpaWYodFtpXSE9PXJbaV0pe2U9dFtpXSxuPXJbaV07YnJlYWt9cmV0dXJuIGU8bj8tMTpuPGU/MTowfSxvLmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LG8uY29uY2F0PWZ1bmN0aW9uKHQscil7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gby5hbGxvYygwKTt2YXIgZTtpZih2b2lkIDA9PT1yKWZvcihyPTAsZT0wO2U8dC5sZW5ndGg7KytlKXIrPXRbZV0ubGVuZ3RoO3ZhciBuPW8uYWxsb2NVbnNhZmUociksaT0wO2ZvcihlPTA7ZTx0Lmxlbmd0aDsrK2Upe3ZhciB1PXRbZV07aWYoSih1LFVpbnQ4QXJyYXkpJiYodT1vLmZyb20odSkpLCFvLmlzQnVmZmVyKHUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTt1LmNvcHkobixpKSxpKz11Lmxlbmd0aH1yZXR1cm4gbn0sby5ieXRlTGVuZ3RoPWQsby5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLG8ucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHI9MDtyPHQ7cis9Mil2KHRoaXMscixyKzEpO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciByPTA7cjx0O3IrPTQpdih0aGlzLHIsciszKSx2KHRoaXMscisxLHIrMik7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHI9MDtyPHQ7cis9OCl2KHRoaXMscixyKzcpLHYodGhpcyxyKzEscis2KSx2KHRoaXMscisyLHIrNSksdih0aGlzLHIrMyxyKzQpO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9QKHRoaXMsMCx0KTp5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmc9by5wcm90b3R5cGUudG9TdHJpbmcsby5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFvLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1vLmNvbXBhcmUodGhpcyx0KX0sby5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiLHI9ZS5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdD10aGlzLnRvU3RyaW5nKCJoZXgiLDAscikucmVwbGFjZSgvKC57Mn0pL2csIiQxICIpLnRyaW0oKSx0aGlzLmxlbmd0aD5yJiYodCs9IiAuLi4gIiksIjxCdWZmZXIgIit0KyI+In0sUSYmKG8ucHJvdG90eXBlW1FdPW8ucHJvdG90eXBlLmluc3BlY3QpLG8ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxyLGUsbixpKXtpZihKKHQsVWludDhBcnJheSkmJih0PW8uZnJvbSh0LHQub2Zmc2V0LHQuYnl0ZUxlbmd0aCkpLCFvLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAidGFyZ2V0IiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHQpO2lmKHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PWUmJihlPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHI8MHx8ZT50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZyPj1lKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYocj49ZSlyZXR1cm4gMTtpZihyPj4+PTAsZT4+Pj0wLG4+Pj49MCxpPj4+PTAsdGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciB1PWktbixhPWUtcixmPU1hdGgubWluKHUsYSkscz10aGlzLnNsaWNlKG4saSksaD10LnNsaWNlKHIsZSksYz0wO2M8ZjsrK2MpaWYoc1tjXSE9PWhbY10pe3U9c1tjXSxhPWhbY107YnJlYWt9cmV0dXJuIHU8YT8tMTphPHU/MTowfSxvLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LHIsZSl7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxyLGUpfSxvLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gdyh0aGlzLHQscixlLCEwKX0sby5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxyLGUpe3JldHVybiB3KHRoaXMsdCxyLGUsITEpfSxvLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LHIsZSxuKXtpZih2b2lkIDA9PT1yKW49InV0ZjgiLGU9dGhpcy5sZW5ndGgscj0wO2Vsc2UgaWYodm9pZCAwPT09ZSYmInN0cmluZyI9PXR5cGVvZiByKW49cixlPXRoaXMubGVuZ3RoLHI9MDtlbHNle2lmKCFpc0Zpbml0ZShyKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7cj4+Pj0wLGlzRmluaXRlKGUpPyhlPj4+PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49ZSxlPXZvaWQgMCl9dmFyIG89dGhpcy5sZW5ndGgtcjtpZigodm9pZCAwPT09ZXx8ZT5vKSYmKGU9byksdC5sZW5ndGg+MCYmKGU8MHx8cjwwKXx8cj50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgaT0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIGIodGhpcyx0LHIsZSk7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gRSh0aGlzLHQscixlKTtjYXNlImFzY2lpIjpyZXR1cm4gQSh0aGlzLHQscixlKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBCKHRoaXMsdCxyLGUpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gVCh0aGlzLHQscixlKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFIodGhpcyx0LHIsZSk7ZGVmYXVsdDppZihpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxpPSEwfX0sby5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgWD00MDk2O28ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQscil7dmFyIGU9dGhpcy5sZW5ndGg7dD1+fnQscj12b2lkIDA9PT1yP2U6fn5yLHQ8MD8odCs9ZSk8MCYmKHQ9MCk6dD5lJiYodD1lKSxyPDA/KHIrPWUpPDAmJihyPTApOnI+ZSYmKHI9ZSkscjx0JiYocj10KTt2YXIgbj10aGlzLnN1YmFycmF5KHQscik7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihuLG8ucHJvdG90eXBlKSxufSxvLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQscixlKXt0Pj4+PTAscj4+Pj0wLGV8fEwodCxyLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxvPTEsaT0wOysraTxyJiYobyo9MjU2KTspbis9dGhpc1t0K2ldKm87cmV0dXJuIG59LG8ucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxyLGUpe3Q+Pj49MCxyPj4+PTAsZXx8TCh0LHIsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1yXSxvPTE7cj4wJiYobyo9MjU2KTspbis9dGhpc1t0Ky0tcl0qbztyZXR1cm4gbn0sby5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQscil7cmV0dXJuIHQ+Pj49MCxyfHxMKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sby5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQscil7cmV0dXJuIHQ+Pj49MCxyfHxMKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LG8ucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LHIpe3JldHVybiB0Pj4+PTAscnx8TCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxvLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdD4+Pj0wLHJ8fEwodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxvLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdD4+Pj0wLHJ8fEwodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSxvLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxyLGUpe3Q+Pj49MCxyPj4+PTAsZXx8TCh0LHIsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLG89MSxpPTA7KytpPHImJihvKj0yNTYpOyluKz10aGlzW3QraV0qbztyZXR1cm4gbyo9MTI4LG4+PW8mJihuLT1NYXRoLnBvdygyLDgqcikpLG59LG8ucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LHIsZSl7dD4+Pj0wLHI+Pj49MCxlfHxMKHQscix0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXIsbz0xLGk9dGhpc1t0Ky0tbl07bj4wJiYobyo9MjU2KTspaSs9dGhpc1t0Ky0tbl0qbztyZXR1cm4gbyo9MTI4LGk+PW8mJihpLT1NYXRoLnBvdygyLDgqcikpLGl9LG8ucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQscil7cmV0dXJuIHQ+Pj49MCxyfHxMKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/LTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LG8ucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQscil7dD4+Pj0wLHJ8fEwodCwyLHRoaXMubGVuZ3RoKTt2YXIgZT10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3NjgmZT80Mjk0OTAxNzYwfGU6ZX0sby5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxyKXt0Pj4+PTAscnx8TCh0LDIsdGhpcy5sZW5ndGgpO3ZhciBlPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZlPzQyOTQ5MDE3NjB8ZTplfSxvLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LHIpe3JldHVybiB0Pj4+PTAscnx8TCh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sby5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdD4+Pj0wLHJ8fEwodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LG8ucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQscil7cmV0dXJuIHQ+Pj49MCxyfHxMKHQsNCx0aGlzLmxlbmd0aCksVi5yZWFkKHRoaXMsdCwhMCwyMyw0KX0sby5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdD4+Pj0wLHJ8fEwodCw0LHRoaXMubGVuZ3RoKSxWLnJlYWQodGhpcyx0LCExLDIzLDQpfSxvLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdD4+Pj0wLHJ8fEwodCw4LHRoaXMubGVuZ3RoKSxWLnJlYWQodGhpcyx0LCEwLDUyLDgpfSxvLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdD4+Pj0wLHJ8fEwodCw4LHRoaXMubGVuZ3RoKSxWLnJlYWQodGhpcyx0LCExLDUyLDgpfSxvLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LHIsZSxuKXtpZih0PSt0LHI+Pj49MCxlPj4+PTAsIW4pe3godGhpcyx0LHIsZSxNYXRoLnBvdygyLDgqZSktMSwwKX12YXIgbz0xLGk9MDtmb3IodGhpc1tyXT0yNTUmdDsrK2k8ZSYmKG8qPTI1Nik7KXRoaXNbcitpXT10L28mMjU1O3JldHVybiByK2V9LG8ucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQscixlLG4pe2lmKHQ9K3Qscj4+Pj0wLGU+Pj49MCwhbil7eCh0aGlzLHQscixlLE1hdGgucG93KDIsOCplKS0xLDApfXZhciBvPWUtMSxpPTE7Zm9yKHRoaXNbcitvXT0yNTUmdDstLW8+PTAmJihpKj0yNTYpOyl0aGlzW3Irb109dC9pJjI1NTtyZXR1cm4gcitlfSxvLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gdD0rdCxyPj4+PTAsZXx8eCh0aGlzLHQsciwxLDI1NSwwKSx0aGlzW3JdPTI1NSZ0LHIrMX0sby5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIHQ9K3Qscj4+Pj0wLGV8fHgodGhpcyx0LHIsMiw2NTUzNSwwKSx0aGlzW3JdPTI1NSZ0LHRoaXNbcisxXT10Pj4+OCxyKzJ9LG8ucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxyLGUpe3JldHVybiB0PSt0LHI+Pj49MCxlfHx4KHRoaXMsdCxyLDIsNjU1MzUsMCksdGhpc1tyXT10Pj4+OCx0aGlzW3IrMV09MjU1JnQscisyfSxvLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gdD0rdCxyPj4+PTAsZXx8eCh0aGlzLHQsciw0LDQyOTQ5NjcyOTUsMCksdGhpc1tyKzNdPXQ+Pj4yNCx0aGlzW3IrMl09dD4+PjE2LHRoaXNbcisxXT10Pj4+OCx0aGlzW3JdPTI1NSZ0LHIrNH0sby5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIHQ9K3Qscj4+Pj0wLGV8fHgodGhpcyx0LHIsNCw0Mjk0OTY3Mjk1LDApLHRoaXNbcl09dD4+PjI0LHRoaXNbcisxXT10Pj4+MTYsdGhpc1tyKzJdPXQ+Pj44LHRoaXNbciszXT0yNTUmdCxyKzR9LG8ucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxyLGUsbil7aWYodD0rdCxyPj4+PTAsIW4pe3ZhciBvPU1hdGgucG93KDIsOCplLTEpO3godGhpcyx0LHIsZSxvLTEsLW8pfXZhciBpPTAsdT0xLGE9MDtmb3IodGhpc1tyXT0yNTUmdDsrK2k8ZSYmKHUqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW3IraS0xXSYmKGE9MSksdGhpc1tyK2ldPSh0L3U+PjApLWEmMjU1O3JldHVybiByK2V9LG8ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxyLGUsbil7aWYodD0rdCxyPj4+PTAsIW4pe3ZhciBvPU1hdGgucG93KDIsOCplLTEpO3godGhpcyx0LHIsZSxvLTEsLW8pfXZhciBpPWUtMSx1PTEsYT0wO2Zvcih0aGlzW3IraV09MjU1JnQ7LS1pPj0wJiYodSo9MjU2KTspdDwwJiYwPT09YSYmMCE9PXRoaXNbcitpKzFdJiYoYT0xKSx0aGlzW3IraV09KHQvdT4+MCktYSYyNTU7cmV0dXJuIHIrZX0sby5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gdD0rdCxyPj4+PTAsZXx8eCh0aGlzLHQsciwxLDEyNywtMTI4KSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbcl09MjU1JnQscisxfSxvLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxyLGUpe3JldHVybiB0PSt0LHI+Pj49MCxlfHx4KHRoaXMsdCxyLDIsMzI3NjcsLTMyNzY4KSx0aGlzW3JdPTI1NSZ0LHRoaXNbcisxXT10Pj4+OCxyKzJ9LG8ucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIHQ9K3Qscj4+Pj0wLGV8fHgodGhpcyx0LHIsMiwzMjc2NywtMzI3NjgpLHRoaXNbcl09dD4+PjgsdGhpc1tyKzFdPTI1NSZ0LHIrMn0sby5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gdD0rdCxyPj4+PTAsZXx8eCh0aGlzLHQsciw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHRoaXNbcl09MjU1JnQsdGhpc1tyKzFdPXQ+Pj44LHRoaXNbcisyXT10Pj4+MTYsdGhpc1tyKzNdPXQ+Pj4yNCxyKzR9LG8ucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIHQ9K3Qscj4+Pj0wLGV8fHgodGhpcyx0LHIsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSx0aGlzW3JdPXQ+Pj4yNCx0aGlzW3IrMV09dD4+PjE2LHRoaXNbcisyXT10Pj4+OCx0aGlzW3IrM109MjU1JnQscis0fSxvLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxyLGUpe3JldHVybiBrKHRoaXMsdCxyLCEwLGUpfSxvLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxyLGUpe3JldHVybiBrKHRoaXMsdCxyLCExLGUpfSxvLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gTyh0aGlzLHQsciwhMCxlKX0sby5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIE8odGhpcyx0LHIsITEsZSl9LG8ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxyLGUsbil7aWYoIW8uaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyIik7aWYoZXx8KGU9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxyPj10Lmxlbmd0aCYmKHI9dC5sZW5ndGgpLHJ8fChyPTApLG4+MCYmbjxlJiYobj1lKSxuPT09ZSlyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihlPDB8fGU+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLXI8bi1lJiYobj10Lmxlbmd0aC1yK2UpO3ZhciBpPW4tZTtpZih0aGlzPT09dCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4pdGhpcy5jb3B5V2l0aGluKHIsZSxuKTtlbHNlIGlmKHRoaXM9PT10JiZlPHImJnI8bilmb3IodmFyIHU9aS0xO3U+PTA7LS11KXRbdStyXT10aGlzW3UrZV07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkoZSxuKSxyKTtyZXR1cm4gaX0sby5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LHIsZSxuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCxlPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIGUmJihuPWUsZT10aGlzLmxlbmd0aCksdm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFvLmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtpZigxPT09dC5sZW5ndGgpe3ZhciBpPXQuY2hhckNvZGVBdCgwKTsoInV0ZjgiPT09biYmaTwxMjh8fCJsYXRpbjEiPT09bikmJih0PWkpfX1lbHNlIm51bWJlciI9PXR5cGVvZiB0P3QmPTI1NToiYm9vbGVhbiI9PXR5cGVvZiB0JiYodD1OdW1iZXIodCkpO2lmKHI8MHx8dGhpcy5sZW5ndGg8cnx8dGhpcy5sZW5ndGg8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYoZTw9cilyZXR1cm4gdGhpcztyPj4+PTAsZT12b2lkIDA9PT1lP3RoaXMubGVuZ3RoOmU+Pj4wLHR8fCh0PTApO3ZhciB1O2lmKCJudW1iZXIiPT10eXBlb2YgdClmb3IodT1yO3U8ZTsrK3UpdGhpc1t1XT10O2Vsc2V7dmFyIGE9by5pc0J1ZmZlcih0KT90Om8uZnJvbSh0LG4pLGY9YS5sZW5ndGg7aWYoMD09PWYpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlICInK3QrJyIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgInZhbHVlIicpO2Zvcih1PTA7dTxlLXI7Kyt1KXRoaXNbdStyXT1hW3UlZl19cmV0dXJuIHRoaXN9O3ZhciBaPS9bXitcLzAtOUEtWmEtei1fXS9nLFc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KDI1Nikscj0wO3I8MTY7KytyKWZvcih2YXIgZT0xNipyLG49MDtuPDE2Oysrbil0W2Urbl09IjAxMjM0NTY3ODlhYmNkZWYiW3JdKyIwMTIzNDU2Nzg5YWJjZGVmIltuXTtyZXR1cm4gdH0oKX0seyJiYXNlNjQtanMiOjI5LGllZWU3NTQ6MzJ9XSwzMTpbZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj17c2luZ2xlX3NvdXJjZV9zaG9ydGVzdF9wYXRoczpmdW5jdGlvbih0LHIsZSl7dmFyIG89e30saT17fTtpW3JdPTA7dmFyIHU9bi5Qcmlvcml0eVF1ZXVlLm1ha2UoKTt1LnB1c2gociwwKTtmb3IodmFyIGEsZixzLGgsYyxsLGcscDshdS5lbXB0eSgpOyl7YT11LnBvcCgpLGY9YS52YWx1ZSxoPWEuY29zdCxjPXRbZl18fHt9O2ZvcihzIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShzKSYmKGw9Y1tzXSxnPWgrbCxwPWlbc10sKHZvaWQgMD09PWlbc118fHA+ZykmJihpW3NdPWcsdS5wdXNoKHMsZyksb1tzXT1mKSl9aWYodm9pZCAwIT09ZSYmdm9pZCAwPT09aVtlXSl7dmFyIGQ9WyJDb3VsZCBub3QgZmluZCBhIHBhdGggZnJvbSAiLHIsIiB0byAiLGUsIi4iXS5qb2luKCIiKTt0aHJvdyBuZXcgRXJyb3IoZCl9cmV0dXJuIG99LGV4dHJhY3Rfc2hvcnRlc3RfcGF0aF9mcm9tX3ByZWRlY2Vzc29yX2xpc3Q6ZnVuY3Rpb24odCxyKXtmb3IodmFyIGU9W10sbj1yO247KWUucHVzaChuKSx0W25dLG49dFtuXTtyZXR1cm4gZS5yZXZlcnNlKCksZX0sZmluZF9wYXRoOmZ1bmN0aW9uKHQscixlKXt2YXIgbz1uLnNpbmdsZV9zb3VyY2Vfc2hvcnRlc3RfcGF0aHModCxyLGUpO3JldHVybiBuLmV4dHJhY3Rfc2hvcnRlc3RfcGF0aF9mcm9tX3ByZWRlY2Vzc29yX2xpc3QobyxlKX0sUHJpb3JpdHlRdWV1ZTp7bWFrZTpmdW5jdGlvbih0KXt2YXIgcixlPW4uUHJpb3JpdHlRdWV1ZSxvPXt9O3Q9dHx8e307Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiYob1tyXT1lW3JdKTtyZXR1cm4gby5xdWV1ZT1bXSxvLnNvcnRlcj10LnNvcnRlcnx8ZS5kZWZhdWx0X3NvcnRlcixvfSxkZWZhdWx0X3NvcnRlcjpmdW5jdGlvbih0LHIpe3JldHVybiB0LmNvc3Qtci5jb3N0fSxwdXNoOmZ1bmN0aW9uKHQscil7dmFyIGU9e3ZhbHVlOnQsY29zdDpyfTt0aGlzLnF1ZXVlLnB1c2goZSksdGhpcy5xdWV1ZS5zb3J0KHRoaXMuc29ydGVyKX0scG9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVldWUuc2hpZnQoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMucXVldWUubGVuZ3RofX19O3ZvaWQgMCE9PXImJihyLmV4cG9ydHM9bil9LHt9XSwzMjpbZnVuY3Rpb24odCxyLGUpe2UucmVhZD1mdW5jdGlvbih0LHIsZSxuLG8pe3ZhciBpLHUsYT04Km8tbi0xLGY9KDE8PGEpLTEscz1mPj4xLGg9LTcsYz1lP28tMTowLGw9ZT8tMToxLGc9dFtyK2NdO2ZvcihjKz1sLGk9ZyYoMTw8LWgpLTEsZz4+PS1oLGgrPWE7aD4wO2k9MjU2KmkrdFtyK2NdLGMrPWwsaC09OCk7Zm9yKHU9aSYoMTw8LWgpLTEsaT4+PS1oLGgrPW47aD4wO3U9MjU2KnUrdFtyK2NdLGMrPWwsaC09OCk7aWYoMD09PWkpaT0xLXM7ZWxzZXtpZihpPT09ZilyZXR1cm4gdT9OYU46MS8wKihnPy0xOjEpO3UrPU1hdGgucG93KDIsbiksaS09c31yZXR1cm4oZz8tMToxKSp1Kk1hdGgucG93KDIsaS1uKX0sZS53cml0ZT1mdW5jdGlvbih0LHIsZSxuLG8saSl7dmFyIHUsYSxmLHM9OCppLW8tMSxoPSgxPDxzKS0xLGM9aD4+MSxsPTIzPT09bz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZz1uPzA6aS0xLHA9bj8xOi0xLGQ9cjwwfHwwPT09ciYmMS9yPDA/MTowO2ZvcihyPU1hdGguYWJzKHIpLGlzTmFOKHIpfHxyPT09MS8wPyhhPWlzTmFOKHIpPzE6MCx1PWgpOih1PU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjIpLHIqKGY9TWF0aC5wb3coMiwtdSkpPDEmJih1LS0sZio9Mikscis9dStjPj0xP2wvZjpsKk1hdGgucG93KDIsMS1jKSxyKmY+PTImJih1KyssZi89MiksdStjPj1oPyhhPTAsdT1oKTp1K2M+PTE/KGE9KHIqZi0xKSpNYXRoLnBvdygyLG8pLHUrPWMpOihhPXIqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsbyksdT0wKSk7bz49ODt0W2UrZ109MjU1JmEsZys9cCxhLz0yNTYsby09OCk7Zm9yKHU9dTw8b3xhLHMrPW87cz4wO3RbZStnXT0yNTUmdSxnKz1wLHUvPTI1NixzLT04KTt0W2UrZy1wXXw9MTI4KmR9fSx7fV0sMzM6W2Z1bmN0aW9uKHQscixlKXt2YXIgbj17fS50b1N0cmluZztyLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09bi5jYWxsKHQpfX0se31dfSx7fSxbMjRdKSgyNCl9KTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXJjb2RlLm1pbi5qcy5tYXAK"},{"meta":{"name":"crypto-js.js","url":"https://cdn.jsdelivr.net/npm/crypto-js@4.0.0/crypto-js.js","ts":1637743664283,"mimetype":"text/javascript"},"source":"OyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoJaWYgKHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IikgewoJCS8vIENvbW1vbkpTCgkJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeSgpOwoJfQoJZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CgkJLy8gQU1ECgkJZGVmaW5lKFtdLCBmYWN0b3J5KTsKCX0KCWVsc2UgewoJCS8vIEdsb2JhbCAoYnJvd3NlcikKCQlyb290LkNyeXB0b0pTID0gZmFjdG9yeSgpOwoJfQp9KHRoaXMsIGZ1bmN0aW9uICgpIHsKCgkvKmdsb2JhbHMgd2luZG93LCBnbG9iYWwsIHJlcXVpcmUqLwoKCS8qKgoJICogQ3J5cHRvSlMgY29yZSBjb21wb25lbnRzLgoJICovCgl2YXIgQ3J5cHRvSlMgPSBDcnlwdG9KUyB8fCAoZnVuY3Rpb24gKE1hdGgsIHVuZGVmaW5lZCkgewoKCSAgICB2YXIgY3J5cHRvOwoKCSAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd2luZG93IChCcm93c2VyKQoJICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvKSB7CgkgICAgICAgIGNyeXB0byA9IHdpbmRvdy5jcnlwdG87CgkgICAgfQoKCSAgICAvLyBOYXRpdmUgKGV4cGVyaW1lbnRhbCBJRSAxMSkgY3J5cHRvIGZyb20gd2luZG93IChCcm93c2VyKQoJICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5tc0NyeXB0bykgewoJICAgICAgICBjcnlwdG8gPSB3aW5kb3cubXNDcnlwdG87CgkgICAgfQoKCSAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gZ2xvYmFsIChOb2RlSlMpCgkgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLmNyeXB0bykgewoJICAgICAgICBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvOwoJICAgIH0KCgkgICAgLy8gTmF0aXZlIGNyeXB0byBpbXBvcnQgdmlhIHJlcXVpcmUgKE5vZGVKUykKCSAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykgewoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7CgkgICAgICAgIH0gY2F0Y2ggKGVycikge30KCSAgICB9CgoJICAgIC8qCgkgICAgICogQ3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHBzZXVkb3JhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCgkgICAgICoKCSAgICAgKiBBcyBNYXRoLnJhbmRvbSgpIGlzIGNyeXB0b2dyYXBoaWNhbGx5IG5vdCBzYWZlIHRvIHVzZQoJICAgICAqLwoJICAgIHZhciBjcnlwdG9TZWN1cmVSYW5kb21JbnQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIGlmIChjcnlwdG8pIHsKCSAgICAgICAgICAgIC8vIFVzZSBnZXRSYW5kb21WYWx1ZXMgbWV0aG9kIChCcm93c2VyKQoJICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7CgkgICAgICAgICAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTsKCSAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gVXNlIHJhbmRvbUJ5dGVzIG1ldGhvZCAoTm9kZUpTKQoJICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgPT09ICdmdW5jdGlvbicpIHsKCSAgICAgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLnJlYWRJbnQzMkxFKCk7CgkgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgoJICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdGl2ZSBjcnlwdG8gbW9kdWxlIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGdldCBzZWN1cmUgcmFuZG9tIG51bWJlci4nKTsKCSAgICB9OwoKCSAgICAvKgoJICAgICAqIExvY2FsIHBvbHlmaWxsIG9mIE9iamVjdC5jcmVhdGUKCgkgICAgICovCgkgICAgdmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgZnVuY3Rpb24gRigpIHt9CgoJICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewoJICAgICAgICAgICAgdmFyIHN1YnR5cGU7CgoJICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBvYmo7CgoJICAgICAgICAgICAgc3VidHlwZSA9IG5ldyBGKCk7CgoJICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBudWxsOwoKCSAgICAgICAgICAgIHJldHVybiBzdWJ0eXBlOwoJICAgICAgICB9OwoJICAgIH0oKSkKCgkgICAgLyoqCgkgICAgICogQ3J5cHRvSlMgbmFtZXNwYWNlLgoJICAgICAqLwoJICAgIHZhciBDID0ge307CgoJICAgIC8qKgoJICAgICAqIExpYnJhcnkgbmFtZXNwYWNlLgoJICAgICAqLwoJICAgIHZhciBDX2xpYiA9IEMubGliID0ge307CgoJICAgIC8qKgoJICAgICAqIEJhc2Ugb2JqZWN0IGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlLgoJICAgICAqLwoJICAgIHZhciBCYXNlID0gQ19saWIuQmFzZSA9IChmdW5jdGlvbiAoKSB7CgoKCSAgICAgICAgcmV0dXJuIHsKCSAgICAgICAgICAgIC8qKgoJICAgICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoaXMgb2JqZWN0LgoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdmVycmlkZXMgUHJvcGVydGllcyB0byBjb3B5IGludG8gdGhlIG5ldyBvYmplY3QuCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IG9iamVjdC4KCSAgICAgICAgICAgICAqCgkgICAgICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICAgICAqCgkgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7CgkgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnLAoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAgKiAgICAgICAgIH0KCSAgICAgICAgICAgICAqICAgICB9KTsKCSAgICAgICAgICAgICAqLwoJICAgICAgICAgICAgZXh0ZW5kOiBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7CgkgICAgICAgICAgICAgICAgLy8gU3Bhd24KCSAgICAgICAgICAgICAgICB2YXIgc3VidHlwZSA9IGNyZWF0ZSh0aGlzKTsKCgkgICAgICAgICAgICAgICAgLy8gQXVnbWVudAoJICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgc3VidHlwZS5taXhJbihvdmVycmlkZXMpOwoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGRlZmF1bHQgaW5pdGlhbGl6ZXIKCSAgICAgICAgICAgICAgICBpZiAoIXN1YnR5cGUuaGFzT3duUHJvcGVydHkoJ2luaXQnKSB8fCB0aGlzLmluaXQgPT09IHN1YnR5cGUuaW5pdCkgewoJICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkgICAgICAgICAgICAgICAgICAgIH07CgkgICAgICAgICAgICAgICAgfQoKCSAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplcidzIHByb3RvdHlwZSBpcyB0aGUgc3VidHlwZSBvYmplY3QKCSAgICAgICAgICAgICAgICBzdWJ0eXBlLmluaXQucHJvdG90eXBlID0gc3VidHlwZTsKCgkgICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIHN1cGVydHlwZQoJICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyID0gdGhpczsKCgkgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7CgkgICAgICAgICAgICB9LAoKCSAgICAgICAgICAgIC8qKgoJICAgICAgICAgICAgICogRXh0ZW5kcyB0aGlzIG9iamVjdCBhbmQgcnVucyB0aGUgaW5pdCBtZXRob2QuCgkgICAgICAgICAgICAgKiBBcmd1bWVudHMgdG8gY3JlYXRlKCkgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpLgoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogQHN0YXRpYwoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogICAgIHZhciBpbnN0YW5jZSA9IE15VHlwZS5jcmVhdGUoKTsKCSAgICAgICAgICAgICAqLwoJICAgICAgICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5leHRlbmQoKTsKCSAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0LmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpOwoKCSAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CgkgICAgICAgICAgICB9LAoKCSAgICAgICAgICAgIC8qKgoJICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC4KCSAgICAgICAgICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBzb21lIGxvZ2ljIHdoZW4geW91ciBvYmplY3RzIGFyZSBjcmVhdGVkLgoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoewoJICAgICAgICAgICAgICogICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAgKiAgICAgICAgICAgICAvLyAuLi4KCSAgICAgICAgICAgICAqICAgICAgICAgfQoJICAgICAgICAgICAgICogICAgIH0pOwoJICAgICAgICAgICAgICovCgkgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB9LAoKCSAgICAgICAgICAgIC8qKgoJICAgICAgICAgICAgICogQ29waWVzIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdC4KCSAgICAgICAgICAgICAqCgkgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byBtaXggaW4uCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICAgICAqCgkgICAgICAgICAgICAgKiAgICAgTXlUeXBlLm1peEluKHsKCSAgICAgICAgICAgICAqICAgICAgICAgZmllbGQ6ICd2YWx1ZScKCSAgICAgICAgICAgICAqICAgICB9KTsKCSAgICAgICAgICAgICAqLwoJICAgICAgICAgICAgbWl4SW46IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoKCSAgICAgICAgICAgICAgICAvLyBJRSB3b24ndCBjb3B5IHRvU3RyaW5nIHVzaW5nIHRoZSBsb29wIGFib3ZlCgkgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmluZyA9IHByb3BlcnRpZXMudG9TdHJpbmc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCgkgICAgICAgICAgICAvKioKCSAgICAgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LgoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLgoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGluc3RhbmNlLmNsb25lKCk7CgkgICAgICAgICAgICAgKi8KCSAgICAgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdC5wcm90b3R5cGUuZXh0ZW5kKHRoaXMpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgIH0oKSk7CgoJICAgIC8qKgoJICAgICAqIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy4KCSAgICAgKgoJICAgICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHdvcmRzIFRoZSBhcnJheSBvZiAzMi1iaXQgd29yZHMuCgkgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5LgoJICAgICAqLwoJICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXkgPSBCYXNlLmV4dGVuZCh7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuCgkgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaWdCeXRlcyAoT3B0aW9uYWwpIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhlIHdvcmRzLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKCk7CgkgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddKTsKCSAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHgwMDAxMDIwMywgMHgwNDA1MDYwN10sIDYpOwoJICAgICAgICAgKi8KCSAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykgewoJICAgICAgICAgICAgd29yZHMgPSB0aGlzLndvcmRzID0gd29yZHMgfHwgW107CgoJICAgICAgICAgICAgaWYgKHNpZ0J5dGVzICE9IHVuZGVmaW5lZCkgewoJICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlczsKCSAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHdvcmRzLmxlbmd0aCAqIDQ7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgdGhpcyB3b3JkIGFycmF5IHRvIGEgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge0VuY29kZXJ9IGVuY29kZXIgKE9wdGlvbmFsKSBUaGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBDcnlwdG9KUy5lbmMuSGV4CgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZ2lmaWVkIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5ICsgJyc7CgkgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5LnRvU3RyaW5nKCk7CgkgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5LnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTsKCSAgICAgICAgICovCgkgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZW5jb2RlcikgewoJICAgICAgICAgICAgcmV0dXJuIChlbmNvZGVyIHx8IEhleCkuc3RyaW5naWZ5KHRoaXMpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbmNhdGVuYXRlcyBhIHdvcmQgYXJyYXkgdG8gdGhpcyB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5IHRvIGFwcGVuZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGlzIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB3b3JkQXJyYXkxLmNvbmNhdCh3b3JkQXJyYXkyKTsKCSAgICAgICAgICovCgkgICAgICAgIGNvbmNhdDogZnVuY3Rpb24gKHdvcmRBcnJheSkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgdGhpc1dvcmRzID0gdGhpcy53b3JkczsKCSAgICAgICAgICAgIHZhciB0aGF0V29yZHMgPSB3b3JkQXJyYXkud29yZHM7CgkgICAgICAgICAgICB2YXIgdGhpc1NpZ0J5dGVzID0gdGhpcy5zaWdCeXRlczsKCSAgICAgICAgICAgIHZhciB0aGF0U2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7CgoJICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHMKCSAgICAgICAgICAgIHRoaXMuY2xhbXAoKTsKCgkgICAgICAgICAgICAvLyBDb25jYXQKCSAgICAgICAgICAgIGlmICh0aGlzU2lnQnl0ZXMgJSA0KSB7CgkgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgYnl0ZSBhdCBhIHRpbWUKCSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoYXRTaWdCeXRlczsgaSsrKSB7CgkgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0Qnl0ZSA9ICh0aGF0V29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmOwoJICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGkpID4+PiAyXSB8PSB0aGF0Qnl0ZSA8PCAoMjQgLSAoKHRoaXNTaWdCeXRlcyArIGkpICUgNCkgKiA4KTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgIC8vIENvcHkgb25lIHdvcmQgYXQgYSB0aW1lCgkgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0U2lnQnl0ZXM7IGkgKz0gNCkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGkpID4+PiAyXSA9IHRoYXRXb3Jkc1tpID4+PiAyXTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzICs9IHRoYXRTaWdCeXRlczsKCgkgICAgICAgICAgICAvLyBDaGFpbmFibGUKCSAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIFJlbW92ZXMgaW5zaWduaWZpY2FudCBiaXRzLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgd29yZEFycmF5LmNsYW1wKCk7CgkgICAgICAgICAqLwoJICAgICAgICBjbGFtcDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgd29yZHMgPSB0aGlzLndvcmRzOwoJICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gdGhpcy5zaWdCeXRlczsKCgkgICAgICAgICAgICAvLyBDbGFtcAoJICAgICAgICAgICAgd29yZHNbc2lnQnl0ZXMgPj4+IDJdICY9IDB4ZmZmZmZmZmYgPDwgKDMyIC0gKHNpZ0J5dGVzICUgNCkgKiA4KTsKCSAgICAgICAgICAgIHdvcmRzLmxlbmd0aCA9IE1hdGguY2VpbChzaWdCeXRlcyAvIDQpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgY2xvbmUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSB3b3JkQXJyYXkuY2xvbmUoKTsKCSAgICAgICAgICovCgkgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7CgkgICAgICAgICAgICBjbG9uZS53b3JkcyA9IHRoaXMud29yZHMuc2xpY2UoMCk7CgoJICAgICAgICAgICAgcmV0dXJuIGNsb25lOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENyZWF0ZXMgYSB3b3JkIGFycmF5IGZpbGxlZCB3aXRoIHJhbmRvbSBieXRlcy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG5CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcmFuZG9tIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSgxNik7CgkgICAgICAgICAqLwoJICAgICAgICByYW5kb206IGZ1bmN0aW9uIChuQnl0ZXMpIHsKCSAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdOwoKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkJ5dGVzOyBpICs9IDQpIHsKCSAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKGNyeXB0b1NlY3VyZVJhbmRvbUludCgpKTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBuQnl0ZXMpOwoJICAgICAgICB9CgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIEVuY29kZXIgbmFtZXNwYWNlLgoJICAgICAqLwoJICAgIHZhciBDX2VuYyA9IEMuZW5jID0ge307CgoJICAgIC8qKgoJICAgICAqIEhleCBlbmNvZGluZyBzdHJhdGVneS4KCSAgICAgKi8KCSAgICB2YXIgSGV4ID0gQ19lbmMuSGV4ID0gewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgaGV4IHN0cmluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IHN0cmluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHN0YXRpYwoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHdvcmRBcnJheSk7CgkgICAgICAgICAqLwoJICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzOwoJICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQKCSAgICAgICAgICAgIHZhciBoZXhDaGFycyA9IFtdOwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIGJpdGUgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmOwoJICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgPj4+IDQpLnRvU3RyaW5nKDE2KSk7CgkgICAgICAgICAgICAgICAgaGV4Q2hhcnMucHVzaCgoYml0ZSAmIDB4MGYpLnRvU3RyaW5nKDE2KSk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgcmV0dXJuIGhleENoYXJzLmpvaW4oJycpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbnZlcnRzIGEgaGV4IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgVGhlIGhleCBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGhleFN0cmluZyk7CgkgICAgICAgICAqLwoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGhleFN0cikgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciBoZXhTdHJMZW5ndGggPSBoZXhTdHIubGVuZ3RoOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQKCSAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdOwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXhTdHJMZW5ndGg7IGkgKz0gMikgewoJICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDNdIHw9IHBhcnNlSW50KGhleFN0ci5zdWJzdHIoaSwgMiksIDE2KSA8PCAoMjQgLSAoaSAlIDgpICogNCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgaGV4U3RyTGVuZ3RoIC8gMik7CgkgICAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBMYXRpbjEgZW5jb2Rpbmcgc3RyYXRlZ3kuCgkgICAgICovCgkgICAgdmFyIExhdGluMSA9IENfZW5jLkxhdGluMSA9IHsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIExhdGluMSBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIExhdGluMSBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBsYXRpbjFTdHJpbmcgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpOwoJICAgICAgICAgKi8KCSAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3JkczsKCSAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlczsKCgkgICAgICAgICAgICAvLyBDb252ZXJ0CgkgICAgICAgICAgICB2YXIgbGF0aW4xQ2hhcnMgPSBbXTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkrKykgewoJICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjsKCSAgICAgICAgICAgICAgICBsYXRpbjFDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYml0ZSkpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIHJldHVybiBsYXRpbjFDaGFycy5qb2luKCcnKTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDb252ZXJ0cyBhIExhdGluMSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0aW4xU3RyIFRoZSBMYXRpbjEgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkxhdGluMS5wYXJzZShsYXRpbjFTdHJpbmcpOwoJICAgICAgICAgKi8KCSAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChsYXRpbjFTdHIpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICB2YXIgbGF0aW4xU3RyTGVuZ3RoID0gbGF0aW4xU3RyLmxlbmd0aDsKCgkgICAgICAgICAgICAvLyBDb252ZXJ0CgkgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF0aW4xU3RyTGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAyXSB8PSAobGF0aW4xU3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSA8PCAoMjQgLSAoaSAlIDQpICogOCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbGF0aW4xU3RyTGVuZ3RoKTsKCSAgICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIFVURi04IGVuY29kaW5nIHN0cmF0ZWd5LgoJICAgICAqLwoJICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmOCA9IHsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIFVURi04IHN0cmluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTggc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgdXRmOFN0cmluZyA9IENyeXB0b0pTLmVuYy5VdGY4LnN0cmluZ2lmeSh3b3JkQXJyYXkpOwoJICAgICAgICAgKi8KCSAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7CgkgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKExhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KSkpOwoJICAgICAgICAgICAgfSBjYXRjaCAoZSkgewoJICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWFsZm9ybWVkIFVURi04IGRhdGEnKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi04IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1dGY4U3RyIFRoZSBVVEYtOCBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh1dGY4U3RyaW5nKTsKCSAgICAgICAgICovCgkgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodXRmOFN0cikgewoJICAgICAgICAgICAgcmV0dXJuIExhdGluMS5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodXRmOFN0cikpKTsKCSAgICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEFic3RyYWN0IGJ1ZmZlcmVkIGJsb2NrIGFsZ29yaXRobSB0ZW1wbGF0ZS4KCSAgICAgKgoJICAgICAqIFRoZSBwcm9wZXJ0eSBibG9ja1NpemUgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIGNvbmNyZXRlIHN1YnR5cGUuCgkgICAgICoKCSAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX21pbkJ1ZmZlclNpemUgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBzaG91bGQgYmUga2VwdCB1bnByb2Nlc3NlZCBpbiB0aGUgYnVmZmVyLiBEZWZhdWx0OiAwCgkgICAgICovCgkgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQmFzZS5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogUmVzZXRzIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgZGF0YSBidWZmZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0KCk7CgkgICAgICAgICAqLwoJICAgICAgICByZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXMKCSAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgV29yZEFycmF5LmluaXQoKTsKCSAgICAgICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgPSAwOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIEFkZHMgbmV3IGRhdGEgdG8gdGhpcyBibG9jayBhbGdvcml0aG0ncyBidWZmZXIuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBhcHBlbmQuIFN0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byBhIFdvcmRBcnJheSB1c2luZyBVVEYtOC4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCgnZGF0YScpOwoJICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKHdvcmRBcnJheSk7CgkgICAgICAgICAqLwoJICAgICAgICBfYXBwZW5kOiBmdW5jdGlvbiAoZGF0YSkgewoJICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gV29yZEFycmF5LCBlbHNlIGFzc3VtZSBXb3JkQXJyYXkgYWxyZWFkeQoJICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CgkgICAgICAgICAgICAgICAgZGF0YSA9IFV0ZjgucGFyc2UoZGF0YSk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gQXBwZW5kCgkgICAgICAgICAgICB0aGlzLl9kYXRhLmNvbmNhdChkYXRhKTsKCSAgICAgICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgKz0gZGF0YS5zaWdCeXRlczsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBQcm9jZXNzZXMgYXZhaWxhYmxlIGRhdGEgYmxvY2tzLgoJICAgICAgICAgKgoJICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIF9kb1Byb2Nlc3NCbG9jayhvZmZzZXQpLCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgc3VidHlwZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBkb0ZsdXNoIFdoZXRoZXIgYWxsIGJsb2NrcyBhbmQgcGFydGlhbCBibG9ja3Mgc2hvdWxkIGJlIHByb2Nlc3NlZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcHJvY2Vzc2VkIGRhdGEuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoKTsKCSAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcyghISdmbHVzaCcpOwoJICAgICAgICAgKi8KCSAgICAgICAgX3Byb2Nlc3M6IGZ1bmN0aW9uIChkb0ZsdXNoKSB7CgkgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkV29yZHM7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7CgkgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkczsKCSAgICAgICAgICAgIHZhciBkYXRhU2lnQnl0ZXMgPSBkYXRhLnNpZ0J5dGVzOwoJICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IHRoaXMuYmxvY2tTaXplOwoJICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDsKCgkgICAgICAgICAgICAvLyBDb3VudCBibG9ja3MgcmVhZHkKCSAgICAgICAgICAgIHZhciBuQmxvY2tzUmVhZHkgPSBkYXRhU2lnQnl0ZXMgLyBibG9ja1NpemVCeXRlczsKCSAgICAgICAgICAgIGlmIChkb0ZsdXNoKSB7CgkgICAgICAgICAgICAgICAgLy8gUm91bmQgdXAgdG8gaW5jbHVkZSBwYXJ0aWFsIGJsb2NrcwoJICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGguY2VpbChuQmxvY2tzUmVhZHkpOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAvLyBSb3VuZCBkb3duIHRvIGluY2x1ZGUgb25seSBmdWxsIGJsb2NrcywKCSAgICAgICAgICAgICAgICAvLyBsZXNzIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGJ1ZmZlcgoJICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGgubWF4KChuQmxvY2tzUmVhZHkgfCAwKSAtIHRoaXMuX21pbkJ1ZmZlclNpemUsIDApOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIENvdW50IHdvcmRzIHJlYWR5CgkgICAgICAgICAgICB2YXIgbldvcmRzUmVhZHkgPSBuQmxvY2tzUmVhZHkgKiBibG9ja1NpemU7CgoJICAgICAgICAgICAgLy8gQ291bnQgYnl0ZXMgcmVhZHkKCSAgICAgICAgICAgIHZhciBuQnl0ZXNSZWFkeSA9IE1hdGgubWluKG5Xb3Jkc1JlYWR5ICogNCwgZGF0YVNpZ0J5dGVzKTsKCgkgICAgICAgICAgICAvLyBQcm9jZXNzIGJsb2NrcwoJICAgICAgICAgICAgaWYgKG5Xb3Jkc1JlYWR5KSB7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbldvcmRzUmVhZHk7IG9mZnNldCArPSBibG9ja1NpemUpIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1hbGdvcml0aG0gbG9naWMKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9Qcm9jZXNzQmxvY2soZGF0YVdvcmRzLCBvZmZzZXQpOwoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHByb2Nlc3NlZCB3b3JkcwoJICAgICAgICAgICAgICAgIHByb2Nlc3NlZFdvcmRzID0gZGF0YVdvcmRzLnNwbGljZSgwLCBuV29yZHNSZWFkeSk7CgkgICAgICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuQnl0ZXNSZWFkeTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBSZXR1cm4gcHJvY2Vzc2VkIHdvcmRzCgkgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHByb2Nlc3NlZFdvcmRzLCBuQnl0ZXNSZWFkeSk7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5jbG9uZSgpOwoJICAgICAgICAgKi8KCSAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTsKCSAgICAgICAgICAgIGNsb25lLl9kYXRhID0gdGhpcy5fZGF0YS5jbG9uZSgpOwoKCSAgICAgICAgICAgIHJldHVybiBjbG9uZTsKCSAgICAgICAgfSwKCgkgICAgICAgIF9taW5CdWZmZXJTaXplOiAwCgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIEFic3RyYWN0IGhhc2hlciB0ZW1wbGF0ZS4KCSAgICAgKgoJICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBoYXNoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDE2ICg1MTIgYml0cykKCSAgICAgKi8KCSAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLgoJICAgICAgICAgKi8KCSAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCgpLAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBoYXNoZXIuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBoYXNoIGNvbXB1dGF0aW9uLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGhhc2hlciA9IENyeXB0b0pTLmFsZ28uU0hBMjU2LmNyZWF0ZSgpOwoJICAgICAgICAgKi8KCSAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykgewoJICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzCgkgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpOwoKCSAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcwoJICAgICAgICAgICAgdGhpcy5yZXNldCgpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIFJlc2V0cyB0aGlzIGhhc2hlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIGhhc2hlci5yZXNldCgpOwoJICAgICAgICAgKi8KCSAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIC8vIFJlc2V0IGRhdGEgYnVmZmVyCgkgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7CgoJICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWMKCSAgICAgICAgICAgIHRoaXMuX2RvUmVzZXQoKTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBVcGRhdGVzIHRoaXMgaGFzaGVyIHdpdGggYSBtZXNzYWdlLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtIYXNoZXJ9IFRoaXMgaGFzaGVyLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpOwoJICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpOwoJICAgICAgICAgKi8KCSAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkgewoJICAgICAgICAgICAgLy8gQXBwZW5kCgkgICAgICAgICAgICB0aGlzLl9hcHBlbmQobWVzc2FnZVVwZGF0ZSk7CgoJICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBoYXNoCgkgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7CgoJICAgICAgICAgICAgLy8gQ2hhaW5hYmxlCgkgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIGhhc2ggY29tcHV0YXRpb24uCgkgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSAoT3B0aW9uYWwpIEEgZmluYWwgbWVzc2FnZSB1cGRhdGUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSgpOwoJICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTsKCSAgICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7CgkgICAgICAgICAqLwoJICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHsKCSAgICAgICAgICAgIC8vIEZpbmFsIG1lc3NhZ2UgdXBkYXRlCgkgICAgICAgICAgICBpZiAobWVzc2FnZVVwZGF0ZSkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWhhc2hlciBsb2dpYwoJICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9kb0ZpbmFsaXplKCk7CgoJICAgICAgICAgICAgcmV0dXJuIGhhc2g7CgkgICAgICAgIH0sCgoJICAgICAgICBibG9ja1NpemU6IDUxMi8zMiwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDcmVhdGVzIGEgc2hvcnRjdXQgZnVuY3Rpb24gdG8gYSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBzaG9ydGN1dCBmdW5jdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQHN0YXRpYwoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIFNIQTI1NiA9IENyeXB0b0pTLmxpYi5IYXNoZXIuX2NyZWF0ZUhlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7CgkgICAgICAgICAqLwoJICAgICAgICBfY3JlYXRlSGVscGVyOiBmdW5jdGlvbiAoaGFzaGVyKSB7CgkgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGNmZykgewoJICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaGFzaGVyLmluaXQoY2ZnKS5maW5hbGl6ZShtZXNzYWdlKTsKCSAgICAgICAgICAgIH07CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIHVzZSBpbiB0aGlzIEhNQUMgaGVscGVyLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHNob3J0Y3V0IGZ1bmN0aW9uLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgSG1hY1NIQTI1NiA9IENyeXB0b0pTLmxpYi5IYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpOwoJICAgICAgICAgKi8KCSAgICAgICAgX2NyZWF0ZUhtYWNIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHsKCSAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobWVzc2FnZSwga2V5KSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDX2FsZ28uSE1BQy5pbml0KGhhc2hlciwga2V5KS5maW5hbGl6ZShtZXNzYWdlKTsKCSAgICAgICAgICAgIH07CgkgICAgICAgIH0KCSAgICB9KTsKCgkgICAgLyoqCgkgICAgICogQWxnb3JpdGhtIG5hbWVzcGFjZS4KCSAgICAgKi8KCSAgICB2YXIgQ19hbGdvID0gQy5hbGdvID0ge307CgoJICAgIHJldHVybiBDOwoJfShNYXRoKSk7CgoKCShmdW5jdGlvbiAoKSB7CgkgICAgLy8gU2hvcnRjdXRzCgkgICAgdmFyIEMgPSBDcnlwdG9KUzsKCSAgICB2YXIgQ19saWIgPSBDLmxpYjsKCSAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwoJICAgIHZhciBDX2VuYyA9IEMuZW5jOwoKCSAgICAvKioKCSAgICAgKiBCYXNlNjQgZW5jb2Rpbmcgc3RyYXRlZ3kuCgkgICAgICovCgkgICAgdmFyIEJhc2U2NCA9IENfZW5jLkJhc2U2NCA9IHsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIEJhc2U2NCBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEJhc2U2NCBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBiYXNlNjRTdHJpbmcgPSBDcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeSh3b3JkQXJyYXkpOwoJICAgICAgICAgKi8KCSAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3JkczsKCSAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlczsKCSAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7CgoJICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHMKCSAgICAgICAgICAgIHdvcmRBcnJheS5jbGFtcCgpOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQKCSAgICAgICAgICAgIHZhciBiYXNlNjRDaGFycyA9IFtdOwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSArPSAzKSB7CgkgICAgICAgICAgICAgICAgdmFyIGJ5dGUxID0gKHdvcmRzW2kgPj4+IDJdICAgICAgID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICAgICAgICYgMHhmZjsKCSAgICAgICAgICAgICAgICB2YXIgYnl0ZTIgPSAod29yZHNbKGkgKyAxKSA+Pj4gMl0gPj4+ICgyNCAtICgoaSArIDEpICUgNCkgKiA4KSkgJiAweGZmOwoJICAgICAgICAgICAgICAgIHZhciBieXRlMyA9ICh3b3Jkc1soaSArIDIpID4+PiAyXSA+Pj4gKDI0IC0gKChpICsgMikgJSA0KSAqIDgpKSAmIDB4ZmY7CgoJICAgICAgICAgICAgICAgIHZhciB0cmlwbGV0ID0gKGJ5dGUxIDw8IDE2KSB8IChieXRlMiA8PCA4KSB8IGJ5dGUzOwoKCSAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiAwLjc1IDwgc2lnQnl0ZXMpOyBqKyspIHsKCSAgICAgICAgICAgICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChtYXAuY2hhckF0KCh0cmlwbGV0ID4+PiAoNiAqICgzIC0gaikpKSAmIDB4M2YpKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmcKCSAgICAgICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpOwoJICAgICAgICAgICAgaWYgKHBhZGRpbmdDaGFyKSB7CgkgICAgICAgICAgICAgICAgd2hpbGUgKGJhc2U2NENoYXJzLmxlbmd0aCAlIDQpIHsKCSAgICAgICAgICAgICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChwYWRkaW5nQ2hhcik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIHJldHVybiBiYXNlNjRDaGFycy5qb2luKCcnKTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDb252ZXJ0cyBhIEJhc2U2NCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0U3RyIFRoZSBCYXNlNjQgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShiYXNlNjRTdHJpbmcpOwoJICAgICAgICAgKi8KCSAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChiYXNlNjRTdHIpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIGJhc2U2NFN0ckxlbmd0aCA9IGJhc2U2NFN0ci5sZW5ndGg7CgkgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwOwoJICAgICAgICAgICAgdmFyIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwOwoKCSAgICAgICAgICAgIGlmICghcmV2ZXJzZU1hcCkgewoJICAgICAgICAgICAgICAgICAgICByZXZlcnNlTWFwID0gdGhpcy5fcmV2ZXJzZU1hcCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hcC5sZW5ndGg7IGorKykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZU1hcFttYXAuY2hhckNvZGVBdChqKV0gPSBqOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gSWdub3JlIHBhZGRpbmcKCSAgICAgICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpOwoJICAgICAgICAgICAgaWYgKHBhZGRpbmdDaGFyKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhZGRpbmdJbmRleCA9IGJhc2U2NFN0ci5pbmRleE9mKHBhZGRpbmdDaGFyKTsKCSAgICAgICAgICAgICAgICBpZiAocGFkZGluZ0luZGV4ICE9PSAtMSkgewoJICAgICAgICAgICAgICAgICAgICBiYXNlNjRTdHJMZW5ndGggPSBwYWRkaW5nSW5kZXg7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIENvbnZlcnQKCSAgICAgICAgICAgIHJldHVybiBwYXJzZUxvb3AoYmFzZTY0U3RyLCBiYXNlNjRTdHJMZW5ndGgsIHJldmVyc2VNYXApOwoKCSAgICAgICAgfSwKCgkgICAgICAgIF9tYXA6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPScKCSAgICB9OwoKCSAgICBmdW5jdGlvbiBwYXJzZUxvb3AoYmFzZTY0U3RyLCBiYXNlNjRTdHJMZW5ndGgsIHJldmVyc2VNYXApIHsKCSAgICAgIHZhciB3b3JkcyA9IFtdOwoJICAgICAgdmFyIG5CeXRlcyA9IDA7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2U2NFN0ckxlbmd0aDsgaSsrKSB7CgkgICAgICAgICAgaWYgKGkgJSA0KSB7CgkgICAgICAgICAgICAgIHZhciBiaXRzMSA9IHJldmVyc2VNYXBbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSAtIDEpXSA8PCAoKGkgJSA0KSAqIDIpOwoJICAgICAgICAgICAgICB2YXIgYml0czIgPSByZXZlcnNlTWFwW2Jhc2U2NFN0ci5jaGFyQ29kZUF0KGkpXSA+Pj4gKDYgLSAoaSAlIDQpICogMik7CgkgICAgICAgICAgICAgIHZhciBiaXRzQ29tYmluZWQgPSBiaXRzMSB8IGJpdHMyOwoJICAgICAgICAgICAgICB3b3Jkc1tuQnl0ZXMgPj4+IDJdIHw9IGJpdHNDb21iaW5lZCA8PCAoMjQgLSAobkJ5dGVzICUgNCkgKiA4KTsKCSAgICAgICAgICAgICAgbkJ5dGVzKys7CgkgICAgICAgICAgfQoJICAgICAgfQoJICAgICAgcmV0dXJuIFdvcmRBcnJheS5jcmVhdGUod29yZHMsIG5CeXRlcyk7CgkgICAgfQoJfSgpKTsKCgoJKGZ1bmN0aW9uIChNYXRoKSB7CgkgICAgLy8gU2hvcnRjdXRzCgkgICAgdmFyIEMgPSBDcnlwdG9KUzsKCSAgICB2YXIgQ19saWIgPSBDLmxpYjsKCSAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwoJICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7CgkgICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCgkgICAgLy8gQ29uc3RhbnRzIHRhYmxlCgkgICAgdmFyIFQgPSBbXTsKCgkgICAgLy8gQ29tcHV0ZSBjb25zdGFudHMKCSAgICAoZnVuY3Rpb24gKCkgewoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHsKCSAgICAgICAgICAgIFRbaV0gPSAoTWF0aC5hYnMoTWF0aC5zaW4oaSArIDEpKSAqIDB4MTAwMDAwMDAwKSB8IDA7CgkgICAgICAgIH0KCSAgICB9KCkpOwoKCSAgICAvKioKCSAgICAgKiBNRDUgaGFzaCBhbGdvcml0aG0uCgkgICAgICovCgkgICAgdmFyIE1ENSA9IENfYWxnby5NRDUgPSBIYXNoZXIuZXh0ZW5kKHsKCSAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoWwoJICAgICAgICAgICAgICAgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksCgkgICAgICAgICAgICAgICAgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NgoJICAgICAgICAgICAgXSk7CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuCgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHsKCSAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0X2kgPSBvZmZzZXQgKyBpOwoJICAgICAgICAgICAgICAgIHZhciBNX29mZnNldF9pID0gTVtvZmZzZXRfaV07CgoJICAgICAgICAgICAgICAgIE1bb2Zmc2V0X2ldID0gKAoJICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDgpICB8IChNX29mZnNldF9pID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfAoJICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDI0KSB8IChNX29mZnNldF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMCkKCSAgICAgICAgICAgICAgICApOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzOwoKCSAgICAgICAgICAgIHZhciBNX29mZnNldF8wICA9IE1bb2Zmc2V0ICsgMF07CgkgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMSAgPSBNW29mZnNldCArIDFdOwoJICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzIgID0gTVtvZmZzZXQgKyAyXTsKCSAgICAgICAgICAgIHZhciBNX29mZnNldF8zICA9IE1bb2Zmc2V0ICsgM107CgkgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNCAgPSBNW29mZnNldCArIDRdOwoJICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzUgID0gTVtvZmZzZXQgKyA1XTsKCSAgICAgICAgICAgIHZhciBNX29mZnNldF82ICA9IE1bb2Zmc2V0ICsgNl07CgkgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNyAgPSBNW29mZnNldCArIDddOwoJICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzggID0gTVtvZmZzZXQgKyA4XTsKCSAgICAgICAgICAgIHZhciBNX29mZnNldF85ICA9IE1bb2Zmc2V0ICsgOV07CgkgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTAgPSBNW29mZnNldCArIDEwXTsKCSAgICAgICAgICAgIHZhciBNX29mZnNldF8xMSA9IE1bb2Zmc2V0ICsgMTFdOwoJICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzEyID0gTVtvZmZzZXQgKyAxMl07CgkgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTMgPSBNW29mZnNldCArIDEzXTsKCSAgICAgICAgICAgIHZhciBNX29mZnNldF8xNCA9IE1bb2Zmc2V0ICsgMTRdOwoJICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzE1ID0gTVtvZmZzZXQgKyAxNV07CgoJICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWxiZXMKCSAgICAgICAgICAgIHZhciBhID0gSFswXTsKCSAgICAgICAgICAgIHZhciBiID0gSFsxXTsKCSAgICAgICAgICAgIHZhciBjID0gSFsyXTsKCSAgICAgICAgICAgIHZhciBkID0gSFszXTsKCgkgICAgICAgICAgICAvLyBDb21wdXRhdGlvbgoJICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzAsICA3LCAgVFswXSk7CgkgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMSwgIDEyLCBUWzFdKTsKCSAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8yLCAgMTcsIFRbMl0pOwoJICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzMsICAyMiwgVFszXSk7CgkgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfNCwgIDcsICBUWzRdKTsKCSAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF81LCAgMTIsIFRbNV0pOwoJICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzYsICAxNywgVFs2XSk7CgkgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfNywgIDIyLCBUWzddKTsKCSAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF84LCAgNywgIFRbOF0pOwoJICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzksICAxMiwgVFs5XSk7CgkgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTAsIDE3LCBUWzEwXSk7CgkgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTEsIDIyLCBUWzExXSk7CgkgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTIsIDcsICBUWzEyXSk7CgkgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTMsIDEyLCBUWzEzXSk7CgkgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTQsIDE3LCBUWzE0XSk7CgkgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTUsIDIyLCBUWzE1XSk7CgoJICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEsICA1LCAgVFsxNl0pOwoJICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzYsICA5LCAgVFsxN10pOwoJICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzExLCAxNCwgVFsxOF0pOwoJICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzAsICAyMCwgVFsxOV0pOwoJICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzUsICA1LCAgVFsyMF0pOwoJICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEwLCA5LCAgVFsyMV0pOwoJICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzE1LCAxNCwgVFsyMl0pOwoJICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzQsICAyMCwgVFsyM10pOwoJICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzksICA1LCAgVFsyNF0pOwoJICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzE0LCA5LCAgVFsyNV0pOwoJICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzMsICAxNCwgVFsyNl0pOwoJICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzgsICAyMCwgVFsyN10pOwoJICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEzLCA1LCAgVFsyOF0pOwoJICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzIsICA5LCAgVFsyOV0pOwoJICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzcsICAxNCwgVFszMF0pOwoJICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzEyLCAyMCwgVFszMV0pOwoKCSAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF81LCAgNCwgIFRbMzJdKTsKCSAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF84LCAgMTEsIFRbMzNdKTsKCSAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8xMSwgMTYsIFRbMzRdKTsKCSAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xNCwgMjMsIFRbMzVdKTsKCSAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF8xLCAgNCwgIFRbMzZdKTsKCSAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF80LCAgMTEsIFRbMzddKTsKCSAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF83LCAgMTYsIFRbMzhdKTsKCSAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xMCwgMjMsIFRbMzldKTsKCSAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF8xMywgNCwgIFRbNDBdKTsKCSAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF8wLCAgMTEsIFRbNDFdKTsKCSAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8zLCAgMTYsIFRbNDJdKTsKCSAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF82LCAgMjMsIFRbNDNdKTsKCSAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF85LCAgNCwgIFRbNDRdKTsKCSAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF8xMiwgMTEsIFRbNDVdKTsKCSAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8xNSwgMTYsIFRbNDZdKTsKCSAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8yLCAgMjMsIFRbNDddKTsKCgkgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfMCwgIDYsICBUWzQ4XSk7CgkgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfNywgIDEwLCBUWzQ5XSk7CgkgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTQsIDE1LCBUWzUwXSk7CgkgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfNSwgIDIxLCBUWzUxXSk7CgkgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTIsIDYsICBUWzUyXSk7CgkgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMywgIDEwLCBUWzUzXSk7CgkgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTAsIDE1LCBUWzU0XSk7CgkgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfMSwgIDIxLCBUWzU1XSk7CgkgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfOCwgIDYsICBUWzU2XSk7CgkgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTUsIDEwLCBUWzU3XSk7CgkgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfNiwgIDE1LCBUWzU4XSk7CgkgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTMsIDIxLCBUWzU5XSk7CgkgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfNCwgIDYsICBUWzYwXSk7CgkgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTEsIDEwLCBUWzYxXSk7CgkgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMiwgIDE1LCBUWzYyXSk7CgkgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfOSwgIDIxLCBUWzYzXSk7CgoJICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUKCSAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDsKCSAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDsKCSAgICAgICAgICAgIEhbMl0gPSAoSFsyXSArIGMpIHwgMDsKCSAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDsKCSAgICAgICAgfSwKCgkgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTsKCSAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzOwoKCSAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7CgkgICAgICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7CgoJICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmcKCSAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpOwoKCSAgICAgICAgICAgIHZhciBuQml0c1RvdGFsSCA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTsKCSAgICAgICAgICAgIHZhciBuQml0c1RvdGFsTCA9IG5CaXRzVG90YWw7CgkgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE1XSA9ICgKCSAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsSCA8PCA4KSAgfCAobkJpdHNUb3RhbEggPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8CgkgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEggPDwgMjQpIHwgKG5CaXRzVG90YWxIID4+PiA4KSkgICYgMHhmZjAwZmYwMCkKCSAgICAgICAgICAgICk7CgkgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9ICgKCSAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsTCA8PCA4KSAgfCAobkJpdHNUb3RhbEwgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8CgkgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEwgPDwgMjQpIHwgKG5CaXRzVG90YWxMID4+PiA4KSkgICYgMHhmZjAwZmYwMCkKCSAgICAgICAgICAgICk7CgoJICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IChkYXRhV29yZHMubGVuZ3RoICsgMSkgKiA0OwoKCSAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzCgkgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2hhc2g7CgkgICAgICAgICAgICB2YXIgSCA9IGhhc2gud29yZHM7CgoJICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW4KCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgICAgICB2YXIgSF9pID0gSFtpXTsKCgkgICAgICAgICAgICAgICAgSFtpXSA9ICgoKEhfaSA8PCA4KSAgfCAoSF9pID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfAoJICAgICAgICAgICAgICAgICAgICAgICAoKChIX2kgPDwgMjQpIHwgKEhfaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoCgkgICAgICAgICAgICByZXR1cm4gaGFzaDsKCSAgICAgICAgfSwKCgkgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTsKCSAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpOwoKCSAgICAgICAgICAgIHJldHVybiBjbG9uZTsKCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICBmdW5jdGlvbiBGRihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7CgkgICAgICAgIHZhciBuID0gYSArICgoYiAmIGMpIHwgKH5iICYgZCkpICsgeCArIHQ7CgkgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBHRyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7CgkgICAgICAgIHZhciBuID0gYSArICgoYiAmIGQpIHwgKGMgJiB+ZCkpICsgeCArIHQ7CgkgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBISChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7CgkgICAgICAgIHZhciBuID0gYSArIChiIF4gYyBeIGQpICsgeCArIHQ7CgkgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBJSShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7CgkgICAgICAgIHZhciBuID0gYSArIChjIF4gKGIgfCB+ZCkpICsgeCArIHQ7CgkgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7CgkgICAgfQoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5NRDUoJ21lc3NhZ2UnKTsKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5NRDUod29yZEFycmF5KTsKCSAgICAgKi8KCSAgICBDLk1ENSA9IEhhc2hlci5fY3JlYXRlSGVscGVyKE1ENSk7CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjTUQ1KG1lc3NhZ2UsIGtleSk7CgkgICAgICovCgkgICAgQy5IbWFjTUQ1ID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKE1ENSk7Cgl9KE1hdGgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgkgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjsKCSAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoKCSAgICAvLyBSZXVzYWJsZSBvYmplY3QKCSAgICB2YXIgVyA9IFtdOwoKCSAgICAvKioKCSAgICAgKiBTSEEtMSBoYXNoIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgU0hBMSA9IENfYWxnby5TSEExID0gSGFzaGVyLmV4dGVuZCh7CgkgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFdvcmRBcnJheS5pbml0KFsKCSAgICAgICAgICAgICAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LAoJICAgICAgICAgICAgICAgIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsCgkgICAgICAgICAgICAgICAgMHhjM2QyZTFmMAoJICAgICAgICAgICAgXSk7CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7CgoJICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXMKCSAgICAgICAgICAgIHZhciBhID0gSFswXTsKCSAgICAgICAgICAgIHZhciBiID0gSFsxXTsKCSAgICAgICAgICAgIHZhciBjID0gSFsyXTsKCSAgICAgICAgICAgIHZhciBkID0gSFszXTsKCSAgICAgICAgICAgIHZhciBlID0gSFs0XTsKCgkgICAgICAgICAgICAvLyBDb21wdXRhdGlvbgoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7CgkgICAgICAgICAgICAgICAgaWYgKGkgPCAxNikgewoJICAgICAgICAgICAgICAgICAgICBXW2ldID0gTVtvZmZzZXQgKyBpXSB8IDA7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdOwoJICAgICAgICAgICAgICAgICAgICBXW2ldID0gKG4gPDwgMSkgfCAobiA+Pj4gMzEpOwoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgdmFyIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGUgKyBXW2ldOwoJICAgICAgICAgICAgICAgIGlmIChpIDwgMjApIHsKCSAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8ICh+YiAmIGQpKSArIDB4NWE4Mjc5OTk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNDApIHsKCSAgICAgICAgICAgICAgICAgICAgdCArPSAoYiBeIGMgXiBkKSArIDB4NmVkOWViYTE7CgkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNjApIHsKCSAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpKSAtIDB4NzBlNDQzMjQ7CgkgICAgICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpIDwgODApICovIHsKCSAgICAgICAgICAgICAgICAgICAgdCArPSAoYiBeIGMgXiBkKSAtIDB4MzU5ZDNlMmE7CgkgICAgICAgICAgICAgICAgfQoKCSAgICAgICAgICAgICAgICBlID0gZDsKCSAgICAgICAgICAgICAgICBkID0gYzsKCSAgICAgICAgICAgICAgICBjID0gKGIgPDwgMzApIHwgKGIgPj4+IDIpOwoJICAgICAgICAgICAgICAgIGIgPSBhOwoJICAgICAgICAgICAgICAgIGEgPSB0OwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlCgkgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7CgkgICAgICAgICAgICBIWzFdID0gKEhbMV0gKyBiKSB8IDA7CgkgICAgICAgICAgICBIWzJdID0gKEhbMl0gKyBjKSB8IDA7CgkgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7CgkgICAgICAgICAgICBIWzRdID0gKEhbNF0gKyBlKSB8IDA7CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7CgkgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkczsKCgkgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4OwoJICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4OwoKCSAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nCgkgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTsKCSAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gTWF0aC5mbG9vcihuQml0c1RvdGFsIC8gMHgxMDAwMDAwMDApOwoJICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSBuQml0c1RvdGFsOwoJICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0OwoKCSAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzCgkgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7CgoJICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2gKCSAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNoOwoJICAgICAgICB9LAoKCSAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpOwoJICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7CgoJICAgICAgICAgICAgcmV0dXJuIGNsb25lOwoJICAgICAgICB9CgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLgoJICAgICAqCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLgoJICAgICAqCgkgICAgICogQHN0YXRpYwoJICAgICAqCgkgICAgICogQGV4YW1wbGUKCSAgICAgKgoJICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTEoJ21lc3NhZ2UnKTsKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEExKHdvcmRBcnJheSk7CgkgICAgICovCgkgICAgQy5TSEExID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBMSk7CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMShtZXNzYWdlLCBrZXkpOwoJICAgICAqLwoJICAgIEMuSG1hY1NIQTEgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMSk7Cgl9KCkpOwoKCgkoZnVuY3Rpb24gKE1hdGgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgkgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjsKCSAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoKCSAgICAvLyBJbml0aWFsaXphdGlvbiBhbmQgcm91bmQgY29uc3RhbnRzIHRhYmxlcwoJICAgIHZhciBIID0gW107CgkgICAgdmFyIEsgPSBbXTsKCgkgICAgLy8gQ29tcHV0ZSBjb25zdGFudHMKCSAgICAoZnVuY3Rpb24gKCkgewoJICAgICAgICBmdW5jdGlvbiBpc1ByaW1lKG4pIHsKCSAgICAgICAgICAgIHZhciBzcXJ0TiA9IE1hdGguc3FydChuKTsKCSAgICAgICAgICAgIGZvciAodmFyIGZhY3RvciA9IDI7IGZhY3RvciA8PSBzcXJ0TjsgZmFjdG9yKyspIHsKCSAgICAgICAgICAgICAgICBpZiAoIShuICUgZmFjdG9yKSkgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIHJldHVybiB0cnVlOwoJICAgICAgICB9CgoJICAgICAgICBmdW5jdGlvbiBnZXRGcmFjdGlvbmFsQml0cyhuKSB7CgkgICAgICAgICAgICByZXR1cm4gKChuIC0gKG4gfCAwKSkgKiAweDEwMDAwMDAwMCkgfCAwOwoJICAgICAgICB9CgoJICAgICAgICB2YXIgbiA9IDI7CgkgICAgICAgIHZhciBuUHJpbWUgPSAwOwoJICAgICAgICB3aGlsZSAoblByaW1lIDwgNjQpIHsKCSAgICAgICAgICAgIGlmIChpc1ByaW1lKG4pKSB7CgkgICAgICAgICAgICAgICAgaWYgKG5QcmltZSA8IDgpIHsKCSAgICAgICAgICAgICAgICAgICAgSFtuUHJpbWVdID0gZ2V0RnJhY3Rpb25hbEJpdHMoTWF0aC5wb3cobiwgMSAvIDIpKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgS1tuUHJpbWVdID0gZ2V0RnJhY3Rpb25hbEJpdHMoTWF0aC5wb3cobiwgMSAvIDMpKTsKCgkgICAgICAgICAgICAgICAgblByaW1lKys7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgbisrOwoJICAgICAgICB9CgkgICAgfSgpKTsKCgkgICAgLy8gUmV1c2FibGUgb2JqZWN0CgkgICAgdmFyIFcgPSBbXTsKCgkgICAgLyoqCgkgICAgICogU0hBLTI1NiBoYXNoIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgU0hBMjU2ID0gQ19hbGdvLlNIQTI1NiA9IEhhc2hlci5leHRlbmQoewoJICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChILnNsaWNlKDApKTsKCSAgICAgICAgfSwKCgkgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkczsKCgkgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlcwoJICAgICAgICAgICAgdmFyIGEgPSBIWzBdOwoJICAgICAgICAgICAgdmFyIGIgPSBIWzFdOwoJICAgICAgICAgICAgdmFyIGMgPSBIWzJdOwoJICAgICAgICAgICAgdmFyIGQgPSBIWzNdOwoJICAgICAgICAgICAgdmFyIGUgPSBIWzRdOwoJICAgICAgICAgICAgdmFyIGYgPSBIWzVdOwoJICAgICAgICAgICAgdmFyIGcgPSBIWzZdOwoJICAgICAgICAgICAgdmFyIGggPSBIWzddOwoKCSAgICAgICAgICAgIC8vIENvbXB1dGF0aW9uCgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHsKCSAgICAgICAgICAgICAgICBpZiAoaSA8IDE2KSB7CgkgICAgICAgICAgICAgICAgICAgIFdbaV0gPSBNW29mZnNldCArIGldIHwgMDsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEweCA9IFdbaSAtIDE1XTsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMCAgPSAoKGdhbW1hMHggPDwgMjUpIHwgKGdhbW1hMHggPj4+IDcpKSAgXgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ2FtbWEweCA8PCAxNCkgfCAoZ2FtbWEweCA+Pj4gMTgpKSBeCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnYW1tYTB4ID4+PiAzKTsKCgkgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTF4ID0gV1tpIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTEgID0gKChnYW1tYTF4IDw8IDE1KSB8IChnYW1tYTF4ID4+PiAxNykpIF4KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhbW1hMXggPDwgMTMpIHwgKGdhbW1hMXggPj4+IDE5KSkgXgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2FtbWExeCA+Pj4gMTApOwoKCSAgICAgICAgICAgICAgICAgICAgV1tpXSA9IGdhbW1hMCArIFdbaSAtIDddICsgZ2FtbWExICsgV1tpIC0gMTZdOwoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgdmFyIGNoICA9IChlICYgZikgXiAofmUgJiBnKTsKCSAgICAgICAgICAgICAgICB2YXIgbWFqID0gKGEgJiBiKSBeIChhICYgYykgXiAoYiAmIGMpOwoKCSAgICAgICAgICAgICAgICB2YXIgc2lnbWEwID0gKChhIDw8IDMwKSB8IChhID4+PiAyKSkgXiAoKGEgPDwgMTkpIHwgKGEgPj4+IDEzKSkgXiAoKGEgPDwgMTApIHwgKGEgPj4+IDIyKSk7CgkgICAgICAgICAgICAgICAgdmFyIHNpZ21hMSA9ICgoZSA8PCAyNikgfCAoZSA+Pj4gNikpIF4gKChlIDw8IDIxKSB8IChlID4+PiAxMSkpIF4gKChlIDw8IDcpICB8IChlID4+PiAyNSkpOwoKCSAgICAgICAgICAgICAgICB2YXIgdDEgPSBoICsgc2lnbWExICsgY2ggKyBLW2ldICsgV1tpXTsKCSAgICAgICAgICAgICAgICB2YXIgdDIgPSBzaWdtYTAgKyBtYWo7CgoJICAgICAgICAgICAgICAgIGggPSBnOwoJICAgICAgICAgICAgICAgIGcgPSBmOwoJICAgICAgICAgICAgICAgIGYgPSBlOwoJICAgICAgICAgICAgICAgIGUgPSAoZCArIHQxKSB8IDA7CgkgICAgICAgICAgICAgICAgZCA9IGM7CgkgICAgICAgICAgICAgICAgYyA9IGI7CgkgICAgICAgICAgICAgICAgYiA9IGE7CgkgICAgICAgICAgICAgICAgYSA9ICh0MSArIHQyKSB8IDA7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUKCSAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDsKCSAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDsKCSAgICAgICAgICAgIEhbMl0gPSAoSFsyXSArIGMpIHwgMDsKCSAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDsKCSAgICAgICAgICAgIEhbNF0gPSAoSFs0XSArIGUpIHwgMDsKCSAgICAgICAgICAgIEhbNV0gPSAoSFs1XSArIGYpIHwgMDsKCSAgICAgICAgICAgIEhbNl0gPSAoSFs2XSArIGcpIHwgMDsKCSAgICAgICAgICAgIEhbN10gPSAoSFs3XSArIGgpIHwgMDsKCSAgICAgICAgfSwKCgkgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTsKCSAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzOwoKCSAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7CgkgICAgICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7CgoJICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmcKCSAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpOwoJICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7CgkgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE1XSA9IG5CaXRzVG90YWw7CgkgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzID0gZGF0YVdvcmRzLmxlbmd0aCAqIDQ7CgoJICAgICAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3MKCSAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTsKCgkgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaAoJICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc2g7CgkgICAgICAgIH0sCgoJICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7CgkgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTsKCgkgICAgICAgICAgICByZXR1cm4gY2xvbmU7CgkgICAgICAgIH0KCSAgICB9KTsKCgkgICAgLyoqCgkgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICoKCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4KCSAgICAgKgoJICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guCgkgICAgICoKCSAgICAgKiBAc3RhdGljCgkgICAgICoKCSAgICAgKiBAZXhhbXBsZQoJICAgICAqCgkgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjU2KCdtZXNzYWdlJyk7CgkgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjU2KHdvcmRBcnJheSk7CgkgICAgICovCgkgICAgQy5TSEEyNTYgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEEyNTYpOwoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICoKCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4KCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS4KCSAgICAgKgoJICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuCgkgICAgICoKCSAgICAgKiBAc3RhdGljCgkgICAgICoKCSAgICAgKiBAZXhhbXBsZQoJICAgICAqCgkgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTI1NihtZXNzYWdlLCBrZXkpOwoJICAgICAqLwoJICAgIEMuSG1hY1NIQTI1NiA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihTSEEyNTYpOwoJfShNYXRoKSk7CgoKCShmdW5jdGlvbiAoKSB7CgkgICAgLy8gU2hvcnRjdXRzCgkgICAgdmFyIEMgPSBDcnlwdG9KUzsKCSAgICB2YXIgQ19saWIgPSBDLmxpYjsKCSAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwoJICAgIHZhciBDX2VuYyA9IEMuZW5jOwoKCSAgICAvKioKCSAgICAgKiBVVEYtMTYgQkUgZW5jb2Rpbmcgc3RyYXRlZ3kuCgkgICAgICovCgkgICAgdmFyIFV0ZjE2QkUgPSBDX2VuYy5VdGYxNiA9IENfZW5jLlV0ZjE2QkUgPSB7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtMTYgQkUgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVVEYtMTYgQkUgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgdXRmMTZTdHJpbmcgPSBDcnlwdG9KUy5lbmMuVXRmMTYuc3RyaW5naWZ5KHdvcmRBcnJheSk7CgkgICAgICAgICAqLwoJICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzOwoJICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQKCSAgICAgICAgICAgIHZhciB1dGYxNkNoYXJzID0gW107CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDIpIHsKCSAgICAgICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMTYgLSAoaSAlIDQpICogOCkpICYgMHhmZmZmOwoJICAgICAgICAgICAgICAgIHV0ZjE2Q2hhcnMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCkpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIHJldHVybiB1dGYxNkNoYXJzLmpvaW4oJycpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbnZlcnRzIGEgVVRGLTE2IEJFIHN0cmluZyB0byBhIHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1dGYxNlN0ciBUaGUgVVRGLTE2IEJFIHN0cmluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHN0YXRpYwoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGYxNi5wYXJzZSh1dGYxNlN0cmluZyk7CgkgICAgICAgICAqLwoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjE2U3RyKSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dAoJICAgICAgICAgICAgdmFyIHV0ZjE2U3RyTGVuZ3RoID0gdXRmMTZTdHIubGVuZ3RoOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQKCSAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdOwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1dGYxNlN0ckxlbmd0aDsgaSsrKSB7CgkgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMV0gfD0gdXRmMTZTdHIuY2hhckNvZGVBdChpKSA8PCAoMTYgLSAoaSAlIDIpICogMTYpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIHJldHVybiBXb3JkQXJyYXkuY3JlYXRlKHdvcmRzLCB1dGYxNlN0ckxlbmd0aCAqIDIpOwoJICAgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVVRGLTE2IExFIGVuY29kaW5nIHN0cmF0ZWd5LgoJICAgICAqLwoJICAgIENfZW5jLlV0ZjE2TEUgPSB7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtMTYgTEUgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVVEYtMTYgTEUgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgdXRmMTZTdHIgPSBDcnlwdG9KUy5lbmMuVXRmMTZMRS5zdHJpbmdpZnkod29yZEFycmF5KTsKCSAgICAgICAgICovCgkgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7CgkgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7CgoJICAgICAgICAgICAgLy8gQ29udmVydAoJICAgICAgICAgICAgdmFyIHV0ZjE2Q2hhcnMgPSBbXTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkgKz0gMikgewoJICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBzd2FwRW5kaWFuKCh3b3Jkc1tpID4+PiAyXSA+Pj4gKDE2IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmZmZik7CgkgICAgICAgICAgICAgICAgdXRmMTZDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KSk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgcmV0dXJuIHV0ZjE2Q2hhcnMuam9pbignJyk7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgYSBVVEYtMTYgTEUgc3RyaW5nIHRvIGEgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjE2U3RyIFRoZSBVVEYtMTYgTEUgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLlV0ZjE2TEUucGFyc2UodXRmMTZTdHIpOwoJICAgICAgICAgKi8KCSAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh1dGYxNlN0cikgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciB1dGYxNlN0ckxlbmd0aCA9IHV0ZjE2U3RyLmxlbmd0aDsKCgkgICAgICAgICAgICAvLyBDb252ZXJ0CgkgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXRmMTZTdHJMZW5ndGg7IGkrKykgewoJICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDFdIHw9IHN3YXBFbmRpYW4odXRmMTZTdHIuY2hhckNvZGVBdChpKSA8PCAoMTYgLSAoaSAlIDIpICogMTYpKTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICByZXR1cm4gV29yZEFycmF5LmNyZWF0ZSh3b3JkcywgdXRmMTZTdHJMZW5ndGggKiAyKTsKCSAgICAgICAgfQoJICAgIH07CgoJICAgIGZ1bmN0aW9uIHN3YXBFbmRpYW4od29yZCkgewoJICAgICAgICByZXR1cm4gKCh3b3JkIDw8IDgpICYgMHhmZjAwZmYwMCkgfCAoKHdvcmQgPj4+IDgpICYgMHgwMGZmMDBmZik7CgkgICAgfQoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBDaGVjayBpZiB0eXBlZCBhcnJheXMgYXJlIHN1cHBvcnRlZAoJICAgIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT0gJ2Z1bmN0aW9uJykgewoJICAgICAgICByZXR1cm47CgkgICAgfQoKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgoJICAgIC8vIFJlZmVyZW5jZSBvcmlnaW5hbCBpbml0CgkgICAgdmFyIHN1cGVySW5pdCA9IFdvcmRBcnJheS5pbml0OwoKCSAgICAvLyBBdWdtZW50IFdvcmRBcnJheS5pbml0IHRvIGhhbmRsZSB0eXBlZCBhcnJheXMKCSAgICB2YXIgc3ViSW5pdCA9IFdvcmRBcnJheS5pbml0ID0gZnVuY3Rpb24gKHR5cGVkQXJyYXkpIHsKCSAgICAgICAgLy8gQ29udmVydCBidWZmZXJzIHRvIHVpbnQ4CgkgICAgICAgIGlmICh0eXBlZEFycmF5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKCSAgICAgICAgICAgIHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheSh0eXBlZEFycmF5KTsKCSAgICAgICAgfQoKCSAgICAgICAgLy8gQ29udmVydCBvdGhlciBhcnJheSB2aWV3cyB0byB1aW50OAoJICAgICAgICBpZiAoCgkgICAgICAgICAgICB0eXBlZEFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5IHx8CgkgICAgICAgICAgICAodHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlZEFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHx8CgkgICAgICAgICAgICB0eXBlZEFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSB8fAoJICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5IHx8CgkgICAgICAgICAgICB0eXBlZEFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSB8fAoJICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8CgkgICAgICAgICAgICB0eXBlZEFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8CgkgICAgICAgICAgICB0eXBlZEFycmF5IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5CgkgICAgICAgICkgewoJICAgICAgICAgICAgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KHR5cGVkQXJyYXkuYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkuYnl0ZUxlbmd0aCk7CgkgICAgICAgIH0KCgkgICAgICAgIC8vIEhhbmRsZSBVaW50OEFycmF5CgkgICAgICAgIGlmICh0eXBlZEFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciB0eXBlZEFycmF5Qnl0ZUxlbmd0aCA9IHR5cGVkQXJyYXkuYnl0ZUxlbmd0aDsKCgkgICAgICAgICAgICAvLyBFeHRyYWN0IGJ5dGVzCgkgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZWRBcnJheUJ5dGVMZW5ndGg7IGkrKykgewoJICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDJdIHw9IHR5cGVkQXJyYXlbaV0gPDwgKDI0IC0gKGkgJSA0KSAqIDgpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhpcyB3b3JkIGFycmF5CgkgICAgICAgICAgICBzdXBlckluaXQuY2FsbCh0aGlzLCB3b3JkcywgdHlwZWRBcnJheUJ5dGVMZW5ndGgpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgLy8gRWxzZSBjYWxsIG5vcm1hbCBpbml0CgkgICAgICAgICAgICBzdXBlckluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCSAgICAgICAgfQoJICAgIH07CgoJICAgIHN1YkluaXQucHJvdG90eXBlID0gV29yZEFycmF5OwoJfSgpKTsKCgoJLyoqIEBwcmVzZXJ2ZQoJKGMpIDIwMTIgYnkgQ8OpZHJpYyBNZXNuaWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgoJUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKCSAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCSAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCglUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoJKi8KCgkoZnVuY3Rpb24gKE1hdGgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgkgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjsKCSAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoKCSAgICAvLyBDb25zdGFudHMgdGFibGUKCSAgICB2YXIgX3psID0gV29yZEFycmF5LmNyZWF0ZShbCgkgICAgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCgkgICAgICAgIDcsICA0LCAxMywgIDEsIDEwLCAgNiwgMTUsICAzLCAxMiwgIDAsICA5LCAgNSwgIDIsIDE0LCAxMSwgIDgsCgkgICAgICAgIDMsIDEwLCAxNCwgIDQsICA5LCAxNSwgIDgsICAxLCAgMiwgIDcsICAwLCAgNiwgMTMsIDExLCAgNSwgMTIsCgkgICAgICAgIDEsICA5LCAxMSwgMTAsICAwLCAgOCwgMTIsICA0LCAxMywgIDMsICA3LCAxNSwgMTQsICA1LCAgNiwgIDIsCgkgICAgICAgIDQsICAwLCAgNSwgIDksICA3LCAxMiwgIDIsIDEwLCAxNCwgIDEsICAzLCAgOCwgMTEsICA2LCAxNSwgMTNdKTsKCSAgICB2YXIgX3pyID0gV29yZEFycmF5LmNyZWF0ZShbCgkgICAgICAgIDUsIDE0LCAgNywgIDAsICA5LCAgMiwgMTEsICA0LCAxMywgIDYsIDE1LCAgOCwgIDEsIDEwLCAgMywgMTIsCgkgICAgICAgIDYsIDExLCAgMywgIDcsICAwLCAxMywgIDUsIDEwLCAxNCwgMTUsICA4LCAxMiwgIDQsICA5LCAgMSwgIDIsCgkgICAgICAgIDE1LCAgNSwgIDEsICAzLCAgNywgMTQsICA2LCAgOSwgMTEsICA4LCAxMiwgIDIsIDEwLCAgMCwgIDQsIDEzLAoJICAgICAgICA4LCAgNiwgIDQsICAxLCAgMywgMTEsIDE1LCAgMCwgIDUsIDEyLCAgMiwgMTMsICA5LCAgNywgMTAsIDE0LAoJICAgICAgICAxMiwgMTUsIDEwLCAgNCwgIDEsICA1LCAgOCwgIDcsICA2LCAgMiwgMTMsIDE0LCAgMCwgIDMsICA5LCAxMV0pOwoJICAgIHZhciBfc2wgPSBXb3JkQXJyYXkuY3JlYXRlKFsKCSAgICAgICAgIDExLCAxNCwgMTUsIDEyLCAgNSwgIDgsICA3LCAgOSwgMTEsIDEzLCAxNCwgMTUsICA2LCAgNywgIDksICA4LAoJICAgICAgICA3LCA2LCAgIDgsIDEzLCAxMSwgIDksICA3LCAxNSwgIDcsIDEyLCAxNSwgIDksIDExLCAgNywgMTMsIDEyLAoJICAgICAgICAxMSwgMTMsICA2LCAgNywgMTQsICA5LCAxMywgMTUsIDE0LCAgOCwgMTMsICA2LCAgNSwgMTIsICA3LCAgNSwKCSAgICAgICAgICAxMSwgMTIsIDE0LCAxNSwgMTQsIDE1LCAgOSwgIDgsICA5LCAxNCwgIDUsICA2LCAgOCwgIDYsICA1LCAxMiwKCSAgICAgICAgOSwgMTUsICA1LCAxMSwgIDYsICA4LCAxMywgMTIsICA1LCAxMiwgMTMsIDE0LCAxMSwgIDgsICA1LCAgNiBdKTsKCSAgICB2YXIgX3NyID0gV29yZEFycmF5LmNyZWF0ZShbCgkgICAgICAgIDgsICA5LCAgOSwgMTEsIDEzLCAxNSwgMTUsICA1LCAgNywgIDcsICA4LCAxMSwgMTQsIDE0LCAxMiwgIDYsCgkgICAgICAgIDksIDEzLCAxNSwgIDcsIDEyLCAgOCwgIDksIDExLCAgNywgIDcsIDEyLCAgNywgIDYsIDE1LCAxMywgMTEsCgkgICAgICAgIDksICA3LCAxNSwgMTEsICA4LCAgNiwgIDYsIDE0LCAxMiwgMTMsICA1LCAxNCwgMTMsIDEzLCAgNywgIDUsCgkgICAgICAgIDE1LCAgNSwgIDgsIDExLCAxNCwgMTQsICA2LCAxNCwgIDYsICA5LCAxMiwgIDksIDEyLCAgNSwgMTUsICA4LAoJICAgICAgICA4LCAgNSwgMTIsICA5LCAxMiwgIDUsIDE0LCAgNiwgIDgsIDEzLCAgNiwgIDUsIDE1LCAxMywgMTEsIDExIF0pOwoKCSAgICB2YXIgX2hsID0gIFdvcmRBcnJheS5jcmVhdGUoWyAweDAwMDAwMDAwLCAweDVBODI3OTk5LCAweDZFRDlFQkExLCAweDhGMUJCQ0RDLCAweEE5NTNGRDRFXSk7CgkgICAgdmFyIF9ociA9ICBXb3JkQXJyYXkuY3JlYXRlKFsgMHg1MEEyOEJFNiwgMHg1QzRERDEyNCwgMHg2RDcwM0VGMywgMHg3QTZENzZFOSwgMHgwMDAwMDAwMF0pOwoKCSAgICAvKioKCSAgICAgKiBSSVBFTUQxNjAgaGFzaCBhbGdvcml0aG0uCgkgICAgICovCgkgICAgdmFyIFJJUEVNRDE2MCA9IENfYWxnby5SSVBFTUQxNjAgPSBIYXNoZXIuZXh0ZW5kKHsKCSAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHRoaXMuX2hhc2ggID0gV29yZEFycmF5LmNyZWF0ZShbMHg2NzQ1MjMwMSwgMHhFRkNEQUI4OSwgMHg5OEJBRENGRSwgMHgxMDMyNTQ3NiwgMHhDM0QyRTFGMF0pOwoJICAgICAgICB9LAoKCSAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CgoJICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW4KCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykgewoJICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgICAgIHZhciBvZmZzZXRfaSA9IG9mZnNldCArIGk7CgkgICAgICAgICAgICAgICAgdmFyIE1fb2Zmc2V0X2kgPSBNW29mZnNldF9pXTsKCgkgICAgICAgICAgICAgICAgLy8gU3dhcAoJICAgICAgICAgICAgICAgIE1bb2Zmc2V0X2ldID0gKAoJICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDgpICB8IChNX29mZnNldF9pID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfAoJICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDI0KSB8IChNX29mZnNldF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMCkKCSAgICAgICAgICAgICAgICApOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciBIICA9IHRoaXMuX2hhc2gud29yZHM7CgkgICAgICAgICAgICB2YXIgaGwgPSBfaGwud29yZHM7CgkgICAgICAgICAgICB2YXIgaHIgPSBfaHIud29yZHM7CgkgICAgICAgICAgICB2YXIgemwgPSBfemwud29yZHM7CgkgICAgICAgICAgICB2YXIgenIgPSBfenIud29yZHM7CgkgICAgICAgICAgICB2YXIgc2wgPSBfc2wud29yZHM7CgkgICAgICAgICAgICB2YXIgc3IgPSBfc3Iud29yZHM7CgoJICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXMKCSAgICAgICAgICAgIHZhciBhbCwgYmwsIGNsLCBkbCwgZWw7CgkgICAgICAgICAgICB2YXIgYXIsIGJyLCBjciwgZHIsIGVyOwoKCSAgICAgICAgICAgIGFyID0gYWwgPSBIWzBdOwoJICAgICAgICAgICAgYnIgPSBibCA9IEhbMV07CgkgICAgICAgICAgICBjciA9IGNsID0gSFsyXTsKCSAgICAgICAgICAgIGRyID0gZGwgPSBIWzNdOwoJICAgICAgICAgICAgZXIgPSBlbCA9IEhbNF07CgkgICAgICAgICAgICAvLyBDb21wdXRhdGlvbgoJICAgICAgICAgICAgdmFyIHQ7CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpICs9IDEpIHsKCSAgICAgICAgICAgICAgICB0ID0gKGFsICsgIE1bb2Zmc2V0K3psW2ldXSl8MDsKCSAgICAgICAgICAgICAgICBpZiAoaTwxNil7CgkJICAgICAgICAgICAgdCArPSAgZjEoYmwsY2wsZGwpICsgaGxbMF07CgkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpPDMyKSB7CgkJICAgICAgICAgICAgdCArPSAgZjIoYmwsY2wsZGwpICsgaGxbMV07CgkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpPDQ4KSB7CgkJICAgICAgICAgICAgdCArPSAgZjMoYmwsY2wsZGwpICsgaGxbMl07CgkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpPDY0KSB7CgkJICAgICAgICAgICAgdCArPSAgZjQoYmwsY2wsZGwpICsgaGxbM107CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsvLyBpZiAoaTw4MCkgewoJCSAgICAgICAgICAgIHQgKz0gIGY1KGJsLGNsLGRsKSArIGhsWzRdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB0ID0gdHwwOwoJICAgICAgICAgICAgICAgIHQgPSAgcm90bCh0LHNsW2ldKTsKCSAgICAgICAgICAgICAgICB0ID0gKHQrZWwpfDA7CgkgICAgICAgICAgICAgICAgYWwgPSBlbDsKCSAgICAgICAgICAgICAgICBlbCA9IGRsOwoJICAgICAgICAgICAgICAgIGRsID0gcm90bChjbCwgMTApOwoJICAgICAgICAgICAgICAgIGNsID0gYmw7CgkgICAgICAgICAgICAgICAgYmwgPSB0OwoKCSAgICAgICAgICAgICAgICB0ID0gKGFyICsgTVtvZmZzZXQrenJbaV1dKXwwOwoJICAgICAgICAgICAgICAgIGlmIChpPDE2KXsKCQkgICAgICAgICAgICB0ICs9ICBmNShicixjcixkcikgKyBoclswXTsKCSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGk8MzIpIHsKCQkgICAgICAgICAgICB0ICs9ICBmNChicixjcixkcikgKyBoclsxXTsKCSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGk8NDgpIHsKCQkgICAgICAgICAgICB0ICs9ICBmMyhicixjcixkcikgKyBoclsyXTsKCSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGk8NjQpIHsKCQkgICAgICAgICAgICB0ICs9ICBmMihicixjcixkcikgKyBoclszXTsKCSAgICAgICAgICAgICAgICB9IGVsc2Ugey8vIGlmIChpPDgwKSB7CgkJICAgICAgICAgICAgdCArPSAgZjEoYnIsY3IsZHIpICsgaHJbNF07CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHQgPSB0fDA7CgkgICAgICAgICAgICAgICAgdCA9ICByb3RsKHQsc3JbaV0pIDsKCSAgICAgICAgICAgICAgICB0ID0gKHQrZXIpfDA7CgkgICAgICAgICAgICAgICAgYXIgPSBlcjsKCSAgICAgICAgICAgICAgICBlciA9IGRyOwoJICAgICAgICAgICAgICAgIGRyID0gcm90bChjciwgMTApOwoJICAgICAgICAgICAgICAgIGNyID0gYnI7CgkgICAgICAgICAgICAgICAgYnIgPSB0OwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUKCSAgICAgICAgICAgIHQgICAgPSAoSFsxXSArIGNsICsgZHIpfDA7CgkgICAgICAgICAgICBIWzFdID0gKEhbMl0gKyBkbCArIGVyKXwwOwoJICAgICAgICAgICAgSFsyXSA9IChIWzNdICsgZWwgKyBhcil8MDsKCSAgICAgICAgICAgIEhbM10gPSAoSFs0XSArIGFsICsgYnIpfDA7CgkgICAgICAgICAgICBIWzRdID0gKEhbMF0gKyBibCArIGNyKXwwOwoJICAgICAgICAgICAgSFswXSA9ICB0OwoJICAgICAgICB9LAoKCSAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhOwoJICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7CgoJICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODsKCSAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODsKCgkgICAgICAgICAgICAvLyBBZGQgcGFkZGluZwoJICAgICAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBuQml0c0xlZnQgJSAzMik7CgkgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9ICgKCSAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsIDw8IDgpICB8IChuQml0c1RvdGFsID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfAoJICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWwgPDwgMjQpIHwgKG5CaXRzVG90YWwgPj4+IDgpKSAgJiAweGZmMDBmZjAwKQoJICAgICAgICAgICAgKTsKCSAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSAoZGF0YVdvcmRzLmxlbmd0aCArIDEpICogNDsKCgkgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2NrcwoJICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpOwoKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoOwoJICAgICAgICAgICAgdmFyIEggPSBoYXNoLndvcmRzOwoKCSAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuCgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKykgewoJICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICAgICAgdmFyIEhfaSA9IEhbaV07CgoJICAgICAgICAgICAgICAgIC8vIFN3YXAKCSAgICAgICAgICAgICAgICBIW2ldID0gKCgoSF9pIDw8IDgpICB8IChIX2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8CgkgICAgICAgICAgICAgICAgICAgICAgICgoKEhfaSA8PCAyNCkgfCAoSF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2gKCSAgICAgICAgICAgIHJldHVybiBoYXNoOwoJICAgICAgICB9LAoKCSAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpOwoJICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7CgoJICAgICAgICAgICAgcmV0dXJuIGNsb25lOwoJICAgICAgICB9CgkgICAgfSk7CgoKCSAgICBmdW5jdGlvbiBmMSh4LCB5LCB6KSB7CgkgICAgICAgIHJldHVybiAoKHgpIF4gKHkpIF4gKHopKTsKCgkgICAgfQoKCSAgICBmdW5jdGlvbiBmMih4LCB5LCB6KSB7CgkgICAgICAgIHJldHVybiAoKCh4KSYoeSkpIHwgKCh+eCkmKHopKSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBmMyh4LCB5LCB6KSB7CgkgICAgICAgIHJldHVybiAoKCh4KSB8ICh+KHkpKSkgXiAoeikpOwoJICAgIH0KCgkgICAgZnVuY3Rpb24gZjQoeCwgeSwgeikgewoJICAgICAgICByZXR1cm4gKCgoeCkgJiAoeikpIHwgKCh5KSYofih6KSkpKTsKCSAgICB9CgoJICAgIGZ1bmN0aW9uIGY1KHgsIHksIHopIHsKCSAgICAgICAgcmV0dXJuICgoeCkgXiAoKHkpIHwofih6KSkpKTsKCgkgICAgfQoKCSAgICBmdW5jdGlvbiByb3RsKHgsbikgewoJICAgICAgICByZXR1cm4gKHg8PG4pIHwgKHg+Pj4oMzItbikpOwoJICAgIH0KCgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLgoJICAgICAqCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLgoJICAgICAqCgkgICAgICogQHN0YXRpYwoJICAgICAqCgkgICAgICogQGV4YW1wbGUKCSAgICAgKgoJICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlJJUEVNRDE2MCgnbWVzc2FnZScpOwoJICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlJJUEVNRDE2MCh3b3JkQXJyYXkpOwoJICAgICAqLwoJICAgIEMuUklQRU1EMTYwID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoUklQRU1EMTYwKTsKCgkgICAgLyoqCgkgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLgoJICAgICAqCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLgoJICAgICAqCgkgICAgICogQHN0YXRpYwoJICAgICAqCgkgICAgICogQGV4YW1wbGUKCSAgICAgKgoJICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNSSVBFTUQxNjAobWVzc2FnZSwga2V5KTsKCSAgICAgKi8KCSAgICBDLkhtYWNSSVBFTUQxNjAgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoUklQRU1EMTYwKTsKCX0oTWF0aCkpOwoKCgkoZnVuY3Rpb24gKCkgewoJICAgIC8vIFNob3J0Y3V0cwoJICAgIHZhciBDID0gQ3J5cHRvSlM7CgkgICAgdmFyIENfbGliID0gQy5saWI7CgkgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlOwoJICAgIHZhciBDX2VuYyA9IEMuZW5jOwoJICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmODsKCSAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoKCSAgICAvKioKCSAgICAgKiBITUFDIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgSE1BQyA9IENfYWxnby5ITUFDID0gQmFzZS5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIEhNQUMuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS4KCSAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgaG1hY0hhc2hlciA9IENyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoQ3J5cHRvSlMuYWxnby5TSEEyNTYsIGtleSk7CgkgICAgICAgICAqLwoJICAgICAgICBpbml0OiBmdW5jdGlvbiAoaGFzaGVyLCBrZXkpIHsKCSAgICAgICAgICAgIC8vIEluaXQgaGFzaGVyCgkgICAgICAgICAgICBoYXNoZXIgPSB0aGlzLl9oYXNoZXIgPSBuZXcgaGFzaGVyLmluaXQoKTsKCgkgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBXb3JkQXJyYXksIGVsc2UgYXNzdW1lIFdvcmRBcnJheSBhbHJlYWR5CgkgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykgewoJICAgICAgICAgICAgICAgIGtleSA9IFV0ZjgucGFyc2Uoa2V5KTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBoYXNoZXJCbG9ja1NpemUgPSBoYXNoZXIuYmxvY2tTaXplOwoJICAgICAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZUJ5dGVzID0gaGFzaGVyQmxvY2tTaXplICogNDsKCgkgICAgICAgICAgICAvLyBBbGxvdyBhcmJpdHJhcnkgbGVuZ3RoIGtleXMKCSAgICAgICAgICAgIGlmIChrZXkuc2lnQnl0ZXMgPiBoYXNoZXJCbG9ja1NpemVCeXRlcykgewoJICAgICAgICAgICAgICAgIGtleSA9IGhhc2hlci5maW5hbGl6ZShrZXkpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzCgkgICAgICAgICAgICBrZXkuY2xhbXAoKTsKCgkgICAgICAgICAgICAvLyBDbG9uZSBrZXkgZm9yIGlubmVyIGFuZCBvdXRlciBwYWRzCgkgICAgICAgICAgICB2YXIgb0tleSA9IHRoaXMuX29LZXkgPSBrZXkuY2xvbmUoKTsKCSAgICAgICAgICAgIHZhciBpS2V5ID0gdGhpcy5faUtleSA9IGtleS5jbG9uZSgpOwoKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIG9LZXlXb3JkcyA9IG9LZXkud29yZHM7CgkgICAgICAgICAgICB2YXIgaUtleVdvcmRzID0gaUtleS53b3JkczsKCgkgICAgICAgICAgICAvLyBYT1Iga2V5cyB3aXRoIHBhZCBjb25zdGFudHMKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFzaGVyQmxvY2tTaXplOyBpKyspIHsKCSAgICAgICAgICAgICAgICBvS2V5V29yZHNbaV0gXj0gMHg1YzVjNWM1YzsKCSAgICAgICAgICAgICAgICBpS2V5V29yZHNbaV0gXj0gMHgzNjM2MzYzNjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIG9LZXkuc2lnQnl0ZXMgPSBpS2V5LnNpZ0J5dGVzID0gaGFzaGVyQmxvY2tTaXplQnl0ZXM7CgoJICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzCgkgICAgICAgICAgICB0aGlzLnJlc2V0KCk7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogUmVzZXRzIHRoaXMgSE1BQyB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIGhtYWNIYXNoZXIucmVzZXQoKTsKCSAgICAgICAgICovCgkgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dAoJICAgICAgICAgICAgdmFyIGhhc2hlciA9IHRoaXMuX2hhc2hlcjsKCgkgICAgICAgICAgICAvLyBSZXNldAoJICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7CgkgICAgICAgICAgICBoYXNoZXIudXBkYXRlKHRoaXMuX2lLZXkpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBITUFDIHdpdGggYSBtZXNzYWdlLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtITUFDfSBUaGlzIEhNQUMgaW5zdGFuY2UuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICBobWFjSGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpOwoJICAgICAgICAgKiAgICAgaG1hY0hhc2hlci51cGRhdGUod29yZEFycmF5KTsKCSAgICAgICAgICovCgkgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHsKCSAgICAgICAgICAgIHRoaXMuX2hhc2hlci51cGRhdGUobWVzc2FnZVVwZGF0ZSk7CgoJICAgICAgICAgICAgLy8gQ2hhaW5hYmxlCgkgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIEhNQUMgY29tcHV0YXRpb24uCgkgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSAoT3B0aW9uYWwpIEEgZmluYWwgbWVzc2FnZSB1cGRhdGUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUoKTsKCSAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSgnbWVzc2FnZScpOwoJICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7CgkgICAgICAgICAqLwoJICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICB2YXIgaGFzaGVyID0gdGhpcy5faGFzaGVyOwoKCSAgICAgICAgICAgIC8vIENvbXB1dGUgSE1BQwoJICAgICAgICAgICAgdmFyIGlubmVySGFzaCA9IGhhc2hlci5maW5hbGl6ZShtZXNzYWdlVXBkYXRlKTsKCSAgICAgICAgICAgIGhhc2hlci5yZXNldCgpOwoJICAgICAgICAgICAgdmFyIGhtYWMgPSBoYXNoZXIuZmluYWxpemUodGhpcy5fb0tleS5jbG9uZSgpLmNvbmNhdChpbm5lckhhc2gpKTsKCgkgICAgICAgICAgICByZXR1cm4gaG1hYzsKCSAgICAgICAgfQoJICAgIH0pOwoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTsKCSAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwoJICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgkgICAgdmFyIFNIQTEgPSBDX2FsZ28uU0hBMTsKCSAgICB2YXIgSE1BQyA9IENfYWxnby5ITUFDOwoKCSAgICAvKioKCSAgICAgKiBQYXNzd29yZC1CYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAyIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgUEJLREYyID0gQ19hbGdvLlBCS0RGMiA9IEJhc2UuZXh0ZW5kKHsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhlIGtleSBzaXplIGluIHdvcmRzIHRvIGdlbmVyYXRlLiBEZWZhdWx0OiA0ICgxMjggYml0cykKCSAgICAgICAgICogQHByb3BlcnR5IHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIHVzZS4gRGVmYXVsdDogU0hBMQoJICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaXRlcmF0aW9ucyBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybS4gRGVmYXVsdDogMQoJICAgICAgICAgKi8KCSAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7CgkgICAgICAgICAgICBrZXlTaXplOiAxMjgvMzIsCgkgICAgICAgICAgICBoYXNoZXI6IFNIQTEsCgkgICAgICAgICAgICBpdGVyYXRpb25zOiAxCgkgICAgICAgIH0pLAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgZGVyaXZhdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLlBCS0RGMi5jcmVhdGUoKTsKCSAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLlBCS0RGMi5jcmVhdGUoeyBrZXlTaXplOiA4IH0pOwoJICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uUEJLREYyLmNyZWF0ZSh7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7CgkgICAgICAgICAqLwoJICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2ZnKSB7CgkgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbXB1dGVzIHRoZSBQYXNzd29yZC1CYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAyLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC4KCSAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIga2V5ID0ga2RmLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpOwoJICAgICAgICAgKi8KCSAgICAgICAgY29tcHV0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0KSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dAoJICAgICAgICAgICAgdmFyIGNmZyA9IHRoaXMuY2ZnOwoKCSAgICAgICAgICAgIC8vIEluaXQgSE1BQwoJICAgICAgICAgICAgdmFyIGhtYWMgPSBITUFDLmNyZWF0ZShjZmcuaGFzaGVyLCBwYXNzd29yZCk7CgoJICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXMKCSAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5ID0gV29yZEFycmF5LmNyZWF0ZSgpOwoJICAgICAgICAgICAgdmFyIGJsb2NrSW5kZXggPSBXb3JkQXJyYXkuY3JlYXRlKFsweDAwMDAwMDAxXSk7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgZGVyaXZlZEtleVdvcmRzID0gZGVyaXZlZEtleS53b3JkczsKCSAgICAgICAgICAgIHZhciBibG9ja0luZGV4V29yZHMgPSBibG9ja0luZGV4LndvcmRzOwoJICAgICAgICAgICAgdmFyIGtleVNpemUgPSBjZmcua2V5U2l6ZTsKCSAgICAgICAgICAgIHZhciBpdGVyYXRpb25zID0gY2ZnLml0ZXJhdGlvbnM7CgoJICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5CgkgICAgICAgICAgICB3aGlsZSAoZGVyaXZlZEtleVdvcmRzLmxlbmd0aCA8IGtleVNpemUpIHsKCSAgICAgICAgICAgICAgICB2YXIgYmxvY2sgPSBobWFjLnVwZGF0ZShzYWx0KS5maW5hbGl6ZShibG9ja0luZGV4KTsKCSAgICAgICAgICAgICAgICBobWFjLnJlc2V0KCk7CgoJICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgICAgIHZhciBibG9ja1dvcmRzID0gYmxvY2sud29yZHM7CgkgICAgICAgICAgICAgICAgdmFyIGJsb2NrV29yZHNMZW5ndGggPSBibG9ja1dvcmRzLmxlbmd0aDsKCgkgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9ucwoJICAgICAgICAgICAgICAgIHZhciBpbnRlcm1lZGlhdGUgPSBibG9jazsKCSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewoJICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSBobWFjLmZpbmFsaXplKGludGVybWVkaWF0ZSk7CgkgICAgICAgICAgICAgICAgICAgIGhtYWMucmVzZXQoKTsKCgkgICAgICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcm1lZGlhdGVXb3JkcyA9IGludGVybWVkaWF0ZS53b3JkczsKCgkgICAgICAgICAgICAgICAgICAgIC8vIFhPUiBpbnRlcm1lZGlhdGUgd2l0aCBibG9jawoJICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJsb2NrV29yZHNMZW5ndGg7IGorKykgewoJICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tXb3Jkc1tqXSBePSBpbnRlcm1lZGlhdGVXb3Jkc1tqXTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgZGVyaXZlZEtleS5jb25jYXQoYmxvY2spOwoJICAgICAgICAgICAgICAgIGJsb2NrSW5kZXhXb3Jkc1swXSsrOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZGVyaXZlZEtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0OwoKCSAgICAgICAgICAgIHJldHVybiBkZXJpdmVkS2V5OwoJICAgICAgICB9CgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIENvbXB1dGVzIHRoZSBQYXNzd29yZC1CYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAyLgoJICAgICAqCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC4KCSAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgY29tcHV0YXRpb24uCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLlBCS0RGMihwYXNzd29yZCwgc2FsdCk7CgkgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5QQktERjIocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCB9KTsKCSAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLlBCS0RGMihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pOwoJICAgICAqLwoJICAgIEMuUEJLREYyID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBjZmcpIHsKCSAgICAgICAgcmV0dXJuIFBCS0RGMi5jcmVhdGUoY2ZnKS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTsKCSAgICB9OwoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTsKCSAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwoJICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgkgICAgdmFyIE1ENSA9IENfYWxnby5NRDU7CgoJICAgIC8qKgoJICAgICAqIFRoaXMga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaXMgbWVhbnQgdG8gY29uZm9ybSB3aXRoIEVWUF9CeXRlc1RvS2V5LgoJICAgICAqIHd3dy5vcGVuc3NsLm9yZy9kb2NzL2NyeXB0by9FVlBfQnl0ZXNUb0tleS5odG1sCgkgICAgICovCgkgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREYgPSBCYXNlLmV4dGVuZCh7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZXlTaXplIFRoZSBrZXkgc2l6ZSBpbiB3b3JkcyB0byBnZW5lcmF0ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpCgkgICAgICAgICAqIEBwcm9wZXJ0eSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS4gRGVmYXVsdDogTUQ1CgkgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdGVyYXRpb25zIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtLiBEZWZhdWx0OiAxCgkgICAgICAgICAqLwoJICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKHsKCSAgICAgICAgICAgIGtleVNpemU6IDEyOC8zMiwKCSAgICAgICAgICAgIGhhc2hlcjogTUQ1LAoJICAgICAgICAgICAgaXRlcmF0aW9uczogMQoJICAgICAgICB9KSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGRlcml2YXRpb24uCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5FdnBLREYuY3JlYXRlKCk7CgkgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5FdnBLREYuY3JlYXRlKHsga2V5U2l6ZTogOCB9KTsKCSAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pOwoJICAgICAgICAgKi8KCSAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykgewoJICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGtleSA9IGtkZi5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTsKCSAgICAgICAgICovCgkgICAgICAgIGNvbXB1dGU6IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCkgewoJICAgICAgICAgICAgdmFyIGJsb2NrOwoKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7CgoJICAgICAgICAgICAgLy8gSW5pdCBoYXNoZXIKCSAgICAgICAgICAgIHZhciBoYXNoZXIgPSBjZmcuaGFzaGVyLmNyZWF0ZSgpOwoKCSAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzCgkgICAgICAgICAgICB2YXIgZGVyaXZlZEtleSA9IFdvcmRBcnJheS5jcmVhdGUoKTsKCgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5V29yZHMgPSBkZXJpdmVkS2V5LndvcmRzOwoJICAgICAgICAgICAgdmFyIGtleVNpemUgPSBjZmcua2V5U2l6ZTsKCSAgICAgICAgICAgIHZhciBpdGVyYXRpb25zID0gY2ZnLml0ZXJhdGlvbnM7CgoJICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5CgkgICAgICAgICAgICB3aGlsZSAoZGVyaXZlZEtleVdvcmRzLmxlbmd0aCA8IGtleVNpemUpIHsKCSAgICAgICAgICAgICAgICBpZiAoYmxvY2spIHsKCSAgICAgICAgICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZShibG9jayk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGJsb2NrID0gaGFzaGVyLnVwZGF0ZShwYXNzd29yZCkuZmluYWxpemUoc2FsdCk7CgkgICAgICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7CgoJICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGlvbnMKCSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewoJICAgICAgICAgICAgICAgICAgICBibG9jayA9IGhhc2hlci5maW5hbGl6ZShibG9jayk7CgkgICAgICAgICAgICAgICAgICAgIGhhc2hlci5yZXNldCgpOwoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgZGVyaXZlZEtleS5jb25jYXQoYmxvY2spOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZGVyaXZlZEtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0OwoKCSAgICAgICAgICAgIHJldHVybiBkZXJpdmVkS2V5OwoJICAgICAgICB9CgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIERlcml2ZXMgYSBrZXkgZnJvbSBhIHBhc3N3b3JkLgoJICAgICAqCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuCgkgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC4KCSAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgY29tcHV0YXRpb24uCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCk7CgkgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCB9KTsKCSAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pOwoJICAgICAqLwoJICAgIEMuRXZwS0RGID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBjZmcpIHsKCSAgICAgICAgcmV0dXJuIEV2cEtERi5jcmVhdGUoY2ZnKS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTsKCSAgICB9OwoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgkgICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCSAgICB2YXIgU0hBMjU2ID0gQ19hbGdvLlNIQTI1NjsKCgkgICAgLyoqCgkgICAgICogU0hBLTIyNCBoYXNoIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgU0hBMjI0ID0gQ19hbGdvLlNIQTIyNCA9IFNIQTI1Ni5leHRlbmQoewoJICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChbCgkgICAgICAgICAgICAgICAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSwKCSAgICAgICAgICAgICAgICAweGZmYzAwYjMxLCAweDY4NTgxNTExLCAweDY0Zjk4ZmE3LCAweGJlZmE0ZmE0CgkgICAgICAgICAgICBdKTsKCSAgICAgICAgfSwKCgkgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB2YXIgaGFzaCA9IFNIQTI1Ni5fZG9GaW5hbGl6ZS5jYWxsKHRoaXMpOwoKCSAgICAgICAgICAgIGhhc2guc2lnQnl0ZXMgLT0gNDsKCgkgICAgICAgICAgICByZXR1cm4gaGFzaDsKCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEyMjQoJ21lc3NhZ2UnKTsKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEyMjQod29yZEFycmF5KTsKCSAgICAgKi8KCSAgICBDLlNIQTIyNCA9IFNIQTI1Ni5fY3JlYXRlSGVscGVyKFNIQTIyNCk7CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMjI0KG1lc3NhZ2UsIGtleSk7CgkgICAgICovCgkgICAgQy5IbWFjU0hBMjI0ID0gU0hBMjU2Ll9jcmVhdGVIbWFjSGVscGVyKFNIQTIyNCk7Cgl9KCkpOwoKCgkoZnVuY3Rpb24gKHVuZGVmaW5lZCkgewoJICAgIC8vIFNob3J0Y3V0cwoJICAgIHZhciBDID0gQ3J5cHRvSlM7CgkgICAgdmFyIENfbGliID0gQy5saWI7CgkgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlOwoJICAgIHZhciBYMzJXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgoJICAgIC8qKgoJICAgICAqIHg2NCBuYW1lc3BhY2UuCgkgICAgICovCgkgICAgdmFyIENfeDY0ID0gQy54NjQgPSB7fTsKCgkgICAgLyoqCgkgICAgICogQSA2NC1iaXQgd29yZC4KCSAgICAgKi8KCSAgICB2YXIgWDY0V29yZCA9IENfeDY0LldvcmQgPSBCYXNlLmV4dGVuZCh7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgNjQtYml0IHdvcmQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIDMyIGJpdHMuCgkgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAzMiBiaXRzLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIHg2NFdvcmQgPSBDcnlwdG9KUy54NjQuV29yZC5jcmVhdGUoMHgwMDAxMDIwMywgMHgwNDA1MDYwNyk7CgkgICAgICAgICAqLwoJICAgICAgICBpbml0OiBmdW5jdGlvbiAoaGlnaCwgbG93KSB7CgkgICAgICAgICAgICB0aGlzLmhpZ2ggPSBoaWdoOwoJICAgICAgICAgICAgdGhpcy5sb3cgPSBsb3c7CgkgICAgICAgIH0KCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBCaXR3aXNlIE5PVHMgdGhpcyB3b3JkLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgbmVnYXRpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgbmVnYXRlZCA9IHg2NFdvcmQubm90KCk7CgkgICAgICAgICAqLwoJICAgICAgICAvLyBub3Q6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIC8vIHZhciBoaWdoID0gfnRoaXMuaGlnaDsKCSAgICAgICAgICAgIC8vIHZhciBsb3cgPSB+dGhpcy5sb3c7CgoJICAgICAgICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7CgkgICAgICAgIC8vIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQml0d2lzZSBBTkRzIHRoaXMgd29yZCB3aXRoIHRoZSBwYXNzZWQgd29yZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtYNjRXb3JkfSB3b3JkIFRoZSB4NjQtV29yZCB0byBBTkQgd2l0aCB0aGlzIHdvcmQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBBTkRpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgYW5kZWQgPSB4NjRXb3JkLmFuZChhbm90aGVyWDY0V29yZCk7CgkgICAgICAgICAqLwoJICAgICAgICAvLyBhbmQ6IGZ1bmN0aW9uICh3b3JkKSB7CgkgICAgICAgICAgICAvLyB2YXIgaGlnaCA9IHRoaXMuaGlnaCAmIHdvcmQuaGlnaDsKCSAgICAgICAgICAgIC8vIHZhciBsb3cgPSB0aGlzLmxvdyAmIHdvcmQubG93OwoKCSAgICAgICAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpOwoJICAgICAgICAvLyB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIEJpdHdpc2UgT1JzIHRoaXMgd29yZCB3aXRoIHRoZSBwYXNzZWQgd29yZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtYNjRXb3JkfSB3b3JkIFRoZSB4NjQtV29yZCB0byBPUiB3aXRoIHRoaXMgd29yZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIE9SaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIG9yZWQgPSB4NjRXb3JkLm9yKGFub3RoZXJYNjRXb3JkKTsKCSAgICAgICAgICovCgkgICAgICAgIC8vIG9yOiBmdW5jdGlvbiAod29yZCkgewoJICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSB0aGlzLmhpZ2ggfCB3b3JkLmhpZ2g7CgkgICAgICAgICAgICAvLyB2YXIgbG93ID0gdGhpcy5sb3cgfCB3b3JkLmxvdzsKCgkgICAgICAgICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTsKCSAgICAgICAgLy8gfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBCaXR3aXNlIFhPUnMgdGhpcyB3b3JkIHdpdGggdGhlIHBhc3NlZCB3b3JkLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1g2NFdvcmR9IHdvcmQgVGhlIHg2NC1Xb3JkIHRvIFhPUiB3aXRoIHRoaXMgd29yZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIFhPUmluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciB4b3JlZCA9IHg2NFdvcmQueG9yKGFub3RoZXJYNjRXb3JkKTsKCSAgICAgICAgICovCgkgICAgICAgIC8vIHhvcjogZnVuY3Rpb24gKHdvcmQpIHsKCSAgICAgICAgICAgIC8vIHZhciBoaWdoID0gdGhpcy5oaWdoIF4gd29yZC5oaWdoOwoJICAgICAgICAgICAgLy8gdmFyIGxvdyA9IHRoaXMubG93IF4gd29yZC5sb3c7CgoJICAgICAgICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7CgkgICAgICAgIC8vIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogU2hpZnRzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIGxlZnQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIHNoaWZ0aW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIHNoaWZ0ZWQgPSB4NjRXb3JkLnNoaWZ0TCgyNSk7CgkgICAgICAgICAqLwoJICAgICAgICAvLyBzaGlmdEw6IGZ1bmN0aW9uIChuKSB7CgkgICAgICAgICAgICAvLyBpZiAobiA8IDMyKSB7CgkgICAgICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSAodGhpcy5oaWdoIDw8IG4pIHwgKHRoaXMubG93ID4+PiAoMzIgLSBuKSk7CgkgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9IHRoaXMubG93IDw8IG47CgkgICAgICAgICAgICAvLyB9IGVsc2UgewoJICAgICAgICAgICAgICAgIC8vIHZhciBoaWdoID0gdGhpcy5sb3cgPDwgKG4gLSAzMik7CgkgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9IDA7CgkgICAgICAgICAgICAvLyB9CgoJICAgICAgICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7CgkgICAgICAgIC8vIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogU2hpZnRzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIHJpZ2h0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBzaGlmdGluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBzaGlmdGVkID0geDY0V29yZC5zaGlmdFIoNyk7CgkgICAgICAgICAqLwoJICAgICAgICAvLyBzaGlmdFI6IGZ1bmN0aW9uIChuKSB7CgkgICAgICAgICAgICAvLyBpZiAobiA8IDMyKSB7CgkgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9ICh0aGlzLmxvdyA+Pj4gbikgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG4pKTsKCSAgICAgICAgICAgICAgICAvLyB2YXIgaGlnaCA9IHRoaXMuaGlnaCA+Pj4gbjsKCSAgICAgICAgICAgIC8vIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9IHRoaXMuaGlnaCA+Pj4gKG4gLSAzMik7CgkgICAgICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSAwOwoJICAgICAgICAgICAgLy8gfQoKCSAgICAgICAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpOwoJICAgICAgICAvLyB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIFJvdGF0ZXMgdGhpcyB3b3JkIG4gYml0cyB0byB0aGUgbGVmdC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBiaXRzIHRvIHJvdGF0ZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIHJvdGF0aW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIHJvdGF0ZWQgPSB4NjRXb3JkLnJvdEwoMjUpOwoJICAgICAgICAgKi8KCSAgICAgICAgLy8gcm90TDogZnVuY3Rpb24gKG4pIHsKCSAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLnNoaWZ0TChuKS5vcih0aGlzLnNoaWZ0Uig2NCAtIG4pKTsKCSAgICAgICAgLy8gfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBSb3RhdGVzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIHJpZ2h0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gcm90YXRlLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgcm90YXRpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgcm90YXRlZCA9IHg2NFdvcmQucm90Uig3KTsKCSAgICAgICAgICovCgkgICAgICAgIC8vIHJvdFI6IGZ1bmN0aW9uIChuKSB7CgkgICAgICAgICAgICAvLyByZXR1cm4gdGhpcy5zaGlmdFIobikub3IodGhpcy5zaGlmdEwoNjQgLSBuKSk7CgkgICAgICAgIC8vIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQWRkcyB0aGlzIHdvcmQgd2l0aCB0aGUgcGFzc2VkIHdvcmQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7WDY0V29yZH0gd29yZCBUaGUgeDY0LVdvcmQgdG8gYWRkIHdpdGggdGhpcyB3b3JkLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgYWRkaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGFkZGVkID0geDY0V29yZC5hZGQoYW5vdGhlclg2NFdvcmQpOwoJICAgICAgICAgKi8KCSAgICAgICAgLy8gYWRkOiBmdW5jdGlvbiAod29yZCkgewoJICAgICAgICAgICAgLy8gdmFyIGxvdyA9ICh0aGlzLmxvdyArIHdvcmQubG93KSB8IDA7CgkgICAgICAgICAgICAvLyB2YXIgY2FycnkgPSAobG93ID4+PiAwKSA8ICh0aGlzLmxvdyA+Pj4gMCkgPyAxIDogMDsKCSAgICAgICAgICAgIC8vIHZhciBoaWdoID0gKHRoaXMuaGlnaCArIHdvcmQuaGlnaCArIGNhcnJ5KSB8IDA7CgoJICAgICAgICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7CgkgICAgICAgIC8vIH0KCSAgICB9KTsKCgkgICAgLyoqCgkgICAgICogQW4gYXJyYXkgb2YgNjQtYml0IHdvcmRzLgoJICAgICAqCgkgICAgICogQHByb3BlcnR5IHtBcnJheX0gd29yZHMgVGhlIGFycmF5IG9mIENyeXB0b0pTLng2NC5Xb3JkIG9iamVjdHMuCgkgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5LgoJICAgICAqLwoJICAgIHZhciBYNjRXb3JkQXJyYXkgPSBDX3g2NC5Xb3JkQXJyYXkgPSBCYXNlLmV4dGVuZCh7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiBDcnlwdG9KUy54NjQuV29yZCBvYmplY3RzLgoJICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2lnQnl0ZXMgKE9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoZSB3b3Jkcy4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy54NjQuV29yZEFycmF5LmNyZWF0ZSgpOwoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLng2NC5Xb3JkQXJyYXkuY3JlYXRlKFsKCSAgICAgICAgICogICAgICAgICBDcnlwdG9KUy54NjQuV29yZC5jcmVhdGUoMHgwMDAxMDIwMywgMHgwNDA1MDYwNyksCgkgICAgICAgICAqICAgICAgICAgQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MTgxOTFhMWIsIDB4MWMxZDFlMWYpCgkgICAgICAgICAqICAgICBdKTsKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy54NjQuV29yZEFycmF5LmNyZWF0ZShbCgkgICAgICAgICAqICAgICAgICAgQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MDAwMTAyMDMsIDB4MDQwNTA2MDcpLAoJICAgICAgICAgKiAgICAgICAgIENyeXB0b0pTLng2NC5Xb3JkLmNyZWF0ZSgweDE4MTkxYTFiLCAweDFjMWQxZTFmKQoJICAgICAgICAgKiAgICAgXSwgMTApOwoJICAgICAgICAgKi8KCSAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykgewoJICAgICAgICAgICAgd29yZHMgPSB0aGlzLndvcmRzID0gd29yZHMgfHwgW107CgoJICAgICAgICAgICAgaWYgKHNpZ0J5dGVzICE9IHVuZGVmaW5lZCkgewoJICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlczsKCSAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHdvcmRzLmxlbmd0aCAqIDg7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgdGhpcyA2NC1iaXQgd29yZCBhcnJheSB0byBhIDMyLWJpdCB3b3JkIGFycmF5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtDcnlwdG9KUy5saWIuV29yZEFycmF5fSBUaGlzIHdvcmQgYXJyYXkncyBkYXRhIGFzIGEgMzItYml0IHdvcmQgYXJyYXkuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgeDMyV29yZEFycmF5ID0geDY0V29yZEFycmF5LnRvWDMyKCk7CgkgICAgICAgICAqLwoJICAgICAgICB0b1gzMjogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgeDY0V29yZHMgPSB0aGlzLndvcmRzOwoJICAgICAgICAgICAgdmFyIHg2NFdvcmRzTGVuZ3RoID0geDY0V29yZHMubGVuZ3RoOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQKCSAgICAgICAgICAgIHZhciB4MzJXb3JkcyA9IFtdOwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4NjRXb3Jkc0xlbmd0aDsgaSsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIHg2NFdvcmQgPSB4NjRXb3Jkc1tpXTsKCSAgICAgICAgICAgICAgICB4MzJXb3Jkcy5wdXNoKHg2NFdvcmQuaGlnaCk7CgkgICAgICAgICAgICAgICAgeDMyV29yZHMucHVzaCh4NjRXb3JkLmxvdyk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgcmV0dXJuIFgzMldvcmRBcnJheS5jcmVhdGUoeDMyV29yZHMsIHRoaXMuc2lnQnl0ZXMpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgd29yZCBhcnJheS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7WDY0V29yZEFycmF5fSBUaGUgY2xvbmUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSB4NjRXb3JkQXJyYXkuY2xvbmUoKTsKCSAgICAgICAgICovCgkgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7CgoJICAgICAgICAgICAgLy8gQ2xvbmUgIndvcmRzIiBhcnJheQoJICAgICAgICAgICAgdmFyIHdvcmRzID0gY2xvbmUud29yZHMgPSB0aGlzLndvcmRzLnNsaWNlKDApOwoKCSAgICAgICAgICAgIC8vIENsb25lIGVhY2ggWDY0V29yZCBvYmplY3QKCSAgICAgICAgICAgIHZhciB3b3Jkc0xlbmd0aCA9IHdvcmRzLmxlbmd0aDsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHNMZW5ndGg7IGkrKykgewoJICAgICAgICAgICAgICAgIHdvcmRzW2ldID0gd29yZHNbaV0uY2xvbmUoKTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICByZXR1cm4gY2xvbmU7CgkgICAgICAgIH0KCSAgICB9KTsKCX0oKSk7CgoKCShmdW5jdGlvbiAoTWF0aCkgewoJICAgIC8vIFNob3J0Y3V0cwoJICAgIHZhciBDID0gQ3J5cHRvSlM7CgkgICAgdmFyIENfbGliID0gQy5saWI7CgkgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTsKCSAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyOwoJICAgIHZhciBDX3g2NCA9IEMueDY0OwoJICAgIHZhciBYNjRXb3JkID0gQ194NjQuV29yZDsKCSAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoKCSAgICAvLyBDb25zdGFudHMgdGFibGVzCgkgICAgdmFyIFJIT19PRkZTRVRTID0gW107CgkgICAgdmFyIFBJX0lOREVYRVMgID0gW107CgkgICAgdmFyIFJPVU5EX0NPTlNUQU5UUyA9IFtdOwoKCSAgICAvLyBDb21wdXRlIENvbnN0YW50cwoJICAgIChmdW5jdGlvbiAoKSB7CgkgICAgICAgIC8vIENvbXB1dGUgcmhvIG9mZnNldCBjb25zdGFudHMKCSAgICAgICAgdmFyIHggPSAxLCB5ID0gMDsKCSAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCAyNDsgdCsrKSB7CgkgICAgICAgICAgICBSSE9fT0ZGU0VUU1t4ICsgNSAqIHldID0gKCh0ICsgMSkgKiAodCArIDIpIC8gMikgJSA2NDsKCgkgICAgICAgICAgICB2YXIgbmV3WCA9IHkgJSA1OwoJICAgICAgICAgICAgdmFyIG5ld1kgPSAoMiAqIHggKyAzICogeSkgJSA1OwoJICAgICAgICAgICAgeCA9IG5ld1g7CgkgICAgICAgICAgICB5ID0gbmV3WTsKCSAgICAgICAgfQoKCSAgICAgICAgLy8gQ29tcHV0ZSBwaSBpbmRleCBjb25zdGFudHMKCSAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCA1OyB4KyspIHsKCSAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgNTsgeSsrKSB7CgkgICAgICAgICAgICAgICAgUElfSU5ERVhFU1t4ICsgNSAqIHldID0geSArICgoMiAqIHggKyAzICogeSkgJSA1KSAqIDU7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCgkgICAgICAgIC8vIENvbXB1dGUgcm91bmQgY29uc3RhbnRzCgkgICAgICAgIHZhciBMRlNSID0gMHgwMTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNDsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgcm91bmRDb25zdGFudE1zdyA9IDA7CgkgICAgICAgICAgICB2YXIgcm91bmRDb25zdGFudExzdyA9IDA7CgoJICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA3OyBqKyspIHsKCSAgICAgICAgICAgICAgICBpZiAoTEZTUiAmIDB4MDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGJpdFBvc2l0aW9uID0gKDEgPDwgaikgLSAxOwoJICAgICAgICAgICAgICAgICAgICBpZiAoYml0UG9zaXRpb24gPCAzMikgewoJICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRDb25zdGFudExzdyBePSAxIDw8IGJpdFBvc2l0aW9uOwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGJpdFBvc2l0aW9uID49IDMyKSAqLyB7CgkgICAgICAgICAgICAgICAgICAgICAgICByb3VuZENvbnN0YW50TXN3IF49IDEgPDwgKGJpdFBvc2l0aW9uIC0gMzIpOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoKCSAgICAgICAgICAgICAgICAvLyBDb21wdXRlIG5leHQgTEZTUgoJICAgICAgICAgICAgICAgIGlmIChMRlNSICYgMHg4MCkgewoJICAgICAgICAgICAgICAgICAgICAvLyBQcmltaXRpdmUgcG9seW5vbWlhbCBvdmVyIEdGKDIpOiB4XjggKyB4XjYgKyB4XjUgKyB4XjQgKyAxCgkgICAgICAgICAgICAgICAgICAgIExGU1IgPSAoTEZTUiA8PCAxKSBeIDB4NzE7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgTEZTUiA8PD0gMTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgUk9VTkRfQ09OU1RBTlRTW2ldID0gWDY0V29yZC5jcmVhdGUocm91bmRDb25zdGFudE1zdywgcm91bmRDb25zdGFudExzdyk7CgkgICAgICAgIH0KCSAgICB9KCkpOwoKCSAgICAvLyBSZXVzYWJsZSBvYmplY3RzIGZvciB0ZW1wb3JhcnkgdmFsdWVzCgkgICAgdmFyIFQgPSBbXTsKCSAgICAoZnVuY3Rpb24gKCkgewoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHsKCSAgICAgICAgICAgIFRbaV0gPSBYNjRXb3JkLmNyZWF0ZSgpOwoJICAgICAgICB9CgkgICAgfSgpKTsKCgkgICAgLyoqCgkgICAgICogU0hBLTMgaGFzaCBhbGdvcml0aG0uCgkgICAgICovCgkgICAgdmFyIFNIQTMgPSBDX2FsZ28uU0hBMyA9IEhhc2hlci5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gb3V0cHV0TGVuZ3RoCgkgICAgICAgICAqICAgVGhlIGRlc2lyZWQgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG91dHB1dCBoYXNoLgoJICAgICAgICAgKiAgIE9ubHkgdmFsdWVzIHBlcm1pdHRlZCBhcmU6IDIyNCwgMjU2LCAzODQsIDUxMi4KCSAgICAgICAgICogICBEZWZhdWx0OiA1MTIKCSAgICAgICAgICovCgkgICAgICAgIGNmZzogSGFzaGVyLmNmZy5leHRlbmQoewoJICAgICAgICAgICAgb3V0cHV0TGVuZ3RoOiA1MTIKCSAgICAgICAgfSksCgoJICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGUgPSBbXQoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTsgaSsrKSB7CgkgICAgICAgICAgICAgICAgc3RhdGVbaV0gPSBuZXcgWDY0V29yZC5pbml0KCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdGhpcy5ibG9ja1NpemUgPSAoMTYwMCAtIDIgKiB0aGlzLmNmZy5vdXRwdXRMZW5ndGgpIC8gMzI7CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGU7CgkgICAgICAgICAgICB2YXIgbkJsb2NrU2l6ZUxhbmVzID0gdGhpcy5ibG9ja1NpemUgLyAyOwoKCSAgICAgICAgICAgIC8vIEFic29yYgoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuQmxvY2tTaXplTGFuZXM7IGkrKykgewoJICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgICAgIHZhciBNMmkgID0gTVtvZmZzZXQgKyAyICogaV07CgkgICAgICAgICAgICAgICAgdmFyIE0yaTEgPSBNW29mZnNldCArIDIgKiBpICsgMV07CgoJICAgICAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuCgkgICAgICAgICAgICAgICAgTTJpID0gKAoJICAgICAgICAgICAgICAgICAgICAoKChNMmkgPDwgOCkgIHwgKE0yaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHwKCSAgICAgICAgICAgICAgICAgICAgKCgoTTJpIDw8IDI0KSB8IChNMmkgPj4+IDgpKSAgJiAweGZmMDBmZjAwKQoJICAgICAgICAgICAgICAgICk7CgkgICAgICAgICAgICAgICAgTTJpMSA9ICgKCSAgICAgICAgICAgICAgICAgICAgKCgoTTJpMSA8PCA4KSAgfCAoTTJpMSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHwKCSAgICAgICAgICAgICAgICAgICAgKCgoTTJpMSA8PCAyNCkgfCAoTTJpMSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApCgkgICAgICAgICAgICAgICAgKTsKCgkgICAgICAgICAgICAgICAgLy8gQWJzb3JiIG1lc3NhZ2UgaW50byBzdGF0ZQoJICAgICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbaV07CgkgICAgICAgICAgICAgICAgbGFuZS5oaWdoIF49IE0yaTE7CgkgICAgICAgICAgICAgICAgbGFuZS5sb3cgIF49IE0yaTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBSb3VuZHMKCSAgICAgICAgICAgIGZvciAodmFyIHJvdW5kID0gMDsgcm91bmQgPCAyNDsgcm91bmQrKykgewoJICAgICAgICAgICAgICAgIC8vIFRoZXRhCgkgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCA1OyB4KyspIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gTWl4IGNvbHVtbiBsYW5lcwoJICAgICAgICAgICAgICAgICAgICB2YXIgdE1zdyA9IDAsIHRMc3cgPSAwOwoJICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykgewoJICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVt4ICsgNSAqIHldOwoJICAgICAgICAgICAgICAgICAgICAgICAgdE1zdyBePSBsYW5lLmhpZ2g7CgkgICAgICAgICAgICAgICAgICAgICAgICB0THN3IF49IGxhbmUubG93OwoJICAgICAgICAgICAgICAgICAgICB9CgoJICAgICAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcnkgdmFsdWVzCgkgICAgICAgICAgICAgICAgICAgIHZhciBUeCA9IFRbeF07CgkgICAgICAgICAgICAgICAgICAgIFR4LmhpZ2ggPSB0TXN3OwoJICAgICAgICAgICAgICAgICAgICBUeC5sb3cgID0gdExzdzsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCA1OyB4KyspIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICAgICAgICAgIHZhciBUeDQgPSBUWyh4ICsgNCkgJSA1XTsKCSAgICAgICAgICAgICAgICAgICAgdmFyIFR4MSA9IFRbKHggKyAxKSAlIDVdOwoJICAgICAgICAgICAgICAgICAgICB2YXIgVHgxTXN3ID0gVHgxLmhpZ2g7CgkgICAgICAgICAgICAgICAgICAgIHZhciBUeDFMc3cgPSBUeDEubG93OwoKCSAgICAgICAgICAgICAgICAgICAgLy8gTWl4IHN1cnJvdW5kaW5nIGNvbHVtbnMKCSAgICAgICAgICAgICAgICAgICAgdmFyIHRNc3cgPSBUeDQuaGlnaCBeICgoVHgxTXN3IDw8IDEpIHwgKFR4MUxzdyA+Pj4gMzEpKTsKCSAgICAgICAgICAgICAgICAgICAgdmFyIHRMc3cgPSBUeDQubG93ICBeICgoVHgxTHN3IDw8IDEpIHwgKFR4MU1zdyA+Pj4gMzEpKTsKCSAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCA1OyB5KyspIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbeCArIDUgKiB5XTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGxhbmUuaGlnaCBePSB0TXN3OwoJICAgICAgICAgICAgICAgICAgICAgICAgbGFuZS5sb3cgIF49IHRMc3c7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgoJICAgICAgICAgICAgICAgIC8vIFJobyBQaQoJICAgICAgICAgICAgICAgIGZvciAodmFyIGxhbmVJbmRleCA9IDE7IGxhbmVJbmRleCA8IDI1OyBsYW5lSW5kZXgrKykgewoJICAgICAgICAgICAgICAgICAgICB2YXIgdE1zdzsKCSAgICAgICAgICAgICAgICAgICAgdmFyIHRMc3c7CgoJICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVtsYW5lSW5kZXhdOwoJICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZU1zdyA9IGxhbmUuaGlnaDsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmVMc3cgPSBsYW5lLmxvdzsKCSAgICAgICAgICAgICAgICAgICAgdmFyIHJob09mZnNldCA9IFJIT19PRkZTRVRTW2xhbmVJbmRleF07CgoJICAgICAgICAgICAgICAgICAgICAvLyBSb3RhdGUgbGFuZXMKCSAgICAgICAgICAgICAgICAgICAgaWYgKHJob09mZnNldCA8IDMyKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICB0TXN3ID0gKGxhbmVNc3cgPDwgcmhvT2Zmc2V0KSB8IChsYW5lTHN3ID4+PiAoMzIgLSByaG9PZmZzZXQpKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRMc3cgPSAobGFuZUxzdyA8PCByaG9PZmZzZXQpIHwgKGxhbmVNc3cgPj4+ICgzMiAtIHJob09mZnNldCkpOwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLyogaWYgKHJob09mZnNldCA+PSAzMikgKi8gewoJICAgICAgICAgICAgICAgICAgICAgICAgdE1zdyA9IChsYW5lTHN3IDw8IChyaG9PZmZzZXQgLSAzMikpIHwgKGxhbmVNc3cgPj4+ICg2NCAtIHJob09mZnNldCkpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdExzdyA9IChsYW5lTXN3IDw8IChyaG9PZmZzZXQgLSAzMikpIHwgKGxhbmVMc3cgPj4+ICg2NCAtIHJob09mZnNldCkpOwoJICAgICAgICAgICAgICAgICAgICB9CgoJICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc3Bvc2UgbGFuZXMKCSAgICAgICAgICAgICAgICAgICAgdmFyIFRQaUxhbmUgPSBUW1BJX0lOREVYRVNbbGFuZUluZGV4XV07CgkgICAgICAgICAgICAgICAgICAgIFRQaUxhbmUuaGlnaCA9IHRNc3c7CgkgICAgICAgICAgICAgICAgICAgIFRQaUxhbmUubG93ICA9IHRMc3c7CgkgICAgICAgICAgICAgICAgfQoKCSAgICAgICAgICAgICAgICAvLyBSaG8gcGkgYXQgeCA9IHkgPSAwCgkgICAgICAgICAgICAgICAgdmFyIFQwID0gVFswXTsKCSAgICAgICAgICAgICAgICB2YXIgc3RhdGUwID0gc3RhdGVbMF07CgkgICAgICAgICAgICAgICAgVDAuaGlnaCA9IHN0YXRlMC5oaWdoOwoJICAgICAgICAgICAgICAgIFQwLmxvdyAgPSBzdGF0ZTAubG93OwoKCSAgICAgICAgICAgICAgICAvLyBDaGkKCSAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IDU7IHgrKykgewoJICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykgewoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZUluZGV4ID0geCArIDUgKiB5OwoJICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVtsYW5lSW5kZXhdOwoJICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFRMYW5lID0gVFtsYW5lSW5kZXhdOwoJICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFR4MUxhbmUgPSBUWygoeCArIDEpICUgNSkgKyA1ICogeV07CgkgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVHgyTGFuZSA9IFRbKCh4ICsgMikgJSA1KSArIDUgKiB5XTsKCgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXggcm93cwoJICAgICAgICAgICAgICAgICAgICAgICAgbGFuZS5oaWdoID0gVExhbmUuaGlnaCBeICh+VHgxTGFuZS5oaWdoICYgVHgyTGFuZS5oaWdoKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGxhbmUubG93ICA9IFRMYW5lLmxvdyAgXiAoflR4MUxhbmUubG93ICAmIFR4MkxhbmUubG93KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgLy8gSW90YQoJICAgICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbMF07CgkgICAgICAgICAgICAgICAgdmFyIHJvdW5kQ29uc3RhbnQgPSBST1VORF9DT05TVEFOVFNbcm91bmRdOwoJICAgICAgICAgICAgICAgIGxhbmUuaGlnaCBePSByb3VuZENvbnN0YW50LmhpZ2g7CgkgICAgICAgICAgICAgICAgbGFuZS5sb3cgIF49IHJvdW5kQ29uc3RhbnQubG93OwoJICAgICAgICAgICAgfQoJICAgICAgICB9LAoKCSAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhOwoJICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7CgkgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4OwoJICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4OwoJICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZUJpdHMgPSB0aGlzLmJsb2NrU2l6ZSAqIDMyOwoKCSAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nCgkgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDEgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpOwoJICAgICAgICAgICAgZGF0YVdvcmRzWygoTWF0aC5jZWlsKChuQml0c0xlZnQgKyAxKSAvIGJsb2NrU2l6ZUJpdHMpICogYmxvY2tTaXplQml0cykgPj4+IDUpIC0gMV0gfD0gMHg4MDsKCSAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDsKCgkgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2NrcwoJICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpOwoKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGU7CgkgICAgICAgICAgICB2YXIgb3V0cHV0TGVuZ3RoQnl0ZXMgPSB0aGlzLmNmZy5vdXRwdXRMZW5ndGggLyA4OwoJICAgICAgICAgICAgdmFyIG91dHB1dExlbmd0aExhbmVzID0gb3V0cHV0TGVuZ3RoQnl0ZXMgLyA4OwoKCSAgICAgICAgICAgIC8vIFNxdWVlemUKCSAgICAgICAgICAgIHZhciBoYXNoV29yZHMgPSBbXTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0cHV0TGVuZ3RoTGFuZXM7IGkrKykgewoJICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbaV07CgkgICAgICAgICAgICAgICAgdmFyIGxhbmVNc3cgPSBsYW5lLmhpZ2g7CgkgICAgICAgICAgICAgICAgdmFyIGxhbmVMc3cgPSBsYW5lLmxvdzsKCgkgICAgICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW4KCSAgICAgICAgICAgICAgICBsYW5lTXN3ID0gKAoJICAgICAgICAgICAgICAgICAgICAoKChsYW5lTXN3IDw8IDgpICB8IChsYW5lTXN3ID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfAoJICAgICAgICAgICAgICAgICAgICAoKChsYW5lTXN3IDw8IDI0KSB8IChsYW5lTXN3ID4+PiA4KSkgICYgMHhmZjAwZmYwMCkKCSAgICAgICAgICAgICAgICApOwoJICAgICAgICAgICAgICAgIGxhbmVMc3cgPSAoCgkgICAgICAgICAgICAgICAgICAgICgoKGxhbmVMc3cgPDwgOCkgIHwgKGxhbmVMc3cgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8CgkgICAgICAgICAgICAgICAgICAgICgoKGxhbmVMc3cgPDwgMjQpIHwgKGxhbmVMc3cgPj4+IDgpKSAgJiAweGZmMDBmZjAwKQoJICAgICAgICAgICAgICAgICk7CgoJICAgICAgICAgICAgICAgIC8vIFNxdWVlemUgc3RhdGUgdG8gcmV0cmlldmUgaGFzaAoJICAgICAgICAgICAgICAgIGhhc2hXb3Jkcy5wdXNoKGxhbmVMc3cpOwoJICAgICAgICAgICAgICAgIGhhc2hXb3Jkcy5wdXNoKGxhbmVNc3cpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoCgkgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KGhhc2hXb3Jkcywgb3V0cHV0TGVuZ3RoQnl0ZXMpOwoJICAgICAgICB9LAoKCSAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpOwoKCSAgICAgICAgICAgIHZhciBzdGF0ZSA9IGNsb25lLl9zdGF0ZSA9IHRoaXMuX3N0YXRlLnNsaWNlKDApOwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTsgaSsrKSB7CgkgICAgICAgICAgICAgICAgc3RhdGVbaV0gPSBzdGF0ZVtpXS5jbG9uZSgpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIHJldHVybiBjbG9uZTsKCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEzKCdtZXNzYWdlJyk7CgkgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMyh3b3JkQXJyYXkpOwoJICAgICAqLwoJICAgIEMuU0hBMyA9IEhhc2hlci5fY3JlYXRlSGVscGVyKFNIQTMpOwoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICoKCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4KCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS4KCSAgICAgKgoJICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuCgkgICAgICoKCSAgICAgKiBAc3RhdGljCgkgICAgICoKCSAgICAgKiBAZXhhbXBsZQoJICAgICAqCgkgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTMobWVzc2FnZSwga2V5KTsKCSAgICAgKi8KCSAgICBDLkhtYWNTSEEzID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTMpOwoJfShNYXRoKSk7CgoKCShmdW5jdGlvbiAoKSB7CgkgICAgLy8gU2hvcnRjdXRzCgkgICAgdmFyIEMgPSBDcnlwdG9KUzsKCSAgICB2YXIgQ19saWIgPSBDLmxpYjsKCSAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyOwoJICAgIHZhciBDX3g2NCA9IEMueDY0OwoJICAgIHZhciBYNjRXb3JkID0gQ194NjQuV29yZDsKCSAgICB2YXIgWDY0V29yZEFycmF5ID0gQ194NjQuV29yZEFycmF5OwoJICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgoJICAgIGZ1bmN0aW9uIFg2NFdvcmRfY3JlYXRlKCkgewoJICAgICAgICByZXR1cm4gWDY0V29yZC5jcmVhdGUuYXBwbHkoWDY0V29yZCwgYXJndW1lbnRzKTsKCSAgICB9CgoJICAgIC8vIENvbnN0YW50cwoJICAgIHZhciBLID0gWwoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDQyOGEyZjk4LCAweGQ3MjhhZTIyKSwgWDY0V29yZF9jcmVhdGUoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYpLCBYNjRXb3JkX2NyZWF0ZSgweGU5YjVkYmE1LCAweDgxODlkYmJjKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCksIFg2NFdvcmRfY3JlYXRlKDB4NTlmMTExZjEsIDB4YjYwNWQwMTkpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDkyM2Y4MmE0LCAweGFmMTk0ZjliKSwgWDY0V29yZF9jcmVhdGUoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIpLCBYNjRXb3JkX2NyZWF0ZSgweDEyODM1YjAxLCAweDQ1NzA2ZmJlKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgyNDMxODViZSwgMHg0ZWU0YjI4YyksIFg2NFdvcmRfY3JlYXRlKDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDcyYmU1ZDc0LCAweGYyN2I4OTZmKSwgWDY0V29yZF9jcmVhdGUoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUpLCBYNjRXb3JkX2NyZWF0ZSgweGMxOWJmMTc0LCAweGNmNjkyNjk0KSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhlNDliNjljMSwgMHg5ZWYxNGFkMiksIFg2NFdvcmRfY3JlYXRlKDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDBmYzE5ZGM2LCAweDhiOGNkNWI1KSwgWDY0V29yZF9jcmVhdGUoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUpLCBYNjRXb3JkX2NyZWF0ZSgweDRhNzQ4NGFhLCAweDZlYTZlNDgzKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCksIFg2NFdvcmRfY3JlYXRlKDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDk4M2U1MTUyLCAweGVlNjZkZmFiKSwgWDY0V29yZF9jcmVhdGUoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4YjAwMzI3YzgsIDB4OThmYjIxM2YpLCBYNjRXb3JkX2NyZWF0ZSgweGJmNTk3ZmM3LCAweGJlZWYwZWU0KSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhjNmUwMGJmMywgMHgzZGE4OGZjMiksIFg2NFdvcmRfY3JlYXRlKDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDA2Y2E2MzUxLCAweGUwMDM4MjZmKSwgWDY0V29yZF9jcmVhdGUoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4MjdiNzBhODUsIDB4NDZkMjJmZmMpLCBYNjRXb3JkX2NyZWF0ZSgweDJlMWIyMTM4LCAweDVjMjZjOTI2KSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCksIFg2NFdvcmRfY3JlYXRlKDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDY1MGE3MzU0LCAweDhiYWY2M2RlKSwgWDY0V29yZF9jcmVhdGUoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYpLCBYNjRXb3JkX2NyZWF0ZSgweDkyNzIyYzg1LCAweDE0ODIzNTNiKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCksIFg2NFdvcmRfY3JlYXRlKDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweGMyNGI4YjcwLCAweGQwZjg5NzkxKSwgWDY0V29yZF9jcmVhdGUoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgpLCBYNjRXb3JkX2NyZWF0ZSgweGQ2OTkwNjI0LCAweDU1NjVhOTEwKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSksIFg2NFdvcmRfY3JlYXRlKDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDE5YTRjMTE2LCAweGI4ZDJkMGM4KSwgWDY0V29yZF9jcmVhdGUoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTkpLCBYNjRXb3JkX2NyZWF0ZSgweDM0YjBiY2I1LCAweGUxOWI0OGE4KSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgzOTFjMGNiMywgMHhjNWM5NWE2MyksIFg2NFdvcmRfY3JlYXRlKDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDViOWNjYTRmLCAweDc3NjNlMzczKSwgWDY0V29yZF9jcmVhdGUoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMpLCBYNjRXb3JkX2NyZWF0ZSgweDc4YTU2MzZmLCAweDQzMTcyZjYwKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiksIFg2NFdvcmRfY3JlYXRlKDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDkwYmVmZmZhLCAweDIzNjMxZTI4KSwgWDY0V29yZF9jcmVhdGUoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUpLCBYNjRXb3JkX2NyZWF0ZSgweGM2NzE3OGYyLCAweGUzNzI1MzJiKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhjYTI3M2VjZSwgMHhlYTI2NjE5YyksIFg2NFdvcmRfY3JlYXRlKDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweGVhZGE3ZGQ2LCAweGNkZTBlYjFlKSwgWDY0V29yZF9jcmVhdGUoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEpLCBYNjRXb3JkX2NyZWF0ZSgweDBhNjM3ZGM1LCAweGEyYzg5OGE2KSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSksIFg2NFdvcmRfY3JlYXRlKDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0KSwgWDY0V29yZF9jcmVhdGUoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksCgkgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMpLCBYNjRXb3JkX2NyZWF0ZSgweDQzMWQ2N2M0LCAweDljMTAwZDRjKSwKCSAgICAgICAgWDY0V29yZF9jcmVhdGUoMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiksIFg2NFdvcmRfY3JlYXRlKDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEpLAoJICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDVmY2I2ZmFiLCAweDNhZDZmYWVjKSwgWDY0V29yZF9jcmVhdGUoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNykKCSAgICBdOwoKCSAgICAvLyBSZXVzYWJsZSBvYmplY3RzCgkgICAgdmFyIFcgPSBbXTsKCSAgICAoZnVuY3Rpb24gKCkgewoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpKyspIHsKCSAgICAgICAgICAgIFdbaV0gPSBYNjRXb3JkX2NyZWF0ZSgpOwoJICAgICAgICB9CgkgICAgfSgpKTsKCgkgICAgLyoqCgkgICAgICogU0hBLTUxMiBoYXNoIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgU0hBNTEyID0gQ19hbGdvLlNIQTUxMiA9IEhhc2hlci5leHRlbmQoewoJICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBYNjRXb3JkQXJyYXkuaW5pdChbCgkgICAgICAgICAgICAgICAgbmV3IFg2NFdvcmQuaW5pdCgweDZhMDllNjY3LCAweGYzYmNjOTA4KSwgbmV3IFg2NFdvcmQuaW5pdCgweGJiNjdhZTg1LCAweDg0Y2FhNzNiKSwKCSAgICAgICAgICAgICAgICBuZXcgWDY0V29yZC5pbml0KDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIpLCBuZXcgWDY0V29yZC5pbml0KDB4YTU0ZmY1M2EsIDB4NWYxZDM2ZjEpLAoJICAgICAgICAgICAgICAgIG5ldyBYNjRXb3JkLmluaXQoMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSksIG5ldyBYNjRXb3JkLmluaXQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZiksCgkgICAgICAgICAgICAgICAgbmV3IFg2NFdvcmQuaW5pdCgweDFmODNkOWFiLCAweGZiNDFiZDZiKSwgbmV3IFg2NFdvcmQuaW5pdCgweDViZTBjZDE5LCAweDEzN2UyMTc5KQoJICAgICAgICAgICAgXSk7CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzOwoKCSAgICAgICAgICAgIHZhciBIMCA9IEhbMF07CgkgICAgICAgICAgICB2YXIgSDEgPSBIWzFdOwoJICAgICAgICAgICAgdmFyIEgyID0gSFsyXTsKCSAgICAgICAgICAgIHZhciBIMyA9IEhbM107CgkgICAgICAgICAgICB2YXIgSDQgPSBIWzRdOwoJICAgICAgICAgICAgdmFyIEg1ID0gSFs1XTsKCSAgICAgICAgICAgIHZhciBINiA9IEhbNl07CgkgICAgICAgICAgICB2YXIgSDcgPSBIWzddOwoKCSAgICAgICAgICAgIHZhciBIMGggPSBIMC5oaWdoOwoJICAgICAgICAgICAgdmFyIEgwbCA9IEgwLmxvdzsKCSAgICAgICAgICAgIHZhciBIMWggPSBIMS5oaWdoOwoJICAgICAgICAgICAgdmFyIEgxbCA9IEgxLmxvdzsKCSAgICAgICAgICAgIHZhciBIMmggPSBIMi5oaWdoOwoJICAgICAgICAgICAgdmFyIEgybCA9IEgyLmxvdzsKCSAgICAgICAgICAgIHZhciBIM2ggPSBIMy5oaWdoOwoJICAgICAgICAgICAgdmFyIEgzbCA9IEgzLmxvdzsKCSAgICAgICAgICAgIHZhciBINGggPSBINC5oaWdoOwoJICAgICAgICAgICAgdmFyIEg0bCA9IEg0LmxvdzsKCSAgICAgICAgICAgIHZhciBINWggPSBINS5oaWdoOwoJICAgICAgICAgICAgdmFyIEg1bCA9IEg1LmxvdzsKCSAgICAgICAgICAgIHZhciBINmggPSBINi5oaWdoOwoJICAgICAgICAgICAgdmFyIEg2bCA9IEg2LmxvdzsKCSAgICAgICAgICAgIHZhciBIN2ggPSBINy5oaWdoOwoJICAgICAgICAgICAgdmFyIEg3bCA9IEg3LmxvdzsKCgkgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlcwoJICAgICAgICAgICAgdmFyIGFoID0gSDBoOwoJICAgICAgICAgICAgdmFyIGFsID0gSDBsOwoJICAgICAgICAgICAgdmFyIGJoID0gSDFoOwoJICAgICAgICAgICAgdmFyIGJsID0gSDFsOwoJICAgICAgICAgICAgdmFyIGNoID0gSDJoOwoJICAgICAgICAgICAgdmFyIGNsID0gSDJsOwoJICAgICAgICAgICAgdmFyIGRoID0gSDNoOwoJICAgICAgICAgICAgdmFyIGRsID0gSDNsOwoJICAgICAgICAgICAgdmFyIGVoID0gSDRoOwoJICAgICAgICAgICAgdmFyIGVsID0gSDRsOwoJICAgICAgICAgICAgdmFyIGZoID0gSDVoOwoJICAgICAgICAgICAgdmFyIGZsID0gSDVsOwoJICAgICAgICAgICAgdmFyIGdoID0gSDZoOwoJICAgICAgICAgICAgdmFyIGdsID0gSDZsOwoJICAgICAgICAgICAgdmFyIGhoID0gSDdoOwoJICAgICAgICAgICAgdmFyIGhsID0gSDdsOwoKCSAgICAgICAgICAgIC8vIFJvdW5kcwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIFdpbDsKCSAgICAgICAgICAgICAgICB2YXIgV2loOwoKCSAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dAoJICAgICAgICAgICAgICAgIHZhciBXaSA9IFdbaV07CgoJICAgICAgICAgICAgICAgIC8vIEV4dGVuZCBtZXNzYWdlCgkgICAgICAgICAgICAgICAgaWYgKGkgPCAxNikgewoJICAgICAgICAgICAgICAgICAgICBXaWggPSBXaS5oaWdoID0gTVtvZmZzZXQgKyBpICogMl0gICAgIHwgMDsKCSAgICAgICAgICAgICAgICAgICAgV2lsID0gV2kubG93ICA9IE1bb2Zmc2V0ICsgaSAqIDIgKyAxXSB8IDA7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gR2FtbWEwCgkgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTB4ICA9IFdbaSAtIDE1XTsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMHhoID0gZ2FtbWEweC5oaWdoOwoJICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEweGwgPSBnYW1tYTB4LmxvdzsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMGggID0gKChnYW1tYTB4aCA+Pj4gMSkgfCAoZ2FtbWEweGwgPDwgMzEpKSBeICgoZ2FtbWEweGggPj4+IDgpIHwgKGdhbW1hMHhsIDw8IDI0KSkgXiAoZ2FtbWEweGggPj4+IDcpOwoJICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEwbCAgPSAoKGdhbW1hMHhsID4+PiAxKSB8IChnYW1tYTB4aCA8PCAzMSkpIF4gKChnYW1tYTB4bCA+Pj4gOCkgfCAoZ2FtbWEweGggPDwgMjQpKSBeICgoZ2FtbWEweGwgPj4+IDcpIHwgKGdhbW1hMHhoIDw8IDI1KSk7CgoJICAgICAgICAgICAgICAgICAgICAvLyBHYW1tYTEKCSAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMXggID0gV1tpIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTF4aCA9IGdhbW1hMXguaGlnaDsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMXhsID0gZ2FtbWExeC5sb3c7CgkgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTFoICA9ICgoZ2FtbWExeGggPj4+IDE5KSB8IChnYW1tYTF4bCA8PCAxMykpIF4gKChnYW1tYTF4aCA8PCAzKSB8IChnYW1tYTF4bCA+Pj4gMjkpKSBeIChnYW1tYTF4aCA+Pj4gNik7CgkgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTFsICA9ICgoZ2FtbWExeGwgPj4+IDE5KSB8IChnYW1tYTF4aCA8PCAxMykpIF4gKChnYW1tYTF4bCA8PCAzKSB8IChnYW1tYTF4aCA+Pj4gMjkpKSBeICgoZ2FtbWExeGwgPj4+IDYpIHwgKGdhbW1hMXhoIDw8IDI2KSk7CgoJICAgICAgICAgICAgICAgICAgICAvLyBXW2ldID0gZ2FtbWEwICsgV1tpIC0gN10gKyBnYW1tYTEgKyBXW2kgLSAxNl0KCSAgICAgICAgICAgICAgICAgICAgdmFyIFdpNyAgPSBXW2kgLSA3XTsKCSAgICAgICAgICAgICAgICAgICAgdmFyIFdpN2ggPSBXaTcuaGlnaDsKCSAgICAgICAgICAgICAgICAgICAgdmFyIFdpN2wgPSBXaTcubG93OwoKCSAgICAgICAgICAgICAgICAgICAgdmFyIFdpMTYgID0gV1tpIC0gMTZdOwoJICAgICAgICAgICAgICAgICAgICB2YXIgV2kxNmggPSBXaTE2LmhpZ2g7CgkgICAgICAgICAgICAgICAgICAgIHZhciBXaTE2bCA9IFdpMTYubG93OwoKCSAgICAgICAgICAgICAgICAgICAgV2lsID0gZ2FtbWEwbCArIFdpN2w7CgkgICAgICAgICAgICAgICAgICAgIFdpaCA9IGdhbW1hMGggKyBXaTdoICsgKChXaWwgPj4+IDApIDwgKGdhbW1hMGwgPj4+IDApID8gMSA6IDApOwoJICAgICAgICAgICAgICAgICAgICBXaWwgPSBXaWwgKyBnYW1tYTFsOwoJICAgICAgICAgICAgICAgICAgICBXaWggPSBXaWggKyBnYW1tYTFoICsgKChXaWwgPj4+IDApIDwgKGdhbW1hMWwgPj4+IDApID8gMSA6IDApOwoJICAgICAgICAgICAgICAgICAgICBXaWwgPSBXaWwgKyBXaTE2bDsKCSAgICAgICAgICAgICAgICAgICAgV2loID0gV2loICsgV2kxNmggKyAoKFdpbCA+Pj4gMCkgPCAoV2kxNmwgPj4+IDApID8gMSA6IDApOwoKCSAgICAgICAgICAgICAgICAgICAgV2kuaGlnaCA9IFdpaDsKCSAgICAgICAgICAgICAgICAgICAgV2kubG93ICA9IFdpbDsKCSAgICAgICAgICAgICAgICB9CgoJICAgICAgICAgICAgICAgIHZhciBjaGggID0gKGVoICYgZmgpIF4gKH5laCAmIGdoKTsKCSAgICAgICAgICAgICAgICB2YXIgY2hsICA9IChlbCAmIGZsKSBeICh+ZWwgJiBnbCk7CgkgICAgICAgICAgICAgICAgdmFyIG1hamggPSAoYWggJiBiaCkgXiAoYWggJiBjaCkgXiAoYmggJiBjaCk7CgkgICAgICAgICAgICAgICAgdmFyIG1hamwgPSAoYWwgJiBibCkgXiAoYWwgJiBjbCkgXiAoYmwgJiBjbCk7CgoJICAgICAgICAgICAgICAgIHZhciBzaWdtYTBoID0gKChhaCA+Pj4gMjgpIHwgKGFsIDw8IDQpKSAgXiAoKGFoIDw8IDMwKSAgfCAoYWwgPj4+IDIpKSBeICgoYWggPDwgMjUpIHwgKGFsID4+PiA3KSk7CgkgICAgICAgICAgICAgICAgdmFyIHNpZ21hMGwgPSAoKGFsID4+PiAyOCkgfCAoYWggPDwgNCkpICBeICgoYWwgPDwgMzApICB8IChhaCA+Pj4gMikpIF4gKChhbCA8PCAyNSkgfCAoYWggPj4+IDcpKTsKCSAgICAgICAgICAgICAgICB2YXIgc2lnbWExaCA9ICgoZWggPj4+IDE0KSB8IChlbCA8PCAxOCkpIF4gKChlaCA+Pj4gMTgpIHwgKGVsIDw8IDE0KSkgXiAoKGVoIDw8IDIzKSB8IChlbCA+Pj4gOSkpOwoJICAgICAgICAgICAgICAgIHZhciBzaWdtYTFsID0gKChlbCA+Pj4gMTQpIHwgKGVoIDw8IDE4KSkgXiAoKGVsID4+PiAxOCkgfCAoZWggPDwgMTQpKSBeICgoZWwgPDwgMjMpIHwgKGVoID4+PiA5KSk7CgoJICAgICAgICAgICAgICAgIC8vIHQxID0gaCArIHNpZ21hMSArIGNoICsgS1tpXSArIFdbaV0KCSAgICAgICAgICAgICAgICB2YXIgS2kgID0gS1tpXTsKCSAgICAgICAgICAgICAgICB2YXIgS2loID0gS2kuaGlnaDsKCSAgICAgICAgICAgICAgICB2YXIgS2lsID0gS2kubG93OwoKCSAgICAgICAgICAgICAgICB2YXIgdDFsID0gaGwgKyBzaWdtYTFsOwoJICAgICAgICAgICAgICAgIHZhciB0MWggPSBoaCArIHNpZ21hMWggKyAoKHQxbCA+Pj4gMCkgPCAoaGwgPj4+IDApID8gMSA6IDApOwoJICAgICAgICAgICAgICAgIHZhciB0MWwgPSB0MWwgKyBjaGw7CgkgICAgICAgICAgICAgICAgdmFyIHQxaCA9IHQxaCArIGNoaCArICgodDFsID4+PiAwKSA8IChjaGwgPj4+IDApID8gMSA6IDApOwoJICAgICAgICAgICAgICAgIHZhciB0MWwgPSB0MWwgKyBLaWw7CgkgICAgICAgICAgICAgICAgdmFyIHQxaCA9IHQxaCArIEtpaCArICgodDFsID4+PiAwKSA8IChLaWwgPj4+IDApID8gMSA6IDApOwoJICAgICAgICAgICAgICAgIHZhciB0MWwgPSB0MWwgKyBXaWw7CgkgICAgICAgICAgICAgICAgdmFyIHQxaCA9IHQxaCArIFdpaCArICgodDFsID4+PiAwKSA8IChXaWwgPj4+IDApID8gMSA6IDApOwoKCSAgICAgICAgICAgICAgICAvLyB0MiA9IHNpZ21hMCArIG1hagoJICAgICAgICAgICAgICAgIHZhciB0MmwgPSBzaWdtYTBsICsgbWFqbDsKCSAgICAgICAgICAgICAgICB2YXIgdDJoID0gc2lnbWEwaCArIG1hamggKyAoKHQybCA+Pj4gMCkgPCAoc2lnbWEwbCA+Pj4gMCkgPyAxIDogMCk7CgoJICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB3b3JraW5nIHZhcmlhYmxlcwoJICAgICAgICAgICAgICAgIGhoID0gZ2g7CgkgICAgICAgICAgICAgICAgaGwgPSBnbDsKCSAgICAgICAgICAgICAgICBnaCA9IGZoOwoJICAgICAgICAgICAgICAgIGdsID0gZmw7CgkgICAgICAgICAgICAgICAgZmggPSBlaDsKCSAgICAgICAgICAgICAgICBmbCA9IGVsOwoJICAgICAgICAgICAgICAgIGVsID0gKGRsICsgdDFsKSB8IDA7CgkgICAgICAgICAgICAgICAgZWggPSAoZGggKyB0MWggKyAoKGVsID4+PiAwKSA8IChkbCA+Pj4gMCkgPyAxIDogMCkpIHwgMDsKCSAgICAgICAgICAgICAgICBkaCA9IGNoOwoJICAgICAgICAgICAgICAgIGRsID0gY2w7CgkgICAgICAgICAgICAgICAgY2ggPSBiaDsKCSAgICAgICAgICAgICAgICBjbCA9IGJsOwoJICAgICAgICAgICAgICAgIGJoID0gYWg7CgkgICAgICAgICAgICAgICAgYmwgPSBhbDsKCSAgICAgICAgICAgICAgICBhbCA9ICh0MWwgKyB0MmwpIHwgMDsKCSAgICAgICAgICAgICAgICBhaCA9ICh0MWggKyB0MmggKyAoKGFsID4+PiAwKSA8ICh0MWwgPj4+IDApID8gMSA6IDApKSB8IDA7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUKCSAgICAgICAgICAgIEgwbCA9IEgwLmxvdyAgPSAoSDBsICsgYWwpOwoJICAgICAgICAgICAgSDAuaGlnaCA9IChIMGggKyBhaCArICgoSDBsID4+PiAwKSA8IChhbCA+Pj4gMCkgPyAxIDogMCkpOwoJICAgICAgICAgICAgSDFsID0gSDEubG93ICA9IChIMWwgKyBibCk7CgkgICAgICAgICAgICBIMS5oaWdoID0gKEgxaCArIGJoICsgKChIMWwgPj4+IDApIDwgKGJsID4+PiAwKSA/IDEgOiAwKSk7CgkgICAgICAgICAgICBIMmwgPSBIMi5sb3cgID0gKEgybCArIGNsKTsKCSAgICAgICAgICAgIEgyLmhpZ2ggPSAoSDJoICsgY2ggKyAoKEgybCA+Pj4gMCkgPCAoY2wgPj4+IDApID8gMSA6IDApKTsKCSAgICAgICAgICAgIEgzbCA9IEgzLmxvdyAgPSAoSDNsICsgZGwpOwoJICAgICAgICAgICAgSDMuaGlnaCA9IChIM2ggKyBkaCArICgoSDNsID4+PiAwKSA8IChkbCA+Pj4gMCkgPyAxIDogMCkpOwoJICAgICAgICAgICAgSDRsID0gSDQubG93ICA9IChINGwgKyBlbCk7CgkgICAgICAgICAgICBINC5oaWdoID0gKEg0aCArIGVoICsgKChINGwgPj4+IDApIDwgKGVsID4+PiAwKSA/IDEgOiAwKSk7CgkgICAgICAgICAgICBINWwgPSBINS5sb3cgID0gKEg1bCArIGZsKTsKCSAgICAgICAgICAgIEg1LmhpZ2ggPSAoSDVoICsgZmggKyAoKEg1bCA+Pj4gMCkgPCAoZmwgPj4+IDApID8gMSA6IDApKTsKCSAgICAgICAgICAgIEg2bCA9IEg2LmxvdyAgPSAoSDZsICsgZ2wpOwoJICAgICAgICAgICAgSDYuaGlnaCA9IChINmggKyBnaCArICgoSDZsID4+PiAwKSA8IChnbCA+Pj4gMCkgPyAxIDogMCkpOwoJICAgICAgICAgICAgSDdsID0gSDcubG93ICA9IChIN2wgKyBobCk7CgkgICAgICAgICAgICBINy5oaWdoID0gKEg3aCArIGhoICsgKChIN2wgPj4+IDApIDwgKGhsID4+PiAwKSA/IDEgOiAwKSk7CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7CgkgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkczsKCgkgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4OwoJICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4OwoKCSAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nCgkgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTsKCSAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyAxMjgpID4+PiAxMCkgPDwgNSkgKyAzMF0gPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7CgkgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgMTI4KSA+Pj4gMTApIDw8IDUpICsgMzFdID0gbkJpdHNUb3RhbDsKCSAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDsKCgkgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2NrcwoJICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQgaGFzaCB0byAzMi1iaXQgd29yZCBhcnJheSBiZWZvcmUgcmV0dXJuaW5nCgkgICAgICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2hhc2gudG9YMzIoKTsKCgkgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaAoJICAgICAgICAgICAgcmV0dXJuIGhhc2g7CgkgICAgICAgIH0sCgoJICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7CgkgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTsKCgkgICAgICAgICAgICByZXR1cm4gY2xvbmU7CgkgICAgICAgIH0sCgoJICAgICAgICBibG9ja1NpemU6IDEwMjQvMzIKCSAgICB9KTsKCgkgICAgLyoqCgkgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICoKCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4KCSAgICAgKgoJICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guCgkgICAgICoKCSAgICAgKiBAc3RhdGljCgkgICAgICoKCSAgICAgKiBAZXhhbXBsZQoJICAgICAqCgkgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBNTEyKCdtZXNzYWdlJyk7CgkgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBNTEyKHdvcmRBcnJheSk7CgkgICAgICovCgkgICAgQy5TSEE1MTIgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEE1MTIpOwoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICoKCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4KCSAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS4KCSAgICAgKgoJICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuCgkgICAgICoKCSAgICAgKiBAc3RhdGljCgkgICAgICoKCSAgICAgKiBAZXhhbXBsZQoJICAgICAqCgkgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTUxMihtZXNzYWdlLCBrZXkpOwoJICAgICAqLwoJICAgIEMuSG1hY1NIQTUxMiA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihTSEE1MTIpOwoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX3g2NCA9IEMueDY0OwoJICAgIHZhciBYNjRXb3JkID0gQ194NjQuV29yZDsKCSAgICB2YXIgWDY0V29yZEFycmF5ID0gQ194NjQuV29yZEFycmF5OwoJICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgkgICAgdmFyIFNIQTUxMiA9IENfYWxnby5TSEE1MTI7CgoJICAgIC8qKgoJICAgICAqIFNIQS0zODQgaGFzaCBhbGdvcml0aG0uCgkgICAgICovCgkgICAgdmFyIFNIQTM4NCA9IENfYWxnby5TSEEzODQgPSBTSEE1MTIuZXh0ZW5kKHsKCSAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgWDY0V29yZEFycmF5LmluaXQoWwoJICAgICAgICAgICAgICAgIG5ldyBYNjRXb3JkLmluaXQoMHhjYmJiOWQ1ZCwgMHhjMTA1OWVkOCksIG5ldyBYNjRXb3JkLmluaXQoMHg2MjlhMjkyYSwgMHgzNjdjZDUwNyksCgkgICAgICAgICAgICAgICAgbmV3IFg2NFdvcmQuaW5pdCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KSwgbmV3IFg2NFdvcmQuaW5pdCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KSwKCSAgICAgICAgICAgICAgICBuZXcgWDY0V29yZC5pbml0KDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEpLCBuZXcgWDY0V29yZC5pbml0KDB4OGViNDRhODcsIDB4Njg1ODE1MTEpLAoJICAgICAgICAgICAgICAgIG5ldyBYNjRXb3JkLmluaXQoMHhkYjBjMmUwZCwgMHg2NGY5OGZhNyksIG5ldyBYNjRXb3JkLmluaXQoMHg0N2I1NDgxZCwgMHhiZWZhNGZhNCkKCSAgICAgICAgICAgIF0pOwoJICAgICAgICB9LAoKCSAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIHZhciBoYXNoID0gU0hBNTEyLl9kb0ZpbmFsaXplLmNhbGwodGhpcyk7CgoJICAgICAgICAgICAgaGFzaC5zaWdCeXRlcyAtPSAxNjsKCgkgICAgICAgICAgICByZXR1cm4gaGFzaDsKCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEzODQoJ21lc3NhZ2UnKTsKCSAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEzODQod29yZEFycmF5KTsKCSAgICAgKi8KCSAgICBDLlNIQTM4NCA9IFNIQTUxMi5fY3JlYXRlSGVscGVyKFNIQTM4NCk7CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLgoJICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LgoJICAgICAqCgkgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy4KCSAgICAgKgoJICAgICAqIEBzdGF0aWMKCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMzg0KG1lc3NhZ2UsIGtleSk7CgkgICAgICovCgkgICAgQy5IbWFjU0hBMzg0ID0gU0hBNTEyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTM4NCk7Cgl9KCkpOwoKCgkvKioKCSAqIENpcGhlciBjb3JlIGNvbXBvbmVudHMuCgkgKi8KCUNyeXB0b0pTLmxpYi5DaXBoZXIgfHwgKGZ1bmN0aW9uICh1bmRlZmluZWQpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTsKCSAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwoJICAgIHZhciBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQ19saWIuQnVmZmVyZWRCbG9ja0FsZ29yaXRobTsKCSAgICB2YXIgQ19lbmMgPSBDLmVuYzsKCSAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7CgkgICAgdmFyIEJhc2U2NCA9IENfZW5jLkJhc2U2NDsKCSAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoJICAgIHZhciBFdnBLREYgPSBDX2FsZ28uRXZwS0RGOwoKCSAgICAvKioKCSAgICAgKiBBYnN0cmFjdCBiYXNlIGNpcGhlciB0ZW1wbGF0ZS4KCSAgICAgKgoJICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZXlTaXplIFRoaXMgY2lwaGVyJ3Mga2V5IHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKQoJICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdlNpemUgVGhpcyBjaXBoZXIncyBJViBzaXplLiBEZWZhdWx0OiA0ICgxMjggYml0cykKCSAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0VOQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGVuY3J5cHRpb24gbW9kZS4KCSAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0RFQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGRlY3J5cHRpb24gbW9kZS4KCSAgICAgKi8KCSAgICB2YXIgQ2lwaGVyID0gQ19saWIuQ2lwaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gaXYgVGhlIElWIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uCgkgICAgICAgICAqLwoJICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKCksCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ3JlYXRlcyB0aGlzIGNpcGhlciBpbiBlbmNyeXB0aW9uIG1vZGUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS4KCSAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHN0YXRpYwoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZUVuY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pOwoJICAgICAgICAgKi8KCSAgICAgICAgY3JlYXRlRW5jcnlwdG9yOiBmdW5jdGlvbiAoa2V5LCBjZmcpIHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSwga2V5LCBjZmcpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENyZWF0ZXMgdGhpcyBjaXBoZXIgaW4gZGVjcnlwdGlvbiBtb2RlLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuCgkgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVEZWNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTsKCSAgICAgICAgICovCgkgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7CgkgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsIGtleSwgY2ZnKTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgY2lwaGVyLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0geGZvcm1Nb2RlIEVpdGhlciB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHRyYW5zb3JtYXRpb24gbW9kZSBjb25zdGFudC4KCSAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LgoJICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZShDcnlwdG9KUy5hbGdvLkFFUy5fRU5DX1hGT1JNX01PREUsIGtleVdvcmRBcnJheSwgeyBpdjogaXZXb3JkQXJyYXkgfSk7CgkgICAgICAgICAqLwoJICAgICAgICBpbml0OiBmdW5jdGlvbiAoeGZvcm1Nb2RlLCBrZXksIGNmZykgewoJICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzCgkgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpOwoKCSAgICAgICAgICAgIC8vIFN0b3JlIHRyYW5zZm9ybSBtb2RlIGFuZCBrZXkKCSAgICAgICAgICAgIHRoaXMuX3hmb3JtTW9kZSA9IHhmb3JtTW9kZTsKCSAgICAgICAgICAgIHRoaXMuX2tleSA9IGtleTsKCgkgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXMKCSAgICAgICAgICAgIHRoaXMucmVzZXQoKTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBSZXNldHMgdGhpcyBjaXBoZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICBjaXBoZXIucmVzZXQoKTsKCSAgICAgICAgICovCgkgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlcgoJICAgICAgICAgICAgQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldC5jYWxsKHRoaXMpOwoKCSAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljCgkgICAgICAgICAgICB0aGlzLl9kb1Jlc2V0KCk7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQWRkcyBkYXRhIHRvIGJlIGVuY3J5cHRlZCBvciBkZWNyeXB0ZWQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YVVwZGF0ZSBUaGUgZGF0YSB0byBlbmNyeXB0IG9yIGRlY3J5cHQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgcHJvY2Vzc2luZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIucHJvY2VzcygnZGF0YScpOwoJICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5wcm9jZXNzKHdvcmRBcnJheSk7CgkgICAgICAgICAqLwoJICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkgewoJICAgICAgICAgICAgLy8gQXBwZW5kCgkgICAgICAgICAgICB0aGlzLl9hcHBlbmQoZGF0YVVwZGF0ZSk7CgoJICAgICAgICAgICAgLy8gUHJvY2VzcyBhdmFpbGFibGUgYmxvY2tzCgkgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2VzcygpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIEZpbmFsaXplcyB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHByb2Nlc3MuCgkgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YVVwZGF0ZSBUaGUgZmluYWwgZGF0YSB0byBlbmNyeXB0IG9yIGRlY3J5cHQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgZmluYWwgcHJvY2Vzc2luZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUoKTsKCSAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUoJ2RhdGEnKTsKCSAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUod29yZEFycmF5KTsKCSAgICAgICAgICovCgkgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkgewoJICAgICAgICAgICAgLy8gRmluYWwgZGF0YSB1cGRhdGUKCSAgICAgICAgICAgIGlmIChkYXRhVXBkYXRlKSB7CgkgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kKGRhdGFVcGRhdGUpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljCgkgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWREYXRhID0gdGhpcy5fZG9GaW5hbGl6ZSgpOwoKCSAgICAgICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZERhdGE7CgkgICAgICAgIH0sCgoJICAgICAgICBrZXlTaXplOiAxMjgvMzIsCgoJICAgICAgICBpdlNpemU6IDEyOC8zMiwKCgkgICAgICAgIF9FTkNfWEZPUk1fTU9ERTogMSwKCgkgICAgICAgIF9ERUNfWEZPUk1fTU9ERTogMiwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDcmVhdGVzIHNob3J0Y3V0IGZ1bmN0aW9ucyB0byBhIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciB0byBjcmVhdGUgYSBoZWxwZXIgZm9yLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIGVuY3J5cHQgYW5kIGRlY3J5cHQgc2hvcnRjdXQgZnVuY3Rpb25zLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgQUVTID0gQ3J5cHRvSlMubGliLkNpcGhlci5fY3JlYXRlSGVscGVyKENyeXB0b0pTLmFsZ28uQUVTKTsKCSAgICAgICAgICovCgkgICAgICAgIF9jcmVhdGVIZWxwZXI6IChmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICBmdW5jdGlvbiBzZWxlY3RDaXBoZXJTdHJhdGVneShrZXkpIHsKCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFzc3dvcmRCYXNlZENpcGhlcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXphYmxlQ2lwaGVyOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNpcGhlcikgewoJICAgICAgICAgICAgICAgIHJldHVybiB7CgkgICAgICAgICAgICAgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uIChtZXNzYWdlLCBrZXksIGNmZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkuZW5jcnlwdChjaXBoZXIsIG1lc3NhZ2UsIGtleSwgY2ZnKTsKCSAgICAgICAgICAgICAgICAgICAgfSwKCgkgICAgICAgICAgICAgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXJ0ZXh0LCBrZXksIGNmZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkuZGVjcnlwdChjaXBoZXIsIGNpcGhlcnRleHQsIGtleSwgY2ZnKTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH07CgkgICAgICAgICAgICB9OwoJICAgICAgICB9KCkpCgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIEFic3RyYWN0IGJhc2Ugc3RyZWFtIGNpcGhlciB0ZW1wbGF0ZS4KCSAgICAgKgoJICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBjaXBoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDEgKDMyIGJpdHMpCgkgICAgICovCgkgICAgdmFyIFN0cmVhbUNpcGhlciA9IENfbGliLlN0cmVhbUNpcGhlciA9IENpcGhlci5leHRlbmQoewoJICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgLy8gUHJvY2VzcyBwYXJ0aWFsIGJsb2NrcwoJICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpOwoKCSAgICAgICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZEJsb2NrczsKCSAgICAgICAgfSwKCgkgICAgICAgIGJsb2NrU2l6ZTogMQoJICAgIH0pOwoKCSAgICAvKioKCSAgICAgKiBNb2RlIG5hbWVzcGFjZS4KCSAgICAgKi8KCSAgICB2YXIgQ19tb2RlID0gQy5tb2RlID0ge307CgoJICAgIC8qKgoJICAgICAqIEFic3RyYWN0IGJhc2UgYmxvY2sgY2lwaGVyIG1vZGUgdGVtcGxhdGUuCgkgICAgICovCgkgICAgdmFyIEJsb2NrQ2lwaGVyTW9kZSA9IENfbGliLkJsb2NrQ2lwaGVyTW9kZSA9IEJhc2UuZXh0ZW5kKHsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENyZWF0ZXMgdGhpcyBtb2RlIGZvciBlbmNyeXB0aW9uLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLgoJICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuY3JlYXRlRW5jcnlwdG9yKGNpcGhlciwgaXYud29yZHMpOwoJICAgICAgICAgKi8KCSAgICAgICAgY3JlYXRlRW5jcnlwdG9yOiBmdW5jdGlvbiAoY2lwaGVyLCBpdikgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDcmVhdGVzIHRoaXMgbW9kZSBmb3IgZGVjcnlwdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS4KCSAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLmNyZWF0ZURlY3J5cHRvcihjaXBoZXIsIGl2LndvcmRzKTsKCSAgICAgICAgICovCgkgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzLkRlY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdik7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG1vZGUuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuCgkgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2LndvcmRzKTsKCSAgICAgICAgICovCgkgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7CgkgICAgICAgICAgICB0aGlzLl9jaXBoZXIgPSBjaXBoZXI7CgkgICAgICAgICAgICB0aGlzLl9pdiA9IGl2OwoJICAgICAgICB9CgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlLgoJICAgICAqLwoJICAgIHZhciBDQkMgPSBDX21vZGUuQ0JDID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIEFic3RyYWN0IGJhc2UgQ0JDIG1vZGUuCgkgICAgICAgICAqLwoJICAgICAgICB2YXIgQ0JDID0gQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpOwoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENCQyBlbmNyeXB0b3IuCgkgICAgICAgICAqLwoJICAgICAgICBDQkMuRW5jcnlwdG9yID0gQ0JDLmV4dGVuZCh7CgkgICAgICAgICAgICAvKioKCSAgICAgICAgICAgICAqIFByb2Nlc3NlcyB0aGUgZGF0YSBibG9jayBhdCBvZmZzZXQuCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgVGhlIGRhdGEgd29yZHMgdG8gb3BlcmF0ZSBvbi4KCSAgICAgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCB3aGVyZSB0aGUgYmxvY2sgc3RhcnRzLgoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAgICAgKgoJICAgICAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7CgkgICAgICAgICAgICAgKi8KCSAgICAgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHsKCSAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyOwoJICAgICAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplOwoKCSAgICAgICAgICAgICAgICAvLyBYT1IgYW5kIGVuY3J5cHQKCSAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7CgkgICAgICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTsKCgkgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrCgkgICAgICAgICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gd29yZHMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBibG9ja1NpemUpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9KTsKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDQkMgZGVjcnlwdG9yLgoJICAgICAgICAgKi8KCSAgICAgICAgQ0JDLkRlY3J5cHRvciA9IENCQy5leHRlbmQoewoJICAgICAgICAgICAgLyoqCgkgICAgICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0LgoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIFRoZSBkYXRhIHdvcmRzIHRvIG9wZXJhdGUgb24uCgkgICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy4KCSAgICAgICAgICAgICAqCgkgICAgICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgICAgICoKCSAgICAgICAgICAgICAqICAgICBtb2RlLnByb2Nlc3NCbG9jayhkYXRhLndvcmRzLCBvZmZzZXQpOwoJICAgICAgICAgICAgICovCgkgICAgICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7CgkgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjsKCSAgICAgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTsKCgkgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrCgkgICAgICAgICAgICAgICAgdmFyIHRoaXNCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTsKCgkgICAgICAgICAgICAgICAgLy8gRGVjcnlwdCBhbmQgWE9SCgkgICAgICAgICAgICAgICAgY2lwaGVyLmRlY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTsKCSAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7CgoJICAgICAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgYmVjb21lcyB0aGUgcHJldmlvdXMgYmxvY2sKCSAgICAgICAgICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB0aGlzQmxvY2s7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0pOwoKCSAgICAgICAgZnVuY3Rpb24geG9yQmxvY2sod29yZHMsIG9mZnNldCwgYmxvY2tTaXplKSB7CgkgICAgICAgICAgICB2YXIgYmxvY2s7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciBpdiA9IHRoaXMuX2l2OwoKCSAgICAgICAgICAgIC8vIENob29zZSBtaXhpbmcgYmxvY2sKCSAgICAgICAgICAgIGlmIChpdikgewoJICAgICAgICAgICAgICAgIGJsb2NrID0gaXY7CgoJICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBJViBmb3Igc3Vic2VxdWVudCBibG9ja3MKCSAgICAgICAgICAgICAgICB0aGlzLl9pdiA9IHVuZGVmaW5lZDsKCSAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgYmxvY2sgPSB0aGlzLl9wcmV2QmxvY2s7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gWE9SIGJsb2NrcwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewoJICAgICAgICAgICAgICAgIHdvcmRzW29mZnNldCArIGldIF49IGJsb2NrW2ldOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgoJICAgICAgICByZXR1cm4gQ0JDOwoJICAgIH0oKSk7CgoJICAgIC8qKgoJICAgICAqIFBhZGRpbmcgbmFtZXNwYWNlLgoJICAgICAqLwoJICAgIHZhciBDX3BhZCA9IEMucGFkID0ge307CgoJICAgIC8qKgoJICAgICAqIFBLQ1MgIzUvNyBwYWRkaW5nIHN0cmF0ZWd5LgoJICAgICAqLwoJICAgIHZhciBQa2NzNyA9IENfcGFkLlBrY3M3ID0gewoJICAgICAgICAvKioKCSAgICAgICAgICogUGFkcyBkYXRhIHVzaW5nIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBQS0NTICM1LzcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBkYXRhIFRoZSBkYXRhIHRvIHBhZC4KCSAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbXVsdGlwbGUgdGhhdCB0aGUgZGF0YSBzaG91bGQgYmUgcGFkZGVkIHRvLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcucGFkKHdvcmRBcnJheSwgNCk7CgkgICAgICAgICAqLwoJICAgICAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0OwoKCSAgICAgICAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXMKCSAgICAgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gYmxvY2tTaXplQnl0ZXMgLSBkYXRhLnNpZ0J5dGVzICUgYmxvY2tTaXplQnl0ZXM7CgoJICAgICAgICAgICAgLy8gQ3JlYXRlIHBhZGRpbmcgd29yZAoJICAgICAgICAgICAgdmFyIHBhZGRpbmdXb3JkID0gKG5QYWRkaW5nQnl0ZXMgPDwgMjQpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgMTYpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgOCkgfCBuUGFkZGluZ0J5dGVzOwoKCSAgICAgICAgICAgIC8vIENyZWF0ZSBwYWRkaW5nCgkgICAgICAgICAgICB2YXIgcGFkZGluZ1dvcmRzID0gW107CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5QYWRkaW5nQnl0ZXM7IGkgKz0gNCkgewoJICAgICAgICAgICAgICAgIHBhZGRpbmdXb3Jkcy5wdXNoKHBhZGRpbmdXb3JkKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHZhciBwYWRkaW5nID0gV29yZEFycmF5LmNyZWF0ZShwYWRkaW5nV29yZHMsIG5QYWRkaW5nQnl0ZXMpOwoKCSAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nCgkgICAgICAgICAgICBkYXRhLmNvbmNhdChwYWRkaW5nKTsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBVbnBhZHMgZGF0YSB0aGF0IGhhZCBiZWVuIHBhZGRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIGRlZmluZWQgaW4gUEtDUyAjNS83LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byB1bnBhZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHN0YXRpYwoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgQ3J5cHRvSlMucGFkLlBrY3M3LnVucGFkKHdvcmRBcnJheSk7CgkgICAgICAgICAqLwoJICAgICAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHsKCSAgICAgICAgICAgIC8vIEdldCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBmcm9tIGxhc3QgYnl0ZQoJICAgICAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBkYXRhLndvcmRzWyhkYXRhLnNpZ0J5dGVzIC0gMSkgPj4+IDJdICYgMHhmZjsKCgkgICAgICAgICAgICAvLyBSZW1vdmUgcGFkZGluZwoJICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuUGFkZGluZ0J5dGVzOwoJICAgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQWJzdHJhY3QgYmFzZSBibG9jayBjaXBoZXIgdGVtcGxhdGUuCgkgICAgICoKCSAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgY2lwaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiA0ICgxMjggYml0cykKCSAgICAgKi8KCSAgICB2YXIgQmxvY2tDaXBoZXIgPSBDX2xpYi5CbG9ja0NpcGhlciA9IENpcGhlci5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcHJvcGVydHkge01vZGV9IG1vZGUgVGhlIGJsb2NrIG1vZGUgdG8gdXNlLiBEZWZhdWx0OiBDQkMKCSAgICAgICAgICogQHByb3BlcnR5IHtQYWRkaW5nfSBwYWRkaW5nIFRoZSBwYWRkaW5nIHN0cmF0ZWd5IHRvIHVzZS4gRGVmYXVsdDogUGtjczcKCSAgICAgICAgICovCgkgICAgICAgIGNmZzogQ2lwaGVyLmNmZy5leHRlbmQoewoJICAgICAgICAgICAgbW9kZTogQ0JDLAoJICAgICAgICAgICAgcGFkZGluZzogUGtjczcKCSAgICAgICAgfSksCgoJICAgICAgICByZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgdmFyIG1vZGVDcmVhdG9yOwoKCSAgICAgICAgICAgIC8vIFJlc2V0IGNpcGhlcgoJICAgICAgICAgICAgQ2lwaGVyLnJlc2V0LmNhbGwodGhpcyk7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7CgkgICAgICAgICAgICB2YXIgaXYgPSBjZmcuaXY7CgkgICAgICAgICAgICB2YXIgbW9kZSA9IGNmZy5tb2RlOwoKCSAgICAgICAgICAgIC8vIFJlc2V0IGJsb2NrIG1vZGUKCSAgICAgICAgICAgIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fRU5DX1hGT1JNX01PREUpIHsKCSAgICAgICAgICAgICAgICBtb2RlQ3JlYXRvciA9IG1vZGUuY3JlYXRlRW5jcnlwdG9yOwoJICAgICAgICAgICAgfSBlbHNlIC8qIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fREVDX1hGT1JNX01PREUpICovIHsKCSAgICAgICAgICAgICAgICBtb2RlQ3JlYXRvciA9IG1vZGUuY3JlYXRlRGVjcnlwdG9yOwoJICAgICAgICAgICAgICAgIC8vIEtlZXAgYXQgbGVhc3Qgb25lIGJsb2NrIGluIHRoZSBidWZmZXIgZm9yIHVucGFkZGluZwoJICAgICAgICAgICAgICAgIHRoaXMuX21pbkJ1ZmZlclNpemUgPSAxOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlICYmIHRoaXMuX21vZGUuX19jcmVhdG9yID09IG1vZGVDcmVhdG9yKSB7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9kZS5pbml0KHRoaXMsIGl2ICYmIGl2LndvcmRzKTsKCSAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9kZSA9IG1vZGVDcmVhdG9yLmNhbGwobW9kZSwgdGhpcywgaXYgJiYgaXYud29yZHMpOwoJICAgICAgICAgICAgICAgIHRoaXMuX21vZGUuX19jcmVhdG9yID0gbW9kZUNyZWF0b3I7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7CgkgICAgICAgICAgICB0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayh3b3Jkcywgb2Zmc2V0KTsKCSAgICAgICAgfSwKCgkgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWRCbG9ja3M7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciBwYWRkaW5nID0gdGhpcy5jZmcucGFkZGluZzsKCgkgICAgICAgICAgICAvLyBGaW5hbGl6ZQoJICAgICAgICAgICAgaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9FTkNfWEZPUk1fTU9ERSkgewoJICAgICAgICAgICAgICAgIC8vIFBhZCBkYXRhCgkgICAgICAgICAgICAgICAgcGFkZGluZy5wYWQodGhpcy5fZGF0YSwgdGhpcy5ibG9ja1NpemUpOwoKCSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2NrcwoJICAgICAgICAgICAgICAgIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpOwoJICAgICAgICAgICAgfSBlbHNlIC8qIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fREVDX1hGT1JNX01PREUpICovIHsKCSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2NrcwoJICAgICAgICAgICAgICAgIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpOwoKCSAgICAgICAgICAgICAgICAvLyBVbnBhZCBkYXRhCgkgICAgICAgICAgICAgICAgcGFkZGluZy51bnBhZChmaW5hbFByb2Nlc3NlZEJsb2Nrcyk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkQmxvY2tzOwoJICAgICAgICB9LAoKCSAgICAgICAgYmxvY2tTaXplOiAxMjgvMzIKCSAgICB9KTsKCgkgICAgLyoqCgkgICAgICogQSBjb2xsZWN0aW9uIG9mIGNpcGhlciBwYXJhbWV0ZXJzLgoJICAgICAqCgkgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGNpcGhlcnRleHQgVGhlIHJhdyBjaXBoZXJ0ZXh0LgoJICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBrZXkgVGhlIGtleSB0byB0aGlzIGNpcGhlcnRleHQuCgkgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGl2IFRoZSBJViB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLgoJICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBzYWx0IFRoZSBzYWx0IHVzZWQgd2l0aCBhIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLgoJICAgICAqIEBwcm9wZXJ0eSB7Q2lwaGVyfSBhbGdvcml0aG0gVGhlIGNpcGhlciBhbGdvcml0aG0uCgkgICAgICogQHByb3BlcnR5IHtNb2RlfSBtb2RlIFRoZSBibG9jayBtb2RlIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uCgkgICAgICogQHByb3BlcnR5IHtQYWRkaW5nfSBwYWRkaW5nIFRoZSBwYWRkaW5nIHNjaGVtZSB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLgoJICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIGJsb2NrIHNpemUgb2YgdGhlIGNpcGhlci4KCSAgICAgKiBAcHJvcGVydHkge0Zvcm1hdH0gZm9ybWF0dGVyIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCB0aGlzIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgc3RyaW5nLgoJICAgICAqLwoJICAgIHZhciBDaXBoZXJQYXJhbXMgPSBDX2xpYi5DaXBoZXJQYXJhbXMgPSBCYXNlLmV4dGVuZCh7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgY2lwaGVyIHBhcmFtcyBvYmplY3QuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaXBoZXJQYXJhbXMgQW4gb2JqZWN0IHdpdGggYW55IG9mIHRoZSBwb3NzaWJsZSBjaXBoZXIgcGFyYW1ldGVycy4KCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBjaXBoZXJQYXJhbXMgPSBDcnlwdG9KUy5saWIuQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7CgkgICAgICAgICAqICAgICAgICAgY2lwaGVydGV4dDogY2lwaGVydGV4dFdvcmRBcnJheSwKCSAgICAgICAgICogICAgICAgICBrZXk6IGtleVdvcmRBcnJheSwKCSAgICAgICAgICogICAgICAgICBpdjogaXZXb3JkQXJyYXksCgkgICAgICAgICAqICAgICAgICAgc2FsdDogc2FsdFdvcmRBcnJheSwKCSAgICAgICAgICogICAgICAgICBhbGdvcml0aG06IENyeXB0b0pTLmFsZ28uQUVTLAoJICAgICAgICAgKiAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLAoJICAgICAgICAgKiAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5QS0NTNywKCSAgICAgICAgICogICAgICAgICBibG9ja1NpemU6IDQsCgkgICAgICAgICAqICAgICAgICAgZm9ybWF0dGVyOiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTAoJICAgICAgICAgKiAgICAgfSk7CgkgICAgICAgICAqLwoJICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7CgkgICAgICAgICAgICB0aGlzLm1peEluKGNpcGhlclBhcmFtcyk7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgdGhpcyBjaXBoZXIgcGFyYW1zIG9iamVjdCB0byBhIHN0cmluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtGb3JtYXR9IGZvcm1hdHRlciAoT3B0aW9uYWwpIFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIHVzZS4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5naWZpZWQgY2lwaGVyIHBhcmFtcy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHRocm93cyBFcnJvciBJZiBuZWl0aGVyIHRoZSBmb3JtYXR0ZXIgbm9yIHRoZSBkZWZhdWx0IGZvcm1hdHRlciBpcyBzZXQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zICsgJyc7CgkgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zLnRvU3RyaW5nKCk7CgkgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zLnRvU3RyaW5nKENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMKTsKCSAgICAgICAgICovCgkgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7CgkgICAgICAgICAgICByZXR1cm4gKGZvcm1hdHRlciB8fCB0aGlzLmZvcm1hdHRlcikuc3RyaW5naWZ5KHRoaXMpOwoJICAgICAgICB9CgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIEZvcm1hdCBuYW1lc3BhY2UuCgkgICAgICovCgkgICAgdmFyIENfZm9ybWF0ID0gQy5mb3JtYXQgPSB7fTsKCgkgICAgLyoqCgkgICAgICogT3BlblNTTCBmb3JtYXR0aW5nIHN0cmF0ZWd5LgoJICAgICAqLwoJICAgIHZhciBPcGVuU1NMRm9ybWF0dGVyID0gQ19mb3JtYXQuT3BlblNTTCA9IHsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbnZlcnRzIGEgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYW4gT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN9IGNpcGhlclBhcmFtcyBUaGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBvcGVuU1NMU3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wuc3RyaW5naWZ5KGNpcGhlclBhcmFtcyk7CgkgICAgICAgICAqLwoJICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHsKCSAgICAgICAgICAgIHZhciB3b3JkQXJyYXk7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGNpcGhlclBhcmFtcy5jaXBoZXJ0ZXh0OwoJICAgICAgICAgICAgdmFyIHNhbHQgPSBjaXBoZXJQYXJhbXMuc2FsdDsKCgkgICAgICAgICAgICAvLyBGb3JtYXQKCSAgICAgICAgICAgIGlmIChzYWx0KSB7CgkgICAgICAgICAgICAgICAgd29yZEFycmF5ID0gV29yZEFycmF5LmNyZWF0ZShbMHg1MzYxNmM3NCwgMHg2NTY0NWY1Zl0pLmNvbmNhdChzYWx0KS5jb25jYXQoY2lwaGVydGV4dCk7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgIHdvcmRBcnJheSA9IGNpcGhlcnRleHQ7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgcmV0dXJuIHdvcmRBcnJheS50b1N0cmluZyhCYXNlNjQpOwoJICAgICAgICB9LAoKCSAgICAgICAgLyoqCgkgICAgICAgICAqIENvbnZlcnRzIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcgdG8gYSBjaXBoZXIgcGFyYW1zIG9iamVjdC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG9wZW5TU0xTdHIgVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgY2lwaGVyUGFyYW1zID0gQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wucGFyc2Uob3BlblNTTFN0cmluZyk7CgkgICAgICAgICAqLwoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gKG9wZW5TU0xTdHIpIHsKCSAgICAgICAgICAgIHZhciBzYWx0OwoKCSAgICAgICAgICAgIC8vIFBhcnNlIGJhc2U2NAoJICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBCYXNlNjQucGFyc2Uob3BlblNTTFN0cik7CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0V29yZHMgPSBjaXBoZXJ0ZXh0LndvcmRzOwoKCSAgICAgICAgICAgIC8vIFRlc3QgZm9yIHNhbHQKCSAgICAgICAgICAgIGlmIChjaXBoZXJ0ZXh0V29yZHNbMF0gPT0gMHg1MzYxNmM3NCAmJiBjaXBoZXJ0ZXh0V29yZHNbMV0gPT0gMHg2NTY0NWY1ZikgewoJICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgc2FsdAoJICAgICAgICAgICAgICAgIHNhbHQgPSBXb3JkQXJyYXkuY3JlYXRlKGNpcGhlcnRleHRXb3Jkcy5zbGljZSgyLCA0KSk7CgoJICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzYWx0IGZyb20gY2lwaGVydGV4dAoJICAgICAgICAgICAgICAgIGNpcGhlcnRleHRXb3Jkcy5zcGxpY2UoMCwgNCk7CgkgICAgICAgICAgICAgICAgY2lwaGVydGV4dC5zaWdCeXRlcyAtPSAxNjsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7IGNpcGhlcnRleHQ6IGNpcGhlcnRleHQsIHNhbHQ6IHNhbHQgfSk7CgkgICAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBBIGNpcGhlciB3cmFwcGVyIHRoYXQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LgoJICAgICAqLwoJICAgIHZhciBTZXJpYWxpemFibGVDaXBoZXIgPSBDX2xpYi5TZXJpYWxpemFibGVDaXBoZXIgPSBCYXNlLmV4dGVuZCh7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwcm9wZXJ0eSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCBjaXBoZXIgcGFyYW0gb2JqZWN0cyB0byBhbmQgZnJvbSBhIHN0cmluZy4gRGVmYXVsdDogT3BlblNTTAoJICAgICAgICAgKi8KCSAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7CgkgICAgICAgICAgICBmb3JtYXQ6IE9wZW5TU0xGb3JtYXR0ZXIKCSAgICAgICAgfSksCgoJICAgICAgICAvKioKCSAgICAgICAgICogRW5jcnlwdHMgYSBtZXNzYWdlLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS4KCSAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS4KCSAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5KTsKCSAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXksIHsgaXY6IGl2IH0pOwoJICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7CgkgICAgICAgICAqLwoJICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBrZXksIGNmZykgewoJICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzCgkgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTsKCgkgICAgICAgICAgICAvLyBFbmNyeXB0CgkgICAgICAgICAgICB2YXIgZW5jcnlwdG9yID0gY2lwaGVyLmNyZWF0ZUVuY3J5cHRvcihrZXksIGNmZyk7CgkgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGVuY3J5cHRvci5maW5hbGl6ZShtZXNzYWdlKTsKCgkgICAgICAgICAgICAvLyBTaG9ydGN1dAoJICAgICAgICAgICAgdmFyIGNpcGhlckNmZyA9IGVuY3J5cHRvci5jZmc7CgoJICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMKCSAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsKCSAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0LAoJICAgICAgICAgICAgICAgIGtleToga2V5LAoJICAgICAgICAgICAgICAgIGl2OiBjaXBoZXJDZmcuaXYsCgkgICAgICAgICAgICAgICAgYWxnb3JpdGhtOiBjaXBoZXIsCgkgICAgICAgICAgICAgICAgbW9kZTogY2lwaGVyQ2ZnLm1vZGUsCgkgICAgICAgICAgICAgICAgcGFkZGluZzogY2lwaGVyQ2ZnLnBhZGRpbmcsCgkgICAgICAgICAgICAgICAgYmxvY2tTaXplOiBjaXBoZXIuYmxvY2tTaXplLAoJICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogY2ZnLmZvcm1hdAoJICAgICAgICAgICAgfSk7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogRGVjcnlwdHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS4KCSAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IHRvIGRlY3J5cHQuCgkgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS4KCSAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcGxhaW50ZXh0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBmb3JtYXR0ZWRDaXBoZXJ0ZXh0LCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pOwoJICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTsKCSAgICAgICAgICovCgkgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIGNpcGhlcnRleHQsIGtleSwgY2ZnKSB7CgkgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHMKCSAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpOwoKCSAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIENpcGhlclBhcmFtcwoJICAgICAgICAgICAgY2lwaGVydGV4dCA9IHRoaXMuX3BhcnNlKGNpcGhlcnRleHQsIGNmZy5mb3JtYXQpOwoKCSAgICAgICAgICAgIC8vIERlY3J5cHQKCSAgICAgICAgICAgIHZhciBwbGFpbnRleHQgPSBjaXBoZXIuY3JlYXRlRGVjcnlwdG9yKGtleSwgY2ZnKS5maW5hbGl6ZShjaXBoZXJ0ZXh0LmNpcGhlcnRleHQpOwoKCSAgICAgICAgICAgIHJldHVybiBwbGFpbnRleHQ7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0IHRvIENpcGhlclBhcmFtcywKCSAgICAgICAgICogZWxzZSBhc3N1bWVkIENpcGhlclBhcmFtcyBhbHJlYWR5IGFuZCByZXR1cm5zIGNpcGhlcnRleHQgdW5jaGFuZ2VkLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQuCgkgICAgICAgICAqIEBwYXJhbSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlIHRvIHBhcnNlIHNlcmlhbGl6ZWQgY2lwaGVydGV4dC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBUaGUgdW5zZXJpYWxpemVkIGNpcGhlcnRleHQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5fcGFyc2UoY2lwaGVydGV4dFN0cmluZ09yUGFyYW1zLCBmb3JtYXQpOwoJICAgICAgICAgKi8KCSAgICAgICAgX3BhcnNlOiBmdW5jdGlvbiAoY2lwaGVydGV4dCwgZm9ybWF0KSB7CgkgICAgICAgICAgICBpZiAodHlwZW9mIGNpcGhlcnRleHQgPT0gJ3N0cmluZycpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0LnBhcnNlKGNpcGhlcnRleHQsIHRoaXMpOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2lwaGVydGV4dDsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICAvKioKCSAgICAgKiBLZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBuYW1lc3BhY2UuCgkgICAgICovCgkgICAgdmFyIENfa2RmID0gQy5rZGYgPSB7fTsKCgkgICAgLyoqCgkgICAgICogT3BlblNTTCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi4KCSAgICAgKi8KCSAgICB2YXIgT3BlblNTTEtkZiA9IENfa2RmLk9wZW5TU0wgPSB7CgkgICAgICAgIC8qKgoJICAgICAgICAgKiBEZXJpdmVzIGEga2V5IGFuZCBJViBmcm9tIGEgcGFzc3dvcmQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gZGVyaXZlIGZyb20uCgkgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrZXlTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBrZXkgdG8gZ2VuZXJhdGUuCgkgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpdlNpemUgVGhlIHNpemUgaW4gd29yZHMgb2YgdGhlIElWIHRvIGdlbmVyYXRlLgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgKE9wdGlvbmFsKSBBIDY0LWJpdCBzYWx0IHRvIHVzZS4gSWYgb21pdHRlZCwgYSBzYWx0IHdpbGwgYmUgZ2VuZXJhdGVkIHJhbmRvbWx5LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IEEgY2lwaGVyIHBhcmFtcyBvYmplY3Qgd2l0aCB0aGUga2V5LCBJViwgYW5kIHNhbHQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBkZXJpdmVkUGFyYW1zID0gQ3J5cHRvSlMua2RmLk9wZW5TU0wuZXhlY3V0ZSgnUGFzc3dvcmQnLCAyNTYvMzIsIDEyOC8zMik7CgkgICAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIsICdzYWx0c2FsdCcpOwoJICAgICAgICAgKi8KCSAgICAgICAgZXhlY3V0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBrZXlTaXplLCBpdlNpemUsIHNhbHQpIHsKCSAgICAgICAgICAgIC8vIEdlbmVyYXRlIHJhbmRvbSBzYWx0CgkgICAgICAgICAgICBpZiAoIXNhbHQpIHsKCSAgICAgICAgICAgICAgICBzYWx0ID0gV29yZEFycmF5LnJhbmRvbSg2NC84KTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBJVgoJICAgICAgICAgICAgdmFyIGtleSA9IEV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiBrZXlTaXplICsgaXZTaXplIH0pLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpOwoKCSAgICAgICAgICAgIC8vIFNlcGFyYXRlIGtleSBhbmQgSVYKCSAgICAgICAgICAgIHZhciBpdiA9IFdvcmRBcnJheS5jcmVhdGUoa2V5LndvcmRzLnNsaWNlKGtleVNpemUpLCBpdlNpemUgKiA0KTsKCSAgICAgICAgICAgIGtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0OwoKCSAgICAgICAgICAgIC8vIFJldHVybiBwYXJhbXMKCSAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsga2V5OiBrZXksIGl2OiBpdiwgc2FsdDogc2FsdCB9KTsKCSAgICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEEgc2VyaWFsaXphYmxlIGNpcGhlciB3cmFwcGVyIHRoYXQgZGVyaXZlcyB0aGUga2V5IGZyb20gYSBwYXNzd29yZCwKCSAgICAgKiBhbmQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LgoJICAgICAqLwoJICAgIHZhciBQYXNzd29yZEJhc2VkQ2lwaGVyID0gQ19saWIuUGFzc3dvcmRCYXNlZENpcGhlciA9IFNlcmlhbGl6YWJsZUNpcGhlci5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcHJvcGVydHkge0tERn0ga2RmIFRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgdG8gZ2VuZXJhdGUgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC4gRGVmYXVsdDogT3BlblNTTAoJICAgICAgICAgKi8KCSAgICAgICAgY2ZnOiBTZXJpYWxpemFibGVDaXBoZXIuY2ZnLmV4dGVuZCh7CgkgICAgICAgICAgICBrZGY6IE9wZW5TU0xLZGYKCSAgICAgICAgfSksCgoJICAgICAgICAvKioKCSAgICAgICAgICogRW5jcnlwdHMgYSBtZXNzYWdlIHVzaW5nIGEgcGFzc3dvcmQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLgoJICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZW5jcnlwdC4KCSAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC4KCSAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi4KCSAgICAgICAgICoKCSAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcpOwoJICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7CgkgICAgICAgICAqLwoJICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBwYXNzd29yZCwgY2ZnKSB7CgkgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHMKCSAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpOwoKCSAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIG90aGVyIHBhcmFtcwoJICAgICAgICAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBjZmcua2RmLmV4ZWN1dGUocGFzc3dvcmQsIGNpcGhlci5rZXlTaXplLCBjaXBoZXIuaXZTaXplKTsKCgkgICAgICAgICAgICAvLyBBZGQgSVYgdG8gY29uZmlnCgkgICAgICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2OwoKCSAgICAgICAgICAgIC8vIEVuY3J5cHQKCSAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQuY2FsbCh0aGlzLCBjaXBoZXIsIG1lc3NhZ2UsIGRlcml2ZWRQYXJhbXMua2V5LCBjZmcpOwoKCSAgICAgICAgICAgIC8vIE1peCBpbiBkZXJpdmVkIHBhcmFtcwoJICAgICAgICAgICAgY2lwaGVydGV4dC5taXhJbihkZXJpdmVkUGFyYW1zKTsKCgkgICAgICAgICAgICByZXR1cm4gY2lwaGVydGV4dDsKCSAgICAgICAgfSwKCgkgICAgICAgIC8qKgoJICAgICAgICAgKiBEZWNyeXB0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQgdXNpbmcgYSBwYXNzd29yZC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuCgkgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCB0byBkZWNyeXB0LgoJICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLgoJICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwbGFpbnRleHQuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBzdGF0aWMKCSAgICAgICAgICoKCSAgICAgICAgICogQGV4YW1wbGUKCSAgICAgICAgICoKCSAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBmb3JtYXR0ZWRDaXBoZXJ0ZXh0LCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7CgkgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pOwoJICAgICAgICAgKi8KCSAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgY2lwaGVydGV4dCwgcGFzc3dvcmQsIGNmZykgewoJICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzCgkgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTsKCgkgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBDaXBoZXJQYXJhbXMKCSAgICAgICAgICAgIGNpcGhlcnRleHQgPSB0aGlzLl9wYXJzZShjaXBoZXJ0ZXh0LCBjZmcuZm9ybWF0KTsKCgkgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXMKCSAgICAgICAgICAgIHZhciBkZXJpdmVkUGFyYW1zID0gY2ZnLmtkZi5leGVjdXRlKHBhc3N3b3JkLCBjaXBoZXIua2V5U2l6ZSwgY2lwaGVyLml2U2l6ZSwgY2lwaGVydGV4dC5zYWx0KTsKCgkgICAgICAgICAgICAvLyBBZGQgSVYgdG8gY29uZmlnCgkgICAgICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2OwoKCSAgICAgICAgICAgIC8vIERlY3J5cHQKCSAgICAgICAgICAgIHZhciBwbGFpbnRleHQgPSBTZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdC5jYWxsKHRoaXMsIGNpcGhlciwgY2lwaGVydGV4dCwgZGVyaXZlZFBhcmFtcy5rZXksIGNmZyk7CgoJICAgICAgICAgICAgcmV0dXJuIHBsYWludGV4dDsKCSAgICAgICAgfQoJICAgIH0pOwoJfSgpKTsKCgoJLyoqCgkgKiBDaXBoZXIgRmVlZGJhY2sgYmxvY2sgbW9kZS4KCSAqLwoJQ3J5cHRvSlMubW9kZS5DRkIgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBDRkIgPSBDcnlwdG9KUy5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpOwoKCSAgICBDRkIuRW5jcnlwdG9yID0gQ0ZCLmV4dGVuZCh7CgkgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjsKCSAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplOwoKCSAgICAgICAgICAgIGdlbmVyYXRlS2V5c3RyZWFtQW5kRW5jcnlwdC5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSwgY2lwaGVyKTsKCgkgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIHRvIHVzZSB3aXRoIG5leHQgYmxvY2sKCSAgICAgICAgICAgIHRoaXMuX3ByZXZCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTsKCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICBDRkIuRGVjcnlwdG9yID0gQ0ZCLmV4dGVuZCh7CgkgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjsKCSAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplOwoKCSAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYmxvY2sgdG8gdXNlIHdpdGggbmV4dCBibG9jawoJICAgICAgICAgICAgdmFyIHRoaXNCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTsKCgkgICAgICAgICAgICBnZW5lcmF0ZUtleXN0cmVhbUFuZEVuY3J5cHQuY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUsIGNpcGhlcik7CgoJICAgICAgICAgICAgLy8gVGhpcyBibG9jayBiZWNvbWVzIHRoZSBwcmV2aW91cyBibG9jawoJICAgICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gdGhpc0Jsb2NrOwoJICAgICAgICB9CgkgICAgfSk7CgoJICAgIGZ1bmN0aW9uIGdlbmVyYXRlS2V5c3RyZWFtQW5kRW5jcnlwdCh3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUsIGNpcGhlcikgewoJICAgICAgICB2YXIga2V5c3RyZWFtOwoKCSAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7CgoJICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW0KCSAgICAgICAgaWYgKGl2KSB7CgkgICAgICAgICAgICBrZXlzdHJlYW0gPSBpdi5zbGljZSgwKTsKCgkgICAgICAgICAgICAvLyBSZW1vdmUgSVYgZm9yIHN1YnNlcXVlbnQgYmxvY2tzCgkgICAgICAgICAgICB0aGlzLl9pdiA9IHVuZGVmaW5lZDsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgIGtleXN0cmVhbSA9IHRoaXMuX3ByZXZCbG9jazsKCSAgICAgICAgfQoJICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKGtleXN0cmVhbSwgMCk7CgoJICAgICAgICAvLyBFbmNyeXB0CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHsKCSAgICAgICAgICAgIHdvcmRzW29mZnNldCArIGldIF49IGtleXN0cmVhbVtpXTsKCSAgICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIENGQjsKCX0oKSk7CgoKCS8qKgoJICogRWxlY3Ryb25pYyBDb2RlYm9vayBibG9jayBtb2RlLgoJICovCglDcnlwdG9KUy5tb2RlLkVDQiA9IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIEVDQiA9IENyeXB0b0pTLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCk7CgoJICAgIEVDQi5FbmNyeXB0b3IgPSBFQ0IuZXh0ZW5kKHsKCSAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkgewoJICAgICAgICAgICAgdGhpcy5fY2lwaGVyLmVuY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTsKCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICBFQ0IuRGVjcnlwdG9yID0gRUNCLmV4dGVuZCh7CgkgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIHRoaXMuX2NpcGhlci5kZWNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7CgkgICAgICAgIH0KCSAgICB9KTsKCgkgICAgcmV0dXJuIEVDQjsKCX0oKSk7CgoKCS8qKgoJICogQU5TSSBYLjkyMyBwYWRkaW5nIHN0cmF0ZWd5LgoJICovCglDcnlwdG9KUy5wYWQuQW5zaVg5MjMgPSB7CgkgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7CgkgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICB2YXIgZGF0YVNpZ0J5dGVzID0gZGF0YS5zaWdCeXRlczsKCSAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDsKCgkgICAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXMKCSAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBibG9ja1NpemVCeXRlcyAtIGRhdGFTaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzOwoKCSAgICAgICAgLy8gQ29tcHV0ZSBsYXN0IGJ5dGUgcG9zaXRpb24KCSAgICAgICAgdmFyIGxhc3RCeXRlUG9zID0gZGF0YVNpZ0J5dGVzICsgblBhZGRpbmdCeXRlcyAtIDE7CgoJICAgICAgICAvLyBQYWQKCSAgICAgICAgZGF0YS5jbGFtcCgpOwoJICAgICAgICBkYXRhLndvcmRzW2xhc3RCeXRlUG9zID4+PiAyXSB8PSBuUGFkZGluZ0J5dGVzIDw8ICgyNCAtIChsYXN0Qnl0ZVBvcyAlIDQpICogOCk7CgkgICAgICAgIGRhdGEuc2lnQnl0ZXMgKz0gblBhZGRpbmdCeXRlczsKCSAgICB9LAoKCSAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHsKCSAgICAgICAgLy8gR2V0IG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGZyb20gbGFzdCBieXRlCgkgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1soZGF0YS5zaWdCeXRlcyAtIDEpID4+PiAyXSAmIDB4ZmY7CgoJICAgICAgICAvLyBSZW1vdmUgcGFkZGluZwoJICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5QYWRkaW5nQnl0ZXM7CgkgICAgfQoJfTsKCgoJLyoqCgkgKiBJU08gMTAxMjYgcGFkZGluZyBzdHJhdGVneS4KCSAqLwoJQ3J5cHRvSlMucGFkLklzbzEwMTI2ID0gewoJICAgIHBhZDogZnVuY3Rpb24gKGRhdGEsIGJsb2NrU2l6ZSkgewoJICAgICAgICAvLyBTaG9ydGN1dAoJICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0OwoKCSAgICAgICAgLy8gQ291bnQgcGFkZGluZyBieXRlcwoJICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGJsb2NrU2l6ZUJ5dGVzIC0gZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzOwoKCSAgICAgICAgLy8gUGFkCgkgICAgICAgIGRhdGEuY29uY2F0KENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKG5QYWRkaW5nQnl0ZXMgLSAxKSkuCgkgICAgICAgICAgICAgY29uY2F0KENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFtuUGFkZGluZ0J5dGVzIDw8IDI0XSwgMSkpOwoJICAgIH0sCgoJICAgIHVucGFkOiBmdW5jdGlvbiAoZGF0YSkgewoJICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgZnJvbSBsYXN0IGJ5dGUKCSAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBkYXRhLndvcmRzWyhkYXRhLnNpZ0J5dGVzIC0gMSkgPj4+IDJdICYgMHhmZjsKCgkgICAgICAgIC8vIFJlbW92ZSBwYWRkaW5nCgkgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gblBhZGRpbmdCeXRlczsKCSAgICB9Cgl9OwoKCgkvKioKCSAqIElTTy9JRUMgOTc5Ny0xIFBhZGRpbmcgTWV0aG9kIDIuCgkgKi8KCUNyeXB0b0pTLnBhZC5Jc285Nzk3MSA9IHsKCSAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHsKCSAgICAgICAgLy8gQWRkIDB4ODAgYnl0ZQoJICAgICAgICBkYXRhLmNvbmNhdChDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHg4MDAwMDAwMF0sIDEpKTsKCgkgICAgICAgIC8vIFplcm8gcGFkIHRoZSByZXN0CgkgICAgICAgIENyeXB0b0pTLnBhZC5aZXJvUGFkZGluZy5wYWQoZGF0YSwgYmxvY2tTaXplKTsKCSAgICB9LAoKCSAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHsKCSAgICAgICAgLy8gUmVtb3ZlIHplcm8gcGFkZGluZwoJICAgICAgICBDcnlwdG9KUy5wYWQuWmVyb1BhZGRpbmcudW5wYWQoZGF0YSk7CgoJICAgICAgICAvLyBSZW1vdmUgb25lIG1vcmUgYnl0ZSAtLSB0aGUgMHg4MCBieXRlCgkgICAgICAgIGRhdGEuc2lnQnl0ZXMtLTsKCSAgICB9Cgl9OwoKCgkvKioKCSAqIE91dHB1dCBGZWVkYmFjayBibG9jayBtb2RlLgoJICovCglDcnlwdG9KUy5tb2RlLk9GQiA9IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIE9GQiA9IENyeXB0b0pTLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCk7CgoJICAgIHZhciBFbmNyeXB0b3IgPSBPRkIuRW5jcnlwdG9yID0gT0ZCLmV4dGVuZCh7CgkgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcgoJICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7CgkgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjsKCSAgICAgICAgICAgIHZhciBrZXlzdHJlYW0gPSB0aGlzLl9rZXlzdHJlYW07CgoJICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5c3RyZWFtCgkgICAgICAgICAgICBpZiAoaXYpIHsKCSAgICAgICAgICAgICAgICBrZXlzdHJlYW0gPSB0aGlzLl9rZXlzdHJlYW0gPSBpdi5zbGljZSgwKTsKCgkgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2NrcwoJICAgICAgICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayhrZXlzdHJlYW0sIDApOwoKCSAgICAgICAgICAgIC8vIEVuY3J5cHQKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHsKCSAgICAgICAgICAgICAgICB3b3Jkc1tvZmZzZXQgKyBpXSBePSBrZXlzdHJlYW1baV07CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICB9KTsKCgkgICAgT0ZCLkRlY3J5cHRvciA9IEVuY3J5cHRvcjsKCgkgICAgcmV0dXJuIE9GQjsKCX0oKSk7CgoKCS8qKgoJICogQSBub29wIHBhZGRpbmcgc3RyYXRlZ3kuCgkgKi8KCUNyeXB0b0pTLnBhZC5Ob1BhZGRpbmcgPSB7CgkgICAgcGFkOiBmdW5jdGlvbiAoKSB7CgkgICAgfSwKCgkgICAgdW5wYWQ6IGZ1bmN0aW9uICgpIHsKCSAgICB9Cgl9OwoKCgkoZnVuY3Rpb24gKHVuZGVmaW5lZCkgewoJICAgIC8vIFNob3J0Y3V0cwoJICAgIHZhciBDID0gQ3J5cHRvSlM7CgkgICAgdmFyIENfbGliID0gQy5saWI7CgkgICAgdmFyIENpcGhlclBhcmFtcyA9IENfbGliLkNpcGhlclBhcmFtczsKCSAgICB2YXIgQ19lbmMgPSBDLmVuYzsKCSAgICB2YXIgSGV4ID0gQ19lbmMuSGV4OwoJICAgIHZhciBDX2Zvcm1hdCA9IEMuZm9ybWF0OwoKCSAgICB2YXIgSGV4Rm9ybWF0dGVyID0gQ19mb3JtYXQuSGV4ID0gewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgdGhlIGNpcGhlcnRleHQgb2YgYSBjaXBoZXIgcGFyYW1zIG9iamVjdCB0byBhIGhleGFkZWNpbWFsbHkgZW5jb2RlZCBzdHJpbmcuCgkgICAgICAgICAqCgkgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfSBjaXBoZXJQYXJhbXMgVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0LgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoZXhhZGVjaW1hbGx5IGVuY29kZWQgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAc3RhdGljCgkgICAgICAgICAqCgkgICAgICAgICAqIEBleGFtcGxlCgkgICAgICAgICAqCgkgICAgICAgICAqICAgICB2YXIgaGV4U3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0LkhleC5zdHJpbmdpZnkoY2lwaGVyUGFyYW1zKTsKCSAgICAgICAgICovCgkgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKGNpcGhlclBhcmFtcykgewoJICAgICAgICAgICAgcmV0dXJuIGNpcGhlclBhcmFtcy5jaXBoZXJ0ZXh0LnRvU3RyaW5nKEhleCk7CgkgICAgICAgIH0sCgoJICAgICAgICAvKioKCSAgICAgICAgICogQ29udmVydHMgYSBoZXhhZGVjaW1hbGx5IGVuY29kZWQgY2lwaGVydGV4dCBzdHJpbmcgdG8gYSBjaXBoZXIgcGFyYW1zIG9iamVjdC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFRoZSBoZXhhZGVjaW1hbGx5IGVuY29kZWQgc3RyaW5nLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC4KCSAgICAgICAgICoKCSAgICAgICAgICogQHN0YXRpYwoJICAgICAgICAgKgoJICAgICAgICAgKiBAZXhhbXBsZQoJICAgICAgICAgKgoJICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmZvcm1hdC5IZXgucGFyc2UoaGV4U3RyaW5nKTsKCSAgICAgICAgICovCgkgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gSGV4LnBhcnNlKGlucHV0KTsKCSAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsgY2lwaGVydGV4dDogY2lwaGVydGV4dCB9KTsKCSAgICAgICAgfQoJICAgIH07Cgl9KCkpOwoKCgkoZnVuY3Rpb24gKCkgewoJICAgIC8vIFNob3J0Y3V0cwoJICAgIHZhciBDID0gQ3J5cHRvSlM7CgkgICAgdmFyIENfbGliID0gQy5saWI7CgkgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXI7CgkgICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCgkgICAgLy8gTG9va3VwIHRhYmxlcwoJICAgIHZhciBTQk9YID0gW107CgkgICAgdmFyIElOVl9TQk9YID0gW107CgkgICAgdmFyIFNVQl9NSVhfMCA9IFtdOwoJICAgIHZhciBTVUJfTUlYXzEgPSBbXTsKCSAgICB2YXIgU1VCX01JWF8yID0gW107CgkgICAgdmFyIFNVQl9NSVhfMyA9IFtdOwoJICAgIHZhciBJTlZfU1VCX01JWF8wID0gW107CgkgICAgdmFyIElOVl9TVUJfTUlYXzEgPSBbXTsKCSAgICB2YXIgSU5WX1NVQl9NSVhfMiA9IFtdOwoJICAgIHZhciBJTlZfU1VCX01JWF8zID0gW107CgoJICAgIC8vIENvbXB1dGUgbG9va3VwIHRhYmxlcwoJICAgIChmdW5jdGlvbiAoKSB7CgkgICAgICAgIC8vIENvbXB1dGUgZG91YmxlIHRhYmxlCgkgICAgICAgIHZhciBkID0gW107CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKCSAgICAgICAgICAgIGlmIChpIDwgMTI4KSB7CgkgICAgICAgICAgICAgICAgZFtpXSA9IGkgPDwgMTsKCSAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgZFtpXSA9IChpIDw8IDEpIF4gMHgxMWI7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCgkgICAgICAgIC8vIFdhbGsgR0YoMl44KQoJICAgICAgICB2YXIgeCA9IDA7CgkgICAgICAgIHZhciB4aSA9IDA7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKCSAgICAgICAgICAgIC8vIENvbXB1dGUgc2JveAoJICAgICAgICAgICAgdmFyIHN4ID0geGkgXiAoeGkgPDwgMSkgXiAoeGkgPDwgMikgXiAoeGkgPDwgMykgXiAoeGkgPDwgNCk7CgkgICAgICAgICAgICBzeCA9IChzeCA+Pj4gOCkgXiAoc3ggJiAweGZmKSBeIDB4NjM7CgkgICAgICAgICAgICBTQk9YW3hdID0gc3g7CgkgICAgICAgICAgICBJTlZfU0JPWFtzeF0gPSB4OwoKCSAgICAgICAgICAgIC8vIENvbXB1dGUgbXVsdGlwbGljYXRpb24KCSAgICAgICAgICAgIHZhciB4MiA9IGRbeF07CgkgICAgICAgICAgICB2YXIgeDQgPSBkW3gyXTsKCSAgICAgICAgICAgIHZhciB4OCA9IGRbeDRdOwoKCSAgICAgICAgICAgIC8vIENvbXB1dGUgc3ViIGJ5dGVzLCBtaXggY29sdW1ucyB0YWJsZXMKCSAgICAgICAgICAgIHZhciB0ID0gKGRbc3hdICogMHgxMDEpIF4gKHN4ICogMHgxMDEwMTAwKTsKCSAgICAgICAgICAgIFNVQl9NSVhfMFt4XSA9ICh0IDw8IDI0KSB8ICh0ID4+PiA4KTsKCSAgICAgICAgICAgIFNVQl9NSVhfMVt4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNik7CgkgICAgICAgICAgICBTVUJfTUlYXzJbeF0gPSAodCA8PCA4KSAgfCAodCA+Pj4gMjQpOwoJICAgICAgICAgICAgU1VCX01JWF8zW3hdID0gdDsKCgkgICAgICAgICAgICAvLyBDb21wdXRlIGludiBzdWIgYnl0ZXMsIGludiBtaXggY29sdW1ucyB0YWJsZXMKCSAgICAgICAgICAgIHZhciB0ID0gKHg4ICogMHgxMDEwMTAxKSBeICh4NCAqIDB4MTAwMDEpIF4gKHgyICogMHgxMDEpIF4gKHggKiAweDEwMTAxMDApOwoJICAgICAgICAgICAgSU5WX1NVQl9NSVhfMFtzeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOCk7CgkgICAgICAgICAgICBJTlZfU1VCX01JWF8xW3N4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNik7CgkgICAgICAgICAgICBJTlZfU1VCX01JWF8yW3N4XSA9ICh0IDw8IDgpICB8ICh0ID4+PiAyNCk7CgkgICAgICAgICAgICBJTlZfU1VCX01JWF8zW3N4XSA9IHQ7CgoJICAgICAgICAgICAgLy8gQ29tcHV0ZSBuZXh0IGNvdW50ZXIKCSAgICAgICAgICAgIGlmICgheCkgewoJICAgICAgICAgICAgICAgIHggPSB4aSA9IDE7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgIHggPSB4MiBeIGRbZFtkW3g4IF4geDJdXV07CgkgICAgICAgICAgICAgICAgeGkgXj0gZFtkW3hpXV07CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICB9KCkpOwoKCSAgICAvLyBQcmVjb21wdXRlZCBSY29uIGxvb2t1cAoJICAgIHZhciBSQ09OID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZdOwoKCSAgICAvKioKCSAgICAgKiBBRVMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgQUVTID0gQ19hbGdvLkFFUyA9IEJsb2NrQ2lwaGVyLmV4dGVuZCh7CgkgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICB2YXIgdDsKCgkgICAgICAgICAgICAvLyBTa2lwIHJlc2V0IG9mIG5Sb3VuZHMgaGFzIGJlZW4gc2V0IGJlZm9yZSBhbmQga2V5IGRpZCBub3QgY2hhbmdlCgkgICAgICAgICAgICBpZiAodGhpcy5fblJvdW5kcyAmJiB0aGlzLl9rZXlQcmlvclJlc2V0ID09PSB0aGlzLl9rZXkpIHsKCSAgICAgICAgICAgICAgICByZXR1cm47CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5UHJpb3JSZXNldCA9IHRoaXMuX2tleTsKCSAgICAgICAgICAgIHZhciBrZXlXb3JkcyA9IGtleS53b3JkczsKCSAgICAgICAgICAgIHZhciBrZXlTaXplID0ga2V5LnNpZ0J5dGVzIC8gNDsKCgkgICAgICAgICAgICAvLyBDb21wdXRlIG51bWJlciBvZiByb3VuZHMKCSAgICAgICAgICAgIHZhciBuUm91bmRzID0gdGhpcy5fblJvdW5kcyA9IGtleVNpemUgKyA2OwoKCSAgICAgICAgICAgIC8vIENvbXB1dGUgbnVtYmVyIG9mIGtleSBzY2hlZHVsZSByb3dzCgkgICAgICAgICAgICB2YXIga3NSb3dzID0gKG5Sb3VuZHMgKyAxKSAqIDQ7CgoJICAgICAgICAgICAgLy8gQ29tcHV0ZSBrZXkgc2NoZWR1bGUKCSAgICAgICAgICAgIHZhciBrZXlTY2hlZHVsZSA9IHRoaXMuX2tleVNjaGVkdWxlID0gW107CgkgICAgICAgICAgICBmb3IgKHZhciBrc1JvdyA9IDA7IGtzUm93IDwga3NSb3dzOyBrc1JvdysrKSB7CgkgICAgICAgICAgICAgICAgaWYgKGtzUm93IDwga2V5U2l6ZSkgewoJICAgICAgICAgICAgICAgICAgICBrZXlTY2hlZHVsZVtrc1Jvd10gPSBrZXlXb3Jkc1trc1Jvd107CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdCA9IGtleVNjaGVkdWxlW2tzUm93IC0gMV07CgoJICAgICAgICAgICAgICAgICAgICBpZiAoIShrc1JvdyAlIGtleVNpemUpKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3Qgd29yZAoJICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICh0IDw8IDgpIHwgKHQgPj4+IDI0KTsKCgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgd29yZAoJICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChTQk9YW3QgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3QgJiAweGZmXTsKCgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXggUmNvbgoJICAgICAgICAgICAgICAgICAgICAgICAgdCBePSBSQ09OWyhrc1JvdyAvIGtleVNpemUpIHwgMF0gPDwgMjQ7CgkgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5U2l6ZSA+IDYgJiYga3NSb3cgJSBrZXlTaXplID09IDQpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YiB3b3JkCgkgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFNCT1hbdCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyh0ID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsodCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbdCAmIDB4ZmZdOwoJICAgICAgICAgICAgICAgICAgICB9CgoJICAgICAgICAgICAgICAgICAgICBrZXlTY2hlZHVsZVtrc1Jvd10gPSBrZXlTY2hlZHVsZVtrc1JvdyAtIGtleVNpemVdIF4gdDsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gQ29tcHV0ZSBpbnYga2V5IHNjaGVkdWxlCgkgICAgICAgICAgICB2YXIgaW52S2V5U2NoZWR1bGUgPSB0aGlzLl9pbnZLZXlTY2hlZHVsZSA9IFtdOwoJICAgICAgICAgICAgZm9yICh2YXIgaW52S3NSb3cgPSAwOyBpbnZLc1JvdyA8IGtzUm93czsgaW52S3NSb3crKykgewoJICAgICAgICAgICAgICAgIHZhciBrc1JvdyA9IGtzUm93cyAtIGludktzUm93OwoKCSAgICAgICAgICAgICAgICBpZiAoaW52S3NSb3cgJSA0KSB7CgkgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ga2V5U2NoZWR1bGVba3NSb3ddOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ga2V5U2NoZWR1bGVba3NSb3cgLSA0XTsKCSAgICAgICAgICAgICAgICB9CgoJICAgICAgICAgICAgICAgIGlmIChpbnZLc1JvdyA8IDQgfHwga3NSb3cgPD0gNCkgewoJICAgICAgICAgICAgICAgICAgICBpbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSB0OwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGludktleVNjaGVkdWxlW2ludktzUm93XSA9IElOVl9TVUJfTUlYXzBbU0JPWFt0ID4+PiAyNF1dIF4gSU5WX1NVQl9NSVhfMVtTQk9YWyh0ID4+PiAxNikgJiAweGZmXV0gXgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZfU1VCX01JWF8yW1NCT1hbKHQgPj4+IDgpICYgMHhmZl1dIF4gSU5WX1NVQl9NSVhfM1tTQk9YW3QgJiAweGZmXV07CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9LAoKCSAgICAgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CgkgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9rZXlTY2hlZHVsZSwgU1VCX01JWF8wLCBTVUJfTUlYXzEsIFNVQl9NSVhfMiwgU1VCX01JWF8zLCBTQk9YKTsKCSAgICAgICAgfSwKCgkgICAgICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewoJICAgICAgICAgICAgLy8gU3dhcCAybmQgYW5kIDR0aCByb3dzCgkgICAgICAgICAgICB2YXIgdCA9IE1bb2Zmc2V0ICsgMV07CgkgICAgICAgICAgICBNW29mZnNldCArIDFdID0gTVtvZmZzZXQgKyAzXTsKCSAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0OwoKCSAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2ludktleVNjaGVkdWxlLCBJTlZfU1VCX01JWF8wLCBJTlZfU1VCX01JWF8xLCBJTlZfU1VCX01JWF8yLCBJTlZfU1VCX01JWF8zLCBJTlZfU0JPWCk7CgoJICAgICAgICAgICAgLy8gSW52IHN3YXAgMm5kIGFuZCA0dGggcm93cwoJICAgICAgICAgICAgdmFyIHQgPSBNW29mZnNldCArIDFdOwoJICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IE1bb2Zmc2V0ICsgM107CgkgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDsKCSAgICAgICAgfSwKCgkgICAgICAgIF9kb0NyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQsIGtleVNjaGVkdWxlLCBTVUJfTUlYXzAsIFNVQl9NSVhfMSwgU1VCX01JWF8yLCBTVUJfTUlYXzMsIFNCT1gpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICB2YXIgblJvdW5kcyA9IHRoaXMuX25Sb3VuZHM7CgoJICAgICAgICAgICAgLy8gR2V0IGlucHV0LCBhZGQgcm91bmQga2V5CgkgICAgICAgICAgICB2YXIgczAgPSBNW29mZnNldF0gICAgIF4ga2V5U2NoZWR1bGVbMF07CgkgICAgICAgICAgICB2YXIgczEgPSBNW29mZnNldCArIDFdIF4ga2V5U2NoZWR1bGVbMV07CgkgICAgICAgICAgICB2YXIgczIgPSBNW29mZnNldCArIDJdIF4ga2V5U2NoZWR1bGVbMl07CgkgICAgICAgICAgICB2YXIgczMgPSBNW29mZnNldCArIDNdIF4ga2V5U2NoZWR1bGVbM107CgoJICAgICAgICAgICAgLy8gS2V5IHNjaGVkdWxlIHJvdyBjb3VudGVyCgkgICAgICAgICAgICB2YXIga3NSb3cgPSA0OwoKCSAgICAgICAgICAgIC8vIFJvdW5kcwoJICAgICAgICAgICAgZm9yICh2YXIgcm91bmQgPSAxOyByb3VuZCA8IG5Sb3VuZHM7IHJvdW5kKyspIHsKCSAgICAgICAgICAgICAgICAvLyBTaGlmdCByb3dzLCBzdWIgYnl0ZXMsIG1peCBjb2x1bW5zLCBhZGQgcm91bmQga2V5CgkgICAgICAgICAgICAgICAgdmFyIHQwID0gU1VCX01JWF8wW3MwID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMxID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczIgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczMgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdOwoJICAgICAgICAgICAgICAgIHZhciB0MSA9IFNVQl9NSVhfMFtzMSA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMiA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMzID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MwICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTsKCSAgICAgICAgICAgICAgICB2YXIgdDIgPSBTVUJfTUlYXzBbczIgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczMgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMCA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMSAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107CgkgICAgICAgICAgICAgICAgdmFyIHQzID0gU1VCX01JWF8wW3MzID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMwID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczEgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczIgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdOwoKCSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc3RhdGUKCSAgICAgICAgICAgICAgICBzMCA9IHQwOwoJICAgICAgICAgICAgICAgIHMxID0gdDE7CgkgICAgICAgICAgICAgICAgczIgPSB0MjsKCSAgICAgICAgICAgICAgICBzMyA9IHQzOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgYWRkIHJvdW5kIGtleQoJICAgICAgICAgICAgdmFyIHQwID0gKChTQk9YW3MwID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMxID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczIgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MzICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107CgkgICAgICAgICAgICB2YXIgdDEgPSAoKFNCT1hbczEgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczIgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMyA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczAgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTsKCSAgICAgICAgICAgIHZhciB0MiA9ICgoU0JPWFtzMiA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMyA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMwID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMSAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdOwoJICAgICAgICAgICAgdmFyIHQzID0gKChTQk9YW3MzID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMwID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczEgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MyICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107CgoJICAgICAgICAgICAgLy8gU2V0IG91dHB1dAoJICAgICAgICAgICAgTVtvZmZzZXRdICAgICA9IHQwOwoJICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IHQxOwoJICAgICAgICAgICAgTVtvZmZzZXQgKyAyXSA9IHQyOwoJICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQzOwoJICAgICAgICB9LAoKCSAgICAgICAga2V5U2l6ZTogMjU2LzMyCgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7CgkgICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpOwoJICAgICAqLwoJICAgIEMuQUVTID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihBRVMpOwoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgkgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXI7CgkgICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCgkgICAgLy8gUGVybXV0ZWQgQ2hvaWNlIDEgY29uc3RhbnRzCgkgICAgdmFyIFBDMSA9IFsKCSAgICAgICAgNTcsIDQ5LCA0MSwgMzMsIDI1LCAxNywgOSwgIDEsCgkgICAgICAgIDU4LCA1MCwgNDIsIDM0LCAyNiwgMTgsIDEwLCAyLAoJICAgICAgICA1OSwgNTEsIDQzLCAzNSwgMjcsIDE5LCAxMSwgMywKCSAgICAgICAgNjAsIDUyLCA0NCwgMzYsIDYzLCA1NSwgNDcsIDM5LAoJICAgICAgICAzMSwgMjMsIDE1LCA3LCAgNjIsIDU0LCA0NiwgMzgsCgkgICAgICAgIDMwLCAyMiwgMTQsIDYsICA2MSwgNTMsIDQ1LCAzNywKCSAgICAgICAgMjksIDIxLCAxMywgNSwgIDI4LCAyMCwgMTIsIDQKCSAgICBdOwoKCSAgICAvLyBQZXJtdXRlZCBDaG9pY2UgMiBjb25zdGFudHMKCSAgICB2YXIgUEMyID0gWwoJICAgICAgICAxNCwgMTcsIDExLCAyNCwgMSwgIDUsCgkgICAgICAgIDMsICAyOCwgMTUsIDYsICAyMSwgMTAsCgkgICAgICAgIDIzLCAxOSwgMTIsIDQsICAyNiwgOCwKCSAgICAgICAgMTYsIDcsICAyNywgMjAsIDEzLCAyLAoJICAgICAgICA0MSwgNTIsIDMxLCAzNywgNDcsIDU1LAoJICAgICAgICAzMCwgNDAsIDUxLCA0NSwgMzMsIDQ4LAoJICAgICAgICA0NCwgNDksIDM5LCA1NiwgMzQsIDUzLAoJICAgICAgICA0NiwgNDIsIDUwLCAzNiwgMjksIDMyCgkgICAgXTsKCgkgICAgLy8gQ3VtdWxhdGl2ZSBiaXQgc2hpZnQgY29uc3RhbnRzCgkgICAgdmFyIEJJVF9TSElGVFMgPSBbMSwgIDIsICA0LCAgNiwgIDgsICAxMCwgMTIsIDE0LCAxNSwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjhdOwoKCSAgICAvLyBTQk9YZXMgYW5kIHJvdW5kIHBlcm11dGF0aW9uIGNvbnN0YW50cwoJICAgIHZhciBTQk9YX1AgPSBbCgkgICAgICAgIHsKCSAgICAgICAgICAgIDB4MDogMHg4MDgyMDAsCgkgICAgICAgICAgICAweDEwMDAwMDAwOiAweDgwMDAsCgkgICAgICAgICAgICAweDIwMDAwMDAwOiAweDgwODAwMiwKCSAgICAgICAgICAgIDB4MzAwMDAwMDA6IDB4MiwKCSAgICAgICAgICAgIDB4NDAwMDAwMDA6IDB4MjAwLAoJICAgICAgICAgICAgMHg1MDAwMDAwMDogMHg4MDgyMDIsCgkgICAgICAgICAgICAweDYwMDAwMDAwOiAweDgwMDIwMiwKCSAgICAgICAgICAgIDB4NzAwMDAwMDA6IDB4ODAwMDAwLAoJICAgICAgICAgICAgMHg4MDAwMDAwMDogMHgyMDIsCgkgICAgICAgICAgICAweDkwMDAwMDAwOiAweDgwMDIwMCwKCSAgICAgICAgICAgIDB4YTAwMDAwMDA6IDB4ODIwMCwKCSAgICAgICAgICAgIDB4YjAwMDAwMDA6IDB4ODA4MDAwLAoJICAgICAgICAgICAgMHhjMDAwMDAwMDogMHg4MDAyLAoJICAgICAgICAgICAgMHhkMDAwMDAwMDogMHg4MDAwMDIsCgkgICAgICAgICAgICAweGUwMDAwMDAwOiAweDAsCgkgICAgICAgICAgICAweGYwMDAwMDAwOiAweDgyMDIsCgkgICAgICAgICAgICAweDgwMDAwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4MTgwMDAwMDA6IDB4ODA4MjAyLAoJICAgICAgICAgICAgMHgyODAwMDAwMDogMHg4MjAyLAoJICAgICAgICAgICAgMHgzODAwMDAwMDogMHg4MDAwLAoJICAgICAgICAgICAgMHg0ODAwMDAwMDogMHg4MDgyMDAsCgkgICAgICAgICAgICAweDU4MDAwMDAwOiAweDIwMCwKCSAgICAgICAgICAgIDB4NjgwMDAwMDA6IDB4ODA4MDAyLAoJICAgICAgICAgICAgMHg3ODAwMDAwMDogMHgyLAoJICAgICAgICAgICAgMHg4ODAwMDAwMDogMHg4MDAyMDAsCgkgICAgICAgICAgICAweDk4MDAwMDAwOiAweDgyMDAsCgkgICAgICAgICAgICAweGE4MDAwMDAwOiAweDgwODAwMCwKCSAgICAgICAgICAgIDB4YjgwMDAwMDA6IDB4ODAwMjAyLAoJICAgICAgICAgICAgMHhjODAwMDAwMDogMHg4MDAwMDIsCgkgICAgICAgICAgICAweGQ4MDAwMDAwOiAweDgwMDIsCgkgICAgICAgICAgICAweGU4MDAwMDAwOiAweDIwMiwKCSAgICAgICAgICAgIDB4ZjgwMDAwMDA6IDB4ODAwMDAwLAoJICAgICAgICAgICAgMHgxOiAweDgwMDAsCgkgICAgICAgICAgICAweDEwMDAwMDAxOiAweDIsCgkgICAgICAgICAgICAweDIwMDAwMDAxOiAweDgwODIwMCwKCSAgICAgICAgICAgIDB4MzAwMDAwMDE6IDB4ODAwMDAwLAoJICAgICAgICAgICAgMHg0MDAwMDAwMTogMHg4MDgwMDIsCgkgICAgICAgICAgICAweDUwMDAwMDAxOiAweDgyMDAsCgkgICAgICAgICAgICAweDYwMDAwMDAxOiAweDIwMCwKCSAgICAgICAgICAgIDB4NzAwMDAwMDE6IDB4ODAwMjAyLAoJICAgICAgICAgICAgMHg4MDAwMDAwMTogMHg4MDgyMDIsCgkgICAgICAgICAgICAweDkwMDAwMDAxOiAweDgwODAwMCwKCSAgICAgICAgICAgIDB4YTAwMDAwMDE6IDB4ODAwMDAyLAoJICAgICAgICAgICAgMHhiMDAwMDAwMTogMHg4MjAyLAoJICAgICAgICAgICAgMHhjMDAwMDAwMTogMHgyMDIsCgkgICAgICAgICAgICAweGQwMDAwMDAxOiAweDgwMDIwMCwKCSAgICAgICAgICAgIDB4ZTAwMDAwMDE6IDB4ODAwMiwKCSAgICAgICAgICAgIDB4ZjAwMDAwMDE6IDB4MCwKCSAgICAgICAgICAgIDB4ODAwMDAwMTogMHg4MDgyMDIsCgkgICAgICAgICAgICAweDE4MDAwMDAxOiAweDgwODAwMCwKCSAgICAgICAgICAgIDB4MjgwMDAwMDE6IDB4ODAwMDAwLAoJICAgICAgICAgICAgMHgzODAwMDAwMTogMHgyMDAsCgkgICAgICAgICAgICAweDQ4MDAwMDAxOiAweDgwMDAsCgkgICAgICAgICAgICAweDU4MDAwMDAxOiAweDgwMDAwMiwKCSAgICAgICAgICAgIDB4NjgwMDAwMDE6IDB4MiwKCSAgICAgICAgICAgIDB4NzgwMDAwMDE6IDB4ODIwMiwKCSAgICAgICAgICAgIDB4ODgwMDAwMDE6IDB4ODAwMiwKCSAgICAgICAgICAgIDB4OTgwMDAwMDE6IDB4ODAwMjAyLAoJICAgICAgICAgICAgMHhhODAwMDAwMTogMHgyMDIsCgkgICAgICAgICAgICAweGI4MDAwMDAxOiAweDgwODIwMCwKCSAgICAgICAgICAgIDB4YzgwMDAwMDE6IDB4ODAwMjAwLAoJICAgICAgICAgICAgMHhkODAwMDAwMTogMHgwLAoJICAgICAgICAgICAgMHhlODAwMDAwMTogMHg4MjAwLAoJICAgICAgICAgICAgMHhmODAwMDAwMTogMHg4MDgwMDIKCSAgICAgICAgfSwKCSAgICAgICAgewoJICAgICAgICAgICAgMHgwOiAweDQwMDg0MDEwLAoJICAgICAgICAgICAgMHgxMDAwMDAwOiAweDQwMDAsCgkgICAgICAgICAgICAweDIwMDAwMDA6IDB4ODAwMDAsCgkgICAgICAgICAgICAweDMwMDAwMDA6IDB4NDAwODAwMTAsCgkgICAgICAgICAgICAweDQwMDAwMDA6IDB4NDAwMDAwMTAsCgkgICAgICAgICAgICAweDUwMDAwMDA6IDB4NDAwODQwMDAsCgkgICAgICAgICAgICAweDYwMDAwMDA6IDB4NDAwMDQwMDAsCgkgICAgICAgICAgICAweDcwMDAwMDA6IDB4MTAsCgkgICAgICAgICAgICAweDgwMDAwMDA6IDB4ODQwMDAsCgkgICAgICAgICAgICAweDkwMDAwMDA6IDB4NDAwMDQwMTAsCgkgICAgICAgICAgICAweGEwMDAwMDA6IDB4NDAwMDAwMDAsCgkgICAgICAgICAgICAweGIwMDAwMDA6IDB4ODQwMTAsCgkgICAgICAgICAgICAweGMwMDAwMDA6IDB4ODAwMTAsCgkgICAgICAgICAgICAweGQwMDAwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4ZTAwMDAwMDogMHg0MDEwLAoJICAgICAgICAgICAgMHhmMDAwMDAwOiAweDQwMDgwMDAwLAoJICAgICAgICAgICAgMHg4MDAwMDA6IDB4NDAwMDQwMDAsCgkgICAgICAgICAgICAweDE4MDAwMDA6IDB4ODQwMTAsCgkgICAgICAgICAgICAweDI4MDAwMDA6IDB4MTAsCgkgICAgICAgICAgICAweDM4MDAwMDA6IDB4NDAwMDQwMTAsCgkgICAgICAgICAgICAweDQ4MDAwMDA6IDB4NDAwODQwMTAsCgkgICAgICAgICAgICAweDU4MDAwMDA6IDB4NDAwMDAwMDAsCgkgICAgICAgICAgICAweDY4MDAwMDA6IDB4ODAwMDAsCgkgICAgICAgICAgICAweDc4MDAwMDA6IDB4NDAwODAwMTAsCgkgICAgICAgICAgICAweDg4MDAwMDA6IDB4ODAwMTAsCgkgICAgICAgICAgICAweDk4MDAwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4YTgwMDAwMDogMHg0MDAwLAoJICAgICAgICAgICAgMHhiODAwMDAwOiAweDQwMDgwMDAwLAoJICAgICAgICAgICAgMHhjODAwMDAwOiAweDQwMDAwMDEwLAoJICAgICAgICAgICAgMHhkODAwMDAwOiAweDg0MDAwLAoJICAgICAgICAgICAgMHhlODAwMDAwOiAweDQwMDg0MDAwLAoJICAgICAgICAgICAgMHhmODAwMDAwOiAweDQwMTAsCgkgICAgICAgICAgICAweDEwMDAwMDAwOiAweDAsCgkgICAgICAgICAgICAweDExMDAwMDAwOiAweDQwMDgwMDEwLAoJICAgICAgICAgICAgMHgxMjAwMDAwMDogMHg0MDAwNDAxMCwKCSAgICAgICAgICAgIDB4MTMwMDAwMDA6IDB4NDAwODQwMDAsCgkgICAgICAgICAgICAweDE0MDAwMDAwOiAweDQwMDgwMDAwLAoJICAgICAgICAgICAgMHgxNTAwMDAwMDogMHgxMCwKCSAgICAgICAgICAgIDB4MTYwMDAwMDA6IDB4ODQwMTAsCgkgICAgICAgICAgICAweDE3MDAwMDAwOiAweDQwMDAsCgkgICAgICAgICAgICAweDE4MDAwMDAwOiAweDQwMTAsCgkgICAgICAgICAgICAweDE5MDAwMDAwOiAweDgwMDAwLAoJICAgICAgICAgICAgMHgxYTAwMDAwMDogMHg4MDAxMCwKCSAgICAgICAgICAgIDB4MWIwMDAwMDA6IDB4NDAwMDAwMTAsCgkgICAgICAgICAgICAweDFjMDAwMDAwOiAweDg0MDAwLAoJICAgICAgICAgICAgMHgxZDAwMDAwMDogMHg0MDAwNDAwMCwKCSAgICAgICAgICAgIDB4MWUwMDAwMDA6IDB4NDAwMDAwMDAsCgkgICAgICAgICAgICAweDFmMDAwMDAwOiAweDQwMDg0MDEwLAoJICAgICAgICAgICAgMHgxMDgwMDAwMDogMHg4NDAxMCwKCSAgICAgICAgICAgIDB4MTE4MDAwMDA6IDB4ODAwMDAsCgkgICAgICAgICAgICAweDEyODAwMDAwOiAweDQwMDgwMDAwLAoJICAgICAgICAgICAgMHgxMzgwMDAwMDogMHg0MDAwLAoJICAgICAgICAgICAgMHgxNDgwMDAwMDogMHg0MDAwNDAwMCwKCSAgICAgICAgICAgIDB4MTU4MDAwMDA6IDB4NDAwODQwMTAsCgkgICAgICAgICAgICAweDE2ODAwMDAwOiAweDEwLAoJICAgICAgICAgICAgMHgxNzgwMDAwMDogMHg0MDAwMDAwMCwKCSAgICAgICAgICAgIDB4MTg4MDAwMDA6IDB4NDAwODQwMDAsCgkgICAgICAgICAgICAweDE5ODAwMDAwOiAweDQwMDAwMDEwLAoJICAgICAgICAgICAgMHgxYTgwMDAwMDogMHg0MDAwNDAxMCwKCSAgICAgICAgICAgIDB4MWI4MDAwMDA6IDB4ODAwMTAsCgkgICAgICAgICAgICAweDFjODAwMDAwOiAweDAsCgkgICAgICAgICAgICAweDFkODAwMDAwOiAweDQwMTAsCgkgICAgICAgICAgICAweDFlODAwMDAwOiAweDQwMDgwMDEwLAoJICAgICAgICAgICAgMHgxZjgwMDAwMDogMHg4NDAwMAoJICAgICAgICB9LAoJICAgICAgICB7CgkgICAgICAgICAgICAweDA6IDB4MTA0LAoJICAgICAgICAgICAgMHgxMDAwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4MjAwMDAwOiAweDQwMDAxMDAsCgkgICAgICAgICAgICAweDMwMDAwMDogMHgxMDEwNCwKCSAgICAgICAgICAgIDB4NDAwMDAwOiAweDEwMDA0LAoJICAgICAgICAgICAgMHg1MDAwMDA6IDB4NDAwMDAwNCwKCSAgICAgICAgICAgIDB4NjAwMDAwOiAweDQwMTAxMDQsCgkgICAgICAgICAgICAweDcwMDAwMDogMHg0MDEwMDAwLAoJICAgICAgICAgICAgMHg4MDAwMDA6IDB4NDAwMDAwMCwKCSAgICAgICAgICAgIDB4OTAwMDAwOiAweDQwMTAxMDAsCgkgICAgICAgICAgICAweGEwMDAwMDogMHgxMDEwMCwKCSAgICAgICAgICAgIDB4YjAwMDAwOiAweDQwMTAwMDQsCgkgICAgICAgICAgICAweGMwMDAwMDogMHg0MDAwMTA0LAoJICAgICAgICAgICAgMHhkMDAwMDA6IDB4MTAwMDAsCgkgICAgICAgICAgICAweGUwMDAwMDogMHg0LAoJICAgICAgICAgICAgMHhmMDAwMDA6IDB4MTAwLAoJICAgICAgICAgICAgMHg4MDAwMDogMHg0MDEwMTAwLAoJICAgICAgICAgICAgMHgxODAwMDA6IDB4NDAxMDAwNCwKCSAgICAgICAgICAgIDB4MjgwMDAwOiAweDAsCgkgICAgICAgICAgICAweDM4MDAwMDogMHg0MDAwMTAwLAoJICAgICAgICAgICAgMHg0ODAwMDA6IDB4NDAwMDAwNCwKCSAgICAgICAgICAgIDB4NTgwMDAwOiAweDEwMDAwLAoJICAgICAgICAgICAgMHg2ODAwMDA6IDB4MTAwMDQsCgkgICAgICAgICAgICAweDc4MDAwMDogMHgxMDQsCgkgICAgICAgICAgICAweDg4MDAwMDogMHg0LAoJICAgICAgICAgICAgMHg5ODAwMDA6IDB4MTAwLAoJICAgICAgICAgICAgMHhhODAwMDA6IDB4NDAxMDAwMCwKCSAgICAgICAgICAgIDB4YjgwMDAwOiAweDEwMTA0LAoJICAgICAgICAgICAgMHhjODAwMDA6IDB4MTAxMDAsCgkgICAgICAgICAgICAweGQ4MDAwMDogMHg0MDAwMTA0LAoJICAgICAgICAgICAgMHhlODAwMDA6IDB4NDAxMDEwNCwKCSAgICAgICAgICAgIDB4ZjgwMDAwOiAweDQwMDAwMDAsCgkgICAgICAgICAgICAweDEwMDAwMDA6IDB4NDAxMDEwMCwKCSAgICAgICAgICAgIDB4MTEwMDAwMDogMHgxMDAwNCwKCSAgICAgICAgICAgIDB4MTIwMDAwMDogMHgxMDAwMCwKCSAgICAgICAgICAgIDB4MTMwMDAwMDogMHg0MDAwMTAwLAoJICAgICAgICAgICAgMHgxNDAwMDAwOiAweDEwMCwKCSAgICAgICAgICAgIDB4MTUwMDAwMDogMHg0MDEwMTA0LAoJICAgICAgICAgICAgMHgxNjAwMDAwOiAweDQwMDAwMDQsCgkgICAgICAgICAgICAweDE3MDAwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4MTgwMDAwMDogMHg0MDAwMTA0LAoJICAgICAgICAgICAgMHgxOTAwMDAwOiAweDQwMDAwMDAsCgkgICAgICAgICAgICAweDFhMDAwMDA6IDB4NCwKCSAgICAgICAgICAgIDB4MWIwMDAwMDogMHgxMDEwMCwKCSAgICAgICAgICAgIDB4MWMwMDAwMDogMHg0MDEwMDAwLAoJICAgICAgICAgICAgMHgxZDAwMDAwOiAweDEwNCwKCSAgICAgICAgICAgIDB4MWUwMDAwMDogMHgxMDEwNCwKCSAgICAgICAgICAgIDB4MWYwMDAwMDogMHg0MDEwMDA0LAoJICAgICAgICAgICAgMHgxMDgwMDAwOiAweDQwMDAwMDAsCgkgICAgICAgICAgICAweDExODAwMDA6IDB4MTA0LAoJICAgICAgICAgICAgMHgxMjgwMDAwOiAweDQwMTAxMDAsCgkgICAgICAgICAgICAweDEzODAwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4MTQ4MDAwMDogMHgxMDAwNCwKCSAgICAgICAgICAgIDB4MTU4MDAwMDogMHg0MDAwMTAwLAoJICAgICAgICAgICAgMHgxNjgwMDAwOiAweDEwMCwKCSAgICAgICAgICAgIDB4MTc4MDAwMDogMHg0MDEwMDA0LAoJICAgICAgICAgICAgMHgxODgwMDAwOiAweDEwMDAwLAoJICAgICAgICAgICAgMHgxOTgwMDAwOiAweDQwMTAxMDQsCgkgICAgICAgICAgICAweDFhODAwMDA6IDB4MTAxMDQsCgkgICAgICAgICAgICAweDFiODAwMDA6IDB4NDAwMDAwNCwKCSAgICAgICAgICAgIDB4MWM4MDAwMDogMHg0MDAwMTA0LAoJICAgICAgICAgICAgMHgxZDgwMDAwOiAweDQwMTAwMDAsCgkgICAgICAgICAgICAweDFlODAwMDA6IDB4NCwKCSAgICAgICAgICAgIDB4MWY4MDAwMDogMHgxMDEwMAoJICAgICAgICB9LAoJICAgICAgICB7CgkgICAgICAgICAgICAweDA6IDB4ODA0MDEwMDAsCgkgICAgICAgICAgICAweDEwMDAwOiAweDgwMDAxMDQwLAoJICAgICAgICAgICAgMHgyMDAwMDogMHg0MDEwNDAsCgkgICAgICAgICAgICAweDMwMDAwOiAweDgwNDAwMDAwLAoJICAgICAgICAgICAgMHg0MDAwMDogMHgwLAoJICAgICAgICAgICAgMHg1MDAwMDogMHg0MDEwMDAsCgkgICAgICAgICAgICAweDYwMDAwOiAweDgwMDAwMDQwLAoJICAgICAgICAgICAgMHg3MDAwMDogMHg0MDAwNDAsCgkgICAgICAgICAgICAweDgwMDAwOiAweDgwMDAwMDAwLAoJICAgICAgICAgICAgMHg5MDAwMDogMHg0MDAwMDAsCgkgICAgICAgICAgICAweGEwMDAwOiAweDQwLAoJICAgICAgICAgICAgMHhiMDAwMDogMHg4MDAwMTAwMCwKCSAgICAgICAgICAgIDB4YzAwMDA6IDB4ODA0MDAwNDAsCgkgICAgICAgICAgICAweGQwMDAwOiAweDEwNDAsCgkgICAgICAgICAgICAweGUwMDAwOiAweDEwMDAsCgkgICAgICAgICAgICAweGYwMDAwOiAweDgwNDAxMDQwLAoJICAgICAgICAgICAgMHg4MDAwOiAweDgwMDAxMDQwLAoJICAgICAgICAgICAgMHgxODAwMDogMHg0MCwKCSAgICAgICAgICAgIDB4MjgwMDA6IDB4ODA0MDAwNDAsCgkgICAgICAgICAgICAweDM4MDAwOiAweDgwMDAxMDAwLAoJICAgICAgICAgICAgMHg0ODAwMDogMHg0MDEwMDAsCgkgICAgICAgICAgICAweDU4MDAwOiAweDgwNDAxMDQwLAoJICAgICAgICAgICAgMHg2ODAwMDogMHgwLAoJICAgICAgICAgICAgMHg3ODAwMDogMHg4MDQwMDAwMCwKCSAgICAgICAgICAgIDB4ODgwMDA6IDB4MTAwMCwKCSAgICAgICAgICAgIDB4OTgwMDA6IDB4ODA0MDEwMDAsCgkgICAgICAgICAgICAweGE4MDAwOiAweDQwMDAwMCwKCSAgICAgICAgICAgIDB4YjgwMDA6IDB4MTA0MCwKCSAgICAgICAgICAgIDB4YzgwMDA6IDB4ODAwMDAwMDAsCgkgICAgICAgICAgICAweGQ4MDAwOiAweDQwMDA0MCwKCSAgICAgICAgICAgIDB4ZTgwMDA6IDB4NDAxMDQwLAoJICAgICAgICAgICAgMHhmODAwMDogMHg4MDAwMDA0MCwKCSAgICAgICAgICAgIDB4MTAwMDAwOiAweDQwMDA0MCwKCSAgICAgICAgICAgIDB4MTEwMDAwOiAweDQwMTAwMCwKCSAgICAgICAgICAgIDB4MTIwMDAwOiAweDgwMDAwMDQwLAoJICAgICAgICAgICAgMHgxMzAwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4MTQwMDAwOiAweDEwNDAsCgkgICAgICAgICAgICAweDE1MDAwMDogMHg4MDQwMDA0MCwKCSAgICAgICAgICAgIDB4MTYwMDAwOiAweDgwNDAxMDAwLAoJICAgICAgICAgICAgMHgxNzAwMDA6IDB4ODAwMDEwNDAsCgkgICAgICAgICAgICAweDE4MDAwMDogMHg4MDQwMTA0MCwKCSAgICAgICAgICAgIDB4MTkwMDAwOiAweDgwMDAwMDAwLAoJICAgICAgICAgICAgMHgxYTAwMDA6IDB4ODA0MDAwMDAsCgkgICAgICAgICAgICAweDFiMDAwMDogMHg0MDEwNDAsCgkgICAgICAgICAgICAweDFjMDAwMDogMHg4MDAwMTAwMCwKCSAgICAgICAgICAgIDB4MWQwMDAwOiAweDQwMDAwMCwKCSAgICAgICAgICAgIDB4MWUwMDAwOiAweDQwLAoJICAgICAgICAgICAgMHgxZjAwMDA6IDB4MTAwMCwKCSAgICAgICAgICAgIDB4MTA4MDAwOiAweDgwNDAwMDAwLAoJICAgICAgICAgICAgMHgxMTgwMDA6IDB4ODA0MDEwNDAsCgkgICAgICAgICAgICAweDEyODAwMDogMHgwLAoJICAgICAgICAgICAgMHgxMzgwMDA6IDB4NDAxMDAwLAoJICAgICAgICAgICAgMHgxNDgwMDA6IDB4NDAwMDQwLAoJICAgICAgICAgICAgMHgxNTgwMDA6IDB4ODAwMDAwMDAsCgkgICAgICAgICAgICAweDE2ODAwMDogMHg4MDAwMTA0MCwKCSAgICAgICAgICAgIDB4MTc4MDAwOiAweDQwLAoJICAgICAgICAgICAgMHgxODgwMDA6IDB4ODAwMDAwNDAsCgkgICAgICAgICAgICAweDE5ODAwMDogMHgxMDAwLAoJICAgICAgICAgICAgMHgxYTgwMDA6IDB4ODAwMDEwMDAsCgkgICAgICAgICAgICAweDFiODAwMDogMHg4MDQwMDA0MCwKCSAgICAgICAgICAgIDB4MWM4MDAwOiAweDEwNDAsCgkgICAgICAgICAgICAweDFkODAwMDogMHg4MDQwMTAwMCwKCSAgICAgICAgICAgIDB4MWU4MDAwOiAweDQwMDAwMCwKCSAgICAgICAgICAgIDB4MWY4MDAwOiAweDQwMTA0MAoJICAgICAgICB9LAoJICAgICAgICB7CgkgICAgICAgICAgICAweDA6IDB4ODAsCgkgICAgICAgICAgICAweDEwMDA6IDB4MTA0MDAwMCwKCSAgICAgICAgICAgIDB4MjAwMDogMHg0MDAwMCwKCSAgICAgICAgICAgIDB4MzAwMDogMHgyMDAwMDAwMCwKCSAgICAgICAgICAgIDB4NDAwMDogMHgyMDA0MDA4MCwKCSAgICAgICAgICAgIDB4NTAwMDogMHgxMDAwMDgwLAoJICAgICAgICAgICAgMHg2MDAwOiAweDIxMDAwMDgwLAoJICAgICAgICAgICAgMHg3MDAwOiAweDQwMDgwLAoJICAgICAgICAgICAgMHg4MDAwOiAweDEwMDAwMDAsCgkgICAgICAgICAgICAweDkwMDA6IDB4MjAwNDAwMDAsCgkgICAgICAgICAgICAweGEwMDA6IDB4MjAwMDAwODAsCgkgICAgICAgICAgICAweGIwMDA6IDB4MjEwNDAwODAsCgkgICAgICAgICAgICAweGMwMDA6IDB4MjEwNDAwMDAsCgkgICAgICAgICAgICAweGQwMDA6IDB4MCwKCSAgICAgICAgICAgIDB4ZTAwMDogMHgxMDQwMDgwLAoJICAgICAgICAgICAgMHhmMDAwOiAweDIxMDAwMDAwLAoJICAgICAgICAgICAgMHg4MDA6IDB4MTA0MDA4MCwKCSAgICAgICAgICAgIDB4MTgwMDogMHgyMTAwMDA4MCwKCSAgICAgICAgICAgIDB4MjgwMDogMHg4MCwKCSAgICAgICAgICAgIDB4MzgwMDogMHgxMDQwMDAwLAoJICAgICAgICAgICAgMHg0ODAwOiAweDQwMDAwLAoJICAgICAgICAgICAgMHg1ODAwOiAweDIwMDQwMDgwLAoJICAgICAgICAgICAgMHg2ODAwOiAweDIxMDQwMDAwLAoJICAgICAgICAgICAgMHg3ODAwOiAweDIwMDAwMDAwLAoJICAgICAgICAgICAgMHg4ODAwOiAweDIwMDQwMDAwLAoJICAgICAgICAgICAgMHg5ODAwOiAweDAsCgkgICAgICAgICAgICAweGE4MDA6IDB4MjEwNDAwODAsCgkgICAgICAgICAgICAweGI4MDA6IDB4MTAwMDA4MCwKCSAgICAgICAgICAgIDB4YzgwMDogMHgyMDAwMDA4MCwKCSAgICAgICAgICAgIDB4ZDgwMDogMHgyMTAwMDAwMCwKCSAgICAgICAgICAgIDB4ZTgwMDogMHgxMDAwMDAwLAoJICAgICAgICAgICAgMHhmODAwOiAweDQwMDgwLAoJICAgICAgICAgICAgMHgxMDAwMDogMHg0MDAwMCwKCSAgICAgICAgICAgIDB4MTEwMDA6IDB4ODAsCgkgICAgICAgICAgICAweDEyMDAwOiAweDIwMDAwMDAwLAoJICAgICAgICAgICAgMHgxMzAwMDogMHgyMTAwMDA4MCwKCSAgICAgICAgICAgIDB4MTQwMDA6IDB4MTAwMDA4MCwKCSAgICAgICAgICAgIDB4MTUwMDA6IDB4MjEwNDAwMDAsCgkgICAgICAgICAgICAweDE2MDAwOiAweDIwMDQwMDgwLAoJICAgICAgICAgICAgMHgxNzAwMDogMHgxMDAwMDAwLAoJICAgICAgICAgICAgMHgxODAwMDogMHgyMTA0MDA4MCwKCSAgICAgICAgICAgIDB4MTkwMDA6IDB4MjEwMDAwMDAsCgkgICAgICAgICAgICAweDFhMDAwOiAweDEwNDAwMDAsCgkgICAgICAgICAgICAweDFiMDAwOiAweDIwMDQwMDAwLAoJICAgICAgICAgICAgMHgxYzAwMDogMHg0MDA4MCwKCSAgICAgICAgICAgIDB4MWQwMDA6IDB4MjAwMDAwODAsCgkgICAgICAgICAgICAweDFlMDAwOiAweDAsCgkgICAgICAgICAgICAweDFmMDAwOiAweDEwNDAwODAsCgkgICAgICAgICAgICAweDEwODAwOiAweDIxMDAwMDgwLAoJICAgICAgICAgICAgMHgxMTgwMDogMHgxMDAwMDAwLAoJICAgICAgICAgICAgMHgxMjgwMDogMHgxMDQwMDAwLAoJICAgICAgICAgICAgMHgxMzgwMDogMHgyMDA0MDA4MCwKCSAgICAgICAgICAgIDB4MTQ4MDA6IDB4MjAwMDAwMDAsCgkgICAgICAgICAgICAweDE1ODAwOiAweDEwNDAwODAsCgkgICAgICAgICAgICAweDE2ODAwOiAweDgwLAoJICAgICAgICAgICAgMHgxNzgwMDogMHgyMTA0MDAwMCwKCSAgICAgICAgICAgIDB4MTg4MDA6IDB4NDAwODAsCgkgICAgICAgICAgICAweDE5ODAwOiAweDIxMDQwMDgwLAoJICAgICAgICAgICAgMHgxYTgwMDogMHgwLAoJICAgICAgICAgICAgMHgxYjgwMDogMHgyMTAwMDAwMCwKCSAgICAgICAgICAgIDB4MWM4MDA6IDB4MTAwMDA4MCwKCSAgICAgICAgICAgIDB4MWQ4MDA6IDB4NDAwMDAsCgkgICAgICAgICAgICAweDFlODAwOiAweDIwMDQwMDAwLAoJICAgICAgICAgICAgMHgxZjgwMDogMHgyMDAwMDA4MAoJICAgICAgICB9LAoJICAgICAgICB7CgkgICAgICAgICAgICAweDA6IDB4MTAwMDAwMDgsCgkgICAgICAgICAgICAweDEwMDogMHgyMDAwLAoJICAgICAgICAgICAgMHgyMDA6IDB4MTAyMDAwMDAsCgkgICAgICAgICAgICAweDMwMDogMHgxMDIwMjAwOCwKCSAgICAgICAgICAgIDB4NDAwOiAweDEwMDAyMDAwLAoJICAgICAgICAgICAgMHg1MDA6IDB4MjAwMDAwLAoJICAgICAgICAgICAgMHg2MDA6IDB4MjAwMDA4LAoJICAgICAgICAgICAgMHg3MDA6IDB4MTAwMDAwMDAsCgkgICAgICAgICAgICAweDgwMDogMHgwLAoJICAgICAgICAgICAgMHg5MDA6IDB4MTAwMDIwMDgsCgkgICAgICAgICAgICAweGEwMDogMHgyMDIwMDAsCgkgICAgICAgICAgICAweGIwMDogMHg4LAoJICAgICAgICAgICAgMHhjMDA6IDB4MTAyMDAwMDgsCgkgICAgICAgICAgICAweGQwMDogMHgyMDIwMDgsCgkgICAgICAgICAgICAweGUwMDogMHgyMDA4LAoJICAgICAgICAgICAgMHhmMDA6IDB4MTAyMDIwMDAsCgkgICAgICAgICAgICAweDgwOiAweDEwMjAwMDAwLAoJICAgICAgICAgICAgMHgxODA6IDB4MTAyMDIwMDgsCgkgICAgICAgICAgICAweDI4MDogMHg4LAoJICAgICAgICAgICAgMHgzODA6IDB4MjAwMDAwLAoJICAgICAgICAgICAgMHg0ODA6IDB4MjAyMDA4LAoJICAgICAgICAgICAgMHg1ODA6IDB4MTAwMDAwMDgsCgkgICAgICAgICAgICAweDY4MDogMHgxMDAwMjAwMCwKCSAgICAgICAgICAgIDB4NzgwOiAweDIwMDgsCgkgICAgICAgICAgICAweDg4MDogMHgyMDAwMDgsCgkgICAgICAgICAgICAweDk4MDogMHgyMDAwLAoJICAgICAgICAgICAgMHhhODA6IDB4MTAwMDIwMDgsCgkgICAgICAgICAgICAweGI4MDogMHgxMDIwMDAwOCwKCSAgICAgICAgICAgIDB4YzgwOiAweDAsCgkgICAgICAgICAgICAweGQ4MDogMHgxMDIwMjAwMCwKCSAgICAgICAgICAgIDB4ZTgwOiAweDIwMjAwMCwKCSAgICAgICAgICAgIDB4ZjgwOiAweDEwMDAwMDAwLAoJICAgICAgICAgICAgMHgxMDAwOiAweDEwMDAyMDAwLAoJICAgICAgICAgICAgMHgxMTAwOiAweDEwMjAwMDA4LAoJICAgICAgICAgICAgMHgxMjAwOiAweDEwMjAyMDA4LAoJICAgICAgICAgICAgMHgxMzAwOiAweDIwMDgsCgkgICAgICAgICAgICAweDE0MDA6IDB4MjAwMDAwLAoJICAgICAgICAgICAgMHgxNTAwOiAweDEwMDAwMDAwLAoJICAgICAgICAgICAgMHgxNjAwOiAweDEwMDAwMDA4LAoJICAgICAgICAgICAgMHgxNzAwOiAweDIwMjAwMCwKCSAgICAgICAgICAgIDB4MTgwMDogMHgyMDIwMDgsCgkgICAgICAgICAgICAweDE5MDA6IDB4MCwKCSAgICAgICAgICAgIDB4MWEwMDogMHg4LAoJICAgICAgICAgICAgMHgxYjAwOiAweDEwMjAwMDAwLAoJICAgICAgICAgICAgMHgxYzAwOiAweDIwMDAsCgkgICAgICAgICAgICAweDFkMDA6IDB4MTAwMDIwMDgsCgkgICAgICAgICAgICAweDFlMDA6IDB4MTAyMDIwMDAsCgkgICAgICAgICAgICAweDFmMDA6IDB4MjAwMDA4LAoJICAgICAgICAgICAgMHgxMDgwOiAweDgsCgkgICAgICAgICAgICAweDExODA6IDB4MjAyMDAwLAoJICAgICAgICAgICAgMHgxMjgwOiAweDIwMDAwMCwKCSAgICAgICAgICAgIDB4MTM4MDogMHgxMDAwMDAwOCwKCSAgICAgICAgICAgIDB4MTQ4MDogMHgxMDAwMjAwMCwKCSAgICAgICAgICAgIDB4MTU4MDogMHgyMDA4LAoJICAgICAgICAgICAgMHgxNjgwOiAweDEwMjAyMDA4LAoJICAgICAgICAgICAgMHgxNzgwOiAweDEwMjAwMDAwLAoJICAgICAgICAgICAgMHgxODgwOiAweDEwMjAyMDAwLAoJICAgICAgICAgICAgMHgxOTgwOiAweDEwMjAwMDA4LAoJICAgICAgICAgICAgMHgxYTgwOiAweDIwMDAsCgkgICAgICAgICAgICAweDFiODA6IDB4MjAyMDA4LAoJICAgICAgICAgICAgMHgxYzgwOiAweDIwMDAwOCwKCSAgICAgICAgICAgIDB4MWQ4MDogMHgwLAoJICAgICAgICAgICAgMHgxZTgwOiAweDEwMDAwMDAwLAoJICAgICAgICAgICAgMHgxZjgwOiAweDEwMDAyMDA4CgkgICAgICAgIH0sCgkgICAgICAgIHsKCSAgICAgICAgICAgIDB4MDogMHgxMDAwMDAsCgkgICAgICAgICAgICAweDEwOiAweDIwMDA0MDEsCgkgICAgICAgICAgICAweDIwOiAweDQwMCwKCSAgICAgICAgICAgIDB4MzA6IDB4MTAwNDAxLAoJICAgICAgICAgICAgMHg0MDogMHgyMTAwNDAxLAoJICAgICAgICAgICAgMHg1MDogMHgwLAoJICAgICAgICAgICAgMHg2MDogMHgxLAoJICAgICAgICAgICAgMHg3MDogMHgyMTAwMDAxLAoJICAgICAgICAgICAgMHg4MDogMHgyMDAwNDAwLAoJICAgICAgICAgICAgMHg5MDogMHgxMDAwMDEsCgkgICAgICAgICAgICAweGEwOiAweDIwMDAwMDEsCgkgICAgICAgICAgICAweGIwOiAweDIxMDA0MDAsCgkgICAgICAgICAgICAweGMwOiAweDIxMDAwMDAsCgkgICAgICAgICAgICAweGQwOiAweDQwMSwKCSAgICAgICAgICAgIDB4ZTA6IDB4MTAwNDAwLAoJICAgICAgICAgICAgMHhmMDogMHgyMDAwMDAwLAoJICAgICAgICAgICAgMHg4OiAweDIxMDAwMDEsCgkgICAgICAgICAgICAweDE4OiAweDAsCgkgICAgICAgICAgICAweDI4OiAweDIwMDA0MDEsCgkgICAgICAgICAgICAweDM4OiAweDIxMDA0MDAsCgkgICAgICAgICAgICAweDQ4OiAweDEwMDAwMCwKCSAgICAgICAgICAgIDB4NTg6IDB4MjAwMDAwMSwKCSAgICAgICAgICAgIDB4Njg6IDB4MjAwMDAwMCwKCSAgICAgICAgICAgIDB4Nzg6IDB4NDAxLAoJICAgICAgICAgICAgMHg4ODogMHgxMDA0MDEsCgkgICAgICAgICAgICAweDk4OiAweDIwMDA0MDAsCgkgICAgICAgICAgICAweGE4OiAweDIxMDAwMDAsCgkgICAgICAgICAgICAweGI4OiAweDEwMDAwMSwKCSAgICAgICAgICAgIDB4Yzg6IDB4NDAwLAoJICAgICAgICAgICAgMHhkODogMHgyMTAwNDAxLAoJICAgICAgICAgICAgMHhlODogMHgxLAoJICAgICAgICAgICAgMHhmODogMHgxMDA0MDAsCgkgICAgICAgICAgICAweDEwMDogMHgyMDAwMDAwLAoJICAgICAgICAgICAgMHgxMTA6IDB4MTAwMDAwLAoJICAgICAgICAgICAgMHgxMjA6IDB4MjAwMDQwMSwKCSAgICAgICAgICAgIDB4MTMwOiAweDIxMDAwMDEsCgkgICAgICAgICAgICAweDE0MDogMHgxMDAwMDEsCgkgICAgICAgICAgICAweDE1MDogMHgyMDAwNDAwLAoJICAgICAgICAgICAgMHgxNjA6IDB4MjEwMDQwMCwKCSAgICAgICAgICAgIDB4MTcwOiAweDEwMDQwMSwKCSAgICAgICAgICAgIDB4MTgwOiAweDQwMSwKCSAgICAgICAgICAgIDB4MTkwOiAweDIxMDA0MDEsCgkgICAgICAgICAgICAweDFhMDogMHgxMDA0MDAsCgkgICAgICAgICAgICAweDFiMDogMHgxLAoJICAgICAgICAgICAgMHgxYzA6IDB4MCwKCSAgICAgICAgICAgIDB4MWQwOiAweDIxMDAwMDAsCgkgICAgICAgICAgICAweDFlMDogMHgyMDAwMDAxLAoJICAgICAgICAgICAgMHgxZjA6IDB4NDAwLAoJICAgICAgICAgICAgMHgxMDg6IDB4MTAwNDAwLAoJICAgICAgICAgICAgMHgxMTg6IDB4MjAwMDQwMSwKCSAgICAgICAgICAgIDB4MTI4OiAweDIxMDAwMDEsCgkgICAgICAgICAgICAweDEzODogMHgxLAoJICAgICAgICAgICAgMHgxNDg6IDB4MjAwMDAwMCwKCSAgICAgICAgICAgIDB4MTU4OiAweDEwMDAwMCwKCSAgICAgICAgICAgIDB4MTY4OiAweDQwMSwKCSAgICAgICAgICAgIDB4MTc4OiAweDIxMDA0MDAsCgkgICAgICAgICAgICAweDE4ODogMHgyMDAwMDAxLAoJICAgICAgICAgICAgMHgxOTg6IDB4MjEwMDAwMCwKCSAgICAgICAgICAgIDB4MWE4OiAweDAsCgkgICAgICAgICAgICAweDFiODogMHgyMTAwNDAxLAoJICAgICAgICAgICAgMHgxYzg6IDB4MTAwNDAxLAoJICAgICAgICAgICAgMHgxZDg6IDB4NDAwLAoJICAgICAgICAgICAgMHgxZTg6IDB4MjAwMDQwMCwKCSAgICAgICAgICAgIDB4MWY4OiAweDEwMDAwMQoJICAgICAgICB9LAoJICAgICAgICB7CgkgICAgICAgICAgICAweDA6IDB4ODAwMDgyMCwKCSAgICAgICAgICAgIDB4MTogMHgyMDAwMCwKCSAgICAgICAgICAgIDB4MjogMHg4MDAwMDAwLAoJICAgICAgICAgICAgMHgzOiAweDIwLAoJICAgICAgICAgICAgMHg0OiAweDIwMDIwLAoJICAgICAgICAgICAgMHg1OiAweDgwMjA4MjAsCgkgICAgICAgICAgICAweDY6IDB4ODAyMDgwMCwKCSAgICAgICAgICAgIDB4NzogMHg4MDAsCgkgICAgICAgICAgICAweDg6IDB4ODAyMDAwMCwKCSAgICAgICAgICAgIDB4OTogMHg4MDAwODAwLAoJICAgICAgICAgICAgMHhhOiAweDIwODAwLAoJICAgICAgICAgICAgMHhiOiAweDgwMjAwMjAsCgkgICAgICAgICAgICAweGM6IDB4ODIwLAoJICAgICAgICAgICAgMHhkOiAweDAsCgkgICAgICAgICAgICAweGU6IDB4ODAwMDAyMCwKCSAgICAgICAgICAgIDB4ZjogMHgyMDgyMCwKCSAgICAgICAgICAgIDB4ODAwMDAwMDA6IDB4ODAwLAoJICAgICAgICAgICAgMHg4MDAwMDAwMTogMHg4MDIwODIwLAoJICAgICAgICAgICAgMHg4MDAwMDAwMjogMHg4MDAwODIwLAoJICAgICAgICAgICAgMHg4MDAwMDAwMzogMHg4MDAwMDAwLAoJICAgICAgICAgICAgMHg4MDAwMDAwNDogMHg4MDIwMDAwLAoJICAgICAgICAgICAgMHg4MDAwMDAwNTogMHgyMDgwMCwKCSAgICAgICAgICAgIDB4ODAwMDAwMDY6IDB4MjA4MjAsCgkgICAgICAgICAgICAweDgwMDAwMDA3OiAweDIwLAoJICAgICAgICAgICAgMHg4MDAwMDAwODogMHg4MDAwMDIwLAoJICAgICAgICAgICAgMHg4MDAwMDAwOTogMHg4MjAsCgkgICAgICAgICAgICAweDgwMDAwMDBhOiAweDIwMDIwLAoJICAgICAgICAgICAgMHg4MDAwMDAwYjogMHg4MDIwODAwLAoJICAgICAgICAgICAgMHg4MDAwMDAwYzogMHgwLAoJICAgICAgICAgICAgMHg4MDAwMDAwZDogMHg4MDIwMDIwLAoJICAgICAgICAgICAgMHg4MDAwMDAwZTogMHg4MDAwODAwLAoJICAgICAgICAgICAgMHg4MDAwMDAwZjogMHgyMDAwMCwKCSAgICAgICAgICAgIDB4MTA6IDB4MjA4MjAsCgkgICAgICAgICAgICAweDExOiAweDgwMjA4MDAsCgkgICAgICAgICAgICAweDEyOiAweDIwLAoJICAgICAgICAgICAgMHgxMzogMHg4MDAsCgkgICAgICAgICAgICAweDE0OiAweDgwMDA4MDAsCgkgICAgICAgICAgICAweDE1OiAweDgwMDAwMjAsCgkgICAgICAgICAgICAweDE2OiAweDgwMjAwMjAsCgkgICAgICAgICAgICAweDE3OiAweDIwMDAwLAoJICAgICAgICAgICAgMHgxODogMHgwLAoJICAgICAgICAgICAgMHgxOTogMHgyMDAyMCwKCSAgICAgICAgICAgIDB4MWE6IDB4ODAyMDAwMCwKCSAgICAgICAgICAgIDB4MWI6IDB4ODAwMDgyMCwKCSAgICAgICAgICAgIDB4MWM6IDB4ODAyMDgyMCwKCSAgICAgICAgICAgIDB4MWQ6IDB4MjA4MDAsCgkgICAgICAgICAgICAweDFlOiAweDgyMCwKCSAgICAgICAgICAgIDB4MWY6IDB4ODAwMDAwMCwKCSAgICAgICAgICAgIDB4ODAwMDAwMTA6IDB4MjAwMDAsCgkgICAgICAgICAgICAweDgwMDAwMDExOiAweDgwMCwKCSAgICAgICAgICAgIDB4ODAwMDAwMTI6IDB4ODAyMDAyMCwKCSAgICAgICAgICAgIDB4ODAwMDAwMTM6IDB4MjA4MjAsCgkgICAgICAgICAgICAweDgwMDAwMDE0OiAweDIwLAoJICAgICAgICAgICAgMHg4MDAwMDAxNTogMHg4MDIwMDAwLAoJICAgICAgICAgICAgMHg4MDAwMDAxNjogMHg4MDAwMDAwLAoJICAgICAgICAgICAgMHg4MDAwMDAxNzogMHg4MDAwODIwLAoJICAgICAgICAgICAgMHg4MDAwMDAxODogMHg4MDIwODIwLAoJICAgICAgICAgICAgMHg4MDAwMDAxOTogMHg4MDAwMDIwLAoJICAgICAgICAgICAgMHg4MDAwMDAxYTogMHg4MDAwODAwLAoJICAgICAgICAgICAgMHg4MDAwMDAxYjogMHgwLAoJICAgICAgICAgICAgMHg4MDAwMDAxYzogMHgyMDgwMCwKCSAgICAgICAgICAgIDB4ODAwMDAwMWQ6IDB4ODIwLAoJICAgICAgICAgICAgMHg4MDAwMDAxZTogMHgyMDAyMCwKCSAgICAgICAgICAgIDB4ODAwMDAwMWY6IDB4ODAyMDgwMAoJICAgICAgICB9CgkgICAgXTsKCgkgICAgLy8gTWFza3MgdGhhdCBzZWxlY3QgdGhlIFNCT1ggaW5wdXQKCSAgICB2YXIgU0JPWF9NQVNLID0gWwoJICAgICAgICAweGY4MDAwMDAxLCAweDFmODAwMDAwLCAweDAxZjgwMDAwLCAweDAwMWY4MDAwLAoJICAgICAgICAweDAwMDFmODAwLCAweDAwMDAxZjgwLCAweDAwMDAwMWY4LCAweDgwMDAwMDFmCgkgICAgXTsKCgkgICAgLyoqCgkgICAgICogREVTIGJsb2NrIGNpcGhlciBhbGdvcml0aG0uCgkgICAgICovCgkgICAgdmFyIERFUyA9IENfYWxnby5ERVMgPSBCbG9ja0NpcGhlci5leHRlbmQoewoJICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5OwoJICAgICAgICAgICAgdmFyIGtleVdvcmRzID0ga2V5LndvcmRzOwoKCSAgICAgICAgICAgIC8vIFNlbGVjdCA1NiBiaXRzIGFjY29yZGluZyB0byBQQzEKCSAgICAgICAgICAgIHZhciBrZXlCaXRzID0gW107CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU2OyBpKyspIHsKCSAgICAgICAgICAgICAgICB2YXIga2V5Qml0UG9zID0gUEMxW2ldIC0gMTsKCSAgICAgICAgICAgICAgICBrZXlCaXRzW2ldID0gKGtleVdvcmRzW2tleUJpdFBvcyA+Pj4gNV0gPj4+ICgzMSAtIGtleUJpdFBvcyAlIDMyKSkgJiAxOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIEFzc2VtYmxlIDE2IHN1YmtleXMKCSAgICAgICAgICAgIHZhciBzdWJLZXlzID0gdGhpcy5fc3ViS2V5cyA9IFtdOwoJICAgICAgICAgICAgZm9yICh2YXIgblN1YktleSA9IDA7IG5TdWJLZXkgPCAxNjsgblN1YktleSsrKSB7CgkgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHN1YmtleQoJICAgICAgICAgICAgICAgIHZhciBzdWJLZXkgPSBzdWJLZXlzW25TdWJLZXldID0gW107CgoJICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgICAgICAgICAgdmFyIGJpdFNoaWZ0ID0gQklUX1NISUZUU1tuU3ViS2V5XTsKCgkgICAgICAgICAgICAgICAgLy8gU2VsZWN0IDQ4IGJpdHMgYWNjb3JkaW5nIHRvIFBDMgoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjQ7IGkrKykgewoJICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgZnJvbSB0aGUgbGVmdCAyOCBrZXkgYml0cwoJICAgICAgICAgICAgICAgICAgICBzdWJLZXlbKGkgLyA2KSB8IDBdIHw9IGtleUJpdHNbKChQQzJbaV0gLSAxKSArIGJpdFNoaWZ0KSAlIDI4XSA8PCAoMzEgLSBpICUgNik7CgoJICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgZnJvbSB0aGUgcmlnaHQgMjgga2V5IGJpdHMKCSAgICAgICAgICAgICAgICAgICAgc3ViS2V5WzQgKyAoKGkgLyA2KSB8IDApXSB8PSBrZXlCaXRzWzI4ICsgKCgoUEMyW2kgKyAyNF0gLSAxKSArIGJpdFNoaWZ0KSAlIDI4KV0gPDwgKDMxIC0gaSAlIDYpOwoJICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgLy8gU2luY2UgZWFjaCBzdWJrZXkgaXMgYXBwbGllZCB0byBhbiBleHBhbmRlZCAzMi1iaXQgaW5wdXQsCgkgICAgICAgICAgICAgICAgLy8gdGhlIHN1YmtleSBjYW4gYmUgYnJva2VuIGludG8gOCB2YWx1ZXMgc2NhbGVkIHRvIDMyLWJpdHMsCgkgICAgICAgICAgICAgICAgLy8gd2hpY2ggYWxsb3dzIHRoZSBrZXkgdG8gYmUgdXNlZCB3aXRob3V0IGV4cGFuc2lvbgoJICAgICAgICAgICAgICAgIHN1YktleVswXSA9IChzdWJLZXlbMF0gPDwgMSkgfCAoc3ViS2V5WzBdID4+PiAzMSk7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgc3ViS2V5W2ldID0gc3ViS2V5W2ldID4+PiAoKGkgLSAxKSAqIDQgKyAzKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgc3ViS2V5WzddID0gKHN1YktleVs3XSA8PCA1KSB8IChzdWJLZXlbN10gPj4+IDI3KTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBDb21wdXRlIGludmVyc2Ugc3Via2V5cwoJICAgICAgICAgICAgdmFyIGludlN1YktleXMgPSB0aGlzLl9pbnZTdWJLZXlzID0gW107CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHsKCSAgICAgICAgICAgICAgICBpbnZTdWJLZXlzW2ldID0gc3ViS2V5c1sxNSAtIGldOwoJICAgICAgICAgICAgfQoJICAgICAgICB9LAoKCSAgICAgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CgkgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9zdWJLZXlzKTsKCSAgICAgICAgfSwKCgkgICAgICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewoJICAgICAgICAgICAgdGhpcy5fZG9DcnlwdEJsb2NrKE0sIG9mZnNldCwgdGhpcy5faW52U3ViS2V5cyk7CgkgICAgICAgIH0sCgoJICAgICAgICBfZG9DcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0LCBzdWJLZXlzKSB7CgkgICAgICAgICAgICAvLyBHZXQgaW5wdXQKCSAgICAgICAgICAgIHRoaXMuX2xCbG9jayA9IE1bb2Zmc2V0XTsKCSAgICAgICAgICAgIHRoaXMuX3JCbG9jayA9IE1bb2Zmc2V0ICsgMV07CgoJICAgICAgICAgICAgLy8gSW5pdGlhbCBwZXJtdXRhdGlvbgoJICAgICAgICAgICAgZXhjaGFuZ2VMUi5jYWxsKHRoaXMsIDQsICAweDBmMGYwZjBmKTsKCSAgICAgICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCAxNiwgMHgwMDAwZmZmZik7CgkgICAgICAgICAgICBleGNoYW5nZVJMLmNhbGwodGhpcywgMiwgIDB4MzMzMzMzMzMpOwoJICAgICAgICAgICAgZXhjaGFuZ2VSTC5jYWxsKHRoaXMsIDgsICAweDAwZmYwMGZmKTsKCSAgICAgICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCAxLCAgMHg1NTU1NTU1NSk7CgoJICAgICAgICAgICAgLy8gUm91bmRzCgkgICAgICAgICAgICBmb3IgKHZhciByb3VuZCA9IDA7IHJvdW5kIDwgMTY7IHJvdW5kKyspIHsKCSAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgICAgICB2YXIgc3ViS2V5ID0gc3ViS2V5c1tyb3VuZF07CgkgICAgICAgICAgICAgICAgdmFyIGxCbG9jayA9IHRoaXMuX2xCbG9jazsKCSAgICAgICAgICAgICAgICB2YXIgckJsb2NrID0gdGhpcy5fckJsb2NrOwoKCSAgICAgICAgICAgICAgICAvLyBGZWlzdGVsIGZ1bmN0aW9uCgkgICAgICAgICAgICAgICAgdmFyIGYgPSAwOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7CgkgICAgICAgICAgICAgICAgICAgIGYgfD0gU0JPWF9QW2ldWygockJsb2NrIF4gc3ViS2V5W2ldKSAmIFNCT1hfTUFTS1tpXSkgPj4+IDBdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB0aGlzLl9sQmxvY2sgPSByQmxvY2s7CgkgICAgICAgICAgICAgICAgdGhpcy5fckJsb2NrID0gbEJsb2NrIF4gZjsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBVbmRvIHN3YXAgZnJvbSBsYXN0IHJvdW5kCgkgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2xCbG9jazsKCSAgICAgICAgICAgIHRoaXMuX2xCbG9jayA9IHRoaXMuX3JCbG9jazsKCSAgICAgICAgICAgIHRoaXMuX3JCbG9jayA9IHQ7CgoJICAgICAgICAgICAgLy8gRmluYWwgcGVybXV0YXRpb24KCSAgICAgICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCAxLCAgMHg1NTU1NTU1NSk7CgkgICAgICAgICAgICBleGNoYW5nZVJMLmNhbGwodGhpcywgOCwgIDB4MDBmZjAwZmYpOwoJICAgICAgICAgICAgZXhjaGFuZ2VSTC5jYWxsKHRoaXMsIDIsICAweDMzMzMzMzMzKTsKCSAgICAgICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCAxNiwgMHgwMDAwZmZmZik7CgkgICAgICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgNCwgIDB4MGYwZjBmMGYpOwoKCSAgICAgICAgICAgIC8vIFNldCBvdXRwdXQKCSAgICAgICAgICAgIE1bb2Zmc2V0XSA9IHRoaXMuX2xCbG9jazsKCSAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSB0aGlzLl9yQmxvY2s7CgkgICAgICAgIH0sCgoJICAgICAgICBrZXlTaXplOiA2NC8zMiwKCgkgICAgICAgIGl2U2l6ZTogNjQvMzIsCgoJICAgICAgICBibG9ja1NpemU6IDY0LzMyCgkgICAgfSk7CgoJICAgIC8vIFN3YXAgYml0cyBhY3Jvc3MgdGhlIGxlZnQgYW5kIHJpZ2h0IHdvcmRzCgkgICAgZnVuY3Rpb24gZXhjaGFuZ2VMUihvZmZzZXQsIG1hc2spIHsKCSAgICAgICAgdmFyIHQgPSAoKHRoaXMuX2xCbG9jayA+Pj4gb2Zmc2V0KSBeIHRoaXMuX3JCbG9jaykgJiBtYXNrOwoJICAgICAgICB0aGlzLl9yQmxvY2sgXj0gdDsKCSAgICAgICAgdGhpcy5fbEJsb2NrIF49IHQgPDwgb2Zmc2V0OwoJICAgIH0KCgkgICAgZnVuY3Rpb24gZXhjaGFuZ2VSTChvZmZzZXQsIG1hc2spIHsKCSAgICAgICAgdmFyIHQgPSAoKHRoaXMuX3JCbG9jayA+Pj4gb2Zmc2V0KSBeIHRoaXMuX2xCbG9jaykgJiBtYXNrOwoJICAgICAgICB0aGlzLl9sQmxvY2sgXj0gdDsKCSAgICAgICAgdGhpcy5fckJsb2NrIF49IHQgPDwgb2Zmc2V0OwoJICAgIH0KCgkgICAgLyoqCgkgICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLgoJICAgICAqCgkgICAgICogQGV4YW1wbGUKCSAgICAgKgoJICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLkRFUy5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTsKCSAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5ERVMuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7CgkgICAgICovCgkgICAgQy5ERVMgPSBCbG9ja0NpcGhlci5fY3JlYXRlSGVscGVyKERFUyk7CgoJICAgIC8qKgoJICAgICAqIFRyaXBsZS1ERVMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobS4KCSAgICAgKi8KCSAgICB2YXIgVHJpcGxlREVTID0gQ19hbGdvLlRyaXBsZURFUyA9IEJsb2NrQ2lwaGVyLmV4dGVuZCh7CgkgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXk7CgkgICAgICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7CgkgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGtleSBsZW5ndGggaXMgdmFsaWQgKDY0LCAxMjggb3IgPj0gMTkyIGJpdCkKCSAgICAgICAgICAgIGlmIChrZXlXb3Jkcy5sZW5ndGggIT09IDIgJiYga2V5V29yZHMubGVuZ3RoICE9PSA0ICYmIGtleVdvcmRzLmxlbmd0aCA8IDYpIHsKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5IGxlbmd0aCAtIDNERVMgcmVxdWlyZXMgdGhlIGtleSBsZW5ndGggdG8gYmUgNjQsIDEyOCwgMTkyIG9yID4xOTIuJyk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBrZXkgYWNjb3JkaW5nIHRvIHRoZSBrZXlpbmcgb3B0aW9ucyBkZWZpbmVkIGluIDNERVMgc3RhbmRhcmQKCSAgICAgICAgICAgIHZhciBrZXkxID0ga2V5V29yZHMuc2xpY2UoMCwgMik7CgkgICAgICAgICAgICB2YXIga2V5MiA9IGtleVdvcmRzLmxlbmd0aCA8IDQgPyBrZXlXb3Jkcy5zbGljZSgwLCAyKSA6IGtleVdvcmRzLnNsaWNlKDIsIDQpOwoJICAgICAgICAgICAgdmFyIGtleTMgPSBrZXlXb3Jkcy5sZW5ndGggPCA2ID8ga2V5V29yZHMuc2xpY2UoMCwgMikgOiBrZXlXb3Jkcy5zbGljZSg0LCA2KTsKCgkgICAgICAgICAgICAvLyBDcmVhdGUgREVTIGluc3RhbmNlcwoJICAgICAgICAgICAgdGhpcy5fZGVzMSA9IERFUy5jcmVhdGVFbmNyeXB0b3IoV29yZEFycmF5LmNyZWF0ZShrZXkxKSk7CgkgICAgICAgICAgICB0aGlzLl9kZXMyID0gREVTLmNyZWF0ZUVuY3J5cHRvcihXb3JkQXJyYXkuY3JlYXRlKGtleTIpKTsKCSAgICAgICAgICAgIHRoaXMuX2RlczMgPSBERVMuY3JlYXRlRW5jcnlwdG9yKFdvcmRBcnJheS5jcmVhdGUoa2V5MykpOwoJICAgICAgICB9LAoKCSAgICAgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CgkgICAgICAgICAgICB0aGlzLl9kZXMxLmVuY3J5cHRCbG9jayhNLCBvZmZzZXQpOwoJICAgICAgICAgICAgdGhpcy5fZGVzMi5kZWNyeXB0QmxvY2soTSwgb2Zmc2V0KTsKCSAgICAgICAgICAgIHRoaXMuX2RlczMuZW5jcnlwdEJsb2NrKE0sIG9mZnNldCk7CgkgICAgICAgIH0sCgoJICAgICAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKCSAgICAgICAgICAgIHRoaXMuX2RlczMuZGVjcnlwdEJsb2NrKE0sIG9mZnNldCk7CgkgICAgICAgICAgICB0aGlzLl9kZXMyLmVuY3J5cHRCbG9jayhNLCBvZmZzZXQpOwoJICAgICAgICAgICAgdGhpcy5fZGVzMS5kZWNyeXB0QmxvY2soTSwgb2Zmc2V0KTsKCSAgICAgICAgfSwKCgkgICAgICAgIGtleVNpemU6IDE5Mi8zMiwKCgkgICAgICAgIGl2U2l6ZTogNjQvMzIsCgoJICAgICAgICBibG9ja1NpemU6IDY0LzMyCgkgICAgfSk7CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5UcmlwbGVERVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7CgkgICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpOwoJICAgICAqLwoJICAgIEMuVHJpcGxlREVTID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihUcmlwbGVERVMpOwoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBTdHJlYW1DaXBoZXIgPSBDX2xpYi5TdHJlYW1DaXBoZXI7CgkgICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCgkgICAgLyoqCgkgICAgICogUkM0IHN0cmVhbSBjaXBoZXIgYWxnb3JpdGhtLgoJICAgICAqLwoJICAgIHZhciBSQzQgPSBDX2FsZ28uUkM0ID0gU3RyZWFtQ2lwaGVyLmV4dGVuZCh7CgkgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXk7CgkgICAgICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7CgkgICAgICAgICAgICB2YXIga2V5U2lnQnl0ZXMgPSBrZXkuc2lnQnl0ZXM7CgoJICAgICAgICAgICAgLy8gSW5pdCBzYm94CgkgICAgICAgICAgICB2YXIgUyA9IHRoaXMuX1MgPSBbXTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKCSAgICAgICAgICAgICAgICBTW2ldID0gaTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBLZXkgc2V0dXAKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IDI1NjsgaSsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIGtleUJ5dGVJbmRleCA9IGkgJSBrZXlTaWdCeXRlczsKCSAgICAgICAgICAgICAgICB2YXIga2V5Qnl0ZSA9IChrZXlXb3Jkc1trZXlCeXRlSW5kZXggPj4+IDJdID4+PiAoMjQgLSAoa2V5Qnl0ZUluZGV4ICUgNCkgKiA4KSkgJiAweGZmOwoKCSAgICAgICAgICAgICAgICBqID0gKGogKyBTW2ldICsga2V5Qnl0ZSkgJSAyNTY7CgoJICAgICAgICAgICAgICAgIC8vIFN3YXAKCSAgICAgICAgICAgICAgICB2YXIgdCA9IFNbaV07CgkgICAgICAgICAgICAgICAgU1tpXSA9IFNbal07CgkgICAgICAgICAgICAgICAgU1tqXSA9IHQ7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gQ291bnRlcnMKCSAgICAgICAgICAgIHRoaXMuX2kgPSB0aGlzLl9qID0gMDsKCSAgICAgICAgfSwKCgkgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewoJICAgICAgICAgICAgTVtvZmZzZXRdIF49IGdlbmVyYXRlS2V5c3RyZWFtV29yZC5jYWxsKHRoaXMpOwoJICAgICAgICB9LAoKCSAgICAgICAga2V5U2l6ZTogMjU2LzMyLAoKCSAgICAgICAgaXZTaXplOiAwCgkgICAgfSk7CgoJICAgIGZ1bmN0aW9uIGdlbmVyYXRlS2V5c3RyZWFtV29yZCgpIHsKCSAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgIHZhciBTID0gdGhpcy5fUzsKCSAgICAgICAgdmFyIGkgPSB0aGlzLl9pOwoJICAgICAgICB2YXIgaiA9IHRoaXMuX2o7CgoJICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW0gd29yZAoJICAgICAgICB2YXIga2V5c3RyZWFtV29yZCA9IDA7CgkgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgNDsgbisrKSB7CgkgICAgICAgICAgICBpID0gKGkgKyAxKSAlIDI1NjsKCSAgICAgICAgICAgIGogPSAoaiArIFNbaV0pICUgMjU2OwoKCSAgICAgICAgICAgIC8vIFN3YXAKCSAgICAgICAgICAgIHZhciB0ID0gU1tpXTsKCSAgICAgICAgICAgIFNbaV0gPSBTW2pdOwoJICAgICAgICAgICAgU1tqXSA9IHQ7CgoJICAgICAgICAgICAga2V5c3RyZWFtV29yZCB8PSBTWyhTW2ldICsgU1tqXSkgJSAyNTZdIDw8ICgyNCAtIG4gKiA4KTsKCSAgICAgICAgfQoKCSAgICAgICAgLy8gVXBkYXRlIGNvdW50ZXJzCgkgICAgICAgIHRoaXMuX2kgPSBpOwoJICAgICAgICB0aGlzLl9qID0gajsKCgkgICAgICAgIHJldHVybiBrZXlzdHJlYW1Xb3JkOwoJICAgIH0KCgkgICAgLyoqCgkgICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLgoJICAgICAqCgkgICAgICogQGV4YW1wbGUKCSAgICAgKgoJICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLlJDNC5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTsKCSAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5SQzQuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7CgkgICAgICovCgkgICAgQy5SQzQgPSBTdHJlYW1DaXBoZXIuX2NyZWF0ZUhlbHBlcihSQzQpOwoKCSAgICAvKioKCSAgICAgKiBNb2RpZmllZCBSQzQgc3RyZWFtIGNpcGhlciBhbGdvcml0aG0uCgkgICAgICovCgkgICAgdmFyIFJDNERyb3AgPSBDX2FsZ28uUkM0RHJvcCA9IFJDNC5leHRlbmQoewoJICAgICAgICAvKioKCSAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLgoJICAgICAgICAgKgoJICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gZHJvcCBUaGUgbnVtYmVyIG9mIGtleXN0cmVhbSB3b3JkcyB0byBkcm9wLiBEZWZhdWx0IDE5MgoJICAgICAgICAgKi8KCSAgICAgICAgY2ZnOiBSQzQuY2ZnLmV4dGVuZCh7CgkgICAgICAgICAgICBkcm9wOiAxOTIKCSAgICAgICAgfSksCgoJICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgUkM0Ll9kb1Jlc2V0LmNhbGwodGhpcyk7CgoJICAgICAgICAgICAgLy8gRHJvcAoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuY2ZnLmRyb3A7IGkgPiAwOyBpLS0pIHsKCSAgICAgICAgICAgICAgICBnZW5lcmF0ZUtleXN0cmVhbVdvcmQuY2FsbCh0aGlzKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICoKCSAgICAgKiBAZXhhbXBsZQoJICAgICAqCgkgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuUkM0RHJvcC5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTsKCSAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5SQzREcm9wLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpOwoJICAgICAqLwoJICAgIEMuUkM0RHJvcCA9IFN0cmVhbUNpcGhlci5fY3JlYXRlSGVscGVyKFJDNERyb3ApOwoJfSgpKTsKCgoJLyoqIEBwcmVzZXJ2ZQoJICogQ291bnRlciBibG9jayBtb2RlIGNvbXBhdGlibGUgd2l0aCAgRHIgQnJpYW4gR2xhZG1hbiBmaWxlZW5jLmMKCSAqIGRlcml2ZWQgZnJvbSBDcnlwdG9KUy5tb2RlLkNUUgoJICogSmFuIEhydWJ5IGpocnVieS53ZWJAZ21haWwuY29tCgkgKi8KCUNyeXB0b0pTLm1vZGUuQ1RSR2xhZG1hbiA9IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIENUUkdsYWRtYW4gPSBDcnlwdG9KUy5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpOwoKCQlmdW5jdGlvbiBpbmNXb3JkKHdvcmQpCgkJewoJCQlpZiAoKCh3b3JkID4+IDI0KSAmIDB4ZmYpID09PSAweGZmKSB7IC8vb3ZlcmZsb3cKCQkJdmFyIGIxID0gKHdvcmQgPj4gMTYpJjB4ZmY7CgkJCXZhciBiMiA9ICh3b3JkID4+IDgpJjB4ZmY7CgkJCXZhciBiMyA9IHdvcmQgJiAweGZmOwoKCQkJaWYgKGIxID09PSAweGZmKSAvLyBvdmVyZmxvdyBiMQoJCQl7CgkJCWIxID0gMDsKCQkJaWYgKGIyID09PSAweGZmKQoJCQl7CgkJCQliMiA9IDA7CgkJCQlpZiAoYjMgPT09IDB4ZmYpCgkJCQl7CgkJCQkJYjMgPSAwOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSsrYjM7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkrK2IyOwoJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCSsrYjE7CgkJCX0KCgkJCXdvcmQgPSAwOwoJCQl3b3JkICs9IChiMSA8PCAxNik7CgkJCXdvcmQgKz0gKGIyIDw8IDgpOwoJCQl3b3JkICs9IGIzOwoJCQl9CgkJCWVsc2UKCQkJewoJCQl3b3JkICs9ICgweDAxIDw8IDI0KTsKCQkJfQoJCQlyZXR1cm4gd29yZDsKCQl9CgoJCWZ1bmN0aW9uIGluY0NvdW50ZXIoY291bnRlcikKCQl7CgkJCWlmICgoY291bnRlclswXSA9IGluY1dvcmQoY291bnRlclswXSkpID09PSAwKQoJCQl7CgkJCQkvLyBlbmNyX2RhdGEgaW4gZmlsZWVuYy5jIGZyb20gIERyIEJyaWFuIEdsYWRtYW4ncyBjb3VudHMgb25seSB3aXRoIERXT1JEIGogPCA4CgkJCQljb3VudGVyWzFdID0gaW5jV29yZChjb3VudGVyWzFdKTsKCQkJfQoJCQlyZXR1cm4gY291bnRlcjsKCQl9CgoJICAgIHZhciBFbmNyeXB0b3IgPSBDVFJHbGFkbWFuLkVuY3J5cHRvciA9IENUUkdsYWRtYW4uZXh0ZW5kKHsKCSAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyCgkgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTsKCSAgICAgICAgICAgIHZhciBpdiA9IHRoaXMuX2l2OwoJICAgICAgICAgICAgdmFyIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyOwoKCSAgICAgICAgICAgIC8vIEdlbmVyYXRlIGtleXN0cmVhbQoJICAgICAgICAgICAgaWYgKGl2KSB7CgkgICAgICAgICAgICAgICAgY291bnRlciA9IHRoaXMuX2NvdW50ZXIgPSBpdi5zbGljZSgwKTsKCgkgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2NrcwoJICAgICAgICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkOwoJICAgICAgICAgICAgfQoKCQkJCWluY0NvdW50ZXIoY291bnRlcik7CgoJCQkJdmFyIGtleXN0cmVhbSA9IGNvdW50ZXIuc2xpY2UoMCk7CgkgICAgICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKGtleXN0cmVhbSwgMCk7CgoJICAgICAgICAgICAgLy8gRW5jcnlwdAoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewoJICAgICAgICAgICAgICAgIHdvcmRzW29mZnNldCArIGldIF49IGtleXN0cmVhbVtpXTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICBDVFJHbGFkbWFuLkRlY3J5cHRvciA9IEVuY3J5cHRvcjsKCgkgICAgcmV0dXJuIENUUkdsYWRtYW47Cgl9KCkpOwoKCgoKCShmdW5jdGlvbiAoKSB7CgkgICAgLy8gU2hvcnRjdXRzCgkgICAgdmFyIEMgPSBDcnlwdG9KUzsKCSAgICB2YXIgQ19saWIgPSBDLmxpYjsKCSAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyOwoJICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgoJICAgIC8vIFJldXNhYmxlIG9iamVjdHMKCSAgICB2YXIgUyAgPSBbXTsKCSAgICB2YXIgQ18gPSBbXTsKCSAgICB2YXIgRyAgPSBbXTsKCgkgICAgLyoqCgkgICAgICogUmFiYml0IHN0cmVhbSBjaXBoZXIgYWxnb3JpdGhtCgkgICAgICovCgkgICAgdmFyIFJhYmJpdCA9IENfYWxnby5SYWJiaXQgPSBTdHJlYW1DaXBoZXIuZXh0ZW5kKHsKCSAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgdmFyIEsgPSB0aGlzLl9rZXkud29yZHM7CgkgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLmNmZy5pdjsKCgkgICAgICAgICAgICAvLyBTd2FwIGVuZGlhbgoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKCSAgICAgICAgICAgICAgICBLW2ldID0gKCgoS1tpXSA8PCA4KSAgfCAoS1tpXSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHwKCSAgICAgICAgICAgICAgICAgICAgICAgKCgoS1tpXSA8PCAyNCkgfCAoS1tpXSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIEdlbmVyYXRlIGluaXRpYWwgc3RhdGUgdmFsdWVzCgkgICAgICAgICAgICB2YXIgWCA9IHRoaXMuX1ggPSBbCgkgICAgICAgICAgICAgICAgS1swXSwgKEtbM10gPDwgMTYpIHwgKEtbMl0gPj4+IDE2KSwKCSAgICAgICAgICAgICAgICBLWzFdLCAoS1swXSA8PCAxNikgfCAoS1szXSA+Pj4gMTYpLAoJICAgICAgICAgICAgICAgIEtbMl0sIChLWzFdIDw8IDE2KSB8IChLWzBdID4+PiAxNiksCgkgICAgICAgICAgICAgICAgS1szXSwgKEtbMl0gPDwgMTYpIHwgKEtbMV0gPj4+IDE2KQoJICAgICAgICAgICAgXTsKCgkgICAgICAgICAgICAvLyBHZW5lcmF0ZSBpbml0aWFsIGNvdW50ZXIgdmFsdWVzCgkgICAgICAgICAgICB2YXIgQyA9IHRoaXMuX0MgPSBbCgkgICAgICAgICAgICAgICAgKEtbMl0gPDwgMTYpIHwgKEtbMl0gPj4+IDE2KSwgKEtbMF0gJiAweGZmZmYwMDAwKSB8IChLWzFdICYgMHgwMDAwZmZmZiksCgkgICAgICAgICAgICAgICAgKEtbM10gPDwgMTYpIHwgKEtbM10gPj4+IDE2KSwgKEtbMV0gJiAweGZmZmYwMDAwKSB8IChLWzJdICYgMHgwMDAwZmZmZiksCgkgICAgICAgICAgICAgICAgKEtbMF0gPDwgMTYpIHwgKEtbMF0gPj4+IDE2KSwgKEtbMl0gJiAweGZmZmYwMDAwKSB8IChLWzNdICYgMHgwMDAwZmZmZiksCgkgICAgICAgICAgICAgICAgKEtbMV0gPDwgMTYpIHwgKEtbMV0gPj4+IDE2KSwgKEtbM10gJiAweGZmZmYwMDAwKSB8IChLWzBdICYgMHgwMDAwZmZmZikKCSAgICAgICAgICAgIF07CgoJICAgICAgICAgICAgLy8gQ2FycnkgYml0CgkgICAgICAgICAgICB0aGlzLl9iID0gMDsKCgkgICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0gZm91ciB0aW1lcwoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKCSAgICAgICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBNb2RpZnkgdGhlIGNvdW50ZXJzCgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewoJICAgICAgICAgICAgICAgIENbaV0gXj0gWFsoaSArIDQpICYgN107CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgLy8gSVYgc2V0dXAKCSAgICAgICAgICAgIGlmIChpdikgewoJICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICAgICAgICAgIHZhciBJViA9IGl2LndvcmRzOwoJICAgICAgICAgICAgICAgIHZhciBJVl8wID0gSVZbMF07CgkgICAgICAgICAgICAgICAgdmFyIElWXzEgPSBJVlsxXTsKCgkgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgZm91ciBzdWJ2ZWN0b3JzCgkgICAgICAgICAgICAgICAgdmFyIGkwID0gKCgoSVZfMCA8PCA4KSB8IChJVl8wID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfCAoKChJVl8wIDw8IDI0KSB8IChJVl8wID4+PiA4KSkgJiAweGZmMDBmZjAwKTsKCSAgICAgICAgICAgICAgICB2YXIgaTIgPSAoKChJVl8xIDw8IDgpIHwgKElWXzEgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8ICgoKElWXzEgPDwgMjQpIHwgKElWXzEgPj4+IDgpKSAmIDB4ZmYwMGZmMDApOwoJICAgICAgICAgICAgICAgIHZhciBpMSA9IChpMCA+Pj4gMTYpIHwgKGkyICYgMHhmZmZmMDAwMCk7CgkgICAgICAgICAgICAgICAgdmFyIGkzID0gKGkyIDw8IDE2KSAgfCAoaTAgJiAweDAwMDBmZmZmKTsKCgkgICAgICAgICAgICAgICAgLy8gTW9kaWZ5IGNvdW50ZXIgdmFsdWVzCgkgICAgICAgICAgICAgICAgQ1swXSBePSBpMDsKCSAgICAgICAgICAgICAgICBDWzFdIF49IGkxOwoJICAgICAgICAgICAgICAgIENbMl0gXj0gaTI7CgkgICAgICAgICAgICAgICAgQ1szXSBePSBpMzsKCSAgICAgICAgICAgICAgICBDWzRdIF49IGkwOwoJICAgICAgICAgICAgICAgIENbNV0gXj0gaTE7CgkgICAgICAgICAgICAgICAgQ1s2XSBePSBpMjsKCSAgICAgICAgICAgICAgICBDWzddIF49IGkzOwoKCSAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0gZm91ciB0aW1lcwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZS5jYWxsKHRoaXMpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCgkgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewoJICAgICAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgICAgIHZhciBYID0gdGhpcy5fWDsKCgkgICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0KCSAgICAgICAgICAgIG5leHRTdGF0ZS5jYWxsKHRoaXMpOwoKCSAgICAgICAgICAgIC8vIEdlbmVyYXRlIGZvdXIga2V5c3RyZWFtIHdvcmRzCgkgICAgICAgICAgICBTWzBdID0gWFswXSBeIChYWzVdID4+PiAxNikgXiAoWFszXSA8PCAxNik7CgkgICAgICAgICAgICBTWzFdID0gWFsyXSBeIChYWzddID4+PiAxNikgXiAoWFs1XSA8PCAxNik7CgkgICAgICAgICAgICBTWzJdID0gWFs0XSBeIChYWzFdID4+PiAxNikgXiAoWFs3XSA8PCAxNik7CgkgICAgICAgICAgICBTWzNdID0gWFs2XSBeIChYWzNdID4+PiAxNikgXiAoWFsxXSA8PCAxNik7CgoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKCSAgICAgICAgICAgICAgICAvLyBTd2FwIGVuZGlhbgoJICAgICAgICAgICAgICAgIFNbaV0gPSAoKChTW2ldIDw8IDgpICB8IChTW2ldID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfAoJICAgICAgICAgICAgICAgICAgICAgICAoKChTW2ldIDw8IDI0KSB8IChTW2ldID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7CgoJICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQKCSAgICAgICAgICAgICAgICBNW29mZnNldCArIGldIF49IFNbaV07CgkgICAgICAgICAgICB9CgkgICAgICAgIH0sCgoJICAgICAgICBibG9ja1NpemU6IDEyOC8zMiwKCgkgICAgICAgIGl2U2l6ZTogNjQvMzIKCSAgICB9KTsKCgkgICAgZnVuY3Rpb24gbmV4dFN0YXRlKCkgewoJICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgdmFyIFggPSB0aGlzLl9YOwoJICAgICAgICB2YXIgQyA9IHRoaXMuX0M7CgoJICAgICAgICAvLyBTYXZlIG9sZCBjb3VudGVyIHZhbHVlcwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewoJICAgICAgICAgICAgQ19baV0gPSBDW2ldOwoJICAgICAgICB9CgoJICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IGNvdW50ZXIgdmFsdWVzCgkgICAgICAgIENbMF0gPSAoQ1swXSArIDB4NGQzNGQzNGQgKyB0aGlzLl9iKSB8IDA7CgkgICAgICAgIENbMV0gPSAoQ1sxXSArIDB4ZDM0ZDM0ZDMgKyAoKENbMF0gPj4+IDApIDwgKENfWzBdID4+PiAwKSA/IDEgOiAwKSkgfCAwOwoJICAgICAgICBDWzJdID0gKENbMl0gKyAweDM0ZDM0ZDM0ICsgKChDWzFdID4+PiAwKSA8IChDX1sxXSA+Pj4gMCkgPyAxIDogMCkpIHwgMDsKCSAgICAgICAgQ1szXSA9IChDWzNdICsgMHg0ZDM0ZDM0ZCArICgoQ1syXSA+Pj4gMCkgPCAoQ19bMl0gPj4+IDApID8gMSA6IDApKSB8IDA7CgkgICAgICAgIENbNF0gPSAoQ1s0XSArIDB4ZDM0ZDM0ZDMgKyAoKENbM10gPj4+IDApIDwgKENfWzNdID4+PiAwKSA/IDEgOiAwKSkgfCAwOwoJICAgICAgICBDWzVdID0gKENbNV0gKyAweDM0ZDM0ZDM0ICsgKChDWzRdID4+PiAwKSA8IChDX1s0XSA+Pj4gMCkgPyAxIDogMCkpIHwgMDsKCSAgICAgICAgQ1s2XSA9IChDWzZdICsgMHg0ZDM0ZDM0ZCArICgoQ1s1XSA+Pj4gMCkgPCAoQ19bNV0gPj4+IDApID8gMSA6IDApKSB8IDA7CgkgICAgICAgIENbN10gPSAoQ1s3XSArIDB4ZDM0ZDM0ZDMgKyAoKENbNl0gPj4+IDApIDwgKENfWzZdID4+PiAwKSA/IDEgOiAwKSkgfCAwOwoJICAgICAgICB0aGlzLl9iID0gKENbN10gPj4+IDApIDwgKENfWzddID4+PiAwKSA/IDEgOiAwOwoKCSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBnLXZhbHVlcwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewoJICAgICAgICAgICAgdmFyIGd4ID0gWFtpXSArIENbaV07CgoJICAgICAgICAgICAgLy8gQ29uc3RydWN0IGhpZ2ggYW5kIGxvdyBhcmd1bWVudCBmb3Igc3F1YXJpbmcKCSAgICAgICAgICAgIHZhciBnYSA9IGd4ICYgMHhmZmZmOwoJICAgICAgICAgICAgdmFyIGdiID0gZ3ggPj4+IDE2OwoKCSAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBoaWdoIGFuZCBsb3cgcmVzdWx0IG9mIHNxdWFyaW5nCgkgICAgICAgICAgICB2YXIgZ2ggPSAoKCgoZ2EgKiBnYSkgPj4+IDE3KSArIGdhICogZ2IpID4+PiAxNSkgKyBnYiAqIGdiOwoJICAgICAgICAgICAgdmFyIGdsID0gKCgoZ3ggJiAweGZmZmYwMDAwKSAqIGd4KSB8IDApICsgKCgoZ3ggJiAweDAwMDBmZmZmKSAqIGd4KSB8IDApOwoKCSAgICAgICAgICAgIC8vIEhpZ2ggWE9SIGxvdwoJICAgICAgICAgICAgR1tpXSA9IGdoIF4gZ2w7CgkgICAgICAgIH0KCgkgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc3RhdGUgdmFsdWVzCgkgICAgICAgIFhbMF0gPSAoR1swXSArICgoR1s3XSA8PCAxNikgfCAoR1s3XSA+Pj4gMTYpKSArICgoR1s2XSA8PCAxNikgfCAoR1s2XSA+Pj4gMTYpKSkgfCAwOwoJICAgICAgICBYWzFdID0gKEdbMV0gKyAoKEdbMF0gPDwgOCkgIHwgKEdbMF0gPj4+IDI0KSkgKyBHWzddKSB8IDA7CgkgICAgICAgIFhbMl0gPSAoR1syXSArICgoR1sxXSA8PCAxNikgfCAoR1sxXSA+Pj4gMTYpKSArICgoR1swXSA8PCAxNikgfCAoR1swXSA+Pj4gMTYpKSkgfCAwOwoJICAgICAgICBYWzNdID0gKEdbM10gKyAoKEdbMl0gPDwgOCkgIHwgKEdbMl0gPj4+IDI0KSkgKyBHWzFdKSB8IDA7CgkgICAgICAgIFhbNF0gPSAoR1s0XSArICgoR1szXSA8PCAxNikgfCAoR1szXSA+Pj4gMTYpKSArICgoR1syXSA8PCAxNikgfCAoR1syXSA+Pj4gMTYpKSkgfCAwOwoJICAgICAgICBYWzVdID0gKEdbNV0gKyAoKEdbNF0gPDwgOCkgIHwgKEdbNF0gPj4+IDI0KSkgKyBHWzNdKSB8IDA7CgkgICAgICAgIFhbNl0gPSAoR1s2XSArICgoR1s1XSA8PCAxNikgfCAoR1s1XSA+Pj4gMTYpKSArICgoR1s0XSA8PCAxNikgfCAoR1s0XSA+Pj4gMTYpKSkgfCAwOwoJICAgICAgICBYWzddID0gKEdbN10gKyAoKEdbNl0gPDwgOCkgIHwgKEdbNl0gPj4+IDI0KSkgKyBHWzVdKSB8IDA7CgkgICAgfQoKCSAgICAvKioKCSAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuCgkgICAgICoKCSAgICAgKiBAZXhhbXBsZQoJICAgICAqCgkgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuUmFiYml0LmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpOwoJICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLlJhYmJpdC5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTsKCSAgICAgKi8KCSAgICBDLlJhYmJpdCA9IFN0cmVhbUNpcGhlci5fY3JlYXRlSGVscGVyKFJhYmJpdCk7Cgl9KCkpOwoKCgkvKioKCSAqIENvdW50ZXIgYmxvY2sgbW9kZS4KCSAqLwoJQ3J5cHRvSlMubW9kZS5DVFIgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBDVFIgPSBDcnlwdG9KUy5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpOwoKCSAgICB2YXIgRW5jcnlwdG9yID0gQ1RSLkVuY3J5cHRvciA9IENUUi5leHRlbmQoewoJICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXIKCSAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplOwoJICAgICAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7CgkgICAgICAgICAgICB2YXIgY291bnRlciA9IHRoaXMuX2NvdW50ZXI7CgoJICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5c3RyZWFtCgkgICAgICAgICAgICBpZiAoaXYpIHsKCSAgICAgICAgICAgICAgICBjb3VudGVyID0gdGhpcy5fY291bnRlciA9IGl2LnNsaWNlKDApOwoKCSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgSVYgZm9yIHN1YnNlcXVlbnQgYmxvY2tzCgkgICAgICAgICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB2YXIga2V5c3RyZWFtID0gY291bnRlci5zbGljZSgwKTsKCSAgICAgICAgICAgIGNpcGhlci5lbmNyeXB0QmxvY2soa2V5c3RyZWFtLCAwKTsKCgkgICAgICAgICAgICAvLyBJbmNyZW1lbnQgY291bnRlcgoJICAgICAgICAgICAgY291bnRlcltibG9ja1NpemUgLSAxXSA9IChjb3VudGVyW2Jsb2NrU2l6ZSAtIDFdICsgMSkgfCAwCgoJICAgICAgICAgICAgLy8gRW5jcnlwdAoJICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewoJICAgICAgICAgICAgICAgIHdvcmRzW29mZnNldCArIGldIF49IGtleXN0cmVhbVtpXTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgIH0pOwoKCSAgICBDVFIuRGVjcnlwdG9yID0gRW5jcnlwdG9yOwoKCSAgICByZXR1cm4gQ1RSOwoJfSgpKTsKCgoJKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBTaG9ydGN1dHMKCSAgICB2YXIgQyA9IENyeXB0b0pTOwoJICAgIHZhciBDX2xpYiA9IEMubGliOwoJICAgIHZhciBTdHJlYW1DaXBoZXIgPSBDX2xpYi5TdHJlYW1DaXBoZXI7CgkgICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCgkgICAgLy8gUmV1c2FibGUgb2JqZWN0cwoJICAgIHZhciBTICA9IFtdOwoJICAgIHZhciBDXyA9IFtdOwoJICAgIHZhciBHICA9IFtdOwoKCSAgICAvKioKCSAgICAgKiBSYWJiaXQgc3RyZWFtIGNpcGhlciBhbGdvcml0aG0uCgkgICAgICoKCSAgICAgKiBUaGlzIGlzIGEgbGVnYWN5IHZlcnNpb24gdGhhdCBuZWdsZWN0ZWQgdG8gY29udmVydCB0aGUga2V5IHRvIGxpdHRsZS1lbmRpYW4uCgkgICAgICogVGhpcyBlcnJvciBkb2Vzbid0IGFmZmVjdCB0aGUgY2lwaGVyJ3Mgc2VjdXJpdHksCgkgICAgICogYnV0IGl0IGRvZXMgYWZmZWN0IGl0cyBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zLgoJICAgICAqLwoJICAgIHZhciBSYWJiaXRMZWdhY3kgPSBDX2FsZ28uUmFiYml0TGVnYWN5ID0gU3RyZWFtQ2lwaGVyLmV4dGVuZCh7CgkgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dHMKCSAgICAgICAgICAgIHZhciBLID0gdGhpcy5fa2V5LndvcmRzOwoJICAgICAgICAgICAgdmFyIGl2ID0gdGhpcy5jZmcuaXY7CgoJICAgICAgICAgICAgLy8gR2VuZXJhdGUgaW5pdGlhbCBzdGF0ZSB2YWx1ZXMKCSAgICAgICAgICAgIHZhciBYID0gdGhpcy5fWCA9IFsKCSAgICAgICAgICAgICAgICBLWzBdLCAoS1szXSA8PCAxNikgfCAoS1syXSA+Pj4gMTYpLAoJICAgICAgICAgICAgICAgIEtbMV0sIChLWzBdIDw8IDE2KSB8IChLWzNdID4+PiAxNiksCgkgICAgICAgICAgICAgICAgS1syXSwgKEtbMV0gPDwgMTYpIHwgKEtbMF0gPj4+IDE2KSwKCSAgICAgICAgICAgICAgICBLWzNdLCAoS1syXSA8PCAxNikgfCAoS1sxXSA+Pj4gMTYpCgkgICAgICAgICAgICBdOwoKCSAgICAgICAgICAgIC8vIEdlbmVyYXRlIGluaXRpYWwgY291bnRlciB2YWx1ZXMKCSAgICAgICAgICAgIHZhciBDID0gdGhpcy5fQyA9IFsKCSAgICAgICAgICAgICAgICAoS1syXSA8PCAxNikgfCAoS1syXSA+Pj4gMTYpLCAoS1swXSAmIDB4ZmZmZjAwMDApIHwgKEtbMV0gJiAweDAwMDBmZmZmKSwKCSAgICAgICAgICAgICAgICAoS1szXSA8PCAxNikgfCAoS1szXSA+Pj4gMTYpLCAoS1sxXSAmIDB4ZmZmZjAwMDApIHwgKEtbMl0gJiAweDAwMDBmZmZmKSwKCSAgICAgICAgICAgICAgICAoS1swXSA8PCAxNikgfCAoS1swXSA+Pj4gMTYpLCAoS1syXSAmIDB4ZmZmZjAwMDApIHwgKEtbM10gJiAweDAwMDBmZmZmKSwKCSAgICAgICAgICAgICAgICAoS1sxXSA8PCAxNikgfCAoS1sxXSA+Pj4gMTYpLCAoS1szXSAmIDB4ZmZmZjAwMDApIHwgKEtbMF0gJiAweDAwMDBmZmZmKQoJICAgICAgICAgICAgXTsKCgkgICAgICAgICAgICAvLyBDYXJyeSBiaXQKCSAgICAgICAgICAgIHRoaXMuX2IgPSAwOwoKCSAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbSBmb3VyIHRpbWVzCgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewoJICAgICAgICAgICAgICAgIG5leHRTdGF0ZS5jYWxsKHRoaXMpOwoJICAgICAgICAgICAgfQoKCSAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgY291bnRlcnMKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7CgkgICAgICAgICAgICAgICAgQ1tpXSBePSBYWyhpICsgNCkgJiA3XTsKCSAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAvLyBJViBzZXR1cAoJICAgICAgICAgICAgaWYgKGl2KSB7CgkgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzCgkgICAgICAgICAgICAgICAgdmFyIElWID0gaXYud29yZHM7CgkgICAgICAgICAgICAgICAgdmFyIElWXzAgPSBJVlswXTsKCSAgICAgICAgICAgICAgICB2YXIgSVZfMSA9IElWWzFdOwoKCSAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBmb3VyIHN1YnZlY3RvcnMKCSAgICAgICAgICAgICAgICB2YXIgaTAgPSAoKChJVl8wIDw8IDgpIHwgKElWXzAgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8ICgoKElWXzAgPDwgMjQpIHwgKElWXzAgPj4+IDgpKSAmIDB4ZmYwMGZmMDApOwoJICAgICAgICAgICAgICAgIHZhciBpMiA9ICgoKElWXzEgPDwgOCkgfCAoSVZfMSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHwgKCgoSVZfMSA8PCAyNCkgfCAoSVZfMSA+Pj4gOCkpICYgMHhmZjAwZmYwMCk7CgkgICAgICAgICAgICAgICAgdmFyIGkxID0gKGkwID4+PiAxNikgfCAoaTIgJiAweGZmZmYwMDAwKTsKCSAgICAgICAgICAgICAgICB2YXIgaTMgPSAoaTIgPDwgMTYpICB8IChpMCAmIDB4MDAwMGZmZmYpOwoKCSAgICAgICAgICAgICAgICAvLyBNb2RpZnkgY291bnRlciB2YWx1ZXMKCSAgICAgICAgICAgICAgICBDWzBdIF49IGkwOwoJICAgICAgICAgICAgICAgIENbMV0gXj0gaTE7CgkgICAgICAgICAgICAgICAgQ1syXSBePSBpMjsKCSAgICAgICAgICAgICAgICBDWzNdIF49IGkzOwoJICAgICAgICAgICAgICAgIENbNF0gXj0gaTA7CgkgICAgICAgICAgICAgICAgQ1s1XSBePSBpMTsKCSAgICAgICAgICAgICAgICBDWzZdIF49IGkyOwoJICAgICAgICAgICAgICAgIENbN10gXj0gaTM7CgoJICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbSBmb3VyIHRpbWVzCgkgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9LAoKCSAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CgkgICAgICAgICAgICAvLyBTaG9ydGN1dAoJICAgICAgICAgICAgdmFyIFggPSB0aGlzLl9YOwoKCSAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbQoJICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7CgoJICAgICAgICAgICAgLy8gR2VuZXJhdGUgZm91ciBrZXlzdHJlYW0gd29yZHMKCSAgICAgICAgICAgIFNbMF0gPSBYWzBdIF4gKFhbNV0gPj4+IDE2KSBeIChYWzNdIDw8IDE2KTsKCSAgICAgICAgICAgIFNbMV0gPSBYWzJdIF4gKFhbN10gPj4+IDE2KSBeIChYWzVdIDw8IDE2KTsKCSAgICAgICAgICAgIFNbMl0gPSBYWzRdIF4gKFhbMV0gPj4+IDE2KSBeIChYWzddIDw8IDE2KTsKCSAgICAgICAgICAgIFNbM10gPSBYWzZdIF4gKFhbM10gPj4+IDE2KSBeIChYWzFdIDw8IDE2KTsKCgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewoJICAgICAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuCgkgICAgICAgICAgICAgICAgU1tpXSA9ICgoKFNbaV0gPDwgOCkgIHwgKFNbaV0gPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8CgkgICAgICAgICAgICAgICAgICAgICAgICgoKFNbaV0gPDwgMjQpIHwgKFNbaV0gPj4+IDgpKSAgJiAweGZmMDBmZjAwKTsKCgkgICAgICAgICAgICAgICAgLy8gRW5jcnlwdAoJICAgICAgICAgICAgICAgIE1bb2Zmc2V0ICsgaV0gXj0gU1tpXTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCgkgICAgICAgIGJsb2NrU2l6ZTogMTI4LzMyLAoKCSAgICAgICAgaXZTaXplOiA2NC8zMgoJICAgIH0pOwoKCSAgICBmdW5jdGlvbiBuZXh0U3RhdGUoKSB7CgkgICAgICAgIC8vIFNob3J0Y3V0cwoJICAgICAgICB2YXIgWCA9IHRoaXMuX1g7CgkgICAgICAgIHZhciBDID0gdGhpcy5fQzsKCgkgICAgICAgIC8vIFNhdmUgb2xkIGNvdW50ZXIgdmFsdWVzCgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7CgkgICAgICAgICAgICBDX1tpXSA9IENbaV07CgkgICAgICAgIH0KCgkgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgY291bnRlciB2YWx1ZXMKCSAgICAgICAgQ1swXSA9IChDWzBdICsgMHg0ZDM0ZDM0ZCArIHRoaXMuX2IpIHwgMDsKCSAgICAgICAgQ1sxXSA9IChDWzFdICsgMHhkMzRkMzRkMyArICgoQ1swXSA+Pj4gMCkgPCAoQ19bMF0gPj4+IDApID8gMSA6IDApKSB8IDA7CgkgICAgICAgIENbMl0gPSAoQ1syXSArIDB4MzRkMzRkMzQgKyAoKENbMV0gPj4+IDApIDwgKENfWzFdID4+PiAwKSA/IDEgOiAwKSkgfCAwOwoJICAgICAgICBDWzNdID0gKENbM10gKyAweDRkMzRkMzRkICsgKChDWzJdID4+PiAwKSA8IChDX1syXSA+Pj4gMCkgPyAxIDogMCkpIHwgMDsKCSAgICAgICAgQ1s0XSA9IChDWzRdICsgMHhkMzRkMzRkMyArICgoQ1szXSA+Pj4gMCkgPCAoQ19bM10gPj4+IDApID8gMSA6IDApKSB8IDA7CgkgICAgICAgIENbNV0gPSAoQ1s1XSArIDB4MzRkMzRkMzQgKyAoKENbNF0gPj4+IDApIDwgKENfWzRdID4+PiAwKSA/IDEgOiAwKSkgfCAwOwoJICAgICAgICBDWzZdID0gKENbNl0gKyAweDRkMzRkMzRkICsgKChDWzVdID4+PiAwKSA8IChDX1s1XSA+Pj4gMCkgPyAxIDogMCkpIHwgMDsKCSAgICAgICAgQ1s3XSA9IChDWzddICsgMHhkMzRkMzRkMyArICgoQ1s2XSA+Pj4gMCkgPCAoQ19bNl0gPj4+IDApID8gMSA6IDApKSB8IDA7CgkgICAgICAgIHRoaXMuX2IgPSAoQ1s3XSA+Pj4gMCkgPCAoQ19bN10gPj4+IDApID8gMSA6IDA7CgoJICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGctdmFsdWVzCgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgZ3ggPSBYW2ldICsgQ1tpXTsKCgkgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgaGlnaCBhbmQgbG93IGFyZ3VtZW50IGZvciBzcXVhcmluZwoJICAgICAgICAgICAgdmFyIGdhID0gZ3ggJiAweGZmZmY7CgkgICAgICAgICAgICB2YXIgZ2IgPSBneCA+Pj4gMTY7CgoJICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhpZ2ggYW5kIGxvdyByZXN1bHQgb2Ygc3F1YXJpbmcKCSAgICAgICAgICAgIHZhciBnaCA9ICgoKChnYSAqIGdhKSA+Pj4gMTcpICsgZ2EgKiBnYikgPj4+IDE1KSArIGdiICogZ2I7CgkgICAgICAgICAgICB2YXIgZ2wgPSAoKChneCAmIDB4ZmZmZjAwMDApICogZ3gpIHwgMCkgKyAoKChneCAmIDB4MDAwMGZmZmYpICogZ3gpIHwgMCk7CgoJICAgICAgICAgICAgLy8gSGlnaCBYT1IgbG93CgkgICAgICAgICAgICBHW2ldID0gZ2ggXiBnbDsKCSAgICAgICAgfQoKCSAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzdGF0ZSB2YWx1ZXMKCSAgICAgICAgWFswXSA9IChHWzBdICsgKChHWzddIDw8IDE2KSB8IChHWzddID4+PiAxNikpICsgKChHWzZdIDw8IDE2KSB8IChHWzZdID4+PiAxNikpKSB8IDA7CgkgICAgICAgIFhbMV0gPSAoR1sxXSArICgoR1swXSA8PCA4KSAgfCAoR1swXSA+Pj4gMjQpKSArIEdbN10pIHwgMDsKCSAgICAgICAgWFsyXSA9IChHWzJdICsgKChHWzFdIDw8IDE2KSB8IChHWzFdID4+PiAxNikpICsgKChHWzBdIDw8IDE2KSB8IChHWzBdID4+PiAxNikpKSB8IDA7CgkgICAgICAgIFhbM10gPSAoR1szXSArICgoR1syXSA8PCA4KSAgfCAoR1syXSA+Pj4gMjQpKSArIEdbMV0pIHwgMDsKCSAgICAgICAgWFs0XSA9IChHWzRdICsgKChHWzNdIDw8IDE2KSB8IChHWzNdID4+PiAxNikpICsgKChHWzJdIDw8IDE2KSB8IChHWzJdID4+PiAxNikpKSB8IDA7CgkgICAgICAgIFhbNV0gPSAoR1s1XSArICgoR1s0XSA8PCA4KSAgfCAoR1s0XSA+Pj4gMjQpKSArIEdbM10pIHwgMDsKCSAgICAgICAgWFs2XSA9IChHWzZdICsgKChHWzVdIDw8IDE2KSB8IChHWzVdID4+PiAxNikpICsgKChHWzRdIDw8IDE2KSB8IChHWzRdID4+PiAxNikpKSB8IDA7CgkgICAgICAgIFhbN10gPSAoR1s3XSArICgoR1s2XSA8PCA4KSAgfCAoR1s2XSA+Pj4gMjQpKSArIEdbNV0pIHwgMDsKCSAgICB9CgoJICAgIC8qKgoJICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4KCSAgICAgKgoJICAgICAqIEBleGFtcGxlCgkgICAgICoKCSAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5SYWJiaXRMZWdhY3kuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7CgkgICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuUmFiYml0TGVnYWN5LmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpOwoJICAgICAqLwoJICAgIEMuUmFiYml0TGVnYWN5ID0gU3RyZWFtQ2lwaGVyLl9jcmVhdGVIZWxwZXIoUmFiYml0TGVnYWN5KTsKCX0oKSk7CgoKCS8qKgoJICogWmVybyBwYWRkaW5nIHN0cmF0ZWd5LgoJICovCglDcnlwdG9KUy5wYWQuWmVyb1BhZGRpbmcgPSB7CgkgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7CgkgICAgICAgIC8vIFNob3J0Y3V0CgkgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7CgoJICAgICAgICAvLyBQYWQKCSAgICAgICAgZGF0YS5jbGFtcCgpOwoJICAgICAgICBkYXRhLnNpZ0J5dGVzICs9IGJsb2NrU2l6ZUJ5dGVzIC0gKChkYXRhLnNpZ0J5dGVzICUgYmxvY2tTaXplQnl0ZXMpIHx8IGJsb2NrU2l6ZUJ5dGVzKTsKCSAgICB9LAoKCSAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHsKCSAgICAgICAgLy8gU2hvcnRjdXQKCSAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7CgoJICAgICAgICAvLyBVbnBhZAoJICAgICAgICB2YXIgaSA9IGRhdGEuc2lnQnl0ZXMgLSAxOwoJICAgICAgICBmb3IgKHZhciBpID0gZGF0YS5zaWdCeXRlcyAtIDE7IGkgPj0gMDsgaS0tKSB7CgkgICAgICAgICAgICBpZiAoKChkYXRhV29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmKSkgewoJICAgICAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBpICsgMTsKCSAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgIH0KCX07CgoKCXJldHVybiBDcnlwdG9KUzsKCn0pKTs="},{"meta":{"name":"FileSaver.min.js","url":"https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js","ts":1637743664285,"mimetype":"text/javascript"},"source":"KGZ1bmN0aW9uKGEsYil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYik7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHMpYigpO2Vsc2V7YigpLGEuRmlsZVNhdmVyPXtleHBvcnRzOnt9fS5leHBvcnRzfX0pKHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihhLGIpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYj9iPXthdXRvQm9tOiExfToib2JqZWN0IiE9dHlwZW9mIGImJihjb25zb2xlLndhcm4oIkRlcHJlY2F0ZWQ6IEV4cGVjdGVkIHRoaXJkIGFyZ3VtZW50IHRvIGJlIGEgb2JqZWN0IiksYj17YXV0b0JvbTohYn0pLGIuYXV0b0JvbSYmL15ccyooPzp0ZXh0XC9cUyp8YXBwbGljYXRpb25cL3htbHxcUypcL1xTKlwreG1sKVxzKjsuKmNoYXJzZXRccyo9XHMqdXRmLTgvaS50ZXN0KGEudHlwZSk/bmV3IEJsb2IoWyJcdUZFRkYiLGFdLHt0eXBlOmEudHlwZX0pOmF9ZnVuY3Rpb24gYyhhLGIsYyl7dmFyIGQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2Qub3BlbigiR0VUIixhKSxkLnJlc3BvbnNlVHlwZT0iYmxvYiIsZC5vbmxvYWQ9ZnVuY3Rpb24oKXtnKGQucmVzcG9uc2UsYixjKX0sZC5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiY291bGQgbm90IGRvd25sb2FkIGZpbGUiKX0sZC5zZW5kKCl9ZnVuY3Rpb24gZChhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5vcGVuKCJIRUFEIixhLCExKTt0cnl7Yi5zZW5kKCl9Y2F0Y2goYSl7fXJldHVybiAyMDA8PWIuc3RhdHVzJiYyOTk+PWIuc3RhdHVzfWZ1bmN0aW9uIGUoYSl7dHJ5e2EuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgiY2xpY2siKSl9Y2F0Y2goYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnRzIik7Yi5pbml0TW91c2VFdmVudCgiY2xpY2siLCEwLCEwLHdpbmRvdywwLDAsMCw4MCwyMCwhMSwhMSwhMSwhMSwwLG51bGwpLGEuZGlzcGF0Y2hFdmVudChiKX19dmFyIGY9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93OiJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOiJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwuZ2xvYmFsPT09Z2xvYmFsP2dsb2JhbDp2b2lkIDAsYT1mLm5hdmlnYXRvciYmL01hY2ludG9zaC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhL1NhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxnPWYuc2F2ZUFzfHwoIm9iamVjdCIhPXR5cGVvZiB3aW5kb3d8fHdpbmRvdyE9PWY/ZnVuY3Rpb24oKXt9OiJkb3dubG9hZCJpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUmJiFhP2Z1bmN0aW9uKGIsZyxoKXt2YXIgaT1mLlVSTHx8Zi53ZWJraXRVUkwsaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Zz1nfHxiLm5hbWV8fCJkb3dubG9hZCIsai5kb3dubG9hZD1nLGoucmVsPSJub29wZW5lciIsInN0cmluZyI9PXR5cGVvZiBiPyhqLmhyZWY9YixqLm9yaWdpbj09PWxvY2F0aW9uLm9yaWdpbj9lKGopOmQoai5ocmVmKT9jKGIsZyxoKTplKGosai50YXJnZXQ9Il9ibGFuayIpKTooai5ocmVmPWkuY3JlYXRlT2JqZWN0VVJMKGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLnJldm9rZU9iamVjdFVSTChqLmhyZWYpfSw0RTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGopfSwwKSl9OiJtc1NhdmVPck9wZW5CbG9iImluIG5hdmlnYXRvcj9mdW5jdGlvbihmLGcsaCl7aWYoZz1nfHxmLm5hbWV8fCJkb3dubG9hZCIsInN0cmluZyIhPXR5cGVvZiBmKW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGIoZixoKSxnKTtlbHNlIGlmKGQoZikpYyhmLGcsaCk7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7aS5ocmVmPWYsaS50YXJnZXQ9Il9ibGFuayIsc2V0VGltZW91dChmdW5jdGlvbigpe2UoaSl9KX19OmZ1bmN0aW9uKGIsZCxlLGcpe2lmKGc9Z3x8b3BlbigiIiwiX2JsYW5rIiksZyYmKGcuZG9jdW1lbnQudGl0bGU9Zy5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD0iZG93bmxvYWRpbmcuLi4iKSwic3RyaW5nIj09dHlwZW9mIGIpcmV0dXJuIGMoYixkLGUpO3ZhciBoPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iPT09Yi50eXBlLGk9L2NvbnN0cnVjdG9yL2kudGVzdChmLkhUTUxFbGVtZW50KXx8Zi5zYWZhcmksaj0vQ3JpT1NcL1tcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKChqfHxoJiZpfHxhKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBGaWxlUmVhZGVyKXt2YXIgaz1uZXcgRmlsZVJlYWRlcjtrLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciBhPWsucmVzdWx0O2E9aj9hOmEucmVwbGFjZSgvXmRhdGE6W147XSo7LywiZGF0YTphdHRhY2htZW50L2ZpbGU7IiksZz9nLmxvY2F0aW9uLmhyZWY9YTpsb2NhdGlvbj1hLGc9bnVsbH0say5yZWFkQXNEYXRhVVJMKGIpfWVsc2V7dmFyIGw9Zi5VUkx8fGYud2Via2l0VVJMLG09bC5jcmVhdGVPYmplY3RVUkwoYik7Zz9nLmxvY2F0aW9uPW06bG9jYXRpb24uaHJlZj1tLGc9bnVsbCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bC5yZXZva2VPYmplY3RVUkwobSl9LDRFNCl9fSk7Zi5zYXZlQXM9Zy5zYXZlQXM9ZywidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPWcpfSk7CgovLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlU2F2ZXIubWluLmpzLm1hcA=="}]},{"name":"网页限制解除","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["*://*/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null}},"storage":{"ts":1637743669219,"data":{}},"enabled":true,"position":9,"file_url":"https://greasyfork.org/scripts/14146-%E7%BD%91%E9%A1%B5%E9%99%90%E5%88%B6%E8%A7%A3%E9%99%A4/code/%E7%BD%91%E9%A1%B5%E9%99%90%E5%88%B6%E8%A7%A3%E9%99%A4.user.js","uuid":"ceafb97d-fcc0-4608-a85c-75df09b284c1","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWVzcGFjZSAgICAgICAgIGh0dHBzOi8vd3d3LmdpdGh1Yi5jb20vQ2F0NzM3My8KCi8vIEBuYW1lICAgICAgICAgICAgICDnvZHpobXpmZDliLbop6PpmaQKLy8gQG5hbWU6ZW4gICAgICAgICAgIFJlbW92ZSB3ZWIgbGltaXRzCi8vIEBuYW1lOnpoICAgICAgICAgICDnvZHpobXpmZDliLbop6PpmaQKLy8gQG5hbWU6emgtQ04gICAgICAgIOe9kemhtemZkOWItuino+mZpAovLyBAbmFtZTp6aC1UVyAgICAgICAg57ay6aCB6ZmQ5Yi26Kej6ZmkCi8vIEBuYW1lOmphICAgICAgICAgICDjgqbjgqfjg5bjga7opo/liLbnt6nlkowKCi8vIEBkZXNjcmlwdGlvbiAgICAgICDpgJrmnYDlpKfpg6jliIbnvZHnq5nvvIzlj6/ku6Xop6PpmaTnpoHmraLlpI3liLbjgIHliarliIfjgIHpgInmi6nmlofmnKzjgIHlj7PplK7oj5zljZXnmoTpmZDliLbjgIIKLy8gQGRlc2NyaXB0aW9uOmVuICAgIFBhc3MgdG8ga2lsbCBtb3N0IG9mIHRoZSBzaXRlLCB5b3UgY2FuIGxpZnQgdGhlIHJlc3RyaWN0aW9ucyBwcm9oaWJpdGVkIHRvIGNvcHksIGN1dCwgc2VsZWN0IHRoZSB0ZXh0LCByaWdodC1jbGljayBtZW51LgovLyBAZGVzY3JpcHRpb246emggICAg6YCa5p2A5aSn6YOo5YiG572R56uZ77yM5Y+v5Lul6Kej6Zmk56aB5q2i5aSN5Yi244CB5Ymq5YiH44CB6YCJ5oup5paH5pys44CB5Y+z6ZSu6I+c5Y2V55qE6ZmQ5Yi244CCCi8vIEBkZXNjcmlwdGlvbjp6aC1DTiDpgJrmnYDlpKfpg6jliIbnvZHnq5nvvIzlj6/ku6Xop6PpmaTnpoHmraLlpI3liLbjgIHliarliIfjgIHpgInmi6nmlofmnKzjgIHlj7PplK7oj5zljZXnmoTpmZDliLbjgIIKLy8gQGRlc2NyaXB0aW9uOnpoLVRXIOmAmuauuuWkp+mDqOWIhue2suerme+8jOWPr+S7peino+mZpOemgeatouW+qeWItuOAgeWJquWIh+OAgemBuOaTh+aWh+acrOOAgeWPs+mNteiPnOWWrueahOmZkOWItuOAggovLyBAZGVzY3JpcHRpb246amEgICAg44K144Kk44OI44Gu44G744Go44KT44Gp44KS5q6644GZ44Gf44KB44Gr5rih44GX44CB44GC44Gq44Gf44Gv44CB44Kz44OU44O85YiH44KK5Y+W44KK44CB44OG44Kt44K544OI44CB5Y+z44Kv44Oq44OD44Kv44Oh44OL44Ol44O844KS6YG45oqe44GZ44KL44GT44Go44Gv56aB5q2i44Gu5Yi26ZmQ44KS6Kej6Zmk44GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CCCgovLyBAaG9tZXBhZ2VVUkwgICAgICAgaHR0cHM6Ly9jYXQ3MzczLmdpdGh1Yi5pby9yZW1vdmUtd2ViLWxpbWl0cy8KLy8gQHN1cHBvcnRVUkwgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9DYXQ3MzczL3JlbW92ZS13ZWItbGltaXRzL2lzc3Vlcy8KCi8vIEBhdXRob3IgICAgICAgICAgICBDYXQ3MwovLyBAdmVyc2lvbiAgICAgICAgICAgMS4zCi8vIEBsaWNlbnNlICAgICAgICAgICBMR1BMdjMKCi8vIEBjb21wYXRpYmxlICAgICAgICBjaHJvbWUgQ2hyb21lXzQ2LjAuMjQ5MC44NiArIFRhbXBlck1vbmtleSArIOiEmuacrF8xLjMg5rWL6K+V6YCa6L+HCi8vIEBjb21wYXRpYmxlICAgICAgICBmaXJlZm94IEZpcmVmb3hfNDIuMCArIEdyZWFzZU1vbmtleSArIOiEmuacrF8xLjIuMSDmtYvor5XpgJrov4cKLy8gQGNvbXBhdGlibGUgICAgICAgIG9wZXJhIE9wZXJhXzMzLjAuMTk5MC4xMTUgKyBUYW1wZXJNb25rZXkgKyDohJrmnKxfMS4xLjMg5rWL6K+V6YCa6L+HCi8vIEBjb21wYXRpYmxlICAgICAgICBzYWZhcmkg5pyq5rWL6K+VCgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovLyovKgovLyBAZ3JhbnQgICAgICAgICAgICAgbm9uZQovLyBAcnVuLWF0ICAgICAgICAgICAgZG9jdW1lbnQtc3RhcnQKLy8gPT0vVXNlclNjcmlwdD09CihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8vIOWfn+WQjeinhOWImeWIl+ihqAogIHZhciBydWxlcyA9IHsKICAgIGJsYWNrX3J1bGU6IHsKICAgICAgbmFtZTogImJsYWNrIiwKICAgICAgaG9va19ldmVudE5hbWVzOiAiIiwKICAgICAgdW5ob29rX2V2ZW50TmFtZXM6ICIiCiAgICB9LAogICAgZGVmYXVsdF9ydWxlOiB7CiAgICAgIG5hbWU6ICJkZWZhdWx0IiwKICAgICAgaG9va19ldmVudE5hbWVzOiAiY29udGV4dG1lbnV8c2VsZWN0fHNlbGVjdHN0YXJ0fGNvcHl8Y3V0fGRyYWdzdGFydCIsCiAgICAgIHVuaG9va19ldmVudE5hbWVzOiAibW91c2Vkb3dufG1vdXNldXB8a2V5ZG93bnxrZXl1cCIsCiAgICAgIGRvbTA6IHRydWUsCiAgICAgIGhvb2tfYWRkRXZlbnRMaXN0ZW5lcjogdHJ1ZSwKICAgICAgaG9va19wcmV2ZW50RGVmYXVsdDogdHJ1ZSwKICAgICAgaG9va19zZXRfcmV0dXJuVmFsdWU6IHRydWUsCiAgICAgIGFkZF9jc3M6IHRydWUKICAgIH0KICB9OwogIC8vIOWfn+WQjeWIl+ihqAogIHZhciBsaXN0cyA9IHsKICAgIC8vIOm7keWQjeWNlQogICAgYmxhY2tfbGlzdDogWwogICAgICAvLipcLnlvdXR1YmVcLmNvbS4qLywKICAgICAgLy4qXC53aWtpcGVkaWFcLm9yZy4qLywKICAgICAgL21haWxcLnFxXC5jb20uKi8sCiAgICAgIC90cmFuc2xhdGVcLmdvb2dsZVwuLiovCiAgICBdCiAgfTsKCiAgLy8g6KaB5aSE55CG55qEIGV2ZW50IOWIl+ihqAogIHZhciBob29rX2V2ZW50TmFtZXMsIHVuaG9va19ldmVudE5hbWVzLCBldmVudE5hbWVzOwogIC8vIOWCqOWtmOWQjeensAogIHZhciBzdG9yYWdlTmFtZSA9IGdldFJhbmRTdHIoJ3F3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tUVdFUlRZVUlPUEFTREZHSEpLTFpYQ1ZCTk0nLCBwYXJzZUludChNYXRoLnJhbmRvbSgpICogMTIgKyA4KSk7CiAgLy8g5YKo5a2Y6KKrIEhvb2sg55qE5Ye95pWwCiAgdmFyIEV2ZW50VGFyZ2V0X2FkZEV2ZW50TGlzdGVuZXIgPSBFdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcjsKICB2YXIgZG9jdW1lbnRfYWRkRXZlbnRMaXN0ZW5lciA9IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI7CiAgdmFyIEV2ZW50X3ByZXZlbnREZWZhdWx0ID0gRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0OwoKICAvLyBIb29rIGFkZEV2ZW50TGlzdGVuZXIgcHJvYwogIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuYywgdXNlQ2FwdHVyZSkgewogICAgdmFyIF9hZGRFdmVudExpc3RlbmVyID0gdGhpcyA9PT0gZG9jdW1lbnQgPyBkb2N1bWVudF9hZGRFdmVudExpc3RlbmVyIDogRXZlbnRUYXJnZXRfYWRkRXZlbnRMaXN0ZW5lcjsKICAgIGlmKGhvb2tfZXZlbnROYW1lcy5pbmRleE9mKHR5cGUpID49IDApIHsKICAgICAgX2FkZEV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgW3R5cGUsIHJldHVyblRydWUsIHVzZUNhcHR1cmVdKTsKICAgIH0gZWxzZSBpZih0aGlzICYmIHVuaG9va19ldmVudE5hbWVzLmluZGV4T2YodHlwZSkgPj0gMCkgewogICAgICB2YXIgZnVuY3NOYW1lID0gc3RvcmFnZU5hbWUgKyB0eXBlICsgKHVzZUNhcHR1cmUgPyAndCcgOiAnZicpOwoKICAgICAgaWYodGhpc1tmdW5jc05hbWVdID09PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzW2Z1bmNzTmFtZV0gPSBbXTsKICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBbdHlwZSwgdXNlQ2FwdHVyZSA/IHVuaG9va190IDogdW5ob29rX2YsIHVzZUNhcHR1cmVdKTsKICAgICAgfQoKICAgICAgdGhpc1tmdW5jc05hbWVdLnB1c2goZnVuYyk7CiAgICB9IGVsc2UgewogICAgICBfYWRkRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogIH0KCiAgLy8g5riF55CG5b6q546vCiAgZnVuY3Rpb24gY2xlYXJMb29wKCkgewogICAgdmFyIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKCiAgICBmb3IodmFyIGkgaW4gZWxlbWVudHMpIHsKICAgICAgZm9yKHZhciBqIGluIGV2ZW50TmFtZXMpIHsKICAgICAgICB2YXIgbmFtZSA9ICdvbicgKyBldmVudE5hbWVzW2pdOwogICAgICAgIGlmKGVsZW1lbnRzW2ldW25hbWVdICE9PSBudWxsICYmIGVsZW1lbnRzW2ldW25hbWVdICE9PSBvbnh4eCkgewogICAgICAgICAgaWYodW5ob29rX2V2ZW50TmFtZXMuaW5kZXhPZihldmVudE5hbWVzW2pdKSA+PSAwKSB7CiAgICAgICAgICAgIGVsZW1lbnRzW2ldW3N0b3JhZ2VOYW1lICsgbmFtZV0gPSBlbGVtZW50c1tpXVtuYW1lXTsKICAgICAgICAgICAgZWxlbWVudHNbaV1bbmFtZV0gPSBvbnh4eDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsZW1lbnRzW2ldW25hbWVdID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIOi/lOWbnnRydWXnmoTlh73mlbAKICBmdW5jdGlvbiByZXR1cm5UcnVlKGUpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiB1bmhvb2tfdChlKSB7CiAgICByZXR1cm4gdW5ob29rKGUsIHRoaXMsIHN0b3JhZ2VOYW1lICsgZS50eXBlICsgJ3QnKTsKICB9CiAgZnVuY3Rpb24gdW5ob29rX2YoZSkgewogICAgcmV0dXJuIHVuaG9vayhlLCB0aGlzLCBzdG9yYWdlTmFtZSArIGUudHlwZSArICdmJyk7CiAgfQogIGZ1bmN0aW9uIHVuaG9vayhlLCBzZWxmLCBmdW5jc05hbWUpIHsKICAgIHZhciBsaXN0ID0gc2VsZltmdW5jc05hbWVdOwogICAgZm9yKHZhciBpIGluIGxpc3QpIHsKICAgICAgbGlzdFtpXShlKTsKICAgIH0KCiAgICBlLnJldHVyblZhbHVlID0gdHJ1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBvbnh4eChlKSB7CiAgICB2YXIgbmFtZSA9IHN0b3JhZ2VOYW1lICsgJ29uJyArIGUudHlwZTsKICAgIHRoaXNbbmFtZV0oZSk7CgogICAgZS5yZXR1cm5WYWx1ZSA9IHRydWU7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vIOiOt+WPlumaj+acuuWtl+espuS4sgogIGZ1bmN0aW9uIGdldFJhbmRTdHIoY2hzLCBsZW4pIHsKICAgIHZhciBzdHIgPSAnJzsKCiAgICB3aGlsZShsZW4tLSkgewogICAgICBzdHIgKz0gY2hzW3BhcnNlSW50KE1hdGgucmFuZG9tKCkgKiBjaHMubGVuZ3RoKV07CiAgICB9CgogICAgcmV0dXJuIHN0cjsKICB9CgogIC8vIOiOt+WPluaJgOacieWFg+e0oCDljIXmi6xkb2N1bWVudAogIGZ1bmN0aW9uIGdldEVsZW1lbnRzKCkgewogICAgdmFyIGVsZW1lbnRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSk7CiAgICBlbGVtZW50cy5wdXNoKGRvY3VtZW50KTsKCiAgICByZXR1cm4gZWxlbWVudHM7CiAgfQoKICAvLyDmt7vliqBjc3MKICBmdW5jdGlvbiBhZGRTdHlsZShjc3MpIHsKICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS5pbm5lckhUTUwgPSBjc3M7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsKICB9CgogIC8vIOiOt+WPluebruagh+Wfn+WQjeW6lOivpeS9v+eUqOeahOinhOWImQogIGZ1bmN0aW9uIGdldFJ1bGUodXJsKSB7CiAgICBmdW5jdGlvbiB0ZXN0VXJsKGxpc3QsIHVybCkgewogICAgICBmb3IodmFyIGkgaW4gbGlzdCkgewogICAgICAgIGlmKGxpc3RbaV0udGVzdCh1cmwpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZih0ZXN0VXJsKGxpc3RzLmJsYWNrX2xpc3QsIHVybCkpIHsKICAgICAgcmV0dXJuIHJ1bGVzLmJsYWNrX3J1bGU7CiAgICB9CgogICAgcmV0dXJuIHJ1bGVzLmRlZmF1bHRfcnVsZTsKICB9CgogIC8vIOWIneWni+WMlgogIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAvLyDojrflj5blvZPliY3ln5/lkI3nmoTop4TliJkKICAgIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uaG9zdCArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgIHZhciBydWxlID0gZ2V0UnVsZSh1cmwpOwoKICAgIC8vIOiuvue9riBldmVudCDliJfooagKICAgIGhvb2tfZXZlbnROYW1lcyA9IHJ1bGUuaG9va19ldmVudE5hbWVzLnNwbGl0KCJ8Iik7CiAgICAvLyBUT0RPIEFsbG93ZWQgdG8gcmV0dXJuIHZhbHVlCiAgICB1bmhvb2tfZXZlbnROYW1lcyA9IHJ1bGUudW5ob29rX2V2ZW50TmFtZXMuc3BsaXQoInwiKTsKICAgIGV2ZW50TmFtZXMgPSBob29rX2V2ZW50TmFtZXMuY29uY2F0KHVuaG9va19ldmVudE5hbWVzKTsKCiAgICAvLyDosIPnlKjmuIXnkIYgRE9NMCBldmVudCDmlrnms5XnmoTlvqrnjq8KICAgIGlmKHJ1bGUuZG9tMCkgewogICAgICBzZXRJbnRlcnZhbChjbGVhckxvb3AsIDMwICogMTAwMCk7CiAgICAgIHNldFRpbWVvdXQoY2xlYXJMb29wLCAyNTAwKTsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjbGVhckxvb3AsIHRydWUpOwogICAgICBjbGVhckxvb3AoKTsKICAgIH0KCiAgICAvLyBob29rIGFkZEV2ZW50TGlzdGVuZXIKICAgIGlmKHJ1bGUuaG9va19hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXI7CiAgICB9CgogICAgLy8gaG9vayBwcmV2ZW50RGVmYXVsdAogICAgaWYocnVsZS5ob29rX3ByZXZlbnREZWZhdWx0KSB7CiAgICAgIEV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmKGV2ZW50TmFtZXMuaW5kZXhPZih0aGlzLnR5cGUpIDwgMCkgewogICAgICAgICAgRXZlbnRfcHJldmVudERlZmF1bHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgLy8gSG9vayBzZXQgcmV0dXJuVmFsdWUKICAgIGlmKHJ1bGUuaG9va19zZXRfcmV0dXJuVmFsdWUpIHsKICAgICAgRXZlbnQucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oJ3JldHVyblZhbHVlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYodGhpcy5yZXR1cm5WYWx1ZSAhPT0gdHJ1ZSAmJiBldmVudE5hbWVzLmluZGV4T2YodGhpcy50eXBlKSA+PSAwKSB7CiAgICAgICAgICB0aGlzLnJldHVyblZhbHVlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGNvbnNvbGUuZGVidWcoJ3VybDogJyArIHVybCwgJ3N0b3JhZ2VOYW1l77yaJyArIHN0b3JhZ2VOYW1lLCAncnVsZTogJyArIHJ1bGUubmFtZSk7CgogICAgLy8g5re75YqgQ1NTCiAgICBpZihydWxlLmFkZF9jc3MpIHsKICAgICAgYWRkU3R5bGUoJ2h0bWwsICogey13ZWJraXQtdXNlci1zZWxlY3Q6dGV4dCFpbXBvcnRhbnQ7IC1tb3otdXNlci1zZWxlY3Q6dGV4dCFpbXBvcnRhbnQ7fScpOwogICAgfQogIH0KCiAgaW5pdCgpOwp9KSgpOw=="},{"name":"AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["*://ipv6.baidu.com/*","*://www.baidu.com/*","*://www1.baidu.com/*","*://m.baidu.com/*","*://xueshu.baidu.com/s*","*://www.so.com/s?*","*://*.bing.com/*","*://encrypted.google.*/search*","*://*.google*/search*","*://*.google*/webhp*","*://*.zhihu.com/*","*://*duckduckgo.com/*","*://*.dogedoge.com/*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":["*://*.google*/sorry*","https://zhidao.baidu.com/*","https://*.zhidao.baidu.com/*","https://www.baidu.com/img/*"],"merge_excludes":true,"use_connects":[],"orig_connects":["baidu.com","google.com","google.com.hk","google.com.jp","bing.com","duckduckgo.com","dogedoge.com","so.com"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null}},"storage":{"ts":1637743679356,"data":{}},"enabled":true,"position":10,"file_url":"https://greasyfork.org/scripts/14178-ac-baidu-%E9%87%8D%E5%AE%9A%E5%90%91%E4%BC%98%E5%8C%96%E7%99%BE%E5%BA%A6%E6%90%9C%E7%8B%97%E8%B0%B7%E6%AD%8C%E5%BF%85%E5%BA%94%E6%90%9C%E7%B4%A2-favicon-%E5%8F%8C%E5%88%97/code/AC-baidu-%E9%87%8D%E5%AE%9A%E5%90%91%E4%BC%98%E5%8C%96%E7%99%BE%E5%BA%A6%E6%90%9C%E7%8B%97%E8%B0%B7%E6%AD%8C%E5%BF%85%E5%BA%94%E6%90%9C%E7%B4%A2_favicon_%E5%8F%8C%E5%88%97.user.js","uuid":"9847000f-3c89-4d14-8baa-149cb327e760","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgQUMtYmFpZHUt6YeN5a6a5ZCR5LyY5YyW55m+5bqm5pCc54uX6LC35q2M5b+F5bqU5pCc57SiX2Zhdmljb25f5Y+M5YiXCi8vIEBuYW1lOmVuICAgIEFDLWJhaWR1LWdvb2dsZV9zb2dvdV9iaW5nX1JlZGlyZWN0UmVtb3ZlX2Zhdmljb25fYWRhd2F5X1R3b0xpbmUKLy8gQG5hbWU6emggICAgQUMtYmFpZHUt6YeN5a6a5ZCR5LyY5YyW55m+5bqm5pCc54uX6LC35q2M5b+F5bqU5pCc57SiX2Zhdmljb25f5Y+M5YiXCi8vIEBuYW1lOmphICAgIEFDLWJhaWR1LemHjeWumuWQkeacgOmBqeWMlkJhaWR144Gu5pCc54uX44GuR29vZ2xl44GuQmluZ+aknOe0oue1kOaenOOBruODquODgOOCpOODrOOCr+ODiOmZpOWOuytmYXZpY29uCi8vIEBkZXNjcmlwdGlvbiAgMS7nuZ7pgY7nmb7luqbjgIHmkJzni5fjgIHosLfmrYzjgIHlpb3mkJzmkJzntKLntZDmnpzkuK3nmoToh6rlt7HnmoTot7PovYnpj4jmjqXvvIznm7TmjqXoqKrllY/ljp/lp4vntrLpoIEt5Y+N5q2j6YO96IO955yL5oeCIDIu5paw5aKe6Ieq5a6a5LmJ572R56uZ5oum5oiq5Yqf6IO9IDPmt7vliqBGYXZpY29u5pi+56S6IDQu6aG16Z2iQ1NTIDUu5re75Yqg6K6h5pWwIDYu5byA5YWz6YCJ5oup5Lul5LiK5Yqf6IO9IDcu6Ieq5Yqo57+76aG15Yqf6IO9Ci8vIEBkZXNjcmlwdGlvbjplbiAgMS5ieXBhc3MgdGhlIHJlZGlyZWN0IGxpbmsgYXQgYmFpZHVcc29nb3VcZ29vZ2xlXGhhb3NvdTsgMi5yZW1vdmUgYWRzIGF0IGJhaWR1OyAzLmFkZCBGYXZpY29uIGZvciBlYWNoIHdlYnNpdGU7IDQucmVuZGVyIHlvdXIgb3duIHN0eWxlOyA1LmNvdW50ZXI7IDYuU3dpdGNoIHRvIGhhbmRsZSBhbGwgNy5BdXRvIFBhZ2VyCi8vIEBkZXNjcmlwdGlvbjpqYSAgMS7ov4Llm55CYWlkdeOAgVNvZ29144CBR29vZ2xl44CBSGFvc2915qSc57Si5qSc57Si57WQ5p6c44Gu5Lit44Gu6Ieq5YiG44Gu6YG356e744Oq44Oz44KvOyAyLkJhaWR144Gu5L2Z5YiG44Gq5bqD5ZGK44KS5Y+W44KK6Zmk44GPOyAzLuOCs+ODoeODs+ODiOOCkui/veWKoDsgNC7jg5rjg7zjgrjjga7jgqvjgrnjgr/jg6BDU1A7IDUu44Kr44Km44Oz44OI44KS6L+95YqgOyA2LuOCueOCpOODg+ODgeOBr+S7peS4iuOBruapn+iDveOCkumBuOaKnuOBl+OBvuOBmTsgNy7oh6rli5Xjg5rjg7zjgrjjgoHjgY/jgoouCi8vIEBpY29uICAgIGh0dHBzOi8vYWUwMS5hbGljZG4uY29tL2tmL0hhYzFhNTgwNTVjNTA0N2NkYjkxMzQ5ZTkxYWEyMDhkNWsuanBnCi8vIEBhdXRob3IgICAgQUMKLy8gQGxpY2Vuc2UgICAgR1BMLTMuMC1vbmx5Ci8vIEBjcmVhdGUgICAgIDIwMTUtMTEtMjUKLy8gQHJ1bi1hdCAgICAgZG9jdW1lbnQtc3RhcnQKLy8gQHZlcnNpb24gICAgMjQuMjkKLy8gQGNvbm5lY3QgICAgYmFpZHUuY29tCi8vIEBjb25uZWN0ICAgIGdvb2dsZS5jb20KLy8gQGNvbm5lY3QgICAgZ29vZ2xlLmNvbS5oawovLyBAY29ubmVjdCAgICBnb29nbGUuY29tLmpwCi8vIEBjb25uZWN0ICAgIGJpbmcuY29tCi8vIEBjb25uZWN0ICAgIGR1Y2tkdWNrZ28uY29tCi8vIEBjb25uZWN0ICAgIGRvZ2Vkb2dlLmNvbQovLyBAY29ubmVjdCAgICBzby5jb20KLy8gQGluY2x1ZGUgICAgKjovL2lwdjYuYmFpZHUuY29tLyoKLy8gQGluY2x1ZGUgICAgKjovL3d3dy5iYWlkdS5jb20vKgovLyBAaW5jbHVkZSAgICAqOi8vd3d3MS5iYWlkdS5jb20vKgovLyBAaW5jbHVkZSAgICAqOi8vbS5iYWlkdS5jb20vKgovLyBAaW5jbHVkZSAgICAqOi8veHVlc2h1LmJhaWR1LmNvbS9zKgovLyBAaW5jbHVkZSAgICAqOi8vd3d3LnNvLmNvbS9zPyoKLy8gQGluY2x1ZGUgICAgKjovLyouYmluZy5jb20vKgovLyBAaW5jbHVkZSAgICAqOi8vZW5jcnlwdGVkLmdvb2dsZS4qL3NlYXJjaCoKLy8gQGluY2x1ZGUgICAgKjovLyouZ29vZ2xlKi9zZWFyY2gqCi8vIEBpbmNsdWRlICAgICo6Ly8qLmdvb2dsZSovd2ViaHAqCi8vIEBpbmNsdWRlICAgICo6Ly8qLnpoaWh1LmNvbS8qCi8vIEBpbmNsdWRlICAgICo6Ly8qZHVja2R1Y2tnby5jb20vKgovLyBAaW5jbHVkZSAgICAqOi8vKi5kb2dlZG9nZS5jb20vKgovLyBAZXhjbHVkZSAgICAqOi8vKi5nb29nbGUqL3NvcnJ5KgovLyBAZXhjbHVkZSAgICBodHRwczovL3poaWRhby5iYWlkdS5jb20vKgovLyBAZXhjbHVkZSAgICBodHRwczovLyouemhpZGFvLmJhaWR1LmNvbS8qCi8vIEBleGNsdWRlICAgIGh0dHBzOi8vd3d3LmJhaWR1LmNvbS9pbWcvKgovLyBAc3VwcG9ydFVSTCAgaHR0cHM6Ly9hYy50dWppZHUuY29tLwovLyBAaG9tZS11cmwgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLVRXL3NjcmlwdHMvMTQxNzgKLy8gQGhvbWUtdXJsMiAgaHR0cHM6Ly9naXRodWIuY29tL2xhbmdyZW4xMzUzL0dNX3NjcmlwdAovLyBAaG9tZXBhZ2VVUkwgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtVFcvc2NyaXB0cy8xNDE3OAovLyBAY29weXJpZ2h0ICAyMDE1LTIwMjAsIEFDCi8vIEBsYXN0bW9kaWZpZWQgIDIwMjEtMTEtMDIKLy8gQGZlZWRiYWNrLXVybCAgaHR0cHM6Ly9naXRodWIuY29tL2xhbmdyZW4xMzUzL0dNX3NjcmlwdAovLyBAbm90ZSAgICAyMDIxLjEwLTMxLVYyNC4yOSBmaXhlZCBMZXNzIHJlcXVpcmVtZW50IGZvciBmYXN0ZXIgTG9hZAovLyBAbm90ZSAgICAyMDIxLjEwLTI5LVYyNC4yNyDnp7vpmaTlv4XlupTog73pgInmi6nnmoTlub/lkYrvvJvlop7liqDoh6rlrprkuYnmoLflvI9sZXNz55qE5pSv5oyBCi8vIEBub3RlICAgIDIwMjEuMDktMDItVjI0LjI2IOS/ruWkjeW/heW6lOWkmmZhdmljb27vvIzkv67lpI3nmb7luqbnmb7np5Hpl67popjvvJvkv67lpI3osLfmrYzkuIDkuKrlsI/pl67popgKLy8gQG5vdGUgICAgMjAyMS4wNy0xNi1WMjQuMjUg5L+u5aSN5LiA5LiqYnVn77yb5YW85a6555m+5bqm5LiL5pCc57Si6IKh56WodGFn77ybCi8vIEBub3RlICAgIDIwMjEuMDYtMTUtVjI0LjI0IOabtOaNomNkbuWcsOWdgAovLyBAbm90ZSAgICAyMDIxLjA0LTEyLVYyNC4yMyDkv67lpI3osLfmrYzlpJrliJflpLHmlYjnmoTpl67popggJiYg5L+u5aSN6LC35q2M57+76aG15aSx5pWIICYmIOS/ruWkjeiwt+atjOaKpOecvOmXrumimAovLyBAbm90ZSAgICAyMDIxLjA0LTEyLVYyNC4yMSDkv67lpI3osLfmrYzmkJzntKLplJnkvY3nmoTpl67popggJiYg5L+u5aSN6LC35q2M5Zu+54mH5Yqg6L2955qE6Zeu6aKYICYmIOS/ruWkjeiwt+atjOe/u+mhteeahOmXrumimAovLyBAbm90ZSAgICAyMDIxLjAyLTEwLVYyNC4yMCDkv67lpI3osLfmrYzpg6jliIblpLHmlYjnmoTpl67popggJiYg5L+u5aSN55Sx5LqOQkHlpLHmlYjlr7zoh7TnmoTohJrmnKzml6DmlYjnmoTpl67popgKLy8gQG5vdGUgICAgMjAyMS4wMi0wMi1WMjQuMTkg5pWw5o2u5pys5Zyw57yT5a2Y77yM5LiA5a6a56iL5bqm5LiK5L+d6K+B6YeN6KOF5ZCO5pWw5o2u5LiN5Lii5aSxICYmIOS/ruWkjeiwt+atjOmDqOWIhuWGheWuueWkseaViOeahOmXrumimAovLyBAbm90ZSAgICAyMDIwLjEyLTI5LVYyNC4xOCDosIPmlbTkvqfovrnmoI/lip/og73mlYjmnpzvvIzkvJjljJblj4zliJfmmL7npLrmlYjmnpzvvIzlpITnkIZkdWNrZHVja+eahOagt+W8jwovLyBAbm90ZSAgICAyMDIwLjEyLTI5LVYyNC4xNyDosIPmlbTosLfmrYzjgIHnmb7luqblj4zliJfmmL7npLrmlYjmnpwt5ZCE5Liq5YiG6L6o546H77yb5L+u5aSN55m+5bqm6YOo5YiG54K55Ye75aSx5pWI55qE6Zeu6aKY77ybCi8vIEBub3RlICAgIDIwMjAuMTItMjItVjI0LjE2IOiwg+aVtOS7o+eggS3lh4/lsJHoh7Tlkb3lvILluLjvvJvkv67lpI3osLfmrYzlj4zliJfpl67popgKLy8gQG5vdGUgICAgMjAyMC4xMi0xOS1WMjQuMTQg5L+u5aSN6YOo5YiG5YaF5qC45LiK55m+5bqm5aSa5YiX5pi+56S655qE6Zeu6aKY77yb5L+u5aSN6LC35q2M5aSa5YiX55qE5pi+56S66Zeu6aKYCi8vIEBub3RlICAgIDIwMjAuMTItMTgtVjI0LjEzIOS/ruWkjWZhdmljb27lnKjnn6XkuY7kuIrnmoTmjpLniYjpl67popjvvJvkv67lpI1EdWNr5qC35byP5peg5pWI55qE6Zeu6aKY77yb5L+u5aSN5pyA5paw6LC35q2M5Y+M5YiX5aSx5pWI55qE6Zeu6aKYIC0g5bCd6K+V5L+u5aSN6YOo5YiG55So5oi357+76aG15aSx5pWI6Zeu6aKY77yb5L+u5aSN6K6h5pWw5Zmo57yW5Y+35byC5bi455qE6Zeu6aKY77yb5pu05ZCN5bCd6K+V5L+u5aSN5a6e5pWI6Zeu6aKYCi8vIEBub3RlICAgIDIwMjAuMTAtMTktVjI0LjEyIOaLpuaIquaXtuaUr+aMgVVSTOWcsOWdgOeahOWMuemFje+8jOiwg+aVtGZhdmljb27kvJrlvbHlk43moIfpopjmloflrZfpgInkuK3nmoTpl67popjvvJvkv67lpI3osLfmrYzmi6bmiKrmqKHlvI/lpLHmlYjnmoTpl67popjvvIzkv67lpI3osLfmrYznvJblj7fpl67popjvvJvkv67lpI3lv4XlupTlm77niYflgY/lj7PnmoTpl67popgKLy8gQG5vdGUgICAgMjAyMC4wOS0yOS1WMjQuMTEg6ZKI5a+555m+5bqm5b6L5biI5Ye95YaF5a655a+56ISa5pys6L+b6KGM6LCD5pW077yM5omp5bGV4oCc55m+5bqm5LyY5YyW4oCd5bey57uP5rC45LmF5LiL57q/Ci8vIEBub3RlICAgIDIwMjAuMDktMjctVjI0LjEwIOS/ruWkjeeZvuW6puaLpuaIquaooeW8j+eahOmXrumimOS7peWPiuWwj+WcsOWdgOWwvuazqO+8m+S/ruWkjeWlveaQnOeahOaLpuaIquWKn+iDve+8m+S/ruWkjemDqOWIhuagt+W8j+mXrumimAovLyBAbm90ZSAgICAyMDIwLjA5LTEyLVYyNC4wOSDkv67lpI3nv7vpobXlpLHmlYjnmoTpl67popjvvJvmm7TmlrDpg6jliIbmoLflvI/lhoXlrrkKLy8gQG5vdGUgICAgMjAyMC4wOS0xMS1WMjQuMDgg5pu05o2iVnVl55qEY2Ru5Zyw5Z2A77yM5bC96YeP5Yqg5b+r5pWw5o2u55qE6L295YWl6YCf5bqm77yb5Li65LqG5YW85a65c2FmYXJp5bCG55m+5bqm55qEaHR0cHPlnLDlnYDmm7/mjaLkuLrkuoZodHRw5Zyw5Z2A77yb5L+u5aSNZmF2aWNvbuiOt+WPlueahOmXrumimO+8m+WinuWKoGZhdmljb27liqjmgIHliLfmlrDvvJvkv67lpI3pg6jliIbmoLflvI/pl67popgKLy8gQG5vdGUgICAgMjAyMC4wOC0wNi1WMjQuMDcg5L+u5aSN5L+d5a2Y5peg5pWI55qE6Zeu6aKY77yb5L+u5aSN55m+5bqm5Zyo5Y2V5YiX5bGF5Lit55qE5pe25YCZ6ZSZ5L2N55qE6Zeu6aKYCi8vIEBub3RlICAgIDIwMjAuMDgtMDUtVjI0LjA2IOS/ruWkjeiHquWumuS5ieWBtuWwlOaJk+S4jeW8gOeahOmXrumimO+8m+S/ruWkjeWumuaXtuWZqOWPr+iDveS8mumAoOaIkOeahOWkseaViOeahOmXrumimO+8m+S/ruWkjeW9k+WtmOWcqOWkmuS4quiEmuacrOWPr+iDvemAoOaIkOeahOWGsueqgemXrumimAovLyBAbm90ZSAgICAyMDIwLjA4LTAzLVYyNC4wNSDmm7TmlrDkv67lpI3miqTnnLzmqKHlvI/nmoTpl67popjvvJvkv67lpI3mianlsZXkuIrlgbblsJTlpLHmlYjnmoTpl67popjvvJvml6dFZGdl5Ly85LmO57uP5bi45pyJ5L+d5a2Y5LiN55Sf5pWI55qE6Zeu6aKY77yM5rWL6K+V5LiN5piv5oiR55qE5Y6f5ZugCi8vIEBub3RlICAgIDIwMjAuMDgtMDItVjI0LjA0IOWKqOaAgeagt+W8j+WIh+aNou+8jOWkmuWIl+aViOaenOS4gOmUruWIh+aNou+8jOaXoOmcgOWIt+aWsCDkv67lpI3lkITnp43moLflvI/pl67popgg5L+u5aSN5b+F5bqU57+76aG16Zeu6aKYIOa1i+ivleWFvOWuuUdN5ZKMVk0u5b275bqV5LiN5pSv5oyB5pCc54uX5pCc57SiLS3liKvpl67kuLrku4DkuYjvvIzmiJHov5jmg7PlpJrmtLvlh6DlubQKLy8gQG5vdGUgICAgMjAyMC4wNy0yNy1WMjQuMiYzIOabtOaNolZ1ZeS4ujc15Zui55qE5Zyw5Z2AIOS/ruWkjeeZvuW6pueahGxpdGXmqKHlvI/liIfmjaLml6DmlYjnmoTpl67popgKLy8gQG5vdGUgICAgMjAyMC4wNy0yNy1WMjQuMDEg5pu05paw5pSv5oyBTGludXjkuIvnmoRGaXJlZm94IGVtbeS/ruWkjeS4iuasoeaPkOS6pOi/h+S6juedgOaApeWvvOiHtOeahOagt+W8j+acquaPkOS6pCDmm7TmlrDmlK/mjIFEb2dlRG9nZeWkmuWQieaQnOe0oi3kvYbkuI3lpITnkIbph43lrprlkJEKLy8gQG5vdGUgICAgMjAyMC4wNy0yNi1WMjQuMDAg6YOo5YiG5YaF5a655pu05o2i5Li6VnVl5Yid5aeL5YyW77yM5YeP5bCR5LiA5a6a55qE6LWE5rqQ5Y2g55SoICYmIOaWsOWinkR1Y2tHb0dv55qE5qC35byP5pWI5p6cIC0g6ICD6JmR5YiwRHVja0dvR2/nmoTnibnmgKfvvIzkuI3lr7nlhbbov5vooYzlub/lkYrov4fmu6QKLy8gQG5vdGUgICAgMjAyMC4wNy0wOS1WMjMuMzMg5L+u5aSNYmluZ+eahOmhtumDqOWIh+aNoumUmeS9jeeahOmXrumimO+8m+WinuWKoHd3MS5iYWlkdS5jb23ln5/vvJvkv67lpI3lkITnp43moLflvI8o55m+5bqm44CB6LC35q2M44CB5aW95pCc44CB5b+F5bqUKemUmeS9jeeahOmXrumimAovLyBAbm90ZSAgICAyMDIwLjA0LTI0LVYyMy4zMiDniYjmnKzlgJLpgIDvvJrlronlhajotbfop4HvvJrpu5jorqTlhbPpl63mkJzni5fnmoToh6rlrprkuYnln5/lkI3mi6bmiKrlip/og73lkozph43lrprlkJHlip/og70t5Lul5ZCO6ICD6JmR5pu05o2i5pa55byP77yb6buY6K6k5LiN5byA5ZCv6YeN5a6a5ZCR5Yqf6IO944CB6buY6K6k5LiN5byA5ZCv5bm/5ZGK5oum5oiq5Yqf6IO977yb5pu05paw6YOo5YiG6K+05piO5YaF5a6577yb5ZCM5pe25Lmf5a+56YOo5YiG5pSv5oyB5LiN5Yiw5L2N55qE77yM5YW85a655LiN5aW955qE5pWI5p6c5ZCR5aSn5a626K+05LiA5aOw5oqx5q2J77yM5LmL5ZCO5oiR5Lya5pu05Yqg5Yqq5Yqb6K6p5pCc57Si57uT5p6c5pu05Yqg5pa55L6/5p+l55yL5ZKM5L2/55SoCi8vIEBub3RlICAgIDIwMjAuMDMtMjctVjIzLjMxIOS/ruWkjWdvb2dsZeeUseS6jumhtemdoue7k+aehOabtOaWsOWvvOiHtOeahGJsb2Nr5Yqf6IO95aSx5pWI55qE6Zeu6aKY77yM5ZCM5pe25L+u5aSN6LC35q2M5oqk55y85qih5byP5Lmf5aSx5pWI55qE6Zeu6aKY44CC5paw5aKe57+76aG155qE5oyJ6ZKu5LqL5Lu277yM5paw5aKe5L2/55So5Zyo57q/Y29uZmln77yM6YG/5YWN55Sx5LqO6aG16Z2i57uT5p6E5pS55Yqo5Y+I6ZyA6KaB6YeN5paw5o+Q5Lqk6ISa5pys5pu05pawCi8vIEBub3RlICAgIDIwMTcuMDUuMTIgLT4gMjAyMC4wMy0yNiAmJiBWOC42IC0+IFYyMy4zMCDlkITnp43lkITmoLfnmoTljoblj7Lmm7TmlrDorrDlvZXvvIzku47kuIDkuKrniYjmnKzov63ku6PliLDlj6bkuIDkuKrniYjmnKwKLy8gQG5vdGUgICAgMjAxNy4wNS4xMi1WOC40IOaWsOWinu+8mum7mOiupOWxj+iUveiwt+atjOeahOWuieWFqOaQnOe0ouWKn+iDvQovLyBAbm90ZSAgICAyMDE3LjA1LjA1LVY4LjMg5L+u5aSNaW5jbHVkZeiMg+WbtOWkquWwj+WvvOiHtOeahOeZvuW6puefpemBk+eahOWxj+iUvemXrumimAovLyBAbm90ZSAgICAyMDE3LjA1LjA0LVY4LjIg57uI5LqO5L+u5aSN5LqG55m+5bqm55+l6YGT5Zu+54mH5pu/5o2i5LqG5paH5a2X55qE6L+Z5Liq5aSnQlVHOyDpobrkvr/lpITnkIbkuoZzdXBlcmFwaS56aGlkYW8uYmFpZHUuY29tOyDmlrDlop7osLfmrYzmkJzntKLnu5Pmnpzph43lrprlkJHljrvpmaQKLy8gQG5vdGUgICAgMjAxNy4wNS4wNC1WOC4xIOe7iOS6juS/ruWkjeS6hueZvuW6puefpemBk+WbvueJh+abv+aNouS6huaWh+Wtl+eahOi/meS4quWkp0JVR++8jOmhuuS+v+WkhOeQhuS6hnN1cGVyYXBpLnpoaWRhby5iYWlkdS5jb20KLy8gQG5vdGUgICAgMjAxNy4wNS4wNC1WOC4wIOe7iOS6juS/ruWkjeS6hueZvuW6puefpemBk+WbvueJh+abv+aNouS6huaWh+Wtl+eahOi/meS4quWkp0JVR++8jOW+hea1i+ivlQovLyBAbm90ZSAgICAyMDE3LjAzLjI4LVY3LjYg5L+u5aSN5ZyoVmlvbGVudE1vbmtleeS4iueahOS4jeaUr+aMgeeahOmXrumimAovLyBAbm90ZSAgICAyMDE3LjAzLjI4LVY3LjUg5bCd6K+V5L+u5aSNY2hyb21l5LiK55qE6Zeu6aKYCi8vIEBub3RlICAgIDIwMTcuMDMuMjEtVjcuNCDlsJ3or5XlpITnkIZFZGdl5LiK5LiN5pSv5oyB55qE6Zeu6aKY77yM57uT5p6c5Y+R546w5pivRWRnZeacrOi6q+eahFRhbXBlck1vbmtleeaUr+aMgeaciemXrumimAovLyBAbm90ZSAgICAyMDE3LjAzLjE5LVY3LjMg5L+u5aSN5omT5byA55m+5bqm5LmL5ZCO5YaN5qyh54K55Ye74oCc55m+5bqm5LiA5LiL4oCd5a+86Ie055qE5peg5rOV5pu05paw6YeN5a6a5ZCR6Zeu6aKYCi8vIEBub3RlICAgIDIwMTcuMDMuMTktVjcuMiDmnKrnn6Xljp/lm6BjaHJvbWXnmoRNdXRhdGlvbk9ic2VydmVy5peg5rOV5L2/55So5LqG77yM57un57ut5Zue5b2S5Lul5YmN55qERE9NTm9kZUluc2VydGVkCi8vIEBub3RlICAgIDIwMTcuMDIuMTctVjcuMCDkv67lpI3mkJzni5fnmoTmkJzntKLnu5Pmnpzph43lrprlkJHpl67popgr5pS55Liq5ZCN5a2XCi8vIEBub3RlICAgIDIwMTcuMDIuMTctVjYuOSDkv67lpI3mkJzni5fnmoTmkJzntKLnu5Pmnpzph43lrprlkJHpl67popgKLy8gQG5vdGUgICAgMjAxNi4xMC4yNy1WNi43IOS/ruWkjeS6huS7peWJjeeahOmHjeWkjeivt+axgu+8jOeOsOWcqOeahOivt+axguaVsOW6lOivpeWwj+S6huW+iOWkmu+8jOe9kee7nOS5n+WwseS4jeWNoeS6hu+8jOaEn+inieiQjOiQjOWTkgovLyBAbm90ZSAgICAyMDE2LjA0LjI0LVY2LjYg5oGi5aSN5Lul5YmN55qE54mI5pys77yM5Zug5Li65YW85a655oCn6Zeu6aKYCi8vIEBub3RlICAgIDIwMTUuMTIuMDEtVjUuMCDliqDlhaXmkJzni5fnmoTmlK/mjIHvvIzkvYbmmK/mlK/mjIHkuI3mmK/lvojlpb0KLy8gQG5vdGUgICAgMjAxNS4xMS4yNS1WMi4wIOS8mOWMlu+8jOW3sue7j+aYr+ecn+WunuWcsOWdgOeahOS4jeWGjeWwneivleiOt+WPlgovLyBAbm90ZSAgICAyMDE1LjExLjI1LVYxLjAg5a6M5oiQ5Y675o6J55m+5bqm6YeN5a6a5ZCR55qE5Yqf6IO9Ci8vIEByZXNvdXJjZSAgYmFpZHVDb21tb25TdHlsZSAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvYmFpZHVDb21tb25TdHlsZS5jc3M/dD0yNC4yNgovLyBAcmVzb3VyY2UgIGJhaWR1T25lUGFnZVN0eWxlICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2JhaWR1T25lUGFnZVN0eWxlLmNzcz90PTI0LjI2Ci8vIEByZXNvdXJjZSAgYmFpZHVUd29QYWdlU3R5bGUgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvYmFpZHVUd29QYWdlU3R5bGUuY3NzP3Q9MjQuMjYKLy8gQHJlc291cmNlICBiYWlkdUxpdGVTdHlsZSAgICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9iYWlkdUxpdGVTdHlsZS5jc3M/dD0yNC4yNgovLyBAcmVzb3VyY2UgIGdvb2dsZUNvbW1vblN0eWxlICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2dvb2dsZUNvbW1vblN0eWxlLmNzcz90PTI0LjI2Ci8vIEByZXNvdXJjZSAgZ29vZ2xlT25lUGFnZVN0eWxlIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvZ29vZ2xlT25lUGFnZVN0eWxlLmNzcz90PTI0LjI2Ci8vIEByZXNvdXJjZSAgZ29vZ2xlVHdvUGFnZVN0eWxlIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvZ29vZ2xlVHdvUGFnZVN0eWxlLmNzcz90PTI0LjI2Ci8vIEByZXNvdXJjZSAgYmluZ0NvbW1vblN0eWxlICAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvYmluZ0NvbW1vblN0eWxlLmNzcz90PTI0LjI2Ci8vIEByZXNvdXJjZSAgYmluZ09uZVBhZ2VTdHlsZSAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvYmluZ09uZVBhZ2VTdHlsZS5jc3M/dD0yNC4yNgovLyBAcmVzb3VyY2UgIGJpbmdUd29QYWdlU3R5bGUgICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2JpbmdUd29QYWdlU3R5bGUuY3NzP3Q9MjQuMjYKLy8gQHJlc291cmNlICBkdWNrQ29tbW9uU3R5bGUgICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9kdWNrQ29tbW9uU3R5bGUuY3NzP3Q9MjQuMjYKLy8gQHJlc291cmNlICBkdWNrT25lUGFnZVN0eWxlICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9kdWNrT25lUGFnZVN0eWxlLmNzcz90PTI0LjI2Ci8vIEByZXNvdXJjZSAgZHVja1R3b1BhZ2VTdHlsZSAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvZHVja1R3b1BhZ2VTdHlsZS5jc3M/dD0yNC4yNgovLyBAcmVzb3VyY2UgIGRvZ2VDb21tb25TdHlsZSAgICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2RvZ2VDb21tb25TdHlsZS5jc3M/dD0yNC4yNgovLyBAcmVzb3VyY2UgIGRvZ2VPbmVQYWdlU3R5bGUgICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2RvZ2VPbmVQYWdlU3R5bGUuY3NzP3Q9MjQuMjYKLy8gQHJlc291cmNlICBkb2dlVHdvUGFnZVN0eWxlICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9kb2dlVHdvUGFnZVN0eWxlLmNzcz90PTI0LjI2Ci8vIEByZXNvdXJjZSAgTWFpbkh1WWFuU3R5bGUgICAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvSHVZYW5TdHlsZS5jc3M/dD0yNC4yNgovLyBAcmVzb3VyY2UgIFNpdGVDb25maWdSdWxlcyAgICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL1NpdGVDb25maWdSdWxlcy5jb25mP3Q9MjQuMjYKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG4uc3RhdGljZmlsZS5vcmcvdnVlLzIuNi4xMS92dWUubWluLmpzCi8vIEByZXF1aXJlIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vdnVlQDIuNi4xMi9kaXN0L3Z1ZS5taW4uanMKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9sZXNzX2Jyb3dzZXJfZml4QDQuMS4yL2Rpc3QvbGVzcy5qcwovLyBAZ3JhbnQgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgIEdNLmdldFZhbHVlCi8vIEBncmFudCAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgR00uc2V0VmFsdWUKLy8gQGdyYW50ICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICBHTV9nZXRSZXNvdXJjZVVSTAovLyBAZ3JhbnQgICAgR01fbGlzdFZhbHVlcwovLyBAZ3JhbnQgICAgR01fZ2V0UmVzb3VyY2VVcmwKLy8gQGdyYW50ICAgIEdNLmdldFJlc291cmNlVXJsCi8vIEBncmFudCAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgR01fZ2V0UmVzb3VyY2VUZXh0Ci8vIEBncmFudCAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICB1bnNhZmVXaW5kb3cKLy8gQG5hbWVzcGFjZSAxMzUzNDY0NTM5QHFxLmNvbQovLyA9PS9Vc2VyU2NyaXB0PT0KLy8gY2FsYyhYMSh2dykgKyBYMihweCkpIC0+IEIocHgpIOS9v+eUqCBodHRwOi8vd3d3Lnl1bnN1YW4uaW5mby9tYXRyaXhjb21wdXRhdGlvbnMvc29sdmVsaW5lYXJzeXN0ZW1zLmh0bWwg6L+b6KGM6K6h566XCgohZnVuY3Rpb24gKCkgewogIGxldCBpc2RlYnVnID0gZmFsc2U7CiAgbGV0IGlzTG9jYWxEZWJ1ZyA9IGlzZGVidWcgfHwgZmFsc2U7CiAgbGV0IGRlYnVnID0gaXNkZWJ1ZyA/IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkgOiAoKT0+e30KICBsZXQgYWNDc3NMb2FkRmxhZyA9IGZhbHNlOwoKICBsZXQgaW5FeHRNb2RlID0gdHlwZW9mIChpc0V4dGVuc2lvbikgIT09ICJ1bmRlZmluZWQiOwogIGxldCBpbkdNTW9kZSA9IHR5cGVvZiAoR01faW5mby5zY3JpcHRIYW5kbGVyKSAhPT0gInVuZGVmaW5lZCI7IC8vID0gIkdyZWFzZW1vbmtleSIgfHwgIlRhbXBlcm1vbmtleSIgfHwgIlZpb2xlbnRNb25rZXkiCiAgLy8g5paw54mI5pys55qER3JlYXNlTW9ua2V55piv5bim5pyJc2NyaXB0SGFuZGxlcu+8jOS9huaYr+ayoeaciUdNX2dldFJlc291cmNlVGV4dO+8m+aXp+eJiOacrOS4jeW4pnNjcmlwdEhhbmRsZXLvvIzkvYbmmK/mnIlHTV9nZXRSZXNvdXJjZVRleHQKICAvLyBsZXQgaXNOZXdHTSA9IHR5cGVvZihHTV9pbmZvLnNjcmlwdEhhbmRsZXIpICE9PSAidW5kZWZpbmVkIiAmJiBHTV9pbmZvLnNjcmlwdEhhbmRsZXIudG9Mb3dlckNhc2UoKSA9PT0gImdyZWFzZW1vbmtleSI7CiAgbGV0IGlzTmV3R00gPSBmYWxzZTsKICAvLyBpbkV4dE1vZGUgJiBpbkdNTW9kZQogIC8vIHRydWUgICAgdHJ1ZSA95omp5bGV5LiL55qER03ku6PnoIEg5LiN5omn6KGMCiAgLy8gdHJ1ZSAgICBmYWxzZT3mianlsZXkuIvku6PnoIEg5omn6KGMCiAgLy8gZmFsc2UgIHRydWUgPeS7hUdN5Luj56CBIOaJp+ihjAogIC8vIGZhbHNlICBmYWxzZT3lvILluLgg5L2G5piv6L+Y5piv6KaB5omn6KGM5Luj56CBCiAgZGVidWcoIueoi+W6j+W8gOWniyIpOwogIGlmIChpbkV4dE1vZGUgPT09IHRydWUgJiYgaW5HTU1vZGUgPT09IHRydWUgfHwgdHlwZW9mKHdpbmRvdy5BQzY2NkluaXQpICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5sb2coIuaJqeWxleaooeW8jy3ohJrmnKzkuI3lkK/nlKgiKTsKICAgIHJldHVybjsKICB9CiAgd2luZG93LkFDNjY2SW5pdCA9IHRydWUKICBpZiAodHlwZW9mIChHTSkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAvLyDov5nkuKrmmK9WaW9sZW50TW9ua2V555qE5pSv5oyB6YCJ6aG5CiAgICBHTSA9IHt9OwogICAgR00uc2V0VmFsdWUgPSBHTV9zZXRWYWx1ZTsKICAgIEdNLmdldFZhbHVlID0gR01fZ2V0VmFsdWU7CiAgfQogIChmdW5jdGlvbiAoKSB7CiAgICBkZWJ1Zygi56iL5bqP5omn6KGMIik7CiAgICBsZXQgbmVlZERpc3BsYXlOZXdGdW4gPSB0cnVlOyAvLyDmnKzmrKHmm7TmlrDmmK/lkKbmnInmlrDlip/og73pnIDopoHlsZXnpLoKICAgIGlmICh3aW5kb3cuTm9kZUxpc3QgJiYgIU5vZGVMaXN0LnByb3RvdHlwZS5mb3JFYWNoKSB7CiAgICAgIE5vZGVMaXN0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgICAgdGhpc0FyZyA9IHRoaXNBcmcgfHwgd2luZG93OwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzW2ldLCBpLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICAvLyBsZXQgUmVkaXJlY3RNYXAgPSBuZXcgTWFwKCk7CiAgICBsZXQgQUNDb25maWcgPSB7fTsKICAgIGxldCBEQkNvbmZpZyA9IHt9OyAvLyDku4XkvZzkuLrmma7pgJpBQ0NvbmZpZ+eahOWOn+Wni+Wkh+S7ve+8jOWcqOWFtuS7lumdnuWFs+mUruS9jee9ruaXtui/m+ihjOS/neWtmOS9v+eUqAogICAgLyrlrZjlnKjlr7nmnKrliJ3lp4vljJblj5jph4/nmoTliJ3lp4vljJbotYvlgLwt5peg6ZyA5ouF5b+D6L+t5Luj5YW85a656Zeu6aKYKi8KICAgIGxldCBEZWZhdWx0Q29uZmlnID0gewogICAgICBpc1JlZGlyZWN0RW5hYmxlOiBmYWxzZSwgIC8vIOaYr+WQpuW8gOWQr+mHjeWumuWQkeWKn+iDvQogICAgICBpc0Fkc0VuYWJsZTogZmFsc2UsIC8vIOaYr+WQpuW8gOWQr+WOu+W5v+WRiuaooeW8jwogICAgICBpc0F1dG9wYWdlOiB0cnVlLCAgLy8g5piv5ZCm5byA5ZCv6Ieq5Yqo57+76aG15Yqf6IO9CiAgICAgIGlzQmxvY2tFbmFibGU6IGZhbHNlLCAvLyDmmK/lkKblvIDlkK/ljrvmi6bmiKrmqKHlvI8KICAgICAgaXNCbG9ja0Rpc3BsYXk6IGZhbHNlLCAvLyDmmK/lkKbliKDpmaTlt7Lmi6bmiKrnmoTmnaHnm64KICAgICAgaXNCbG9ja0J0bk5vdERpc3BsYXk6IGZhbHNlLCAvLyDmmK/lkKbmmL7npLpibG9ja+aMiemSrgogICAgICBBZHNTdHlsZUVuYWJsZTogdHJ1ZSwgLy8g5piv5ZCm5byA5ZCv6Ieq5a6a5LmJ5qC35byP5qih5byPCgogICAgICBiYWlkdTogewogICAgICAgIG5hbWU6ICdiYWlkdScsICAvLyBDU1MgbG9hZCDnmoTliY3nvIDmoIflv5cKICAgICAgICBBZHNTdHlsZU1vZGU6ICcxJywgLy8gMC3kuI3luKZjc3PvvJsxLeWNleWIl+mdoOW3pu+8mzIt5Y2V5YiX5bGF5Lit77ybMy3lj4zliJflsYXkuK0KICAgICAgICBIdVlhbk1vZGU6IGZhbHNlLCAvLyDmiqTnnLzmqKHlvI8t55m+5bqmCiAgICAgIH0sCiAgICAgIGdvb2dsZTogewogICAgICAgIG5hbWU6ICdnb29nbGUnLAogICAgICAgIEFkc1N0eWxlTW9kZTogJzMnLCAvLyAwLeS4jeW4pmNzc++8mzEt5Y2V5YiX6Z2g5bem77ybMi3ljZXliJflsYXkuK3vvJszLeWPjOWIl+WxheS4rQogICAgICAgIEh1WWFuTW9kZTogZmFsc2UsIC8vIOaKpOecvOaooeW8jy3osLfmrYwKICAgICAgfSwKICAgICAgYmluZzogewogICAgICAgIG5hbWU6ICdiaW5nJywKICAgICAgICBBZHNTdHlsZU1vZGU6ICczJywgLy8gMC3kuI3luKZjc3PvvJsxLeWNleWIl+mdoOW3pu+8mzIt5Y2V5YiX5bGF5Lit77ybMy3lj4zliJflsYXkuK0KICAgICAgICBIdVlhbk1vZGU6IGZhbHNlLCAvLyDmiqTnnLzmqKHlvI8t5b+F5bqUCiAgICAgIH0sCiAgICAgIGR1Y2s6IHsKICAgICAgICBuYW1lOiAnZHVjaycsCiAgICAgICAgQWRzU3R5bGVNb2RlOiAnMycsIC8vIDAt5LiN5bimY3Nz77ybMS3ljZXliJfpnaDlt6bvvJsyLeWNleWIl+WxheS4re+8mzMt5Y+M5YiX5bGF5LitCiAgICAgICAgSHVZYW5Nb2RlOiBmYWxzZSwgLy8g5oqk55y85qih5byPLUR1Y2tHT0dPCiAgICAgIH0sCiAgICAgIGRvZ2U6IHsKICAgICAgICBuYW1lOiAnZG9nZScsCiAgICAgICAgQWRzU3R5bGVNb2RlOiAnMycsIC8vIDAt5LiN5bimY3Nz77ybMS3ljZXliJfpnaDlt6bvvJsyLeWNleWIl+WxheS4re+8mzMt5Y+M5YiX5bGF5LitCiAgICAgICAgSHVZYW5Nb2RlOiBmYWxzZSwgLy8g5oqk55y85qih5byPLUR1Y2tHT0dPCiAgICAgIH0sCiAgICAgIHNvZ291OiB7CiAgICAgICAgbmFtZTogJ3NvZ291JywKICAgICAgICBBZHNTdHlsZU1vZGU6ICcxJywgLy8gMC3kuI3luKZjc3PvvJsxLeWNleWIl+mdoOW3pu+8mzIt5Y2V5YiX5bGF5Lit77ybMy3lj4zliJflsYXkuK0KICAgICAgICBIdVlhbk1vZGU6IGZhbHNlLCAvLyDmiqTnnLzmqKHlvI8t5pCc54uXCiAgICAgIH0sCiAgICAgIHpoaWh1OiB7CiAgICAgICAgbmFtZTogJ3poaWh1JywKICAgICAgICBBZHNTdHlsZU1vZGU6ICcwJywgLy8gMC3kuI3luKZjc3PvvJsxLeWNleWIl+mdoOW3pu+8mzIt5Y2V5YiX5bGF5Lit77ybMy3lj4zliJflsYXkuK0KICAgICAgICBIdVlhbk1vZGU6IGZhbHNlLCAvLyDmiqTnnLzmqKHlvI8t5pCc54uXCiAgICAgIH0sCiAgICAgIG90aGVyOiB7CiAgICAgICAgbmFtZTogJ290aGVyJywKICAgICAgICBBZHNTdHlsZU1vZGU6ICcwJywgLy8gMC3kuI3luKZjc3PvvJsxLeWNleWIl+mdoOW3pu+8mzIt5Y2V5YiX5bGF5Lit77ybMy3lj4zliJflsYXkuK0KICAgICAgICBIdVlhbk1vZGU6IGZhbHNlLCAvLyDmiqTnnLzmqKHlvI8t5pCc54uXCiAgICAgIH0sCgogICAgICBTdHlsZV9CYWlkdUxpdGU6IGZhbHNlLCAvLyBCYWlkdV9MaXRl5qC35byP6KGoCgogICAgICBkZWZhdWx0SHVZYW5Db2xvcjogIiNERUYxRUYiLAogICAgICBpc1VzZXJDb2xvckVuYWJsZTogdHJ1ZSwgLy8g5piv5ZCm5byA5ZCvZmF2aWNvbuWbvuagh+WKn+iDvQogICAgICBpc0Zhdmljb25FbmFibGU6IHRydWUsIC8vIOaYr+WQpuW8gOWQr2Zhdmljb27lm77moIflip/og70KICAgICAgZGVmYXVsdEZhdmljb25Vcmw6ICJodHRwczovL2FlMDEuYWxpY2RuLmNvbS9rZi9IVEIxZFJZMFg4T0QzS1ZqU1pGRnE2QW45cFhheS5qcGciLCAvLyDpu5jorqTlm77moIflnLDlnYAKICAgICAgZG9EaXNhYmxlU3VnOiB0cnVlLCAvLyDmmK/lkKbnpoHmraLnmb7luqbmkJzntKLpooTmtYsKICAgICAgaXNSaWdodERpc3BsYXlFbmFibGU6IHRydWUsIC8vIOaYr+WQpuW8gOWQr+WPs+S+p+i+ueagjwogICAgICBpc0NvdW50ZXJFbmFibGU6IGZhbHNlLCAvLyDmmK/lkKbmmL7npLrorqHmlbDlmagKICAgICAgaXNBTGluZUVuYWJsZTogZmFsc2UsIC8vIOaYr+WQpuemgeatouS4i+WIkue6vwogICAgICBpc1VzZXJTdHlsZUVuYWJsZTogZmFsc2UsIC8vIOaYr+WQpuW8gOWQr+iHquWumuS5ieagt+W8jwogICAgICBub3JtYWxpemVEdWNrOiB0cnVlLCAvLyDmmK/lkKbmjInnhafluLjnlKjkuaDmg6/ljrvphY3nva5EdWNrRHVja0dvCiAgICAgIGFjY2VwdExpY2Vuc2U6IGZhbHNlLAogICAgICBpc0VuTGFuZzogZmFsc2UsCiAgICAgIGlzR29vbGVJbkJhaWR1TW9kZUVuYWJsZTogZmFsc2UsIC8vIOaYr+WQpuW8gOWQr+iwt+atjOaQnOe0oue7k+aenOmhteeahOeZvuW6puWbvuagh+aYvuekugogICAgICBVc2VyQmxvY2tMaXN0OiBbXSwKICAgICAgVXNlclN0eWxlVGV4dDoKICAgICAgICBgLyoq6K6h5pWw5Zmo55qE6aKc6Imy5qC35byPKi8KZGl2IC5BQy1Db3VudGVyVHsKICBiYWNrZ3JvdW5kOiAjRkQ5OTk5Owp9Ci8qKuWPs+S+p+agj+eahOagt+W8jy3lhbblrp7kuI3lvIDlkK/mm7Tlpb3nnIvkuIDkupsqLwojY29udGVudF9yaWdodHsKICBwYWRkaW5nOiAyMHB4IDE1cHggMTVweDsKICBib3JkZXItcmFkaXVzOiA1cHg7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsKICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsKICAtbW96LWJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsKfQpib2R5W2JhaWR1XSB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CmJvZHlbYmFpZHVdOmJlZm9yZSB7CiAgcG9zaXRpb246IGZpeGVkOwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICB0b3A6IDA7CiAgbGVmdDogMDsKICBjb250ZW50OiAnJzsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2h0dHBzOi8vaW1nLnR1amlkdS5jb20vaW1hZ2UvNWZkZGU4NDY4NDIzZS5qcGcnKTsKICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgYXV0bzsKICBvcGFjaXR5OiAxOyAvKuiDjOaZr+WbvumAj+aYjuW6pj0wLjjvvIzmnIDlpKcxKi8KfQovKirpmpDol4/pppbpobXnmoTlpKflm77moIct5L+u5aSN5Y+v6IO95a+86Ie05aSW5o+05qC35byP5byC5bi4KiovCmJvZHlbYmFpZHVdICNzX2xnX2ltZ19uZXd7CiAgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7Cn0KYm9keVtiYWlkdV0gLmMtY29udGFpbmVyewogIGJvcmRlci1yYWRpdXM6IDVweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LCAwLjMpICFpbXBvcnRhbnQ7IC8q55m+5bqm5pCc57Si5Z2X5L2T55qE6aKc6Imy77yb6YCP5piO5bqmPTAuMe+8jOacgOWkpzEqLwp9CmJvZHlbYmFpZHVdIC5jLWNvbnRhaW5lciBoM3sKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0OCwyNDgsMjQ4LCAwLjMpICFpbXBvcnRhbnQ7IC8q55m+5bqm5pCc57Si5Z2X5L2TIC0g5qCH6aKY55qE6aKc6Imy77yb6YCP5piO5bqmPTAuMe+8jOacgOWkpzEqLwp9YCwKICAgICAgb2xkVmVyc2lvbjogIiIsCiAgICAgIGxhc3RTYXZlVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICB9OwogICAgbGV0IENPTlNUID0gewogICAgICBoYXNOZXdGdW5jTmVlZERpc3BsYXk6IHRydWUsCiAgICAgIHNvcnRJbmRleDogMSwKICAgICAgaXNHb29nbGVJbWFnZVVybDogZmFsc2UsCiAgICAgIGlzR29vZ2xlU3BlY2lhbDogZmFsc2UsIC8vIOWIpOaWreaYr+WQpuWtmOWcqCNyc28+Lmc7IHRydWU95a2Y5ZyoCiAgICAgIHVzZUl0ZW06IHt9LAogICAgICBTdHlsZU1hbmdlcjogZnVuY3Rpb24gKCkgewogICAgICB9LAogICAgfTsKCiAgICB2YXIgY3VyU2l0ZSA9IHsKICAgICAgU2l0ZVR5cGVJRDogMSwgIC8vIOW9k+WJjeermeeCueeahElECiAgICAgIE1haW5UeXBlOiAiIiwgICAgLy8g5Li75L2T6IqC54K577yM5b6I5aSa5Liq55qE54i26IqC54K5CiAgICAgIFN0eXBlX05vcm1hbDogIiIsIC8vIOmHjeWumuWQkemAieaLqeWZqO+8jOWPquacieeZvuW6pi3mkJzni5ct5aW95pCcCiAgICAgIEZhdmljb25UeXBlOiAiIiwgIC8vIGZhdmljb27nmoTln5/lkI3mo4Dmn6XlmahjaXRl77yM55So5LqO6I635Y+WaG9zdOeUqAogICAgICBGYXZpY29uQWRkVG86ICIiLCAvLyBmYXZpY29u6YCJ5oup5Zmo77yM55So5LqO5o+S5YWl5YiwdGl0bGXkuYvliY3nmoQKICAgICAgQ291bnRlclR5cGU6ICIiLCAgLy8g6K6h5pWw5Zmo5re75Yqg55qE5L2N572u77yM5LiA6Iis5ZKMZmF2aWNvbuS9jee9ruS4gOiHtAogICAgICBCbG9ja1R5cGU6ICIiLCAgLy8g5bGP6JS95oyJ6ZKu55qE5L2N572u77yM5LiA6Iis5ZyodGl0bGXkuYvlkI4KICAgIH07CiAgICBsZXQgREJTaXRlID0gewogICAgICBiYWlkdTogewogICAgICAgIFNpdGVUeXBlSUQ6IDEsCiAgICAgICAgTWFpblR5cGU6ICIjY29udGVudF9sZWZ0IC5jLWNvbnRhaW5lciIsCiAgICAgICAgU3R5cGVfTm9ybWFsOiAiaDMudD5hLCAuYy1jb250YWluZXIgYXJ0aWNsZSBhIiwKICAgICAgICBGYXZpY29uVHlwZTogIi5jLXNob3d1cmwiLAogICAgICAgIEZhdmljb25BZGRUbzogImgzIiwKICAgICAgICBDb3VudGVyVHlwZTogIiNjb250ZW50X2xlZnQ+I2RvdWJsZT5kaXZbc3JjaWRdICpbY2xhc3N+PXRdLFtjbGFzc349b3BfYmVzdF9hbnN3ZXJfcXVlc3Rpb25dLCNjb250ZW50X2xlZnQ+ZGl2W3NyY2lkXSAqW2NsYXNzfj10XSxbY2xhc3N+PW9wX2Jlc3RfYW5zd2VyX3F1ZXN0aW9uXSIsCiAgICAgICAgQmxvY2tUeXBlOiAiaDMgYSIsCiAgICAgICAgcGFnZXI6IHsKICAgICAgICAgIG5leHRMaW5rOiAnLy9kaXZbQGlkPSJwYWdlIl0vL2FbY29udGFpbnModGV4dCgpLCLkuIvkuIDpobUiKV1bQGhyZWZdJywKICAgICAgICAgIHBhZ2VFbGVtZW50OiAiY3NzO2RpdiNjb250ZW50X2xlZnQgPiAqIiwKICAgICAgICAgIEhUX2luc2VydDogWyJjc3M7ZGl2I2NvbnRlbnRfbGVmdCIsIDJdLAogICAgICAgICAgcmVwbGFjZUU6ICJjc3M7I3BhZ2UiLAogICAgICAgICAgc3R5bGlzaDogIi5hdXRvcGFnZXJpemVfcGFnZV9pbmZvLCBkaXYuc3Atc2VwYXJhdG9yIHttYXJnaW4tYm90dG9tOiAxMHB4ICFpbXBvcnRhbnQ7fSIsCiAgICAgICAgfQogICAgICB9LAogICAgICBzb2dvdTogewogICAgICAgIFNpdGVUeXBlSUQ6IDIsCiAgICAgICAgTWFpblR5cGU6ICIjbWFpbiAucmVzdWx0cz5kaXYiLAogICAgICAgIFN0eXBlX05vcm1hbDogImgzLnB0PmEsIGgzLnZyVGl0bGU+YSIsCiAgICAgICAgRmF2aWNvblR5cGU6ICJjaXRlW2lkKj0nY2FjaGVyZXN1bHRfaW5mb18nXSIsCiAgICAgICAgRmF2aWNvbkFkZFRvOiAiaDMiLAogICAgICAgIENvdW50ZXJUeXBlOiAiLnJlc3VsdHM+ZGl2IiwKICAgICAgICBCbG9ja1R5cGU6ICJoMyBhIiwKICAgICAgICBwYWdlcjogewogICAgICAgICAgbmV4dExpbms6ICIvL2RpdltAaWQ9XCJwYWdlYmFyX2NvbnRhaW5lclwiXS8vYVtAaWQ9XCJzb2dvdV9uZXh0XCJdIiwKICAgICAgICAgIHBhZ2VFbGVtZW50OiAiLy9kaXZbQGNsYXNzPVwicmVzdWx0c1wiXS9kaXYiLAogICAgICAgICAgSFRfaW5zZXJ0OiBbIi8vZGl2W0BjbGFzcz1cInJlc3VsdHNcIl0iLCAyXSwKICAgICAgICAgIHJlcGxhY2VFOiAiaWQoXCJwYWdlYmFyX2NvbnRhaW5lclwiKSIKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGhhb3NvdTogewogICAgICAgIFNpdGVUeXBlSUQ6IDMsCiAgICAgICAgTWFpblR5cGU6ICIucmVzLWxpc3QiLAogICAgICAgIFN0eXBlX05vcm1hbDogIi5yZXMtbGlzdCBoMz5hIiwKICAgICAgICBGYXZpY29uVHlwZTogImNpdGUiLAogICAgICAgIEZhdmljb25BZGRUbzogImgzIiwKICAgICAgICBDb3VudGVyVHlwZTogIi5yZXN1bHRzPmRpdiIsCiAgICAgICAgQmxvY2tUeXBlOiAiaDMgYSIsCiAgICAgICAgcGFnZXI6IHsKICAgICAgICAgIG5leHRMaW5rOiAiLy9kaXZbQGlkPSdwYWdlJ10vL2FbdGV4dCgpPSfkuIvkuIDpobU+J10gfCBpZCgnc25leHQnKSIsCiAgICAgICAgICBwYWdlRWxlbWVudDogIi8vZGl2W0BpZD0nY29udGFpbmVyJ10vZGl2IiwKICAgICAgICAgIEhUX2luc2VydDogWyIvL2RpdltAaWQ9J2NvbnRhaW5lciddIiwgMl0sCiAgICAgICAgICByZXBsYWNlRTogImlkKCdwYWdlJykiCiAgICAgICAgfQogICAgICB9LAogICAgICBnb29nbGU6IHsKICAgICAgICBTaXRlVHlwZUlEOiA0LAogICAgICAgIE1haW5UeXBlOiAiI3JzbyAuZyIsCiAgICAgICAgRmF2aWNvblR5cGU6ICIuaVVoMzAiLAogICAgICAgIEZhdmljb25BZGRUbzogImgzIiwKICAgICAgICBDb3VudGVyVHlwZTogIiNyc28gLmcgaDMsLl95RT5kaXZbY2xhc3N+PV9ra10gaDMiLAogICAgICAgIEJsb2NrVHlwZTogIi5yYz4ucj5hIiwKICAgICAgICBwYWdlcjogewogICAgICAgICAgbmV4dExpbms6ICdpZCgicG5uZXh0IikgfCBpZCgibmF2YmFyIG5hdmNudCBuYXYiKS8vdGRbc3Bhbl0vZm9sbG93aW5nLXNpYmxpbmc6OnRkWzFdL2EgfCBpZCgibm4iKS9wYXJlbnQ6OmEnLAogICAgICAgICAgcGFnZUVsZW1lbnQ6ICcvL2RpdltAaWQ9InJlcyJdJywKICAgICAgICAgIEhUX2luc2VydDogWyJjc3M7I3JlcyIsIDJdLAogICAgICAgICAgcmVwbGFjZUU6ICcvL2RpdltAaWQ9Im5hdmNudCJdIHwgLy9kaXZbQGlkPSJyY250Il0vL2RpdltAcm9sZT0ibmF2aWdhdGlvbiJdJwogICAgICAgIH0KICAgICAgfSwKICAgICAgYmluZzogewogICAgICAgIFNpdGVUeXBlSUQ6IDUsCiAgICAgICAgTWFpblR5cGU6ICIjYl9yZXN1bHRzPmxpIiwKICAgICAgICBGYXZpY29uVHlwZTogIi5iX2F0dHJpYnV0aW9uPmNpdGUiLAogICAgICAgIEZhdmljb25BZGRUbzogImgyIiwKICAgICAgICBDb3VudGVyVHlwZTogIiNiX3Jlc3VsdHM+bGlbY2xhc3N+PWJfYW5zXT5oMiwjYl9yZXN1bHRzPmxpW2NsYXNzfj1iX2FsZ29dPmgyLCNiX3Jlc3VsdHM+bGlbY2xhc3N+PWJfYWxnb10+aDIiLAogICAgICAgIEJsb2NrVHlwZTogImgyIGEiLAogICAgICAgIHBhZ2VyOiB7CiAgICAgICAgICBuZXh0TGluazogIi8vYVtjb250YWlucyhAY2xhc3MsXCJzYl9wYWdOXCIpXSIsCiAgICAgICAgICBwYWdlRWxlbWVudDogImlkKFwiYl9yZXN1bHRzXCIpL2xpW25vdChjb250YWlucyhAY2xhc3MsXCJiX3BhZ1wiKSBvciBjb250YWlucyhAY2xhc3MsXCJiX2FucyBiX3RvcFwiKSldIiwKICAgICAgICAgIEhUX2luc2VydDogWyJpZChcImJfcmVzdWx0c1wiKS9saVtAY2xhc3M9XCJiX3BhZ1wiXSIsIDFdLAogICAgICAgICAgcmVwbGFjZUU6ICJpZChcImJfcmVzdWx0c1wiKS8vbmF2W0Byb2xlPVwibmF2aWdhdGlvblwiXSIsCiAgICAgICAgfQogICAgICB9LAogICAgICBkdWNrOiB7CiAgICAgICAgU2l0ZVR5cGVJRDogMTAsCiAgICAgICAgTWFpblR5cGU6ICIjbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCIsCiAgICAgICAgRmF2aWNvblR5cGU6ICIucmVzdWx0c19saW5rc19kZWVwIC5yZXN1bHRfX3VybF9fZG9tYWluIiwKICAgICAgICBGYXZpY29uQWRkVG86ICJoMiIsCiAgICAgICAgQ291bnRlclR5cGU6ICIjbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiIsCiAgICAgICAgQmxvY2tUeXBlOiAiaDIgYSIsCiAgICAgICAgcGFnZXI6IHsKICAgICAgICAgIG5leHRMaW5rOiAiLy9hW2NvbnRhaW5zKEBjbGFzcyxcInNiX3BhZ05cIildIiwKICAgICAgICAgIHBhZ2VFbGVtZW50OiAiaWQoXCJiX3Jlc3VsdHNcIikvbGlbbm90KGNvbnRhaW5zKEBjbGFzcyxcImJfcGFnXCIpIG9yIGNvbnRhaW5zKEBjbGFzcyxcImJfYW5zIGJfdG9wXCIpKV0iLAogICAgICAgICAgSFRfaW5zZXJ0OiBbImlkKFwiYl9yZXN1bHRzXCIpL2xpW0BjbGFzcz1cImJfcGFnXCJdIiwgMV0sCiAgICAgICAgICByZXBsYWNlRTogImlkKFwiYl9yZXN1bHRzXCIpLy9uYXZbQHJvbGU9XCJuYXZpZ2F0aW9uXCJdIiwKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRvZ2U6IHsKICAgICAgICBTaXRlVHlwZUlEOiAxMSwKICAgICAgICBNYWluVHlwZTogIiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIiwKICAgICAgICBGYXZpY29uVHlwZTogIi5yZXN1bHRzX2xpbmtzX2RlZXAgLnJlc3VsdF9fdXJsX19kb21haW4iLAogICAgICAgIEZhdmljb25BZGRUbzogImgyIiwKICAgICAgICBDb3VudGVyVHlwZTogIiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIiwKICAgICAgICBCbG9ja1R5cGU6ICJoMiBhIiwKICAgICAgICBwYWdlcjogewogICAgICAgICAgbmV4dExpbms6ICIvL2FbY29udGFpbnMoQGNsYXNzLFwic2JfcGFnTlwiKV0iLAogICAgICAgICAgcGFnZUVsZW1lbnQ6ICJpZChcImJfcmVzdWx0c1wiKS9saVtub3QoY29udGFpbnMoQGNsYXNzLFwiYl9wYWdcIikgb3IgY29udGFpbnMoQGNsYXNzLFwiYl9hbnMgYl90b3BcIikpXSIsCiAgICAgICAgICBIVF9pbnNlcnQ6IFsiaWQoXCJiX3Jlc3VsdHNcIikvbGlbQGNsYXNzPVwiYl9wYWdcIl0iLCAxXSwKICAgICAgICAgIHJlcGxhY2VFOiAiaWQoXCJiX3Jlc3VsdHNcIikvL25hdltAcm9sZT1cIm5hdmlnYXRpb25cIl0iLAogICAgICAgIH0KICAgICAgfSwKICAgICAgbUJhaWR1OiB7CiAgICAgICAgU2l0ZVR5cGVJRDogNiwKICAgICAgICBNYWluVHlwZTogIiNiX3Jlc3VsdHM+bGkiLAogICAgICAgIEZhdmljb25UeXBlOiAiLmJfYXR0cmlidXRpb24+Y2l0ZSIsCiAgICAgICAgRmF2aWNvbkFkZFRvOiAiaDIiLAogICAgICAgIENvdW50ZXJUeXBlOiAiI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbnNdPmgyLCNiX3Jlc3VsdHM+bGlbY2xhc3N+PWJfYWxnb10+aDIsI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbGdvXT5oMiIsCiAgICAgICAgQmxvY2tUeXBlOiAiaDIgYSIsCiAgICAgIH0sCiAgICAgIHpoaWh1OiB7CiAgICAgICAgU2l0ZVR5cGVJRDogNywKICAgICAgfSwKICAgICAgYmFpZHVfeHVlc2h1OiB7CiAgICAgICAgU2l0ZVR5cGVJRDogOCwKICAgICAgICBNYWluVHlwZTogIiNjb250ZW50X2xlZnQgLnJlc3VsdCIsCiAgICAgICAgU3R5cGVfTm9ybWFsOiAiaDMudD5hLCAjcmVzdWx0cyAuYy1jb250YWluZXI+LmMtYmxvY2thIiwKICAgICAgICBGYXZpY29uVHlwZTogIi5yZXN1bHQtb3AsIC5jLXNob3d1cmwiLCAvLyBiYWlkdSDkvLzkuY7opoHmlLnniYjkuobvvJ8KICAgICAgICBGYXZpY29uQWRkVG86ICJoMyIsCiAgICAgICAgQ291bnRlclR5cGU6ICIjY29udGVudF9sZWZ0PiNkb3VibGU+ZGl2W3NyY2lkXSAqW2NsYXNzfj10XSxbY2xhc3N+PW9wX2Jlc3RfYW5zd2VyX3F1ZXN0aW9uXSwjY29udGVudF9sZWZ0PmRpdltzcmNpZF0gKltjbGFzc349dF0sW2NsYXNzfj1vcF9iZXN0X2Fuc3dlcl9xdWVzdGlvbl0iLAogICAgICAgIEJsb2NrVHlwZTogImgzIGEiLAogICAgICB9LAogICAgICBvdGhlcjogewogICAgICAgIFNpdGVUeXBlSUQ6IDksCiAgICAgIH0KICAgIH07CiAgICBsZXQgU2l0ZVR5cGUgPSB7CiAgICAgIEJBSURVOiBEQlNpdGUuYmFpZHUuU2l0ZVR5cGVJRCwKICAgICAgTUJBSURVOiBEQlNpdGUubUJhaWR1LlNpdGVUeXBlSUQsCiAgICAgIFNPR09VOiBEQlNpdGUuc29nb3UuU2l0ZVR5cGVJRCwKICAgICAgU086IERCU2l0ZS5oYW9zb3UuU2l0ZVR5cGVJRCwKICAgICAgR09PR0xFOiBEQlNpdGUuZ29vZ2xlLlNpdGVUeXBlSUQsCiAgICAgIEJJTkc6IERCU2l0ZS5iaW5nLlNpdGVUeXBlSUQsCiAgICAgIERVQ0s6IERCU2l0ZS5kdWNrLlNpdGVUeXBlSUQsCiAgICAgIERPR0U6IERCU2l0ZS5kb2dlLlNpdGVUeXBlSUQsCiAgICAgIFpISUhVOiBEQlNpdGUuemhpaHUuU2l0ZVR5cGVJRCwKICAgICAgQkFJRFVfWFVFU0hVOiBEQlNpdGUuYmFpZHVfeHVlc2h1LlNpdGVUeXBlSUQsCiAgICAgIE9USEVSUzogOAogICAgfTsKICAgIGxldCBvdGhlckRhdGEgPSB7CiAgICAgIG90aGVyOiB7CiAgICAgICAgY3VyVGFiOiAxLCAvLyDlsZXnpLrnrKzkuoxwYW5lbAogICAgICAgIHNob3dCbG9ja0xpc3RBcmVhOiBmYWxzZSwgLy8gYmxvY2tMaXN05bGV56S65L2NdGV4dGFyZWEKICAgICAgICBhZGRCbG9ja0l0ZW06ICIiLCAgICAgLy8g55So5oi35omL5Yqo6L6T5YWl55qE5oum5oiq6KeE5YiZCiAgICAgICAgY3VySG9zdHM6IFtdLCAgICAgICAgIC8vIOWtmOaUvuW3sue7j+iuv+mXrueahGhvc3Rz5pWw5o2u5YaF5a65CiAgICAgIH0KICAgIH07ICAvLyDliLDml7blgJnmjILovb3liLBvdGhlcuS4igogICAgbGV0IEFsbERhdGEgPSB7CiAgICAgIEFDQ29uZmlnOiB7fSwKICAgICAgb3RoZXI6IG90aGVyRGF0YS5vdGhlciwKICAgICAgQ09OU1Q6IENPTlNULAogICAgICBsYW46IHsKICAgICAgICB1c2U6IHt9LAogICAgICAgIHpoX2NuOiB7CiAgICAgICAgICBtZW51X3RleHQ6ICLoh6rlrprkuYkiLAogICAgICAgICAgY3VyTGFuZzogInpoX2NuIiwKICAgICAgICAgIGZpZWxkc2V0X3BhbmVsOiB7CiAgICAgICAgICAgIHBhbmVsX3RpdGxlOiAiQUMt6YeN5a6a5ZCR6K6+572uICIgKyBHTV9pbmZvLnNjcmlwdC52ZXJzaW9uICsgKGluRXh0TW9kZT8gJ0V4dCc6JycpLAogICAgICAgICAgICBzZXR0aW5nX3BhbmVsOiB7CiAgICAgICAgICAgICAgcmVkaXJlY3RfdGV4dDogIuS4u+WKn+iDvS3ph43lrprlkJHlip/og70iLAogICAgICAgICAgICAgIHJlZGlyZWN0X3RpdGxlOiAi6YeN5a6a5ZCR5Yqf6IO955qE5byA5ZCv5LiO5ZCmIiwKICAgICAgICAgICAgICB1c2VFbl90ZXh0OiAiRW4tTGFuZ3VhZ2UiLAogICAgICAgICAgICAgIHVzZUVuX3RpdGxlOiAiVXNpbmcgRW5nbGlzaCBsYW5ndWFnZSB0byBkaXNwbGF5IiwKICAgICAgICAgICAgICBhZHNfdGV4dDogIumZhOWKoDEt5Y675bm/5ZGK5Yqf6IO9IiwKICAgICAgICAgICAgICBhZHNfdGl0bGU6ICLljrvpmaTpg6jliIbpobXpnaLnmoTlub/lkYrkv6Hmga/vvIzov5jkvaDkuIDkuKrlubLlh4DmlbTmtIHnmoTpobXpnaIiLAogICAgICAgICAgICAgIGF1dG9wYWdlX3RleHQ6ICLoh6rliqjnv7vpobUiLAogICAgICAgICAgICAgIGF1dG9wYWdlX3RpdGxlOiAi6Ieq5Yqo57+76aG1IiwKICAgICAgICAgICAgICBibG9ja2VuYWJsZV90ZXh0OiAi6ZmE5YqgMi3oh6rkuLvmi6bmiKrln5/lkI0iLAogICAgICAgICAgICAgIGJsb2NrZW5hYmxlX3RpdGxlOiAi54K55Ye76aG16Z2iYmxvY2vmjInpkq7mt7vliqDkvaDmg7PopoHpmpDol4/nmoTlnLDlnYDvvIzohJrmnKzlsIboh6rliqjpmpDol4/pg6jliIbnu5PmnpzkuLrlsI/mqKrluYXvvIxESVnmjInpkq7kuK3ngrnlh7vooajmoLzlhoXlrrnlj6/ku6Xlj5bmtojpmpDol48iLAogICAgICAgICAgICAgIGJsb2NrRGl5QnRuX3RleHQ6ICJESVkiLAogICAgICAgICAgICAgIGJsb2NrRGl5QnRuX3RpdGxlOiAi6Ieq5a6a5LmJQkxPQ0siLAogICAgICAgICAgICAgIGJsb2NrQXV0b1JlbW92ZV90ZXh0OiAi6ZqQ6JeP57uT5p6cIiwKICAgICAgICAgICAgICBibG9ja0F1dG9SZW1vdmVfdGl0bGU6ICLoh6rliqjpmpDol4/lt7Lnu4/lsY/olL3nmoTln5/lkI0iLAogICAgICAgICAgICAgIGJsb2NrQnRuU2hvd190ZXh0OiAi6ZqQ6JePJ2Jsb2NrJ+aMiemSriIsCiAgICAgICAgICAgICAgYmxvY2tCdG5TaG93X3RpdGxlOiAi6ZqQ6JeP5o6JYmxvY2vmjInpkq7nmoTmmL7npLoiLAoKICAgICAgICAgICAgICB1c2VyU3R5bGVfdGV4dDogIumZhOWKoDMt6Ieq5a6a5LmJ5qC35byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfbGFibGU6ICLlsZXlvIDnmb7luqborr7nva4+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1X29yaWdpbjogIueZvuW6pi3ljp/lp4vmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV9odXlhbjogIueZvuW6pi3miqTnnLzmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV9iYWlkdUxpdGU6ICLnmb7luqZMaXRl5qC35byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfMWxpbmU6ICLljZXliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV8xbGluZV9lbnRlcjogIuWNleWIl+WxheS4rSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1XzJsaW5lOiAi5Y+M5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfM2xpbmU6ICLkuInliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV80bGluZTogIuWbm+WIlyIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfbGFibGU6ICLlsZXlvIDosLfmrYzorr7nva4+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV9vcmlnaW46ICLosLfmrYwt5Y6f5aeL5qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlX2h1eWFuOiAi6LC35q2MLeaKpOecvOaooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV9nb29nbGVMaXRlOiAi6LC35q2MLeS8quijheeZvuW6piIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8xbGluZTogIuWNleWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8xbGluZV9lbnRlcjogIuWNleWIl+WxheS4rSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8ybGluZTogIuWPjOWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8zbGluZTogIuS4ieWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV80bGluZTogIuWbm+WIlyIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nX2xhYmxlOiAi5bGV5byA5b+F5bqU6K6+572uPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nX29yaWdpbjogIuW/heW6lC3ljp/lp4vmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nX2h1eWFuOiAi5b+F5bqULeaKpOecvOaooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JpbmdfMWxpbmU6ICLljZXliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzFsaW5lX2VudGVyOiAi5Y2V5YiX5bGF5LitIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ18ybGluZTogIuWPjOWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JpbmdfM2xpbmU6ICLkuInliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzRsaW5lOiAi5Zub5YiXIiwKCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291X2xhYmxlOiAi5bGV5byA5pCc54uX6K6+572uPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV9vcmlnaW46ICLmkJzni5ct5Y6f5aeL5qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfaHV5YW46ICLmkJzni5ct5oqk55y85qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfMWxpbmU6ICLljZXliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV8xbGluZV9lbnRlcjogIuWNleWIl+WxheS4rSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291XzJsaW5lOiAi5Y+M5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfM2xpbmU6ICLkuInliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV80bGluZTogIuWbm+WIlyIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrX2xhYmxlOiAi5bGV5byA6bit6bit5pCc6K6+572uPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrX29yaWdpbjogIum4rem4rS3ljp/lp4vmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrX2h1eWFuOiAi6bit6bitLeaKpOecvOaooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfbm9ybWFsOiAi6bit6bitLeW4uOingemFjee9riIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfMWxpbmU6ICLljZXliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzFsaW5lX2VudGVyOiAi5Y2V5YiX5bGF5LitIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja18ybGluZTogIuWPjOWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfM2xpbmU6ICLkuInliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzRsaW5lOiAi5Zub5YiXIiwKCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfbGFibGU6ICLlsZXlvIDlpJrlkInorr7nva4+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2Vfb3JpZ2luOiAi5aSa5ZCJLeWOn+Wni+aooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfaHV5YW46ICLlpJrlkIkt5oqk55y85qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV9ub3JtYWw6ICLlpJrlkIkt5bi46KeB6YWN572uIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV8xbGluZTogIuWNleWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfMWxpbmVfZW50ZXI6ICLljZXliJflsYXkuK0iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlXzJsaW5lOiAi5Y+M5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV8zbGluZTogIuS4ieWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfNGxpbmU6ICLlm5vliJciLAoKICAgICAgICAgICAgICBodXlhbk1vZGVfdGV4dDogIumZhOWKoDQt5oqk55y86aKc6Imy6YWN572uLeiHquWumuS5iTPkuK3pnIDlr7nlupTlvIDlkK8iLAogICAgICAgICAgICAgIGh1eWFuTW9kZV90aXRsZTogIu+8gemcgOimgeWcqOiHquWumuS5ieagt+W8j+S4reWQr+eUqOaKpOecvOaooeW8jyIsCiAgICAgICAgICAgICAgaHV5YW5Db2xvcl90ZXh0OiAi6buY6K6k5oqk55y86aKc6Imy77yaIiwKICAgICAgICAgICAgICBodXlhbkNvbG9yX3RpdGxlOiAi6Ieq5a6a5LmJ55qE5oqk55y86aKc6Imy77yaIiwKICAgICAgICAgICAgICBodXlhbkNvbG9yTW9yZV90ZXh0OiAi5pu05aSa6aKc6Imy6YCJ5oupIiwKCiAgICAgICAgICAgICAgZmF2aWNvbl90ZXh0OiAi6ZmE5YqgNS1GYXZpY29u5Yqf6IO9IiwKICAgICAgICAgICAgICBmYXZpY29uX3RpdGxlOiAiQUMt5re75YqgRmF2aWNvbiIsCiAgICAgICAgICAgICAgZmF2aWNvbl9kZWZhdWx0SWNvbl90ZXh0OiAiRmF2aWNvbum7mOiupOWbvuagh++8miIsCgogICAgICAgICAgICAgIHNlYXJjaE9yaWdpbl90ZXh0OiAi6ZmE5YqgNi3np7vpmaTnmb7luqbmkJzntKLpooTmtYso5paH5a2X6Ieq5Yqo5pCc57SiKSIsCiAgICAgICAgICAgICAgc2VhcmNoT3JpZ2luX3RpdGxlOiAiQUMt56e76Zmk5pCc57Si6aKE5rWLIiwKCiAgICAgICAgICAgICAgc2hvd1JpZ2h0X3RleHQ6ICLpmYTliqA3LeaYvuekuuWPs+S+p+agjyIsCiAgICAgICAgICAgICAgc2hvd0NvdW50ZXJfdGV4dDogIumZhOWKoDgt57yW5Y+35Yqf6IO9IiwKICAgICAgICAgICAgICBoaW50U2hvd0NvdW50ZXJfdGV4dDogIuWPr+iDveS8muWvvOiHtOWbvueJh+WKoOi9veW8guW4uCIsCiAgICAgICAgICAgICAgc2hvd0FMaW5lX3RleHQ6ICLpmYTliqA5LeaWh+Wtl+S4i+WIkue6vyIsCiAgICAgICAgICAgICAgc2hvd1VzZXJTdHlsZV90ZXh0OiAi6ZmE5YqgMTAt6Ieq5a6a5LmJ5qC35byPIOaUr+aMgUxlc3MuanMiLAoKICAgICAgICAgICAgICBjb250YWN0TWVfdGV4dDogIuiBlOezu+S9nOiAhSzmj5Dlu7rorq4s5a+75rGC5biu5YqpLOiHquWumuS5ieagt+W8jyzohJrmnKzlrprliLbngrnmiJEiLAogICAgICAgICAgICAgIGNvbnRhY3RNZV91cmw6ICJodHRwczovL2dpdGh1Yi5jb20vbGFuZ3JlbjEzNTMvR01fc2NyaXB0IiwKCiAgICAgICAgICAgICAgc2V0dGluZ19wYW5lbF9zZWNvbmQ6IHsKICAgICAgICAgICAgICAgIGJhY2tCdG5fdGV4dDogIjwt6L+U5ZueIiwKICAgICAgICAgICAgICAgIGJsb2NrTGFiZWxfdGV4dDogIiDmi6bmiKrliJfooaggIOaDs+imgeeUn+aViOeahOivnemcgOimgeaJi+WKqOS/neWtmCIsCiAgICAgICAgICAgICAgICBibG9ja0VkaXRCdG5fdGV4dDogIue8lui+keWIl+ihqCIsCiAgICAgICAgICAgICAgICBibG9ja0VkaXRCdG5FbmRfdGV4dDogIue7k+adn+e8lui+kSIsCiAgICAgICAgICAgICAgICBhZGRCbG9ja0xhYmVsX3RleHQ6ICLlhajljLnphY3mi6bmiKrvvJoiLAogICAgICAgICAgICAgICAgYWRkQnRuTGFiZWxfdGV4dDogIua3u+WKoCIsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjYW5jZWxCdG5fdGV4dDogIuWPlua2iCIsCiAgICAgICAgICAgICAgb2tCdG5fdGV4dDogIuS/neWtmCIsCiAgICAgICAgICAgICAgcmVzZXRCdG5fdGV4dDogIumHjee9riIsCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGVuOiB7CiAgICAgICAgICBtZW51X3RleHQ6ICJDVVNUT00iLAogICAgICAgICAgY3VyTGFuZzogImVuIiwKICAgICAgICAgIGZpZWxkc2V0X3BhbmVsOiB7CiAgICAgICAgICAgIHBhbmVsX3RpdGxlOiAiQUMgUmVkaXJlY3QgU2V0dGluZ3MgIiArIEdNX2luZm8uc2NyaXB0LnZlcnNpb24gKyAoaW5FeHRNb2RlPyAnRXh0JzonJyksCiAgICAgICAgICAgIHNldHRpbmdfcGFuZWw6IHsKICAgICAgICAgICAgICByZWRpcmVjdF90ZXh0OiAiTWFpbi1SZWRpcmVjdEZ1bmMiLAogICAgICAgICAgICAgIHJlZGlyZWN0X3RpdGxlOiAiVHVybiBvbiBvciBvZmYgcmVkaXJlY3QiLAogICAgICAgICAgICAgIHVzZUVuX3RleHQ6ICJFbi1MYW5ndWFnZSIsCiAgICAgICAgICAgICAgdXNlRW5fdGl0bGU6ICLkvb/nlKjoi7HmlofmmL7npLrpobXpnaIiLAogICAgICAgICAgICAgIGFkc190ZXh0OiAiQWRkMS1SZW1vdmUgQWRzIiwKICAgICAgICAgICAgICBhZHNfdGl0bGU6ICJSZW1vdmUgdGhlIGFkcyBvbiB0aGUgcGFnZSwgYW5kIHJldHVybiB5b3UgYSBjbGVhbiBwYWdlIiwKICAgICAgICAgICAgICBhdXRvcGFnZV90ZXh0OiAiQXV0byBQYWdlciIsCiAgICAgICAgICAgICAgYXV0b3BhZ2VfdGl0bGU6ICJBdXRvIFBhZ2VyIiwKICAgICAgICAgICAgICBibG9ja2VuYWJsZV90ZXh0OiAiQWRkMi1CbG9jayBob3N0IiwKICAgICAgICAgICAgICBibG9ja2VuYWJsZV90aXRsZTogIkNsaWNrIHRoZSBCbG9jayBidXR0b24gdG8gYWRkIHRoZSBhZGRyZXNzIHdoaWNoIHlvdSB3YW50IHRvIGhpZGUuIFRoZSBzY3JpcHQgd2lsbCBoaWRlIGl0IHdpdGggc21hbGwgYmFubmVyIGF1dG9tYXRpY2FsbHkuIERJWSBidXR0b24gZm9yIGVkaXR0aW5nIHRoZSBoaWRpbmcgbGlzdCIsCiAgICAgICAgICAgICAgYmxvY2tEaXlCdG5fdGV4dDogIkRJWSIsCiAgICAgICAgICAgICAgYmxvY2tEaXlCdG5fdGl0bGU6ICJFZGl0IEJMT0NLIiwKICAgICAgICAgICAgICBibG9ja0F1dG9SZW1vdmVfdGV4dDogIkF1dG8gcmVtb3ZlIiwKICAgICAgICAgICAgICBibG9ja0F1dG9SZW1vdmVfdGl0bGU6ICJyZW1vdmUgdGhlIGJsb2NrIHJlc3VsdHMgYXV0b21hdGljYWxseSIsCiAgICAgICAgICAgICAgYmxvY2tCdG5TaG93X3RleHQ6ICJIaWRlICdCbG9jaycgYnV0dG9uIiwKICAgICAgICAgICAgICBibG9ja0J0blNob3dfdGl0bGU6ICJIaWRlICdCbG9jaycgYnV0dG9uIiwKCiAgICAgICAgICAgICAgdXNlclN0eWxlX3RleHQ6ICJBZGQzLUN1c3RvbVN0eWxlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfbGFibGU6ICJFeHBhbmQgQmFpZHUgU2V0dGluZ3M+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1X29yaWdpbjogIkJhaWR1LU9yaWdpbiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1X2h1eWFuOiAiQmFpZHUtRXllU2F2ZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1X2JhaWR1TGl0ZTogIkJhaWR1TGl0ZVN0eWxlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfMWxpbmU6ICJTaW5nbGVSb3ciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV8xbGluZV9lbnRlcjogIlNpbmdsZUNlbnRlciIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1XzJsaW5lOiAiVHdvIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfM2xpbmU6ICJUaHJlZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1XzRsaW5lOiAiRm91ciIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfbGFibGU6ICJFeHBhbmQgR29vZ2xlIFNldHRpbmdzPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfb3JpZ2luOiAiR29vZ2xlLU9yaWdpbiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV9odXlhbjogIkdvb2dsZS1FeWVTYXZlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlX2dvb2dsZUxpdGU6ICJGYWtlIEJhaWR1IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlXzFsaW5lOiAiU2luZ2xlUm93IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlXzFsaW5lX2VudGVyOiAiU2luZ2xlQ2VudGVyIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlXzJsaW5lOiAiVHdvIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlXzNsaW5lOiAiVGhyZWUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfNGxpbmU6ICJGb3VyIiwKCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JpbmdfbGFibGU6ICJFeHBhbmQgQmluZyBTZXR0aW5ncz4+IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ19vcmlnaW46ICJCaW5nLU9yaWdpbiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JpbmdfaHV5YW46ICJCaW5nLUV5ZVNhdmUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzFsaW5lOiAiU2luZ2xlUm93IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ18xbGluZV9lbnRlcjogIlNpbmdsZUNlbnRlciIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JpbmdfMmxpbmU6ICJUd28iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzNsaW5lOiAiVGhyZWUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzRsaW5lOiAiRm91ciIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV9sYWJsZTogIkV4cGFuZCBTb0dvdSBTZXR0aW5ncz4+IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3Vfb3JpZ2luOiAiU29Hb3UtT3JpZ2luIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfaHV5YW46ICJTb0dvdS1FeWVTYXZlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfMWxpbmU6ICJTaW5nbGVSb3ciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV8xbGluZV9lbnRlcjogIlNpbmdsZUNlbnRlciIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291XzJsaW5lOiAiVHdvIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfM2xpbmU6ICJUaHJlZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291XzRsaW5lOiAiRm91ciIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrX2xhYmxlOiAiRXhwYW5kIER1Y2tEdWNrR28gU2V0dGluZ3M+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfb3JpZ2luOiAiRHVja0R1Y2stT3JpZ2luIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja19odXlhbjogIkR1Y2tEdWNrLUV5ZVNhdmUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrX25vcm1hbDogIkR1Y2tEdWNrLU5vcm1hbCIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfMWxpbmU6ICJTaW5nbGVSb3ciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzFsaW5lX2VudGVyOiAiU2luZ2xlQ2VudGVyIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja18ybGluZTogIlR3byIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfM2xpbmU6ICJUaHJlZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfNGxpbmU6ICJGb3VyIiwKCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfbGFibGU6ICJFeHBhbmQgRG9nZURvZ2UgU2V0dGluZ3M+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2Vfb3JpZ2luOiAiRG9nZURvZ2UtT3JpZ2luIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV9odXlhbjogIkRvZ2VEb2dlLUV5ZVNhdmUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlX25vcm1hbDogIkRvZ2VEb2dlLU5vcm1hbCIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfMWxpbmU6ICJTaW5nbGVSb3ciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlXzFsaW5lX2VudGVyOiAiU2luZ2xlQ2VudGVyIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV8ybGluZTogIlR3byIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfM2xpbmU6ICJUaHJlZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfNGxpbmU6ICJGb3VyIiwKCiAgICAgICAgICAgICAgaHV5YW5Nb2RlX3RleHQ6ICJBZGQ0LUV5ZVNhdmUgQ29sb3IgU2V0dGluZy1OZWVkIG9wZW5lZCBpbiBBZGQzIiwKICAgICAgICAgICAgICBodXlhbk1vZGVfdGl0bGU6ICLvvIFPcGVuIEV5ZVNhdmUgTW9kZSBpbiBDdXN0b21TdHlsZSBpcyBNdXN0IiwKICAgICAgICAgICAgICBodXlhbkNvbG9yX3RleHQ6ICJEZWZhdWx0IEV5ZVNhdmUgQ29sb3LvvJoiLAogICAgICAgICAgICAgIGh1eWFuQ29sb3JfdGl0bGU6ICJUaGUgY29sb3Igb2YgRXllU2F2Ze+8miIsCiAgICAgICAgICAgICAgaHV5YW5Db2xvck1vcmVfdGV4dDogIk1vcmUgQ29sb3IiLAoKICAgICAgICAgICAgICBmYXZpY29uX3RleHQ6ICJBZGQ1LUZhdmljb24uRnVuYyIsCiAgICAgICAgICAgICAgZmF2aWNvbl90aXRsZTogIkFDLUFkZEZhdmljb24iLAogICAgICAgICAgICAgIGZhdmljb25fZGVmYXVsdEljb25fdGV4dDogIkZhdmljb25GYWlsZWRJbWfvvJrvvJoiLAoKICAgICAgICAgICAgICBzZWFyY2hPcmlnaW5fdGV4dDogIkFDLVJlbW92ZSBCYWlkdSBBdXRvUHJlZGljdCBpbiB0ZXh0IHNlYXJjaCIsCiAgICAgICAgICAgICAgc2VhcmNoT3JpZ2luX3RpdGxlOiAiQWRkNi1SZW1vdmUgQmFpZHUgQXV0b1ByZWRpY3QgaW4gdGV4dCBzZWFyY2giLAoKICAgICAgICAgICAgICBzaG93UmlnaHRfdGV4dDogIkFkZDctUmlnaHQgU2lkZSBDb2x1bW4iLAogICAgICAgICAgICAgIHNob3dDb3VudGVyX3RleHQ6ICJBZGQ4LU51bUZ1bmMiLAogICAgICAgICAgICAgIGhpbnRTaG93Q291bnRlcl90ZXh0OiAiTWF5IENhdXNlIGltYWdlIGxvYWQgcHJvYmxlbSIsCiAgICAgICAgICAgICAgc2hvd0FMaW5lX3RleHQ6ICJBZGQ5LVRleHRVbmRlckxpbmUiLAogICAgICAgICAgICAgIHNob3dVc2VyU3R5bGVfdGV4dDogIkFkZDEwLVlvdXIgb3duIFN0eWxlIHN1cHBvcnQgTGVzcy5qcyIsCgogICAgICAgICAgICAgIGNvbnRhY3RNZV90ZXh0OiAiRm9yIGNvbnRhY3QgdGhlIHdyaXR0ZXIsIHN1Z2dlc3RzLCBhc2sgZm9yIGhlbHAgdGhlbiBjbGljayBtZSIsCiAgICAgICAgICAgICAgY29udGFjdE1lX3VybDogImh0dHBzOi8vZ2l0aHViLmNvbS9sYW5ncmVuMTM1My9HTV9zY3JpcHQvIiwKCiAgICAgICAgICAgICAgc2V0dGluZ19wYW5lbF9zZWNvbmQ6IHsKICAgICAgICAgICAgICAgIGJhY2tCdG5fdGV4dDogIjwtQmFjayIsCiAgICAgICAgICAgICAgICBibG9ja0xhYmVsX3RleHQ6ICImbmJzcDtCbG9jayBMaXN0Jm5ic3A7Jm5ic3A7Q2xpY2sgU2F2ZSBCdXR0b24gaWYgeW91IHdhbnQgd28gc2F2ZSB0aGUgbGlzdCIsCiAgICAgICAgICAgICAgICBibG9ja0VkaXRCdG5fdGV4dDogIkVkaXQgTGlzdCIsCiAgICAgICAgICAgICAgICBibG9ja0VkaXRCdG5FbmRfdGV4dDogIkVuZCBFZGl0IiwKICAgICAgICAgICAgICAgIGFkZEJsb2NrTGFiZWxfdGV4dDogIkFkZCBCbG9jayBpdGVt77yaIiwKICAgICAgICAgICAgICAgIGFkZEJ0bkxhYmVsX3RleHQ6ICJBZGQiLAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY2FuY2VsQnRuX3RleHQ6ICJDYW5jZWwiLAogICAgICAgICAgICAgIG9rQnRuX3RleHQ6ICJTYXZlIiwKICAgICAgICAgICAgICByZXNldEJ0bl90ZXh0OiAiUmVzZXQiLAogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgbGV0IHZ1ZVZNID0gbnVsbDsKICAgIC8qKuWIneWni+WMluaJgOacieeahOiuvue9rioqLwogICAgUHJvbWlzZS5hbGwoW0dNLmdldFZhbHVlKCJDb25maWciKV0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgbGV0IHJlcyA9IGRhdGFbMF0KICAgICAgaWYgKHJlcyAhPSBudWxsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIEFDQ29uZmlnID0gSlNPTi5wYXJzZShyZXMpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIEFDQ29uZmlnID0gcmVzOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBBQ0NvbmZpZyA9IERlZmF1bHRDb25maWc7CiAgICAgIH0KICAgICAgY29uc3QgbG9jYWxEYXRhID0gbG9jYWxTdG9yYWdlLkFDQ29uZmlnOyAvLyDlsI/lv4PpmpDnp4HmqKHlvI8KICAgICAgaWYobG9jYWxEYXRhICYmIGxvY2FsRGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgQUNDb25maWcgPSBKU09OLnBhcnNlKGxvY2FsRGF0YSk7CiAgICAgIH0KICAgICAgZm9yICh2YXIga2V5IGluIERlZmF1bHRDb25maWcpIHsKICAgICAgICBpZiAodHlwZW9mIChBQ0NvbmZpZ1trZXldKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIEFDQ29uZmlnW2tleV0gPSBEZWZhdWx0Q29uZmlnW2tleV07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChBQ0NvbmZpZy5pc1VzZXJTdHlsZUVuYWJsZSA9PT0gZmFsc2UgJiYgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gQUNDb25maWcubGFzdFNhdmVUaW1lID4gMjU5MjAwMDAwMCkpIHsgLy8g5aSn57qmMzDlpKnml7bpl7QKICAgICAgICAvLyDlpoLmnpznlKjmiLflj5bmtojkuoborr7nva7vvIzlubbkuJTplb/ml7bpl7QoMzDlpKkp5rKh5pyJ6L+b6KGM6L+H5aSE55CG77yM6YKj5LmI55u05o6l5bCG5pWw5o2u572u56m6IC0+IOeUqOS6juWIt+aWsOaVsOaNrgogICAgICAgIGNvbnNvbGUubG9nKCJhYy1iYWlkdSBjc3MgcmVzZXQgZm9yIHRpbWUiKTsKICAgICAgICBBQ0NvbmZpZy5sYXN0U2F2ZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICBBQ0NvbmZpZy5Vc2VyU3R5bGVUZXh0ID0gRGVmYXVsdENvbmZpZy5Vc2VyU3R5bGVUZXh0OwogICAgICB9CiAgICAgIEFsbERhdGEuQUNDb25maWcgPSBBQ0NvbmZpZzsKICAgICAgREJDb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEFDQ29uZmlnKSk7IC8vIOaaguaXtuS9nOS4uuS4gOS4quWOn+Wni+S/neWtmAogICAgICBBbGxEYXRhLmxhbi51c2UgPSBBQ0NvbmZpZy5pc0VuTGFuZyA/IEFsbERhdGEubGFuLmVuIDogQWxsRGF0YS5sYW4uemhfY247CiAgICAgIC8vIOWIneWni+WMluWujOaIkOS5i+WQjuaJjeiDveiwg+eUqOato+W4uOWHveaVsAogICAgICBjYWxsYmFjaygpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKGV4Y2VwdCkgewogICAgICBjb25zb2xlLmxvZyhleGNlcHQpOwogICAgfSk7CgogICAgZnVuY3Rpb24gUmVnX0dldChIVE1MLCByZWcpIHsKICAgICAgbGV0IFJlZ0UgPSBuZXcgUmVnRXhwKHJlZyk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIFJlZ0UuZXhlYyhIVE1MKVsxXTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIEFDU2V0VmFsdWUoa2V5LCB2YWx1ZSkgewogICAgICBHTV9zZXRWYWx1ZShrZXksIHZhbHVlKTsKICAgICAgaWYoa2V5ID09PSAnQ29uZmlnJyl7CiAgICAgICAgbG9jYWxTdG9yYWdlLkFDQ29uZmlnID0gdmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRFbGVtZW50QnlYcGF0aChlLCB0LCByKSB7CiAgICAgIHIgPSByIHx8IGRvY3VtZW50LCB0ID0gdCB8fCByOwogICAgICB0cnkgewogICAgICAgIHJldHVybiByLmV2YWx1YXRlKGUsIHQsIG51bGwsIFhQYXRoUmVzdWx0LkZJUlNUX09SREVSRURfTk9ERV9UWVBFLCBudWxsKS5zaW5nbGVOb2RlVmFsdWU7CiAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICByZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCLml6DmlYjnmoR4cGF0aCIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QWxsRWxlbWVudHMoZSwgdCwgciwgbiwgbykgewogICAgICBsZXQgZ2V0QWxsRWxlbWVudHNCeVhwYXRoID0gZnVuY3Rpb24oZSwgdCwgcikgewogICAgICAgIHJldHVybiByID0gciB8fCBkb2N1bWVudCwgdCA9IHQgfHwgciwgci5ldmFsdWF0ZShlLCB0LCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7CiAgICAgIH0KCiAgICAgIHZhciBpLCBzID0gW107CiAgICAgIGlmICghZSkgcmV0dXJuIHM7CiAgICAgIGlmIChyID0gciB8fCBkb2N1bWVudCwgbiA9IG4gfHwgd2luZG93LCBvID0gbyB8fCB2b2lkIDAsIHQgPSB0IHx8IHIsICJzdHJpbmciID09PSB0eXBlb2YgZSkgaSA9IDAgPT09IGUuc2VhcmNoKC9eY3NzOy9pKSA/IGZ1bmN0aW9uIGdldEFsbEVsZW1lbnRzQnlDU1MoZSwgdCkgewogICAgICAgIHJldHVybiAodCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChlKTsKICAgICAgfShlLnNsaWNlKDQpLCB0KSA6IGdldEFsbEVsZW1lbnRzQnlYcGF0aChlLCB0LCByKTsgZWxzZSB7CiAgICAgICAgaWYgKCEoaSA9IGUociwgbiwgbykpKSByZXR1cm4gczsKICAgICAgICBpZiAoaS5ub2RlVHlwZSkgcmV0dXJuIHNbMF0gPSBpLCBzOwogICAgICB9CiAgICAgIHJldHVybiBmdW5jdGlvbiBtYWtlQXJyYXkoZSkgewogICAgICAgIHZhciB0LCByLCBuLCBvID0gW107CiAgICAgICAgaWYgKGUucG9wKSB7CiAgICAgICAgICBmb3IgKHQgPSAwLCByID0gZS5sZW5ndGg7IHQgPCByOyB0KyspIChuID0gZVt0XSkgJiYgKG4ubm9kZVR5cGUgPyBvLnB1c2gobikgOiBvID0gby5jb25jYXQobWFrZUFycmF5KG4pKSk7CiAgICAgICAgICByZXR1cm4gYSgpKG8pOwogICAgICAgIH0KICAgICAgICBpZiAoZS5pdGVtKSB7CiAgICAgICAgICBmb3IgKHQgPSBlLmxlbmd0aDsgdDspIG9bLS10XSA9IGVbdF07CiAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9CiAgICAgICAgaWYgKGUuaXRlcmF0ZU5leHQpIHsKICAgICAgICAgIGZvciAodCA9IGUuc25hcHNob3RMZW5ndGg7IHQ7KSBvWy0tdF0gPSBlLnNuYXBzaG90SXRlbSh0KTsKICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0KICAgICAgfShpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxsYmFjaygpIHsKICAgICAgaWYgKEFDQ29uZmlnLm9sZFZlcnNpb24gPT09IEdNX2luZm8uc2NyaXB0LnZlcnNpb24pIHsKICAgICAgICBDT05TVC5oYXNOZXdGdW5jTmVlZERpc3BsYXkgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBDT05TVC5oYXNOZXdGdW5jTmVlZERpc3BsYXkgPSBuZWVkRGlzcGxheU5ld0Z1bjsKICAgICAgfQoKICAgICAgIWZ1bmN0aW9uKCkgewogICAgICAgIC8qKgogICAgICAgICAqIOi/m+ihjOS4jemHjeWkjeaPkuWFpe+8jOaPkuWFpeWQjuaJp+ihjOWbnuiwg+WHveaVsAogICAgICAgICAqIEBwYXJhbSBkYXRhIOW+heaPkuWFpeaVsOaNrgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayDlm57osIPlh73mlbAKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBhY3B1c2goZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgIC8vIOWmguaenOaYr+Weg+WcvuaVsOaNru+8jOmCo+S5iOWPr+S7peS4ouW8g+eahAogICAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47CiAgICAgICAgICAvLyDlpoLmnpzmlbDmja7kuK3mnInlm57ovabvvIzpgqPmlbDmja7kuZ/mmK/ml6DmlYjnmoTmraPmlofogIzlt7IKICAgICAgICAgIGlmIChkYXRhLnJlcGxhY2UoLyh7fH18LHxcK3zvvJp844CCfFxuKS8pICE9PSBkYXRhKSByZXR1cm47CiAgICAgICAgICBpZiAodGhpcy5maW5kSW5kZXgobSA9PiBtID09PSBkYXRhKSA8IDApIHsKICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpOwogICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYWNyZW1vdmUoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgIGxldCBkZWxJZCA9IHRoaXMuZmluZEluZGV4KG0gPT4gbSA9PT0gZGF0YSk7CiAgICAgICAgICBpZiAoZGVsSWQgPj0gMCkgewogICAgICAgICAgICB0aGlzLnNwbGljZShkZWxJZCwgMSk7CiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHRoaXMpOwogICAgICAgICAgfSAvLyDliKDpmaRkZWxJZOeahOaVsOaNru+8jOWIoOmZpOS4gOS4qgogICAgICAgIH0KICAgICAgICAvLyDpgb/lhY3msaHmn5PlhajlsYDljp/lnovpk74KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQUNDb25maWcuVXNlckJsb2NrTGlzdCwgJ2FjcHVzaCcsIHt2YWx1ZTogYWNwdXNofSkKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQUNDb25maWcuVXNlckJsb2NrTGlzdCwgJ2FjcmVtb3ZlJywge3ZhbHVlOiBhY3JlbW92ZX0pCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG90aGVyRGF0YS5vdGhlci5jdXJIb3N0cywgJ2FjcHVzaCcsIHt2YWx1ZTogYWNwdXNofSkKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3RoZXJEYXRhLm90aGVyLmN1ckhvc3RzLCAnYWNyZW1vdmUnLCB7dmFsdWU6IGFjcmVtb3ZlfSkKICAgICAgfSgpOwoKCgogICAgICAhZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBpbnNlcnRMb2NrZWQgPSBmYWxzZTsKICAgICAgICBpZiAodHlwZW9mIEdNX2dldFJlc291cmNlVGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIEdNLmdldFJlc291cmNlVGV4dCA9IEdNX2dldFJlc291cmNlVGV4dCA9IGFzeW5jIGZ1bmN0aW9uIChhUmVzb3VyY2VOYW1lKSB7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCAoYXdhaXQgZmV0Y2goYXdhaXQgR00uZ2V0UmVzb3VyY2VVcmwoYVJlc291cmNlTmFtZSkpKS50ZXh0KCk7CiAgICAgICAgICAgIGxldCBzYXZlUmVzID0gYXdhaXQgR00uZ2V0VmFsdWUoYVJlc291cmNlTmFtZSk7CiAgICAgICAgICAgIGlmICh0eXBlb2YgKHNhdmVSZXMpID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgIEdNLnNldFZhbHVlKGFSZXNvdXJjZU5hbWUsIHJlcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuIHNhdmVSZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKEdNX2dldFJlc291cmNlVGV4dCkgewogICAgICAgICAgLy8g5LuF5Zyo5pSv5oyBR01fZ2V0UmVzb3VyY2VUZXh055qE5a655Zmo5LiK6L+b6KGM5Yqo5oCB5pWw5o2u5pu05pawCiAgICAgICAgICAvLyDkuJTog73pmLLmraLosLfmrYznmb7luqbpobXpnaLop4TliJnlpKflj5jliqjlj4jpnIDopoHmm7TmlrDohJrmnKwgLSDnibnliKvmmK/mtonlj4rnv7vpobXlj4LmlbAKICAgICAgICAgIGxldCBjb25maWcgPSBHTV9nZXRSZXNvdXJjZVRleHQoIlNpdGVDb25maWdSdWxlcyIpOwogICAgICAgICAgZXZhbChjb25maWcpOwogICAgICAgICAgaWYgKHR5cGVvZiAob25saW5lREIpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCLnur/kuIrmlbDmja7kuLrnqboiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERCU2l0ZSA9IG9ubGluZURCOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygieHVlc2h1LmJhaWR1LmNvbSIpKSB7CiAgICAgICAgICBjdXJTaXRlID0gREJTaXRlLmJhaWR1X3h1ZXNodTsKICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhvc3QuaW5jbHVkZXMoIi5iYWlkdS5jb20iKSkgewogICAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQucmVwbGFjZSgvKGFuZHJvaWR8bW9iaWxlfGlwaG9uZSkvaWdtLCAiIikgIT09IG5hdmlnYXRvci51c2VyQWdlbnQpIHsKICAgICAgICAgICAgY3VyU2l0ZSA9IERCU2l0ZS5tQmFpZHU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJTaXRlID0gREJTaXRlLmJhaWR1OwogICAgICAgICAgfQogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmJhaWR1OwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygiemhpaHUuY29tIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuemhpaHU7CiAgICAgICAgICBDT05TVC51c2VJdGVtID0gQUNDb25maWcuemhpaHU7CiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5ob3N0LmluY2x1ZGVzKCJzb2dvdSIpKSB7CiAgICAgICAgICBjdXJTaXRlID0gREJTaXRlLnNvZ291OwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLnNvZ291OwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygic28uY29tIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuaGFvc291OwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLm90aGVyOwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygiZ29vZ2xlIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuZ29vZ2xlOwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmdvb2dsZTsKICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhvc3QuaW5jbHVkZXMoImJpbmciKSkgewogICAgICAgICAgY3VyU2l0ZSA9IERCU2l0ZS5iaW5nOwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmJpbmc7CiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5ob3N0LmluY2x1ZGVzKCJkdWNrZHVja2dvIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuZHVjazsKICAgICAgICAgIENPTlNULnVzZUl0ZW0gPSBBQ0NvbmZpZy5kdWNrOwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygiZG9nZWRvZ2UiKSkgewogICAgICAgICAgY3VyU2l0ZSA9IERCU2l0ZS5kb2dlOwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmRvZ2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUub3RoZXI7CiAgICAgICAgICBDT05TVC51c2VJdGVtID0gQUNDb25maWcub3RoZXI7CiAgICAgICAgfQogICAgICAgIGN1clNpdGUucGFnZU51bSA9IDE7IC8vIOW9k+WJjemhteaVsAogICAgICAgIGN1clNpdGUucGFnZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBjdXJTaXRlLnBhZ2VVcmwgPSAiIjsKICAgICAgICBpZiAoCiAgICAgICAgICAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5HT09HTEUgJiYgbG9jYXRpb24uaHJlZi5yZXBsYWNlKC90Ym09KGlzY2h8bGNsfHNob3B8ZmxtKS8sICIiKSAhPT0gbG9jYXRpb24uaHJlZiApIHx8CiAgICAgICAgICAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CSU5HICYmIGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvaW1hZ2VzXC9zZWFyY2gvLCAiIikgIT09IGxvY2F0aW9uLmhyZWYgKQogICAgICAgICkgewogICAgICAgICAgLy8g5Zu+54mH56uZIOOAgeWcsOWbvuermeOAgei0reeJqeermQogICAgICAgICAgY29uc29sZS5sb2coIueJueauiuermSzkuI3liqDovb3moLflvI/vvIzkuI3mt7vliqBtZW51Iik7CiAgICAgICAgICBDT05TVC5pc0dvb2dsZUltYWdlVXJsID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFVfWFVFU0hVKXsKICAgICAgICAgIENPTlNULnVzZUl0ZW0uQWRzU3R5bGVNb2RlID0gMjsgLy8g5Y2V5YiX5bGF5Lit5Y2z5Y+vCiAgICAgICAgfQoKICAgICAgICBpZiAoQUNDb25maWcuQWRzU3R5bGVFbmFibGUpIHsKICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyID0gRlNCYWlkdSgpOyAvLyDmt7vliqDorr7nva7pobkt5Y2V5Y+M5YiX5pi+56S6CiAgICAgICAgfQoKICAgICAgICBjb25zb2xlLmxvZygiJWNbQUMtUmVkaXJlY3RdICVjTGV0IE1lIEludHJvZHVjZSB5b3UgYSBWZXJ5IEdvb2QgU2VhcmNoIEVuZ2luZe+8miVjICVzICVjU2VhcmNoIEVuZ2luZS4iLCAiZm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjpjb3JuZmxvd2VyYmx1ZSIsICJjb2xvcjowIiwgImZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6ZGFya29yYW5nZSIsIENPTlNULnVzZUl0ZW0ubmFtZS5yZXBsYWNlKENPTlNULnVzZUl0ZW0ubmFtZVswXSwgQ09OU1QudXNlSXRlbS5uYW1lWzBdLnRvVXBwZXJDYXNlKCkpLCAiZm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOjAiKTsKCiAgICAgICAgbGV0IFNpdGVCbG9jayA9IHsKICAgICAgICAgIC8qKgogICAgICAgICAgICog5Yid5aeL5YyWQmxvY2vmoLflvI8KICAgICAgICAgICAqLwogICAgICAgICAgaW5pdFN0eWxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEFDX2FkZFN0eWxlKCJidXR0b24uZ2hoaWRlci5naGhiW2FjLXVzZXItYWx0ZXI9JzEnXTo6YmVmb3Jle2NvbnRlbnQ6J+WPlua2iCAtICc7fSNzcC1hYy1jb250YWluZXIgLmFjLWJsb2NrLWl0ZW17Y29sb3I6I0FBQTttYXJnaW4tbGVmdDo0OHB4O30jc3AtYWMtY29udGFpbmVyIC5hYy1ibG9jay1pdGVtZGVse2Zsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OjA7cGFkZGluZzowIDIwcHg7Y3Vyc29yOnBvaW50ZXI7fSNzcC1hYy1jb250YWluZXIgLmFjLWJsb2NrLWl0ZW1kZWw6aG92ZXJ7Y29sb3I6cmVkO30jc3AtYWMtY29udGFpbmVyIC5hYy1ibG9jay1oaWdoe2NvbG9yOiMwMDA7fS5hYy1ibG9ja0xpc3QgbGk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYTNjYWZmO2NvbG9yOndoaXRlICFpbXBvcnRhbnQ7Y3Vyc29yOnBvaW50ZXI7fSAqW2FjLW5lZWRoaWRlXSAqe2Rpc3BsYXk6bm9uZX0gKlthYy1uZWVkaGlkZV0gLmJsb2NrU2hvd3tkaXNwbGF5OnVuc2V0O2N1cnNvcjpwb2ludGVyO30gKlthYy1uZWVkaGlkZV0gLmJsb2NrU2hvdzpob3Zlcntib3JkZXI6MXB4IHNvbGlkICNERER9YnV0dG9uLmdoaGlkZXJ7Y29sb3I6IzU1NTtiYWNrZ3JvdW5kLWNvbG9yOiNmY2ZjZmM7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjttYXJnaW46YXV0byAycHg7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6MnB4IDNweH1idXR0b24uZ2hoaWRlcntmb250LXNpemU6MTJweH1idXR0b24uZ2hoaWRlcjpob3Zlcntjb2xvcjojMDA2YWZmO2JhY2tncm91bmQ6I2ZmZn0iLAogICAgICAgICAgICAgICJBQy1CbG9ja1N0eWxlIik7CiAgICAgICAgICB9LAogICAgICAgICAgLyoqCiAgICAgICAgICAgKiDliJ3lp4vljJblsY/olL3mjInpkq7liqDovb0KICAgICAgICAgICAqLwogICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgY2hlY2tOb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY3VyU2l0ZS5NYWluVHlwZSArICI6bm90KFthY2Jsb2NrXSkiKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja05vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCBjdXJOb2RlID0gY2hlY2tOb2Rlc1tpXTsKICAgICAgICAgICAgICAgIGxldCBmYXZpY29uTm9kZSA9IGN1ck5vZGUucXVlcnlTZWxlY3RvcihjdXJTaXRlLkZhdmljb25UeXBlKTsKICAgICAgICAgICAgICAgIC8vIGlmKGN1ck5vZGUuaGFzQXR0cmlidXRlKCJhY2Jsb2NrIikpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgbGV0IGhvc3QgPSBnZXROb2RlSG9zdChmYXZpY29uTm9kZSkuY3VySG9zdDsKICAgICAgICAgICAgICAgIC8vIGlmKGhvc3QgPT09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgbGV0IGZhTm9kZSA9IGN1ck5vZGUucXVlcnlTZWxlY3RvcihjdXJTaXRlLkJsb2NrVHlwZSk7CiAgICAgICAgICAgICAgICBsZXQgbm9kZVN0eWxlID0gImRpc3BsYXk6dW5zZXQ7IjsKICAgICAgICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc0Jsb2NrQnRuTm90RGlzcGxheSkgewogICAgICAgICAgICAgICAgICBub2RlU3R5bGUgPSAiZGlzcGxheTpub25lOyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmYU5vZGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsIGA8YnV0dG9uIHN0eWxlPScke25vZGVTdHlsZX0nIGNsYXNzPSdnaGhpZGVyIGdoaGInIGhyZWY9IiR7ZmF2aWNvbk5vZGUuaHJlZiB8fCBmYXZpY29uTm9kZS5pbm5lclRleHR9IiBtZXRhPSIke2hvc3R9IiBkYXRhLWhvc3Q9IiR7aG9zdH0iIHRpdGxlPScke3RoaXMuZ2V0QmxvY2tCdG5UaXRsZShob3N0KX0nPmJsb2NrPC9idXR0b24+YCk7CgogICAgICAgICAgICAgICAgY3VyTm9kZS5zZXRBdHRyaWJ1dGUoImFjYmxvY2siLCAiMCIpOwogICAgICAgICAgICAgICAgY3VyTm9kZS5zZXRBdHRyaWJ1dGUoImFjYmxvY2siLCAiMCIpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5pbml0TGlzdGVuZXIoKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5KCk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0QmxvY2tCdG5UaXRsZShob3N0KXsKICAgICAgICAgICAgcmV0dXJuIGDngrnlh7vljbPlj6/lsY/olL0gJHtob3N0fSDmlL7lvIDvvIzpnIDopoHlnKjoh6rlrprkuYnkuK3miYvliqjphY3nva7mlL7lvIBgOwogICAgICAgICAgfSwKICAgICAgICAgIGluaXRMaXN0ZW5lcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgY2hlY2tOb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbi5naGhpZGVyOm5vdChbYWNFbnZdKSIpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBjaGVja05vZGVzW2ldLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5kb0hpZGVFbnYpOwogICAgICAgICAgICAgIGNoZWNrTm9kZXNbaV0uc2V0QXR0cmlidXRlKCJhY0VudiIsICIwIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBkb0hpZGVFbnY6IGZ1bmN0aW9uIChlbnYpIHsKICAgICAgICAgICAgLy8g5YWI5o+S5YWl5pWw5o2uLS0t6K6w5b6X6L+Y6KaB5YaZ5YWl5a2Y5YKoCiAgICAgICAgICAgIGxldCBub2RlID0gZW52LnNvdXJjZVRhcmdldCB8fCBlbnYudGFyZ2V0OwogICAgICAgICAgICBsZXQgaG9zdCA9IG5vZGUuZGF0YXNldC5ob3N0OwogICAgICAgICAgICBpZiAoK25vZGUuZ2V0QXR0cmlidXRlKCJhYy11c2VyLWFsdGVyIikgPT09IDEpIHsKICAgICAgICAgICAgICAvLyDlt7Lnu4/lsY/olL3kuYvlkI7vvIzlho3mrKHngrnlh7tibG9ja+W6lOivpeaYr+WPlua2iOeKtuaAgQogICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCJhYy11c2VyLWFsdGVyIik7CiAgICAgICAgICAgICAgQUNDb25maWcuVXNlckJsb2NrTGlzdC5hY3JlbW92ZShob3N0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyDmraPluLjlsY/olL3mk43kvZwKICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgiYWMtdXNlci1hbHRlciIpOwogICAgICAgICAgICAgIEFDQ29uZmlnLlVzZXJCbG9ja0xpc3QuYWNwdXNoKGhvc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERCQ29uZmlnLlVzZXJCbG9ja0xpc3QgPSBBQ0NvbmZpZy5Vc2VyQmxvY2tMaXN0OwogICAgICAgICAgICBBQ1NldFZhbHVlKCJDb25maWciLCBKU09OLnN0cmluZ2lmeShEQkNvbmZpZykpOyAvLyDngrnlh7vkuIDmrKHvvIzkv53lrZjkuIDmrKEKICAgICAgICAgICAgU2l0ZUJsb2NrLnJlbmRlckRpc3BsYXkoKTsKICAgICAgICAgICAgZW52LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgfSwKICAgICAgICAgIC8vIOWIt+aWsOaYvuekuuaViOaenC0t6ICX5pe25pON5L2cCiAgICAgICAgICByZW5kZXJEaXNwbGF5OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGxldCBjaGVja05vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjdXJTaXRlLk1haW5UeXBlKTsKICAgICAgICAgICAgbGV0IGZsYWcgPSAiYWMtbmVlZGhpZGUiOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IGN1ck5vZGUgPSBjaGVja05vZGVzW2ldOwogICAgICAgICAgICAgICAgbGV0IHtjdXJIb3N0LCBjdXJVcmx9ID0gZ2V0Tm9kZUhvc3QoY3VyTm9kZS5xdWVyeVNlbGVjdG9yKGN1clNpdGUuRmF2aWNvblR5cGUpKTsKICAgICAgICAgICAgICAgIGN1clVybCA9IGN1clVybCB8fCAiIjsKICAgICAgICAgICAgICAgIGlmIChjdXJIb3N0ID09PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgbGV0IEJsb2NrQnRuID0gY3VyTm9kZS5xdWVyeVNlbGVjdG9yKCIuZ2hoaWRlci5naGhiIik7CiAgICAgICAgICAgICAgICAgIEJsb2NrQnRuLmRhdGFzZXQuaG9zdCA9IEJsb2NrQnRuLmRhdGFzZXQubWV0YSA9IGN1ckhvc3Q7CiAgICAgICAgICAgICAgICAgIEJsb2NrQnRuLnRpdGxlID0gdGhpcy5nZXRCbG9ja0J0blRpdGxlKGN1ckhvc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGN1ck5vZGUucXVlcnlTZWxlY3RvcigiYnV0dG9uW2FjLXVzZXItYWx0ZXJdIikgIT0gbnVsbCkgY29udGludWU7IC8vIOeUqOaIt+aJi+WKqOeCuei/h+aYvuekuueahO+8jOmCo+S5iOi3s+i/h2NoZWNrCiAgICAgICAgICAgICAgICBsZXQgcmVnTGlzdCA9IHZ1ZVZNLmNhbF9Vc2VyQmxvY2tMaXN0UmVnZXg7IC8vIOS9v+eUqFZ1ZeeahGNvbXB1dGVk5bGe5oCn6K6h566X55qE5pWw5o2u5YC877yM5LiA6Iis5qC55pys5LiN5pu05pawCiAgICAgICAgICAgICAgICBpZiAoIWN1clVybC5pbmNsdWRlcygid3d3LmJhaWR1LmNvbS9saW5rIikgJiYgcmVnTGlzdC5maW5kSW5kZXgob25lID0+IHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25lLnRlc3QoY3VySG9zdCkgfHwgb25lLnRlc3QoY3VyVXJsKTsgLy8g6ICX5pe25pON5L2cCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbSA9PT0gY3VySG9zdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAvLyDlj6rmo4Dmn6XlnKjlsY/olL3ooajkuK3nmoTmlbDmja4KICAgICAgICAgICAgICAgICAgaWYgKCFjdXJOb2RlLmhhc0F0dHJpYnV0ZShmbGFnKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc0Jsb2NrRGlzcGxheSkgeyAvLyDlr7nkuo7kuI3mmL7npLrnmoTmlbDmja7lj6/ku6Xov5vooYznp7vpmaTmk43kvZwKICAgICAgICAgICAgICAgICAgICAgIGN1ck5vZGUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGV0IGN1clRpdGxlID0gY3VyTm9kZS5xdWVyeVNlbGVjdG9yKGN1clNpdGUuQmxvY2tUeXBlKTsKICAgICAgICAgICAgICAgICAgICBjdXJUaXRsZSA9IGN1clRpdGxlLmlubmVyVGV4dCB8fCBjdXJUaXRsZS50ZXh0Q29udGVudDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ck5vZGUuaGFzQXR0cmlidXRlKGZsYWcpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5Yay56qB5LqG77yB77yB77yBIik7CiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuc2V0QXR0cmlidXRlKGZsYWcsICIxIik7CiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyQmVnaW4iLCBgPHNwYW4gY2xhc3M9ImJsb2NrU2hvdyIgdGl0bGU9IuWmguaenOmcgOimgeS4gOebtOaYvuekuu+8jOivt+WcqOiHquWumuS5ieS4rURJWeebruW9leenu+mZpOacrOWcsOWdgCI+JHtjdXJUaXRsZX0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLWJsb2NrIGJ5ICR7Y3VySG9zdH08L3NwYW4+YCk7CgogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoeGN1cikgewogICAgICAgICAgICAgICAgICAgICAgLy8g5bey57uP5bGP6JS95LmL5ZCO55qE5YaF5a6577yM54K55Ye75LiA5LiL5pi+56S65Y6f5aeL5YaF5a65CiAgICAgICAgICAgICAgICAgICAgICB4Y3VyLnF1ZXJ5U2VsZWN0b3IoIi5ibG9ja1Nob3ciKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlbnYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoImJ1dHRvbi5naGhpZGVyIikuc2V0QXR0cmlidXRlKCJhYy11c2VyLWFsdGVyIiwgIjEiKTsgLy8g6L+Z5Liq5bGe5oCn55So5LqO5L+d5oyB5ZyoRE9N5pu05paw5pe277yM5oyJ6ZKu5LiN5Y+YCiAgICAgICAgICAgICAgICAgICAgICAgIHhjdXIucmVtb3ZlQXR0cmlidXRlKGZsYWcpOwogICAgICAgICAgICAgICAgICAgICAgICBzYWZlRnVuY3Rpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHhjdXIucXVlcnlTZWxlY3RvcigiLmJsb2NrU2hvdyIpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZW52LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSkoY3VyTm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGN1ck5vZGUucmVtb3ZlQXR0cmlidXRlKGZsYWcpOwogICAgICAgICAgICAgICAgICBzYWZlRnVuY3Rpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGN1ck5vZGUucXVlcnlTZWxlY3RvcigiLmJsb2NrU2hvdyIpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gYWRkU3R5bGUoY3NzKSB7IC8v5re75YqgQ1NT55qE5Luj56CBLS1jb3B555qECiAgICAgICAgICBsZXQgcGkgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCiAgICAgICAgICAgICd4bWwtc3R5bGVzaGVldCcsCiAgICAgICAgICAgICd0eXBlPSJ0ZXh0L2NzcyIgbXVzdD0iZmFsc2UiIGhyZWY9ImRhdGE6dGV4dC9jc3M7dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChjc3MpICsgJyInCiAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGRvY3VtZW50Lmluc2VydEJlZm9yZShwaSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTsKICAgICAgICB9CgogICAgICAgIGlmIChBQ0NvbmZpZy5pc0Fkc0VuYWJsZSkgewogICAgICAgICAgLy8gZGlzcGxheeW3sue7j+aXoOazlemakOiXj+S7luS7rOS6hu+8jOmcgOimgeeUqOe7neWvueeahOmakOiXjwogICAgICAgICAgYWRkU3R5bGUoIiNib3R0b21hZHN7ZGlzcGxheTpub25lO30gI2NvbnRlbnRfbGVmdD5kaXY6bm90KFtpZF0pPmRpdltjbWF0Y2hpZF0sICNjb250ZW50X2xlZnQ+ZGl2W2lkKj0nMzAwJ106bm90KFtjbGFzcyo9J3Jlc3VsdCddKSwjY29udGVudF9yaWdodCB0ZD5kaXY6bm90KFtpZF0pLCNjb250ZW50X3JpZ2h0PmJye3Bvc2l0aW9uOmFic29sdXRlO3RvcDotNjY2NnB4O30iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFICYmIEFDQ29uZmlnLmlzR29vbGVJbkJhaWR1TW9kZUVuYWJsZSkgewogICAgICAgICAgc2FmZVdhaXRGdW5jKCIjbG9nbyBpbWcsICNsb2dvY29udCBpbWciLCBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICBsZXQgZmFOb2RlID0gbm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIGZhTm9kZS5jbGFzc0xpc3QuYWRkKCJiYWlkdSIpOwogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgic3JjIik7CiAgICAgICAgICAgIG5vZGUuc3JjID0gImh0dHBzOi8vcGljLnJtYi5iZHN0YXRpYy5jb20vYzg2MjU1ZTgwMjg2OTYxMzlkM2UzZTRiYjQ0YzA0N2IucG5nIjsKICAgICAgICAgICAgbm9kZS53aWR0aCA9ICIxMjUiOwogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgiaGVpZ2h0Iik7CiAgICAgICAgICB9KTsKICAgICAgICAgIHNhZmVXYWl0RnVuYygiI21haW4gLmxvZ28gaW1nW2FsdD0nR29vZ2xlJ10iLCBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgic3Jjc2V0Iik7CiAgICAgICAgICAgIG5vZGUuc3JjID0gImh0dHBzOi8vd3d3LmJhaWR1LmNvbS9pbWcvYmRfbG9nbzEucG5nP3doZXJlPXN1cGVyIjsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICI1OSIpOwogICAgICAgICAgfSwgMzAwKTsKICAgICAgICAgIHNhZmVXYWl0RnVuYygiZm9ybVtyb2xlPSdzZWFyY2gnXSAubG9nbyBpbWciLCBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgic3Jjc2V0Iik7CiAgICAgICAgICAgIG5vZGUuc3JjID0gImh0dHBzOi8vd3d3LmJhaWR1LmNvbS9pbWcvYmRfbG9nbzEucG5nP3doZXJlPXN1cGVyIjsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICI1OSIpOwogICAgICAgICAgfSwgMzAwKTsKICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gZG9jdW1lbnQudGl0bGUucmVwbGFjZSgvXkdvb2dsZS8sICLnmb7luqbkuIDkuIvvvIzkvaDlsLHnn6XpgZMiKQogICAgICAgICAgLnJlcGxhY2UoLyAtIEdvb2dsZSDmkJzntKIvLCAiX+eZvuW6puaQnOe0oiIpCiAgICAgICAgICAucmVwbGFjZSgvIC0gR29vZ2xlIFNlYXJjaC8sICJf55m+5bqm5pCc57SiIik7CiAgICAgICAgICBzYWZlV2FpdEZ1bmMoImhlYWQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGxldCBsaW5rVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigibGlua1t0eXBlPSdpbWFnZS94LWljb24nXSIpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGlua1RhcmdldC50eXBlID0gJ2ltYWdlL3gtaWNvbic7CiAgICAgICAgICAgIGxpbmtUYXJnZXQucmVsID0gJ3Nob3J0Y3V0IGljb24nOwogICAgICAgICAgICBsaW5rVGFyZ2V0LmhyZWYgPSAnaHR0cHM6Ly93d3cuYmFpZHUuY29tL2Zhdmljb24uaWNvJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rVGFyZ2V0KTsKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkRVQ0spIHsKICAgICAgICAgIGFkZFN0eWxlID0gQUNfYWRkU3R5bGUgLy8g5YW85a65RHVja+eahENTUOWQjOa6kOinhOWImQogICAgICAgICAgaWYoQUNDb25maWcubm9ybWFsaXplRHVjayl7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBEREcuc2V0dGluZ3Muc2V0KCJrbiIsIDEsIHsgIC8vIOaWsOeql+WPo+aJk+W8gOmhtemdogogICAgICAgICAgICAgICAgICBzYXZlVG9DbG91ZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgZm9yY2VUaGVtZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBEREcuc2V0dGluZ3Muc2V0KCJrYXYiLCAxLCB7IC8vIOi/nue7reaYvuekuuaQnOe0oue7k+aenAogICAgICAgICAgICAgICAgICBzYXZlVG9DbG91ZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgZm9yY2VUaGVtZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgNTAwMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5PVEhFUlMpIHsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgTWFpbkNhbGxiYWNrLCBmYWxzZSk7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgTWFpbkNhbGxiYWNrLCBmYWxzZSk7CiAgICAgICAgICAgIHNhZmVXYWl0RnVuYygiYm9keSIsICgpID0+IHsKICAgICAgICAgICAgICAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoQ09OU1QudXNlSXRlbS5uYW1lKSAmJiBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShDT05TVC51c2VJdGVtLm5hbWUsICIxIik7CiAgICAgICAgICAgICAgIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKENPTlNULnVzZUl0ZW0ubmFtZSkgJiYgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENPTlNULnVzZUl0ZW0ubmFtZSk7CiAgICAgICAgICAgICAgaWYgKEFDQ29uZmlnLkFkc1N0eWxlRW5hYmxlKSB7IC8vIOWNleeLrOS4jemcgOimgeWumuaXtuWZqC3poLvnuYHop6blj5Et6L295YWlY3NzCiAgICAgICAgICAgICAgICBGU0JhaWR1KCk7CiAgICAgICAgICAgICAgICBBZGRDdXN0b21TdHlsZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgUkFGSW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGlmKGRvY3VtZW50LmJvZHkpIHsKICAgICAgICAgICAgICAgIHJhcGlkRGVhbCgpOyAvLyDlrprmnJ/osIPnlKjvvIzpgb/lhY3mnInml7blgJlET03mj5LlhaXmsqHmnInmiafooYzlr7zoh7TnmoTpl67popgKICAgICAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJBSURVICYmIGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoInRuPW5ld3MiKSkgewogICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgibmV3cyIsICIxIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgibmV3cyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgODAwKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICB9CiAgICAgICAgc2FmZVdhaXRGdW5jKCIjc3AtYWMtY29udGVudCIsIGZ1bmN0aW9uIChjaGVja05vZGUpIHsKICAgICAgICAgIHZhciBvcHRpb25zID0gewogICAgICAgICAgICBlbDogY2hlY2tOb2RlLAogICAgICAgICAgICBkYXRhOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIC4uLkFsbERhdGEsCiAgICAgICAgICAgICAgICBMaXZlQ29uZmlnOiB7CiAgICAgICAgICAgICAgICAgIGNzc19oYXNfZXJyb3I6IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBtZXRob2RzOiB7CiAgICAgICAgICAgICAgbGFiZWxTaG93SGlkZUVudihlKSB7CiAgICAgICAgICAgICAgICBsZXQgY3VyID0gZS5zcmNFbGVtZW50IHx8IGUudGFyZ2V0OwogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IGN1ci5wYXJlbnROb2RlLmNsYXNzTmFtZS5yZXBsYWNlKCJjb250YWluZXItbGFiZWwgIiwgIiIpOwogICAgICAgICAgICAgICAgQUNfYWRkU3R5bGUoIi5YWD5sYWJlbCwuWFg+YnJ7ZGlzcGxheTp1bnNldCAhaW1wb3J0YW50O30uWFg+LmxhYmVsX2hpZGV7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fSIucmVwbGFjZSgvWFgvZ20sIGNsYXNzTmFtZSksCiAgICAgICAgICAgICAgICAgICJBQy1TaG93SGlkZUl0ZW0tIiArIGNsYXNzTmFtZSwgImJvZHkiKTsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBzeW5jVG9CbG9ja0xpc3QoZW52KSB7CiAgICAgICAgICAgICAgICB0aGlzLkFDQ29uZmlnLlVzZXJCbG9ja0xpc3QgPSBlbnYudGFyZ2V0LnZhbHVlLnNwbGl0KCJcbiIpLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09ICcnKTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHJlbW92ZUFCbG9ja0xpc3RJdGVtKGUpIHsKICAgICAgICAgICAgICAgIC8vIOeCueWHu+enu+mZpOafkOS4qmhvc3TmlbDmja7ml7YKICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBlLnNyY0VsZW1lbnQgfHwgZS50YXJnZXQ7CiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gImxhYmVsIikgewogICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHRhcmdldC5kYXRhc2V0Lmhvc3Q7CiAgICAgICAgICAgICAgICAgIEFDQ29uZmlnLlVzZXJCbG9ja0xpc3QuYWNyZW1vdmUoaG9zdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBja0FkZFJ1bGUoKSB7CiAgICAgICAgICAgICAgICAvLyDmiYvliqjlop7liqDnp7vpmaTop4TliJkKICAgICAgICAgICAgICAgIEFDQ29uZmlnLlVzZXJCbG9ja0xpc3QuYWNwdXNoKHRoaXMub3RoZXIuYWRkQmxvY2tJdGVtKTsKICAgICAgICAgICAgICAgIHRoaXMub3RoZXIuYWRkQmxvY2tJdGVtID0gIiI7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBsb2FkQ3VzdG9tU3R5bGUoKSB7CiAgICAgICAgICAgICAgICBsZXNzLnJlbmRlcihBQ0NvbmZpZy5Vc2VyU3R5bGVUZXh0LCAoZSwgY3NzKSA9PiB7CiAgICAgICAgICAgICAgICAgIGlmKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLkxpdmVDb25maWcuY3NzX2hhc19lcnJvciA9IHRydWUKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLkxpdmVDb25maWcuY3NzX2hhc19lcnJvciA9IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgY3NzID0gY3NzLmNzcyB8fCAnJwogICAgICAgICAgICAgICAgICAgIEFDX2FkZFN0eWxlKGNzcywgIkFDLXVzZXJTdHlsZSIsICJoZWFkIiwgdHJ1ZSk7IC8vIOeUqOaIt+iHquWumuS5ieeahOagt+W8j+ihqAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHNhdmVDb25maWcoKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm90aGVyLmN1clRhYj09PTEgJiYgIXRoaXMuQUNDb25maWcuYWNjZXB0TGljZW5zZSl7CiAgICAgICAgICAgICAgICAgIHRoaXMub3RoZXIuY3VyVGFiID0gMwogICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuQUNDb25maWcuYWNjZXB0TGljZW5zZSA9IHRydWUKCiAgICAgICAgICAgICAgICB0aGlzLkFDQ29uZmlnLmxhc3RTYXZlVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgQUNTZXRWYWx1ZSgiQ29uZmlnIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5BQ0NvbmZpZykpOwogICAgICAgICAgICAgICAgaWYoIXRoaXMuQUNDb25maWcuZG9EaXNhYmxlU3VnKXsKICAgICAgICAgICAgICAgICAgYWNTZXRDb29raWUoIk9SSUdJTiIsIDEsICJ3d3cuYmFpZHUuY29tIiwgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSA4NjQwMDAwMCk7CiAgICAgICAgICAgICAgICAgIGFjU2V0Q29va2llKCJJU1NXIiwgMSwgbnVsbCwgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSA4NjQwMDAwMCk7CiAgICAgICAgICAgICAgICAgIGFjU2V0Q29va2llKCJJU1NXIiwgMSwgInd3dy5iYWlkdS5jb20iLCBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIDg2NDAwMDAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY2hhbmdlUmVzZXRUZXh0KCkgewogICAgICAgICAgICAgICAgdGhpcy5sYW4uemhfY24uZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5yZXNldEJ0bl90ZXh0ID0gJ+WPjOWHu+mHjee9ricKICAgICAgICAgICAgICAgIHRoaXMubGFuLmVuLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwucmVzZXRCdG5fdGV4dCA9ICdEQmwgY2xpY2sgdG8gUmVzZXQnCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICByZXNldENvbmZpZygpIHsKICAgICAgICAgICAgICAgIC8vIOaYvuekuuS4uuWPjOWHu+mHjee9rgogICAgICAgICAgICAgICAgQUNTZXRWYWx1ZSgiQ29uZmlnIiwgJ3t9Jyk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGNsb3NlUGFuZWwoKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGVudCIpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB1c2VUaGlzSHV5YW5Db2xvcihlbnYpIHsKICAgICAgICAgICAgICAgIHRoaXMuQUNDb25maWcuZGVmYXVsdEh1WWFuQ29sb3IgPSBlbnYudGFyZ2V0LnZhbHVlIHx8IGVudi50YXJnZXQuZGF0YXNldC52YWx1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuQUNDb25maWcuZGVmYXVsdEh1WWFuQ29sb3IpOwogICAgICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIubG9hZEh1WWFuU3R5bGUodGhpcy5BQ0NvbmZpZy5kZWZhdWx0SHVZYW5Db2xvcik7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBnZXRVc2VyQmxvY2tMaXN0UmVnZXgoKSB7CiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IFtdOwogICAgICAgICAgICAgICAgdGhpcy5BQ0NvbmZpZy5Vc2VyQmxvY2tMaXN0LmZvckVhY2gob25lID0+IHsKICAgICAgICAgICAgICAgICAgb25lICE9PSBudWxsICYmIGxpc3QucHVzaChuZXcgUmVnRXhwKG9uZS5yZXBsYWNlKCIqIiwgIi4qIikpKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLm90aGVyLmFkZEJsb2NrSXRlbSkgIT09ICJ1bmRlZmluZWQiICYmIHRoaXMub3RoZXIuYWRkQmxvY2tJdGVtICE9PSAiIikgewogICAgICAgICAgICAgICAgICBsaXN0LnB1c2gobmV3IFJlZ0V4cCh0aGlzLm90aGVyLmFkZEJsb2NrSXRlbS5yZXBsYWNlKCIqIiwgIi4qIikpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBsaXN0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcHV0ZWQ6IHsKICAgICAgICAgICAgICBnZXRCbG9ja0xpc3QoKSB7IC8vIOS8muiHquWKqOeahHJlbmRlcuWIsGh0bWzkuIrljrvvvIzkuI3nlKjmiYvliqjljrvmuLLmn5PkuIDpgY0KICAgICAgICAgICAgICAgIGxldCBpbnNIVE1MID0gIiI7CiAgICAgICAgICAgICAgICBsZXQgVXNlckJsb2NrUmVnTGlzdCA9IHRoaXMuY2FsX1VzZXJCbG9ja0xpc3RSZWdleDsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5BQ0NvbmZpZy5Vc2VyQmxvY2tMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIGxldCBpbnNDbGFzcyA9IHRoaXMub3RoZXIuY3VySG9zdHMuZmluZEluZGV4KG0gPT4gewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXQgW2N1ckhvc3QsIGN1clVybF0gPSBtLnNwbGl0KCIjIyMiKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVc2VyQmxvY2tSZWdMaXN0W2ldLnRlc3QoY3VySG9zdCkgfHwgVXNlckJsb2NrUmVnTGlzdFtpXS50ZXN0KGN1clVybCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0gPT09IEFDQ29uZmlnLlVzZXJCbG9ja0xpc3RbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KSA+PSAwID8gIiBhYy1ibG9jay1oaWdoIiA6ICIiOyAvLyDlpoLmnpzlvZPliY3pobXpnaLlrZjlnKjvvIzliJnpq5jkuq4KICAgICAgICAgICAgICAgICAgaW5zSFRNTCArPSBgPGxpPjxsYWJlbCBjbGFzcz0iYWMtYmxvY2staXRlbSR7aW5zQ2xhc3N9IiBkYXRhLWhvc3Q9IiR7dGhpcy5BQ0NvbmZpZy5Vc2VyQmxvY2tMaXN0W2ldfSI+JHt0aGlzLkFDQ29uZmlnLlVzZXJCbG9ja0xpc3RbaV19PC9sYWJlbD48bGFiZWwgY2xhc3M9ImFjLWJsb2NrLWl0ZW0gYWMtYmxvY2staXRlbWRlbCIgZGF0YS1ob3N0PSIke3RoaXMuQUNDb25maWcuVXNlckJsb2NrTGlzdFtpXX0iPng8L2xhYmVsPjwvbGk+XG5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGluc0hUTUw7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjYWxfZGl5QmxvY2tMaXN0QnRuKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3RoZXIuc2hvd0Jsb2NrTGlzdEFyZWEpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNldHRpbmdfcGFuZWxfc2Vjb25kLmJsb2NrRWRpdEJ0bkVuZF90ZXh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNldHRpbmdfcGFuZWxfc2Vjb25kLmJsb2NrRWRpdEJ0bl90ZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY2FsX1VzZXJCbG9ja0xpc3RSZWdleCgpIHsKICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gW107CiAgICAgICAgICAgICAgICB0aGlzLkFDQ29uZmlnLlVzZXJCbG9ja0xpc3QuZm9yRWFjaChvbmUgPT4gewogICAgICAgICAgICAgICAgICBvbmUgIT09IG51bGwgJiYgbGlzdC5wdXNoKG5ldyBSZWdFeHAob25lLnJlcGxhY2UoIioiLCAiLioiKSkpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMub3RoZXIuYWRkQmxvY2tJdGVtKSAhPT0gInVuZGVmaW5lZCIgJiYgdGhpcy5vdGhlci5hZGRCbG9ja0l0ZW0gIT09ICIiKSB7CiAgICAgICAgICAgICAgICAgIGxpc3QucHVzaChuZXcgUmVnRXhwKHRoaXMub3RoZXIuYWRkQmxvY2tJdGVtLnJlcGxhY2UoIioiLCAiLioiKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBBZHNTdHlsZU1vZGVDaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICB2MTogQ09OU1QudXNlSXRlbS5BZHNTdHlsZU1vZGUsCiAgICAgICAgICAgICAgICAgIHYyOiBDT05TVC51c2VJdGVtLkh1WWFuTW9kZSwKICAgICAgICAgICAgICAgICAgdjM6IEFDQ29uZmlnLlN0eWxlX0JhaWR1TGl0ZSwKICAgICAgICAgICAgICAgICAgdjQ6IEFDQ29uZmlnLmlzRmF2aWNvbkVuYWJsZSwKICAgICAgICAgICAgICAgICAgdjU6IENPTlNULmlzR29vZ2xlU3BlY2lhbCwKICAgICAgICAgICAgICAgICAgdjY6IEFDQ29uZmlnLmlzUmlnaHREaXNwbGF5RW5hYmxlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgVXNlclN0eWxlRW5hYmxlQ2hhbmdlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgdjE6IEFDQ29uZmlnLmlzVXNlclN0eWxlRW5hYmxlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBsYW5DaGFuZ2UoKXsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgIHYxOiBBQ0NvbmZpZy5pc0VuTGFuZwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGlzU2F2ZUJ1dHRvbkNhbkJlU2VlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlzRWxlbWVudFZpc2libGUodGhpcy4kcmVmcy5ib3R0b21TYXZlQnV0dG9uKQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgd2F0Y2g6IHsKICAgICAgICAgICAgICAnQ09OU1QudXNlSXRlbS5IdVlhbk1vZGUnOiB7CiAgICAgICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUsCiAgICAgICAgICAgICAgICBoYW5kbGVyKHZhbCkgewogICAgICAgICAgICAgICAgICBpZih2YWwpIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRIdVlhblN0eWxlKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIEFkc1N0eWxlTW9kZUNoYW5nZTogewogICAgICAgICAgICAgICAgaGFuZGxlcigpIHsKICAgICAgICAgICAgICAgICAgLy8g6ZyA6KaB5YWI5Yig6Zmk5Y6f5pyJ55qE6IqC54K55pWw5o2uCiAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qge3Jlcywgbm9kZX0gPSBjaGVja0RvY21lbnRIYXNOb2RlKCJBQy0iKQogICAgICAgICAgICAgICAgICAgIGlmIChyZXMpIG5vZGUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzYWZlUmVtb3ZlKCJzdHlsZVtjbGFzcz0nQUMtU3R5bGUtZXhwYW5kJ10sc3R5bGVbY2xhc3M9J0FDLVR3b1BhZ2VFeFN0eWxlJ10sc3R5bGVbY2xhc3M9J0FDLVRocmVlUGFnZUV4U3R5bGUnXSxzdHlsZVtjbGFzcz0nQUMtRm91clBhZ2VFeFN0eWxlJ10sc3R5bGVbY2xhc3M9J0FDLXN0eWxlLWxvZ28nXSxzdHlsZVtjbGFzcz0nQUMtYmFpZHVMaXRlU3R5bGUnXSxzdHlsZVtjbGFzcyo9J0h1WWFuU3R5bGUtRmlsZSddIik7CiAgICAgICAgICAgICAgICAgIGFjQ3NzTG9hZEZsYWcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIuaW5pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgVXNlclN0eWxlRW5hYmxlQ2hhbmdlKCkgewogICAgICAgICAgICAgICAgaWYoQUNDb25maWcuaXNVc2VyU3R5bGVFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkQ3VzdG9tU3R5bGUoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNhZmVSZW1vdmUoInN0eWxlW2NsYXNzPSdBQy11c2VyU3R5bGUnXSIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBsYW5DaGFuZ2UoKXsKICAgICAgICAgICAgICAgIEFsbERhdGEubGFuLnVzZSA9IEFDQ29uZmlnLmlzRW5MYW5nID8gQWxsRGF0YS5sYW4uZW4gOiBBbGxEYXRhLmxhbi56aF9jbjsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNteXVzZXIiKS5yZW1vdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBpZiAodHlwZW9mIChWdWUpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIGlmICgrVnVlLnZlcnNpb24uY2hhckF0KDApID09PSAyKSB7CiAgICAgICAgICAgICAgdnVlVk0gPSBuZXcgVnVlKG9wdGlvbnMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZ1ZVZNID0gVnVlLmNyZWF0ZUFwcChvcHRpb25zKS5tb3VudChjaGVja05vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJWdWUg5pyq5a6M5oiQ5Yid5aeL5YyWLS3nqIvluo/ml6Dms5XmnInmlYjmiafooYwiKTsKICAgICAgICAgIH0KICAgICAgICB9LCAyNTApOwoKICAgICAgICBmdW5jdGlvbiBNYWluQ2FsbGJhY2soZSkgewogICAgICAgICAgaWYgKGUudGFyZ2V0ICE9IG51bGwgJiYgdHlwZW9mIChlLnRhcmdldC5jbGFzc05hbWUpID09PSAic3RyaW5nIiAmJiBlLnRhcmdldC5jbGFzc05hbWUudG9VcHBlckNhc2UoKS5pbmRleE9mKCJBQy0iKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9IC8v5bGP6JS95o6J5Zug5Li65aKe5YqgY3Nz5a+86Ie055qE6Kem5Y+RaW5zZXJ05Yqo5L2cCiAgICAgICAgICByYXBpZERlYWwoKTsKICAgICAgICAgIEluc2VydFNldHRpbmdNZW51KCk7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgU2hvd1NldHRpbmcoKTsKICAgICAgICAgIH0sIDEwMDApIC8vIOa7nuWQjueql+WPo+eahOWKoOi9ve+8jOWHj+WwkeWJjeacn0NQVeS6ieeUqAogICAgICAgIH0KCiAgICAgICAgLyrku6XkuIvku6PnoIHlpKfpg6jliIbmnaXmupDkuo5TdXByZVByZWxvYWRlciDmhJ/osKIgc3dkeWggJiYgeXd6aGFpcWkgJiYgTkxGIOS7peWPiiBtYWNoNiDlpKfkvawqLwogICAgICAgIC8qCiAgICAgICAgU3VwZXJfcHJlbG9hZGVyUGx1c19vbmVfTmV3OiBQcmVsb2FkIGFuZCBBdXRvcGFnZXIuCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDIwIE1hY2g2CgogICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMy4KCiAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBhY19zcGZ1bmMoZSkgewogICAgICAgICAgY29uc29sZS5lcnJvcigi6L+Z6YeM5pyJ6Zeu6aKYIikKICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICB2YXIgdCwgciA9IGUuY3VycmVudFRhcmdldDsKICAgICAgICAgIHZhciBUd2VlbiA9IHsKICAgICAgICAgICAgICAgIExpbmVhcjogZnVuY3Rpb24gTGluZWFyKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgKiBlIC8gbiArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUXVhZDogewogICAgICAgICAgICAgICAgICBlYXNlSW46IGZ1bmN0aW9uIGVhc2VJbihlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgKiAoZSAvPSBuKSAqIGUgKyB0OwogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBlYXNlT3V0OiBmdW5jdGlvbiBlYXNlT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXIgKiAoZSAvPSBuKSAqIChlIC0gMikgKyB0OwogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBlYXNlSW5PdXQ6IGZ1bmN0aW9uIGVhc2VJbk91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIC89IG4gLyAyKSA8IDEgPyByIC8gMiAqIGUgKiBlICsgdCA6IC1yIC8gMiAqICgtLWUgKiAoZSAtIDIpIC0gMSkgKyB0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3ViaWM6IHsKICAgICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByICogKGUgLz0gbikgKiBlICogZSArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VPdXQ6IGZ1bmN0aW9uIGVhc2VPdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByICogKChlID0gZSAvIG4gLSAxKSAqIGUgKiBlICsgMSkgKyB0OwogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBlYXNlSW5PdXQ6IGZ1bmN0aW9uIGVhc2VJbk91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIC89IG4gLyAyKSA8IDEgPyByIC8gMiAqIGUgKiBlICogZSArIHQgOiByIC8gMiAqICgoZSAtPSAyKSAqIGUgKiBlICsgMikgKyB0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUXVhcnQ6IHsKICAgICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByICogKGUgLz0gbikgKiBlICogZSAqIGUgKyB0OwogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBlYXNlT3V0OiBmdW5jdGlvbiBlYXNlT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXIgKiAoKGUgPSBlIC8gbiAtIDEpICogZSAqIGUgKiBlIC0gMSkgKyB0OwogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBlYXNlSW5PdXQ6IGZ1bmN0aW9uIGVhc2VJbk91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIC89IG4gLyAyKSA8IDEgPyByIC8gMiAqIGUgKiBlICogZSAqIGUgKyB0IDogLXIgLyAyICogKChlIC09IDIpICogZSAqIGUgKiBlIC0gMikgKyB0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUXVpbnQ6IHsKICAgICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByICogKGUgLz0gbikgKiBlICogZSAqIGUgKiBlICsgdDsKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgZWFzZU91dDogZnVuY3Rpb24gZWFzZU91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgKiAoKGUgPSBlIC8gbiAtIDEpICogZSAqIGUgKiBlICogZSArIDEpICsgdDsKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgZWFzZUluT3V0OiBmdW5jdGlvbiBlYXNlSW5PdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSAvPSBuIC8gMikgPCAxID8gciAvIDIgKiBlICogZSAqIGUgKiBlICogZSArIHQgOiByIC8gMiAqICgoZSAtPSAyKSAqIGUgKiBlICogZSAqIGUgKyAyKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBTaW5lOiB7CiAgICAgICAgICAgICAgICAgIGVhc2VJbjogZnVuY3Rpb24gZWFzZUluKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXIgKiBNYXRoLmNvcyhlIC8gbiAqIChNYXRoLlBJIC8gMikpICsgciArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VPdXQ6IGZ1bmN0aW9uIGVhc2VPdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByICogTWF0aC5zaW4oZSAvIG4gKiAoTWF0aC5QSSAvIDIpKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VJbk91dDogZnVuY3Rpb24gZWFzZUluT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXIgLyAyICogKE1hdGguY29zKE1hdGguUEkgKiBlIC8gbikgLSAxKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBFeHBvOiB7CiAgICAgICAgICAgICAgICAgIGVhc2VJbjogZnVuY3Rpb24gZWFzZUluKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PSBlID8gdCA6IHIgKiBNYXRoLnBvdygyLCAxMCAqIChlIC8gbiAtIDEpKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VPdXQ6IGZ1bmN0aW9uIGVhc2VPdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09IG4gPyB0ICsgciA6IHIgKiAoMSAtIE1hdGgucG93KDIsIC0xMCAqIGUgLyBuKSkgKyB0OwogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBlYXNlSW5PdXQ6IGZ1bmN0aW9uIGVhc2VJbk91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT0gZSA/IHQgOiBlID09IG4gPyB0ICsgciA6IChlIC89IG4gLyAyKSA8IDEgPyByIC8gMiAqIE1hdGgucG93KDIsIDEwICogKGUgLSAxKSkgKyB0IDogciAvIDIgKiAoMiAtIE1hdGgucG93KDIsIC0xMCAqIC0tZSkpICsgdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENpcmM6IHsKICAgICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAtciAqIChNYXRoLnNxcnQoMSAtIChlIC89IG4pICogZSkgLSAxKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VPdXQ6IGZ1bmN0aW9uIGVhc2VPdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByICogTWF0aC5zcXJ0KDEgLSAoZSA9IGUgLyBuIC0gMSkgKiBlKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VJbk91dDogZnVuY3Rpb24gZWFzZUluT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgLz0gbiAvIDIpIDwgMSA/IC1yIC8gMiAqIChNYXRoLnNxcnQoMSAtIGUgKiBlKSAtIDEpICsgdCA6IHIgLyAyICogKE1hdGguc3FydCgxIC0gKGUgLT0gMikgKiBlKSArIDEpICsgdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEVsYXN0aWM6IHsKICAgICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbiwgYSwgbykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09IGUgPyB0IDogMSA9PSAoZSAvPSBuKSA/IHQgKyByIDogKG8gfHwgKG8gPSAuMyAqIG4pLCAhYSB8fCBhIDwgTWF0aC5hYnMocikgPyAoYSA9IHIsCiAgICAgICAgICAgICAgICAgICAgICBpID0gbyAvIDQpIDogaSA9IG8gLyAoMiAqIE1hdGguUEkpICogTWF0aC5hc2luKHIgLyBhKSwgLWEgKiBNYXRoLnBvdygyLCAxMCAqIChlIC09IDEpKSAqIE1hdGguc2luKChlICogbiAtIGkpICogKDIgKiBNYXRoLlBJKSAvIG8pICsgdCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VPdXQ6IGZ1bmN0aW9uIGVhc2VPdXQoZSwgdCwgciwgbiwgYSwgbykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09IGUgPyB0IDogMSA9PSAoZSAvPSBuKSA/IHQgKyByIDogKG8gfHwgKG8gPSAuMyAqIG4pLCAhYSB8fCBhIDwgTWF0aC5hYnMocikgPyAoYSA9IHIsCiAgICAgICAgICAgICAgICAgICAgICBpID0gbyAvIDQpIDogaSA9IG8gLyAoMiAqIE1hdGguUEkpICogTWF0aC5hc2luKHIgLyBhKSwgYSAqIE1hdGgucG93KDIsIC0xMCAqIGUpICogTWF0aC5zaW4oKGUgKiBuIC0gaSkgKiAoMiAqIE1hdGguUEkpIC8gbykgKyByICsgdCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VJbk91dDogZnVuY3Rpb24gZWFzZUluT3V0KGUsIHQsIHIsIG4sIGEsIG8pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PSBlID8gdCA6IDIgPT0gKGUgLz0gbiAvIDIpID8gdCArIHIgOiAobyB8fCAobyA9IG4gKiAoLjMgKiAxLjUpKSwgIWEgfHwgYSA8IE1hdGguYWJzKHIpID8gKGEgPSByLAogICAgICAgICAgICAgICAgICAgICAgaSA9IG8gLyA0KSA6IGkgPSBvIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbihyIC8gYSksIGUgPCAxID8gYSAqIE1hdGgucG93KDIsIDEwICogKGUgLT0gMSkpICogTWF0aC5zaW4oKGUgKiBuIC0gaSkgKiAoMiAqIE1hdGguUEkpIC8gbykgKiAtLjUgKyB0IDogYSAqIE1hdGgucG93KDIsIC0xMCAqIChlIC09IDEpKSAqIE1hdGguc2luKChlICogbiAtIGkpICogKDIgKiBNYXRoLlBJKSAvIG8pICogLjUgKyByICsgdCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBCYWNrOiB7CiAgICAgICAgICAgICAgICAgIGVhc2VJbjogZnVuY3Rpb24gZWFzZUluKGUsIHQsIHIsIG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBhICYmIChhID0gMS43MDE1OCksIHIgKiAoZSAvPSBuKSAqIGUgKiAoKGEgKyAxKSAqIGUgLSBhKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VPdXQ6IGZ1bmN0aW9uIGVhc2VPdXQoZSwgdCwgciwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09IGEgJiYgKGEgPSAxLjcwMTU4KSwgciAqICgoZSA9IGUgLyBuIC0gMSkgKiBlICogKChhICsgMSkgKiBlICsgYSkgKyAxKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGVhc2VJbk91dDogZnVuY3Rpb24gZWFzZUluT3V0KGUsIHQsIHIsIG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBhICYmIChhID0gMS43MDE1OCksIChlIC89IG4gLyAyKSA8IDEgPyByIC8gMiAqIChlICogZSAqICgoMSArIChhICo9IDEuNTI1KSkgKiBlIC0gYSkpICsgdCA6IHIgLyAyICogKChlIC09IDIpICogZSAqICgoMSArIChhICo9IDEuNTI1KSkgKiBlICsgYSkgKyAyKSArIHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBCb3VuY2U6IHsKICAgICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByIC0gVHdlZW4uQm91bmNlLmVhc2VPdXQobiAtIGUsIDAsIHIsIG4pICsgdDsKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgZWFzZU91dDogZnVuY3Rpb24gZWFzZU91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIC89IG4pIDwgMSAvIDIuNzUgPyByICogKDcuNTYyNSAqIGUgKiBlKSArIHQgOiBlIDwgMiAvIDIuNzUgPyByICogKDcuNTYyNSAqIChlIC09IDEuNSAvIDIuNzUpICogZSArIC43NSkgKyB0IDogZSA8IDIuNSAvIDIuNzUgPyByICogKDcuNTYyNSAqIChlIC09IDIuMjUgLyAyLjc1KSAqIGUgKyAuOTM3NSkgKyB0IDogciAqICg3LjU2MjUgKiAoZSAtPSAyLjYyNSAvIDIuNzUpICogZSArIC45ODQzNzUpICsgdDsKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgZWFzZUluT3V0OiBmdW5jdGlvbiBlYXNlSW5PdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlIDwgbiAvIDIgPyAuNSAqIFR3ZWVuLkJvdW5jZS5lYXNlSW4oMiAqIGUsIDAsIHIsIG4pICsgdCA6IC41ICogVHdlZW4uQm91bmNlLmVhc2VPdXQoMiAqIGUgLSBuLCAwLCByLCBuKSArIC41ICogciArIHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIFR3ZWVuTSA9IFsiTGluZWFyIiwgIlF1YWQiLCAiQ3ViaWMiLCAiUXVhcnQiLCAiUXVpbnQiLCAiU2luZSIsICJFeHBvIiwgIkNpcmMiLCAiRWxhc3RpYyIsICJCYWNrIiwgIkJvdW5jZSJdLAogICAgICAgICAgICAgIFR3ZWVuRWFzZSA9IFsiZWFzZUluIiwgImVhc2VPdXQiLCAiZWFzZUluT3V0Il07CiAgICAgICAgICB2YXIgcHJlZnMgPSB7CiAgICAgICAgICAgIHNfbWV0aG9kOiAzLAogICAgICAgICAgICBzX2Vhc2U6IDIsCiAgICAgICAgICAgIHNfRlBTOiA2MCwKICAgICAgICAgICAgc19kdXJhdGlvbjogMzMzLAogICAgICAgICAgfTsKCiAgICAgICAgICBmdW5jdGlvbiBnZXRSZWxhdGl2ZURpdihlKSB7CiAgICAgICAgICAgIHZhciB0ID0gci5pZDsKICAgICAgICAgICAgcmV0dXJuICh0ID0gdC5yZXBsYWNlKC8oc3Atc2VwYXJhdG9yLSkoLispLywgKGZ1bmN0aW9uICh0LCByLCBuKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHIgKyBTdHJpbmcoTnVtYmVyKG4pICsgKCJwcmUiID09IGUgPyAtMSA6IDEpKTsKICAgICAgICAgICAgfSkpKSA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpIDogbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICBmdW5jdGlvbiBzcF90cmFuc2l0aW9uKGUsIHQpIHsKICAgICAgICAgICAgdmFyIHIgPSBzcF90cmFuc2l0aW9uLlR3ZWVuRjsKICAgICAgICAgICAgciB8fCAociA9IChyID0gVHdlZW5bVHdlZW5NW3ByZWZzLnNfbWV0aG9kXV0pW1R3ZWVuRWFzZVtwcmVmcy5zX2Vhc2VdXSB8fCByLCBzcF90cmFuc2l0aW9uLlR3ZWVuRiA9IHIpOwogICAgICAgICAgICB2YXIgbiA9IDFlMyAvIHByZWZzLnNfRlBTLCBhID0gMCwgbyA9IGUsIGkgPSB0IC0gZSwgcyA9IE1hdGguY2VpbChwcmVmcy5zX2R1cmF0aW9uIC8gbiksCiAgICAgICAgICAgICAgICBjID0gd2luZG93LnNjcm9sbFg7CiAgICAgICAgICAgICFmdW5jdGlvbiB0cmFuc2l0aW9uKCkgewogICAgICAgICAgICAgIHZhciBlID0gTWF0aC5jZWlsKHIoYSwgbywgaSwgcykpOwogICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwoYywgZSksIGEgPCBzICYmIChhKyssIHNldFRpbWVvdXQodHJhbnNpdGlvbiwgbikpOwogICAgICAgICAgICB9KCk7CiAgICAgICAgICB9CgogICAgICAgICAgZnVuY3Rpb24gc2Nyb2xsSXQoZSwgdCkgewogICAgICAgICAgICBzcF90cmFuc2l0aW9uKGUsIHQpOwogICAgICAgICAgfQoKICAgICAgICAgIHN3aXRjaCAoZS50YXJnZXQuaWQpIHsKICAgICAgICAgICAgY2FzZSAic3Atc3AtZ290b3AiOgogICAgICAgICAgICAgIHNjcm9sbEl0KHdpbmRvdy5zY3JvbGxZLCAwKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgInNwLXNwLWdvcHJlIjoKICAgICAgICAgICAgICB2YXIgbiA9IGdldFJlbGF0aXZlRGl2KCJwcmUiKTsKICAgICAgICAgICAgICBpZiAoIW4pIHJldHVybjsKICAgICAgICAgICAgICB0ID0gd2luZG93LnNjcm9sbFk7CiAgICAgICAgICAgICAgdmFyIGEgPSBuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgICAgICAgICAgICBhID0gdCAtIChyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIGEpOwogICAgICAgICAgICAgIHNjcm9sbEl0KHQsIGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAic3Atc3AtZ29uZXh0IjoKICAgICAgICAgICAgICB2YXIgbyA9IGdldFJlbGF0aXZlRGl2KCJuZXh0Iik7CiAgICAgICAgICAgICAgaWYgKCFvKSByZXR1cm47CiAgICAgICAgICAgICAgdCA9IHdpbmRvdy5zY3JvbGxZOwogICAgICAgICAgICAgIHZhciBpID0gby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7CiAgICAgICAgICAgICAgaSA9IHQgKyAoLXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgaSk7CiAgICAgICAgICAgICAgc2Nyb2xsSXQodCwgaSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJzcC1zcC1nb2JvdHRvbSI6CiAgICAgICAgICAgICAgc2Nyb2xsSXQod2luZG93LnNjcm9sbFksIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB3aW5kb3dzY3JvbGwoZm4gPSAoKT0+e30pIHsKICAgICAgICAgIHNhZmVXYWl0RnVuYygoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICgpID0+IHsKICAgICAgICAgICAgdmFyIGJlZm9yZVNjcm9sbFRvcCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IC8vIOW7tuaXtuaJp+ihjO+8jOmBv+WFjeWImui9veWFpeWIsOmhtemdouWwseinpuWPkee/u+mhteS6i+S7tgogICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIGFmdGVyU2Nyb2xsVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwKICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGFmdGVyU2Nyb2xsVG9wIC0gYmVmb3JlU2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgaWYgKGRlbHRhID09PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICBmbihkZWx0YSA+IDAgPyAiZG93biIgOiAidXAiLCBlKTsKICAgICAgICAgICAgICAgIGJlZm9yZVNjcm9sbFRvcCA9IGFmdGVyU2Nyb2xsVG9wOwogICAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgICAgfSwgMTAwMCkKICAgICAgICAgIH0pCiAgICAgICAgfQoKICAgICAgICB3aW5kb3dzY3JvbGwoZnVuY3Rpb24gKGRpcmVjdGlvbiwgZSkgewogICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gImRvd24iKSB7IC8vIOS4i+a7keaJjeWHhuWkh+e/u+mhtQogICAgICAgICAgICBsZXQgc3BsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NwLWZ3LWFfZW5hYmxlIik7CiAgICAgICAgICAgIC8vIOW8gOWQr+WQju+8jOS4lOWcqOmdnu+8iHN1cHJlcHJlbG9hZGVy5ZCv55So77yJ5pe25Z2H5Y+vCiAgICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc0F1dG9wYWdlID09PSB0cnVlICYmICEoc3BsICYmIHNwbC5jaGVja2VkID09PSB0cnVlKSkgewogICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKICAgICAgICAgICAgICBsZXQgc2Nyb2xsRGVsdGEgPSA2NjY7CiAgICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSBzY3JvbGxEZWx0YSA9IDEwMjQ7IC8vIOavleern+iwt+atjOWKoOi9vee8k+aFoueahOmXrumimAogICAgICAgICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgKyBzY3JvbGxUb3AgKyBzY3JvbGxEZWx0YSAmJiBjdXJTaXRlLnBhZ2VMb2FkaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgY3VyU2l0ZS5wYWdlTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5EVUNLKSB7IC8vIOWPr+S7peeUqOW3suacieeahOaWueazleadpeWunueOsOS6hgogICAgICAgICAgICAgICAgICBpZiAoIUFDQ29uZmlnLm5vcm1hbGl6ZUR1Y2sgfHwgK0FDQ29uZmlnLmR1Y2suQWRzU3R5bGVNb2RlID49IDMpIHsgIC8vIOWmguaenOayoeacieW8gOWQr++8jOmCo+S5iOaJi+WKqOe/u+mhtSB8fCDlpoLmnpzmmK/lj4zliJfnmoTml7blgJnvvIzkvLzkuY7lubbkuI3kvJroh6rliqjop6blj5Hnv7vpobXmlYjmnpwKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjbGlua3MgLnJlc3VsdC0tbW9yZSBhIikuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgIGN1clNpdGUucGFnZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9LCA1MDAwKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgU2hvd1BhZ2VyLmxvYWRNb3JlUGFnZSgpOwogICAgICAgICAgICAgICAgICBpZihjdXJTaXRlLnBhZ2VyICYmIGN1clNpdGUucGFnZXIuc3R5bGlzaCkgewogICAgICAgICAgICAgICAgICAgIEFDX2FkZFN0eWxlKGN1clNpdGUucGFnZXIuc3R5bGlzaCwgIkFDLXBhZ2VyLXN0eWxpc2giKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIFNob3dQYWdlciA9IHsKICAgICAgICAgIGdldEZ1bGxIcmVmOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBpZihlID09PSBudWxsKSByZXR1cm4gJyc7CiAgICAgICAgICAgICJzdHJpbmciICE9IHR5cGVvZiBlICYmIChlID0gZS5nZXRBdHRyaWJ1dGUoImhyZWYiKSk7CiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRGdWxsSHJlZi5hOwogICAgICAgICAgICByZXR1cm4gdCB8fCAodGhpcy5nZXRGdWxsSHJlZi5hID0gdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSksIHQuaHJlZiA9IGUsIHQuaHJlZjsKICAgICAgICAgIH0sCiAgICAgICAgICBjcmVhdGVEb2N1bWVudEJ5U3RyaW5nOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgIGlmICgiSFRNTCIgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSkgcmV0dXJuIChuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIpOwogICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB0ID0gKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCAidGV4dC9odG1sIik7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodCkgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCkgdCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiQURvY3VtZW50Iik7IGVsc2UgdHJ5IHsKICAgICAgICAgICAgICAgICh0ID0gZG9jdW1lbnQuY2xvbmVOb2RlKCExKSkuYXBwZW5kQ2hpbGQodC5pbXBvcnROb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgITEpKSwKICAgICAgICAgICAgICAgICAgdC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJoZWFkIikpLCB0LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImJvZHkiKSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGUpOwogICAgICAgICAgICAgICAgdC5ib2R5LmFwcGVuZENoaWxkKG4pOwogICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgbyA9IHsKICAgICAgICAgICAgICAgICAgVElUTEU6ICEwLAogICAgICAgICAgICAgICAgICBNRVRBOiAhMCwKICAgICAgICAgICAgICAgICAgTElOSzogITAsCiAgICAgICAgICAgICAgICAgIFNUWUxFOiAhMCwKICAgICAgICAgICAgICAgICAgQkFTRTogITAKICAgICAgICAgICAgICAgIH0sIGkgPSB0LmJvZHksIHMgPSBpLmNoaWxkTm9kZXMsIGMgPSBzLmxlbmd0aCAtIDE7IGMgPj0gMDsgYy0tKSBvWyhhID0gc1tjXSkubm9kZU5hbWVdICYmIGkucmVtb3ZlQ2hpbGQoYSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBjb25zb2xlLmVycm9yKCJbQUMtU2NyaXB0XSIsICLmsqHmnInmib7liLDopoHovazmiJBET03nmoTlrZfnrKbkuLIiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkTW9yZVBhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGN1clNpdGUucGFnZXIpIHsKICAgICAgICAgICAgICBsZXQgY3VyUGFnZUVsZSA9IGdldEVsZW1lbnRCeVhwYXRoKGN1clNpdGUucGFnZXIubmV4dExpbmspOwogICAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLmdldEZ1bGxIcmVmKGN1clBhZ2VFbGUpOwogICAgICAgICAgICAgIGlmKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFICkgewogICAgICAgICAgICAgICAgaWYobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdtYWNpbnRvc2gnKSkgewogICAgICAgICAgICAgICAgICAvLyBNQVJLIOS4uuS6huWFvOWuueeZvuW6puWcqHNhZmFyaeS4i+eahAogICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnaHR0cHM6Ly8nLCAnaHR0cDovLycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZih1cmwgPT09ICcnKSByZXR1cm47CiAgICAgICAgICAgICAgdmFyIHNlcEltZ3MgPSB7CiAgICAgICAgICAgICAgICB0b3A6ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQVd0SlJFRlVlTnJjbEUwclJHRVV4OGMxR1VwUkpJVklaR2RoWkNWcjM4R0doYUkwWlh3Q2tsaWdsQ2haRWN2SnhoZGdZV09qTEVVcG0vRXlpTHp6ZStvOGRUemRPM1Bsam9WVHY3clBjOC81ZCs2NTU1eFlyRWhXb3A2Ym9kYTUrNmw5d2pXY1dwRitXSWJxQ0pKOWhGUmNEcjNRQUlrSWhLdWd6NVBEZmtTaXhrcGh6NWFpQW5xZ0U4cmdXUnhHb1NPUHlCa3N3UXVVd3lzY3c0SHJtRkNaTDhLdC9KQWc3bUVGUEVtbzRGZFB3azBCVWNzZHpJYXAwVFE4cU1BUHVJQ2NFakxuZCtWalNqY2ZKTmdJYy9Ea1pHU3ltWUdzbks5RVpNcnhlNE1GYU5HaVpqQzJmVDV6UTNwN1FESzFkUjJHU2xqemljbEF2UlVlOG5IWVZBNGpqdkM0M05mQXVrL3NtQjJRTnFjc1d4S2NMYkFLVEZuUzBoV0Q2bjI3RmQ2RkxxaURJNWlRbVE5anBpVlQwc05KNmFZZDdkQUUzUUhCYmluU0FYNUpXV2F4dUxvOEYzNWpoL2JCSzlZKy9yL0NsNnBMY25uYThOdnVER01uc2xwYlpScFhaWVQvM3I0RUdBQ1pMM1pMMmFmTkZBQUFBQUJKUlU1RXJrSmdnZz09IiwKICAgICAgICAgICAgICAgIGJvdHRvbTogImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBV0NBWUFBQURFdEd3N0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBWEZKUkVGVWVOck0xYzhyQkdFY3gvRmR0Q0VrTHFZdHBkd2tLU1VIVWh4d0lUZEsrWjN5TTJjT0xuSjM5Q2M0NFNnSFNjbUp3bEZ4c0lkbENTY082LzJ0NzZPbnA1MmRYVHRibm5vMU04K1B6ODQrenpNemtjZy9LQTNvUlR6TTBBNGNJNFZUZElVVlBJTTNwUEdPNWFBQkpUa0d4MUJxalltRkZaeFc3bm5Cd1htWG9nV1g2YkVHYzJqRUlVNytrTldEVVNTd1p5cW5kU3ZKM04xZzJCbTBvTHRCMmordzdyUVA0TXBxWHpSVDBZUmFQVy9CdGhNZWRZTHM2MEhzb0UydnE5QnNQd0FKYThYRkxVYTBmVXJ2Uk9vL3NhVDFROWFkR2ltZGx0OHlqNlRUNlE2ZDJ2YWlkYTlZUmJ0UDZFcW1CWkM1ZkhBNlgrQUF6MWJ3RWM2Y2ZrOStvYVpNNE5vWkpMNzArSjJoVGFadE5wZXQwNDF6Szh5UC9NZ2wrck9GMWVtcjBVTTF4bkFmRVB5SVNkMEpubzZ2dHgrUXVNNlBaMjJscE83ZGJFVjJTaXY2clBlSWpOczFIZFlDN2l4ZkcrWUJxZFRWRHFQSXY2aUlXdk83aVhHVUZ4QXFpNzJQcmFKOUlIOEVHQUNRY1lqWVJkNUdId0FBQUFCSlJVNUVya0pnZ2c9PSIsCiAgICAgICAgICAgICAgICBwcmU6ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQVNsSlJFRlVlTnBpWUJqT29CaUlyd0p4RlJBelVzdlFWaUQrQ01UL2dmZ1RFUGRSeTlCUFVFTmgrQXNROTFKaWFBdVNTOUh4WjNJTmI4SGkwditVdXJ3RjZxTC9ST0J2UU54RHJLRmZrVFQrQStKblFQd0JLZkpBL0w5SWFuN2ljN2tNRUhjQzhRODBGM1VBY1JzUXY0YnkzMElOYVVKVDl3ZWFXaFNRRFJVQjR1Vll2TGtZaUFXQU9Cb3B2RUZCbEFyRVBFQThHNHVlOVVBc0FUTTRFWXVDSlVnS010QU1Mb1NLQ3dQeFhDeDZjMWlnQ2xUUWdtVVpWUE5ySE1FR3kzbWdZQ2tDWWlZZ1RrQ1NWNFVadkEySWpZQllESWd2UWJQdk95SlRFQ2lkNXdIeGJ5QTJCdUwzUUx3UldZRXNFSnZnMEl3ZUZFVTQxSUVNbGdjeFdKQUVIME14SmVBc2pNRkVxNkp3K0JyOEJpbVZmTUNUREVrRzdFQmNBOFQzb1dVSng0RFZZd0FCQmdDYW5ublN6Ymd3SVFBQUFBQkpSVTVFcmtKZ2dnPT0iLAogICAgICAgICAgICAgICAgbmV4dDogImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBV0NBWUFBQURFdEd3N0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBVDFKUkVGVWVOcmMxYjFLQTBFWWhlRWwvaUFSRkZFa0tsNkQwVUs4Q3JFVnJDd0VleEZDdEJJbFJXSWpzZkVpTEwwRkt6czdRVVd4TTJwaUZNVWt2aFBPd0xBczJUR3VDbjd3a05sbDVqQzcrdzBKZ3Y5YXZkakFPYmJRbjFUd0N1N1F3aFdXNHhha1BJT0hNS3p4R0NhU0NtNmlvWEhMWjBIcXB6N0tyd1JQSXZ2TnZCbE0yell5Tlk4Y01qaERIbzlmQ0J6RXJuSXFLTmpnUlN4cHZJQUJiT0xlczJNS1dIZnVYZGhYY1IyYXZLcko0ekdoSTlnTGhRYnE5WGFaZ0dPMWt1dElPeklIcEtwN05hd2hqWU9JTlNlWTZsRndIYWN3MTdQNk5UV0hkNHhxbk5iY1M4M0xPYnRzYUNQYkVXK2dYVVc4T0Rzd0MyN3hvT3NuM09ERG1mT0dzczlYTHVFNTRqR2p2UHFHdXVHMW1GRHpaSWZkTkh5bm5kZTdEYlcxcjVEd1RzdEpIUDJpRTU1WXFEMzZlYlhaRHZyKzdML3NVNEFCQUlwVlpXbm9BNUdrQUFBQUFFbEZUa1N1UW1DQyIsCiAgICAgICAgICAgICAgICBuZXh0X2dyYXk6ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXR4SlJFRlVlTnJjbGM5TDJtRWN4Ny82TmJWWnFSVmo3cElPbElVdVoxSE1ndjBCRGNxVDdKcnNrSDEzRUxQQkY3ZVR2ejEwSHpuV1FCbEJSSWZCWElmQkxtcVhzY3ZZWldQS3JNTklVOUFwbXJyMzQvdzZpMG92TVpqdytIMCt6L044WHQrUG4vZm44MGhSLytXSFlSaEJJcEZ3UktQUnovRjQvS25ENFJCMjh4SDBBaDRjSEh5b1VDanNJcEZJSVpQSkhrbWwwbTlZZm4yWkQ3OFhjTDFlSDZyVmFsSU1DbU1VdHFLYkQ3L0hiTlF4YXExNW94Y0gvbFhwY21YZ3RuaDJ1LzJtWEM2L0RxRStzU3hMbFVxbG5pRTBUVlBCWUpBcUZvdDYrR1Y5UHQrUEp0aG1zODBzTFMyeEVvbmtobGdzL2pnd01PQmNYVjNONWZQNXJsQ2NwOWJYMXlXTGk0dWVjcms4VTZsVXNoRFkzd1JiTEpZRkdLWnNOa3NxNE43OC9Md1k5aE9uMDVrNU9qcWkrUHpUR2VQeGVGd1pVbDZ2ZDhoa012a1BEZzZzWkoyTTVlWGxyMXdxVXUya0E1Sk9weTJJQU8rb085ZlcxbjVtTXBrMm5Eam1jamtLTlUyNVhDNjUyV3gycFZJcDY1bVhKMm55alVQcHFha3BOWnh1QThZNVQ4N096c29iamNZSHBWS3BHaHNiZTFDdFZrWFlxeFFLaFRkcXRmcUwxV3IxSnBQSnh4eVU1THEvdno4YUNvWDhUVERhdFlpRmhGNnZ4eDV0QUp3bThPUGo0OG01dWJtS1NxVWFBV3dTYTllUXc2SkdvL2x1TkJvTmg0ZUhiQWUwSmhBSU5zTGg4TE5BSUpDaXVkaHhCK1FoMmx1ZFRpZkRBUUx2STNBSWNoK1JrbDhqSmxyaENiT3FnZm9MbURlcE9GL0JmR05yYTJzRkZaRnR2cWd6TWJGWWpBaXlwOVZxaDRWQzRjVEp5WW1ROTBlcElRSnRIUk8xYkE1YVJoQXZkbloyR0kvSDg3Y0V6NVlQZ2VPUzJSc2ZIeDlCN3UrZ09pNjh5UUF0WVg5emQzZVhnWkNuYS9zOEJ5NXlwR1VVemhPSVNIZ085QmZXWHdHNmNoWjZJYmlWYzZMd25zRmdHSVZBZXBMemprNHJZVzF6ZTN1YmNidmQ1M2ZqWlYyRmFxR1E2M2ZUMDlQRE1POWk5QkVvb24wSjlSbS8zMzl4bTNkcjJmMzlmVkxYN3dGdm9NVnZvWVdmUnlJUkZuZEQvWi84bmYwV1lBQThFQzFaL1pObTRnQUFBQUJKUlU1RXJrSmdnZz09IiwKICAgICAgICAgICAgICAgIHByZV9ncmF5OiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFXQ0FZQUFBREV0R3c3QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFzbEpSRUZVZU5yY2xUdE1XbUVVeHovdXZUemxJVWhwTk1SMGFHTmpyTkhTbUhUcVJKeWFkdWpRRGJTR1J3SlVhWUNtRGl6cVVFdzZPRFZOR2dicFlDZlNwRklOQ1F6RlI5b3lNWFJzWEZDc0FYa0lLTkwvUjdnR1d4T3NTZFBFazV6YzNPK2U4N3ZuKzU5enYwdklwYlNKaVFteXVibjVMQktKcE5iWDExKzRYQzVCdXh5MlhZRE5aaU1PaDJPVzR6aVBUQ2JUaThYaWtlSGg0U3NTaWVRVFhuSXhzTjF1SjFhcmRWWWdFRGdQRHcrVjlYcWQxR28xTWN1eWc3QXV1Vnkrc3JhMjluZGdWRW5HeDhkbmhFS2hzMXF0S2dFL2VYWjhmQ3pDK3EzKy9uNnRTcVZhU1NRUzV3TTduVTVpTXBsbXNGMVhwVkk1QmVYdDZPaElCRmtHQWU5U0twVi93Tm16S2pXYnpSVDZ0Rnd1Szg2Q1VxUHJrSVZXUGpRd01LQldLQlNuNE96djBMR3hzUm1SU0RTRlNqdWEwRG84VFJXQVMrQjUrQjY4Zy9JaGl4Q052UVBOMVdqdWllWnNTL2YxYU5RMHd6QnVhQ3FsVUNRUnRWcjlFczFLNGtWRFdKTmhyUWpBSWlxTWxrcWxlODA0Rm5rakJvT2hFenY0dnJHeGtXMkFMUmFMRnJxK1FvQVYybkU4dExlM2R6RVlERTV2YjI5Mzl2WDFQY0JraUtWU2FRMWpGb3JGWXErTlJxTXVtODNlYnNZem1KcTdzR3U0eGhrS3hzRGZCL0F4bk84NjBldjFvZVhsWlU4Z0VNZ21rMGtGcW13OG85ZFVLaVdmbjU4dmhNUGg1NGg3UytPcFFYTlNMQllmZWp5ZVIxeXp3OWRiUm9uMDlQUzhXMTFkbmZMNWZKbDhQayswV2kzaGs1dnlDTkJZNHZWNmYwSW05K2pvS0pOT3A4MThvOEc3MGFoNGFXbnBJelNLWUNhL2RYZDNCK1B4dUhOeWNqS3pzN056QW1zMStxRlF5K1Z5ZERSejBXalVwZFBwM3RCOFRGTTBGQXFGR3hYUHpjMTlwbEpyTkpxcmFNb1h0OXROdDNTdWMrVGc0SUNlSmZtRmhRVkxvVkF3b0tHN2ZyLy9COGNIQUw2Rnk5WkZEaW5hRy9yNXc3N3lhOHkvT2hFdktSaGp0SXVwMllNVGVCYjNtWFk1M0huQW1Oa1ArL3Y3TnpIVFR3QU80Zjc5Zi91ZC9SSmdBT0xjUk5acUxvak1BQUFBQUVsRlRrU3VRbUNDIiwKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIEFDX2FkZFN0eWxlKCIuc3Atc2VwYXJhdG9ye2xpbmUtaGVpZ2h0OjEuOCAhaW1wb3J0YW50O29wYWNpdHk6MSAhaW1wb3J0YW50O3Bvc2l0aW9uOnJlbGF0aXZlICFpbXBvcnRhbnQ7ZmxvYXQ6bm9uZSAhaW1wb3J0YW50O3RvcDowICFpbXBvcnRhbnQ7bGVmdDowICFpbXBvcnRhbnQ7bWluLXdpZHRoOjM2NnB4O3dpZHRoOmF1dG87dGV4dC1hbGlnbjpjZW50ZXIgIWltcG9ydGFudDtmb250LXNpemU6MTRweCAhaW1wb3J0YW50O2Rpc3BsYXk6YmxvY2sgIWltcG9ydGFudDtwYWRkaW5nOjNweCAwICFpbXBvcnRhbnQ7bWFyZ2luOjVweCAxMHB4IDhweDtjbGVhcjpib3RoICFpbXBvcnRhbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkICFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNjY2NjY2MgIWltcG9ydGFudDtib3JkZXItd2lkdGg6MXB4ICFpbXBvcnRhbnQ7LW1vei1ib3JkZXItcmFkaXVzOjMwcHggIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjMwcHggIWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYgIWltcG9ydGFudDt9LnNwLXNlcGFyYXRvcjpob3Zlcntib3gtc2hhZG93OjAgMCAxMXB4IHJnYmEoMzMsMzMsMzMsMC4yKTt9I3NwLXNlcGFyYXRvci1ob3ZlcntkaXNwbGF5Om5vbmU7fS5zcC1zZXBhcmF0b3I6aG92ZXIgI3NwLXNlcGFyYXRvci1ob3ZlcntkaXNwbGF5OmJsb2NrO30uc3Atc2VwYXJhdG9yIC5zcC1zb21laW5mb3twb3NpdGlvbjphYnNvbHV0ZSAhaW1wb3J0YW50O3JpZ2h0OjEwcHggIWltcG9ydGFudDtmb250LXNpemU6MTJweCAhaW1wb3J0YW50O2ZvbnQtc3R5bGU6aXRhbGljICFpbXBvcnRhbnQ7YmFja2dyb3VuZDpub25lICFpbXBvcnRhbnQ7fS5zcC1zZXBhcmF0b3Igc3Bhbnt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2N1cnNvcjogcG9pbnRlcjtwYWRkaW5nOiAwO21hcmdpbjogMCA1cHg7ZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDoyMnB4O2hlaWdodDoyMnB4O30uc3Atc2VwYXJhdG9yIGF7bWFyZ2luOjAgMjBweCAwIC02cHggIWltcG9ydGFudDtkaXNwbGF5OmlubGluZSAhaW1wb3J0YW50O3RleHQtc2hhZG93OiNmZmYgMCAxcHggMCAhaW1wb3J0YW50O2JhY2tncm91bmQ6bm9uZSAhaW1wb3J0YW50O2NvbG9yOiM1OTU5NTkgIWltcG9ydGFudDt9LnNwLXNlcGFyYXRvciBpbnB1dHtwYWRkaW5nOjAgIWltcG9ydGFudDtsaW5lLWhlaWdodDoyM3B4ICFpbXBvcnRhbnQ7fS5zcC1zZXBhcmF0b3IgLnNwLW1kLXNwYW57Zm9udC13ZWlnaHQ6Ym9sZCAhaW1wb3J0YW50O21hcmdpbjowIDIwcHggIWltcG9ydGFudDt9I3NwLXNwLW1kLW51bWJlcnt3aWR0aDo2Y2ggIWltcG9ydGFudDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGUgIWltcG9ydGFudDtkaXNwbGF5OmlubGluZS1ibG9jayAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30iICsKICAgICAgICAgICAgICAgIGAuYWNfc3BfdG9we2JhY2tncm91bmQtaW1hZ2U6dXJsKCcke3NlcEltZ3MudG9wfScpfWAgKwogICAgICAgICAgICAgICAgYC5hY19zcF9wcmV7YmFja2dyb3VuZC1pbWFnZTp1cmwoJyR7c2VwSW1ncy5wcmV9Jyl9YCArCiAgICAgICAgICAgICAgICBgLmFjX3NwX25leHR7YmFja2dyb3VuZC1pbWFnZTp1cmwoJyR7c2VwSW1ncy5uZXh0fScpfWAgKwogICAgICAgICAgICAgICAgYC5hY19zcF9ib3R0b217YmFja2dyb3VuZC1pbWFnZTp1cmwoJyR7c2VwSW1ncy5ib3R0b219Jyl9YCArCiAgICAgICAgICAgICAgICBgLmFjX3NwX25leHRfZ3JheXtiYWNrZ3JvdW5kLWltYWdlOnVybCgnJHtzZXBJbWdzLm5leHRfZ3JheX0nKX1gICsKICAgICAgICAgICAgICAgIGAuYWNfc3BfcHJlX2dyYXl7YmFja2dyb3VuZC1pbWFnZTp1cmwoJyR7c2VwSW1ncy5wcmVfZ3JheX0nKX1gLAogICAgICAgICAgICAgICAgIkFDLVByZWxvYWQiKQogICAgICAgICAgICAgIGlmIChjdXJTaXRlLnBhZ2VVcmwgPT09IHVybCkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiW0FDLVNjcmlwdF0iLCAi57+76aG15Yiw6L6+5bqV6YOo5LqGIC0g5oiW6ICF5byC5bi4IC0g5Ye6546w5byC5bi46K+355u05o6l5Y+N6aaI5L2c6ICF5L+u5pS5Iik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfS8vIOS4jeS8mumHjeWkjeWKoOi9veebuOWQjOeahOmhtemdogogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLliqDovb3nv7vpobXlnLDlnYDvvJoiICsgdXJsKQogICAgICAgICAgICAgIGN1clNpdGUucGFnZVVybCA9IHVybDsKICAgICAgICAgICAgICAvLyDlr7l1cmznmoTmlbDmja7ov5vooYzor7vlj5YKICAgICAgICAgICAgICBjdXJTaXRlLnBhZ2VyLnN0YXJ0RmlsdGVyICYmIGN1clNpdGUucGFnZXIuc3RhcnRGaWx0ZXIoKTsKICAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgICAgICB0aW1lb3V0OiA1MDAwLAogICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Qm9keSA9IFNob3dQYWdlci5jcmVhdGVEb2N1bWVudEJ5U3RyaW5nKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgLy8geHguZXZhbHVhdGUoeHBhdGgsIHh4KQogICAgICAgICAgICAgICAgICAgIGxldCBwYWdlRWxlbXMgPSBnZXRBbGxFbGVtZW50cyhjdXJTaXRlLnBhZ2VyLnBhZ2VFbGVtZW50LCBuZXdCb2R5LCBuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRFbGVtcyA9IGdldEFsbEVsZW1lbnRzKCcvL3NjcmlwdCcsIG5ld0JvZHksIG5ld0JvZHkpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdG9FbGVtZW50ID0gZ2V0QWxsRWxlbWVudHMoY3VyU2l0ZS5wYWdlci5IVF9pbnNlcnRbMF0pWzBdOwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdlRWxlbXMubGVuZ3RoID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIOWkhOeQhuacgOWQjuS4gOS4que/u+mhteaMiemSrgogICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRFcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNzcC1zcC1nb25leHQiKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdEUgPSBuZXh0RXNbbmV4dEVzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0RS5jbGFzc0xpc3QucmVwbGFjZSgiYWNfc3BfbmV4dF9ncmF5IiwgImFjX3NwX25leHQiKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOaPkuWFpee/u+mhteaMiemSruWFg+e0oAogICAgICAgICAgICAgICAgICAgICAgY3VyU2l0ZS5wYWdlTnVtKys7CiAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkVG8gPSAiYmVmb3JlZW5kIjsKICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJTaXRlLnBhZ2VyLkhUX2luc2VydFsxXSA9PT0gMSkgYWRkVG8gPSAiYmVmb3JlYmVnaW4iOwogICAgICAgICAgICAgICAgICAgICAgdG9FbGVtZW50Lmluc2VydEFkamFjZW50SFRNTChhZGRUbywgYDxkaXYgY2xhc3M9J3NwLXNlcGFyYXRvciBBQycgaWQ9J3NwLXNlcGFyYXRvci1BQ1gnPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSdzcC1zcC1uZXh0bGluaycgdGFyZ2V0PSdfYmxhbmsnPjxiPuesrCA8c3BhbiBzdHlsZT0nY29sb3I6IzU5NTk1OSFpbXBvcnRhbnQ7Jz5BQ1g8L3NwYW4+IOmhtTwvYj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLXNwLWdvdG9wIiBjbGFzcz0nYWNfc3BfdG9wJyB0aXRsZT0n5Y675Yiw6aG26YOoJz48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLXNwLWdvcHJlIiBjbGFzcz0nJHtjdXJTaXRlLnBhZ2VOdW0gPD0gMiA/ICJhY19zcF9wcmVfZ3JheSIgOiAiYWNfc3BfcHJlIn0nIHRpdGxlPSfkuIrmu5rkuIDpobUnID48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLXNwLWdvbmV4dCIgY2xhc3M9J2FjX3NwX25leHRfZ3JheScgdGl0bGU9J+S4i+a7muS4gOmhtSc+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJzcC1zcC1nb2JvdHRvbSIgY2xhc3M9J2FjX3NwX2JvdHRvbScgdGl0bGU9J+WOu+WIsOW6lemDqCcgPjwvc3Bhbj48L2Rpdj5gCiAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvQUNYL2dtLCBjdXJTaXRlLnBhZ2VOdW0pKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOaPkuWFpeaWsOmhtemdouWFg+e0oAogICAgICAgICAgICAgICAgICAgICAgcGFnZUVsZW1zLmZvckVhY2goZnVuY3Rpb24gKG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0b0VsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KGFkZFRvLCBvbmUpOwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc3Atc2VwYXJhdG9yLkFDOm5vdChbYmluZF0pIikuZm9yRWFjaChmdW5jdGlvbiAocGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBlci5zZXRBdHRyaWJ1dGUoImJpbmQiLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYWNfc3BmdW5jKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgIC8vIOaPkuWFpXNjcmlwdHMgJiBzdHlsZSAtIOS/neivgWpz5Yqg6L29CiAgICAgICAgICAgICAgICAgICAgICBpZihjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkdPT0dMRSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0VGV4dCA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRFbGVtcy5mb3JFYWNoKChvbmUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUZXh0ICs9IG9uZS5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLmlubmVySFRNTCA9IHNjcmlwdFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvRWxlbWVudC5hcHBlbmRDaGlsZChzY3JpcHROb2RlKQogICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgIC8vIOabv+aNouW+heabv+aNouWFg+e0oAogICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9yaUUgPSBnZXRBbGxFbGVtZW50cyhjdXJTaXRlLnBhZ2VyLnJlcGxhY2VFKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcEUgPSBnZXRBbGxFbGVtZW50cyhjdXJTaXRlLnBhZ2VyLnJlcGxhY2VFLCBuZXdCb2R5LCBuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaUUubGVuZ3RoID09PSByZXBFLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9yaUUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAi57+76aG1Leabv+aNoue/u+mhteWFg+e0oCAncmVwbGFjZUUnIOWkseaViCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JpRS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpRVtpXS5vdXRlckhUTUwgPSByZXBFW2ldLm91dGVySFRNTDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY3VyU2l0ZS5wYWdlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgY3VyU2l0ZS5wYWdlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIEFkZEN1c3RvbVN0eWxlKCkgewogICAgICAgICAgaWYgKEFDQ29uZmlnLmlzVXNlclN0eWxlRW5hYmxlKSB7CiAgICAgICAgICAgIEFDX2FkZFN0eWxlKEFDQ29uZmlnLlVzZXJTdHlsZVRleHQsICJBQy11c2VyU3R5bGUiKTsvLyDnlKjmiLfoh6rlrprkuYnnmoTmoLflvI/ooagKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIOS4uuS6huaWueS+v+iwg+aVtOagt+W8j+WSjOafpeeci+aViOaenO+8jOaaguaXtuS4jeenu+mZpAogICAgICAgICAgICAvLyBzYWZlUmVtb3ZlKCJzdHlsZVtjbGFzcz0nQUMtdXNlclN0eWxlJ10iKQogICAgICAgICAgfQogICAgICAgICAgQUNfYWRkU3R5bGUoCiAgICAgICAgICAgICIub3ByLXJlY29tbWVuZHMtbWVyZ2UtaW1ndGV4dHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50O30iICsgLy8g56e76Zmk55m+5bqm5rWP6KeI5Zmo5o6o5bm/CiAgICAgICAgICAgICIucmVzX3RvcF9iYW5uZXJ7ZGlzcGxheTpub25lIWltcG9ydGFudDt9IiArIC8vIOenu+mZpOWPr+iDveeahOeZvuW6pkhUVFBT5Yqr5oyB5pi+56S66Zeu6aKYCiAgICAgICAgICAgICIuaGVhZEJsb2NrLCBib2R5PmRpdi5yZXN1bHQtb3B7ZGlzcGxheTpub25lO30iIC8vIOenu+mZpOeZvuW6pueahOaQnOe0oue7k+aenOmhtumDqOS4gOadoeeahOW7uuiuruaWh+WtlyAmIOenu+mZpOWPr+iDveWHuueOsOeahOeZveWxj+eOsOixoQogICAgICAgICAgICAsICJBQy1zcGVjaWFsLUJBSURVIgogICAgICAgICAgKTsKICAgICAgICAgIC8qIuiHquWumuS5iSLmjInpkq7mlYjmnpwqLwogICAgICAgICAgQUNfYWRkU3R5bGUoIi5hY2hpZGV7ZGlzcGxheTpub25lO30gLm5ld0Z1bmNIaWdoTGlnaHR7Y29sb3I6cmVkO2ZvbnQtd2VpZ2h0OiAxMDA7YmFja2dyb3VuZC1jb2xvcjogeWVsbG93O2ZvbnQtd2VpZ2h0OiA2MDA7fSNzcC1hYy1jb250YWluZXIgbGFiZWx7ZGlzcGxheTppbmxpbmU7fSN1e3dpZHRoOjMxOXB4fSN1ICNteXVzZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOiAxM3B4IC0xMHB4IDAgMjRweDt9LnNpdGUtd3JhcHBlciAjbXl1c2VyLC5zb2dvdS1zZXQtYm94ICNteXVzZXIsI2didyAjbXl1c2Vye21hcmdpbi1yaWdodDoxNXB4O30gI215dXNlciwjbXl1c2VyIC5teXVzZXJjb25maWd7cGFkZGluZzowO21hcmdpbjowfSNteXVzZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7fSNteXVzZXIgLm15dXNlcmNvbmZpZ3tkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoxLjU7YmFja2dyb3VuZDojNGU2ZWYyO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NzAwO3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NnB4O2JvcmRlcjoycHggc29saWQgI0U1RTVFNTt9I215dXNlciAubXl1c2VyY29uZmlne2JveC1zaGFkb3c6MCAwIDEwcHggM3B4IHJnYmEoMCwwLDAsLjEpO2JvcmRlci1yYWRpdXM6IDZweH0jbXl1c2VyIC5teXVzZXJjb25maWc6aG92ZXJ7YmFja2dyb3VuZDojNDY2MmQ5ICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcjtib3JkZXI6MnB4IHNvbGlkICM3M0E2Rjg7fWJvZHlbZG9nZV0gI2hlYWRlcnttYXgtd2lkdGg6IHVuc2V0O31ib2R5W2RvZ2VdICNteXVzZXJ7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiA0MHB4O30iLAogICAgICAgICAgICAiQUMtTUVOVV9CdG4iKTsKICAgICAgICAgIC8q6Ieq5a6a5LmJ6aG16Z2i5YaF5a655pWI5p6cKi8KICAgICAgICAgIEFDX2FkZFN0eWxlKCdib2R5W2JhaWR1XSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9ImJhaWR1Il0pPmxhYmVsOm5vdChbY2xhc3M9ImxhYmVsX2hpZGUiXSksXG4nICsKICAgICAgICAgICAgJyAgYm9keVtnb29nbGVdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0iZ29vZ2xlIl0pPmxhYmVsOm5vdChbY2xhc3M9ImxhYmVsX2hpZGUiXSksXG4nICsKICAgICAgICAgICAgJyAgYm9keVtiaW5nXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9ImJpbmciXSk+bGFiZWw6bm90KFtjbGFzcz0ibGFiZWxfaGlkZSJdKSxcbicgKwogICAgICAgICAgICAnICBib2R5W3NvZ291XSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9InNvZ291Il0pPmxhYmVsOm5vdChbY2xhc3M9ImxhYmVsX2hpZGUiXSksXG4nICsKICAgICAgICAgICAgJyAgYm9keVtkdWNrXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9ImR1Y2siXSk+bGFiZWw6bm90KFtjbGFzcz0ibGFiZWxfaGlkZSJdKSxcbicgKwogICAgICAgICAgICAnICBib2R5W2RvZ2VdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0iZG9nZSJdKT5sYWJlbDpub3QoW2NsYXNzPSJsYWJlbF9oaWRlIl0pLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbYmFpZHVdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0iYmFpZHUiXSk+YnIsXG4nICsKICAgICAgICAgICAgJyAgYm9keVtnb29nbGVdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0iZ29vZ2xlIl0pPmJyLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbYmluZ10gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsOm5vdChbY2xhc3MqPSJiaW5nIl0pPmJyLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbZHVja10gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsOm5vdChbY2xhc3MqPSJkdWNrIl0pPmJyLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbZG9nZV0gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsOm5vdChbY2xhc3MqPSJkb2dlIl0pPmJyLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbc29nb3VdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0ic29nb3UiXSk+YnIsXG4nICsKICAgICAgICAgICAgJyAgYm9keVtiYWlkdV0gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsW2NsYXNzKj0iYmFpZHUiXT4ubGFiZWxfaGlkZSxcbicgKwogICAgICAgICAgICAnICBib2R5W2dvb2dsZV0gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsW2NsYXNzKj0iZ29vZ2xlIl0+LmxhYmVsX2hpZGUsXG4nICsKICAgICAgICAgICAgJyAgYm9keVtiaW5nXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWxbY2xhc3MqPSJiaW5nIl0+LmxhYmVsX2hpZGUsXG4nICsKICAgICAgICAgICAgJyAgYm9keVtzb2dvdV0gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsW2NsYXNzKj0ic29nb3UiXT4ubGFiZWxfaGlkZSxcbicgKwogICAgICAgICAgICAnICBib2R5W2R1Y2tdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbFtjbGFzcyo9ImR1Y2siXT4ubGFiZWxfaGlkZSxcbicgKwogICAgICAgICAgICAnICBib2R5W2RvZ2VdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbFtjbGFzcyo9ImRvZ2UiXT4ubGFiZWxfaGlkZVxuJyArIC8vIOazqOaEj+WwvumDqOmAl+WPtwogICAgICAgICAgICAneycgKwogICAgICAgICAgICAnZGlzcGxheTpub25lO1xuJyArCiAgICAgICAgICAgICd9I3NwLWFjLWNvbnRhaW5lciAubGFiZWxfaGlkZXtjdXJzb3I6cG9pbnRlcjttYXJnaW4tbGVmdDo4JTtjb2xvcjpibHVlfSNzcC1hYy1jb250YWluZXIgLmxpbmtocmVmLCNzcC1hYy1jb250YWluZXIgLmxhYmVsX2hpZGU6aG92ZXJ7Y29sb3I6cmVkfSNzcC1hYy1jb250YWluZXIgLmxpbmtocmVmOmhvdmVye2ZvbnQtd2VpZ2h0OmJvbGR9I3NwLWFjLWNvbnRhaW5lciBsYWJlbC5tZW51LWJveC1zbWFsbHttYXgtd2lkdGg6MTZweDttYXgtaGVpZ2h0OjE2cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2t9LkFDLUNvdW50ZXJUe2JhY2tncm91bmQ6I0ZEOTk5OX1ib2R5ICAjc3AtYWMtY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3RvcDozLjl2dztyaWdodDo4Ljh2d30jc3AtYWMtY29udGFpbmVye3otaW5kZXg6OTk5OTk5O3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kLWNvbG9yOndoaXRlfSNzcC1hYy1jb250YWluZXIgKntmb250LXNpemU6MTNweDtjb2xvcjpibGFjaztmbG9hdDpub25lfSNzcC1hYy1tYWluLWhlYWR7cG9zaXRpb246cmVsYXRpdmU7dG9wOjA7bGVmdDowfSNzcC1hYy1zcGFuLWluZm97cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MXB4O3RvcDowO2ZvbnQtc2l6ZToxMHB4O2xpbmUtaGVpZ2h0OjEwcHg7YmFja2dyb3VuZDpub25lO2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiM1YTVhNWE7dGV4dC1zaGFkb3c6d2hpdGUgMHB4IDFweCAxcHh9I3NwLWFjLWNvbnRhaW5lciBpbnB1dHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3V0bGluZTpub25lO2hlaWdodDphdXRvO3BhZGRpbmc6MHB4O21hcmdpbi1ib3R0b206MHB4O21hcmdpbi10b3A6MHB4fSNzcC1hYy1jb250YWluZXIgaW5wdXRbdHlwZT0ibnVtYmVyIl17d2lkdGg6NTBweDt0ZXh0LWFsaWduOmxlZnR9I3NwLWFjLWNvbnRhaW5lciBpbnB1dFt0eXBlPSJjaGVja2JveCJde2JvcmRlcjoxcHggc29saWQgI0I0QjRCNDtwYWRkaW5nOjFweDttYXJnaW46M3B4O3dpZHRoOjEzcHg7aGVpZ2h0OjEzcHg7YmFja2dyb3VuZDpub25lO2N1cnNvcjpwb2ludGVyO3Zpc2liaWxpdHk6dmlzaWJsZTtwb3NpdGlvbjpzdGF0aWN9I3NwLWFjLWNvbnRhaW5lciBpbnB1dFt0eXBlPSJidXR0b24iXXtib3JkZXI6MXB4IHNvbGlkICNjY2M7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG99I3NwLWFjLWNvbnRhaW5lciBsaXtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjNweCAwO2JvcmRlcjpub25lO2Zsb2F0Om5vbmU7Y3Vyc29yOmRlZmF1bHQ7fSNzcC1hYy1jb250YWluZXIgZmllbGRzZXR7Ym9yZGVyOjJweCBncm9vdmUgI2NjYzstbW96LWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6NHB4IDlweCA2cHggOXB4O21hcmdpbjoycHg7ZGlzcGxheTpibG9jazt3aWR0aDphdXRvO2hlaWdodDphdXRvfSNzcC1hYy1jb250YWluZXIgbGVnZW5ke2xpbmUtaGVpZ2h0OjIwcHg7bWFyZ2luLWJvdHRvbTowcHh9I3NwLWFjLWNvbnRhaW5lciBmaWVsZHNldCA+IHVse3BhZGRpbmc6MDttYXJnaW46MH0jc3AtYWMtY29udGFpbmVyIHVsI3NwLWFjLWFfdXNlaWZyYW1lLWV4dGVuZHtwYWRkaW5nLWxlZnQ6NDBweH0jc3AtYWMtcmVjdHtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDtsZWZ0OjA7ZmxvYXQ6cmlnaHQ7aGVpZ2h0OjEwcHg7d2lkdGg6MTBweDtwYWRkaW5nOjA7bWFyZ2luOjA7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDtib3JkZXI6MXB4IHNvbGlkIHdoaXRlOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDVweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4zKSwwIDAgM3B4IHJnYmEoMCwwLDAsMC44KTstbW96LWJveC1zaGFkb3c6aW5zZXQgMCA1cHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMyksMCAwIDNweCByZ2JhKDAsMCwwLDAuOCk7Ym94LXNoYWRvdzppbnNldCAwIDVweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4zKSwwIDAgM3B4IHJnYmEoMCwwLDAsMC44KTtvcGFjaXR5OjAuOH0jc3AtYWMtZG90LCNzcC1hYy1jdXItbW9kZXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTk7d2lkdGg6NXB4O2hlaWdodDo1cHg7cGFkZGluZzowOy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xpZCB3aGl0ZTtvcGFjaXR5OjE7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgLTJweCAxcHggcmdiYSgwLDAsMCwwLjMpLGluc2V0IDAgMnB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LDAuMyksMHB4IDFweCAycHggcmdiYSgwLDAsMCwwLjkpOy1tb3otYm94LXNoYWRvdzppbnNldCAwIC0ycHggMXB4IHJnYmEoMCwwLDAsMC4zKSxpbnNldCAwIDJweCAxcHggcmdiYSgyNTUsMjU1LDI1NSwwLjMpLDBweCAxcHggMnB4IHJnYmEoMCwwLDAsMC45KTtib3gtc2hhZG93Omluc2V0IDAgLTJweCAxcHggcmdiYSgwLDAsMCwwLjMpLGluc2V0IDAgMnB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LDAuMyksMHB4IDFweCAycHggcmdiYSgwLDAsMCwwLjkpfSNzcC1hYy1kb3R7cmlnaHQ6LTNweDt0b3A6LTNweH0jc3AtYWMtY3VyLW1vZGV7bGVmdDotM3B4O3RvcDotM3B4O3dpZHRoOjZweDtoZWlnaHQ6NnB4fSNzcC1hYy1jb250ZW50e3BhZGRpbmc6MDttYXJnaW46MHB4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xpZCAjQTBBMEEwOy13ZWJraXQtYm94LXNoYWRvdzotMnB4IDJweCA1cHggcmdiYSgwLDAsMCwwLjMpOy1tb3otYm94LXNoYWRvdzotMnB4IDJweCA1cHggcmdiYSgwLDAsMCwwLjMpO2JveC1zaGFkb3c6LTJweCAycHggNXB4IHJnYmEoMCwwLDAsMC4zKX0jc3AtYWMtbWFpbntwYWRkaW5nOjVweDtib3JkZXI6MXB4IHNvbGlkIHdoaXRlOy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZC1jb2xvcjojRjJGMkY3O2JhY2tncm91bmQ6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCNGQ0ZDRkMsI0YyRjJGNyAxMDAlKTtiYWNrZ3JvdW5kOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjRkNGQ0ZDKSx0bygjRjJGMkY3KSl9I3NwLWFjLWZvb3R7cG9zaXRpb246cmVsYXRpdmU7bGVmdDowO3JpZ2h0OjA7bWluLWhlaWdodDoyMHB4fSNzcC1hYy1zYXZlYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjJweH0jc3AtYWMtY29udGFpbmVyIC5lbmRidXR0b257bWFyZ2luLXRvcDo4cHh9I3NwLWFjLWNvbnRhaW5lciAuc3AtYWMtc3BhbmJ1dHRvbntib3JkZXI6MXB4IHNvbGlkICNjY2M7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjJweCAzcHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojRjlGOUY5Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDEwcHggNXB4IHdoaXRlOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDEwcHggNXB4IHdoaXRlO2JveC1zaGFkb3c6aW5zZXQgMCAxMHB4IDVweCB3aGl0ZX0jc3AtYWMtY29udGFpbmVyIC5zcC1hYy1zcGFuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I0RERH1sYWJlbFtjbGFzcz0ibmV3RnVuYyJde2NvbG9yOmJsdWV9JywKICAgICAgICAgICAgIkFDLU1FTlVfUGFnZSIpOwogICAgICAgIH0KCiAgICAgICAgQWRkQ3VzdG9tU3R5bGUoKTsKICAgICAgICB0cnkgewogICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnQUMt6YeN5a6a5ZCR6ISa5pys6K6+572uJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGVudCIpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIH0KCiAgICAgICAgLyoq6L+Z5Lic6KW/5Lul5ZCO5Lya55So5LiKKiovCiAgICAgICAgZnVuY3Rpb24gZ2V0U2VhcmNoVmFsdWUoKSB7CiAgICAgICAgICBsZXQga3ZsID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5zcGxpdCgiJiIpOwogICAgICAgICAgbGV0IHNlYXJjaFYgPSAiIjsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga3ZsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGt2bFtpXS5yZXBsYWNlKC9eKHdkfHF1ZXJ5fHEpPS8sICIiKTsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBrdmxbaV0pIHsKICAgICAgICAgICAgICBzZWFyY2hWID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vICAnKycg55m+5bqm44CB5pCc54uX44CB5b+F5bqU44CB6LC35q2M44CB5aW95pCcCiAgICAgICAgICBzZWFyY2hWID0gc2VhcmNoVi5yZXBsYWNlKCIrIiwgIiAiKTsKICAgICAgICAgIHJldHVybiBzZWFyY2hWOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmFwaWREZWFsKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGluc2VydExvY2tlZCA9PT0gZmFsc2UgJiYgY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5PVEhFUlMpIHsKICAgICAgICAgICAgICBpbnNlcnRMb2NrZWQgPSB0cnVlOwogICAgICAgICAgICAgIEFDSGFuZGxlKCk7IC8vIOWkhOeQhuS4u+mHjeWumuWQkQogICAgICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc0Zhdmljb25FbmFibGUgJiYgdHlwZW9mKGN1clNpdGUuRmF2aWNvblR5cGUpICE9PSAndW5kZWZpbmVkJykgeyAvLyDmmL7npLpmYXZpY29u5Zu+5qCHCiAgICAgICAgICAgICAgICBBQ19hZGRTdHlsZSgiaDM6OmJlZm9yZSwgaDI6OmJlZm9yZSB7Y29udGVudDogJyAnO2Rpc3BsYXk6aW5saW5lLWJsb2NrfSIsICJBQy1TdHlsZS1GYXZpY29uIiwgImhlYWQiKTsKICAgICAgICAgICAgICAgIGFkZEZhdmljb24oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjdXJTaXRlLkZhdmljb25UeXBlKSk7IC8vIOa3u+WKoEZhdmljb27mmL7npLoKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHNhZmVSZW1vdmUoImltZy5BQy1mYXZpY29uVCIpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjdXJTaXRlLkZhdmljb25UeXBlKS5mb3JFYWNoKChvbmUpID0+IHsKICAgICAgICAgICAgICAgICAgb25lLnJlbW92ZUF0dHJpYnV0ZSgiYWNfZmF2aWNvbnN0YXR1cyIpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g5Yqo5oCB5LiL5YiS57q/CiAgICAgICAgICAgICAgaWYgKCFBQ0NvbmZpZy5pc0FMaW5lRW5hYmxlKSB7CiAgICAgICAgICAgICAgICBBQ19hZGRTdHlsZSgiYSxhIGVte3RleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnR9IiwgIkFDLU5vTGluZSIsICJib2R5Iik7Ly8g56e76Zmk6L+Z5Lqb5Liq5LiL5YiS57q/CiAgICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgc2FmZVJlbW92ZSgic3R5bGVbY2xhc3M9J0FDLU5vTGluZSddIikKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKEFDQ29uZmlnLmlzQWRzRW5hYmxlKSB7IC8vIOenu+mZpOWkmuS9meeahOW5v+WRiuWGheWuuQogICAgICAgICAgICAgICAgcmVtb3ZlQURfYmFpZHVfc29nb3UoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKEFDQ29uZmlnLmlzQ291bnRlckVuYWJsZSkgeyAvLyDmmL7npLrorqHmlbDlmagKICAgICAgICAgICAgICAgIGFkZENvdW50ZXIoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjdXJTaXRlLkNvdW50ZXJUeXBlKSk7CiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuQUMtQ291bnRlclQiKS5mb3JFYWNoKG9uZSA9PiB7CiAgICAgICAgICAgICAgICAgIG9uZS5wYXJlbnRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnU29ydEluZGV4Jyk7CiAgICAgICAgICAgICAgICAgIG9uZS5yZW1vdmUoKQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKEFDQ29uZmlnLmRvRGlzYWJsZVN1ZykgeyAvLyDkuI3lkK/nlKjnp7vliqjpooTmtYtb6buY6K6kXQogICAgICAgICAgICAgICAgYWNTZXRDb29raWUoIk9SSUdJTiIsIDIsICJ3d3cuYmFpZHUuY29tIik7CiAgICAgICAgICAgICAgICBhY1NldENvb2tpZSgiSVNTVyIsIDEpOwogICAgICAgICAgICAgICAgYWNTZXRDb29raWUoIklTU1ciLCAxLCAid3d3LmJhaWR1LmNvbSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBpZihDT05TVC51c2VJdGVtLkh1WWFuTW9kZSA9PT0gZmFsc2UgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic3R5bGVbY2xhc3MqPSdkYXJrcmVhZGVyJ10iKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gICBDT05TVC51c2VJdGVtLkh1WWFuTW9kZSA9IHRydWU7CiAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc0Jsb2NrRW5hYmxlICYmIGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuU09HT1UpIHsgLy8g5ZCv55So5bGP6JS95Yqf6IO9LSDlr7nmr4/kuIDkuKrmlrDlop7nmoTlnLDlnYDpg73opoHlpITnkIYKICAgICAgICAgICAgICAgIFNpdGVCbG9jay5pbml0U3R5bGUoKTsKICAgICAgICAgICAgICAgIFNpdGVCbG9jay5pbml0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmKGRvY3VtZW50LmJvZHkpewogICAgICAgICAgICAgICAgaWYgKCFBQ0NvbmZpZy5pc1JpZ2h0RGlzcGxheUVuYWJsZSkgeyAvLyDlj7PkvqfmoI/mmL7npLoKICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJzaG93UmlnaHQiKQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJzaG93UmlnaHQiKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5HT09HTEUpIHsKICAgICAgICAgICAgICAgIGxldCBub2RlTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNyc28iKQogICAgICAgICAgICAgICAgY29uc3QgaXNTcGVjaWFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3Jzbz4uZyIpICE9PSBudWxsIC8vIOWtmOWcqOS4gOS4quiKgueCueWNs+S4unNwZWNpYWwKICAgICAgICAgICAgICAgIGlmKGlzU3BlY2lhbCAhPT0gQ09OU1QuaXNHb29nbGVTcGVjaWFsICYmIENPTlNULmlzR29vZ2xlU3BlY2lhbCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBDT05TVC5pc0dvb2dsZVNwZWNpYWwgPSB0cnVlCiAgICAgICAgICAgICAgICAgICAgc2FmZVJlbW92ZSgic3R5bGVbY2xhc3M9J0FDLVR3b1BhZ2VFeFN0eWxlJ10sc3R5bGVbY2xhc3M9J0FDLVRocmVlUGFnZUV4U3R5bGUnXSxzdHlsZVtjbGFzcz0nQUMtRm91clBhZ2VFeFN0eWxlJ10iKTsKICAgICAgICAgICAgICAgICAgICBhY0Nzc0xvYWRGbGFnID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIuaW5pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYobm9kZUxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICBub2RlTGlzdC5mb3JFYWNoKChub2RlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKENPTlNULmlzR29vZ2xlU3BlY2lhbCkgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5kaXNwbGF5ICE9PSAnZ3JpZCcgPyBub2RlLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc6ICcnCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUuZGlzcGxheSAhPT0gJ3Vuc2V0JyA/IG5vZGUuc3R5bGUuZGlzcGxheSA9ICd1bnNldCc6ICcnCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIOeJueauiuWFg+e0oOS4gOihjOWkhOeQhgogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI3Jzbz5kaXY6bm90KC5nKT5kaXZbanNtb2RlbF0iKS5mb3JFYWNoKG9uZSA9PiB7CiAgICAgICAgICAgICAgICAgIG9uZS5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkgPSAidW5zZXQiCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGluc2VydExvY2tlZCA9IGZhbHNlOwogICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhY1NldENvb2tpZShjbmFtZSwgY3ZhbHVlLCBkb21haW4sIGV4ZGF5cykgewogICAgICAgICAgdHJ5ewogICAgICAgICAgICBleGRheXMgPSBleGRheXMgfHwgMzA7CiAgICAgICAgICAgIGxldCBkID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgZG9tYWluID0gKGRvbWFpbiA/ICJkb21haW49IiArIGRvbWFpbiA6ICIiKSArICI7IjsKICAgICAgICAgICAgZC5zZXRUaW1lKGQuZ2V0VGltZSgpICsgKGV4ZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICAgICAgbGV0IGV4cGlyZXMgPSAiZXhwaXJlcz0iICsgZC50b1VUQ1N0cmluZygpOwogICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjbmFtZSArICI9IiArIGN2YWx1ZSArICI7ICIgKyBkb21haW4gKyBleHBpcmVzICsgIjtwYXRoPS8iOwogICAgICAgICAgfWNhdGNoKGUpe30KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0Tm9kZUhvc3Qoc2l0ZXRwTm9kZSkgewogICAgICAgICAgaWYoc2l0ZXRwTm9kZSBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50KXsKICAgICAgICAgICAgcmV0dXJuIHtjdXJIb3N0OiBzaXRldHBOb2RlLmhvc3QsIGN1clVybDogc2l0ZXRwTm9kZS5ocmVmfTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJBSURVKSB7CiAgICAgICAgICAgIHZhciBocmVmID0gbnVsbDsKICAgICAgICAgICAgaWYgKHNpdGV0cE5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgewogICAgICAgICAgICAgIGhyZWYgPSBzaXRldHBOb2RlLmdldEF0dHJpYnV0ZSgiaHJlZiIpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhyZWYgIT0gbnVsbCAmJiBocmVmLmluY2x1ZGVzKCJiYWlkdS5jb20vbGluayIpKSB7CiAgICAgICAgICAgICAgLy8g5bey57uP6Kej5p6Q5Ye65p2l5LqGCiAgICAgICAgICAgICAgcmV0dXJuICB7Y3VySG9zdDogZ2V0VGV4dEhvc3QoaHJlZiksIGN1clVybDogaHJlZn07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7Y3VySG9zdDogZ2V0VGV4dEhvc3Qoc2l0ZXRwTm9kZS5pbm5lclRleHQgfHwgc2l0ZXRwTm9kZS50ZXh0Q29udGVudCksIGN1clVybDogbnVsbH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBBQ0hhbmRsZSgpIHsKICAgICAgICAgIC8vIOWkhOeQhuS4u+mHjeWumuWQkQogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuT1RIRVJTIHx8IGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuU09HT1UpIHJldHVybjsKICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc1JlZGlyZWN0RW5hYmxlKSB7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlN0eXBlX05vcm1hbCAhPT0gbnVsbCAmJiBjdXJTaXRlLlN0eXBlX05vcm1hbCAhPT0gIiIpIHsKICAgICAgICAgICAgICAvLyDnmb7luqbmkJzni5fljrvph43lrprlkJEt5pmu6YCa5qih5byP44CQ5rOo5oSP5LiN6IO95Li6ZG9jdW1lbnQucXVlcnkuLuOAkQogICAgICAgICAgICAgIHJlc2V0VVJMTm9ybWFsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY3VyU2l0ZS5TdHlwZV9Ob3JtYWwpKTsKICAgICAgICAgICAgICBpZiAoY2hlY2tJU0JhaWR1TWFpbigpKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc19mb3JtIC5pbmRleC1sb2dvLXNyY1tzcmMqPSdnaWYnXSwgLnNfZm9ybSAuaW5kZXgtbG9nby1zcmNuZXdbc3JjKj0nZ2lmJ10iKS5mb3JFYWNoKGZ1bmN0aW9uIChwZXIpIHsKICAgICAgICAgICAgICAgICAgcGVyLnNyYyA9ICJodHRwczovL3BpYy5ybWIuYmRzdGF0aWMuY29tL2M4NjI1NWU4MDI4Njk2MTM5ZDNlM2U0YmI0NGMwNDdiLnBuZyI7CiAgICAgICAgICAgICAgICAgIC8vIOelnuWlh+eahOeZvuW6pueZvuWutuWPtwogICAgICAgICAgICAgICAgICAvLyBodHRwczovL2ltZ3NhLmJhaWR1LmNvbS9mZXgvcGljL2l0ZW0vODcxODM2N2FkYWI0NGFlZGNjOTFhYjJiYmUxYzg3MDFhMDhiZmIyNi5qcGcKICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9iYWlkdS5udGFvdy5jb20vbmV3Y3NzL2JhaWR1LnBuZwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkdPT0dMRSkgcmVtb3ZlT25Nb3VzZURvd25GdW5jKCk7IC8vIOenu+mZpG9uTW91c2VEb3du5LqL5Lu277yM6LC35q2M5Y676YeN5a6a5ZCRCiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLk1CQUlEVSkgcmVtb3ZlTW9iaWxlQmFpZHVEaXJlY3RMaW5rKCk7IC8vIOWkhOeQhueZvuW6puaJi+acuueJiOacrOeahOmHjeWumuWQkeWcsOWdgAogICAgICAgICAgICByZW1vdmVSZWRpcmVjdExpbmtUYXJnZXQoKTsgLy8g5Y+q56e76Zmk55+l5LmO55qE6YeN5a6a5ZCR6Zeu6aKYICYg55m+5bqm5a2m5pyv6YeN5a6a5ZCR6Zeu6aKYCiAgICAgICAgICAgIHNhZmVSZW1vdmUoIi5yZXNfdG9wX2Jhbm5lciIpOyAvLyDnp7vpmaTnmb7luqblj6/og73mmL7npLrnmoTliqvmjIEKICAgICAgICAgIH0KCiAgICAgICAgICB0cnkgeyAvLyDmlL7lhaXlvILluLjmjZXojrfvvIzpmLLmraLnlLHkuo5odG1s5o+S5YWl6L+H5oWi5a+86Ie055qEanPnu4jmraIKICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtc3R5bGUiKS5jaGVja2VkKSB7CiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZSo9J3NwLWFjLWFfZm9yY2Vfc3R5bGVfJ10iKS5mb3JFYWNoKHBlciA9PiB7CiAgICAgICAgICAgICAgICBwZXIuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgcGVyLnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICLor7flvIDlkK/oh6rlrprkuYnmoLflvI8iKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWUqPSdzcC1hYy1hX2ZvcmNlX3N0eWxlXyddIikuZm9yRWFjaChwZXIgPT4gewogICAgICAgICAgICAgICAgcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgIHBlci5wYXJlbnROb2RlLnNldEF0dHJpYnV0ZSgidGl0bGUiLCAiQUMt6Ieq5a6a5LmJ5qC35byP5YaF5a65IikKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzcC1hYy1ibG9jayIpLmNoZWNrZWQpIHsKICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjc3AtYWMtcmVtb3ZlQmxvY2ssICNzcC1hYy1ibG9ja0J0bkRpc3BsYXkiKS5mb3JFYWNoKHBlciA9PiB7CiAgICAgICAgICAgICAgICBwZXIuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgcGVyLnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICLor7flvIDlkK/oh6rlrprkuYnmoLflvI8iKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNzcC1hYy1yZW1vdmVCbG9jaywgI3NwLWFjLWJsb2NrQnRuRGlzcGxheSIpLmZvckVhY2gocGVyID0+IHsKICAgICAgICAgICAgICAgIHBlci5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICBwZXIucGFyZW50Tm9kZS5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgIkFDLeiHquS4u+aLpuaIquWKn+iDvSIpCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIEFDdG9nZ2xlU2V0dGluZ0Rpc3BsYXkoZSkgewogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIC8vIOaYvuekuu+8n+makOiXj+iuvue9rueVjOmdogogICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5pZnJhbWUtZmF0aGVyIGlmcmFtZSIpID09PSBudWxsKSB7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5pZnJhbWUtZmF0aGVyIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCAiPGlmcmFtZSBzcmM9J2h0dHBzOi8vZ2hidG5zLmNvbS9naXRodWItYnRuLmh0bWw/dXNlcj1sYW5ncmVuMTM1MyZyZXBvPUdNX3NjcmlwdCZ0eXBlPXN0YXImY291bnQ9dHJ1ZScgZnJhbWVib3JkZXI9JzAnIHNjcm9sbGluZz0nMCcgc3R5bGU9J2hlaWdodDogMjBweDttYXgtd2lkdGg6IDEwOHB4O3BhZGRpbmctbGVmdDo1cHg7Ym94LXNpemluZzogYm9yZGVyLWJveDttYXJnaW4tYm90dG9tOiAtNXB4O2Rpc3BsYXk6dW5zZXQgIWltcG9ydGFudDsnPjwvaWZyYW1lPiIpOwogICAgICAgICAgfQogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGVudCIpLnN0eWxlLmRpc3BsYXkgPT09ICdibG9jaycpIHsKICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGVudCIpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgREJDb25maWcub2xkVmVyc2lvbiA9IEFDQ29uZmlnLm9sZFZlcnNpb24gPSBHTV9pbmZvLnNjcmlwdC52ZXJzaW9uOyAvLyDlj6rpnIDopoHlhpnlh7rkuIDpg6jliIbnmoTlhbPplK7mlbDmja7ljbPlj68KICAgICAgICAgICAgICBBQ1NldFZhbHVlKCJDb25maWciLCBKU09OLnN0cmluZ2lmeShEQkNvbmZpZykpOwogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5hYy1uZXd2ZXJzaW9uRGlzcGxheSIpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NwLWFjLWNvbnRlbnQiKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIFNob3dTZXR0aW5nKCkgewogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuT1RIRVJTKSByZXR1cm47CiAgICAgICAgICAvLyDlpoLmnpzkuI3lrZjlnKjnmoTor53vvIzpgqPkuYjoh6rlt7HliJvlu7rkuIDkuKotY29weSBmcm9tIHN1cGVyUHJlbG9hZAogICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkgIT09IG51bGwgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NwLWFjLWNvbnRhaW5lciIpID09PSBudWxsKSB7CiAgICAgICAgICAgIGxldCBDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgQ29udGFpbmVyLmlkID0gInNwLWFjLWNvbnRhaW5lciI7CiAgICAgICAgICAgIENvbnRhaW5lci5pbm5lckhUTUwgPQogICAgICAgICAgICAgIGA8ZGl2IGlkPSJzcC1hYy1jb250ZW50IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L2h0bWwiPgogICAgICAgICAgICAgICAgPGRpdiBpZD0ic3AtYWMtbWFpbiI+CiAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBpZD0ic3AtYWMtYXV0b3BhZ2VyLWZpZWxkIiBzdHlsZT0iZGlzcGxheTpibG9jazsiPgogICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9ImlmcmFtZS1mYXRoZXIiPgogICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJsaW5raHJlZiIgaHJlZj0iaHR0cHM6Ly93d3cubnRhb3cuY29tL2Fib3V0c2NyaXB0Lmh0bWwiIHRhcmdldD0iX2JsYW5rIiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwucGFuZWxfdGl0bGUiPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xlZ2VuZD4KICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9InNldHRpbmctbWFpbiIgdi1zaG93PSJvdGhlci5jdXJUYWIgPT09IDEiPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwucmVkaXJlY3RfdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtcmVkaXJlY3QiIG5hbWU9InNwLWFjLWFfc2VwYXJhdG9yIiB0eXBlPSJjaGVja2JveCIgIHYtbW9kZWw9IkFDQ29uZmlnLmlzUmVkaXJlY3RFbmFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5yZWRpcmVjdF90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLWlzRW5MYW5nIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iQUNDb25maWcuaXNFbkxhbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VFbl90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJzcC1hYy1zYXZlYnV0dG9uIiBAY2xpY2s9InNhdmVDb25maWciIGNsYXNzPSJzcC1hYy1zcGFuYnV0dG9uIGVuZGJ1dHRvbiIgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwub2tCdG5fdGV4dCIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTtmbG9hdDogcmlnaHQ7bWFyZ2luLXRvcDogLTZweDsiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLm9rQnRuX3RleHQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLWFjLXJlc2V0YnV0dG9uIiBAY2xpY2s9ImNoYW5nZVJlc2V0VGV4dCIgQGRibGNsaWNrPSJyZXNldENvbmZpZyIgY2xhc3M9InNwLWFjLXNwYW5idXR0b24gZW5kYnV0dG9uIiA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5yZXNldEJ0bl90ZXh0IiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlO2Zsb2F0OiByaWdodDttYXJnaW4tdG9wOiAtNnB4OyIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwucmVzZXRCdG5fdGV4dCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmFkc190aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzcC1hYy1hZHMiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94IiB2LW1vZGVsPSJBQ0NvbmZpZy5pc0Fkc0VuYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmFkc190ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5hdXRvcGFnZV90aXRsZSIgY2xhc3M9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzcC1hYy1pc0F1dG9wYWdlIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iQUNDb25maWcuaXNBdXRvcGFnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmF1dG9wYWdlX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrZW5hYmxlX3RpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLWJsb2NrIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iQUNDb25maWcuaXNCbG9ja0VuYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrZW5hYmxlX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLWFjLWJsb2NrZGl5YnV0dG9uIiBjbGFzcz0ic3AtYWMtc3BhbmJ1dHRvbiIgQGNsaWNrPSJvdGhlci5jdXJUYWIgPSAyIiA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5ibG9ja0RpeUJ0bl90aXRsZSIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Y29sb3I6ICM4ODg4ODg7IiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5ibG9ja0RpeUJ0bl90ZXh0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5ibG9ja2VuYWJsZV90ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmxvY2tBdXRvUmVtb3ZlX3RpdGxlIiB2LW1vZGVsPSJBQ0NvbmZpZy5pc0Jsb2NrRGlzcGxheSIgaWQ9InNwLWFjLXJlbW92ZUJsb2NrIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrQXV0b1JlbW92ZV90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5ibG9ja0J0blNob3dfdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5ibG9ja0J0blNob3dfdGl0bGUiICB2LW1vZGVsPSJBQ0NvbmZpZy5pc0Jsb2NrQnRuTm90RGlzcGxheSIgaWQ9InNwLWFjLWJsb2NrQnRuRGlzcGxheSIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5ibG9ja0J0blNob3dfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV90ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLXN0eWxlIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iQUNDb25maWcuQWRzU3R5bGVFbmFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS3nmb7luqbmoLflvI8tLS0tLS0tLS0tLS0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250YWluZXItbGFiZWwgYmFpZHUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1X2xhYmxlIiBAY2xpY2s9ImxhYmVsU2hvd0hpZGVFbnYiPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJtYXJnaW4tbGVmdDoyMHB4Ij48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iYWlkdSIgdmFsdWU9IjAiIHYtbW9kZWw9IkFDQ29uZmlnLmJhaWR1LkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmFpZHVfb3JpZ2luIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICBuYW1lPSdzcC1hYy1odXlhbl9zdHlsZV9iYWlkdScgdHlwZT0nY2hlY2tib3gnIHYtbW9kZWw9IkFDQ29uZmlnLmJhaWR1Lkh1WWFuTW9kZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV9odXlhbiB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSIiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1bGl0ZSIgdHlwZT0iY2hlY2tib3giIHYtbW9kZWw9IkFDQ29uZmlnLlN0eWxlX0JhaWR1TGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV9iYWlkdUxpdGUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1IiB2YWx1ZT0iMSIgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV8xbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1IiB2YWx1ZT0iMiIgdHlwZT0icmFkaW8iIHYtbW9kZWw9IkFDQ29uZmlnLmJhaWR1LkFkc1N0eWxlTW9kZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV8xbGluZV9lbnRlciB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1IiB2YWx1ZT0iMyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9IkFDQ29uZmlnLmJhaWR1LkFkc1N0eWxlTW9kZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV8ybGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1IiB2YWx1ZT0iNCIgdHlwZT0icmFkaW8iIHYtbW9kZWw9IkFDQ29uZmlnLmJhaWR1LkFkc1N0eWxlTW9kZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV8zbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1IiB2YWx1ZT0iNSIgdHlwZT0icmFkaW8iIHYtbW9kZWw9IkFDQ29uZmlnLmJhaWR1LkFkc1N0eWxlTW9kZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV80bGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeeZvuW6puagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDFweDt3aWR0aDoyNjdweDttYXJnaW4tbGVmdDoyNXB4O2JhY2tncm91bmQtY29sb3I6I2Q4ZDhkODttYXJnaW4tdG9wOjFweDsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeiwt+atjOagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRhaW5lci1sYWJlbCBnb29nbGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2dvb2dsZV9sYWJsZSIgQGNsaWNrPSJsYWJlbFNob3dIaWRlRW52Ij48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iMCIgdHlwZT0icmFkaW8iIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5BZHNTdHlsZU1vZGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlX29yaWdpbiB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9nb29nbGVfaHV5YW4iPjxpbnB1dCBuYW1lPSJzcC1hYy1odXlhbl9zdHlsZV9nb29nbGUiIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5IdVlhbk1vZGUiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2dvb2dsZV9odXlhbiB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9nb29nbGVfZ29vZ2xlTGl0ZSIgc3R5bGU9IiI+PGlucHV0IG5hbWU9InNwLWFjLWdvb2dsZV9pbl9iYWlkdW1vZGUiIHYtbW9kZWw9IkFDQ29uZmlnLmlzR29vbGVJbkJhaWR1TW9kZUVuYWJsZSIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlX2dvb2dsZUxpdGUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2dvb2dsZSIgdmFsdWU9IjEiIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2dvb2dsZV8xbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2dvb2dsZSIgdmFsdWU9IjIiIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzFsaW5lX2VudGVyIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iMyIgdi1tb2RlbD0iQUNDb25maWcuZ29vZ2xlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzJsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iNCIgdi1tb2RlbD0iQUNDb25maWcuZ29vZ2xlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzNsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iNSIgdi1tb2RlbD0iQUNDb25maWcuZ29vZ2xlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzRsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t6LC35q2M5qC35byPLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMXB4O3dpZHRoOjI2N3B4O21hcmdpbi1sZWZ0OjI1cHg7YmFja2dyb3VuZC1jb2xvcjojZDhkOGQ4O21hcmdpbi10b3A6MXB4OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t5b+F5bqU5qC35byPLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udGFpbmVyLWxhYmVsIGJpbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JpbmdfbGFibGUiIEBjbGljaz0ibGFiZWxTaG93SGlkZUVudiI+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JpbmciIHYtbW9kZWw9IkFDQ29uZmlnLmJpbmcuQWRzU3R5bGVNb2RlIiB2YWx1ZT0iMCIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmluZ19vcmlnaW4gfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmluZ19odXlhbiI+PGlucHV0IG5hbWU9InNwLWFjLWh1eWFuX3N0eWxlX2JpbmciIHYtbW9kZWw9IkFDQ29uZmlnLmJpbmcuSHVZYW5Nb2RlIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iaW5nX2h1eWFuIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJtYXJnaW4tbGVmdDoyMHB4Ij48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iaW5nIiB2LW1vZGVsPSJBQ0NvbmZpZy5iaW5nLkFkc1N0eWxlTW9kZSIgdmFsdWU9IjEiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JpbmdfMWxpbmUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iaW5nIiB2YWx1ZT0iMiIgdi1tb2RlbD0iQUNDb25maWcuYmluZy5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JpbmdfMWxpbmVfZW50ZXIgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iaW5nIiB2YWx1ZT0iMyIgdi1tb2RlbD0iQUNDb25maWcuYmluZy5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmluZ18ybGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JpbmciIHZhbHVlPSI0IiB2LW1vZGVsPSJBQ0NvbmZpZy5iaW5nLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmluZ18zbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JpbmciIHZhbHVlPSI1IiB2LW1vZGVsPSJBQ0NvbmZpZy5iaW5nLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmluZ180bGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t5b+F5bqU5qC35byPLS0tLS0tLS0tLS0tLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDFweDt3aWR0aDoyNjdweDttYXJnaW4tbGVmdDoyNXB4O2JhY2tncm91bmQtY29sb3I6I2Q4ZDhkODttYXJnaW4tdG9wOjFweDsiPjwvZGl2Pi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgJmx0OyEmbmRhc2g7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTvmkJzni5fmoLflvI8mIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmbmRhc2g7Jmd0Oy0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250YWluZXItbGFiZWwgc29nb3UiPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImxhYmVsX2hpZGUiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9zb2dvdV9sYWJsZSIgQGNsaWNrPSJsYWJlbFNob3dIaWRlRW52Ij48L2xhYmVsPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX3NvZ291IiB2LW1vZGVsPSJBQ0NvbmZpZy5zb2dvdS5BZHNTdHlsZU1vZGUiIHZhbHVlPSIwIiB0eXBlPSJyYWRpbyI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3Vfb3JpZ2luIH19LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3VfaHV5YW4iPjxpbnB1dCBuYW1lPSJzcC1hYy1odXlhbl9zdHlsZV9zb2dvdSIgdi1tb2RlbD0iQUNDb25maWcuc29nb3UuSHVZYW5Nb2RlIiB0eXBlPSJjaGVja2JveCI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3VfaHV5YW4gfX0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9zb2dvdSIgdmFsdWU9IjEiIHYtbW9kZWw9IkFDQ29uZmlnLnNvZ291LkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX3NvZ291XzFsaW5lIH19LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9zb2dvdSIgdmFsdWU9IjIiIHYtbW9kZWw9IkFDQ29uZmlnLnNvZ291LkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX3NvZ291XzFsaW5lX2VudGVyIH19LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9zb2dvdSIgdmFsdWU9IjMiIHYtbW9kZWw9IkFDQ29uZmlnLnNvZ291LkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iIGNoZWNrZWQ9IiI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3VfMmxpbmUgfX0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX3NvZ291IiB2YWx1ZT0iNCIgdi1tb2RlbD0iQUNDb25maWcuc29nb3UuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3VfM2xpbmUgfX0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX3NvZ291IiB2YWx1ZT0iNSIgdi1tb2RlbD0iQUNDb25maWcuc29nb3UuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3VfNGxpbmUgfX0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7ISZuZGFzaDsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1O+aQnOeLl+agt+W8jyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyZuZGFzaDsmZ3Q7LS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMXB4O3dpZHRoOjI2N3B4O21hcmdpbi1sZWZ0OjI1cHg7YmFja2dyb3VuZC1jb2xvcjojZDhkOGQ4O21hcmdpbi10b3A6MXB4OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t6bit6bit5pCc5qC35byPLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udGFpbmVyLWxhYmVsIGR1Y2siPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2R1Y2tfbGFibGUiIEBjbGljaz0ibGFiZWxTaG93SGlkZUVudiI+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2R1Y2siIHYtbW9kZWw9IkFDQ29uZmlnLmR1Y2suQWRzU3R5bGVNb2RlIiB2YWx1ZT0iMCIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja19vcmlnaW4gfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja19odXlhbiI+PGlucHV0IG5hbWU9InNwLWFjLWh1eWFuX3N0eWxlX2R1Y2siIHYtbW9kZWw9IkFDQ29uZmlnLmR1Y2suSHVZYW5Nb2RlIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kdWNrX2h1eWFuIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kdWNrX25vcm1hbCIgc3R5bGU9IiI+PGlucHV0IHYtbW9kZWw9IkFDQ29uZmlnLm5vcm1hbGl6ZUR1Y2siIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2R1Y2tfbm9ybWFsIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJtYXJnaW4tbGVmdDoyMHB4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kdWNrIiB2YWx1ZT0iMSIgdi1tb2RlbD0iQUNDb25maWcuZHVjay5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2R1Y2tfMWxpbmUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kdWNrIiB2YWx1ZT0iMiIgdi1tb2RlbD0iQUNDb25maWcuZHVjay5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2R1Y2tfMWxpbmVfZW50ZXIgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kdWNrIiB2YWx1ZT0iMyIgdi1tb2RlbD0iQUNDb25maWcuZHVjay5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja18ybGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2R1Y2siIHZhbHVlPSI0IiB2LW1vZGVsPSJBQ0NvbmZpZy5kdWNrLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja18zbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2R1Y2siIHZhbHVlPSI1IiB2LW1vZGVsPSJBQ0NvbmZpZy5kdWNrLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja180bGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t6bit6bit5pCc5qC35byPLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMXB4O3dpZHRoOjI2N3B4O21hcmdpbi1sZWZ0OjI1cHg7YmFja2dyb3VuZC1jb2xvcjojZDhkOGQ4O21hcmdpbi10b3A6MXB4OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t5aSa5ZCJ5qC35byPLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udGFpbmVyLWxhYmVsIGRvZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2VfbGFibGUiIEBjbGljaz0ibGFiZWxTaG93SGlkZUVudiI+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2RvZ2UiIHYtbW9kZWw9IkFDQ29uZmlnLmRvZ2UuQWRzU3R5bGVNb2RlIiB2YWx1ZT0iMCIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV9vcmlnaW4gfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV9odXlhbiI+PGlucHV0IG5hbWU9InNwLWFjLWh1eWFuX3N0eWxlX2RvZ2UiIHYtbW9kZWw9IkFDQ29uZmlnLmRvZ2UuSHVZYW5Nb2RlIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kb2dlX2h1eWFuIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kb2dlX25vcm1hbCIgc3R5bGU9IiI+PGlucHV0IHYtbW9kZWw9IkFDQ29uZmlnLm5vcm1hbGl6ZURvZ2UiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2Vfbm9ybWFsIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJtYXJnaW4tbGVmdDoyMHB4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kb2dlIiB2YWx1ZT0iMSIgdi1tb2RlbD0iQUNDb25maWcuZG9nZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2VfMWxpbmUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kb2dlIiB2YWx1ZT0iMiIgdi1tb2RlbD0iQUNDb25maWcuZG9nZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2VfMWxpbmVfZW50ZXIgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kb2dlIiB2YWx1ZT0iMyIgdi1tb2RlbD0iQUNDb25maWcuZG9nZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV8ybGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2RvZ2UiIHZhbHVlPSI0IiB2LW1vZGVsPSJBQ0NvbmZpZy5kb2dlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV8zbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2RvZ2UiIHZhbHVlPSI1IiB2LW1vZGVsPSJBQ0NvbmZpZy5kb2dlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV80bGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeWkmuWQieagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t5oqk55y85qih5byP6K6+572uLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5odXlhbk1vZGVfdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtdXNlcmNvbG9yIiB2LW1vZGVsPSJBQ0NvbmZpZy5pc1VzZXJDb2xvckVuYWJsZSIgbmFtZT0ic3AtYWMtYV9mb3JjZSIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmh1eWFuTW9kZV90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Im1lbnUtYm94LWNvbnRhaW5lciIgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuaHV5YW5Nb2RlX3RpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHg7IiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5odXlhbkNvbG9yX3RleHQiPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJzcC1hYy1tZW51aHV5YW5Db2xvciIgQGlucHV0LnN0b3A9InVzZVRoaXNIdXlhbkNvbG9yIiB2LW1vZGVsPSJBQ0NvbmZpZy5kZWZhdWx0SHVZYW5Db2xvciIgdHlwZT0iY29sb3IiIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmh1eWFuQ29sb3JfdGl0bGUiIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7bWFyZ2luLXRvcDotMC4wNXJlbTtoZWlnaHQ6MjNweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibWVudS1ib3gtc21hbGwiIGRhdGEtdmFsdWU9IiNERUYxRUYiIEBjbGljay5zdG9wPSJ1c2VUaGlzSHV5YW5Db2xvciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I0RFRjFFRjsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJtZW51LWJveC1zbWFsbCIgZGF0YS12YWx1ZT0iI0YzRjJFRSIgQGNsaWNrLnN0b3A9InVzZVRoaXNIdXlhbkNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojRjNGMkVFOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Im1lbnUtYm94LXNtYWxsIiBkYXRhLXZhbHVlPSIjRTVFNUU1IiBAY2xpY2suc3RvcD0idXNlVGhpc0h1eWFuQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNFNUU1RTU7Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGlua2hyZWYiIGRhdGEtaHJlZj0iaHR0cHM6Ly93d3cubnRhb3cuY29tL2NvbG9ycGlja2VyLmh0bWwiIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjttYXJnaW4tcmlnaHQ6IDEwcHg7IiBvbmNsaWNrPSJ3aW5kb3cub3Blbih0aGlzLmRhdGFzZXQuaHJlZikiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmh1eWFuQ29sb3JNb3JlX3RleHQiPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS1GYXZpY29u5Zu+5qCH6K6+572uLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuZmF2aWNvbl90aXRsZSIgdi1tb2RlbD0iQUNDb25maWcuaXNGYXZpY29uRW5hYmxlIiBpZD0ic3AtYWMtZmF2aWNvbiIgbmFtZT0ic3AtYWMtYV9mb3JjZSIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmZhdmljb25fdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweDsiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmZhdmljb25fZGVmYXVsdEljb25fdGV4dCI+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLWZhdmljb25VcmwiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHYtbW9kZWw9IkFDQ29uZmlnLmRlZmF1bHRGYXZpY29uVXJsIiB2YWx1ZT0iaHR0cHM6Ly9hZTAxLmFsaWNkbi5jb20va2YvSFRCMWRSWTBYOE9EM0tWalNaRkZxNkFuOXBYYXkuanBnIiBzdHlsZT0id2lkdGg6NTUlO21hcmdpbi10b3A6LTAuM2VtOyIgdHlwZT0iaW5wdXQiPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t56e76Zmk55m+5bqm5pCc57Si6aKE5rWLLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2VhcmNoT3JpZ2luX3RpdGxlIiB2LW1vZGVsPSJBQ0NvbmZpZy5kb0Rpc2FibGVTdWciIGlkPSJzcC1hYy1zdWdfb3JpZ2luIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2VhcmNoT3JpZ2luX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLemZhOWKoDfjgIE444CBOS0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzcC1hYy1yaWdodCIgdi1tb2RlbD0iQUNDb25maWcuaXNSaWdodERpc3BsYXlFbmFibGUiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2hvd1JpZ2h0X3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtY291bnRlciIgdi1tb2RlbD0iQUNDb25maWcuaXNDb3VudGVyRW5hYmxlIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuaGludFNob3dDb3VudGVyX3RleHQiPnt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5zaG93Q291bnRlcl90ZXh0IH19PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzcC1hYy1hbGluZSIgdi1tb2RlbD0iQUNDb25maWcuaXNBTGluZUVuYWJsZSIgbmFtZT0ic3AtYWMtYV9mb3JjZSIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5zaG93QUxpbmVfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t6Ieq5a6a5LmJ5qC35byP5YaF5a65LS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLXVzZXJzdHlsZSIgdi1tb2RlbD0iQUNDb25maWcuaXNVc2VyU3R5bGVFbmFibGUiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2hvd1VzZXJTdHlsZV90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB2LWlmPSJMaXZlQ29uZmlnLmNzc19oYXNfZXJyb3IiIHN0eWxlPSJjb2xvcjogcmVkIj5lcnJvcjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9InNwLWFjLXVzZXJzdHlsZVRFWFQiIHYtbW9kZWw9IkFDQ29uZmlnLlVzZXJTdHlsZVRleHQiIEBrZXl1cD0ibG9hZEN1c3RvbVN0eWxlIiBAY2hhbmdlPSJsb2FkQ3VzdG9tU3R5bGUiIEBwYXN0ZT0ibG9hZEN1c3RvbVN0eWxlIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiBzdHlsZT0id2lkdGg6ODUlO2hlaWdodDogNjZweDttYXJnaW4tbGVmdDozMHB4OyIgdHlwZT0iaW5wdXQiID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImxpbmtocmVmIiB0YXJnZXQ9Il9ibGFuayIgOmhyZWY9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5jb250YWN0TWVfdXJsIiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5jb250YWN0TWVfdGV4dCI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t5oum5oiq5Z+f5ZCN6K6+572ucGFuZWwtLS0tLS0tLS0tLS0tLT4KICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9InNldHRpbmctc2Vjb25kIiB2LXNob3c9Im90aGVyLmN1clRhYiA9PT0gMiI+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgc3R5bGU9J21hcmdpbi1ib3R0b206IDhweCAhaW1wb3J0YW50Oyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nc3AtYWMtYmxvY2tkaXlidXR0b24tYmFjaycgQGNsaWNrPSJvdGhlci5jdXJUYWI9MSxvdGhlci5zaG93QmxvY2tMaXN0QXJlYSA9IGZhbHNlIiBjbGFzcz0nc3AtYWMtc3BhbmJ1dHRvbic+e3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNldHRpbmdfcGFuZWxfc2Vjb25kLmJhY2tCdG5fdGV4dCB9fTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNldHRpbmdfcGFuZWxfc2Vjb25kLmJsb2NrTGFiZWxfdGV4dCB9fX0KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgc3R5bGU9J21hcmdpbi1ib3R0b206IDhweCAhaW1wb3J0YW50Oyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdzcC1hYy1ibG9ja2RpeWJ1dHRvbi1kaXlsaXN0JyBjbGFzcz0nc3AtYWMtc3BhbmJ1dHRvbicgQGNsaWNrPSJvdGhlci5zaG93QmxvY2tMaXN0QXJlYSA9ICFvdGhlci5zaG93QmxvY2tMaXN0QXJlYSIgdi10ZXh0PSJjYWxfZGl5QmxvY2tMaXN0QnRuIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSdhYy1ibG9ja0xpc3QnIEBjbGljaz0icmVtb3ZlQUJsb2NrTGlzdEl0ZW0iIHN0eWxlPSdtYXgtaGVpZ2h0OjYwdmg7b3ZlcmZsb3cteTogc2Nyb2xsOyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCB2LXNob3c9IiFvdGhlci5zaG93QmxvY2tMaXN0QXJlYSIgdi1odG1sPSJnZXRCbG9ja0xpc3QiPjwvdWw+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSdhYy1ibG9ja0JveENvbicgc3R5bGU9J21heC1oZWlnaHQ6IDYwdmg7dGV4dC1hbGlnbjogY2VudGVyO21hcmdpbi1sZWZ0OiAyNnB4Oyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB2LXNob3c9Im90aGVyLnNob3dCbG9ja0xpc3RBcmVhIiAgQGtleXVwPSJzeW5jVG9CbG9ja0xpc3QiIEBjaGFuZ2U9InN5bmNUb0Jsb2NrTGlzdCIgQHBhc3RlPSJzeW5jVG9CbG9ja0xpc3QiIHJvd3M9IjIwIiB2LXRleHQ9IkFDQ29uZmlnLlVzZXJCbG9ja0xpc3Quam9pbignXFxuJykiPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2V0dGluZ19wYW5lbF9zZWNvbmQuYWRkQmxvY2tMYWJlbF90ZXh0IH19PGlucHV0IGNsYXNzPSJzcC1hYy1hZGRSdWxlT25lIiBAa2V5dXAuZW50ZXI9ImNrQWRkUnVsZSIgdi1tb2RlbD0ib3RoZXIuYWRkQmxvY2tJdGVtIiBzdHlsZT0nd2lkdGg6NTUlOyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdzcC1hYy1hZGRSdWxlYnV0dG9uJyBjbGFzcz0nc3AtYWMtc3BhbmJ1dHRvbiBlbmRidXR0b24nIEBjbGljaz0iY2tBZGRSdWxlIiBzdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6IDE3cHg7JyB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5zZXR0aW5nX3BhbmVsX3NlY29uZC5hZGRCdG5MYWJlbF90ZXh0Ij7mlrDlop48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgPHVsIHYtc2hvdz0ib3RoZXIuY3VyVGFiID09PSAzIiBzdHlsZT0id2lkdGg6IDMwMHB4Ij4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdzcC1hYy1ibG9ja2RpeWJ1dHRvbi1iYWNrJyBAY2xpY2s9Im90aGVyLmN1clRhYj0xIiBjbGFzcz0nc3AtYWMtc3BhbmJ1dHRvbic+6L+U5ZuePC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+5L2/55So6K+05piO77yaPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pi08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjEuIOacrOiEmuacrOS4jeWMheWQq+S7u+S9leW5v+WRiuWGheWuue+8jOS5n+aXoOaEj+S6juegtOWdj+e9keermeeOsOacieWKn+iDveeahOWujOaVtOaAp++8jOS7heW4jOacm+mAmui/h+S4gOS6m+aYvuekuuaViOaenOeahOWPmOabtOiDveabtOWlveeahOeVmeWtmOWvueW6lOe9keermeeOsOacieeahOeUqOaIt++8jOS4gOWumueoi+W6puS4iuabtOWlveWcsOS/neivgeS6huebruagh+e9keermeeahOaXpea0u+OAgjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiDlkIzml7bmnKzohJrmnKzkuK3miYDmnInlip/og73lnYfkuLrlrabkuaDlkoznoJTnqbZ3ZWLliY3nq6/mioDmnK/nmoTlj5HlsZXogIzlvIDlj5HvvIzluIzmnJvkuLrlrabkuaDliY3nq6/mioDmnK/nmoTnoJTnqbbkurrlkZjmj5DkvpvkuIDkuKrmm7Tlpb3nmoTlj4LogIPku6PnoIHvvIzkv4Pov5t3ZWLliY3nq6/mioDmnK/nmoTlj5HlsZXvvIzkvr/kuo7mioDmnK/nmoTlrabkuaDlkozkuqTmtYHvvIzmnKzohJrmnKzkuI3mtonlj4rlr7nnvZHnq5nmupDnoIHnmoTosIPor5Xlkozkv67mlLnvvIzlm6Dkvb/nlKjmnKzohJrmnKzov5vooYzpnZ7ms5XnlKjpgJTkuI7mnKzohJrmnKzml6DlhbPjgIIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS3kv53lrZjjgIHlj5bmtojmjInpkq4tLS0tLS0tLS0tLS0tLT4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic3AtYWMtY2FuY2VsYnV0dG9uIiBjbGFzcz0ic3AtYWMtc3BhbmJ1dHRvbiBlbmRidXR0b24iIEBjbGljaz0iY2xvc2VQYW5lbCIgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuY2FuY2VsQnRuX3RleHQiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7ZmxvYXQ6IGxlZnQ7IiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5jYW5jZWxCdG5fdGV4dCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJzcC1hYy1zYXZlYnV0dG9uIiByZWY9ImJvdHRvbVNhdmVCdXR0b24iIEBjbGljaz0ic2F2ZUNvbmZpZyIgY2xhc3M9InNwLWFjLXNwYW5idXR0b24gZW5kYnV0dG9uIiA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5va0J0bl90ZXh0IiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlO2Zsb2F0OiByaWdodDsiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLm9rQnRuX3RleHQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDb250YWluZXIpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBhbGxOb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5BQy1mYXZpY29uVCwgLkFDLUNvdW50ZXJUIik7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhbGxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoJ2FjQ2xpY2snKSA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGFsbE5vZGVzW2ldLnNldEF0dHJpYnV0ZSgnYWNDbGljaycsICcxJyk7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGFsbE5vZGVzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIEFDdG9nZ2xlU2V0dGluZ0Rpc3BsYXkoZSk7CiAgICAgICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJvZHkgI3NwLWFjLWNvbnRhaW5lciIpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyDpmLvmraLngrnlh7voh6rouqvnmoTml7blgJnlhbPpl60KICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJib2R5IikuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIHNhZmVGdW5jdGlvbiggKCkgPT4gewogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NwLWFjLWNvbnRlbnQiKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpc0VsZW1lbnRWaXNpYmxlKGRvbSkgewogICAgICAgICAgY29uc3Qgc2NyVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKICAgICAgICAgIHJldHVybiAhKHNjclRvcCA+IChkb20ub2Zmc2V0VG9wICsgZG9tLm9mZnNldEhlaWdodCkgfHwgKHNjclRvcCArIHdpbmRvdy5pbm5lckhlaWdodCkgPCBkb20ub2Zmc2V0VG9wKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZU1vYmlsZUJhaWR1RGlyZWN0TGluaygpIHsKICAgICAgICAgIGxldCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNwYWdlICNwYWdlLWJkICNyZXN1bHRzIC5yZXN1bHQ6bm90KFthY19yZWRpcmVjdFN0YXR1c10pIik7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBjdXJOb2RlID0gbm9kZXNbaV07CiAgICAgICAgICAgIHNhZmVGdW5jdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgbGV0IGN1ckRhdGEgPSBKU09OLnBhcnNlKGN1ck5vZGUuZGF0YXNldC5sb2cucmVwbGFjZSgvJy9nbSwgIlwiIikpOwogICAgICAgICAgICAgIGxldCB0cnVlTGluayA9IGN1ckRhdGEubXU7CiAgICAgICAgICAgICAgY3VyTm9kZS5xdWVyeVNlbGVjdG9yKCJhcnRpY2xlIikuc2V0QXR0cmlidXRlKCJybC1saW5rLWhyZWYiLCB0cnVlTGluayk7CiAgICAgICAgICAgICAgY3VyTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCJhIikuZm9yRWFjaChmdW5jdGlvbiAocGVyKSB7CiAgICAgICAgICAgICAgICBwZXIuc2V0QXR0cmlidXRlKCJocmVmIiwgdHJ1ZUxpbmspOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY3VyTm9kZS5zZXRBdHRyaWJ1dGUoImFjX3JlZGlyZWN0U3RhdHVzIiwgIjEiKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZU9uTW91c2VEb3duRnVuYygpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCByZXN1bHROb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5nIC5yYyBhLCAjcnMsICNyc28gLmcgYSIpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IG9uZSA9IHJlc3VsdE5vZGVzW2ldOwogICAgICAgICAgICAgIG9uZS5zZXRBdHRyaWJ1dGUoIm9ubW91c2Vkb3duIiwgIiIpOyAvLyDosLfmrYzljrvph43lrprlkJHlubLmibAKICAgICAgICAgICAgICBvbmUuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCAiX2JsYW5rIik7IC8vIOiwt+atjOmTvuaOpeaWsOagh+etvuaJk+W8gAogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlUmVkaXJlY3RMaW5rVGFyZ2V0KCkgewogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuWkhJSFUpIHsKICAgICAgICAgICAgbGV0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLlJpY2hUZXh0IGFbaHJlZio9Jy8vbGluay56aGlodS5jb20vP3RhcmdldCddIik7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KG5vZGVzW2ldLmhyZWYucmVwbGFjZSgvaHR0cHM/OlwvXC9saW5rXC56aGlodVwuY29tXC9cP3RhcmdldD0vLCAiIikpOwogICAgICAgICAgICAgIG5vZGVzW2ldLmhyZWYgPSB1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVV9YVUVTSFUpIHsKICAgICAgICAgICAgbGV0IHhub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImFbaHJlZio9J3NjX3Z1cmw9aHR0cCddIik7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBpIDwgeG5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgbGV0IHh1cmwgPSBnZXRVcmxBdHRyaWJ1dGUoeG5vZGVzW2pdLmhyZWYsICJzY192dXJsIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgeG5vZGVzW2pdLmhyZWYgPSB4dXJsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDmj5Dlj5Z1cmzlhYPntKDnmoTlj4LmlbDlgLwKICAgICAgICBmdW5jdGlvbiBnZXRVcmxBdHRyaWJ1dGUodXJsLCBhdHRyaWJ1dGUsIG5lZWREZWNvZGUpIHsKICAgICAgICAgIGxldCBzZWFyY2hWYWx1ZVMgPSAodXJsLnN1YnN0cigxKSArICIiKS5zcGxpdCgiJiIpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hWYWx1ZVMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGtleV92YWx1ZSA9IHNlYXJjaFZhbHVlU1tpXS5zcGxpdCgiPSIpOwogICAgICAgICAgICBsZXQgcmVnID0gbmV3IFJlZ0V4cCgiXiIgKyBhdHRyaWJ1dGUgKyAiJCIpOwogICAgICAgICAgICBpZiAocmVnLnRlc3Qoa2V5X3ZhbHVlWzBdKSkgewogICAgICAgICAgICAgIGxldCBzZWFyY2hXb3JkcyA9IGtleV92YWx1ZVsxXTsKICAgICAgICAgICAgICByZXR1cm4gbmVlZERlY29kZSA/IGRlY29kZVVSSUNvbXBvbmVudChzZWFyY2hXb3JkcykgOiBzZWFyY2hXb3JkczsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzZXRVUkxOb3JtYWwobGlzdCkgewogICAgICAgICAgLy8g5rOo5oSP5pyJ6YeN5aSN55qE5Zyw5Z2A77yM5bC96YeP5a+56YeN5aSN5Zyw5Z2A6L+b6KGM5Y676YeNCiAgICAgICAgICB2YXIgaGFzRGVhbEhyZWZTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8g5q2k5pa55rOV5piv5byC5q2l77yM5pWF5Zyo57uT5p2f55qE5pe25YCZ5L2/55SoaeS8muWHuumXrumimC3kuKXph40hCiAgICAgICAgICAgIC8vIOmHh+eUqOmXreWMheeahOaWueazleadpei/m+ihjOaVsOaNrueahOS8oOmAkgogICAgICAgICAgICBsZXQgY3VyTm9kZSA9IGxpc3RbaV07CiAgICAgICAgICAgIGxldCBjdXJocmVmID0gY3VyTm9kZS5ocmVmOwogICAgICAgICAgICBpZiAobGlzdFtpXSAhPT0gbnVsbCAmJiBsaXN0W2ldLmdldEF0dHJpYnV0ZSgiYWNfcmVkaXJlY3RTdGF0dXMiKSA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGxpc3RbaV0uc2V0QXR0cmlidXRlKCJhY19yZWRpcmVjdFN0YXR1cyIsICIwIik7CiAgICAgICAgICAgICAgbGV0IGxlbjEgPSBoYXNEZWFsSHJlZlNldC5zaXplOwogICAgICAgICAgICAgIGhhc0RlYWxIcmVmU2V0LmFkZChjdXJocmVmKTsKICAgICAgICAgICAgICBsZXQgbGVuMiA9IGhhc0RlYWxIcmVmU2V0LnNpemU7CiAgICAgICAgICAgICAgaWYgKGxlbjEgPT09IGxlbjIpIGNvbnRpbnVlOyAvLyDor7TmmI7mlbDmja7lt7Lnu4/lpITnkIbov4fvvIzlrZjlnKjnm7jlkIznmoTorrDlvZUKICAgICAgICAgICAgICBpZiAoY3VyaHJlZi5pbmNsdWRlcygid3d3LmJhaWR1LmNvbS9saW5rIikgfHwKICAgICAgICAgICAgICAgIGN1cmhyZWYuaW5jbHVkZXMoIm0uYmFpZHUuY29tL2Zyb20iKSB8fAogICAgICAgICAgICAgICAgY3VyaHJlZi5pbmNsdWRlcygid3d3LnNvZ291LmNvbS9saW5rIikgfHwKICAgICAgICAgICAgICAgIGN1cmhyZWYuaW5jbHVkZXMoInNvLmNvbS9saW5rIikpIHsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoY19jdXJub2RlLCBjX2N1cmhyZWYpIHsKICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGNfY3VyaHJlZi5yZXBsYWNlKC9eaHR0cDovLCAiaHR0cHM6Iik7CiAgICAgICAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJBSURVICYmICF1cmwuaW5jbHVkZXMoImVxaWQiKSkgewogICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOaYr+eZvuW6pu+8jOW5tuS4lOayoeacieW4puacieino+aekOWPguaVsO+8jOmCo+S5iOaJi+WKqOW4puS4igogICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICImd2Q9JmVxaWQ9IjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBsZXQgZ21SZXF1ZXN0Tm9kZSA9IEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAvLyBmcm9tOiAiYWN4aHIiLAogICAgICAgICAgICAgICAgICAgIGV4dERhdGE6IGNfY3VyaHJlZiwgLy8g55So5LqO5omp5bGVCiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyJBY2NlcHQiOiAiKi8qIiwgIlJlZmVyZXIiOiBjX2N1cmhyZWYucmVwbGFjZSgvXmh0dHA6LywgImh0dHBzOiIpfSwKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDgwMDAsCiAgICAgICAgICAgICAgICAgICAgb25yZWFkeXN0YXRlY2hhbmdlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsgLy8gTUFSSyDmnInml7blgJnov5nkuKrlh73mlbDmoLnmnKzkuI3ov5vmnaUgLSDosIPor5XnmoTpl67popggLSB0aW1lb3V0CiAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5yZXNwb25zZVRleHQgfHwgcmVzcG9uc2UucmVzcG9uc2VIZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOeUseS6juaYr+eJueauiui/lOWbni3lubbkuJTlpb3mkJwt5pCc54uXLeeZvuW6pumDveaYr+i/meS4quagvOW8j++8jOaVheaPkOWHugogICAgICAgICAgICAgICAgICAgICAgICBEZWFsUmVkaXJlY3QoZ21SZXF1ZXN0Tm9kZSwgY19jdXJocmVmLCByZXNwb25zZS5yZXNwb25zZVRleHQsICJVUkw9JyhbXiddKyknIikKICAgICAgICAgICAgICAgICAgICAgICAgLy8g6L+Z5Liq5piv5Zyo5LiK6Z2i5peg5rOV5aSE55CG55qE5oOF5Ya15LiL77yM5aSH55So55qEIHRtLWZpbmFsdXJsZGhkZyAgdG0tZmluYWx1cmxtZmRoCgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzcG9uc2VIZWFkZXJzLmluY2x1ZGVzKCJ0bS1maW5hbHVybCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbFVSTCA9IFJlZ19HZXQocmVzcG9uc2UucmVzcG9uc2VIZWFkZXJzLCAidG0tZmluYWx1cmxcXHcrOiAoW15cXHNdKykiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsVVJMID09PSBudWxsIHx8IHJlbFVSTCA9PT0gIiIgfHwgcmVsVVJMLmluY2x1ZGVzKCJ3d3cuYmFpZHUuY29tL3NlYXJjaC9lcnJvciIpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhbFJlZGlyZWN0KGdtUmVxdWVzdE5vZGUsIGNfY3VyaHJlZiwgcmVsVVJMKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KShjdXJOb2RlLCBjdXJocmVmKTsgLy/kvKDpgJLml6fnmoTnvZHlnYDov4fljrvvvIzor7vkvZxjX2N1cmhyZWYKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gY3VyTm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCAoKT0+IHsKICAgICAgICAgICAgICAvLyAgIGNvbnN0IEFCS2V5ID0gUmVkaXJlY3RNYXAuZ2V0KGN1ck5vZGUuaHJlZik7IC8vIOWOn+WniyAtPiDkuYvlkI7nmoTpk77mjqUKICAgICAgICAgICAgICAvLyAgIGlmKEFCS2V5KSBjdXJOb2RlLmhyZWYgPSBBQktleTsKICAgICAgICAgICAgICAvLyB9KQogICAgICAgICAgICAgIC8vIGN1ck5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCAoKT0+IHsKICAgICAgICAgICAgICAvLyAgIGNvbnN0IEJBS2V5ID0gUmVkaXJlY3RNYXAuZ2V0KGN1ck5vZGUuaHJlZik7IC8vIOS5i+WQjueahOi/nuaOpSAtPiDljp/lp4sKICAgICAgICAgICAgICAvLyAgIGlmKEJBS2V5KSBjdXJOb2RlLmhyZWYgPSBCQUtleTsKICAgICAgICAgICAgICAvLyB9KQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaGFzRGVhbEhyZWZTZXQuc2l6ZSA+IDAgJiYgbGlzdC5sZW5ndGggLSBoYXNEZWFsSHJlZlNldC5zaXplID4gMCkgY29uc29sZS5sb2coIuS4ouW8g+aOiSIsIGxpc3QubGVuZ3RoIC0gaGFzRGVhbEhyZWZTZXQuc2l6ZSwgIuS4qumHjeWkjemTvuaOpSIpOwogICAgICAgIH0KCiAgICAgICAgdmFyIERlYWxSZWRpcmVjdCA9IGZ1bmN0aW9uIChyZXF1ZXN0LCBjdXJOb2RlSHJlZiwgcmVzcFRleHQsIFJlZ1RleHQpIHsKICAgICAgICAgIGlmIChyZXNwVGV4dCA9PT0gbnVsbCB8fCB0eXBlb2YgKHJlc3BUZXh0KSA9PT0gInVuZGVmaW5lZCIpIHJldHVybjsKICAgICAgICAgIGxldCByZXN1bHRSZXNwb25zZVVybCA9ICIiOwogICAgICAgICAgaWYgKFJlZ1RleHQgIT0gbnVsbCkgewogICAgICAgICAgICByZXN1bHRSZXNwb25zZVVybCA9IFJlZ19HZXQocmVzcFRleHQsIFJlZ1RleHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0UmVzcG9uc2VVcmwgPSByZXNwVGV4dDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHRSZXNwb25zZVVybCAhPT0gbnVsbCAmJiByZXN1bHRSZXNwb25zZVVybCAhPT0gIiIgJiYgIXJlc3VsdFJlc3BvbnNlVXJsLmluY2x1ZGVzKCJ3d3cuYmFpZHUuY29tL2xpbmsiKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLlNPR09VKSBjdXJOb2RlSHJlZiA9IGN1ck5vZGVIcmVmLnJlcGxhY2UoL15odHRwczpcL1wvd3d3LnNvZ291LmNvbS8sICIiKTsKICAgICAgICAgICAgICBsZXQgaG9zdCA9IGdldFRleHRIb3N0KHJlc3VsdFJlc3BvbnNlVXJsKTsKICAgICAgICAgICAgICAvLyBSZWRpcmVjdE1hcC5zZXQoY3VyTm9kZUhyZWYsIHJlc3VsdFJlc3BvbnNlVXJsKTsgLy8g6L+b6KGM5LiA5Liq5pWw5o2u5YWz6IGUCiAgICAgICAgICAgICAgLy8gUmVkaXJlY3RNYXAuc2V0KHJlc3VsdFJlc3BvbnNlVXJsLCBjdXJOb2RlSHJlZik7IC8vIOi/m+ihjOS4gOS4quaVsOaNruWFs+iBlAogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIipbaHJlZio9JyIgKyBjdXJOb2RlSHJlZiArICInXSIpLmZvckVhY2goIHBlciA9PiB7CiAgICAgICAgICAgICAgICBsZXQgY2hhbmdlTm9kZSA9IHBlcjsKCiAgICAgICAgICAgICAgICBjaGFuZ2VOb2RlLnNldEF0dHJpYnV0ZSgiYWNfcmVkaXJlY3RTdGF0dXMiLCAiMiIpOwogICAgICAgICAgICAgICAgY2hhbmdlTm9kZS5ocmVmID0gcmVzdWx0UmVzcG9uc2VVcmw7CiAgICAgICAgICAgICAgICAvLyBjaGFuZ2VOb2RlLnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlocmVmIiwgY2hhbmdlTm9kZS5ocmVmKTsKICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VOb2RlLmhhc0F0dHJpYnV0ZSgibWV0YSIpKSB7CiAgICAgICAgICAgICAgICAgIGNoYW5nZU5vZGUuc2V0QXR0cmlidXRlKCJtZXRhIiwgaG9zdCk7CiAgICAgICAgICAgICAgICAgIGNoYW5nZU5vZGUuZGF0YXNldC5ob3N0ID0gaG9zdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VOb2RlLnRleHQgJiYgY2hhbmdlTm9kZS50ZXh0Lmxlbmd0aCA8IDEwICYmICFjaGFuZ2VOb2RlLnRleHQuaW5jbHVkZXMoaG9zdCkKICAgICAgICAgICAgICAgICAgLy8g5LiN6IO95pivcmVkaXJlY3QgdXJsIOS4jeiDveaYr2gyXGgz5LiL55u05bGe6ZO+5o6lCiAgICAgICAgICAgICAgICAgICYmICFjaGFuZ2VOb2RlLnBhcmVudEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJoIikpIHsKICAgICAgICAgICAgICAgICAgY2hhbmdlTm9kZS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZUVuZCIsICImbmJzcDstJm5ic3A7IiArIGhvc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgIG90aGVyRGF0YS5vdGhlci5jdXJIb3N0cy5hY3B1c2goaG9zdCArICIjIyMiICsgcmVzdWx0UmVzcG9uc2VVcmwpOwogICAgICAgICAgICAgIHJlcXVlc3QuYWJvcnQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlQURfYmFpZHVfc29nb3UoKSB7IC8vIOenu+mZpOe9keermeiHquacieW5v+WRigogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUpIHsKCiAgICAgICAgICAgIC8vIOenu+mZpHNoYWRvd0RPTeW5v+WRiu+8m+aQnOe0ouWFs+mUruWtl++8mua3mOWune+8m+eEtuWQjueCueWHu+aQnOe0ouahhu+8jOW5v+WRiuS8muWkmuasoemHjeeOsHNoYWRvd2RvbQogICAgICAgICAgICBzYWZlRnVuY3Rpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICQoJy5jLWNvbnRhaW5lciA+Pj4gLmMtY29udGFpbmVyJykuaGFzKCcuZjEzPnNwYW46c3RhcnRzLXdpdGgoIuW5v+WRiiIpJykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g56e76Zmk5Y+z5L6n5qCP5bm/5ZGKCiAgICAgICAgICAgIHNhZmVSZW1vdmVfeHBhdGgoImlkKCdjb250ZW50X3JpZ2h0JykvZGl2Wy4vL2Fbc3RhcnRzLXdpdGgodGV4dCgpLCAn5bm/5ZGKJyldXSIpOwogICAgICAgICAgICAvLyDnp7vpmaTmoIflh4blub/lkYoKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2NvbnRlbnRfbGVmdCcpL2RpdlsuLy9zcGFuW2NvbnRhaW5zKHRleHQoKSwgJ+W5v+WRiicpXV0iKTsKICAgICAgICAgICAgLy8g56e76Zmk5qCH5YeG5bm/5ZGKIC0g5pawCiAgICAgICAgICAgIHNhZmVSZW1vdmVfeHBhdGgoImlkKCdjb250ZW50X2xlZnQnKS9kaXZbLi8vYVt0ZXh0KCk9J+W5v+WRiiddXSIpOwogICAgICAgICAgICAvLyDnp7vpmaTlj7PkvqfmoI/pobbpg6gt5bqV6YOo5peg55So5bm/5ZGKCiAgICAgICAgICAgIHNhZmVSZW1vdmVfeHBhdGgoImlkKCdjb250ZW50X3JpZ2h0JykvYnIiKTsKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2NvbnRlbnRfcmlnaHQnKS9kaXZbbm90KEBpZCldIik7CiAgICAgICAgICAgIC8vIOenu+mZpOmhtumDqOWPr+iDveWHuueOsOeahCAi5Li65oKo5o6o6I2QIgogICAgICAgICAgICBzYWZlUmVtb3ZlX3hwYXRoKCJpZCgnY29udGVudF9sZWZ0JykvL2Rpdltjb250YWlucyhAY2xhc3MsICdfcnMnKV0iKTsKCiAgICAgICAgICB9IGVsc2UgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuTUJBSURVKSB7CiAgICAgICAgICAgIC8qKioq56e76Zmk5omL5py65qih5byP5LiK55qE6YOo5YiG5bm/5ZGKKioqKi8KICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ3BhZ2UtYmQnKS9kaXZbbm90KGNvbnRhaW5zKEBjbGFzcywgJ3Jlc3VsdCcpKV0iKTsKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ3BhZ2UtYmQnKS9kaXZbbm90KEBjbGFzcyldIik7CiAgICAgICAgICAgIHNhZmVSZW1vdmVfeHBhdGgoIi8vZGl2W0BjbGFzcz0nbmEtbGlrZS1jb250YWluZXInXSIpOwogICAgICAgICAgICAvLyBzYWZlRnVuY3Rpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyAgICQoJyNwYWdlLWJkICNyZXN1bHRzPmRpdjpub3QoW2NsYXNzKj0icmVzdWx0Il0pJykucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIH0pOwogICAgICAgICAgICAvLyBzYWZlRnVuY3Rpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyAgICQoJyNwYWdlLWJkICNyZXN1bHRzPmRpdjpub3QoW2NsYXNzXSknKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8gfSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuU08pIHsKICAgICAgICAgICAgc2FmZVJlbW92ZSgiI3NvX2t3LWFkIik7CiAgICAgICAgICAgIHNhZmVSZW1vdmUoIiNtLXNwcmVhZC1sZWZ0Iik7CiAgICAgICAgICAgIC8vIOenu+mZpOaQnOe0ouS4reW6lemDqOW5v+WRigogICAgICAgICAgICBzYWZlUmVtb3ZlKCIjbS1zcHJlYWQtYm90dG9tIik7CiAgICAgICAgICAgIC8vIOenu+mZpOWPs+S+p+agj+mhtumDqOW5v+WRigogICAgICAgICAgICBzYWZlUmVtb3ZlX3hwYXRoKCJpZCgncmlnaHR0b3BfYm94JykvL2xpWy4vL3NwYW5bY29udGFpbnModGV4dCgpLCAn5bm/5ZGKJyldXSIpOwogICAgICAgICAgfSBlbHNlIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJJTkcpIHsKICAgICAgICAgICAgc2FmZVJlbW92ZSgiLmJfYWQiKTsKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2JfcmVzdWx0cycpL2xpWy4vZGl2W0BjbGFzcz0nYWRfZmxzJ11dIiwgdHJ1ZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSB7CiAgICAgICAgICAgIHNhZmVSZW1vdmUoIiNib3R0b21hZHMiKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZENvdW50ZXIoY2l0ZUxpc3QpIHsKICAgICAgICAgIGxldCBjc3NUZXh0ID0gInBvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MTttYXJnaW4tcmlnaHQ6NHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2NvbG9yOndoaXRlO2ZvbnQtZmFtaWx5Oiflvq7ova/pm4Xpu5EnO2ZvbnQtc2l6ZToxNnB4O3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOjIycHg7bGluZS1oZWlnaHQ6MjJweDtib3JkZXItcmFkaXVzOjUwJTsiOwogICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaXRlTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgY3VyID0gY2l0ZUxpc3RbaV0KICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjdXIuZ2V0QXR0cmlidXRlKCdTb3J0SW5kZXgnKTsKICAgICAgICAgICAgaWYgKGluZGV4ID09PSBudWxsIHx8IHR5cGVvZiAoaW5kZXgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgIGN1ci5zZXRBdHRyaWJ1dGUoJ1NvcnRJbmRleCcsIENPTlNULnNvcnRJbmRleCk7CiAgICAgICAgICAgICAgY3VyLmlubmVyID0gY3VyLmlubmVySFRNTDsKICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gIjxlbSBjbGFzcz0nQUMtQ291bnRlclQnIHN0eWxlPSIgKyBjc3NUZXh0ICsgIj4iICsgQ09OU1Quc29ydEluZGV4ICsgIjwvZW0+IjsKICAgICAgICAgICAgICBjdXIuaW5uZXJIVE1MID0gZGl2LmlubmVySFRNTCArIGN1ci5pbm5lcjsKICAgICAgICAgICAgICBDT05TVC5zb3J0SW5kZXgrKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCBjdXJDb3VudGVyID0gY3VyLnF1ZXJ5U2VsZWN0b3IoIi5BQy1Db3VudGVyVCIpCiAgICAgICAgICAgICAgY29uc3Qgb3JpSW5kZXggPSBjdXJDb3VudGVyLmlubmVyVGV4dAogICAgICAgICAgICAgIGNvbnN0IGNoZWNrVmFsdWUgPSAoaSArIDEpICUgMTAwOwogICAgICAgICAgICAgIC8vIOaVsOaNruWAvOS4jeWQjAogICAgICAgICAgICAgIC8vIOaVsOaNruayoeacieiiq+e/u+ivkQogICAgICAgICAgICAgIGlmICgraW5kZXggIT09IGNoZWNrVmFsdWUgJiYgIS9eXGQrJC8udGVzdChvcmlJbmRleCkpIHsgLy8g5oyJ6ZyA5pu05pawCiAgICAgICAgICAgICAgICBjdXJDb3VudGVyLmlubmVyVGV4dCA9Y2hlY2tWYWx1ZTsKICAgICAgICAgICAgICAgIGN1ci5zZXRBdHRyaWJ1dGUoJ1NvcnRJbmRleCcsIGNoZWNrVmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIEhvc3RSZWcgPSBuZXcgUmVnRXhwKC8oaHR0cHM/OlwvXC8pPyhbXi9cc10rKS9pKTsKCiAgICAgICAgZnVuY3Rpb24gZ2V0VGV4dEhvc3Qoc2JlZm9yZSkgewogICAgICAgICAgc2JlZm9yZSA9IChzYmVmb3JlICYmIHNiZWZvcmUudHJpbSgpKS5yZXBsYWNlKC9ccy1cc1xkezR9LVxkezEsMn0tXGR7MSwyfS8sICIiKSB8fCAiIjsKICAgICAgICAgIGxldCBzZW5kOwogICAgICAgICAgbGV0IHJlc3VsdCA9IHNiZWZvcmUuc3BsaXQoJy0nKTsKICAgICAgICAgIC8vIC0t5pCc54uX55m+5bqm5LiT55So77yb5aaC5p6c56ys5LiA5Liq5piv5Lit5paH55qE6K+d77yM5Zyw5Z2A5bCx5piv56ys5LqM5LiqCiAgICAgICAgICBpZiAoKHJlc3VsdC5sZW5ndGggPiAxICYmIG5ldyBSZWdFeHAoIltcXHU0RTAwLVxcdTlGRkZdKyIsICJnIikudGVzdChzYmVmb3JlKSkgJiYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUgfHwgY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5TT0dPVSkpIHsKICAgICAgICAgICAgc2JlZm9yZSA9IHJlc3VsdFsxXTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIOatpOaXtnNiZWZvcmXlh6DkuY7mmK/nrYnkuo7nvZHlnYDkuobvvIzkvYbmmK/mnInml7blgJnkvJrmnInlpJrnmoTnqbrmoLzvvIzlpJrnmoTlhoXlrrnvvIzlpJrnmoTliY3nvIBodHRw77yM5aSa5L2Z55qE6Lev5b6ECiAgICAgICAgICBsZXQgcmVzID0gSG9zdFJlZy5leGVjKHNiZWZvcmUpOwogICAgICAgICAgc2VuZCA9IChyZXMgJiYgcmVzWzJdLnRyaW0oKSkgfHwgIiI7CiAgICAgICAgICAvLyBzZW5kID0gc2JlZm9yZS5yZXBsYWNlKC8oXC9bXi9dKnxccyopLywgIiIpLnJlcGxhY2UoLzxbXj5dKj4vZywgIiIpLnJlcGxhY2UoL2h0dHBzPzpcL1wvL2csICIiKS5yZXBsYWNlKC88XC8/c3Ryb25nPi9nLCAiIikucmVwbGFjZSgvPFwvP2I+L2csICIiKS5yZXBsYWNlKC88Pz4/L2csICIiKS5yZXBsYWNlKC8oIHxcLykuKi9nLCAiIikucmVwbGFjZSgvXC5cLi4qLywgIiIpOwogICAgICAgICAgaWYgKHNlbmQgPT09ICIiKSByZXR1cm4gbnVsbDsKICAgICAgICAgIGlmIChzZW5kLmluZGV4T2YoIi4iKSA8IDApIHJldHVybiBudWxsOwogICAgICAgICAgaWYgKHNlbmQuaW5kZXhPZigi4oa1IikgPj0gMCkgcmV0dXJuIG51bGw7CiAgICAgICAgICByZXR1cm4gc2VuZC50cmltKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhZGRGYXZpY29uKGNpdGVMaXN0KSB7CiAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5ET0dFKSB7CiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gY2l0ZUxpc3RbaW5kZXhdLmdldEF0dHJpYnV0ZSgiYWNfZmF2aWNvblN0YXR1cyIpKSB7CiAgICAgICAgICAgICAgICBsZXQgY3VyTm9kZSA9IGNpdGVMaXN0W2luZGV4XTsKICAgICAgICAgICAgICAgIGxldCB0YXJnZXROb2RlID0gY3VyTm9kZTsKICAgICAgICAgICAgICAgIGxldCB7IGN1ckhvc3QsIGN1clVybCB9ID0gZ2V0Tm9kZUhvc3QodGFyZ2V0Tm9kZSk7CiAgICAgICAgICAgICAgICBpZiAoY3VySG9zdCA9PT0gbnVsbCB8fCAoY3VyVXJsICYmIGN1clVybC5pbmNsdWRlcygid3d3LmJhaWR1LmNvbS9saW5rIikpKSB7IC8vIOi3s+i/h2JhaWR1LmNsaWNrCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgb3RoZXJEYXRhLm90aGVyLmN1ckhvc3RzLmFjcHVzaChjdXJIb3N0ICsgIiMjIyIgKyBjdXJVcmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGZhdmljb25VcmwgPSBjdXJIb3N0OwogICAgICAgICAgICAgICAgbGV0IElJID0gMDsKICAgICAgICAgICAgICAgIGZvciAoOyBJSSA8PSA1OyBJSSsrKSB7CiAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXROb2RlICE9IG51bGwgJiYgdGFyZ2V0Tm9kZS5xdWVyeVNlbGVjdG9yKGN1clNpdGUuRmF2aWNvbkFkZFRvKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHRhcmdldE5vZGUucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoJ3RwbCcpICYmIHRhcmdldE5vZGUucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJ3RwbCcpLmluY2x1ZGVzKCdzdG9jaycpKSB7CiAgICAgICAgICAgICAgICAgIGN1ck5vZGUuc2V0QXR0cmlidXRlKCJhY19mYXZpY29uU3RhdHVzIiwgIi0zIik7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGluZGV4KyIuIitmYXZpY29uVXJsKyItLSIrSUkpOwogICAgICAgICAgICAgICAgaWYgKElJIDw9IDUpIHsKICAgICAgICAgICAgICAgICAgLy8g5YWI55So54i26IqC54K55Yik5pat5LiA5LiL5piv5ZCm5a2Y5ZyoaW1nCiAgICAgICAgICAgICAgICAgIGxldCB0bXBIVE1MID0gdGFyZ2V0Tm9kZS5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICAgIGxldCBwb3MgPSB0bXBIVE1MLmluZGV4T2YoImZhdi11cmwiKQogICAgICAgICAgICAgICAgICAgICYgdG1wSFRNTC5pbmRleE9mKCJ3cl9mYXYiKQogICAgICAgICAgICAgICAgICAgICYgdG1wSFRNTC5pbmRleE9mKCJmYXZ1cmwiKQogICAgICAgICAgICAgICAgICAgICYgdG1wSFRNTC5pbmRleE9mKCJ0aXQtaWNvIikKICAgICAgICAgICAgICAgICAgICAmIHRtcEhUTUwuaW5kZXhPZigiaW1nX2ZhdiBybXNfaW1nIikKICAgICAgICAgICAgICAgICAgICAmIHRtcEhUTUwuaW5kZXhPZigiYy10b29sLSIpCiAgICAgICAgICAgICAgICAgICAgJiB0bXBIVE1MLmluZGV4T2YoInNwYW4gY2xhc3M9XCJjLWljb24gYy1pY29uLSIpCiAgICAgICAgICAgICAgICAgICAgJiB0bXBIVE1MLmluZGV4T2YoImltZyBjbGFzcz1cInhBMzNHYyIpOwogICAgICAgICAgICAgICAgICAvL+S7luiHquW3seW3sue7j+WBmuS6hmZhdmljb27kuoYKICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuW3suacieWbvueJh++8miIpOwogICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuc2V0QXR0cmlidXRlKCJhY19mYXZpY29uU3RhdHVzIiwgIi0yIik7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUucXVlcnlTZWxlY3RvcihjdXJTaXRlLkZhdmljb25BZGRUbyk7CiAgICAgICAgICAgICAgICAgIC8vIOeJueauiuWkhOeQhkJJTkcKICAgICAgICAgICAgICAgICAgLy8gaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQklORykgY3VyTm9kZSA9IGN1ck5vZGUucXVlcnlTZWxlY3RvcigiaDIiKTsKICAgICAgICAgICAgICAgICAgLy9odHRwczovL2FwaS5ieWkucHcvZmF2aWNvbi8/dXJsPT8/Pz8g5LiN56iz5a6aCiAgICAgICAgICAgICAgICAgIC8vaHR0cDovLyIrZmF2aWNvblVybCsiL2Nkbi5pY28/ZGVmYXVsdGljb249aHR0cDovL3Nvei5pbS9mYXZpY29uLmljbyDkuI3nqLPlrpoKICAgICAgICAgICAgICAgICAgLy9odHRwczovL3d3dy54dHdpbmQuY29tL2FwaS9pbmRleC5waHA/dXJsPT8/Pz8g5oyC5LqG44CC44CC44CCCiAgICAgICAgICAgICAgICAgIC8vaHR0cHM6Ly9zdGF0aWNzLmRuc3BvZC5jbi9wcm94eV9mYXZpY29uL18vZmF2aWNvbj9kb21haW49c2luYS5jbgogICAgICAgICAgICAgICAgICAvL3d3dy5nb29nbGUuY29tL3MyL2Zhdmljb25zP2RvbWFpbj03NjQzNTAxNzcubG9mdGVyLmNvbQogICAgICAgICAgICAgICAgICAvL+WmguaenOWcsOWdgOS4jeato+ehru+8jOmCo+S5iOS4ouW8gwogICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IGZhdmljb25VcmwucmVwbGFjZSgvW14uXStcLihbXi5dKylcLihbXi5dKykvLCAiJDEuJDIiKTsKICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUucXVlcnlTZWxlY3RvcigiLkFDLWZhdmljb25UIikgPT09IG51bGwgJiYgaG9zdC5sZW5ndGggPiAzKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGluc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKICAgICAgICAgICAgICAgICAgICAvLyBjdXJOb2RlID0gY3VyTm9kZS5jaGlsZHJlblswXSB8fCBjdXJOb2RlLmZpcnN0Q2hpbGQgOyAvLyBmaXJzdENoaWxk5a655piT6YGH5YiwdGV4dOWvueixoQogICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuc2V0QXR0cmlidXRlKCJhY19mYXZpY29uU3RhdHVzIiwgIjEiKTsKICAgICAgICAgICAgICAgICAgICAvLyBjdXJOb2RlLmluc2VydEJlZm9yZShpbnNOb2RlLCBjdXJOb2RlLmZpcnN0Q2hpbGQpOwogICAgICAgICAgICAgICAgICAgIGluc05vZGUuY2xhc3NOYW1lID0gIkFDLWZhdmljb25UIjsKICAgICAgICAgICAgICAgICAgICBpbnNOb2RlLnNldEF0dHJpYnV0ZSgicmVmZXJyZXJwb2xpY3kiLCAibm8tcmVmZXJyZXIiKTsKICAgICAgICAgICAgICAgICAgICBpbnNOb2RlLnN0eWxlID0gInBvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MTt2ZXJ0aWNhbC1hbGlnbjpzdWI7aGVpZ2h0OjE2cHg7d2lkdGg6MTZweDttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206IDJweDt1c2VyLXNlbGVjdDpub25lOyI7CgogICAgICAgICAgICAgICAgICAgIGluc05vZGUuc3JjID0gImh0dHBzOi8vZmF2aWNvbi55YW5kZXgubmV0L2Zhdmljb24vdjIvIiArIChjdXJOb2RlLmhyZWYgfHwgaG9zdCk7IC8vIE1BUksgeWFuZGV45pSv5oyB6L+Z56eN5p+l6K+i6KeE5YiZCiAgICAgICAgICAgICAgICAgICAgaW5zTm9kZS5zZXRBdHRyaWJ1dGUoImZhdmljb25JRCIsICIwIik7CiAgICAgICAgICAgICAgICAgICAgaW5zTm9kZS5zZXRBdHRyaWJ1dGUoIm9uZHJhZ3N0YXJ0IiwgInJldHVybiBmYWxzZTsiKSAvLyDnpoHmraLmi5bliqjlm77niYct6YG/5YWN5ouW6ZSZ5LqGCiAgICAgICAgICAgICAgICAgICAgLy8gY3VyTm9kZS5pbm5lckhUTUwgPSBpbnNOb2RlLm91dGVySFRNTCArIGN1ck5vZGUuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgIC8vIGN1ck5vZGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlckVuZCIsIGluc05vZGUuaW5uZXJIVE1MKTsKICAgICAgICAgICAgICAgICAgICBsZXQgYmVmb3JlSW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXROb2RlLmNoaWxkTm9kZXNbYmVmb3JlSW5kZXhdLmNsYXNzTmFtZSA9PT0gIkFDLUNvdW50ZXJUIikgewogICAgICAgICAgICAgICAgICAgICAgYmVmb3JlSW5kZXggPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlLmluc2VydEJlZm9yZShpbnNOb2RlLCB0YXJnZXROb2RlLmNoaWxkTm9kZXNbYmVmb3JlSW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKHhjdXIpIHsKICAgICAgICAgICAgICAgICAgICAgIGluc05vZGUub25sb2FkID0gZnVuY3Rpb24gKGVudikgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1nTm9kZSA9IHhjdXIucXVlcnlTZWxlY3RvcigiLkFDLWZhdmljb25UIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW1nTm9kZSB8fCB7fSkubmF0dXJhbFdpZHRoIDwgMTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdOb2RlLnNldEF0dHJpYnV0ZSgib2xkLXNyYyIsIGltZ05vZGUuc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdOb2RlLnNyYyA9IEFDQ29uZmlnLmRlZmF1bHRGYXZpY29uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGltZ05vZGUub25sb2FkID0gImphdmFzY3JpcHQ6dm9pZCgwKTsiOwogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KSh0YXJnZXROb2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGNoZWNrTm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCIpOwogICAgICAgICAgICBmb3IgKGxldCBmYU5vZGUgb2YgY2hlY2tOb2RlcykgewogICAgICAgICAgICAgIGxldCBmYXZpY29uTm9kZSA9IGZhTm9kZS5xdWVyeVNlbGVjdG9yKCIucmVzdWx0X19pY29uIGltZyIpOwogICAgICAgICAgICAgIGxldCBiZWZvcmVOb2RlID0gZmFOb2RlLnF1ZXJ5U2VsZWN0b3IoIi5yZXN1bHRfX3RpdGxlIGEiKTsKICAgICAgICAgICAgICBpZihmYXZpY29uTm9kZSAmJiBiZWZvcmVOb2RlKXsKICAgICAgICAgICAgICAgIGZhdmljb25Ob2RlLnN0eWxlID0gInZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NXB4OyI7CiAgICAgICAgICAgICAgICBiZWZvcmVOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZhdmljb25Ob2RlLCBiZWZvcmVOb2RlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIEluc2VydFNldHRpbmdNZW51KCkgewogICAgICAgICAgaWYgKChjdXJTaXRlLlNpdGVUeXBlSUQgIT09IFNpdGVUeXBlLk9USEVSUykgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI215dXNlciIpID09PSBudWxsKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN1LCAjZ2I+ZGl2PmRpdj5kaXYsICNiX2hlYWRlcj4jaWRfaCwgLnRvcC1iYXIgLnNvZ291LXNldC1ib3gsICNoZWFkZXJfd3JhcHBlciAuanMtaGwtYnV0dG9uLCBib2R5W2RvZ2VdICNoZWFkZXJfd3JhcHBlciAjaGVhZGVyIik7IC8vYmFpZHU7IGdvb2dsZTsgYmluZzsg5pCc54uXCiAgICAgICAgICAgICAgcGFyZW50LnN0eWxlID0gIndpZHRoOiBhdXRvOyI7CiAgICAgICAgICAgICAgbGV0IHVzZXJBZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgdXNlckFkaXYuaWQgPSAibXl1c2VyIjsKICAgICAgICAgICAgICB1c2VyQWRpdi5pbm5lckhUTUwgPSBgPGlucHV0IHR5cGU9J3N1Ym1pdCcgY2xhc3M9J215dXNlcmNvbmZpZycgdmFsdWU9JyR7QWxsRGF0YS5sYW4udXNlLm1lbnVfdGV4dH0nLz48c3BhbiBjbGFzcz0nYWMtbmV3dmVyc2lvbkRpc3BsYXknIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ZmxvYXQ6IGxlZnQ7aGVpZ2h0OiA4cHg7d2lkdGg6IDhweDtib3JkZXItcmFkaXVzOiA0cHg7ZGlzcGxheTokeyhDT05TVC5oYXNOZXdGdW5jTmVlZERpc3BsYXkgPyAidW5zZXQiIDogIm5vbmUiKX0nPiZuYnNwOzwvc3Bhbj5gOwogICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodXNlckFkaXYsIHBhcmVudC5jaGlsZE5vZGVzWzBdKTsKICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjbXl1c2VyIC5teXVzZXJjb25maWciKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQUN0b2dnbGVTZXR0aW5nRGlzcGxheShlKTsKICAgICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KCk7IC8vIOivu+WPluS4quS6uuiuvue9ruS/oeaBrwogICAgICAvKioKICAgICAgICogQHBhcmFtIGNhbGxiYWNrIOWbnuiwg+WHveaVsO+8jOmcgOimgei/lOWbnuaYr+WQpue7k+adn1RydWXjgIFGYWxzZeOAgeWQpuWImeebuOW9k+S6juWumuaXtuWZqAogICAgICAgKiBjYWxsYmFjayByZXR1cm46CiAgICAgICAqICB0cnVlID0g5YCS6K6h5pe2CiAgICAgICAqICBmYWxzZSA9IOiuoeaXtuWZqAogICAgICAgKiAgbm9uZSA9IOiuoeaXtuWZqAogICAgICAgKiBAcGFyYW0gcGVyaW9kIOWRqOacn++8jOWmgjoyMDBtcwogICAgICAgKiBAcGFyYW0gcnVuTm93IOeri+WNs+aJp+ihjAogICAgICAgKi8KICAgICAgZnVuY3Rpb24gUkFGSW50ZXJ2YWwoY2FsbGJhY2ssIHBlcmlvZCwgcnVuTm93KSB7CiAgICAgICAgLy8g5LiA56eSNjDmrKHvvIzlr7nlupQx56eSMTAwMG1zCiAgICAgICAgY29uc3QgbmVlZENvdW50ID0gcGVyaW9kIC8gMTAwMCAqIDYwOwogICAgICAgIGxldCB0aW1lcyA9IDA7IC8vIOW3sue7j+iuoeaVsOeahOaVsOmHjwoKICAgICAgICBpZihydW5Ob3cgPT09IHRydWUpeyAvLyDlr7nkuo7nq4vljbPmiafooYzlh73mlbDnmoTnq4vljbPliKTlrprvvIzlkKbliJnov5vooYwKICAgICAgICAgIGNvbnN0IHNob3VsZEZpbmlzaCA9IGNhbGxiYWNrKCk7CiAgICAgICAgICBpZihzaG91bGRGaW5pc2gpIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHN0ZXAoKSB7CiAgICAgICAgICBpZih0aW1lcyA8IG5lZWRDb3VudCl7CiAgICAgICAgICAgIC8vIOiuoeaVsOacque7k+adny3nu6fnu63orqHmlbAKICAgICAgICAgICAgdGltZXMrKzsKICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgLy8g6K6h5pWw57uT5p2fLeWBnOatouiuoeaVsO+8jOWIpOWumue7k+aenAogICAgICAgICAgICBjb25zdCBzaG91bGRGaW5pc2ggPSBjYWxsYmFjaygpIHx8IGZhbHNlOwogICAgICAgICAgICBpZighc2hvdWxkRmluaXNoKXsKICAgICAgICAgICAgICAvLyDov5Tlm57lgLzkuLpmYWxzZe+8jOmHjeWQr+iuoeaVsOWZqAogICAgICAgICAgICAgIHRpbWVzID0gMDsKICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCkKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgLy8g6L+U5Zue5YC85Li6dHJ1Ze+8jOe7k+adn+iuoeaVsOWZqAogICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2FmZUZ1bmN0aW9uKGZ1bmMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgZnVuYygpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNhZmVXYWl0RnVuYyhzZWxlY3RvciwgY2FsbGJhY2tGdW5jLCB0aW1lLCBub3RDbGVhcikgewogICAgICAgIHRpbWUgPSB0aW1lIHx8IDUwOwogICAgICAgIG5vdENsZWFyID0gbm90Q2xlYXIgfHwgZmFsc2U7CiAgICAgICAgbGV0IGRvQ2xlYXIgPSAhbm90Q2xlYXI7CiAgICAgICAgUkFGSW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKCh0eXBlb2YgKHNlbGVjdG9yKSA9PT0gInN0cmluZyIgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT0gbnVsbCkpIHsKICAgICAgICAgICAgY2FsbGJhY2tGdW5jKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKTsKICAgICAgICAgICAgaWYgKGRvQ2xlYXIpIHJldHVybiB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKHNlbGVjdG9yKSA9PT0gImZ1bmN0aW9uIiAmJiAoc2VsZWN0b3IoKSAhPSBudWxsIHx8IChzZWxlY3RvcigpIHx8IFtdKS5sZW5ndGggPiAwKSkgewogICAgICAgICAgICBjYWxsYmFja0Z1bmMoc2VsZWN0b3IoKVswXSk7CiAgICAgICAgICAgIGlmIChkb0NsZWFyKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9LCB0aW1lLCB0cnVlKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gQUNfYWRkU3R5bGUoY3NzLCBjbGFzc05hbWUsIGFkZFRvVGFyZ2V0LCBpc1JlbG9hZCwgaW5pdFR5cGUpIHsgLy8g5re75YqgQ1NT5Luj56CB77yM5LiN6ICD6JmR5paH5pys6L295YWl5pe26Ze077yM5Y+q5omn6KGM5LiA5qyhLeaXoOiuuuaIkOWKn+S4juWQpu+8jOW4puaciWNsYXNzTmFtZQogICAgICAgIFJBRkludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogYWRkVG9UYXJnZXTov5nph4zkuI3opoHkvb/nlKhoZWFk5qCH562+LGhlYWTmoIfnrb7nmoRjc3PkvJrlnKhodG1s6L295YWl5pe25Yqg6L2977yMCiAgICAgICAgICAgKiBodG1s5Yqg6L295ZCO5Ly85LmO5LiN5Lya5YaN5qyh5Yqg6L2977yMYm9keeS8muiHquWKqOWKoOi9vQogICAgICAgICAgICogKiovCiAgICAgICAgICBsZXQgYWRkVG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFkZFRvVGFyZ2V0KTsKICAgICAgICAgIGlmICh0eXBlb2YgKGFkZFRvVGFyZ2V0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIGFkZFRvID0gKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICAgICAgaXNSZWxvYWQgPSBpc1JlbG9hZCB8fCBmYWxzZTsgLy8g6buY6K6k5piv6Z2e5Yqg6L295Z6LCiAgICAgICAgICBpbml0VHlwZSA9IGluaXRUeXBlIHx8ICJ0ZXh0L2NzcyI7CiAgICAgICAgICAvLyDlpoLmnpzmsqHmnInnm67moIfoioLngrko5YiZ55u05o6l5YqgKSB8fCDmnInnm67moIfoioLngrnkuJTmib7liLDkuoboioLngrko6L+b6KGM5paw5aKeKQogICAgICAgICAgaWYgKHR5cGVvZiAoYWRkVG9UYXJnZXQpID09PSAidW5kZWZpbmVkIiB8fCAodHlwZW9mIChhZGRUb1RhcmdldCkgIT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhZGRUb1RhcmdldCkgIT0gbnVsbCkpIHsKICAgICAgICAgICAgLy8gY2xlYXJJbnRlcnZhbCh0b3V0KTsKICAgICAgICAgICAgLy8g5aaC5p6cdHJ1ZSDlvLrooYzopobnm5bvvIzkuI3nrqHmnInmsqHmnIktLeWFiOWIoOmZpAogICAgICAgICAgICAvLyDlpoLmnpxmYWxzZe+8jOS4jeimhueblu+8jOS9huaYr+WmguaenOacieeahOivne+8jOimgemAgOWHuu+8jOS4jeWtmOWcqOWImeaWsOWini0t5peg6ZyA5Yig6ZmkCiAgICAgICAgICAgIGlmIChpc1JlbG9hZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgIHNhZmVSZW1vdmUoIi4iICsgY2xhc3NOYW1lKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JlbG9hZCA9PT0gZmFsc2UgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLiIgKyBjbGFzc05hbWUpICE9IG51bGwpIHsKICAgICAgICAgICAgICAvLyDoioLngrnlrZjlnKggJiYg5LiN5YeG5aSH6KaG55uWCiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIGNzc05vZGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgICAgICAgICBjc3NOb2RlLnNldEF0dHJpYnV0ZSgidHlwZSIsIGluaXRUeXBlKTsKICAgICAgICAgICAgY3NzTm9kZS5pbm5lckhUTUwgPSBjc3M7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgYWRkVG8uYXBwZW5kQ2hpbGQoY3NzTm9kZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0sIDIwLCB0cnVlKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2FmZVJlbW92ZShjc3NTZWxlY3RvcikgewogICAgICAgIHNhZmVGdW5jdGlvbigoKSA9PiB7CiAgICAgICAgICBsZXQgcmVtb3ZlTm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNzc1NlbGVjdG9yKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlTm9kZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHJlbW92ZU5vZGVzW2ldLnJlbW92ZSgpOwogICAgICAgIH0pCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVOb2RlKG5vZGUpIHsKICAgICAgICBpZihub2RlLmhhc0F0dHJpYnV0ZSgnYWMtYWQtaGlkZScpKSByZXR1cm4KICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnYWMtYWQtaGlkZScsICcxJykKICAgICAgICBub2RlLnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsnCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNhZmVSZW1vdmVfeHBhdGgoeHBhdGhTZWxlY3RvciwgaXNIaWRlPWZhbHNlKSB7CiAgICAgICAgc2FmZUZ1bmN0aW9uKCgpID0+IHsKICAgICAgICAgIGxldCByZW1vdmVOb2RlcyA9IGdldEFsbEVsZW1lbnRzKHhwYXRoU2VsZWN0b3IpOwogICAgICAgICAgaWYoaXNIaWRlKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlTm9kZXMubGVuZ3RoOyBpKyspewogICAgICAgICAgICAgIGhpZGVOb2RlKHJlbW92ZU5vZGVzW2ldKQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW92ZU5vZGVzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICByZW1vdmVOb2Rlc1tpXS5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNoZWNrSVNCYWlkdU1haW4oKSB7IC8vIOmmlumhtT10cnVlO+mdnummlumhtT1mYWxzZQogICAgICAgIC8vIOWmguaenOaYr+eZvuW6piAmJiAg5rKh5pyJKOeZvuW6puaQnOe0oue7k+aenOeahOagh+W/ly1b5a2Y5ZyoXeeZvuW6pueahOWGheWuuSkgcmV0dXJuOwogICAgICAgIHJldHVybiAhKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUgJiYgIShsb2NhdGlvbi5ocmVmLnJlcGxhY2UoLygmfFw/KSh3ZHx3b3JkKT0vLCAiIikgIT09IGxvY2F0aW9uLmhyZWYgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2NvbnRlbnRfbGVmdCIpIHx8CiAgICAgICAgICAgICgoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2t3IikgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2t3IikuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKSB8fCAiIikgIT09ICIiKQogICAgICAgICkKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIOajgOafpWRvY3VtZW5055qE5a2Q6IqC54K55piv5ZCm5ZCr5pyJ5YWD57SgCiAgICAgICAqIEBwYXJhbSBub2RlQ2xhc3Mg5b6F5qOA5p+l5YWD57SgCiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUfEYKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGNoZWNrRG9jbWVudEhhc05vZGUobm9kZUNsYXNzKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoZG9jdW1lbnQuY2hpbGROb2Rlc1tpXS5kYXRhICYmIGRvY3VtZW50LmNoaWxkTm9kZXNbaV0uZGF0YS5pbmRleE9mKG5vZGVDbGFzcykgPiAwKQogICAgICAgICAgICByZXR1cm4ge3JlczogdHJ1ZSwgbm9kZTogZG9jdW1lbnQuY2hpbGROb2Rlc1tpXX07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7cmVzOiBmYWxzZSwgbm9kZTogbnVsbH07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIEZTQmFpZHUoKSB7IC8vIHRoYW5rcyBmb3IgY29kZSBmcm9tIOa1rueUn0DmnKrmrYcgQHBhZ2UgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1UVy9zY3JpcHRzLzMxNjQyCiAgICAgICAgLy8gZGVidWcoIuWIneWni+WMlkZTQkFJRFUiKTsKCiAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIgPSB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIOWvvOWFpWNzc+WGheWuueS4uuOAkOaWh+acrOagvOW8j+OAke+8ge+8ge+8gQogICAgICAgICAgICogQHBhcmFtIGRhdGEgY3Nz5YaF5a65CiAgICAgICAgICAgKiBAcGFyYW0gdG9DbGFzc05hbWUg6aKE5pyf55qE57G75ZCNCiAgICAgICAgICAgKi8KICAgICAgICAgIGltcG9ydFN0eWxlOiBmdW5jdGlvbiAoZGF0YSwgdG9DbGFzc05hbWUsIHVzZU5vcm1hbENTUywgbXVzdExvYWQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiAoZGF0YSkgPT09ICJ1bmRlZmluZWQiIHx8IGRhdGEgPT09IG51bGwpIHsKICAgICAgICAgICAgICAvLyDov5nkuKrlsYXnhLblnKhWTeS4iuWHuumXrumimOS6hu+8jOW+iOWlh+aAqgogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkdNX2dldFJlc291cmNlVGV4dOiOt+WPluWGheWuueaVsOaNruW8guW4uCIpOwogICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIHVzZU5vcm1hbENTUyA9IHVzZU5vcm1hbENTUyB8fCBmYWxzZTsKICAgICAgICAgICAgbXVzdExvYWQgPSBtdXN0TG9hZCB8fCBmYWxzZTsKICAgICAgICAgICAgLy8g5pmu6YCa5rWP6KeI5Zmo5qih5byPLS3kvYbmmK/kvLzkuY7moLflvI/liqDovb3nmoTkvJjlhYjnuqfkvY7kuo5oZWFk5Lit55qEc3R5bGXkvJjlhYjnuqcKICAgICAgICAgICAgaWYgKCF1c2VOb3JtYWxDU1MgJiYgY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5EVUNLKSB7CiAgICAgICAgICAgICAgLy8g6YCa6L+HbXVzdOWPguaVsOadpeWIpOWumnN0eWxl5piv5ZCm5Yqg6L29CiAgICAgICAgICAgICAgLy8gZGF0YSA9IGRhdGEucmVwbGFjZSgvYmFpZHUuY29tI1wkIy9pZ20sICcnKTsKICAgICAgICAgICAgICBpZiAoZGF0YS5pbmRleE9mKCJodHRwIikgIT09IDApIGRhdGEgPSAiZGF0YTp0ZXh0L2Nzczt1dGYtOCwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGRhdGEpOwogICAgICAgICAgICAgIHZhciB7cmVzLH0gPSBjaGVja0RvY21lbnRIYXNOb2RlKHRvQ2xhc3NOYW1lKTsKICAgICAgICAgICAgICBpZiAoIXJlcykgewogICAgICAgICAgICAgICAgbGV0IHBpID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAogICAgICAgICAgICAgICAgICAieG1sLXN0eWxlc2hlZXQiLAogICAgICAgICAgICAgICAgICBgdHlwZT0idGV4dC9jc3MiIG11c3Q9IiR7bXVzdExvYWR9IiBjbGFzcz0iJHt0b0NsYXNzTmFtZX0iIGhyZWY9IiR7ZGF0YX0iYAogICAgICAgICAgICAgICAgKTsgLy8g5rOo5oSP5b+F6aG76KaB5Y+M5byV5Y+3CiAgICAgICAgICAgICAgICBkb2N1bWVudC5pbnNlcnRCZWZvcmUocGksIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8qICoqKioqKioqKirlpJrph43moLflvI8t5YW85a65ZWRnZSAmJiDpu5HlpJzohJrmnKwqKioqKioqKioqKiogKi8KICAgICAgICAgICAgICBBQ19hZGRTdHlsZShkYXRhLCB0b0NsYXNzTmFtZSwgImhlYWQiLCBmYWxzZSwgInRleHQvY3NzIik7CiAgICAgICAgICAgICAgLyogKioqKioqKioqKuWkmumHjeagt+W8jy3lhbzlrrllZGdlICYmIOm7keWknOiEmuacrCoqKioqKioqKioqKiAqLwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgLy/liqDovb3mma7pgJrmoLflvI8KICAgICAgICAgIGxvYWRDb21tb25TdHlsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmxvYWRTdHlsZShDT05TVC51c2VJdGVtLm5hbWUgKyAiQ29tbW9uU3R5bGUiLCBDT05TVC51c2VJdGVtLm5hbWUgKyAiQ29tbW9uU3R5bGUiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkQmFpZHVMaXRlU3R5bGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIubG9hZFN0eWxlKCJiYWlkdUxpdGVTdHlsZSIsICJiYWlkdUxpdGVTdHlsZSIsIG51bGwsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIubG9hZFBsYWluVG9DU1MoImJhaWR1TGl0ZVN0eWxlIik7CiAgICAgICAgICB9LAogICAgICAgICAgbG9hZFN0eWxlOiBhc3luYyBmdW5jdGlvbiAoc3R5bGVOYW1lLCBpbnNDbGFzc05hbWUsIHNldFVybCwgdXNlTm9ybWFsQ1NTLCBtdXN0TG9hZCkgewogICAgICAgICAgICAvLyDlhajpg6jph4fnlKh0ZXh0L2Nzc+eahOWGheWuueadpei9veWFpQogICAgICAgICAgICAvLyDlpoLmnpzmmK9kZWJ1Z+aooeW8j+OAguaIluiAheaYr2dt5qih5byPCiAgICAgICAgICAgIGlmIChpc0xvY2FsRGVidWcpIHsKICAgICAgICAgICAgICBkZWJ1Zygi5pys5ZywLeWKoOi9veagt+W8j++8miIgKyBpbnNDbGFzc05hbWUpOwogICAgICAgICAgICAgIHNldFVybCA9IHNldFVybCB8fCAiaHR0cDovLzEyNy4wLjAuMS8iICsgc3R5bGVOYW1lICsgIi5jc3MiOwogICAgICAgICAgICAgIHRoaXMuaW1wb3J0U3R5bGUoc2V0VXJsLCAiQUMtIiArIGluc0NsYXNzTmFtZSwgdXNlTm9ybWFsQ1NTLCBtdXN0TG9hZCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOZXdHTSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgIC8vIOS7heeUqOS6jkdyZWFzZU1vbmtleTQuMCsKICAgICAgICAgICAgICBkZWJ1Zygi54m55q6K5qih5byPLeWKoOi9veagt+W8j++8miIgKyBpbnNDbGFzc05hbWUpOwogICAgICAgICAgICAgIHNldFVybCA9IHNldFVybCB8fCAiaHR0cHM6Ly9zeW5jLnR1amlkdS5jb20vbmV3Y3NzLyIgKyBzdHlsZU5hbWUgKyAiLmNzcyI7CiAgICAgICAgICAgICAgdGhpcy5pbXBvcnRTdHlsZShzZXRVcmwsICJBQy0iICsgaW5zQ2xhc3NOYW1lLCB1c2VOb3JtYWxDU1MsIG11c3RMb2FkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBkZWJ1Zygi5Yqg6L295qC35byP77yaIiArIGluc0NsYXNzTmFtZSk7CiAgICAgICAgICAgICAgLy8gVGFtcGVyTW9ua2V5ICsgR3JlYXNlTW9ua2V5IDwgNC4wICsgVmlvbGVudE1vbmtleSAoNC4wR3JlYXNlTW9ua2V55LiN5pSv5oyBR2V0UmVzb3VyY2Xmlrnms5UpCiAgICAgICAgICAgICAgdGhpcy5pbXBvcnRTdHlsZShhd2FpdCBHTV9nZXRSZXNvdXJjZVRleHQoc3R5bGVOYW1lKSwgIkFDLSIgKyBpbnNDbGFzc05hbWUsIHVzZU5vcm1hbENTUywgbXVzdExvYWQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgLy/liqDovb3miqTnnLzmqKHlvI/moLflvI8KICAgICAgICAgIGxvYWRIdVlhblN0eWxlOiBmdW5jdGlvbiAoY29sb3IpIHsKICAgICAgICAgICAgbGV0IHN0eWxlID0gImJvZHlbYmFpZHVdLCN3cmFwcGVyICNoZWFkLCN3cmFwcGVyICNzX3RhYixmb3JtLmZtIC5zX2lwdF93ci5iZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9I2NvbnRhaW5lciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3AsI2NvbnRhaW5lciAjY29udGVudF9sZWZ0IC5yZXN1bHQsI2NvbnRhaW5lciAjcnMsI2NvbnRhaW5lciAjY29udGVudF9yaWdodHtiYWNrZ3JvdW5kLWNvbG9yOiNhYWE7Ym9yZGVyOjFweCBkb3VibGUgI2EyZDdkNDtib3JkZXItcmFkaXVzOjB9I2NvbnRhaW5lciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3A6aG92ZXIsI2NvbnRhaW5lciAjY29udGVudF9sZWZ0IC5yZXN1bHQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojY2NjIWltcG9ydGFudH0jY29udGFpbmVyICNjb250ZW50X2xlZnQgLnJlc3VsdC1vcCBoMywjY29udGFpbmVyICNjb250ZW50X2xlZnQgLmMtY29udGFpbmVyIGgzLCNjb250YWluZXIgI3JzIC50dHtiYWNrZ3JvdW5kLWNvbG9yOiNiYmJ9Lm5hX2NudCAubndzX2l0bSwubndzX2l0bWIsI2JfY29udGVudCAjYl9yZXN1bHRzIGxpLGJvZHkgI2JfaGVhZGVye2JhY2tncm91bmQtY29sb3I6I2FhYTtib3JkZXI6MXB4IGRvdWJsZSAjYTJkN2Q0O2JvcmRlci1yYWRpdXM6MH0jYl9jb250ZW50ICNiX3Jlc3VsdHMgbGk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojY2NjIWltcG9ydGFudH0jYl9jb250ZW50ICNiX3Jlc3VsdHMgbGkgaDJ7YmFja2dyb3VuZC1jb2xvcjojYmJifSNyc28gLmcsLmJrV01nZD4uZywuYmtXTWdkIGctaW5uZXItY2FyZCwjcmhzY29sICNyaHMsI3Joc2NvbCAjcmhzIC5nPmRpdiwuYzJ4elRiIC5nLC5ydVRjSWQgLmcsLmZtMDZJZiAuZywuY1VuUUtlIC5nLC5IYW5RbWYgLmd7YmFja2dyb3VuZC1jb2xvcjojYWFhO2JvcmRlcjoxcHggZG91YmxlICNhMmQ3ZDQ7Ym9yZGVyLXJhZGl1czowfSNyc28gLmc6aG92ZXIsLmJrV01nZD4uZzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjY2MhaW1wb3J0YW50fS5ia1dNZ2QgLmcgZGl2LnIsI3JzbyAuZyBoM3tiYWNrZ3JvdW5kLWNvbG9yOiNiYmJ9IjsKICAgICAgICAgICAgaWYgKEFDQ29uZmlnLmlzVXNlckNvbG9yRW5hYmxlKSB7CiAgICAgICAgICAgICAgY29sb3IgPSBjb2xvciB8fCBBQ0NvbmZpZy5kZWZhdWx0SHVZYW5Db2xvciB8fCAiI0ZGRkZGRiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29sb3IgPSBjb2xvciB8fCAiI0ZGRkZGRiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvbG9yLmluZGV4T2YoIiMiKSAhPT0gMCB8fCBjb2xvci5sZW5ndGggPCA3KSByZXR1cm47CiAgICAgICAgICAgIGlmIChpc05ld0dNID09PSBmYWxzZSkgewogICAgICAgICAgICAgIHN0eWxlID0gR01fZ2V0UmVzb3VyY2VUZXh0KCJNYWluSHVZYW5TdHlsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0eWxlID0gc3R5bGUKICAgICAgICAgICAgLnJlcGxhY2UoLyNhYWEoYSopL2lnbSwgY29sb3IpCiAgICAgICAgICAgIC5yZXBsYWNlKC8jYmJiKGIqKS9pZ20sIHRoaXMuTGlnaHRlcihjb2xvciwgLTQwKSkKICAgICAgICAgICAgLnJlcGxhY2UoLyNjY2MoYyopL2lnbSwgdGhpcy5MaWdodGVyKGNvbG9yLCA0NSkpOwogICAgICAgICAgICBBQ19hZGRTdHlsZShzdHlsZSwgIkFDLSIgKyBDT05TVC51c2VJdGVtLm5hbWUgKyAiSHVZYW5TdHlsZSIgKyAoaXNOZXdHTSA/ICIiIDogIi1GaWxlIiksICJoZWFkIiwgdHJ1ZSk7IC8vIOmcgOimgeS/ruaUueeahO+8jOaJgOS7peS4unRydWUKICAgICAgICAgIH0sCiAgICAgICAgICBjbGlwMjU1OiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID4gMjU1KSByZXR1cm4gMjU1OwogICAgICAgICAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gMDsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgfSwKICAgICAgICAgIExpZ2h0ZXI6IGZ1bmN0aW9uIChvcmlSR0IsIGRlbHRhWSkgewogICAgICAgICAgICAvLyDmjInmr5TkvovnvKnmlL4gKyAxL2RlbHRhWQogICAgICAgICAgICAvLyBIRVggMiBSR0IKICAgICAgICAgICAgbGV0IHJnYiA9IG9yaVJHQi5yZXBsYWNlKCIjIiwgIiIpOwogICAgICAgICAgICBsZXQgUiA9IHBhcnNlSW50KCIweCIgKyByZ2Iuc3Vic3RyKDAsIDIpKTsKICAgICAgICAgICAgbGV0IEcgPSBwYXJzZUludCgiMHgiICsgcmdiLnN1YnN0cigyLCAyKSk7CiAgICAgICAgICAgIGxldCBCID0gcGFyc2VJbnQoIjB4IiArIHJnYi5zdWJzdHIoNCwgMikpOwogICAgICAgICAgICAvLyBSR0IgMiBZVVYKICAgICAgICAgICAgbGV0IFkgPSAoKDY2ICogUiArIDEyOSAqIEcgKyAyNSAqIEIgKyAxMjgpID4+IDgpICsgMTY7CiAgICAgICAgICAgIGxldCBVID0gKCgtMzggKiBSIC0gNzQgKiBHICsgMTEyICogQiArIDEyOCkgPj4gOCkgKyAxMjg7CiAgICAgICAgICAgIGxldCBWID0gKCgxMTIgKiBSIC0gOTQgKiBHIC0gMTggKiBCICsgMTI4KSA+PiA4KSArIDEyODsKICAgICAgICAgICAgWSA9IFkgKiAoMSArIDEuMCAvIGRlbHRhWSk7Ly8g5o+Q6auY5Lqu5bqmCiAgICAgICAgICAgIC8vIFlVViAyIFJHQgogICAgICAgICAgICBSID0gdGhpcy5jbGlwMjU1KCgyOTggKiAoWSAtIDE2KSArIDQwOSAqIChWIC0gMTI4KSArIDEyOCkgPj4gOCk7CiAgICAgICAgICAgIEcgPSB0aGlzLmNsaXAyNTUoKDI5OCAqIChZIC0gMTYpIC0gMTAwICogKFUgLSAxMjgpIC0gMjA4ICogKFYgLSAxMjgpICsgMTI4KSA+PiA4KTsKICAgICAgICAgICAgQiA9IHRoaXMuY2xpcDI1NSgoMjk4ICogKFkgLSAxNikgKyA1MTYgKiAoVSAtIDEyOCkgKyAxMjgpID4+IDgpOwogICAgICAgICAgICByZXR1cm4gIiMiICsgKChSIDw8IDE2KSArIChHIDw8IDgpICsgQikudG9TdHJpbmcoMTYpOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Yqg6L295Y2V6aG15qC35byPCiAgICAgICAgICBsb2FkT25lUGFnZVN0eWxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFN0eWxlKENPTlNULnVzZUl0ZW0ubmFtZSArICJPbmVQYWdlU3R5bGUiLCBDT05TVC51c2VJdGVtLm5hbWUgKyAiT25lUGFnZVN0eWxlIik7CiAgICAgICAgICB9LAogICAgICAgICAgLy/liqDovb3lj4zpobXmoLflvI8KICAgICAgICAgIGxvYWRUd29QYWdlU3R5bGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5sb2FkU3R5bGUoQ09OU1QudXNlSXRlbS5uYW1lICsgIlR3b1BhZ2VTdHlsZSIsIENPTlNULnVzZUl0ZW0ubmFtZSArICJUd29QYWdlU3R5bGUiKTsKICAgICAgICAgICAgbGV0IGNzc0hlYWQgPSAiIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUgfHwgY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5NQkFJRFUpIGNzc0hlYWQgPSAiI2NvbnRhaW5lciAjY29udGVudF9sZWZ0LCBib2R5W25ld3NdICNjb250YWluZXIgI2NvbnRlbnRfbGVmdD5kaXY6bm90KFtjbGFzc10pOm5vdChbaWRdKSI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkdPT0dMRSkgQ09OU1QuaXNHb29nbGVTcGVjaWFsID8gY3NzSGVhZCA9ICIuc3JnLCAjcnNvIiA6IGNzc0hlYWQgPSAiLnNyZywgI3Jzbz5kaXY6bm90KC5nKSI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJJTkcpIGNzc0hlYWQgPSAiI2JfY29udGVudCAjYl9yZXN1bHRzIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuU09HT1UpIGNzc0hlYWQgPSAiI21haW4gLnJlc3VsdHMiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5EVUNLKSBjc3NIZWFkID0gIiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluICNsaW5rcyI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkRPR0UpIGNzc0hlYWQgPSAiI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIjsKICAgICAgICAgICAgQUNfYWRkU3R5bGUoY3NzSGVhZCArICJ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDUwJSwxZnIpKTtncmlkLXRlbXBsYXRlLWFyZWFzOid4bWFpbiB4bWFpbic7Z3JpZC1jb2x1bW4tZ2FwOiAxcHg7fS5BQy5zcC1zZXBhcmF0b3J7Z3JpZC1jb2x1bW4tc3RhcnQ6IDE7Z3JpZC1jb2x1bW4tZW5kOiB4bWFpbi1lbmQ7fSIsCiAgICAgICAgICAgICAgIkFDLVR3b1BhZ2VFeFN0eWxlIiwgImhlYWQiKTsKICAgICAgICAgIH0sCiAgICAgICAgICAvLyDliqDovb3kuInliJfmoLflvI8KICAgICAgICAgIGxvYWRUaHJlZVBhZ2VTdHlsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgY3NzSGVhZCA9ICIiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVSB8fCBjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLk1CQUlEVSkgY3NzSGVhZCA9ICIjY29udGFpbmVyICNjb250ZW50X2xlZnQsIGJvZHlbbmV3c10gI2NvbnRhaW5lciAjY29udGVudF9sZWZ0PmRpdjpub3QoW2NsYXNzXSk6bm90KFtpZF0pIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSBDT05TVC5pc0dvb2dsZVNwZWNpYWwgPyBjc3NIZWFkID0gIi5zcmcsICNyc28iIDogY3NzSGVhZCA9ICIuc3JnLCAjcnNvPmRpdjpub3QoLmcpIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQklORykgY3NzSGVhZCA9ICIjYl9jb250ZW50ICNiX3Jlc3VsdHMiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5TT0dPVSkgY3NzSGVhZCA9ICIjbWFpbiAucmVzdWx0cyI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkRVQ0spIGNzc0hlYWQgPSAiI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuRE9HRSkgY3NzSGVhZCA9ICIjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbiAjbGlua3MiOwogICAgICAgICAgICBBQ19hZGRTdHlsZShjc3NIZWFkICsgIntncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCBtaW5tYXgoMzMuMyUsMWZyKSk7Z3JpZC10ZW1wbGF0ZS1hcmVhczoneG1haW4geG1haW4geG1haW4nO2dyaWQtY29sdW1uLWdhcDogMTBweDt9IiwKICAgICAgICAgICAgICAiQUMtVGhyZWVQYWdlRXhTdHlsZSIsICJoZWFkIik7CiAgICAgICAgICB9LAogICAgICAgICAgLy8g5Yqg6L295Zub5YiX5qC35byPCiAgICAgICAgICBsb2FkRm91clBhZ2VTdHlsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgY3NzSGVhZCA9ICIiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVSB8fCBjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLk1CQUlEVSkgY3NzSGVhZCA9ICIjY29udGFpbmVyICNjb250ZW50X2xlZnQsIGJvZHlbbmV3c10gI2NvbnRhaW5lciAjY29udGVudF9sZWZ0PmRpdjpub3QoW2NsYXNzXSk6bm90KFtpZF0pIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSBDT05TVC5pc0dvb2dsZVNwZWNpYWwgPyBjc3NIZWFkID0gIi5zcmcsICNyc28iIDogY3NzSGVhZCA9ICIuc3JnLCAjcnNvPmRpdjpub3QoLmcpIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQklORykgY3NzSGVhZCA9ICIjYl9jb250ZW50ICNiX3Jlc3VsdHMiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5TT0dPVSkgY3NzSGVhZCA9ICIjbWFpbiAucmVzdWx0cyI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkRPR0UpIGNzc0hlYWQgPSAiI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuRE9HRSkgY3NzSGVhZCA9ICIjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbiAjbGlua3MiOwogICAgICAgICAgICBBQ19hZGRTdHlsZShjc3NIZWFkICsgIntncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCBtaW5tYXgoMjUlLDFmcikpO2dyaWQtdGVtcGxhdGUtYXJlYXM6J3htYWluIHhtYWluIHhtYWluIHhtYWluJztncmlkLWNvbHVtbi1nYXA6IDFweDt9IiwKICAgICAgICAgICAgICAiQUMtRm91clBhZ2VFeFN0eWxlIiwgImhlYWQiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkUGxhaW5Ub0NTUzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgY3VyTm9kZSA9IGRvY3VtZW50LmNoaWxkTm9kZXNbaV07CiAgICAgICAgICAgICAgaWYgKGN1ck5vZGUuZGVsKSBjdXJOb2RlLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNhZmVSZW1vdmUoInN0eWxlW2NsYXNzKj0nQUMnXVtkZWw9JzEnXSIpOwogICAgICAgICAgfSwKICAgICAgICAgIC8vIOemgeatoueLrOeri+eahOagt+W8j+WKoOi9vQogICAgICAgICAgbG9hZENTU1RvUGxhaW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IGN1ck5vZGUgPSBkb2N1bWVudC5jaGlsZE5vZGVzW2ldOwogICAgICAgICAgICAgIC8vIOWmguaenOaYr+WtmOWcqGNzc++8jCDkuJTpnZ7lv4XpobvmlbDmja4KICAgICAgICAgICAgICBpZiAoY3VyTm9kZS50YXJnZXQgPT09ICJ4bWwtc3R5bGVzaGVldCIgJiYgY3VyTm9kZS5kYXRhLmluZGV4T2YoIm11c3Q9XCJ0cnVlIikgPCAwKSB7CiAgICAgICAgICAgICAgICBjdXJOb2RlLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgIGN1ck5vZGUuZGVsID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyDlr7nkuo5lZGdl5ZKMc2FmYXJp6YO954m55q6K5aSE55CG5LiA5LiL5ZCnCiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVkZ2UiKSA+IDAgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInNhZmFyaSIpID4gMCkgewogICAgICAgICAgICAgICAgICBjdXJOb2RlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGluaXQoKSB7CiAgICAgICAgICAgIENvbnRyb2xNYW5hZ2VyLmluaXQoKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBDb250cm9sTWFuYWdlciA9IHsKICAgICAgICAgIC8v5bGF5Lit5pi+56S6IC0tLSDlv4XpobvmmK/nmb7luqblkozosLfmrYznmoTmkJzntKLnu5PmnpzpobXpnaLvvIzlhbbku5bpobXpnaLkuI3og73liqDovb3nmoQtLeW3sue7j+mAmui/h+iEmuacrGluY2x1ZGXmoIfnrb7pmZDliLbkuobkuIDpg6jliIYKICAgICAgICAgIGNlbnRlckRpc3BsYXk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8g5aaC5p6c5piv55m+5bqmICYmICgo5Zyw5Z2A5pu/5o2iLT7ljIXlkKt3ZOWFs+mUruivjVvmm7/mjaLkuYvlkI7kuI3nrYkt5piv55m+5bqm57uT5p6c6aG16Z2iXSkgfHwg5pyJ5Y+z6L655qCPLeiCr+WumuaYr+eZvuW6puaQnOe0oue7k+aenOmhtSB8fCB2YWx1ZeS4reWtmOWcqOaQnOe0ouWGheWuuSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoIWNoZWNrSVNCYWlkdU1haW4oKSkgewogICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRDU1NUb1BsYWluKCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEFDX2FkZFN0eWxlKCIubWluaWRpdiAjbG9nbyBpbWd7d2lkdGg6IDEwMHB4O2hlaWdodDogdW5zZXQ7bWFyZ2luLXRvcDogMC4zcmVtO30iLCAiQUMtc3R5bGUtbG9nbyIsICJoZWFkIik7CiAgICAgICAgICAgIGxldCByZXN1bHQgPSBwYXJzZUludChDT05TVC51c2VJdGVtLkFkc1N0eWxlTW9kZSB8fCAtMSk7CiAgICAgICAgICAgIGlmIChhY0Nzc0xvYWRGbGFnID09PSBmYWxzZSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuQUNFeHRlbnNpb24iKSA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGRlYnVnKCJpbuagt+W8j+WNs+WwhuWKoOi9vToiICsgcmVzdWx0KTsKICAgICAgICAgICAgICBsZXQgZXhwYW5kU3R5bGUgPSAiI3dyYXBwZXIgI3JzLCAjd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQsICN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtY29udGFpbmVye21pbi13aWR0aDo2NzBweDt9LmMtc3BhbjE4e3dpZHRoOjc4JSFpbXBvcnRhbnQ7bWluLXdpZHRoOjU1MHB4O30uYy1zcGFuMjR7d2lkdGg6IGF1dG8haW1wb3J0YW50O30iOwogICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IDEpIHsKICAgICAgICAgICAgICAgIEFDX2FkZFN0eWxlKGV4cGFuZFN0eWxlLCAiQUMtU3R5bGUtZXhwYW5kIiwgImhlYWQiKTsKICAgICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRDb21tb25TdHlsZSgpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAyKSB7Ly/ljZXpobXlsYXkuK0KICAgICAgICAgICAgICAgIEFDX2FkZFN0eWxlKGV4cGFuZFN0eWxlLCAiQUMtU3R5bGUtZXhwYW5kIiwgImhlYWQiKTsKICAgICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRDb21tb25TdHlsZSgpOwogICAgICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIubG9hZE9uZVBhZ2VTdHlsZSgpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAzKSB7IC8v5Y+M6aG15bGF5LitCiAgICAgICAgICAgICAgICBDT05TVC5TdHlsZU1hbmdlci5sb2FkQ29tbW9uU3R5bGUoKTsKICAgICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRUd29QYWdlU3R5bGUoKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gNCkgeyAvLyDkuInliJcKICAgICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRDb21tb25TdHlsZSgpOwogICAgICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIubG9hZFR3b1BhZ2VTdHlsZSgpOwogICAgICAgICAgICAgICAgQ09OU1QuU3R5bGVNYW5nZXIubG9hZFRocmVlUGFnZVN0eWxlKCk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IDUpIHsgLy8g5Zub5YiXCiAgICAgICAgICAgICAgICBDT05TVC5TdHlsZU1hbmdlci5sb2FkQ29tbW9uU3R5bGUoKTsKICAgICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRUd29QYWdlU3R5bGUoKTsKICAgICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRGb3VyUGFnZVN0eWxlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFjQ3NzTG9hZEZsYWcgPSB0cnVlOwogICAgICAgICAgICAgIGRlYnVnKCJpbuagt+W8j+i/kOihjOe7k+adnyIpOwogICAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJBSURVICYmIEFDQ29uZmlnLlN0eWxlX0JhaWR1TGl0ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgQUNfYWRkU3R5bGUoR01fZ2V0UmVzb3VyY2VUZXh0KCJiYWlkdUxpdGVTdHlsZSIpLCAiQUMtYmFpZHVMaXRlU3R5bGUiLCAiaGVhZCIpCiAgICAgICAgICAgICAgICBDT05TVC5TdHlsZU1hbmdlci5sb2FkQmFpZHVMaXRlU3R5bGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuQkFJRFUgJiYgY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5CQUlEVV9YVUVTSFUgJiYgY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5HT09HTEUgJiYgY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5CSU5HICYmIGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuU09HT1UgJiYgY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5EVUNLICYmIGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuRE9HRSkgcmV0dXJuOwoKICAgICAgICAgICAgLy8g5aaC5p6c5piv6LC35q2MICYmICjlnLDlnYDmm7/mjaItPuaYr+iwt+atjOWbvuWDj+mhtemdoiB8fCDmmK/lnLDlm77pobXpnaIpW+abv+aNouimgeWPmF0gcmV0dXJuOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5HT09HTEUgJiYgbG9jYXRpb24uaHJlZi5yZXBsYWNlKC90Ym09KGlzY2h8bGNsfHNob3B8ZmxtKS8sICIiKSAhPT0gbG9jYXRpb24uaHJlZikgewogICAgICAgICAgICAgIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRDU1NUb1BsYWluKCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKuaKpOecvFN0eWxl5pyA5ZCO6L295YWlKiovCiAgICAgICAgICAgIGlmIChDT05TVC51c2VJdGVtLkh1WWFuTW9kZSA9PT0gdHJ1ZSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzdHlsZVtjbGFzcyo9J2RhcmtyZWFkZXInXSIpICE9IG51bGwpIENPTlNULlN0eWxlTWFuZ2VyLmxvYWRIdVlhblN0eWxlKCk7CgogICAgICAgICAgICBDT05TVC5TdHlsZU1hbmdlci5sb2FkUGxhaW5Ub0NTUygpOwogICAgICAgICAgfSwKICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKENPTlNULmlzR29vZ2xlSW1hZ2VVcmwpIHJldHVybjsKICAgICAgICAgICAgdGhpcy5jZW50ZXJEaXNwbGF5KCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvLyBkZWJ1Zygi6LCD55So5Yqg6L296Ieq5a6a5LmJY3NzIik7CiAgICAgICAgQ29udHJvbE1hbmFnZXIuaW5pdCgpOwogICAgICAgIHJldHVybiBDT05TVC5TdHlsZU1hbmdlcjsKICAgICAgfQogICAgfQogIH0pKCk7Cn0oKTsK","resources":[{"meta":{"name":"baiduCommonStyle.css","url":"http://ibaidu.tujidu.com/newcss/baiduCommonStyle.css?t=24.26","ts":1637743679585,"mimetype":"text/css"},"source":"LyoqU3RvcmUgQmFpZHVDb21tb25TdHlsZSoqLw0KaWZyYW1lOm5vdChbc3JjKj0nY2hyb21lJ10pLA0KLnJlc190b3BfYmFubmVyICNmb290LA0KI3BhZ2UgLmZrLA0KI2hlYWQgLmhlYWRCbG9jaywNCiNyc190b3BfbmV3LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdD50YWJsZSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtcmVjb21tZW5kLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAubGVmdEJsb2NrLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucnJlY29tLWJ0bi1wYXJlbnQsDQojZGVtbywNCiN3cmFwcGVyICNnb3RvUGFnZSwNCmJvZHk+ZGl2LnJlc3VsdC1vcCwNCi5ycmVjb20tY29udGFpbmVyLA0KLmNodW53YW4td3JhcHBlcnsNCiAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDsNCn0NCmJvZHlbYmFpZHVdIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1Ow0KICAgIHRyYW5zaXRpb246IGFsbCAxLjVzOw0KfQ0KI2FsYV9pbWdfcmVzdWx0c3sNCiAgICBvdmVyZmxvdzpoaWRkZW47DQp9DQpib2R5IGEsDQpib2R5IGEgZW0sDQojdSBhICwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wLXNvZnQtdGl0bGUgYSBlbSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdCBoMyBhIGVtIHsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQoNCmJvZHkgYTpob3ZlciwNCmJvZHkgYTpob3ZlciBlbXsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQojd3JhcHBlciAjc190YWIgew0KICAgIGJvcmRlci1ib3R0b206ICNlMGUwZTAgMXB4IHNvbGlkOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQp9DQpib2R5ICNoZWFkew0KICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ4LCAyNDgsIDI0OCwgMC40KTsNCiAgICBib3JkZXItYm90dG9tOiBub25lOw0KICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KQ0KfQ0KZm9ybS5mbSB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogdW5zZXQ7DQp9DQpmb3JtLmZtIC5iZHN1ZyBsaSB7DQogICAgd2lkdGg6IGF1dG87DQogICAgY29sb3I6ICMwMDA7DQogICAgZm9udDogMTVweCBhcmlhbDsNCiAgICBsaW5lLWhlaWdodDogMjZweDsNCn0NCmZvcm0uZm0gLnNfaXB0X3dyLmJnew0KICAgIGJhY2tncm91bmQ6ICNmZmY7DQogICAgd2lkdGg6IDY2JTsNCiAgICBtaW4td2lkdGg6IDU3MHB4Ow0KfQ0KI2NvbnRlbnRfbGVmdCAubmV3LXBtZCAuYy1zcGFuOSwNCiNjb250ZW50X2xlZnQgLm5ldy1wbWQgLmMtc3BhbjEwew0KICAgIHdpZHRoOiB1bnNldDsNCiAgICBmbG9hdDogdW5zZXQ7DQp9DQovKioqZml4IDJrKyBwcm9ibGVtKioqLw0KI2hlYWQgLmhlYWRfd3JhcHBlcnsNCiAgICB3aWR0aDogdW5zZXQ7IC8qZWRpdDogZml4IGJhaWR1IGJhbm5lciBwb3NpdGlvbiovDQp9DQpmb3JtLmZtIC5zX2J0biB7DQogICAgYmFja2dyb3VuZDogIzM0NzZkMjsNCiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzM0NzZkMjsNCn0NCmZvcm0uZm0gLnNfYnRuOmhvdmVyIHsNCiAgICBiYWNrZ3JvdW5kOiAjNEY3RmJGOw0KICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzQ3NmQyOw0KfQ0KI3dyYXBwZXIgI3NfdGFiIGIgew0KICAgIGNvbG9yOiAjMzQ3NmQyOw0KICAgIGJvcmRlci1ib3R0b206IDNweCAjMzQ3NmQyIHNvbGlkOw0KfQ0KDQojd3JhcHBlciAuaGVhZF9udW1zX2NvbnRfb3V0ZXIgLnNlYXJjaF90b29sX2NvbnRlciwNCiN3cmFwcGVyIC5oZWFkX251bXNfY29udF9vdXRlciAubnVtcyB7DQogICAgd2lkdGg6IDYzMHB4Ow0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCB7DQogICAgYW5pbWF0aW9uLW5hbWU6IGFuaV9ib3R0b21Ub3RvcDsNCiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogLjJzOw0KICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsNCn0NCiNoZWFkIC5oZWFkX3dyYXBwZXJ7DQogICAgYW5pbWF0aW9uLW5hbWU6IGFuaV9sZWZ0VG9yaWdodDsNCiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogLjJzOw0KICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7DQp9DQoNCiN3cmFwcGVyICNycywNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdCwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQ+LmMtY29udGFpbmVyIHsNCiAgICB3aWR0aDogNjcwcHg7DQogICAgcGFkZGluZzogMHB4IDIwcHggMTVweDsNCiAgICBtYXJnaW4tdG9wOiAwcHg7DQogICAgbWFyZ2luLWJvdHRvbTogMzBweDsNCiAgICBib3JkZXItcmFkaXVzOiAwOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMSk7DQogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdD4uYy1jb250YWluZXI6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0Pi5yZXN1bHQ6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0Pi5jLWNvbnRhaW5lcjpob3ZlciBhcnRpY2xlew0KICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjMpOw0KICAgIGJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCiAgICAtbW96LWJveC1zaGFkb3c6IDAgMCAxcHggZ3JheTsNCn0NCiN3cmFwcGVyICNyc1thYy1uZWVkaGlkZV0sDQojd3JhcHBlciAjY29udGVudF9sZWZ0Pi5yZXN1bHRbYWMtbmVlZGhpZGVdLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdD4uYy1jb250YWluZXJbYWMtbmVlZGhpZGVdew0KICAgIHBhZGRpbmc6IDVweDsNCiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7DQp9DQojd3JhcHBlciAjY29udGVudF9sZWZ0Pi5yZXN1bHRbdHBsPSdzb2Z0J10gLm9wLXNvZnQtdGl0bGUsDQojd3JhcHBlciAjY29udGVudF9sZWZ0Pi5yZXN1bHQgaDMsDQojd3JhcHBlciAjY29udGVudF9sZWZ0Pi5jLWNvbnRhaW5lciBoMyB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCiAgICBtYXJnaW46IDBweCAtMjBweCAxMHB4IC0yMHB4Ow0KICAgIHBhZGRpbmc6IDhweCAyMHB4IDVweDsNCiAgICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDBweCAwcHg7DQp9DQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5mMTMgYSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmYxMyBlbSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtc3BhbjE4IGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5zdWJMaW5rX2ZhY3RvcnkgYSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnN1YkxpbmtfYW5zd2VyIGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5jLXRhYnMtY29udGVudCBhLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3Bfb2ZmaWNhbF93ZWlib19jb250ZW50IGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5vcF9vZmZpY2FsX3dlaWJvX3B6IGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5vcF90aWViYTJfdGFibGlua3NfY29udGFpbmVyIGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5vcC10aWViYS1nZW5lcmFsLXJpZ2h0LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3BfZHEwMV90aXRsZSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wX2RxMDFfdGFibGUgYSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wX2RxMDFfbW9yZWxpbmsgYSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wLXRpZWJhLWdlbmVyYWwtbWFpbnBsIGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5vcC1zZS1saXN0ZW4tcmVjb21tZW5kLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuYy1vZmZzZXQ+ZGl2IGEgew0KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICBjb2xvcjogIzM0NzZkMjsNCn0NCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmYxMyBhOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuZjEzIGVtOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuc3ViTGlua19mYWN0b3J5IGE6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5zdWJMaW5rX2Fuc3dlciBhOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuYy10YWJzLWNvbnRlbnQgYTpob3ZlciwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wX3RpZWJhMl90YWJsaW5rc19jb250YWluZXIgYTpob3ZlciwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wLXRpZWJhLWdlbmVyYWwtcmlnaHQ6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5vcF9kcTAxX3RpdGxlOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3BfZHEwMV90YWJsZSBhOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3BfZHEwMV9tb3JlbGluayBhOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3AtdGllYmEtZ2VuZXJhbC1tYWlucGwgYTpob3ZlciwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wLXNlLWxpc3Rlbi1yZWNvbW1lbmQ6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5jLW9mZnNldD5kaXYgYTpob3ZlciB7DQogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUhaW1wb3J0YW50Ow0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuZjEzIGEgew0KICAgIGNvbG9yOiAjMDA4MDAwOw0KfQ0KDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5jLXNwYW4xOCwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtc3BhbjI0ew0KICAgIHdpZHRoOiAxMDAlOw0KICAgIG1pbi13aWR0aDogdW5zZXQ7DQp9DQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5jLWJvcmRlciB7DQogICAgd2lkdGg6IGF1dG87DQogICAgYm9yZGVyOiBub25lOw0KICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50Ow0KICAgIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7DQogICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggdHJhbnNwYXJlbnQ7DQogICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMHB4IDBweCB0cmFuc3BhcmVudDsNCiAgICAtbW96LWJveC1zaGFkb3c6IDBweCAwcHggMHB4IHRyYW5zcGFyZW50Ow0KICAgIC1vLWJveC1zaGFkb3c6IDBweCAwcHggMHB4IHRyYW5zcGFyZW50Ow0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuc2VfY29tX2lycmVndWxhcl9nYWxsZXJ5IHVsIGxpLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3BfamluZ3lhbl9saXN0LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0IC5vcC1pbWctYWRkcmVzcy1saW5rLXR5cGUgew0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICBtYXJnaW4tbGVmdDogMTBweDsNCn0NCiN3cmFwcGVyICNjb250ZW50X2xlZnQ+LmMtY29udGFpbmVyW3RwbD0nc29mdCddIC5vcC1zb2Z0LXRpdGxlIGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0Pi5jLWNvbnRhaW5lclt0cGw9J3NvZnQnXSAub3Atc29mdC10aXRsZSBhIGVtLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdD4uYy1jb250YWluZXIgaDMgYSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdCBoMyBhIGVtLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wIGgzIGEgZW0gew0KICAgIGNvbG9yOiAjMzQ3NmQyOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3Atc29mdC10aXRsZSBhLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0IGgzIGEsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3AgaDMgYSB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3Atc29mdC10aXRsZSBhOmhvdmVyOmFmdGVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0IGgzIGE6aG92ZXI6YWZ0ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3AgaDMgYTpob3ZlcjphZnRlciB7DQogICAgbGVmdDogMDsNCiAgICB3aWR0aDogMTAwJTsNCiAgICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQp9DQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5vcC1zb2Z0LXRpdGxlIGE6YWZ0ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQgaDMgYTphZnRlciwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdC1vcCBoMyBhOmFmdGVyIHsNCiAgICBjb250ZW50OiAiIjsNCiAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzNDc2ZDI7DQogICAgYm90dG9tOiAtMnB4Ow0KICAgIGxlZnQ6IDEwMCU7DQogICAgd2lkdGg6IDA7DQogICAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zLCBsZWZ0IDM1MG1zOw0KICAgIHRyYW5zaXRpb246IHdpZHRoIDM1MG1zLCBsZWZ0IDM1MG1zOw0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0IGgzLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wIGgzLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdD4uYy1jb250YWluZXIgaDN7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1zaXplOiBtZWRpdW07DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wLXNvZnQtdGl0bGUgYSAjY29udGVudF9sZWZ0IC5yZXN1bHQgaDMgYSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wLXNvZnQtdGl0bGUgYSAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3AgaDMgYSB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3Atc29mdC10aXRsZSBhOnZpc2l0ZWQsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5vcC1zb2Z0LXRpdGxlIGE6dmlzaXRlZCBlbSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdCBoMyBhOnZpc2l0ZWQsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQgaDMgYTp2aXNpdGVkIGVtIHsNCiAgICBjb2xvcjogIzY2MDA5OTsNCn0NCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLm9wLXNvZnQtdGl0bGUgYTp2aXNpdGVkOmhvdmVyOmFmdGVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0IGgzIGE6dmlzaXRlZDpob3ZlcjphZnRlciwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdC1vcCBoMyBhOnZpc2l0ZWQ6aG92ZXI6YWZ0ZXIgew0KICAgIGxlZnQ6IDA7DQogICAgd2lkdGg6IDEwMCU7DQogICAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAgIHRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAub3Atc29mdC10aXRsZSBhOnZpc2l0ZWQ6YWZ0ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQgaDMgYTp2aXNpdGVkOmFmdGVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wIGgzIGE6dmlzaXRlZDphZnRlciB7DQogICAgY29udGVudDogIiI7DQogICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNjYwMDk5Ow0KICAgIGJvdHRvbTogLTJweDsNCiAgICBsZWZ0OiAxMDAlOw0KICAgIHdpZHRoOiAwOw0KICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQogICAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCn0NCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtZ3JvdXAtd3JhcHBlcnsNCiAgICBwYWRkaW5nOiAzMHB4Ow0KICAgIG1hcmdpbjogMCAwIDIwcHggMDsNCn0NCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtZ3JvdXAtd3JhcHBlciAuYy1ncm91cHsNCiAgICBtYXJnaW46IDA7DQogICAgcGFkZGluZy10b3A6IDEwcHg7DQp9DQojd3JhcHBlciAjcnN7DQogICAgcGFkZGluZzogdW5zZXQ7DQogICAgbWFyZ2luOiAyMHB4Ow0KICAgIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgICB6LWluZGV4OiAxOw0KfQ0KI3dyYXBwZXIgI3JzIC5uZXctcG1kew0KICAgIHBhZGRpbmc6IDIwcHg7DQp9DQoud3JhcHBlcl9uZXcgI2Zvcm0gLmJkc3VnLW5ld3sNCiAgICBwYWRkaW5nLXJpZ2h0OiAxMXB4Ow0KfQ0KI3dyYXBwZXIgI3JzIC50dCB7DQogICAgbWFyZ2luOiAtMjBweCAtMjBweCA1cHggLTIwcHg7DQogICAgcGFkZGluZzogMTVweCAyMHB4Ow0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4Ow0KfQ0KI3dyYXBwZXIgI3JzIHRhYmxlIHsNCiAgICB3aWR0aDogNjMwcHg7DQogICAgcGFkZGluZzogNXB4IDE1cHg7DQp9DQojd3JhcHBlciAjcnMgdGFibGUgdHIgYSB7DQogICAgbWFyZ2luLXRvcDogNXB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDVweDsNCiAgICBjb2xvcjogIzM0NzZkMjsNCn0NCiN3cmFwcGVyICNycyB0YWJsZSB0ciBhOmhvdmVyIHsNCiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCn0NCiN3cmFwcGVyICNwYWdlIHsNCiAgICBtaW4td2lkdGg6IDcxMHB4Ow0KICAgIGhlaWdodDogNDBweDsNCiAgICBsaW5lLWhlaWdodDogNDBweDsNCiAgICBwYWRkaW5nLXRvcDogNXB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDUwcHg7DQogICAgbWFyZ2luLWxlZnQ6IDBweDsNCn0NCi5vcC1pbWctYWRkcmVzcy1kZXNrdG9wLWNvbnR7DQogICAgb3ZlcmZsb3c6IGhpZGRlbjsNCn0NCiN3cmFwcGVyICNwYWdlIGEsDQojd3JhcHBlciAjcGFnZSBzdHJvbmcgew0KICAgIGNvbG9yOiMzNDc2ZDI7DQogICAgaGVpZ2h0OiBhdXRvOw0KfQ0KI3dyYXBwZXIgI3BhZ2UgLm57DQogICAgaGVpZ2h0OiAzNHB4Ow0KfQ0KI3dyYXBwZXIgI3BhZ2UgLm46aG92ZXIsDQojd3JhcHBlciAjcGFnZSBhOmhvdmVyIC5wYyB7DQogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7DQogICAgYmFja2dyb3VuZDogI2Q4ZDhkODsNCiAgICBjb2xvcjogIzAwNTdkYTsNCn0NCiN3cmFwcGVyICNwYWdlIHN0cm9uZyAucGMgew0KICAgIGJhY2tncm91bmQ6ICMzNDc2ZDI7DQogICAgY29sb3I6IHdoaXRlOw0KfQ0KLm9wLWltZy1hZGRyZXNzLWRpdmlkZS1oaWdoew0KICAgIG92ZXJmbG93OiBoaWRkZW47DQp9DQojd3JhcHBlciAja3d7DQogICAgd2lkdGg6IDk0JTsNCn0NCiNjb250YWluZXIuc2FtX25ld2dyaWQgLmMtY29udGFpbmVyIC50IC5BQy1mYXZpY29uVH5hLCAjY29udGFpbmVyLnNhbV9uZXdncmlkIC5jLWNvbnRhaW5lciAudCAuYy1pY29ufmF7DQogICAgZGlzcGxheTppbmxpbmUNCn0NCmJvZHkgI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCBhW2hyZWYqPSdvZmZpY2lhbCddIHsNCiAgICBjb2xvcjogd2hpdGU7DQp9DQojY29udGVudF9sZWZ0IC5jLWdyb3VwLW1pZGRsZSwjY29udGVudF9sZWZ0ICAuYy1ncm91cC10b3B7DQogICAgbWFyZ2luLWJvdHRvbTogMzBweCAhaW1wb3J0YW50Ow0KfQ0KQC13ZWJraXQta2V5ZnJhbWVzIGFuaV9ib3R0b21Ub3RvcCB7DQogICAgMCUgew0KICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgzMnB4KTsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMjAlIHsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMzAlIHsNCiAgICAgICAgb3BhY2l0eTogMC44Ow0KICAgIH0NCiAgICAxMDAlIHsNCiAgICAgICAgb3BhY2l0eTogMTsNCiAgICB9DQp9DQpALXdlYmtpdC1rZXlmcmFtZXMgYW5pX2xlZnRUb3JpZ2h0IHsNCiAgICAwJSB7DQogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMnB4KTsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMjAlIHsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMzAlIHsNCiAgICAgICAgb3BhY2l0eTogMC44Ow0KICAgIH0NCiAgICAxMDAlIHsNCiAgICAgICAgb3BhY2l0eTogMTsNCiAgICB9DQp9DQpALXdlYmtpdC1rZXlmcmFtZXMgYW5pX3RvcFRvYnV0dG9tIHsNCiAgICAwJSB7DQogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zMnB4KTsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMjAlIHsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMzAlIHsNCiAgICAgICAgb3BhY2l0eTogMC44Ow0KICAgIH0NCiAgICAxMDAlIHsNCiAgICAgICAgb3BhY2l0eTogMTsNCiAgICB9DQp9DQojY29udGFpbmVyLnNhbV9uZXdncmlkICNjb250ZW50X2xlZnQgLmMtY29udGFpbmVyIC5jLWNvbnRhaW5lcnsNCiAgICB3aWR0aDogYXV0bzsNCiAgICBtaW4td2lkdGg6IHVuc2V0Ow0KfQ0KLmMtY29udGFpbmVyIC5jLXJlc3VsdC1jb250ZW50ew0KICAgIHBhZGRpbmctdG9wOiAyMHB4Ow0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAgLmMtY29udGFpbmVyIGFydGljbGV7DQogICAgcGFkZGluZy10b3A6IDE1cHg7DQogICAgYm9yZGVyOiB1bnNldCAhaW1wb3J0YW50Ow0KICAgIGJveC1zaGFkb3c6IHVuc2V0ICFpbXBvcnRhbnQ7DQp9DQpib2R5IC53cmFwcGVyX25ldyAjaGVhZC5maXgtaGVhZCAuc19mb3Jtew0KICAgIGhlaWdodDogNzBweDsNCn0NCi5BQy5zcC1zZXBhcmF0b3J7DQogICAgbWFyZ2luLXRvcDogLTEwcHg7DQogICAgd2lkdGg6IDY1MHB4Ow0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfcmlnaHR7DQogICAgZGlzcGxheTogbm9uZTsNCn0NCmJvZHkuc2hvd1JpZ2h0ICN3cmFwcGVyICNjb250ZW50X3JpZ2h0ew0KICAgIGRpc3BsYXk6IHVuc2V0Ow0KfQ0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuYy1jb250YWluZXJbdHBsPSdyZWNvbW1lbmRfbGlzdCddew0KICAgIHBhZGRpbmctdG9wOiAxMHB4Ow0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCn0NCiNjb250ZW50X2xlZnQgLmhpdC10b3B0aXB7DQogICAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7DQogICAgZ3JpZC1jb2x1bW4tZW5kOiB4bWFpbi1lbmQ7DQp9DQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjEyODBweCl7DQogICAgI3UgLnRvaW5kZXgsICN1ICNpbXNnew0KICAgICAgICBkaXNwbGF5OiBub25lOw0KICAgIH0NCn0NCkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDE5MjFweCl7DQogICAgLypCYWlkdSBpbiAySyBzY3JlZW4gZGVmYXVsdCBpbiA6IGNlbnRlciovDQogICAgI2hlYWQgLmhlYWRfd3JhcHBlcnsNCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTIwcHgsMCwxcHgpOw0KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICB9DQp9DQo="},{"meta":{"name":"baiduOnePageStyle.css","url":"http://ibaidu.tujidu.com/newcss/baiduOnePageStyle.css?t=24.26","ts":1637743679602,"mimetype":"text/css"},"source":"LyoqU3RvcmUgQmFpZHVPbmVQYWdlU3R5bGUqKi8NCiN3cmFwcGVyX3dyYXBwZXIgI2NvbnRhaW5lcnsNCiAgICB3aWR0aDogMTAwJTsNCiAgICBtYXJnaW4tbGVmdDogdW5zZXQ7DQp9DQpmb3JtLmZtew0KICAgIHBvc2l0aW9uOnJlbGF0aXZlOw0KICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0Ow0KfQ0KYm9keVtiYWlkdV0gLnBhZ2Vmb290Lmdqew0KICAgIG1hcmdpbi10b3A6IDEwMHB4Ow0KfQ0KLndyYXBwZXJfbmV3IC5oZWFkX3dyYXBwZXIgI3Jlc3VsdF9sb2dvew0KICAgIG1hcmdpbi1sZWZ0OiAtMTUwcHg7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KI3NfdGFiIGIsI3NfdGFiIGF7DQogICAgcG9zaXRpb246cmVsYXRpdmU7DQp9DQojd3JhcHBlciAgLmhlYWRfbnVtc19jb250X291dGVyew0KICAgIHBvc2l0aW9uOmFic29sdXRlOw0KICAgIGxlZnQ6IDIwJTsNCiAgICB3aWR0aDogNjAlOw0KfQ0KI3dyYXBwZXIgICNjb250ZW50X2xlZnQsI3dyYXBwZXIgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjcnMsICN3cmFwcGVyICNwYWdlew0KICAgIHRvcDogMzVweDsNCiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsNCiAgICBwYWRkaW5nLWxlZnQ6IDBweDsNCiAgICB3aWR0aDogNDAlICFpbXBvcnRhbnQ7DQogICAgbWluLXdpZHRoOiA2NzBweDsNCiAgICBmbG9hdDp1bnNldDsNCiAgICBtYXJnaW4tbGVmdDogdW5zZXQ7DQogICAgbWFyZ2luOiAwIGF1dG87DQp9DQoNCiN3cmFwcGVyICNwYWdlew0KICAgIGJhY2tncm91bmQ6IHVuc2V0Ow0KfQ0KI3dyYXBwZXIgI3JzIHRoew0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCiN3cmFwcGVyICNyc3sNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgbWFyZ2luOiAzMHB4IGF1dG8gLTIwcHggYXV0bzsNCn0NCiN3cmFwcGVyICAjY29udGVudF9sZWZ0IC5jLWNvbnRhaW5lcnsNCiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KICAgIG1pbi13aWR0aDo2NTBweDsNCn0NCkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMDBweCkgew0KICAgICN3cmFwcGVyICAjY29udGVudF9sZWZ0LCAjd3JhcHBlciAgI3Jzew0KICAgICAgICBtaW4td2lkdGg6ODAwcHg7DQogICAgfQ0KfQ0KI3dyYXBwZXIgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjY29udGVudF9sZWZ0ew0KICAgIHBhZGRpbmctbGVmdDogMjBweDsNCiAgICBkaXNwbGF5OiBibG9jazsNCn0NCiN3cmFwcGVyICNjb250ZW50X3JpZ2h0ew0KICAgIGZsb2F0OiB1bnNldDsNCiAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQp9DQpib2R5LnNob3dSaWdodCAjd3JhcHBlciAjY29udGFpbmVyLnNhbV9uZXdncmlkICNjb250ZW50X2xlZnR7DQogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNnZ3IC0gMjUxcHgpKTsNCn0NCmJvZHkuc2hvd1JpZ2h0ICN3cmFwcGVyICNjb250ZW50X3JpZ2h0ew0KICAgIHJpZ2h0OiBjYWxjKDM3LjV2dyAtIDQ3MHB4KTsNCn0NCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyODBweCl7DQogICAgYm9keS5zaG93UmlnaHQgI3dyYXBwZXIgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjY29udGVudF9sZWZ0ew0KICAgICAgICB0cmFuc2Zvcm06IHVuc2V0Ow0KICAgIH0NCiAgICBib2R5LnNob3dSaWdodCAjd3JhcHBlciAjY29udGVudF9yaWdodHsNCiAgICAgICAgZGlzcGxheTogbm9uZTsNCiAgICB9DQp9DQojd3JhcHBlciAjcGFnZSBhLCAjd3JhcHBlciAjcGFnZSBzdHJvbmd7DQogICAgbWFyZ2luLXJpZ2h0OiAyMnB4ICFpbXBvcnRhbnQ7DQp9DQojd3JhcHBlciAjcGFnZSAucGFnZS1pbm5lcnsNCiAgICBwYWRkaW5nLWxlZnQ6IDIycHg7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCn0NCi5zX3RhYl9pbm5lcnsNCiAgICBkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7DQp9DQojY29udGFpbmVyIC5oaW50X2NvbW1vbl9yZXN0b3B7DQogICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgIGxlZnQ6IGNhbGMoNDV2dyAtIDUwMHB4KTsNCiAgICBtYXJnaW4tdG9wOiAyNXB4Ow0KfQ0KLkFDLnNwLXNlcGFyYXRvcnsNCiAgICB3aWR0aDogYXV0bzsNCn0NCi8qc2VhcmNoIGVuZ2luZSBqdW1wKi8NCiNzZWotY29udGFpbmVyew0KICAgIHBhZGRpbmctbGVmdDogMDsNCiAgICBtYXJnaW4tbGVmdDogMDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQouc19mb3JtX3dyYXBwZXIgew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQp9DQojd3JhcHBlciAjc190YWJ7DQogICAgcGFkZGluZy1sZWZ0OiAwOw0KICAgIG1hcmdpbi1sZWZ0OiAwOw0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQp9DQojd3JhcHBlciAjY29udGFpbmVyIC5oZWFkX251bXNfY29udF9vdXRlciAuc2VhcmNoX3Rvb2xfY29udGVyLA0KI3dyYXBwZXIgI2NvbnRhaW5lciAuaGVhZF9udW1zX2NvbnRfb3V0ZXIgLm51bXMgew0KICAgIHdpZHRoOiA2OSU7DQogICAgbWFyZ2luLWxlZnQ6IDE2JTsNCn0NCmZvcm0uZm0gLnNfaXB0X3dyLmJnew0KICAgIG1pbi13aWR0aDogY2FsYygzNy41dncgLSAxNTBweCk7DQp9DQoNCi5yZXN1bHQtbW9sZWN1bGUubmV3LXBtZCB7DQogICAgbWFyZ2luOiAwIGF1dG87DQogICAgbWluLXdpZHRoOiA4MDBweDsNCiAgICB3aWR0aDogNDAlICFpbXBvcnRhbnQ7DQogICAgbWFyZ2luLXRvcDogNjBweDsNCiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7DQp9DQoNCi5uZXctcG1kICNyc19uZXcgew0KICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsNCiAgICBwYWRkaW5nOiAxMHB4IDAgMTBweCAyMHB4Ow0KfQ0KDQoubmV3LXBtZCAjcnNfbmV3IHRhYmxlew0KICAgIHdpZHRoOiAxMDAlOw0KICAgIG1hcmdpbi10b3A6IDEycHg7DQp9DQoNCkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDE5MjFweCkgew0KICAgICNoZWFkIC5oZWFkX3dyYXBwZXJ7DQogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTQwcHgsMCwxcHgpOw0KICAgIH0NCiAgICAud3JhcHBlcl9uZXcgI3NfdGFiLnNfdGFiIC5zX3RhYl9pbm5lciB7DQogICAgICAgIHdpZHRoOiA5MDBweDsNCiAgICAgICAgcGFkZGluZy1sZWZ0OiAyOTZweDsNCiAgICB9DQogICAgZm9ybS5mbSAuc19pcHRfd3IuYmd7DQogICAgICAgIG1pbi13aWR0aDogY2FsYygzNy41dncgLSAxNTBweCk7DQogICAgfQ0KICAgIC5oZWFkX3dyYXBwZXIgI3Ugew0KICAgICAgICByaWdodDogMjAwcHg7DQogICAgfQ0KfQ0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTM2NnB4KSBhbmQgKG1heC13aWR0aDogMTkyMHB4KSB7DQogICAgLndyYXBwZXJfbmV3IC5oZWFkX3dyYXBwZXIgI3Jlc3VsdF9sb2dvew0KICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ow0KICAgIH0NCn0="},{"meta":{"name":"baiduTwoPageStyle.css","url":"http://ibaidu.tujidu.com/newcss/baiduTwoPageStyle.css?t=24.26","ts":1637743679587,"mimetype":"text/css"},"source":"LyoqU3RvcmUgQmFpZHVUb3dQYWdlU3R5bGUqKi8NCiN3cmFwcGVyX3dyYXBwZXIgI2NvbnRhaW5lciB7DQogICAgd2lkdGg6IGF1dG87DQp9DQpmb3JtLmZtew0KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldDsNCn0NCiNzX3RhYiBiLCAjc190YWIgYSB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KI3dyYXBwZXIgI3NfdGFiew0KICAgIHBhZGRpbmctbGVmdDogMDsNCiAgICBtYXJnaW4tbGVmdDogMDsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KfQ0KI3dyYXBwZXIgLmhlYWRfbnVtc19jb250X291dGVyIC5zZWFyY2hfdG9vbF9jb250ZXIsDQojd3JhcHBlciAuaGVhZF9udW1zX2NvbnRfb3V0ZXIgLm51bXMgew0KICAgIHdpZHRoOiA4MCU7DQogICAgbWFyZ2luLWxlZnQ6IDEwJTsNCn0NCiN3cmFwcGVyICAuaGVhZF9udW1zX2NvbnRfb3V0ZXIsDQouaGludF9jb21tb25fcmVzdG9wLA0KI2hlYWRlcl90b3BfYmFyIHsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgbGVmdDogMTAlOw0KICAgIHdpZHRoOiA4MCU7DQp9DQojd3JhcHBlciAjaGVhZGVyX3RvcF9iYXJ7DQogICAgbWFyZ2luLWJvdHRvbTogMHB4Ow0KfQ0KYm9keSAjY29udGFpbmVyLnNhbV9uZXdncmlkICNjb250ZW50X2xlZnR7DQogICAgd2lkdGg6IDgwJTsNCn0NCiN3cmFwcGVyICNjb250ZW50X2xlZnR7DQogICAgZGlzcGxheTogaW5saW5lLWdyaWQ7DQogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlOw0KICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJ4bWFpbiB4bWFpbiI7DQogICAgbWFyZ2luOiAwIGF1dG87DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIHBhZGRpbmctbGVmdDogNSU7DQogICAgZmxvYXQ6IHVuc2V0Ow0KICAgIHdpZHRoOiA4MCU7DQogICAgbWFyZ2luLWxlZnQ6NyU7DQogICAgbWFyZ2luLWJvdHRvbTogMzBweDsNCn0NCmJvZHlbbmV3c10gI3dyYXBwZXIgI2NvbnRlbnRfbGVmdD5kaXY6bm90KFtjbGFzc10pOm5vdChbaWRdKXsNCiAgICBkaXNwbGF5OiBpbmxpbmUtZ3JpZDsNCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDUwJSA1MCU7DQogICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogInhtYWluIHhtYWluIjsNCn0NCiN3cmFwcGVyICNjb250ZW50X3JpZ2h0ew0KICAgIGRpc3BsYXk6bm9uZSAhaW1wb3J0YW50Ow0KfQ0KI3dyYXBwZXJfd3JhcHBlciAjY29udGFpbmVyICNyc3sNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgbWFyZ2luOiAwIGF1dG87DQp9DQojd3JhcHBlciAjcGFnZSB7DQogICAgbWluLXdpZHRoOiA3MTBweDsNCiAgICBoZWlnaHQ6IDQwcHg7DQogICAgbGluZS1oZWlnaHQ6IDQwcHg7DQogICAgcGFkZGluZzogNXB4IDEwcHg7DQogICAgbWFyZ2luOiAwIGF1dG87DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCn0NCiN3cmFwcGVyICNwYWdlIC5wYWdlLWlubmVyew0KICAgIHBhZGRpbmctbGVmdDogMDsNCn0NCiN3cmFwcGVyICAjY29udGVudF9sZWZ0IC5yZXN1bHQsDQojd3JhcHBlciAgI2NvbnRlbnRfbGVmdCAuYy1jb250YWluZXIgew0KICAgIHdpZHRoOiB1bnNldCAhaW1wb3J0YW50Ow0KICAgIG1heC13aWR0aDogMTAwJTsNCiAgICBtYXJnaW4tbGVmdDogNXB4Ow0KICAgIG1hcmdpbi1yaWdodDogMTVweDsNCn0NCg0KI3dyYXBwZXIgICNjb250ZW50X2xlZnQ+Kjpub3QoW2NsYXNzKj0ncmVzdWx0J10pOm5vdChbY2xhc3MqPSdjLWdyb3VwLXdyYXBwZXInXSl7DQoJZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7DQogICAgZ3JpZC1jb2x1bW4tZW5kOiB4bWFpbi1lbmQ7DQp9DQouYy1jb250YWluZXIgaDMgYXsNCiAgICB6LWluZGV4OjE7DQp9DQouQUMuc3Atc2VwYXJhdG9yew0KICAgIHdpZHRoOiBhdXRvOw0KfQ0KLypzZWFyY2ggZW5naW5lIGp1bXAqLw0KI3Nlai1jb250YWluZXJ7DQogICAgcGFkZGluZy1sZWZ0OiAwOw0KICAgIG1hcmdpbi1sZWZ0OiAwOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCi5zX2Zvcm1fd3JhcHBlciB7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgZGlzcGxheTogZmxleDsNCn0NCg0KLnJlc3VsdC1tb2xlY3VsZS5uZXctcG1kIHsNCiAgICBtYXJnaW46IDAgYXV0bzsNCiAgICBtaW4td2lkdGg6IDgwMHB4Ow0KICAgIHdpZHRoOiA0MCUgIWltcG9ydGFudDsNCiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7DQp9DQoNCi5uZXctcG1kICNyc19uZXcgew0KICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsNCiAgICBwYWRkaW5nOiAxMHB4IDAgMTBweCAyMHB4Ow0KfQ0KDQoubmV3LXBtZCAjcnNfbmV3IHRhYmxlew0KICAgIHdpZHRoOiAxMDAlOw0KICAgIG1hcmdpbi10b3A6IDEycHg7DQp9DQoNCiN3cmFwcGVyIC5oZWFkX251bXNfY29udF9vdXRlciAuc2VhcmNoX3Rvb2xfY29udGVyLA0KI3dyYXBwZXIgLmhlYWRfbnVtc19jb250X291dGVyIC5udW1zIHsNCiAgICB3aWR0aDogODAlOw0KfQ0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTUwMHB4KSB7DQogICAgZm9ybS5mbSAuc19pcHRfd3IuYmd7DQogICAgICAgIG1pbi13aWR0aDogNDUwcHgNCiAgICB9DQogICAgLndyYXBwZXJfbmV3IC5oZWFkX3dyYXBwZXIgI3Jlc3VsdF9sb2dvew0KICAgICAgICBtYXJnaW4tbGVmdDogLTE3MHB4Ow0KICAgIH0NCn0NCkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDE5MjFweCkgew0KICAgICNzX3RhYi5zX3RhYiAuc190YWJfaW5uZXIgew0KICAgICAgICB3aWR0aDogOTAwcHg7DQogICAgfQ0KICAgIGZvcm0uZm0gLnNfaXB0X3dyLmJnew0KICAgICAgICBtaW4td2lkdGg6IDkwMHB4DQogICAgfQ0KfQ=="},{"meta":{"name":"baiduLiteStyle.css","url":"http://ibaidu.tujidu.com/newcss/baiduLiteStyle.css?t=24.26","ts":1637743679614,"mimetype":"text/css"},"source":"LyoNCiEgVmVyc2lvbjogMjAxODA0MjcwMDANCiEgVGl0bGU6ICBiYWlkdS1saXRlWzIwMTgwNDI3MDAwXQ0KISBMYXN0IG1vZGlmaWVkOiAyMDE5LzA5LzA1DQohIEV4cGlyZXM6IDEgZGF5cyAodXBkYXRlIGZyZXF1ZW5jeSkNCg0KVGhpcyBzdHlsZSBpcyBmcm9tIHd3dy55aWNsZWFyLmNvbSwgYW5kIHRoYW5rcyB0aGUgYXV0aG9yIG9mIHRoZSBzaXRlLg0KKi8NCip7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSwiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSwiTmltYnVzIFNhbnMgTCIsQXJpYWwsIkxpYmVyYXRpb24gU2FucyIsIlBpbmdGYW5nIFNDIiwiSGlyYWdpbm8gU2FucyBHQiIsIlNvdXJjZSBIYW4gU2FucyBDTiIsIlNvdXJjZSBIYW4gU2FucyBTQyIsIk1pY3Jvc29mdCBZYUhlaSIsIldlbnF1YW55aSBNaWNybyBIZWkiLCJXZW5RdWFuWWkgWmVuIEhlaSIsIlNUIEhlaXRpIixTaW1IZWksIldlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIixzYW5zLXNlcmlmfQ0KOjotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDo2cHg7aGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApfQ0KOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfQ0KOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntib3JkZXItcmFkaXVzOjNweDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjIpO3RyYW5zaXRpb246YWxsIC40cyBlYXNlOy1tb3otdHJhbnNpdGlvbjphbGwgLjRzIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuNHMgZWFzZTstby10cmFuc2l0aW9uOmFsbCAuNHMgZWFzZX0NCjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40KTt0cmFuc2l0aW9uOmFsbCAuNHMgZWFzZTstbW96LXRyYW5zaXRpb246YWxsIC40cyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjRzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjRzIGVhc2V9DQouYW5pbWF0ZWR7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MXM7YW5pbWF0aW9uLWR1cmF0aW9uOjFzO2FuaW1hdGlvbi1maWxsLW1vZGU6Ym90aH0NCkAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5VcHtmcm9te29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19DQpAa2V5ZnJhbWVzIGZhZGVJblVwe2Zyb217b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0NCi5mYWRlSW5VcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblVwO2FuaW1hdGlvbi1uYW1lOmZhZGVJblVwfQ0KQC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluUmlnaHR7NjAlLDc1JSw5MCUsZnJvbSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX1mcm9te29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19DQpAa2V5ZnJhbWVzIGJvdW5jZUluUmlnaHR7NjAlLDc1JSw5MCUsZnJvbSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX1mcm9te29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19DQouYm91bmNlSW5SaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluUmlnaHQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5SaWdodH0NCkAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblVwezYwJSw3NSUsOTAlLGZyb20sdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9ZnJvbXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwzMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMzAwMHB4LDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfX0NCmF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWFyZ2luLWJvdHRvbToycHh9DQouYy1zaG93dXJsOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lO2JvcmRlcjpub25lO29wYWNpdHk6Ljg7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQoucmVzLWdhcC1yaWdodDE2OmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxLjJweCBzb2xpZH0NCi5jLXNob3d1cmx7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQouYy10aXAtYXJyb3c6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ym9yZGVyOm5vbmV9DQouYy1kZWZhdWx0IGF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ym9yZGVyOm5vbmV9DQouYy1nYXAtYm90dG9tIGE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0NCi5vcF9kaWN0M19tb3JlbGluayBhOmhvdmVye3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9DQouYy1idG46aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50fQ0KdGQgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfQ0KZW17dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50fQ0KI3Nfd3JhcHtkaXNwbGF5Om5vbmV9DQoucy10b3AtbmF2e2Rpc3BsYXk6bm9uZX0NCiNzX2N0bmVyX21lbnVze2Rpc3BsYXk6bm9uZX0NCiNzX21lbnVfZ3VyZHtkaXNwbGF5Om5vbmV9DQojc19zdHJweF9zcGFuMXtkaXNwbGF5Om5vbmV9DQojZnRDb257ZGlzcGxheTpub25lfQ0KI2JvdHRvbV9jb250YWluZXJ7ZGlzcGxheTpub25lfQ0KI2xne2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtoZWlnaHQ6NzBweDtwYWRkaW5nLXRvcDoxNTBweH0NCiNsZyBpbWd7ZGlzcGxheTpub25lfQ0KI2xnIGF7ZGlzcGxheTpub25lfQ0KI2hlYWRfd3JhcHBlcntwYWRkaW5nLWJvdHRvbTowfQ0KLnNfZm9ybV93cmFwcGVye21hcmdpbi10b3A6YXV0bztkaXNwbGF5OiBmbGV4O30NCiNzX2xnX2ltZywjc19sZ19pbWdfbmV3e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9DQojZm9ybSAuc19pcHRfd3J7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7YmFja2dyb3VuZC1wb3NpdGlvbjoxMDAlIWltcG9ydGFudDtoZWlnaHQ6MzlweDtmb250LWZhbWlseTotYXBwbGUtc3lzdGVtLCJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLCJOaW1idXMgU2FucyBMIixBcmlhbCwiTGliZXJhdGlvbiBTYW5zIiwiUGluZ0ZhbmcgU0MiLCJIaXJhZ2lubyBTYW5zIEdCIiwiU291cmNlIEhhbiBTYW5zIENOIiwiU291cmNlIEhhbiBTYW5zIFNDIiwiTWljcm9zb2Z0IFlhSGVpIiwiV2VucXVhbnlpIE1pY3JvIEhlaSIsIldlblF1YW5ZaSBaZW4gSGVpIiwiU1QgSGVpdGkiLFNpbUhlaSwiV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLHNhbnMtc2VyaWY7cGFkZGluZy10b3A6NHB4fQ0KLnNfaXB0e2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsIk5pbWJ1cyBTYW5zIEwiLEFyaWFsLCJMaWJlcmF0aW9uIFNhbnMiLCJQaW5nRmFuZyBTQyIsIkhpcmFnaW5vIFNhbnMgR0IiLCJTb3VyY2UgSGFuIFNhbnMgQ04iLCJTb3VyY2UgSGFuIFNhbnMgU0MiLCJNaWNyb3NvZnQgWWFIZWkiLCJXZW5xdWFueWkgTWljcm8gSGVpIiwiV2VuUXVhbllpIFplbiBIZWkiLCJTVCBIZWl0aSIsU2ltSGVpLCJXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsc2Fucy1zZXJpZn0NCiNmb3JtIC5zX2lwdF93cjpob3Zlcntib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjJweDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5pcHRob3Zlcnt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5pcHRmb2N1c3tib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpfQ0KYm9keSAjZm9ybSAuc19idG57d2lkdGg6MzJweDtoZWlnaHQ6MzJweDtib3JkZXItcmFkaXVzOjUwJTtmb250LXNpemU6MDtib3JkZXI6bm9uZTtib3gtc2hhZG93Om5vbmU7bWFyZ2luLWxlZnQ6MDt6LWluZGV4OjEwMDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczttYXJnaW4tdG9wOjA7b3BhY2l0eTowfQ0KYm9keSAjZm9ybSAuc19idG46aG92ZXJ7b3BhY2l0eTouNTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Ym9yZGVyOm5vbmU7Ym94LXNoYWRvdzpub25lO3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQ0KYm9keSAjZm9ybSAuc19idG5fd3J7d2lkdGg6MzJweDtoZWlnaHQ6MzJweDtib3JkZXItcmFkaXVzOjUwJTtmb250LXNpemU6MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCk7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7Ym9yZGVyOm5vbmU7Ym94LXNoYWRvdzpub25lO21hcmdpbi1sZWZ0OjVweDt6LWluZGV4OjEwMDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczttYXJnaW4tdG9wOjZweH0NCmJvZHkgI2Zvcm0gLnNfYnRuX3dyOmhvdmVye29wYWNpdHk6LjU7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDApO2JvcmRlcjpub25lO2JveC1zaGFkb3c6bm9uZTt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5idG5ob3ZlcntvcGFjaXR5Oi41O2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKSFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZTt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5oaW50X3RvcHJxX3RpcHN7bWFyZ2luLWJvdHRvbToxMnB4fQ0KLnNfZm9ybXtoZWlnaHQ6NzVweDtwYWRkaW5nLXRvcDoxMHB4fQ0KI3NfdGFie3BhZGRpbmc6ODdweCAwIDAgMTIxcHg7fQ0KI2hlYWQuc19kb3due2JveC1zaGFkb3c6MCAwIDVweCAjNjY2O3BhZGRpbmctYm90dG9tOiA4cHg7fQ0KLmJkc3Vne3RvcDo0MnB4O2JveC1zaGFkb3c6MCAycHggNXB4IDAgcmdiYSgwLDAsMCwuMTYpLDAgMnB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czowIDAgMnB4IDJweDtmb250LWZhbWlseTotYXBwbGUtc3lzdGVtLCJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLCJOaW1idXMgU2FucyBMIixBcmlhbCwiTGliZXJhdGlvbiBTYW5zIiwiUGluZ0ZhbmcgU0MiLCJIaXJhZ2lubyBTYW5zIEdCIiwiU291cmNlIEhhbiBTYW5zIENOIiwiU291cmNlIEhhbiBTYW5zIFNDIiwiTWljcm9zb2Z0IFlhSGVpIiwiV2VucXVhbnlpIE1pY3JvIEhlaSIsIldlblF1YW5ZaSBaZW4gSGVpIiwiU1QgSGVpdGkiLFNpbUhlaSwiV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLHNhbnMtc2VyaWY7fQ0KLmJnc3VnIGxpe2ZvbnQtZmFtaWx5OkhlbHZldGljYSwiTWljcm9zb2Z0IFlhaGVpIFVJIiFpbXBvcnRhbnQ7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MzZweCFpbXBvcnRhbnR9DQouYmdzdWcgdWwgbGl7bGluZS1oZWlnaHQ6MzJweCFpbXBvcnRhbnR9DQouYmRzdWctb3ZlcmZsb3d7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLCJNaWNyb3NvZnQgWWFoZWkgVUkiIWltcG9ydGFudDt3aWR0aDo1ODNweCFpbXBvcnRhbnR9DQojcXVpY2tkZWxldGV7dG9wOjVweCFpbXBvcnRhbnQ7b3BhY2l0eTouNX0NCiNrd190aXB7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLCJNaWNyb3NvZnQgWWFoZWkgVUkgTGlnaHQifQ0KI3Jlc3VsdF9sb2dve2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTVRBeElETXpJaUJ6ZEhsc1pUMGlaVzVoWW14bExXSmhZMnRuY205MWJtUTZibVYzSURBZ01DQXhNREVnTXpNN0lpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJajRLUEhOMGVXeGxJSFI1Y0dVOUluUmxlSFF2WTNOeklqNEtDUzV6ZERCN1ptbHNiRG9qTkRnM09VSkVPMzBLQ1M1emRERjdabWxzYkRvalJFUTBORE0yTzMwS0NTNXpkREo3Wm1sc2JEb2pSa1pHUmtaR08zMEtQQzl6ZEhsc1pUNEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRVd0xqUXNNVFV1TTJNdE15NDRMREF1TXkwMExESXVOaTAxTGpjc05DNDNZeTB4TGpnc01pNHlMVFV1TlN3MExqRXROaXcyTGpkakxUQXVOaXd6TGpNc01TNHpMRFV1TVN3ekxEVXVOMk14TGprc01DNDJMRFl1TWkwd0xqVXNPQzQwTFRBdU5XZ3dMaklLQ1dnd0xqSmpNaTR5TERBc05pNDBMREV1TVN3NExqUXNNQzQxWXpFdU9DMHdMallzTXk0MUxUTXVNaXd6TFRVdU4yTXRNQzQwTFRJdU1TMDBMalF0TkM0MUxUWXVNaTAyTGpkRE5UUXVNaXd4T0N3MU5DNHpMREUxTGpZc05UQXVOQ3d4TlM0emVpQk5NemNzTVRRdU9Bb0pZekFzTWk0MExERXVOaXcwTGpNc015NDBMRFF1TTJNeExqa3NNQ3d6TGpRdE1TNDVMRE11TkMwMExqTmpNQzB5TGpRdE1TNDJMVFF1TXkwekxqUXROQzR6VXpNM0xERXlMalVzTXpjc01UUXVPSG9nVFRRekxqa3NPQzQyWXpBc01pNDFMREV1TlN3MExqVXNNeTR6TERRdU5Rb0pZekV1T0N3d0xETXVNeTB5TGpFc015NHpMVFF1TlZNME9TdzBMakVzTkRjdU1TdzBMakZETkRVdU15dzBMRFF6TGprc05pdzBNeTQ1TERndU5ub2dUVFV5TGpJc09DNDFZekFzTWk0ekxERXVOQ3cwTGpNc015NHlMRFF1TTNNekxqSXRNUzQ1TERNdU1pMDBMak56TFRFdU5DMDBMak10TXk0eUxUUXVNd29KVXpVeUxqSXNOaTR5TERVeUxqSXNPQzQxZWlCTk5UY3VOU3d4TlM0NVl6QXNNaTR6TERFdU5TdzBMak1zTXk0ekxEUXVNMk14TGpnc01Dd3pMak10TVM0NUxETXVNeTAwTGpOekxURXVOUzAwTGpNdE15NHpMVFF1TTBNMU9DNDVMREV4TGpZc05UY3VOU3d4TXk0MkxEVTNMalVzTVRVdU9Yb2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNU0lnWkQwaVRUUXNNekF1TkhZdE5TNHhhRFl1TkdNeExqWXNNQ3d4TGpZc01DNHpMREV1Tml3eWRqRXVOR013TERFdU5pMHlMak1zTVM0NExUTXVPU3d4TGpoTU5Dd3pNQzQwVERRc016QXVOSG9nVFRRc01qTjJMVFF1T0dnMExqRUtDV014TGpZc01Dd3pMamtzTUN3ekxqa3NNaTR4ZGpBdU1XTXdMREV1TkMwd0xqVXNNaTQyTFRFdU9Dd3lMalpETVRBdU15d3lNeXcwTERJekxEUXNNak42SUUweExqY3NNVFoyTVRZdU0yZzJMalJqTXl3d0xEWXVNaXd3TERZdU1pMHpMaloyTFRFdU1XTXdMVEV1Tmkwd0xqRXRNaTQzTFRFdU1TMHpMalVLQ1dNeExUQXVPQ3d4TGpFdE1pNHpMREV1TVMwekxqWnNNQ3d3WXpBdE5DNDFMVE11TWkwMExqVXROaTR5TFRRdU5Vd3hMamNzTVRaTU1TNDNMREUyZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNReElpQmtQU0pOTWpVc01qZ3VPV010TVM0eExERXVNUzB6TGpNc01TNHpMVE11TlN3eExqTmpMVEV1TXl3d0xUSXVOeTB3TGpVdE1pNDNMVEl1TVdNd0xURXVOQ3d3TGpVdE1pNHpMREl1TVMweUxqTmpNUzR6TERBc01pNDRMREF1TVN3MExqRXNNQzQyVmpJNExqbDZDZ2tnVFRJeExqUXNNekl1TTJNd0xqUXNNQ3d5TGpNdE1DNHhMRE11Tnkwd0xqbHNNQzR5TERBdU4yZ3lMakYyTFRndU9XTXdMVE11TmkweUxqTXROUzAxTGpjdE5XTXRNUzQ0TERBdE5DNHpMREF1TnkwMExqY3NNQzQ1YkRBdU5Dd3lMak5qTVM0MkxUQXVOaXd6TFRBdU5pdzBMakl0TUM0MkNnbGpNUzQ0TERBc015NHpMREF1Tml3ekxqTXNNaTQyVmpJMFl5MHhMVEF1TkMweUxqUXRNQzQyTFRRdU1TMHdMalpqTFRNc01DMDBMalVzTVM0MkxUUXVOU3cwTGpkRE1UWXVOQ3d6TVM0NExERTVMallzTXpJdU15d3lNUzQwTERNeUxqTjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREVpSUdROUlrMHpNQzR5TERFMkxqRmpNQ3d3TGpZc01DNDJMREV1TWl3eExqTXNNUzR5WXpBdU9Dd3dMREV1TXkwd0xqWXNNUzR6TFRFdU1tTXdMVEF1Tnkwd0xqWXRNUzR6TFRFdU15MHhMak5ETXpBdU9Dd3hOQzQ0TERNd0xqSXNNVFV1TXl3ek1DNHlMREUyTGpGNkNna2dUVE13TGpNc016SXVNV2d5TGpSV01UZ3VOV2d0TWk0MFZqTXlMakY2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERFaUlHUTlJazAzTVM0eUxESXlMakZvT0M0MFl6QXVOQ3d3TGpFc01DNDJMREF1TXl3d0xqWXNNQzQzZGpJdU5tZ3RPUzQzZGkweUxqWkROekF1Tml3eU1pNDBMRGN3TGpnc01qSXVNaXczTVM0eUxESXlMakY2SUUwM01TNHlMRE13TGpVS0NXTXRNQzQwTERBdE1DNDJMVEF1TXkwd0xqY3RNQzQ0ZGkweUxqWm9PUzQzZGpJdU5tTXdMREF1TkMwd0xqSXNNQzQzTFRBdU5pd3dMamRJTnpFdU1ub2dUVGN6TGpZc01UaGpMVEF1TVN3d0xqUXRNQzR4TERBdU9TMHdMalFzTVM0M1l5MHdMakVzTUM0ekxUQXVNU3d3TGpVdE1DNHhMREF1TndvSmFDMHlMalpqTFRFdU15d3dMakV0TVM0NUxEQXVPQzB5TERKMk55NDVZekF1TVN3eExqRXNNQzQ0TERFdU9Dd3lMREV1T1dneE1HTXhMakl0TUM0eExERXVPQzB3TGpjc01TNDVMVEV1T0hZdE55NDVZeTB3TGpFdE1TNHpMVEF1TnkweExqa3RNUzQ1TFRJdU1XZ3ROUW9KWXpBdU1TMHdMak1zTUM0eExUQXVPQ3d3TGpNdE1TNDBZekF1TVMwd0xqUXNNQzR4TFRBdU55d3dMakV0TUM0NWFEY3VNbll0TVM0NFNEWTNMalJXTVRoTU56TXVOaXd4T0V3M015NDJMREU0ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNReElpQmtQU0pOT1RNdU55d3lNaTQzWXkwd0xqUXRNQzR4TFRBdU5TMHdMakl0TUM0MUxUQXVOWFl0TUM0MmFETXVNbll3TGpaakxUQXVNU3d3TGpNdE1DNHlMREF1TkMwd0xqVXNNQzQxU0RrekxqZDZJRTA1Tmk0MkxESTBMakVLQ1dNeExqRXRNQzR4TERFdU5pMHdMalVzTVM0MkxURXVOSFl0TVdneUxqTjJMVEV1TldndE1pNHpkaTB4TGpGb0xURXVPSFl4TGpGb0xUTXVNbll0TVM0eGFDMHhMamgyTVM0eGFDMHlMak4yTVM0MWFESXVNM1l4WXpBdU1Td3dMamtzTUM0MkxERXVOQ3d4TGpZc01TNDBTRGsyTGpaNkNna2dUVGswTGpnc016QXVOR014TGpZc01DNDRMRE11TkN3eExqTXNOUzQwTERFdU9Hd3dMamt0TVM0M1l5MHhMalF0TUM0eUxUSXVPUzB3TGpZdE5DNDBMVEV1TVdNeExqRXRNQzQ0TERJdE1TNDJMREl1TnkweUxqVmpNQzR6TFRBdU5Dd3dMalF0TUM0NUxEQXVNaTB4TGpNS0NXTXRNQzR6TFRBdU5pMHdMamd0TUM0NUxURXVOQzB3TGpsb0xUbDJNUzQxYURjdU4yTXdMaklzTUN3d0xqUXNNQzR4TERBdU5Dd3dMakZ6TUN3d0xqRXRNQzR4TERBdU0yTXRNQzQyTERBdU5pMHhMalFzTVM0ekxUSXVNeXd4TGpoakxURXVNaTB3TGpjdE1pNHhMVEV1TXkweUxqUXRNUzQ0YUMweUxqSUtDV013TGprc01Td3hMamdzTVM0NUxESXVPU3d5TGpkakxURXVOaXd3TGpZdE15NHpMREV1TVMwMExqa3NNUzR6YkRBdU9Td3hMalpET1RFdU15d3pNUzQ0TERrekxqSXNNekV1TVN3NU5DNDRMRE13TGpSNklFMDRPQzR6TERJMUxqSjJMVFpqTUM0eExUQXVOaXd3TGpNdE1DNDVMREF1T0Mwd0xqa0tDV2d4TVM0NGRpMHhMalpJT1RWakxUQXVNUzB3TGpFdE1pNHlMVEF1TVMweUxqSXNNR2d0TkM0M1l5MHhMakVzTUM0eExURXVOeXd3TGprdE1TNDRMREl1TWxZeU5XTXdMakVzTWk0eExUQXVOQ3cwTGpRdE1TNHhMRFl1TjJ3eExqa3NNQzQyQ2dsRE9EY3VPU3d5T1M0NUxEZzRMak1zTWpjdU5pdzRPQzR6TERJMUxqSjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkRElpSUdROUlrMDBOaTR6TERJMExqSmpNQzQyTERBc01TNHlMREF1TVN3eExqY3NNQzQwZGpNdU5HTXdMREF1TXkwd0xqWXNNUzB4TGprc01XTXRNUzQxTERBdE1TNDRMVEF1TmkweExqZ3RNaTR4ZGkwd0xqWUtDVU0wTkM0eUxESTBMamdzTkRRdU55d3lOQzR5TERRMkxqTXNNalF1TW5vZ1RUUTVMaklzTWpBdU4wZzBPSFl5TGpWRE5EY3VOaXd5TXk0eExEUTNMREl6TERRMkxqTXNNak5qTFRJdU55d3dMVE11TXl3eExUTXVNeXd6TGpWMk1DNHpZekFzTWk0MExEQXVPU3d6TGpNc015NHlMRE11TXdvSll6QXVPQ3d3TERFdU15MHdMakVzTVM0NExUQXVOV3d3TGpFc01DNDJhREV1TVV3ME9TNHlMREl3TGpkTU5Ea3VNaXd5TUM0M2VpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXlJaUJrUFNKTk5UWXVOeXd5TTJndE1TNHlkalV1TW1NdE1DNDJMREF1TkMweExqY3NNQzQyTFRJdU5Dd3dMalpqTFRBdU9Dd3dMVEV0TUM0MExURXRNUzR6ZGkwMExqWm9MVEV1TVhZMExqaGpNQ3d4TGpZc01DNDFMREl1TXl3eUxqRXNNaTR6Q2dsak1Td3dMREl1TVMwd0xqTXNNaTQyTFRBdU5td3dMakVzTUM0MmFERXVNVll5TTNvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1TSWdaRDBpVFRreUxqY3NNVFV1TjJNd0xUQXVOeXd3TGpZdE1TNHpMREV1TWkweExqTmpNQzQyTERBc01TNHlMREF1Tml3eExqSXNNUzR6VXprMExqVXNNVGNzT1RNdU9Td3hOME01TXk0ekxERTJMamtzT1RJdU55d3hOaTR6TERreUxqY3NNVFV1TjNvaUx6NEtQQzl6ZG1jK0NnPT0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7d2lkdGg6MTAxcHg7aGVpZ2h0OjMzcHg7bWFyZ2luLXRvcDo5cHh9DQojcmVzdWx0X2xvZ28gaW1ne2Rpc3BsYXk6bm9uZTt2aXNpYmlsaXR5OmhpZGRlbn0NCiNyZXN1bHRfbG9nbyBhIGltZ3tkaXNwbGF5Om5vbmU7dmlzaWJpbGl0eTpoaWRkZW59DQouYy1jb250YWluZXJ7bGluZS1oZWlnaHQ6MS42NX0NCiNyc3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCkhaW1wb3J0YW50fQ0KLmMtYm9yZGVyey13ZWJraXQtYm94LXNoYWRvdzowIDJweCA1cHggMCByZ2JhKDAsMCwwLC4xNiksMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yYWRpdXM6MnB4O2JvcmRlcjpub25lO3BhZGRpbmc6MjBweDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5jLWJvcmRlcjpob3Zlcntib3gtc2hhZG93OjAgM3B4IDEwcHggcmdiYSgwLDAsMCwuMTYpLDAgM3B4IDEwcHggcmdiYSgwLDAsMCwuMjMpO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5jLXRhYnMtbmF2e2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MnB4IDJweCAwIDA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQ0KLmMtdGFicy1uYXYtbW92ZXRvcHttYXJnaW4tbGVmdDotMjBweDttYXJnaW4tcmlnaHQ6LTIwcHg7bWFyZ2luLXRvcDotMjBweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQouYy10YWJzLW5hdi1zZWxlY3RlZHtib3JkZXItdG9wOm5vbmUhaW1wb3J0YW50O2JvcmRlci1sZWZ0Om5vbmUhaW1wb3J0YW50O2JvcmRlci1yaWdodDpub25lIWltcG9ydGFudDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQouYy10YWJzLW5hdi1zZXB7ZGlzcGxheTpub25lIWltcG9ydGFudH0NCiNwYWdlIGF7aGVpZ2h0OjM0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQojcGFnZSBhOmhvdmVye3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCiNwYWdlIGEgLnBjOmhvdmVye3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCiNwYWdlIHN0cm9uZ3toZWlnaHQ6MzRweDtib3JkZXItcmFkaXVzOjJweDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LTJweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQojcGFnZSBzdHJvbmcgLnBje2xpbmUtaGVpZ2h0OjM0cHg7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQ0KLmZre2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9DQoucGN7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2hlaWdodDozNXB4O3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5wYzpob3Zlcnt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQojc190YWIgYXt3aWR0aDo1OXB4O2xpbmUtaGVpZ2h0OjQ0cHh9DQojc190YWIgYnt3aWR0aDo1OXB4O2xpbmUtaGVpZ2h0OjQ0cHh9DQojc190YWJ7cGFkZGluZy1ib3R0b206OHB4O3BhZGRpbmctdG9wOjg5cHh9DQouYy1pY29uLXRpZWJhe2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcn0NCi50b2luZGV4e2Rpc3BsYXk6bm9uZX0NCi53cmFwcGVyX25ldyAuc190YWJfaW5uZXJ7cGFkZGluZy10b3A6IDEwcHg7fQ0KLndyYXBwZXJfbmV3IC5zX2lwdF93cntiYWNrZ3JvdW5kOiAjZmZmZmZmO30NCi53cmFwcGVyX25ldy53cmFwcGVyX3MgI2Zvcm0gLmJkc3VnLW5ld3t3aWR0aDogOTMlO30NCiN1IC5wZntiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7Zm9udC1zaXplOjA7cGFkZGluZzoxNHB4O29wYWNpdHk6Ljg7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlO3BhZGRpbmctdG9wOjE4cHg7cGFkZGluZy1ib3R0b206MTBweDt9DQojdSAucGY6aG92ZXJ7b3BhY2l0eToxOyAtbW96LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjNzIGVhc2V9DQoud3JhcHBlcl9uZXcgI3U+YS5wZntjb2xvcjpyZ2JhKDAsMCwwLDApOyBtYXJnaW46IDRweCAwIDAgMjRweDt9DQoud3JhcHBlcl9uZXcgI3U+YS5wZjpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLDApfQ0KLnBmIC5jLWljb257ZGlzcGxheTpub25lIWltcG9ydGFudH0NCi5jLWljb24tdHJpYW5nbGUtZG93bntkaXNwbGF5Om5vbmV9DQouYmRwZm1lbnV7Ym94LXNoYWRvdzowIDJweCA1cHggMCByZ2JhKDAsMCwwLC4xNiksMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmFkaXVzOjJweCFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmU7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7bWFyZ2luLWxlZnQ6LTEwcHg7bWFyZ2luLXRvcDozMHB4O3otaW5kZXg6ODg4OCFpbXBvcnRhbnR9DQouYmRwZm1lbnUgYTpob3Zlcnt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5iZG51YXJyb3d7ZGlzcGxheTpub25lIWltcG9ydGFudH0NCi5zZXRwcmVme2JvcmRlci1yYWRpdXM6MnB4IDJweCAwIDA7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQouc2V0cHJlZjpob3Zlcnt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCiN1IC5sYntwYWRkaW5nOjIzcHg7Ym9yZGVyLXJhZGl1czo1MHB4O2ZvbnQtc2l6ZTowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjUwcHg7dG9wOjM4MDAlO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHg7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQojdSAubGI6aG92ZXJ7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQojdSAubGI6YWN0aXZle2JveC1zaGFkb3c6MCAxMHB4IDMwcHggcmdiYSgwLDAsMCwuMTkpLDAgNnB4IDEwcHggcmdiYSgwLDAsMCwuMjMpO3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQ0KLnRhbmctZm9yZWdyb3VuZHtib3JkZXItcmFkaXVzOjJweDtib3gtc2hhZG93OjAgMTlweCA2MHB4IHJnYmEoMCwwLDAsLjMpLDAgMTVweCAyMHB4IHJnYmEoMCwwLDAsLjIyKX0NCiNzX3VwZnVuY19tZW51c3tkaXNwbGF5Om5vbmV9DQojYmd7YmFja2dyb3VuZC1jb2xvcjojRkZGRkZGIWltcG9ydGFudDtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjNweDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwcztiYWNrZ3JvdW5kLXBvc2l0aW9uOjEwMCUhaW1wb3J0YW50O3otaW5kZXg6LTE7d2lkdGg6NjAwcHg7aGVpZ2h0OjM5cHg7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSwiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSwiTmltYnVzIFNhbnMgTCIsQXJpYWwsIkxpYmVyYXRpb24gU2FucyIsIlBpbmdGYW5nIFNDIiwiSGlyYWdpbm8gU2FucyBHQiIsIlNvdXJjZSBIYW4gU2FucyBDTiIsIlNvdXJjZSBIYW4gU2FucyBTQyIsIk1pY3Jvc29mdCBZYUhlaSIsIldlbnF1YW55aSBNaWNybyBIZWkiLCJXZW5RdWFuWWkgWmVuIEhlaSIsIlNUIEhlaXRpIixTaW1IZWksIldlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIixzYW5zLXNlcmlmO3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnR9DQojaGVhZF93cmFwcGVyIC5zX2lwdHtib3JkZXI6MCFpbXBvcnRhbnQ7aGVpZ2h0OjIwcHghaW1wb3J0YW50O2JvcmRlci1yYWRpdXM6MnB4O3dpZHRoOjU4NnB4IWltcG9ydGFudH0NCiNoZWFkX3dyYXBwZXIgLm5vYmdfc19mbV9ob3Zlcntib3JkZXI6MCFpbXBvcnRhbnR9DQojaGVhZF93cmFwcGVyIC5ub2JnX3NfZm1fZm9jdXN7Ym9yZGVyOjAhaW1wb3J0YW50O2JvcmRlci10b3A6MCBzb2xpZCAjZmZmIWltcG9ydGFudDtib3JkZXItYm90dG9tOjAgc29saWQgI2ZmZiFpbXBvcnRhbnQ7Ym9yZGVyLWxlZnQ6MCBzb2xpZCAjZmZmIWltcG9ydGFudDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICMzOGZ9DQoucy10aXRsZS1pbWFnZXtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLXRvcDowIHNvbGlkICNmZmYhaW1wb3J0YW50O2JvcmRlci1ib3R0b206MCBzb2xpZCAjZmZmIWltcG9ydGFudDtib3JkZXItbGVmdDowIHNvbGlkICNmZmYhaW1wb3J0YW50O2JvcmRlci1yaWdodDowIHNvbGlkICNmZmYhaW1wb3J0YW50fQ0KI3NfbGdfaW1ne2Rpc3BsYXk6bm9uZX0NCiNmb3Jtey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjAuMnM7YW5pbWF0aW9uLWR1cmF0aW9uOjAuMnM7LXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOmJvdGg7YW5pbWF0aW9uLWZpbGwtbW9kZTpib3RoO2FuaW1hdGlvbi1uYW1lOmZhZGVJblVwOy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluVXA7YW5pbWF0aW9uLWRlbGF5Oi4zczstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouM3N9DQpib2R5Om5vdChbbmV3c10pICNoZWFkX3dyYXBwZXIgI2Zvcm0uZm17bWluLXdpZHRoOiA1MCU7d2lkdGg6IDExMCU7fQ0KLnMtcC10b3B7dHJhbnNmb3JtOnNjYWxlKC44KTtib3R0b206OXB4IWltcG9ydGFudH0NCi5tbmF2e2Rpc3BsYXk6bm9uZX0NCiN1X3NwIC5tbmF2e2Rpc3BsYXk6bm9uZX0NCiN1MSBhLmxie3BhZGRpbmc6MjNweDtib3JkZXItcmFkaXVzOjUwJTtmb250LXNpemU6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo0NHB4O3RvcDoxMDQwJTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREU1TGpJdU1Td2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SXVXYnZ1V3hnbDh4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IyYVdWM1FtOTRQU0l3SURBZ05EWWdORFlpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRFEySURRMk95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStDZ2t1YzNRd2UyWnBiR3c2STBaR1JrWkdSanQ5Q2p3dmMzUjViR1UrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHlNeXd5TTJNeUxqa3NNQ3cxTGpJdE1pNHpMRFV1TWkwMUxqSnpMVEl1TXkwMUxqSXROUzR5TFRVdU1uTXROUzR5TERJdU15MDFMaklzTlM0eVV6SXdMakVzTWpNc01qTXNNak42SUUweU15d3lOUzQyQ2dsakxUTXVOU3d3TFRFd0xqUXNNUzQzTFRFd0xqUXNOUzR5ZGpJdU5tZ3lNQzQzZGkweUxqWkRNek11TkN3eU55NHpMREkyTGpVc01qVXVOaXd5TXl3eU5TNDJlaUl2UGdvOEwzTjJaejRLIik7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2JveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwcztsaW5lLWhlaWdodDowO3otaW5kZXg6MTAwfQ0KI3UxIGEubGI6aG92ZXJ7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQojdTEgYS5sYjphY3RpdmV7Ym94LXNoYWRvdzowIDEwcHggMzBweCByZ2JhKDAsMCwwLC4xOSksMCA2cHggMTBweCByZ2JhKDAsMCwwLC4yMyk7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQojdTEgYS5wZntiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7Zm9udC1zaXplOjA7cGFkZGluZzoxNHB4O29wYWNpdHk6Ljg7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlO3otaW5kZXg6MH0NCiN1MSBhLmJyaXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2ZvbnQtc2l6ZTowO3BhZGRpbmc6MnB4O29wYWNpdHk6Ljg7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlO2JvcmRlcjpub25lO21hcmdpbi10b3A6MTJweH0NCiN3cmFwcGVyIC5iZGJyaWltZ3RpdGxle3BhZGRpbmctdG9wOjIzcHh9DQojd3JhcHBlciAuYmRicmkuYmRicmlpbWcgLmJkbWFpbmxpbmsgYXtib3JkZXI6bm9uZX0NCiN3cmFwcGVyIC5iZGJyaXt6LWluZGV4OjJ9DQojd3JhcHBlciAjdV9zcCAuc19icml7cGFkZGluZzo1cHg7Ym9yZGVyLXJhZGl1czo1MCU7Zm9udC1zaXplOjA7d2lkdGg6MzJweDtoZWlnaHQ6MzJweDtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF4T1M0eUxqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaTVadSs1YkdDWHpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2VHMXNibk02ZUd4cGJtczlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHeHBibXNpSUhnOUlqQndlQ0lnZVQwaU1IQjRJZzBLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNeklnTXpJaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURNeUlETXlPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0RRbzhjM1I1YkdVZ2RIbHdaVDBpZEdWNGRDOWpjM01pUGcwS0NTNXpkREI3Wm1sc2JEb2pSa1pHUmtaR08zME5Dand2YzNSNWJHVStEUW84Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1UQXNNVE5vTTNZdE0yZ3RNMVl4TTNvZ1RURTBMalVzTWpKb00zWXRNMmd0TTBNeE5DNDFMREU1TERFMExqVXNNaklzTVRRdU5Td3lNbm9nVFRFd0xESXlhRE4yTFROb0xUTldNako2SUUweE1Dd3hOeTQxYUROMkxUTm9MVE5XTVRjdU5Yb05DZ2tnVFRFMExqVXNNVGN1TldnemRpMHphQzB6UXpFMExqVXNNVFF1TlN3eE5DNDFMREUzTGpVc01UUXVOU3d4Tnk0MWVpQk5NVGtzTVRCMk0yZ3pkaTB6U0RFNWVpQk5NVFF1TlN3eE0yZ3pkaTB6YUMwelF6RTBMalVzTVRBc01UUXVOU3d4TXl3eE5DNDFMREV6ZWlCTk1Ua3NNVGN1TldnemRpMHphQzB6RFFvSlZqRTNMalY2SUUweE9Td3lNbWd6ZGkwemFDMHpWakl5ZWlJdlBnMEtQQzl6ZG1jK0RRbz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzO2xpbmUtaGVpZ2h0OjA7ei1pbmRleDoxMDA7bWFyZ2luLXJpZ2h0OjIycHg7bWFyZ2luLXRvcDoxcHh9DQojdV9zcCAuc19iZGJyaWltZ3RpdGxle3BhZGRpbmctdG9wOjczcHh9DQojc191c2Vyc2V0dGluZ190b3B7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2ZvbnQtc2l6ZTowO3BhZGRpbmc6MTRweDtvcGFjaXR5Oi44Oy1tb3otdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstby10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTttYXJnaW4tdG9wOjEycHg7bWFyZ2luLXJpZ2h0OjRweDt6LWluZGV4Oi0xMDB9DQojc190b3Bfd3JhcHt6LWluZGV4Oi0xMDtib3JkZXItYm90dG9tOnVuc2V0O30NCiN1IC50b2luZGV4e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9DQojc191c2VybmFtZV90b3B7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWFyZ2luLXRvcDoyNnB4O21hcmdpbi1sZWZ0OjVweDtib3JkZXI6bm9uZTtwYWRkaW5nLWxlZnQ6MTBweDtwYWRkaW5nLXJpZ2h0OjEwcHg7Ym9yZGVyLXJhZGl1czoxNnB4O21hcmdpbi1yaWdodDotM3B4fQ0KLnVzZXItbmFtZXt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9DQoubWVudS1hcnJvd3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fQ0KLnNfdXNlcl9uYW1lX21lbnV7dGV4dC1hbGlnbjpjZW50ZXIhaW1wb3J0YW50fQ0KLnMtdXNlci1zZXQtbWVudS5tZW51LXRvcHt3aWR0aDoxMDBweH0NCi5zLXVzZXItc2V0LW1lbnUgZGl2e2JvcmRlcjpub25lIWltcG9ydGFudDtib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHh9DQoucy11c2VyLXNldC1tZW51e3BhZGRpbmctdG9wOjA7bWFyZ2luLXRvcDozNnB4O2JvcmRlci1yYWRpdXM6MnB4IWltcG9ydGFudH0NCi5zLXVzZXItc2V0LW1lbnUgYXtwYWRkaW5nLWxlZnQ6MjVweDstbW96LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjNzIGVhc2V9DQoucy11c2VyLXNldC1tZW51IGE6aG92ZXJ7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlfQ0KI3VzZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50O21hcmdpbi10b3A6MzBweDttYXJnaW4tbGVmdDo1cHg7Ym9yZGVyOm5vbmU7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy1yaWdodDoxMHB4O2JvcmRlci1yYWRpdXM6MTZweDttYXJnaW4tcmlnaHQ6LTNweDtoZWlnaHQ6MjNweDtwYWRkaW5nLXRvcDo4cHg7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MXM7YW5pbWF0aW9uLWR1cmF0aW9uOjFzOy13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTpib3RoO2FuaW1hdGlvbi1maWxsLW1vZGU6Ym90aDthbmltYXRpb24tbmFtZTpib3VuY2VJblJpZ2h0Oy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5SaWdodH0NCi51c2VybWVudXtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4IWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweCFpbXBvcnRhbnQ7d2lkdGg6ODNweDtib3JkZXItcmFkaXVzOjJweCFpbXBvcnRhbnQ7dG9wOjM1cHghaW1wb3J0YW50O21hcmdpbjogMCBhdXRvO30NCi51c2VybmFtZSBhey1tb3otdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstby10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTtib3JkZXItcmFkaXVzOjJweH0NCi51c2VybmFtZSBhOmhvdmVye2JhY2tncm91bmQ6IzM0NzZkMiFpbXBvcnRhbnQ7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlfQ0KLnVzZXJuYW1lIGE6YWN0aXZle2JhY2tncm91bmQ6IzM0NzZkMiFpbXBvcnRhbnQ7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlfQ0KI3VzZXIgLmMtaWNvbntkaXNwbGF5Om5vbmV9DQojaW1zZ3tiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7Zm9udC1zaXplOjA7cGFkZGluZzoxNHB4O29wYWNpdHk6Ljg7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlO3otaW5kZXg6MDtwYWRkaW5nLXRvcDoyNXB4O3BhZGRpbmctYm90dG9tOjIxcHh9DQojaW1zZzpob3ZlcntvcGFjaXR5OjF9DQouaGVhZF93cmFwcGVyICNiZHMtbWVzc2FnZS13cmFwcGVye3RvcDo2NHB4fQ0KLnMtbW9kLW1zZ3tib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHghaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4IWltcG9ydGFudDtib3JkZXItcmFkaXVzOjNweH0NCi5tc2ctYnRue2JvcmRlci1yYWRpdXM6MnB4O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQoubXNnLWJ0bjpob3Zlcntib3JkZXItcmFkaXVzOjJweDtib3gtc2hhZG93OjAgMXB4IDZweCByZ2JhKDAsMCwwLC4xMiksMCAxcHggNHB4IHJnYmEoMCwwLDAsLjEyKTt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQ0KLm1zZy1idG46YWN0aXZle2JvcmRlci1yYWRpdXM6MnB4O2JveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHghaW1wb3J0YW50O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9DQoubm8tdXNlOmhvdmVye2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9DQoudG9wLWxvZ28gaW1ne2Rpc3BsYXk6bm9uZX0NCi50b3AtbG9nb3tiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREU1TGpJdU1Td2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SXVXYnZ1V3hnbDh4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IyYVdWM1FtOTRQU0l3SURBZ01UQXhJRE16SWlCemRIbHNaVDBpWlc1aFlteGxMV0poWTJ0bmNtOTFibVE2Ym1WM0lEQWdNQ0F4TURFZ016TTdJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWo0S1BITjBlV3hsSUhSNWNHVTlJblJsZUhRdlkzTnpJajRLQ1M1emREQjdabWxzYkRvak5EZzNPVUpFTzMwS0NTNXpkREY3Wm1sc2JEb2pSRVEwTkRNMk8zMEtDUzV6ZERKN1ptbHNiRG9qUmtaR1JrWkdPMzBLUEM5emRIbHNaVDRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNQ0lnWkQwaVRUVXdMalFzTVRVdU0yTXRNeTQ0TERBdU15MDBMREl1TmkwMUxqY3NOQzQzWXkweExqZ3NNaTR5TFRVdU5TdzBMakV0Tml3MkxqZGpMVEF1Tml3ekxqTXNNUzR6TERVdU1Td3pMRFV1TjJNeExqa3NNQzQyTERZdU1pMHdMalVzT0M0MExUQXVOV2d3TGpJS0NXZ3dMakpqTWk0eUxEQXNOaTQwTERFdU1TdzRMalFzTUM0MVl6RXVPQzB3TGpZc015NDFMVE11TWl3ekxUVXVOMk10TUM0MExUSXVNUzAwTGpRdE5DNDFMVFl1TWkwMkxqZEROVFF1TWl3eE9DdzFOQzR6TERFMUxqWXNOVEF1TkN3eE5TNHplaUJOTXpjc01UUXVPQW9KWXpBc01pNDBMREV1Tml3MExqTXNNeTQwTERRdU0yTXhMamtzTUN3ekxqUXRNUzQ1TERNdU5DMDBMak5qTUMweUxqUXRNUzQyTFRRdU15MHpMalF0TkM0elV6TTNMREV5TGpVc016Y3NNVFF1T0hvZ1RUUXpMamtzT0M0Mll6QXNNaTQxTERFdU5TdzBMalVzTXk0ekxEUXVOUW9KWXpFdU9Dd3dMRE11TXkweUxqRXNNeTR6TFRRdU5WTTBPU3cwTGpFc05EY3VNU3cwTGpGRE5EVXVNeXcwTERRekxqa3NOaXcwTXk0NUxEZ3VObm9nVFRVeUxqSXNPQzQxWXpBc01pNHpMREV1TkN3MExqTXNNeTR5TERRdU0zTXpMakl0TVM0NUxETXVNaTAwTGpOekxURXVOQzAwTGpNdE15NHlMVFF1TXdvSlV6VXlMaklzTmk0eUxEVXlMaklzT0M0MWVpQk5OVGN1TlN3eE5TNDVZekFzTWk0ekxERXVOU3cwTGpNc015NHpMRFF1TTJNeExqZ3NNQ3d6TGpNdE1TNDVMRE11TXkwMExqTnpMVEV1TlMwMExqTXRNeTR6TFRRdU0wTTFPQzQ1TERFeExqWXNOVGN1TlN3eE15NDJMRFUzTGpVc01UVXVPWG9pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTVNJZ1pEMGlUVFFzTXpBdU5IWXROUzR4YURZdU5HTXhMallzTUN3eExqWXNNQzR6TERFdU5pd3lkakV1TkdNd0xERXVOaTB5TGpNc01TNDRMVE11T1N3eExqaE1OQ3d6TUM0MFREUXNNekF1TkhvZ1RUUXNNak4yTFRRdU9HZzBMakVLQ1dNeExqWXNNQ3d6TGprc01Dd3pMamtzTWk0eGRqQXVNV013TERFdU5DMHdMalVzTWk0MkxURXVPQ3d5TGpaRE1UQXVNeXd5TXl3MExESXpMRFFzTWpONklFMHhMamNzTVRaMk1UWXVNMmcyTGpSak15d3dMRFl1TWl3d0xEWXVNaTB6TGpaMkxURXVNV013TFRFdU5pMHdMakV0TWk0M0xURXVNUzB6TGpVS0NXTXhMVEF1T0N3eExqRXRNaTR6TERFdU1TMHpMalpzTUN3d1l6QXROQzQxTFRNdU1pMDBMalV0Tmk0eUxUUXVOVXd4TGpjc01UWk1NUzQzTERFMmVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk1qVXNNamd1T1dNdE1TNHhMREV1TVMwekxqTXNNUzR6TFRNdU5Td3hMak5qTFRFdU15d3dMVEl1Tnkwd0xqVXRNaTQzTFRJdU1XTXdMVEV1TkN3d0xqVXRNaTR6TERJdU1TMHlMak5qTVM0ekxEQXNNaTQ0TERBdU1TdzBMakVzTUM0MlZqSTRMamw2Q2drZ1RUSXhMalFzTXpJdU0yTXdMalFzTUN3eUxqTXRNQzR4TERNdU55MHdMamxzTUM0eUxEQXVOMmd5TGpGMkxUZ3VPV013TFRNdU5pMHlMak10TlMwMUxqY3ROV010TVM0NExEQXROQzR6TERBdU55MDBMamNzTUM0NWJEQXVOQ3d5TGpOak1TNDJMVEF1Tml3ekxUQXVOaXcwTGpJdE1DNDJDZ2xqTVM0NExEQXNNeTR6TERBdU5pd3pMak1zTWk0MlZqSTBZeTB4TFRBdU5DMHlMalF0TUM0MkxUUXVNUzB3TGpaakxUTXNNQzAwTGpVc01TNDJMVFF1TlN3MExqZERNVFl1TkN3ek1TNDRMREU1TGpZc016SXVNeXd5TVM0MExETXlMak42SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERFaUlHUTlJazB6TUM0eUxERTJMakZqTUN3d0xqWXNNQzQyTERFdU1pd3hMak1zTVM0eVl6QXVPQ3d3TERFdU15MHdMallzTVM0ekxURXVNbU13TFRBdU55MHdMall0TVM0ekxURXVNeTB4TGpORE16QXVPQ3d4TkM0NExETXdMaklzTVRVdU15d3pNQzR5TERFMkxqRjZDZ2tnVFRNd0xqTXNNekl1TVdneUxqUldNVGd1TldndE1pNDBWak15TGpGNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemRERWlJR1E5SWswM01TNHlMREl5TGpGb09DNDBZekF1TkN3d0xqRXNNQzQyTERBdU15d3dMallzTUM0M2RqSXVObWd0T1M0M2RpMHlMalpETnpBdU5pd3lNaTQwTERjd0xqZ3NNakl1TWl3M01TNHlMREl5TGpGNklFMDNNUzR5TERNd0xqVUtDV010TUM0MExEQXRNQzQyTFRBdU15MHdMamN0TUM0NGRpMHlMalpvT1M0M2RqSXVObU13TERBdU5DMHdMaklzTUM0M0xUQXVOaXd3TGpkSU56RXVNbm9nVFRjekxqWXNNVGhqTFRBdU1Td3dMalF0TUM0eExEQXVPUzB3TGpRc01TNDNZeTB3TGpFc01DNHpMVEF1TVN3d0xqVXRNQzR4TERBdU53b0phQzB5TGpaakxURXVNeXd3TGpFdE1TNDVMREF1T0MweUxESjJOeTQ1WXpBdU1Td3hMakVzTUM0NExERXVPQ3d5TERFdU9XZ3hNR014TGpJdE1DNHhMREV1T0Mwd0xqY3NNUzQ1TFRFdU9IWXROeTQ1WXkwd0xqRXRNUzR6TFRBdU55MHhMamt0TVM0NUxUSXVNV2d0TlFvSll6QXVNUzB3TGpNc01DNHhMVEF1T0N3d0xqTXRNUzQwWXpBdU1TMHdMalFzTUM0eExUQXVOeXd3TGpFdE1DNDVhRGN1TW5ZdE1TNDRTRFkzTGpSV01UaE1Oek11Tml3eE9FdzNNeTQyTERFNGVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk9UTXVOeXd5TWk0M1l5MHdMalF0TUM0eExUQXVOUzB3TGpJdE1DNDFMVEF1TlhZdE1DNDJhRE11TW5Zd0xqWmpMVEF1TVN3d0xqTXRNQzR5TERBdU5DMHdMalVzTUM0MVNEa3pMamQ2SUUwNU5pNDJMREkwTGpFS0NXTXhMakV0TUM0eExERXVOaTB3TGpVc01TNDJMVEV1TkhZdE1XZ3lMak4yTFRFdU5XZ3RNaTR6ZGkweExqRm9MVEV1T0hZeExqRm9MVE11TW5ZdE1TNHhhQzB4TGpoMk1TNHhhQzB5TGpOMk1TNDFhREl1TTNZeFl6QXVNU3d3TGprc01DNDJMREV1TkN3eExqWXNNUzQwU0RrMkxqWjZDZ2tnVFRrMExqZ3NNekF1TkdNeExqWXNNQzQ0TERNdU5Dd3hMak1zTlM0MExERXVPR3d3TGprdE1TNDNZeTB4TGpRdE1DNHlMVEl1T1Mwd0xqWXROQzQwTFRFdU1XTXhMakV0TUM0NExESXRNUzQyTERJdU55MHlMalZqTUM0ekxUQXVOQ3d3TGpRdE1DNDVMREF1TWkweExqTUtDV010TUM0ekxUQXVOaTB3TGpndE1DNDVMVEV1TkMwd0xqbG9MVGwyTVM0MWFEY3VOMk13TGpJc01Dd3dMalFzTUM0eExEQXVOQ3d3TGpGek1Dd3dMakV0TUM0eExEQXVNMk10TUM0MkxEQXVOaTB4TGpRc01TNHpMVEl1TXl3eExqaGpMVEV1TWkwd0xqY3RNaTR4TFRFdU15MHlMalF0TVM0NGFDMHlMaklLQ1dNd0xqa3NNU3d4TGpnc01TNDVMREl1T1N3eUxqZGpMVEV1Tml3d0xqWXRNeTR6TERFdU1TMDBMamtzTVM0emJEQXVPU3d4TGpaRE9URXVNeXd6TVM0NExEa3pMaklzTXpFdU1TdzVOQzQ0TERNd0xqUjZJRTA0T0M0ekxESTFMakoyTFRaak1DNHhMVEF1Tml3d0xqTXRNQzQ1TERBdU9DMHdMamtLQ1dneE1TNDRkaTB4TGpaSU9UVmpMVEF1TVMwd0xqRXRNaTR5TFRBdU1TMHlMaklzTUdndE5DNDNZeTB4TGpFc01DNHhMVEV1Tnl3d0xqa3RNUzQ0TERJdU1sWXlOV013TGpFc01pNHhMVEF1TkN3MExqUXRNUzR4TERZdU4yd3hMamtzTUM0MkNnbERPRGN1T1N3eU9TNDVMRGc0TGpNc01qY3VOaXc0T0M0ekxESTFMako2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERJaUlHUTlJazAwTmk0ekxESTBMakpqTUM0MkxEQXNNUzR5TERBdU1Td3hMamNzTUM0MGRqTXVOR013TERBdU15MHdMallzTVMweExqa3NNV010TVM0MUxEQXRNUzQ0TFRBdU5pMHhMamd0TWk0eGRpMHdMallLQ1VNME5DNHlMREkwTGpnc05EUXVOeXd5TkM0eUxEUTJMak1zTWpRdU1ub2dUVFE1TGpJc01qQXVOMGcwT0hZeUxqVkRORGN1Tml3eU15NHhMRFEzTERJekxEUTJMak1zTWpOakxUSXVOeXd3TFRNdU15d3hMVE11TXl3ekxqVjJNQzR6WXpBc01pNDBMREF1T1N3ekxqTXNNeTR5TERNdU13b0pZekF1T0N3d0xERXVNeTB3TGpFc01TNDRMVEF1Tld3d0xqRXNNQzQyYURFdU1VdzBPUzR5TERJd0xqZE1ORGt1TWl3eU1DNDNlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F5SWlCa1BTSk5OVFl1Tnl3eU0yZ3RNUzR5ZGpVdU1tTXRNQzQyTERBdU5DMHhMamNzTUM0MkxUSXVOQ3d3TGpaakxUQXVPQ3d3TFRFdE1DNDBMVEV0TVM0emRpMDBMalpvTFRFdU1YWTBMamhqTUN3eExqWXNNQzQxTERJdU15d3lMakVzTWk0ekNnbGpNU3d3TERJdU1TMHdMak1zTWk0MkxUQXVObXd3TGpFc01DNDJhREV1TVZZeU0zb2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNU0lnWkQwaVRUa3lMamNzTVRVdU4yTXdMVEF1Tnl3d0xqWXRNUzR6TERFdU1pMHhMak5qTUM0MkxEQXNNUzR5TERBdU5pd3hMaklzTVM0elV6azBMalVzTVRjc09UTXVPU3d4TjBNNU15NHpMREUyTGprc09USXVOeXd4Tmk0ekxEa3lMamNzTVRVdU4zb2lMejRLUEM5emRtYytDZz09Iik7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2hlaWdodDoxMDBweDt3aWR0aDoyMDBweH0NCiN1X3NwIC5zX2JyaXtib3JkZXI6MCFpbXBvcnRhbnR9DQoucGFzcy10ZXh0LWlucHV0e2JhY2tncm91bmQtaW1hZ2U6bm9uZSFpbXBvcnRhbnR9DQoucGFzcy10ZXh0LWlucHV0LWZvY3Vze2JhY2tncm91bmQtaW1hZ2U6bm9uZSFpbXBvcnRhbnR9DQojcGFzc3BvcnQtbG9naW4tcG9we2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsIk5pbWJ1cyBTYW5zIEwiLEFyaWFsLCJMaWJlcmF0aW9uIFNhbnMiLCJQaW5nRmFuZyBTQyIsIkhpcmFnaW5vIFNhbnMgR0IiLCJTb3VyY2UgSGFuIFNhbnMgQ04iLCJTb3VyY2UgSGFuIFNhbnMgU0MiLCJNaWNyb3NvZnQgWWFIZWkiLCJXZW5xdWFueWkgTWljcm8gSGVpIiwiV2VuUXVhbllpIFplbiBIZWkiLCJTVCBIZWl0aSIsU2ltSGVpLCJXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsc2Fucy1zZXJpZjtib3JkZXItcmFkaXVzOjJweH0NCiNUQU5HUkFNX19QU1BfMl9fdGl0bGVUZXh0e2ZvbnQtZmFtaWx5OkhlbHZldGljYSwiTWljcm9zb2Z0IFlhaGVpIFVJIExpZ2h0In0NCi5wYXNzLWZndHB3ZHtmb250LWZhbWlseTpIZWx2ZXRpY2EsIk1pY3Jvc29mdCBZYWhlaSBVSSIhaW1wb3J0YW50fQ0KLnBhc3Mtc21zLWJ0bntmb250LWZhbWlseTpIZWx2ZXRpY2EsIk1pY3Jvc29mdCBZYWhlaSBVSSIhaW1wb3J0YW50fQ0KLnBhc3MtcmVnbGlua3tmb250LWZhbWlseTpIZWx2ZXRpY2EsIk1pY3Jvc29mdCBZYWhlaSBVSSIhaW1wb3J0YW50fQ0KLnRhbmctZm9yZWdyb3VuZHtib3JkZXItcmFkaXVzOjJweCFpbXBvcnRhbnQ7Ym9yZGVyOjAhaW1wb3J0YW50fQ0KLnRhbmctdGl0bGV7Ym9yZGVyLXJhZGl1czoycHggMnB4IDAgMCFpbXBvcnRhbnR9DQoudGFuZy1wYXNzLXBvcC1sb2dpbiBkaXYudGFuZy10aXRsZXtib3JkZXItcmFkaXVzOjJweCAycHggMCAwIWltcG9ydGFudH0NCi5wYXNzLWNoZWNrYm94LWlucHV0e3dpZHRoOjE3cHg7aGVpZ2h0OjE3cHg7Ym9yZGVyOiNlMGUwZTAgM3B4IHNvbGlkIWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZX0NCi50YW5nLXBhc3MtcG9wLWxvZ2luLWNvbG9yLWJsdWUgLnBhc3MtYnV0dG9uOmZvY3Vze2JveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHghaW1wb3J0YW50fQ0KLnJyZWNvbS1idG4tcGFyZW50e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9DQoucy1wLXRvcHtib3R0b206LThweCFpbXBvcnRhbnR9DQppbnB1dFt0eXBlPXRleHRdOmZvY3Vze2JvcmRlcjpub25lIWltcG9ydGFudDtib3JkZXItdG9wOjAgc29saWQgI2ZmZiFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbTowIHNvbGlkICNmZmYhaW1wb3J0YW50O2JvcmRlci1sZWZ0OjAgc29saWQgI2ZmZiFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0OjAgc29saWQgI2ZmZiFpbXBvcnRhbnR9DQphW3NvZnRfaWRde2Rpc3BsYXk6bm9uZX0NCi5vcC1zb2Z0LWJ0bmJveCAuYy1nYXAtbGVmdC1zbWFsbHttYXJnaW4tbGVmdDowIWltcG9ydGFudDtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzM0NzZkMjtwYWRkaW5nOjdweCAxNXB4O2JvcmRlci1yYWRpdXM6MnB4O2ZvbnQtc2l6ZToxNHB4O3RyYW5zaXRpb246YWxsIC4zcyBlYXNlfQ0KLm9wLXNvZnQtYnRuYm94IC5jLWdhcC1sZWZ0LXNtYWxsOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzcwOThEMDt0cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTtib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpfQ0KLnNvdXR1LWlucHV0LWltYWdle3RvcDo2cHg7bGVmdDo1cHh9DQoja3d7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0NCi5zLXNraW4taGFzYmcgI2t3e2JveC1zaGFkb3c6MCAwIDAgcmdiYSgwLDAsMCwuMil9DQoucy1za2luLWhhc2JnIC5idG5fd3J7d2lkdGg6MzVweH0NCiNzX3VzZXJzZXR0aW5nX3RvcHttYXJnaW4tdG9wOi03cHh9DQojc191c2VybmFtZV90b3B7bWFyZ2luLXRvcDo3cHh9DQojdV9zcHtwYWRkaW5nLXRvcDoxNnB4fQ0KLmlwdF9yZWN7YmFja2dyb3VuZDowIDA7YmFja2dyb3VuZC1pbWFnZTpub25lfQ0KLmlwdF9yZWM6aG92ZXJ7YmFja2dyb3VuZDowIDA7YmFja2dyb3VuZC1pbWFnZTpub25lfQ0KLmlwdF9yZWM6YWZ0ZXJ7ZGlzcGxheTpub25lO21hcmdpbi10b3A6NTBweH0NCi5iZHBmbWVudSwudXNlcm1lbnV7Ym9yZGVyOm5vbmU7Ym94LXNoYWRvdzpub25lOy13ZWJraXQtYm94LXNoYWRvdzpub25lOy1tb3otYm94LXNoYWRvdzpub25lOy1vLWJveC1zaGFkb3c6bm9uZX0NCi5xcmNvZGVDb257dmlzaWJpbGl0eTpoaWRkZW59DQojaGVhZCAuaGVhZEJsb2Nre21hcmdpbjoxMnB4IDAgNnB4IDEyMXB4fQ0KYXtjb2xvcjojMzQ3NmQyfQ0KaDMgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMS4ycHggc29saWR9DQouYy1zaG93dXJse2NvbG9yOiM0Q0FGNTB9DQoub3Atc2UtbGlzdGVuLXJlY29tbWVuZDpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMS4ycHggc29saWR9DQouYy1nYXAtYm90dG9tLXNtYWxsIGE6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDEuMnB4IHNvbGlkfQ0KLmMtcm93IGE6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDEuMnB4IHNvbGlkfQ0KI3JzIGE6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDEuMnB4IHNvbGlkfQ0KLmhpbnRfdG9wcnFfdGlwc19pdGVtcyBhOmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxLjJweCBzb2xpZH0NCi5jOmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxLjJweCBzb2xpZH0NCmVte2NvbG9yOiNFQTQzMzV9DQoub3AtdmlkZW8tdmFzdC11bCBsaSBhe21hcmdpbi1ib3R0b206IHVuc2V0O30NCmJvZHl7YmFja2dyb3VuZC1jb2xvcjojRjdGN0Y3fQ0KI2Zvcm0gLnNfYnRue2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKX0NCiN3cmFwcGVyICNoZWFkIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0OCwgMjQ4LCAyNDgsIDAuNCk7DQogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCkNCn0NCi5jLXRhYnMtbmF2e2JhY2tncm91bmQtY29sb3I6I0VFRX0NCi5jLXRhYnMtbmF2LXNlbGVjdGVke2JvcmRlci1ib3R0b206I0Y0NDMzNiAycHggc29saWQhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6IzIxOTZGMyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9DQojcGFnZSBhe2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojNDI0MjQyfQ0KI3BhZ2UgYTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTAhaW1wb3J0YW50fQ0KI3BhZ2UgYSAucGM6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwfQ0KI3BhZ2Ugc3Ryb25ne2JhY2tncm91bmQtY29sb3I6IzQyODVGNCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0NCiNwYWdlIHN0cm9uZyAucGN7YmFja2dyb3VuZC1jb2xvcjojNDI4NUY0IWltcG9ydGFudH0NCi5wYzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTB9DQojc190YWIgYntib3JkZXItYm90dG9tOjNweCAjMzQ3NmQyIHNvbGlkO2NvbG9yOiMzNDc2ZDJ9DQojc190YWJ7Ym9yZGVyLWJvdHRvbTojZTBlMGUwIDFweCBzb2xpZH0NCi5iZHBmbWVudSBhOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzM0NzZkMiFpbXBvcnRhbnR9DQouc2V0cHJlZjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzNDc2ZDIhaW1wb3J0YW50fQ0KI3UgLmxie2JhY2tncm91bmQtY29sb3I6IzM0NzZkMn0NCiN1IC5sYjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MThDQzd9DQojdSAubGI6YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzdEQTBEMH0NCiNiZ3tiYWNrZ3JvdW5kLWNvbG9yOiNGRkYhaW1wb3J0YW50O2JhY2tncm91bmQ6I0ZGRn0NCiN1MSBhLmxie2JhY2tncm91bmQtY29sb3I6IzM0NzZkMn0NCiN1MSBhLmxiOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzYxOENDN30NCiN1MSBhLmxiOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiM3REEwRDB9DQojdV9zcCAuc19icml7YmFja2dyb3VuZC1jb2xvcjojRjQ0MzM2fQ0KI3NfdXNlcm5hbWVfdG9we2JhY2tncm91bmQtY29sb3I6I2UwZTBlMH0NCi5zLXVzZXItc2V0LW1lbnUgYTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzNDc2ZDIhaW1wb3J0YW50fQ0KI3VzZXJ7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwfQ0KLm1zZy1zZXR0aW5nLWJ0bntiYWNrZ3JvdW5kLWNvbG9yOiMzNDc2ZDIhaW1wb3J0YW50fQ0KLm5vLXVzZXtiYWNrZ3JvdW5kLWNvbG9yOiNFNUU1RTUhaW1wb3J0YW50fQ0KLnBhc3MtdGV4dC1pbnB1dHtib3JkZXItYm90dG9tOiNlMGUwZTAgMnB4IHNvbGlkIWltcG9ydGFudDtib3JkZXItbGVmdDojZmZmIDAgc29saWQhaW1wb3J0YW50O2JvcmRlci1yaWdodDojZmZmIDAgc29saWQhaW1wb3J0YW50O2JvcmRlci10b3A6I2ZmZiAwIHNvbGlkIWltcG9ydGFudH0NCi5wYXNzLXRleHQtaW5wdXQtZm9jdXN7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDJweCBzb2xpZCFpbXBvcnRhbnQ7Ym9yZGVyLWxlZnQ6I2ZmZiAwIHNvbGlkIWltcG9ydGFudDtib3JkZXItcmlnaHQ6I2ZmZiAwIHNvbGlkIWltcG9ydGFudDtib3JkZXItdG9wOiNmZmYgMCBzb2xpZCFpbXBvcnRhbnR9DQoudGFuZy1wYXNzLXBvcC1sb2dpbi1jb2xvci1ibHVlIC5wYXNzLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMzNDc2ZDJ9DQoudGFuZy1wYXNzLXBvcC1sb2dpbi1jb2xvci1ibHVlIC5wYXNzLWJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MThDQzd9DQojbGd7bWFyZ2luLWxlZnQ6LTNyZW07YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqd2hMUzBnUjJWdVpYSmhkRzl5T2lCQlpHOWlaU0JKYkd4MWMzUnlZWFJ2Y2lBeE9TNHlMakVzSUZOV1J5QkZlSEJ2Y25RZ1VHeDFaeTFKYmlBdUlGTldSeUJXWlhKemFXOXVPaUEyTGpBd0lFSjFhV3hrSURBcElDQXRMVDROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCcFpEMGk1YkdDWHpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2VHMXNibk02ZUd4cGJtczlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHeHBibXNpSUhnOUlqQndlQ0lnZVQwaU1IQjRJZzBLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNalU1SURFeE5pSWdjM1I1YkdVOUltVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a09tNWxkeUF3SURBZ01qVTVJREV4TmpzaUlIaHRiRHB6Y0dGalpUMGljSEpsYzJWeWRtVWlQZzBLUEhOMGVXeGxJSFI1Y0dVOUluUmxlSFF2WTNOeklqNE5DZ2t1YzNRd2UyWnBiR3c2SXpReU9EVkdORHQ5RFFvSkxuTjBNWHRtYVd4c09pTkZRVFF6TXpVN2ZRMEtDUzV6ZERKN1ptbHNiRG9qUmtaR1JrWkdPMzBOQ2p3dmMzUjViR1UrRFFvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NVEk0TGpJc056ZGpMVFV1TkN3d0xqUXROUzQyTERNdU55MDRMakVzTmk0M1l5MHlMalVzTXk0eExUY3VOeXcxTGpndE9DNDBMRGt1TldNdE1DNDRMRFF1Tnl3eExqZ3NOeTR5TERRdU15dzRZekl1Tnl3d0xqa3NPQzQ0TFRBdU55d3hNUzQ1TFRBdU53MEtDV2d3TGpOb01DNHpZek11TVN3d0xEa3VNU3d4TGpZc01URXVPU3d3TGpkak1pNDFMVEF1T1N3MExqa3ROQzQxTERRdU15MDRZeTB3TGpVdE15MDJMakl0Tmk0MExUZ3VOeTA1TGpWRE1UTXpMallzT0RBdU55d3hNek11Tnl3M055NDBMREV5T0M0eUxEYzNlaUJOTVRBNUxqTXNOell1TXcwS0NXTXdMRE11TkN3eUxqSXNOaTR4TERRdU9DdzJMakZqTWk0M0xEQXNOQzQ0TFRJdU55dzBMamd0Tmk0eGN5MHlMakl0Tmk0eExUUXVPQzAyTGpGVE1UQTVMak1zTnpNc01UQTVMak1zTnpZdU0zb2dUVEV4T1N3Mk55NDFZekFzTXk0MUxESXVNU3cyTGpRc05DNDJMRFl1TkEwS0NXTXlMallzTUN3MExqY3RNaTQ1TERRdU55MDJMalJ6TFRJdU1TMDJMalF0TkM0M0xUWXVORU14TWpFc05qRXNNVEU1TERZekxqa3NNVEU1TERZM0xqVjZJRTB4TXpBdU55dzJOeTQwWXpBc015NHpMRElzTml3MExqVXNObk0wTGpVdE1pNDNMRFF1TlMwMll6QXRNeTR6TFRJdE5pMDBMalV0TmcwS0NWTXhNekF1Tnl3Mk5DNHhMREV6TUM0M0xEWTNMalI2SUUweE16Z3VNaXczTnk0NFl6QXNNeTR6TERJdU1TdzJMRFF1Tml3Mll6SXVOaXd3TERRdU55MHlMamNzTkM0M0xUWmpNQzB6TGpNdE1pNHhMVFl0TkM0M0xUWkRNVFF3TGpJc056RXVPQ3d4TXpndU1pdzNOQzQxTERFek9DNHlMRGMzTGpoNklnMEtDUzgrRFFvOGNHRjBhQ0JqYkdGemN6MGljM1F4SWlCa1BTSk5Oakl1T0N3NU9DNHlWamt4YURsak1pNHlMREFzTWk0ekxEQXVOQ3d5TGpNc01pNDRkakpqTUN3eUxqTXRNeTR5TERJdU5TMDFMalVzTWk0MWFDMDFMamhXT1RndU1ub2dUVFl5TGpnc09EY3VPRlk0TVdnMUxqZ05DZ2xqTWk0ekxEQXNOUzQxTERBc05TNDFMRE4yTUM0eFl6QXNNaTB3TGpjc015NDNMVEl1TlN3ekxqZEROekV1Tml3NE55NDRMRFl5TGpnc09EY3VPQ3cyTWk0NExEZzNMamg2SUUwMU9TNDFMRGMzTGpsMk1qTm9PUzR4WXpRdU15d3dMRGd1Tnl3d0xEZ3VOeTAxTGpGMkxURXVOUTBLQ1dNd0xUSXVNeTB3TGpJdE15NDRMVEV1TlMwMExqbGpNUzQwTFRFdU1Td3hMalV0TXk0eUxERXVOUzAxTGpGc01Dd3dZekF0Tmk0ekxUUXVOUzAyTGpNdE9DNDNMVFl1TTB3MU9TNDFMRGMzTGpsTU5Ua3VOU3czTnk0NWVpSXZQZzBLUEhCaGRHZ2dZMnhoYzNNOUluTjBNU0lnWkQwaVRUa3lMalFzT1RZdU1XTXRNUzQxTERFdU5pMDBMallzTVM0NExUUXVPU3d4TGpoakxURXVPU3d3TFRNdU9DMHdMamN0TXk0NExUSXVPV013TFRJc01DNDNMVE11TXl3eUxqa3RNeTR6WXpFdU9Dd3dMRFFzTUM0eUxEVXVPQ3d3TGpoV09UWXVNWG9OQ2drZ1RUZzNMak1zTVRBd0xqbGpNQzQxTERBc015NHpMVEF1TWl3MUxqSXRNUzR6YkRBdU15d3hhREl1T1ZZNE9HTXdMVFV1TVMwekxqSXROeTR4TFRndE55NHhZeTB5TGpVc01DMDJMakVzTVMwMkxqWXNNUzR5YkRBdU5pd3pMakpqTWk0eUxUQXVPQ3cwTGpJdE1DNDVMRFV1T1Mwd0xqa05DZ2xqTWk0MkxEQXNOQzQyTERBdU9TdzBMallzTXk0M2RqRXVNV010TVM0MExUQXVOUzB6TGpRdE1DNDVMVFV1T0Mwd0xqbGpMVFF1TWl3d0xUWXVNeXd5TGpNdE5pNHpMRFl1TmtNNE1DNHpMREV3TUM0ekxEZzBMamNzTVRBd0xqa3NPRGN1TXl3eE1EQXVPWG9pTHo0TkNqeHdZWFJvSUdOc1lYTnpQU0p6ZERFaUlHUTlJazA1T1M0M0xEYzRMakZqTUN3d0xqa3NNQzQ1TERFdU55d3hMamdzTVM0M1l6RXVNU3d3TERFdU9TMHdMamdzTVM0NUxURXVOMk13TFRFdE1DNDRMVEV1T0MweExqa3RNUzQ0UXpFd01DNDJMRGMyTGpNc09Ua3VOeXczTnl3NU9TNDNMRGM0TGpGNkRRb0pJRTA1T1M0NUxERXdNQzQyYURNdU5GWTRNUzQxYUMwekxqUldNVEF3TGpaNklpOCtEUW84Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk1UVTNMallzT0RZdU5tZ3hNUzQ0WXpBdU5Td3dMakVzTUM0NExEQXVOQ3d3TGprc01YWXpMalpvTFRFekxqZDJMVE11TmtNeE5UWXVOeXc0Tnl3eE5UY3NPRFl1Tnl3eE5UY3VOaXc0Tmk0MmVpQk5NVFUzTGpZc09UZ3VOQTBLQ1dNdE1DNDJMREF0TUM0NUxUQXVOQzB4TFRFdU1YWXRNeTQyYURFekxqZDJNeTQzWXpBc01DNDJMVEF1TXl3eExUQXVPU3d4U0RFMU55NDJlaUJOTVRZd0xqa3NPREF1TjJNdE1DNHhMREF1TlMwd0xqSXNNUzR6TFRBdU5Td3lMalJqTFRBdU1Td3dMalF0TUM0eExEQXVOeTB3TGpJc01XZ3RNeTQzRFFvSll5MHhMamdzTUM0eExUSXVOeXd4TGpFdE1pNDRMREl1T0ZZNU9HTXdMakVzTVM0MkxERXVNU3d5TGpVc01pNDRMREl1TjJneE5DNHhZekV1Tnkwd0xqRXNNaTQyTFRFc01pNDNMVEl1TlZZNE4yTXRNQzR4TFRFdU9DMHhMVEl1TnkweUxqY3RNaTQ1YUMwM0RRb0pZekF1TVMwd0xqUXNNQzR5TFRFdU1Td3dMalF0TW1Nd0xqRXRNQzQyTERBdU1TMHhMREF1TWkweExqTm9NVEF1TW5ZdE1pNDJhQzB5TWk0eWRqSXVOa3d4TmpBdU9TdzRNQzQzVERFMk1DNDVMRGd3TGpkNklpOCtEUW84Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk1UZzVMalFzT0RjdU5HTXRNQzQxTFRBdU1TMHdMamN0TUM0ekxUQXVOeTB3TGpkMkxUQXVPV2cwTGpWMk1DNDVZeTB3TGpFc01DNDBMVEF1TXl3d0xqWXRNQzQzTERBdU4wZ3hPRGt1TkhvZ1RURTVNeTQwTERnNUxqUU5DZ2xqTVM0MUxUQXVNU3d5TGpJdE1DNDNMREl1TXkweVZqZzJhRE11TW5ZdE1pNHhhQzB6TGpKMkxURXVObWd0TWk0MWRqRXVObWd0TkM0MWRpMHhMalpvTFRJdU5uWXhMalpvTFRNdU1sWTRObWd6TGpKMk1TNDBZekF1TVN3eExqTXNNQzQ0TERJc01pNHlMREpJTVRrekxqUjZJRTB4T1RBdU9TdzVPQzR6RFFvSll6SXVNeXd4TGpFc05DNDRMREV1T1N3M0xqWXNNaTQyYkRFdU1pMHlMalJqTFRJdE1DNHpMVFF1TVMwd0xqZ3ROaTR5TFRFdU5tTXhMalV0TVM0eExESXVPQzB5TGpJc015NDRMVE11TldNd0xqUXRNQzQyTERBdU5TMHhMaklzTUM0ekxURXVPV010TUM0MExUQXVPQzB4TGpFdE1TNHlMVEl0TVM0eURRb0phQzB4TWk0M2RqSXVNV2d4TUM0NFl6QXVNeXd3TERBdU5Td3dMakVzTUM0MkxEQXVNbk13TERBdU1pMHdMaklzTUM0MFl5MHdMamtzTUM0NUxUSXNNUzQ0TFRNdU15d3lMalpqTFRFdU55MHhMVEl1T1MweExqa3RNeTQwTFRJdU5tZ3RNeTR4WXpFdU1pd3hMalFzTWk0MkxESXVOeXcwTGpFc015NDREUW9KWXkweUxqTXNNQzQ1TFRRdU5pd3hMalV0Tmk0NUxERXVPR3d4TGpNc01pNHlRekU0TlM0NUxERXdNQzR5TERFNE9DNDJMRGs1TGpNc01Ua3dMamtzT1RndU0zb2dUVEU0TVM0M0xEa3dMamwyTFRndU5XTXdMakV0TUM0NExEQXVOQzB4TGpJc01TNHhMVEV1TTJneE5pNDNkaTB5TGpOb0xUZ3VNdzBLQ1dNdE1DNHhMVEF1TWkwekxqRXRNQzR4TFRNdU1Td3dhQzAyTGpkakxURXVOU3d3TGpJdE1pNDBMREV1TXkweUxqVXNNeTR4ZGpndU4yTXdMakVzTXkwd0xqVXNOaTR5TFRFdU5pdzVMalJzTWk0M0xEQXVPRU14T0RFdU1TdzVOeTQyTERFNE1TNDNMRGswTGpNc01UZ3hMamNzT1RBdU9Yb2lMejROQ2p4d1lYUm9JR05zWVhOelBTSnpkRElpSUdROUlrMHhNakl1TlN3NE9TNDFZekF1T0N3d0xERXVOeXd3TGpJc01pNDBMREF1TlhZMExqaGpNQ3d3TGpRdE1DNDVMREV1TkMweUxqY3NNUzQwWXkweUxqRXNNQzB5TGpZdE1DNDVMVEl1TmkweUxqbDJMVEF1T0EwS0NVTXhNVGt1TlN3NU1DNDBMREV5TUM0eUxEZzVMalVzTVRJeUxqVXNPRGt1TlhvZ1RURXlOaTQyTERnMExqWm9MVEV1TjNZekxqVmpMVEF1Tmkwd0xqSXRNUzQxTFRBdU15MHlMalF0TUM0ell5MHpMamdzTUMwMExqWXNNUzQwTFRRdU5pdzBMamwyTUM0MERRb0pZekFzTXk0MExERXVNeXcwTGpZc05DNDFMRFF1Tm1NeExqRXNNQ3d4TGprdE1DNHlMREl1Tmkwd0xqZHNNQzR5TERBdU9HZ3hMalZNTVRJMkxqWXNPRFF1Tmt3eE1qWXVOaXc0TkM0MmVpSXZQZzBLUEhCaGRHZ2dZMnhoYzNNOUluTjBNaUlnWkQwaVRURXpOeTR4TERnM0xqaG9MVEV1TjNZM0xqUmpMVEF1T1N3d0xqVXRNaTQwTERBdU9DMHpMalFzTUM0NFl5MHhMakVzTUMweExqUXRNQzQyTFRFdU5DMHhMamwyTFRZdU5VZ3hNamwyTmk0NFl6QXNNaTR6TERBdU55d3pMaklzTWk0NUxETXVNZzBLQ1dNeExqUXNNQ3d5TGprdE1DNDBMRE11Tmkwd0xqaHNNQzR4TERBdU9HZ3hMalZXT0RjdU9Ib2lMejROQ2p4d1lYUm9JR05zWVhOelBTSnpkREVpSUdROUlrMHhPRGN1T1N3M055NDFZekF0TVN3d0xqZ3RNUzQ0TERFdU55MHhMamh6TVM0M0xEQXVPQ3d4TGpjc01TNDRjeTB3TGpnc01TNDRMVEV1Tnl3eExqaERNVGc0TGpjc056a3VNaXd4T0RjdU9TdzNPQzQwTERFNE55NDVMRGMzTGpWNklpOCtEUW84TDNOMlp6NE5DZz09Iil9DQojZm9ybSAuc19idG57YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURFNUxqSXVNU3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUl1V2J2dVd4Z2w4eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCNFBTSXdjSGdpSUhrOUlqQndlQ0lLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNeklnTXpJaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURNeUlETXlPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3Nkl6UTNOemxDUkR0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4TkM0NExESXhMalZqTFRBdU5Dd3dMVEF1Tnl3d0xURXVNUzB3TGpGakxUSXVNUzB3TGpNdE15NDVMVEV1TkMwMUxqSXRNMk10TVM0ekxURXVOeTB4TGpndE15NDNMVEV1TmkwMUxqaGpNQzR6TFRJdU1Td3hMalF0TXk0NUxETXROUzR5Q2dsak1TNDNMVEV1TXl3ekxqZ3RNUzQ0TERVdU9DMHhMalpqTWk0eExEQXVNeXd6TGprc01TNDBMRFV1TWl3ell6RXVNeXd4TGpjc01TNDRMRE11T0N3eExqWXNOUzQ0WXkwd0xqTXNNaTR4TFRFdU5Dd3pMamt0TXl3MUxqSkRNVGd1TWl3eU1Td3hOaTQxTERJeExqVXNNVFF1T0N3eU1TNDFlZ29KSUUweE5DNDRMRGd1TVdNdE1TNHlMREF0TWk0MExEQXVOQzB6TGpNc01TNHhZeTB5TGpRc01TNDRMVEl1T1N3MUxqTXRNU3czTGpkak1TNDRMREl1TkN3MUxqTXNNaTQ1TERjdU55d3hZekV1TWkwd0xqa3NNUzQ1TFRJdU1pd3lMakV0TXk0Mll6QXVNaTB4TGpVdE1DNHlMVEl1T1MweExqRXROQzR4Q2dsVE1UY3NPQzQwTERFMUxqVXNPQzR5UXpFMUxqTXNPQzR5TERFMUxEZ3VNU3d4TkM0NExEZ3VNWG9pTHo0S1BHYytDZ2s4Wno0S0NRazhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTWpVdU15d3lOeTQxVERJMUxqTXNNamN1TldNdE1DNDJMREF1TkMweExqUXNNQzR6TFRFdU9DMHdMakpzTFRVdU1TMDJMamRqTFRBdU5DMHdMall0TUM0ekxURXVOQ3d3TGpJdE1TNDRiREFzTUFvSkNRbGpNQzQyTFRBdU5Dd3hMalF0TUM0ekxERXVPQ3d3TGpKc05TNHhMRFl1TjBNeU5pd3lOaTR6TERJMUxqa3NNamN1TVN3eU5TNHpMREkzTGpWNklpOCtDZ2s4TDJjK0Nqd3ZaejRLUEM5emRtYytDZz09IikhaW1wb3J0YW50fQ0KI2Zvcm0gLnNfYnRuX3dye2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTXpJZ016SWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlJRE15T3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJelEzTnpsQ1JEdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweE5DNDRMREl4TGpWakxUQXVOQ3d3TFRBdU55d3dMVEV1TVMwd0xqRmpMVEl1TVMwd0xqTXRNeTQ1TFRFdU5DMDFMakl0TTJNdE1TNHpMVEV1TnkweExqZ3RNeTQzTFRFdU5pMDFMamhqTUM0ekxUSXVNU3d4TGpRdE15NDVMRE10TlM0eUNnbGpNUzQzTFRFdU15d3pMamd0TVM0NExEVXVPQzB4TGpaak1pNHhMREF1TXl3ekxqa3NNUzQwTERVdU1pd3pZekV1TXl3eExqY3NNUzQ0TERNdU9Dd3hMallzTlM0NFl5MHdMak1zTWk0eExURXVOQ3d6TGprdE15dzFMakpETVRndU1pd3lNU3d4Tmk0MUxESXhMalVzTVRRdU9Dd3lNUzQxZWdvSklFMHhOQzQ0TERndU1XTXRNUzR5TERBdE1pNDBMREF1TkMwekxqTXNNUzR4WXkweUxqUXNNUzQ0TFRJdU9TdzFMak10TVN3M0xqZGpNUzQ0TERJdU5DdzFMak1zTWk0NUxEY3VOeXd4WXpFdU1pMHdMamtzTVM0NUxUSXVNaXd5TGpFdE15NDJZekF1TWkweExqVXRNQzR5TFRJdU9TMHhMakV0TkM0eENnbFRNVGNzT0M0MExERTFMalVzT0M0eVF6RTFMak1zT0M0eUxERTFMRGd1TVN3eE5DNDRMRGd1TVhvaUx6NEtQR2MrQ2drOFp6NEtDUWs4Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qVXVNeXd5Tnk0MVRESTFMak1zTWpjdU5XTXRNQzQyTERBdU5DMHhMalFzTUM0ekxURXVPQzB3TGpKc0xUVXVNUzAyTGpkakxUQXVOQzB3TGpZdE1DNHpMVEV1TkN3d0xqSXRNUzQ0YkRBc01Bb0pDUWxqTUM0MkxUQXVOQ3d4TGpRdE1DNHpMREV1T0N3d0xqSnNOUzR4TERZdU4wTXlOaXd5Tmk0ekxESTFMamtzTWpjdU1Td3lOUzR6TERJM0xqVjZJaTgrQ2drOEwyYytDand2Wno0S1BDOXpkbWMrQ2c9PSIpIWltcG9ydGFudH0NCi5jLWljb24tdGllYmF7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURFNUxqSXVNU3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUl1V2J2dVd4Z2w4eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCNFBTSXdjSGdpSUhrOUlqQndlQ0lLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNalFnTWpRaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURJMElESTBPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3Nkl6TTNRVUpGTXp0OUNna3VjM1F4ZTJacGJHdzZJMFpHUmtaR1JqdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweU1DNDVMREl6TGpOSU15NHhZeTB4TGpFc01DMHlMVEF1T1MweUxUSldNaTQ0WXpBdE1TNHhMREF1T1MweUxESXRNbWd4Tnk0NFl6RXVNU3d3TERJc01DNDVMRElzTW5ZeE9DNDFRekl5TGprc01qSXVOQ3d5TWl3eU15NHpMREl3TGprc01qTXVNM29pQ2drdlBnbzhaejRLQ1R4d1lYUm9JR05zWVhOelBTSnpkREVpSUdROUlrMDFMaklzTVRrdU9VdzBMREU1TGpKak1TNDFMVEV1T1N3eUxqTXRNeTQ1TERJdU5DMDFMamhqTUMweExEQXVNUzB6TGpFc01DNHhMVFl1TTBnNFl6QXNNaTR5TERBc05DNHpMVEF1TVN3MkxqUmpNQ3d3TGpZdE1DNHhMREV1TWkwd0xqTXNNUzQ0Q2drSmFERXVNV013TGpVc01DNDRMREV1TWl3eUxqUXNNaTR5TERRdU5rZzVZeTB3TGpZdE1TNDFMVEV1TWkweUxqZ3RNUzQyTFRNdU9VTTNMREUzTGpJc05pNHpMREU0TGpZc05TNHlMREU1TGpsNklFMDBMakVzTVRRdU9GWTJMakZqTUMweExqSXNNQzQxTFRFdU9Dd3hMall0TVM0NGFETUtDUWxqTVN3d0xERXVOaXd3TGpjc01TNDJMREV1T0hZNExqWklPQzQ1VmpZdU0yTXdMVEF1TkMwd0xqTXRNQzQyTFRBdU5pMHdMalpvTFRKakxUQXVOQ3d3TFRBdU5pd3dMakl0TUM0MkxEQXVOblk0TGpWSU5DNHhlaUJOTVRJdU9Td3hPUzQxWXkweExqRXNNQzB4TGpjdE1DNDJMVEV1T0MweExqWldNVE1LQ1Fsak1DMHhMakVzTUM0M0xURXVOeXd4TGpndE1TNDRhREZXTkM0eGFERXVOM1l5TGpWSU1qQldPR2d0TkM0emRqTXVNbWd4TGpoak1TNHhMREFzTVM0M0xEQXVOeXd4TGpnc01TNDRkalF1T0dNd0xERXVNUzB3TGpZc01TNDJMVEV1T0N3eExqZElNVEl1T1hvZ1RURXlMamdzTVRNdU0zWTBMak1LQ1Fsak1Dd3dMalFzTUM0ekxEQXVOeXd3TGpjc01DNDNhRE11TW1Nd0xqVXNNQ3d3TGpjdE1DNHpMREF1T0Mwd0xqZDJMVFF1TkdNd0xUQXVOQzB3TGpNdE1DNDNMVEF1Tnkwd0xqZG9MVE11TTBNeE15NHhMREV5TGpZc01USXVPU3d4TWk0NExERXlMamdzTVRNdU0zb2lMejRLUEM5blBnbzhMM04yWno0SyIpfQ0KI3UgLnBme2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTXpJZ016SWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlJRE15T3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJelpFTmtRMlJEdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweU5TNHlMREUzTGpKak1DMHdMalFzTUM0eExUQXVPQ3d3TGpFdE1TNHlZekF0TUM0MExEQXRNQzQ0TFRBdU1TMHhMakpzTWk0MkxUSmpNQzR5TFRBdU1pd3dMak10TUM0MUxEQXVNUzB3TGpoc0xUSXVOUzAwTGpNS0NXTXRNQzR4TFRBdU15MHdMalV0TUM0MExUQXVPQzB3TGpOc0xUTXVNU3d4TGpKakxUQXVOaTB3TGpVdE1TNHpMVEF1T1MweUxqRXRNUzR5YkMwd0xqVXRNeTR6WXpBdE1DNHpMVEF1TXkwd0xqVXRNQzQyTFRBdU5XZ3ROV010TUM0ekxEQXRNQzQyTERBdU1pMHdMallzTUM0MWJDMHdMalVzTXk0ekNnbGpMVEF1T0N3d0xqTXRNUzQwTERBdU55MHlMakVzTVM0eVREY3VNeXczTGpSRE55dzNMak1zTmk0M0xEY3VOQ3cyTGpVc055NDNURFFzTVRFdU9XTXRNQzR5TERBdU15MHdMakVzTUM0MkxEQXVNU3d3TGpoc01pNDJMREpqTUN3d0xqUXRNQzR4TERBdU9DMHdMakVzTVM0eUNnbGpNQ3d3TGpRc01Dd3dMamdzTUM0eExERXVNbXd0TWk0MkxESmpMVEF1TWl3d0xqSXRNQzR6TERBdU5TMHdMakVzTUM0NGJESXVOU3cwTGpOak1DNHhMREF1TXl3d0xqVXNNQzQwTERBdU9Dd3dMak5zTXk0eExURXVNbU13TGpZc01DNDFMREV1TXl3d0xqa3NNaTR4TERFdU1td3dMalVzTXk0ekNnbGpNQ3d3TGpNc01DNHpMREF1TlN3d0xqWXNNQzQxYURWak1DNHpMREFzTUM0MkxUQXVNaXd3TGpZdE1DNDFiREF1TlMwekxqTmpNQzQ0TFRBdU15d3hMalF0TUM0M0xESXVNUzB4TGpKc015NHhMREV1TW1Nd0xqTXNNQzR4TERBdU5pd3dMREF1T0Mwd0xqTnNNaTQxTFRRdU13b0pZekF1TVMwd0xqTXNNQzR4TFRBdU5pMHdMakV0TUM0NFRESTFMaklzTVRjdU1ub2dUVEUyTERJd0xqTmpMVEl1TkN3d0xUUXVNeTB4TGprdE5DNHpMVFF1TTNNeExqa3ROQzR6TERRdU15MDBMak56TkM0ekxERXVPU3cwTGpNc05DNHpVekU0TGpRc01qQXVNeXd4Tml3eU1DNHplaUl2UGdvOEwzTjJaejRLIil9DQojdSAubGJ7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURFNUxqSXVNU3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUl1V2J2dVd4Z2w4eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCNFBTSXdjSGdpSUhrOUlqQndlQ0lLQ1NCMmFXVjNRbTk0UFNJd0lEQWdORFlnTkRZaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURRMklEUTJPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3NkkwWkdSa1pHUmp0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5TXl3eU0yTXlMamtzTUN3MUxqSXRNaTR6TERVdU1pMDFMakp6TFRJdU15MDFMakl0TlM0eUxUVXVNbk10TlM0eUxESXVNeTAxTGpJc05TNHlVekl3TGpFc01qTXNNak1zTWpONklFMHlNeXd5TlM0MkNnbGpMVE11TlN3d0xURXdMalFzTVM0M0xURXdMalFzTlM0eWRqSXVObWd5TUM0M2RpMHlMalpETXpNdU5Dd3lOeTR6TERJMkxqVXNNalV1Tml3eU15d3lOUzQyZWlJdlBnbzhMM04yWno0SyIpfQ0KI3UxIGEucGZ7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURFNUxqSXVNU3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUl1V2J2dVd4Z2w4eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCNFBTSXdjSGdpSUhrOUlqQndlQ0lLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNeklnTXpJaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURNeUlETXlPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3Nkl6WkVOa1EyUkR0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5TlM0eUxERTNMakpqTUMwd0xqUXNNQzR4TFRBdU9Dd3dMakV0TVM0eVl6QXRNQzQwTERBdE1DNDRMVEF1TVMweExqSnNNaTQyTFRKak1DNHlMVEF1TWl3d0xqTXRNQzQxTERBdU1TMHdMamhzTFRJdU5TMDBMak1LQ1dNdE1DNHhMVEF1TXkwd0xqVXRNQzQwTFRBdU9DMHdMak5zTFRNdU1Td3hMakpqTFRBdU5pMHdMalV0TVM0ekxUQXVPUzB5TGpFdE1TNHliQzB3TGpVdE15NHpZekF0TUM0ekxUQXVNeTB3TGpVdE1DNDJMVEF1TldndE5XTXRNQzR6TERBdE1DNDJMREF1TWkwd0xqWXNNQzQxYkMwd0xqVXNNeTR6Q2dsakxUQXVPQ3d3TGpNdE1TNDBMREF1TnkweUxqRXNNUzR5VERjdU15dzNMalJETnl3M0xqTXNOaTQzTERjdU5DdzJMalVzTnk0M1REUXNNVEV1T1dNdE1DNHlMREF1TXkwd0xqRXNNQzQyTERBdU1Td3dMamhzTWk0MkxESmpNQ3d3TGpRdE1DNHhMREF1T0Mwd0xqRXNNUzR5Q2dsak1Dd3dMalFzTUN3d0xqZ3NNQzR4TERFdU1td3RNaTQyTERKakxUQXVNaXd3TGpJdE1DNHpMREF1TlMwd0xqRXNNQzQ0YkRJdU5TdzBMak5qTUM0eExEQXVNeXd3TGpVc01DNDBMREF1T0N3d0xqTnNNeTR4TFRFdU1tTXdMallzTUM0MUxERXVNeXd3TGprc01pNHhMREV1TW13d0xqVXNNeTR6Q2dsak1Dd3dMak1zTUM0ekxEQXVOU3d3TGpZc01DNDFhRFZqTUM0ekxEQXNNQzQyTFRBdU1pd3dMall0TUM0MWJEQXVOUzB6TGpOak1DNDRMVEF1TXl3eExqUXRNQzQzTERJdU1TMHhMakpzTXk0eExERXVNbU13TGpNc01DNHhMREF1Tml3d0xEQXVPQzB3TGpOc01pNDFMVFF1TXdvSll6QXVNUzB3TGpNc01DNHhMVEF1Tmkwd0xqRXRNQzQ0VERJMUxqSXNNVGN1TW5vZ1RURTJMREl3TGpOakxUSXVOQ3d3TFRRdU15MHhMamt0TkM0ekxUUXVNM014TGprdE5DNHpMRFF1TXkwMExqTnpOQzR6TERFdU9TdzBMak1zTkM0elV6RTRMalFzTWpBdU15d3hOaXd5TUM0emVpSXZQZ284TDNOMlp6NEsiKX0NCiN1MSBhLnBmLCAjdTEgYS5sYntjb2xvcjogcmdiYSgwLDAsMCwwKSFpbXBvcnRhbnQ7fQ0KI3UxIGEuYnJpe2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTXpJZ016SWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlJRE15T3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJelpFTmtRMlJEdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWswekxqY3NPUzQ0YURZdU1sWXpMamRJTXk0M1Zqa3VPSG9nVFRFeUxqa3NNamd1TTJnMkxqSjJMVFl1TW1ndE5pNHlWakk0TGpONklFMHpMamNzTWpndU0yZzJMakoyTFRZdU1rZ3pMamRXTWpndU0zb2dUVE11Tnl3eE9TNHhhRFl1TW5ZdE5pNHlDZ2xJTXk0M1ZqRTVMakY2SUUweE1pNDVMREU1TGpGb05pNHlkaTAyTGpKb0xUWXVNbFl4T1M0eGVpQk5Nakl1TWl3ekxqZDJOaTR5YURZdU1sWXpMamRJTWpJdU1ub2dUVEV5TGprc09TNDRhRFl1TWxZekxqZG9MVFl1TWxZNUxqaDZJRTB5TWk0eUxERTVMakZvTmk0eWRpMDJMakpvTFRZdU1sWXhPUzR4Q2dsNklFMHlNaTR5TERJNExqTm9OaTR5ZGkwMkxqSm9MVFl1TWxZeU9DNHplaUl2UGdvOEwzTjJaejRLIil9DQojc191c2Vyc2V0dGluZ190b3B7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURFNUxqSXVNU3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUl1V2J2dVd4Z2w4eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCNFBTSXdjSGdpSUhrOUlqQndlQ0lLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNeklnTXpJaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURNeUlETXlPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3Nkl6WkVOa1EyUkR0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5TlM0eUxERTNMakpqTUMwd0xqUXNNQzR4TFRBdU9Dd3dMakV0TVM0eVl6QXRNQzQwTERBdE1DNDRMVEF1TVMweExqSnNNaTQyTFRKak1DNHlMVEF1TWl3d0xqTXRNQzQxTERBdU1TMHdMamhzTFRJdU5TMDBMak1LQ1dNdE1DNHhMVEF1TXkwd0xqVXRNQzQwTFRBdU9DMHdMak5zTFRNdU1Td3hMakpqTFRBdU5pMHdMalV0TVM0ekxUQXVPUzB5TGpFdE1TNHliQzB3TGpVdE15NHpZekF0TUM0ekxUQXVNeTB3TGpVdE1DNDJMVEF1TldndE5XTXRNQzR6TERBdE1DNDJMREF1TWkwd0xqWXNNQzQxYkMwd0xqVXNNeTR6Q2dsakxUQXVPQ3d3TGpNdE1TNDBMREF1TnkweUxqRXNNUzR5VERjdU15dzNMalJETnl3M0xqTXNOaTQzTERjdU5DdzJMalVzTnk0M1REUXNNVEV1T1dNdE1DNHlMREF1TXkwd0xqRXNNQzQyTERBdU1Td3dMamhzTWk0MkxESmpNQ3d3TGpRdE1DNHhMREF1T0Mwd0xqRXNNUzR5Q2dsak1Dd3dMalFzTUN3d0xqZ3NNQzR4TERFdU1td3RNaTQyTERKakxUQXVNaXd3TGpJdE1DNHpMREF1TlMwd0xqRXNNQzQ0YkRJdU5TdzBMak5qTUM0eExEQXVNeXd3TGpVc01DNDBMREF1T0N3d0xqTnNNeTR4TFRFdU1tTXdMallzTUM0MUxERXVNeXd3TGprc01pNHhMREV1TW13d0xqVXNNeTR6Q2dsak1Dd3dMak1zTUM0ekxEQXVOU3d3TGpZc01DNDFhRFZqTUM0ekxEQXNNQzQyTFRBdU1pd3dMall0TUM0MWJEQXVOUzB6TGpOak1DNDRMVEF1TXl3eExqUXRNQzQzTERJdU1TMHhMakpzTXk0eExERXVNbU13TGpNc01DNHhMREF1Tml3d0xEQXVPQzB3TGpOc01pNDFMVFF1TXdvSll6QXVNUzB3TGpNc01DNHhMVEF1Tmkwd0xqRXRNQzQ0VERJMUxqSXNNVGN1TW5vZ1RURTJMREl3TGpOakxUSXVOQ3d3TFRRdU15MHhMamt0TkM0ekxUUXVNM014TGprdE5DNHpMRFF1TXkwMExqTnpOQzR6TERFdU9TdzBMak1zTkM0elV6RTRMalFzTWpBdU15d3hOaXd5TUM0emVpSXZQZ284TDNOMlp6NEsiKX0NCiNpbXNne2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1IyVnVaWEpoZEc5eU9pQkJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXhPUzR5TGpFc0lGTldSeUJGZUhCdmNuUWdVR3gxWnkxSmJpQXVJRk5XUnlCV1pYSnphVzl1T2lBMkxqQXdJRUoxYVd4a0lEQXBJQ0F0TFQ0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpNVp1KzViR0NYekVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElnMEtDU0IyYVdWM1FtOTRQU0l3SURBZ016SWdNeklpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRE15SURNeU95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krRFFvOGMzUjViR1VnZEhsd1pUMGlkR1Y0ZEM5amMzTWlQZzBLQ1M1emREQjdabWxzYkRvak5rUTJSRFpFTzMwTkNqd3ZjM1I1YkdVK0RRbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTWpVdU15dzBMalpvTFRFNVF6VXNOQzQyTERNdU9TdzFMamNzTXk0NUxEZHNNQ3d5TVM0MGJEUXVPQzAwTGpob01UWXVObU14TGpNc01Dd3lMalF0TVM0eExESXVOQzB5TGpSV04wTXlOeTQzTERVdU55d3lOaTQyTERRdU5pd3lOUzR6TERRdU5ub05DZ2tnVFRJeUxqa3NNVGd1T1VnNExqWjJMVEl1TkdneE5DNHpWakU0TGpsNklFMHlNaTQ1TERFMUxqTklPQzQyZGkweUxqUm9NVFF1TTFZeE5TNHplaUJOTWpJdU9Td3hNUzQzU0RndU5sWTVMalJvTVRRdU0xWXhNUzQzZWlJdlBnMEtQQzl6ZG1jK0RRbz0iKX0NCi5jLWNvbnRhaW5lcntiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czoycHg7cGFkZGluZzoyNXB4O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7Ym94LXNoYWRvdzowIDFweCA0cHggMCByZ2JhKDAsMCwwLC4xNCk7d2lkdGg6NTQ5cHh9DQpoMyBhOnZpc2l0ZWR7b3BhY2l0eTouNCFpbXBvcnRhbnQ7Y29sb3I6I2JiYiFpbXBvcnRhbnR9DQouYy1jb250YWluZXI6aG92ZXJ7dHJhbnNpdGlvbjphbGwgLjVzIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xMTc2NDcpIDAgMXB4IDZweCxyZ2JhKDAsMCwwLC4xMTc2NDcpIDAgMXB4IDRweH0NCi5jLWNvbnRhaW5lcjphY3RpdmV7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwcztib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE4ODIzNSkgMCAxMHB4IDMwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDZweCAxMHB4fQ0KLnR7cGFkZGluZy1ib3R0b206MTBweH0NCi5jLWJvcmRlcnt3aWR0aDo1NTlweDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O21hcmdpbi10b3A6MTdweDttYXJnaW4tYm90dG9tOjIzcHg7Ym9yZGVyLXRvcDojRUVFIDFweCBzb2xpZDtib3JkZXItYm90dG9tOiNFRUUgMXB4IHNvbGlkfQ0KI2hlbHB7cGFkZGluZy1sZWZ0OjEwN3B4IWltcG9ydGFudH0NCi5jLXRvb2xzIGF7Ym9yZGVyOjAhaW1wb3J0YW50fQ0KLmYxMyBhOmhvdmVye2JvcmRlcjpub25lIWltcG9ydGFudH0NCi5mMTMgLm06aG92ZXJ7Ym9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzY2NiFpbXBvcnRhbnR9DQouZyAubTpob3Zlcntib3JkZXItYm90dG9tOnNvbGlkIDFweCAjNjY2IWltcG9ydGFudH0NCi5jLXJvdyBhOmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxcHggc29saWR9DQouYy1zcGFuNiBhOmhvdmVye2JvcmRlci1ib3R0b206bm9uZX0NCi5vcF92ZF9taW5pbmV3ZXN0X2xpbms6aG92ZXJ7b3BhY2l0eTouOH0NCi5vcC10aWViYS1vZmZpY2FsLWxvb2ttb3JlIGE6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDFweCBzb2xpZH0NCm9wLXRpZWJhLWdlbmVyYWwtbG9va21vcmUgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMXB4IHNvbGlkfQ0KLmMtdGlwLW1lbnUgdWwgbGkgYXtjb2xvcjojMzQ3NmQyIWltcG9ydGFudH0NCmgzIGE6aG92ZXJ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O29wYWNpdHk6Ljc7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCmgzIGF7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5zaXRlbGlua19zdW1tYXJ5IGE6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDFweCBzb2xpZH0NCi5jLWdyYXk6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojNjY2IDFweCBzb2xpZH0NCi5vcF9rZWZ1dGFibGVfY29tbWl0dGVsOmhvdmVye2JvcmRlci1ib3R0b206IzY2NiAxcHggc29saWR9DQoub3Atc29mdC1idG5ib3ggYTpob3Zlcntib3JkZXI6bm9uZSFpbXBvcnRhbnR9DQoub3Atc29mdC1hcy1wYy1kb3duYnRue21hcmdpbi1sZWZ0OjAhaW1wb3J0YW50O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzQ3NmQyO3BhZGRpbmc6M3B4IDE1cHg7Ym9yZGVyLXJhZGl1czoycHg7Zm9udC1zaXplOjE0cHg7dHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7Ym9yZGVyOm5vbmU7bWFyZ2luLXRvcDotM3B4fQ0KLm9wLXNvZnQtYXMtcGMtZG93bmJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM3MDk4RDA7dHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7Ym94LXNoYWRvdzowIDJweCA1cHggMCByZ2JhKDAsMCwwLC4xNiksMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9DQouYy1idG4tcHJpbWFyeXttYXJnaW4tbGVmdDowIWltcG9ydGFudDtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzM0NzZkMjtwYWRkaW5nOjNweCAxNXB4O2JvcmRlci1yYWRpdXM6MnB4O2ZvbnQtc2l6ZToxNHB4O3RyYW5zaXRpb246YWxsIC4zcyBlYXNlO2JvcmRlcjpub25lO21hcmdpbi10b3A6LTNweH0NCi5jLWJ0bi1wcmltYXJ5OmhvdmVye2JhY2tncm91bmQtY29sb3I6IzcwOThEMDt0cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTtib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0NCi5vcC1zb2Z0LXRpdGxlIGE6aG92ZXJ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O29wYWNpdHk6Ljc7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5vcC1zb2Z0LXRpdGxlIGF7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30NCi5udW1ze3dpZHRoOjU5OHB4fQ0KLnNlYXJjaF90b29sX2NvbnRlcnt3aWR0aDo1OThweH0NCi5vcF9vZmZpY2FsX3dlaWJvX290aGVyIGE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50fQ0KLm9wX29mZmljYWxfd2VpYm9faW5mbyBhOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lIWltcG9ydGFudH0NCi5vcF9vZmZpY2FsX3dlaWJvX2NvbnRlbnQgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9DQouYy1idG57Ym9yZGVyOm5vbmUhaW1wb3J0YW50fQ0KLm9wLXp4LW5ldy1tdmlkZW8taW5mbzpob3Zlcntib3JkZXItYm90dG9tOm5vbmV9DQoub3AtengtbmV3LW12aWRlby1ybHQgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMXB4IHNvbGlkfQ0KLm9wLXp4LW5ldy1tdmlkZW8tb25lbGluZSBhOmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxcHggc29saWR9DQouaGludF9jb21tb25fcmVzdG9we2NvbG9yOiNFQTQzMzU7Zm9udC1zaXplOm1lZGl1bTtmb250LXdlaWdodDo3MDB9DQoub3AtdGllYmEtZ2VuZXJhbC1tYWluLWNvbCBwOmhvdmVye2JvcmRlcjpub25lIWltcG9ydGFudH0NCi5jLXRleHR7YmFja2dyb3VuZDojMzQ3NmQyO2NvbG9yOiNmZmY7Ym9yZGVyOiMzNDc2ZDIgMXB4IHNvbGlkO3BhZGRpbmctdG9wOjNweDtib3JkZXItcmFkaXVzOjJweH0NCi5jLXRleHQ6aG92ZXJ7YmFja2dyb3VuZDowIDA7Y29sb3I6IzM0NzZkMjtib3JkZXI6IzM0NzZkMiAxcHggc29saWQhaW1wb3J0YW50O3BhZGRpbmctdG9wOjNweDtib3JkZXItcmFkaXVzOjJweH0NCg=="},{"meta":{"name":"googleCommonStyle.css","url":"http://ibaidu.tujidu.com/newcss/googleCommonStyle.css?t=24.26","ts":1637743679615,"mimetype":"text/css"},"source":"LyoqKioqKioqKioqKioqKioqKiogU3RvcmUgR29vZ2xlQ29tbW9uU3R5bGUgKioqKioqKioqKioqKioqKioqKi8NCi8qIHJlZ3VsYXIgaXRlbXMsIHdhcnJpbmc6IGlmcmFtZXMgY291bGQgYmUgdmlkZW9zKi8NCmRpdi5yZXNfdG9wX2Jhbm5lciwNCiNwYWdlIC5maywNCiNoZWFkIC5oZWFkQmxvY2ssDQojcnNfdG9wX25ldywNCiNjb250ZW50X3JpZ2h0LA0KI3Jzbz50YWJsZSwNCiNyc28+ZGl2W2lkKj0iMzAiXSwNCiNyc28gLmMtcmVjb21tZW5kLA0KI3JzbyAubGVmdEJsb2NrLA0KI3JzbyAuaGl0X3RvcF9uZXcsDQojcnNvICNmbGQsDQojcnNvIGRpdi5ycmVjb20tYnRuLXBhcmVudCwNCiNjb250ZW50X3JpZ2h0LA0KI2NlbnRlcl9jb2w+I3RhdywNCiNmbGQsDQojZGVtbyB7DQogICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7DQp9DQovKioqKioqKioqKioqKioqKioqKiBpbml0ICoqKioqKioqKioqKioqKioqKiovDQpib2R5W2dvb2dsZV0gew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmRGZEZkQ7DQp9DQojdG9wX25hdiAjaGR0YnsNCiAgICBiYWNrZ3JvdW5kOiB1bnNldDsNCn0NCiNjbnQgI2hkdGJTdW0sICNjbnQ+I2FwcGJhcnsNCiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDApOw0KfQ0KI2Zvcm0gLmJkc3Vnew0KICAgIHdpZHRoOiA3NiU7DQp9DQojYWxhX2ltZ19yZXN1bHRzew0KICAgIG92ZXJmbG93OmhpZGRlbjsNCn0NCmEsDQphIGVtLA0KI3UgYSB7DQogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KfQ0KYTpob3ZlciwNCmE6aG92ZXIgaDN7DQogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7DQp9DQovKioqKioqKioqKioqKioqKioqKiByZXdyaXRlIGhlYWRlciAqKioqKioqKioqKioqKioqKioqLw0KDQojaGVhZCwNCiNzX3RhYiB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCn0NCiNoZWFkIHsNCiAgICBib3JkZXItYm90dG9tOiBub25lOw0KfQ0KI2Zvcm0gew0KICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0Ow0KfQ0KI2Zvcm0gLmJkc3VnIGxpIHsNCiAgICB3aWR0aDogYXV0bzsNCiAgICBjb2xvcjogIzAwMDsNCiAgICBmb250OiAxNXB4IGFyaWFsOw0KICAgIGxpbmUtaGVpZ2h0OiAyNnB4Ow0KfQ0KI2Zvcm0gLnNfaXB0X3dyLmJnIHsNCiAgICBiYWNrZ3JvdW5kOiAjZmZmOw0KICAgIHdpZHRoOiA3NiU7DQp9DQojZm9ybSAuc19idG4gew0KICAgIGJhY2tncm91bmQ6ICMzNDc2ZDI7DQogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzNDc2ZDI7DQp9DQojZm9ybSAuc19idG46aG92ZXIgew0KICAgIGJhY2tncm91bmQ6ICMzNDc2ZDI7DQogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzNDc2ZDI7DQp9DQojc190YWIgYiB7DQogICAgY29sb3I6ICMzNDc2ZDI7DQogICAgYm9yZGVyLWJvdHRvbTogM3B4ICMzNDc2ZDIgc29saWQ7DQp9DQojc190YWIgew0KICAgIGJvcmRlci1ib3R0b206ICNlMGUwZTAgMXB4IHNvbGlkOw0KfQ0KLyoqKioqKioqKioqKioqKioqKiogcmV3cml0ZSAtIHNlYXJjaEJveCAqKioqKioqKioqKioqKioqKioqLw0KLyogU2VhcmNoVG9vbHMgKi8NCiNjb250YWluZXIgLmhlYWRfbnVtc19jb250X291dGVyIC5zZWFyY2hfdG9vbF9jb250ZXIsDQojY29udGFpbmVyIC5oZWFkX251bXNfY29udF9vdXRlciAubnVtcyB7DQogICAgd2lkdGg6IDYzMHB4Ow0KfQ0KDQovKiBTZWFyY2hJdG1lcyBCb3R0b20gdG8gVG9wIGFuaSAqLw0KI3NlYXJjaCAjcnNvew0KICAgIGFuaW1hdGlvbi1uYW1lOiBhbmlfYm90dG9tVG90b3A7DQogICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAuM3M7DQogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsNCn0NCi8qIFNlYXJjaEJhciBMZWZ0IHRvIFJpZ2h0IGFuaSAqLw0KLnNycCBmb3Jtew0KICAgIGFuaW1hdGlvbi1uYW1lOiBhbmlfbGVmdFRvcmlnaHQ7DQogICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAuM3M7DQogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7DQp9DQoNCiNyc28gLmpVbWtGYjpob3ZlciB7DQogICAgbWFyZ2luOiAwIGF1dG87DQogICAgYm9yZGVyLWxlZnQ6dW5zZXQ7DQogICAgcGFkZGluZzogMHB4IDIwcHggMTVweDsNCiAgICBtYXJnaW4tYm90dG9tOiA0MHB4Ow0KfQ0KI3JzLCAjcnNvIC5new0KICAgIHdpZHRoOiA3NjBweDsNCiAgICBwYWRkaW5nOiAwcHggMjBweCAxNXB4Ow0KICAgIG1hcmdpbi10b3A6IDBweDsNCiAgICBtYXJnaW4tYm90dG9tOiA0MHB4Ow0KICAgIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjEpOw0KICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOw0KfQ0KI3JzLCAjcnNvIC5nIGRpdi5yYyAuc3sNCiAgICBtYXgtd2lkdGg6dW5zZXQ7DQp9DQojcnNvIC5nOmhvdmVyew0KICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4zKTsNCiAgICBib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogICAgLW1vei1ib3gtc2hhZG93OiAwIDAgMXB4IGdyYXk7DQp9DQojcnNvIC5nW3RwbD0nc29mdCddIC5vcC1zb2Z0LXRpdGxlLA0KI3JzbyAuZyBkaXYuciB7DQogICAgbWFyZ2luOiAwcHggLTIwcHggMTBweCAtMjBweDsNCiAgICBwYWRkaW5nOiA4cHggMjBweCA1cHg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4Ow0KfQ0KLyogSXRlbXMgLSBDb2xvciAqLw0KI3JzbyAuZjEzIGEsDQojcnNvIC5mMTMgZW0sDQojcnNvIC5jLXNwYW4xOCBhLA0KI3JzbyAuc3ViTGlua19mYWN0b3J5IGEsDQojcnNvIC5jLXRhYnMtY29udGVudCBhLA0KI3JzbyAub3Bfb2ZmaWNhbF93ZWlib19jb250ZW50IGEsDQojcnNvIC5vcF9vZmZpY2FsX3dlaWJvX3B6IGEsDQojcnNvIC5vcF90aWViYTJfdGFibGlua3NfY29udGFpbmVyIGEsDQojcnNvIC5vcC10aWViYS1nZW5lcmFsLXJpZ2h0LA0KI3JzbyAub3BfZHEwMV90aXRsZSwNCiNyc28gLm9wX2RxMDFfdGFibGUgYSwNCiNyc28gLm9wX2RxMDFfbW9yZWxpbmsgYSwNCiNyc28gLm9wLXRpZWJhLWdlbmVyYWwtbWFpbnBsIGEsDQojcnNvIC5vcC1zZS1saXN0ZW4tcmVjb21tZW5kLA0KI3JzbyAuYy1vZmZzZXQ+ZGl2IGEgew0KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICBjb2xvcjogIzM0NzZkMjsNCn0NCiNyc28gLmYxMyBhOmhvdmVyLA0KI3JzbyAuZjEzIGVtOmhvdmVyLA0KI3JzbyAuc3ViTGlua19mYWN0b3J5IGE6aG92ZXIsDQojcnNvIC5jLXRhYnMtY29udGVudCBhOmhvdmVyLA0KI3JzbyAub3BfdGllYmEyX3RhYmxpbmtzX2NvbnRhaW5lciBhOmhvdmVyLA0KI3JzbyAub3AtdGllYmEtZ2VuZXJhbC1yaWdodDpob3ZlciwNCiNyc28gLm9wX2RxMDFfdGl0bGU6aG92ZXIsDQojcnNvIC5vcF9kcTAxX3RhYmxlIGE6aG92ZXIsDQojcnNvIC5vcF9kcTAxX21vcmVsaW5rIGE6aG92ZXIsDQojcnNvIC5vcC10aWViYS1nZW5lcmFsLW1haW5wbCBhOmhvdmVyLA0KI3JzbyAub3Atc2UtbGlzdGVuLXJlY29tbWVuZDpob3ZlciwNCiNyc28gLmMtb2Zmc2V0PmRpdiBhOmhvdmVyIHsNCiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSFpbXBvcnRhbnQ7DQp9DQojcnNvIC5mMTMgYSB7DQogICAgY29sb3I6ICMwMDgwMDA7DQp9DQovKiBJdGVtcyAtIEFkaiAqLw0KDQojcnNvIC5jLXNwYW4xOCwgI3JzbyAuYy1zcGFuMjR7DQogICAgd2lkdGg6IDEwMCU7DQogICAgbWluLXdpZHRoOiB1bnNldDsNCn0NCiNyc28gLmMtYm9yZGVyIHsNCiAgICB3aWR0aDogYXV0bzsNCiAgICBib3JkZXI6IG5vbmU7DQogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7DQogICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCB0cmFuc3BhcmVudDsNCiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAwcHggMHB4IHRyYW5zcGFyZW50Ow0KICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDBweCAwcHggdHJhbnNwYXJlbnQ7DQogICAgLW8tYm94LXNoYWRvdzogMHB4IDBweCAwcHggdHJhbnNwYXJlbnQ7DQp9DQovKiBJbWcgKi8NCg0KI3JzbyAuc2VfY29tX2lycmVndWxhcl9nYWxsZXJ5IHVsIGxpLA0KI3JzbyAub3BfamluZ3lhbl9saXN0LA0KI3JzbyAuZyAub3AtaW1nLWFkZHJlc3MtbGluay10eXBlIHsNCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgbWFyZ2luLWxlZnQ6IDEwcHg7DQp9DQovKiB0aXRsZSAqLw0KI3JzbyAuZ1t0cGw9J3NvZnQnXSAub3Atc29mdC10aXRsZSBhLA0KI3JzbyAuZ1t0cGw9J3NvZnQnXSAub3Atc29mdC10aXRsZSBhIGVtLA0KI3JzbyAuZyBkaXYucj4gYSwNCiNyc28gLmcgYSBoMywNCiNyc28gLmcgZGl2LnI+IGEgZW0sDQojcmNudCAjcmVzIGgzLA0KI3JjbnQgI2V4dHJhcmVzIGgzew0KICAgIGNvbG9yOiAjMzQ3NmQyOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KLyogdGl0bGU6dmlzaWVkICovDQojcnNvIC5vcC1zb2Z0LXRpdGxlIGE6dmlzaXRlZCwNCiNyc28gLm9wLXNvZnQtdGl0bGUgYTp2aXNpdGVkIGVtLA0KI3JzbyAuZyBkaXYucj4gYTp2aXNpdGVkLA0KI3JzbyAuZyBkaXYucj4gYTp2aXNpdGVkIGVtLA0KI3JjbnQgI3JlcyBhOnZpc2l0ZWQgaDMsDQojcnNvIC5nIGE6dmlzaXRlZCBoMyB7DQogICAgY29sb3I6ICM2NjAwOTk7DQp9DQojcnNvIC5vcC1zb2Z0LXRpdGxlIGEsDQojcnNvIC5nIGRpdi5yPiBhIHsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQojcnNvIC5vcC1zb2Z0LXRpdGxlIGEgZW0sDQojcnNvIC5nIGRpdi5yPiBhIGVtIHsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQojcnNvIC5vcC1zb2Z0LXRpdGxlIGE6aG92ZXI6YWZ0ZXIsDQojcnNvIC5nIGRpdi5yPiBhOmhvdmVyOmFmdGVyIHsNCiAgICBsZWZ0OiAwOw0KICAgIHdpZHRoOiAxMDAlOw0KICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCiNyc28gLm9wLXNvZnQtdGl0bGUgYTphZnRlciwNCiNyc28gLmcgZGl2LnI+IGE6YWZ0ZXIgew0KICAgIGNvbnRlbnQ6ICIiOw0KICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzM0NzZkMjsNCiAgICBib3R0b206IC0ycHg7DQogICAgbGVmdDogMTAwJTsNCiAgICB3aWR0aDogMDsNCiAgICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zLCBsZWZ0IDM1MG1zOw0KICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQogICAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQp9DQoNCiNyc28gLm9wLXNvZnQtdGl0bGUgYSwgI3JzbyAuZyBkaXYucj4gYSB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KDQojcnNvIC5vcC1zb2Z0LXRpdGxlIGE6dmlzaXRlZDpob3ZlcjphZnRlciwNCiNyc28gLmcgZGl2LnI+IGE6dmlzaXRlZDpob3ZlcjphZnRlciB7DQogICAgbGVmdDogMDsNCiAgICB3aWR0aDogMTAwJTsNCiAgICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQp9DQojcnNvIC5vcC1zb2Z0LXRpdGxlIGE6dmlzaXRlZDphZnRlciwNCiNyc28gLmcgZGl2LnI+IGE6dmlzaXRlZDphZnRlciB7DQogICAgY29udGVudDogIiI7DQogICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNjYwMDk5Ow0KICAgIGJvdHRvbTogLTJweDsNCiAgICBsZWZ0OiAxMDAlOw0KICAgIHdpZHRoOiAwOw0KICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQogICAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCn0NCi8qICBBYm91dCBTZWFyY2ggUmVzdWx0ICovDQoNCiNycyB7DQogICAgbWFyZ2luLXRvcDogMHB4Ow0KICAgIHBhZGRpbmc6IDBweCAyMHB4IDE1cHg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KfQ0KI3JzIC50dCB7DQogICAgbWFyZ2luOiAwcHggLTIwcHggNXB4IC0yMHB4Ow0KICAgIHBhZGRpbmc6IDVweCAyMHB4Ow0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4Ow0KfQ0KI3JzIHRhYmxlIHsNCiAgICB3aWR0aDogNjMwcHg7DQogICAgcGFkZGluZzogNXB4IDE1cHg7DQp9DQojcnMgdGFibGUgdHIgYSB7DQogICAgbWFyZ2luLXRvcDogNXB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDVweDsNCiAgICBjb2xvcjogIzM0NzZkMjsNCn0NCiNycyB0YWJsZSB0ciBhOmhvdmVyIHsNCiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCn0NCi8qIHBhZ2UgbnVtcyAqLw0KDQojcGFnZSB7DQogICAgbWluLXdpZHRoOiA3MTBweDsNCiAgICBoZWlnaHQ6IDQwcHg7DQogICAgbGluZS1oZWlnaHQ6IDQwcHg7DQogICAgcGFkZGluZy10b3A6IDVweDsNCiAgICBtYXJnaW46IDBweCAwcHggNTBweCA4MHB4Ow0KfQ0KLm9wLWltZy1hZGRyZXNzLWRlc2t0b3AtY29udHsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KfQ0KI3BhZ2UgYSwNCiNwYWdlIHN0cm9uZyB7DQogICAgY29sb3I6IzM0NzZkMjsNCiAgICBoZWlnaHQ6IGF1dG87DQogICAgYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOw0KICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOw0KICAgIC1tb3otYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOw0KfQ0KI3BhZ2UgLm46aG92ZXIsDQojcGFnZSBhOmhvdmVyIC5wYyB7DQogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7DQogICAgYmFja2dyb3VuZDogI2Q4ZDhkODsNCiAgICBjb2xvcjogIzAwNTdkYTsNCn0NCiNwYWdlIHN0cm9uZyAucGMgew0KICAgIGJhY2tncm91bmQ6ICMzNDc2ZDI7DQogICAgY29sb3I6IHdoaXRlOw0KfQ0KLyogYW5pICovDQpAa2V5ZnJhbWVzIGFuaV9ib3R0b21Ub3RvcCB7DQogICAgMCUgew0KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMzJweCk7DQogICAgICAgIG9wYWNpdHk6IDA7DQogICAgfQ0KICAgIDIwJSB7DQogICAgICAgIG9wYWNpdHk6IDA7DQogICAgfQ0KICAgIDMwJSB7DQogICAgICAgIG9wYWNpdHk6IDAuODsNCiAgICB9DQogICAgMTAwJSB7DQogICAgICAgIG9wYWNpdHk6IDE7DQogICAgfQ0KfQ0KQGtleWZyYW1lcyBhbmlfbGVmdFRvcmlnaHQgew0KICAgIDAlIHsNCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMnB4KTsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMjAlIHsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMzAlIHsNCiAgICAgICAgb3BhY2l0eTogMC44Ow0KICAgIH0NCiAgICAxMDAlIHsNCiAgICAgICAgb3BhY2l0eTogMTsNCiAgICB9DQp9DQojcnNvIGRpdi5nOm5vdChbY2xhc3NdKXsNCiAgICBtYXJnaW4tbGVmdDogMThweDsNCiAgICBtYXJnaW4tcmlnaHQ6IDE4cHg7DQp9DQojcnNvIC5nIC5leHAtb3V0bGluZXsNCiAgICBkaXNwbGF5Om5vbmU7DQp9DQojbWFpbiAjcmNudCAjcmhzIHsNCiAgICBtYXJnaW4tbGVmdDogMTAyMHB4Ow0KfQ0KI3JlcyAuZyAudHN7DQogICAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCiNtYWluICNyY250ICNyaHN7DQogICAgZGlzcGxheTpub25lOw0KfQ0KLnNob3dSaWdodCAjbWFpbiAjcmNudCAjcmhzew0KICAgIGRpc3BsYXk6dW5zZXQ7DQp9DQpjaXRlew0KICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsNCiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KfQ0KLyoqTW9vbmNhbiAtU1RBUlQqKi8NCi8qKkFqYSBMaW5lSGVpZ2h0Ki8NCmRpdi5yZXNfdG9wX2Jhbm5lciAjZm9vdCwjcGFnDQojcmVzIC5yew0KICAgIGxpbmUtaGVpZ2h0OiAxLjM7DQp9DQojcmVzew0KICAgIHBhZGRpbmc6IDA7DQp9DQovKipHb29nbGUgQ29ubmVjdGlvbkJveCovDQojcnMsICNyc28gLmcgew0KICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgYm9yZGVyLXJhZGl1czogMTBweDsNCn0NCiNyc28gLmcgZGl2LnIgew0KICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwcHggMHB4Ow0KfQ0KI3JzbyAuZyAuY2FyZC1zZWN0aW9uLCAjY2VudGVyX2NvbCAua3AtYmxrew0KICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQp9DQovKipSZXdyaXRlIG1haW4gcGFnZSAtPiB3ZWIgc3VtbWFyeSovDQouYzJ4elRiIC5nLCAucnVUY0lkIC5nLCAuZm0wNklmIC5nLCAuY1VuUUtlIC5nLCAuSGFuUW1mIC5nIHsNCiAgICB3aWR0aDogNzU4cHg7DQogICAgcGFkZGluZy1sZWZ0OiAgMjBweCAhaW1wb3J0YW50Ow0KICAgIHBhZGRpbmctcmlnaHQ6IDIwcHggIWltcG9ydGFudDsNCiAgICBib3gtc2hhZG93OiAwIDAgMHB4IDBweCByZ2IoMCwgMCwgMCk7IC8qcmVtb3ZlIHRoZSBzaGFkb3cqLw0KfQ0KZGl2IC54Znh4NWQgew0KICAgIG1hcmdpbi1ib3R0b206IC0xOHB4ICFpbXBvcnRhbnQ7DQogICAgbWFyZ2luLXRvcDogLTI1cHggIWltcG9ydGFudDsNCn0NCmRpdiAueGFxSnpmLnhmeHg1ZCAua25vLWZ0cnsNCiAgICBtYXJnaW4tdG9wOiAxMHB4ICFpbXBvcnRhbnQ7DQp9DQpkaXYgLmtuby1mdHIgYXsNCiAgICBwb3NpdGlvbjogc3RpY2t5Ow0KfQ0KLyoqVGhhbmtzIHRvIE1vb25jYW4gLUVORCoqLw0KI3JjbnQgI3JlcyBoMywgI3JjbnQgI2V4dHJhcmVzIGgzew0KICAgIC8qKnJlc2V0IGZvbnQgc2l6ZSoqLw0KICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KfQ0KI3JjbnQgI3JlcyBoMyBkaXYsICNyY250ICNleHRyYXJlcyBoMyBkaXZ7DQogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KfQ0KLypkZWFsIHdpdGggY2l0ZSB0b28gbG9uZyBhbmQgdGl0bGUgdG9vIHNob3J0Ki8NCiNyc28gLmcgLnI+YT5kaXZ7DQogICAgd2lkdGg6IDM1cmVtOw0KfQ0KZGl2LnJjW2FjLW5lZWRoaWRlXXsNCiAgICBtYXJnaW4tdG9wOiA1cHg7DQogICAgbWFyZ2luLWJvdHRvbTogLTE1cHg7DQp9DQovKnJlc2V0IGxvZ28gcG9zaXRpb24gYXQgZHJvcCAqLw0KLmxvZ297DQogICAgdG9wOnVuc2V0Ow0KfQ0KYm9keVtnb29nbGVdIC5iaWcgLmJhaWR1ew0KICAgIHRyYW5zZm9ybTogdW5zZXQgIWltcG9ydGFudDsNCiAgICBtYXJnaW4tdG9wOiAtMTBweDsNCiAgICBtYXJnaW4tbGVmdDogLTJyZW07DQp9DQpib2R5W2dvb2dsZV0gLmJpZyAuYmFpZHUgI2xvZ28gaW1new0KICAgIG1hcmdpbi10b3A6IC0xNXB4Ow0KfQ0KYm9keVtnb29nbGVdIC5iaWcubWluaWRpdiAuYmFpZHUgI2xvZ28gaW1new0KICAgIGhlaWdodDogNTlweDsNCiAgICB3aWR0aDogdW5zZXQ7DQogICAgbWFyZ2luLXRvcDogLTE4cHg7DQp9DQpib2R5W2dvb2dsZV0gLkE4U0J3ZnsNCiAgICBtYXgtd2lkdGg6IDY5MnB4Ow0KICAgIHdpZHRoOiB1bnNldDsNCiAgICBtYXJnaW4tbGVmdDogMjUlOw0KfQ0KLkFDLnNwLXNlcGFyYXRvcnsNCiAgICBtYXJnaW4tdG9wOiAtMjBweDsNCn0NCiNyc28+ZGl2IC5Jc1p2ZWN7DQogICAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCg=="},{"meta":{"name":"googleOnePageStyle.css","url":"http://ibaidu.tujidu.com/newcss/googleOnePageStyle.css?t=24.26","ts":1637743679616,"mimetype":"text/css"},"source":"LyoqU3RvcmUgR29vZ2xlVHdvUGFnZVN0eWxlKiovDQojcnNvIHsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgZmxvYXQ6IHVuc2V0Ow0KfQ0KI3JzbyAualVta0ZiOmhvdmVyIHsNCiAgICBtYXJnaW4tYm90dG9tOiAzMHB4Ow0KICAgIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KfQ0KI3JzbyAuZ3sNCiAgICB3aWR0aDogdW5zZXQ7DQogICAgbWFyZ2luLWxlZnQ6IDIwcHg7DQogICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICBwYWRkaW5nOiAwcHggMjBweCAxNXB4Ow0KICAgIG1hcmdpbi10b3A6IDBweDsNCiAgICBtYXJnaW4tYm90dG9tOiAzMHB4Ow0KICAgIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgdHJhbnNpdGlvbjogYWxsIDAuMjVzIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7DQp9DQouc2VhcmNoPiNpcmVzICNyc28+Lmd7DQogICAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCiNyc28+LmcgfiBkaXY6bm90KC5nKXsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KfQ0KI21haW4gI3JjbnR7DQogICAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCmJvZHkgI2FwcGJhcixib2R5IC5yaHNjb2wsIGJvZHkgI3RvcF9uYXYsIGJvZHkgI2ZiYXJ7DQogICAgbWluLXdpZHRoOiB1bnNldDsNCn0NCiNyc28gZy1zY3JvbGxpbmctY2Fyb3VzZWx7DQogICAgbWFyZ2luOiB1bnNldDsNCiAgICBtYXJnaW4tbGVmdDogMjBweDsNCn0NCi5jb2x7DQogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCn0NCi5jb2wgI2NlbnRlcl9jb2x7DQogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCiAgICBtYXJnaW4tbGVmdDogdW5zZXQgIWltcG9ydGFudDsNCn0NCi5zcnAgLmJpZyAjdHNmew0KICAgIHdpZHRoOiA4MzNweDsNCn0NCi8qKnNlYXJjaCBib3ggYWxpZ24gY2VudGVyKiovDQouc3JwIGZvcm17DQogICAgbWFyZ2luOiAwIGF1dG87DQp9DQojdG9wX25hdnsNCiAgICBtaW4td2lkdGg6IHVuc2V0Ow0KfQ0KLyoqdmlkZW8gYm94IGFsaWduIGNlbnRlcioqLw0KZy1zZWN0aW9uLXdpdGgtaGVhZGVyew0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCiNoZHRiICNoZHRiLW1zYnsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICB3aWR0aDogMTAwJTsNCn0NCiNoZHRiICNoZHRiLW1zYi12aXN7DQogICAgbWFyZ2luLWxlZnQ6IC0xNjlweDsNCn0NCiNtYWluICNjbnQsICNjbnQgI2NlbnRlcl9jb2wsICNjbnQgI2Zvb3R7DQogICAgd2lkdGg6IGNhbGMoMzYuM3Z3ICsgNTI1cHgpOw0KfQ0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDoxNDQwcHgpew0KICAgIC5STk5YZ2J7DQogICAgICAgIHdpZHRoOiA4MCUgIWltcG9ydGFudDsNCiAgICB9DQp9"},{"meta":{"name":"googleTwoPageStyle.css","url":"http://ibaidu.tujidu.com/newcss/googleTwoPageStyle.css?t=24.26","ts":1637743679616,"mimetype":"text/css"},"source":"LyoqU3RvcmUgR29vZ2xlVHdvUGFnZVN0eWxlKiovDQojcnNvIHsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgZmxvYXQ6IHVuc2V0Ow0KfQ0KI3JzbyAualVta0ZiOmhvdmVyIHsNCiAgICBtYXJnaW4tYm90dG9tOiAzMHB4Ow0KICAgIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KfQ0KI3JzbyAuZywgLnZrX2N7DQogICAgd2lkdGg6IHVuc2V0Ow0KICAgIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgcGFkZGluZzogMTBweCAyMHB4IDE1cHg7DQogICAgbWFyZ2luLXRvcDogMHB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDI1cHg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICB0cmFuc2l0aW9uOiBhbGwgMC4yNXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczsNCn0NCi5zZWFyY2g+I2lyZXMgI3JzbyAuZ3sNCiAgICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KI21haW4gI3JjbnQgI3Joc3sNCiAgICBkaXNwbGF5Om5vbmU7DQp9DQojbWFpbiAjcmNudHsNCiAgICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KI21haW4gI2NudCwgI2NudCAjY2VudGVyX2NvbCwgI2NudCAjZm9vdHsNCiAgICB3aWR0aDogY2FsYyg1NHZ3ICsgMzYwcHgpOw0KfQ0KYm9keSAjYXBwYmFyLGJvZHkgLnJoc2NvbCwgYm9keSAjdG9wX25hdiwgYm9keSAjZmJhcnsNCiAgICBtaW4td2lkdGg6IHVuc2V0Ow0KfQ0KI3JzbyAuQ09Fb2lkew0KICAgIG1hcmdpbjogdW5zZXQ7DQp9DQouY29sew0KICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQp9DQouY29sICNjZW50ZXJfY29sew0KICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQogICAgbWFyZ2luLWxlZnQ6IHVuc2V0ICFpbXBvcnRhbnQ7DQp9DQouc3JnLCAjcnNvLCAjcnNvPmRpdnsNCglkaXNwbGF5OiBncmlkOw0KCWdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LG1pbm1heCg1MCUsMWZyKSk7DQogICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogInhtYWluIHhtYWluIjsNCn0NCi8qI3Jzbz5kaXY6bm90KC5nKSwgI3JzbyAuc3JneyovDQovKiAgICBncmlkLWNvbHVtbi1zdGFydDogMTsqLw0KLyogICAgZ3JpZC1jb2x1bW4tZW5kOiB4bWFpbi1lbmQ7Ki8NCi8qfSovDQovKipzZWFyY2ggYm94IGFsaWduIGNlbnRlcioqLw0KLnNycCBmb3Jtew0KICAgIG1hcmdpbjowIGF1dG87DQp9DQpnLXNlY3Rpb24td2l0aC1oZWFkZXJ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KI2hkdGIgI2hkdGItbXNiew0KICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICAgIHdpZHRoOiAxMDAlOw0KfQ0KI2hkdGIgI2hkdGItbXNiLXZpc3sNCiAgICBtYXJnaW4tbGVmdDogLTE2OXB4Ow0KfQ=="},{"meta":{"name":"bingCommonStyle.css","url":"http://ibaidu.tujidu.com/newcss/bingCommonStyle.css?t=24.26","ts":1637743679616,"mimetype":"text/css"},"source":"LypTdG9yZSBCaW5nQ29tbW9uU3R5bGUqLw0KYm9keSB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsNCn0NCi5zaF9mYXZpY29uew0KICAgIG1hcmdpbi1sZWZ0OiAxNnB4Ow0KfQ0KI2JfY29udGVudCAjYl9yZXN1bHRzPmxpOm5vdCgjbWZhX3Jvb3QpIHsNCiAgICB3aWR0aDogNjcwcHg7DQogICAgcGFkZGluZzogMTJweCAyMHB4ICFpbXBvcnRhbnQ7DQogICAgbWFyZ2luLXRvcDogMHB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDI1cHg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMSk7DQogICAgdHJhbnNpdGlvbjogYWxsIDAuMjVzIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7DQogICAgb3ZlcmZsb3c6IGhpZGRlbjsNCn0NCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBhLA0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGEgew0KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgICBjb2xvcjogIzM0NzZkMjsNCn0NCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBhLCAjYl9yZXN1bHRzIGgyIHN0cm9uZ3sNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LXNpemU6IG1lZGl1bTsNCn0NCiNiX2NvbnRlbnQgI2JfcmVzdWx0cz5saTpob3ZlciB7DQogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjMpOw0KICAgIGJhY2tncm91bmQ6ICNGQ0ZDRkMgIWltcG9ydGFudDsNCiAgICBib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogICAgLW1vei1ib3gtc2hhZG93OiAwIDAgMXB4IGdyYXk7DQp9DQojYl9jb250ZW50ID4jYl9yZXN1bHRzIGxpOm5vdCgjbWZhX3Jvb3QpIGgyIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4Ow0KICAgIG1hcmdpbjogLTEycHggLTIwcHggMTBweCAtMjBweDsNCiAgICBwYWRkaW5nOiA4cHggMjBweCA1cHg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4Ow0KfQ0KDQphLCBhIHN0cm9uZyB7DQogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KfQ0KDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgYSBzdHJvbmcsDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgaDIgYSBzdHJvbmcgew0KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCn0NCi5iX2FsZ286Zmlyc3QtY2hpbGQ6aG92ZXIgaDIgYXsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsNCn0NCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBhOmhvdmVyOmFmdGVyLA0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGE6aG92ZXI6YWZ0ZXIgew0KICAgIGxlZnQ6IDA7DQogICAgd2lkdGg6IDEwMCU7DQogICAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAgIHRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KfQ0KI2JfY29udGVudCAjYl9yZXN1bHRzIGE6aG92ZXIsDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgaDIgYTpob3ZlcnsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQojYl9jb250ZW50ICNiX3Jlc3VsdHMgYTphZnRlciwNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBhOmFmdGVyIHsNCiAgICBjb250ZW50OiAiIjsNCiAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzNDc2ZDI7DQogICAgYm90dG9tOiAtMnB4Ow0KICAgIGxlZnQ6IDEwMCU7DQogICAgd2lkdGg6IDA7DQogICAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zLCBsZWZ0IDM1MG1zOw0KICAgIHRyYW5zaXRpb246IHdpZHRoIDM1MG1zLCBsZWZ0IDM1MG1zOw0KfQ0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGE6dmlzaXRlZCwNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBhOnZpc2l0ZWQgc3Ryb25nLA0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGgyIGE6dmlzaXRlZCwNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBoMiBhOnZpc2l0ZWQgc3Ryb25nIHsNCiAgICBjb2xvcjogIzY2MDA5OTsNCn0NCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBhOnZpc2l0ZWQ6aG92ZXI6YWZ0ZXIsDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgaDIgaDIgYTp2aXNpdGVkOmhvdmVyOmFmdGVyIHsNCiAgICBsZWZ0OiAwOw0KICAgIHdpZHRoOiAxMDAlOw0KICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCiNiX2NvbnRlbnQ+b2wjYl9jb250ZXh0ew0KICAgIGRpc3BsYXk6bm9uZTsNCn0NCmJvZHkgI2JfaGVhZGVyew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7DQp9DQojYl9jb250ZW50IC5iX3VuZGVyU2VhcmNoYm94ew0KICAgIG1hcmdpbi10b3A6IDEwcHg7DQp9DQojYl9oZWFkZXIgLmJfc2NvcGViYXJ7DQogICAgbWFyZ2luOiB1bnNldDsNCn0NCi8qc2VhcmNoIGVuZ2luZSBqdW1wKi8NCi50c2YtcD4ubG9nb2NvbnQsICNzZWotY29udGFpbmVyew0KICAgIG1hcmdpbi1yaWdodDogMzUwcHg7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KLnRzZi1wPi5zZmliYmJjew0KICAgIG1hcmdpbi1yaWdodDogMzUwcHg7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KLmJfc2VhcmNoYm94Rm9ybSAuc2FfdG17DQogICAgdGV4dC1hbGlnbjogbGVmdDsgLyogU2VhcmNoQm94IHRleHQgQ2VudGVyICovDQp9DQpib2R5ICNiX2hlYWRlciAjZXN0X3N3aXRjaHsNCiAgICBtYXJnaW46IDAgYXV0bzsNCiAgICBwYWRkaW5nLXJpZ2h0OiAxMCU7IC8qKlRPRE8qKiovDQp9DQpib2R5ICNlc3RfY246OmFmdGVyLCBib2R5ICNlc3RfZW46OmFmdGVyew0KICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xLDEuMykgcGVyc3BlY3RpdmUoLjVlbSkgcm90YXRlWCgwZGVnKTsNCiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xLDEuMykgcGVyc3BlY3RpdmUoLjVlbSkgcm90YXRlWCgwZGVnKTsNCn0NCkBtZWRpYSAobWF4LXdpZHRoOiAxMTAwcHgpew0KICAgIGJvZHkgI2JfaGVhZGVyICNlc3Rfc3dpdGNoew0KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMS4ycmVtKTsNCiAgICB9DQp9DQovKiBTZWFyY2hJdG1lcyBCb3R0b20gdG8gVG9wIGFuaSAqLw0KI2JfY29udGVudHsNCiAgICBhbmltYXRpb24tbmFtZTogYW5pX2JvdHRvbVRvdG9wOw0KICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC42czsNCiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOw0KfQ0KDQovKiBTZWFyY2hCYXIgTGVmdCB0byBSaWdodCBhbmkgKi8NCmJvZHkgI2JfaGVhZGVyIHsNCiAgICBhbmltYXRpb24tbmFtZTogYW5pX3RvcFRvYnV0dG9tOw0KICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC42czsNCiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCmJvZHl7DQogICAgYW5pbWF0aW9uLW5hbWU6IGFuaV9oaWRlVG9TaG93Ow0KICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC42czsNCiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCi5BQy5zcC1zZXBhcmF0b3J7DQogICAgbWFyZ2luLXRvcDogLTE1cHg7DQp9DQpAa2V5ZnJhbWVzIGFuaV9sZWZ0VG9yaWdodCB7DQogICAgMCUgew0KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMycHgpOw0KICAgICAgICBvcGFjaXR5OiAwOw0KICAgIH0NCiAgICAyMCUgew0KICAgICAgICBvcGFjaXR5OiAwOw0KICAgIH0NCiAgICAzMCUgew0KICAgICAgICBvcGFjaXR5OiAwLjg7DQogICAgfQ0KICAgIDEwMCUgew0KICAgICAgICBvcGFjaXR5OiAxOw0KICAgIH0NCn0NCi8qIGFuaSAqLw0KQGtleWZyYW1lcyBhbmlfYm90dG9tVG90b3Agew0KICAgIDAlIHsNCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDMycHgpOw0KICAgICAgICBvcGFjaXR5OiAwOw0KICAgIH0NCiAgICAyMCUgew0KICAgICAgICBvcGFjaXR5OiAwOw0KICAgIH0NCiAgICAzMCUgew0KICAgICAgICBvcGFjaXR5OiAwLjg7DQogICAgfQ0KICAgIDEwMCUgew0KICAgICAgICBvcGFjaXR5OiAxOw0KICAgIH0NCn0NCkAtd2Via2l0LWtleWZyYW1lcyBhbmlfdG9wVG9idXR0b20gew0KICAgIDAlIHsNCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTMycHgpOw0KICAgICAgICBvcGFjaXR5OiAwOw0KICAgIH0NCiAgICAyMCUgew0KICAgICAgICBvcGFjaXR5OiAwOw0KICAgIH0NCiAgICAzMCUgew0KICAgICAgICBvcGFjaXR5OiAwLjg7DQogICAgfQ0KICAgIDEwMCUgew0KICAgICAgICBvcGFjaXR5OiAxOw0KICAgIH0NCn0NCkAtd2Via2l0LWtleWZyYW1lcyBhbmlfaGlkZVRvU2hvdyB7DQogICAgMCUgew0KICAgICAgICBkaXNwbGF5Om5vbmU7DQogICAgICAgIG9wYWNpdHk6IDA7DQogICAgfQ0KICAgIDIwJSB7DQogICAgICAgIGRpc3BsYXk6bm9uZTsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMzAlIHsNCiAgICAgICAgZGlzcGxheTpub25lOw0KICAgICAgICBvcGFjaXR5OiAwLjg7DQogICAgfQ0KICAgIDEwMCUgew0KICAgICAgICBvcGFjaXR5OiAxOw0KICAgIH0NCn0NCg=="},{"meta":{"name":"bingOnePageStyle.css","url":"http://ibaidu.tujidu.com/newcss/bingOnePageStyle.css?t=24.26","ts":1637743679626,"mimetype":"text/css"},"source":"LypTdG9yZSBCaW5nT25lUGFnZVN0eWxlKi8NCiNiX2NvbnRlbnQgYXNpZGV7DQogICAgZGlzcGxheTpub25lOw0KfQ0KI2JfY29udGVudCAjYl9yZXN1bHRzew0KICAgIHdpZHRoOiA3M3Z3Ow0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgIG1heC13aWR0aDogMTAwMHB4Ow0KfQ0KYm9keSAjYl9oZWFkZXJ7DQogICAgd2lkdGg6IDcydnc7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgIG1hcmdpbjogMCBhdXRvOw0KfQ0KYm9keSAjYl9jb250ZW50ew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgbWFyZ2luLWxlZnQ6IHVuc2V0Ow0KICAgIHBhZGRpbmctbGVmdDogdW5zZXQ7DQp9DQojYl9jb250ZW50ICNiX3Jlc3VsdHM+bGk6bm90KCNtZmFfcm9vdCkgew0KICAgIHdpZHRoOjk4JTsNCn0NCg=="},{"meta":{"name":"bingTwoPageStyle.css","url":"http://ibaidu.tujidu.com/newcss/bingTwoPageStyle.css?t=24.26","ts":1637743679637,"mimetype":"text/css"},"source":"LypTdG9yZSBCaW5nVHdvUGFnZVN0eWxlKi8NCiNjb250YWluZXIgI2NvbnRlbnRfbGVmdCAuaGl0X3RvcF9uZXcsDQojYl9jb250ZW50IGFzaWRlLCAjYl9yZXN1bHRzICNtZmFfcm9vdHsNCiAgICBkaXNwbGF5Om5vbmU7DQp9DQojYl9jb250ZW50ICNiX3Jlc3VsdHN7DQogICAgd2lkdGg6IDczdnc7DQogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsbWlubWF4KDUwJSwxZnIpKTsNCiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiAieG1haW4geG1haW4iOw0KICAgIGRpc3BsYXk6IGlubGluZS1ncmlkOw0KfQ0KI2JfY29udGVudCAjYl9yZXN1bHRzPmxpOm5vdCgjbWZhX3Jvb3QpIHsNCiAgICB3aWR0aDo5OCU7DQogICAgbWFyZ2luLWxlZnQ6IDElOw0KfQ0KI2JfcmVzdWx0cyAuYl9hbGdvIC5iX2RlZXAgdWx7DQogICAgd2lkdGg6IDUwJTsNCn0NCiNiX21zZywgI2JfcGFnew0KICAgIGdyaWQtY29sdW1uLWVuZDogeG1haW4tZW5kOw0KICAgIGdyaWQtY29sdW1uLXN0YXJ0OiAxOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7DQp9DQpib2R5ICNiX2NvbnRlbnR7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICBtYXJnaW4tbGVmdDogdW5zZXQ7DQogICAgcGFkZGluZy1sZWZ0OiB1bnNldDsNCn0NCmJvZHkgI2JfaGVhZGVyew0KICAgIHdpZHRoOiA3MnZ3Ow0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICBtYXJnaW46IDAgYXV0bzsNCn0NCg=="},{"meta":{"name":"duckCommonStyle.css","url":"http://ibaidu.tujidu.com/newcss/duckCommonStyle.css?t=24.26","ts":1637743679637,"mimetype":"text/css"},"source":"LypTdG9yZTogRHVja0R1Y2tHb0NvbW1vblN0eWxlKi8NCmJvZHkgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7DQp9DQoucmVzdWx0X19pY29uIC5yZXN1bHRfX2ljb25fX2ltZywgLnJlc3VsdF9faWNvbiAucmVzdWx0X19pY29uIGltZ3sNCiAgICBkaXNwbGF5OiBub25lOw0KfQ0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDJ7DQogICAgZm9udC13ZWlnaHQ6IDYwMDsNCn0NCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluew0KICAgIG1heC13aWR0aDogNjcwcHg7DQp9DQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCB7DQogICAgd2lkdGg6IDY3MHB4Ow0KICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgbWFyZ2luLXRvcDogMHB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDI1cHg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMSk7DQogICAgdHJhbnNpdGlvbjogYWxsIDAuMjVzIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7DQp9DQouZGFyay1iZyAjbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOw0KfQ0KLmRhcmstYmcgI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDIgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDU7DQp9DQouZGFyay1iZyAjbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCAucmVzdWx0X190aXRsZSBhIHsNCiAgICBjb2xvcjogI0NDQ0NDQzsNCn0NCi5kYXJrLWJnICNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIC5yZXN1bHRfX3RpdGxlIGE6dmlzaXRlZCB7DQogICAgY29sb3I6ICNiNzY2M2U7DQp9DQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCAucmVzdWx0X190aXRsZSBhIHsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOw0KICAgIG1heC13aWR0aDogNjQwcHg7DQogICAgY29sb3I6ICMzNDc2ZDI7DQogICAgZm9udC1zaXplOiBzbWFsbGVyOw0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCAucmVzdWx0X19ib2R5ew0KICAgIHBhZGRpbmc6IDEycHggMjBweCAhaW1wb3J0YW50Ow0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcDpob3ZlciB7DQogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjMpOw0KICAgIGJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCiAgICAtbW96LWJveC1zaGFkb3c6IDAgMCAxcHggZ3JheTsNCn0NCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4Ow0KICAgIG1hcmdpbjogLTEycHggLTIwcHggMHB4IC0yMHB4Ow0KICAgIHBhZGRpbmc6IDhweCAyMHB4IDVweDsNCiAgICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDBweCAwcHg7DQp9DQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiBhOmhvdmVyOmFmdGVyIHsNCiAgICBsZWZ0OiAwOw0KICAgIHdpZHRoOiAxMDAlOw0KICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIGE6YWZ0ZXIgew0KICAgIGNvbnRlbnQ6ICIiOw0KICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzM0NzZkMjsNCiAgICBib3R0b206IDFweDsNCiAgICBsZWZ0OiAxMDAlOw0KICAgIHdpZHRoOiAwOw0KICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQogICAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCn0NCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIGE6dmlzaXRlZCwNCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIGE6dmlzaXRlZCBzdHJvbmcgew0KICAgIGNvbG9yOiAjNjYwMDk5Ow0KfQ0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDIgYTp2aXNpdGVkOmhvdmVyOmFmdGVyLA0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDIgYTp2aXNpdGVkOmhvdmVyOmFmdGVyIHsNCiAgICBsZWZ0OiAwOw0KICAgIHdpZHRoOiAxMDAlOw0KICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCg0KLyogU2VhcmNoSXRtZXMgQm90dG9tIHRvIFRvcCBhbmkgKi8NCiNsaW5rc193cmFwcGVyICNsaW5rcyB7DQogICAgYW5pbWF0aW9uLW5hbWU6IGFuaV9ib3R0b21Ub3RvcDsNCiAgICBhbmltYXRpb24tZHVyYXRpb246IC4zczsNCiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOw0KfQ0KDQovKiBTZWFyY2hCYXIgTGVmdCB0byBSaWdodCBhbmkgKi8NCiNoZWFkZXJfd3JhcHBlciAuaGVhZGVyX19zZWFyY2gtd3JhcCB7DQogICAgYW5pbWF0aW9uLW5hbWU6IGFuaV9sZWZ0VG9yaWdodDsNCiAgICBhbmltYXRpb24tZHVyYXRpb246IC4zczsNCiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCkBrZXlmcmFtZXMgYW5pX2xlZnRUb3JpZ2h0IHsNCiAgICAwJSB7DQogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMzJweCk7DQogICAgICAgIG9wYWNpdHk6IDA7DQogICAgfQ0KICAgIDIwJSB7DQogICAgICAgIG9wYWNpdHk6IDA7DQogICAgfQ0KICAgIDMwJSB7DQogICAgICAgIG9wYWNpdHk6IDAuODsNCiAgICB9DQogICAgMTAwJSB7DQogICAgICAgIG9wYWNpdHk6IDE7DQogICAgfQ0KfQ0KLyogYW5pICovDQpAa2V5ZnJhbWVzIGFuaV9ib3R0b21Ub3RvcCB7DQogICAgMCUgew0KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMzJweCk7DQogICAgICAgIG9wYWNpdHk6IDA7DQogICAgfQ0KICAgIDIwJSB7DQogICAgICAgIG9wYWNpdHk6IDA7DQogICAgfQ0KICAgIDMwJSB7DQogICAgICAgIG9wYWNpdHk6IDAuODsNCiAgICB9DQogICAgMTAwJSB7DQogICAgICAgIG9wYWNpdHk6IDE7DQogICAgfQ0KfQ0K"},{"meta":{"name":"duckOnePageStyle.css","url":"http://ibaidu.tujidu.com/newcss/duckOnePageStyle.css?t=24.26","ts":1637743679637,"mimetype":"text/css"},"source":"LypTdG9yZTogRHVja0R1Y2tHb09uZVBhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsICNvcmdhbmljLW1vZHVsZSwgLnBpbm5lZC10by1ib3R0b217DQogICAgZGlzcGxheTogbm9uZTsNCn0NCi5qcy1yZXN1bHQtaGlkZGVuLWVsew0KICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCn0NCi5zaXRlLXdyYXBwZXIgI3dlYl9jb250ZW50X3dyYXBwZXIgLmN3IHsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIG1heC13aWR0aDogdW5zZXQ7DQogICAgbWFyZ2luLWxlZnQ6IC0xNTBweDsNCn0NCg0KI2hlYWRlcl93cmFwcGVyICNoZWFkZXIsDQojd2ViX2NvbnRlbnRfd3JhcHBlciAjbGlua3Nfd3JhcHBlciAuc2VhcmNoLWZpbHRlcnMtd3JhcCwNCiN3ZWJfY29udGVudF93cmFwcGVyICNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tZXNzYWdlew0KICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICAgIGRpc3BsYXk6IGdyaWQ7DQp9DQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciB7DQogICAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCg0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciAuaGVhZGVyX19zZWFyY2gtd3JhcCB7DQogICAgd2lkdGg6IDUwMHB4Ow0KfQ0KI2xpbmtzX3dyYXBwZXJ7DQogICAgZGlzcGxheTogaW5saW5lLWZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQp9DQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbnsNCiAgICBmbG9hdDogdW5zZXQ7DQp9DQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tc2lkZWJhcnsNCiAgICBtaW4td2lkdGg6IHVuc2V0Ow0KICAgIG1hcmdpbjogdW5zZXQ7DQp9DQouYm9keS0tc2VycCAuZm9vdGVyew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgcGFkZGluZy1sZWZ0OiB1bnNldDsNCn0NCg=="},{"meta":{"name":"duckTwoPageStyle.css","url":"http://ibaidu.tujidu.com/newcss/duckTwoPageStyle.css?t=24.26","ts":1637743679638,"mimetype":"text/css"},"source":"LypTdG9yZTogRHVja0R1Y2tHb1R3b1BhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsDQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tc2lkZWJhciwNCiNvcmdhbmljLW1vZHVsZSwNCi5waW5uZWQtdG8tYm90dG9tew0KICAgIGRpc3BsYXk6IG5vbmU7DQp9DQouanMtcmVzdWx0LWhpZGRlbi1lbHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQouc2l0ZS13cmFwcGVyICN3ZWJfY29udGVudF93cmFwcGVyIC5jdyB7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBtYXgtd2lkdGg6IHVuc2V0Ow0KICAgIG1hcmdpbi1sZWZ0OiAtMTUwcHg7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyLA0KI3dlYl9jb250ZW50X3dyYXBwZXIgI2xpbmtzX3dyYXBwZXIgLnNlYXJjaC1maWx0ZXJzLXdyYXAsDQojd2ViX2NvbnRlbnRfd3JhcHBlciAjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWVzc2FnZXsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICBkaXNwbGF5OiBncmlkOw0KfQ0KI2hlYWRlcl93cmFwcGVyICNoZWFkZXIgew0KICAgIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyIC5oZWFkZXJfX3NlYXJjaC13cmFwIHsNCiAgICB3aWR0aDogNTAwcHg7DQp9DQojbGlua3Nfd3JhcHBlcnsNCiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCn0NCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluew0KICAgIGZsb2F0OiB1bnNldDsNCiAgICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLXNpZGViYXJ7DQogICAgbWluLXdpZHRoOiB1bnNldDsNCiAgICBtYXJnaW46IHVuc2V0Ow0KfQ0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzew0KICAgIHdpZHRoOiA4MHZ3Ow0KICAgIC8qIFRoaXMgbWF5IGNhdXNlIFBhZ2UgZmFpbGVkICovDQogICAgZGlzcGxheTogaW5saW5lLWdyaWQ7DQogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlOw0KICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJ4bWFpbiB4bWFpbiI7DQp9DQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbiAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcHsNCiAgICB3aWR0aDogdW5zZXQ7DQogICAgbWFyZ2luLXJpZ2h0OiAxNXB4Ow0KfQ0KI2xpbmtzIC5yZXN1bHQtLW1vcmUsICNsaW5rcyAucmVzdWx0LS1zZXB7DQogICAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7DQogICAgZ3JpZC1jb2x1bW4tZW5kOiB4bWFpbi1lbmQ7DQogICAgd2lkdGg6IHVuc2V0ICFpbXBvcnRhbnQ7DQogICAgcGFkZGluZzogMDsNCiAgICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KfQ0KI2xpbmtzIC5yZXN1bHQtLXNlcHsNCiAgICBtYXJnaW4tYm90dG9tOiAyZW07DQp9DQouYm9keS0tc2VycCAuZm9vdGVyew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgcGFkZGluZy1sZWZ0OiB1bnNldDsNCn0NCg=="},{"meta":{"name":"dogeCommonStyle.css","url":"http://ibaidu.tujidu.com/newcss/dogeCommonStyle.css?t=24.26","ts":1637743679638,"mimetype":"text/css"},"source":"LypTdG9yZTogRG9nZUNvbW1vblN0eWxlKi8NCmJvZHkgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7DQp9DQoucmVzdWx0c19saW5rc19kZWVwIC5yZXN1bHRfX2ljb257DQogICAgZGlzcGxheTogbm9uZTsNCn0NCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyew0KICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQp9DQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbnsNCiAgICBtYXgtd2lkdGg6IDY3MHB4Ow0KfQ0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgew0KICAgIHdpZHRoOiA2NzBweDsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgIG1hcmdpbi10b3A6IDBweDsNCiAgICBtYXJnaW4tYm90dG9tOiAyNXB4Ow0KICAgIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjEpOw0KICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOw0KfQ0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgLnJlc3VsdF9fdGl0bGUgYSB7DQogICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsNCiAgICBtYXgtd2lkdGg6IDY0MHB4Ow0KICAgIGNvbG9yOiAjMzQ3NmQyOw0KICAgIGZvbnQtc2l6ZTogc21hbGxlcjsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgLnJlc3VsdF9fYm9keXsNCiAgICBwYWRkaW5nOiAxMnB4IDIwcHggIWltcG9ydGFudDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXA6aG92ZXIgew0KICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4zKTsNCiAgICBib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogICAgLW1vei1ib3gtc2hhZG93OiAwIDAgMXB4IGdyYXk7DQp9DQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCiAgICBtYXJnaW46IC0xMnB4IC0yMHB4IDBweCAtMjBweDsNCiAgICBwYWRkaW5nOiA4cHggMjBweCA1cHg7DQogICAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4Ow0KfQ0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDIgYTpob3ZlcjphZnRlciB7DQogICAgbGVmdDogMDsNCiAgICB3aWR0aDogMTAwJTsNCiAgICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQp9DQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiBhOmFmdGVyIHsNCiAgICBjb250ZW50OiAiIjsNCiAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzNDc2ZDI7DQogICAgYm90dG9tOiAxcHg7DQogICAgbGVmdDogMTAwJTsNCiAgICB3aWR0aDogMDsNCiAgICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zLCBsZWZ0IDM1MG1zOw0KICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQogICAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQp9DQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiBhOnZpc2l0ZWQsDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiBhOnZpc2l0ZWQgc3Ryb25nIHsNCiAgICBjb2xvcjogIzY2MDA5OTsNCn0NCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIGE6dmlzaXRlZDpob3ZlcjphZnRlciwNCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIGE6dmlzaXRlZDpob3ZlcjphZnRlciB7DQogICAgbGVmdDogMDsNCiAgICB3aWR0aDogMTAwJTsNCiAgICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQogICAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQp9DQoNCi8qIFNlYXJjaEl0bWVzIEJvdHRvbSB0byBUb3AgYW5pICovDQojbGlua3Nfd3JhcHBlciAjbGlua3Mgew0KICAgIGFuaW1hdGlvbi1uYW1lOiBhbmlfYm90dG9tVG90b3A7DQogICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAuM3M7DQogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsNCn0NCg0KLyogU2VhcmNoQmFyIExlZnQgdG8gUmlnaHQgYW5pICovDQojaGVhZGVyX3dyYXBwZXIgLmhlYWRlcl9fc2VhcmNoLXdyYXAgew0KICAgIGFuaW1hdGlvbi1uYW1lOiBhbmlfbGVmdFRvcmlnaHQ7DQogICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAuM3M7DQogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7DQp9DQouQUMuc3Atc2VwYXJhdG9yew0KICAgIG1hcmdpbi10b3A6IC0xNXB4Ow0KfQ0KQGtleWZyYW1lcyBhbmlfbGVmdFRvcmlnaHQgew0KICAgIDAlIHsNCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMnB4KTsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMjAlIHsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMzAlIHsNCiAgICAgICAgb3BhY2l0eTogMC44Ow0KICAgIH0NCiAgICAxMDAlIHsNCiAgICAgICAgb3BhY2l0eTogMTsNCiAgICB9DQp9DQovKiBhbmkgKi8NCkBrZXlmcmFtZXMgYW5pX2JvdHRvbVRvdG9wIHsNCiAgICAwJSB7DQogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzMnB4KTsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMjAlIHsNCiAgICAgICAgb3BhY2l0eTogMDsNCiAgICB9DQogICAgMzAlIHsNCiAgICAgICAgb3BhY2l0eTogMC44Ow0KICAgIH0NCiAgICAxMDAlIHsNCiAgICAgICAgb3BhY2l0eTogMTsNCiAgICB9DQp9DQo="},{"meta":{"name":"dogeOnePageStyle.css","url":"http://ibaidu.tujidu.com/newcss/dogeOnePageStyle.css?t=24.26","ts":1637743679649,"mimetype":"text/css"},"source":"LypTdG9yZTogRG9nZU9uZVBhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsICNvcmdhbmljLW1vZHVsZSwgLnBpbm5lZC10by1ib3R0b217DQogICAgZGlzcGxheTogbm9uZTsNCn0NCi5qcy1yZXN1bHQtaGlkZGVuLWVsew0KICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCn0NCi5zaXRlLXdyYXBwZXIgI3dlYl9jb250ZW50X3dyYXBwZXIgLmN3IHsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMDBweCkgew0KICAgICNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIHsNCiAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgfQ0KfQ0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciwNCiN3ZWJfY29udGVudF93cmFwcGVyICNsaW5rc193cmFwcGVyIC5zZWFyY2gtZmlsdGVycy13cmFwLA0KI3dlYl9jb250ZW50X3dyYXBwZXIgI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1lc3NhZ2V7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgZGlzcGxheTogZ3JpZDsNCn0NCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyIHsNCiAgICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciAuaGVhZGVyX19zZWFyY2gtd3JhcCB7DQogICAgd2lkdGg6IDUwMHB4Ow0KfQ0KI2xpbmtzX3dyYXBwZXJ7DQogICAgZGlzcGxheTogaW5saW5lLWZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgcGFkZGluZy1sZWZ0OiAwOw0KfQ0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW57DQogICAgZmxvYXQ6IHVuc2V0Ow0KICAgIG1heC13aWR0aDogODYwcHg7DQp9DQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tc2lkZWJhcnsNCiAgICBtaW4td2lkdGg6IHVuc2V0Ow0KICAgIG1hcmdpbjogdW5zZXQ7DQp9DQouYm9keS0tc2VycCAuZm9vdGVyew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgcGFkZGluZy1sZWZ0OiB1bnNldDsNCn0NCg=="},{"meta":{"name":"dogeTwoPageStyle.css","url":"http://ibaidu.tujidu.com/newcss/dogeTwoPageStyle.css?t=24.26","ts":1637743679660,"mimetype":"text/css"},"source":"LypTdG9yZTogRG9nZVR3b1BhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsDQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tc2lkZWJhciwNCiNvcmdhbmljLW1vZHVsZSwNCi5waW5uZWQtdG8tYm90dG9tew0KICAgIGRpc3BsYXk6IG5vbmU7DQp9DQouanMtcmVzdWx0LWhpZGRlbi1lbHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQouc2l0ZS13cmFwcGVyICN3ZWJfY29udGVudF93cmFwcGVyIC5jdyB7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBtYXgtd2lkdGg6IHVuc2V0Ow0KICAgIG1hcmdpbi1sZWZ0OiAtMTUwcHg7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyLA0KI3dlYl9jb250ZW50X3dyYXBwZXIgI2xpbmtzX3dyYXBwZXIgLnNlYXJjaC1maWx0ZXJzLXdyYXAsDQojd2ViX2NvbnRlbnRfd3JhcHBlciAjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWVzc2FnZXsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICBkaXNwbGF5OiBncmlkOw0KfQ0KI2hlYWRlcl93cmFwcGVyICNoZWFkZXIgew0KICAgIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyIC5oZWFkZXJfX3NlYXJjaC13cmFwIHsNCiAgICB3aWR0aDogNTAwcHg7DQp9DQojbGlua3Nfd3JhcHBlcnsNCiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCn0NCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluew0KICAgIGZsb2F0OiB1bnNldDsNCiAgICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLXNpZGViYXJ7DQogICAgbWluLXdpZHRoOiB1bnNldDsNCiAgICBtYXJnaW46IHVuc2V0Ow0KfQ0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzew0KICAgIHdpZHRoOiA4MHZ3Ow0KICAgIC8qIFRoaXMgbWF5IGNhdXNlIFBhZ2UgZmFpbGVkICovDQogICAgZGlzcGxheTogaW5saW5lLWdyaWQ7DQogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlOw0KICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJ4bWFpbiB4bWFpbiI7DQp9DQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbiAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcHsNCiAgICB3aWR0aDogdW5zZXQ7DQogICAgbWFyZ2luLXJpZ2h0OiAxNXB4Ow0KfQ0KI2xpbmtzIC5yZXN1bHQtLW1vcmUsICNsaW5rcyAucmVzdWx0LS1zZXB7DQogICAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7DQogICAgZ3JpZC1jb2x1bW4tZW5kOiB4bWFpbi1lbmQ7DQogICAgd2lkdGg6IHVuc2V0ICFpbXBvcnRhbnQ7DQogICAgcGFkZGluZzogMDsNCiAgICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KfQ0KI2xpbmtzIC5yZXN1bHQtLXNlcHsNCiAgICBtYXJnaW4tYm90dG9tOiAyZW07DQp9DQouYm9keS0tc2VycCAuZm9vdGVyew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgcGFkZGluZy1sZWZ0OiB1bnNldDsNCn0NCg=="},{"meta":{"name":"HuYanStyle.css","url":"http://ibaidu.tujidu.com/newcss/HuYanStyle.css?t=24.26","ts":1637743679658,"mimetype":"text/css"},"source":"LyoqU3RvcmUgSHVZYW5TdHlsZSoqLw0KLyoqKioqQmFpZHUtSHVZYW5TdHlsZSoqKioqLw0KYm9keVtiYWlkdV0sDQojd3JhcHBlciAjaGVhZCwNCiN3cmFwcGVyICNzX3RhYiwNCmZvcm0uZm0gLnNfaXB0X3dyLmJnew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7DQp9DQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3AsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IGFydGljbGUsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5jLWNvbnRhaW5lciwNCiN3cmFwcGVyICNycywNCiN3cmFwcGVyICNjb250ZW50X3JpZ2h0ew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNBQUFBQUEgOw0KICAgIGJvcmRlcjogMXB4IGRvdWJsZSAjQTJEN0Q0IDsNCiAgICBib3JkZXItcmFkaXVzOiAwcHg7DQp9DQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3A6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQ6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3A6aG92ZXIgYXJ0aWNsZXsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDICFpbXBvcnRhbnQ7DQp9DQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQgaDMsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5yZXN1bHQtb3AgaDMsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5jLWNvbnRhaW5lciBoMywNCiN3cmFwcGVyICNycyAudHR7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI0JCQkJCQiA7DQp9DQovKioqQmluZy1IdVlhblN0eWxlKioqKi8NCi5uYV9jbnQgLm53c19pdG0sDQoubndzX2l0bWIsDQojYl9jb250ZW50ICNiX3Jlc3VsdHM+bGk6bm90KCNtZmFfcm9vdCksDQpib2R5ICNiX2hlYWRlcnsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUFBQUFBIDsNCiAgICBib3JkZXI6IDFweCBkb3VibGUgI0EyRDdENCA7DQogICAgYm9yZGVyLXJhZGl1czogMHB4Ow0KfQ0KI2JfY29udGVudCAjYl9yZXN1bHRzIGxpOmhvdmVyIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDICFpbXBvcnRhbnQ7DQp9DQojYl9jb250ZW50ICNiX3Jlc3VsdHMgbGkgaDJ7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI0JCQkJCQiA7DQp9DQovKioqR29vZ2xlLUh1WWFuU3R5bGUqKioqLw0KYm9keVtnb29nbGVdew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmRGZEZkQ7DQp9DQojcnNvIC5nLCAuYmtXTWdkPi5nLA0KLmJrV01nZCBnLWlubmVyLWNhcmQsDQojcmhzY29sICNyaHMsDQojcmhzY29sICNyaHMgLmc+ZGl2LA0KLmMyeHpUYiAuZywNCi5ydVRjSWQgLmcsDQouZm0wNklmIC5nLA0KLmNVblFLZSAuZywNCi5IYW5RbWYgLmcsDQojcnNvIC5nLA0KI3JzbyAua3AtYmxrLA0KI3JzbyAuTUdxakssDQojcnNvPmRpdjpub3QoLmcpPip7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI0FBQUFBQSA7DQogICAgYm9yZGVyOiAxcHggc29saWQgIzljZDJjZkFBOw0KICAgIGJvcmRlci1yYWRpdXM6IDBweDsNCn0NCiNyc28gLmc6aG92ZXIsDQouYmtXTWdkPi5nOmhvdmVyIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDICFpbXBvcnRhbnQ7DQogICAgYm9yZGVyOiAxcHggZG91YmxlICM5Y2QyY2Y7DQp9DQouYmtXTWdkIC5nIGRpdi5yLA0KI3JzbyAuZyBoM3sNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQkJCQkJCIDsNCn0NCi8qKipTb2dvdS1IdVlhblN0eWxlKioqKi8NCmJvZHlbc29nb3VdLCAjcGFnZWJhcl9jb250YWluZXIgYXsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZkRmRGZEOw0KfQ0KI21haW4gLnJlc3VsdHM+ZGl2ew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNBQUFBQUEgOw0KICAgIGJvcmRlcjogMXB4IHNvbGlkICM5Y2QyY2ZBQTsNCiAgICBib3JkZXItcmFkaXVzOiAwcHg7DQp9DQojbWFpbiAucmVzdWx0cz5kaXY6aG92ZXIgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0MgIWltcG9ydGFudDsNCiAgICBib3JkZXI6IDFweCBkb3VibGUgIzljZDJjZjsNCn0NCiNtYWluIC5yZXN1bHRzPmRpdiBoM3sNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQkJCQkJCIDsNCn0NCi8qKipEdWNrX0RvZ2UtSHVZYW5TdHlsZSoqKiovDQpib2R5W2R1Y2tdLGJvZHlbZG9nZV17DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZEZkRmRDsNCn0NCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNBQUFBQUEgOw0KICAgIGJvcmRlcjogMXB4IHNvbGlkICM5Y2QyY2ZBQTsNCiAgICBib3JkZXItcmFkaXVzOiAwcHg7DQp9DQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcDpob3ZlciB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQyAhaW1wb3J0YW50Ow0KICAgIGJvcmRlcjogMXB4IGRvdWJsZSAjOWNkMmNmOw0KfQ0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDJ7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI0JCQkJCQiA7DQp9DQo="},{"meta":{"name":"SiteConfigRules.conf","url":"http://ibaidu.tujidu.com/newcss/SiteConfigRules.conf?t=24.26","ts":1637743679659,"mimetype":"text/plain"},"source":"b25saW5lREIgPSB7DQogICBiYWlkdTogew0KICAgICAgIFNpdGVUeXBlSUQ6IDEsDQogICAgICAgTWFpblR5cGU6ICIjY29udGVudF9sZWZ0IC5jLWNvbnRhaW5lciIsDQogICAgICAgU3R5cGVfTm9ybWFsOiAiaDMudD5hLCAuYy1jb250YWluZXIgYXJ0aWNsZSBhIiwNCiAgICAgICBGYXZpY29uVHlwZTogIi5jLXNob3d1cmwiLA0KICAgICAgIEZhdmljb25BZGRUbzogImgzIiwNCiAgICAgICBDb3VudGVyVHlwZTogIiNjb250ZW50X2xlZnQ+I2RvdWJsZT5kaXZbc3JjaWRdICpbY2xhc3N+PXRdLFtjbGFzc349b3BfYmVzdF9hbnN3ZXJfcXVlc3Rpb25dLCNjb250ZW50X2xlZnQ+ZGl2W3NyY2lkXSAqW2NsYXNzfj10XSxbY2xhc3N+PW9wX2Jlc3RfYW5zd2VyX3F1ZXN0aW9uXSIsDQogICAgICAgQmxvY2tUeXBlOiAiaDMgYSIsDQogICAgICAgcGFnZXI6ew0KICAgICAgICAgICBuZXh0TGluazogJy8vZGl2W0BpZD0icGFnZSJdLy9hW2NvbnRhaW5zKHRleHQoKSwiw6TCuMKLw6TCuMKAw6nCocK1IildW0BocmVmXScsDQogICAgICAgICAgIHBhZ2VFbGVtZW50OiAiY3NzO2RpdiNjb250ZW50X2xlZnQgPiAqIiwNCiAgICAgICAgICAgSFRfaW5zZXJ0OiBbICJjc3M7ZGl2I2NvbnRlbnRfbGVmdCIsIDIgXSwNCiAgICAgICAgICAgcmVwbGFjZUU6ICJjc3M7I3BhZ2UiLA0KICAgICAgICAgICBzdHlsaXNoOiAiLmF1dG9wYWdlcml6ZV9wYWdlX2luZm8sIGRpdi5zcC1zZXBhcmF0b3Ige21hcmdpbi1ib3R0b206IDEwcHggIWltcG9ydGFudDt9LmMtaW1nLWJvcmRlcntkaXNwbGF5Om5vbmV9IiwNCiAgICAgICB9DQogICB9LA0KICAgc29nb3U6IHsNCiAgICAgICBTaXRlVHlwZUlEOiAyLA0KICAgICAgIE1haW5UeXBlOiAiI21haW4gLnJlc3VsdHM+ZGl2IiwNCiAgICAgICBTdHlwZV9Ob3JtYWw6ICJoMy5wdD5hLCBoMy52clRpdGxlPmEiLA0KICAgICAgIEZhdmljb25UeXBlOiAiY2l0ZVtpZCo9J2NhY2hlcmVzdWx0X2luZm9fJ10iLA0KICAgICAgIEZhdmljb25BZGRUbzogImgzIiwNCiAgICAgICBDb3VudGVyVHlwZTogIi5yZXN1bHRzPmRpdiIsDQogICAgICAgQmxvY2tUeXBlOiAiaDMgYSIsDQogICAgICAgcGFnZXI6ew0KICAgICAgICAgICBuZXh0TGluazogIi8vZGl2W0BpZD1cInBhZ2ViYXJfY29udGFpbmVyXCJdLy9hW0BpZD1cInNvZ291X25leHRcIl0iLA0KICAgICAgICAgICBwYWdlRWxlbWVudDogIi8vZGl2W0BjbGFzcz0ncmVzdWx0cyddL2RpdiIsDQogICAgICAgICAgIEhUX2luc2VydDogWyIvL2RpdltAY2xhc3M9J3Jlc3VsdHMnXSIsIDJdLA0KICAgICAgICAgICByZXBsYWNlRTogImlkKCdwYWdlYmFyX2NvbnRhaW5lcicpIg0KICAgICAgIH0NCiAgIH0sDQogICBoYW9zb3U6IHsNCiAgICAgICBTaXRlVHlwZUlEOiAzLA0KICAgICAgIE1haW5UeXBlOiAiLnJlcy1saXN0IiwNCiAgICAgICBTdHlwZV9Ob3JtYWw6ICIucmVzLWxpc3QgaDM+YSIsDQogICAgICAgRmF2aWNvblR5cGU6ICJjaXRlIiwNCiAgICAgICBGYXZpY29uQWRkVG86ICJoMyIsDQogICAgICAgQ291bnRlclR5cGU6ICIucmVzdWx0cz5kaXYiLA0KICAgICAgIEJsb2NrVHlwZTogImgzIGEiLA0KICAgICAgIHBhZ2VyOnsNCiAgICAgICAgICAgbmV4dExpbms6ICIvL2RpdltAaWQ9J3BhZ2UnXS8vYVt0ZXh0KCk9J8OkwrjCi8OkwrjCgMOpwqHCtT4nXSB8IGlkKCdzbmV4dCcpIiwNCiAgICAgICAgICAgcGFnZUVsZW1lbnQ6ICIvL2RpdltAaWQ9J2NvbnRhaW5lciddL2RpdiIsDQogICAgICAgICAgIEhUX2luc2VydDogWyIvL2RpdltAaWQ9J2NvbnRhaW5lciddIiwgMl0sDQogICAgICAgICAgIHJlcGxhY2VFOiAiaWQoJ3BhZ2UnKSINCiAgICAgICB9DQogICB9LA0KICAgZ29vZ2xlOiB7DQogICAgICAgU2l0ZVR5cGVJRDogNCwNCiAgICAgICBNYWluVHlwZTogIiNyc28gLmciLA0KICAgICAgIEZhdmljb25UeXBlOiAiLmlVaDMwIiwNCiAgICAgICBGYXZpY29uQWRkVG86ICJoMyIsDQogICAgICAgQ291bnRlclR5cGU6ICIjcnNvIC5nIGgzLC5feUU+ZGl2W2NsYXNzfj1fa2tdIGgzIiwNCiAgICAgICBCbG9ja1R5cGU6ICIucmM+ZGl2PmEsICNycywgI3JzbyAuZyBhIiwNCiAgICAgICBwYWdlcjp7DQogICAgICAgICAgIG5leHRMaW5rOiAnaWQoInBubmV4dCIpIHwgaWQoIm5hdmJhciBuYXZjbnQgbmF2IikvL3RkW3NwYW5dL2ZvbGxvd2luZy1zaWJsaW5nOjp0ZFsxXS9hIHwgaWQoIm5uIikvcGFyZW50OjphJywNCiAgICAgICAgICAgcGFnZUVsZW1lbnQ6ICcvL2RpdltAaWQ9InJlcyJdJywNCiAgICAgICAgICAgSFRfaW5zZXJ0OiBbICJjc3M7I3JlcyIsIDIgXSwNCiAgICAgICAgICAgcmVwbGFjZUU6ICcvL2RpdltAaWQ9Im5hdmNudCJdIHwgLy9kaXZbQGlkPSJyY250Il0vL2RpdltAcm9sZT0ibmF2aWdhdGlvbiJdJw0KICAgICAgIH0NCiAgIH0sDQogICBiaW5nOiB7DQogICAgICAgU2l0ZVR5cGVJRDogNSwNCiAgICAgICBNYWluVHlwZTogIiNiX3Jlc3VsdHM+bGkiLA0KICAgICAgIEZhdmljb25UeXBlOiAiLmJfYXR0cmlidXRpb24+Y2l0ZSIsDQogICAgICAgRmF2aWNvbkFkZFRvOiAiaDIiLA0KICAgICAgIENvdW50ZXJUeXBlOiAiI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbnNdPmgyLCNiX3Jlc3VsdHM+bGlbY2xhc3N+PWJfYWxnb10+aDIsI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbGdvXT5oMiIsDQogICAgICAgQmxvY2tUeXBlOiAiaDIgYSIsDQogICAgICAgcGFnZXI6ew0KICAgICAgICAgICBuZXh0TGluazogIi8vYVtjb250YWlucyhAY2xhc3MsXCJzYl9wYWdOXCIpXSIsDQogICAgICAgICAgIHBhZ2VFbGVtZW50OiAiaWQoXCJiX3Jlc3VsdHNcIikvbGlbbm90KGNvbnRhaW5zKEBjbGFzcyxcImJfcGFnXCIpIG9yIGNvbnRhaW5zKEBjbGFzcyxcImJfYW5zIGJfdG9wXCIpKV0iLA0KICAgICAgICAgICBIVF9pbnNlcnQ6IFsiaWQoXCJiX3Jlc3VsdHNcIikvbGlbQGNsYXNzPVwiYl9wYWdcIl0iLCAxXSwNCiAgICAgICAgICAgcmVwbGFjZUU6ICJpZChcImJfcmVzdWx0c1wiKS8vbmF2W0Byb2xlPVwibmF2aWdhdGlvblwiXSIsDQogICAgICAgfQ0KICAgfSwNCiAgIGR1Y2s6IHsNCiAgICAgICBTaXRlVHlwZUlEOiAxMCwNCiAgICAgICBNYWluVHlwZTogIiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIiwNCiAgICAgICBGYXZpY29uVHlwZTogIi5yZXN1bHRzX2xpbmtzX2RlZXAgLnJlc3VsdF9fdXJsX19kb21haW4iLA0KICAgICAgIEZhdmljb25BZGRUbzogImgyIiwNCiAgICAgICBDb3VudGVyVHlwZTogIiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIiwNCiAgICAgICBCbG9ja1R5cGU6ICJoMiBhIiwNCiAgICAgICBwYWdlcjp7DQogICAgICAgICAgIG5leHRMaW5rOiAiLy9hW2NvbnRhaW5zKEBjbGFzcyxcInNiX3BhZ05cIildIiwNCiAgICAgICAgICAgcGFnZUVsZW1lbnQ6ICJpZChcImJfcmVzdWx0c1wiKS9saVtub3QoY29udGFpbnMoQGNsYXNzLFwiYl9wYWdcIikgb3IgY29udGFpbnMoQGNsYXNzLFwiYl9hbnMgYl90b3BcIikpXSIsDQogICAgICAgICAgIEhUX2luc2VydDogWyJpZChcImJfcmVzdWx0c1wiKS9saVtAY2xhc3M9XCJiX3BhZ1wiXSIsIDFdLA0KICAgICAgICAgICByZXBsYWNlRTogImlkKFwiYl9yZXN1bHRzXCIpLy9uYXZbQHJvbGU9XCJuYXZpZ2F0aW9uXCJdIiwNCiAgICAgICB9DQogICB9LA0KICAgZG9nZTogew0KICAgICAgU2l0ZVR5cGVJRDogMTEsDQogICAgICBNYWluVHlwZTogIiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIiwNCiAgICAgIEZhdmljb25UeXBlOiAiLnJlc3VsdHNfbGlua3NfZGVlcCAucmVzdWx0X191cmxfX2RvbWFpbiIsDQogICAgICBGYXZpY29uQWRkVG86ICJoMiIsDQogICAgICBDb3VudGVyVHlwZTogIiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIiwNCiAgICAgIEJsb2NrVHlwZTogImgyIGEiLA0KICAgICAgcGFnZXI6ew0KICAgICAgICAgIG5leHRMaW5rOiAiLy9hW2NvbnRhaW5zKEBjbGFzcywgJ3Jlc3VsdC0tbW9yZScpXSIsDQogICAgICAgICAgcGFnZUVsZW1lbnQ6ICJpZCgnbGlua3Nfd3JhcHBlcicpLy9kaXZbY29udGFpbnMoQGNsYXNzLCAncmVzdWx0c19saW5rc19kZWVwJyldIiwNCiAgICAgICAgICBIVF9pbnNlcnQ6IFsiaWQoJ2xpbmtzX3dyYXBwZXInKS8vZGl2W0BpZD0nbGlua3MnXS9kaXZbY29udGFpbnMoQGNsYXNzLCAncmVzdWx0LS1tb3JlJyldIiwgMV0sDQogICAgICAgICAgcmVwbGFjZUU6ICJpZCgnbGlua3Nfd3JhcHBlcicpLy9kaXZbY29udGFpbnMoQGNsYXNzLCAncmVzdWx0LS1tb3JlJyldL2FbY29udGFpbnModGV4dCgpLCAnw6TCuMKLw6TCuMKAw6nCocK1JyldW0BocmVmXSIsDQogICAgICB9DQogICB9LA0KICAgbUJhaWR1OnsNCiAgICAgICBTaXRlVHlwZUlEOiA2LA0KICAgICAgIE1haW5UeXBlOiAiI2JfcmVzdWx0cz5saSIsDQogICAgICAgRmF2aWNvblR5cGU6ICIuYl9hdHRyaWJ1dGlvbj5jaXRlIiwNCiAgICAgICBGYXZpY29uQWRkVG86ICJoMiIsDQogICAgICAgQ291bnRlclR5cGU6ICIjYl9yZXN1bHRzPmxpW2NsYXNzfj1iX2Fuc10+aDIsI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbGdvXT5oMiwjYl9yZXN1bHRzPmxpW2NsYXNzfj1iX2FsZ29dPmgyIiwNCiAgICAgICBCbG9ja1R5cGU6ICJoMiBhIiwNCiAgIH0sDQogICB6aGlodTogew0KICAgICAgIFNpdGVUeXBlSUQ6IDcsDQogICB9LA0KICAgYmFpZHVfeHVlc2h1OnsNCiAgICAgICBTaXRlVHlwZUlEOiA4LA0KICAgICAgIE1haW5UeXBlOiAiI2NvbnRlbnRfbGVmdCAucmVzdWx0IiwNCiAgICAgICBTdHlwZV9Ob3JtYWw6ICJoMy50PmEsICNyZXN1bHRzIC5jLWNvbnRhaW5lcj4uYy1ibG9ja2EiLA0KICAgICAgIEZhdmljb25UeXBlOiAiLnJlc3VsdC1vcCwgLmMtc2hvd3VybCIsDQogICAgICAgRmF2aWNvbkFkZFRvOiAiaDMiLA0KICAgICAgIENvdW50ZXJUeXBlOiAiI2NvbnRlbnRfbGVmdD4jZG91YmxlPmRpdltzcmNpZF0gKltjbGFzc349dF0sW2NsYXNzfj1vcF9iZXN0X2Fuc3dlcl9xdWVzdGlvbl0sI2NvbnRlbnRfbGVmdD5kaXZbc3JjaWRdICpbY2xhc3N+PXRdLFtjbGFzc349b3BfYmVzdF9hbnN3ZXJfcXVlc3Rpb25dIiwNCiAgICAgICBCbG9ja1R5cGU6ICJoMyBhIiwNCiAgIH0sDQogICBvdGhlcjogew0KICAgICAgIFNpdGVUeXBlSUQ6IDksDQogICB9DQp9DQo="}],"requires":[{"meta":{"name":"vue.min.js","url":"https://cdn.staticfile.org/vue/2.6.11/vue.min.js","ts":1637743679787,"mimetype":"text/javascript"},"source":"LyohCiAqIFZ1ZS5qcyB2Mi42LjExCiAqIChjKSAyMDE0LTIwMTkgRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KIWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuVnVlPXQoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiB0KGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gcihlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBzKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09YS5jYWxsKGUpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiB0Pj0wJiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbihlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxzKGUpJiZlLnRvU3RyaW5nPT09YT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHAoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19dmFyIGQ9cCgic2xvdCxjb21wb25lbnQiLCEwKSx2PXAoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gaChlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB5KGUsdCl7cmV0dXJuIG0uY2FsbChlLHQpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbbl18fCh0W25dPWUobikpfX12YXIgXz0vLShcdykvZyxiPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShfLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSwkPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLHc9L1xCKFtBLVpdKS9nLEM9ZyhmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgeD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByP3I+MT9lLmFwcGx5KHQsYXJndW1lbnRzKTplLmNhbGwodCxuKTplLmNhbGwodCl9cmV0dXJuIG4uX2xlbmd0aD1lLmxlbmd0aCxufTtmdW5jdGlvbiBrKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmQSh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFMoZSx0LG4pe312YXIgVD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LEU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIE4oZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj1vKGUpLHI9byh0KTtpZighbnx8IXIpcmV0dXJuIW4mJiFyJiZTdHJpbmcoZSk9PT1TdHJpbmcodCk7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkoZSksYT1BcnJheS5pc0FycmF5KHQpO2lmKGkmJmEpcmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuZXZlcnkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gTihlLHRbbl0pfSk7aWYoZSBpbnN0YW5jZW9mIERhdGUmJnQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO2lmKGl8fGEpcmV0dXJuITE7dmFyIHM9T2JqZWN0LmtleXMoZSksYz1PYmplY3Qua2V5cyh0KTtyZXR1cm4gcy5sZW5ndGg9PT1jLmxlbmd0aCYmcy5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gTihlW25dLHRbbl0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGooZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihOKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gRChlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsTT1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLEk9WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLEY9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpULGlzUmVzZXJ2ZWRBdHRyOlQsaXNVbmtub3duRWxlbWVudDpULGdldFRhZ05hbWVzcGFjZTpTLHBhcnNlUGxhdGZvcm1UYWdOYW1lOkUsbXVzdFVzZVByb3A6VCxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6SX0sUD0vYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvO2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgSD1uZXcgUmVnRXhwKCJbXiIrUC5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgQixVPSJfX3Byb3RvX18iaW57fSx6PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFY9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSz1WJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSj16JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHE9SiYmL21zaWV8dHJpZGVudC8udGVzdChKKSxXPUomJkouaW5kZXhPZigibXNpZSA5LjAiKT4wLFo9SiYmSi5pbmRleE9mKCJlZGdlLyIpPjAsRz0oSiYmSi5pbmRleE9mKCJhbmRyb2lkIiksSiYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEopfHwiaW9zIj09PUspLFg9KEomJi9jaHJvbWVcL1xkKy8udGVzdChKKSxKJiYvcGhhbnRvbWpzLy50ZXN0KEopLEomJkoubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykpLFk9e30ud2F0Y2gsUT0hMTtpZih6KXRyeXt2YXIgZWU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGVlLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7UT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLGVlKX1jYXRjaChlKXt9dmFyIHRlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PUImJihCPSF6JiYhViYmInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLEJ9LG5lPXomJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIHJlKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgaWUsb2U9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnJlKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmcmUoUmVmbGVjdC5vd25LZXlzKTtpZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmcmUoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBhZT1TLHNlPTAsY2U9ZnVuY3Rpb24oKXt0aGlzLmlkPXNlKyssdGhpcy5zdWJzPVtdfTtjZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxjZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2godGhpcy5zdWJzLGUpfSxjZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Y2UudGFyZ2V0JiZjZS50YXJnZXQuYWRkRGVwKHRoaXMpfSxjZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0sY2UudGFyZ2V0PW51bGw7dmFyIHVlPVtdO2Z1bmN0aW9uIGxlKGUpe3VlLnB1c2goZSksY2UudGFyZ2V0PWV9ZnVuY3Rpb24gZmUoKXt1ZS5wb3AoKSxjZS50YXJnZXQ9dWVbdWUubGVuZ3RoLTFdfXZhciBwZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sZGU9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtkZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGUucHJvdG90eXBlLGRlKTt2YXIgdmU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBwZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIG5ldyBwZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW5ldyBwZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIHllPUFycmF5LnByb3RvdHlwZSxnZT1PYmplY3QuY3JlYXRlKHllKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9eWVbZV07UihnZSxlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09YXJndW1lbnRzW3JdO3ZhciBpLG89dC5hcHBseSh0aGlzLG4pLGE9dGhpcy5fX29iX187c3dpdGNoKGUpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjppPW47YnJlYWs7Y2FzZSJzcGxpY2UiOmk9bi5zbGljZSgyKX1yZXR1cm4gaSYmYS5vYnNlcnZlQXJyYXkoaSksYS5kZXAubm90aWZ5KCksb30pfSk7dmFyIF9lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGdlKSxiZT0hMDtmdW5jdGlvbiAkZShlKXtiZT1lfXZhciB3ZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGNlLHRoaXMudm1Db3VudD0wLFIoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhVPyh0PWdlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07UihlLG8sdFtvXSl9fShlLGdlLF9lKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiBDZShlLHQpe3ZhciBuO2lmKG8oZSkmJiEoZSBpbnN0YW5jZW9mIHBlKSlyZXR1cm4geShlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiB3ZT9uPWUuX19vYl9fOmJlJiYhdGUoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHMoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyB3ZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiB4ZShlLHQsbixyLGkpe3ZhciBvPW5ldyBjZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChuPWVbdF0pO3ZhciB1PSFpJiZDZShuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1zP3MuY2FsbChlKTpuO3JldHVybiBjZS50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KHQpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfSh0KSkpLHR9LHNldDpmdW5jdGlvbih0KXt2YXIgcj1zP3MuY2FsbChlKTpuO3Q9PT1yfHx0IT10JiZyIT1yfHxzJiYhY3x8KGM/Yy5jYWxsKGUsdCk6bj10LHU9IWkmJkNlKHQpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmYyh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bixuO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8oeGUoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOihlW3RdPW4sbil9ZnVuY3Rpb24gQWUoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZjKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHx5KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fXdlLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspeGUoZSx0W25dKX0sd2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspQ2UoZVt0XSl9O3ZhciBPZT1GLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1vZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLHkoZSxuKT9yIT09aSYmcyhyKSYmcyhpKSYmU2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gbj9mdW5jdGlvbigpe3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChuLG4pOnQsaT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmNhbGwobixuKTplO3JldHVybiByP1NlKHIsaSk6aX06dD9lP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnQsImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5jYWxsKHRoaXMsdGhpcyk6ZSl9OnQ6ZX1mdW5jdGlvbiBFZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIE5lKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/QShpLHQpOml9T2UuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/VGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sSS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2VdPUVlfSksTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2UrInMiXT1OZX0pLE9lLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1ZJiYoZT12b2lkIDApLHQ9PT1ZJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBBKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LE9lLnByb3BzPU9lLm1ldGhvZHM9T2UuaW5qZWN0PU9lLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEEoaSxlKSx0JiZBKGksdCksaX0sT2UucHJvdmlkZT1UZTt2YXIgamU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIERlKGUsdCxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dC5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2IoaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHMobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bYihhKV09cyhpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHQpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYocyhuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXMoYSk/QSh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fSh0KSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0odCksIXQuX2Jhc2UmJih0LmV4dGVuZHMmJihlPURlKGUsdC5leHRlbmRzLG4pKSx0Lm1peGlucykpZm9yKHZhciByPTAsaT10Lm1peGlucy5sZW5ndGg7cjxpO3IrKyllPURlKGUsdC5taXhpbnNbcl0sbik7dmFyIG8sYT17fTtmb3IobyBpbiBlKWMobyk7Zm9yKG8gaW4gdCl5KGUsbyl8fGMobyk7ZnVuY3Rpb24gYyhyKXt2YXIgaT1PZVtyXXx8amU7YVtyXT1pKGVbcl0sdFtyXSxuLHIpfXJldHVybiBhfWZ1bmN0aW9uIExlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZih5KGksbikpcmV0dXJuIGlbbl07dmFyIG89YihuKTtpZih5KGksbykpcmV0dXJuIGlbb107dmFyIGE9JChvKTtyZXR1cm4geShpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gTWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSF5KG4sZSksYT1uW2VdLHM9UGUoQm9vbGVhbixpLnR5cGUpO2lmKHM+LTEpaWYobyYmIXkoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1DKGUpKXt2YXIgYz1QZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIXkodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1JZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9YmU7JGUoITApLENlKGEpLCRlKHUpfXJldHVybiBhfWZ1bmN0aW9uIEllKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBGZShlLHQpe3JldHVybiBJZShlKT09PUllKHQpfWZ1bmN0aW9uIFBlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEZlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoRmUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBSZShlLHQsbil7bGUoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7QmUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19QmUoZSx0LG4pfWZpbmFsbHl7ZmUoKX19ZnVuY3Rpb24gSGUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZ1KG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIFJlKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtSZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gQmUoZSx0LG4pe2lmKEYuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gRi5lcnJvckhhbmRsZXIuY2FsbChudWxsLGUsdCxuKX1jYXRjaCh0KXt0IT09ZSYmVWUodCxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9VWUoZSx0LG4pfWZ1bmN0aW9uIFVlKGUsdCxuKXtpZigheiYmIVZ8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIHplLFZlPSExLEtlPVtdLEplPSExO2Z1bmN0aW9uIHFlKCl7SmU9ITE7dmFyIGU9S2Uuc2xpY2UoMCk7S2UubGVuZ3RoPTA7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmcmUoUHJvbWlzZSkpe3ZhciBXZT1Qcm9taXNlLnJlc29sdmUoKTt6ZT1mdW5jdGlvbigpe1dlLnRoZW4ocWUpLEcmJnNldFRpbWVvdXQoUyl9LFZlPSEwfWVsc2UgaWYocXx8InVuZGVmaW5lZCI9PXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyfHwhcmUoTXV0YXRpb25PYnNlcnZlcikmJiJbb2JqZWN0IE11dGF0aW9uT2JzZXJ2ZXJDb25zdHJ1Y3Rvcl0iIT09TXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpKXplPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZyZShzZXRJbW1lZGlhdGUpP2Z1bmN0aW9uKCl7c2V0SW1tZWRpYXRlKHFlKX06ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHFlLDApfTtlbHNle3ZhciBaZT0xLEdlPW5ldyBNdXRhdGlvbk9ic2VydmVyKHFlKSxYZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoWmUpKTtHZS5vYnNlcnZlKFhlLHtjaGFyYWN0ZXJEYXRhOiEwfSksemU9ZnVuY3Rpb24oKXtaZT0oWmUrMSklMixYZS5kYXRhPVN0cmluZyhaZSl9LFZlPSEwfWZ1bmN0aW9uIFllKGUsdCl7dmFyIG47aWYoS2UucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtSZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksSmV8fChKZT0hMCx6ZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgUWU9bmV3IGllO2Z1bmN0aW9uIGV0KGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgYT1BcnJheS5pc0FycmF5KHQpO2lmKCFhJiYhbyh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgcGUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgcz10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMocykpcmV0dXJuO24uYWRkKHMpfWlmKGEpZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFFlKSxRZS5jbGVhcigpfXZhciB0dD1nKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBudChlLHQpe2Z1bmN0aW9uIG4oKXt2YXIgZT1hcmd1bWVudHMscj1uLmZucztpZighQXJyYXkuaXNBcnJheShyKSlyZXR1cm4gSGUocixudWxsLGFyZ3VtZW50cyx0LCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIGk9ci5zbGljZSgpLG89MDtvPGkubGVuZ3RoO28rKylIZShpW29dLG51bGwsZSx0LCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gbi5mbnM9ZSxufWZ1bmN0aW9uIHJ0KGUsbixpLG8sYSxzKXt2YXIgYyx1LGwsZjtmb3IoYyBpbiBlKXU9ZVtjXSxsPW5bY10sZj10dChjKSx0KHUpfHwodChsKT8odCh1LmZucykmJih1PWVbY109bnQodSxzKSkscihmLm9uY2UpJiYodT1lW2NdPWEoZi5uYW1lLHUsZi5jYXB0dXJlKSksaShmLm5hbWUsdSxmLmNhcHR1cmUsZi5wYXNzaXZlLGYucGFyYW1zKSk6dSE9PWwmJihsLmZucz11LGVbY109bCkpO2ZvcihjIGluIG4pdChlW2NdKSYmbygoZj10dChjKSkubmFtZSxuW2NdLGYuY2FwdHVyZSl9ZnVuY3Rpb24gaXQoZSxpLG8pe3ZhciBhO2UgaW5zdGFuY2VvZiBwZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBzPWVbaV07ZnVuY3Rpb24gYygpe28uYXBwbHkodGhpcyxhcmd1bWVudHMpLGgoYS5mbnMsYyl9dChzKT9hPW50KFtjXSk6bihzLmZucykmJnIocy5tZXJnZWQpPyhhPXMpLmZucy5wdXNoKGMpOmE9bnQoW3MsY10pLGEubWVyZ2VkPSEwLGVbaV09YX1mdW5jdGlvbiBvdChlLHQscixpLG8pe2lmKG4odCkpe2lmKHkodCxyKSlyZXR1cm4gZVtyXT10W3JdLG98fGRlbGV0ZSB0W3JdLCEwO2lmKHkodCxpKSlyZXR1cm4gZVtyXT10W2ldLG98fGRlbGV0ZSB0W2ldLCEwfXJldHVybiExfWZ1bmN0aW9uIGF0KGUpe3JldHVybiBpKGUpP1toZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKG8sYSl7dmFyIHM9W107dmFyIGMsdSxsLGY7Zm9yKGM9MDtjPG8ubGVuZ3RoO2MrKyl0KHU9b1tjXSl8fCJib29sZWFuIj09dHlwZW9mIHV8fChsPXMubGVuZ3RoLTEsZj1zW2xdLEFycmF5LmlzQXJyYXkodSk/dS5sZW5ndGg+MCYmKHN0KCh1PWUodSwoYXx8IiIpKyJfIitjKSlbMF0pJiZzdChmKSYmKHNbbF09aGUoZi50ZXh0K3VbMF0udGV4dCksdS5zaGlmdCgpKSxzLnB1c2guYXBwbHkocyx1KSk6aSh1KT9zdChmKT9zW2xdPWhlKGYudGV4dCt1KToiIiE9PXUmJnMucHVzaChoZSh1KSk6c3QodSkmJnN0KGYpP3NbbF09aGUoZi50ZXh0K3UudGV4dCk6KHIoby5faXNWTGlzdCkmJm4odS50YWcpJiZ0KHUua2V5KSYmbihhKSYmKHUua2V5PSJfX3ZsaXN0IithKyJfIitjKyJfXyIpLHMucHVzaCh1KSkpO3JldHVybiBzfShlKTp2b2lkIDB9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIG4oZSkmJm4oZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBjdChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9b2U/UmVmbGVjdC5vd25LZXlzKGUpOk9iamVjdC5rZXlzKGUpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZigiX19vYl9fIiE9PW8pe2Zvcih2YXIgYT1lW29dLmZyb20scz10O3M7KXtpZihzLl9wcm92aWRlZCYmeShzLl9wcm92aWRlZCxhKSl7bltvXT1zLl9wcm92aWRlZFthXTticmVha31zPXMuJHBhcmVudH1pZighcyYmImRlZmF1bHQiaW4gZVtvXSl7dmFyIGM9ZVtvXS5kZWZhdWx0O25bb109ImZ1bmN0aW9uIj09dHlwZW9mIGM/Yy5jYWxsKHQpOmN9fX1yZXR1cm4gbn19ZnVuY3Rpb24gdXQoZSx0KXtpZighZXx8IWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3QpKG4uZGVmYXVsdHx8KG4uZGVmYXVsdD1bXSkpLnB1c2gobyk7ZWxzZXt2YXIgcz1hLnNsb3QsYz1uW3NdfHwobltzXT1bXSk7InRlbXBsYXRlIj09PW8udGFnP2MucHVzaC5hcHBseShjLG8uY2hpbGRyZW58fFtdKTpjLnB1c2gobyl9fWZvcih2YXIgdSBpbiBuKW5bdV0uZXZlcnkobHQpJiZkZWxldGUgblt1XTtyZXR1cm4gbn1mdW5jdGlvbiBsdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJiFlLmFzeW5jRmFjdG9yeXx8IiAiPT09ZS50ZXh0fWZ1bmN0aW9uIGZ0KHQsbixyKXt2YXIgaSxvPU9iamVjdC5rZXlzKG4pLmxlbmd0aD4wLGE9dD8hIXQuJHN0YWJsZTohbyxzPXQmJnQuJGtleTtpZih0KXtpZih0Ll9ub3JtYWxpemVkKXJldHVybiB0Ll9ub3JtYWxpemVkO2lmKGEmJnImJnIhPT1lJiZzPT09ci4ka2V5JiYhbyYmIXIuJGhhc05vcm1hbClyZXR1cm4gcjtmb3IodmFyIGMgaW4gaT17fSx0KXRbY10mJiIkIiE9PWNbMF0mJihpW2NdPXB0KG4sYyx0W2NdKSl9ZWxzZSBpPXt9O2Zvcih2YXIgdSBpbiBuKXUgaW4gaXx8KGlbdV09ZHQobix1KSk7cmV0dXJuIHQmJk9iamVjdC5pc0V4dGVuc2libGUodCkmJih0Ll9ub3JtYWxpemVkPWkpLFIoaSwiJHN0YWJsZSIsYSksUihpLCIka2V5IixzKSxSKGksIiRoYXNOb3JtYWwiLG8pLGl9ZnVuY3Rpb24gcHQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KTtyZXR1cm4oZT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiFBcnJheS5pc0FycmF5KGUpP1tlXTphdChlKSkmJigwPT09ZS5sZW5ndGh8fDE9PT1lLmxlbmd0aCYmZVswXS5pc0NvbW1lbnQpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uIGR0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIHZ0KGUsdCl7dmFyIHIsaSxhLHMsYztpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXJbaV09dChlW2ldLGkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihyPW5ldyBBcnJheShlKSxpPTA7aTxlO2krKylyW2ldPXQoaSsxLGkpO2Vsc2UgaWYobyhlKSlpZihvZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtyPVtdO2Zvcih2YXIgdT1lW1N5bWJvbC5pdGVyYXRvcl0oKSxsPXUubmV4dCgpOyFsLmRvbmU7KXIucHVzaCh0KGwudmFsdWUsci5sZW5ndGgpKSxsPXUubmV4dCgpfWVsc2UgZm9yKHM9T2JqZWN0LmtleXMoZSkscj1uZXcgQXJyYXkocy5sZW5ndGgpLGk9MCxhPXMubGVuZ3RoO2k8YTtpKyspYz1zW2ldLHJbaV09dChlW2NdLGMsaSk7cmV0dXJuIG4ocil8fChyPVtdKSxyLl9pc1ZMaXN0PSEwLHJ9ZnVuY3Rpb24gaHQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPUEoQSh7fSxyKSxuKSksaT1vKG4pfHx0KTppPXRoaXMuJHNsb3RzW2VdfHx0O3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6YX0saSk6aX1mdW5jdGlvbiBtdChlKXtyZXR1cm4gTGUodGhpcy4kb3B0aW9ucywiZmlsdGVycyIsZSl8fEV9ZnVuY3Rpb24geXQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBndChlLHQsbixyLGkpe3ZhciBvPUYua2V5Q29kZXNbdF18fG47cmV0dXJuIGkmJnImJiFGLmtleUNvZGVzW3RdP3l0KGkscik6bz95dChvLGUpOnI/QyhyKSE9PXQ6dm9pZCAwfWZ1bmN0aW9uIF90KGUsdCxuLHIsaSl7aWYobilpZihvKG4pKXt2YXIgYTtBcnJheS5pc0FycmF5KG4pJiYobj1PKG4pKTt2YXIgcz1mdW5jdGlvbihvKXtpZigiY2xhc3MiPT09b3x8InN0eWxlIj09PW98fHYobykpYT1lO2Vsc2V7dmFyIHM9ZS5hdHRycyYmZS5hdHRycy50eXBlO2E9cnx8Ri5tdXN0VXNlUHJvcCh0LHMsbyk/ZS5kb21Qcm9wc3x8KGUuZG9tUHJvcHM9e30pOmUuYXR0cnN8fChlLmF0dHJzPXt9KX12YXIgYz1iKG8pLHU9QyhvKTtjIGluIGF8fHUgaW4gYXx8KGFbb109bltvXSxpJiYoKGUub258fChlLm9uPXt9KSlbInVwZGF0ZToiK29dPWZ1bmN0aW9uKGUpe25bb109ZX0pKX07Zm9yKHZhciBjIGluIG4pcyhjKX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIGJ0KGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdD9yOih3dChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyKX1mdW5jdGlvbiAkdChlLHQsbil7cmV0dXJuIHd0KGUsIl9fb25jZV9fIit0KyhuPyJfIituOiIiKSwhMCksZX1mdW5jdGlvbiB3dChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYic3RyaW5nIiE9dHlwZW9mIGVbcl0mJkN0KGVbcl0sdCsiXyIrcixuKTtlbHNlIEN0KGUsdCxuKX1mdW5jdGlvbiBDdChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24geHQoZSx0KXtpZih0KWlmKHModCkpe3ZhciBuPWUub249ZS5vbj9BKHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgaT1uW3JdLG89dFtyXTtuW3JdPWk/W10uY29uY2F0KGksbyk6b319ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBrdChlLHQsbixyKXt0PXR8fHskc3RhYmxlOiFufTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtBcnJheS5pc0FycmF5KG8pP2t0KG8sdCxuKTpvJiYoby5wcm94eSYmKG8uZm4ucHJveHk9ITApLHRbby5rZXldPW8uZm4pfXJldHVybiByJiYodC4ka2V5PXIpLHR9ZnVuY3Rpb24gQXQoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl07InN0cmluZyI9PXR5cGVvZiByJiZyJiYoZVt0W25dXT10W24rMV0pfXJldHVybiBlfWZ1bmN0aW9uIE90KGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP3QrZTplfWZ1bmN0aW9uIFN0KGUpe2UuX289JHQsZS5fbj1mLGUuX3M9bCxlLl9sPXZ0LGUuX3Q9aHQsZS5fcT1OLGUuX2k9aixlLl9tPWJ0LGUuX2Y9bXQsZS5faz1ndCxlLl9iPV90LGUuX3Y9aGUsZS5fZT12ZSxlLl91PWt0LGUuX2c9eHQsZS5fZD1BdCxlLl9wPU90fWZ1bmN0aW9uIFR0KHQsbixpLG8sYSl7dmFyIHMsYz10aGlzLHU9YS5vcHRpb25zO3kobywiX3VpZCIpPyhzPU9iamVjdC5jcmVhdGUobykpLl9vcmlnaW5hbD1vOihzPW8sbz1vLl9vcmlnaW5hbCk7dmFyIGw9cih1Ll9jb21waWxlZCksZj0hbDt0aGlzLmRhdGE9dCx0aGlzLnByb3BzPW4sdGhpcy5jaGlsZHJlbj1pLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9dC5vbnx8ZSx0aGlzLmluamVjdGlvbnM9Y3QodS5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBjLiRzbG90c3x8ZnQodC5zY29wZWRTbG90cyxjLiRzbG90cz11dChpLG8pKSxjLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnQodC5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGwmJih0aGlzLiRvcHRpb25zPXUsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPWZ0KHQuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSx1Ll9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9UHQocyxlLHQsbixyLGYpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXUuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gUHQocyxlLHQsbixyLGYpfX1mdW5jdGlvbiBFdChlLHQsbixyLGkpe3ZhciBvPW1lKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIE50KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtiKG4pXT10W25dfVN0KFR0LnByb3RvdHlwZSk7dmFyIGp0PXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgcj1lO2p0LnByZXBhdGNoKHIscil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciByPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnR9LGk9ZS5kYXRhLmlubGluZVRlbXBsYXRlO24oaSkmJihyLnJlbmRlcj1pLnJlbmRlcixyLnN0YXRpY1JlbmRlckZucz1pLnN0YXRpY1JlbmRlckZucyk7cmV0dXJuIG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihyKX0oZSxXdCkpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKHQsbil7dmFyIHI9bi5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbih0LG4scixpLG8pe3ZhciBhPWkuZGF0YS5zY29wZWRTbG90cyxzPXQuJHNjb3BlZFNsb3RzLGM9ISEoYSYmIWEuJHN0YWJsZXx8cyE9PWUmJiFzLiRzdGFibGV8fGEmJnQuJHNjb3BlZFNsb3RzLiRrZXkhPT1hLiRrZXkpLHU9ISEob3x8dC4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fGMpO3QuJG9wdGlvbnMuX3BhcmVudFZub2RlPWksdC4kdm5vZGU9aSx0Ll92bm9kZSYmKHQuX3Zub2RlLnBhcmVudD1pKTtpZih0LiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1vLHQuJGF0dHJzPWkuZGF0YS5hdHRyc3x8ZSx0LiRsaXN0ZW5lcnM9cnx8ZSxuJiZ0LiRvcHRpb25zLnByb3BzKXskZSghMSk7Zm9yKHZhciBsPXQuX3Byb3BzLGY9dC4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLHA9MDtwPGYubGVuZ3RoO3ArKyl7dmFyIGQ9ZltwXSx2PXQuJG9wdGlvbnMucHJvcHM7bFtkXT1NZShkLHYsbix0KX0kZSghMCksdC4kb3B0aW9ucy5wcm9wc0RhdGE9bn1yPXJ8fGU7dmFyIGg9dC4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1yLHF0KHQscixoKSx1JiYodC4kc2xvdHM9dXQobyxpLmNvbnRleHQpLHQuJGZvcmNlVXBkYXRlKCkpfShuLmNvbXBvbmVudEluc3RhbmNlPXQuY29tcG9uZW50SW5zdGFuY2Usci5wcm9wc0RhdGEsci5saXN0ZW5lcnMsbixyLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsWXQociwibW91bnRlZCIpKSxlLmRhdGEua2VlcEFsaXZlJiYobi5faXNNb3VudGVkPygodD1yKS5faW5hY3RpdmU9ITEsZW4ucHVzaCh0KSk6WHQociwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP2Z1bmN0aW9uIGUodCxuKXtpZihuJiYodC5fZGlyZWN0SW5hY3RpdmU9ITAsR3QodCkpKXJldHVybjtpZighdC5faW5hY3RpdmUpe3QuX2luYWN0aXZlPSEwO2Zvcih2YXIgcj0wO3I8dC4kY2hpbGRyZW4ubGVuZ3RoO3IrKyllKHQuJGNoaWxkcmVuW3JdKTtZdCh0LCJkZWFjdGl2YXRlZCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LER0PU9iamVjdC5rZXlzKGp0KTtmdW5jdGlvbiBMdChpLGEscyxjLGwpe2lmKCF0KGkpKXt2YXIgZj1zLiRvcHRpb25zLl9iYXNlO2lmKG8oaSkmJihpPWYuZXh0ZW5kKGkpKSwiZnVuY3Rpb24iPT10eXBlb2YgaSl7dmFyIHA7aWYodChpLmNpZCkmJnZvaWQgMD09PShpPWZ1bmN0aW9uKGUsaSl7aWYocihlLmVycm9yKSYmbihlLmVycm9yQ29tcCkpcmV0dXJuIGUuZXJyb3JDb21wO2lmKG4oZS5yZXNvbHZlZCkpcmV0dXJuIGUucmVzb2x2ZWQ7dmFyIGE9SHQ7YSYmbihlLm93bmVycykmJi0xPT09ZS5vd25lcnMuaW5kZXhPZihhKSYmZS5vd25lcnMucHVzaChhKTtpZihyKGUubG9hZGluZykmJm4oZS5sb2FkaW5nQ29tcCkpcmV0dXJuIGUubG9hZGluZ0NvbXA7aWYoYSYmIW4oZS5vd25lcnMpKXt2YXIgcz1lLm93bmVycz1bYV0sYz0hMCxsPW51bGwsZj1udWxsO2EuJG9uKCJob29rOmRlc3Ryb3llZCIsZnVuY3Rpb24oKXtyZXR1cm4gaChzLGEpfSk7dmFyIHA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1zLmxlbmd0aDt0PG47dCsrKXNbdF0uJGZvcmNlVXBkYXRlKCk7ZSYmKHMubGVuZ3RoPTAsbnVsbCE9PWwmJihjbGVhclRpbWVvdXQobCksbD1udWxsKSxudWxsIT09ZiYmKGNsZWFyVGltZW91dChmKSxmPW51bGwpKX0sZD1EKGZ1bmN0aW9uKHQpe2UucmVzb2x2ZWQ9QnQodCxpKSxjP3MubGVuZ3RoPTA6cCghMCl9KSx2PUQoZnVuY3Rpb24odCl7bihlLmVycm9yQ29tcCkmJihlLmVycm9yPSEwLHAoITApKX0pLG09ZShkLHYpO3JldHVybiBvKG0pJiYodShtKT90KGUucmVzb2x2ZWQpJiZtLnRoZW4oZCx2KTp1KG0uY29tcG9uZW50KSYmKG0uY29tcG9uZW50LnRoZW4oZCx2KSxuKG0uZXJyb3IpJiYoZS5lcnJvckNvbXA9QnQobS5lcnJvcixpKSksbihtLmxvYWRpbmcpJiYoZS5sb2FkaW5nQ29tcD1CdChtLmxvYWRpbmcsaSksMD09PW0uZGVsYXk/ZS5sb2FkaW5nPSEwOmw9c2V0VGltZW91dChmdW5jdGlvbigpe2w9bnVsbCx0KGUucmVzb2x2ZWQpJiZ0KGUuZXJyb3IpJiYoZS5sb2FkaW5nPSEwLHAoITEpKX0sbS5kZWxheXx8MjAwKSksbihtLnRpbWVvdXQpJiYoZj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zj1udWxsLHQoZS5yZXNvbHZlZCkmJnYobnVsbCl9LG0udGltZW91dCkpKSksYz0hMSxlLmxvYWRpbmc/ZS5sb2FkaW5nQ29tcDplLnJlc29sdmVkfX0ocD1pLGYpKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz12ZSgpO3JldHVybiBvLmFzeW5jRmFjdG9yeT1lLG8uYXN5bmNNZXRhPXtkYXRhOnQsY29udGV4dDpuLGNoaWxkcmVuOnIsdGFnOml9LG99KHAsYSxzLGMsbCk7YT1hfHx7fSwkbihpKSxuKGEubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciByPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixpPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbcl09dC5tb2RlbC52YWx1ZTt2YXIgbz10Lm9ufHwodC5vbj17fSksYT1vW2ldLHM9dC5tb2RlbC5jYWxsYmFjaztuKGEpPyhBcnJheS5pc0FycmF5KGEpPy0xPT09YS5pbmRleE9mKHMpOmEhPT1zKSYmKG9baV09W3NdLmNvbmNhdChhKSk6b1tpXT1zfShpLm9wdGlvbnMsYSk7dmFyIGQ9ZnVuY3Rpb24oZSxyLGkpe3ZhciBvPXIub3B0aW9ucy5wcm9wcztpZighdChvKSl7dmFyIGE9e30scz1lLmF0dHJzLGM9ZS5wcm9wcztpZihuKHMpfHxuKGMpKWZvcih2YXIgdSBpbiBvKXt2YXIgbD1DKHUpO290KGEsYyx1LGwsITApfHxvdChhLHMsdSxsLCExKX1yZXR1cm4gYX19KGEsaSk7aWYocihpLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKHQscixpLG8sYSl7dmFyIHM9dC5vcHRpb25zLGM9e30sdT1zLnByb3BzO2lmKG4odSkpZm9yKHZhciBsIGluIHUpY1tsXT1NZShsLHUscnx8ZSk7ZWxzZSBuKGkuYXR0cnMpJiZOdChjLGkuYXR0cnMpLG4oaS5wcm9wcykmJk50KGMsaS5wcm9wcyk7dmFyIGY9bmV3IFR0KGksYyxhLG8sdCkscD1zLnJlbmRlci5jYWxsKG51bGwsZi5fYyxmKTtpZihwIGluc3RhbmNlb2YgcGUpcmV0dXJuIEV0KHAsaSxmLnBhcmVudCxzKTtpZihBcnJheS5pc0FycmF5KHApKXtmb3IodmFyIGQ9YXQocCl8fFtdLHY9bmV3IEFycmF5KGQubGVuZ3RoKSxoPTA7aDxkLmxlbmd0aDtoKyspdltoXT1FdChkW2hdLGksZi5wYXJlbnQscyk7cmV0dXJuIHZ9fShpLGQsYSxzLGMpO3ZhciB2PWEub247aWYoYS5vbj1hLm5hdGl2ZU9uLHIoaS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIG09YS5zbG90O2E9e30sbSYmKGEuc2xvdD1tKX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248RHQubGVuZ3RoO24rKyl7dmFyIHI9RHRbbl0saT10W3JdLG89anRbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9NdChvLGkpOm8pfX0oYSk7dmFyIHk9aS5vcHRpb25zLm5hbWV8fGw7cmV0dXJuIG5ldyBwZSgidnVlLWNvbXBvbmVudC0iK2kuY2lkKyh5PyItIit5OiIiKSxhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHMse0N0b3I6aSxwcm9wc0RhdGE6ZCxsaXN0ZW5lcnM6dix0YWc6bCxjaGlsZHJlbjpjfSxwKX19fWZ1bmN0aW9uIE10KGUsdCl7dmFyIG49ZnVuY3Rpb24obixyKXtlKG4sciksdChuLHIpfTtyZXR1cm4gbi5fbWVyZ2VkPSEwLG59dmFyIEl0PTEsRnQ9MjtmdW5jdGlvbiBQdChlLGEscyxjLHUsbCl7cmV0dXJuKEFycmF5LmlzQXJyYXkocyl8fGkocykpJiYodT1jLGM9cyxzPXZvaWQgMCkscihsKSYmKHU9RnQpLGZ1bmN0aW9uKGUsaSxhLHMsYyl7aWYobihhKSYmbihhLl9fb2JfXykpcmV0dXJuIHZlKCk7bihhKSYmbihhLmlzKSYmKGk9YS5pcyk7aWYoIWkpcmV0dXJuIHZlKCk7QXJyYXkuaXNBcnJheShzKSYmImZ1bmN0aW9uIj09dHlwZW9mIHNbMF0mJigoYT1hfHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6c1swXX0scy5sZW5ndGg9MCk7Yz09PUZ0P3M9YXQocyk6Yz09PUl0JiYocz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShzKSk7dmFyIHUsbDtpZigic3RyaW5nIj09dHlwZW9mIGkpe3ZhciBmO2w9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxGLmdldFRhZ05hbWVzcGFjZShpKSx1PUYuaXNSZXNlcnZlZFRhZyhpKT9uZXcgcGUoRi5wYXJzZVBsYXRmb3JtVGFnTmFtZShpKSxhLHMsdm9pZCAwLHZvaWQgMCxlKTphJiZhLnByZXx8IW4oZj1MZShlLiRvcHRpb25zLCJjb21wb25lbnRzIixpKSk/bmV3IHBlKGksYSxzLHZvaWQgMCx2b2lkIDAsZSk6THQoZixhLGUscyxpKX1lbHNlIHU9THQoaSxhLGUscyk7cmV0dXJuIEFycmF5LmlzQXJyYXkodSk/dTpuKHUpPyhuKGwpJiZmdW5jdGlvbiBlKGksbyxhKXtpLm5zPW87ImZvcmVpZ25PYmplY3QiPT09aS50YWcmJihvPXZvaWQgMCxhPSEwKTtpZihuKGkuY2hpbGRyZW4pKWZvcih2YXIgcz0wLGM9aS5jaGlsZHJlbi5sZW5ndGg7czxjO3MrKyl7dmFyIHU9aS5jaGlsZHJlbltzXTtuKHUudGFnKSYmKHQodS5ucyl8fHIoYSkmJiJzdmciIT09dS50YWcpJiZlKHUsbyxhKX19KHUsbCksbihhKSYmZnVuY3Rpb24oZSl7byhlLnN0eWxlKSYmZXQoZS5zdHlsZSk7byhlLmNsYXNzKSYmZXQoZS5jbGFzcyl9KGEpLHUpOnZlKCl9KGUsYSxzLGMsdSl9dmFyIFJ0LEh0PW51bGw7ZnVuY3Rpb24gQnQoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxvZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLG8oZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBVdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIHp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF07aWYobihyKSYmKG4oci5jb21wb25lbnRPcHRpb25zKXx8VXQocikpKXJldHVybiByfX1mdW5jdGlvbiBWdChlLHQpe1J0LiRvbihlLHQpfWZ1bmN0aW9uIEt0KGUsdCl7UnQuJG9mZihlLHQpfWZ1bmN0aW9uIEp0KGUsdCl7dmFyIG49UnQ7cmV0dXJuIGZ1bmN0aW9uIHIoKXtudWxsIT09dC5hcHBseShudWxsLGFyZ3VtZW50cykmJm4uJG9mZihlLHIpfX1mdW5jdGlvbiBxdChlLHQsbil7UnQ9ZSxydCh0LG58fHt9LFZ0LEt0LEp0LGUpLFJ0PXZvaWQgMH12YXIgV3Q9bnVsbDtmdW5jdGlvbiBadChlKXt2YXIgdD1XdDtyZXR1cm4gV3Q9ZSxmdW5jdGlvbigpe1d0PXR9fWZ1bmN0aW9uIEd0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWHQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxHdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVh0KGUuJGNoaWxkcmVuW25dKTtZdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gWXQoZSx0KXtsZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspSGUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxmZSgpfXZhciBRdD1bXSxlbj1bXSx0bj17fSxubj0hMSxybj0hMSxvbj0wO3ZhciBhbj0wLHNuPURhdGUubm93O2lmKHomJiFxKXt2YXIgY249d2luZG93LnBlcmZvcm1hbmNlO2NuJiYiZnVuY3Rpb24iPT10eXBlb2YgY24ubm93JiZzbigpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHNuPWZ1bmN0aW9uKCl7cmV0dXJuIGNuLm5vdygpfSl9ZnVuY3Rpb24gdW4oKXt2YXIgZSx0O2Zvcihhbj1zbigpLHJuPSEwLFF0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksb249MDtvbjxRdC5sZW5ndGg7b24rKykoZT1RdFtvbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdG5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWVuLnNsaWNlKCkscj1RdC5zbGljZSgpO29uPVF0Lmxlbmd0aD1lbi5sZW5ndGg9MCx0bj17fSxubj1ybj0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxYdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJll0KHIsInVwZGF0ZWQiKX19KHIpLG5lJiZGLmRldnRvb2xzJiZuZS5lbWl0KCJmbHVzaCIpfXZhciBsbj0wLGZuPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytsbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBpZSx0aGlzLm5ld0RlcElkcz1uZXcgaWUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFILnRlc3QoZSkpe3ZhciB0PWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2lmKCFlKXJldHVybjtlPWVbdFtuXV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1TKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O2ZuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtsZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7UmUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJmV0KGUpLGZlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxmbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxmbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LGZuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXRuW3RdKXtpZih0blt0XT0hMCxybil7Zm9yKHZhciBuPVF0Lmxlbmd0aC0xO24+b24mJlF0W25dLmlkPmUuaWQ7KW4tLTtRdC5zcGxpY2UobisxLDAsZSl9ZWxzZSBRdC5wdXNoKGUpO25ufHwobm49ITAsWWUodW4pKX19KHRoaXMpfSxmbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fG8oZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe1JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LGZuLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxmbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LGZuLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxoKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciBwbj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OlMsc2V0OlN9O2Z1bmN0aW9uIGRuKGUsdCxuKXtwbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0scG4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixwbil9ZnVuY3Rpb24gdm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxyPWUuX3Byb3BzPXt9LGk9ZS4kb3B0aW9ucy5fcHJvcEtleXM9W107ZS4kcGFyZW50JiYkZSghMSk7dmFyIG89ZnVuY3Rpb24obyl7aS5wdXNoKG8pO3ZhciBhPU1lKG8sdCxuLGUpO3hlKHIsbyxhKSxvIGluIGV8fGRuKGUsIl9wcm9wcyIsbyl9O2Zvcih2YXIgYSBpbiB0KW8oYSk7JGUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/Uzp4KHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO3ModD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCl7bGUoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBSZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7ZmUoKX19KHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJnkocixvKXx8KGE9dm9pZCAwLDM2IT09KGE9KG8rIiIpLmNoYXJDb2RlQXQoMCkpJiY5NSE9PWEmJmRuKGUsIl9kYXRhIixvKSl9dmFyIGE7Q2UodCwhMCl9KGUpOkNlKGUuX2RhdGE9e30sITApLHQuY29tcHV0ZWQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fY29tcHV0ZWRXYXRjaGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGUoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IGZuKGUsYXx8UyxTLGhuKSksaSBpbiBlfHxtbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1ZJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspX24oZSxuLHJbaV0pO2Vsc2UgX24oZSxuLHIpfX0oZSx0LndhdGNoKX12YXIgaG49e2xhenk6ITB9O2Z1bmN0aW9uIG1uKGUsdCxuKXt2YXIgcj0hdGUoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8ocG4uZ2V0PXI/eW4odCk6Z24obikscG4uc2V0PVMpOihwbi5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3luKHQpOmduKG4uZ2V0KTpTLHBuLnNldD1uLnNldHx8UyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxwbil9ZnVuY3Rpb24geW4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1tlXTtpZih0KXJldHVybiB0LmRpcnR5JiZ0LmV2YWx1YXRlKCksY2UudGFyZ2V0JiZ0LmRlcGVuZCgpLHQudmFsdWV9fWZ1bmN0aW9uIGduKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gX24oZSx0LG4scil7cmV0dXJuIHMobikmJihyPW4sbj1uLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBibj0wO2Z1bmN0aW9uICRuKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj0kbihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmQShlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPURlKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIENuKGUpe2UuY2lkPTA7dmFyIHQ9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciBuPXRoaXMscj1uLmNpZCxpPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihpW3JdKXJldHVybiBpW3JdO3ZhciBvPWUubmFtZXx8bi5vcHRpb25zLm5hbWUsYT1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWEsYS5jaWQ9dCsrLGEub3B0aW9ucz1EZShuLm9wdGlvbnMsZSksYS5zdXBlcj1uLGEub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWRuKGUucHJvdG90eXBlLCJfcHJvcHMiLG4pfShhKSxhLm9wdGlvbnMuY29tcHV0ZWQmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5jb21wdXRlZDtmb3IodmFyIG4gaW4gdCltbihlLnByb3RvdHlwZSxuLHRbbl0pfShhKSxhLmV4dGVuZD1uLmV4dGVuZCxhLm1peGluPW4ubWl4aW4sYS51c2U9bi51c2UsTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2FbZV09bltlXX0pLG8mJihhLm9wdGlvbnMuY29tcG9uZW50c1tvXT1hKSxhLnN1cGVyT3B0aW9ucz1uLm9wdGlvbnMsYS5leHRlbmRPcHRpb25zPWUsYS5zZWFsZWRPcHRpb25zPUEoe30sYS5vcHRpb25zKSxpW3JdPWEsYX19ZnVuY3Rpb24geG4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24ga24oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmluZGV4T2YodCk+LTE6InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiwiKS5pbmRleE9mKHQpPi0xOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1hLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gQW4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9eG4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmT24obixvLHIsaSl9fX1mdW5jdGlvbiBPbihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGgobix0KX0hZnVuY3Rpb24odCl7dC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztuLl91aWQ9Ym4rKyxuLl9pc1Z1ZT0hMCx0JiZ0Ll9pc0NvbXBvbmVudD9mdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnM9T2JqZWN0LmNyZWF0ZShlLmNvbnN0cnVjdG9yLm9wdGlvbnMpLHI9dC5fcGFyZW50Vm5vZGU7bi5wYXJlbnQ9dC5wYXJlbnQsbi5fcGFyZW50Vm5vZGU9cjt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfShuLHQpOm4uJG9wdGlvbnM9RGUoJG4obi5jb25zdHJ1Y3RvciksdHx8e30sbiksbi5fcmVuZGVyUHJveHk9bixuLl9zZWxmPW4sZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9KG4pLGZ1bmN0aW9uKGUpe2UuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLGUuX2hhc0hvb2tFdmVudD0hMTt2YXIgdD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dCYmcXQoZSx0KX0obiksZnVuY3Rpb24odCl7dC5fdm5vZGU9bnVsbCx0Ll9zdGF0aWNUcmVlcz1udWxsO3ZhciBuPXQuJG9wdGlvbnMscj10LiR2bm9kZT1uLl9wYXJlbnRWbm9kZSxpPXImJnIuY29udGV4dDt0LiRzbG90cz11dChuLl9yZW5kZXJDaGlsZHJlbixpKSx0LiRzY29wZWRTbG90cz1lLHQuX2M9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIFB0KHQsZSxuLHIsaSwhMSl9LHQuJGNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIFB0KHQsZSxuLHIsaSwhMCl9O3ZhciBvPXImJnIuZGF0YTt4ZSh0LCIkYXR0cnMiLG8mJm8uYXR0cnN8fGUsbnVsbCwhMCkseGUodCwiJGxpc3RlbmVycyIsbi5fcGFyZW50TGlzdGVuZXJzfHxlLG51bGwsITApfShuKSxZdChuLCJiZWZvcmVDcmVhdGUiKSxmdW5jdGlvbihlKXt2YXIgdD1jdChlLiRvcHRpb25zLmluamVjdCxlKTt0JiYoJGUoITEpLE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7eGUoZSxuLHRbbl0pfSksJGUoITApKX0obiksdm4obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5wcm92aWRlO3QmJihlLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgdD90LmNhbGwoZSk6dCl9KG4pLFl0KG4sImNyZWF0ZWQiKSxuLiRvcHRpb25zLmVsJiZuLiRtb3VudChuLiRvcHRpb25zLmVsKX19KHduKSxmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSxuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIiRkYXRhIix0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIiRwcm9wcyIsbiksZS5wcm90b3R5cGUuJHNldD1rZSxlLnByb3RvdHlwZS4kZGVsZXRlPUFlLGUucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7aWYocyh0KSlyZXR1cm4gX24odGhpcyxlLHQsbik7KG49bnx8e30pLnVzZXI9ITA7dmFyIHI9bmV3IGZuKHRoaXMsZSx0LG4pO2lmKG4uaW1tZWRpYXRlKXRyeXt0LmNhbGwodGhpcyxyLnZhbHVlKX1jYXRjaChlKXtSZShlLHRoaXMsJ2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytyLmV4cHJlc3Npb24rJyInKX1yZXR1cm4gZnVuY3Rpb24oKXtyLnRlYXJkb3duKCl9fX0od24pLGZ1bmN0aW9uKGUpe3ZhciB0PS9eaG9vazovO2UucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGk9MCxvPWUubGVuZ3RoO2k8bztpKyspci4kb24oZVtpXSxuKTtlbHNlKHIuX2V2ZW50c1tlXXx8KHIuX2V2ZW50c1tlXT1bXSkpLnB1c2gobiksdC50ZXN0KGUpJiYoci5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gcn0sZS5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sZS5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG4uX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLG47aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPTAsaT1lLmxlbmd0aDtyPGk7cisrKW4uJG9mZihlW3JdLHQpO3JldHVybiBufXZhciBvLGE9bi5fZXZlbnRzW2VdO2lmKCFhKXJldHVybiBuO2lmKCF0KXJldHVybiBuLl9ldmVudHNbZV09bnVsbCxuO2Zvcih2YXIgcz1hLmxlbmd0aDtzLS07KWlmKChvPWFbc10pPT09dHx8by5mbj09PXQpe2Euc3BsaWNlKHMsMSk7YnJlYWt9cmV0dXJuIG59LGUucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PXQubGVuZ3RoPjE/ayh0KTp0O2Zvcih2YXIgbj1rKGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKUhlKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9fSh3biksZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj1uLiRlbCxpPW4uX3Zub2RlLG89WnQobik7bi5fdm5vZGU9ZSxuLiRlbD1pP24uX19wYXRjaF9fKGksZSk6bi5fX3BhdGNoX18obi4kZWwsZSx0LCExKSxvKCksciYmKHIuX192dWVfXz1udWxsKSxuLiRlbCYmKG4uJGVsLl9fdnVlX189biksbi4kdm5vZGUmJm4uJHBhcmVudCYmbi4kdm5vZGU9PT1uLiRwYXJlbnQuX3Zub2RlJiYobi4kcGFyZW50LiRlbD1uLiRlbCl9LGUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LGUucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7WXQoZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxoKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLFl0KGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19fSh3biksZnVuY3Rpb24oZSl7U3QoZS5wcm90b3R5cGUpLGUucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gWWUoZSx0aGlzKX0sZS5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcyxuPXQuJG9wdGlvbnMscj1uLnJlbmRlcixpPW4uX3BhcmVudFZub2RlO2kmJih0LiRzY29wZWRTbG90cz1mdChpLmRhdGEuc2NvcGVkU2xvdHMsdC4kc2xvdHMsdC4kc2NvcGVkU2xvdHMpKSx0LiR2bm9kZT1pO3RyeXtIdD10LGU9ci5jYWxsKHQuX3JlbmRlclByb3h5LHQuJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKG4pe1JlKG4sdCwicmVuZGVyIiksZT10Ll92bm9kZX1maW5hbGx5e0h0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJjE9PT1lLmxlbmd0aCYmKGU9ZVswXSksZSBpbnN0YW5jZW9mIHBlfHwoZT12ZSgpKSxlLnBhcmVudD1pLGV9fSh3bik7dmFyIFNuPVtTdHJpbmcsUmVnRXhwLEFycmF5XSxUbj17S2VlcEFsaXZlOntuYW1lOiJrZWVwLWFsaXZlIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTpTbixleGNsdWRlOlNuLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSlPbih0aGlzLmNhY2hlLGUsdGhpcy5rZXlzKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kd2F0Y2goImluY2x1ZGUiLGZ1bmN0aW9uKHQpe0FuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGtuKHQsZSl9KX0pLHRoaXMuJHdhdGNoKCJleGNsdWRlIixmdW5jdGlvbih0KXtBbihlLGZ1bmN0aW9uKGUpe3JldHVybiFrbih0LGUpfSl9KX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PXp0KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPXhuKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IWtuKGkscikpfHxvJiZyJiZrbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsaChzLGMpLHMucHVzaChjKSk6KGFbY109dCxzLnB1c2goYyksdGhpcy5tYXgmJnMubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmT24oYSxzWzBdLHMsdGhpcy5fdm5vZGUpKSx0LmRhdGEua2VlcEFsaXZlPSEwfXJldHVybiB0fHxlJiZlWzBdfX19OyFmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEZ9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY29uZmlnIix0KSxlLnV0aWw9e3dhcm46YWUsZXh0ZW5kOkEsbWVyZ2VPcHRpb25zOkRlLGRlZmluZVJlYWN0aXZlOnhlfSxlLnNldD1rZSxlLmRlbGV0ZT1BZSxlLm5leHRUaWNrPVllLGUub2JzZXJ2YWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gQ2UoZSksZX0sZS5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksTS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Uub3B0aW9uc1t0KyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLGUub3B0aW9ucy5fYmFzZT1lLEEoZS5vcHRpb25zLmNvbXBvbmVudHMsVG4pLGZ1bmN0aW9uKGUpe2UudXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZih0LmluZGV4T2YoZSk+LTEpcmV0dXJuIHRoaXM7dmFyIG49ayhhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9fShlKSxmdW5jdGlvbihlKXtlLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9RGUodGhpcy5vcHRpb25zLGUpLHRoaXN9fShlKSxDbihlKSxmdW5jdGlvbihlKXtNLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBuPygiY29tcG9uZW50Ij09PXQmJnMobikmJihuLm5hbWU9bi5uYW1lfHxlLG49dGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZChuKSksImRpcmVjdGl2ZSI9PT10JiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49e2JpbmQ6bix1cGRhdGU6bn0pLHRoaXMub3B0aW9uc1t0KyJzIl1bZV09bixuKTp0aGlzLm9wdGlvbnNbdCsicyJdW2VdfX0pfShlKX0od24pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDp0ZX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bi5wcm90b3R5cGUsIiRzc3JDb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3biwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLHt2YWx1ZTpUdH0pLHduLnZlcnNpb249IjIuNi4xMSI7dmFyIEVuPXAoInN0eWxlLGNsYXNzIiksTm49cCgiaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcyIpLGpuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4idmFsdWUiPT09biYmTm4oZSkmJiJidXR0b24iIT09dHx8InNlbGVjdGVkIj09PW4mJiJvcHRpb24iPT09ZXx8ImNoZWNrZWQiPT09biYmImlucHV0Ij09PWV8fCJtdXRlZCI9PT1uJiYidmlkZW8iPT09ZX0sRG49cCgiY29udGVudGVkaXRhYmxlLGRyYWdnYWJsZSxzcGVsbGNoZWNrIiksTG49cCgiZXZlbnRzLGNhcmV0LHR5cGluZyxwbGFpbnRleHQtb25seSIpLE1uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEhuKHQpfHwiZmFsc2UiPT09dD8iZmFsc2UiOiJjb250ZW50ZWRpdGFibGUiPT09ZSYmTG4odCk/dDoidHJ1ZSJ9LEluPXAoImFsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLGVuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSxyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLHRydWVzcGVlZCx0eXBlbXVzdG1hdGNoLHZpc2libGUiKSxGbj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsUG49ZnVuY3Rpb24oZSl7cmV0dXJuIjoiPT09ZS5jaGFyQXQoNSkmJiJ4bGluayI9PT1lLnNsaWNlKDAsNSl9LFJuPWZ1bmN0aW9uKGUpe3JldHVybiBQbihlKT9lLnNsaWNlKDYsZS5sZW5ndGgpOiIifSxIbj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZXx8ITE9PT1lfTtmdW5jdGlvbiBCbihlKXtmb3IodmFyIHQ9ZS5kYXRhLHI9ZSxpPWU7bihpLmNvbXBvbmVudEluc3RhbmNlKTspKGk9aS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZpLmRhdGEmJih0PVVuKGkuZGF0YSx0KSk7Zm9yKDtuKHI9ci5wYXJlbnQpOylyJiZyLmRhdGEmJih0PVVuKHQsci5kYXRhKSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobihlKXx8bih0KSlyZXR1cm4gem4oZSxWbih0KSk7cmV0dXJuIiJ9KHQuc3RhdGljQ2xhc3MsdC5jbGFzcyl9ZnVuY3Rpb24gVW4oZSx0KXtyZXR1cm57c3RhdGljQ2xhc3M6em4oZS5zdGF0aWNDbGFzcyx0LnN0YXRpY0NsYXNzKSxjbGFzczpuKGUuY2xhc3MpP1tlLmNsYXNzLHQuY2xhc3NdOnQuY2xhc3N9fWZ1bmN0aW9uIHpuKGUsdCl7cmV0dXJuIGU/dD9lKyIgIit0OmU6dHx8IiJ9ZnVuY3Rpb24gVm4oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9IiIsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyluKHQ9Vm4oZVtpXSkpJiYiIiE9PXQmJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn0oZSk6byhlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifXZhciBLbj17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsbWF0aDoiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCJ9LEpuPXAoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IikscW49cCgic3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLGZvcmVpZ25PYmplY3QsZyxnbHlwaCxpbWFnZSxsaW5lLG1hcmtlcixtYXNrLG1pc3NpbmctZ2x5cGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXciLCEwKSxXbj1mdW5jdGlvbihlKXtyZXR1cm4gSm4oZSl8fHFuKGUpfTtmdW5jdGlvbiBabihlKXtyZXR1cm4gcW4oZSk/InN2ZyI6Im1hdGgiPT09ZT8ibWF0aCI6dm9pZCAwfXZhciBHbj1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBYbj1wKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpO2Z1bmN0aW9uIFluKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKTtyZXR1cm4gdHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9cmV0dXJuIGV9dmFyIFFuPU9iamVjdC5mcmVlemUoe2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiJzZWxlY3QiIT09ZT9uOih0LmRhdGEmJnQuZGF0YS5hdHRycyYmdm9pZCAwIT09dC5kYXRhLmF0dHJzLm11bHRpcGxlJiZuLnNldEF0dHJpYnV0ZSgibXVsdGlwbGUiLCJtdWx0aXBsZSIpLG4pfSxjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKEtuW2VdLHQpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSl9LGNyZWF0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnTmFtZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnRleHRDb250ZW50PXR9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZSh0LCIiKX19KSxlcj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7dHIodCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYodHIoZSwhMCksdHIodCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3RyKGUsITApfX07ZnVuY3Rpb24gdHIoZSx0KXt2YXIgcj1lLmRhdGEucmVmO2lmKG4ocikpe3ZhciBpPWUuY29udGV4dCxvPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLGE9aS4kcmVmczt0P0FycmF5LmlzQXJyYXkoYVtyXSk/aChhW3JdLG8pOmFbcl09PT1vJiYoYVtyXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KGFbcl0pP2Fbcl0uaW5kZXhPZihvKTwwJiZhW3JdLnB1c2gobyk6YVtyXT1bb106YVtyXT1vfX12YXIgbnI9bmV3IHBlKCIiLHt9LFtdKSxycj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIGlyKGUsaSl7cmV0dXJuIGUua2V5PT09aS5rZXkmJihlLnRhZz09PWkudGFnJiZlLmlzQ29tbWVudD09PWkuaXNDb21tZW50JiZuKGUuZGF0YSk9PT1uKGkuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciByLGk9bihyPWUuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlLG89bihyPXQuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlO3JldHVybiBpPT09b3x8WG4oaSkmJlhuKG8pfShlLGkpfHxyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT1pLmFzeW5jRmFjdG9yeSYmdChpLmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIG9yKGUsdCxyKXt2YXIgaSxvLGE9e307Zm9yKGk9dDtpPD1yOysraSluKG89ZVtpXS5rZXkpJiYoYVtvXT1pKTtyZXR1cm4gYX12YXIgYXI9e2NyZWF0ZTpzcix1cGRhdGU6c3IsZGVzdHJveTpmdW5jdGlvbihlKXtzcihlLG5yKX19O2Z1bmN0aW9uIHNyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG89ZT09PW5yLGE9dD09PW5yLHM9dXIoZS5kYXRhLmRpcmVjdGl2ZXMsZS5jb250ZXh0KSxjPXVyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksdT1bXSxsPVtdO2ZvcihuIGluIGMpcj1zW25dLGk9Y1tuXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsZnIoaSwidXBkYXRlIix0LGUpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOihmcihpLCJiaW5kIix0LGUpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGY9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPHUubGVuZ3RoO24rKylmcih1W25dLCJpbnNlcnRlZCIsdCxlKX07bz9pdCh0LCJpbnNlcnQiLGYpOmYoKX1sLmxlbmd0aCYmaXQodCwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgbj0wO248bC5sZW5ndGg7bisrKWZyKGxbbl0sImNvbXBvbmVudFVwZGF0ZWQiLHQsZSl9KTtpZighbylmb3IobiBpbiBzKWNbbl18fGZyKHNbbl0sInVuYmluZCIsZSxlLGEpfShlLHQpfXZhciBjcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHVyKGUsdCl7dmFyIG4scixpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIGk7Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1jciksaVtscihyKV09cixyLmRlZj1MZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBpfWZ1bmN0aW9uIGxyKGUpe3JldHVybiBlLnJhd05hbWV8fGUubmFtZSsiLiIrT2JqZWN0LmtleXMoZS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIil9ZnVuY3Rpb24gZnIoZSx0LG4scixpKXt2YXIgbz1lLmRlZiYmZS5kZWZbdF07aWYobyl0cnl7byhuLmVsbSxlLG4scixpKX1jYXRjaChyKXtSZShyLG4uY29udGV4dCwiZGlyZWN0aXZlICIrZS5uYW1lKyIgIit0KyIgaG9vayIpfX12YXIgcHI9W2VyLGFyXTtmdW5jdGlvbiBkcihlLHIpe3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztpZighKG4oaSkmJiExPT09aS5DdG9yLm9wdGlvbnMuaW5oZXJpdEF0dHJzfHx0KGUuZGF0YS5hdHRycykmJnQoci5kYXRhLmF0dHJzKSkpe3ZhciBvLGEscz1yLmVsbSxjPWUuZGF0YS5hdHRyc3x8e30sdT1yLmRhdGEuYXR0cnN8fHt9O2ZvcihvIGluIG4odS5fX29iX18pJiYodT1yLmRhdGEuYXR0cnM9QSh7fSx1KSksdSlhPXVbb10sY1tvXSE9PWEmJnZyKHMsbyxhKTtmb3IobyBpbihxfHxaKSYmdS52YWx1ZSE9PWMudmFsdWUmJnZyKHMsInZhbHVlIix1LnZhbHVlKSxjKXQodVtvXSkmJihQbihvKT9zLnJlbW92ZUF0dHJpYnV0ZU5TKEZuLFJuKG8pKTpEbihvKXx8cy5yZW1vdmVBdHRyaWJ1dGUobykpfX1mdW5jdGlvbiB2cihlLHQsbil7ZS50YWdOYW1lLmluZGV4T2YoIi0iKT4tMT9ocihlLHQsbik6SW4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG49ImFsbG93ZnVsbHNjcmVlbiI9PT10JiYiRU1CRUQiPT09ZS50YWdOYW1lPyJ0cnVlIjp0LGUuc2V0QXR0cmlidXRlKHQsbikpOkRuKHQpP2Uuc2V0QXR0cmlidXRlKHQsTW4odCxuKSk6UG4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGVOUyhGbixSbih0KSk6ZS5zZXRBdHRyaWJ1dGVOUyhGbix0LG4pOmhyKGUsdCxuKX1mdW5jdGlvbiBocihlLHQsbil7aWYoSG4obikpZS5yZW1vdmVBdHRyaWJ1dGUodCk7ZWxzZXtpZihxJiYhVyYmIlRFWFRBUkVBIj09PWUudGFnTmFtZSYmInBsYWNlaG9sZGVyIj09PXQmJiIiIT09biYmIWUuX19pZXBoKXt2YXIgcj1mdW5jdGlvbih0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpfTtlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixyKSxlLl9faWVwaD0hMH1lLnNldEF0dHJpYnV0ZSh0LG4pfX12YXIgbXI9e2NyZWF0ZTpkcix1cGRhdGU6ZHJ9O2Z1bmN0aW9uIHlyKGUscil7dmFyIGk9ci5lbG0sbz1yLmRhdGEsYT1lLmRhdGE7aWYoISh0KG8uc3RhdGljQ2xhc3MpJiZ0KG8uY2xhc3MpJiYodChhKXx8dChhLnN0YXRpY0NsYXNzKSYmdChhLmNsYXNzKSkpKXt2YXIgcz1CbihyKSxjPWkuX3RyYW5zaXRpb25DbGFzc2VzO24oYykmJihzPXpuKHMsVm4oYykpKSxzIT09aS5fcHJldkNsYXNzJiYoaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKSxpLl9wcmV2Q2xhc3M9cyl9fXZhciBncixfcixiciwkcix3cixDcix4cj17Y3JlYXRlOnlyLHVwZGF0ZTp5cn0sa3I9L1tcdykuK1wtXyRcXV0vO2Z1bmN0aW9uIEFyKGUpe3ZhciB0LG4scixpLG8sYT0hMSxzPSExLGM9ITEsdT0hMSxsPTAsZj0wLHA9MCxkPTA7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylpZihuPXQsdD1lLmNoYXJDb2RlQXQociksYSkzOT09PXQmJjkyIT09biYmKGE9ITEpO2Vsc2UgaWYocykzND09PXQmJjkyIT09biYmKHM9ITEpO2Vsc2UgaWYoYyk5Nj09PXQmJjkyIT09biYmKGM9ITEpO2Vsc2UgaWYodSk0Nz09PXQmJjkyIT09biYmKHU9ITEpO2Vsc2UgaWYoMTI0IT09dHx8MTI0PT09ZS5jaGFyQ29kZUF0KHIrMSl8fDEyND09PWUuY2hhckNvZGVBdChyLTEpfHxsfHxmfHxwKXtzd2l0Y2godCl7Y2FzZSAzNDpzPSEwO2JyZWFrO2Nhc2UgMzk6YT0hMDticmVhaztjYXNlIDk2OmM9ITA7YnJlYWs7Y2FzZSA0MDpwKys7YnJlYWs7Y2FzZSA0MTpwLS07YnJlYWs7Y2FzZSA5MTpmKys7YnJlYWs7Y2FzZSA5MzpmLS07YnJlYWs7Y2FzZSAxMjM6bCsrO2JyZWFrO2Nhc2UgMTI1OmwtLX1pZig0Nz09PXQpe2Zvcih2YXIgdj1yLTEsaD12b2lkIDA7dj49MCYmIiAiPT09KGg9ZS5jaGFyQXQodikpO3YtLSk7aCYma3IudGVzdChoKXx8KHU9ITApfX1lbHNlIHZvaWQgMD09PWk/KGQ9cisxLGk9ZS5zbGljZSgwLHIpLnRyaW0oKSk6bSgpO2Z1bmN0aW9uIG0oKXsob3x8KG89W10pKS5wdXNoKGUuc2xpY2UoZCxyKS50cmltKCkpLGQ9cisxfWlmKHZvaWQgMD09PWk/aT1lLnNsaWNlKDAscikudHJpbSgpOjAhPT1kJiZtKCksbylmb3Iocj0wO3I8by5sZW5ndGg7cisrKWk9T3IoaSxvW3JdKTtyZXR1cm4gaX1mdW5jdGlvbiBPcihlLHQpe3ZhciBuPXQuaW5kZXhPZigiKCIpO2lmKG48MClyZXR1cm4nX2YoIicrdCsnIikoJytlKyIpIjt2YXIgcj10LnNsaWNlKDAsbiksaT10LnNsaWNlKG4rMSk7cmV0dXJuJ19mKCInK3IrJyIpKCcrZSsoIikiIT09aT8iLCIraTppKX1mdW5jdGlvbiBTcihlLHQpe2NvbnNvbGUuZXJyb3IoIltWdWUgY29tcGlsZXJdOiAiK2UpfWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIGU/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbdF19KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KTpbXX1mdW5jdGlvbiBFcihlLHQsbixyLGkpeyhlLnByb3BzfHwoZS5wcm9wcz1bXSkpLnB1c2goUnIoe25hbWU6dCx2YWx1ZTpuLGR5bmFtaWM6aX0scikpLGUucGxhaW49ITF9ZnVuY3Rpb24gTnIoZSx0LG4scixpKXsoaT9lLmR5bmFtaWNBdHRyc3x8KGUuZHluYW1pY0F0dHJzPVtdKTplLmF0dHJzfHwoZS5hdHRycz1bXSkpLnB1c2goUnIoe25hbWU6dCx2YWx1ZTpuLGR5bmFtaWM6aX0scikpLGUucGxhaW49ITF9ZnVuY3Rpb24ganIoZSx0LG4scil7ZS5hdHRyc01hcFt0XT1uLGUuYXR0cnNMaXN0LnB1c2goUnIoe25hbWU6dCx2YWx1ZTpufSxyKSl9ZnVuY3Rpb24gRHIoZSx0LG4scixpLG8sYSxzKXsoZS5kaXJlY3RpdmVzfHwoZS5kaXJlY3RpdmVzPVtdKSkucHVzaChScih7bmFtZTp0LHJhd05hbWU6bix2YWx1ZTpyLGFyZzppLGlzRHluYW1pY0FyZzpvLG1vZGlmaWVyczphfSxzKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBMcihlLHQsbil7cmV0dXJuIG4/Il9wKCIrdCsnLCInK2UrJyIpJzplK3R9ZnVuY3Rpb24gTXIodCxuLHIsaSxvLGEscyxjKXt2YXIgdTsoaT1pfHxlKS5yaWdodD9jP249IigiK24rIik9PT0nY2xpY2snPydjb250ZXh0bWVudSc6KCIrbisiKSI6ImNsaWNrIj09PW4mJihuPSJjb250ZXh0bWVudSIsZGVsZXRlIGkucmlnaHQpOmkubWlkZGxlJiYoYz9uPSIoIituKyIpPT09J2NsaWNrJz8nbW91c2V1cCc6KCIrbisiKSI6ImNsaWNrIj09PW4mJihuPSJtb3VzZXVwIikpLGkuY2FwdHVyZSYmKGRlbGV0ZSBpLmNhcHR1cmUsbj1McigiISIsbixjKSksaS5vbmNlJiYoZGVsZXRlIGkub25jZSxuPUxyKCJ+IixuLGMpKSxpLnBhc3NpdmUmJihkZWxldGUgaS5wYXNzaXZlLG49THIoIiYiLG4sYykpLGkubmF0aXZlPyhkZWxldGUgaS5uYXRpdmUsdT10Lm5hdGl2ZUV2ZW50c3x8KHQubmF0aXZlRXZlbnRzPXt9KSk6dT10LmV2ZW50c3x8KHQuZXZlbnRzPXt9KTt2YXIgbD1Scih7dmFsdWU6ci50cmltKCksZHluYW1pYzpjfSxzKTtpIT09ZSYmKGwubW9kaWZpZXJzPWkpO3ZhciBmPXVbbl07QXJyYXkuaXNBcnJheShmKT9vP2YudW5zaGlmdChsKTpmLnB1c2gobCk6dVtuXT1mP28/W2wsZl06W2YsbF06bCx0LnBsYWluPSExfWZ1bmN0aW9uIElyKGUsdCxuKXt2YXIgcj1GcihlLCI6Iit0KXx8RnIoZSwidi1iaW5kOiIrdCk7aWYobnVsbCE9cilyZXR1cm4gQXIocik7aWYoITEhPT1uKXt2YXIgaT1GcihlLHQpO2lmKG51bGwhPWkpcmV0dXJuIEpTT04uc3RyaW5naWZ5KGkpfX1mdW5jdGlvbiBGcihlLHQsbil7dmFyIHI7aWYobnVsbCE9KHI9ZS5hdHRyc01hcFt0XSkpZm9yKHZhciBpPWUuYXR0cnNMaXN0LG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYoaVtvXS5uYW1lPT09dCl7aS5zcGxpY2UobywxKTticmVha31yZXR1cm4gbiYmZGVsZXRlIGUuYXR0cnNNYXBbdF0scn1mdW5jdGlvbiBQcihlLHQpe2Zvcih2YXIgbj1lLmF0dHJzTGlzdCxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO2lmKHQudGVzdChvLm5hbWUpKXJldHVybiBuLnNwbGljZShyLDEpLG99fWZ1bmN0aW9uIFJyKGUsdCl7cmV0dXJuIHQmJihudWxsIT10LnN0YXJ0JiYoZS5zdGFydD10LnN0YXJ0KSxudWxsIT10LmVuZCYmKGUuZW5kPXQuZW5kKSksZX1mdW5jdGlvbiBIcihlLHQsbil7dmFyIHI9bnx8e30saT1yLm51bWJlcixvPSIkJHYiO3IudHJpbSYmKG89Iih0eXBlb2YgJCR2ID09PSAnc3RyaW5nJz8gJCR2LnRyaW0oKTogJCR2KSIpLGkmJihvPSJfbigiK28rIikiKTt2YXIgYT1Ccih0LG8pO2UubW9kZWw9e3ZhbHVlOiIoIit0KyIpIixleHByZXNzaW9uOkpTT04uc3RyaW5naWZ5KHQpLGNhbGxiYWNrOiJmdW5jdGlvbiAoJCR2KSB7IithKyJ9In19ZnVuY3Rpb24gQnIoZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtpZihlPWUudHJpbSgpLGdyPWUubGVuZ3RoLGUuaW5kZXhPZigiWyIpPDB8fGUubGFzdEluZGV4T2YoIl0iKTxnci0xKXJldHVybigkcj1lLmxhc3RJbmRleE9mKCIuIikpPi0xP3tleHA6ZS5zbGljZSgwLCRyKSxrZXk6JyInK2Uuc2xpY2UoJHIrMSkrJyInfTp7ZXhwOmUsa2V5Om51bGx9O19yPWUsJHI9d3I9Q3I9MDtmb3IoOyF6cigpOylWcihicj1VcigpKT9Kcihicik6OTE9PT1iciYmS3IoYnIpO3JldHVybntleHA6ZS5zbGljZSgwLHdyKSxrZXk6ZS5zbGljZSh3cisxLENyKX19KGUpO3JldHVybiBudWxsPT09bi5rZXk/ZSsiPSIrdDoiJHNldCgiK24uZXhwKyIsICIrbi5rZXkrIiwgIit0KyIpIn1mdW5jdGlvbiBVcigpe3JldHVybiBfci5jaGFyQ29kZUF0KCsrJHIpfWZ1bmN0aW9uIHpyKCl7cmV0dXJuICRyPj1ncn1mdW5jdGlvbiBWcihlKXtyZXR1cm4gMzQ9PT1lfHwzOT09PWV9ZnVuY3Rpb24gS3IoZSl7dmFyIHQ9MTtmb3Iod3I9JHI7IXpyKCk7KWlmKFZyKGU9VXIoKSkpSnIoZSk7ZWxzZSBpZig5MT09PWUmJnQrKyw5Mz09PWUmJnQtLSwwPT09dCl7Q3I9JHI7YnJlYWt9fWZ1bmN0aW9uIEpyKGUpe2Zvcih2YXIgdD1lOyF6cigpJiYoZT1VcigpKSE9PXQ7KTt9dmFyIHFyLFdyPSJfX3IiLFpyPSJfX2MiO2Z1bmN0aW9uIEdyKGUsdCxuKXt2YXIgcj1xcjtyZXR1cm4gZnVuY3Rpb24gaSgpe251bGwhPT10LmFwcGx5KG51bGwsYXJndW1lbnRzKSYmUXIoZSxpLG4scil9fXZhciBYcj1WZSYmIShYJiZOdW1iZXIoWFsxXSk8PTUzKTtmdW5jdGlvbiBZcihlLHQsbixyKXtpZihYcil7dmFyIGk9YW4sbz10O3Q9by5fd3JhcHBlcj1mdW5jdGlvbihlKXtpZihlLnRhcmdldD09PWUuY3VycmVudFRhcmdldHx8ZS50aW1lU3RhbXA+PWl8fGUudGltZVN0YW1wPD0wfHxlLnRhcmdldC5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQpcmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1xci5hZGRFdmVudExpc3RlbmVyKGUsdCxRP3tjYXB0dXJlOm4scGFzc2l2ZTpyfTpuKX1mdW5jdGlvbiBRcihlLHQsbixyKXsocnx8cXIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0Ll93cmFwcGVyfHx0LG4pfWZ1bmN0aW9uIGVpKGUscil7aWYoIXQoZS5kYXRhLm9uKXx8IXQoci5kYXRhLm9uKSl7dmFyIGk9ci5kYXRhLm9ufHx7fSxvPWUuZGF0YS5vbnx8e307cXI9ci5lbG0sZnVuY3Rpb24oZSl7aWYobihlW1dyXSkpe3ZhciB0PXE/ImNoYW5nZSI6ImlucHV0IjtlW3RdPVtdLmNvbmNhdChlW1dyXSxlW3RdfHxbXSksZGVsZXRlIGVbV3JdfW4oZVtacl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbWnJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbWnJdKX0oaSkscnQoaSxvLFlyLFFyLEdyLHIuY29udGV4dCkscXI9dm9pZCAwfX12YXIgdGksbmk9e2NyZWF0ZTplaSx1cGRhdGU6ZWl9O2Z1bmN0aW9uIHJpKGUscil7aWYoIXQoZS5kYXRhLmRvbVByb3BzKXx8IXQoci5kYXRhLmRvbVByb3BzKSl7dmFyIGksbyxhPXIuZWxtLHM9ZS5kYXRhLmRvbVByb3BzfHx7fSxjPXIuZGF0YS5kb21Qcm9wc3x8e307Zm9yKGkgaW4gbihjLl9fb2JfXykmJihjPXIuZGF0YS5kb21Qcm9wcz1BKHt9LGMpKSxzKWkgaW4gY3x8KGFbaV09IiIpO2ZvcihpIGluIGMpe2lmKG89Y1tpXSwidGV4dENvbnRlbnQiPT09aXx8ImlubmVySFRNTCI9PT1pKXtpZihyLmNoaWxkcmVuJiYoci5jaGlsZHJlbi5sZW5ndGg9MCksbz09PXNbaV0pY29udGludWU7MT09PWEuY2hpbGROb2Rlcy5sZW5ndGgmJmEucmVtb3ZlQ2hpbGQoYS5jaGlsZE5vZGVzWzBdKX1pZigidmFsdWUiPT09aSYmIlBST0dSRVNTIiE9PWEudGFnTmFtZSl7YS5fdmFsdWU9bzt2YXIgdT10KG8pPyIiOlN0cmluZyhvKTtpaShhLHUpJiYoYS52YWx1ZT11KX1lbHNlIGlmKCJpbm5lckhUTUwiPT09aSYmcW4oYS50YWdOYW1lKSYmdChhLmlubmVySFRNTCkpeyh0aT10aXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD0iPHN2Zz4iK28rIjwvc3ZnPiI7Zm9yKHZhciBsPXRpLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtsLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQobC5maXJzdENoaWxkKX1lbHNlIGlmKG8hPT1zW2ldKXRyeXthW2ldPW99Y2F0Y2goZSl7fX19fWZ1bmN0aW9uIGlpKGUsdCl7cmV0dXJuIWUuY29tcG9zaW5nJiYoIk9QVElPTiI9PT1lLnRhZ05hbWV8fGZ1bmN0aW9uKGUsdCl7dmFyIG49ITA7dHJ5e249ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWV9Y2F0Y2goZSl7fXJldHVybiBuJiZlLnZhbHVlIT09dH0oZSx0KXx8ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLnZhbHVlLGk9ZS5fdk1vZGlmaWVycztpZihuKGkpKXtpZihpLm51bWJlcilyZXR1cm4gZihyKSE9PWYodCk7aWYoaS50cmltKXJldHVybiByLnRyaW0oKSE9PXQudHJpbSgpfXJldHVybiByIT09dH0oZSx0KSl9dmFyIG9pPXtjcmVhdGU6cmksdXBkYXRlOnJpfSxhaT1nKGZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHI9ZS5zcGxpdChuKTtyLmxlbmd0aD4xJiYodFtyWzBdLnRyaW0oKV09clsxXS50cmltKCkpfX0pLHR9KTtmdW5jdGlvbiBzaShlKXt2YXIgdD1jaShlLnN0eWxlKTtyZXR1cm4gZS5zdGF0aWNTdHlsZT9BKGUuc3RhdGljU3R5bGUsdCk6dH1mdW5jdGlvbiBjaShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9PKGUpOiJzdHJpbmciPT10eXBlb2YgZT9haShlKTplfXZhciB1aSxsaT0vXi0tLyxmaT0vXHMqIWltcG9ydGFudCQvLHBpPWZ1bmN0aW9uKGUsdCxuKXtpZihsaS50ZXN0KHQpKWUuc3R5bGUuc2V0UHJvcGVydHkodCxuKTtlbHNlIGlmKGZpLnRlc3QobikpZS5zdHlsZS5zZXRQcm9wZXJ0eShDKHQpLG4ucmVwbGFjZShmaSwiIiksImltcG9ydGFudCIpO2Vsc2V7dmFyIHI9dmkodCk7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspZS5zdHlsZVtyXT1uW2ldO2Vsc2UgZS5zdHlsZVtyXT1ufX0sZGk9WyJXZWJraXQiLCJNb3oiLCJtcyJdLHZpPWcoZnVuY3Rpb24oZSl7aWYodWk9dWl8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJmaWx0ZXIiIT09KGU9YihlKSkmJmUgaW4gdWkpcmV0dXJuIGU7Zm9yKHZhciB0PWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPTA7bjxkaS5sZW5ndGg7bisrKXt2YXIgcj1kaVtuXSt0O2lmKHIgaW4gdWkpcmV0dXJuIHJ9fSk7ZnVuY3Rpb24gaGkoZSxyKXt2YXIgaT1yLmRhdGEsbz1lLmRhdGE7aWYoISh0KGkuc3RhdGljU3R5bGUpJiZ0KGkuc3R5bGUpJiZ0KG8uc3RhdGljU3R5bGUpJiZ0KG8uc3R5bGUpKSl7dmFyIGEscyxjPXIuZWxtLHU9by5zdGF0aWNTdHlsZSxsPW8ubm9ybWFsaXplZFN0eWxlfHxvLnN0eWxlfHx7fSxmPXV8fGwscD1jaShyLmRhdGEuc3R5bGUpfHx7fTtyLmRhdGEubm9ybWFsaXplZFN0eWxlPW4ocC5fX29iX18pP0Eoe30scCk6cDt2YXIgZD1mdW5jdGlvbihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIGk9ZTtpLmNvbXBvbmVudEluc3RhbmNlOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKG49c2koaS5kYXRhKSkmJkEocixuKTsobj1zaShlLmRhdGEpKSYmQShyLG4pO2Zvcih2YXIgbz1lO289by5wYXJlbnQ7KW8uZGF0YSYmKG49c2koby5kYXRhKSkmJkEocixuKTtyZXR1cm4gcn0ociwhMCk7Zm9yKHMgaW4gZil0KGRbc10pJiZwaShjLHMsIiIpO2ZvcihzIGluIGQpKGE9ZFtzXSkhPT1mW3NdJiZwaShjLHMsbnVsbD09YT8iIjphKX19dmFyIG1pPXtjcmVhdGU6aGksdXBkYXRlOmhpfSx5aT0vXHMrLztmdW5jdGlvbiBnaShlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoIiAiKT4tMT90LnNwbGl0KHlpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5hZGQodCl9KTplLmNsYXNzTGlzdC5hZGQodCk7ZWxzZXt2YXIgbj0iICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiO24uaW5kZXhPZigiICIrdCsiICIpPDAmJmUuc2V0QXR0cmlidXRlKCJjbGFzcyIsKG4rdCkudHJpbSgpKX19ZnVuY3Rpb24gX2koZSx0KXtpZih0JiYodD10LnRyaW0oKSkpaWYoZS5jbGFzc0xpc3QpdC5pbmRleE9mKCIgIik+LTE/dC5zcGxpdCh5aSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpLGUuY2xhc3NMaXN0Lmxlbmd0aHx8ZS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIik7ZWxzZXtmb3IodmFyIG49IiAiKyhlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpKyIgIixyPSIgIit0KyIgIjtuLmluZGV4T2Yocik+PTA7KW49bi5yZXBsYWNlKHIsIiAiKTsobj1uLnRyaW0oKSk/ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixuKTplLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKX19ZnVuY3Rpb24gYmkoZSl7aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZBKHQsJGkoZS5uYW1lfHwidiIpKSxBKHQsZSksdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/JGkoZSk6dm9pZCAwfX12YXIgJGk9ZyhmdW5jdGlvbihlKXtyZXR1cm57ZW50ZXJDbGFzczplKyItZW50ZXIiLGVudGVyVG9DbGFzczplKyItZW50ZXItdG8iLGVudGVyQWN0aXZlQ2xhc3M6ZSsiLWVudGVyLWFjdGl2ZSIsbGVhdmVDbGFzczplKyItbGVhdmUiLGxlYXZlVG9DbGFzczplKyItbGVhdmUtdG8iLGxlYXZlQWN0aXZlQ2xhc3M6ZSsiLWxlYXZlLWFjdGl2ZSJ9fSksd2k9eiYmIVcsQ2k9InRyYW5zaXRpb24iLHhpPSJhbmltYXRpb24iLGtpPSJ0cmFuc2l0aW9uIixBaT0idHJhbnNpdGlvbmVuZCIsT2k9ImFuaW1hdGlvbiIsU2k9ImFuaW1hdGlvbmVuZCI7d2kmJih2b2lkIDA9PT13aW5kb3cub250cmFuc2l0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kJiYoa2k9IldlYmtpdFRyYW5zaXRpb24iLEFpPSJ3ZWJraXRUcmFuc2l0aW9uRW5kIiksdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQmJihPaT0iV2Via2l0QW5pbWF0aW9uIixTaT0id2Via2l0QW5pbWF0aW9uRW5kIikpO3ZhciBUaT16P3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6c2V0VGltZW91dDpmdW5jdGlvbihlKXtyZXR1cm4gZSgpfTtmdW5jdGlvbiBFaShlKXtUaShmdW5jdGlvbigpe1RpKGUpfSl9ZnVuY3Rpb24gTmkoZSx0KXt2YXIgbj1lLl90cmFuc2l0aW9uQ2xhc3Nlc3x8KGUuX3RyYW5zaXRpb25DbGFzc2VzPVtdKTtuLmluZGV4T2YodCk8MCYmKG4ucHVzaCh0KSxnaShlLHQpKX1mdW5jdGlvbiBqaShlLHQpe2UuX3RyYW5zaXRpb25DbGFzc2VzJiZoKGUuX3RyYW5zaXRpb25DbGFzc2VzLHQpLF9pKGUsdCl9ZnVuY3Rpb24gRGkoZSx0LG4pe3ZhciByPU1pKGUsdCksaT1yLnR5cGUsbz1yLnRpbWVvdXQsYT1yLnByb3BDb3VudDtpZighaSlyZXR1cm4gbigpO3ZhciBzPWk9PT1DaT9BaTpTaSxjPTAsdT1mdW5jdGlvbigpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGwpLG4oKX0sbD1mdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJisrYz49YSYmdSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YzxhJiZ1KCl9LG8rMSksZS5hZGRFdmVudExpc3RlbmVyKHMsbCl9dmFyIExpPS9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLztmdW5jdGlvbiBNaShlLHQpe3ZhciBuLHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksaT0ocltraSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLG89KHJba2krIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSxhPUlpKGksbykscz0ocltPaSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLGM9KHJbT2krIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSx1PUlpKHMsYyksbD0wLGY9MDtyZXR1cm4gdD09PUNpP2E+MCYmKG49Q2ksbD1hLGY9by5sZW5ndGgpOnQ9PT14aT91PjAmJihuPXhpLGw9dSxmPWMubGVuZ3RoKTpmPShuPShsPU1hdGgubWF4KGEsdSkpPjA/YT51P0NpOnhpOm51bGwpP249PT1DaT9vLmxlbmd0aDpjLmxlbmd0aDowLHt0eXBlOm4sdGltZW91dDpsLHByb3BDb3VudDpmLGhhc1RyYW5zZm9ybTpuPT09Q2kmJkxpLnRlc3QocltraSsiUHJvcGVydHkiXSl9fWZ1bmN0aW9uIElpKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCx0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBGaSh0KStGaShlW25dKX0pKX1mdW5jdGlvbiBGaShlKXtyZXR1cm4gMWUzKk51bWJlcihlLnNsaWNlKDAsLTEpLnJlcGxhY2UoIiwiLCIuIikpfWZ1bmN0aW9uIFBpKGUscil7dmFyIGk9ZS5lbG07bihpLl9sZWF2ZUNiKSYmKGkuX2xlYXZlQ2IuY2FuY2VsbGVkPSEwLGkuX2xlYXZlQ2IoKSk7dmFyIGE9YmkoZS5kYXRhLnRyYW5zaXRpb24pO2lmKCF0KGEpJiYhbihpLl9lbnRlckNiKSYmMT09PWkubm9kZVR5cGUpe2Zvcih2YXIgcz1hLmNzcyxjPWEudHlwZSx1PWEuZW50ZXJDbGFzcyxsPWEuZW50ZXJUb0NsYXNzLHA9YS5lbnRlckFjdGl2ZUNsYXNzLGQ9YS5hcHBlYXJDbGFzcyx2PWEuYXBwZWFyVG9DbGFzcyxoPWEuYXBwZWFyQWN0aXZlQ2xhc3MsbT1hLmJlZm9yZUVudGVyLHk9YS5lbnRlcixnPWEuYWZ0ZXJFbnRlcixfPWEuZW50ZXJDYW5jZWxsZWQsYj1hLmJlZm9yZUFwcGVhciwkPWEuYXBwZWFyLHc9YS5hZnRlckFwcGVhcixDPWEuYXBwZWFyQ2FuY2VsbGVkLHg9YS5kdXJhdGlvbixrPVd0LEE9V3QuJHZub2RlO0EmJkEucGFyZW50OylrPUEuY29udGV4dCxBPUEucGFyZW50O3ZhciBPPSFrLl9pc01vdW50ZWR8fCFlLmlzUm9vdEluc2VydDtpZighT3x8JHx8IiI9PT0kKXt2YXIgUz1PJiZkP2Q6dSxUPU8mJmg/aDpwLEU9TyYmdj92OmwsTj1PJiZifHxtLGo9TyYmImZ1bmN0aW9uIj09dHlwZW9mICQ/JDp5LEw9TyYmd3x8ZyxNPU8mJkN8fF8sST1mKG8oeCk/eC5lbnRlcjp4KSxGPSExIT09cyYmIVcsUD1CaShqKSxSPWkuX2VudGVyQ2I9RChmdW5jdGlvbigpe0YmJihqaShpLEUpLGppKGksVCkpLFIuY2FuY2VsbGVkPyhGJiZqaShpLFMpLE0mJk0oaSkpOkwmJkwoaSksaS5fZW50ZXJDYj1udWxsfSk7ZS5kYXRhLnNob3d8fGl0KGUsImluc2VydCIsZnVuY3Rpb24oKXt2YXIgdD1pLnBhcmVudE5vZGUsbj10JiZ0Ll9wZW5kaW5nJiZ0Ll9wZW5kaW5nW2Uua2V5XTtuJiZuLnRhZz09PWUudGFnJiZuLmVsbS5fbGVhdmVDYiYmbi5lbG0uX2xlYXZlQ2IoKSxqJiZqKGksUil9KSxOJiZOKGkpLEYmJihOaShpLFMpLE5pKGksVCksRWkoZnVuY3Rpb24oKXtqaShpLFMpLFIuY2FuY2VsbGVkfHwoTmkoaSxFKSxQfHwoSGkoSSk/c2V0VGltZW91dChSLEkpOkRpKGksYyxSKSkpfSkpLGUuZGF0YS5zaG93JiYociYmcigpLGomJmooaSxSKSksRnx8UHx8UigpfX19ZnVuY3Rpb24gUmkoZSxyKXt2YXIgaT1lLmVsbTtuKGkuX2VudGVyQ2IpJiYoaS5fZW50ZXJDYi5jYW5jZWxsZWQ9ITAsaS5fZW50ZXJDYigpKTt2YXIgYT1iaShlLmRhdGEudHJhbnNpdGlvbik7aWYodChhKXx8MSE9PWkubm9kZVR5cGUpcmV0dXJuIHIoKTtpZighbihpLl9sZWF2ZUNiKSl7dmFyIHM9YS5jc3MsYz1hLnR5cGUsdT1hLmxlYXZlQ2xhc3MsbD1hLmxlYXZlVG9DbGFzcyxwPWEubGVhdmVBY3RpdmVDbGFzcyxkPWEuYmVmb3JlTGVhdmUsdj1hLmxlYXZlLGg9YS5hZnRlckxlYXZlLG09YS5sZWF2ZUNhbmNlbGxlZCx5PWEuZGVsYXlMZWF2ZSxnPWEuZHVyYXRpb24sXz0hMSE9PXMmJiFXLGI9QmkodiksJD1mKG8oZyk/Zy5sZWF2ZTpnKSx3PWkuX2xlYXZlQ2I9RChmdW5jdGlvbigpe2kucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLl9wZW5kaW5nJiYoaS5wYXJlbnROb2RlLl9wZW5kaW5nW2Uua2V5XT1udWxsKSxfJiYoamkoaSxsKSxqaShpLHApKSx3LmNhbmNlbGxlZD8oXyYmamkoaSx1KSxtJiZtKGkpKToocigpLGgmJmgoaSkpLGkuX2xlYXZlQ2I9bnVsbH0pO3k/eShDKTpDKCl9ZnVuY3Rpb24gQygpe3cuY2FuY2VsbGVkfHwoIWUuZGF0YS5zaG93JiZpLnBhcmVudE5vZGUmJigoaS5wYXJlbnROb2RlLl9wZW5kaW5nfHwoaS5wYXJlbnROb2RlLl9wZW5kaW5nPXt9KSlbZS5rZXldPWUpLGQmJmQoaSksXyYmKE5pKGksdSksTmkoaSxwKSxFaShmdW5jdGlvbigpe2ppKGksdSksdy5jYW5jZWxsZWR8fChOaShpLGwpLGJ8fChIaSgkKT9zZXRUaW1lb3V0KHcsJCk6RGkoaSxjLHcpKSl9KSksdiYmdihpLHcpLF98fGJ8fHcoKSl9fWZ1bmN0aW9uIEhpKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmIWlzTmFOKGUpfWZ1bmN0aW9uIEJpKGUpe2lmKHQoZSkpcmV0dXJuITE7dmFyIHI9ZS5mbnM7cmV0dXJuIG4ocik/QmkoQXJyYXkuaXNBcnJheShyKT9yWzBdOnIpOihlLl9sZW5ndGh8fGUubGVuZ3RoKT4xfWZ1bmN0aW9uIFVpKGUsdCl7ITAhPT10LmRhdGEuc2hvdyYmUGkodCl9dmFyIHppPWZ1bmN0aW9uKGUpe3ZhciBvLGEscz17fSxjPWUubW9kdWxlcyx1PWUubm9kZU9wcztmb3Iobz0wO288cnIubGVuZ3RoOysrbylmb3Ioc1tycltvXV09W10sYT0wO2E8Yy5sZW5ndGg7KythKW4oY1thXVtycltvXV0pJiZzW3JyW29dXS5wdXNoKGNbYV1bcnJbb11dKTtmdW5jdGlvbiBsKGUpe3ZhciB0PXUucGFyZW50Tm9kZShlKTtuKHQpJiZ1LnJlbW92ZUNoaWxkKHQsZSl9ZnVuY3Rpb24gZihlLHQsaSxvLGEsYyxsKXtpZihuKGUuZWxtKSYmbihjKSYmKGU9Y1tsXT1tZShlKSksZS5pc1Jvb3RJbnNlcnQ9IWEsIWZ1bmN0aW9uKGUsdCxpLG8pe3ZhciBhPWUuZGF0YTtpZihuKGEpKXt2YXIgYz1uKGUuY29tcG9uZW50SW5zdGFuY2UpJiZhLmtlZXBBbGl2ZTtpZihuKGE9YS5ob29rKSYmbihhPWEuaW5pdCkmJmEoZSwhMSksbihlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gZChlLHQpLHYoaSxlLmVsbSxvKSxyKGMpJiZmdW5jdGlvbihlLHQscixpKXtmb3IodmFyIG8sYT1lO2EuY29tcG9uZW50SW5zdGFuY2U7KWlmKGE9YS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsbihvPWEuZGF0YSkmJm4obz1vLnRyYW5zaXRpb24pKXtmb3Iobz0wO288cy5hY3RpdmF0ZS5sZW5ndGg7KytvKXMuYWN0aXZhdGVbb10obnIsYSk7dC5wdXNoKGEpO2JyZWFrfXYocixlLmVsbSxpKX0oZSx0LGksbyksITB9fShlLHQsaSxvKSl7dmFyIGY9ZS5kYXRhLHA9ZS5jaGlsZHJlbixtPWUudGFnO24obSk/KGUuZWxtPWUubnM/dS5jcmVhdGVFbGVtZW50TlMoZS5ucyxtKTp1LmNyZWF0ZUVsZW1lbnQobSxlKSxnKGUpLGgoZSxwLHQpLG4oZikmJnkoZSx0KSx2KGksZS5lbG0sbykpOnIoZS5pc0NvbW1lbnQpPyhlLmVsbT11LmNyZWF0ZUNvbW1lbnQoZS50ZXh0KSx2KGksZS5lbG0sbykpOihlLmVsbT11LmNyZWF0ZVRleHROb2RlKGUudGV4dCksdihpLGUuZWxtLG8pKX19ZnVuY3Rpb24gZChlLHQpe24oZS5kYXRhLnBlbmRpbmdJbnNlcnQpJiYodC5wdXNoLmFwcGx5KHQsZS5kYXRhLnBlbmRpbmdJbnNlcnQpLGUuZGF0YS5wZW5kaW5nSW5zZXJ0PW51bGwpLGUuZWxtPWUuY29tcG9uZW50SW5zdGFuY2UuJGVsLG0oZSk/KHkoZSx0KSxnKGUpKToodHIoZSksdC5wdXNoKGUpKX1mdW5jdGlvbiB2KGUsdCxyKXtuKGUpJiYobihyKT91LnBhcmVudE5vZGUocik9PT1lJiZ1Lmluc2VydEJlZm9yZShlLHQscik6dS5hcHBlbmRDaGlsZChlLHQpKX1mdW5jdGlvbiBoKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKWYodFtyXSxuLGUuZWxtLG51bGwsITAsdCxyKTtlbHNlIGkoZS50ZXh0KSYmdS5hcHBlbmRDaGlsZChlLmVsbSx1LmNyZWF0ZVRleHROb2RlKFN0cmluZyhlLnRleHQpKSl9ZnVuY3Rpb24gbShlKXtmb3IoO2UuY29tcG9uZW50SW5zdGFuY2U7KWU9ZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7cmV0dXJuIG4oZS50YWcpfWZ1bmN0aW9uIHkoZSx0KXtmb3IodmFyIHI9MDtyPHMuY3JlYXRlLmxlbmd0aDsrK3Ipcy5jcmVhdGVbcl0obnIsZSk7bihvPWUuZGF0YS5ob29rKSYmKG4oby5jcmVhdGUpJiZvLmNyZWF0ZShucixlKSxuKG8uaW5zZXJ0KSYmdC5wdXNoKGUpKX1mdW5jdGlvbiBnKGUpe3ZhciB0O2lmKG4odD1lLmZuU2NvcGVJZCkpdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpO2Vsc2UgZm9yKHZhciByPWU7cjspbih0PXIuY29udGV4dCkmJm4odD10LiRvcHRpb25zLl9zY29wZUlkKSYmdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpLHI9ci5wYXJlbnQ7bih0PVd0KSYmdCE9PWUuY29udGV4dCYmdCE9PWUuZm5Db250ZXh0JiZuKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJnUuc2V0U3R5bGVTY29wZShlLmVsbSx0KX1mdW5jdGlvbiBfKGUsdCxuLHIsaSxvKXtmb3IoO3I8PWk7KytyKWYobltyXSxvLGUsdCwhMSxuLHIpfWZ1bmN0aW9uIGIoZSl7dmFyIHQscixpPWUuZGF0YTtpZihuKGkpKWZvcihuKHQ9aS5ob29rKSYmbih0PXQuZGVzdHJveSkmJnQoZSksdD0wO3Q8cy5kZXN0cm95Lmxlbmd0aDsrK3Qpcy5kZXN0cm95W3RdKGUpO2lmKG4odD1lLmNoaWxkcmVuKSlmb3Iocj0wO3I8ZS5jaGlsZHJlbi5sZW5ndGg7KytyKWIoZS5jaGlsZHJlbltyXSl9ZnVuY3Rpb24gJChlLHQscil7Zm9yKDt0PD1yOysrdCl7dmFyIGk9ZVt0XTtuKGkpJiYobihpLnRhZyk/KHcoaSksYihpKSk6bChpLmVsbSkpfX1mdW5jdGlvbiB3KGUsdCl7aWYobih0KXx8bihlLmRhdGEpKXt2YXIgcixpPXMucmVtb3ZlLmxlbmd0aCsxO2ZvcihuKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbChlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxuKHI9ZS5jb21wb25lbnRJbnN0YW5jZSkmJm4ocj1yLl92bm9kZSkmJm4oci5kYXRhKSYmdyhyLHQpLHI9MDtyPHMucmVtb3ZlLmxlbmd0aDsrK3Ipcy5yZW1vdmVbcl0oZSx0KTtuKHI9ZS5kYXRhLmhvb2spJiZuKHI9ci5yZW1vdmUpP3IoZSx0KTp0KCl9ZWxzZSBsKGUuZWxtKX1mdW5jdGlvbiBDKGUsdCxyLGkpe2Zvcih2YXIgbz1yO288aTtvKyspe3ZhciBhPXRbb107aWYobihhKSYmaXIoZSxhKSlyZXR1cm4gb319ZnVuY3Rpb24geChlLGksbyxhLGMsbCl7aWYoZSE9PWkpe24oaS5lbG0pJiZuKGEpJiYoaT1hW2NdPW1lKGkpKTt2YXIgcD1pLmVsbT1lLmVsbTtpZihyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSluKGkuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLGksbyk6aS5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihyKGkuaXNTdGF0aWMpJiZyKGUuaXNTdGF0aWMpJiZpLmtleT09PWUua2V5JiYocihpLmlzQ2xvbmVkKXx8cihpLmlzT25jZSkpKWkuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBkLHY9aS5kYXRhO24odikmJm4oZD12Lmhvb2spJiZuKGQ9ZC5wcmVwYXRjaCkmJmQoZSxpKTt2YXIgaD1lLmNoaWxkcmVuLHk9aS5jaGlsZHJlbjtpZihuKHYpJiZtKGkpKXtmb3IoZD0wO2Q8cy51cGRhdGUubGVuZ3RoOysrZClzLnVwZGF0ZVtkXShlLGkpO24oZD12Lmhvb2spJiZuKGQ9ZC51cGRhdGUpJiZkKGUsaSl9dChpLnRleHQpP24oaCkmJm4oeSk/aCE9PXkmJmZ1bmN0aW9uKGUscixpLG8sYSl7Zm9yKHZhciBzLGMsbCxwPTAsZD0wLHY9ci5sZW5ndGgtMSxoPXJbMF0sbT1yW3ZdLHk9aS5sZW5ndGgtMSxnPWlbMF0sYj1pW3ldLHc9IWE7cDw9diYmZDw9eTspdChoKT9oPXJbKytwXTp0KG0pP209clstLXZdOmlyKGgsZyk/KHgoaCxnLG8saSxkKSxoPXJbKytwXSxnPWlbKytkXSk6aXIobSxiKT8oeChtLGIsbyxpLHkpLG09clstLXZdLGI9aVstLXldKTppcihoLGIpPyh4KGgsYixvLGkseSksdyYmdS5pbnNlcnRCZWZvcmUoZSxoLmVsbSx1Lm5leHRTaWJsaW5nKG0uZWxtKSksaD1yWysrcF0sYj1pWy0teV0pOmlyKG0sZyk/KHgobSxnLG8saSxkKSx3JiZ1Lmluc2VydEJlZm9yZShlLG0uZWxtLGguZWxtKSxtPXJbLS12XSxnPWlbKytkXSk6KHQocykmJihzPW9yKHIscCx2KSksdChjPW4oZy5rZXkpP3NbZy5rZXldOkMoZyxyLHAsdikpP2YoZyxvLGUsaC5lbG0sITEsaSxkKTppcihsPXJbY10sZyk/KHgobCxnLG8saSxkKSxyW2NdPXZvaWQgMCx3JiZ1Lmluc2VydEJlZm9yZShlLGwuZWxtLGguZWxtKSk6ZihnLG8sZSxoLmVsbSwhMSxpLGQpLGc9aVsrK2RdKTtwPnY/XyhlLHQoaVt5KzFdKT9udWxsOmlbeSsxXS5lbG0saSxkLHksbyk6ZD55JiYkKHIscCx2KX0ocCxoLHksbyxsKTpuKHkpPyhuKGUudGV4dCkmJnUuc2V0VGV4dENvbnRlbnQocCwiIiksXyhwLG51bGwseSwwLHkubGVuZ3RoLTEsbykpOm4oaCk/JChoLDAsaC5sZW5ndGgtMSk6bihlLnRleHQpJiZ1LnNldFRleHRDb250ZW50KHAsIiIpOmUudGV4dCE9PWkudGV4dCYmdS5zZXRUZXh0Q29udGVudChwLGkudGV4dCksbih2KSYmbihkPXYuaG9vaykmJm4oZD1kLnBvc3RwYXRjaCkmJmQoZSxpKX19fWZ1bmN0aW9uIGsoZSx0LGkpe2lmKHIoaSkmJm4oZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciBvPTA7bzx0Lmxlbmd0aDsrK28pdFtvXS5kYXRhLmhvb2suaW5zZXJ0KHRbb10pfXZhciBBPXAoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LGksbyl7dmFyIGEscz10LnRhZyxjPXQuZGF0YSx1PXQuY2hpbGRyZW47aWYobz1vfHxjJiZjLnByZSx0LmVsbT1lLHIodC5pc0NvbW1lbnQpJiZuKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITAsITA7aWYobihjKSYmKG4oYT1jLmhvb2spJiZuKGE9YS5pbml0KSYmYSh0LCEwKSxuKGE9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBkKHQsaSksITA7aWYobihzKSl7aWYobih1KSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihuKGE9YykmJm4oYT1hLmRvbVByb3BzKSYmbihhPWEuaW5uZXJIVE1MKSl7aWYoYSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBsPSEwLGY9ZS5maXJzdENoaWxkLHA9MDtwPHUubGVuZ3RoO3ArKyl7aWYoIWZ8fCFPKGYsdVtwXSxpLG8pKXtsPSExO2JyZWFrfWY9Zi5uZXh0U2libGluZ31pZighbHx8ZilyZXR1cm4hMX1lbHNlIGgodCx1LGkpO2lmKG4oYykpe3ZhciB2PSExO2Zvcih2YXIgbSBpbiBjKWlmKCFBKG0pKXt2PSEwLHkodCxpKTticmVha30hdiYmYy5jbGFzcyYmZXQoYy5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsaSxvLGEpe2lmKCF0KGkpKXt2YXIgYyxsPSExLHA9W107aWYodChlKSlsPSEwLGYoaSxwKTtlbHNle3ZhciBkPW4oZS5ub2RlVHlwZSk7aWYoIWQmJmlyKGUsaSkpeChlLGkscCxudWxsLG51bGwsYSk7ZWxzZXtpZihkKXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoTCkmJihlLnJlbW92ZUF0dHJpYnV0ZShMKSxvPSEwKSxyKG8pJiZPKGUsaSxwKSlyZXR1cm4gayhpLHAsITApLGU7Yz1lLGU9bmV3IHBlKHUudGFnTmFtZShjKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxjKX12YXIgdj1lLmVsbSxoPXUucGFyZW50Tm9kZSh2KTtpZihmKGkscCx2Ll9sZWF2ZUNiP251bGw6aCx1Lm5leHRTaWJsaW5nKHYpKSxuKGkucGFyZW50KSlmb3IodmFyIHk9aS5wYXJlbnQsZz1tKGkpO3k7KXtmb3IodmFyIF89MDtfPHMuZGVzdHJveS5sZW5ndGg7KytfKXMuZGVzdHJveVtfXSh5KTtpZih5LmVsbT1pLmVsbSxnKXtmb3IodmFyIHc9MDt3PHMuY3JlYXRlLmxlbmd0aDsrK3cpcy5jcmVhdGVbd10obnIseSk7dmFyIEM9eS5kYXRhLmhvb2suaW5zZXJ0O2lmKEMubWVyZ2VkKWZvcih2YXIgQT0xO0E8Qy5mbnMubGVuZ3RoO0ErKylDLmZuc1tBXSgpfWVsc2UgdHIoeSk7eT15LnBhcmVudH1uKGgpPyQoW2VdLDAsMCk6bihlLnRhZykmJmIoZSl9fXJldHVybiBrKGkscCxsKSxpLmVsbX1uKGUpJiZiKGUpfX0oe25vZGVPcHM6UW4sbW9kdWxlczpbbXIseHIsbmksb2ksbWksej97Y3JlYXRlOlVpLGFjdGl2YXRlOlVpLHJlbW92ZTpmdW5jdGlvbihlLHQpeyEwIT09ZS5kYXRhLnNob3c/UmkoZSx0KTp0KCl9fTp7fV0uY29uY2F0KHByKX0pO1cmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2UmJmUudm1vZGVsJiZYaShlLCJpbnB1dCIpfSk7dmFyIFZpPXtpbnNlcnRlZDpmdW5jdGlvbihlLHQsbixyKXsic2VsZWN0Ij09PW4udGFnPyhyLmVsbSYmIXIuZWxtLl92T3B0aW9ucz9pdChuLCJwb3N0cGF0Y2giLGZ1bmN0aW9uKCl7VmkuY29tcG9uZW50VXBkYXRlZChlLHQsbil9KTpLaShlLHQsbi5jb250ZXh0KSxlLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpKTooInRleHRhcmVhIj09PW4udGFnfHxYbihlLnR5cGUpKSYmKGUuX3ZNb2RpZmllcnM9dC5tb2RpZmllcnMsdC5tb2RpZmllcnMubGF6eXx8KGUuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25zdGFydCIsWmkpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25lbmQiLEdpKSxlLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsR2kpLFcmJihlLnZtb2RlbD0hMCkpKX0sY29tcG9uZW50VXBkYXRlZDpmdW5jdGlvbihlLHQsbil7aWYoInNlbGVjdCI9PT1uLnRhZyl7S2koZSx0LG4uY29udGV4dCk7dmFyIHI9ZS5fdk9wdGlvbnMsaT1lLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpO2lmKGkuc29tZShmdW5jdGlvbihlLHQpe3JldHVybiFOKGUsclt0XSl9KSkoZS5tdWx0aXBsZT90LnZhbHVlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHFpKGUsaSl9KTp0LnZhbHVlIT09dC5vbGRWYWx1ZSYmcWkodC52YWx1ZSxpKSkmJlhpKGUsImNoYW5nZSIpfX19O2Z1bmN0aW9uIEtpKGUsdCxuKXtKaShlLHQsbiksKHF8fFopJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7SmkoZSx0LG4pfSwwKX1mdW5jdGlvbiBKaShlLHQsbil7dmFyIHI9dC52YWx1ZSxpPWUubXVsdGlwbGU7aWYoIWl8fEFycmF5LmlzQXJyYXkocikpe2Zvcih2YXIgbyxhLHM9MCxjPWUub3B0aW9ucy5sZW5ndGg7czxjO3MrKylpZihhPWUub3B0aW9uc1tzXSxpKW89aihyLFdpKGEpKT4tMSxhLnNlbGVjdGVkIT09byYmKGEuc2VsZWN0ZWQ9byk7ZWxzZSBpZihOKFdpKGEpLHIpKXJldHVybiB2b2lkKGUuc2VsZWN0ZWRJbmRleCE9PXMmJihlLnNlbGVjdGVkSW5kZXg9cykpO2l8fChlLnNlbGVjdGVkSW5kZXg9LTEpfX1mdW5jdGlvbiBxaShlLHQpe3JldHVybiB0LmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiFOKHQsZSl9KX1mdW5jdGlvbiBXaShlKXtyZXR1cm4iX3ZhbHVlImluIGU/ZS5fdmFsdWU6ZS52YWx1ZX1mdW5jdGlvbiBaaShlKXtlLnRhcmdldC5jb21wb3Npbmc9ITB9ZnVuY3Rpb24gR2koZSl7ZS50YXJnZXQuY29tcG9zaW5nJiYoZS50YXJnZXQuY29tcG9zaW5nPSExLFhpKGUudGFyZ2V0LCJpbnB1dCIpKX1mdW5jdGlvbiBYaShlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIik7bi5pbml0RXZlbnQodCwhMCwhMCksZS5kaXNwYXRjaEV2ZW50KG4pfWZ1bmN0aW9uIFlpKGUpe3JldHVybiFlLmNvbXBvbmVudEluc3RhbmNlfHxlLmRhdGEmJmUuZGF0YS50cmFuc2l0aW9uP2U6WWkoZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpfXZhciBRaT17bW9kZWw6Vmksc2hvdzp7YmluZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZSxpPShuPVlpKG4pKS5kYXRhJiZuLmRhdGEudHJhbnNpdGlvbixvPWUuX192T3JpZ2luYWxEaXNwbGF5PSJub25lIj09PWUuc3R5bGUuZGlzcGxheT8iIjplLnN0eWxlLmRpc3BsYXk7ciYmaT8obi5kYXRhLnNob3c9ITAsUGkobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1vfSkpOmUuc3R5bGUuZGlzcGxheT1yP286Im5vbmUifSx1cGRhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQudmFsdWU7IXIhPSF0Lm9sZFZhbHVlJiYoKG49WWkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uPyhuLmRhdGEuc2hvdz0hMCxyP1BpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXl9KTpSaShuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PSJub25lIn0pKTplLnN0eWxlLmRpc3BsYXk9cj9lLl9fdk9yaWdpbmFsRGlzcGxheToibm9uZSIpfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0LG4scixpKXtpfHwoZS5zdHlsZS5kaXNwbGF5PWUuX192T3JpZ2luYWxEaXNwbGF5KX19fSxlbz17bmFtZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4sY3NzOkJvb2xlYW4sbW9kZTpTdHJpbmcsdHlwZTpTdHJpbmcsZW50ZXJDbGFzczpTdHJpbmcsbGVhdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhckNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsZHVyYXRpb246W051bWJlcixTdHJpbmcsT2JqZWN0XX07ZnVuY3Rpb24gdG8oZSl7dmFyIHQ9ZSYmZS5jb21wb25lbnRPcHRpb25zO3JldHVybiB0JiZ0LkN0b3Iub3B0aW9ucy5hYnN0cmFjdD90byh6dCh0LmNoaWxkcmVuKSk6ZX1mdW5jdGlvbiBubyhlKXt2YXIgdD17fSxuPWUuJG9wdGlvbnM7Zm9yKHZhciByIGluIG4ucHJvcHNEYXRhKXRbcl09ZVtyXTt2YXIgaT1uLl9wYXJlbnRMaXN0ZW5lcnM7Zm9yKHZhciBvIGluIGkpdFtiKG8pXT1pW29dO3JldHVybiB0fWZ1bmN0aW9uIHJvKGUsdCl7aWYoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHQudGFnKSlyZXR1cm4gZSgia2VlcC1hbGl2ZSIse3Byb3BzOnQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGF9KX12YXIgaW89ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnfHxVdChlKX0sb289ZnVuY3Rpb24oZSl7cmV0dXJuInNob3ciPT09ZS5uYW1lfSxhbz17bmFtZToidHJhbnNpdGlvbiIscHJvcHM6ZW8sYWJzdHJhY3Q6ITAscmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRzbG90cy5kZWZhdWx0O2lmKG4mJihuPW4uZmlsdGVyKGlvKSkubGVuZ3RoKXt2YXIgcj10aGlzLm1vZGUsbz1uWzBdO2lmKGZ1bmN0aW9uKGUpe2Zvcig7ZT1lLnBhcmVudDspaWYoZS5kYXRhLnRyYW5zaXRpb24pcmV0dXJuITB9KHRoaXMuJHZub2RlKSlyZXR1cm4gbzt2YXIgYT10byhvKTtpZighYSlyZXR1cm4gbztpZih0aGlzLl9sZWF2aW5nKXJldHVybiBybyhlLG8pO3ZhciBzPSJfX3RyYW5zaXRpb24tIit0aGlzLl91aWQrIi0iO2Eua2V5PW51bGw9PWEua2V5P2EuaXNDb21tZW50P3MrImNvbW1lbnQiOnMrYS50YWc6aShhLmtleSk/MD09PVN0cmluZyhhLmtleSkuaW5kZXhPZihzKT9hLmtleTpzK2Eua2V5OmEua2V5O3ZhciBjPShhLmRhdGF8fChhLmRhdGE9e30pKS50cmFuc2l0aW9uPW5vKHRoaXMpLHU9dGhpcy5fdm5vZGUsbD10byh1KTtpZihhLmRhdGEuZGlyZWN0aXZlcyYmYS5kYXRhLmRpcmVjdGl2ZXMuc29tZShvbykmJihhLmRhdGEuc2hvdz0hMCksbCYmbC5kYXRhJiYhZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5rZXk9PT1lLmtleSYmdC50YWc9PT1lLnRhZ30oYSxsKSYmIVV0KGwpJiYoIWwuY29tcG9uZW50SW5zdGFuY2V8fCFsLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1sLmRhdGEudHJhbnNpdGlvbj1BKHt9LGMpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxpdChmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLHJvKGUsbyk7aWYoImluLW91dCI9PT1yKXtpZihVdChhKSlyZXR1cm4gdTt2YXIgcCxkPWZ1bmN0aW9uKCl7cCgpfTtpdChjLCJhZnRlckVudGVyIixkKSxpdChjLCJlbnRlckNhbmNlbGxlZCIsZCksaXQoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBvfX19LHNvPUEoe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sZW8pO2Z1bmN0aW9uIGNvKGUpe2UuZWxtLl9tb3ZlQ2ImJmUuZWxtLl9tb3ZlQ2IoKSxlLmVsbS5fZW50ZXJDYiYmZS5lbG0uX2VudGVyQ2IoKX1mdW5jdGlvbiB1byhlKXtlLmRhdGEubmV3UG9zPWUuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWZ1bmN0aW9uIGxvKGUpe3ZhciB0PWUuZGF0YS5wb3Msbj1lLmRhdGEubmV3UG9zLHI9dC5sZWZ0LW4ubGVmdCxpPXQudG9wLW4udG9wO2lmKHJ8fGkpe2UuZGF0YS5tb3ZlZD0hMDt2YXIgbz1lLmVsbS5zdHlsZTtvLnRyYW5zZm9ybT1vLldlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIrcisicHgsIitpKyJweCkiLG8udHJhbnNpdGlvbkR1cmF0aW9uPSIwcyJ9fWRlbGV0ZSBzby5tb2RlO3ZhciBmbz17VHJhbnNpdGlvbjphbyxUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOnNvLGJlZm9yZU1vdW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuX3VwZGF0ZTt0aGlzLl91cGRhdGU9ZnVuY3Rpb24obixyKXt2YXIgaT1adChlKTtlLl9fcGF0Y2hfXyhlLl92bm9kZSxlLmtlcHQsITEsITApLGUuX3Zub2RlPWUua2VwdCxpKCksdC5jYWxsKGUsbixyKX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPW5vKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSxuW2Mua2V5XT1jLChjLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe2Zvcih2YXIgdT1bXSxsPVtdLGY9MDtmPHIubGVuZ3RoO2YrKyl7dmFyIHA9cltmXTtwLmRhdGEudHJhbnNpdGlvbj1hLHAuZGF0YS5wb3M9cC5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbltwLmtleV0/dS5wdXNoKHApOmwucHVzaChwKX10aGlzLmtlcHQ9ZSh0LG51bGwsdSksdGhpcy5yZW1vdmVkPWx9cmV0dXJuIGUodCxudWxsLG8pfSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmhhc01vdmUoZVswXS5lbG0sdCkmJihlLmZvckVhY2goY28pLGUuZm9yRWFjaCh1byksZS5mb3JFYWNoKGxvKSx0aGlzLl9yZWZsb3c9ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUuZGF0YS5tb3ZlZCl7dmFyIG49ZS5lbG0scj1uLnN0eWxlO05pKG4sdCksci50cmFuc2Zvcm09ci5XZWJraXRUcmFuc2Zvcm09ci50cmFuc2l0aW9uRHVyYXRpb249IiIsbi5hZGRFdmVudExpc3RlbmVyKEFpLG4uX21vdmVDYj1mdW5jdGlvbiBlKHIpe3ImJnIudGFyZ2V0IT09bnx8ciYmIS90cmFuc2Zvcm0kLy50ZXN0KHIucHJvcGVydHlOYW1lKXx8KG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihBaSxlKSxuLl9tb3ZlQ2I9bnVsbCxqaShuLHQpKX0pfX0pKX0sbWV0aG9kczp7aGFzTW92ZTpmdW5jdGlvbihlLHQpe2lmKCF3aSlyZXR1cm4hMTtpZih0aGlzLl9oYXNNb3ZlKXJldHVybiB0aGlzLl9oYXNNb3ZlO3ZhciBuPWUuY2xvbmVOb2RlKCk7ZS5fdHJhbnNpdGlvbkNsYXNzZXMmJmUuX3RyYW5zaXRpb25DbGFzc2VzLmZvckVhY2goZnVuY3Rpb24oZSl7X2kobixlKX0pLGdpKG4sdCksbi5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLiRlbC5hcHBlbmRDaGlsZChuKTt2YXIgcj1NaShuKTtyZXR1cm4gdGhpcy4kZWwucmVtb3ZlQ2hpbGQobiksdGhpcy5faGFzTW92ZT1yLmhhc1RyYW5zZm9ybX19fX07d24uY29uZmlnLm11c3RVc2VQcm9wPWpuLHduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPVduLHduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj1Fbix3bi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPVpuLHduLmNvbmZpZy5pc1Vua25vd25FbGVtZW50PWZ1bmN0aW9uKGUpe2lmKCF6KXJldHVybiEwO2lmKFduKGUpKXJldHVybiExO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGwhPUduW2VdKXJldHVybiBHbltlXTt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBlLmluZGV4T2YoIi0iKT4tMT9HbltlXT10LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxVbmtub3duRWxlbWVudHx8dC5jb25zdHJ1Y3Rvcj09PXdpbmRvdy5IVE1MRWxlbWVudDpHbltlXT0vSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KHQudG9TdHJpbmcoKSl9LEEod24ub3B0aW9ucy5kaXJlY3RpdmVzLFFpKSxBKHduLm9wdGlvbnMuY29tcG9uZW50cyxmbyksd24ucHJvdG90eXBlLl9fcGF0Y2hfXz16P3ppOlMsd24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIGUuJGVsPXQsZS4kb3B0aW9ucy5yZW5kZXJ8fChlLiRvcHRpb25zLnJlbmRlcj12ZSksWXQoZSwiYmVmb3JlTW91bnQiKSxyPWZ1bmN0aW9uKCl7ZS5fdXBkYXRlKGUuX3JlbmRlcigpLG4pfSxuZXcgZm4oZSxyLFMse2JlZm9yZTpmdW5jdGlvbigpe2UuX2lzTW91bnRlZCYmIWUuX2lzRGVzdHJveWVkJiZZdChlLCJiZWZvcmVVcGRhdGUiKX19LCEwKSxuPSExLG51bGw9PWUuJHZub2RlJiYoZS5faXNNb3VudGVkPSEwLFl0KGUsIm1vdW50ZWQiKSksZX0odGhpcyxlPWUmJno/WW4oZSk6dm9pZCAwLHQpfSx6JiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ri5kZXZ0b29scyYmbmUmJm5lLmVtaXQoImluaXQiLHduKX0sMCk7dmFyIHBvPS9ce1x7KCg/Oi58XHI/XG4pKz8pXH1cfS9nLHZvPS9bLS4qKz9eJHt9KCl8W1xdXC9cXF0vZyxobz1nKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0ucmVwbGFjZSh2bywiXFwkJiIpLG49ZVsxXS5yZXBsYWNlKHZvLCJcXCQmIik7cmV0dXJuIG5ldyBSZWdFeHAodCsiKCg/Oi58XFxuKSs/KSIrbiwiZyIpfSk7dmFyIG1vPXtzdGF0aWNLZXlzOlsic3RhdGljQ2xhc3MiXSx0cmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7dC53YXJuO3ZhciBuPUZyKGUsImNsYXNzIik7biYmKGUuc3RhdGljQ2xhc3M9SlNPTi5zdHJpbmdpZnkobikpO3ZhciByPUlyKGUsImNsYXNzIiwhMSk7ciYmKGUuY2xhc3NCaW5kaW5nPXIpfSxnZW5EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlLnN0YXRpY0NsYXNzJiYodCs9InN0YXRpY0NsYXNzOiIrZS5zdGF0aWNDbGFzcysiLCIpLGUuY2xhc3NCaW5kaW5nJiYodCs9ImNsYXNzOiIrZS5jbGFzc0JpbmRpbmcrIiwiKSx0fX07dmFyIHlvLGdvPXtzdGF0aWNLZXlzOlsic3RhdGljU3R5bGUiXSx0cmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7dC53YXJuO3ZhciBuPUZyKGUsInN0eWxlIik7biYmKGUuc3RhdGljU3R5bGU9SlNPTi5zdHJpbmdpZnkoYWkobikpKTt2YXIgcj1JcihlLCJzdHlsZSIsITEpO3ImJihlLnN0eWxlQmluZGluZz1yKX0sZ2VuRGF0YTpmdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZS5zdGF0aWNTdHlsZSYmKHQrPSJzdGF0aWNTdHlsZToiK2Uuc3RhdGljU3R5bGUrIiwiKSxlLnN0eWxlQmluZGluZyYmKHQrPSJzdHlsZTooIitlLnN0eWxlQmluZGluZysiKSwiKSx0fX0sX289ZnVuY3Rpb24oZSl7cmV0dXJuKHlvPXlvfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPWUseW8udGV4dENvbnRlbnR9LGJvPXAoImFyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLGxpbmssbWV0YSxwYXJhbSxzb3VyY2UsdHJhY2ssd2JyIiksJG89cCgiY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZSIpLHdvPXAoImFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxiYXNlLGJsb2NrcXVvdGUsYm9keSxjYXB0aW9uLGNvbCxjb2xncm91cCxkZCxkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0saDEsaDIsaDMsaDQsaDUsaDYsaGVhZCxoZWFkZXIsaGdyb3VwLGhyLGh0bWwsbGVnZW5kLGxpLG1lbnVpdGVtLG1ldGEsb3B0Z3JvdXAsb3B0aW9uLHBhcmFtLHJwLHJ0LHNvdXJjZSxzdHlsZSxzdW1tYXJ5LHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRpdGxlLHRyLHRyYWNrIiksQ289L15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vLHhvPS9eXHMqKCg/OnYtW1x3LV0rOnxAfDp8IylcW1tePV0rXF1bXlxzIic8PlwvPV0qKSg/OlxzKig9KVxzKig/OiIoW14iXSopIit8JyhbXiddKiknK3woW15ccyInPTw+YF0rKSkpPy8sa289IlthLXpBLVpfXVtcXC1cXC4wLTlfYS16QS1aIitQLnNvdXJjZSsiXSoiLEFvPSIoKD86IitrbysiXFw6KT8iK2tvKyIpIixPbz1uZXcgUmVnRXhwKCJePCIrQW8pLFNvPS9eXHMqKFwvPyk+LyxUbz1uZXcgUmVnRXhwKCJePFxcLyIrQW8rIltePl0qPiIpLEVvPS9ePCFET0NUWVBFIFtePl0rPi9pLE5vPS9ePCFcLS0vLGpvPS9ePCFcWy8sRG89cCgic2NyaXB0LHN0eWxlLHRleHRhcmVhIiwhMCksTG89e30sTW89eyImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiZhbXA7IjoiJiIsIiYjMTA7IjoiXG4iLCImIzk7IjoiXHQiLCImIzM5OyI6IicifSxJbz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOSk7L2csRm89LyYoPzpsdHxndHxxdW90fGFtcHwjMzl8IzEwfCM5KTsvZyxQbz1wKCJwcmUsdGV4dGFyZWEiLCEwKSxSbz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZQbyhlKSYmIlxuIj09PXRbMF19O2Z1bmN0aW9uIEhvKGUsdCl7dmFyIG49dD9GbzpJbztyZXR1cm4gZS5yZXBsYWNlKG4sZnVuY3Rpb24oZSl7cmV0dXJuIE1vW2VdfSl9dmFyIEJvLFVvLHpvLFZvLEtvLEpvLHFvLFdvLFpvPS9eQHxedi1vbjovLEdvPS9edi18XkB8Xjp8XiMvLFhvPS8oW1xzXFNdKj8pXHMrKD86aW58b2YpXHMrKFtcc1xTXSopLyxZbz0vLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLyxRbz0vXlwofFwpJC9nLGVhPS9eXFsuKlxdJC8sdGE9LzooLiopJC8sbmE9L146fF5cLnxedi1iaW5kOi8scmE9L1wuW14uXF1dKyg/PVteXF1dKiQpL2csaWE9L152LXNsb3QoOnwkKXxeIy8sb2E9L1tcclxuXS8sYWE9L1xzKy9nLHNhPWcoX28pLGNhPSJfZW1wdHlfIjtmdW5jdGlvbiB1YShlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDptYSh0KSxyYXdBdHRyc01hcDp7fSxwYXJlbnQ6bixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gbGEoZSx0KXtCbz10Lndhcm58fFNyLEpvPXQuaXNQcmVUYWd8fFQscW89dC5tdXN0VXNlUHJvcHx8VCxXbz10LmdldFRhZ05hbWVzcGFjZXx8VDt0LmlzUmVzZXJ2ZWRUYWc7em89VHIodC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksVm89VHIodC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksS289VHIodC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLFVvPXQuZGVsaW1pdGVyczt2YXIgbixyLGk9W10sbz0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLGE9dC53aGl0ZXNwYWNlLHM9ITEsYz0hMTtmdW5jdGlvbiB1KGUpe2lmKGwoZSksc3x8ZS5wcm9jZXNzZWR8fChlPWZhKGUsdCkpLGkubGVuZ3RofHxlPT09bnx8bi5pZiYmKGUuZWxzZWlmfHxlLmVsc2UpJiZkYShuLHtleHA6ZS5lbHNlaWYsYmxvY2s6ZX0pLHImJiFlLmZvcmJpZGRlbilpZihlLmVsc2VpZnx8ZS5lbHNlKWE9ZSwodT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe2lmKDE9PT1lW3RdLnR5cGUpcmV0dXJuIGVbdF07ZS5wb3AoKX19KHIuY2hpbGRyZW4pKSYmdS5pZiYmZGEodSx7ZXhwOmEuZWxzZWlmLGJsb2NrOmF9KTtlbHNle2lmKGUuc2xvdFNjb3BlKXt2YXIgbz1lLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInOyhyLnNjb3BlZFNsb3RzfHwoci5zY29wZWRTbG90cz17fSkpW29dPWV9ci5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PXJ9dmFyIGEsdTtlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnNsb3RTY29wZX0pLGwoZSksZS5wcmUmJihzPSExKSxKbyhlLnRhZykmJihjPSExKTtmb3IodmFyIGY9MDtmPEtvLmxlbmd0aDtmKyspS29bZl0oZSx0KX1mdW5jdGlvbiBsKGUpe2lmKCFjKWZvcih2YXIgdDsodD1lLmNoaWxkcmVuW2UuY2hpbGRyZW4ubGVuZ3RoLTFdKSYmMz09PXQudHlwZSYmIiAiPT09dC50ZXh0OyllLmNoaWxkcmVuLnBvcCgpfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGk9W10sbz10LmV4cGVjdEhUTUwsYT10LmlzVW5hcnlUYWd8fFQscz10LmNhbkJlTGVmdE9wZW5UYWd8fFQsYz0wO2U7KXtpZihuPWUsciYmRG8ocikpe3ZhciB1PTAsbD1yLnRvTG93ZXJDYXNlKCksZj1Mb1tsXXx8KExvW2xdPW5ldyBSZWdFeHAoIihbXFxzXFxTXSo/KSg8LyIrbCsiW14+XSo+KSIsImkiKSkscD1lLnJlcGxhY2UoZixmdW5jdGlvbihlLG4scil7cmV0dXJuIHU9ci5sZW5ndGgsRG8obCl8fCJub3NjcmlwdCI9PT1sfHwobj1uLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCIkMSIpLnJlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSIpKSxSbyhsLG4pJiYobj1uLnNsaWNlKDEpKSx0LmNoYXJzJiZ0LmNoYXJzKG4pLCIifSk7Yys9ZS5sZW5ndGgtcC5sZW5ndGgsZT1wLEEobCxjLXUsYyl9ZWxzZXt2YXIgZD1lLmluZGV4T2YoIjwiKTtpZigwPT09ZCl7aWYoTm8udGVzdChlKSl7dmFyIHY9ZS5pbmRleE9mKCItLVx4M2UiKTtpZih2Pj0wKXt0LnNob3VsZEtlZXBDb21tZW50JiZ0LmNvbW1lbnQoZS5zdWJzdHJpbmcoNCx2KSxjLGMrdiszKSxDKHYrMyk7Y29udGludWV9fWlmKGpvLnRlc3QoZSkpe3ZhciBoPWUuaW5kZXhPZigiXT4iKTtpZihoPj0wKXtDKGgrMik7Y29udGludWV9fXZhciBtPWUubWF0Y2goRW8pO2lmKG0pe0MobVswXS5sZW5ndGgpO2NvbnRpbnVlfXZhciB5PWUubWF0Y2goVG8pO2lmKHkpe3ZhciBnPWM7Qyh5WzBdLmxlbmd0aCksQSh5WzFdLGcsYyk7Y29udGludWV9dmFyIF89eCgpO2lmKF8pe2soXyksUm8oXy50YWdOYW1lLGUpJiZDKDEpO2NvbnRpbnVlfX12YXIgYj12b2lkIDAsJD12b2lkIDAsdz12b2lkIDA7aWYoZD49MCl7Zm9yKCQ9ZS5zbGljZShkKTshKFRvLnRlc3QoJCl8fE9vLnRlc3QoJCl8fE5vLnRlc3QoJCl8fGpvLnRlc3QoJCl8fCh3PSQuaW5kZXhPZigiPCIsMSkpPDApOylkKz13LCQ9ZS5zbGljZShkKTtiPWUuc3Vic3RyaW5nKDAsZCl9ZDwwJiYoYj1lKSxiJiZDKGIubGVuZ3RoKSx0LmNoYXJzJiZiJiZ0LmNoYXJzKGIsYy1iLmxlbmd0aCxjKX1pZihlPT09bil7dC5jaGFycyYmdC5jaGFycyhlKTticmVha319ZnVuY3Rpb24gQyh0KXtjKz10LGU9ZS5zdWJzdHJpbmcodCl9ZnVuY3Rpb24geCgpe3ZhciB0PWUubWF0Y2goT28pO2lmKHQpe3ZhciBuLHIsaT17dGFnTmFtZTp0WzFdLGF0dHJzOltdLHN0YXJ0OmN9O2ZvcihDKHRbMF0ubGVuZ3RoKTshKG49ZS5tYXRjaChTbykpJiYocj1lLm1hdGNoKHhvKXx8ZS5tYXRjaChDbykpOylyLnN0YXJ0PWMsQyhyWzBdLmxlbmd0aCksci5lbmQ9YyxpLmF0dHJzLnB1c2gocik7aWYobilyZXR1cm4gaS51bmFyeVNsYXNoPW5bMV0sQyhuWzBdLmxlbmd0aCksaS5lbmQ9YyxpfX1mdW5jdGlvbiBrKGUpe3ZhciBuPWUudGFnTmFtZSxjPWUudW5hcnlTbGFzaDtvJiYoInAiPT09ciYmd28obikmJkEocikscyhuKSYmcj09PW4mJkEobikpO2Zvcih2YXIgdT1hKG4pfHwhIWMsbD1lLmF0dHJzLmxlbmd0aCxmPW5ldyBBcnJheShsKSxwPTA7cDxsO3ArKyl7dmFyIGQ9ZS5hdHRyc1twXSx2PWRbM118fGRbNF18fGRbNV18fCIiLGg9ImEiPT09biYmImhyZWYiPT09ZFsxXT90LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzO2ZbcF09e25hbWU6ZFsxXSx2YWx1ZTpIbyh2LGgpfX11fHwoaS5wdXNoKHt0YWc6bixsb3dlckNhc2VkVGFnOm4udG9Mb3dlckNhc2UoKSxhdHRyczpmLHN0YXJ0OmUuc3RhcnQsZW5kOmUuZW5kfSkscj1uKSx0LnN0YXJ0JiZ0LnN0YXJ0KG4sZix1LGUuc3RhcnQsZS5lbmQpfWZ1bmN0aW9uIEEoZSxuLG8pe3ZhciBhLHM7aWYobnVsbD09biYmKG49YyksbnVsbD09byYmKG89YyksZSlmb3Iocz1lLnRvTG93ZXJDYXNlKCksYT1pLmxlbmd0aC0xO2E+PTAmJmlbYV0ubG93ZXJDYXNlZFRhZyE9PXM7YS0tKTtlbHNlIGE9MDtpZihhPj0wKXtmb3IodmFyIHU9aS5sZW5ndGgtMTt1Pj1hO3UtLSl0LmVuZCYmdC5lbmQoaVt1XS50YWcsbixvKTtpLmxlbmd0aD1hLHI9YSYmaVthLTFdLnRhZ31lbHNlImJyIj09PXM/dC5zdGFydCYmdC5zdGFydChlLFtdLCEwLG4sbyk6InAiPT09cyYmKHQuc3RhcnQmJnQuc3RhcnQoZSxbXSwhMSxuLG8pLHQuZW5kJiZ0LmVuZChlLG4sbykpfUEoKX0oZSx7d2FybjpCbyxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLG91dHB1dFNvdXJjZVJhbmdlOnQub3V0cHV0U291cmNlUmFuZ2Usc3RhcnQ6ZnVuY3Rpb24oZSxvLGEsbCxmKXt2YXIgcD1yJiZyLm5zfHxXbyhlKTtxJiYic3ZnIj09PXAmJihvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07eWEudGVzdChyLm5hbWUpfHwoci5uYW1lPXIubmFtZS5yZXBsYWNlKGdhLCIiKSx0LnB1c2gocikpfXJldHVybiB0fShvKSk7dmFyIGQsdj11YShlLG8scik7cCYmKHYubnM9cCksInN0eWxlIiE9PShkPXYpLnRhZyYmKCJzY3JpcHQiIT09ZC50YWd8fGQuYXR0cnNNYXAudHlwZSYmInRleHQvamF2YXNjcmlwdCIhPT1kLmF0dHJzTWFwLnR5cGUpfHx0ZSgpfHwodi5mb3JiaWRkZW49ITApO2Zvcih2YXIgaD0wO2g8Vm8ubGVuZ3RoO2grKyl2PVZvW2hdKHYsdCl8fHY7c3x8KCFmdW5jdGlvbihlKXtudWxsIT1GcihlLCJ2LXByZSIpJiYoZS5wcmU9ITApfSh2KSx2LnByZSYmKHM9ITApKSxKbyh2LnRhZykmJihjPSEwKSxzP2Z1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cnNMaXN0LG49dC5sZW5ndGg7aWYobilmb3IodmFyIHI9ZS5hdHRycz1uZXcgQXJyYXkobiksaT0wO2k8bjtpKyspcltpXT17bmFtZTp0W2ldLm5hbWUsdmFsdWU6SlNPTi5zdHJpbmdpZnkodFtpXS52YWx1ZSl9LG51bGwhPXRbaV0uc3RhcnQmJihyW2ldLnN0YXJ0PXRbaV0uc3RhcnQscltpXS5lbmQ9dFtpXS5lbmQpO2Vsc2UgZS5wcmV8fChlLnBsYWluPSEwKX0odik6di5wcm9jZXNzZWR8fChwYSh2KSxmdW5jdGlvbihlKXt2YXIgdD1GcihlLCJ2LWlmIik7aWYodCllLmlmPXQsZGEoZSx7ZXhwOnQsYmxvY2s6ZX0pO2Vsc2V7bnVsbCE9RnIoZSwidi1lbHNlIikmJihlLmVsc2U9ITApO3ZhciBuPUZyKGUsInYtZWxzZS1pZiIpO24mJihlLmVsc2VpZj1uKX19KHYpLGZ1bmN0aW9uKGUpe251bGwhPUZyKGUsInYtb25jZSIpJiYoZS5vbmNlPSEwKX0odikpLG58fChuPXYpLGE/dSh2KToocj12LGkucHVzaCh2KSl9LGVuZDpmdW5jdGlvbihlLHQsbil7dmFyIG89aVtpLmxlbmd0aC0xXTtpLmxlbmd0aC09MSxyPWlbaS5sZW5ndGgtMV0sdShvKX0sY2hhcnM6ZnVuY3Rpb24oZSx0LG4pe2lmKHImJighcXx8InRleHRhcmVhIiE9PXIudGFnfHxyLmF0dHJzTWFwLnBsYWNlaG9sZGVyIT09ZSkpe3ZhciBpLHUsbCxmPXIuY2hpbGRyZW47aWYoZT1jfHxlLnRyaW0oKT8ic2NyaXB0Ij09PShpPXIpLnRhZ3x8InN0eWxlIj09PWkudGFnP2U6c2EoZSk6Zi5sZW5ndGg/YT8iY29uZGVuc2UiPT09YSYmb2EudGVzdChlKT8iIjoiICI6bz8iICI6IiI6IiIpY3x8ImNvbmRlbnNlIiE9PWF8fChlPWUucmVwbGFjZShhYSwiICIpKSwhcyYmIiAiIT09ZSYmKHU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P2hvKHQpOnBvO2lmKG4udGVzdChlKSl7Zm9yKHZhciByLGksbyxhPVtdLHM9W10sYz1uLmxhc3RJbmRleD0wO3I9bi5leGVjKGUpOyl7KGk9ci5pbmRleCk+YyYmKHMucHVzaChvPWUuc2xpY2UoYyxpKSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KG8pKSk7dmFyIHU9QXIoclsxXS50cmltKCkpO2EucHVzaCgiX3MoIit1KyIpIikscy5wdXNoKHsiQGJpbmRpbmciOnV9KSxjPWkrclswXS5sZW5ndGh9cmV0dXJuIGM8ZS5sZW5ndGgmJihzLnB1c2gobz1lLnNsaWNlKGMpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkobykpKSx7ZXhwcmVzc2lvbjphLmpvaW4oIisiKSx0b2tlbnM6c319fShlLFVvKSk/bD17dHlwZToyLGV4cHJlc3Npb246dS5leHByZXNzaW9uLHRva2Vuczp1LnRva2Vucyx0ZXh0OmV9OiIgIj09PWUmJmYubGVuZ3RoJiYiICI9PT1mW2YubGVuZ3RoLTFdLnRleHR8fChsPXt0eXBlOjMsdGV4dDplfSksbCYmZi5wdXNoKGwpfX0sY29tbWVudDpmdW5jdGlvbihlLHQsbil7aWYocil7dmFyIGk9e3R5cGU6Myx0ZXh0OmUsaXNDb21tZW50OiEwfTtyLmNoaWxkcmVuLnB1c2goaSl9fX0pLG59ZnVuY3Rpb24gZmEoZSx0KXt2YXIgbixyOyhyPUlyKG49ZSwia2V5IikpJiYobi5rZXk9ciksZS5wbGFpbj0hZS5rZXkmJiFlLnNjb3BlZFNsb3RzJiYhZS5hdHRyc0xpc3QubGVuZ3RoLGZ1bmN0aW9uKGUpe3ZhciB0PUlyKGUsInJlZiIpO3QmJihlLnJlZj10LGUucmVmSW5Gb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtmb3IoO3Q7KXtpZih2b2lkIDAhPT10LmZvcilyZXR1cm4hMDt0PXQucGFyZW50fXJldHVybiExfShlKSl9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0OyJ0ZW1wbGF0ZSI9PT1lLnRhZz8odD1GcihlLCJzY29wZSIpLGUuc2xvdFNjb3BlPXR8fEZyKGUsInNsb3Qtc2NvcGUiKSk6KHQ9RnIoZSwic2xvdC1zY29wZSIpKSYmKGUuc2xvdFNjb3BlPXQpO3ZhciBuPUlyKGUsInNsb3QiKTtuJiYoZS5zbG90VGFyZ2V0PSciIic9PT1uPyciZGVmYXVsdCInOm4sZS5zbG90VGFyZ2V0RHluYW1pYz0hKCFlLmF0dHJzTWFwWyI6c2xvdCJdJiYhZS5hdHRyc01hcFsidi1iaW5kOnNsb3QiXSksInRlbXBsYXRlIj09PWUudGFnfHxlLnNsb3RTY29wZXx8TnIoZSwic2xvdCIsbixmdW5jdGlvbihlLHQpe3JldHVybiBlLnJhd0F0dHJzTWFwWyI6Iit0XXx8ZS5yYXdBdHRyc01hcFsidi1iaW5kOiIrdF18fGUucmF3QXR0cnNNYXBbdF19KGUsInNsb3QiKSkpO2lmKCJ0ZW1wbGF0ZSI9PT1lLnRhZyl7dmFyIHI9UHIoZSxpYSk7aWYocil7dmFyIGk9dmEociksbz1pLm5hbWUsYT1pLmR5bmFtaWM7ZS5zbG90VGFyZ2V0PW8sZS5zbG90VGFyZ2V0RHluYW1pYz1hLGUuc2xvdFNjb3BlPXIudmFsdWV8fGNhfX1lbHNle3ZhciBzPVByKGUsaWEpO2lmKHMpe3ZhciBjPWUuc2NvcGVkU2xvdHN8fChlLnNjb3BlZFNsb3RzPXt9KSx1PXZhKHMpLGw9dS5uYW1lLGY9dS5keW5hbWljLHA9Y1tsXT11YSgidGVtcGxhdGUiLFtdLGUpO3Auc2xvdFRhcmdldD1sLHAuc2xvdFRhcmdldER5bmFtaWM9ZixwLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKCFlLnNsb3RTY29wZSlyZXR1cm4gZS5wYXJlbnQ9cCwhMH0pLHAuc2xvdFNjb3BlPXMudmFsdWV8fGNhLGUuY2hpbGRyZW49W10sZS5wbGFpbj0hMX19fShlKSxmdW5jdGlvbihlKXsic2xvdCI9PT1lLnRhZyYmKGUuc2xvdE5hbWU9SXIoZSwibmFtZSIpKX0oZSksZnVuY3Rpb24oZSl7dmFyIHQ7KHQ9SXIoZSwiaXMiKSkmJihlLmNvbXBvbmVudD10KTtudWxsIT1GcihlLCJpbmxpbmUtdGVtcGxhdGUiKSYmKGUuaW5saW5lVGVtcGxhdGU9ITApfShlKTtmb3IodmFyIGk9MDtpPHpvLmxlbmd0aDtpKyspZT16b1tpXShlLHQpfHxlO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHU9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYocj1pPXVbdF0ubmFtZSxvPXVbdF0udmFsdWUsR28udGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLChhPWhhKHIucmVwbGFjZShHbywiIikpKSYmKHI9ci5yZXBsYWNlKHJhLCIiKSksbmEudGVzdChyKSlyPXIucmVwbGFjZShuYSwiIiksbz1BcihvKSwoYz1lYS50ZXN0KHIpKSYmKHI9ci5zbGljZSgxLC0xKSksYSYmKGEucHJvcCYmIWMmJiJpbm5lckh0bWwiPT09KHI9YihyKSkmJihyPSJpbm5lckhUTUwiKSxhLmNhbWVsJiYhYyYmKHI9YihyKSksYS5zeW5jJiYocz1CcihvLCIkZXZlbnQiKSxjP01yKGUsJyJ1cGRhdGU6IisoJytyKyIpIixzLG51bGwsITEsMCx1W3RdLCEwKTooTXIoZSwidXBkYXRlOiIrYihyKSxzLG51bGwsITEsMCx1W3RdKSxDKHIpIT09YihyKSYmTXIoZSwidXBkYXRlOiIrQyhyKSxzLG51bGwsITEsMCx1W3RdKSkpKSxhJiZhLnByb3B8fCFlLmNvbXBvbmVudCYmcW8oZS50YWcsZS5hdHRyc01hcC50eXBlLHIpP0VyKGUscixvLHVbdF0sYyk6TnIoZSxyLG8sdVt0XSxjKTtlbHNlIGlmKFpvLnRlc3Qocikpcj1yLnJlcGxhY2UoWm8sIiIpLChjPWVhLnRlc3QocikpJiYocj1yLnNsaWNlKDEsLTEpKSxNcihlLHIsbyxhLCExLDAsdVt0XSxjKTtlbHNle3ZhciBsPShyPXIucmVwbGFjZShHbywiIikpLm1hdGNoKHRhKSxmPWwmJmxbMV07Yz0hMSxmJiYocj1yLnNsaWNlKDAsLShmLmxlbmd0aCsxKSksZWEudGVzdChmKSYmKGY9Zi5zbGljZSgxLC0xKSxjPSEwKSksRHIoZSxyLGksbyxmLGMsYSx1W3RdKX1lbHNlIE5yKGUscixKU09OLnN0cmluZ2lmeShvKSx1W3RdKSwhZS5jb21wb25lbnQmJiJtdXRlZCI9PT1yJiZxbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscikmJkVyKGUsciwidHJ1ZSIsdVt0XSl9KGUpLGV9ZnVuY3Rpb24gcGEoZSl7dmFyIHQ7aWYodD1GcihlLCJ2LWZvciIpKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKFhvKTtpZighdClyZXR1cm47dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShRbywiIiksaT1yLm1hdGNoKFlvKTtpPyhuLmFsaWFzPXIucmVwbGFjZShZbywiIikudHJpbSgpLG4uaXRlcmF0b3IxPWlbMV0udHJpbSgpLGlbMl0mJihuLml0ZXJhdG9yMj1pWzJdLnRyaW0oKSkpOm4uYWxpYXM9cjtyZXR1cm4gbn0odCk7biYmQShlLG4pfX1mdW5jdGlvbiBkYShlLHQpe2UuaWZDb25kaXRpb25zfHwoZS5pZkNvbmRpdGlvbnM9W10pLGUuaWZDb25kaXRpb25zLnB1c2godCl9ZnVuY3Rpb24gdmEoZSl7dmFyIHQ9ZS5uYW1lLnJlcGxhY2UoaWEsIiIpO3JldHVybiB0fHwiIyIhPT1lLm5hbWVbMF0mJih0PSJkZWZhdWx0IiksZWEudGVzdCh0KT97bmFtZTp0LnNsaWNlKDEsLTEpLGR5bmFtaWM6ITB9OntuYW1lOiciJyt0KyciJyxkeW5hbWljOiExfX1mdW5jdGlvbiBoYShlKXt2YXIgdD1lLm1hdGNoKHJhKTtpZih0KXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZS5zbGljZSgxKV09ITB9KSxufX1mdW5jdGlvbiBtYShlKXtmb3IodmFyIHQ9e30sbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W2Vbbl0ubmFtZV09ZVtuXS52YWx1ZTtyZXR1cm4gdH12YXIgeWE9L154bWxuczpOU1xkKy8sZ2E9L15OU1xkKzovO2Z1bmN0aW9uIF9hKGUpe3JldHVybiB1YShlLnRhZyxlLmF0dHJzTGlzdC5zbGljZSgpLGUucGFyZW50KX12YXIgYmE9W21vLGdvLHtwcmVUcmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0Ij09PWUudGFnKXt2YXIgbixyPWUuYXR0cnNNYXA7aWYoIXJbInYtbW9kZWwiXSlyZXR1cm47aWYoKHJbIjp0eXBlIl18fHJbInYtYmluZDp0eXBlIl0pJiYobj1JcihlLCJ0eXBlIikpLHIudHlwZXx8bnx8IXJbInYtYmluZCJdfHwobj0iKCIrclsidi1iaW5kIl0rIikudHlwZSIpLG4pe3ZhciBpPUZyKGUsInYtaWYiLCEwKSxvPWk/IiYmKCIraSsiKSI6IiIsYT1udWxsIT1GcihlLCJ2LWVsc2UiLCEwKSxzPUZyKGUsInYtZWxzZS1pZiIsITApLGM9X2EoZSk7cGEoYyksanIoYywidHlwZSIsImNoZWNrYm94IiksZmEoYyx0KSxjLnByb2Nlc3NlZD0hMCxjLmlmPSIoIituKyIpPT09J2NoZWNrYm94JyIrbyxkYShjLHtleHA6Yy5pZixibG9jazpjfSk7dmFyIHU9X2EoZSk7RnIodSwidi1mb3IiLCEwKSxqcih1LCJ0eXBlIiwicmFkaW8iKSxmYSh1LHQpLGRhKGMse2V4cDoiKCIrbisiKT09PSdyYWRpbyciK28sYmxvY2s6dX0pO3ZhciBsPV9hKGUpO3JldHVybiBGcihsLCJ2LWZvciIsITApLGpyKGwsIjp0eXBlIixuKSxmYShsLHQpLGRhKGMse2V4cDppLGJsb2NrOmx9KSxhP2MuZWxzZT0hMDpzJiYoYy5lbHNlaWY9cyksY319fX1dO3ZhciAkYSx3YSxDYT17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOmJhLGRpcmVjdGl2ZXM6e21vZGVsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9dC5tb2RpZmllcnMsbz1lLnRhZyxhPWUuYXR0cnNNYXAudHlwZTtpZihlLmNvbXBvbmVudClyZXR1cm4gSHIoZSxyLGkpLCExO2lmKCJzZWxlY3QiPT09bykhZnVuY3Rpb24oZSx0LG4pe3ZhciByPSd2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VsZWN0ZWR9KS5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9ICJfdmFsdWUiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7cmV0dXJuICcrKG4mJm4ubnVtYmVyPyJfbih2YWwpIjoidmFsIikrIn0pOyI7cj1yKyIgIitCcih0LCIkZXZlbnQudGFyZ2V0Lm11bHRpcGxlID8gJCRzZWxlY3RlZFZhbCA6ICQkc2VsZWN0ZWRWYWxbMF0iKSxNcihlLCJjaGFuZ2UiLHIsbnVsbCwhMCl9KGUscixpKTtlbHNlIGlmKCJpbnB1dCI9PT1vJiYiY2hlY2tib3giPT09YSkhZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4mJm4ubnVtYmVyLGk9SXIoZSwidmFsdWUiKXx8Im51bGwiLG89SXIoZSwidHJ1ZS12YWx1ZSIpfHwidHJ1ZSIsYT1JcihlLCJmYWxzZS12YWx1ZSIpfHwiZmFsc2UiO0VyKGUsImNoZWNrZWQiLCJBcnJheS5pc0FycmF5KCIrdCsiKT9faSgiK3QrIiwiK2krIik+LTEiKygidHJ1ZSI9PT1vPyI6KCIrdCsiKSI6IjpfcSgiK3QrIiwiK28rIikiKSksTXIoZSwiY2hhbmdlIiwidmFyICQkYT0iK3QrIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oIitvKyIpOigiK2ErIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PSIrKHI/Il9uKCIraSsiKSI6aSkrIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIrQnIodCwiJCRhLmNvbmNhdChbJCR2XSkiKSsiKX1lbHNleyQkaT4tMSYmKCIrQnIodCwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkiKSsiKX19ZWxzZXsiK0JyKHQsIiQkYyIpKyJ9IixudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW8mJiJyYWRpbyI9PT1hKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsaT1JcihlLCJ2YWx1ZSIpfHwibnVsbCI7RXIoZSwiY2hlY2tlZCIsIl9xKCIrdCsiLCIrKGk9cj8iX24oIitpKyIpIjppKSsiKSIpLE1yKGUsImNoYW5nZSIsQnIodCxpKSxudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW98fCJ0ZXh0YXJlYSI9PT1vKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5hdHRyc01hcC50eXBlLGk9bnx8e30sbz1pLmxhenksYT1pLm51bWJlcixzPWkudHJpbSxjPSFvJiYicmFuZ2UiIT09cix1PW8/ImNoYW5nZSI6InJhbmdlIj09PXI/V3I6ImlucHV0IixsPSIkZXZlbnQudGFyZ2V0LnZhbHVlIjtzJiYobD0iJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKCkiKSxhJiYobD0iX24oIitsKyIpIik7dmFyIGY9QnIodCxsKTtjJiYoZj0iaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIrZiksRXIoZSwidmFsdWUiLCIoIit0KyIpIiksTXIoZSx1LGYsbnVsbCwhMCksKHN8fGEpJiZNcihlLCJibHVyIiwiJGZvcmNlVXBkYXRlKCkiKX0oZSxyLGkpO2Vsc2UgaWYoIUYuaXNSZXNlcnZlZFRhZyhvKSlyZXR1cm4gSHIoZSxyLGkpLCExO3JldHVybiEwfSx0ZXh0OmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwidGV4dENvbnRlbnQiLCJfcygiK3QudmFsdWUrIikiLHQpfSxodG1sOmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwiaW5uZXJIVE1MIiwiX3MoIit0LnZhbHVlKyIpIix0KX19LGlzUHJlVGFnOmZ1bmN0aW9uKGUpe3JldHVybiJwcmUiPT09ZX0saXNVbmFyeVRhZzpibyxtdXN0VXNlUHJvcDpqbixjYW5CZUxlZnRPcGVuVGFnOiRvLGlzUmVzZXJ2ZWRUYWc6V24sZ2V0VGFnTmFtZXNwYWNlOlpuLHN0YXRpY0tleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQuc3RhdGljS2V5c3x8W10pfSxbXSkuam9pbigiLCIpfShiYSl9LHhhPWcoZnVuY3Rpb24oZSl7cmV0dXJuIHAoInR5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMsc3RhcnQsZW5kLHJhd0F0dHJzTWFwIisoZT8iLCIrZToiIikpfSk7ZnVuY3Rpb24ga2EoZSx0KXtlJiYoJGE9eGEodC5zdGF0aWNLZXlzfHwiIiksd2E9dC5pc1Jlc2VydmVkVGFnfHxULGZ1bmN0aW9uIGUodCl7dC5zdGF0aWM9ZnVuY3Rpb24oZSl7aWYoMj09PWUudHlwZSlyZXR1cm4hMTtpZigzPT09ZS50eXBlKXJldHVybiEwO3JldHVybiEoIWUucHJlJiYoZS5oYXNCaW5kaW5nc3x8ZS5pZnx8ZS5mb3J8fGQoZS50YWcpfHwhd2EoZS50YWcpfHxmdW5jdGlvbihlKXtmb3IoO2UucGFyZW50Oyl7aWYoInRlbXBsYXRlIiE9PShlPWUucGFyZW50KS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9KGUpfHwhT2JqZWN0LmtleXMoZSkuZXZlcnkoJGEpKSl9KHQpO2lmKDE9PT10LnR5cGUpe2lmKCF3YSh0LnRhZykmJiJzbG90IiE9PXQudGFnJiZudWxsPT10LmF0dHJzTWFwWyJpbmxpbmUtdGVtcGxhdGUiXSlyZXR1cm47Zm9yKHZhciBuPTAscj10LmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXt2YXIgaT10LmNoaWxkcmVuW25dO2UoaSksaS5zdGF0aWN8fCh0LnN0YXRpYz0hMSl9aWYodC5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsYT10LmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxhO28rKyl7dmFyIHM9dC5pZkNvbmRpdGlvbnNbb10uYmxvY2s7ZShzKSxzLnN0YXRpY3x8KHQuc3RhdGljPSExKX19fShlKSxmdW5jdGlvbiBlKHQsbil7aWYoMT09PXQudHlwZSl7aWYoKHQuc3RhdGljfHx0Lm9uY2UpJiYodC5zdGF0aWNJbkZvcj1uKSx0LnN0YXRpYyYmdC5jaGlsZHJlbi5sZW5ndGgmJigxIT09dC5jaGlsZHJlbi5sZW5ndGh8fDMhPT10LmNoaWxkcmVuWzBdLnR5cGUpKXJldHVybiB2b2lkKHQuc3RhdGljUm9vdD0hMCk7aWYodC5zdGF0aWNSb290PSExLHQuY2hpbGRyZW4pZm9yKHZhciByPTAsaT10LmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWUodC5jaGlsZHJlbltyXSxufHwhIXQuZm9yKTtpZih0LmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxhPXQuaWZDb25kaXRpb25zLmxlbmd0aDtvPGE7bysrKWUodC5pZkNvbmRpdGlvbnNbb10uYmxvY2ssbil9fShlLCExKSl9dmFyIEFhPS9eKFtcdyRfXSt8XChbXildKj9cKSlccyo9PnxeZnVuY3Rpb24oPzpccytbXHckXSspP1xzKlwoLyxPYT0vXChbXildKj9cKTsqJC8sU2E9L15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLyxUYT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxFYT17ZXNjOlsiRXNjIiwiRXNjYXBlIl0sdGFiOiJUYWIiLGVudGVyOiJFbnRlciIsc3BhY2U6WyIgIiwiU3BhY2ViYXIiXSx1cDpbIlVwIiwiQXJyb3dVcCJdLGxlZnQ6WyJMZWZ0IiwiQXJyb3dMZWZ0Il0scmlnaHQ6WyJSaWdodCIsIkFycm93UmlnaHQiXSxkb3duOlsiRG93biIsIkFycm93RG93biJdLGRlbGV0ZTpbIkJhY2tzcGFjZSIsIkRlbGV0ZSIsIkRlbCJdfSxOYT1mdW5jdGlvbihlKXtyZXR1cm4iaWYoIitlKyIpcmV0dXJuIG51bGw7In0samE9e3N0b3A6IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiLHByZXZlbnQ6IiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIsc2VsZjpOYSgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSxjdHJsOk5hKCIhJGV2ZW50LmN0cmxLZXkiKSxzaGlmdDpOYSgiISRldmVudC5zaGlmdEtleSIpLGFsdDpOYSgiISRldmVudC5hbHRLZXkiKSxtZXRhOk5hKCIhJGV2ZW50Lm1ldGFLZXkiKSxsZWZ0Ok5hKCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMCIpLG1pZGRsZTpOYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSxyaWdodDpOYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDIiKX07ZnVuY3Rpb24gRGEoZSx0KXt2YXIgbj10PyJuYXRpdmVPbjoiOiJvbjoiLHI9IiIsaT0iIjtmb3IodmFyIG8gaW4gZSl7dmFyIGE9TGEoZVtvXSk7ZVtvXSYmZVtvXS5keW5hbWljP2krPW8rIiwiK2ErIiwiOnIrPSciJytvKyciOicrYSsiLCJ9cmV0dXJuIHI9InsiK3Iuc2xpY2UoMCwtMSkrIn0iLGk/bisiX2QoIityKyIsWyIraS5zbGljZSgwLC0xKSsiXSkiOm4rcn1mdW5jdGlvbiBMYShlKXtpZighZSlyZXR1cm4iZnVuY3Rpb24oKXt9IjtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiJbIitlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTGEoZSl9KS5qb2luKCIsIikrIl0iO3ZhciB0PVNhLnRlc3QoZS52YWx1ZSksbj1BYS50ZXN0KGUudmFsdWUpLHI9U2EudGVzdChlLnZhbHVlLnJlcGxhY2UoT2EsIiIpKTtpZihlLm1vZGlmaWVycyl7dmFyIGk9IiIsbz0iIixhPVtdO2Zvcih2YXIgcyBpbiBlLm1vZGlmaWVycylpZihqYVtzXSlvKz1qYVtzXSxUYVtzXSYmYS5wdXNoKHMpO2Vsc2UgaWYoImV4YWN0Ij09PXMpe3ZhciBjPWUubW9kaWZpZXJzO28rPU5hKFsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hY1tlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJGV2ZW50LiIrZSsiS2V5In0pLmpvaW4oInx8IikpfWVsc2UgYS5wdXNoKHMpO3JldHVybiBhLmxlbmd0aCYmKGkrPWZ1bmN0aW9uKGUpe3JldHVybiJpZighJGV2ZW50LnR5cGUuaW5kZXhPZigna2V5JykmJiIrZS5tYXAoTWEpLmpvaW4oIiYmIikrIilyZXR1cm4gbnVsbDsifShhKSksbyYmKGkrPW8pLCJmdW5jdGlvbigkZXZlbnQpeyIraSsodD8icmV0dXJuICIrZS52YWx1ZSsiKCRldmVudCkiOm4/InJldHVybiAoIitlLnZhbHVlKyIpKCRldmVudCkiOnI/InJldHVybiAiK2UudmFsdWU6ZS52YWx1ZSkrIn0ifXJldHVybiB0fHxuP2UudmFsdWU6ImZ1bmN0aW9uKCRldmVudCl7Iisocj8icmV0dXJuICIrZS52YWx1ZTplLnZhbHVlKSsifSJ9ZnVuY3Rpb24gTWEoZSl7dmFyIHQ9cGFyc2VJbnQoZSwxMCk7aWYodClyZXR1cm4iJGV2ZW50LmtleUNvZGUhPT0iK3Q7dmFyIG49VGFbZV0scj1FYVtlXTtyZXR1cm4iX2soJGV2ZW50LmtleUNvZGUsIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkobikrIiwkZXZlbnQua2V5LCIrSlNPTi5zdHJpbmdpZnkocikrIikifXZhciBJYT17b246ZnVuY3Rpb24oZSx0KXtlLndyYXBMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIl9nKCIrZSsiLCIrdC52YWx1ZSsiKSJ9fSxiaW5kOmZ1bmN0aW9uKGUsdCl7ZS53cmFwRGF0YT1mdW5jdGlvbihuKXtyZXR1cm4iX2IoIituKyIsJyIrZS50YWcrIicsIit0LnZhbHVlKyIsIisodC5tb2RpZmllcnMmJnQubW9kaWZpZXJzLnByb3A/InRydWUiOiJmYWxzZSIpKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMuc3luYz8iLHRydWUiOiIiKSsiKSJ9fSxjbG9hazpTfSxGYT1mdW5jdGlvbihlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLndhcm49ZS53YXJufHxTcix0aGlzLnRyYW5zZm9ybXM9VHIoZS5tb2R1bGVzLCJ0cmFuc2Zvcm1Db2RlIiksdGhpcy5kYXRhR2VuRm5zPVRyKGUubW9kdWxlcywiZ2VuRGF0YSIpLHRoaXMuZGlyZWN0aXZlcz1BKEEoe30sSWEpLGUuZGlyZWN0aXZlcyk7dmFyIHQ9ZS5pc1Jlc2VydmVkVGFnfHxUO3RoaXMubWF5YmVDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmNvbXBvbmVudHx8IXQoZS50YWcpfSx0aGlzLm9uY2VJZD0wLHRoaXMuc3RhdGljUmVuZGVyRm5zPVtdLHRoaXMucHJlPSExfTtmdW5jdGlvbiBQYShlLHQpe3ZhciBuPW5ldyBGYSh0KTtyZXR1cm57cmVuZGVyOiJ3aXRoKHRoaXMpe3JldHVybiAiKyhlP1JhKGUsbik6J19jKCJkaXYiKScpKyJ9IixzdGF0aWNSZW5kZXJGbnM6bi5zdGF0aWNSZW5kZXJGbnN9fWZ1bmN0aW9uIFJhKGUsdCl7aWYoZS5wYXJlbnQmJihlLnByZT1lLnByZXx8ZS5wYXJlbnQucHJlKSxlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gSGEoZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIEJhKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0KTtpZihlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVWEoZSx0KTtpZigidGVtcGxhdGUiIT09ZS50YWd8fGUuc2xvdFRhcmdldHx8dC5wcmUpe2lmKCJzbG90Ij09PWUudGFnKXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2xvdE5hbWV8fCciZGVmYXVsdCInLHI9cWEoZSx0KSxpPSJfdCgiK24rKHI/IiwiK3I6IiIpLG89ZS5hdHRyc3x8ZS5keW5hbWljQXR0cnM/R2EoKGUuYXR0cnN8fFtdKS5jb25jYXQoZS5keW5hbWljQXR0cnN8fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6YihlLm5hbWUpLHZhbHVlOmUudmFsdWUsZHluYW1pYzplLmR5bmFtaWN9fSkpOm51bGwsYT1lLmF0dHJzTWFwWyJ2LWJpbmQiXTshbyYmIWF8fHJ8fChpKz0iLG51bGwiKTtvJiYoaSs9IiwiK28pO2EmJihpKz0obz8iIjoiLG51bGwiKSsiLCIrYSk7cmV0dXJuIGkrIikifShlLHQpO3ZhciBuO2lmKGUuY29tcG9uZW50KW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuaW5saW5lVGVtcGxhdGU/bnVsbDpxYSh0LG4sITApO3JldHVybiJfYygiK2UrIiwiK1ZhKHQsbikrKHI/IiwiK3I6IiIpKyIpIn0oZS5jb21wb25lbnQsZSx0KTtlbHNle3ZhciByOyghZS5wbGFpbnx8ZS5wcmUmJnQubWF5YmVDb21wb25lbnQoZSkpJiYocj1WYShlLHQpKTt2YXIgaT1lLmlubGluZVRlbXBsYXRlP251bGw6cWEoZSx0LCEwKTtuPSJfYygnIitlLnRhZysiJyIrKHI/IiwiK3I6IiIpKyhpPyIsIitpOiIiKSsiKSJ9Zm9yKHZhciBvPTA7bzx0LnRyYW5zZm9ybXMubGVuZ3RoO28rKyluPXQudHJhbnNmb3Jtc1tvXShlLG4pO3JldHVybiBufXJldHVybiBxYShlLHQpfHwidm9pZCAwIn1mdW5jdGlvbiBIYShlLHQpe2Uuc3RhdGljUHJvY2Vzc2VkPSEwO3ZhciBuPXQucHJlO3JldHVybiBlLnByZSYmKHQucHJlPWUucHJlKSx0LnN0YXRpY1JlbmRlckZucy5wdXNoKCJ3aXRoKHRoaXMpe3JldHVybiAiK1JhKGUsdCkrIn0iKSx0LnByZT1uLCJfbSgiKyh0LnN0YXRpY1JlbmRlckZucy5sZW5ndGgtMSkrKGUuc3RhdGljSW5Gb3I/Iix0cnVlIjoiIikrIikifWZ1bmN0aW9uIEJhKGUsdCl7aWYoZS5vbmNlUHJvY2Vzc2VkPSEwLGUuaWYmJiFlLmlmUHJvY2Vzc2VkKXJldHVybiBVYShlLHQpO2lmKGUuc3RhdGljSW5Gb3Ipe2Zvcih2YXIgbj0iIixyPWUucGFyZW50O3I7KXtpZihyLmZvcil7bj1yLmtleTticmVha31yPXIucGFyZW50fXJldHVybiBuPyJfbygiK1JhKGUsdCkrIiwiK3Qub25jZUlkKysrIiwiK24rIikiOlJhKGUsdCl9cmV0dXJuIEhhKGUsdCl9ZnVuY3Rpb24gVWEoZSx0LG4scil7cmV0dXJuIGUuaWZQcm9jZXNzZWQ9ITAsZnVuY3Rpb24gZSh0LG4scixpKXtpZighdC5sZW5ndGgpcmV0dXJuIGl8fCJfZSgpIjt2YXIgbz10LnNoaWZ0KCk7cmV0dXJuIG8uZXhwPyIoIitvLmV4cCsiKT8iK2Eoby5ibG9jaykrIjoiK2UodCxuLHIsaSk6IiIrYShvLmJsb2NrKTtmdW5jdGlvbiBhKGUpe3JldHVybiByP3IoZSxuKTplLm9uY2U/QmEoZSxuKTpSYShlLG4pfX0oZS5pZkNvbmRpdGlvbnMuc2xpY2UoKSx0LG4scil9ZnVuY3Rpb24gemEoZSx0LG4scil7dmFyIGk9ZS5mb3Isbz1lLmFsaWFzLGE9ZS5pdGVyYXRvcjE/IiwiK2UuaXRlcmF0b3IxOiIiLHM9ZS5pdGVyYXRvcjI/IiwiK2UuaXRlcmF0b3IyOiIiO3JldHVybiBlLmZvclByb2Nlc3NlZD0hMCwocnx8Il9sIikrIigoIitpKyIpLGZ1bmN0aW9uKCIrbythK3MrIil7cmV0dXJuICIrKG58fFJhKShlLHQpKyJ9KSJ9ZnVuY3Rpb24gVmEoZSx0KXt2YXIgbj0ieyIscj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZGlyZWN0aXZlcztpZighbilyZXR1cm47dmFyIHIsaSxvLGEscz0iZGlyZWN0aXZlczpbIixjPSExO2ZvcihyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXtvPW5bcl0sYT0hMDt2YXIgdT10LmRpcmVjdGl2ZXNbby5uYW1lXTt1JiYoYT0hIXUoZSxvLHQud2FybikpLGEmJihjPSEwLHMrPSd7bmFtZToiJytvLm5hbWUrJyIscmF3TmFtZToiJytvLnJhd05hbWUrJyInKyhvLnZhbHVlPyIsdmFsdWU6KCIrby52YWx1ZSsiKSxleHByZXNzaW9uOiIrSlNPTi5zdHJpbmdpZnkoby52YWx1ZSk6IiIpKyhvLmFyZz8iLGFyZzoiKyhvLmlzRHluYW1pY0FyZz9vLmFyZzonIicrby5hcmcrJyInKToiIikrKG8ubW9kaWZpZXJzPyIsbW9kaWZpZXJzOiIrSlNPTi5zdHJpbmdpZnkoby5tb2RpZmllcnMpOiIiKSsifSwiKX1pZihjKXJldHVybiBzLnNsaWNlKDAsLTEpKyJdIn0oZSx0KTtyJiYobis9cisiLCIpLGUua2V5JiYobis9ImtleToiK2Uua2V5KyIsIiksZS5yZWYmJihuKz0icmVmOiIrZS5yZWYrIiwiKSxlLnJlZkluRm9yJiYobis9InJlZkluRm9yOnRydWUsIiksZS5wcmUmJihuKz0icHJlOnRydWUsIiksZS5jb21wb25lbnQmJihuKz0ndGFnOiInK2UudGFnKyciLCcpO2Zvcih2YXIgaT0wO2k8dC5kYXRhR2VuRm5zLmxlbmd0aDtpKyspbis9dC5kYXRhR2VuRm5zW2ldKGUpO2lmKGUuYXR0cnMmJihuKz0iYXR0cnM6IitHYShlLmF0dHJzKSsiLCIpLGUucHJvcHMmJihuKz0iZG9tUHJvcHM6IitHYShlLnByb3BzKSsiLCIpLGUuZXZlbnRzJiYobis9RGEoZS5ldmVudHMsITEpKyIsIiksZS5uYXRpdmVFdmVudHMmJihuKz1EYShlLm5hdGl2ZUV2ZW50cywhMCkrIiwiKSxlLnNsb3RUYXJnZXQmJiFlLnNsb3RTY29wZSYmKG4rPSJzbG90OiIrZS5zbG90VGFyZ2V0KyIsIiksZS5zY29wZWRTbG90cyYmKG4rPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmZvcnx8T2JqZWN0LmtleXModCkuc29tZShmdW5jdGlvbihlKXt2YXIgbj10W2VdO3JldHVybiBuLnNsb3RUYXJnZXREeW5hbWljfHxuLmlmfHxuLmZvcnx8S2Eobil9KSxpPSEhZS5pZjtpZighcilmb3IodmFyIG89ZS5wYXJlbnQ7bzspe2lmKG8uc2xvdFNjb3BlJiZvLnNsb3RTY29wZSE9PWNhfHxvLmZvcil7cj0hMDticmVha31vLmlmJiYoaT0hMCksbz1vLnBhcmVudH12YXIgYT1PYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIEphKHRbZV0sbil9KS5qb2luKCIsIik7cmV0dXJuInNjb3BlZFNsb3RzOl91KFsiK2ErIl0iKyhyPyIsbnVsbCx0cnVlIjoiIikrKCFyJiZpPyIsbnVsbCxmYWxzZSwiK2Z1bmN0aW9uKGUpe3ZhciB0PTUzODEsbj1lLmxlbmd0aDtmb3IoO247KXQ9MzMqdF5lLmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gdD4+PjB9KGEpOiIiKSsiKSJ9KGUsZS5zY29wZWRTbG90cyx0KSsiLCIpLGUubW9kZWwmJihuKz0ibW9kZWw6e3ZhbHVlOiIrZS5tb2RlbC52YWx1ZSsiLGNhbGxiYWNrOiIrZS5tb2RlbC5jYWxsYmFjaysiLGV4cHJlc3Npb246IitlLm1vZGVsLmV4cHJlc3Npb24rIn0sIiksZS5pbmxpbmVUZW1wbGF0ZSl7dmFyIG89ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuWzBdO2lmKG4mJjE9PT1uLnR5cGUpe3ZhciByPVBhKG4sdC5vcHRpb25zKTtyZXR1cm4iaW5saW5lVGVtcGxhdGU6e3JlbmRlcjpmdW5jdGlvbigpeyIrci5yZW5kZXIrIn0sc3RhdGljUmVuZGVyRm5zOlsiK3Iuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24oKXsiK2UrIn0ifSkuam9pbigiLCIpKyJdfSJ9fShlLHQpO28mJihuKz1vKyIsIil9cmV0dXJuIG49bi5yZXBsYWNlKC8sJC8sIiIpKyJ9IixlLmR5bmFtaWNBdHRycyYmKG49Il9iKCIrbisnLCInK2UudGFnKyciLCcrR2EoZS5keW5hbWljQXR0cnMpKyIpIiksZS53cmFwRGF0YSYmKG49ZS53cmFwRGF0YShuKSksZS53cmFwTGlzdGVuZXJzJiYobj1lLndyYXBMaXN0ZW5lcnMobikpLG59ZnVuY3Rpb24gS2EoZSl7cmV0dXJuIDE9PT1lLnR5cGUmJigic2xvdCI9PT1lLnRhZ3x8ZS5jaGlsZHJlbi5zb21lKEthKSl9ZnVuY3Rpb24gSmEoZSx0KXt2YXIgbj1lLmF0dHJzTWFwWyJzbG90LXNjb3BlIl07aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQmJiFuKXJldHVybiBVYShlLHQsSmEsIm51bGwiKTtpZihlLmZvciYmIWUuZm9yUHJvY2Vzc2VkKXJldHVybiB6YShlLHQsSmEpO3ZhciByPWUuc2xvdFNjb3BlPT09Y2E/IiI6U3RyaW5nKGUuc2xvdFNjb3BlKSxpPSJmdW5jdGlvbigiK3IrIil7cmV0dXJuICIrKCJ0ZW1wbGF0ZSI9PT1lLnRhZz9lLmlmJiZuPyIoIitlLmlmKyIpPyIrKHFhKGUsdCl8fCJ1bmRlZmluZWQiKSsiOnVuZGVmaW5lZCI6cWEoZSx0KXx8InVuZGVmaW5lZCI6UmEoZSx0KSkrIn0iLG89cj8iIjoiLHByb3h5OnRydWUiO3JldHVybiJ7a2V5OiIrKGUuc2xvdFRhcmdldHx8JyJkZWZhdWx0IicpKyIsZm46IitpK28rIn0ifWZ1bmN0aW9uIHFhKGUsdCxuLHIsaSl7dmFyIG89ZS5jaGlsZHJlbjtpZihvLmxlbmd0aCl7dmFyIGE9b1swXTtpZigxPT09by5sZW5ndGgmJmEuZm9yJiYidGVtcGxhdGUiIT09YS50YWcmJiJzbG90IiE9PWEudGFnKXt2YXIgcz1uP3QubWF5YmVDb21wb25lbnQoYSk/IiwxIjoiLDAiOiIiO3JldHVybiIiKyhyfHxSYSkoYSx0KStzfXZhciBjPW4/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aWYoMT09PWkudHlwZSl7aWYoV2EoaSl8fGkuaWZDb25kaXRpb25zJiZpLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBXYShlLmJsb2NrKX0pKXtuPTI7YnJlYWt9KHQoaSl8fGkuaWZDb25kaXRpb25zJiZpLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUuYmxvY2spfSkpJiYobj0xKX19cmV0dXJuIG59KG8sdC5tYXliZUNvbXBvbmVudCk6MCx1PWl8fFphO3JldHVybiJbIitvLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdShlLHQpfSkuam9pbigiLCIpKyJdIisoYz8iLCIrYzoiIil9fWZ1bmN0aW9uIFdhKGUpe3JldHVybiB2b2lkIDAhPT1lLmZvcnx8InRlbXBsYXRlIj09PWUudGFnfHwic2xvdCI9PT1lLnRhZ31mdW5jdGlvbiBaYShlLHQpe3JldHVybiAxPT09ZS50eXBlP1JhKGUsdCk6Mz09PWUudHlwZSYmZS5pc0NvbW1lbnQ/KHI9ZSwiX2UoIitKU09OLnN0cmluZ2lmeShyLnRleHQpKyIpIik6Il92KCIrKDI9PT0obj1lKS50eXBlP24uZXhwcmVzc2lvbjpYYShKU09OLnN0cmluZ2lmeShuLnRleHQpKSkrIikiO3ZhciBuLHJ9ZnVuY3Rpb24gR2EoZSl7Zm9yKHZhciB0PSIiLG49IiIscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdLG89WGEoaS52YWx1ZSk7aS5keW5hbWljP24rPWkubmFtZSsiLCIrbysiLCI6dCs9JyInK2kubmFtZSsnIjonK28rIiwifXJldHVybiB0PSJ7Iit0LnNsaWNlKDAsLTEpKyJ9IixuPyJfZCgiK3QrIixbIituLnNsaWNlKDAsLTEpKyJdKSI6dH1mdW5jdGlvbiBYYShlKXtyZXR1cm4gZS5yZXBsYWNlKC9cdTIwMjgvZywiXFx1MjAyOCIpLnJlcGxhY2UoL1x1MjAyOS9nLCJcXHUyMDI5Iil9bmV3IFJlZ0V4cCgiXFxiIisiZG8saWYsZm9yLGxldCxuZXcsdHJ5LHZhcixjYXNlLGVsc2Usd2l0aCxhd2FpdCxicmVhayxjYXRjaCxjbGFzcyxjb25zdCxzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsZXh0ZW5kcyxmaW5hbGx5LGNvbnRpbnVlLGRlYnVnZ2VyLGZ1bmN0aW9uLGFyZ3VtZW50cyIuc3BsaXQoIiwiKS5qb2luKCJcXGJ8XFxiIikrIlxcYiIpO2Z1bmN0aW9uIFlhKGUsdCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oZSl9Y2F0Y2gobil7cmV0dXJuIHQucHVzaCh7ZXJyOm4sY29kZTplfSksU319ZnVuY3Rpb24gUWEoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obixyLGkpeyhyPUEoe30scikpLndhcm47ZGVsZXRlIHIud2Fybjt2YXIgbz1yLmRlbGltaXRlcnM/U3RyaW5nKHIuZGVsaW1pdGVycykrbjpuO2lmKHRbb10pcmV0dXJuIHRbb107dmFyIGE9ZShuLHIpLHM9e30sYz1bXTtyZXR1cm4gcy5yZW5kZXI9WWEoYS5yZW5kZXIsYykscy5zdGF0aWNSZW5kZXJGbnM9YS5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBZYShlLGMpfSksdFtvXT1zfX12YXIgZXMsdHMsbnM9KGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bGEoZS50cmltKCksdCk7ITEhPT10Lm9wdGltaXplJiZrYShuLHQpO3ZhciByPVBhKG4sdCk7cmV0dXJue2FzdDpuLHJlbmRlcjpyLnJlbmRlcixzdGF0aWNSZW5kZXJGbnM6ci5zdGF0aWNSZW5kZXJGbnN9fSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbil7dmFyIHI9T2JqZWN0LmNyZWF0ZShlKSxpPVtdLG89W107aWYobilmb3IodmFyIGEgaW4gbi5tb2R1bGVzJiYoci5tb2R1bGVzPShlLm1vZHVsZXN8fFtdKS5jb25jYXQobi5tb2R1bGVzKSksbi5kaXJlY3RpdmVzJiYoci5kaXJlY3RpdmVzPUEoT2JqZWN0LmNyZWF0ZShlLmRpcmVjdGl2ZXN8fG51bGwpLG4uZGlyZWN0aXZlcykpLG4pIm1vZHVsZXMiIT09YSYmImRpcmVjdGl2ZXMiIT09YSYmKHJbYV09blthXSk7ci53YXJuPWZ1bmN0aW9uKGUsdCxuKXsobj9vOmkpLnB1c2goZSl9O3ZhciBzPWVzKHQudHJpbSgpLHIpO3JldHVybiBzLmVycm9ycz1pLHMudGlwcz1vLHN9cmV0dXJue2NvbXBpbGU6dCxjb21waWxlVG9GdW5jdGlvbnM6UWEodCl9fSkoQ2EpLHJzPShucy5jb21waWxlLG5zLmNvbXBpbGVUb0Z1bmN0aW9ucyk7ZnVuY3Rpb24gaXMoZSl7cmV0dXJuKHRzPXRzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPWU/JzxhIGhyZWY9IlxuIi8+JzonPGRpdiBhPSJcbiIvPicsdHMuaW5uZXJIVE1MLmluZGV4T2YoIiYjMTA7Iik+MH12YXIgb3M9ISF6JiZpcyghMSksYXM9ISF6JiZpcyghMCksc3M9ZyhmdW5jdGlvbihlKXt2YXIgdD1ZbihlKTtyZXR1cm4gdCYmdC5pbm5lckhUTUx9KSxjcz13bi5wcm90b3R5cGUuJG1vdW50O3JldHVybiB3bi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7aWYoKGU9ZSYmWW4oZSkpPT09ZG9jdW1lbnQuYm9keXx8ZT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudClyZXR1cm4gdGhpczt2YXIgbj10aGlzLiRvcHRpb25zO2lmKCFuLnJlbmRlcil7dmFyIHI9bi50ZW1wbGF0ZTtpZihyKWlmKCJzdHJpbmciPT10eXBlb2YgcikiIyI9PT1yLmNoYXJBdCgwKSYmKHI9c3MocikpO2Vsc2V7aWYoIXIubm9kZVR5cGUpcmV0dXJuIHRoaXM7cj1yLmlubmVySFRNTH1lbHNlIGUmJihyPWZ1bmN0aW9uKGUpe2lmKGUub3V0ZXJIVE1MKXJldHVybiBlLm91dGVySFRNTDt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5hcHBlbmRDaGlsZChlLmNsb25lTm9kZSghMCkpLHQuaW5uZXJIVE1MfShlKSk7aWYocil7dmFyIGk9cnMocix7b3V0cHV0U291cmNlUmFuZ2U6ITEsc2hvdWxkRGVjb2RlTmV3bGluZXM6b3Msc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOmFzLGRlbGltaXRlcnM6bi5kZWxpbWl0ZXJzLGNvbW1lbnRzOm4uY29tbWVudHN9LHRoaXMpLG89aS5yZW5kZXIsYT1pLnN0YXRpY1JlbmRlckZucztuLnJlbmRlcj1vLG4uc3RhdGljUmVuZGVyRm5zPWF9fXJldHVybiBjcy5jYWxsKHRoaXMsZSx0KX0sd24uY29tcGlsZT1ycyx3bn0pOw=="},{"meta":{"name":"vue.min.js","url":"https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js","ts":1637743679837,"mimetype":"text/javascript"},"source":"LyohCiAqIFZ1ZS5qcyB2Mi42LjEyCiAqIChjKSAyMDE0LTIwMjAgRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KIWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuVnVlPXQoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiB0KGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gcihlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBzKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09YS5jYWxsKGUpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiB0Pj0wJiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbihlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxzKGUpJiZlLnRvU3RyaW5nPT09YT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHAoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19dmFyIGQ9cCgic2xvdCxjb21wb25lbnQiLCEwKSx2PXAoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gaChlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB5KGUsdCl7cmV0dXJuIG0uY2FsbChlLHQpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbbl18fCh0W25dPWUobikpfX12YXIgXz0vLShcdykvZyxiPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShfLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSwkPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLHc9L1xCKFtBLVpdKS9nLEM9ZyhmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgeD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByP3I+MT9lLmFwcGx5KHQsYXJndW1lbnRzKTplLmNhbGwodCxuKTplLmNhbGwodCl9cmV0dXJuIG4uX2xlbmd0aD1lLmxlbmd0aCxufTtmdW5jdGlvbiBrKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmQSh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFMoZSx0LG4pe312YXIgVD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LEU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIE4oZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj1vKGUpLHI9byh0KTtpZighbnx8IXIpcmV0dXJuIW4mJiFyJiZTdHJpbmcoZSk9PT1TdHJpbmcodCk7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkoZSksYT1BcnJheS5pc0FycmF5KHQpO2lmKGkmJmEpcmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuZXZlcnkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gTihlLHRbbl0pfSk7aWYoZSBpbnN0YW5jZW9mIERhdGUmJnQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO2lmKGl8fGEpcmV0dXJuITE7dmFyIHM9T2JqZWN0LmtleXMoZSksYz1PYmplY3Qua2V5cyh0KTtyZXR1cm4gcy5sZW5ndGg9PT1jLmxlbmd0aCYmcy5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gTihlW25dLHRbbl0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGooZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihOKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gRChlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsTT1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLEk9WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLEY9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpULGlzUmVzZXJ2ZWRBdHRyOlQsaXNVbmtub3duRWxlbWVudDpULGdldFRhZ05hbWVzcGFjZTpTLHBhcnNlUGxhdGZvcm1UYWdOYW1lOkUsbXVzdFVzZVByb3A6VCxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6SX0sUD0vYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvO2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgSD1uZXcgUmVnRXhwKCJbXiIrUC5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgQixVPSJfX3Byb3RvX18iaW57fSx6PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFY9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSz1WJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSj16JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHE9SiYmL21zaWV8dHJpZGVudC8udGVzdChKKSxXPUomJkouaW5kZXhPZigibXNpZSA5LjAiKT4wLFo9SiYmSi5pbmRleE9mKCJlZGdlLyIpPjAsRz0oSiYmSi5pbmRleE9mKCJhbmRyb2lkIiksSiYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEopfHwiaW9zIj09PUspLFg9KEomJi9jaHJvbWVcL1xkKy8udGVzdChKKSxKJiYvcGhhbnRvbWpzLy50ZXN0KEopLEomJkoubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykpLFk9e30ud2F0Y2gsUT0hMTtpZih6KXRyeXt2YXIgZWU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGVlLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7UT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLGVlKX1jYXRjaChlKXt9dmFyIHRlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PUImJihCPSF6JiYhViYmInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLEJ9LG5lPXomJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIHJlKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgaWUsb2U9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnJlKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmcmUoUmVmbGVjdC5vd25LZXlzKTtpZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmcmUoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBhZT1TLHNlPTAsY2U9ZnVuY3Rpb24oKXt0aGlzLmlkPXNlKyssdGhpcy5zdWJzPVtdfTtjZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxjZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2godGhpcy5zdWJzLGUpfSxjZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Y2UudGFyZ2V0JiZjZS50YXJnZXQuYWRkRGVwKHRoaXMpfSxjZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0sY2UudGFyZ2V0PW51bGw7dmFyIHVlPVtdO2Z1bmN0aW9uIGxlKGUpe3VlLnB1c2goZSksY2UudGFyZ2V0PWV9ZnVuY3Rpb24gZmUoKXt1ZS5wb3AoKSxjZS50YXJnZXQ9dWVbdWUubGVuZ3RoLTFdfXZhciBwZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sZGU9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtkZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGUucHJvdG90eXBlLGRlKTt2YXIgdmU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBwZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIG5ldyBwZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW5ldyBwZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIHllPUFycmF5LnByb3RvdHlwZSxnZT1PYmplY3QuY3JlYXRlKHllKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9eWVbZV07UihnZSxlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09YXJndW1lbnRzW3JdO3ZhciBpLG89dC5hcHBseSh0aGlzLG4pLGE9dGhpcy5fX29iX187c3dpdGNoKGUpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjppPW47YnJlYWs7Y2FzZSJzcGxpY2UiOmk9bi5zbGljZSgyKX1yZXR1cm4gaSYmYS5vYnNlcnZlQXJyYXkoaSksYS5kZXAubm90aWZ5KCksb30pfSk7dmFyIF9lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGdlKSxiZT0hMDtmdW5jdGlvbiAkZShlKXtiZT1lfXZhciB3ZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGNlLHRoaXMudm1Db3VudD0wLFIoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhVPyh0PWdlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07UihlLG8sdFtvXSl9fShlLGdlLF9lKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiBDZShlLHQpe3ZhciBuO2lmKG8oZSkmJiEoZSBpbnN0YW5jZW9mIHBlKSlyZXR1cm4geShlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiB3ZT9uPWUuX19vYl9fOmJlJiYhdGUoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHMoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyB3ZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiB4ZShlLHQsbixyLGkpe3ZhciBvPW5ldyBjZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChuPWVbdF0pO3ZhciB1PSFpJiZDZShuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1zP3MuY2FsbChlKTpuO3JldHVybiBjZS50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KHQpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfSh0KSkpLHR9LHNldDpmdW5jdGlvbih0KXt2YXIgcj1zP3MuY2FsbChlKTpuO3Q9PT1yfHx0IT10JiZyIT1yfHxzJiYhY3x8KGM/Yy5jYWxsKGUsdCk6bj10LHU9IWkmJkNlKHQpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmYyh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bixuO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8oeGUoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOihlW3RdPW4sbil9ZnVuY3Rpb24gQWUoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZjKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHx5KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fXdlLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspeGUoZSx0W25dKX0sd2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspQ2UoZVt0XSl9O3ZhciBPZT1GLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1vZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLHkoZSxuKT9yIT09aSYmcyhyKSYmcyhpKSYmU2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gbj9mdW5jdGlvbigpe3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChuLG4pOnQsaT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmNhbGwobixuKTplO3JldHVybiByP1NlKHIsaSk6aX06dD9lP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnQsImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5jYWxsKHRoaXMsdGhpcyk6ZSl9OnQ6ZX1mdW5jdGlvbiBFZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIE5lKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/QShpLHQpOml9T2UuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/VGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sSS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2VdPUVlfSksTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2UrInMiXT1OZX0pLE9lLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1ZJiYoZT12b2lkIDApLHQ9PT1ZJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBBKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LE9lLnByb3BzPU9lLm1ldGhvZHM9T2UuaW5qZWN0PU9lLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEEoaSxlKSx0JiZBKGksdCksaX0sT2UucHJvdmlkZT1UZTt2YXIgamU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIERlKGUsdCxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dC5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2IoaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHMobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bYihhKV09cyhpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHQpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYocyhuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXMoYSk/QSh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fSh0KSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0odCksIXQuX2Jhc2UmJih0LmV4dGVuZHMmJihlPURlKGUsdC5leHRlbmRzLG4pKSx0Lm1peGlucykpZm9yKHZhciByPTAsaT10Lm1peGlucy5sZW5ndGg7cjxpO3IrKyllPURlKGUsdC5taXhpbnNbcl0sbik7dmFyIG8sYT17fTtmb3IobyBpbiBlKWMobyk7Zm9yKG8gaW4gdCl5KGUsbyl8fGMobyk7ZnVuY3Rpb24gYyhyKXt2YXIgaT1PZVtyXXx8amU7YVtyXT1pKGVbcl0sdFtyXSxuLHIpfXJldHVybiBhfWZ1bmN0aW9uIExlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZih5KGksbikpcmV0dXJuIGlbbl07dmFyIG89YihuKTtpZih5KGksbykpcmV0dXJuIGlbb107dmFyIGE9JChvKTtyZXR1cm4geShpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gTWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSF5KG4sZSksYT1uW2VdLHM9UGUoQm9vbGVhbixpLnR5cGUpO2lmKHM+LTEpaWYobyYmIXkoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1DKGUpKXt2YXIgYz1QZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIXkodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1JZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9YmU7JGUoITApLENlKGEpLCRlKHUpfXJldHVybiBhfWZ1bmN0aW9uIEllKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBGZShlLHQpe3JldHVybiBJZShlKT09PUllKHQpfWZ1bmN0aW9uIFBlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEZlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoRmUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBSZShlLHQsbil7bGUoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7QmUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19QmUoZSx0LG4pfWZpbmFsbHl7ZmUoKX19ZnVuY3Rpb24gSGUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZ1KG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIFJlKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtSZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gQmUoZSx0LG4pe2lmKEYuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gRi5lcnJvckhhbmRsZXIuY2FsbChudWxsLGUsdCxuKX1jYXRjaCh0KXt0IT09ZSYmVWUodCxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9VWUoZSx0LG4pfWZ1bmN0aW9uIFVlKGUsdCxuKXtpZigheiYmIVZ8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIHplLFZlPSExLEtlPVtdLEplPSExO2Z1bmN0aW9uIHFlKCl7SmU9ITE7dmFyIGU9S2Uuc2xpY2UoMCk7S2UubGVuZ3RoPTA7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmcmUoUHJvbWlzZSkpe3ZhciBXZT1Qcm9taXNlLnJlc29sdmUoKTt6ZT1mdW5jdGlvbigpe1dlLnRoZW4ocWUpLEcmJnNldFRpbWVvdXQoUyl9LFZlPSEwfWVsc2UgaWYocXx8InVuZGVmaW5lZCI9PXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyfHwhcmUoTXV0YXRpb25PYnNlcnZlcikmJiJbb2JqZWN0IE11dGF0aW9uT2JzZXJ2ZXJDb25zdHJ1Y3Rvcl0iIT09TXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpKXplPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZyZShzZXRJbW1lZGlhdGUpP2Z1bmN0aW9uKCl7c2V0SW1tZWRpYXRlKHFlKX06ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHFlLDApfTtlbHNle3ZhciBaZT0xLEdlPW5ldyBNdXRhdGlvbk9ic2VydmVyKHFlKSxYZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoWmUpKTtHZS5vYnNlcnZlKFhlLHtjaGFyYWN0ZXJEYXRhOiEwfSksemU9ZnVuY3Rpb24oKXtaZT0oWmUrMSklMixYZS5kYXRhPVN0cmluZyhaZSl9LFZlPSEwfWZ1bmN0aW9uIFllKGUsdCl7dmFyIG47aWYoS2UucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtSZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksSmV8fChKZT0hMCx6ZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgUWU9bmV3IGllO2Z1bmN0aW9uIGV0KGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgYT1BcnJheS5pc0FycmF5KHQpO2lmKCFhJiYhbyh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgcGUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgcz10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMocykpcmV0dXJuO24uYWRkKHMpfWlmKGEpZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFFlKSxRZS5jbGVhcigpfXZhciB0dD1nKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBudChlLHQpe2Z1bmN0aW9uIG4oKXt2YXIgZT1hcmd1bWVudHMscj1uLmZucztpZighQXJyYXkuaXNBcnJheShyKSlyZXR1cm4gSGUocixudWxsLGFyZ3VtZW50cyx0LCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIGk9ci5zbGljZSgpLG89MDtvPGkubGVuZ3RoO28rKylIZShpW29dLG51bGwsZSx0LCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gbi5mbnM9ZSxufWZ1bmN0aW9uIHJ0KGUsbixpLG8sYSxzKXt2YXIgYyx1LGwsZjtmb3IoYyBpbiBlKXU9ZVtjXSxsPW5bY10sZj10dChjKSx0KHUpfHwodChsKT8odCh1LmZucykmJih1PWVbY109bnQodSxzKSkscihmLm9uY2UpJiYodT1lW2NdPWEoZi5uYW1lLHUsZi5jYXB0dXJlKSksaShmLm5hbWUsdSxmLmNhcHR1cmUsZi5wYXNzaXZlLGYucGFyYW1zKSk6dSE9PWwmJihsLmZucz11LGVbY109bCkpO2ZvcihjIGluIG4pdChlW2NdKSYmbygoZj10dChjKSkubmFtZSxuW2NdLGYuY2FwdHVyZSl9ZnVuY3Rpb24gaXQoZSxpLG8pe3ZhciBhO2UgaW5zdGFuY2VvZiBwZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBzPWVbaV07ZnVuY3Rpb24gYygpe28uYXBwbHkodGhpcyxhcmd1bWVudHMpLGgoYS5mbnMsYyl9dChzKT9hPW50KFtjXSk6bihzLmZucykmJnIocy5tZXJnZWQpPyhhPXMpLmZucy5wdXNoKGMpOmE9bnQoW3MsY10pLGEubWVyZ2VkPSEwLGVbaV09YX1mdW5jdGlvbiBvdChlLHQscixpLG8pe2lmKG4odCkpe2lmKHkodCxyKSlyZXR1cm4gZVtyXT10W3JdLG98fGRlbGV0ZSB0W3JdLCEwO2lmKHkodCxpKSlyZXR1cm4gZVtyXT10W2ldLG98fGRlbGV0ZSB0W2ldLCEwfXJldHVybiExfWZ1bmN0aW9uIGF0KGUpe3JldHVybiBpKGUpP1toZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKG8sYSl7dmFyIHM9W107dmFyIGMsdSxsLGY7Zm9yKGM9MDtjPG8ubGVuZ3RoO2MrKyl0KHU9b1tjXSl8fCJib29sZWFuIj09dHlwZW9mIHV8fChsPXMubGVuZ3RoLTEsZj1zW2xdLEFycmF5LmlzQXJyYXkodSk/dS5sZW5ndGg+MCYmKHN0KCh1PWUodSwoYXx8IiIpKyJfIitjKSlbMF0pJiZzdChmKSYmKHNbbF09aGUoZi50ZXh0K3VbMF0udGV4dCksdS5zaGlmdCgpKSxzLnB1c2guYXBwbHkocyx1KSk6aSh1KT9zdChmKT9zW2xdPWhlKGYudGV4dCt1KToiIiE9PXUmJnMucHVzaChoZSh1KSk6c3QodSkmJnN0KGYpP3NbbF09aGUoZi50ZXh0K3UudGV4dCk6KHIoby5faXNWTGlzdCkmJm4odS50YWcpJiZ0KHUua2V5KSYmbihhKSYmKHUua2V5PSJfX3ZsaXN0IithKyJfIitjKyJfXyIpLHMucHVzaCh1KSkpO3JldHVybiBzfShlKTp2b2lkIDB9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIG4oZSkmJm4oZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBjdChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9b2U/UmVmbGVjdC5vd25LZXlzKGUpOk9iamVjdC5rZXlzKGUpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZigiX19vYl9fIiE9PW8pe2Zvcih2YXIgYT1lW29dLmZyb20scz10O3M7KXtpZihzLl9wcm92aWRlZCYmeShzLl9wcm92aWRlZCxhKSl7bltvXT1zLl9wcm92aWRlZFthXTticmVha31zPXMuJHBhcmVudH1pZighcyYmImRlZmF1bHQiaW4gZVtvXSl7dmFyIGM9ZVtvXS5kZWZhdWx0O25bb109ImZ1bmN0aW9uIj09dHlwZW9mIGM/Yy5jYWxsKHQpOmN9fX1yZXR1cm4gbn19ZnVuY3Rpb24gdXQoZSx0KXtpZighZXx8IWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3QpKG4uZGVmYXVsdHx8KG4uZGVmYXVsdD1bXSkpLnB1c2gobyk7ZWxzZXt2YXIgcz1hLnNsb3QsYz1uW3NdfHwobltzXT1bXSk7InRlbXBsYXRlIj09PW8udGFnP2MucHVzaC5hcHBseShjLG8uY2hpbGRyZW58fFtdKTpjLnB1c2gobyl9fWZvcih2YXIgdSBpbiBuKW5bdV0uZXZlcnkobHQpJiZkZWxldGUgblt1XTtyZXR1cm4gbn1mdW5jdGlvbiBsdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJiFlLmFzeW5jRmFjdG9yeXx8IiAiPT09ZS50ZXh0fWZ1bmN0aW9uIGZ0KHQsbixyKXt2YXIgaSxvPU9iamVjdC5rZXlzKG4pLmxlbmd0aD4wLGE9dD8hIXQuJHN0YWJsZTohbyxzPXQmJnQuJGtleTtpZih0KXtpZih0Ll9ub3JtYWxpemVkKXJldHVybiB0Ll9ub3JtYWxpemVkO2lmKGEmJnImJnIhPT1lJiZzPT09ci4ka2V5JiYhbyYmIXIuJGhhc05vcm1hbClyZXR1cm4gcjtmb3IodmFyIGMgaW4gaT17fSx0KXRbY10mJiIkIiE9PWNbMF0mJihpW2NdPXB0KG4sYyx0W2NdKSl9ZWxzZSBpPXt9O2Zvcih2YXIgdSBpbiBuKXUgaW4gaXx8KGlbdV09ZHQobix1KSk7cmV0dXJuIHQmJk9iamVjdC5pc0V4dGVuc2libGUodCkmJih0Ll9ub3JtYWxpemVkPWkpLFIoaSwiJHN0YWJsZSIsYSksUihpLCIka2V5IixzKSxSKGksIiRoYXNOb3JtYWwiLG8pLGl9ZnVuY3Rpb24gcHQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KTtyZXR1cm4oZT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiFBcnJheS5pc0FycmF5KGUpP1tlXTphdChlKSkmJigwPT09ZS5sZW5ndGh8fDE9PT1lLmxlbmd0aCYmZVswXS5pc0NvbW1lbnQpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uIGR0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIHZ0KGUsdCl7dmFyIHIsaSxhLHMsYztpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXJbaV09dChlW2ldLGkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihyPW5ldyBBcnJheShlKSxpPTA7aTxlO2krKylyW2ldPXQoaSsxLGkpO2Vsc2UgaWYobyhlKSlpZihvZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtyPVtdO2Zvcih2YXIgdT1lW1N5bWJvbC5pdGVyYXRvcl0oKSxsPXUubmV4dCgpOyFsLmRvbmU7KXIucHVzaCh0KGwudmFsdWUsci5sZW5ndGgpKSxsPXUubmV4dCgpfWVsc2UgZm9yKHM9T2JqZWN0LmtleXMoZSkscj1uZXcgQXJyYXkocy5sZW5ndGgpLGk9MCxhPXMubGVuZ3RoO2k8YTtpKyspYz1zW2ldLHJbaV09dChlW2NdLGMsaSk7cmV0dXJuIG4ocil8fChyPVtdKSxyLl9pc1ZMaXN0PSEwLHJ9ZnVuY3Rpb24gaHQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPUEoQSh7fSxyKSxuKSksaT1vKG4pfHx0KTppPXRoaXMuJHNsb3RzW2VdfHx0O3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6YX0saSk6aX1mdW5jdGlvbiBtdChlKXtyZXR1cm4gTGUodGhpcy4kb3B0aW9ucywiZmlsdGVycyIsZSl8fEV9ZnVuY3Rpb24geXQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBndChlLHQsbixyLGkpe3ZhciBvPUYua2V5Q29kZXNbdF18fG47cmV0dXJuIGkmJnImJiFGLmtleUNvZGVzW3RdP3l0KGkscik6bz95dChvLGUpOnI/QyhyKSE9PXQ6dm9pZCAwfWZ1bmN0aW9uIF90KGUsdCxuLHIsaSl7aWYobilpZihvKG4pKXt2YXIgYTtBcnJheS5pc0FycmF5KG4pJiYobj1PKG4pKTt2YXIgcz1mdW5jdGlvbihvKXtpZigiY2xhc3MiPT09b3x8InN0eWxlIj09PW98fHYobykpYT1lO2Vsc2V7dmFyIHM9ZS5hdHRycyYmZS5hdHRycy50eXBlO2E9cnx8Ri5tdXN0VXNlUHJvcCh0LHMsbyk/ZS5kb21Qcm9wc3x8KGUuZG9tUHJvcHM9e30pOmUuYXR0cnN8fChlLmF0dHJzPXt9KX12YXIgYz1iKG8pLHU9QyhvKTtjIGluIGF8fHUgaW4gYXx8KGFbb109bltvXSxpJiYoKGUub258fChlLm9uPXt9KSlbInVwZGF0ZToiK29dPWZ1bmN0aW9uKGUpe25bb109ZX0pKX07Zm9yKHZhciBjIGluIG4pcyhjKX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIGJ0KGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdD9yOih3dChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyKX1mdW5jdGlvbiAkdChlLHQsbil7cmV0dXJuIHd0KGUsIl9fb25jZV9fIit0KyhuPyJfIituOiIiKSwhMCksZX1mdW5jdGlvbiB3dChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYic3RyaW5nIiE9dHlwZW9mIGVbcl0mJkN0KGVbcl0sdCsiXyIrcixuKTtlbHNlIEN0KGUsdCxuKX1mdW5jdGlvbiBDdChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24geHQoZSx0KXtpZih0KWlmKHModCkpe3ZhciBuPWUub249ZS5vbj9BKHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgaT1uW3JdLG89dFtyXTtuW3JdPWk/W10uY29uY2F0KGksbyk6b319ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBrdChlLHQsbixyKXt0PXR8fHskc3RhYmxlOiFufTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtBcnJheS5pc0FycmF5KG8pP2t0KG8sdCxuKTpvJiYoby5wcm94eSYmKG8uZm4ucHJveHk9ITApLHRbby5rZXldPW8uZm4pfXJldHVybiByJiYodC4ka2V5PXIpLHR9ZnVuY3Rpb24gQXQoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl07InN0cmluZyI9PXR5cGVvZiByJiZyJiYoZVt0W25dXT10W24rMV0pfXJldHVybiBlfWZ1bmN0aW9uIE90KGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP3QrZTplfWZ1bmN0aW9uIFN0KGUpe2UuX289JHQsZS5fbj1mLGUuX3M9bCxlLl9sPXZ0LGUuX3Q9aHQsZS5fcT1OLGUuX2k9aixlLl9tPWJ0LGUuX2Y9bXQsZS5faz1ndCxlLl9iPV90LGUuX3Y9aGUsZS5fZT12ZSxlLl91PWt0LGUuX2c9eHQsZS5fZD1BdCxlLl9wPU90fWZ1bmN0aW9uIFR0KHQsbixpLG8sYSl7dmFyIHMsYz10aGlzLHU9YS5vcHRpb25zO3kobywiX3VpZCIpPyhzPU9iamVjdC5jcmVhdGUobykpLl9vcmlnaW5hbD1vOihzPW8sbz1vLl9vcmlnaW5hbCk7dmFyIGw9cih1Ll9jb21waWxlZCksZj0hbDt0aGlzLmRhdGE9dCx0aGlzLnByb3BzPW4sdGhpcy5jaGlsZHJlbj1pLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9dC5vbnx8ZSx0aGlzLmluamVjdGlvbnM9Y3QodS5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBjLiRzbG90c3x8ZnQodC5zY29wZWRTbG90cyxjLiRzbG90cz11dChpLG8pKSxjLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnQodC5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGwmJih0aGlzLiRvcHRpb25zPXUsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPWZ0KHQuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSx1Ll9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9UHQocyxlLHQsbixyLGYpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXUuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gUHQocyxlLHQsbixyLGYpfX1mdW5jdGlvbiBFdChlLHQsbixyLGkpe3ZhciBvPW1lKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIE50KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtiKG4pXT10W25dfVN0KFR0LnByb3RvdHlwZSk7dmFyIGp0PXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgcj1lO2p0LnByZXBhdGNoKHIscil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciByPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnR9LGk9ZS5kYXRhLmlubGluZVRlbXBsYXRlO24oaSkmJihyLnJlbmRlcj1pLnJlbmRlcixyLnN0YXRpY1JlbmRlckZucz1pLnN0YXRpY1JlbmRlckZucyk7cmV0dXJuIG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihyKX0oZSxXdCkpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKHQsbil7dmFyIHI9bi5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbih0LG4scixpLG8pe3ZhciBhPWkuZGF0YS5zY29wZWRTbG90cyxzPXQuJHNjb3BlZFNsb3RzLGM9ISEoYSYmIWEuJHN0YWJsZXx8cyE9PWUmJiFzLiRzdGFibGV8fGEmJnQuJHNjb3BlZFNsb3RzLiRrZXkhPT1hLiRrZXkpLHU9ISEob3x8dC4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fGMpO3QuJG9wdGlvbnMuX3BhcmVudFZub2RlPWksdC4kdm5vZGU9aSx0Ll92bm9kZSYmKHQuX3Zub2RlLnBhcmVudD1pKTtpZih0LiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1vLHQuJGF0dHJzPWkuZGF0YS5hdHRyc3x8ZSx0LiRsaXN0ZW5lcnM9cnx8ZSxuJiZ0LiRvcHRpb25zLnByb3BzKXskZSghMSk7Zm9yKHZhciBsPXQuX3Byb3BzLGY9dC4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLHA9MDtwPGYubGVuZ3RoO3ArKyl7dmFyIGQ9ZltwXSx2PXQuJG9wdGlvbnMucHJvcHM7bFtkXT1NZShkLHYsbix0KX0kZSghMCksdC4kb3B0aW9ucy5wcm9wc0RhdGE9bn1yPXJ8fGU7dmFyIGg9dC4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1yLHF0KHQscixoKSx1JiYodC4kc2xvdHM9dXQobyxpLmNvbnRleHQpLHQuJGZvcmNlVXBkYXRlKCkpfShuLmNvbXBvbmVudEluc3RhbmNlPXQuY29tcG9uZW50SW5zdGFuY2Usci5wcm9wc0RhdGEsci5saXN0ZW5lcnMsbixyLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsWXQociwibW91bnRlZCIpKSxlLmRhdGEua2VlcEFsaXZlJiYobi5faXNNb3VudGVkPygodD1yKS5faW5hY3RpdmU9ITEsZW4ucHVzaCh0KSk6WHQociwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP2Z1bmN0aW9uIGUodCxuKXtpZihuJiYodC5fZGlyZWN0SW5hY3RpdmU9ITAsR3QodCkpKXJldHVybjtpZighdC5faW5hY3RpdmUpe3QuX2luYWN0aXZlPSEwO2Zvcih2YXIgcj0wO3I8dC4kY2hpbGRyZW4ubGVuZ3RoO3IrKyllKHQuJGNoaWxkcmVuW3JdKTtZdCh0LCJkZWFjdGl2YXRlZCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LER0PU9iamVjdC5rZXlzKGp0KTtmdW5jdGlvbiBMdChpLGEscyxjLGwpe2lmKCF0KGkpKXt2YXIgZj1zLiRvcHRpb25zLl9iYXNlO2lmKG8oaSkmJihpPWYuZXh0ZW5kKGkpKSwiZnVuY3Rpb24iPT10eXBlb2YgaSl7dmFyIHA7aWYodChpLmNpZCkmJnZvaWQgMD09PShpPWZ1bmN0aW9uKGUsaSl7aWYocihlLmVycm9yKSYmbihlLmVycm9yQ29tcCkpcmV0dXJuIGUuZXJyb3JDb21wO2lmKG4oZS5yZXNvbHZlZCkpcmV0dXJuIGUucmVzb2x2ZWQ7dmFyIGE9SHQ7YSYmbihlLm93bmVycykmJi0xPT09ZS5vd25lcnMuaW5kZXhPZihhKSYmZS5vd25lcnMucHVzaChhKTtpZihyKGUubG9hZGluZykmJm4oZS5sb2FkaW5nQ29tcCkpcmV0dXJuIGUubG9hZGluZ0NvbXA7aWYoYSYmIW4oZS5vd25lcnMpKXt2YXIgcz1lLm93bmVycz1bYV0sYz0hMCxsPW51bGwsZj1udWxsO2EuJG9uKCJob29rOmRlc3Ryb3llZCIsZnVuY3Rpb24oKXtyZXR1cm4gaChzLGEpfSk7dmFyIHA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1zLmxlbmd0aDt0PG47dCsrKXNbdF0uJGZvcmNlVXBkYXRlKCk7ZSYmKHMubGVuZ3RoPTAsbnVsbCE9PWwmJihjbGVhclRpbWVvdXQobCksbD1udWxsKSxudWxsIT09ZiYmKGNsZWFyVGltZW91dChmKSxmPW51bGwpKX0sZD1EKGZ1bmN0aW9uKHQpe2UucmVzb2x2ZWQ9QnQodCxpKSxjP3MubGVuZ3RoPTA6cCghMCl9KSx2PUQoZnVuY3Rpb24odCl7bihlLmVycm9yQ29tcCkmJihlLmVycm9yPSEwLHAoITApKX0pLG09ZShkLHYpO3JldHVybiBvKG0pJiYodShtKT90KGUucmVzb2x2ZWQpJiZtLnRoZW4oZCx2KTp1KG0uY29tcG9uZW50KSYmKG0uY29tcG9uZW50LnRoZW4oZCx2KSxuKG0uZXJyb3IpJiYoZS5lcnJvckNvbXA9QnQobS5lcnJvcixpKSksbihtLmxvYWRpbmcpJiYoZS5sb2FkaW5nQ29tcD1CdChtLmxvYWRpbmcsaSksMD09PW0uZGVsYXk/ZS5sb2FkaW5nPSEwOmw9c2V0VGltZW91dChmdW5jdGlvbigpe2w9bnVsbCx0KGUucmVzb2x2ZWQpJiZ0KGUuZXJyb3IpJiYoZS5sb2FkaW5nPSEwLHAoITEpKX0sbS5kZWxheXx8MjAwKSksbihtLnRpbWVvdXQpJiYoZj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zj1udWxsLHQoZS5yZXNvbHZlZCkmJnYobnVsbCl9LG0udGltZW91dCkpKSksYz0hMSxlLmxvYWRpbmc/ZS5sb2FkaW5nQ29tcDplLnJlc29sdmVkfX0ocD1pLGYpKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz12ZSgpO3JldHVybiBvLmFzeW5jRmFjdG9yeT1lLG8uYXN5bmNNZXRhPXtkYXRhOnQsY29udGV4dDpuLGNoaWxkcmVuOnIsdGFnOml9LG99KHAsYSxzLGMsbCk7YT1hfHx7fSwkbihpKSxuKGEubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciByPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixpPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbcl09dC5tb2RlbC52YWx1ZTt2YXIgbz10Lm9ufHwodC5vbj17fSksYT1vW2ldLHM9dC5tb2RlbC5jYWxsYmFjaztuKGEpPyhBcnJheS5pc0FycmF5KGEpPy0xPT09YS5pbmRleE9mKHMpOmEhPT1zKSYmKG9baV09W3NdLmNvbmNhdChhKSk6b1tpXT1zfShpLm9wdGlvbnMsYSk7dmFyIGQ9ZnVuY3Rpb24oZSxyLGkpe3ZhciBvPXIub3B0aW9ucy5wcm9wcztpZighdChvKSl7dmFyIGE9e30scz1lLmF0dHJzLGM9ZS5wcm9wcztpZihuKHMpfHxuKGMpKWZvcih2YXIgdSBpbiBvKXt2YXIgbD1DKHUpO290KGEsYyx1LGwsITApfHxvdChhLHMsdSxsLCExKX1yZXR1cm4gYX19KGEsaSk7aWYocihpLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKHQscixpLG8sYSl7dmFyIHM9dC5vcHRpb25zLGM9e30sdT1zLnByb3BzO2lmKG4odSkpZm9yKHZhciBsIGluIHUpY1tsXT1NZShsLHUscnx8ZSk7ZWxzZSBuKGkuYXR0cnMpJiZOdChjLGkuYXR0cnMpLG4oaS5wcm9wcykmJk50KGMsaS5wcm9wcyk7dmFyIGY9bmV3IFR0KGksYyxhLG8sdCkscD1zLnJlbmRlci5jYWxsKG51bGwsZi5fYyxmKTtpZihwIGluc3RhbmNlb2YgcGUpcmV0dXJuIEV0KHAsaSxmLnBhcmVudCxzKTtpZihBcnJheS5pc0FycmF5KHApKXtmb3IodmFyIGQ9YXQocCl8fFtdLHY9bmV3IEFycmF5KGQubGVuZ3RoKSxoPTA7aDxkLmxlbmd0aDtoKyspdltoXT1FdChkW2hdLGksZi5wYXJlbnQscyk7cmV0dXJuIHZ9fShpLGQsYSxzLGMpO3ZhciB2PWEub247aWYoYS5vbj1hLm5hdGl2ZU9uLHIoaS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIG09YS5zbG90O2E9e30sbSYmKGEuc2xvdD1tKX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248RHQubGVuZ3RoO24rKyl7dmFyIHI9RHRbbl0saT10W3JdLG89anRbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9NdChvLGkpOm8pfX0oYSk7dmFyIHk9aS5vcHRpb25zLm5hbWV8fGw7cmV0dXJuIG5ldyBwZSgidnVlLWNvbXBvbmVudC0iK2kuY2lkKyh5PyItIit5OiIiKSxhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHMse0N0b3I6aSxwcm9wc0RhdGE6ZCxsaXN0ZW5lcnM6dix0YWc6bCxjaGlsZHJlbjpjfSxwKX19fWZ1bmN0aW9uIE10KGUsdCl7dmFyIG49ZnVuY3Rpb24obixyKXtlKG4sciksdChuLHIpfTtyZXR1cm4gbi5fbWVyZ2VkPSEwLG59dmFyIEl0PTEsRnQ9MjtmdW5jdGlvbiBQdChlLGEscyxjLHUsbCl7cmV0dXJuKEFycmF5LmlzQXJyYXkocyl8fGkocykpJiYodT1jLGM9cyxzPXZvaWQgMCkscihsKSYmKHU9RnQpLGZ1bmN0aW9uKGUsaSxhLHMsYyl7aWYobihhKSYmbihhLl9fb2JfXykpcmV0dXJuIHZlKCk7bihhKSYmbihhLmlzKSYmKGk9YS5pcyk7aWYoIWkpcmV0dXJuIHZlKCk7QXJyYXkuaXNBcnJheShzKSYmImZ1bmN0aW9uIj09dHlwZW9mIHNbMF0mJigoYT1hfHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6c1swXX0scy5sZW5ndGg9MCk7Yz09PUZ0P3M9YXQocyk6Yz09PUl0JiYocz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShzKSk7dmFyIHUsbDtpZigic3RyaW5nIj09dHlwZW9mIGkpe3ZhciBmO2w9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxGLmdldFRhZ05hbWVzcGFjZShpKSx1PUYuaXNSZXNlcnZlZFRhZyhpKT9uZXcgcGUoRi5wYXJzZVBsYXRmb3JtVGFnTmFtZShpKSxhLHMsdm9pZCAwLHZvaWQgMCxlKTphJiZhLnByZXx8IW4oZj1MZShlLiRvcHRpb25zLCJjb21wb25lbnRzIixpKSk/bmV3IHBlKGksYSxzLHZvaWQgMCx2b2lkIDAsZSk6THQoZixhLGUscyxpKX1lbHNlIHU9THQoaSxhLGUscyk7cmV0dXJuIEFycmF5LmlzQXJyYXkodSk/dTpuKHUpPyhuKGwpJiZmdW5jdGlvbiBlKGksbyxhKXtpLm5zPW87ImZvcmVpZ25PYmplY3QiPT09aS50YWcmJihvPXZvaWQgMCxhPSEwKTtpZihuKGkuY2hpbGRyZW4pKWZvcih2YXIgcz0wLGM9aS5jaGlsZHJlbi5sZW5ndGg7czxjO3MrKyl7dmFyIHU9aS5jaGlsZHJlbltzXTtuKHUudGFnKSYmKHQodS5ucyl8fHIoYSkmJiJzdmciIT09dS50YWcpJiZlKHUsbyxhKX19KHUsbCksbihhKSYmZnVuY3Rpb24oZSl7byhlLnN0eWxlKSYmZXQoZS5zdHlsZSk7byhlLmNsYXNzKSYmZXQoZS5jbGFzcyl9KGEpLHUpOnZlKCl9KGUsYSxzLGMsdSl9dmFyIFJ0LEh0PW51bGw7ZnVuY3Rpb24gQnQoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxvZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLG8oZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBVdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIHp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF07aWYobihyKSYmKG4oci5jb21wb25lbnRPcHRpb25zKXx8VXQocikpKXJldHVybiByfX1mdW5jdGlvbiBWdChlLHQpe1J0LiRvbihlLHQpfWZ1bmN0aW9uIEt0KGUsdCl7UnQuJG9mZihlLHQpfWZ1bmN0aW9uIEp0KGUsdCl7dmFyIG49UnQ7cmV0dXJuIGZ1bmN0aW9uIHIoKXtudWxsIT09dC5hcHBseShudWxsLGFyZ3VtZW50cykmJm4uJG9mZihlLHIpfX1mdW5jdGlvbiBxdChlLHQsbil7UnQ9ZSxydCh0LG58fHt9LFZ0LEt0LEp0LGUpLFJ0PXZvaWQgMH12YXIgV3Q9bnVsbDtmdW5jdGlvbiBadChlKXt2YXIgdD1XdDtyZXR1cm4gV3Q9ZSxmdW5jdGlvbigpe1d0PXR9fWZ1bmN0aW9uIEd0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWHQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxHdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVh0KGUuJGNoaWxkcmVuW25dKTtZdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gWXQoZSx0KXtsZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspSGUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxmZSgpfXZhciBRdD1bXSxlbj1bXSx0bj17fSxubj0hMSxybj0hMSxvbj0wO3ZhciBhbj0wLHNuPURhdGUubm93O2lmKHomJiFxKXt2YXIgY249d2luZG93LnBlcmZvcm1hbmNlO2NuJiYiZnVuY3Rpb24iPT10eXBlb2YgY24ubm93JiZzbigpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHNuPWZ1bmN0aW9uKCl7cmV0dXJuIGNuLm5vdygpfSl9ZnVuY3Rpb24gdW4oKXt2YXIgZSx0O2Zvcihhbj1zbigpLHJuPSEwLFF0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksb249MDtvbjxRdC5sZW5ndGg7b24rKykoZT1RdFtvbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdG5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWVuLnNsaWNlKCkscj1RdC5zbGljZSgpO29uPVF0Lmxlbmd0aD1lbi5sZW5ndGg9MCx0bj17fSxubj1ybj0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxYdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJll0KHIsInVwZGF0ZWQiKX19KHIpLG5lJiZGLmRldnRvb2xzJiZuZS5lbWl0KCJmbHVzaCIpfXZhciBsbj0wLGZuPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytsbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBpZSx0aGlzLm5ld0RlcElkcz1uZXcgaWUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFILnRlc3QoZSkpe3ZhciB0PWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2lmKCFlKXJldHVybjtlPWVbdFtuXV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1TKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O2ZuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtsZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7UmUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJmV0KGUpLGZlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxmbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxmbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LGZuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXRuW3RdKXtpZih0blt0XT0hMCxybil7Zm9yKHZhciBuPVF0Lmxlbmd0aC0xO24+b24mJlF0W25dLmlkPmUuaWQ7KW4tLTtRdC5zcGxpY2UobisxLDAsZSl9ZWxzZSBRdC5wdXNoKGUpO25ufHwobm49ITAsWWUodW4pKX19KHRoaXMpfSxmbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fG8oZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe1JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LGZuLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxmbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LGZuLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxoKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciBwbj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OlMsc2V0OlN9O2Z1bmN0aW9uIGRuKGUsdCxuKXtwbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0scG4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixwbil9ZnVuY3Rpb24gdm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxyPWUuX3Byb3BzPXt9LGk9ZS4kb3B0aW9ucy5fcHJvcEtleXM9W107ZS4kcGFyZW50JiYkZSghMSk7dmFyIG89ZnVuY3Rpb24obyl7aS5wdXNoKG8pO3ZhciBhPU1lKG8sdCxuLGUpO3hlKHIsbyxhKSxvIGluIGV8fGRuKGUsIl9wcm9wcyIsbyl9O2Zvcih2YXIgYSBpbiB0KW8oYSk7JGUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/Uzp4KHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO3ModD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCl7bGUoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBSZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7ZmUoKX19KHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJnkocixvKXx8KGE9dm9pZCAwLDM2IT09KGE9KG8rIiIpLmNoYXJDb2RlQXQoMCkpJiY5NSE9PWEmJmRuKGUsIl9kYXRhIixvKSl9dmFyIGE7Q2UodCwhMCl9KGUpOkNlKGUuX2RhdGE9e30sITApLHQuY29tcHV0ZWQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fY29tcHV0ZWRXYXRjaGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGUoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IGZuKGUsYXx8UyxTLGhuKSksaSBpbiBlfHxtbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1ZJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspX24oZSxuLHJbaV0pO2Vsc2UgX24oZSxuLHIpfX0oZSx0LndhdGNoKX12YXIgaG49e2xhenk6ITB9O2Z1bmN0aW9uIG1uKGUsdCxuKXt2YXIgcj0hdGUoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8ocG4uZ2V0PXI/eW4odCk6Z24obikscG4uc2V0PVMpOihwbi5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3luKHQpOmduKG4uZ2V0KTpTLHBuLnNldD1uLnNldHx8UyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxwbil9ZnVuY3Rpb24geW4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1tlXTtpZih0KXJldHVybiB0LmRpcnR5JiZ0LmV2YWx1YXRlKCksY2UudGFyZ2V0JiZ0LmRlcGVuZCgpLHQudmFsdWV9fWZ1bmN0aW9uIGduKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gX24oZSx0LG4scil7cmV0dXJuIHMobikmJihyPW4sbj1uLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBibj0wO2Z1bmN0aW9uICRuKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj0kbihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmQShlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPURlKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIENuKGUpe2UuY2lkPTA7dmFyIHQ9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciBuPXRoaXMscj1uLmNpZCxpPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihpW3JdKXJldHVybiBpW3JdO3ZhciBvPWUubmFtZXx8bi5vcHRpb25zLm5hbWUsYT1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWEsYS5jaWQ9dCsrLGEub3B0aW9ucz1EZShuLm9wdGlvbnMsZSksYS5zdXBlcj1uLGEub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWRuKGUucHJvdG90eXBlLCJfcHJvcHMiLG4pfShhKSxhLm9wdGlvbnMuY29tcHV0ZWQmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5jb21wdXRlZDtmb3IodmFyIG4gaW4gdCltbihlLnByb3RvdHlwZSxuLHRbbl0pfShhKSxhLmV4dGVuZD1uLmV4dGVuZCxhLm1peGluPW4ubWl4aW4sYS51c2U9bi51c2UsTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2FbZV09bltlXX0pLG8mJihhLm9wdGlvbnMuY29tcG9uZW50c1tvXT1hKSxhLnN1cGVyT3B0aW9ucz1uLm9wdGlvbnMsYS5leHRlbmRPcHRpb25zPWUsYS5zZWFsZWRPcHRpb25zPUEoe30sYS5vcHRpb25zKSxpW3JdPWEsYX19ZnVuY3Rpb24geG4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24ga24oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmluZGV4T2YodCk+LTE6InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiwiKS5pbmRleE9mKHQpPi0xOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1hLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gQW4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9eG4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmT24obixvLHIsaSl9fX1mdW5jdGlvbiBPbihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGgobix0KX0hZnVuY3Rpb24odCl7dC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztuLl91aWQ9Ym4rKyxuLl9pc1Z1ZT0hMCx0JiZ0Ll9pc0NvbXBvbmVudD9mdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnM9T2JqZWN0LmNyZWF0ZShlLmNvbnN0cnVjdG9yLm9wdGlvbnMpLHI9dC5fcGFyZW50Vm5vZGU7bi5wYXJlbnQ9dC5wYXJlbnQsbi5fcGFyZW50Vm5vZGU9cjt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfShuLHQpOm4uJG9wdGlvbnM9RGUoJG4obi5jb25zdHJ1Y3RvciksdHx8e30sbiksbi5fcmVuZGVyUHJveHk9bixuLl9zZWxmPW4sZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9KG4pLGZ1bmN0aW9uKGUpe2UuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLGUuX2hhc0hvb2tFdmVudD0hMTt2YXIgdD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dCYmcXQoZSx0KX0obiksZnVuY3Rpb24odCl7dC5fdm5vZGU9bnVsbCx0Ll9zdGF0aWNUcmVlcz1udWxsO3ZhciBuPXQuJG9wdGlvbnMscj10LiR2bm9kZT1uLl9wYXJlbnRWbm9kZSxpPXImJnIuY29udGV4dDt0LiRzbG90cz11dChuLl9yZW5kZXJDaGlsZHJlbixpKSx0LiRzY29wZWRTbG90cz1lLHQuX2M9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIFB0KHQsZSxuLHIsaSwhMSl9LHQuJGNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIFB0KHQsZSxuLHIsaSwhMCl9O3ZhciBvPXImJnIuZGF0YTt4ZSh0LCIkYXR0cnMiLG8mJm8uYXR0cnN8fGUsbnVsbCwhMCkseGUodCwiJGxpc3RlbmVycyIsbi5fcGFyZW50TGlzdGVuZXJzfHxlLG51bGwsITApfShuKSxZdChuLCJiZWZvcmVDcmVhdGUiKSxmdW5jdGlvbihlKXt2YXIgdD1jdChlLiRvcHRpb25zLmluamVjdCxlKTt0JiYoJGUoITEpLE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7eGUoZSxuLHRbbl0pfSksJGUoITApKX0obiksdm4obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5wcm92aWRlO3QmJihlLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgdD90LmNhbGwoZSk6dCl9KG4pLFl0KG4sImNyZWF0ZWQiKSxuLiRvcHRpb25zLmVsJiZuLiRtb3VudChuLiRvcHRpb25zLmVsKX19KHduKSxmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSxuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIiRkYXRhIix0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIiRwcm9wcyIsbiksZS5wcm90b3R5cGUuJHNldD1rZSxlLnByb3RvdHlwZS4kZGVsZXRlPUFlLGUucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7aWYocyh0KSlyZXR1cm4gX24odGhpcyxlLHQsbik7KG49bnx8e30pLnVzZXI9ITA7dmFyIHI9bmV3IGZuKHRoaXMsZSx0LG4pO2lmKG4uaW1tZWRpYXRlKXRyeXt0LmNhbGwodGhpcyxyLnZhbHVlKX1jYXRjaChlKXtSZShlLHRoaXMsJ2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytyLmV4cHJlc3Npb24rJyInKX1yZXR1cm4gZnVuY3Rpb24oKXtyLnRlYXJkb3duKCl9fX0od24pLGZ1bmN0aW9uKGUpe3ZhciB0PS9eaG9vazovO2UucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGk9MCxvPWUubGVuZ3RoO2k8bztpKyspci4kb24oZVtpXSxuKTtlbHNlKHIuX2V2ZW50c1tlXXx8KHIuX2V2ZW50c1tlXT1bXSkpLnB1c2gobiksdC50ZXN0KGUpJiYoci5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gcn0sZS5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sZS5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG4uX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLG47aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPTAsaT1lLmxlbmd0aDtyPGk7cisrKW4uJG9mZihlW3JdLHQpO3JldHVybiBufXZhciBvLGE9bi5fZXZlbnRzW2VdO2lmKCFhKXJldHVybiBuO2lmKCF0KXJldHVybiBuLl9ldmVudHNbZV09bnVsbCxuO2Zvcih2YXIgcz1hLmxlbmd0aDtzLS07KWlmKChvPWFbc10pPT09dHx8by5mbj09PXQpe2Euc3BsaWNlKHMsMSk7YnJlYWt9cmV0dXJuIG59LGUucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PXQubGVuZ3RoPjE/ayh0KTp0O2Zvcih2YXIgbj1rKGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKUhlKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9fSh3biksZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj1uLiRlbCxpPW4uX3Zub2RlLG89WnQobik7bi5fdm5vZGU9ZSxuLiRlbD1pP24uX19wYXRjaF9fKGksZSk6bi5fX3BhdGNoX18obi4kZWwsZSx0LCExKSxvKCksciYmKHIuX192dWVfXz1udWxsKSxuLiRlbCYmKG4uJGVsLl9fdnVlX189biksbi4kdm5vZGUmJm4uJHBhcmVudCYmbi4kdm5vZGU9PT1uLiRwYXJlbnQuX3Zub2RlJiYobi4kcGFyZW50LiRlbD1uLiRlbCl9LGUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LGUucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7WXQoZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxoKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLFl0KGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19fSh3biksZnVuY3Rpb24oZSl7U3QoZS5wcm90b3R5cGUpLGUucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gWWUoZSx0aGlzKX0sZS5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcyxuPXQuJG9wdGlvbnMscj1uLnJlbmRlcixpPW4uX3BhcmVudFZub2RlO2kmJih0LiRzY29wZWRTbG90cz1mdChpLmRhdGEuc2NvcGVkU2xvdHMsdC4kc2xvdHMsdC4kc2NvcGVkU2xvdHMpKSx0LiR2bm9kZT1pO3RyeXtIdD10LGU9ci5jYWxsKHQuX3JlbmRlclByb3h5LHQuJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKG4pe1JlKG4sdCwicmVuZGVyIiksZT10Ll92bm9kZX1maW5hbGx5e0h0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJjE9PT1lLmxlbmd0aCYmKGU9ZVswXSksZSBpbnN0YW5jZW9mIHBlfHwoZT12ZSgpKSxlLnBhcmVudD1pLGV9fSh3bik7dmFyIFNuPVtTdHJpbmcsUmVnRXhwLEFycmF5XSxUbj17S2VlcEFsaXZlOntuYW1lOiJrZWVwLWFsaXZlIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTpTbixleGNsdWRlOlNuLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSlPbih0aGlzLmNhY2hlLGUsdGhpcy5rZXlzKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kd2F0Y2goImluY2x1ZGUiLGZ1bmN0aW9uKHQpe0FuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGtuKHQsZSl9KX0pLHRoaXMuJHdhdGNoKCJleGNsdWRlIixmdW5jdGlvbih0KXtBbihlLGZ1bmN0aW9uKGUpe3JldHVybiFrbih0LGUpfSl9KX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PXp0KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPXhuKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IWtuKGkscikpfHxvJiZyJiZrbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsaChzLGMpLHMucHVzaChjKSk6KGFbY109dCxzLnB1c2goYyksdGhpcy5tYXgmJnMubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmT24oYSxzWzBdLHMsdGhpcy5fdm5vZGUpKSx0LmRhdGEua2VlcEFsaXZlPSEwfXJldHVybiB0fHxlJiZlWzBdfX19OyFmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEZ9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY29uZmlnIix0KSxlLnV0aWw9e3dhcm46YWUsZXh0ZW5kOkEsbWVyZ2VPcHRpb25zOkRlLGRlZmluZVJlYWN0aXZlOnhlfSxlLnNldD1rZSxlLmRlbGV0ZT1BZSxlLm5leHRUaWNrPVllLGUub2JzZXJ2YWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gQ2UoZSksZX0sZS5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksTS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Uub3B0aW9uc1t0KyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLGUub3B0aW9ucy5fYmFzZT1lLEEoZS5vcHRpb25zLmNvbXBvbmVudHMsVG4pLGZ1bmN0aW9uKGUpe2UudXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZih0LmluZGV4T2YoZSk+LTEpcmV0dXJuIHRoaXM7dmFyIG49ayhhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9fShlKSxmdW5jdGlvbihlKXtlLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9RGUodGhpcy5vcHRpb25zLGUpLHRoaXN9fShlKSxDbihlKSxmdW5jdGlvbihlKXtNLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBuPygiY29tcG9uZW50Ij09PXQmJnMobikmJihuLm5hbWU9bi5uYW1lfHxlLG49dGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZChuKSksImRpcmVjdGl2ZSI9PT10JiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49e2JpbmQ6bix1cGRhdGU6bn0pLHRoaXMub3B0aW9uc1t0KyJzIl1bZV09bixuKTp0aGlzLm9wdGlvbnNbdCsicyJdW2VdfX0pfShlKX0od24pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDp0ZX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bi5wcm90b3R5cGUsIiRzc3JDb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3biwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLHt2YWx1ZTpUdH0pLHduLnZlcnNpb249IjIuNi4xMiI7dmFyIEVuPXAoInN0eWxlLGNsYXNzIiksTm49cCgiaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcyIpLGpuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4idmFsdWUiPT09biYmTm4oZSkmJiJidXR0b24iIT09dHx8InNlbGVjdGVkIj09PW4mJiJvcHRpb24iPT09ZXx8ImNoZWNrZWQiPT09biYmImlucHV0Ij09PWV8fCJtdXRlZCI9PT1uJiYidmlkZW8iPT09ZX0sRG49cCgiY29udGVudGVkaXRhYmxlLGRyYWdnYWJsZSxzcGVsbGNoZWNrIiksTG49cCgiZXZlbnRzLGNhcmV0LHR5cGluZyxwbGFpbnRleHQtb25seSIpLE1uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEhuKHQpfHwiZmFsc2UiPT09dD8iZmFsc2UiOiJjb250ZW50ZWRpdGFibGUiPT09ZSYmTG4odCk/dDoidHJ1ZSJ9LEluPXAoImFsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLGVuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSxyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLHRydWVzcGVlZCx0eXBlbXVzdG1hdGNoLHZpc2libGUiKSxGbj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsUG49ZnVuY3Rpb24oZSl7cmV0dXJuIjoiPT09ZS5jaGFyQXQoNSkmJiJ4bGluayI9PT1lLnNsaWNlKDAsNSl9LFJuPWZ1bmN0aW9uKGUpe3JldHVybiBQbihlKT9lLnNsaWNlKDYsZS5sZW5ndGgpOiIifSxIbj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZXx8ITE9PT1lfTtmdW5jdGlvbiBCbihlKXtmb3IodmFyIHQ9ZS5kYXRhLHI9ZSxpPWU7bihpLmNvbXBvbmVudEluc3RhbmNlKTspKGk9aS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZpLmRhdGEmJih0PVVuKGkuZGF0YSx0KSk7Zm9yKDtuKHI9ci5wYXJlbnQpOylyJiZyLmRhdGEmJih0PVVuKHQsci5kYXRhKSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobihlKXx8bih0KSlyZXR1cm4gem4oZSxWbih0KSk7cmV0dXJuIiJ9KHQuc3RhdGljQ2xhc3MsdC5jbGFzcyl9ZnVuY3Rpb24gVW4oZSx0KXtyZXR1cm57c3RhdGljQ2xhc3M6em4oZS5zdGF0aWNDbGFzcyx0LnN0YXRpY0NsYXNzKSxjbGFzczpuKGUuY2xhc3MpP1tlLmNsYXNzLHQuY2xhc3NdOnQuY2xhc3N9fWZ1bmN0aW9uIHpuKGUsdCl7cmV0dXJuIGU/dD9lKyIgIit0OmU6dHx8IiJ9ZnVuY3Rpb24gVm4oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9IiIsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyluKHQ9Vm4oZVtpXSkpJiYiIiE9PXQmJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn0oZSk6byhlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifXZhciBLbj17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsbWF0aDoiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCJ9LEpuPXAoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IikscW49cCgic3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLGZvcmVpZ25PYmplY3QsZyxnbHlwaCxpbWFnZSxsaW5lLG1hcmtlcixtYXNrLG1pc3NpbmctZ2x5cGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXciLCEwKSxXbj1mdW5jdGlvbihlKXtyZXR1cm4gSm4oZSl8fHFuKGUpfTtmdW5jdGlvbiBabihlKXtyZXR1cm4gcW4oZSk/InN2ZyI6Im1hdGgiPT09ZT8ibWF0aCI6dm9pZCAwfXZhciBHbj1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBYbj1wKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpO2Z1bmN0aW9uIFluKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKTtyZXR1cm4gdHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9cmV0dXJuIGV9dmFyIFFuPU9iamVjdC5mcmVlemUoe2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiJzZWxlY3QiIT09ZT9uOih0LmRhdGEmJnQuZGF0YS5hdHRycyYmdm9pZCAwIT09dC5kYXRhLmF0dHJzLm11bHRpcGxlJiZuLnNldEF0dHJpYnV0ZSgibXVsdGlwbGUiLCJtdWx0aXBsZSIpLG4pfSxjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKEtuW2VdLHQpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSl9LGNyZWF0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnTmFtZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnRleHRDb250ZW50PXR9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZSh0LCIiKX19KSxlcj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7dHIodCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYodHIoZSwhMCksdHIodCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3RyKGUsITApfX07ZnVuY3Rpb24gdHIoZSx0KXt2YXIgcj1lLmRhdGEucmVmO2lmKG4ocikpe3ZhciBpPWUuY29udGV4dCxvPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLGE9aS4kcmVmczt0P0FycmF5LmlzQXJyYXkoYVtyXSk/aChhW3JdLG8pOmFbcl09PT1vJiYoYVtyXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KGFbcl0pP2Fbcl0uaW5kZXhPZihvKTwwJiZhW3JdLnB1c2gobyk6YVtyXT1bb106YVtyXT1vfX12YXIgbnI9bmV3IHBlKCIiLHt9LFtdKSxycj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIGlyKGUsaSl7cmV0dXJuIGUua2V5PT09aS5rZXkmJihlLnRhZz09PWkudGFnJiZlLmlzQ29tbWVudD09PWkuaXNDb21tZW50JiZuKGUuZGF0YSk9PT1uKGkuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciByLGk9bihyPWUuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlLG89bihyPXQuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlO3JldHVybiBpPT09b3x8WG4oaSkmJlhuKG8pfShlLGkpfHxyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT1pLmFzeW5jRmFjdG9yeSYmdChpLmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIG9yKGUsdCxyKXt2YXIgaSxvLGE9e307Zm9yKGk9dDtpPD1yOysraSluKG89ZVtpXS5rZXkpJiYoYVtvXT1pKTtyZXR1cm4gYX12YXIgYXI9e2NyZWF0ZTpzcix1cGRhdGU6c3IsZGVzdHJveTpmdW5jdGlvbihlKXtzcihlLG5yKX19O2Z1bmN0aW9uIHNyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG89ZT09PW5yLGE9dD09PW5yLHM9dXIoZS5kYXRhLmRpcmVjdGl2ZXMsZS5jb250ZXh0KSxjPXVyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksdT1bXSxsPVtdO2ZvcihuIGluIGMpcj1zW25dLGk9Y1tuXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsZnIoaSwidXBkYXRlIix0LGUpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOihmcihpLCJiaW5kIix0LGUpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGY9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPHUubGVuZ3RoO24rKylmcih1W25dLCJpbnNlcnRlZCIsdCxlKX07bz9pdCh0LCJpbnNlcnQiLGYpOmYoKX1sLmxlbmd0aCYmaXQodCwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgbj0wO248bC5sZW5ndGg7bisrKWZyKGxbbl0sImNvbXBvbmVudFVwZGF0ZWQiLHQsZSl9KTtpZighbylmb3IobiBpbiBzKWNbbl18fGZyKHNbbl0sInVuYmluZCIsZSxlLGEpfShlLHQpfXZhciBjcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHVyKGUsdCl7dmFyIG4scixpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIGk7Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1jciksaVtscihyKV09cixyLmRlZj1MZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBpfWZ1bmN0aW9uIGxyKGUpe3JldHVybiBlLnJhd05hbWV8fGUubmFtZSsiLiIrT2JqZWN0LmtleXMoZS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIil9ZnVuY3Rpb24gZnIoZSx0LG4scixpKXt2YXIgbz1lLmRlZiYmZS5kZWZbdF07aWYobyl0cnl7byhuLmVsbSxlLG4scixpKX1jYXRjaChyKXtSZShyLG4uY29udGV4dCwiZGlyZWN0aXZlICIrZS5uYW1lKyIgIit0KyIgaG9vayIpfX12YXIgcHI9W2VyLGFyXTtmdW5jdGlvbiBkcihlLHIpe3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztpZighKG4oaSkmJiExPT09aS5DdG9yLm9wdGlvbnMuaW5oZXJpdEF0dHJzfHx0KGUuZGF0YS5hdHRycykmJnQoci5kYXRhLmF0dHJzKSkpe3ZhciBvLGEscz1yLmVsbSxjPWUuZGF0YS5hdHRyc3x8e30sdT1yLmRhdGEuYXR0cnN8fHt9O2ZvcihvIGluIG4odS5fX29iX18pJiYodT1yLmRhdGEuYXR0cnM9QSh7fSx1KSksdSlhPXVbb10sY1tvXSE9PWEmJnZyKHMsbyxhKTtmb3IobyBpbihxfHxaKSYmdS52YWx1ZSE9PWMudmFsdWUmJnZyKHMsInZhbHVlIix1LnZhbHVlKSxjKXQodVtvXSkmJihQbihvKT9zLnJlbW92ZUF0dHJpYnV0ZU5TKEZuLFJuKG8pKTpEbihvKXx8cy5yZW1vdmVBdHRyaWJ1dGUobykpfX1mdW5jdGlvbiB2cihlLHQsbil7ZS50YWdOYW1lLmluZGV4T2YoIi0iKT4tMT9ocihlLHQsbik6SW4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG49ImFsbG93ZnVsbHNjcmVlbiI9PT10JiYiRU1CRUQiPT09ZS50YWdOYW1lPyJ0cnVlIjp0LGUuc2V0QXR0cmlidXRlKHQsbikpOkRuKHQpP2Uuc2V0QXR0cmlidXRlKHQsTW4odCxuKSk6UG4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGVOUyhGbixSbih0KSk6ZS5zZXRBdHRyaWJ1dGVOUyhGbix0LG4pOmhyKGUsdCxuKX1mdW5jdGlvbiBocihlLHQsbil7aWYoSG4obikpZS5yZW1vdmVBdHRyaWJ1dGUodCk7ZWxzZXtpZihxJiYhVyYmIlRFWFRBUkVBIj09PWUudGFnTmFtZSYmInBsYWNlaG9sZGVyIj09PXQmJiIiIT09biYmIWUuX19pZXBoKXt2YXIgcj1mdW5jdGlvbih0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpfTtlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixyKSxlLl9faWVwaD0hMH1lLnNldEF0dHJpYnV0ZSh0LG4pfX12YXIgbXI9e2NyZWF0ZTpkcix1cGRhdGU6ZHJ9O2Z1bmN0aW9uIHlyKGUscil7dmFyIGk9ci5lbG0sbz1yLmRhdGEsYT1lLmRhdGE7aWYoISh0KG8uc3RhdGljQ2xhc3MpJiZ0KG8uY2xhc3MpJiYodChhKXx8dChhLnN0YXRpY0NsYXNzKSYmdChhLmNsYXNzKSkpKXt2YXIgcz1CbihyKSxjPWkuX3RyYW5zaXRpb25DbGFzc2VzO24oYykmJihzPXpuKHMsVm4oYykpKSxzIT09aS5fcHJldkNsYXNzJiYoaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKSxpLl9wcmV2Q2xhc3M9cyl9fXZhciBncixfcixiciwkcix3cixDcix4cj17Y3JlYXRlOnlyLHVwZGF0ZTp5cn0sa3I9L1tcdykuK1wtXyRcXV0vO2Z1bmN0aW9uIEFyKGUpe3ZhciB0LG4scixpLG8sYT0hMSxzPSExLGM9ITEsdT0hMSxsPTAsZj0wLHA9MCxkPTA7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylpZihuPXQsdD1lLmNoYXJDb2RlQXQociksYSkzOT09PXQmJjkyIT09biYmKGE9ITEpO2Vsc2UgaWYocykzND09PXQmJjkyIT09biYmKHM9ITEpO2Vsc2UgaWYoYyk5Nj09PXQmJjkyIT09biYmKGM9ITEpO2Vsc2UgaWYodSk0Nz09PXQmJjkyIT09biYmKHU9ITEpO2Vsc2UgaWYoMTI0IT09dHx8MTI0PT09ZS5jaGFyQ29kZUF0KHIrMSl8fDEyND09PWUuY2hhckNvZGVBdChyLTEpfHxsfHxmfHxwKXtzd2l0Y2godCl7Y2FzZSAzNDpzPSEwO2JyZWFrO2Nhc2UgMzk6YT0hMDticmVhaztjYXNlIDk2OmM9ITA7YnJlYWs7Y2FzZSA0MDpwKys7YnJlYWs7Y2FzZSA0MTpwLS07YnJlYWs7Y2FzZSA5MTpmKys7YnJlYWs7Y2FzZSA5MzpmLS07YnJlYWs7Y2FzZSAxMjM6bCsrO2JyZWFrO2Nhc2UgMTI1OmwtLX1pZig0Nz09PXQpe2Zvcih2YXIgdj1yLTEsaD12b2lkIDA7dj49MCYmIiAiPT09KGg9ZS5jaGFyQXQodikpO3YtLSk7aCYma3IudGVzdChoKXx8KHU9ITApfX1lbHNlIHZvaWQgMD09PWk/KGQ9cisxLGk9ZS5zbGljZSgwLHIpLnRyaW0oKSk6bSgpO2Z1bmN0aW9uIG0oKXsob3x8KG89W10pKS5wdXNoKGUuc2xpY2UoZCxyKS50cmltKCkpLGQ9cisxfWlmKHZvaWQgMD09PWk/aT1lLnNsaWNlKDAscikudHJpbSgpOjAhPT1kJiZtKCksbylmb3Iocj0wO3I8by5sZW5ndGg7cisrKWk9T3IoaSxvW3JdKTtyZXR1cm4gaX1mdW5jdGlvbiBPcihlLHQpe3ZhciBuPXQuaW5kZXhPZigiKCIpO2lmKG48MClyZXR1cm4nX2YoIicrdCsnIikoJytlKyIpIjt2YXIgcj10LnNsaWNlKDAsbiksaT10LnNsaWNlKG4rMSk7cmV0dXJuJ19mKCInK3IrJyIpKCcrZSsoIikiIT09aT8iLCIraTppKX1mdW5jdGlvbiBTcihlLHQpe2NvbnNvbGUuZXJyb3IoIltWdWUgY29tcGlsZXJdOiAiK2UpfWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIGU/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbdF19KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KTpbXX1mdW5jdGlvbiBFcihlLHQsbixyLGkpeyhlLnByb3BzfHwoZS5wcm9wcz1bXSkpLnB1c2goUnIoe25hbWU6dCx2YWx1ZTpuLGR5bmFtaWM6aX0scikpLGUucGxhaW49ITF9ZnVuY3Rpb24gTnIoZSx0LG4scixpKXsoaT9lLmR5bmFtaWNBdHRyc3x8KGUuZHluYW1pY0F0dHJzPVtdKTplLmF0dHJzfHwoZS5hdHRycz1bXSkpLnB1c2goUnIoe25hbWU6dCx2YWx1ZTpuLGR5bmFtaWM6aX0scikpLGUucGxhaW49ITF9ZnVuY3Rpb24ganIoZSx0LG4scil7ZS5hdHRyc01hcFt0XT1uLGUuYXR0cnNMaXN0LnB1c2goUnIoe25hbWU6dCx2YWx1ZTpufSxyKSl9ZnVuY3Rpb24gRHIoZSx0LG4scixpLG8sYSxzKXsoZS5kaXJlY3RpdmVzfHwoZS5kaXJlY3RpdmVzPVtdKSkucHVzaChScih7bmFtZTp0LHJhd05hbWU6bix2YWx1ZTpyLGFyZzppLGlzRHluYW1pY0FyZzpvLG1vZGlmaWVyczphfSxzKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBMcihlLHQsbil7cmV0dXJuIG4/Il9wKCIrdCsnLCInK2UrJyIpJzplK3R9ZnVuY3Rpb24gTXIodCxuLHIsaSxvLGEscyxjKXt2YXIgdTsoaT1pfHxlKS5yaWdodD9jP249IigiK24rIik9PT0nY2xpY2snPydjb250ZXh0bWVudSc6KCIrbisiKSI6ImNsaWNrIj09PW4mJihuPSJjb250ZXh0bWVudSIsZGVsZXRlIGkucmlnaHQpOmkubWlkZGxlJiYoYz9uPSIoIituKyIpPT09J2NsaWNrJz8nbW91c2V1cCc6KCIrbisiKSI6ImNsaWNrIj09PW4mJihuPSJtb3VzZXVwIikpLGkuY2FwdHVyZSYmKGRlbGV0ZSBpLmNhcHR1cmUsbj1McigiISIsbixjKSksaS5vbmNlJiYoZGVsZXRlIGkub25jZSxuPUxyKCJ+IixuLGMpKSxpLnBhc3NpdmUmJihkZWxldGUgaS5wYXNzaXZlLG49THIoIiYiLG4sYykpLGkubmF0aXZlPyhkZWxldGUgaS5uYXRpdmUsdT10Lm5hdGl2ZUV2ZW50c3x8KHQubmF0aXZlRXZlbnRzPXt9KSk6dT10LmV2ZW50c3x8KHQuZXZlbnRzPXt9KTt2YXIgbD1Scih7dmFsdWU6ci50cmltKCksZHluYW1pYzpjfSxzKTtpIT09ZSYmKGwubW9kaWZpZXJzPWkpO3ZhciBmPXVbbl07QXJyYXkuaXNBcnJheShmKT9vP2YudW5zaGlmdChsKTpmLnB1c2gobCk6dVtuXT1mP28/W2wsZl06W2YsbF06bCx0LnBsYWluPSExfWZ1bmN0aW9uIElyKGUsdCxuKXt2YXIgcj1GcihlLCI6Iit0KXx8RnIoZSwidi1iaW5kOiIrdCk7aWYobnVsbCE9cilyZXR1cm4gQXIocik7aWYoITEhPT1uKXt2YXIgaT1GcihlLHQpO2lmKG51bGwhPWkpcmV0dXJuIEpTT04uc3RyaW5naWZ5KGkpfX1mdW5jdGlvbiBGcihlLHQsbil7dmFyIHI7aWYobnVsbCE9KHI9ZS5hdHRyc01hcFt0XSkpZm9yKHZhciBpPWUuYXR0cnNMaXN0LG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYoaVtvXS5uYW1lPT09dCl7aS5zcGxpY2UobywxKTticmVha31yZXR1cm4gbiYmZGVsZXRlIGUuYXR0cnNNYXBbdF0scn1mdW5jdGlvbiBQcihlLHQpe2Zvcih2YXIgbj1lLmF0dHJzTGlzdCxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO2lmKHQudGVzdChvLm5hbWUpKXJldHVybiBuLnNwbGljZShyLDEpLG99fWZ1bmN0aW9uIFJyKGUsdCl7cmV0dXJuIHQmJihudWxsIT10LnN0YXJ0JiYoZS5zdGFydD10LnN0YXJ0KSxudWxsIT10LmVuZCYmKGUuZW5kPXQuZW5kKSksZX1mdW5jdGlvbiBIcihlLHQsbil7dmFyIHI9bnx8e30saT1yLm51bWJlcixvPSIkJHYiO3IudHJpbSYmKG89Iih0eXBlb2YgJCR2ID09PSAnc3RyaW5nJz8gJCR2LnRyaW0oKTogJCR2KSIpLGkmJihvPSJfbigiK28rIikiKTt2YXIgYT1Ccih0LG8pO2UubW9kZWw9e3ZhbHVlOiIoIit0KyIpIixleHByZXNzaW9uOkpTT04uc3RyaW5naWZ5KHQpLGNhbGxiYWNrOiJmdW5jdGlvbiAoJCR2KSB7IithKyJ9In19ZnVuY3Rpb24gQnIoZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtpZihlPWUudHJpbSgpLGdyPWUubGVuZ3RoLGUuaW5kZXhPZigiWyIpPDB8fGUubGFzdEluZGV4T2YoIl0iKTxnci0xKXJldHVybigkcj1lLmxhc3RJbmRleE9mKCIuIikpPi0xP3tleHA6ZS5zbGljZSgwLCRyKSxrZXk6JyInK2Uuc2xpY2UoJHIrMSkrJyInfTp7ZXhwOmUsa2V5Om51bGx9O19yPWUsJHI9d3I9Q3I9MDtmb3IoOyF6cigpOylWcihicj1VcigpKT9Kcihicik6OTE9PT1iciYmS3IoYnIpO3JldHVybntleHA6ZS5zbGljZSgwLHdyKSxrZXk6ZS5zbGljZSh3cisxLENyKX19KGUpO3JldHVybiBudWxsPT09bi5rZXk/ZSsiPSIrdDoiJHNldCgiK24uZXhwKyIsICIrbi5rZXkrIiwgIit0KyIpIn1mdW5jdGlvbiBVcigpe3JldHVybiBfci5jaGFyQ29kZUF0KCsrJHIpfWZ1bmN0aW9uIHpyKCl7cmV0dXJuICRyPj1ncn1mdW5jdGlvbiBWcihlKXtyZXR1cm4gMzQ9PT1lfHwzOT09PWV9ZnVuY3Rpb24gS3IoZSl7dmFyIHQ9MTtmb3Iod3I9JHI7IXpyKCk7KWlmKFZyKGU9VXIoKSkpSnIoZSk7ZWxzZSBpZig5MT09PWUmJnQrKyw5Mz09PWUmJnQtLSwwPT09dCl7Q3I9JHI7YnJlYWt9fWZ1bmN0aW9uIEpyKGUpe2Zvcih2YXIgdD1lOyF6cigpJiYoZT1VcigpKSE9PXQ7KTt9dmFyIHFyLFdyPSJfX3IiLFpyPSJfX2MiO2Z1bmN0aW9uIEdyKGUsdCxuKXt2YXIgcj1xcjtyZXR1cm4gZnVuY3Rpb24gaSgpe251bGwhPT10LmFwcGx5KG51bGwsYXJndW1lbnRzKSYmUXIoZSxpLG4scil9fXZhciBYcj1WZSYmIShYJiZOdW1iZXIoWFsxXSk8PTUzKTtmdW5jdGlvbiBZcihlLHQsbixyKXtpZihYcil7dmFyIGk9YW4sbz10O3Q9by5fd3JhcHBlcj1mdW5jdGlvbihlKXtpZihlLnRhcmdldD09PWUuY3VycmVudFRhcmdldHx8ZS50aW1lU3RhbXA+PWl8fGUudGltZVN0YW1wPD0wfHxlLnRhcmdldC5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQpcmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1xci5hZGRFdmVudExpc3RlbmVyKGUsdCxRP3tjYXB0dXJlOm4scGFzc2l2ZTpyfTpuKX1mdW5jdGlvbiBRcihlLHQsbixyKXsocnx8cXIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0Ll93cmFwcGVyfHx0LG4pfWZ1bmN0aW9uIGVpKGUscil7aWYoIXQoZS5kYXRhLm9uKXx8IXQoci5kYXRhLm9uKSl7dmFyIGk9ci5kYXRhLm9ufHx7fSxvPWUuZGF0YS5vbnx8e307cXI9ci5lbG0sZnVuY3Rpb24oZSl7aWYobihlW1dyXSkpe3ZhciB0PXE/ImNoYW5nZSI6ImlucHV0IjtlW3RdPVtdLmNvbmNhdChlW1dyXSxlW3RdfHxbXSksZGVsZXRlIGVbV3JdfW4oZVtacl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbWnJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbWnJdKX0oaSkscnQoaSxvLFlyLFFyLEdyLHIuY29udGV4dCkscXI9dm9pZCAwfX12YXIgdGksbmk9e2NyZWF0ZTplaSx1cGRhdGU6ZWl9O2Z1bmN0aW9uIHJpKGUscil7aWYoIXQoZS5kYXRhLmRvbVByb3BzKXx8IXQoci5kYXRhLmRvbVByb3BzKSl7dmFyIGksbyxhPXIuZWxtLHM9ZS5kYXRhLmRvbVByb3BzfHx7fSxjPXIuZGF0YS5kb21Qcm9wc3x8e307Zm9yKGkgaW4gbihjLl9fb2JfXykmJihjPXIuZGF0YS5kb21Qcm9wcz1BKHt9LGMpKSxzKWkgaW4gY3x8KGFbaV09IiIpO2ZvcihpIGluIGMpe2lmKG89Y1tpXSwidGV4dENvbnRlbnQiPT09aXx8ImlubmVySFRNTCI9PT1pKXtpZihyLmNoaWxkcmVuJiYoci5jaGlsZHJlbi5sZW5ndGg9MCksbz09PXNbaV0pY29udGludWU7MT09PWEuY2hpbGROb2Rlcy5sZW5ndGgmJmEucmVtb3ZlQ2hpbGQoYS5jaGlsZE5vZGVzWzBdKX1pZigidmFsdWUiPT09aSYmIlBST0dSRVNTIiE9PWEudGFnTmFtZSl7YS5fdmFsdWU9bzt2YXIgdT10KG8pPyIiOlN0cmluZyhvKTtpaShhLHUpJiYoYS52YWx1ZT11KX1lbHNlIGlmKCJpbm5lckhUTUwiPT09aSYmcW4oYS50YWdOYW1lKSYmdChhLmlubmVySFRNTCkpeyh0aT10aXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD0iPHN2Zz4iK28rIjwvc3ZnPiI7Zm9yKHZhciBsPXRpLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtsLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQobC5maXJzdENoaWxkKX1lbHNlIGlmKG8hPT1zW2ldKXRyeXthW2ldPW99Y2F0Y2goZSl7fX19fWZ1bmN0aW9uIGlpKGUsdCl7cmV0dXJuIWUuY29tcG9zaW5nJiYoIk9QVElPTiI9PT1lLnRhZ05hbWV8fGZ1bmN0aW9uKGUsdCl7dmFyIG49ITA7dHJ5e249ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWV9Y2F0Y2goZSl7fXJldHVybiBuJiZlLnZhbHVlIT09dH0oZSx0KXx8ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLnZhbHVlLGk9ZS5fdk1vZGlmaWVycztpZihuKGkpKXtpZihpLm51bWJlcilyZXR1cm4gZihyKSE9PWYodCk7aWYoaS50cmltKXJldHVybiByLnRyaW0oKSE9PXQudHJpbSgpfXJldHVybiByIT09dH0oZSx0KSl9dmFyIG9pPXtjcmVhdGU6cmksdXBkYXRlOnJpfSxhaT1nKGZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHI9ZS5zcGxpdChuKTtyLmxlbmd0aD4xJiYodFtyWzBdLnRyaW0oKV09clsxXS50cmltKCkpfX0pLHR9KTtmdW5jdGlvbiBzaShlKXt2YXIgdD1jaShlLnN0eWxlKTtyZXR1cm4gZS5zdGF0aWNTdHlsZT9BKGUuc3RhdGljU3R5bGUsdCk6dH1mdW5jdGlvbiBjaShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9PKGUpOiJzdHJpbmciPT10eXBlb2YgZT9haShlKTplfXZhciB1aSxsaT0vXi0tLyxmaT0vXHMqIWltcG9ydGFudCQvLHBpPWZ1bmN0aW9uKGUsdCxuKXtpZihsaS50ZXN0KHQpKWUuc3R5bGUuc2V0UHJvcGVydHkodCxuKTtlbHNlIGlmKGZpLnRlc3QobikpZS5zdHlsZS5zZXRQcm9wZXJ0eShDKHQpLG4ucmVwbGFjZShmaSwiIiksImltcG9ydGFudCIpO2Vsc2V7dmFyIHI9dmkodCk7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspZS5zdHlsZVtyXT1uW2ldO2Vsc2UgZS5zdHlsZVtyXT1ufX0sZGk9WyJXZWJraXQiLCJNb3oiLCJtcyJdLHZpPWcoZnVuY3Rpb24oZSl7aWYodWk9dWl8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJmaWx0ZXIiIT09KGU9YihlKSkmJmUgaW4gdWkpcmV0dXJuIGU7Zm9yKHZhciB0PWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPTA7bjxkaS5sZW5ndGg7bisrKXt2YXIgcj1kaVtuXSt0O2lmKHIgaW4gdWkpcmV0dXJuIHJ9fSk7ZnVuY3Rpb24gaGkoZSxyKXt2YXIgaT1yLmRhdGEsbz1lLmRhdGE7aWYoISh0KGkuc3RhdGljU3R5bGUpJiZ0KGkuc3R5bGUpJiZ0KG8uc3RhdGljU3R5bGUpJiZ0KG8uc3R5bGUpKSl7dmFyIGEscyxjPXIuZWxtLHU9by5zdGF0aWNTdHlsZSxsPW8ubm9ybWFsaXplZFN0eWxlfHxvLnN0eWxlfHx7fSxmPXV8fGwscD1jaShyLmRhdGEuc3R5bGUpfHx7fTtyLmRhdGEubm9ybWFsaXplZFN0eWxlPW4ocC5fX29iX18pP0Eoe30scCk6cDt2YXIgZD1mdW5jdGlvbihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIGk9ZTtpLmNvbXBvbmVudEluc3RhbmNlOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKG49c2koaS5kYXRhKSkmJkEocixuKTsobj1zaShlLmRhdGEpKSYmQShyLG4pO2Zvcih2YXIgbz1lO289by5wYXJlbnQ7KW8uZGF0YSYmKG49c2koby5kYXRhKSkmJkEocixuKTtyZXR1cm4gcn0ociwhMCk7Zm9yKHMgaW4gZil0KGRbc10pJiZwaShjLHMsIiIpO2ZvcihzIGluIGQpKGE9ZFtzXSkhPT1mW3NdJiZwaShjLHMsbnVsbD09YT8iIjphKX19dmFyIG1pPXtjcmVhdGU6aGksdXBkYXRlOmhpfSx5aT0vXHMrLztmdW5jdGlvbiBnaShlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoIiAiKT4tMT90LnNwbGl0KHlpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5hZGQodCl9KTplLmNsYXNzTGlzdC5hZGQodCk7ZWxzZXt2YXIgbj0iICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiO24uaW5kZXhPZigiICIrdCsiICIpPDAmJmUuc2V0QXR0cmlidXRlKCJjbGFzcyIsKG4rdCkudHJpbSgpKX19ZnVuY3Rpb24gX2koZSx0KXtpZih0JiYodD10LnRyaW0oKSkpaWYoZS5jbGFzc0xpc3QpdC5pbmRleE9mKCIgIik+LTE/dC5zcGxpdCh5aSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpLGUuY2xhc3NMaXN0Lmxlbmd0aHx8ZS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIik7ZWxzZXtmb3IodmFyIG49IiAiKyhlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpKyIgIixyPSIgIit0KyIgIjtuLmluZGV4T2Yocik+PTA7KW49bi5yZXBsYWNlKHIsIiAiKTsobj1uLnRyaW0oKSk/ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixuKTplLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKX19ZnVuY3Rpb24gYmkoZSl7aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZBKHQsJGkoZS5uYW1lfHwidiIpKSxBKHQsZSksdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/JGkoZSk6dm9pZCAwfX12YXIgJGk9ZyhmdW5jdGlvbihlKXtyZXR1cm57ZW50ZXJDbGFzczplKyItZW50ZXIiLGVudGVyVG9DbGFzczplKyItZW50ZXItdG8iLGVudGVyQWN0aXZlQ2xhc3M6ZSsiLWVudGVyLWFjdGl2ZSIsbGVhdmVDbGFzczplKyItbGVhdmUiLGxlYXZlVG9DbGFzczplKyItbGVhdmUtdG8iLGxlYXZlQWN0aXZlQ2xhc3M6ZSsiLWxlYXZlLWFjdGl2ZSJ9fSksd2k9eiYmIVcsQ2k9InRyYW5zaXRpb24iLHhpPSJhbmltYXRpb24iLGtpPSJ0cmFuc2l0aW9uIixBaT0idHJhbnNpdGlvbmVuZCIsT2k9ImFuaW1hdGlvbiIsU2k9ImFuaW1hdGlvbmVuZCI7d2kmJih2b2lkIDA9PT13aW5kb3cub250cmFuc2l0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kJiYoa2k9IldlYmtpdFRyYW5zaXRpb24iLEFpPSJ3ZWJraXRUcmFuc2l0aW9uRW5kIiksdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQmJihPaT0iV2Via2l0QW5pbWF0aW9uIixTaT0id2Via2l0QW5pbWF0aW9uRW5kIikpO3ZhciBUaT16P3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6c2V0VGltZW91dDpmdW5jdGlvbihlKXtyZXR1cm4gZSgpfTtmdW5jdGlvbiBFaShlKXtUaShmdW5jdGlvbigpe1RpKGUpfSl9ZnVuY3Rpb24gTmkoZSx0KXt2YXIgbj1lLl90cmFuc2l0aW9uQ2xhc3Nlc3x8KGUuX3RyYW5zaXRpb25DbGFzc2VzPVtdKTtuLmluZGV4T2YodCk8MCYmKG4ucHVzaCh0KSxnaShlLHQpKX1mdW5jdGlvbiBqaShlLHQpe2UuX3RyYW5zaXRpb25DbGFzc2VzJiZoKGUuX3RyYW5zaXRpb25DbGFzc2VzLHQpLF9pKGUsdCl9ZnVuY3Rpb24gRGkoZSx0LG4pe3ZhciByPU1pKGUsdCksaT1yLnR5cGUsbz1yLnRpbWVvdXQsYT1yLnByb3BDb3VudDtpZighaSlyZXR1cm4gbigpO3ZhciBzPWk9PT1DaT9BaTpTaSxjPTAsdT1mdW5jdGlvbigpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGwpLG4oKX0sbD1mdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJisrYz49YSYmdSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YzxhJiZ1KCl9LG8rMSksZS5hZGRFdmVudExpc3RlbmVyKHMsbCl9dmFyIExpPS9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLztmdW5jdGlvbiBNaShlLHQpe3ZhciBuLHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksaT0ocltraSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLG89KHJba2krIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSxhPUlpKGksbykscz0ocltPaSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLGM9KHJbT2krIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSx1PUlpKHMsYyksbD0wLGY9MDtyZXR1cm4gdD09PUNpP2E+MCYmKG49Q2ksbD1hLGY9by5sZW5ndGgpOnQ9PT14aT91PjAmJihuPXhpLGw9dSxmPWMubGVuZ3RoKTpmPShuPShsPU1hdGgubWF4KGEsdSkpPjA/YT51P0NpOnhpOm51bGwpP249PT1DaT9vLmxlbmd0aDpjLmxlbmd0aDowLHt0eXBlOm4sdGltZW91dDpsLHByb3BDb3VudDpmLGhhc1RyYW5zZm9ybTpuPT09Q2kmJkxpLnRlc3QocltraSsiUHJvcGVydHkiXSl9fWZ1bmN0aW9uIElpKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCx0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBGaSh0KStGaShlW25dKX0pKX1mdW5jdGlvbiBGaShlKXtyZXR1cm4gMWUzKk51bWJlcihlLnNsaWNlKDAsLTEpLnJlcGxhY2UoIiwiLCIuIikpfWZ1bmN0aW9uIFBpKGUscil7dmFyIGk9ZS5lbG07bihpLl9sZWF2ZUNiKSYmKGkuX2xlYXZlQ2IuY2FuY2VsbGVkPSEwLGkuX2xlYXZlQ2IoKSk7dmFyIGE9YmkoZS5kYXRhLnRyYW5zaXRpb24pO2lmKCF0KGEpJiYhbihpLl9lbnRlckNiKSYmMT09PWkubm9kZVR5cGUpe2Zvcih2YXIgcz1hLmNzcyxjPWEudHlwZSx1PWEuZW50ZXJDbGFzcyxsPWEuZW50ZXJUb0NsYXNzLHA9YS5lbnRlckFjdGl2ZUNsYXNzLGQ9YS5hcHBlYXJDbGFzcyx2PWEuYXBwZWFyVG9DbGFzcyxoPWEuYXBwZWFyQWN0aXZlQ2xhc3MsbT1hLmJlZm9yZUVudGVyLHk9YS5lbnRlcixnPWEuYWZ0ZXJFbnRlcixfPWEuZW50ZXJDYW5jZWxsZWQsYj1hLmJlZm9yZUFwcGVhciwkPWEuYXBwZWFyLHc9YS5hZnRlckFwcGVhcixDPWEuYXBwZWFyQ2FuY2VsbGVkLHg9YS5kdXJhdGlvbixrPVd0LEE9V3QuJHZub2RlO0EmJkEucGFyZW50OylrPUEuY29udGV4dCxBPUEucGFyZW50O3ZhciBPPSFrLl9pc01vdW50ZWR8fCFlLmlzUm9vdEluc2VydDtpZighT3x8JHx8IiI9PT0kKXt2YXIgUz1PJiZkP2Q6dSxUPU8mJmg/aDpwLEU9TyYmdj92OmwsTj1PJiZifHxtLGo9TyYmImZ1bmN0aW9uIj09dHlwZW9mICQ/JDp5LEw9TyYmd3x8ZyxNPU8mJkN8fF8sST1mKG8oeCk/eC5lbnRlcjp4KSxGPSExIT09cyYmIVcsUD1CaShqKSxSPWkuX2VudGVyQ2I9RChmdW5jdGlvbigpe0YmJihqaShpLEUpLGppKGksVCkpLFIuY2FuY2VsbGVkPyhGJiZqaShpLFMpLE0mJk0oaSkpOkwmJkwoaSksaS5fZW50ZXJDYj1udWxsfSk7ZS5kYXRhLnNob3d8fGl0KGUsImluc2VydCIsZnVuY3Rpb24oKXt2YXIgdD1pLnBhcmVudE5vZGUsbj10JiZ0Ll9wZW5kaW5nJiZ0Ll9wZW5kaW5nW2Uua2V5XTtuJiZuLnRhZz09PWUudGFnJiZuLmVsbS5fbGVhdmVDYiYmbi5lbG0uX2xlYXZlQ2IoKSxqJiZqKGksUil9KSxOJiZOKGkpLEYmJihOaShpLFMpLE5pKGksVCksRWkoZnVuY3Rpb24oKXtqaShpLFMpLFIuY2FuY2VsbGVkfHwoTmkoaSxFKSxQfHwoSGkoSSk/c2V0VGltZW91dChSLEkpOkRpKGksYyxSKSkpfSkpLGUuZGF0YS5zaG93JiYociYmcigpLGomJmooaSxSKSksRnx8UHx8UigpfX19ZnVuY3Rpb24gUmkoZSxyKXt2YXIgaT1lLmVsbTtuKGkuX2VudGVyQ2IpJiYoaS5fZW50ZXJDYi5jYW5jZWxsZWQ9ITAsaS5fZW50ZXJDYigpKTt2YXIgYT1iaShlLmRhdGEudHJhbnNpdGlvbik7aWYodChhKXx8MSE9PWkubm9kZVR5cGUpcmV0dXJuIHIoKTtpZighbihpLl9sZWF2ZUNiKSl7dmFyIHM9YS5jc3MsYz1hLnR5cGUsdT1hLmxlYXZlQ2xhc3MsbD1hLmxlYXZlVG9DbGFzcyxwPWEubGVhdmVBY3RpdmVDbGFzcyxkPWEuYmVmb3JlTGVhdmUsdj1hLmxlYXZlLGg9YS5hZnRlckxlYXZlLG09YS5sZWF2ZUNhbmNlbGxlZCx5PWEuZGVsYXlMZWF2ZSxnPWEuZHVyYXRpb24sXz0hMSE9PXMmJiFXLGI9QmkodiksJD1mKG8oZyk/Zy5sZWF2ZTpnKSx3PWkuX2xlYXZlQ2I9RChmdW5jdGlvbigpe2kucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLl9wZW5kaW5nJiYoaS5wYXJlbnROb2RlLl9wZW5kaW5nW2Uua2V5XT1udWxsKSxfJiYoamkoaSxsKSxqaShpLHApKSx3LmNhbmNlbGxlZD8oXyYmamkoaSx1KSxtJiZtKGkpKToocigpLGgmJmgoaSkpLGkuX2xlYXZlQ2I9bnVsbH0pO3k/eShDKTpDKCl9ZnVuY3Rpb24gQygpe3cuY2FuY2VsbGVkfHwoIWUuZGF0YS5zaG93JiZpLnBhcmVudE5vZGUmJigoaS5wYXJlbnROb2RlLl9wZW5kaW5nfHwoaS5wYXJlbnROb2RlLl9wZW5kaW5nPXt9KSlbZS5rZXldPWUpLGQmJmQoaSksXyYmKE5pKGksdSksTmkoaSxwKSxFaShmdW5jdGlvbigpe2ppKGksdSksdy5jYW5jZWxsZWR8fChOaShpLGwpLGJ8fChIaSgkKT9zZXRUaW1lb3V0KHcsJCk6RGkoaSxjLHcpKSl9KSksdiYmdihpLHcpLF98fGJ8fHcoKSl9fWZ1bmN0aW9uIEhpKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmIWlzTmFOKGUpfWZ1bmN0aW9uIEJpKGUpe2lmKHQoZSkpcmV0dXJuITE7dmFyIHI9ZS5mbnM7cmV0dXJuIG4ocik/QmkoQXJyYXkuaXNBcnJheShyKT9yWzBdOnIpOihlLl9sZW5ndGh8fGUubGVuZ3RoKT4xfWZ1bmN0aW9uIFVpKGUsdCl7ITAhPT10LmRhdGEuc2hvdyYmUGkodCl9dmFyIHppPWZ1bmN0aW9uKGUpe3ZhciBvLGEscz17fSxjPWUubW9kdWxlcyx1PWUubm9kZU9wcztmb3Iobz0wO288cnIubGVuZ3RoOysrbylmb3Ioc1tycltvXV09W10sYT0wO2E8Yy5sZW5ndGg7KythKW4oY1thXVtycltvXV0pJiZzW3JyW29dXS5wdXNoKGNbYV1bcnJbb11dKTtmdW5jdGlvbiBsKGUpe3ZhciB0PXUucGFyZW50Tm9kZShlKTtuKHQpJiZ1LnJlbW92ZUNoaWxkKHQsZSl9ZnVuY3Rpb24gZihlLHQsaSxvLGEsYyxsKXtpZihuKGUuZWxtKSYmbihjKSYmKGU9Y1tsXT1tZShlKSksZS5pc1Jvb3RJbnNlcnQ9IWEsIWZ1bmN0aW9uKGUsdCxpLG8pe3ZhciBhPWUuZGF0YTtpZihuKGEpKXt2YXIgYz1uKGUuY29tcG9uZW50SW5zdGFuY2UpJiZhLmtlZXBBbGl2ZTtpZihuKGE9YS5ob29rKSYmbihhPWEuaW5pdCkmJmEoZSwhMSksbihlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gZChlLHQpLHYoaSxlLmVsbSxvKSxyKGMpJiZmdW5jdGlvbihlLHQscixpKXtmb3IodmFyIG8sYT1lO2EuY29tcG9uZW50SW5zdGFuY2U7KWlmKGE9YS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsbihvPWEuZGF0YSkmJm4obz1vLnRyYW5zaXRpb24pKXtmb3Iobz0wO288cy5hY3RpdmF0ZS5sZW5ndGg7KytvKXMuYWN0aXZhdGVbb10obnIsYSk7dC5wdXNoKGEpO2JyZWFrfXYocixlLmVsbSxpKX0oZSx0LGksbyksITB9fShlLHQsaSxvKSl7dmFyIGY9ZS5kYXRhLHA9ZS5jaGlsZHJlbixtPWUudGFnO24obSk/KGUuZWxtPWUubnM/dS5jcmVhdGVFbGVtZW50TlMoZS5ucyxtKTp1LmNyZWF0ZUVsZW1lbnQobSxlKSxnKGUpLGgoZSxwLHQpLG4oZikmJnkoZSx0KSx2KGksZS5lbG0sbykpOnIoZS5pc0NvbW1lbnQpPyhlLmVsbT11LmNyZWF0ZUNvbW1lbnQoZS50ZXh0KSx2KGksZS5lbG0sbykpOihlLmVsbT11LmNyZWF0ZVRleHROb2RlKGUudGV4dCksdihpLGUuZWxtLG8pKX19ZnVuY3Rpb24gZChlLHQpe24oZS5kYXRhLnBlbmRpbmdJbnNlcnQpJiYodC5wdXNoLmFwcGx5KHQsZS5kYXRhLnBlbmRpbmdJbnNlcnQpLGUuZGF0YS5wZW5kaW5nSW5zZXJ0PW51bGwpLGUuZWxtPWUuY29tcG9uZW50SW5zdGFuY2UuJGVsLG0oZSk/KHkoZSx0KSxnKGUpKToodHIoZSksdC5wdXNoKGUpKX1mdW5jdGlvbiB2KGUsdCxyKXtuKGUpJiYobihyKT91LnBhcmVudE5vZGUocik9PT1lJiZ1Lmluc2VydEJlZm9yZShlLHQscik6dS5hcHBlbmRDaGlsZChlLHQpKX1mdW5jdGlvbiBoKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKWYodFtyXSxuLGUuZWxtLG51bGwsITAsdCxyKTtlbHNlIGkoZS50ZXh0KSYmdS5hcHBlbmRDaGlsZChlLmVsbSx1LmNyZWF0ZVRleHROb2RlKFN0cmluZyhlLnRleHQpKSl9ZnVuY3Rpb24gbShlKXtmb3IoO2UuY29tcG9uZW50SW5zdGFuY2U7KWU9ZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7cmV0dXJuIG4oZS50YWcpfWZ1bmN0aW9uIHkoZSx0KXtmb3IodmFyIHI9MDtyPHMuY3JlYXRlLmxlbmd0aDsrK3Ipcy5jcmVhdGVbcl0obnIsZSk7bihvPWUuZGF0YS5ob29rKSYmKG4oby5jcmVhdGUpJiZvLmNyZWF0ZShucixlKSxuKG8uaW5zZXJ0KSYmdC5wdXNoKGUpKX1mdW5jdGlvbiBnKGUpe3ZhciB0O2lmKG4odD1lLmZuU2NvcGVJZCkpdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpO2Vsc2UgZm9yKHZhciByPWU7cjspbih0PXIuY29udGV4dCkmJm4odD10LiRvcHRpb25zLl9zY29wZUlkKSYmdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpLHI9ci5wYXJlbnQ7bih0PVd0KSYmdCE9PWUuY29udGV4dCYmdCE9PWUuZm5Db250ZXh0JiZuKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJnUuc2V0U3R5bGVTY29wZShlLmVsbSx0KX1mdW5jdGlvbiBfKGUsdCxuLHIsaSxvKXtmb3IoO3I8PWk7KytyKWYobltyXSxvLGUsdCwhMSxuLHIpfWZ1bmN0aW9uIGIoZSl7dmFyIHQscixpPWUuZGF0YTtpZihuKGkpKWZvcihuKHQ9aS5ob29rKSYmbih0PXQuZGVzdHJveSkmJnQoZSksdD0wO3Q8cy5kZXN0cm95Lmxlbmd0aDsrK3Qpcy5kZXN0cm95W3RdKGUpO2lmKG4odD1lLmNoaWxkcmVuKSlmb3Iocj0wO3I8ZS5jaGlsZHJlbi5sZW5ndGg7KytyKWIoZS5jaGlsZHJlbltyXSl9ZnVuY3Rpb24gJChlLHQscil7Zm9yKDt0PD1yOysrdCl7dmFyIGk9ZVt0XTtuKGkpJiYobihpLnRhZyk/KHcoaSksYihpKSk6bChpLmVsbSkpfX1mdW5jdGlvbiB3KGUsdCl7aWYobih0KXx8bihlLmRhdGEpKXt2YXIgcixpPXMucmVtb3ZlLmxlbmd0aCsxO2ZvcihuKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbChlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxuKHI9ZS5jb21wb25lbnRJbnN0YW5jZSkmJm4ocj1yLl92bm9kZSkmJm4oci5kYXRhKSYmdyhyLHQpLHI9MDtyPHMucmVtb3ZlLmxlbmd0aDsrK3Ipcy5yZW1vdmVbcl0oZSx0KTtuKHI9ZS5kYXRhLmhvb2spJiZuKHI9ci5yZW1vdmUpP3IoZSx0KTp0KCl9ZWxzZSBsKGUuZWxtKX1mdW5jdGlvbiBDKGUsdCxyLGkpe2Zvcih2YXIgbz1yO288aTtvKyspe3ZhciBhPXRbb107aWYobihhKSYmaXIoZSxhKSlyZXR1cm4gb319ZnVuY3Rpb24geChlLGksbyxhLGMsbCl7aWYoZSE9PWkpe24oaS5lbG0pJiZuKGEpJiYoaT1hW2NdPW1lKGkpKTt2YXIgcD1pLmVsbT1lLmVsbTtpZihyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSluKGkuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLGksbyk6aS5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihyKGkuaXNTdGF0aWMpJiZyKGUuaXNTdGF0aWMpJiZpLmtleT09PWUua2V5JiYocihpLmlzQ2xvbmVkKXx8cihpLmlzT25jZSkpKWkuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBkLHY9aS5kYXRhO24odikmJm4oZD12Lmhvb2spJiZuKGQ9ZC5wcmVwYXRjaCkmJmQoZSxpKTt2YXIgaD1lLmNoaWxkcmVuLHk9aS5jaGlsZHJlbjtpZihuKHYpJiZtKGkpKXtmb3IoZD0wO2Q8cy51cGRhdGUubGVuZ3RoOysrZClzLnVwZGF0ZVtkXShlLGkpO24oZD12Lmhvb2spJiZuKGQ9ZC51cGRhdGUpJiZkKGUsaSl9dChpLnRleHQpP24oaCkmJm4oeSk/aCE9PXkmJmZ1bmN0aW9uKGUscixpLG8sYSl7Zm9yKHZhciBzLGMsbCxwPTAsZD0wLHY9ci5sZW5ndGgtMSxoPXJbMF0sbT1yW3ZdLHk9aS5sZW5ndGgtMSxnPWlbMF0sYj1pW3ldLHc9IWE7cDw9diYmZDw9eTspdChoKT9oPXJbKytwXTp0KG0pP209clstLXZdOmlyKGgsZyk/KHgoaCxnLG8saSxkKSxoPXJbKytwXSxnPWlbKytkXSk6aXIobSxiKT8oeChtLGIsbyxpLHkpLG09clstLXZdLGI9aVstLXldKTppcihoLGIpPyh4KGgsYixvLGkseSksdyYmdS5pbnNlcnRCZWZvcmUoZSxoLmVsbSx1Lm5leHRTaWJsaW5nKG0uZWxtKSksaD1yWysrcF0sYj1pWy0teV0pOmlyKG0sZyk/KHgobSxnLG8saSxkKSx3JiZ1Lmluc2VydEJlZm9yZShlLG0uZWxtLGguZWxtKSxtPXJbLS12XSxnPWlbKytkXSk6KHQocykmJihzPW9yKHIscCx2KSksdChjPW4oZy5rZXkpP3NbZy5rZXldOkMoZyxyLHAsdikpP2YoZyxvLGUsaC5lbG0sITEsaSxkKTppcihsPXJbY10sZyk/KHgobCxnLG8saSxkKSxyW2NdPXZvaWQgMCx3JiZ1Lmluc2VydEJlZm9yZShlLGwuZWxtLGguZWxtKSk6ZihnLG8sZSxoLmVsbSwhMSxpLGQpLGc9aVsrK2RdKTtwPnY/XyhlLHQoaVt5KzFdKT9udWxsOmlbeSsxXS5lbG0saSxkLHksbyk6ZD55JiYkKHIscCx2KX0ocCxoLHksbyxsKTpuKHkpPyhuKGUudGV4dCkmJnUuc2V0VGV4dENvbnRlbnQocCwiIiksXyhwLG51bGwseSwwLHkubGVuZ3RoLTEsbykpOm4oaCk/JChoLDAsaC5sZW5ndGgtMSk6bihlLnRleHQpJiZ1LnNldFRleHRDb250ZW50KHAsIiIpOmUudGV4dCE9PWkudGV4dCYmdS5zZXRUZXh0Q29udGVudChwLGkudGV4dCksbih2KSYmbihkPXYuaG9vaykmJm4oZD1kLnBvc3RwYXRjaCkmJmQoZSxpKX19fWZ1bmN0aW9uIGsoZSx0LGkpe2lmKHIoaSkmJm4oZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciBvPTA7bzx0Lmxlbmd0aDsrK28pdFtvXS5kYXRhLmhvb2suaW5zZXJ0KHRbb10pfXZhciBBPXAoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LGksbyl7dmFyIGEscz10LnRhZyxjPXQuZGF0YSx1PXQuY2hpbGRyZW47aWYobz1vfHxjJiZjLnByZSx0LmVsbT1lLHIodC5pc0NvbW1lbnQpJiZuKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITAsITA7aWYobihjKSYmKG4oYT1jLmhvb2spJiZuKGE9YS5pbml0KSYmYSh0LCEwKSxuKGE9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBkKHQsaSksITA7aWYobihzKSl7aWYobih1KSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihuKGE9YykmJm4oYT1hLmRvbVByb3BzKSYmbihhPWEuaW5uZXJIVE1MKSl7aWYoYSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBsPSEwLGY9ZS5maXJzdENoaWxkLHA9MDtwPHUubGVuZ3RoO3ArKyl7aWYoIWZ8fCFPKGYsdVtwXSxpLG8pKXtsPSExO2JyZWFrfWY9Zi5uZXh0U2libGluZ31pZighbHx8ZilyZXR1cm4hMX1lbHNlIGgodCx1LGkpO2lmKG4oYykpe3ZhciB2PSExO2Zvcih2YXIgbSBpbiBjKWlmKCFBKG0pKXt2PSEwLHkodCxpKTticmVha30hdiYmYy5jbGFzcyYmZXQoYy5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsaSxvLGEpe2lmKCF0KGkpKXt2YXIgYyxsPSExLHA9W107aWYodChlKSlsPSEwLGYoaSxwKTtlbHNle3ZhciBkPW4oZS5ub2RlVHlwZSk7aWYoIWQmJmlyKGUsaSkpeChlLGkscCxudWxsLG51bGwsYSk7ZWxzZXtpZihkKXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoTCkmJihlLnJlbW92ZUF0dHJpYnV0ZShMKSxvPSEwKSxyKG8pJiZPKGUsaSxwKSlyZXR1cm4gayhpLHAsITApLGU7Yz1lLGU9bmV3IHBlKHUudGFnTmFtZShjKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxjKX12YXIgdj1lLmVsbSxoPXUucGFyZW50Tm9kZSh2KTtpZihmKGkscCx2Ll9sZWF2ZUNiP251bGw6aCx1Lm5leHRTaWJsaW5nKHYpKSxuKGkucGFyZW50KSlmb3IodmFyIHk9aS5wYXJlbnQsZz1tKGkpO3k7KXtmb3IodmFyIF89MDtfPHMuZGVzdHJveS5sZW5ndGg7KytfKXMuZGVzdHJveVtfXSh5KTtpZih5LmVsbT1pLmVsbSxnKXtmb3IodmFyIHc9MDt3PHMuY3JlYXRlLmxlbmd0aDsrK3cpcy5jcmVhdGVbd10obnIseSk7dmFyIEM9eS5kYXRhLmhvb2suaW5zZXJ0O2lmKEMubWVyZ2VkKWZvcih2YXIgQT0xO0E8Qy5mbnMubGVuZ3RoO0ErKylDLmZuc1tBXSgpfWVsc2UgdHIoeSk7eT15LnBhcmVudH1uKGgpPyQoW2VdLDAsMCk6bihlLnRhZykmJmIoZSl9fXJldHVybiBrKGkscCxsKSxpLmVsbX1uKGUpJiZiKGUpfX0oe25vZGVPcHM6UW4sbW9kdWxlczpbbXIseHIsbmksb2ksbWksej97Y3JlYXRlOlVpLGFjdGl2YXRlOlVpLHJlbW92ZTpmdW5jdGlvbihlLHQpeyEwIT09ZS5kYXRhLnNob3c/UmkoZSx0KTp0KCl9fTp7fV0uY29uY2F0KHByKX0pO1cmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2UmJmUudm1vZGVsJiZYaShlLCJpbnB1dCIpfSk7dmFyIFZpPXtpbnNlcnRlZDpmdW5jdGlvbihlLHQsbixyKXsic2VsZWN0Ij09PW4udGFnPyhyLmVsbSYmIXIuZWxtLl92T3B0aW9ucz9pdChuLCJwb3N0cGF0Y2giLGZ1bmN0aW9uKCl7VmkuY29tcG9uZW50VXBkYXRlZChlLHQsbil9KTpLaShlLHQsbi5jb250ZXh0KSxlLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpKTooInRleHRhcmVhIj09PW4udGFnfHxYbihlLnR5cGUpKSYmKGUuX3ZNb2RpZmllcnM9dC5tb2RpZmllcnMsdC5tb2RpZmllcnMubGF6eXx8KGUuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25zdGFydCIsWmkpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25lbmQiLEdpKSxlLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsR2kpLFcmJihlLnZtb2RlbD0hMCkpKX0sY29tcG9uZW50VXBkYXRlZDpmdW5jdGlvbihlLHQsbil7aWYoInNlbGVjdCI9PT1uLnRhZyl7S2koZSx0LG4uY29udGV4dCk7dmFyIHI9ZS5fdk9wdGlvbnMsaT1lLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpO2lmKGkuc29tZShmdW5jdGlvbihlLHQpe3JldHVybiFOKGUsclt0XSl9KSkoZS5tdWx0aXBsZT90LnZhbHVlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHFpKGUsaSl9KTp0LnZhbHVlIT09dC5vbGRWYWx1ZSYmcWkodC52YWx1ZSxpKSkmJlhpKGUsImNoYW5nZSIpfX19O2Z1bmN0aW9uIEtpKGUsdCxuKXtKaShlLHQsbiksKHF8fFopJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7SmkoZSx0LG4pfSwwKX1mdW5jdGlvbiBKaShlLHQsbil7dmFyIHI9dC52YWx1ZSxpPWUubXVsdGlwbGU7aWYoIWl8fEFycmF5LmlzQXJyYXkocikpe2Zvcih2YXIgbyxhLHM9MCxjPWUub3B0aW9ucy5sZW5ndGg7czxjO3MrKylpZihhPWUub3B0aW9uc1tzXSxpKW89aihyLFdpKGEpKT4tMSxhLnNlbGVjdGVkIT09byYmKGEuc2VsZWN0ZWQ9byk7ZWxzZSBpZihOKFdpKGEpLHIpKXJldHVybiB2b2lkKGUuc2VsZWN0ZWRJbmRleCE9PXMmJihlLnNlbGVjdGVkSW5kZXg9cykpO2l8fChlLnNlbGVjdGVkSW5kZXg9LTEpfX1mdW5jdGlvbiBxaShlLHQpe3JldHVybiB0LmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiFOKHQsZSl9KX1mdW5jdGlvbiBXaShlKXtyZXR1cm4iX3ZhbHVlImluIGU/ZS5fdmFsdWU6ZS52YWx1ZX1mdW5jdGlvbiBaaShlKXtlLnRhcmdldC5jb21wb3Npbmc9ITB9ZnVuY3Rpb24gR2koZSl7ZS50YXJnZXQuY29tcG9zaW5nJiYoZS50YXJnZXQuY29tcG9zaW5nPSExLFhpKGUudGFyZ2V0LCJpbnB1dCIpKX1mdW5jdGlvbiBYaShlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIik7bi5pbml0RXZlbnQodCwhMCwhMCksZS5kaXNwYXRjaEV2ZW50KG4pfWZ1bmN0aW9uIFlpKGUpe3JldHVybiFlLmNvbXBvbmVudEluc3RhbmNlfHxlLmRhdGEmJmUuZGF0YS50cmFuc2l0aW9uP2U6WWkoZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpfXZhciBRaT17bW9kZWw6Vmksc2hvdzp7YmluZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZSxpPShuPVlpKG4pKS5kYXRhJiZuLmRhdGEudHJhbnNpdGlvbixvPWUuX192T3JpZ2luYWxEaXNwbGF5PSJub25lIj09PWUuc3R5bGUuZGlzcGxheT8iIjplLnN0eWxlLmRpc3BsYXk7ciYmaT8obi5kYXRhLnNob3c9ITAsUGkobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1vfSkpOmUuc3R5bGUuZGlzcGxheT1yP286Im5vbmUifSx1cGRhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQudmFsdWU7IXIhPSF0Lm9sZFZhbHVlJiYoKG49WWkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uPyhuLmRhdGEuc2hvdz0hMCxyP1BpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXl9KTpSaShuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PSJub25lIn0pKTplLnN0eWxlLmRpc3BsYXk9cj9lLl9fdk9yaWdpbmFsRGlzcGxheToibm9uZSIpfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0LG4scixpKXtpfHwoZS5zdHlsZS5kaXNwbGF5PWUuX192T3JpZ2luYWxEaXNwbGF5KX19fSxlbz17bmFtZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4sY3NzOkJvb2xlYW4sbW9kZTpTdHJpbmcsdHlwZTpTdHJpbmcsZW50ZXJDbGFzczpTdHJpbmcsbGVhdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhckNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsZHVyYXRpb246W051bWJlcixTdHJpbmcsT2JqZWN0XX07ZnVuY3Rpb24gdG8oZSl7dmFyIHQ9ZSYmZS5jb21wb25lbnRPcHRpb25zO3JldHVybiB0JiZ0LkN0b3Iub3B0aW9ucy5hYnN0cmFjdD90byh6dCh0LmNoaWxkcmVuKSk6ZX1mdW5jdGlvbiBubyhlKXt2YXIgdD17fSxuPWUuJG9wdGlvbnM7Zm9yKHZhciByIGluIG4ucHJvcHNEYXRhKXRbcl09ZVtyXTt2YXIgaT1uLl9wYXJlbnRMaXN0ZW5lcnM7Zm9yKHZhciBvIGluIGkpdFtiKG8pXT1pW29dO3JldHVybiB0fWZ1bmN0aW9uIHJvKGUsdCl7aWYoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHQudGFnKSlyZXR1cm4gZSgia2VlcC1hbGl2ZSIse3Byb3BzOnQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGF9KX12YXIgaW89ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnfHxVdChlKX0sb289ZnVuY3Rpb24oZSl7cmV0dXJuInNob3ciPT09ZS5uYW1lfSxhbz17bmFtZToidHJhbnNpdGlvbiIscHJvcHM6ZW8sYWJzdHJhY3Q6ITAscmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRzbG90cy5kZWZhdWx0O2lmKG4mJihuPW4uZmlsdGVyKGlvKSkubGVuZ3RoKXt2YXIgcj10aGlzLm1vZGUsbz1uWzBdO2lmKGZ1bmN0aW9uKGUpe2Zvcig7ZT1lLnBhcmVudDspaWYoZS5kYXRhLnRyYW5zaXRpb24pcmV0dXJuITB9KHRoaXMuJHZub2RlKSlyZXR1cm4gbzt2YXIgYT10byhvKTtpZighYSlyZXR1cm4gbztpZih0aGlzLl9sZWF2aW5nKXJldHVybiBybyhlLG8pO3ZhciBzPSJfX3RyYW5zaXRpb24tIit0aGlzLl91aWQrIi0iO2Eua2V5PW51bGw9PWEua2V5P2EuaXNDb21tZW50P3MrImNvbW1lbnQiOnMrYS50YWc6aShhLmtleSk/MD09PVN0cmluZyhhLmtleSkuaW5kZXhPZihzKT9hLmtleTpzK2Eua2V5OmEua2V5O3ZhciBjPShhLmRhdGF8fChhLmRhdGE9e30pKS50cmFuc2l0aW9uPW5vKHRoaXMpLHU9dGhpcy5fdm5vZGUsbD10byh1KTtpZihhLmRhdGEuZGlyZWN0aXZlcyYmYS5kYXRhLmRpcmVjdGl2ZXMuc29tZShvbykmJihhLmRhdGEuc2hvdz0hMCksbCYmbC5kYXRhJiYhZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5rZXk9PT1lLmtleSYmdC50YWc9PT1lLnRhZ30oYSxsKSYmIVV0KGwpJiYoIWwuY29tcG9uZW50SW5zdGFuY2V8fCFsLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1sLmRhdGEudHJhbnNpdGlvbj1BKHt9LGMpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxpdChmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLHJvKGUsbyk7aWYoImluLW91dCI9PT1yKXtpZihVdChhKSlyZXR1cm4gdTt2YXIgcCxkPWZ1bmN0aW9uKCl7cCgpfTtpdChjLCJhZnRlckVudGVyIixkKSxpdChjLCJlbnRlckNhbmNlbGxlZCIsZCksaXQoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBvfX19LHNvPUEoe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sZW8pO2Z1bmN0aW9uIGNvKGUpe2UuZWxtLl9tb3ZlQ2ImJmUuZWxtLl9tb3ZlQ2IoKSxlLmVsbS5fZW50ZXJDYiYmZS5lbG0uX2VudGVyQ2IoKX1mdW5jdGlvbiB1byhlKXtlLmRhdGEubmV3UG9zPWUuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWZ1bmN0aW9uIGxvKGUpe3ZhciB0PWUuZGF0YS5wb3Msbj1lLmRhdGEubmV3UG9zLHI9dC5sZWZ0LW4ubGVmdCxpPXQudG9wLW4udG9wO2lmKHJ8fGkpe2UuZGF0YS5tb3ZlZD0hMDt2YXIgbz1lLmVsbS5zdHlsZTtvLnRyYW5zZm9ybT1vLldlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIrcisicHgsIitpKyJweCkiLG8udHJhbnNpdGlvbkR1cmF0aW9uPSIwcyJ9fWRlbGV0ZSBzby5tb2RlO3ZhciBmbz17VHJhbnNpdGlvbjphbyxUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOnNvLGJlZm9yZU1vdW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuX3VwZGF0ZTt0aGlzLl91cGRhdGU9ZnVuY3Rpb24obixyKXt2YXIgaT1adChlKTtlLl9fcGF0Y2hfXyhlLl92bm9kZSxlLmtlcHQsITEsITApLGUuX3Zub2RlPWUua2VwdCxpKCksdC5jYWxsKGUsbixyKX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPW5vKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSxuW2Mua2V5XT1jLChjLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe2Zvcih2YXIgdT1bXSxsPVtdLGY9MDtmPHIubGVuZ3RoO2YrKyl7dmFyIHA9cltmXTtwLmRhdGEudHJhbnNpdGlvbj1hLHAuZGF0YS5wb3M9cC5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbltwLmtleV0/dS5wdXNoKHApOmwucHVzaChwKX10aGlzLmtlcHQ9ZSh0LG51bGwsdSksdGhpcy5yZW1vdmVkPWx9cmV0dXJuIGUodCxudWxsLG8pfSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmhhc01vdmUoZVswXS5lbG0sdCkmJihlLmZvckVhY2goY28pLGUuZm9yRWFjaCh1byksZS5mb3JFYWNoKGxvKSx0aGlzLl9yZWZsb3c9ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUuZGF0YS5tb3ZlZCl7dmFyIG49ZS5lbG0scj1uLnN0eWxlO05pKG4sdCksci50cmFuc2Zvcm09ci5XZWJraXRUcmFuc2Zvcm09ci50cmFuc2l0aW9uRHVyYXRpb249IiIsbi5hZGRFdmVudExpc3RlbmVyKEFpLG4uX21vdmVDYj1mdW5jdGlvbiBlKHIpe3ImJnIudGFyZ2V0IT09bnx8ciYmIS90cmFuc2Zvcm0kLy50ZXN0KHIucHJvcGVydHlOYW1lKXx8KG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihBaSxlKSxuLl9tb3ZlQ2I9bnVsbCxqaShuLHQpKX0pfX0pKX0sbWV0aG9kczp7aGFzTW92ZTpmdW5jdGlvbihlLHQpe2lmKCF3aSlyZXR1cm4hMTtpZih0aGlzLl9oYXNNb3ZlKXJldHVybiB0aGlzLl9oYXNNb3ZlO3ZhciBuPWUuY2xvbmVOb2RlKCk7ZS5fdHJhbnNpdGlvbkNsYXNzZXMmJmUuX3RyYW5zaXRpb25DbGFzc2VzLmZvckVhY2goZnVuY3Rpb24oZSl7X2kobixlKX0pLGdpKG4sdCksbi5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLiRlbC5hcHBlbmRDaGlsZChuKTt2YXIgcj1NaShuKTtyZXR1cm4gdGhpcy4kZWwucmVtb3ZlQ2hpbGQobiksdGhpcy5faGFzTW92ZT1yLmhhc1RyYW5zZm9ybX19fX07d24uY29uZmlnLm11c3RVc2VQcm9wPWpuLHduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPVduLHduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj1Fbix3bi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPVpuLHduLmNvbmZpZy5pc1Vua25vd25FbGVtZW50PWZ1bmN0aW9uKGUpe2lmKCF6KXJldHVybiEwO2lmKFduKGUpKXJldHVybiExO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGwhPUduW2VdKXJldHVybiBHbltlXTt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBlLmluZGV4T2YoIi0iKT4tMT9HbltlXT10LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxVbmtub3duRWxlbWVudHx8dC5jb25zdHJ1Y3Rvcj09PXdpbmRvdy5IVE1MRWxlbWVudDpHbltlXT0vSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KHQudG9TdHJpbmcoKSl9LEEod24ub3B0aW9ucy5kaXJlY3RpdmVzLFFpKSxBKHduLm9wdGlvbnMuY29tcG9uZW50cyxmbyksd24ucHJvdG90eXBlLl9fcGF0Y2hfXz16P3ppOlMsd24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIGUuJGVsPXQsZS4kb3B0aW9ucy5yZW5kZXJ8fChlLiRvcHRpb25zLnJlbmRlcj12ZSksWXQoZSwiYmVmb3JlTW91bnQiKSxyPWZ1bmN0aW9uKCl7ZS5fdXBkYXRlKGUuX3JlbmRlcigpLG4pfSxuZXcgZm4oZSxyLFMse2JlZm9yZTpmdW5jdGlvbigpe2UuX2lzTW91bnRlZCYmIWUuX2lzRGVzdHJveWVkJiZZdChlLCJiZWZvcmVVcGRhdGUiKX19LCEwKSxuPSExLG51bGw9PWUuJHZub2RlJiYoZS5faXNNb3VudGVkPSEwLFl0KGUsIm1vdW50ZWQiKSksZX0odGhpcyxlPWUmJno/WW4oZSk6dm9pZCAwLHQpfSx6JiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ri5kZXZ0b29scyYmbmUmJm5lLmVtaXQoImluaXQiLHduKX0sMCk7dmFyIHBvPS9ce1x7KCg/Oi58XHI/XG4pKz8pXH1cfS9nLHZvPS9bLS4qKz9eJHt9KCl8W1xdXC9cXF0vZyxobz1nKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0ucmVwbGFjZSh2bywiXFwkJiIpLG49ZVsxXS5yZXBsYWNlKHZvLCJcXCQmIik7cmV0dXJuIG5ldyBSZWdFeHAodCsiKCg/Oi58XFxuKSs/KSIrbiwiZyIpfSk7dmFyIG1vPXtzdGF0aWNLZXlzOlsic3RhdGljQ2xhc3MiXSx0cmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7dC53YXJuO3ZhciBuPUZyKGUsImNsYXNzIik7biYmKGUuc3RhdGljQ2xhc3M9SlNPTi5zdHJpbmdpZnkobikpO3ZhciByPUlyKGUsImNsYXNzIiwhMSk7ciYmKGUuY2xhc3NCaW5kaW5nPXIpfSxnZW5EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlLnN0YXRpY0NsYXNzJiYodCs9InN0YXRpY0NsYXNzOiIrZS5zdGF0aWNDbGFzcysiLCIpLGUuY2xhc3NCaW5kaW5nJiYodCs9ImNsYXNzOiIrZS5jbGFzc0JpbmRpbmcrIiwiKSx0fX07dmFyIHlvLGdvPXtzdGF0aWNLZXlzOlsic3RhdGljU3R5bGUiXSx0cmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7dC53YXJuO3ZhciBuPUZyKGUsInN0eWxlIik7biYmKGUuc3RhdGljU3R5bGU9SlNPTi5zdHJpbmdpZnkoYWkobikpKTt2YXIgcj1JcihlLCJzdHlsZSIsITEpO3ImJihlLnN0eWxlQmluZGluZz1yKX0sZ2VuRGF0YTpmdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZS5zdGF0aWNTdHlsZSYmKHQrPSJzdGF0aWNTdHlsZToiK2Uuc3RhdGljU3R5bGUrIiwiKSxlLnN0eWxlQmluZGluZyYmKHQrPSJzdHlsZTooIitlLnN0eWxlQmluZGluZysiKSwiKSx0fX0sX289ZnVuY3Rpb24oZSl7cmV0dXJuKHlvPXlvfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPWUseW8udGV4dENvbnRlbnR9LGJvPXAoImFyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLGxpbmssbWV0YSxwYXJhbSxzb3VyY2UsdHJhY2ssd2JyIiksJG89cCgiY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZSIpLHdvPXAoImFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxiYXNlLGJsb2NrcXVvdGUsYm9keSxjYXB0aW9uLGNvbCxjb2xncm91cCxkZCxkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0saDEsaDIsaDMsaDQsaDUsaDYsaGVhZCxoZWFkZXIsaGdyb3VwLGhyLGh0bWwsbGVnZW5kLGxpLG1lbnVpdGVtLG1ldGEsb3B0Z3JvdXAsb3B0aW9uLHBhcmFtLHJwLHJ0LHNvdXJjZSxzdHlsZSxzdW1tYXJ5LHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRpdGxlLHRyLHRyYWNrIiksQ289L15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vLHhvPS9eXHMqKCg/OnYtW1x3LV0rOnxAfDp8IylcW1tePV0rXF1bXlxzIic8PlwvPV0qKSg/OlxzKig9KVxzKig/OiIoW14iXSopIit8JyhbXiddKiknK3woW15ccyInPTw+YF0rKSkpPy8sa289IlthLXpBLVpfXVtcXC1cXC4wLTlfYS16QS1aIitQLnNvdXJjZSsiXSoiLEFvPSIoKD86IitrbysiXFw6KT8iK2tvKyIpIixPbz1uZXcgUmVnRXhwKCJePCIrQW8pLFNvPS9eXHMqKFwvPyk+LyxUbz1uZXcgUmVnRXhwKCJePFxcLyIrQW8rIltePl0qPiIpLEVvPS9ePCFET0NUWVBFIFtePl0rPi9pLE5vPS9ePCFcLS0vLGpvPS9ePCFcWy8sRG89cCgic2NyaXB0LHN0eWxlLHRleHRhcmVhIiwhMCksTG89e30sTW89eyImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiZhbXA7IjoiJiIsIiYjMTA7IjoiXG4iLCImIzk7IjoiXHQiLCImIzM5OyI6IicifSxJbz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOSk7L2csRm89LyYoPzpsdHxndHxxdW90fGFtcHwjMzl8IzEwfCM5KTsvZyxQbz1wKCJwcmUsdGV4dGFyZWEiLCEwKSxSbz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZQbyhlKSYmIlxuIj09PXRbMF19O2Z1bmN0aW9uIEhvKGUsdCl7dmFyIG49dD9GbzpJbztyZXR1cm4gZS5yZXBsYWNlKG4sZnVuY3Rpb24oZSl7cmV0dXJuIE1vW2VdfSl9dmFyIEJvLFVvLHpvLFZvLEtvLEpvLHFvLFdvLFpvPS9eQHxedi1vbjovLEdvPS9edi18XkB8Xjp8XiMvLFhvPS8oW1xzXFNdKj8pXHMrKD86aW58b2YpXHMrKFtcc1xTXSopLyxZbz0vLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLyxRbz0vXlwofFwpJC9nLGVhPS9eXFsuKlxdJC8sdGE9LzooLiopJC8sbmE9L146fF5cLnxedi1iaW5kOi8scmE9L1wuW14uXF1dKyg/PVteXF1dKiQpL2csaWE9L152LXNsb3QoOnwkKXxeIy8sb2E9L1tcclxuXS8sYWE9L1xzKy9nLHNhPWcoX28pLGNhPSJfZW1wdHlfIjtmdW5jdGlvbiB1YShlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDptYSh0KSxyYXdBdHRyc01hcDp7fSxwYXJlbnQ6bixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gbGEoZSx0KXtCbz10Lndhcm58fFNyLEpvPXQuaXNQcmVUYWd8fFQscW89dC5tdXN0VXNlUHJvcHx8VCxXbz10LmdldFRhZ05hbWVzcGFjZXx8VDt0LmlzUmVzZXJ2ZWRUYWc7em89VHIodC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksVm89VHIodC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksS289VHIodC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLFVvPXQuZGVsaW1pdGVyczt2YXIgbixyLGk9W10sbz0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLGE9dC53aGl0ZXNwYWNlLHM9ITEsYz0hMTtmdW5jdGlvbiB1KGUpe2lmKGwoZSksc3x8ZS5wcm9jZXNzZWR8fChlPWZhKGUsdCkpLGkubGVuZ3RofHxlPT09bnx8bi5pZiYmKGUuZWxzZWlmfHxlLmVsc2UpJiZkYShuLHtleHA6ZS5lbHNlaWYsYmxvY2s6ZX0pLHImJiFlLmZvcmJpZGRlbilpZihlLmVsc2VpZnx8ZS5lbHNlKWE9ZSwodT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe2lmKDE9PT1lW3RdLnR5cGUpcmV0dXJuIGVbdF07ZS5wb3AoKX19KHIuY2hpbGRyZW4pKSYmdS5pZiYmZGEodSx7ZXhwOmEuZWxzZWlmLGJsb2NrOmF9KTtlbHNle2lmKGUuc2xvdFNjb3BlKXt2YXIgbz1lLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInOyhyLnNjb3BlZFNsb3RzfHwoci5zY29wZWRTbG90cz17fSkpW29dPWV9ci5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PXJ9dmFyIGEsdTtlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnNsb3RTY29wZX0pLGwoZSksZS5wcmUmJihzPSExKSxKbyhlLnRhZykmJihjPSExKTtmb3IodmFyIGY9MDtmPEtvLmxlbmd0aDtmKyspS29bZl0oZSx0KX1mdW5jdGlvbiBsKGUpe2lmKCFjKWZvcih2YXIgdDsodD1lLmNoaWxkcmVuW2UuY2hpbGRyZW4ubGVuZ3RoLTFdKSYmMz09PXQudHlwZSYmIiAiPT09dC50ZXh0OyllLmNoaWxkcmVuLnBvcCgpfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGk9W10sbz10LmV4cGVjdEhUTUwsYT10LmlzVW5hcnlUYWd8fFQscz10LmNhbkJlTGVmdE9wZW5UYWd8fFQsYz0wO2U7KXtpZihuPWUsciYmRG8ocikpe3ZhciB1PTAsbD1yLnRvTG93ZXJDYXNlKCksZj1Mb1tsXXx8KExvW2xdPW5ldyBSZWdFeHAoIihbXFxzXFxTXSo/KSg8LyIrbCsiW14+XSo+KSIsImkiKSkscD1lLnJlcGxhY2UoZixmdW5jdGlvbihlLG4scil7cmV0dXJuIHU9ci5sZW5ndGgsRG8obCl8fCJub3NjcmlwdCI9PT1sfHwobj1uLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCIkMSIpLnJlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSIpKSxSbyhsLG4pJiYobj1uLnNsaWNlKDEpKSx0LmNoYXJzJiZ0LmNoYXJzKG4pLCIifSk7Yys9ZS5sZW5ndGgtcC5sZW5ndGgsZT1wLEEobCxjLXUsYyl9ZWxzZXt2YXIgZD1lLmluZGV4T2YoIjwiKTtpZigwPT09ZCl7aWYoTm8udGVzdChlKSl7dmFyIHY9ZS5pbmRleE9mKCItLVx4M2UiKTtpZih2Pj0wKXt0LnNob3VsZEtlZXBDb21tZW50JiZ0LmNvbW1lbnQoZS5zdWJzdHJpbmcoNCx2KSxjLGMrdiszKSxDKHYrMyk7Y29udGludWV9fWlmKGpvLnRlc3QoZSkpe3ZhciBoPWUuaW5kZXhPZigiXT4iKTtpZihoPj0wKXtDKGgrMik7Y29udGludWV9fXZhciBtPWUubWF0Y2goRW8pO2lmKG0pe0MobVswXS5sZW5ndGgpO2NvbnRpbnVlfXZhciB5PWUubWF0Y2goVG8pO2lmKHkpe3ZhciBnPWM7Qyh5WzBdLmxlbmd0aCksQSh5WzFdLGcsYyk7Y29udGludWV9dmFyIF89eCgpO2lmKF8pe2soXyksUm8oXy50YWdOYW1lLGUpJiZDKDEpO2NvbnRpbnVlfX12YXIgYj12b2lkIDAsJD12b2lkIDAsdz12b2lkIDA7aWYoZD49MCl7Zm9yKCQ9ZS5zbGljZShkKTshKFRvLnRlc3QoJCl8fE9vLnRlc3QoJCl8fE5vLnRlc3QoJCl8fGpvLnRlc3QoJCl8fCh3PSQuaW5kZXhPZigiPCIsMSkpPDApOylkKz13LCQ9ZS5zbGljZShkKTtiPWUuc3Vic3RyaW5nKDAsZCl9ZDwwJiYoYj1lKSxiJiZDKGIubGVuZ3RoKSx0LmNoYXJzJiZiJiZ0LmNoYXJzKGIsYy1iLmxlbmd0aCxjKX1pZihlPT09bil7dC5jaGFycyYmdC5jaGFycyhlKTticmVha319ZnVuY3Rpb24gQyh0KXtjKz10LGU9ZS5zdWJzdHJpbmcodCl9ZnVuY3Rpb24geCgpe3ZhciB0PWUubWF0Y2goT28pO2lmKHQpe3ZhciBuLHIsaT17dGFnTmFtZTp0WzFdLGF0dHJzOltdLHN0YXJ0OmN9O2ZvcihDKHRbMF0ubGVuZ3RoKTshKG49ZS5tYXRjaChTbykpJiYocj1lLm1hdGNoKHhvKXx8ZS5tYXRjaChDbykpOylyLnN0YXJ0PWMsQyhyWzBdLmxlbmd0aCksci5lbmQ9YyxpLmF0dHJzLnB1c2gocik7aWYobilyZXR1cm4gaS51bmFyeVNsYXNoPW5bMV0sQyhuWzBdLmxlbmd0aCksaS5lbmQ9YyxpfX1mdW5jdGlvbiBrKGUpe3ZhciBuPWUudGFnTmFtZSxjPWUudW5hcnlTbGFzaDtvJiYoInAiPT09ciYmd28obikmJkEocikscyhuKSYmcj09PW4mJkEobikpO2Zvcih2YXIgdT1hKG4pfHwhIWMsbD1lLmF0dHJzLmxlbmd0aCxmPW5ldyBBcnJheShsKSxwPTA7cDxsO3ArKyl7dmFyIGQ9ZS5hdHRyc1twXSx2PWRbM118fGRbNF18fGRbNV18fCIiLGg9ImEiPT09biYmImhyZWYiPT09ZFsxXT90LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzO2ZbcF09e25hbWU6ZFsxXSx2YWx1ZTpIbyh2LGgpfX11fHwoaS5wdXNoKHt0YWc6bixsb3dlckNhc2VkVGFnOm4udG9Mb3dlckNhc2UoKSxhdHRyczpmLHN0YXJ0OmUuc3RhcnQsZW5kOmUuZW5kfSkscj1uKSx0LnN0YXJ0JiZ0LnN0YXJ0KG4sZix1LGUuc3RhcnQsZS5lbmQpfWZ1bmN0aW9uIEEoZSxuLG8pe3ZhciBhLHM7aWYobnVsbD09biYmKG49YyksbnVsbD09byYmKG89YyksZSlmb3Iocz1lLnRvTG93ZXJDYXNlKCksYT1pLmxlbmd0aC0xO2E+PTAmJmlbYV0ubG93ZXJDYXNlZFRhZyE9PXM7YS0tKTtlbHNlIGE9MDtpZihhPj0wKXtmb3IodmFyIHU9aS5sZW5ndGgtMTt1Pj1hO3UtLSl0LmVuZCYmdC5lbmQoaVt1XS50YWcsbixvKTtpLmxlbmd0aD1hLHI9YSYmaVthLTFdLnRhZ31lbHNlImJyIj09PXM/dC5zdGFydCYmdC5zdGFydChlLFtdLCEwLG4sbyk6InAiPT09cyYmKHQuc3RhcnQmJnQuc3RhcnQoZSxbXSwhMSxuLG8pLHQuZW5kJiZ0LmVuZChlLG4sbykpfUEoKX0oZSx7d2FybjpCbyxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLG91dHB1dFNvdXJjZVJhbmdlOnQub3V0cHV0U291cmNlUmFuZ2Usc3RhcnQ6ZnVuY3Rpb24oZSxvLGEsbCxmKXt2YXIgcD1yJiZyLm5zfHxXbyhlKTtxJiYic3ZnIj09PXAmJihvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07eWEudGVzdChyLm5hbWUpfHwoci5uYW1lPXIubmFtZS5yZXBsYWNlKGdhLCIiKSx0LnB1c2gocikpfXJldHVybiB0fShvKSk7dmFyIGQsdj11YShlLG8scik7cCYmKHYubnM9cCksInN0eWxlIiE9PShkPXYpLnRhZyYmKCJzY3JpcHQiIT09ZC50YWd8fGQuYXR0cnNNYXAudHlwZSYmInRleHQvamF2YXNjcmlwdCIhPT1kLmF0dHJzTWFwLnR5cGUpfHx0ZSgpfHwodi5mb3JiaWRkZW49ITApO2Zvcih2YXIgaD0wO2g8Vm8ubGVuZ3RoO2grKyl2PVZvW2hdKHYsdCl8fHY7c3x8KCFmdW5jdGlvbihlKXtudWxsIT1GcihlLCJ2LXByZSIpJiYoZS5wcmU9ITApfSh2KSx2LnByZSYmKHM9ITApKSxKbyh2LnRhZykmJihjPSEwKSxzP2Z1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cnNMaXN0LG49dC5sZW5ndGg7aWYobilmb3IodmFyIHI9ZS5hdHRycz1uZXcgQXJyYXkobiksaT0wO2k8bjtpKyspcltpXT17bmFtZTp0W2ldLm5hbWUsdmFsdWU6SlNPTi5zdHJpbmdpZnkodFtpXS52YWx1ZSl9LG51bGwhPXRbaV0uc3RhcnQmJihyW2ldLnN0YXJ0PXRbaV0uc3RhcnQscltpXS5lbmQ9dFtpXS5lbmQpO2Vsc2UgZS5wcmV8fChlLnBsYWluPSEwKX0odik6di5wcm9jZXNzZWR8fChwYSh2KSxmdW5jdGlvbihlKXt2YXIgdD1GcihlLCJ2LWlmIik7aWYodCllLmlmPXQsZGEoZSx7ZXhwOnQsYmxvY2s6ZX0pO2Vsc2V7bnVsbCE9RnIoZSwidi1lbHNlIikmJihlLmVsc2U9ITApO3ZhciBuPUZyKGUsInYtZWxzZS1pZiIpO24mJihlLmVsc2VpZj1uKX19KHYpLGZ1bmN0aW9uKGUpe251bGwhPUZyKGUsInYtb25jZSIpJiYoZS5vbmNlPSEwKX0odikpLG58fChuPXYpLGE/dSh2KToocj12LGkucHVzaCh2KSl9LGVuZDpmdW5jdGlvbihlLHQsbil7dmFyIG89aVtpLmxlbmd0aC0xXTtpLmxlbmd0aC09MSxyPWlbaS5sZW5ndGgtMV0sdShvKX0sY2hhcnM6ZnVuY3Rpb24oZSx0LG4pe2lmKHImJighcXx8InRleHRhcmVhIiE9PXIudGFnfHxyLmF0dHJzTWFwLnBsYWNlaG9sZGVyIT09ZSkpe3ZhciBpLHUsbCxmPXIuY2hpbGRyZW47aWYoZT1jfHxlLnRyaW0oKT8ic2NyaXB0Ij09PShpPXIpLnRhZ3x8InN0eWxlIj09PWkudGFnP2U6c2EoZSk6Zi5sZW5ndGg/YT8iY29uZGVuc2UiPT09YSYmb2EudGVzdChlKT8iIjoiICI6bz8iICI6IiI6IiIpY3x8ImNvbmRlbnNlIiE9PWF8fChlPWUucmVwbGFjZShhYSwiICIpKSwhcyYmIiAiIT09ZSYmKHU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P2hvKHQpOnBvO2lmKG4udGVzdChlKSl7Zm9yKHZhciByLGksbyxhPVtdLHM9W10sYz1uLmxhc3RJbmRleD0wO3I9bi5leGVjKGUpOyl7KGk9ci5pbmRleCk+YyYmKHMucHVzaChvPWUuc2xpY2UoYyxpKSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KG8pKSk7dmFyIHU9QXIoclsxXS50cmltKCkpO2EucHVzaCgiX3MoIit1KyIpIikscy5wdXNoKHsiQGJpbmRpbmciOnV9KSxjPWkrclswXS5sZW5ndGh9cmV0dXJuIGM8ZS5sZW5ndGgmJihzLnB1c2gobz1lLnNsaWNlKGMpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkobykpKSx7ZXhwcmVzc2lvbjphLmpvaW4oIisiKSx0b2tlbnM6c319fShlLFVvKSk/bD17dHlwZToyLGV4cHJlc3Npb246dS5leHByZXNzaW9uLHRva2Vuczp1LnRva2Vucyx0ZXh0OmV9OiIgIj09PWUmJmYubGVuZ3RoJiYiICI9PT1mW2YubGVuZ3RoLTFdLnRleHR8fChsPXt0eXBlOjMsdGV4dDplfSksbCYmZi5wdXNoKGwpfX0sY29tbWVudDpmdW5jdGlvbihlLHQsbil7aWYocil7dmFyIGk9e3R5cGU6Myx0ZXh0OmUsaXNDb21tZW50OiEwfTtyLmNoaWxkcmVuLnB1c2goaSl9fX0pLG59ZnVuY3Rpb24gZmEoZSx0KXt2YXIgbixyOyhyPUlyKG49ZSwia2V5IikpJiYobi5rZXk9ciksZS5wbGFpbj0hZS5rZXkmJiFlLnNjb3BlZFNsb3RzJiYhZS5hdHRyc0xpc3QubGVuZ3RoLGZ1bmN0aW9uKGUpe3ZhciB0PUlyKGUsInJlZiIpO3QmJihlLnJlZj10LGUucmVmSW5Gb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtmb3IoO3Q7KXtpZih2b2lkIDAhPT10LmZvcilyZXR1cm4hMDt0PXQucGFyZW50fXJldHVybiExfShlKSl9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0OyJ0ZW1wbGF0ZSI9PT1lLnRhZz8odD1GcihlLCJzY29wZSIpLGUuc2xvdFNjb3BlPXR8fEZyKGUsInNsb3Qtc2NvcGUiKSk6KHQ9RnIoZSwic2xvdC1zY29wZSIpKSYmKGUuc2xvdFNjb3BlPXQpO3ZhciBuPUlyKGUsInNsb3QiKTtuJiYoZS5zbG90VGFyZ2V0PSciIic9PT1uPyciZGVmYXVsdCInOm4sZS5zbG90VGFyZ2V0RHluYW1pYz0hKCFlLmF0dHJzTWFwWyI6c2xvdCJdJiYhZS5hdHRyc01hcFsidi1iaW5kOnNsb3QiXSksInRlbXBsYXRlIj09PWUudGFnfHxlLnNsb3RTY29wZXx8TnIoZSwic2xvdCIsbixmdW5jdGlvbihlLHQpe3JldHVybiBlLnJhd0F0dHJzTWFwWyI6Iit0XXx8ZS5yYXdBdHRyc01hcFsidi1iaW5kOiIrdF18fGUucmF3QXR0cnNNYXBbdF19KGUsInNsb3QiKSkpO2lmKCJ0ZW1wbGF0ZSI9PT1lLnRhZyl7dmFyIHI9UHIoZSxpYSk7aWYocil7dmFyIGk9dmEociksbz1pLm5hbWUsYT1pLmR5bmFtaWM7ZS5zbG90VGFyZ2V0PW8sZS5zbG90VGFyZ2V0RHluYW1pYz1hLGUuc2xvdFNjb3BlPXIudmFsdWV8fGNhfX1lbHNle3ZhciBzPVByKGUsaWEpO2lmKHMpe3ZhciBjPWUuc2NvcGVkU2xvdHN8fChlLnNjb3BlZFNsb3RzPXt9KSx1PXZhKHMpLGw9dS5uYW1lLGY9dS5keW5hbWljLHA9Y1tsXT11YSgidGVtcGxhdGUiLFtdLGUpO3Auc2xvdFRhcmdldD1sLHAuc2xvdFRhcmdldER5bmFtaWM9ZixwLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKCFlLnNsb3RTY29wZSlyZXR1cm4gZS5wYXJlbnQ9cCwhMH0pLHAuc2xvdFNjb3BlPXMudmFsdWV8fGNhLGUuY2hpbGRyZW49W10sZS5wbGFpbj0hMX19fShlKSxmdW5jdGlvbihlKXsic2xvdCI9PT1lLnRhZyYmKGUuc2xvdE5hbWU9SXIoZSwibmFtZSIpKX0oZSksZnVuY3Rpb24oZSl7dmFyIHQ7KHQ9SXIoZSwiaXMiKSkmJihlLmNvbXBvbmVudD10KTtudWxsIT1GcihlLCJpbmxpbmUtdGVtcGxhdGUiKSYmKGUuaW5saW5lVGVtcGxhdGU9ITApfShlKTtmb3IodmFyIGk9MDtpPHpvLmxlbmd0aDtpKyspZT16b1tpXShlLHQpfHxlO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHU9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYocj1pPXVbdF0ubmFtZSxvPXVbdF0udmFsdWUsR28udGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLChhPWhhKHIucmVwbGFjZShHbywiIikpKSYmKHI9ci5yZXBsYWNlKHJhLCIiKSksbmEudGVzdChyKSlyPXIucmVwbGFjZShuYSwiIiksbz1BcihvKSwoYz1lYS50ZXN0KHIpKSYmKHI9ci5zbGljZSgxLC0xKSksYSYmKGEucHJvcCYmIWMmJiJpbm5lckh0bWwiPT09KHI9YihyKSkmJihyPSJpbm5lckhUTUwiKSxhLmNhbWVsJiYhYyYmKHI9YihyKSksYS5zeW5jJiYocz1CcihvLCIkZXZlbnQiKSxjP01yKGUsJyJ1cGRhdGU6IisoJytyKyIpIixzLG51bGwsITEsMCx1W3RdLCEwKTooTXIoZSwidXBkYXRlOiIrYihyKSxzLG51bGwsITEsMCx1W3RdKSxDKHIpIT09YihyKSYmTXIoZSwidXBkYXRlOiIrQyhyKSxzLG51bGwsITEsMCx1W3RdKSkpKSxhJiZhLnByb3B8fCFlLmNvbXBvbmVudCYmcW8oZS50YWcsZS5hdHRyc01hcC50eXBlLHIpP0VyKGUscixvLHVbdF0sYyk6TnIoZSxyLG8sdVt0XSxjKTtlbHNlIGlmKFpvLnRlc3Qocikpcj1yLnJlcGxhY2UoWm8sIiIpLChjPWVhLnRlc3QocikpJiYocj1yLnNsaWNlKDEsLTEpKSxNcihlLHIsbyxhLCExLDAsdVt0XSxjKTtlbHNle3ZhciBsPShyPXIucmVwbGFjZShHbywiIikpLm1hdGNoKHRhKSxmPWwmJmxbMV07Yz0hMSxmJiYocj1yLnNsaWNlKDAsLShmLmxlbmd0aCsxKSksZWEudGVzdChmKSYmKGY9Zi5zbGljZSgxLC0xKSxjPSEwKSksRHIoZSxyLGksbyxmLGMsYSx1W3RdKX1lbHNlIE5yKGUscixKU09OLnN0cmluZ2lmeShvKSx1W3RdKSwhZS5jb21wb25lbnQmJiJtdXRlZCI9PT1yJiZxbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscikmJkVyKGUsciwidHJ1ZSIsdVt0XSl9KGUpLGV9ZnVuY3Rpb24gcGEoZSl7dmFyIHQ7aWYodD1GcihlLCJ2LWZvciIpKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKFhvKTtpZighdClyZXR1cm47dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShRbywiIiksaT1yLm1hdGNoKFlvKTtpPyhuLmFsaWFzPXIucmVwbGFjZShZbywiIikudHJpbSgpLG4uaXRlcmF0b3IxPWlbMV0udHJpbSgpLGlbMl0mJihuLml0ZXJhdG9yMj1pWzJdLnRyaW0oKSkpOm4uYWxpYXM9cjtyZXR1cm4gbn0odCk7biYmQShlLG4pfX1mdW5jdGlvbiBkYShlLHQpe2UuaWZDb25kaXRpb25zfHwoZS5pZkNvbmRpdGlvbnM9W10pLGUuaWZDb25kaXRpb25zLnB1c2godCl9ZnVuY3Rpb24gdmEoZSl7dmFyIHQ9ZS5uYW1lLnJlcGxhY2UoaWEsIiIpO3JldHVybiB0fHwiIyIhPT1lLm5hbWVbMF0mJih0PSJkZWZhdWx0IiksZWEudGVzdCh0KT97bmFtZTp0LnNsaWNlKDEsLTEpLGR5bmFtaWM6ITB9OntuYW1lOiciJyt0KyciJyxkeW5hbWljOiExfX1mdW5jdGlvbiBoYShlKXt2YXIgdD1lLm1hdGNoKHJhKTtpZih0KXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZS5zbGljZSgxKV09ITB9KSxufX1mdW5jdGlvbiBtYShlKXtmb3IodmFyIHQ9e30sbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W2Vbbl0ubmFtZV09ZVtuXS52YWx1ZTtyZXR1cm4gdH12YXIgeWE9L154bWxuczpOU1xkKy8sZ2E9L15OU1xkKzovO2Z1bmN0aW9uIF9hKGUpe3JldHVybiB1YShlLnRhZyxlLmF0dHJzTGlzdC5zbGljZSgpLGUucGFyZW50KX12YXIgYmE9W21vLGdvLHtwcmVUcmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0Ij09PWUudGFnKXt2YXIgbixyPWUuYXR0cnNNYXA7aWYoIXJbInYtbW9kZWwiXSlyZXR1cm47aWYoKHJbIjp0eXBlIl18fHJbInYtYmluZDp0eXBlIl0pJiYobj1JcihlLCJ0eXBlIikpLHIudHlwZXx8bnx8IXJbInYtYmluZCJdfHwobj0iKCIrclsidi1iaW5kIl0rIikudHlwZSIpLG4pe3ZhciBpPUZyKGUsInYtaWYiLCEwKSxvPWk/IiYmKCIraSsiKSI6IiIsYT1udWxsIT1GcihlLCJ2LWVsc2UiLCEwKSxzPUZyKGUsInYtZWxzZS1pZiIsITApLGM9X2EoZSk7cGEoYyksanIoYywidHlwZSIsImNoZWNrYm94IiksZmEoYyx0KSxjLnByb2Nlc3NlZD0hMCxjLmlmPSIoIituKyIpPT09J2NoZWNrYm94JyIrbyxkYShjLHtleHA6Yy5pZixibG9jazpjfSk7dmFyIHU9X2EoZSk7RnIodSwidi1mb3IiLCEwKSxqcih1LCJ0eXBlIiwicmFkaW8iKSxmYSh1LHQpLGRhKGMse2V4cDoiKCIrbisiKT09PSdyYWRpbyciK28sYmxvY2s6dX0pO3ZhciBsPV9hKGUpO3JldHVybiBGcihsLCJ2LWZvciIsITApLGpyKGwsIjp0eXBlIixuKSxmYShsLHQpLGRhKGMse2V4cDppLGJsb2NrOmx9KSxhP2MuZWxzZT0hMDpzJiYoYy5lbHNlaWY9cyksY319fX1dO3ZhciAkYSx3YSxDYT17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOmJhLGRpcmVjdGl2ZXM6e21vZGVsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9dC5tb2RpZmllcnMsbz1lLnRhZyxhPWUuYXR0cnNNYXAudHlwZTtpZihlLmNvbXBvbmVudClyZXR1cm4gSHIoZSxyLGkpLCExO2lmKCJzZWxlY3QiPT09bykhZnVuY3Rpb24oZSx0LG4pe3ZhciByPSd2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VsZWN0ZWR9KS5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9ICJfdmFsdWUiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7cmV0dXJuICcrKG4mJm4ubnVtYmVyPyJfbih2YWwpIjoidmFsIikrIn0pOyI7cj1yKyIgIitCcih0LCIkZXZlbnQudGFyZ2V0Lm11bHRpcGxlID8gJCRzZWxlY3RlZFZhbCA6ICQkc2VsZWN0ZWRWYWxbMF0iKSxNcihlLCJjaGFuZ2UiLHIsbnVsbCwhMCl9KGUscixpKTtlbHNlIGlmKCJpbnB1dCI9PT1vJiYiY2hlY2tib3giPT09YSkhZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4mJm4ubnVtYmVyLGk9SXIoZSwidmFsdWUiKXx8Im51bGwiLG89SXIoZSwidHJ1ZS12YWx1ZSIpfHwidHJ1ZSIsYT1JcihlLCJmYWxzZS12YWx1ZSIpfHwiZmFsc2UiO0VyKGUsImNoZWNrZWQiLCJBcnJheS5pc0FycmF5KCIrdCsiKT9faSgiK3QrIiwiK2krIik+LTEiKygidHJ1ZSI9PT1vPyI6KCIrdCsiKSI6IjpfcSgiK3QrIiwiK28rIikiKSksTXIoZSwiY2hhbmdlIiwidmFyICQkYT0iK3QrIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oIitvKyIpOigiK2ErIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PSIrKHI/Il9uKCIraSsiKSI6aSkrIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIrQnIodCwiJCRhLmNvbmNhdChbJCR2XSkiKSsiKX1lbHNleyQkaT4tMSYmKCIrQnIodCwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkiKSsiKX19ZWxzZXsiK0JyKHQsIiQkYyIpKyJ9IixudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW8mJiJyYWRpbyI9PT1hKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsaT1JcihlLCJ2YWx1ZSIpfHwibnVsbCI7RXIoZSwiY2hlY2tlZCIsIl9xKCIrdCsiLCIrKGk9cj8iX24oIitpKyIpIjppKSsiKSIpLE1yKGUsImNoYW5nZSIsQnIodCxpKSxudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW98fCJ0ZXh0YXJlYSI9PT1vKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5hdHRyc01hcC50eXBlLGk9bnx8e30sbz1pLmxhenksYT1pLm51bWJlcixzPWkudHJpbSxjPSFvJiYicmFuZ2UiIT09cix1PW8/ImNoYW5nZSI6InJhbmdlIj09PXI/V3I6ImlucHV0IixsPSIkZXZlbnQudGFyZ2V0LnZhbHVlIjtzJiYobD0iJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKCkiKSxhJiYobD0iX24oIitsKyIpIik7dmFyIGY9QnIodCxsKTtjJiYoZj0iaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIrZiksRXIoZSwidmFsdWUiLCIoIit0KyIpIiksTXIoZSx1LGYsbnVsbCwhMCksKHN8fGEpJiZNcihlLCJibHVyIiwiJGZvcmNlVXBkYXRlKCkiKX0oZSxyLGkpO2Vsc2UgaWYoIUYuaXNSZXNlcnZlZFRhZyhvKSlyZXR1cm4gSHIoZSxyLGkpLCExO3JldHVybiEwfSx0ZXh0OmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwidGV4dENvbnRlbnQiLCJfcygiK3QudmFsdWUrIikiLHQpfSxodG1sOmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwiaW5uZXJIVE1MIiwiX3MoIit0LnZhbHVlKyIpIix0KX19LGlzUHJlVGFnOmZ1bmN0aW9uKGUpe3JldHVybiJwcmUiPT09ZX0saXNVbmFyeVRhZzpibyxtdXN0VXNlUHJvcDpqbixjYW5CZUxlZnRPcGVuVGFnOiRvLGlzUmVzZXJ2ZWRUYWc6V24sZ2V0VGFnTmFtZXNwYWNlOlpuLHN0YXRpY0tleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQuc3RhdGljS2V5c3x8W10pfSxbXSkuam9pbigiLCIpfShiYSl9LHhhPWcoZnVuY3Rpb24oZSl7cmV0dXJuIHAoInR5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMsc3RhcnQsZW5kLHJhd0F0dHJzTWFwIisoZT8iLCIrZToiIikpfSk7ZnVuY3Rpb24ga2EoZSx0KXtlJiYoJGE9eGEodC5zdGF0aWNLZXlzfHwiIiksd2E9dC5pc1Jlc2VydmVkVGFnfHxULGZ1bmN0aW9uIGUodCl7dC5zdGF0aWM9ZnVuY3Rpb24oZSl7aWYoMj09PWUudHlwZSlyZXR1cm4hMTtpZigzPT09ZS50eXBlKXJldHVybiEwO3JldHVybiEoIWUucHJlJiYoZS5oYXNCaW5kaW5nc3x8ZS5pZnx8ZS5mb3J8fGQoZS50YWcpfHwhd2EoZS50YWcpfHxmdW5jdGlvbihlKXtmb3IoO2UucGFyZW50Oyl7aWYoInRlbXBsYXRlIiE9PShlPWUucGFyZW50KS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9KGUpfHwhT2JqZWN0LmtleXMoZSkuZXZlcnkoJGEpKSl9KHQpO2lmKDE9PT10LnR5cGUpe2lmKCF3YSh0LnRhZykmJiJzbG90IiE9PXQudGFnJiZudWxsPT10LmF0dHJzTWFwWyJpbmxpbmUtdGVtcGxhdGUiXSlyZXR1cm47Zm9yKHZhciBuPTAscj10LmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXt2YXIgaT10LmNoaWxkcmVuW25dO2UoaSksaS5zdGF0aWN8fCh0LnN0YXRpYz0hMSl9aWYodC5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsYT10LmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxhO28rKyl7dmFyIHM9dC5pZkNvbmRpdGlvbnNbb10uYmxvY2s7ZShzKSxzLnN0YXRpY3x8KHQuc3RhdGljPSExKX19fShlKSxmdW5jdGlvbiBlKHQsbil7aWYoMT09PXQudHlwZSl7aWYoKHQuc3RhdGljfHx0Lm9uY2UpJiYodC5zdGF0aWNJbkZvcj1uKSx0LnN0YXRpYyYmdC5jaGlsZHJlbi5sZW5ndGgmJigxIT09dC5jaGlsZHJlbi5sZW5ndGh8fDMhPT10LmNoaWxkcmVuWzBdLnR5cGUpKXJldHVybiB2b2lkKHQuc3RhdGljUm9vdD0hMCk7aWYodC5zdGF0aWNSb290PSExLHQuY2hpbGRyZW4pZm9yKHZhciByPTAsaT10LmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWUodC5jaGlsZHJlbltyXSxufHwhIXQuZm9yKTtpZih0LmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxhPXQuaWZDb25kaXRpb25zLmxlbmd0aDtvPGE7bysrKWUodC5pZkNvbmRpdGlvbnNbb10uYmxvY2ssbil9fShlLCExKSl9dmFyIEFhPS9eKFtcdyRfXSt8XChbXildKj9cKSlccyo9PnxeZnVuY3Rpb24oPzpccytbXHckXSspP1xzKlwoLyxPYT0vXChbXildKj9cKTsqJC8sU2E9L15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLyxUYT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxFYT17ZXNjOlsiRXNjIiwiRXNjYXBlIl0sdGFiOiJUYWIiLGVudGVyOiJFbnRlciIsc3BhY2U6WyIgIiwiU3BhY2ViYXIiXSx1cDpbIlVwIiwiQXJyb3dVcCJdLGxlZnQ6WyJMZWZ0IiwiQXJyb3dMZWZ0Il0scmlnaHQ6WyJSaWdodCIsIkFycm93UmlnaHQiXSxkb3duOlsiRG93biIsIkFycm93RG93biJdLGRlbGV0ZTpbIkJhY2tzcGFjZSIsIkRlbGV0ZSIsIkRlbCJdfSxOYT1mdW5jdGlvbihlKXtyZXR1cm4iaWYoIitlKyIpcmV0dXJuIG51bGw7In0samE9e3N0b3A6IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiLHByZXZlbnQ6IiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIsc2VsZjpOYSgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSxjdHJsOk5hKCIhJGV2ZW50LmN0cmxLZXkiKSxzaGlmdDpOYSgiISRldmVudC5zaGlmdEtleSIpLGFsdDpOYSgiISRldmVudC5hbHRLZXkiKSxtZXRhOk5hKCIhJGV2ZW50Lm1ldGFLZXkiKSxsZWZ0Ok5hKCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMCIpLG1pZGRsZTpOYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSxyaWdodDpOYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDIiKX07ZnVuY3Rpb24gRGEoZSx0KXt2YXIgbj10PyJuYXRpdmVPbjoiOiJvbjoiLHI9IiIsaT0iIjtmb3IodmFyIG8gaW4gZSl7dmFyIGE9TGEoZVtvXSk7ZVtvXSYmZVtvXS5keW5hbWljP2krPW8rIiwiK2ErIiwiOnIrPSciJytvKyciOicrYSsiLCJ9cmV0dXJuIHI9InsiK3Iuc2xpY2UoMCwtMSkrIn0iLGk/bisiX2QoIityKyIsWyIraS5zbGljZSgwLC0xKSsiXSkiOm4rcn1mdW5jdGlvbiBMYShlKXtpZighZSlyZXR1cm4iZnVuY3Rpb24oKXt9IjtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiJbIitlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTGEoZSl9KS5qb2luKCIsIikrIl0iO3ZhciB0PVNhLnRlc3QoZS52YWx1ZSksbj1BYS50ZXN0KGUudmFsdWUpLHI9U2EudGVzdChlLnZhbHVlLnJlcGxhY2UoT2EsIiIpKTtpZihlLm1vZGlmaWVycyl7dmFyIGk9IiIsbz0iIixhPVtdO2Zvcih2YXIgcyBpbiBlLm1vZGlmaWVycylpZihqYVtzXSlvKz1qYVtzXSxUYVtzXSYmYS5wdXNoKHMpO2Vsc2UgaWYoImV4YWN0Ij09PXMpe3ZhciBjPWUubW9kaWZpZXJzO28rPU5hKFsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hY1tlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJGV2ZW50LiIrZSsiS2V5In0pLmpvaW4oInx8IikpfWVsc2UgYS5wdXNoKHMpO3JldHVybiBhLmxlbmd0aCYmKGkrPWZ1bmN0aW9uKGUpe3JldHVybiJpZighJGV2ZW50LnR5cGUuaW5kZXhPZigna2V5JykmJiIrZS5tYXAoTWEpLmpvaW4oIiYmIikrIilyZXR1cm4gbnVsbDsifShhKSksbyYmKGkrPW8pLCJmdW5jdGlvbigkZXZlbnQpeyIraSsodD8icmV0dXJuICIrZS52YWx1ZSsiKCRldmVudCkiOm4/InJldHVybiAoIitlLnZhbHVlKyIpKCRldmVudCkiOnI/InJldHVybiAiK2UudmFsdWU6ZS52YWx1ZSkrIn0ifXJldHVybiB0fHxuP2UudmFsdWU6ImZ1bmN0aW9uKCRldmVudCl7Iisocj8icmV0dXJuICIrZS52YWx1ZTplLnZhbHVlKSsifSJ9ZnVuY3Rpb24gTWEoZSl7dmFyIHQ9cGFyc2VJbnQoZSwxMCk7aWYodClyZXR1cm4iJGV2ZW50LmtleUNvZGUhPT0iK3Q7dmFyIG49VGFbZV0scj1FYVtlXTtyZXR1cm4iX2soJGV2ZW50LmtleUNvZGUsIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkobikrIiwkZXZlbnQua2V5LCIrSlNPTi5zdHJpbmdpZnkocikrIikifXZhciBJYT17b246ZnVuY3Rpb24oZSx0KXtlLndyYXBMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIl9nKCIrZSsiLCIrdC52YWx1ZSsiKSJ9fSxiaW5kOmZ1bmN0aW9uKGUsdCl7ZS53cmFwRGF0YT1mdW5jdGlvbihuKXtyZXR1cm4iX2IoIituKyIsJyIrZS50YWcrIicsIit0LnZhbHVlKyIsIisodC5tb2RpZmllcnMmJnQubW9kaWZpZXJzLnByb3A/InRydWUiOiJmYWxzZSIpKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMuc3luYz8iLHRydWUiOiIiKSsiKSJ9fSxjbG9hazpTfSxGYT1mdW5jdGlvbihlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLndhcm49ZS53YXJufHxTcix0aGlzLnRyYW5zZm9ybXM9VHIoZS5tb2R1bGVzLCJ0cmFuc2Zvcm1Db2RlIiksdGhpcy5kYXRhR2VuRm5zPVRyKGUubW9kdWxlcywiZ2VuRGF0YSIpLHRoaXMuZGlyZWN0aXZlcz1BKEEoe30sSWEpLGUuZGlyZWN0aXZlcyk7dmFyIHQ9ZS5pc1Jlc2VydmVkVGFnfHxUO3RoaXMubWF5YmVDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmNvbXBvbmVudHx8IXQoZS50YWcpfSx0aGlzLm9uY2VJZD0wLHRoaXMuc3RhdGljUmVuZGVyRm5zPVtdLHRoaXMucHJlPSExfTtmdW5jdGlvbiBQYShlLHQpe3ZhciBuPW5ldyBGYSh0KTtyZXR1cm57cmVuZGVyOiJ3aXRoKHRoaXMpe3JldHVybiAiKyhlP1JhKGUsbik6J19jKCJkaXYiKScpKyJ9IixzdGF0aWNSZW5kZXJGbnM6bi5zdGF0aWNSZW5kZXJGbnN9fWZ1bmN0aW9uIFJhKGUsdCl7aWYoZS5wYXJlbnQmJihlLnByZT1lLnByZXx8ZS5wYXJlbnQucHJlKSxlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gSGEoZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIEJhKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0KTtpZihlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVWEoZSx0KTtpZigidGVtcGxhdGUiIT09ZS50YWd8fGUuc2xvdFRhcmdldHx8dC5wcmUpe2lmKCJzbG90Ij09PWUudGFnKXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2xvdE5hbWV8fCciZGVmYXVsdCInLHI9cWEoZSx0KSxpPSJfdCgiK24rKHI/IiwiK3I6IiIpLG89ZS5hdHRyc3x8ZS5keW5hbWljQXR0cnM/R2EoKGUuYXR0cnN8fFtdKS5jb25jYXQoZS5keW5hbWljQXR0cnN8fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6YihlLm5hbWUpLHZhbHVlOmUudmFsdWUsZHluYW1pYzplLmR5bmFtaWN9fSkpOm51bGwsYT1lLmF0dHJzTWFwWyJ2LWJpbmQiXTshbyYmIWF8fHJ8fChpKz0iLG51bGwiKTtvJiYoaSs9IiwiK28pO2EmJihpKz0obz8iIjoiLG51bGwiKSsiLCIrYSk7cmV0dXJuIGkrIikifShlLHQpO3ZhciBuO2lmKGUuY29tcG9uZW50KW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuaW5saW5lVGVtcGxhdGU/bnVsbDpxYSh0LG4sITApO3JldHVybiJfYygiK2UrIiwiK1ZhKHQsbikrKHI/IiwiK3I6IiIpKyIpIn0oZS5jb21wb25lbnQsZSx0KTtlbHNle3ZhciByOyghZS5wbGFpbnx8ZS5wcmUmJnQubWF5YmVDb21wb25lbnQoZSkpJiYocj1WYShlLHQpKTt2YXIgaT1lLmlubGluZVRlbXBsYXRlP251bGw6cWEoZSx0LCEwKTtuPSJfYygnIitlLnRhZysiJyIrKHI/IiwiK3I6IiIpKyhpPyIsIitpOiIiKSsiKSJ9Zm9yKHZhciBvPTA7bzx0LnRyYW5zZm9ybXMubGVuZ3RoO28rKyluPXQudHJhbnNmb3Jtc1tvXShlLG4pO3JldHVybiBufXJldHVybiBxYShlLHQpfHwidm9pZCAwIn1mdW5jdGlvbiBIYShlLHQpe2Uuc3RhdGljUHJvY2Vzc2VkPSEwO3ZhciBuPXQucHJlO3JldHVybiBlLnByZSYmKHQucHJlPWUucHJlKSx0LnN0YXRpY1JlbmRlckZucy5wdXNoKCJ3aXRoKHRoaXMpe3JldHVybiAiK1JhKGUsdCkrIn0iKSx0LnByZT1uLCJfbSgiKyh0LnN0YXRpY1JlbmRlckZucy5sZW5ndGgtMSkrKGUuc3RhdGljSW5Gb3I/Iix0cnVlIjoiIikrIikifWZ1bmN0aW9uIEJhKGUsdCl7aWYoZS5vbmNlUHJvY2Vzc2VkPSEwLGUuaWYmJiFlLmlmUHJvY2Vzc2VkKXJldHVybiBVYShlLHQpO2lmKGUuc3RhdGljSW5Gb3Ipe2Zvcih2YXIgbj0iIixyPWUucGFyZW50O3I7KXtpZihyLmZvcil7bj1yLmtleTticmVha31yPXIucGFyZW50fXJldHVybiBuPyJfbygiK1JhKGUsdCkrIiwiK3Qub25jZUlkKysrIiwiK24rIikiOlJhKGUsdCl9cmV0dXJuIEhhKGUsdCl9ZnVuY3Rpb24gVWEoZSx0LG4scil7cmV0dXJuIGUuaWZQcm9jZXNzZWQ9ITAsZnVuY3Rpb24gZSh0LG4scixpKXtpZighdC5sZW5ndGgpcmV0dXJuIGl8fCJfZSgpIjt2YXIgbz10LnNoaWZ0KCk7cmV0dXJuIG8uZXhwPyIoIitvLmV4cCsiKT8iK2Eoby5ibG9jaykrIjoiK2UodCxuLHIsaSk6IiIrYShvLmJsb2NrKTtmdW5jdGlvbiBhKGUpe3JldHVybiByP3IoZSxuKTplLm9uY2U/QmEoZSxuKTpSYShlLG4pfX0oZS5pZkNvbmRpdGlvbnMuc2xpY2UoKSx0LG4scil9ZnVuY3Rpb24gemEoZSx0LG4scil7dmFyIGk9ZS5mb3Isbz1lLmFsaWFzLGE9ZS5pdGVyYXRvcjE/IiwiK2UuaXRlcmF0b3IxOiIiLHM9ZS5pdGVyYXRvcjI/IiwiK2UuaXRlcmF0b3IyOiIiO3JldHVybiBlLmZvclByb2Nlc3NlZD0hMCwocnx8Il9sIikrIigoIitpKyIpLGZ1bmN0aW9uKCIrbythK3MrIil7cmV0dXJuICIrKG58fFJhKShlLHQpKyJ9KSJ9ZnVuY3Rpb24gVmEoZSx0KXt2YXIgbj0ieyIscj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZGlyZWN0aXZlcztpZighbilyZXR1cm47dmFyIHIsaSxvLGEscz0iZGlyZWN0aXZlczpbIixjPSExO2ZvcihyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXtvPW5bcl0sYT0hMDt2YXIgdT10LmRpcmVjdGl2ZXNbby5uYW1lXTt1JiYoYT0hIXUoZSxvLHQud2FybikpLGEmJihjPSEwLHMrPSd7bmFtZToiJytvLm5hbWUrJyIscmF3TmFtZToiJytvLnJhd05hbWUrJyInKyhvLnZhbHVlPyIsdmFsdWU6KCIrby52YWx1ZSsiKSxleHByZXNzaW9uOiIrSlNPTi5zdHJpbmdpZnkoby52YWx1ZSk6IiIpKyhvLmFyZz8iLGFyZzoiKyhvLmlzRHluYW1pY0FyZz9vLmFyZzonIicrby5hcmcrJyInKToiIikrKG8ubW9kaWZpZXJzPyIsbW9kaWZpZXJzOiIrSlNPTi5zdHJpbmdpZnkoby5tb2RpZmllcnMpOiIiKSsifSwiKX1pZihjKXJldHVybiBzLnNsaWNlKDAsLTEpKyJdIn0oZSx0KTtyJiYobis9cisiLCIpLGUua2V5JiYobis9ImtleToiK2Uua2V5KyIsIiksZS5yZWYmJihuKz0icmVmOiIrZS5yZWYrIiwiKSxlLnJlZkluRm9yJiYobis9InJlZkluRm9yOnRydWUsIiksZS5wcmUmJihuKz0icHJlOnRydWUsIiksZS5jb21wb25lbnQmJihuKz0ndGFnOiInK2UudGFnKyciLCcpO2Zvcih2YXIgaT0wO2k8dC5kYXRhR2VuRm5zLmxlbmd0aDtpKyspbis9dC5kYXRhR2VuRm5zW2ldKGUpO2lmKGUuYXR0cnMmJihuKz0iYXR0cnM6IitHYShlLmF0dHJzKSsiLCIpLGUucHJvcHMmJihuKz0iZG9tUHJvcHM6IitHYShlLnByb3BzKSsiLCIpLGUuZXZlbnRzJiYobis9RGEoZS5ldmVudHMsITEpKyIsIiksZS5uYXRpdmVFdmVudHMmJihuKz1EYShlLm5hdGl2ZUV2ZW50cywhMCkrIiwiKSxlLnNsb3RUYXJnZXQmJiFlLnNsb3RTY29wZSYmKG4rPSJzbG90OiIrZS5zbG90VGFyZ2V0KyIsIiksZS5zY29wZWRTbG90cyYmKG4rPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmZvcnx8T2JqZWN0LmtleXModCkuc29tZShmdW5jdGlvbihlKXt2YXIgbj10W2VdO3JldHVybiBuLnNsb3RUYXJnZXREeW5hbWljfHxuLmlmfHxuLmZvcnx8S2Eobil9KSxpPSEhZS5pZjtpZighcilmb3IodmFyIG89ZS5wYXJlbnQ7bzspe2lmKG8uc2xvdFNjb3BlJiZvLnNsb3RTY29wZSE9PWNhfHxvLmZvcil7cj0hMDticmVha31vLmlmJiYoaT0hMCksbz1vLnBhcmVudH12YXIgYT1PYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIEphKHRbZV0sbil9KS5qb2luKCIsIik7cmV0dXJuInNjb3BlZFNsb3RzOl91KFsiK2ErIl0iKyhyPyIsbnVsbCx0cnVlIjoiIikrKCFyJiZpPyIsbnVsbCxmYWxzZSwiK2Z1bmN0aW9uKGUpe3ZhciB0PTUzODEsbj1lLmxlbmd0aDtmb3IoO247KXQ9MzMqdF5lLmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gdD4+PjB9KGEpOiIiKSsiKSJ9KGUsZS5zY29wZWRTbG90cyx0KSsiLCIpLGUubW9kZWwmJihuKz0ibW9kZWw6e3ZhbHVlOiIrZS5tb2RlbC52YWx1ZSsiLGNhbGxiYWNrOiIrZS5tb2RlbC5jYWxsYmFjaysiLGV4cHJlc3Npb246IitlLm1vZGVsLmV4cHJlc3Npb24rIn0sIiksZS5pbmxpbmVUZW1wbGF0ZSl7dmFyIG89ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuWzBdO2lmKG4mJjE9PT1uLnR5cGUpe3ZhciByPVBhKG4sdC5vcHRpb25zKTtyZXR1cm4iaW5saW5lVGVtcGxhdGU6e3JlbmRlcjpmdW5jdGlvbigpeyIrci5yZW5kZXIrIn0sc3RhdGljUmVuZGVyRm5zOlsiK3Iuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24oKXsiK2UrIn0ifSkuam9pbigiLCIpKyJdfSJ9fShlLHQpO28mJihuKz1vKyIsIil9cmV0dXJuIG49bi5yZXBsYWNlKC8sJC8sIiIpKyJ9IixlLmR5bmFtaWNBdHRycyYmKG49Il9iKCIrbisnLCInK2UudGFnKyciLCcrR2EoZS5keW5hbWljQXR0cnMpKyIpIiksZS53cmFwRGF0YSYmKG49ZS53cmFwRGF0YShuKSksZS53cmFwTGlzdGVuZXJzJiYobj1lLndyYXBMaXN0ZW5lcnMobikpLG59ZnVuY3Rpb24gS2EoZSl7cmV0dXJuIDE9PT1lLnR5cGUmJigic2xvdCI9PT1lLnRhZ3x8ZS5jaGlsZHJlbi5zb21lKEthKSl9ZnVuY3Rpb24gSmEoZSx0KXt2YXIgbj1lLmF0dHJzTWFwWyJzbG90LXNjb3BlIl07aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQmJiFuKXJldHVybiBVYShlLHQsSmEsIm51bGwiKTtpZihlLmZvciYmIWUuZm9yUHJvY2Vzc2VkKXJldHVybiB6YShlLHQsSmEpO3ZhciByPWUuc2xvdFNjb3BlPT09Y2E/IiI6U3RyaW5nKGUuc2xvdFNjb3BlKSxpPSJmdW5jdGlvbigiK3IrIil7cmV0dXJuICIrKCJ0ZW1wbGF0ZSI9PT1lLnRhZz9lLmlmJiZuPyIoIitlLmlmKyIpPyIrKHFhKGUsdCl8fCJ1bmRlZmluZWQiKSsiOnVuZGVmaW5lZCI6cWEoZSx0KXx8InVuZGVmaW5lZCI6UmEoZSx0KSkrIn0iLG89cj8iIjoiLHByb3h5OnRydWUiO3JldHVybiJ7a2V5OiIrKGUuc2xvdFRhcmdldHx8JyJkZWZhdWx0IicpKyIsZm46IitpK28rIn0ifWZ1bmN0aW9uIHFhKGUsdCxuLHIsaSl7dmFyIG89ZS5jaGlsZHJlbjtpZihvLmxlbmd0aCl7dmFyIGE9b1swXTtpZigxPT09by5sZW5ndGgmJmEuZm9yJiYidGVtcGxhdGUiIT09YS50YWcmJiJzbG90IiE9PWEudGFnKXt2YXIgcz1uP3QubWF5YmVDb21wb25lbnQoYSk/IiwxIjoiLDAiOiIiO3JldHVybiIiKyhyfHxSYSkoYSx0KStzfXZhciBjPW4/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aWYoMT09PWkudHlwZSl7aWYoV2EoaSl8fGkuaWZDb25kaXRpb25zJiZpLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBXYShlLmJsb2NrKX0pKXtuPTI7YnJlYWt9KHQoaSl8fGkuaWZDb25kaXRpb25zJiZpLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUuYmxvY2spfSkpJiYobj0xKX19cmV0dXJuIG59KG8sdC5tYXliZUNvbXBvbmVudCk6MCx1PWl8fFphO3JldHVybiJbIitvLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdShlLHQpfSkuam9pbigiLCIpKyJdIisoYz8iLCIrYzoiIil9fWZ1bmN0aW9uIFdhKGUpe3JldHVybiB2b2lkIDAhPT1lLmZvcnx8InRlbXBsYXRlIj09PWUudGFnfHwic2xvdCI9PT1lLnRhZ31mdW5jdGlvbiBaYShlLHQpe3JldHVybiAxPT09ZS50eXBlP1JhKGUsdCk6Mz09PWUudHlwZSYmZS5pc0NvbW1lbnQ/KHI9ZSwiX2UoIitKU09OLnN0cmluZ2lmeShyLnRleHQpKyIpIik6Il92KCIrKDI9PT0obj1lKS50eXBlP24uZXhwcmVzc2lvbjpYYShKU09OLnN0cmluZ2lmeShuLnRleHQpKSkrIikiO3ZhciBuLHJ9ZnVuY3Rpb24gR2EoZSl7Zm9yKHZhciB0PSIiLG49IiIscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdLG89WGEoaS52YWx1ZSk7aS5keW5hbWljP24rPWkubmFtZSsiLCIrbysiLCI6dCs9JyInK2kubmFtZSsnIjonK28rIiwifXJldHVybiB0PSJ7Iit0LnNsaWNlKDAsLTEpKyJ9IixuPyJfZCgiK3QrIixbIituLnNsaWNlKDAsLTEpKyJdKSI6dH1mdW5jdGlvbiBYYShlKXtyZXR1cm4gZS5yZXBsYWNlKC9cdTIwMjgvZywiXFx1MjAyOCIpLnJlcGxhY2UoL1x1MjAyOS9nLCJcXHUyMDI5Iil9bmV3IFJlZ0V4cCgiXFxiIisiZG8saWYsZm9yLGxldCxuZXcsdHJ5LHZhcixjYXNlLGVsc2Usd2l0aCxhd2FpdCxicmVhayxjYXRjaCxjbGFzcyxjb25zdCxzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsZXh0ZW5kcyxmaW5hbGx5LGNvbnRpbnVlLGRlYnVnZ2VyLGZ1bmN0aW9uLGFyZ3VtZW50cyIuc3BsaXQoIiwiKS5qb2luKCJcXGJ8XFxiIikrIlxcYiIpO2Z1bmN0aW9uIFlhKGUsdCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oZSl9Y2F0Y2gobil7cmV0dXJuIHQucHVzaCh7ZXJyOm4sY29kZTplfSksU319ZnVuY3Rpb24gUWEoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obixyLGkpeyhyPUEoe30scikpLndhcm47ZGVsZXRlIHIud2Fybjt2YXIgbz1yLmRlbGltaXRlcnM/U3RyaW5nKHIuZGVsaW1pdGVycykrbjpuO2lmKHRbb10pcmV0dXJuIHRbb107dmFyIGE9ZShuLHIpLHM9e30sYz1bXTtyZXR1cm4gcy5yZW5kZXI9WWEoYS5yZW5kZXIsYykscy5zdGF0aWNSZW5kZXJGbnM9YS5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBZYShlLGMpfSksdFtvXT1zfX12YXIgZXMsdHMsbnM9KGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bGEoZS50cmltKCksdCk7ITEhPT10Lm9wdGltaXplJiZrYShuLHQpO3ZhciByPVBhKG4sdCk7cmV0dXJue2FzdDpuLHJlbmRlcjpyLnJlbmRlcixzdGF0aWNSZW5kZXJGbnM6ci5zdGF0aWNSZW5kZXJGbnN9fSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbil7dmFyIHI9T2JqZWN0LmNyZWF0ZShlKSxpPVtdLG89W107aWYobilmb3IodmFyIGEgaW4gbi5tb2R1bGVzJiYoci5tb2R1bGVzPShlLm1vZHVsZXN8fFtdKS5jb25jYXQobi5tb2R1bGVzKSksbi5kaXJlY3RpdmVzJiYoci5kaXJlY3RpdmVzPUEoT2JqZWN0LmNyZWF0ZShlLmRpcmVjdGl2ZXN8fG51bGwpLG4uZGlyZWN0aXZlcykpLG4pIm1vZHVsZXMiIT09YSYmImRpcmVjdGl2ZXMiIT09YSYmKHJbYV09blthXSk7ci53YXJuPWZ1bmN0aW9uKGUsdCxuKXsobj9vOmkpLnB1c2goZSl9O3ZhciBzPWVzKHQudHJpbSgpLHIpO3JldHVybiBzLmVycm9ycz1pLHMudGlwcz1vLHN9cmV0dXJue2NvbXBpbGU6dCxjb21waWxlVG9GdW5jdGlvbnM6UWEodCl9fSkoQ2EpLHJzPShucy5jb21waWxlLG5zLmNvbXBpbGVUb0Z1bmN0aW9ucyk7ZnVuY3Rpb24gaXMoZSl7cmV0dXJuKHRzPXRzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPWU/JzxhIGhyZWY9IlxuIi8+JzonPGRpdiBhPSJcbiIvPicsdHMuaW5uZXJIVE1MLmluZGV4T2YoIiYjMTA7Iik+MH12YXIgb3M9ISF6JiZpcyghMSksYXM9ISF6JiZpcyghMCksc3M9ZyhmdW5jdGlvbihlKXt2YXIgdD1ZbihlKTtyZXR1cm4gdCYmdC5pbm5lckhUTUx9KSxjcz13bi5wcm90b3R5cGUuJG1vdW50O3JldHVybiB3bi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7aWYoKGU9ZSYmWW4oZSkpPT09ZG9jdW1lbnQuYm9keXx8ZT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudClyZXR1cm4gdGhpczt2YXIgbj10aGlzLiRvcHRpb25zO2lmKCFuLnJlbmRlcil7dmFyIHI9bi50ZW1wbGF0ZTtpZihyKWlmKCJzdHJpbmciPT10eXBlb2YgcikiIyI9PT1yLmNoYXJBdCgwKSYmKHI9c3MocikpO2Vsc2V7aWYoIXIubm9kZVR5cGUpcmV0dXJuIHRoaXM7cj1yLmlubmVySFRNTH1lbHNlIGUmJihyPWZ1bmN0aW9uKGUpe2lmKGUub3V0ZXJIVE1MKXJldHVybiBlLm91dGVySFRNTDt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5hcHBlbmRDaGlsZChlLmNsb25lTm9kZSghMCkpLHQuaW5uZXJIVE1MfShlKSk7aWYocil7dmFyIGk9cnMocix7b3V0cHV0U291cmNlUmFuZ2U6ITEsc2hvdWxkRGVjb2RlTmV3bGluZXM6b3Msc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOmFzLGRlbGltaXRlcnM6bi5kZWxpbWl0ZXJzLGNvbW1lbnRzOm4uY29tbWVudHN9LHRoaXMpLG89aS5yZW5kZXIsYT1pLnN0YXRpY1JlbmRlckZucztuLnJlbmRlcj1vLG4uc3RhdGljUmVuZGVyRm5zPWF9fXJldHVybiBjcy5jYWxsKHRoaXMsZSx0KX0sd24uY29tcGlsZT1ycyx3bn0pOw=="},{"meta":{"name":"less.js","url":"https://cdn.jsdelivr.net/npm/less_browser_fix@4.1.2/dist/less.js","ts":1637743679872,"mimetype":"text/javascript"},"source":"LyoqCiAqIExlc3MgLSBMZXNzIDQuMS4yIGZpeGVkIGZvciBHcmVhc2VNb25rZXkgdjQuMS4yCiAqIGh0dHA6Ly9sZXNzY3NzLm9yZwogKiAKICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMjEsIEFsZXhpcyBTZWxsaWVyIDxzZWxmQGNsb3VkaGVhZC5uZXQ+CiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIExpY2Vuc2UuCiAqCiAqIEBsaWNlbnNlIEFwYWNoZS0yLjAKICovCgooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOgogICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDoKICAgIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5sZXNzID0gZmFjdG9yeSgpKTsKfSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7CgogICAgLy8gRXhwb3J0IGEgbmV3IGRlZmF1bHQgZWFjaCB0aW1lDQogICAgZnVuY3Rpb24gZGVmYXVsdE9wdGlvbnMgKCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgLyogSW5saW5lIEphdmFzY3JpcHQgLSBAcGx1Z2luIHN0aWxsIGFsbG93ZWQgKi8NCiAgICAgICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiBmYWxzZSwNCiAgICAgICAgICAgIC8qIE91dHB1dHMgYSBtYWtlZmlsZSBpbXBvcnQgZGVwZW5kZW5jeSBsaXN0IHRvIHN0ZG91dC4gKi8NCiAgICAgICAgICAgIGRlcGVuZHM6IGZhbHNlLA0KICAgICAgICAgICAgLyogKERFUFJFQ0FURUQpIENvbXByZXNzIHVzaW5nIGxlc3MgYnVpbHQtaW4gY29tcHJlc3Npb24uDQogICAgICAgICAgICAgKiBUaGlzIGRvZXMgYW4gb2theSBqb2IgYnV0IGRvZXMgbm90IHV0aWxpc2UgYWxsIHRoZSB0cmlja3Mgb2YNCiAgICAgICAgICAgICAqIGRlZGljYXRlZCBjc3MgY29tcHJlc3Npb24uICovDQogICAgICAgICAgICBjb21wcmVzczogZmFsc2UsDQogICAgICAgICAgICAvKiBSdW5zIHRoZSBsZXNzIHBhcnNlciBhbmQganVzdCByZXBvcnRzIGVycm9ycyB3aXRob3V0IGFueSBvdXRwdXQuICovDQogICAgICAgICAgICBsaW50OiBmYWxzZSwNCiAgICAgICAgICAgIC8qIFNldHMgYXZhaWxhYmxlIGluY2x1ZGUgcGF0aHMuDQogICAgICAgICAgICAgKiBJZiB0aGUgZmlsZSBpbiBhbiBAaW1wb3J0IHJ1bGUgZG9lcyBub3QgZXhpc3QgYXQgdGhhdCBleGFjdCBsb2NhdGlvbiwNCiAgICAgICAgICAgICAqIGxlc3Mgd2lsbCBsb29rIGZvciBpdCBhdCB0aGUgbG9jYXRpb24ocykgcGFzc2VkIHRvIHRoaXMgb3B0aW9uLg0KICAgICAgICAgICAgICogWW91IG1pZ2h0IHVzZSB0aGlzIGZvciBpbnN0YW5jZSB0byBzcGVjaWZ5IGEgcGF0aCB0byBhIGxpYnJhcnkgd2hpY2gNCiAgICAgICAgICAgICAqIHlvdSB3YW50IHRvIGJlIHJlZmVyZW5jZWQgc2ltcGx5IGFuZCByZWxhdGl2ZWx5IGluIHRoZSBsZXNzIGZpbGVzLiAqLw0KICAgICAgICAgICAgcGF0aHM6IFtdLA0KICAgICAgICAgICAgLyogY29sb3Igb3V0cHV0IGluIHRoZSB0ZXJtaW5hbCAqLw0KICAgICAgICAgICAgY29sb3I6IHRydWUsDQogICAgICAgICAgICAvKiBUaGUgc3RyaWN0SW1wb3J0cyBjb250cm9scyB3aGV0aGVyIHRoZSBjb21waWxlciB3aWxsIGFsbG93IGFuIEBpbXBvcnQgaW5zaWRlIG9mIGVpdGhlcg0KICAgICAgICAgICAgICogQG1lZGlhIGJsb2NrcyBvciAoYSBsYXRlciBhZGRpdGlvbikgb3RoZXIgc2VsZWN0b3IgYmxvY2tzLg0KICAgICAgICAgICAgICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVzcy9sZXNzLmpzL2lzc3Vlcy82NTYgKi8NCiAgICAgICAgICAgIHN0cmljdEltcG9ydHM6IGZhbHNlLA0KICAgICAgICAgICAgLyogQWxsb3cgSW1wb3J0cyBmcm9tIEluc2VjdXJlIEhUVFBTIEhvc3RzICovDQogICAgICAgICAgICBpbnNlY3VyZTogZmFsc2UsDQogICAgICAgICAgICAvKiBBbGxvd3MgeW91IHRvIGFkZCBhIHBhdGggdG8gZXZlcnkgZ2VuZXJhdGVkIGltcG9ydCBhbmQgdXJsIGluIHlvdXIgY3NzLg0KICAgICAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhZmZlY3QgbGVzcyBpbXBvcnQgc3RhdGVtZW50cyB0aGF0IGFyZSBwcm9jZXNzZWQsIGp1c3Qgb25lcw0KICAgICAgICAgICAgICogdGhhdCBhcmUgbGVmdCBpbiB0aGUgb3V0cHV0IGNzcy4gKi8NCiAgICAgICAgICAgIHJvb3RwYXRoOiAnJywNCiAgICAgICAgICAgIC8qIEJ5IGRlZmF1bHQgVVJMcyBhcmUga2VwdCBhcy1pcywgc28gaWYgeW91IGltcG9ydCBhIGZpbGUgaW4gYSBzdWItZGlyZWN0b3J5DQogICAgICAgICAgICAgKiB0aGF0IHJlZmVyZW5jZXMgYW4gaW1hZ2UsIGV4YWN0bHkgdGhlIHNhbWUgVVJMIHdpbGwgYmUgb3V0cHV0IGluIHRoZSBjc3MuDQogICAgICAgICAgICAgKiBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHJlLXdyaXRlIFVSTCdzIGluIGltcG9ydGVkIGZpbGVzIHNvIHRoYXQgdGhlDQogICAgICAgICAgICAgKiBVUkwgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGltcG9ydGVkIGZpbGUgKi8NCiAgICAgICAgICAgIHJld3JpdGVVcmxzOiBmYWxzZSwNCiAgICAgICAgICAgIC8qIEhvdyB0byBwcm9jZXNzIG1hdGgNCiAgICAgICAgICAgICAqICAgMCBhbHdheXMgICAgICAgICAgIC0gZWFnZXJseSB0cnkgdG8gc29sdmUgYWxsIG9wZXJhdGlvbnMNCiAgICAgICAgICAgICAqICAgMSBwYXJlbnMtZGl2aXNpb24gIC0gcmVxdWlyZSBwYXJlbnMgZm9yIGRpdmlzaW9uICIvIg0KICAgICAgICAgICAgICogICAyIHBhcmVucyB8IHN0cmljdCAgLSByZXF1aXJlIHBhcmVucyBmb3IgYWxsIG9wZXJhdGlvbnMNCiAgICAgICAgICAgICAqICAgMyBzdHJpY3QtbGVnYWN5ICAgIC0gbGVnYWN5IHN0cmljdCBiZWhhdmlvciAoc3VwZXItc3RyaWN0KQ0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBtYXRoOiAxLA0KICAgICAgICAgICAgLyogV2l0aG91dCB0aGlzIG9wdGlvbiwgbGVzcyBhdHRlbXB0cyB0byBndWVzcyBhdCB0aGUgb3V0cHV0IHVuaXQgd2hlbiBpdCBkb2VzIG1hdGhzLiAqLw0KICAgICAgICAgICAgc3RyaWN0VW5pdHM6IGZhbHNlLA0KICAgICAgICAgICAgLyogRWZmZWN0aXZlbHkgdGhlIGRlY2xhcmF0aW9uIGlzIHB1dCBhdCB0aGUgdG9wIG9mIHlvdXIgYmFzZSBMZXNzIGZpbGUsDQogICAgICAgICAgICAgKiBtZWFuaW5nIGl0IGNhbiBiZSB1c2VkIGJ1dCBpdCBhbHNvIGNhbiBiZSBvdmVycmlkZGVuIGlmIHRoaXMgdmFyaWFibGUNCiAgICAgICAgICAgICAqIGlzIGRlZmluZWQgaW4gdGhlIGZpbGUuICovDQogICAgICAgICAgICBnbG9iYWxWYXJzOiBudWxsLA0KICAgICAgICAgICAgLyogQXMgb3Bwb3NlZCB0byB0aGUgZ2xvYmFsIHZhcmlhYmxlIG9wdGlvbiwgdGhpcyBwdXRzIHRoZSBkZWNsYXJhdGlvbiBhdCB0aGUNCiAgICAgICAgICAgICAqIGVuZCBvZiB5b3VyIGJhc2UgZmlsZSwgbWVhbmluZyBpdCB3aWxsIG92ZXJyaWRlIGFueXRoaW5nIGRlZmluZWQgaW4geW91ciBMZXNzIGZpbGUuICovDQogICAgICAgICAgICBtb2RpZnlWYXJzOiBudWxsLA0KICAgICAgICAgICAgLyogVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgYXJndW1lbnQgdG8gZ28gb24gdG8gZXZlcnkgVVJMLiAgKi8NCiAgICAgICAgICAgIHVybEFyZ3M6ICcnDQogICAgICAgIH07DQogICAgfQoKICAgIGZ1bmN0aW9uIGV4dHJhY3RJZChocmVmKSB7DQogICAgICAgIHJldHVybiBocmVmLnJlcGxhY2UoL15bYS16LV0rOlwvKz9bXlwvXSsvLCAnJykgLy8gUmVtb3ZlIHByb3RvY29sICYgZG9tYWluDQogICAgICAgICAgICAucmVwbGFjZSgvW1w/XCZdbGl2ZXJlbG9hZD1cdysvLCAnJykgLy8gUmVtb3ZlIExpdmVSZWxvYWQgY2FjaGVidXN0ZXINCiAgICAgICAgICAgIC5yZXBsYWNlKC9eXC8vLCAnJykgLy8gUmVtb3ZlIHJvb3QgLw0KICAgICAgICAgICAgLnJlcGxhY2UoL1wuW2EtekEtWl0rJC8sICcnKSAvLyBSZW1vdmUgc2ltcGxlIGV4dGVuc2lvbg0KICAgICAgICAgICAgLnJlcGxhY2UoL1teXC5cdy1dKy9nLCAnLScpIC8vIFJlcGxhY2UgaWxsZWdhbCBjaGFyYWN0ZXJzDQogICAgICAgICAgICAucmVwbGFjZSgvXC4vZywgJzonKTsgLy8gUmVwbGFjZSBkb3RzIHdpdGggY29sb25zKGZvciB2YWxpZCBpZCkNCiAgICB9DQogICAgZnVuY3Rpb24gYWRkRGF0YUF0dHIob3B0aW9ucywgdGFnKSB7DQogICAgICAgIGlmICghdGFnKQ0KICAgICAgICAgICAgcmV0dXJuOyAvLyBpbiBjYXNlIG9mIHRhZyBpcyBudWxsIG9yIHVuZGVmaW5lZA0KICAgICAgICBmb3IgKHZhciBvcHQgaW4gdGFnLmRhdGFzZXQpIHsNCiAgICAgICAgICAgIGlmICh0YWcuZGF0YXNldC5oYXNPd25Qcm9wZXJ0eShvcHQpKSB7DQogICAgICAgICAgICAgICAgaWYgKG9wdCA9PT0gJ2VudicgfHwgb3B0ID09PSAnZHVtcExpbmVOdW1iZXJzJyB8fCBvcHQgPT09ICdyb290cGF0aCcgfHwgb3B0ID09PSAnZXJyb3JSZXBvcnRpbmcnKSB7DQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbb3B0XSA9IHRhZy5kYXRhc2V0W29wdF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1tvcHRdID0gSlNPTi5wYXJzZSh0YWcuZGF0YXNldFtvcHRdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQoKICAgIHZhciBicm93c2VyID0gew0KICAgICAgICBjcmVhdGVDU1M6IGZ1bmN0aW9uIChkb2N1bWVudCwgc3R5bGVzLCBzaGVldCkgew0KICAgICAgICAgICAgLy8gU3RyaXAgdGhlIHF1ZXJ5LXN0cmluZw0KICAgICAgICAgICAgdmFyIGhyZWYgPSBzaGVldC5ocmVmIHx8ICcnOw0KICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gdGl0bGUgc2V0LCB1c2UgdGhlIGZpbGVuYW1lLCBtaW51cyB0aGUgZXh0ZW5zaW9uDQogICAgICAgICAgICB2YXIgaWQgPSAibGVzczoiICsgKHNoZWV0LnRpdGxlIHx8IGV4dHJhY3RJZChocmVmKSk7DQogICAgICAgICAgICAvLyBJZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCB3ZSBtYXkgbmVlZCB0byByZXBsYWNlIGl0DQogICAgICAgICAgICB2YXIgb2xkU3R5bGVOb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KICAgICAgICAgICAgdmFyIGtlZXBPbGRTdHlsZU5vZGUgPSBmYWxzZTsNCiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdHlsZXNoZWV0IG5vZGUgZm9yIGluc2VydGlvbiBvciAoaWYgbmVjZXNzYXJ5KSByZXBsYWNlbWVudA0KICAgICAgICAgICAgdmFyIHN0eWxlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7DQogICAgICAgICAgICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7DQogICAgICAgICAgICBpZiAoc2hlZXQubWVkaWEpIHsNCiAgICAgICAgICAgICAgICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKCdtZWRpYScsIHNoZWV0Lm1lZGlhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN0eWxlTm9kZS5pZCA9IGlkOw0KICAgICAgICAgICAgaWYgKCFzdHlsZU5vZGUuc3R5bGVTaGVldCkgew0KICAgICAgICAgICAgICAgIHN0eWxlTm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHlsZXMpKTsNCiAgICAgICAgICAgICAgICAvLyBJZiBuZXcgY29udGVudHMgbWF0Y2ggY29udGVudHMgb2Ygb2xkU3R5bGVOb2RlLCBkb24ndCByZXBsYWNlIG9sZFN0eWxlTm9kZQ0KICAgICAgICAgICAgICAgIGtlZXBPbGRTdHlsZU5vZGUgPSAob2xkU3R5bGVOb2RlICE9PSBudWxsICYmIG9sZFN0eWxlTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiYgc3R5bGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCAmJg0KICAgICAgICAgICAgICAgICAgICBvbGRTdHlsZU5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPT09IHN0eWxlTm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07DQogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBvbGRTdHlsZU5vZGUsIGp1c3QgYXBwZW5kOyBvdGhlcndpc2UsIG9ubHkgYXBwZW5kIGlmIHdlIG5lZWQNCiAgICAgICAgICAgIC8vIHRvIHJlcGxhY2Ugb2xkU3R5bGVOb2RlIHdpdGggYW4gdXBkYXRlZCBzdHlsZXNoZWV0DQogICAgICAgICAgICBpZiAob2xkU3R5bGVOb2RlID09PSBudWxsIHx8IGtlZXBPbGRTdHlsZU5vZGUgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgdmFyIG5leHRFbCA9IHNoZWV0ICYmIHNoZWV0Lm5leHRTaWJsaW5nIHx8IG51bGw7DQogICAgICAgICAgICAgICAgaWYgKG5leHRFbCkgew0KICAgICAgICAgICAgICAgICAgICBuZXh0RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc3R5bGVOb2RlLCBuZXh0RWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZU5vZGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChvbGRTdHlsZU5vZGUgJiYga2VlcE9sZFN0eWxlTm9kZSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICBvbGRTdHlsZU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvbGRTdHlsZU5vZGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gRm9yIElFLg0KICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBoYXBwZW4gKmFmdGVyKiB0aGUgc3R5bGUgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgRE9NLCBvdGhlcndpc2UgSUUgNyBhbmQgOCBtYXkgY3Jhc2guDQogICAgICAgICAgICAvLyBTZWUgaHR0cDovL3NvY2lhbC5tc2RuLm1pY3Jvc29mdC5jb20vRm9ydW1zL2VuLVVTLzdlMDgxYjY1LTg3OGEtNGMyMi04ZTY4LWMxMGQzOWMyZWQzMi9pbnRlcm5ldC1leHBsb3Jlci1jcmFzaGVzLWFwcGVuZGluZy1zdHlsZS1lbGVtZW50LXRvLWhlYWQNCiAgICAgICAgICAgIGlmIChzdHlsZU5vZGUuc3R5bGVTaGVldCkgew0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHN0eWxlTm9kZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBzdHlsZXM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGRuXCd0IHJlYXNzaWduIHN0eWxlU2hlZXQuY3NzVGV4dC4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbnRTY3JpcHQ6IGZ1bmN0aW9uICh3aW5kb3cpIHsNCiAgICAgICAgICAgIHZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDsNCiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IHx8IChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIH0NCiAgICB9OwoKICAgIHZhciBhZGREZWZhdWx0T3B0aW9ucyA9IChmdW5jdGlvbiAod2luZG93LCBvcHRpb25zKSB7DQogICAgICAgIC8vIHVzZSBvcHRpb25zIGZyb20gdGhlIGN1cnJlbnQgc2NyaXB0IHRhZyBkYXRhIGF0dHJpYnVlcw0KICAgICAgICBhZGREYXRhQXR0cihvcHRpb25zLCBicm93c2VyLmN1cnJlbnRTY3JpcHQod2luZG93KSk7DQogICAgICAgIGlmIChvcHRpb25zLmlzRmlsZVByb3RvY29sID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgIG9wdGlvbnMuaXNGaWxlUHJvdG9jb2wgPSAvXihmaWxlfChjaHJvbWV8c2FmYXJpKSgtZXh0ZW5zaW9uKT98cmVzb3VyY2V8cXJjfGFwcCk6Ly50ZXN0KHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCk7DQogICAgICAgIH0NCiAgICAgICAgLy8gTG9hZCBzdHlsZXMgYXN5bmNocm9ub3VzbHkgKGRlZmF1bHQ6IGZhbHNlKQ0KICAgICAgICAvLw0KICAgICAgICAvLyBUaGlzIGlzIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQsIHNvIHRoYXQgdGhlIGJvZHkNCiAgICAgICAgLy8gZG9lc24ndCBzdGFydCBsb2FkaW5nIGJlZm9yZSB0aGUgc3R5bGVzaGVldHMgYXJlIHBhcnNlZC4NCiAgICAgICAgLy8gU2V0dGluZyB0aGlzIHRvIGB0cnVlYCBjYW4gcmVzdWx0IGluIGZsaWNrZXJpbmcuDQogICAgICAgIC8vDQogICAgICAgIG9wdGlvbnMuYXN5bmMgPSBvcHRpb25zLmFzeW5jIHx8IGZhbHNlOw0KICAgICAgICBvcHRpb25zLmZpbGVBc3luYyA9IG9wdGlvbnMuZmlsZUFzeW5jIHx8IGZhbHNlOw0KICAgICAgICAvLyBJbnRlcnZhbCBiZXR3ZWVuIHdhdGNoIHBvbGxzDQogICAgICAgIG9wdGlvbnMucG9sbCA9IG9wdGlvbnMucG9sbCB8fCAob3B0aW9ucy5pc0ZpbGVQcm90b2NvbCA/IDEwMDAgOiAxNTAwKTsNCiAgICAgICAgb3B0aW9ucy5lbnYgPSBvcHRpb25zLmVudiB8fCAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09ICcxMjcuMC4wLjEnIHx8DQogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJzAuMC4wLjAnIHx8DQogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ2xvY2FsaG9zdCcgfHwNCiAgICAgICAgICAgICh3aW5kb3cubG9jYXRpb24ucG9ydCAmJg0KICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wb3J0Lmxlbmd0aCA+IDApIHx8DQogICAgICAgICAgICBvcHRpb25zLmlzRmlsZVByb3RvY29sID8gJ2RldmVsb3BtZW50Jw0KICAgICAgICAgICAgOiAncHJvZHVjdGlvbicpOw0KICAgICAgICB2YXIgZHVtcExpbmVOdW1iZXJzID0gLyFkdW1wTGluZU51bWJlcnM6KGNvbW1lbnRzfG1lZGlhcXVlcnl8YWxsKS8uZXhlYyh3aW5kb3cubG9jYXRpb24uaGFzaCk7DQogICAgICAgIGlmIChkdW1wTGluZU51bWJlcnMpIHsNCiAgICAgICAgICAgIG9wdGlvbnMuZHVtcExpbmVOdW1iZXJzID0gZHVtcExpbmVOdW1iZXJzWzFdOw0KICAgICAgICB9DQogICAgICAgIGlmIChvcHRpb25zLnVzZUZpbGVDYWNoZSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICBvcHRpb25zLnVzZUZpbGVDYWNoZSA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG9wdGlvbnMub25SZWFkeSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICBvcHRpb25zLm9uUmVhZHkgPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlVXJscykgew0KICAgICAgICAgICAgb3B0aW9ucy5yZXdyaXRlVXJscyA9ICdhbGwnOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIGxvZ2dlciQxID0gew0KICAgICAgICBlcnJvcjogZnVuY3Rpb24gKG1zZykgew0KICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdlcnJvcicsIG1zZyk7DQogICAgICAgIH0sDQogICAgICAgIHdhcm46IGZ1bmN0aW9uIChtc2cpIHsNCiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnd2FybicsIG1zZyk7DQogICAgICAgIH0sDQogICAgICAgIGluZm86IGZ1bmN0aW9uIChtc2cpIHsNCiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnaW5mbycsIG1zZyk7DQogICAgICAgIH0sDQogICAgICAgIGRlYnVnOiBmdW5jdGlvbiAobXNnKSB7DQogICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RlYnVnJywgbXNnKTsNCiAgICAgICAgfSwNCiAgICAgICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uIChsaXN0ZW5lcikgew0KICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOw0KICAgICAgICB9LA0KICAgICAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gKGxpc3RlbmVyKSB7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIF9maXJlRXZlbnQ6IGZ1bmN0aW9uICh0eXBlLCBtc2cpIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGxvZ0Z1bmN0aW9uID0gdGhpcy5fbGlzdGVuZXJzW2ldW3R5cGVdOw0KICAgICAgICAgICAgICAgIGlmIChsb2dGdW5jdGlvbikgew0KICAgICAgICAgICAgICAgICAgICBsb2dGdW5jdGlvbihtc2cpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgX2xpc3RlbmVyczogW10NCiAgICB9OwoKICAgIC8qKg0KICAgICAqIEB0b2RvIERvY3VtZW50IHdoeSB0aGlzIGFic3RyYWN0aW9uIGV4aXN0cywgYW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2Vlbg0KICAgICAqICAgICAgIGVudmlyb25tZW50LCBmaWxlIG1hbmFnZXJzLCBhbmQgcGx1Z2luIG1hbmFnZXINCiAgICAgKi8NCiAgICB2YXIgRW52aXJvbm1lbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7DQogICAgICAgIGZ1bmN0aW9uIEVudmlyb25tZW50KGV4dGVybmFsRW52aXJvbm1lbnQsIGZpbGVNYW5hZ2Vycykgew0KICAgICAgICAgICAgdGhpcy5maWxlTWFuYWdlcnMgPSBmaWxlTWFuYWdlcnMgfHwgW107DQogICAgICAgICAgICBleHRlcm5hbEVudmlyb25tZW50ID0gZXh0ZXJuYWxFbnZpcm9ubWVudCB8fCB7fTsNCiAgICAgICAgICAgIHZhciBvcHRpb25hbEZ1bmN0aW9ucyA9IFsnZW5jb2RlQmFzZTY0JywgJ21pbWVMb29rdXAnLCAnY2hhcnNldExvb2t1cCcsICdnZXRTb3VyY2VNYXBHZW5lcmF0b3InXTsNCiAgICAgICAgICAgIHZhciByZXF1aXJlZEZ1bmN0aW9ucyA9IFtdOw0KICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IHJlcXVpcmVkRnVuY3Rpb25zLmNvbmNhdChvcHRpb25hbEZ1bmN0aW9ucyk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmN0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBwcm9wTmFtZSA9IGZ1bmN0aW9uc1tpXTsNCiAgICAgICAgICAgICAgICB2YXIgZW52aXJvbm1lbnRGdW5jID0gZXh0ZXJuYWxFbnZpcm9ubWVudFtwcm9wTmFtZV07DQogICAgICAgICAgICAgICAgaWYgKGVudmlyb25tZW50RnVuYykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IGVudmlyb25tZW50RnVuYy5iaW5kKGV4dGVybmFsRW52aXJvbm1lbnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDwgcmVxdWlyZWRGdW5jdGlvbnMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMud2FybigibWlzc2luZyByZXF1aXJlZCBmdW5jdGlvbiBpbiBlbnZpcm9ubWVudCAtICIgKyBwcm9wTmFtZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIEVudmlyb25tZW50LnByb3RvdHlwZS5nZXRGaWxlTWFuYWdlciA9IGZ1bmN0aW9uIChmaWxlbmFtZSwgY3VycmVudERpcmVjdG9yeSwgb3B0aW9ucywgZW52aXJvbm1lbnQsIGlzU3luYykgew0KICAgICAgICAgICAgaWYgKCFmaWxlbmFtZSkgew0KICAgICAgICAgICAgICAgIGxvZ2dlciQxLndhcm4oJ2dldEZpbGVNYW5hZ2VyIGNhbGxlZCB3aXRoIG5vIGZpbGVuYW1lLi4gUGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlLiBjb250aW51aW5nLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGN1cnJlbnREaXJlY3RvcnkgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIGxvZ2dlciQxLndhcm4oJ2dldEZpbGVNYW5hZ2VyIGNhbGxlZCB3aXRoIG51bGwgZGlyZWN0b3J5Li4gUGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlLiBjb250aW51aW5nLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGZpbGVNYW5hZ2VycyA9IHRoaXMuZmlsZU1hbmFnZXJzOw0KICAgICAgICAgICAgaWYgKG9wdGlvbnMucGx1Z2luTWFuYWdlcikgew0KICAgICAgICAgICAgICAgIGZpbGVNYW5hZ2VycyA9IFtdLmNvbmNhdChmaWxlTWFuYWdlcnMpLmNvbmNhdChvcHRpb25zLnBsdWdpbk1hbmFnZXIuZ2V0RmlsZU1hbmFnZXJzKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IGZpbGVNYW5hZ2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgICAgICAgIHZhciBmaWxlTWFuYWdlciA9IGZpbGVNYW5hZ2Vyc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZU1hbmFnZXJbaXNTeW5jID8gJ3N1cHBvcnRzU3luYycgOiAnc3VwcG9ydHMnXShmaWxlbmFtZSwgY3VycmVudERpcmVjdG9yeSwgb3B0aW9ucywgZW52aXJvbm1lbnQpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTWFuYWdlcjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfTsNCiAgICAgICAgRW52aXJvbm1lbnQucHJvdG90eXBlLmFkZEZpbGVNYW5hZ2VyID0gZnVuY3Rpb24gKGZpbGVNYW5hZ2VyKSB7DQogICAgICAgICAgICB0aGlzLmZpbGVNYW5hZ2Vycy5wdXNoKGZpbGVNYW5hZ2VyKTsNCiAgICAgICAgfTsNCiAgICAgICAgRW52aXJvbm1lbnQucHJvdG90eXBlLmNsZWFyRmlsZU1hbmFnZXJzID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy5maWxlTWFuYWdlcnMgPSBbXTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50Ow0KICAgIH0oKSk7CgogICAgdmFyIGNvbG9ycyA9IHsNCiAgICAgICAgJ2FsaWNlYmx1ZSc6ICcjZjBmOGZmJywNCiAgICAgICAgJ2FudGlxdWV3aGl0ZSc6ICcjZmFlYmQ3JywNCiAgICAgICAgJ2FxdWEnOiAnIzAwZmZmZicsDQogICAgICAgICdhcXVhbWFyaW5lJzogJyM3ZmZmZDQnLA0KICAgICAgICAnYXp1cmUnOiAnI2YwZmZmZicsDQogICAgICAgICdiZWlnZSc6ICcjZjVmNWRjJywNCiAgICAgICAgJ2Jpc3F1ZSc6ICcjZmZlNGM0JywNCiAgICAgICAgJ2JsYWNrJzogJyMwMDAwMDAnLA0KICAgICAgICAnYmxhbmNoZWRhbG1vbmQnOiAnI2ZmZWJjZCcsDQogICAgICAgICdibHVlJzogJyMwMDAwZmYnLA0KICAgICAgICAnYmx1ZXZpb2xldCc6ICcjOGEyYmUyJywNCiAgICAgICAgJ2Jyb3duJzogJyNhNTJhMmEnLA0KICAgICAgICAnYnVybHl3b29kJzogJyNkZWI4ODcnLA0KICAgICAgICAnY2FkZXRibHVlJzogJyM1ZjllYTAnLA0KICAgICAgICAnY2hhcnRyZXVzZSc6ICcjN2ZmZjAwJywNCiAgICAgICAgJ2Nob2NvbGF0ZSc6ICcjZDI2OTFlJywNCiAgICAgICAgJ2NvcmFsJzogJyNmZjdmNTAnLA0KICAgICAgICAnY29ybmZsb3dlcmJsdWUnOiAnIzY0OTVlZCcsDQogICAgICAgICdjb3Juc2lsayc6ICcjZmZmOGRjJywNCiAgICAgICAgJ2NyaW1zb24nOiAnI2RjMTQzYycsDQogICAgICAgICdjeWFuJzogJyMwMGZmZmYnLA0KICAgICAgICAnZGFya2JsdWUnOiAnIzAwMDA4YicsDQogICAgICAgICdkYXJrY3lhbic6ICcjMDA4YjhiJywNCiAgICAgICAgJ2Rhcmtnb2xkZW5yb2QnOiAnI2I4ODYwYicsDQogICAgICAgICdkYXJrZ3JheSc6ICcjYTlhOWE5JywNCiAgICAgICAgJ2RhcmtncmV5JzogJyNhOWE5YTknLA0KICAgICAgICAnZGFya2dyZWVuJzogJyMwMDY0MDAnLA0KICAgICAgICAnZGFya2toYWtpJzogJyNiZGI3NmInLA0KICAgICAgICAnZGFya21hZ2VudGEnOiAnIzhiMDA4YicsDQogICAgICAgICdkYXJrb2xpdmVncmVlbic6ICcjNTU2YjJmJywNCiAgICAgICAgJ2RhcmtvcmFuZ2UnOiAnI2ZmOGMwMCcsDQogICAgICAgICdkYXJrb3JjaGlkJzogJyM5OTMyY2MnLA0KICAgICAgICAnZGFya3JlZCc6ICcjOGIwMDAwJywNCiAgICAgICAgJ2RhcmtzYWxtb24nOiAnI2U5OTY3YScsDQogICAgICAgICdkYXJrc2VhZ3JlZW4nOiAnIzhmYmM4ZicsDQogICAgICAgICdkYXJrc2xhdGVibHVlJzogJyM0ODNkOGInLA0KICAgICAgICAnZGFya3NsYXRlZ3JheSc6ICcjMmY0ZjRmJywNCiAgICAgICAgJ2RhcmtzbGF0ZWdyZXknOiAnIzJmNGY0ZicsDQogICAgICAgICdkYXJrdHVycXVvaXNlJzogJyMwMGNlZDEnLA0KICAgICAgICAnZGFya3Zpb2xldCc6ICcjOTQwMGQzJywNCiAgICAgICAgJ2RlZXBwaW5rJzogJyNmZjE0OTMnLA0KICAgICAgICAnZGVlcHNreWJsdWUnOiAnIzAwYmZmZicsDQogICAgICAgICdkaW1ncmF5JzogJyM2OTY5NjknLA0KICAgICAgICAnZGltZ3JleSc6ICcjNjk2OTY5JywNCiAgICAgICAgJ2RvZGdlcmJsdWUnOiAnIzFlOTBmZicsDQogICAgICAgICdmaXJlYnJpY2snOiAnI2IyMjIyMicsDQogICAgICAgICdmbG9yYWx3aGl0ZSc6ICcjZmZmYWYwJywNCiAgICAgICAgJ2ZvcmVzdGdyZWVuJzogJyMyMjhiMjInLA0KICAgICAgICAnZnVjaHNpYSc6ICcjZmYwMGZmJywNCiAgICAgICAgJ2dhaW5zYm9ybyc6ICcjZGNkY2RjJywNCiAgICAgICAgJ2dob3N0d2hpdGUnOiAnI2Y4ZjhmZicsDQogICAgICAgICdnb2xkJzogJyNmZmQ3MDAnLA0KICAgICAgICAnZ29sZGVucm9kJzogJyNkYWE1MjAnLA0KICAgICAgICAnZ3JheSc6ICcjODA4MDgwJywNCiAgICAgICAgJ2dyZXknOiAnIzgwODA4MCcsDQogICAgICAgICdncmVlbic6ICcjMDA4MDAwJywNCiAgICAgICAgJ2dyZWVueWVsbG93JzogJyNhZGZmMmYnLA0KICAgICAgICAnaG9uZXlkZXcnOiAnI2YwZmZmMCcsDQogICAgICAgICdob3RwaW5rJzogJyNmZjY5YjQnLA0KICAgICAgICAnaW5kaWFucmVkJzogJyNjZDVjNWMnLA0KICAgICAgICAnaW5kaWdvJzogJyM0YjAwODInLA0KICAgICAgICAnaXZvcnknOiAnI2ZmZmZmMCcsDQogICAgICAgICdraGFraSc6ICcjZjBlNjhjJywNCiAgICAgICAgJ2xhdmVuZGVyJzogJyNlNmU2ZmEnLA0KICAgICAgICAnbGF2ZW5kZXJibHVzaCc6ICcjZmZmMGY1JywNCiAgICAgICAgJ2xhd25ncmVlbic6ICcjN2NmYzAwJywNCiAgICAgICAgJ2xlbW9uY2hpZmZvbic6ICcjZmZmYWNkJywNCiAgICAgICAgJ2xpZ2h0Ymx1ZSc6ICcjYWRkOGU2JywNCiAgICAgICAgJ2xpZ2h0Y29yYWwnOiAnI2YwODA4MCcsDQogICAgICAgICdsaWdodGN5YW4nOiAnI2UwZmZmZicsDQogICAgICAgICdsaWdodGdvbGRlbnJvZHllbGxvdyc6ICcjZmFmYWQyJywNCiAgICAgICAgJ2xpZ2h0Z3JheSc6ICcjZDNkM2QzJywNCiAgICAgICAgJ2xpZ2h0Z3JleSc6ICcjZDNkM2QzJywNCiAgICAgICAgJ2xpZ2h0Z3JlZW4nOiAnIzkwZWU5MCcsDQogICAgICAgICdsaWdodHBpbmsnOiAnI2ZmYjZjMScsDQogICAgICAgICdsaWdodHNhbG1vbic6ICcjZmZhMDdhJywNCiAgICAgICAgJ2xpZ2h0c2VhZ3JlZW4nOiAnIzIwYjJhYScsDQogICAgICAgICdsaWdodHNreWJsdWUnOiAnIzg3Y2VmYScsDQogICAgICAgICdsaWdodHNsYXRlZ3JheSc6ICcjNzc4ODk5JywNCiAgICAgICAgJ2xpZ2h0c2xhdGVncmV5JzogJyM3Nzg4OTknLA0KICAgICAgICAnbGlnaHRzdGVlbGJsdWUnOiAnI2IwYzRkZScsDQogICAgICAgICdsaWdodHllbGxvdyc6ICcjZmZmZmUwJywNCiAgICAgICAgJ2xpbWUnOiAnIzAwZmYwMCcsDQogICAgICAgICdsaW1lZ3JlZW4nOiAnIzMyY2QzMicsDQogICAgICAgICdsaW5lbic6ICcjZmFmMGU2JywNCiAgICAgICAgJ21hZ2VudGEnOiAnI2ZmMDBmZicsDQogICAgICAgICdtYXJvb24nOiAnIzgwMDAwMCcsDQogICAgICAgICdtZWRpdW1hcXVhbWFyaW5lJzogJyM2NmNkYWEnLA0KICAgICAgICAnbWVkaXVtYmx1ZSc6ICcjMDAwMGNkJywNCiAgICAgICAgJ21lZGl1bW9yY2hpZCc6ICcjYmE1NWQzJywNCiAgICAgICAgJ21lZGl1bXB1cnBsZSc6ICcjOTM3MGQ4JywNCiAgICAgICAgJ21lZGl1bXNlYWdyZWVuJzogJyMzY2IzNzEnLA0KICAgICAgICAnbWVkaXVtc2xhdGVibHVlJzogJyM3YjY4ZWUnLA0KICAgICAgICAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAnIzAwZmE5YScsDQogICAgICAgICdtZWRpdW10dXJxdW9pc2UnOiAnIzQ4ZDFjYycsDQogICAgICAgICdtZWRpdW12aW9sZXRyZWQnOiAnI2M3MTU4NScsDQogICAgICAgICdtaWRuaWdodGJsdWUnOiAnIzE5MTk3MCcsDQogICAgICAgICdtaW50Y3JlYW0nOiAnI2Y1ZmZmYScsDQogICAgICAgICdtaXN0eXJvc2UnOiAnI2ZmZTRlMScsDQogICAgICAgICdtb2NjYXNpbic6ICcjZmZlNGI1JywNCiAgICAgICAgJ25hdmFqb3doaXRlJzogJyNmZmRlYWQnLA0KICAgICAgICAnbmF2eSc6ICcjMDAwMDgwJywNCiAgICAgICAgJ29sZGxhY2UnOiAnI2ZkZjVlNicsDQogICAgICAgICdvbGl2ZSc6ICcjODA4MDAwJywNCiAgICAgICAgJ29saXZlZHJhYic6ICcjNmI4ZTIzJywNCiAgICAgICAgJ29yYW5nZSc6ICcjZmZhNTAwJywNCiAgICAgICAgJ29yYW5nZXJlZCc6ICcjZmY0NTAwJywNCiAgICAgICAgJ29yY2hpZCc6ICcjZGE3MGQ2JywNCiAgICAgICAgJ3BhbGVnb2xkZW5yb2QnOiAnI2VlZThhYScsDQogICAgICAgICdwYWxlZ3JlZW4nOiAnIzk4ZmI5OCcsDQogICAgICAgICdwYWxldHVycXVvaXNlJzogJyNhZmVlZWUnLA0KICAgICAgICAncGFsZXZpb2xldHJlZCc6ICcjZDg3MDkzJywNCiAgICAgICAgJ3BhcGF5YXdoaXAnOiAnI2ZmZWZkNScsDQogICAgICAgICdwZWFjaHB1ZmYnOiAnI2ZmZGFiOScsDQogICAgICAgICdwZXJ1JzogJyNjZDg1M2YnLA0KICAgICAgICAncGluayc6ICcjZmZjMGNiJywNCiAgICAgICAgJ3BsdW0nOiAnI2RkYTBkZCcsDQogICAgICAgICdwb3dkZXJibHVlJzogJyNiMGUwZTYnLA0KICAgICAgICAncHVycGxlJzogJyM4MDAwODAnLA0KICAgICAgICAncmViZWNjYXB1cnBsZSc6ICcjNjYzMzk5JywNCiAgICAgICAgJ3JlZCc6ICcjZmYwMDAwJywNCiAgICAgICAgJ3Jvc3licm93bic6ICcjYmM4ZjhmJywNCiAgICAgICAgJ3JveWFsYmx1ZSc6ICcjNDE2OWUxJywNCiAgICAgICAgJ3NhZGRsZWJyb3duJzogJyM4YjQ1MTMnLA0KICAgICAgICAnc2FsbW9uJzogJyNmYTgwNzInLA0KICAgICAgICAnc2FuZHlicm93bic6ICcjZjRhNDYwJywNCiAgICAgICAgJ3NlYWdyZWVuJzogJyMyZThiNTcnLA0KICAgICAgICAnc2Vhc2hlbGwnOiAnI2ZmZjVlZScsDQogICAgICAgICdzaWVubmEnOiAnI2EwNTIyZCcsDQogICAgICAgICdzaWx2ZXInOiAnI2MwYzBjMCcsDQogICAgICAgICdza3libHVlJzogJyM4N2NlZWInLA0KICAgICAgICAnc2xhdGVibHVlJzogJyM2YTVhY2QnLA0KICAgICAgICAnc2xhdGVncmF5JzogJyM3MDgwOTAnLA0KICAgICAgICAnc2xhdGVncmV5JzogJyM3MDgwOTAnLA0KICAgICAgICAnc25vdyc6ICcjZmZmYWZhJywNCiAgICAgICAgJ3NwcmluZ2dyZWVuJzogJyMwMGZmN2YnLA0KICAgICAgICAnc3RlZWxibHVlJzogJyM0NjgyYjQnLA0KICAgICAgICAndGFuJzogJyNkMmI0OGMnLA0KICAgICAgICAndGVhbCc6ICcjMDA4MDgwJywNCiAgICAgICAgJ3RoaXN0bGUnOiAnI2Q4YmZkOCcsDQogICAgICAgICd0b21hdG8nOiAnI2ZmNjM0NycsDQogICAgICAgICd0dXJxdW9pc2UnOiAnIzQwZTBkMCcsDQogICAgICAgICd2aW9sZXQnOiAnI2VlODJlZScsDQogICAgICAgICd3aGVhdCc6ICcjZjVkZWIzJywNCiAgICAgICAgJ3doaXRlJzogJyNmZmZmZmYnLA0KICAgICAgICAnd2hpdGVzbW9rZSc6ICcjZjVmNWY1JywNCiAgICAgICAgJ3llbGxvdyc6ICcjZmZmZjAwJywNCiAgICAgICAgJ3llbGxvd2dyZWVuJzogJyM5YWNkMzInDQogICAgfTsKCiAgICB2YXIgdW5pdENvbnZlcnNpb25zID0gew0KICAgICAgICBsZW5ndGg6IHsNCiAgICAgICAgICAgICdtJzogMSwNCiAgICAgICAgICAgICdjbSc6IDAuMDEsDQogICAgICAgICAgICAnbW0nOiAwLjAwMSwNCiAgICAgICAgICAgICdpbic6IDAuMDI1NCwNCiAgICAgICAgICAgICdweCc6IDAuMDI1NCAvIDk2LA0KICAgICAgICAgICAgJ3B0JzogMC4wMjU0IC8gNzIsDQogICAgICAgICAgICAncGMnOiAwLjAyNTQgLyA3MiAqIDEyDQogICAgICAgIH0sDQogICAgICAgIGR1cmF0aW9uOiB7DQogICAgICAgICAgICAncyc6IDEsDQogICAgICAgICAgICAnbXMnOiAwLjAwMQ0KICAgICAgICB9LA0KICAgICAgICBhbmdsZTogew0KICAgICAgICAgICAgJ3JhZCc6IDEgLyAoMiAqIE1hdGguUEkpLA0KICAgICAgICAgICAgJ2RlZyc6IDEgLyAzNjAsDQogICAgICAgICAgICAnZ3JhZCc6IDEgLyA0MDAsDQogICAgICAgICAgICAndHVybic6IDENCiAgICAgICAgfQ0KICAgIH07CgogICAgdmFyIGRhdGEgPSB7IGNvbG9yczogY29sb3JzLCB1bml0Q29udmVyc2lvbnM6IHVuaXRDb252ZXJzaW9ucyB9OwoKICAgIC8qKg0KICAgICAqIFRoZSByZWFzb24gd2h5IE5vZGUgaXMgYSBjbGFzcyBhbmQgb3RoZXIgbm9kZXMgc2ltcGx5IGRvIG5vdCBleHRlbmQNCiAgICAgKiBmcm9tIE5vZGUgKHNpbmNlIHdlJ3JlIHRyYW5zcGlsaW5nKSBpcyBkdWUgdG8gdGhpcyBpc3N1ZToNCiAgICAgKg0KICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNzL2xlc3MuanMvaXNzdWVzLzM0MzQNCiAgICAgKi8NCiAgICB2YXIgTm9kZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgZnVuY3Rpb24gTm9kZSgpIHsNCiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsNCiAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eUJsb2NrcyA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIHRoaXMubm9kZVZpc2libGUgPSB1bmRlZmluZWQ7DQogICAgICAgICAgICB0aGlzLnJvb3ROb2RlID0gbnVsbDsNCiAgICAgICAgICAgIHRoaXMucGFyc2VkID0gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTm9kZS5wcm90b3R5cGUsICJjdXJyZW50RmlsZUluZm8iLCB7DQogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlSW5mbygpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTm9kZS5wcm90b3R5cGUsICJpbmRleCIsIHsNCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEluZGV4KCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUNCiAgICAgICAgfSk7DQogICAgICAgIE5vZGUucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uIChub2RlcywgcGFyZW50KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBzZXQobm9kZSkgew0KICAgICAgICAgICAgICAgIGlmIChub2RlICYmIG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7DQogICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzKSkgew0KICAgICAgICAgICAgICAgIG5vZGVzLmZvckVhY2goc2V0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHNldChub2Rlcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIE5vZGUucHJvdG90eXBlLmdldEluZGV4ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4IHx8ICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5nZXRJbmRleCgpKSB8fCAwOw0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLnByb3RvdHlwZS5maWxlSW5mbyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlSW5mbyB8fCAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuZmlsZUluZm8oKSkgfHwge307DQogICAgICAgIH07DQogICAgICAgIE5vZGUucHJvdG90eXBlLmlzUnVsZXNldExpa2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTsNCiAgICAgICAgTm9kZS5wcm90b3R5cGUudG9DU1MgPSBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIHN0cnMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuZ2VuQ1NTKGNvbnRleHQsIHsNCiAgICAgICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChjaHVuaywgZmlsZUluZm8sIGluZGV4KSB7DQogICAgICAgICAgICAgICAgICAgIHN0cnMucHVzaChjaHVuayk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJzLmxlbmd0aCA9PT0gMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybiBzdHJzLmpvaW4oJycpOw0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLnByb3RvdHlwZS5nZW5DU1MgPSBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICBvdXRwdXQuYWRkKHRoaXMudmFsdWUpOw0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAodmlzaXRvcikgew0KICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZpc2l0b3IudmlzaXQodGhpcy52YWx1ZSk7DQogICAgICAgIH07DQogICAgICAgIE5vZGUucHJvdG90eXBlLmV2YWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9Ow0KICAgICAgICBOb2RlLnByb3RvdHlwZS5fb3BlcmF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcCwgYSwgYikgew0KICAgICAgICAgICAgc3dpdGNoIChvcCkgew0KICAgICAgICAgICAgICAgIGNhc2UgJysnOiByZXR1cm4gYSArIGI7DQogICAgICAgICAgICAgICAgY2FzZSAnLSc6IHJldHVybiBhIC0gYjsNCiAgICAgICAgICAgICAgICBjYXNlICcqJzogcmV0dXJuIGEgKiBiOw0KICAgICAgICAgICAgICAgIGNhc2UgJy8nOiByZXR1cm4gYSAvIGI7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIE5vZGUucHJvdG90eXBlLmZyb3VuZCA9IGZ1bmN0aW9uIChjb250ZXh0LCB2YWx1ZSkgew0KICAgICAgICAgICAgdmFyIHByZWNpc2lvbiA9IGNvbnRleHQgJiYgY29udGV4dC5udW1QcmVjaXNpb247DQogICAgICAgICAgICAvLyBhZGQgImVwc2lsb24iIHRvIGVuc3VyZSBudW1iZXJzIGxpa2UgMS4wMDAwMDAwMDUgKHJlcHJlc2VudGVkIGFzIDEuMDAwMDAwMDA0OTk5Li4uKSBhcmUgcHJvcGVybHkgcm91bmRlZDoNCiAgICAgICAgICAgIHJldHVybiAocHJlY2lzaW9uKSA/IE51bWJlcigodmFsdWUgKyAyZS0xNikudG9GaXhlZChwcmVjaXNpb24pKSA6IHZhbHVlOw0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLmNvbXBhcmUgPSBmdW5jdGlvbiAoYSwgYikgew0KICAgICAgICAgICAgLyogcmV0dXJuczoNCiAgICAgICAgICAgICAtMTogYSA8IGINCiAgICAgICAgICAgICAwOiBhID0gYg0KICAgICAgICAgICAgIDE6IGEgPiBiDQogICAgICAgICAgICAgYW5kICphbnkqIG90aGVyIHZhbHVlIGZvciBhICE9IGIgKGUuZy4gdW5kZWZpbmVkLCBOYU4sIC0yIGV0Yy4pICovDQogICAgICAgICAgICBpZiAoKGEuY29tcGFyZSkgJiYNCiAgICAgICAgICAgICAgICAvLyBmb3IgInN5bW1ldHJpYyByZXN1bHRzIiBmb3JjZSB0b0NTUy1iYXNlZCBjb21wYXJpc29uDQogICAgICAgICAgICAgICAgLy8gb2YgUXVvdGVkIG9yIEFub255bW91cyBpZiBlaXRoZXIgdmFsdWUgaXMgb25lIG9mIHRob3NlDQogICAgICAgICAgICAgICAgIShiLnR5cGUgPT09ICdRdW90ZWQnIHx8IGIudHlwZSA9PT0gJ0Fub255bW91cycpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGEuY29tcGFyZShiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGIuY29tcGFyZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAtYi5jb21wYXJlKGEpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoYS50eXBlICE9PSBiLnR5cGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYSA9IGEudmFsdWU7DQogICAgICAgICAgICBiID0gYi52YWx1ZTsNCiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBhID09PSBiID8gMCA6IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKE5vZGUuY29tcGFyZShhW2ldLCBiW2ldKSAhPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLm51bWVyaWNDb21wYXJlID0gZnVuY3Rpb24gKGEsIGIpIHsNCiAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xDQogICAgICAgICAgICAgICAgOiBhID09PSBiID8gMA0KICAgICAgICAgICAgICAgICAgICA6IGEgPiBiID8gMSA6IHVuZGVmaW5lZDsNCiAgICAgICAgfTsNCiAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSByZXByZXNlbnRzIHJvb3Qgb2YgYXN0IGltcG9ydGVkIGJ5IHJlZmVyZW5jZQ0KICAgICAgICBOb2RlLnByb3RvdHlwZS5ibG9ja3NWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKHRoaXMudmlzaWJpbGl0eUJsb2NrcyA9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5QmxvY2tzID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2liaWxpdHlCbG9ja3MgIT09IDA7DQogICAgICAgIH07DQogICAgICAgIE5vZGUucHJvdG90eXBlLmFkZFZpc2liaWxpdHlCbG9jayA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLnZpc2liaWxpdHlCbG9ja3MgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eUJsb2NrcyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlCbG9ja3MgPSB0aGlzLnZpc2liaWxpdHlCbG9ja3MgKyAxOw0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLnByb3RvdHlwZS5yZW1vdmVWaXNpYmlsaXR5QmxvY2sgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAodGhpcy52aXNpYmlsaXR5QmxvY2tzID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlCbG9ja3MgPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5QmxvY2tzID0gdGhpcy52aXNpYmlsaXR5QmxvY2tzIC0gMTsNCiAgICAgICAgfTsNCiAgICAgICAgLy8gVHVybnMgb24gbm9kZSB2aXNpYmlsaXR5IC0gaWYgY2FsbGVkIG5vZGUgd2lsbCBiZSBzaG93biBpbiBvdXRwdXQgcmVnYXJkbGVzcw0KICAgICAgICAvLyBvZiB3aGV0aGVyIGl0IGNvbWVzIGZyb20gaW1wb3J0IGJ5IHJlZmVyZW5jZSBvciBub3QNCiAgICAgICAgTm9kZS5wcm90b3R5cGUuZW5zdXJlVmlzaWJpbGl0eSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMubm9kZVZpc2libGUgPSB0cnVlOw0KICAgICAgICB9Ow0KICAgICAgICAvLyBUdXJucyBvZmYgbm9kZSB2aXNpYmlsaXR5IC0gaWYgY2FsbGVkIG5vZGUgd2lsbCBOT1QgYmUgc2hvd24gaW4gb3V0cHV0IHJlZ2FyZGxlc3MNCiAgICAgICAgLy8gb2Ygd2hldGhlciBpdCBjb21lcyBmcm9tIGltcG9ydCBieSByZWZlcmVuY2Ugb3Igbm90DQogICAgICAgIE5vZGUucHJvdG90eXBlLmVuc3VyZUludmlzaWJpbGl0eSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMubm9kZVZpc2libGUgPSBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgLy8gcmV0dXJuIHZhbHVlczoNCiAgICAgICAgLy8gZmFsc2UgLSB0aGUgbm9kZSBtdXN0IG5vdCBiZSB2aXNpYmxlDQogICAgICAgIC8vIHRydWUgLSB0aGUgbm9kZSBtdXN0IGJlIHZpc2libGUNCiAgICAgICAgLy8gdW5kZWZpbmVkIG9yIG51bGwgLSB0aGUgbm9kZSBoYXMgdGhlIHNhbWUgdmlzaWJpbGl0eSBhcyBpdHMgcGFyZW50DQogICAgICAgIE5vZGUucHJvdG90eXBlLmlzVmlzaWJsZSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVWaXNpYmxlOw0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLnByb3RvdHlwZS52aXNpYmlsaXR5SW5mbyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgdmlzaWJpbGl0eUJsb2NrczogdGhpcy52aXNpYmlsaXR5QmxvY2tzLA0KICAgICAgICAgICAgICAgIG5vZGVWaXNpYmxlOiB0aGlzLm5vZGVWaXNpYmxlDQogICAgICAgICAgICB9Ow0KICAgICAgICB9Ow0KICAgICAgICBOb2RlLnByb3RvdHlwZS5jb3B5VmlzaWJpbGl0eUluZm8gPSBmdW5jdGlvbiAoaW5mbykgew0KICAgICAgICAgICAgaWYgKCFpbmZvKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5QmxvY2tzID0gaW5mby52aXNpYmlsaXR5QmxvY2tzOw0KICAgICAgICAgICAgdGhpcy5ub2RlVmlzaWJsZSA9IGluZm8ubm9kZVZpc2libGU7DQogICAgICAgIH07DQogICAgICAgIHJldHVybiBOb2RlOw0KICAgIH0oKSk7CgogICAgLy8NCiAgICAvLyBSR0IgQ29sb3JzIC0gI2ZmMDAxNCwgI2VlZQ0KICAgIC8vDQogICAgdmFyIENvbG9yID0gZnVuY3Rpb24gKHJnYiwgYSwgb3JpZ2luYWxGb3JtKSB7DQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCiAgICAgICAgLy8NCiAgICAgICAgLy8gVGhlIGVuZCBnb2FsIGhlcmUsIGlzIHRvIHBhcnNlIHRoZSBhcmd1bWVudHMNCiAgICAgICAgLy8gaW50byBhbiBpbnRlZ2VyIHRyaXBsZXQsIHN1Y2ggYXMgYDEyOCwgMjU1LCAwYA0KICAgICAgICAvLw0KICAgICAgICAvLyBUaGlzIGZhY2lsaXRhdGVzIG9wZXJhdGlvbnMgYW5kIGNvbnZlcnNpb25zLg0KICAgICAgICAvLw0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZ2IpKSB7DQogICAgICAgICAgICB0aGlzLnJnYiA9IHJnYjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChyZ2IubGVuZ3RoID49IDYpIHsNCiAgICAgICAgICAgIHRoaXMucmdiID0gW107DQogICAgICAgICAgICByZ2IubWF0Y2goLy57Mn0vZykubWFwKGZ1bmN0aW9uIChjLCBpKSB7DQogICAgICAgICAgICAgICAgaWYgKGkgPCAzKSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGYucmdiLnB1c2gocGFyc2VJbnQoYywgMTYpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGYuYWxwaGEgPSAocGFyc2VJbnQoYywgMTYpKSAvIDI1NTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMucmdiID0gW107DQogICAgICAgICAgICByZ2Iuc3BsaXQoJycpLm1hcChmdW5jdGlvbiAoYywgaSkgew0KICAgICAgICAgICAgICAgIGlmIChpIDwgMykgew0KICAgICAgICAgICAgICAgICAgICBzZWxmLnJnYi5wdXNoKHBhcnNlSW50KGMgKyBjLCAxNikpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hbHBoYSA9IChwYXJzZUludChjICsgYywgMTYpKSAvIDI1NTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmFscGhhID0gdGhpcy5hbHBoYSB8fCAodHlwZW9mIGEgPT09ICdudW1iZXInID8gYSA6IDEpOw0KICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsRm9ybSAhPT0gJ3VuZGVmaW5lZCcpIHsNCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvcmlnaW5hbEZvcm07DQogICAgICAgIH0NCiAgICB9Ow0KICAgIENvbG9yLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnQ29sb3InLA0KICAgICAgICBsdW1hOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgciA9IHRoaXMucmdiWzBdIC8gMjU1LCBnID0gdGhpcy5yZ2JbMV0gLyAyNTUsIGIgPSB0aGlzLnJnYlsyXSAvIDI1NTsNCiAgICAgICAgICAgIHIgPSAociA8PSAwLjAzOTI4KSA/IHIgLyAxMi45MiA6IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTsNCiAgICAgICAgICAgIGcgPSAoZyA8PSAwLjAzOTI4KSA/IGcgLyAxMi45MiA6IE1hdGgucG93KCgoZyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTsNCiAgICAgICAgICAgIGIgPSAoYiA8PSAwLjAzOTI4KSA/IGIgLyAxMi45MiA6IE1hdGgucG93KCgoYiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTsNCiAgICAgICAgICAgIHJldHVybiAwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGI7DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLnRvQ1NTKGNvbnRleHQpKTsNCiAgICAgICAgfSwNCiAgICAgICAgdG9DU1M6IGZ1bmN0aW9uIChjb250ZXh0LCBkb05vdENvbXByZXNzKSB7DQogICAgICAgICAgICB2YXIgY29tcHJlc3MgPSBjb250ZXh0ICYmIGNvbnRleHQuY29tcHJlc3MgJiYgIWRvTm90Q29tcHJlc3M7DQogICAgICAgICAgICB2YXIgY29sb3I7DQogICAgICAgICAgICB2YXIgYWxwaGE7DQogICAgICAgICAgICB2YXIgY29sb3JGdW5jdGlvbjsNCiAgICAgICAgICAgIHZhciBhcmdzID0gW107DQogICAgICAgICAgICAvLyBgdmFsdWVgIGlzIHNldCBpZiB0aGlzIGNvbG9yIHdhcyBvcmlnaW5hbGx5DQogICAgICAgICAgICAvLyBjb252ZXJ0ZWQgZnJvbSBhIG5hbWVkIGNvbG9yIHN0cmluZyBzbyB3ZSBuZWVkDQogICAgICAgICAgICAvLyB0byByZXNwZWN0IHRoaXMgYW5kIHRyeSB0byBvdXRwdXQgbmFtZWQgY29sb3IgdG9vLg0KICAgICAgICAgICAgYWxwaGEgPSB0aGlzLmZyb3VuZChjb250ZXh0LCB0aGlzLmFscGhhKTsNCiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUuaW5kZXhPZigncmdiJykgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhIDwgMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JGdW5jdGlvbiA9ICdyZ2JhJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhbHVlLmluZGV4T2YoJ2hzbCcpID09PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA8IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRnVuY3Rpb24gPSAnaHNsYSc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvckZ1bmN0aW9uID0gJ2hzbCc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChhbHBoYSA8IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3JGdW5jdGlvbiA9ICdyZ2JhJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzd2l0Y2ggKGNvbG9yRnVuY3Rpb24pIHsNCiAgICAgICAgICAgICAgICBjYXNlICdyZ2JhJzoNCiAgICAgICAgICAgICAgICAgICAgYXJncyA9IHRoaXMucmdiLm1hcChmdW5jdGlvbiAoYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wJDEoTWF0aC5yb3VuZChjKSwgMjU1KTsNCiAgICAgICAgICAgICAgICAgICAgfSkuY29uY2F0KGNsYW1wJDEoYWxwaGEsIDEpKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnaHNsYSc6DQogICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjbGFtcCQxKGFscGhhLCAxKSk7DQogICAgICAgICAgICAgICAgY2FzZSAnaHNsJzoNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLnRvSFNMKCk7DQogICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyb3VuZChjb250ZXh0LCBjb2xvci5oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJvdW5kKGNvbnRleHQsIGNvbG9yLnMgKiAxMDApICsgIiUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcm91bmQoY29udGV4dCwgY29sb3IubCAqIDEwMCkgKyAiJSINCiAgICAgICAgICAgICAgICAgICAgXS5jb25jYXQoYXJncyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoY29sb3JGdW5jdGlvbikgew0KICAgICAgICAgICAgICAgIC8vIFZhbHVlcyBhcmUgY2FwcGVkIGJldHdlZW4gYDBgIGFuZCBgMjU1YCwgcm91bmRlZCBhbmQgemVyby1wYWRkZWQuDQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yRnVuY3Rpb24gKyAiKCIgKyBhcmdzLmpvaW4oIiwiICsgKGNvbXByZXNzID8gJycgOiAnICcpKSArICIpIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbG9yID0gdGhpcy50b1JHQigpOw0KICAgICAgICAgICAgaWYgKGNvbXByZXNzKSB7DQogICAgICAgICAgICAgICAgdmFyIHNwbGl0Y29sb3IgPSBjb2xvci5zcGxpdCgnJyk7DQogICAgICAgICAgICAgICAgLy8gQ29udmVydCBjb2xvciB0byBzaG9ydCBmb3JtYXQNCiAgICAgICAgICAgICAgICBpZiAoc3BsaXRjb2xvclsxXSA9PT0gc3BsaXRjb2xvclsyXSAmJiBzcGxpdGNvbG9yWzNdID09PSBzcGxpdGNvbG9yWzRdICYmIHNwbGl0Y29sb3JbNV0gPT09IHNwbGl0Y29sb3JbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIyIgKyBzcGxpdGNvbG9yWzFdICsgc3BsaXRjb2xvclszXSArIHNwbGl0Y29sb3JbNV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGNvbG9yOw0KICAgICAgICB9LA0KICAgICAgICAvLw0KICAgICAgICAvLyBPcGVyYXRpb25zIGhhdmUgdG8gYmUgZG9uZSBwZXItY2hhbm5lbCwgaWYgbm90LA0KICAgICAgICAvLyBjaGFubmVscyB3aWxsIHNwaWxsIG9udG8gZWFjaCBvdGhlci4gT25jZSB3ZSBoYXZlDQogICAgICAgIC8vIG91ciByZXN1bHQsIGluIHRoZSBmb3JtIG9mIGFuIGludGVnZXIgdHJpcGxldCwNCiAgICAgICAgLy8gd2UgY3JlYXRlIGEgbmV3IENvbG9yIG5vZGUgdG8gaG9sZCB0aGUgcmVzdWx0Lg0KICAgICAgICAvLw0KICAgICAgICBvcGVyYXRlOiBmdW5jdGlvbiAoY29udGV4dCwgb3AsIG90aGVyKSB7DQogICAgICAgICAgICB2YXIgcmdiID0gbmV3IEFycmF5KDMpOw0KICAgICAgICAgICAgdmFyIGFscGhhID0gdGhpcy5hbHBoYSAqICgxIC0gb3RoZXIuYWxwaGEpICsgb3RoZXIuYWxwaGE7DQogICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IDM7IGMrKykgew0KICAgICAgICAgICAgICAgIHJnYltjXSA9IHRoaXMuX29wZXJhdGUoY29udGV4dCwgb3AsIHRoaXMucmdiW2NdLCBvdGhlci5yZ2JbY10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihyZ2IsIGFscGhhKTsNCiAgICAgICAgfSwNCiAgICAgICAgdG9SR0I6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0b0hleCh0aGlzLnJnYik7DQogICAgICAgIH0sDQogICAgICAgIHRvSFNMOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgciA9IHRoaXMucmdiWzBdIC8gMjU1LCBnID0gdGhpcy5yZ2JbMV0gLyAyNTUsIGIgPSB0aGlzLnJnYlsyXSAvIDI1NSwgYSA9IHRoaXMuYWxwaGE7DQogICAgICAgICAgICB2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYiksIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpOw0KICAgICAgICAgICAgdmFyIGg7DQogICAgICAgICAgICB2YXIgczsNCiAgICAgICAgICAgIHZhciBsID0gKG1heCArIG1pbikgLyAyOw0KICAgICAgICAgICAgdmFyIGQgPSBtYXggLSBtaW47DQogICAgICAgICAgICBpZiAobWF4ID09PSBtaW4pIHsNCiAgICAgICAgICAgICAgICBoID0gcyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7DQogICAgICAgICAgICAgICAgc3dpdGNoIChtYXgpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSByOg0KICAgICAgICAgICAgICAgICAgICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgZzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBiOg0KICAgICAgICAgICAgICAgICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBoIC89IDY7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4geyBoOiBoICogMzYwLCBzOiBzLCBsOiBsLCBhOiBhIH07DQogICAgICAgIH0sDQogICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwOi8vbWppamFja3Nvbi5jb20vMjAwOC8wMi9yZ2ItdG8taHNsLWFuZC1yZ2ItdG8taHN2LWNvbG9yLW1vZGVsLWNvbnZlcnNpb24tYWxnb3JpdGhtcy1pbi1qYXZhc2NyaXB0DQogICAgICAgIHRvSFNWOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgciA9IHRoaXMucmdiWzBdIC8gMjU1LCBnID0gdGhpcy5yZ2JbMV0gLyAyNTUsIGIgPSB0aGlzLnJnYlsyXSAvIDI1NSwgYSA9IHRoaXMuYWxwaGE7DQogICAgICAgICAgICB2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYiksIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpOw0KICAgICAgICAgICAgdmFyIGg7DQogICAgICAgICAgICB2YXIgczsNCiAgICAgICAgICAgIHZhciB2ID0gbWF4Ow0KICAgICAgICAgICAgdmFyIGQgPSBtYXggLSBtaW47DQogICAgICAgICAgICBpZiAobWF4ID09PSAwKSB7DQogICAgICAgICAgICAgICAgcyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBzID0gZCAvIG1heDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChtYXggPT09IG1pbikgew0KICAgICAgICAgICAgICAgIGggPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChtYXgpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSByOg0KICAgICAgICAgICAgICAgICAgICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgZzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBiOg0KICAgICAgICAgICAgICAgICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBoIC89IDY7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4geyBoOiBoICogMzYwLCBzOiBzLCB2OiB2LCBhOiBhIH07DQogICAgICAgIH0sDQogICAgICAgIHRvQVJHQjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRvSGV4KFt0aGlzLmFscGhhICogMjU1XS5jb25jYXQodGhpcy5yZ2IpKTsNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24gKHgpIHsNCiAgICAgICAgICAgIHJldHVybiAoeC5yZ2IgJiYNCiAgICAgICAgICAgICAgICB4LnJnYlswXSA9PT0gdGhpcy5yZ2JbMF0gJiYNCiAgICAgICAgICAgICAgICB4LnJnYlsxXSA9PT0gdGhpcy5yZ2JbMV0gJiYNCiAgICAgICAgICAgICAgICB4LnJnYlsyXSA9PT0gdGhpcy5yZ2JbMl0gJiYNCiAgICAgICAgICAgICAgICB4LmFscGhhID09PSB0aGlzLmFscGhhKSA/IDAgOiB1bmRlZmluZWQ7DQogICAgICAgIH0NCiAgICB9KTsNCiAgICBDb2xvci5mcm9tS2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7DQogICAgICAgIHZhciBjOw0KICAgICAgICB2YXIga2V5ID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpOw0KICAgICAgICBpZiAoY29sb3JzLmhhc093blByb3BlcnR5KGtleSkpIHsNCiAgICAgICAgICAgIGMgPSBuZXcgQ29sb3IoY29sb3JzW2tleV0uc2xpY2UoMSkpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3RyYW5zcGFyZW50Jykgew0KICAgICAgICAgICAgYyA9IG5ldyBDb2xvcihbMCwgMCwgMF0sIDApOw0KICAgICAgICB9DQogICAgICAgIGlmIChjKSB7DQogICAgICAgICAgICBjLnZhbHVlID0ga2V5d29yZDsNCiAgICAgICAgICAgIHJldHVybiBjOw0KICAgICAgICB9DQogICAgfTsNCiAgICBmdW5jdGlvbiBjbGFtcCQxKHYsIG1heCkgew0KICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodiwgMCksIG1heCk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIHRvSGV4KHYpIHsNCiAgICAgICAgcmV0dXJuICIjIiArIHYubWFwKGZ1bmN0aW9uIChjKSB7DQogICAgICAgICAgICBjID0gY2xhbXAkMShNYXRoLnJvdW5kKGMpLCAyNTUpOw0KICAgICAgICAgICAgcmV0dXJuIChjIDwgMTYgPyAnMCcgOiAnJykgKyBjLnRvU3RyaW5nKDE2KTsNCiAgICAgICAgfSkuam9pbignJyk7DQogICAgfQoKICAgIHZhciBQYXJlbiA9IGZ1bmN0aW9uIChub2RlKSB7DQogICAgICAgIHRoaXMudmFsdWUgPSBub2RlOw0KICAgIH07DQogICAgUGFyZW4ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdQYXJlbicsDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgb3V0cHV0LmFkZCgnKCcpOw0KICAgICAgICAgICAgdGhpcy52YWx1ZS5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgICAgIG91dHB1dC5hZGQoJyknKTsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW4odGhpcy52YWx1ZS5ldmFsKGNvbnRleHQpKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBfbm9TcGFjZUNvbWJpbmF0b3JzID0gew0KICAgICAgICAnJzogdHJ1ZSwNCiAgICAgICAgJyAnOiB0cnVlLA0KICAgICAgICAnfCc6IHRydWUNCiAgICB9Ow0KICAgIHZhciBDb21iaW5hdG9yID0gZnVuY3Rpb24gKHZhbHVlKSB7DQogICAgICAgIGlmICh2YWx1ZSA9PT0gJyAnKSB7DQogICAgICAgICAgICB0aGlzLnZhbHVlID0gJyAnOw0KICAgICAgICAgICAgdGhpcy5lbXB0eU9yV2hpdGVzcGFjZSA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUgPyB2YWx1ZS50cmltKCkgOiAnJzsNCiAgICAgICAgICAgIHRoaXMuZW1wdHlPcldoaXRlc3BhY2UgPSB0aGlzLnZhbHVlID09PSAnJzsNCiAgICAgICAgfQ0KICAgIH07DQogICAgQ29tYmluYXRvci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBOb2RlKCksIHsNCiAgICAgICAgdHlwZTogJ0NvbWJpbmF0b3InLA0KICAgICAgICBnZW5DU1M6IGZ1bmN0aW9uIChjb250ZXh0LCBvdXRwdXQpIHsNCiAgICAgICAgICAgIHZhciBzcGFjZU9yRW1wdHkgPSAoY29udGV4dC5jb21wcmVzcyB8fCBfbm9TcGFjZUNvbWJpbmF0b3JzW3RoaXMudmFsdWVdKSA/ICcnIDogJyAnOw0KICAgICAgICAgICAgb3V0cHV0LmFkZChzcGFjZU9yRW1wdHkgKyB0aGlzLnZhbHVlICsgc3BhY2VPckVtcHR5KTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBFbGVtZW50ID0gZnVuY3Rpb24gKGNvbWJpbmF0b3IsIHZhbHVlLCBpc1ZhcmlhYmxlLCBpbmRleCwgY3VycmVudEZpbGVJbmZvLCB2aXNpYmlsaXR5SW5mbykgew0KICAgICAgICB0aGlzLmNvbWJpbmF0b3IgPSBjb21iaW5hdG9yIGluc3RhbmNlb2YgQ29tYmluYXRvciA/DQogICAgICAgICAgICBjb21iaW5hdG9yIDogbmV3IENvbWJpbmF0b3IoY29tYmluYXRvcik7DQogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUudHJpbSgpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHZhbHVlKSB7DQogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLnZhbHVlID0gJyc7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5pc1ZhcmlhYmxlID0gaXNWYXJpYWJsZTsNCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgIHRoaXMuY29weVZpc2liaWxpdHlJbmZvKHZpc2liaWxpdHlJbmZvKTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy5jb21iaW5hdG9yLCB0aGlzKTsNCiAgICB9Ow0KICAgIEVsZW1lbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdFbGVtZW50JywNCiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiAodmlzaXRvcikgew0KICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTsNCiAgICAgICAgICAgIHRoaXMuY29tYmluYXRvciA9IHZpc2l0b3IudmlzaXQodGhpcy5jb21iaW5hdG9yKTsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZpc2l0b3IudmlzaXQodmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHRoaXMuY29tYmluYXRvciwgdGhpcy52YWx1ZS5ldmFsID8gdGhpcy52YWx1ZS5ldmFsKGNvbnRleHQpIDogdGhpcy52YWx1ZSwgdGhpcy5pc1ZhcmlhYmxlLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSwgdGhpcy52aXNpYmlsaXR5SW5mbygpKTsNCiAgICAgICAgfSwNCiAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudCh0aGlzLmNvbWJpbmF0b3IsIHRoaXMudmFsdWUsIHRoaXMuaXNWYXJpYWJsZSwgdGhpcy5nZXRJbmRleCgpLCB0aGlzLmZpbGVJbmZvKCksIHRoaXMudmlzaWJpbGl0eUluZm8oKSk7DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLnRvQ1NTKGNvbnRleHQpLCB0aGlzLmZpbGVJbmZvKCksIHRoaXMuZ2V0SW5kZXgoKSk7DQogICAgICAgIH0sDQogICAgICAgIHRvQ1NTOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwge307DQogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlOw0KICAgICAgICAgICAgdmFyIGZpcnN0U2VsZWN0b3IgPSBjb250ZXh0LmZpcnN0U2VsZWN0b3I7DQogICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQYXJlbikgew0KICAgICAgICAgICAgICAgIC8vIHNlbGVjdG9yIGluIHBhcmVucyBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IG91dGVyIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgLy8gZmxhZ3MgKGJyZWFrcyBvbmx5IGludGVycG9sYXRlZCBzZWxlY3RvcnMgLSBzZWUgIzE5NzMpDQogICAgICAgICAgICAgICAgY29udGV4dC5maXJzdFNlbGVjdG9yID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9DU1MgPyB2YWx1ZS50b0NTUyhjb250ZXh0KSA6IHZhbHVlOw0KICAgICAgICAgICAgY29udGV4dC5maXJzdFNlbGVjdG9yID0gZmlyc3RTZWxlY3RvcjsNCiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgJiYgdGhpcy5jb21iaW5hdG9yLnZhbHVlLmNoYXJBdCgwKSA9PT0gJyYnKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tYmluYXRvci50b0NTUyhjb250ZXh0KSArIHZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIE1hdGgkMSA9IHsNCiAgICAgICAgQUxXQVlTOiAwLA0KICAgICAgICBQQVJFTlNfRElWSVNJT046IDEsDQogICAgICAgIFBBUkVOUzogMg0KICAgICAgICAvLyByZW1vdmVkIC0gU1RSSUNUX0xFR0FDWTogMw0KICAgIH07DQogICAgdmFyIFJld3JpdGVVcmxzID0gew0KICAgICAgICBPRkY6IDAsDQogICAgICAgIExPQ0FMOiAxLA0KICAgICAgICBBTEw6IDINCiAgICB9OwoKICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIG9iamVjdCB0eXBlIG9mIHRoZSBnaXZlbiBwYXlsb2FkDQogICAgICoNCiAgICAgKiBAcGFyYW0geyp9IHBheWxvYWQNCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGdldFR5cGUocGF5bG9hZCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHBheWxvYWQpLnNsaWNlKDgsIC0xKTsNCiAgICB9DQogICAgLyoqDQogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3QgKGV4Y2x1ZGluZyBzcGVjaWFsIGNsYXNzZXMgb3Igb2JqZWN0cyB3aXRoIG90aGVyIHByb3RvdHlwZXMpDQogICAgICoNCiAgICAgKiBAcGFyYW0geyp9IHBheWxvYWQNCiAgICAgKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QocGF5bG9hZCkgew0KICAgICAgICBpZiAoZ2V0VHlwZShwYXlsb2FkKSAhPT0gJ09iamVjdCcpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIHJldHVybiBwYXlsb2FkLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHBheWxvYWQpID09PSBPYmplY3QucHJvdG90eXBlOw0KICAgIH0NCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gYXJyYXkNCiAgICAgKg0KICAgICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkDQogICAgICogQHJldHVybnMge3BheWxvYWQgaXMgYW55W119DQogICAgICovDQogICAgZnVuY3Rpb24gaXNBcnJheShwYXlsb2FkKSB7DQogICAgICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnQXJyYXknOw0KICAgIH0KCiAgICAvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlDQogICAgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUNCiAgICBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQogICAgVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KICAgIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRUQNCiAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLA0KICAgIE1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuDQoNCiAgICBTZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMNCiAgICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KICAgIGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkgew0KICAgICAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDsNCiAgICAgICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKQ0KICAgICAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspDQogICAgICAgICAgICAgICAgcltrXSA9IGFbal07DQogICAgICAgIHJldHVybiByOw0KICAgIH0KCiAgICBmdW5jdGlvbiBhc3NpZ25Qcm9wKGNhcnJ5LCBrZXksIG5ld1ZhbCwgb3JpZ2luYWxPYmplY3QsIGluY2x1ZGVOb25lbnVtZXJhYmxlKSB7DQogICAgICAgIHZhciBwcm9wVHlwZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob3JpZ2luYWxPYmplY3QsIGtleSkNCiAgICAgICAgICAgID8gJ2VudW1lcmFibGUnDQogICAgICAgICAgICA6ICdub25lbnVtZXJhYmxlJzsNCiAgICAgICAgaWYgKHByb3BUeXBlID09PSAnZW51bWVyYWJsZScpDQogICAgICAgICAgICBjYXJyeVtrZXldID0gbmV3VmFsOw0KICAgICAgICBpZiAoaW5jbHVkZU5vbmVudW1lcmFibGUgJiYgcHJvcFR5cGUgPT09ICdub25lbnVtZXJhYmxlJykgew0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhcnJ5LCBrZXksIHsNCiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsLA0KICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLA0KICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8qKg0KICAgICAqIENvcHkgKGNsb25lKSBhbiBvYmplY3QgYW5kIGFsbCBpdHMgcHJvcHMgcmVjdXJzaXZlbHkgdG8gZ2V0IHJpZCBvZiBhbnkgcHJvcCByZWZlcmVuY2VkIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuIEFycmF5cyBhcmUgYWxzbyBjbG9uZWQsIGhvd2V2ZXIgb2JqZWN0cyBpbnNpZGUgYXJyYXlzIGFyZSBzdGlsbCBsaW5rZWQuDQogICAgICoNCiAgICAgKiBAZXhwb3J0DQogICAgICogQHRlbXBsYXRlIFQNCiAgICAgKiBAcGFyYW0ge1R9IHRhcmdldCBUYXJnZXQgY2FuIGJlIGFueXRoaW5nDQogICAgICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9ucz17fV0gT3B0aW9ucyBjYW4gYmUgYHByb3BzYCBvciBgbm9uZW51bWVyYWJsZWANCiAgICAgKiBAcmV0dXJucyB7VH0gdGhlIHRhcmdldCB3aXRoIHJlcGxhY2VkIHZhbHVlcw0KICAgICAqIEBleHBvcnQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBjb3B5KHRhcmdldCwgb3B0aW9ucykgew0KICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfQ0KICAgICAgICBpZiAoaXNBcnJheSh0YXJnZXQpKQ0KICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGNvcHkoaSwgb3B0aW9ucyk7IH0pOw0KICAgICAgICBpZiAoIWlzUGxhaW5PYmplY3QodGFyZ2V0KSkNCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7DQogICAgICAgIHZhciBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7DQogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpOw0KICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheXMocHJvcHMsIHN5bWJvbHMpLnJlZHVjZShmdW5jdGlvbiAoY2FycnksIGtleSkgew0KICAgICAgICAgICAgaWYgKGlzQXJyYXkob3B0aW9ucy5wcm9wcykgJiYgIW9wdGlvbnMucHJvcHMuaW5jbHVkZXMoa2V5KSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBjYXJyeTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciB2YWwgPSB0YXJnZXRba2V5XTsNCiAgICAgICAgICAgIHZhciBuZXdWYWwgPSBjb3B5KHZhbCwgb3B0aW9ucyk7DQogICAgICAgICAgICBhc3NpZ25Qcm9wKGNhcnJ5LCBrZXksIG5ld1ZhbCwgdGFyZ2V0LCBvcHRpb25zLm5vbmVudW1lcmFibGUpOw0KICAgICAgICAgICAgcmV0dXJuIGNhcnJ5Ow0KICAgICAgICB9LCB7fSk7DQogICAgfQoKICAgIC8qIGpzaGludCBwcm90bzogdHJ1ZSAqLw0KICAgIGZ1bmN0aW9uIGdldExvY2F0aW9uKGluZGV4LCBpbnB1dFN0cmVhbSkgew0KICAgICAgICB2YXIgbiA9IGluZGV4ICsgMTsNCiAgICAgICAgdmFyIGxpbmUgPSBudWxsOw0KICAgICAgICB2YXIgY29sdW1uID0gLTE7DQogICAgICAgIHdoaWxlICgtLW4gPj0gMCAmJiBpbnB1dFN0cmVhbS5jaGFyQXQobikgIT09ICdcbicpIHsNCiAgICAgICAgICAgIGNvbHVtbisrOw0KICAgICAgICB9DQogICAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICdudW1iZXInKSB7DQogICAgICAgICAgICBsaW5lID0gKGlucHV0U3RyZWFtLnNsaWNlKDAsIGluZGV4KS5tYXRjaCgvXG4vZykgfHwgJycpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbGluZTogbGluZSwNCiAgICAgICAgICAgIGNvbHVtbjogY29sdW1uDQogICAgICAgIH07DQogICAgfQ0KICAgIGZ1bmN0aW9uIGNvcHlBcnJheShhcnIpIHsNCiAgICAgICAgdmFyIGk7DQogICAgICAgIHZhciBsZW5ndGggPSBhcnIubGVuZ3RoOw0KICAgICAgICB2YXIgY29weSA9IG5ldyBBcnJheShsZW5ndGgpOw0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJbaV07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGNvcHk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGNsb25lKG9iaikgew0KICAgICAgICB2YXIgY2xvbmVkID0ge307DQogICAgICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7DQogICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7DQogICAgICAgICAgICAgICAgY2xvbmVkW3Byb3BdID0gb2JqW3Byb3BdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBjbG9uZWQ7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGRlZmF1bHRzKG9iajEsIG9iajIpIHsNCiAgICAgICAgdmFyIG5ld09iaiA9IG9iajIgfHwge307DQogICAgICAgIGlmICghb2JqMi5fZGVmYXVsdHMpIHsNCiAgICAgICAgICAgIG5ld09iaiA9IHt9Ow0KICAgICAgICAgICAgdmFyIGRlZmF1bHRzXzEgPSBjb3B5KG9iajEpOw0KICAgICAgICAgICAgbmV3T2JqLl9kZWZhdWx0cyA9IGRlZmF1bHRzXzE7DQogICAgICAgICAgICB2YXIgY2xvbmVkID0gb2JqMiA/IGNvcHkob2JqMikgOiB7fTsNCiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3T2JqLCBkZWZhdWx0c18xLCBjbG9uZWQpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBuZXdPYmo7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGNvcHlPcHRpb25zKG9iajEsIG9iajIpIHsNCiAgICAgICAgaWYgKG9iajIgJiYgb2JqMi5fZGVmYXVsdHMpIHsNCiAgICAgICAgICAgIHJldHVybiBvYmoyOw0KICAgICAgICB9DQogICAgICAgIHZhciBvcHRzID0gZGVmYXVsdHMob2JqMSwgb2JqMik7DQogICAgICAgIGlmIChvcHRzLnN0cmljdE1hdGgpIHsNCiAgICAgICAgICAgIG9wdHMubWF0aCA9IE1hdGgkMS5QQVJFTlM7DQogICAgICAgIH0NCiAgICAgICAgLy8gQmFjayBjb21wYXQgd2l0aCBjaGFuZ2VkIHJlbGF0aXZlVXJscyBvcHRpb24NCiAgICAgICAgaWYgKG9wdHMucmVsYXRpdmVVcmxzKSB7DQogICAgICAgICAgICBvcHRzLnJld3JpdGVVcmxzID0gUmV3cml0ZVVybHMuQUxMOw0KICAgICAgICB9DQogICAgICAgIGlmICh0eXBlb2Ygb3B0cy5tYXRoID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgc3dpdGNoIChvcHRzLm1hdGgudG9Mb3dlckNhc2UoKSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2Fsd2F5cyc6DQogICAgICAgICAgICAgICAgICAgIG9wdHMubWF0aCA9IE1hdGgkMS5BTFdBWVM7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmVucy1kaXZpc2lvbic6DQogICAgICAgICAgICAgICAgICAgIG9wdHMubWF0aCA9IE1hdGgkMS5QQVJFTlNfRElWSVNJT047DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmljdCc6DQogICAgICAgICAgICAgICAgY2FzZSAncGFyZW5zJzoNCiAgICAgICAgICAgICAgICAgICAgb3B0cy5tYXRoID0gTWF0aCQxLlBBUkVOUzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgb3B0cy5tYXRoID0gTWF0aCQxLlBBUkVOUzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAodHlwZW9mIG9wdHMucmV3cml0ZVVybHMgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICBzd2l0Y2ggKG9wdHMucmV3cml0ZVVybHMudG9Mb3dlckNhc2UoKSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ29mZic6DQogICAgICAgICAgICAgICAgICAgIG9wdHMucmV3cml0ZVVybHMgPSBSZXdyaXRlVXJscy5PRkY7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xvY2FsJzoNCiAgICAgICAgICAgICAgICAgICAgb3B0cy5yZXdyaXRlVXJscyA9IFJld3JpdGVVcmxzLkxPQ0FMOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdhbGwnOg0KICAgICAgICAgICAgICAgICAgICBvcHRzLnJld3JpdGVVcmxzID0gUmV3cml0ZVVybHMuQUxMOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gb3B0czsNCiAgICB9DQogICAgZnVuY3Rpb24gbWVyZ2Uob2JqMSwgb2JqMikgew0KICAgICAgICBmb3IgKHZhciBwcm9wIGluIG9iajIpIHsNCiAgICAgICAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KHByb3ApKSB7DQogICAgICAgICAgICAgICAgb2JqMVtwcm9wXSA9IG9iajJbcHJvcF07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iajE7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGZsYXR0ZW5BcnJheShhcnIsIHJlc3VsdCkgew0KICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHsgcmVzdWx0ID0gW107IH0NCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0gYXJyLmxlbmd0aDsgaSA8IGxlbmd0aF8xOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGFycltpXTsNCiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgew0KICAgICAgICAgICAgICAgIGZsYXR0ZW5BcnJheSh2YWx1ZSwgcmVzdWx0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9CgogICAgdmFyIHV0aWxzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBnZXRMb2NhdGlvbjogZ2V0TG9jYXRpb24sCiAgICAgICAgY29weUFycmF5OiBjb3B5QXJyYXksCiAgICAgICAgY2xvbmU6IGNsb25lLAogICAgICAgIGRlZmF1bHRzOiBkZWZhdWx0cywKICAgICAgICBjb3B5T3B0aW9uczogY29weU9wdGlvbnMsCiAgICAgICAgbWVyZ2U6IG1lcmdlLAogICAgICAgIGZsYXR0ZW5BcnJheTogZmxhdHRlbkFycmF5CiAgICB9KTsKCiAgICB2YXIgYW5vbnltb3VzRnVuYyA9IC8oPGFub255bW91cz58RnVuY3Rpb24pOihcZCspOihcZCspLzsNCiAgICAvKioNCiAgICAgKiBUaGlzIGlzIGEgY2VudHJhbGl6ZWQgY2xhc3Mgb2YgYW55IGVycm9yIHRoYXQgY291bGQgYmUgdGhyb3duIGludGVybmFsbHkgKG1vc3RseSBieSB0aGUgcGFyc2VyKS4NCiAgICAgKiBCZXNpZGVzIHN0YW5kYXJkIC5tZXNzYWdlIGl0IGtlZXBzIHNvbWUgYWRkaXRpb25hbCBkYXRhIGxpa2UgYSBwYXRoIHRvIHRoZSBmaWxlIHdoZXJlIHRoZSBlcnJvcg0KICAgICAqIG9jY3VycmVkIGFsb25nIHdpdGggbGluZSBhbmQgY29sdW1uIG51bWJlcnMuDQogICAgICoNCiAgICAgKiBAY2xhc3MNCiAgICAgKiBAZXh0ZW5kcyBFcnJvcg0KICAgICAqIEB0eXBlIHttb2R1bGUuTGVzc0Vycm9yfQ0KICAgICAqDQogICAgICogQHByb3Age3N0cmluZ30gdHlwZQ0KICAgICAqIEBwcm9wIHtzdHJpbmd9IGZpbGVuYW1lDQogICAgICogQHByb3Age251bWJlcn0gaW5kZXgNCiAgICAgKiBAcHJvcCB7bnVtYmVyfSBsaW5lDQogICAgICogQHByb3Age251bWJlcn0gY29sdW1uDQogICAgICogQHByb3Age251bWJlcn0gY2FsbExpbmUNCiAgICAgKiBAcHJvcCB7bnVtYmVyfSBjYWxsRXh0cmFjdA0KICAgICAqIEBwcm9wIHtzdHJpbmdbXX0gZXh0cmFjdA0KICAgICAqDQogICAgICogQHBhcmFtIHtPYmplY3R9IGUgICAgICAgICAgICAgIC0gQW4gZXJyb3Igb2JqZWN0IHRvIHdyYXAgYXJvdW5kIG9yIGp1c3QgYSBkZXNjcmlwdGl2ZSBvYmplY3QNCiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmlsZUNvbnRlbnRNYXAgLSBBbiBvYmplY3Qgd2l0aCBmaWxlIGNvbnRlbnRzIGluICdjb250ZW50cycgcHJvcGVydHkgKGxpa2UgaW1wb3J0TWFuYWdlcikgQHRvZG8gLSBtb3ZlIHRvIGZpbGVNYW5hZ2VyPw0KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudEZpbGVuYW1lXQ0KICAgICAqLw0KICAgIHZhciBMZXNzRXJyb3IgPSBmdW5jdGlvbiAoZSwgZmlsZUNvbnRlbnRNYXAsIGN1cnJlbnRGaWxlbmFtZSkgew0KICAgICAgICBFcnJvci5jYWxsKHRoaXMpOw0KICAgICAgICB2YXIgZmlsZW5hbWUgPSBlLmZpbGVuYW1lIHx8IGN1cnJlbnRGaWxlbmFtZTsNCiAgICAgICAgdGhpcy5tZXNzYWdlID0gZS5tZXNzYWdlOw0KICAgICAgICB0aGlzLnN0YWNrID0gZS5zdGFjazsNCiAgICAgICAgaWYgKGZpbGVDb250ZW50TWFwICYmIGZpbGVuYW1lKSB7DQogICAgICAgICAgICB2YXIgaW5wdXQgPSBmaWxlQ29udGVudE1hcC5jb250ZW50c1tmaWxlbmFtZV07DQogICAgICAgICAgICB2YXIgbG9jID0gZ2V0TG9jYXRpb24oZS5pbmRleCwgaW5wdXQpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBsb2MubGluZTsNCiAgICAgICAgICAgIHZhciBjb2wgPSBsb2MuY29sdW1uOw0KICAgICAgICAgICAgdmFyIGNhbGxMaW5lID0gZS5jYWxsICYmIGdldExvY2F0aW9uKGUuY2FsbCwgaW5wdXQpLmxpbmU7DQogICAgICAgICAgICB2YXIgbGluZXMgPSBpbnB1dCA/IGlucHV0LnNwbGl0KCdcbicpIDogJyc7DQogICAgICAgICAgICB0aGlzLnR5cGUgPSBlLnR5cGUgfHwgJ1N5bnRheCc7DQogICAgICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7DQogICAgICAgICAgICB0aGlzLmluZGV4ID0gZS5pbmRleDsNCiAgICAgICAgICAgIHRoaXMubGluZSA9IHR5cGVvZiBsaW5lID09PSAnbnVtYmVyJyA/IGxpbmUgKyAxIDogbnVsbDsNCiAgICAgICAgICAgIHRoaXMuY29sdW1uID0gY29sOw0KICAgICAgICAgICAgaWYgKCF0aGlzLmxpbmUgJiYgdGhpcy5zdGFjaykgew0KICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IHRoaXMuc3RhY2subWF0Y2goYW5vbnltb3VzRnVuYyk7DQogICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IGhvdyB0aGlzIGVudmlyb25tZW50IHN0cmluZ2lmaWVzIGFub255bW91cyBmdW5jdGlvbnMNCiAgICAgICAgICAgICAgICAgKiBzbyB3ZSBjYW4gY29ycmVjdGx5IG1hcCBwbHVnaW4gZXJyb3JzLg0KICAgICAgICAgICAgICAgICAqDQogICAgICAgICAgICAgICAgICogTm90ZSwgaW4gTm9kZSA4LCB0aGUgb3V0cHV0IG9mIGFub255bW91cyBmdW5jcyB2YXJpZWQgYmFzZWQgb24gcGFyYW1ldGVycw0KICAgICAgICAgICAgICAgICAqIGJlaW5nIHByZXNlbnQgb3Igbm90LCBzbyB3ZSBpbmplY3QgZHVtbXkgcGFyYW1zLg0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEZ1bmN0aW9uKCdhJywgJ3Rocm93IG5ldyBFcnJvcigpJyk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmVBZGp1c3QgPSAwOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGZ1bmMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZS5zdGFjay5tYXRjaChhbm9ueW1vdXNGdW5jKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBwYXJzZUludChtYXRjaFsyXSk7DQogICAgICAgICAgICAgICAgICAgIGxpbmVBZGp1c3QgPSAxIC0gbGluZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFsyXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lID0gcGFyc2VJbnQoZm91bmRbMl0pICsgbGluZUFkanVzdDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRbM10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uID0gcGFyc2VJbnQoZm91bmRbM10pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5jYWxsTGluZSA9IGNhbGxMaW5lICsgMTsNCiAgICAgICAgICAgIHRoaXMuY2FsbEV4dHJhY3QgPSBsaW5lc1tjYWxsTGluZV07DQogICAgICAgICAgICB0aGlzLmV4dHJhY3QgPSBbDQogICAgICAgICAgICAgICAgbGluZXNbdGhpcy5saW5lIC0gMl0sDQogICAgICAgICAgICAgICAgbGluZXNbdGhpcy5saW5lIC0gMV0sDQogICAgICAgICAgICAgICAgbGluZXNbdGhpcy5saW5lXQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAndW5kZWZpbmVkJykgew0KICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uICgpIHsgfTsNCiAgICAgICAgRi5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7DQogICAgICAgIExlc3NFcnJvci5wcm90b3R5cGUgPSBuZXcgRigpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgTGVzc0Vycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsNCiAgICB9DQogICAgTGVzc0Vycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExlc3NFcnJvcjsNCiAgICAvKioNCiAgICAgKiBBbiBvdmVycmlkZGVuIHZlcnNpb24gb2YgdGhlIGRlZmF1bHQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZw0KICAgICAqIHdoaWNoIHVzZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgYSBoZWxwZnVsIG1lc3NhZ2UuDQogICAgICoNCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucw0KICAgICAqIEByZXR1cm5zIHtzdHJpbmd9DQogICAgICovDQogICAgTGVzc0Vycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7DQogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9Ow0KICAgICAgICB2YXIgbWVzc2FnZSA9ICcnOw0KICAgICAgICB2YXIgZXh0cmFjdCA9IHRoaXMuZXh0cmFjdCB8fCBbXTsNCiAgICAgICAgdmFyIGVycm9yID0gW107DQogICAgICAgIHZhciBzdHlsaXplID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyOyB9Ow0KICAgICAgICBpZiAob3B0aW9ucy5zdHlsaXplKSB7DQogICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBvcHRpb25zLnN0eWxpemU7DQogICAgICAgICAgICBpZiAodHlwZSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCJvcHRpb25zLnN0eWxpemUgc2hvdWxkIGJlIGEgZnVuY3Rpb24sIGdvdCBhICIgKyB0eXBlICsgIiEiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN0eWxpemUgPSBvcHRpb25zLnN0eWxpemU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRoaXMubGluZSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRyYWN0WzBdID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgIGVycm9yLnB1c2goc3R5bGl6ZSh0aGlzLmxpbmUgLSAxICsgIiAiICsgZXh0cmFjdFswXSwgJ2dyZXknKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodHlwZW9mIGV4dHJhY3RbMV0gPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgdmFyIGVycm9yVHh0ID0gdGhpcy5saW5lICsgIiAiOw0KICAgICAgICAgICAgICAgIGlmIChleHRyYWN0WzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9yVHh0ICs9IGV4dHJhY3RbMV0uc2xpY2UoMCwgdGhpcy5jb2x1bW4pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxpemUoc3R5bGl6ZShzdHlsaXplKGV4dHJhY3RbMV0uc3Vic3RyKHRoaXMuY29sdW1uLCAxKSwgJ2JvbGQnKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFsxXS5zbGljZSh0aGlzLmNvbHVtbiArIDEpLCAncmVkJyksICdpbnZlcnNlJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVycm9yLnB1c2goZXJyb3JUeHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRyYWN0WzJdID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgIGVycm9yLnB1c2goc3R5bGl6ZSh0aGlzLmxpbmUgKyAxICsgIiAiICsgZXh0cmFjdFsyXSwgJ2dyZXknKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlcnJvciA9IGVycm9yLmpvaW4oJ1xuJykgKyBzdHlsaXplKCcnLCAncmVzZXQnKSArICJcbiI7DQogICAgICAgIH0NCiAgICAgICAgbWVzc2FnZSArPSBzdHlsaXplKHRoaXMudHlwZSArICJFcnJvcjogIiArIHRoaXMubWVzc2FnZSwgJ3JlZCcpOw0KICAgICAgICBpZiAodGhpcy5maWxlbmFtZSkgew0KICAgICAgICAgICAgbWVzc2FnZSArPSBzdHlsaXplKCcgaW4gJywgJ3JlZCcpICsgdGhpcy5maWxlbmFtZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5saW5lKSB7DQogICAgICAgICAgICBtZXNzYWdlICs9IHN0eWxpemUoIiBvbiBsaW5lICIgKyB0aGlzLmxpbmUgKyAiLCBjb2x1bW4gIiArICh0aGlzLmNvbHVtbiArIDEpICsgIjoiLCAnZ3JleScpOw0KICAgICAgICB9DQogICAgICAgIG1lc3NhZ2UgKz0gIlxuIiArIGVycm9yOw0KICAgICAgICBpZiAodGhpcy5jYWxsTGluZSkgew0KICAgICAgICAgICAgbWVzc2FnZSArPSBzdHlsaXplKCdmcm9tICcsICdyZWQnKSArICh0aGlzLmZpbGVuYW1lIHx8ICcnKSArICIvbiI7DQogICAgICAgICAgICBtZXNzYWdlICs9IHN0eWxpemUodGhpcy5jYWxsTGluZSwgJ2dyZXknKSArICIgIiArIHRoaXMuY2FsbEV4dHJhY3QgKyAiL24iOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBtZXNzYWdlOw0KICAgIH07CgogICAgdmFyIFNlbGVjdG9yID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHRlbmRMaXN0LCBjb25kaXRpb24sIGluZGV4LCBjdXJyZW50RmlsZUluZm8sIHZpc2liaWxpdHlJbmZvKSB7DQogICAgICAgIHRoaXMuZXh0ZW5kTGlzdCA9IGV4dGVuZExpc3Q7DQogICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOw0KICAgICAgICB0aGlzLmV2YWxkQ29uZGl0aW9uID0gIWNvbmRpdGlvbjsNCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzKGVsZW1lbnRzKTsNCiAgICAgICAgdGhpcy5taXhpbkVsZW1lbnRzXyA9IHVuZGVmaW5lZDsNCiAgICAgICAgdGhpcy5jb3B5VmlzaWJpbGl0eUluZm8odmlzaWJpbGl0eUluZm8pOw0KICAgICAgICB0aGlzLnNldFBhcmVudCh0aGlzLmVsZW1lbnRzLCB0aGlzKTsNCiAgICB9Ow0KICAgIFNlbGVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnU2VsZWN0b3InLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50cykgew0KICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSB2aXNpdG9yLnZpc2l0QXJyYXkodGhpcy5lbGVtZW50cyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5leHRlbmRMaXN0KSB7DQogICAgICAgICAgICAgICAgdGhpcy5leHRlbmRMaXN0ID0gdmlzaXRvci52aXNpdEFycmF5KHRoaXMuZXh0ZW5kTGlzdCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb24pIHsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IHZpc2l0b3IudmlzaXQodGhpcy5jb25kaXRpb24pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBjcmVhdGVEZXJpdmVkOiBmdW5jdGlvbiAoZWxlbWVudHMsIGV4dGVuZExpc3QsIGV2YWxkQ29uZGl0aW9uKSB7DQogICAgICAgICAgICBlbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHMoZWxlbWVudHMpOw0KICAgICAgICAgICAgdmFyIG5ld1NlbGVjdG9yID0gbmV3IFNlbGVjdG9yKGVsZW1lbnRzLCBleHRlbmRMaXN0IHx8IHRoaXMuZXh0ZW5kTGlzdCwgbnVsbCwgdGhpcy5nZXRJbmRleCgpLCB0aGlzLmZpbGVJbmZvKCksIHRoaXMudmlzaWJpbGl0eUluZm8oKSk7DQogICAgICAgICAgICBuZXdTZWxlY3Rvci5ldmFsZENvbmRpdGlvbiA9IChldmFsZENvbmRpdGlvbiAhPSBudWxsKSA/IGV2YWxkQ29uZGl0aW9uIDogdGhpcy5ldmFsZENvbmRpdGlvbjsNCiAgICAgICAgICAgIG5ld1NlbGVjdG9yLm1lZGlhRW1wdHkgPSB0aGlzLm1lZGlhRW1wdHk7DQogICAgICAgICAgICByZXR1cm4gbmV3U2VsZWN0b3I7DQogICAgICAgIH0sDQogICAgICAgIGdldEVsZW1lbnRzOiBmdW5jdGlvbiAoZWxzKSB7DQogICAgICAgICAgICBpZiAoIWVscykgew0KICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IEVsZW1lbnQoJycsICcmJywgZmFsc2UsIHRoaXMuX2luZGV4LCB0aGlzLl9maWxlSW5mbyldOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHR5cGVvZiBlbHMgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgdGhpcy5wYXJzZS5wYXJzZU5vZGUoZWxzLCBbJ3NlbGVjdG9yJ10sIHRoaXMuX2luZGV4LCB0aGlzLl9maWxlSW5mbywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMZXNzRXJyb3Ioew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBlcnIuaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucGFyc2UuaW1wb3J0cywgdGhpcy5fZmlsZUluZm8uZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVscyA9IHJlc3VsdFswXS5lbGVtZW50czsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBlbHM7DQogICAgICAgIH0sDQogICAgICAgIGNyZWF0ZUVtcHR5U2VsZWN0b3JzOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgZWwgPSBuZXcgRWxlbWVudCgnJywgJyYnLCBmYWxzZSwgdGhpcy5faW5kZXgsIHRoaXMuX2ZpbGVJbmZvKSwgc2VscyA9IFtuZXcgU2VsZWN0b3IoW2VsXSwgbnVsbCwgbnVsbCwgdGhpcy5faW5kZXgsIHRoaXMuX2ZpbGVJbmZvKV07DQogICAgICAgICAgICBzZWxzWzBdLm1lZGlhRW1wdHkgPSB0cnVlOw0KICAgICAgICAgICAgcmV0dXJuIHNlbHM7DQogICAgICAgIH0sDQogICAgICAgIG1hdGNoOiBmdW5jdGlvbiAob3RoZXIpIHsNCiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7DQogICAgICAgICAgICB2YXIgbGVuID0gZWxlbWVudHMubGVuZ3RoOw0KICAgICAgICAgICAgdmFyIG9sZW47DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIG90aGVyID0gb3RoZXIubWl4aW5FbGVtZW50cygpOw0KICAgICAgICAgICAgb2xlbiA9IG90aGVyLmxlbmd0aDsNCiAgICAgICAgICAgIGlmIChvbGVuID09PSAwIHx8IGxlbiA8IG9sZW4pIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLnZhbHVlICE9PSBvdGhlcltpXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gb2xlbjsgLy8gcmV0dXJuIG51bWJlciBvZiBtYXRjaGVkIGVsZW1lbnRzDQogICAgICAgIH0sDQogICAgICAgIG1peGluRWxlbWVudHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLm1peGluRWxlbWVudHNfKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWl4aW5FbGVtZW50c187DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzLm1hcChmdW5jdGlvbiAodikgew0KICAgICAgICAgICAgICAgIHJldHVybiB2LmNvbWJpbmF0b3IudmFsdWUgKyAodi52YWx1ZS52YWx1ZSB8fCB2LnZhbHVlKTsNCiAgICAgICAgICAgIH0pLmpvaW4oJycpLm1hdGNoKC9bLCYjXCpcLlx3LV0oW1x3LV18KFxcLikpKi9nKTsNCiAgICAgICAgICAgIGlmIChlbGVtZW50cykgew0KICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1swXSA9PT0gJyYnKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNoaWZ0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgZWxlbWVudHMgPSBbXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAodGhpcy5taXhpbkVsZW1lbnRzXyA9IGVsZW1lbnRzKTsNCiAgICAgICAgfSwNCiAgICAgICAgaXNKdXN0UGFyZW50U2VsZWN0b3I6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiAhdGhpcy5tZWRpYUVtcHR5ICYmDQogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5sZW5ndGggPT09IDEgJiYNCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzWzBdLnZhbHVlID09PSAnJicgJiYNCiAgICAgICAgICAgICAgICAodGhpcy5lbGVtZW50c1swXS5jb21iaW5hdG9yLnZhbHVlID09PSAnICcgfHwgdGhpcy5lbGVtZW50c1swXS5jb21iaW5hdG9yLnZhbHVlID09PSAnJyk7DQogICAgICAgIH0sDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgZXZhbGRDb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbiAmJiB0aGlzLmNvbmRpdGlvbi5ldmFsKGNvbnRleHQpOw0KICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50czsNCiAgICAgICAgICAgIHZhciBleHRlbmRMaXN0ID0gdGhpcy5leHRlbmRMaXN0Ow0KICAgICAgICAgICAgZWxlbWVudHMgPSBlbGVtZW50cyAmJiBlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuZXZhbChjb250ZXh0KTsgfSk7DQogICAgICAgICAgICBleHRlbmRMaXN0ID0gZXh0ZW5kTGlzdCAmJiBleHRlbmRMaXN0Lm1hcChmdW5jdGlvbiAoZXh0ZW5kKSB7IHJldHVybiBleHRlbmQuZXZhbChjb250ZXh0KTsgfSk7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVEZXJpdmVkKGVsZW1lbnRzLCBleHRlbmRMaXN0LCBldmFsZENvbmRpdGlvbik7DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgdmFyIGksIGVsZW1lbnQ7DQogICAgICAgICAgICBpZiAoKCFjb250ZXh0IHx8ICFjb250ZXh0LmZpcnN0U2VsZWN0b3IpICYmIHRoaXMuZWxlbWVudHNbMF0uY29tYmluYXRvci52YWx1ZSA9PT0gJycpIHsNCiAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKCcgJywgdGhpcy5maWxlSW5mbygpLCB0aGlzLmdldEluZGV4KCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50c1tpXTsNCiAgICAgICAgICAgICAgICBlbGVtZW50LmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBnZXRJc091dHB1dDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbGRDb25kaXRpb247DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHsNCiAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSByZXF1aXJlcyBhbiBhcnJheSBhcmd1bWVudCcpOw0KICAgICAgICB9DQogICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsNCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbdmFsdWVdOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KICAgICAgICB9DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBOb2RlKCksIHsNCiAgICAgICAgdHlwZTogJ1ZhbHVlJywNCiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiAodmlzaXRvcikgew0KICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmlzaXRvci52aXNpdEFycmF5KHRoaXMudmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVbMF0uZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWUodGhpcy52YWx1ZS5tYXAoZnVuY3Rpb24gKHYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgICAgICB9KSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHRoaXMudmFsdWVbaV0uZ2VuQ1NTKGNvbnRleHQsIG91dHB1dCk7DQogICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGhpcy52YWx1ZS5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZCgoY29udGV4dCAmJiBjb250ZXh0LmNvbXByZXNzKSA/ICcsJyA6ICcsICcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBLZXl3b3JkID0gZnVuY3Rpb24gKHZhbHVlKSB7DQogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCiAgICB9Ow0KICAgIEtleXdvcmQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdLZXl3b3JkJywNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJyUnKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgeyB0eXBlOiAnU3ludGF4JywgbWVzc2FnZTogJ0ludmFsaWQgJSB3aXRob3V0IG51bWJlcicgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG91dHB1dC5hZGQodGhpcy52YWx1ZSk7DQogICAgICAgIH0NCiAgICB9KTsNCiAgICBLZXl3b3JkLlRydWUgPSBuZXcgS2V5d29yZCgndHJ1ZScpOw0KICAgIEtleXdvcmQuRmFsc2UgPSBuZXcgS2V5d29yZCgnZmFsc2UnKTsKCiAgICB2YXIgQW5vbnltb3VzID0gZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgY3VycmVudEZpbGVJbmZvLCBtYXBMaW5lcywgcnVsZXNldExpa2UsIHZpc2liaWxpdHlJbmZvKSB7DQogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgIHRoaXMubWFwTGluZXMgPSBtYXBMaW5lczsNCiAgICAgICAgdGhpcy5ydWxlc2V0TGlrZSA9ICh0eXBlb2YgcnVsZXNldExpa2UgPT09ICd1bmRlZmluZWQnKSA/IGZhbHNlIDogcnVsZXNldExpa2U7DQogICAgICAgIHRoaXMuYWxsb3dSb290ID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5jb3B5VmlzaWJpbGl0eUluZm8odmlzaWJpbGl0eUluZm8pOw0KICAgIH07DQogICAgQW5vbnltb3VzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnQW5vbnltb3VzJywNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXModGhpcy52YWx1ZSwgdGhpcy5faW5kZXgsIHRoaXMuX2ZpbGVJbmZvLCB0aGlzLm1hcExpbmVzLCB0aGlzLnJ1bGVzZXRMaWtlLCB0aGlzLnZpc2liaWxpdHlJbmZvKCkpOw0KICAgICAgICB9LA0KICAgICAgICBjb21wYXJlOiBmdW5jdGlvbiAob3RoZXIpIHsNCiAgICAgICAgICAgIHJldHVybiBvdGhlci50b0NTUyAmJiB0aGlzLnRvQ1NTKCkgPT09IG90aGVyLnRvQ1NTKCkgPyAwIDogdW5kZWZpbmVkOw0KICAgICAgICB9LA0KICAgICAgICBpc1J1bGVzZXRMaWtlOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5ydWxlc2V0TGlrZTsNCiAgICAgICAgfSwNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICB0aGlzLm5vZGVWaXNpYmxlID0gQm9vbGVhbih0aGlzLnZhbHVlKTsNCiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVWaXNpYmxlKSB7DQogICAgICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLnZhbHVlLCB0aGlzLl9maWxlSW5mbywgdGhpcy5faW5kZXgsIHRoaXMubWFwTGluZXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIE1BVEgkMSA9IE1hdGgkMTsNCiAgICBmdW5jdGlvbiBldmFsTmFtZShjb250ZXh0LCBuYW1lKSB7DQogICAgICAgIHZhciB2YWx1ZSA9ICcnOw0KICAgICAgICB2YXIgaTsNCiAgICAgICAgdmFyIG4gPSBuYW1lLmxlbmd0aDsNCiAgICAgICAgdmFyIG91dHB1dCA9IHsgYWRkOiBmdW5jdGlvbiAocykgeyB2YWx1ZSArPSBzOyB9IH07DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIG5hbWVbaV0uZXZhbChjb250ZXh0KS5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdmFsdWU7DQogICAgfQ0KICAgIHZhciBEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgaW1wb3J0YW50LCBtZXJnZSwgaW5kZXgsIGN1cnJlbnRGaWxlSW5mbywgaW5saW5lLCB2YXJpYWJsZSkgew0KICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KICAgICAgICB0aGlzLnZhbHVlID0gKHZhbHVlIGluc3RhbmNlb2YgTm9kZSkgPyB2YWx1ZSA6IG5ldyBWYWx1ZShbdmFsdWUgPyBuZXcgQW5vbnltb3VzKHZhbHVlKSA6IG51bGxdKTsNCiAgICAgICAgdGhpcy5pbXBvcnRhbnQgPSBpbXBvcnRhbnQgPyAiICIgKyBpbXBvcnRhbnQudHJpbSgpIDogJyc7DQogICAgICAgIHRoaXMubWVyZ2UgPSBtZXJnZTsNCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgIHRoaXMuaW5saW5lID0gaW5saW5lIHx8IGZhbHNlOw0KICAgICAgICB0aGlzLnZhcmlhYmxlID0gKHZhcmlhYmxlICE9PSB1bmRlZmluZWQpID8gdmFyaWFibGUNCiAgICAgICAgICAgIDogKG5hbWUuY2hhckF0ICYmIChuYW1lLmNoYXJBdCgwKSA9PT0gJ0AnKSk7DQogICAgICAgIHRoaXMuYWxsb3dSb290ID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy52YWx1ZSwgdGhpcyk7DQogICAgfTsNCiAgICBEZWNsYXJhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBOb2RlKCksIHsNCiAgICAgICAgdHlwZTogJ0RlY2xhcmF0aW9uJywNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICBvdXRwdXQuYWRkKHRoaXMubmFtZSArIChjb250ZXh0LmNvbXByZXNzID8gJzonIDogJzogJyksIHRoaXMuZmlsZUluZm8oKSwgdGhpcy5nZXRJbmRleCgpKTsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgZS5pbmRleCA9IHRoaXMuX2luZGV4Ow0KICAgICAgICAgICAgICAgIGUuZmlsZW5hbWUgPSB0aGlzLl9maWxlSW5mby5maWxlbmFtZTsNCiAgICAgICAgICAgICAgICB0aHJvdyBlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLmltcG9ydGFudCArICgodGhpcy5pbmxpbmUgfHwgKGNvbnRleHQubGFzdFJ1bGUgJiYgY29udGV4dC5jb21wcmVzcykpID8gJycgOiAnOycpLCB0aGlzLl9maWxlSW5mbywgdGhpcy5faW5kZXgpOw0KICAgICAgICB9LA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIG1hdGhCeXBhc3MgPSBmYWxzZSwgcHJldk1hdGgsIG5hbWUgPSB0aGlzLm5hbWUsIGV2YWxkVmFsdWUsIHZhcmlhYmxlID0gdGhpcy52YXJpYWJsZTsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICAvLyBleHBhbmQgJ3ByaW1pdGl2ZScgbmFtZSBkaXJlY3RseSB0byBnZXQNCiAgICAgICAgICAgICAgICAvLyB0aGluZ3MgZmFzdGVyICh+MTAlIGZvciBiZW5jaG1hcmsubGVzcyk6DQogICAgICAgICAgICAgICAgbmFtZSA9IChuYW1lLmxlbmd0aCA9PT0gMSkgJiYgKG5hbWVbMF0gaW5zdGFuY2VvZiBLZXl3b3JkKSA/DQogICAgICAgICAgICAgICAgICAgIG5hbWVbMF0udmFsdWUgOiBldmFsTmFtZShjb250ZXh0LCBuYW1lKTsNCiAgICAgICAgICAgICAgICB2YXJpYWJsZSA9IGZhbHNlOyAvLyBuZXZlciB0cmVhdCBleHBhbmRlZCBpbnRlcnBvbGF0aW9uIGFzIG5ldyB2YXJpYWJsZSBuYW1lDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBAdG9kbyByZW1vdmUgd2hlbiBwYXJlbnMtZGl2aXNpb24gaXMgZGVmYXVsdA0KICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdmb250JyAmJiBjb250ZXh0Lm1hdGggPT09IE1BVEgkMS5BTFdBWVMpIHsNCiAgICAgICAgICAgICAgICBtYXRoQnlwYXNzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBwcmV2TWF0aCA9IGNvbnRleHQubWF0aDsNCiAgICAgICAgICAgICAgICBjb250ZXh0Lm1hdGggPSBNQVRIJDEuUEFSRU5TX0RJVklTSU9OOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBjb250ZXh0LmltcG9ydGFudFNjb3BlLnB1c2goe30pOw0KICAgICAgICAgICAgICAgIGV2YWxkVmFsdWUgPSB0aGlzLnZhbHVlLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhcmlhYmxlICYmIGV2YWxkVmFsdWUudHlwZSA9PT0gJ0RldGFjaGVkUnVsZXNldCcpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgeyBtZXNzYWdlOiAnUnVsZXNldHMgY2Fubm90IGJlIGV2YWx1YXRlZCBvbiBhIHByb3BlcnR5LicsDQogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpLCBmaWxlbmFtZTogdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBpbXBvcnRhbnQgPSB0aGlzLmltcG9ydGFudDsNCiAgICAgICAgICAgICAgICB2YXIgaW1wb3J0YW50UmVzdWx0ID0gY29udGV4dC5pbXBvcnRhbnRTY29wZS5wb3AoKTsNCiAgICAgICAgICAgICAgICBpZiAoIWltcG9ydGFudCAmJiBpbXBvcnRhbnRSZXN1bHQuaW1wb3J0YW50KSB7DQogICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCA9IGltcG9ydGFudFJlc3VsdC5pbXBvcnRhbnQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24obmFtZSwgZXZhbGRWYWx1ZSwgaW1wb3J0YW50LCB0aGlzLm1lcmdlLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSwgdGhpcy5pbmxpbmUsIHZhcmlhYmxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLmluZGV4ICE9PSAnbnVtYmVyJykgew0KICAgICAgICAgICAgICAgICAgICBlLmluZGV4ID0gdGhpcy5nZXRJbmRleCgpOw0KICAgICAgICAgICAgICAgICAgICBlLmZpbGVuYW1lID0gdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aHJvdyBlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmluYWxseSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGhCeXBhc3MpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYXRoID0gcHJldk1hdGg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBtYWtlSW1wb3J0YW50OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERlY2xhcmF0aW9uKHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgJyFpbXBvcnRhbnQnLCB0aGlzLm1lcmdlLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSwgdGhpcy5pbmxpbmUpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIGRlYnVnSW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgZnVuY3Rpb24gZGVidWdJbmZvKGNvbnRleHQsIGN0eCwgbGluZVNlcGFyYXRvcikgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcnOw0KICAgICAgICAgICAgaWYgKGNvbnRleHQuZHVtcExpbmVOdW1iZXJzICYmICFjb250ZXh0LmNvbXByZXNzKSB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChjb250ZXh0LmR1bXBMaW5lTnVtYmVycykgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50cyc6DQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWJ1Z0luZm8uYXNDb21tZW50KGN0eCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWVkaWFxdWVyeSc6DQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWJ1Z0luZm8uYXNNZWRpYVF1ZXJ5KGN0eCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWxsJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlYnVnSW5mby5hc0NvbW1lbnQoY3R4KSArIChsaW5lU2VwYXJhdG9yIHx8ICcnKSArIGRlYnVnSW5mby5hc01lZGlhUXVlcnkoY3R4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0NCiAgICAgICAgZGVidWdJbmZvLmFzQ29tbWVudCA9IGZ1bmN0aW9uIChjdHgpIHsNCiAgICAgICAgICAgIHJldHVybiAiLyogbGluZSAiICsgY3R4LmRlYnVnSW5mby5saW5lTnVtYmVyICsgIiwgIiArIGN0eC5kZWJ1Z0luZm8uZmlsZU5hbWUgKyAiICovXG4iOw0KICAgICAgICB9Ow0KICAgICAgICBkZWJ1Z0luZm8uYXNNZWRpYVF1ZXJ5ID0gZnVuY3Rpb24gKGN0eCkgew0KICAgICAgICAgICAgdmFyIGZpbGVuYW1lV2l0aFByb3RvY29sID0gY3R4LmRlYnVnSW5mby5maWxlTmFtZTsNCiAgICAgICAgICAgIGlmICghL15bYS16XSs6XC9cLy9pLnRlc3QoZmlsZW5hbWVXaXRoUHJvdG9jb2wpKSB7DQogICAgICAgICAgICAgICAgZmlsZW5hbWVXaXRoUHJvdG9jb2wgPSAiZmlsZTovLyIgKyBmaWxlbmFtZVdpdGhQcm90b2NvbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAiQG1lZGlhIC1zYXNzLWRlYnVnLWluZm97ZmlsZW5hbWV7Zm9udC1mYW1pbHk6IiArIGZpbGVuYW1lV2l0aFByb3RvY29sLnJlcGxhY2UoLyhbLjpcL1xcXSkvZywgZnVuY3Rpb24gKGEpIHsNCiAgICAgICAgICAgICAgICBpZiAoYSA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIGEgPSAnXC8nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gIlxcIiArIGE7DQogICAgICAgICAgICB9KSArICJ9bGluZXtmb250LWZhbWlseTpcXDAwMDAzIiArIGN0eC5kZWJ1Z0luZm8ubGluZU51bWJlciArICJ9fVxuIjsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIGRlYnVnSW5mbzsNCiAgICB9KCkpOwoKICAgIHZhciBDb21tZW50ID0gZnVuY3Rpb24gKHZhbHVlLCBpc0xpbmVDb21tZW50LCBpbmRleCwgY3VycmVudEZpbGVJbmZvKSB7DQogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCiAgICAgICAgdGhpcy5pc0xpbmVDb21tZW50ID0gaXNMaW5lQ29tbWVudDsNCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgIHRoaXMuYWxsb3dSb290ID0gdHJ1ZTsNCiAgICB9Ow0KICAgIENvbW1lbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdDb21tZW50JywNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0luZm8pIHsNCiAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKGRlYnVnSW5mbyhjb250ZXh0LCB0aGlzKSwgdGhpcy5maWxlSW5mbygpLCB0aGlzLmdldEluZGV4KCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLnZhbHVlKTsNCiAgICAgICAgfSwNCiAgICAgICAgaXNTaWxlbnQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgaXNDb21wcmVzc2VkID0gY29udGV4dC5jb21wcmVzcyAmJiB0aGlzLnZhbHVlWzJdICE9PSAnISc7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5pc0xpbmVDb21tZW50IHx8IGlzQ29tcHJlc3NlZDsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBjb250ZXh0cyA9IHt9Ow0KICAgIHZhciBjb3B5RnJvbU9yaWdpbmFsID0gZnVuY3Rpb24gY29weUZyb21PcmlnaW5hbChvcmlnaW5hbCwgZGVzdGluYXRpb24sIHByb3BlcnRpZXNUb0NvcHkpIHsNCiAgICAgICAgaWYgKCFvcmlnaW5hbCkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllc1RvQ29weS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKG9yaWdpbmFsLmhhc093blByb3BlcnR5KHByb3BlcnRpZXNUb0NvcHlbaV0pKSB7DQogICAgICAgICAgICAgICAgZGVzdGluYXRpb25bcHJvcGVydGllc1RvQ29weVtpXV0gPSBvcmlnaW5hbFtwcm9wZXJ0aWVzVG9Db3B5W2ldXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQogICAgLyoNCiAgICAgcGFyc2UgaXMgdXNlZCB3aGlsc3QgcGFyc2luZw0KICAgICAqLw0KICAgIHZhciBwYXJzZUNvcHlQcm9wZXJ0aWVzID0gWw0KICAgICAgICAvLyBvcHRpb25zDQogICAgICAgICdwYXRocycsDQogICAgICAgICdyZXdyaXRlVXJscycsDQogICAgICAgICdyb290cGF0aCcsDQogICAgICAgICdzdHJpY3RJbXBvcnRzJywNCiAgICAgICAgJ2luc2VjdXJlJywNCiAgICAgICAgJ2R1bXBMaW5lTnVtYmVycycsDQogICAgICAgICdjb21wcmVzcycsDQogICAgICAgICdzeW5jSW1wb3J0JywNCiAgICAgICAgJ2NodW5rSW5wdXQnLA0KICAgICAgICAnbWltZScsDQogICAgICAgICd1c2VGaWxlQ2FjaGUnLA0KICAgICAgICAvLyBjb250ZXh0DQogICAgICAgICdwcm9jZXNzSW1wb3J0cycsDQogICAgICAgIC8vIFVzZWQgYnkgdGhlIGltcG9ydCBtYW5hZ2VyIHRvIHN0b3AgbXVsdGlwbGUgaW1wb3J0IHZpc2l0b3JzIGJlaW5nIGNyZWF0ZWQuDQogICAgICAgICdwbHVnaW5NYW5hZ2VyJyAvLyBVc2VkIGFzIHRoZSBwbHVnaW4gbWFuYWdlciBmb3IgdGhlIHNlc3Npb24NCiAgICBdOw0KICAgIGNvbnRleHRzLlBhcnNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsNCiAgICAgICAgY29weUZyb21PcmlnaW5hbChvcHRpb25zLCB0aGlzLCBwYXJzZUNvcHlQcm9wZXJ0aWVzKTsNCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhdGhzID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgdGhpcy5wYXRocyA9IFt0aGlzLnBhdGhzXTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgdmFyIGV2YWxDb3B5UHJvcGVydGllcyA9IFsNCiAgICAgICAgJ3BhdGhzJywNCiAgICAgICAgJ2NvbXByZXNzJywNCiAgICAgICAgJ21hdGgnLA0KICAgICAgICAnc3RyaWN0VW5pdHMnLA0KICAgICAgICAnc291cmNlTWFwJywNCiAgICAgICAgJ2ltcG9ydE11bHRpcGxlJywNCiAgICAgICAgJ3VybEFyZ3MnLA0KICAgICAgICAnamF2YXNjcmlwdEVuYWJsZWQnLA0KICAgICAgICAncGx1Z2luTWFuYWdlcicsDQogICAgICAgICdpbXBvcnRhbnRTY29wZScsDQogICAgICAgICdyZXdyaXRlVXJscycgLy8gb3B0aW9uIC0gd2hldGhlciB0byBhZGp1c3QgVVJMJ3MgdG8gYmUgcmVsYXRpdmUNCiAgICBdOw0KICAgIGNvbnRleHRzLkV2YWwgPSBmdW5jdGlvbiAob3B0aW9ucywgZnJhbWVzKSB7DQogICAgICAgIGNvcHlGcm9tT3JpZ2luYWwob3B0aW9ucywgdGhpcywgZXZhbENvcHlQcm9wZXJ0aWVzKTsNCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhdGhzID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgdGhpcy5wYXRocyA9IFt0aGlzLnBhdGhzXTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZyYW1lcyA9IGZyYW1lcyB8fCBbXTsNCiAgICAgICAgdGhpcy5pbXBvcnRhbnRTY29wZSA9IHRoaXMuaW1wb3J0YW50U2NvcGUgfHwgW107DQogICAgfTsNCiAgICBjb250ZXh0cy5FdmFsLnByb3RvdHlwZS5lbnRlckNhbGMgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIGlmICghdGhpcy5jYWxjU3RhY2spIHsNCiAgICAgICAgICAgIHRoaXMuY2FsY1N0YWNrID0gW107DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jYWxjU3RhY2sucHVzaCh0cnVlKTsNCiAgICAgICAgdGhpcy5pbkNhbGMgPSB0cnVlOw0KICAgIH07DQogICAgY29udGV4dHMuRXZhbC5wcm90b3R5cGUuZXhpdENhbGMgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHRoaXMuY2FsY1N0YWNrLnBvcCgpOw0KICAgICAgICBpZiAoIXRoaXMuY2FsY1N0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgdGhpcy5pbkNhbGMgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgY29udGV4dHMuRXZhbC5wcm90b3R5cGUuaW5QYXJlbnRoZXNpcyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKCF0aGlzLnBhcmVuc1N0YWNrKSB7DQogICAgICAgICAgICB0aGlzLnBhcmVuc1N0YWNrID0gW107DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5wYXJlbnNTdGFjay5wdXNoKHRydWUpOw0KICAgIH07DQogICAgY29udGV4dHMuRXZhbC5wcm90b3R5cGUub3V0T2ZQYXJlbnRoZXNpcyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdGhpcy5wYXJlbnNTdGFjay5wb3AoKTsNCiAgICB9Ow0KICAgIGNvbnRleHRzLkV2YWwucHJvdG90eXBlLmluQ2FsYyA9IGZhbHNlOw0KICAgIGNvbnRleHRzLkV2YWwucHJvdG90eXBlLm1hdGhPbiA9IHRydWU7DQogICAgY29udGV4dHMuRXZhbC5wcm90b3R5cGUuaXNNYXRoT24gPSBmdW5jdGlvbiAob3ApIHsNCiAgICAgICAgaWYgKCF0aGlzLm1hdGhPbikgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGlmIChvcCA9PT0gJy8nICYmIHRoaXMubWF0aCAhPT0gTWF0aCQxLkFMV0FZUyAmJiAoIXRoaXMucGFyZW5zU3RhY2sgfHwgIXRoaXMucGFyZW5zU3RhY2subGVuZ3RoKSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGlmICh0aGlzLm1hdGggPiBNYXRoJDEuUEFSRU5TX0RJVklTSU9OKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnNTdGFjayAmJiB0aGlzLnBhcmVuc1N0YWNrLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9Ow0KICAgIGNvbnRleHRzLkV2YWwucHJvdG90eXBlLnBhdGhSZXF1aXJlc1Jld3JpdGUgPSBmdW5jdGlvbiAocGF0aCkgew0KICAgICAgICB2YXIgaXNSZWxhdGl2ZSA9IHRoaXMucmV3cml0ZVVybHMgPT09IFJld3JpdGVVcmxzLkxPQ0FMID8gaXNQYXRoTG9jYWxSZWxhdGl2ZSA6IGlzUGF0aFJlbGF0aXZlOw0KICAgICAgICByZXR1cm4gaXNSZWxhdGl2ZShwYXRoKTsNCiAgICB9Ow0KICAgIGNvbnRleHRzLkV2YWwucHJvdG90eXBlLnJld3JpdGVQYXRoID0gZnVuY3Rpb24gKHBhdGgsIHJvb3RwYXRoKSB7DQogICAgICAgIHZhciBuZXdQYXRoOw0KICAgICAgICByb290cGF0aCA9IHJvb3RwYXRoIHx8ICcnOw0KICAgICAgICBuZXdQYXRoID0gdGhpcy5ub3JtYWxpemVQYXRoKHJvb3RwYXRoICsgcGF0aCk7DQogICAgICAgIC8vIElmIGEgcGF0aCB3YXMgZXhwbGljaXQgcmVsYXRpdmUgYW5kIHRoZSByb290cGF0aCB3YXMgbm90IGFuIGFic29sdXRlIHBhdGgNCiAgICAgICAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgbmV3IHBhdGggaXMgYWxzbyBleHBsaWNpdCByZWxhdGl2ZS4NCiAgICAgICAgaWYgKGlzUGF0aExvY2FsUmVsYXRpdmUocGF0aCkgJiYNCiAgICAgICAgICAgIGlzUGF0aFJlbGF0aXZlKHJvb3RwYXRoKSAmJg0KICAgICAgICAgICAgaXNQYXRoTG9jYWxSZWxhdGl2ZShuZXdQYXRoKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgIG5ld1BhdGggPSAiLi8iICsgbmV3UGF0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbmV3UGF0aDsNCiAgICB9Ow0KICAgIGNvbnRleHRzLkV2YWwucHJvdG90eXBlLm5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbiAocGF0aCkgew0KICAgICAgICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykucmV2ZXJzZSgpOw0KICAgICAgICB2YXIgc2VnbWVudDsNCiAgICAgICAgcGF0aCA9IFtdOw0KICAgICAgICB3aGlsZSAoc2VnbWVudHMubGVuZ3RoICE9PSAwKSB7DQogICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHMucG9wKCk7DQogICAgICAgICAgICBzd2l0Y2ggKHNlZ21lbnQpIHsNCiAgICAgICAgICAgICAgICBjYXNlICcuJzoNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnLi4nOg0KICAgICAgICAgICAgICAgICAgICBpZiAoKHBhdGgubGVuZ3RoID09PSAwKSB8fCAocGF0aFtwYXRoLmxlbmd0aCAtIDFdID09PSAnLi4nKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5wdXNoKHNlZ21lbnQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5wb3AoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICBwYXRoLnB1c2goc2VnbWVudCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwYXRoLmpvaW4oJy8nKTsNCiAgICB9Ow0KICAgIGZ1bmN0aW9uIGlzUGF0aFJlbGF0aXZlKHBhdGgpIHsNCiAgICAgICAgcmV0dXJuICEvXig/OlthLXotXSs6fFwvfCMpL2kudGVzdChwYXRoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gaXNQYXRoTG9jYWxSZWxhdGl2ZShwYXRoKSB7DQogICAgICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy4nOw0KICAgIH0NCiAgICAvLyB0b2RvIC0gZG8gdGhlIHNhbWUgZm9yIHRoZSB0b0NTUyA/CgogICAgZnVuY3Rpb24gbWFrZVJlZ2lzdHJ5KGJhc2UpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIF9kYXRhOiB7fSwNCiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKG5hbWUsIGZ1bmMpIHsNCiAgICAgICAgICAgICAgICAvLyBwcmVjYXV0aW9uYXJ5IGNhc2UgY29udmVyc2lvbiwgYXMgbGF0ZXIgcXVlcnlpbmcgb2YNCiAgICAgICAgICAgICAgICAvLyB0aGUgcmVnaXN0cnkgYnkgZnVuY3Rpb24tY2FsbGVyIHVzZXMgbG93ZXIgY2FzZSBhcyB3ZWxsLg0KICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGEuaGFzT3duUHJvcGVydHkobmFtZSkpIDsNCiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhW25hbWVdID0gZnVuYzsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhZGRNdWx0aXBsZTogZnVuY3Rpb24gKGZ1bmN0aW9ucykgew0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZnVuY3Rpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7DQogICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZChuYW1lLCBmdW5jdGlvbnNbbmFtZV0pOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKG5hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtuYW1lXSB8fCAoYmFzZSAmJiBiYXNlLmdldChuYW1lKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZ2V0TG9jYWxGdW5jdGlvbnM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBpbmhlcml0OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VSZWdpc3RyeSh0aGlzKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChiYXNlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VSZWdpc3RyeShiYXNlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICB9DQogICAgdmFyIGZ1bmN0aW9uUmVnaXN0cnkgPSBtYWtlUmVnaXN0cnkobnVsbCk7CgogICAgdmFyIGRlZmF1bHRGdW5jID0gew0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWVfOw0KICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmVycm9yXzsNCiAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdiA/IEtleXdvcmQuVHJ1ZSA6IEtleXdvcmQuRmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodikgew0KICAgICAgICAgICAgdGhpcy52YWx1ZV8gPSB2Ow0KICAgICAgICB9LA0KICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgIHRoaXMuZXJyb3JfID0gZTsNCiAgICAgICAgfSwNCiAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMudmFsdWVfID0gdGhpcy5lcnJvcl8gPSBudWxsOw0KICAgICAgICB9DQogICAgfTsKCiAgICB2YXIgUnVsZXNldCA9IGZ1bmN0aW9uIChzZWxlY3RvcnMsIHJ1bGVzLCBzdHJpY3RJbXBvcnRzLCB2aXNpYmlsaXR5SW5mbykgew0KICAgICAgICB0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9yczsNCiAgICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzOw0KICAgICAgICB0aGlzLl9sb29rdXBzID0ge307DQogICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IG51bGw7DQogICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBudWxsOw0KICAgICAgICB0aGlzLnN0cmljdEltcG9ydHMgPSBzdHJpY3RJbXBvcnRzOw0KICAgICAgICB0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyh2aXNpYmlsaXR5SW5mbyk7DQogICAgICAgIHRoaXMuYWxsb3dSb290ID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy5zZWxlY3RvcnMsIHRoaXMpOw0KICAgICAgICB0aGlzLnNldFBhcmVudCh0aGlzLnJ1bGVzLCB0aGlzKTsNCiAgICB9Ow0KICAgIFJ1bGVzZXQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdSdWxlc2V0JywNCiAgICAgICAgaXNSdWxlc2V0OiB0cnVlLA0KICAgICAgICBpc1J1bGVzZXRMaWtlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9LA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICBpZiAodGhpcy5wYXRocykgew0KICAgICAgICAgICAgICAgIHRoaXMucGF0aHMgPSB2aXNpdG9yLnZpc2l0QXJyYXkodGhpcy5wYXRocywgdHJ1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdG9ycykgew0KICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3JzID0gdmlzaXRvci52aXNpdEFycmF5KHRoaXMuc2VsZWN0b3JzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLnJ1bGVzICYmIHRoaXMucnVsZXMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5ydWxlcyA9IHZpc2l0b3IudmlzaXRBcnJheSh0aGlzLnJ1bGVzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3RvcnM7DQogICAgICAgICAgICB2YXIgc2VsQ250Ow0KICAgICAgICAgICAgdmFyIHNlbGVjdG9yOw0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICB2YXIgaGFzVmFyaWFibGU7DQogICAgICAgICAgICB2YXIgaGFzT25lUGFzc2luZ1NlbGVjdG9yID0gZmFsc2U7DQogICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RvcnMgJiYgKHNlbENudCA9IHRoaXMuc2VsZWN0b3JzLmxlbmd0aCkpIHsNCiAgICAgICAgICAgICAgICBzZWxlY3RvcnMgPSBuZXcgQXJyYXkoc2VsQ250KTsNCiAgICAgICAgICAgICAgICBkZWZhdWx0RnVuYy5lcnJvcih7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTeW50YXgnLA0KICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXQgaXMgY3VycmVudGx5IG9ubHkgYWxsb3dlZCBpbiBwYXJhbWV0cmljIG1peGluIGd1YXJkcywnDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbENudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gdGhpcy5zZWxlY3RvcnNbaV0uZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxlY3Rvci5lbGVtZW50cy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmVsZW1lbnRzW2pdLmlzVmFyaWFibGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNWYXJpYWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzW2ldID0gc2VsZWN0b3I7DQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5ldmFsZENvbmRpdGlvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgaGFzT25lUGFzc2luZ1NlbGVjdG9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoaGFzVmFyaWFibGUpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRvUGFyc2VTZWxlY3RvcnMgPSBuZXcgQXJyYXkoc2VsQ250KTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbENudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvUGFyc2VTZWxlY3RvcnNbaV0gPSBzZWxlY3Rvci50b0NTUyhjb250ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlLnBhcnNlTm9kZSh0b1BhcnNlU2VsZWN0b3JzLmpvaW4oJywnKSwgWyJzZWxlY3RvcnMiXSwgc2VsZWN0b3JzWzBdLmdldEluZGV4KCksIHNlbGVjdG9yc1swXS5maWxlSW5mbygpLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMgPSBmbGF0dGVuQXJyYXkocmVzdWx0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRlZmF1bHRGdW5jLnJlc2V0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBoYXNPbmVQYXNzaW5nU2VsZWN0b3IgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHJ1bGVzID0gdGhpcy5ydWxlcyA/IGNvcHlBcnJheSh0aGlzLnJ1bGVzKSA6IG51bGw7DQogICAgICAgICAgICB2YXIgcnVsZXNldCA9IG5ldyBSdWxlc2V0KHNlbGVjdG9ycywgcnVsZXMsIHRoaXMuc3RyaWN0SW1wb3J0cywgdGhpcy52aXNpYmlsaXR5SW5mbygpKTsNCiAgICAgICAgICAgIHZhciBydWxlOw0KICAgICAgICAgICAgdmFyIHN1YlJ1bGU7DQogICAgICAgICAgICBydWxlc2V0Lm9yaWdpbmFsUnVsZXNldCA9IHRoaXM7DQogICAgICAgICAgICBydWxlc2V0LnJvb3QgPSB0aGlzLnJvb3Q7DQogICAgICAgICAgICBydWxlc2V0LmZpcnN0Um9vdCA9IHRoaXMuZmlyc3RSb290Ow0KICAgICAgICAgICAgcnVsZXNldC5hbGxvd0ltcG9ydHMgPSB0aGlzLmFsbG93SW1wb3J0czsNCiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnSW5mbykgew0KICAgICAgICAgICAgICAgIHJ1bGVzZXQuZGVidWdJbmZvID0gdGhpcy5kZWJ1Z0luZm87DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIWhhc09uZVBhc3NpbmdTZWxlY3Rvcikgew0KICAgICAgICAgICAgICAgIHJ1bGVzLmxlbmd0aCA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBpbmhlcml0IGEgZnVuY3Rpb24gcmVnaXN0cnkgZnJvbSB0aGUgZnJhbWVzIHN0YWNrIHdoZW4gcG9zc2libGU7DQogICAgICAgICAgICAvLyBvdGhlcndpc2UgZnJvbSB0aGUgZ2xvYmFsIHJlZ2lzdHJ5DQogICAgICAgICAgICBydWxlc2V0LmZ1bmN0aW9uUmVnaXN0cnkgPSAoZnVuY3Rpb24gKGZyYW1lcykgew0KICAgICAgICAgICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgICAgICAgICB2YXIgbiA9IGZyYW1lcy5sZW5ndGg7DQogICAgICAgICAgICAgICAgdmFyIGZvdW5kOw0KICAgICAgICAgICAgICAgIGZvciAoOyBpICE9PSBuOyArK2kpIHsNCiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmcmFtZXNbaV0uZnVuY3Rpb25SZWdpc3RyeTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uUmVnaXN0cnk7DQogICAgICAgICAgICB9KGNvbnRleHQuZnJhbWVzKSkuaW5oZXJpdCgpOw0KICAgICAgICAgICAgLy8gcHVzaCB0aGUgY3VycmVudCBydWxlc2V0IHRvIHRoZSBmcmFtZXMgc3RhY2sNCiAgICAgICAgICAgIHZhciBjdHhGcmFtZXMgPSBjb250ZXh0LmZyYW1lczsNCiAgICAgICAgICAgIGN0eEZyYW1lcy51bnNoaWZ0KHJ1bGVzZXQpOw0KICAgICAgICAgICAgLy8gY3VycnJlbnQgc2VsZWN0b3JzDQogICAgICAgICAgICB2YXIgY3R4U2VsZWN0b3JzID0gY29udGV4dC5zZWxlY3RvcnM7DQogICAgICAgICAgICBpZiAoIWN0eFNlbGVjdG9ycykgew0KICAgICAgICAgICAgICAgIGNvbnRleHQuc2VsZWN0b3JzID0gY3R4U2VsZWN0b3JzID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjdHhTZWxlY3RvcnMudW5zaGlmdCh0aGlzLnNlbGVjdG9ycyk7DQogICAgICAgICAgICAvLyBFdmFsdWF0ZSBpbXBvcnRzDQogICAgICAgICAgICBpZiAocnVsZXNldC5yb290IHx8IHJ1bGVzZXQuYWxsb3dJbXBvcnRzIHx8ICFydWxlc2V0LnN0cmljdEltcG9ydHMpIHsNCiAgICAgICAgICAgICAgICBydWxlc2V0LmV2YWxJbXBvcnRzKGNvbnRleHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGZyYW1lcyBhcm91bmQgbWl4aW4gZGVmaW5pdGlvbnMsDQogICAgICAgICAgICAvLyBzbyB0aGV5IGNhbiBiZSBldmFsdWF0ZWQgbGlrZSBjbG9zdXJlcyB3aGVuIHRoZSB0aW1lIGNvbWVzLg0KICAgICAgICAgICAgdmFyIHJzUnVsZXMgPSBydWxlc2V0LnJ1bGVzOw0KICAgICAgICAgICAgZm9yIChpID0gMDsgKHJ1bGUgPSByc1J1bGVzW2ldKTsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHJ1bGUuZXZhbEZpcnN0KSB7DQogICAgICAgICAgICAgICAgICAgIHJzUnVsZXNbaV0gPSBydWxlLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1lZGlhQmxvY2tDb3VudCA9IChjb250ZXh0Lm1lZGlhQmxvY2tzICYmIGNvbnRleHQubWVkaWFCbG9ja3MubGVuZ3RoKSB8fCAwOw0KICAgICAgICAgICAgLy8gRXZhbHVhdGUgbWl4aW4gY2FsbHMuDQogICAgICAgICAgICBmb3IgKGkgPSAwOyAocnVsZSA9IHJzUnVsZXNbaV0pOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAocnVsZS50eXBlID09PSAnTWl4aW5DYWxsJykgew0KICAgICAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6dHJ1ZSAqLw0KICAgICAgICAgICAgICAgICAgICBydWxlcyA9IHJ1bGUuZXZhbChjb250ZXh0KS5maWx0ZXIoZnVuY3Rpb24gKHIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgociBpbnN0YW5jZW9mIERlY2xhcmF0aW9uKSAmJiByLnZhcmlhYmxlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHBvbGx1dGUgdGhlIHNjb3BlIGlmIHRoZSB2YXJpYWJsZSBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgdGhlcmUuIGNvbnNpZGVyIHJldHVybmluZyBmYWxzZSBoZXJlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIG5lZWQgYSB3YXkgdG8gInJldHVybiIgdmFyaWFibGUgZnJvbSBtaXhpbnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShydWxlc2V0LnZhcmlhYmxlKHIubmFtZSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICByc1J1bGVzLnNwbGljZS5hcHBseShyc1J1bGVzLCBbaSwgMV0uY29uY2F0KHJ1bGVzKSk7DQogICAgICAgICAgICAgICAgICAgIGkgKz0gcnVsZXMubGVuZ3RoIC0gMTsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXNldC5yZXNldENhY2hlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSA9PT0gJ1ZhcmlhYmxlQ2FsbCcpIHsNCiAgICAgICAgICAgICAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi8NCiAgICAgICAgICAgICAgICAgICAgcnVsZXMgPSBydWxlLmV2YWwoY29udGV4dCkucnVsZXMuZmlsdGVyKGZ1bmN0aW9uIChyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgaW5zdGFuY2VvZiBEZWNsYXJhdGlvbikgJiYgci52YXJpYWJsZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBwb2xsdXRlIHRoZSBzY29wZSBhdCBhbGwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIHJzUnVsZXMuc3BsaWNlLmFwcGx5KHJzUnVsZXMsIFtpLCAxXS5jb25jYXQocnVsZXMpKTsNCiAgICAgICAgICAgICAgICAgICAgaSArPSBydWxlcy5sZW5ndGggLSAxOw0KICAgICAgICAgICAgICAgICAgICBydWxlc2V0LnJlc2V0Q2FjaGUoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBFdmFsdWF0ZSBldmVyeXRoaW5nIGVsc2UNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChydWxlID0gcnNSdWxlc1tpXSk7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICghcnVsZS5ldmFsRmlyc3QpIHsNCiAgICAgICAgICAgICAgICAgICAgcnNSdWxlc1tpXSA9IHJ1bGUgPSBydWxlLmV2YWwgPyBydWxlLmV2YWwoY29udGV4dCkgOiBydWxlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEV2YWx1YXRlIGV2ZXJ5dGhpbmcgZWxzZQ0KICAgICAgICAgICAgZm9yIChpID0gMDsgKHJ1bGUgPSByc1J1bGVzW2ldKTsgaSsrKSB7DQogICAgICAgICAgICAgICAgLy8gZm9yIHJ1bGVzZXRzLCBjaGVjayBpZiBpdCBpcyBhIGNzcyBndWFyZCBhbmQgY2FuIGJlIHJlbW92ZWQNCiAgICAgICAgICAgICAgICBpZiAocnVsZSBpbnN0YW5jZW9mIFJ1bGVzZXQgJiYgcnVsZS5zZWxlY3RvcnMgJiYgcnVsZS5zZWxlY3RvcnMubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGNhbiBiZSBmb2xkZWQgaW4gKGUuZy4gJiB3aGVyZSkNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuc2VsZWN0b3JzWzBdICYmIHJ1bGUuc2VsZWN0b3JzWzBdLmlzSnVzdFBhcmVudFNlbGVjdG9yKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJzUnVsZXMuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgKHN1YlJ1bGUgPSBydWxlLnJ1bGVzW2pdKTsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlJ1bGUgaW5zdGFuY2VvZiBOb2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlJ1bGUuY29weVZpc2liaWxpdHlJbmZvKHJ1bGUudmlzaWJpbGl0eUluZm8oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN1YlJ1bGUgaW5zdGFuY2VvZiBEZWNsYXJhdGlvbikgfHwgIXN1YlJ1bGUudmFyaWFibGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzUnVsZXMuc3BsaWNlKCsraSwgMCwgc3ViUnVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBQb3AgdGhlIHN0YWNrDQogICAgICAgICAgICBjdHhGcmFtZXMuc2hpZnQoKTsNCiAgICAgICAgICAgIGN0eFNlbGVjdG9ycy5zaGlmdCgpOw0KICAgICAgICAgICAgaWYgKGNvbnRleHQubWVkaWFCbG9ja3MpIHsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSBtZWRpYUJsb2NrQ291bnQ7IGkgPCBjb250ZXh0Lm1lZGlhQmxvY2tzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubWVkaWFCbG9ja3NbaV0uYnViYmxlU2VsZWN0b3JzKHNlbGVjdG9ycyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJ1bGVzZXQ7DQogICAgICAgIH0sDQogICAgICAgIGV2YWxJbXBvcnRzOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIHJ1bGVzID0gdGhpcy5ydWxlczsNCiAgICAgICAgICAgIHZhciBpOw0KICAgICAgICAgICAgdmFyIGltcG9ydFJ1bGVzOw0KICAgICAgICAgICAgaWYgKCFydWxlcykgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChydWxlc1tpXS50eXBlID09PSAnSW1wb3J0Jykgew0KICAgICAgICAgICAgICAgICAgICBpbXBvcnRSdWxlcyA9IHJ1bGVzW2ldLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRSdWxlcyAmJiAoaW1wb3J0UnVsZXMubGVuZ3RoIHx8IGltcG9ydFJ1bGVzLmxlbmd0aCA9PT0gMCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZS5hcHBseShydWxlcywgW2ksIDFdLmNvbmNhdChpbXBvcnRSdWxlcykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBpbXBvcnRSdWxlcy5sZW5ndGggLSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKGksIDEsIGltcG9ydFJ1bGVzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Q2FjaGUoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIG1ha2VJbXBvcnRhbnQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgUnVsZXNldCh0aGlzLnNlbGVjdG9ycywgdGhpcy5ydWxlcy5tYXAoZnVuY3Rpb24gKHIpIHsNCiAgICAgICAgICAgICAgICBpZiAoci5tYWtlSW1wb3J0YW50KSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByLm1ha2VJbXBvcnRhbnQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pLCB0aGlzLnN0cmljdEltcG9ydHMsIHRoaXMudmlzaWJpbGl0eUluZm8oKSk7DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9LA0KICAgICAgICBtYXRjaEFyZ3M6IGZ1bmN0aW9uIChhcmdzKSB7DQogICAgICAgICAgICByZXR1cm4gIWFyZ3MgfHwgYXJncy5sZW5ndGggPT09IDA7DQogICAgICAgIH0sDQogICAgICAgIC8vIGxldHMgeW91IGNhbGwgYSBjc3Mgc2VsZWN0b3Igd2l0aCBhIGd1YXJkDQogICAgICAgIG1hdGNoQ29uZGl0aW9uOiBmdW5jdGlvbiAoYXJncywgY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIGxhc3RTZWxlY3RvciA9IHRoaXMuc2VsZWN0b3JzW3RoaXMuc2VsZWN0b3JzLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgaWYgKCFsYXN0U2VsZWN0b3IuZXZhbGRDb25kaXRpb24pIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobGFzdFNlbGVjdG9yLmNvbmRpdGlvbiAmJg0KICAgICAgICAgICAgICAgICFsYXN0U2VsZWN0b3IuY29uZGl0aW9uLmV2YWwobmV3IGNvbnRleHRzLkV2YWwoY29udGV4dCwgY29udGV4dC5mcmFtZXMpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9LA0KICAgICAgICByZXNldENhY2hlOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLl9ydWxlc2V0cyA9IG51bGw7DQogICAgICAgICAgICB0aGlzLl92YXJpYWJsZXMgPSBudWxsOw0KICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IG51bGw7DQogICAgICAgICAgICB0aGlzLl9sb29rdXBzID0ge307DQogICAgICAgIH0sDQogICAgICAgIHZhcmlhYmxlczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLl92YXJpYWJsZXMpIHsNCiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZXMgPSAhdGhpcy5ydWxlcyA/IHt9IDogdGhpcy5ydWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGhhc2gsIHIpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBEZWNsYXJhdGlvbiAmJiByLnZhcmlhYmxlID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBoYXNoW3IubmFtZV0gPSByOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gZXZhbHVhdGluZyB2YXJpYWJsZXMgaW4gYW4gaW1wb3J0IHN0YXRlbWVudCwgaW1wb3J0cyBoYXZlIG5vdCBiZWVuIGV2YWwnZA0KICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGdvIGluc2lkZSBpbXBvcnQgc3RhdGVtZW50cy4NCiAgICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCByb290IGJlaW5nIGEgc3RyaW5nIChpbiB0aGUgY2FzZSBvZiBpbmxpbmVkIGxlc3MpDQogICAgICAgICAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdJbXBvcnQnICYmIHIucm9vdCAmJiByLnJvb3QudmFyaWFibGVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFycyA9IHIucm9vdC52YXJpYWJsZXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiB2YXJzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcnMuaGFzT3duUHJvcGVydHkobmFtZV8xKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW25hbWVfMV0gPSByLnJvb3QudmFyaWFibGUobmFtZV8xKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2g7DQogICAgICAgICAgICAgICAgfSwge30pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhcmlhYmxlczsNCiAgICAgICAgfSwNCiAgICAgICAgcHJvcGVydGllczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLl9wcm9wZXJ0aWVzKSB7DQogICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9ICF0aGlzLnJ1bGVzID8ge30gOiB0aGlzLnJ1bGVzLnJlZHVjZShmdW5jdGlvbiAoaGFzaCwgcikgew0KICAgICAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIERlY2xhcmF0aW9uICYmIHIudmFyaWFibGUgIT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lXzIgPSAoci5uYW1lLmxlbmd0aCA9PT0gMSkgJiYgKHIubmFtZVswXSBpbnN0YW5jZW9mIEtleXdvcmQpID8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm5hbWVbMF0udmFsdWUgOiByLm5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzIGRvbid0IG92ZXJ3cml0ZSBhcyB0aGV5IGNhbiBtZXJnZQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNoWyIkIiArIG5hbWVfMl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoWyIkIiArIG5hbWVfMl0gPSBbcl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoWyIkIiArIG5hbWVfMl0ucHVzaChyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzaDsNCiAgICAgICAgICAgICAgICB9LCB7fSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllczsNCiAgICAgICAgfSwNCiAgICAgICAgdmFyaWFibGU6IGZ1bmN0aW9uIChuYW1lKSB7DQogICAgICAgICAgICB2YXIgZGVjbCA9IHRoaXMudmFyaWFibGVzKClbbmFtZV07DQogICAgICAgICAgICBpZiAoZGVjbCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlVmFsdWUoZGVjbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIHByb3BlcnR5OiBmdW5jdGlvbiAobmFtZSkgew0KICAgICAgICAgICAgdmFyIGRlY2wgPSB0aGlzLnByb3BlcnRpZXMoKVtuYW1lXTsNCiAgICAgICAgICAgIGlmIChkZWNsKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYWx1ZShkZWNsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgbGFzdERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5ydWxlcy5sZW5ndGg7IGkgPiAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgICB2YXIgZGVjbCA9IHRoaXMucnVsZXNbaSAtIDFdOw0KICAgICAgICAgICAgICAgIGlmIChkZWNsIGluc3RhbmNlb2YgRGVjbGFyYXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYWx1ZShkZWNsKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIHBhcnNlVmFsdWU6IGZ1bmN0aW9uICh0b1BhcnNlKSB7DQogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQogICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2Zvcm1EZWNsYXJhdGlvbihkZWNsKSB7DQogICAgICAgICAgICAgICAgaWYgKGRlY2wudmFsdWUgaW5zdGFuY2VvZiBBbm9ueW1vdXMgJiYgIWRlY2wucGFyc2VkKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVjbC52YWx1ZS52YWx1ZSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2UucGFyc2VOb2RlKGRlY2wudmFsdWUudmFsdWUsIFsndmFsdWUnLCAnaW1wb3J0YW50J10sIGRlY2wudmFsdWUuZ2V0SW5kZXgoKSwgZGVjbC5maWxlSW5mbygpLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wucGFyc2VkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsLnZhbHVlID0gcmVzdWx0WzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsLmltcG9ydGFudCA9IHJlc3VsdFsxXSB8fCAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC5wYXJzZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC5wYXJzZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2w7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRvUGFyc2UpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybURlY2xhcmF0aW9uLmNhbGwoc2VsZiwgdG9QYXJzZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgbm9kZXNfMSA9IFtdOw0KICAgICAgICAgICAgICAgIHRvUGFyc2UuZm9yRWFjaChmdW5jdGlvbiAobikgew0KICAgICAgICAgICAgICAgICAgICBub2Rlc18xLnB1c2godHJhbnNmb3JtRGVjbGFyYXRpb24uY2FsbChzZWxmLCBuKSk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVzXzE7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIHJ1bGVzZXRzOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAoIXRoaXMucnVsZXMpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgZmlsdFJ1bGVzID0gW107DQogICAgICAgICAgICB2YXIgcnVsZXMgPSB0aGlzLnJ1bGVzOw0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICB2YXIgcnVsZTsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChydWxlID0gcnVsZXNbaV0pOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAocnVsZS5pc1J1bGVzZXQpIHsNCiAgICAgICAgICAgICAgICAgICAgZmlsdFJ1bGVzLnB1c2gocnVsZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGZpbHRSdWxlczsNCiAgICAgICAgfSwNCiAgICAgICAgcHJlcGVuZFJ1bGU6IGZ1bmN0aW9uIChydWxlKSB7DQogICAgICAgICAgICB2YXIgcnVsZXMgPSB0aGlzLnJ1bGVzOw0KICAgICAgICAgICAgaWYgKHJ1bGVzKSB7DQogICAgICAgICAgICAgICAgcnVsZXMudW5zaGlmdChydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMucnVsZXMgPSBbcnVsZV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnNldFBhcmVudChydWxlLCB0aGlzKTsNCiAgICAgICAgfSwNCiAgICAgICAgZmluZDogZnVuY3Rpb24gKHNlbGVjdG9yLCBzZWxmLCBmaWx0ZXIpIHsNCiAgICAgICAgICAgIHNlbGYgPSBzZWxmIHx8IHRoaXM7DQogICAgICAgICAgICB2YXIgcnVsZXMgPSBbXTsNCiAgICAgICAgICAgIHZhciBtYXRjaDsNCiAgICAgICAgICAgIHZhciBmb3VuZE1peGluczsNCiAgICAgICAgICAgIHZhciBrZXkgPSBzZWxlY3Rvci50b0NTUygpOw0KICAgICAgICAgICAgaWYgKGtleSBpbiB0aGlzLl9sb29rdXBzKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cHNba2V5XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucnVsZXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7DQogICAgICAgICAgICAgICAgaWYgKHJ1bGUgIT09IHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBydWxlLnNlbGVjdG9ycy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBzZWxlY3Rvci5tYXRjaChydWxlLnNlbGVjdG9yc1tqXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IuZWxlbWVudHMubGVuZ3RoID4gbWF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKHJ1bGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1peGlucyA9IHJ1bGUuZmluZChuZXcgU2VsZWN0b3Ioc2VsZWN0b3IuZWxlbWVudHMuc2xpY2UobWF0Y2gpKSwgc2VsZiwgZmlsdGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm91bmRNaXhpbnMubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1peGluc1tpXS5wYXRoLnB1c2gocnVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShydWxlcywgZm91bmRNaXhpbnMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKHsgcnVsZTogcnVsZSwgcGF0aDogW10gfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9sb29rdXBzW2tleV0gPSBydWxlczsNCiAgICAgICAgICAgIHJldHVybiBydWxlczsNCiAgICAgICAgfSwNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIHZhciBqOw0KICAgICAgICAgICAgdmFyIGNoYXJzZXRSdWxlTm9kZXMgPSBbXTsNCiAgICAgICAgICAgIHZhciBydWxlTm9kZXMgPSBbXTsNCiAgICAgICAgICAgIHZhciAvLyBMaW5lIG51bWJlciBkZWJ1Z2dpbmcNCiAgICAgICAgICAgIGRlYnVnSW5mbyQxOw0KICAgICAgICAgICAgdmFyIHJ1bGU7DQogICAgICAgICAgICB2YXIgcGF0aDsNCiAgICAgICAgICAgIGNvbnRleHQudGFiTGV2ZWwgPSAoY29udGV4dC50YWJMZXZlbCB8fCAwKTsNCiAgICAgICAgICAgIGlmICghdGhpcy5yb290KSB7DQogICAgICAgICAgICAgICAgY29udGV4dC50YWJMZXZlbCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHRhYlJ1bGVTdHIgPSBjb250ZXh0LmNvbXByZXNzID8gJycgOiBBcnJheShjb250ZXh0LnRhYkxldmVsICsgMSkuam9pbignICAnKTsNCiAgICAgICAgICAgIHZhciB0YWJTZXRTdHIgPSBjb250ZXh0LmNvbXByZXNzID8gJycgOiBBcnJheShjb250ZXh0LnRhYkxldmVsKS5qb2luKCcgICcpOw0KICAgICAgICAgICAgdmFyIHNlcDsNCiAgICAgICAgICAgIHZhciBjaGFyc2V0Tm9kZUluZGV4ID0gMDsNCiAgICAgICAgICAgIHZhciBpbXBvcnROb2RlSW5kZXggPSAwOw0KICAgICAgICAgICAgZm9yIChpID0gMDsgKHJ1bGUgPSB0aGlzLnJ1bGVzW2ldKTsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHJ1bGUgaW5zdGFuY2VvZiBDb21tZW50KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROb2RlSW5kZXggPT09IGkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydE5vZGVJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJ1bGVOb2Rlcy5wdXNoKHJ1bGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChydWxlLmlzQ2hhcnNldCAmJiBydWxlLmlzQ2hhcnNldCgpKSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGVOb2Rlcy5zcGxpY2UoY2hhcnNldE5vZGVJbmRleCwgMCwgcnVsZSk7DQogICAgICAgICAgICAgICAgICAgIGNoYXJzZXROb2RlSW5kZXgrKzsNCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0Tm9kZUluZGV4Kys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSA9PT0gJ0ltcG9ydCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZU5vZGVzLnNwbGljZShpbXBvcnROb2RlSW5kZXgsIDAsIHJ1bGUpOw0KICAgICAgICAgICAgICAgICAgICBpbXBvcnROb2RlSW5kZXgrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGVOb2Rlcy5wdXNoKHJ1bGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJ1bGVOb2RlcyA9IGNoYXJzZXRSdWxlTm9kZXMuY29uY2F0KHJ1bGVOb2Rlcyk7DQogICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSByb290IG5vZGUsIHdlIGRvbid0IHJlbmRlcg0KICAgICAgICAgICAgLy8gYSBzZWxlY3Rvciwgb3Ige30uDQogICAgICAgICAgICBpZiAoIXRoaXMucm9vdCkgew0KICAgICAgICAgICAgICAgIGRlYnVnSW5mbyQxID0gZGVidWdJbmZvKGNvbnRleHQsIHRoaXMsIHRhYlNldFN0cik7DQogICAgICAgICAgICAgICAgaWYgKGRlYnVnSW5mbyQxKSB7DQogICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoZGVidWdJbmZvJDEpOw0KICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKHRhYlNldFN0cik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBwYXRocyA9IHRoaXMucGF0aHM7DQogICAgICAgICAgICAgICAgdmFyIHBhdGhDbnQgPSBwYXRocy5sZW5ndGg7DQogICAgICAgICAgICAgICAgdmFyIHBhdGhTdWJDbnQgPSB2b2lkIDA7DQogICAgICAgICAgICAgICAgc2VwID0gY29udGV4dC5jb21wcmVzcyA/ICcsJyA6ICgiLFxuIiArIHRhYlNldFN0cik7DQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdGhDbnQ7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aHNbaV07DQogICAgICAgICAgICAgICAgICAgIGlmICghKHBhdGhTdWJDbnQgPSBwYXRoLmxlbmd0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZChzZXApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyc3RTZWxlY3RvciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIHBhdGhbMF0uZ2VuQ1NTKGNvbnRleHQsIG91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyc3RTZWxlY3RvciA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgcGF0aFN1YkNudDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2pdLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoKGNvbnRleHQuY29tcHJlc3MgPyAneycgOiAnIHtcbicpICsgdGFiUnVsZVN0cik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBDb21waWxlIHJ1bGVzIGFuZCBydWxlc2V0cw0KICAgICAgICAgICAgZm9yIChpID0gMDsgKHJ1bGUgPSBydWxlTm9kZXNbaV0pOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPT09IHJ1bGVOb2Rlcy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sYXN0UnVsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TGFzdFJ1bGUgPSBjb250ZXh0Lmxhc3RSdWxlOw0KICAgICAgICAgICAgICAgIGlmIChydWxlLmlzUnVsZXNldExpa2UocnVsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sYXN0UnVsZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAocnVsZS5nZW5DU1MpIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZS5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZS52YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKHJ1bGUudmFsdWUudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNvbnRleHQubGFzdFJ1bGUgPSBjdXJyZW50TGFzdFJ1bGU7DQogICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0Lmxhc3RSdWxlICYmIHJ1bGUuaXNWaXNpYmxlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZChjb250ZXh0LmNvbXByZXNzID8gJycgOiAoIlxuIiArIHRhYlJ1bGVTdHIpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGFzdFJ1bGUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIXRoaXMucm9vdCkgew0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoKGNvbnRleHQuY29tcHJlc3MgPyAnfScgOiAiXG4iICsgdGFiU2V0U3RyICsgIn0iKSk7DQogICAgICAgICAgICAgICAgY29udGV4dC50YWJMZXZlbC0tOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCFvdXRwdXQuaXNFbXB0eSgpICYmICFjb250ZXh0LmNvbXByZXNzICYmIHRoaXMuZmlyc3RSb290KSB7DQogICAgICAgICAgICAgICAgb3V0cHV0LmFkZCgnXG4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgam9pblNlbGVjdG9yczogZnVuY3Rpb24gKHBhdGhzLCBjb250ZXh0LCBzZWxlY3RvcnMpIHsNCiAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc2VsZWN0b3JzLmxlbmd0aDsgcysrKSB7DQogICAgICAgICAgICAgICAgdGhpcy5qb2luU2VsZWN0b3IocGF0aHMsIGNvbnRleHQsIHNlbGVjdG9yc1tzXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGpvaW5TZWxlY3RvcjogZnVuY3Rpb24gKHBhdGhzLCBjb250ZXh0LCBzZWxlY3Rvcikgew0KICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlUGFyZW50aGVzaXMoZWxlbWVudHNUb1Bhaywgb3JpZ2luYWxFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50UGFyZW4sIGo7DQogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzVG9QYWsubGVuZ3RoID09PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50UGFyZW4gPSBuZXcgUGFyZW4oZWxlbWVudHNUb1Bha1swXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5zaWRlUGFyZW50ID0gbmV3IEFycmF5KGVsZW1lbnRzVG9QYWsubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGVsZW1lbnRzVG9QYWsubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZVBhcmVudFtqXSA9IG5ldyBFbGVtZW50KG51bGwsIGVsZW1lbnRzVG9QYWtbal0sIG9yaWdpbmFsRWxlbWVudC5pc1ZhcmlhYmxlLCBvcmlnaW5hbEVsZW1lbnQuX2luZGV4LCBvcmlnaW5hbEVsZW1lbnQuX2ZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudFBhcmVuID0gbmV3IFBhcmVuKG5ldyBTZWxlY3RvcihpbnNpZGVQYXJlbnQpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50UGFyZW47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rvcihjb250YWluZWRFbGVtZW50LCBvcmlnaW5hbEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCwgc2VsZWN0b3I7DQogICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KG51bGwsIGNvbnRhaW5lZEVsZW1lbnQsIG9yaWdpbmFsRWxlbWVudC5pc1ZhcmlhYmxlLCBvcmlnaW5hbEVsZW1lbnQuX2luZGV4LCBvcmlnaW5hbEVsZW1lbnQuX2ZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihbZWxlbWVudF0pOw0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RvcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIGpvaW5zIHNlbGVjdG9yIHBhdGggZnJvbSBgYmVnaW5uaW5nUGF0aGAgd2l0aCBzZWxlY3RvciBwYXRoIGluIGBhZGRQYXRoYA0KICAgICAgICAgICAgLy8gYHJlcGxhY2VkRWxlbWVudGAgY29udGFpbnMgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHJlcGxhY2VkIGJ5IGBhZGRQYXRoYA0KICAgICAgICAgICAgLy8gcmV0dXJucyBjb25jYXRlbmF0ZWQgcGF0aA0KICAgICAgICAgICAgZnVuY3Rpb24gYWRkUmVwbGFjZW1lbnRJbnRvUGF0aChiZWdpbm5pbmdQYXRoLCBhZGRQYXRoLCByZXBsYWNlZEVsZW1lbnQsIG9yaWdpbmFsU2VsZWN0b3IpIHsNCiAgICAgICAgICAgICAgICB2YXIgbmV3U2VsZWN0b3JQYXRoLCBsYXN0U2VsZWN0b3IsIG5ld0pvaW5lZFNlbGVjdG9yOw0KICAgICAgICAgICAgICAgIC8vIG91ciBuZXcgc2VsZWN0b3IgcGF0aA0KICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9yUGF0aCA9IFtdOw0KICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgam9pbmVkIHNlbGVjdG9yIC0gaWYgJiBpcyB0aGUgZmlyc3QgdGhpbmcgdGhpcyB3aWxsIGJlIGVtcHR5LA0KICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBuZXdKb2luZWRTZWxlY3RvciB3aWxsIGJlIHRoZSBsYXN0IHNldCBvZiBlbGVtZW50cyBpbiB0aGUgc2VsZWN0b3INCiAgICAgICAgICAgICAgICBpZiAoYmVnaW5uaW5nUGF0aC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9yUGF0aCA9IGNvcHlBcnJheShiZWdpbm5pbmdQYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgbGFzdFNlbGVjdG9yID0gbmV3U2VsZWN0b3JQYXRoLnBvcCgpOw0KICAgICAgICAgICAgICAgICAgICBuZXdKb2luZWRTZWxlY3RvciA9IG9yaWdpbmFsU2VsZWN0b3IuY3JlYXRlRGVyaXZlZChjb3B5QXJyYXkobGFzdFNlbGVjdG9yLmVsZW1lbnRzKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBuZXdKb2luZWRTZWxlY3RvciA9IG9yaWdpbmFsU2VsZWN0b3IuY3JlYXRlRGVyaXZlZChbXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChhZGRQYXRoLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gL2RlZXAvIGlzIGEgQ1NTNCBzZWxlY3RvciAtIChyZW1vdmVkLCBzbyBzaG91bGQgZGVwcmVjYXRlKQ0KICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGlzIHZhbGlkIHdpdGhvdXQgYW55dGhpbmcgaW4gZnJvbnQgb2YgaXQNCiAgICAgICAgICAgICAgICAgICAgLy8gc28gaWYgdGhlICYgZG9lcyBub3QgaGF2ZSBhIGNvbWJpbmF0b3IgdGhhdCBpcyAiIiBvciAiICIgdGhlbg0KICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgaXMgYSBjb21iaW5hdG9yIG9uIHRoZSBwYXJlbnQsIHRoZW4gZ3JhYiB0aGF0Lg0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGFsc28gYWxsb3dzICsgYSB7ICYgLmIgeyAuYSAmIHsgLi4uIHRob3VnaCBub3Qgc3VyZSB3aHkgeW91IHdvdWxkIHdhbnQgdG8gZG8gdGhhdA0KICAgICAgICAgICAgICAgICAgICB2YXIgY29tYmluYXRvciA9IHJlcGxhY2VkRWxlbWVudC5jb21iaW5hdG9yOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSBhZGRQYXRoWzBdLmVsZW1lbnRzWzBdOw0KICAgICAgICAgICAgICAgICAgICBpZiAoY29tYmluYXRvci5lbXB0eU9yV2hpdGVzcGFjZSAmJiAhcGFyZW50RWwuY29tYmluYXRvci5lbXB0eU9yV2hpdGVzcGFjZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciA9IHBhcmVudEVsLmNvbWJpbmF0b3I7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgLy8gam9pbiB0aGUgZWxlbWVudHMgc28gZmFyIHdpdGggdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhcmVudA0KICAgICAgICAgICAgICAgICAgICBuZXdKb2luZWRTZWxlY3Rvci5lbGVtZW50cy5wdXNoKG5ldyBFbGVtZW50KGNvbWJpbmF0b3IsIHBhcmVudEVsLnZhbHVlLCByZXBsYWNlZEVsZW1lbnQuaXNWYXJpYWJsZSwgcmVwbGFjZWRFbGVtZW50Ll9pbmRleCwgcmVwbGFjZWRFbGVtZW50Ll9maWxlSW5mbykpOw0KICAgICAgICAgICAgICAgICAgICBuZXdKb2luZWRTZWxlY3Rvci5lbGVtZW50cyA9IG5ld0pvaW5lZFNlbGVjdG9yLmVsZW1lbnRzLmNvbmNhdChhZGRQYXRoWzBdLmVsZW1lbnRzLnNsaWNlKDEpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gbm93IGFkZCB0aGUgam9pbmVkIHNlbGVjdG9yIC0gYnV0IG9ubHkgaWYgaXQgaXMgbm90IGVtcHR5DQogICAgICAgICAgICAgICAgaWYgKG5ld0pvaW5lZFNlbGVjdG9yLmVsZW1lbnRzLmxlbmd0aCAhPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBuZXdTZWxlY3RvclBhdGgucHVzaChuZXdKb2luZWRTZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIHB1dCB0b2dldGhlciB0aGUgcGFyZW50IHNlbGVjdG9ycyBhZnRlciB0aGUgam9pbiAoZS5nLiB0aGUgcmVzdCBvZiB0aGUgcGFyZW50KQ0KICAgICAgICAgICAgICAgIGlmIChhZGRQYXRoLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3RPZlBhdGggPSBhZGRQYXRoLnNsaWNlKDEpOw0KICAgICAgICAgICAgICAgICAgICByZXN0T2ZQYXRoID0gcmVzdE9mUGF0aC5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3IuY3JlYXRlRGVyaXZlZChzZWxlY3Rvci5lbGVtZW50cywgW10pOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgbmV3U2VsZWN0b3JQYXRoID0gbmV3U2VsZWN0b3JQYXRoLmNvbmNhdChyZXN0T2ZQYXRoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ld1NlbGVjdG9yUGF0aDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIGpvaW5zIHNlbGVjdG9yIHBhdGggZnJvbSBgYmVnaW5uaW5nUGF0aGAgd2l0aCBldmVyeSBzZWxlY3RvciBwYXRoIGluIGBhZGRQYXRoc2AgYXJyYXkNCiAgICAgICAgICAgIC8vIGByZXBsYWNlZEVsZW1lbnRgIGNvbnRhaW5zIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZXBsYWNlZCBieSBgYWRkUGF0aGANCiAgICAgICAgICAgIC8vIHJldHVybnMgYXJyYXkgd2l0aCBhbGwgY29uY2F0ZW5hdGVkIHBhdGhzDQogICAgICAgICAgICBmdW5jdGlvbiBhZGRBbGxSZXBsYWNlbWVudHNJbnRvUGF0aChiZWdpbm5pbmdQYXRoLCBhZGRQYXRocywgcmVwbGFjZWRFbGVtZW50LCBvcmlnaW5hbFNlbGVjdG9yLCByZXN1bHQpIHsNCiAgICAgICAgICAgICAgICB2YXIgajsNCiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmVnaW5uaW5nUGF0aC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2VsZWN0b3JQYXRoID0gYWRkUmVwbGFjZW1lbnRJbnRvUGF0aChiZWdpbm5pbmdQYXRoW2pdLCBhZGRQYXRocywgcmVwbGFjZWRFbGVtZW50LCBvcmlnaW5hbFNlbGVjdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3U2VsZWN0b3JQYXRoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlRWxlbWVudHNPblRvU2VsZWN0b3JzKGVsZW1lbnRzLCBzZWxlY3RvcnMpIHsNCiAgICAgICAgICAgICAgICB2YXIgaSwgc2VsOw0KICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMucHVzaChbbmV3IFNlbGVjdG9yKGVsZW1lbnRzKV0pOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChzZWwgPSBzZWxlY3RvcnNbaV0pOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIHRoaW5nIGluIHNlbCBpcyBhIHBhcmVudCB0aGlzIG5lZWRzIHRvIGpvaW4gb24gdG8gaXQNCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxbc2VsLmxlbmd0aCAtIDFdID0gc2VsW3NlbC5sZW5ndGggLSAxXS5jcmVhdGVEZXJpdmVkKHNlbFtzZWwubGVuZ3RoIC0gMV0uZWxlbWVudHMuY29uY2F0KGVsZW1lbnRzKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzZWwucHVzaChuZXcgU2VsZWN0b3IoZWxlbWVudHMpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIHBhcmVudCBzZWxlY3RvcnMgaW5zaWRlIGBpblNlbGVjdG9yYCBieSBjb250ZW50IG9mIGBjb250ZXh0YCBhcnJheQ0KICAgICAgICAgICAgLy8gcmVzdWx0aW5nIHNlbGVjdG9ycyBhcmUgcmV0dXJuZWQgaW5zaWRlIGBwYXRoc2AgYXJyYXkNCiAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBgaW5TZWxlY3RvcmAgY29udGFpbmVkIGF0IGxlYXN0IG9uZSBwYXJlbnQgc2VsZWN0b3INCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VQYXJlbnRTZWxlY3RvcihwYXRocywgY29udGV4dCwgaW5TZWxlY3Rvcikgew0KICAgICAgICAgICAgICAgIC8vIFRoZSBwYXRocyBhcmUgW1tTZWxlY3Rvcl1dDQogICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGxpc3QgaXMgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCBzZWxlY3RvcnMNCiAgICAgICAgICAgICAgICAvLyBUaGUgaW5uZXIgbGlzdCBpcyBhIGxpc3Qgb2YgaW5oZXJpdGFuY2Ugc2VwYXJhdGVkIHNlbGVjdG9ycw0KICAgICAgICAgICAgICAgIC8vIGUuZy4NCiAgICAgICAgICAgICAgICAvLyAuYSwgLmIgew0KICAgICAgICAgICAgICAgIC8vICAgLmMgew0KICAgICAgICAgICAgICAgIC8vICAgfQ0KICAgICAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICAgICAgICAvLyA9PSBbWy5hXSBbLmNdXSBbWy5iXSBbLmNdXQ0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgdmFyIGksIGosIGssIGN1cnJlbnRFbGVtZW50cywgbmV3U2VsZWN0b3JzLCBzZWxlY3RvcnNNdWx0aXBsaWVkLCBzZWwsIGVsLCBoYWRQYXJlbnRTZWxlY3RvciA9IGZhbHNlLCBsZW5ndGgsIGxhc3RTZWxlY3RvcjsNCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmaW5kTmVzdGVkU2VsZWN0b3IoZWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgbWF5YmVTZWxlY3RvcjsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudC52YWx1ZSBpbnN0YW5jZW9mIFBhcmVuKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbWF5YmVTZWxlY3RvciA9IGVsZW1lbnQudmFsdWUudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIGlmICghKG1heWJlU2VsZWN0b3IgaW5zdGFuY2VvZiBTZWxlY3RvcikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXliZVNlbGVjdG9yOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgY3VycmVudCBzZWxlY3RvciBzbyBmYXINCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudHMgPSBbXTsNCiAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBsaXN0IG9mIG5ldyBzZWxlY3RvcnMgdG8gYWRkIHRvIHRoZSBwYXRoLg0KICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgYnVpbGQgaXQgdXAuIFdlIGluaXRpYXRlIGl0IHdpdGggb25lIGVtcHR5IHNlbGVjdG9yIGFzIHdlICJtdWx0aXBseSIgdGhlIG5ldyBzZWxlY3RvcnMNCiAgICAgICAgICAgICAgICAvLyBieSB0aGUgcGFyZW50cw0KICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9ycyA9IFsNCiAgICAgICAgICAgICAgICAgICAgW10NCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChlbCA9IGluU2VsZWN0b3IuZWxlbWVudHNbaV0pOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gbm9uIHBhcmVudCByZWZlcmVuY2UgZWxlbWVudHMganVzdCBnZXQgYWRkZWQNCiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLnZhbHVlICE9PSAnJicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRTZWxlY3RvciA9IGZpbmROZXN0ZWRTZWxlY3RvcihlbCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkU2VsZWN0b3IgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZSBjdXJyZW50IGxpc3Qgb2Ygbm9uIHBhcmVudCBzZWxlY3RvciBlbGVtZW50cw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHRvIHRoZSBjdXJyZW50IGxpc3Qgb2Ygc2VsZWN0b3JzIHRvIGFkZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudHNPblRvU2VsZWN0b3JzKGN1cnJlbnRFbGVtZW50cywgbmV3U2VsZWN0b3JzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmVzdGVkUGF0aHMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZWQgPSB2b2lkIDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VkTmV3U2VsZWN0b3JzID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgPSByZXBsYWNlUGFyZW50U2VsZWN0b3IobmVzdGVkUGF0aHMsIGNvbnRleHQsIG5lc3RlZFNlbGVjdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWRQYXJlbnRTZWxlY3RvciA9IGhhZFBhcmVudFNlbGVjdG9yIHx8IHJlcGxhY2VkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXN0ZWRQYXRocyBhcnJheSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBtZW1iZXIgLSByZXBsYWNlUGFyZW50U2VsZWN0b3IgZG9lcyBub3QgbXVsdGlwbHkgc2VsZWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG5lc3RlZFBhdGhzLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudFNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoY3JlYXRlUGFyZW50aGVzaXMobmVzdGVkUGF0aHNba10sIGVsKSwgZWwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxSZXBsYWNlbWVudHNJbnRvUGF0aChuZXdTZWxlY3RvcnMsIFtyZXBsYWNlbWVudFNlbGVjdG9yXSwgZWwsIGluU2VsZWN0b3IsIHJlcGxhY2VkTmV3U2VsZWN0b3JzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VsZWN0b3JzID0gcmVwbGFjZWROZXdTZWxlY3RvcnM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRzID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudHMucHVzaChlbCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBoYWRQYXJlbnRTZWxlY3RvciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3IGxpc3Qgb2Ygc2VsZWN0b3JzIHRvIGFkZA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzTXVsdGlwbGllZCA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgdGhlIGN1cnJlbnQgbGlzdCBvZiBub24gcGFyZW50IHNlbGVjdG9yIGVsZW1lbnRzDQogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiB0byB0aGUgY3VycmVudCBsaXN0IG9mIHNlbGVjdG9ycyB0byBhZGQNCiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudHNPblRvU2VsZWN0b3JzKGN1cnJlbnRFbGVtZW50cywgbmV3U2VsZWN0b3JzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBvdXIgY3VycmVudCBzZWxlY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuZXdTZWxlY3RvcnMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBuZXdTZWxlY3RvcnNbal07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgcGFyZW50IHBhdGhzLCB0aGUgJiBtaWdodCBiZSBpbiBhIG1peGluIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIGFyZSBwYXJlbnRzIG9yIG5vdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29tYmluYXRvciB1c2VkIG9uIGVsIHNob3VsZCBub3cgYmUgYXBwbGllZCB0byB0aGUgbmV4dCBlbGVtZW50IGluc3RlYWQgc28gdGhhdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBub3QgbG9zdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbFswXS5lbGVtZW50cy5wdXNoKG5ldyBFbGVtZW50KGVsLmNvbWJpbmF0b3IsICcnLCBlbC5pc1ZhcmlhYmxlLCBlbC5faW5kZXgsIGVsLl9maWxlSW5mbykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yc011bHRpcGxpZWQucHVzaChzZWwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBwYXJlbnQgc2VsZWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb250ZXh0Lmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHB1dCB0aGUgY3VycmVudCBzZWxlY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gam9pbiB0aGUgbGFzdCBzZWxlY3RvcidzIGVsZW1lbnRzIG9uIHRvIHRoZSBwYXJlbnRzIHNlbGVjdG9ycw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NlbGVjdG9yUGF0aCA9IGFkZFJlcGxhY2VtZW50SW50b1BhdGgoc2VsLCBjb250ZXh0W2tdLCBlbCwgaW5TZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhhdCB0byBvdXIgbmV3IHNldCBvZiBzZWxlY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yc011bHRpcGxpZWQucHVzaChuZXdTZWxlY3RvclBhdGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3VyIG5ldyBzZWxlY3RvcnMgaGFzIGJlZW4gbXVsdGlwbGllZCwgc28gcmVzZXQgdGhlIHN0YXRlDQogICAgICAgICAgICAgICAgICAgICAgICBuZXdTZWxlY3RvcnMgPSBzZWxlY3RvcnNNdWx0aXBsaWVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRzID0gW107DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgZWxlbWVudHMgbGVmdCBvdmVyIChlLmcuIC5hJiAuYiA9PSAuYikNCiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlbSBvbiB0byBhbGwgdGhlIGN1cnJlbnQgc2VsZWN0b3JzDQogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50c09uVG9TZWxlY3RvcnMoY3VycmVudEVsZW1lbnRzLCBuZXdTZWxlY3RvcnMpOw0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZXdTZWxlY3RvcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gbmV3U2VsZWN0b3JzW2ldLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gobmV3U2VsZWN0b3JzW2ldKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZWxlY3RvciA9IG5ld1NlbGVjdG9yc1tpXVtsZW5ndGggLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9yc1tpXVtsZW5ndGggLSAxXSA9IGxhc3RTZWxlY3Rvci5jcmVhdGVEZXJpdmVkKGxhc3RTZWxlY3Rvci5lbGVtZW50cywgaW5TZWxlY3Rvci5leHRlbmRMaXN0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gaGFkUGFyZW50U2VsZWN0b3I7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmdW5jdGlvbiBkZXJpdmVTZWxlY3Rvcih2aXNpYmlsaXR5SW5mbywgZGVyaXZlRnJvbSkgew0KICAgICAgICAgICAgICAgIHZhciBuZXdTZWxlY3RvciA9IGRlcml2ZUZyb20uY3JlYXRlRGVyaXZlZChkZXJpdmVGcm9tLmVsZW1lbnRzLCBkZXJpdmVGcm9tLmV4dGVuZExpc3QsIGRlcml2ZUZyb20uZXZhbGRDb25kaXRpb24pOw0KICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9yLmNvcHlWaXNpYmlsaXR5SW5mbyh2aXNpYmlsaXR5SW5mbyk7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ld1NlbGVjdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gam9pblNlbGVjdG9yIGNvZGUgZm9sbG93cw0KICAgICAgICAgICAgdmFyIGksIG5ld1BhdGhzLCBoYWRQYXJlbnRTZWxlY3RvcjsNCiAgICAgICAgICAgIG5ld1BhdGhzID0gW107DQogICAgICAgICAgICBoYWRQYXJlbnRTZWxlY3RvciA9IHJlcGxhY2VQYXJlbnRTZWxlY3RvcihuZXdQYXRocywgY29udGV4dCwgc2VsZWN0b3IpOw0KICAgICAgICAgICAgaWYgKCFoYWRQYXJlbnRTZWxlY3Rvcikgew0KICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgbmV3UGF0aHMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jYXRlbmF0ZWQgPSBjb250ZXh0W2ldLm1hcChkZXJpdmVTZWxlY3Rvci5iaW5kKHRoaXMsIHNlbGVjdG9yLnZpc2liaWxpdHlJbmZvKCkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRlZC5wdXNoKHNlbGVjdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGhzLnB1c2goY29uY2F0ZW5hdGVkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbmV3UGF0aHMgPSBbW3NlbGVjdG9yXV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ld1BhdGhzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgcGF0aHMucHVzaChuZXdQYXRoc1tpXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgQXRSdWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBydWxlcywgaW5kZXgsIGN1cnJlbnRGaWxlSW5mbywgZGVidWdJbmZvLCBpc1Jvb3RlZCwgdmlzaWJpbGl0eUluZm8pIHsNCiAgICAgICAgdmFyIGk7DQogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQogICAgICAgIHRoaXMudmFsdWUgPSAodmFsdWUgaW5zdGFuY2VvZiBOb2RlKSA/IHZhbHVlIDogKHZhbHVlID8gbmV3IEFub255bW91cyh2YWx1ZSkgOiB2YWx1ZSk7DQogICAgICAgIGlmIChydWxlcykgew0KICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocnVsZXMpKSB7DQogICAgICAgICAgICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5ydWxlcyA9IFtydWxlc107DQogICAgICAgICAgICAgICAgdGhpcy5ydWxlc1swXS5zZWxlY3RvcnMgPSAobmV3IFNlbGVjdG9yKFtdLCBudWxsLCBudWxsLCBpbmRleCwgY3VycmVudEZpbGVJbmZvKSkuY3JlYXRlRW1wdHlTZWxlY3RvcnMoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnJ1bGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdGhpcy5ydWxlc1tpXS5hbGxvd0ltcG9ydHMgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy5ydWxlcywgdGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgIHRoaXMuZGVidWdJbmZvID0gZGVidWdJbmZvOw0KICAgICAgICB0aGlzLmlzUm9vdGVkID0gaXNSb290ZWQgfHwgZmFsc2U7DQogICAgICAgIHRoaXMuY29weVZpc2liaWxpdHlJbmZvKHZpc2liaWxpdHlJbmZvKTsNCiAgICAgICAgdGhpcy5hbGxvd1Jvb3QgPSB0cnVlOw0KICAgIH07DQogICAgQXRSdWxlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnQXRSdWxlJywNCiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiAodmlzaXRvcikgew0KICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSwgcnVsZXMgPSB0aGlzLnJ1bGVzOw0KICAgICAgICAgICAgaWYgKHJ1bGVzKSB7DQogICAgICAgICAgICAgICAgdGhpcy5ydWxlcyA9IHZpc2l0b3IudmlzaXRBcnJheShydWxlcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodmFsdWUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmlzaXRvci52aXNpdCh2YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGlzUnVsZXNldExpa2U6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnJ1bGVzIHx8ICF0aGlzLmlzQ2hhcnNldCgpOw0KICAgICAgICB9LA0KICAgICAgICBpc0NoYXJzZXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiAnQGNoYXJzZXQnID09PSB0aGlzLm5hbWU7DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSwgcnVsZXMgPSB0aGlzLnJ1bGVzOw0KICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLm5hbWUsIHRoaXMuZmlsZUluZm8oKSwgdGhpcy5nZXRJbmRleCgpKTsNCiAgICAgICAgICAgIGlmICh2YWx1ZSkgew0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoJyAnKTsNCiAgICAgICAgICAgICAgICB2YWx1ZS5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChydWxlcykgew0KICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0UnVsZXNldChjb250ZXh0LCBvdXRwdXQsIHJ1bGVzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoJzsnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciBtZWRpYVBhdGhCYWNrdXAsIG1lZGlhQmxvY2tzQmFja3VwLCB2YWx1ZSA9IHRoaXMudmFsdWUsIHJ1bGVzID0gdGhpcy5ydWxlczsNCiAgICAgICAgICAgIC8vIG1lZGlhIHN0b3JlZCBpbnNpZGUgb3RoZXIgYXRydWxlIHNob3VsZCBub3QgYnViYmxlIG92ZXIgaXQNCiAgICAgICAgICAgIC8vIGJhY2twdXAgbWVkaWEgYnViYmxpbmcgaW5mb3JtYXRpb24NCiAgICAgICAgICAgIG1lZGlhUGF0aEJhY2t1cCA9IGNvbnRleHQubWVkaWFQYXRoOw0KICAgICAgICAgICAgbWVkaWFCbG9ja3NCYWNrdXAgPSBjb250ZXh0Lm1lZGlhQmxvY2tzOw0KICAgICAgICAgICAgLy8gZGVsZXRlZCBtZWRpYSBidWJibGluZyBpbmZvcm1hdGlvbg0KICAgICAgICAgICAgY29udGV4dC5tZWRpYVBhdGggPSBbXTsNCiAgICAgICAgICAgIGNvbnRleHQubWVkaWFCbG9ja3MgPSBbXTsNCiAgICAgICAgICAgIGlmICh2YWx1ZSkgew0KICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChydWxlcykgew0KICAgICAgICAgICAgICAgIC8vIGFzc3VtaW5nIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgcnVsZSBhdCB0aGlzIHBvaW50IC0gdGhhdCBpcyBob3cgcGFyc2VyIGNvbnN0cnVjdHMgdGhlIHJ1bGUNCiAgICAgICAgICAgICAgICBydWxlcyA9IFtydWxlc1swXS5ldmFsKGNvbnRleHQpXTsNCiAgICAgICAgICAgICAgICBydWxlc1swXS5yb290ID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIHJlc3RvcmUgbWVkaWEgYnViYmxpbmcgaW5mb3JtYXRpb24NCiAgICAgICAgICAgIGNvbnRleHQubWVkaWFQYXRoID0gbWVkaWFQYXRoQmFja3VwOw0KICAgICAgICAgICAgY29udGV4dC5tZWRpYUJsb2NrcyA9IG1lZGlhQmxvY2tzQmFja3VwOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBBdFJ1bGUodGhpcy5uYW1lLCB2YWx1ZSwgcnVsZXMsIHRoaXMuZ2V0SW5kZXgoKSwgdGhpcy5maWxlSW5mbygpLCB0aGlzLmRlYnVnSW5mbywgdGhpcy5pc1Jvb3RlZCwgdGhpcy52aXNpYmlsaXR5SW5mbygpKTsNCiAgICAgICAgfSwNCiAgICAgICAgdmFyaWFibGU6IGZ1bmN0aW9uIChuYW1lKSB7DQogICAgICAgICAgICBpZiAodGhpcy5ydWxlcykgew0KICAgICAgICAgICAgICAgIC8vIGFzc3VtaW5nIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgcnVsZSBhdCB0aGlzIHBvaW50IC0gdGhhdCBpcyBob3cgcGFyc2VyIGNvbnN0cnVjdHMgdGhlIHJ1bGUNCiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZXNldC5wcm90b3R5cGUudmFyaWFibGUuY2FsbCh0aGlzLnJ1bGVzWzBdLCBuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZmluZDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKHRoaXMucnVsZXMpIHsNCiAgICAgICAgICAgICAgICAvLyBhc3N1bWluZyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHJ1bGUgYXQgdGhpcyBwb2ludCAtIHRoYXQgaXMgaG93IHBhcnNlciBjb25zdHJ1Y3RzIHRoZSBydWxlDQogICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVzZXQucHJvdG90eXBlLmZpbmQuYXBwbHkodGhpcy5ydWxlc1swXSwgYXJndW1lbnRzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgcnVsZXNldHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLnJ1bGVzKSB7DQogICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBydWxlIGF0IHRoaXMgcG9pbnQgLSB0aGF0IGlzIGhvdyBwYXJzZXIgY29uc3RydWN0cyB0aGUgcnVsZQ0KICAgICAgICAgICAgICAgIHJldHVybiBSdWxlc2V0LnByb3RvdHlwZS5ydWxlc2V0cy5hcHBseSh0aGlzLnJ1bGVzWzBdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgb3V0cHV0UnVsZXNldDogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCwgcnVsZXMpIHsNCiAgICAgICAgICAgIHZhciBydWxlQ250ID0gcnVsZXMubGVuZ3RoOw0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICBjb250ZXh0LnRhYkxldmVsID0gKGNvbnRleHQudGFiTGV2ZWwgfCAwKSArIDE7DQogICAgICAgICAgICAvLyBDb21wcmVzc2VkDQogICAgICAgICAgICBpZiAoY29udGV4dC5jb21wcmVzcykgew0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoJ3snKTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnVsZUNudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKCd9Jyk7DQogICAgICAgICAgICAgICAgY29udGV4dC50YWJMZXZlbC0tOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIE5vbi1jb21wcmVzc2VkDQogICAgICAgICAgICB2YXIgdGFiU2V0U3RyID0gIlxuIiArIEFycmF5KGNvbnRleHQudGFiTGV2ZWwpLmpvaW4oJyAgJyksIHRhYlJ1bGVTdHIgPSB0YWJTZXRTdHIgKyAiICAiOw0KICAgICAgICAgICAgaWYgKCFydWxlQ250KSB7DQogICAgICAgICAgICAgICAgb3V0cHV0LmFkZCgiIHsiICsgdGFiU2V0U3RyICsgIn0iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoIiB7IiArIHRhYlJ1bGVTdHIpOw0KICAgICAgICAgICAgICAgIHJ1bGVzWzBdLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBydWxlQ250OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZCh0YWJSdWxlU3RyKTsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXNbaV0uZ2VuQ1NTKGNvbnRleHQsIG91dHB1dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQodGFiU2V0U3RyICsgIn0iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbnRleHQudGFiTGV2ZWwtLTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBEZXRhY2hlZFJ1bGVzZXQgPSBmdW5jdGlvbiAocnVsZXNldCwgZnJhbWVzKSB7DQogICAgICAgIHRoaXMucnVsZXNldCA9IHJ1bGVzZXQ7DQogICAgICAgIHRoaXMuZnJhbWVzID0gZnJhbWVzOw0KICAgICAgICB0aGlzLnNldFBhcmVudCh0aGlzLnJ1bGVzZXQsIHRoaXMpOw0KICAgIH07DQogICAgRGV0YWNoZWRSdWxlc2V0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnRGV0YWNoZWRSdWxlc2V0JywNCiAgICAgICAgZXZhbEZpcnN0OiB0cnVlLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICB0aGlzLnJ1bGVzZXQgPSB2aXNpdG9yLnZpc2l0KHRoaXMucnVsZXNldCk7DQogICAgICAgIH0sDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgZnJhbWVzID0gdGhpcy5mcmFtZXMgfHwgY29weUFycmF5KGNvbnRleHQuZnJhbWVzKTsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRGV0YWNoZWRSdWxlc2V0KHRoaXMucnVsZXNldCwgZnJhbWVzKTsNCiAgICAgICAgfSwNCiAgICAgICAgY2FsbEV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5ydWxlc2V0LmV2YWwodGhpcy5mcmFtZXMgPyBuZXcgY29udGV4dHMuRXZhbChjb250ZXh0LCB0aGlzLmZyYW1lcy5jb25jYXQoY29udGV4dC5mcmFtZXMpKSA6IGNvbnRleHQpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIFVuaXQgPSBmdW5jdGlvbiAobnVtZXJhdG9yLCBkZW5vbWluYXRvciwgYmFja3VwVW5pdCkgew0KICAgICAgICB0aGlzLm51bWVyYXRvciA9IG51bWVyYXRvciA/IGNvcHlBcnJheShudW1lcmF0b3IpLnNvcnQoKSA6IFtdOw0KICAgICAgICB0aGlzLmRlbm9taW5hdG9yID0gZGVub21pbmF0b3IgPyBjb3B5QXJyYXkoZGVub21pbmF0b3IpLnNvcnQoKSA6IFtdOw0KICAgICAgICBpZiAoYmFja3VwVW5pdCkgew0KICAgICAgICAgICAgdGhpcy5iYWNrdXBVbml0ID0gYmFja3VwVW5pdDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChudW1lcmF0b3IgJiYgbnVtZXJhdG9yLmxlbmd0aCkgew0KICAgICAgICAgICAgdGhpcy5iYWNrdXBVbml0ID0gbnVtZXJhdG9yWzBdOw0KICAgICAgICB9DQogICAgfTsNCiAgICBVbml0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnVW5pdCcsDQogICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IFVuaXQoY29weUFycmF5KHRoaXMubnVtZXJhdG9yKSwgY29weUFycmF5KHRoaXMuZGVub21pbmF0b3IpLCB0aGlzLmJhY2t1cFVuaXQpOw0KICAgICAgICB9LA0KICAgICAgICBnZW5DU1M6IGZ1bmN0aW9uIChjb250ZXh0LCBvdXRwdXQpIHsNCiAgICAgICAgICAgIC8vIERpbWVuc2lvbiBjaGVja3MgdGhlIHVuaXQgaXMgc2luZ3VsYXIgYW5kIHRocm93cyBhbiBlcnJvciBpZiBpbiBzdHJpY3QgbWF0aCBtb2RlLg0KICAgICAgICAgICAgdmFyIHN0cmljdFVuaXRzID0gY29udGV4dCAmJiBjb250ZXh0LnN0cmljdFVuaXRzOw0KICAgICAgICAgICAgaWYgKHRoaXMubnVtZXJhdG9yLmxlbmd0aCA9PT0gMSkgew0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQodGhpcy5udW1lcmF0b3JbMF0pOyAvLyB0aGUgaWRlYWwgc2l0dWF0aW9uDQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICghc3RyaWN0VW5pdHMgJiYgdGhpcy5iYWNrdXBVbml0KSB7DQogICAgICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLmJhY2t1cFVuaXQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmljdFVuaXRzICYmIHRoaXMuZGVub21pbmF0b3IubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLmRlbm9taW5hdG9yWzBdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBpLCByZXR1cm5TdHIgPSB0aGlzLm51bWVyYXRvci5qb2luKCcqJyk7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5kZW5vbWluYXRvci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHJldHVyblN0ciArPSAiLyIgKyB0aGlzLmRlbm9taW5hdG9yW2ldOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJldHVyblN0cjsNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24gKG90aGVyKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5pcyhvdGhlci50b1N0cmluZygpKSA/IDAgOiB1bmRlZmluZWQ7DQogICAgICAgIH0sDQogICAgICAgIGlzOiBmdW5jdGlvbiAodW5pdFN0cmluZykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpID09PSB1bml0U3RyaW5nLnRvVXBwZXJDYXNlKCk7DQogICAgICAgIH0sDQogICAgICAgIGlzTGVuZ3RoOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gUmVnRXhwKCdeKHB4fGVtfGV4fGNofHJlbXxpbnxjbXxtbXxwY3xwdHxleHx2d3x2aHx2bWlufHZtYXgpJCcsICdnaScpLnRlc3QodGhpcy50b0NTUygpKTsNCiAgICAgICAgfSwNCiAgICAgICAgaXNFbXB0eTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtZXJhdG9yLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmRlbm9taW5hdG9yLmxlbmd0aCA9PT0gMDsNCiAgICAgICAgfSwNCiAgICAgICAgaXNTaW5ndWxhcjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtZXJhdG9yLmxlbmd0aCA8PSAxICYmIHRoaXMuZGVub21pbmF0b3IubGVuZ3RoID09PSAwOw0KICAgICAgICB9LA0KICAgICAgICBtYXA6IGZ1bmN0aW9uIChjYWxsYmFjaykgew0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5udW1lcmF0b3IubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB0aGlzLm51bWVyYXRvcltpXSA9IGNhbGxiYWNrKHRoaXMubnVtZXJhdG9yW2ldLCBmYWxzZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5kZW5vbWluYXRvci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHRoaXMuZGVub21pbmF0b3JbaV0gPSBjYWxsYmFjayh0aGlzLmRlbm9taW5hdG9yW2ldLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgdXNlZFVuaXRzOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgZ3JvdXA7DQogICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307DQogICAgICAgICAgICB2YXIgbWFwVW5pdDsNCiAgICAgICAgICAgIHZhciBncm91cE5hbWU7DQogICAgICAgICAgICBtYXBVbml0ID0gZnVuY3Rpb24gKGF0b21pY1VuaXQpIHsNCiAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6dHJ1ZSAqLw0KICAgICAgICAgICAgICAgIGlmIChncm91cC5oYXNPd25Qcm9wZXJ0eShhdG9taWNVbml0KSAmJiAhcmVzdWx0W2dyb3VwTmFtZV0pIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2dyb3VwTmFtZV0gPSBhdG9taWNVbml0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gYXRvbWljVW5pdDsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBmb3IgKGdyb3VwTmFtZSBpbiB1bml0Q29udmVyc2lvbnMpIHsNCiAgICAgICAgICAgICAgICBpZiAodW5pdENvbnZlcnNpb25zLmhhc093blByb3BlcnR5KGdyb3VwTmFtZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSB1bml0Q29udmVyc2lvbnNbZ3JvdXBOYW1lXTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAobWFwVW5pdCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgfSwNCiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgY291bnRlciA9IHt9Ow0KICAgICAgICAgICAgdmFyIGF0b21pY1VuaXQ7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLm51bWVyYXRvci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGF0b21pY1VuaXQgPSB0aGlzLm51bWVyYXRvcltpXTsNCiAgICAgICAgICAgICAgICBjb3VudGVyW2F0b21pY1VuaXRdID0gKGNvdW50ZXJbYXRvbWljVW5pdF0gfHwgMCkgKyAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZGVub21pbmF0b3IubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBhdG9taWNVbml0ID0gdGhpcy5kZW5vbWluYXRvcltpXTsNCiAgICAgICAgICAgICAgICBjb3VudGVyW2F0b21pY1VuaXRdID0gKGNvdW50ZXJbYXRvbWljVW5pdF0gfHwgMCkgLSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5udW1lcmF0b3IgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuZGVub21pbmF0b3IgPSBbXTsNCiAgICAgICAgICAgIGZvciAoYXRvbWljVW5pdCBpbiBjb3VudGVyKSB7DQogICAgICAgICAgICAgICAgaWYgKGNvdW50ZXIuaGFzT3duUHJvcGVydHkoYXRvbWljVW5pdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gY291bnRlclthdG9taWNVbml0XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWVyYXRvci5wdXNoKGF0b21pY1VuaXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50IDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IC1jb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZW5vbWluYXRvci5wdXNoKGF0b21pY1VuaXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5udW1lcmF0b3Iuc29ydCgpOw0KICAgICAgICAgICAgdGhpcy5kZW5vbWluYXRvci5zb3J0KCk7DQogICAgICAgIH0NCiAgICB9KTsKCiAgICAvLw0KICAgIC8vIEEgbnVtYmVyIHdpdGggYSB1bml0DQogICAgLy8NCiAgICB2YXIgRGltZW5zaW9uID0gZnVuY3Rpb24gKHZhbHVlLCB1bml0KSB7DQogICAgICAgIHRoaXMudmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsNCiAgICAgICAgaWYgKGlzTmFOKHRoaXMudmFsdWUpKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpbWVuc2lvbiBpcyBub3QgYSBudW1iZXIuJyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy51bml0ID0gKHVuaXQgJiYgdW5pdCBpbnN0YW5jZW9mIFVuaXQpID8gdW5pdCA6DQogICAgICAgICAgICBuZXcgVW5pdCh1bml0ID8gW3VuaXRdIDogdW5kZWZpbmVkKTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy51bml0LCB0aGlzKTsNCiAgICB9Ow0KICAgIERpbWVuc2lvbi5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBOb2RlKCksIHsNCiAgICAgICAgdHlwZTogJ0RpbWVuc2lvbicsDQogICAgICAgIGFjY2VwdDogZnVuY3Rpb24gKHZpc2l0b3IpIHsNCiAgICAgICAgICAgIHRoaXMudW5pdCA9IHZpc2l0b3IudmlzaXQodGhpcy51bml0KTsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9LA0KICAgICAgICB0b0NvbG9yOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKFt0aGlzLnZhbHVlLCB0aGlzLnZhbHVlLCB0aGlzLnZhbHVlXSk7DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgaWYgKChjb250ZXh0ICYmIGNvbnRleHQuc3RyaWN0VW5pdHMpICYmICF0aGlzLnVuaXQuaXNTaW5ndWxhcigpKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNdWx0aXBsZSB1bml0cyBpbiBkaW1lbnNpb24uIENvcnJlY3QgdGhlIHVuaXRzIG9yIHVzZSB0aGUgdW5pdCBmdW5jdGlvbi4gQmFkIHVuaXQ6ICIgKyB0aGlzLnVuaXQudG9TdHJpbmcoKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmZyb3VuZChjb250ZXh0LCB0aGlzLnZhbHVlKTsNCiAgICAgICAgICAgIHZhciBzdHJWYWx1ZSA9IFN0cmluZyh2YWx1ZSk7DQogICAgICAgICAgICBpZiAodmFsdWUgIT09IDAgJiYgdmFsdWUgPCAwLjAwMDAwMSAmJiB2YWx1ZSA+IC0wLjAwMDAwMSkgew0KICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIG91dHB1dCAxZS02IGV0Yy4NCiAgICAgICAgICAgICAgICBzdHJWYWx1ZSA9IHZhbHVlLnRvRml4ZWQoMjApLnJlcGxhY2UoLzArJC8sICcnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuY29tcHJlc3MpIHsNCiAgICAgICAgICAgICAgICAvLyBaZXJvIHZhbHVlcyBkb2Vzbid0IG5lZWQgYSB1bml0DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwICYmIHRoaXMudW5pdC5pc0xlbmd0aCgpKSB7DQogICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoc3RyVmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIEZsb2F0IHZhbHVlcyBkb2Vzbid0IG5lZWQgYSBsZWFkaW5nIHplcm8NCiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAwICYmIHZhbHVlIDwgMSkgew0KICAgICAgICAgICAgICAgICAgICBzdHJWYWx1ZSA9IChzdHJWYWx1ZSkuc3Vic3RyKDEpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG91dHB1dC5hZGQoc3RyVmFsdWUpOw0KICAgICAgICAgICAgdGhpcy51bml0LmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICB9LA0KICAgICAgICAvLyBJbiBhbiBvcGVyYXRpb24gYmV0d2VlbiB0d28gRGltZW5zaW9ucywNCiAgICAgICAgLy8gd2UgZGVmYXVsdCB0byB0aGUgZmlyc3QgRGltZW5zaW9uJ3MgdW5pdCwNCiAgICAgICAgLy8gc28gYDFweCArIDJgIHdpbGwgeWllbGQgYDNweGAuDQogICAgICAgIG9wZXJhdGU6IGZ1bmN0aW9uIChjb250ZXh0LCBvcCwgb3RoZXIpIHsNCiAgICAgICAgICAgIC8qIGpzaGludCBub2VtcHR5OmZhbHNlICovDQogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9vcGVyYXRlKGNvbnRleHQsIG9wLCB0aGlzLnZhbHVlLCBvdGhlci52YWx1ZSk7DQogICAgICAgICAgICB2YXIgdW5pdCA9IHRoaXMudW5pdC5jbG9uZSgpOw0KICAgICAgICAgICAgaWYgKG9wID09PSAnKycgfHwgb3AgPT09ICctJykgew0KICAgICAgICAgICAgICAgIGlmICh1bml0Lm51bWVyYXRvci5sZW5ndGggPT09IDAgJiYgdW5pdC5kZW5vbWluYXRvci5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgdW5pdCA9IG90aGVyLnVuaXQuY2xvbmUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudW5pdC5iYWNrdXBVbml0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1bml0LmJhY2t1cFVuaXQgPSB0aGlzLnVuaXQuYmFja3VwVW5pdDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChvdGhlci51bml0Lm51bWVyYXRvci5sZW5ndGggPT09IDAgJiYgdW5pdC5kZW5vbWluYXRvci5sZW5ndGggPT09IDApIDsNCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBvdGhlci5jb252ZXJ0VG8odGhpcy51bml0LnVzZWRVbml0cygpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuc3RyaWN0VW5pdHMgJiYgb3RoZXIudW5pdC50b1N0cmluZygpICE9PSB1bml0LnRvU3RyaW5nKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW5jb21wYXRpYmxlIHVuaXRzLiBDaGFuZ2UgdGhlIHVuaXRzIG9yIHVzZSB0aGUgdW5pdCBmdW5jdGlvbi4gIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCJCYWQgdW5pdHM6ICciICsgdW5pdC50b1N0cmluZygpICsgIicgYW5kICciICsgb3RoZXIudW5pdC50b1N0cmluZygpICsgIicuIikpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fb3BlcmF0ZShjb250ZXh0LCBvcCwgdGhpcy52YWx1ZSwgb3RoZXIudmFsdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKG9wID09PSAnKicpIHsNCiAgICAgICAgICAgICAgICB1bml0Lm51bWVyYXRvciA9IHVuaXQubnVtZXJhdG9yLmNvbmNhdChvdGhlci51bml0Lm51bWVyYXRvcikuc29ydCgpOw0KICAgICAgICAgICAgICAgIHVuaXQuZGVub21pbmF0b3IgPSB1bml0LmRlbm9taW5hdG9yLmNvbmNhdChvdGhlci51bml0LmRlbm9taW5hdG9yKS5zb3J0KCk7DQogICAgICAgICAgICAgICAgdW5pdC5jYW5jZWwoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKG9wID09PSAnLycpIHsNCiAgICAgICAgICAgICAgICB1bml0Lm51bWVyYXRvciA9IHVuaXQubnVtZXJhdG9yLmNvbmNhdChvdGhlci51bml0LmRlbm9taW5hdG9yKS5zb3J0KCk7DQogICAgICAgICAgICAgICAgdW5pdC5kZW5vbWluYXRvciA9IHVuaXQuZGVub21pbmF0b3IuY29uY2F0KG90aGVyLnVuaXQubnVtZXJhdG9yKS5zb3J0KCk7DQogICAgICAgICAgICAgICAgdW5pdC5jYW5jZWwoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHZhbHVlLCB1bml0KTsNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24gKG90aGVyKSB7DQogICAgICAgICAgICB2YXIgYSwgYjsNCiAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRGltZW5zaW9uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy51bml0LmlzRW1wdHkoKSB8fCBvdGhlci51bml0LmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgICAgIGEgPSB0aGlzOw0KICAgICAgICAgICAgICAgIGIgPSBvdGhlcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGEgPSB0aGlzLnVuaWZ5KCk7DQogICAgICAgICAgICAgICAgYiA9IG90aGVyLnVuaWZ5KCk7DQogICAgICAgICAgICAgICAgaWYgKGEudW5pdC5jb21wYXJlKGIudW5pdCkgIT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTm9kZS5udW1lcmljQ29tcGFyZShhLnZhbHVlLCBiLnZhbHVlKTsNCiAgICAgICAgfSwNCiAgICAgICAgdW5pZnk6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUbyh7IGxlbmd0aDogJ3B4JywgZHVyYXRpb246ICdzJywgYW5nbGU6ICdyYWQnIH0pOw0KICAgICAgICB9LA0KICAgICAgICBjb252ZXJ0VG86IGZ1bmN0aW9uIChjb252ZXJzaW9ucykgew0KICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTsNCiAgICAgICAgICAgIHZhciB1bml0ID0gdGhpcy51bml0LmNsb25lKCk7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIHZhciBncm91cE5hbWU7DQogICAgICAgICAgICB2YXIgZ3JvdXA7DQogICAgICAgICAgICB2YXIgdGFyZ2V0VW5pdDsNCiAgICAgICAgICAgIHZhciBkZXJpdmVkQ29udmVyc2lvbnMgPSB7fTsNCiAgICAgICAgICAgIHZhciBhcHBseVVuaXQ7DQogICAgICAgICAgICBpZiAodHlwZW9mIGNvbnZlcnNpb25zID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgIGZvciAoaSBpbiB1bml0Q29udmVyc2lvbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXRDb252ZXJzaW9uc1tpXS5oYXNPd25Qcm9wZXJ0eShjb252ZXJzaW9ucykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWRDb252ZXJzaW9ucyA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZENvbnZlcnNpb25zW2ldID0gY29udmVyc2lvbnM7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY29udmVyc2lvbnMgPSBkZXJpdmVkQ29udmVyc2lvbnM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhcHBseVVuaXQgPSBmdW5jdGlvbiAoYXRvbWljVW5pdCwgZGVub21pbmF0b3IpIHsNCiAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6dHJ1ZSAqLw0KICAgICAgICAgICAgICAgIGlmIChncm91cC5oYXNPd25Qcm9wZXJ0eShhdG9taWNVbml0KSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoZGVub21pbmF0b3IpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgLyAoZ3JvdXBbYXRvbWljVW5pdF0gLyBncm91cFt0YXJnZXRVbml0XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogKGdyb3VwW2F0b21pY1VuaXRdIC8gZ3JvdXBbdGFyZ2V0VW5pdF0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRVbml0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gYXRvbWljVW5pdDsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBmb3IgKGdyb3VwTmFtZSBpbiBjb252ZXJzaW9ucykgew0KICAgICAgICAgICAgICAgIGlmIChjb252ZXJzaW9ucy5oYXNPd25Qcm9wZXJ0eShncm91cE5hbWUpKSB7DQogICAgICAgICAgICAgICAgICAgIHRhcmdldFVuaXQgPSBjb252ZXJzaW9uc1tncm91cE5hbWVdOw0KICAgICAgICAgICAgICAgICAgICBncm91cCA9IHVuaXRDb252ZXJzaW9uc1tncm91cE5hbWVdOw0KICAgICAgICAgICAgICAgICAgICB1bml0Lm1hcChhcHBseVVuaXQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHVuaXQuY2FuY2VsKCk7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih2YWx1ZSwgdW5pdCk7DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgTUFUSCA9IE1hdGgkMTsNCiAgICB2YXIgT3BlcmF0aW9uID0gZnVuY3Rpb24gKG9wLCBvcGVyYW5kcywgaXNTcGFjZWQpIHsNCiAgICAgICAgdGhpcy5vcCA9IG9wLnRyaW0oKTsNCiAgICAgICAgdGhpcy5vcGVyYW5kcyA9IG9wZXJhbmRzOw0KICAgICAgICB0aGlzLmlzU3BhY2VkID0gaXNTcGFjZWQ7DQogICAgfTsNCiAgICBPcGVyYXRpb24ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdPcGVyYXRpb24nLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICB0aGlzLm9wZXJhbmRzID0gdmlzaXRvci52aXNpdEFycmF5KHRoaXMub3BlcmFuZHMpOw0KICAgICAgICB9LA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIGEgPSB0aGlzLm9wZXJhbmRzWzBdLmV2YWwoY29udGV4dCksIGIgPSB0aGlzLm9wZXJhbmRzWzFdLmV2YWwoY29udGV4dCksIG9wOw0KICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNNYXRoT24odGhpcy5vcCkpIHsNCiAgICAgICAgICAgICAgICBvcCA9IHRoaXMub3AgPT09ICcuLycgPyAnLycgOiB0aGlzLm9wOw0KICAgICAgICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgRGltZW5zaW9uICYmIGIgaW5zdGFuY2VvZiBDb2xvcikgew0KICAgICAgICAgICAgICAgICAgICBhID0gYS50b0NvbG9yKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiIGluc3RhbmNlb2YgRGltZW5zaW9uICYmIGEgaW5zdGFuY2VvZiBDb2xvcikgew0KICAgICAgICAgICAgICAgICAgICBiID0gYi50b0NvbG9yKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghYS5vcGVyYXRlIHx8ICFiLm9wZXJhdGUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKChhIGluc3RhbmNlb2YgT3BlcmF0aW9uIHx8IGIgaW5zdGFuY2VvZiBPcGVyYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAmJiBhLm9wID09PSAnLycgJiYgY29udGV4dC5tYXRoID09PSBNQVRILlBBUkVOU19ESVZJU0lPTikgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVyYXRpb24odGhpcy5vcCwgW2EsIGJdLCB0aGlzLmlzU3BhY2VkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdPcGVyYXRpb24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ09wZXJhdGlvbiBvbiBhbiBpbnZhbGlkIHR5cGUnIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBhLm9wZXJhdGUoY29udGV4dCwgb3AsIGIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVyYXRpb24odGhpcy5vcCwgW2EsIGJdLCB0aGlzLmlzU3BhY2VkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICB0aGlzLm9wZXJhbmRzWzBdLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICAgICAgaWYgKHRoaXMuaXNTcGFjZWQpIHsNCiAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKCcgJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvdXRwdXQuYWRkKHRoaXMub3ApOw0KICAgICAgICAgICAgaWYgKHRoaXMuaXNTcGFjZWQpIHsNCiAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKCcgJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLm9wZXJhbmRzWzFdLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiAgICBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7DQogICAgICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7DQogICAgICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTsNCiAgICAgICAgICAgICAgICBhcltpXSA9IGZyb21baV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBmcm9tKTsNCiAgICB9CgogICAgdmFyIEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmFsdWUsIG5vU3BhY2luZykgew0KICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQogICAgICAgIHRoaXMubm9TcGFjaW5nID0gbm9TcGFjaW5nOw0KICAgICAgICBpZiAoIXZhbHVlKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cHJlc3Npb24gcmVxdWlyZXMgYW4gYXJyYXkgcGFyYW1ldGVyJyk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIEV4cHJlc3Npb24ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdFeHByZXNzaW9uJywNCiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiAodmlzaXRvcikgew0KICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZpc2l0b3IudmlzaXRBcnJheSh0aGlzLnZhbHVlKTsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZTsNCiAgICAgICAgICAgIHZhciBtYXRoT24gPSBjb250ZXh0LmlzTWF0aE9uKCk7DQogICAgICAgICAgICB2YXIgaW5QYXJlbnRoZXNpcyA9IHRoaXMucGFyZW5zOw0KICAgICAgICAgICAgdmFyIGRvdWJsZVBhcmVuID0gZmFsc2U7DQogICAgICAgICAgICBpZiAoaW5QYXJlbnRoZXNpcykgew0KICAgICAgICAgICAgICAgIGNvbnRleHQuaW5QYXJlbnRoZXNpcygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbmV3IEV4cHJlc3Npb24odGhpcy52YWx1ZS5tYXAoZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmV2YWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICAgICAgfSksIHRoaXMubm9TcGFjaW5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsdWUubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVbMF0ucGFyZW5zICYmICF0aGlzLnZhbHVlWzBdLnBhcmVuc0luT3AgJiYgIWNvbnRleHQuaW5DYWxjKSB7DQogICAgICAgICAgICAgICAgICAgIGRvdWJsZVBhcmVuID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLnZhbHVlWzBdLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRoaXM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoaW5QYXJlbnRoZXNpcykgew0KICAgICAgICAgICAgICAgIGNvbnRleHQub3V0T2ZQYXJlbnRoZXNpcygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMucGFyZW5zICYmIHRoaXMucGFyZW5zSW5PcCAmJiAhbWF0aE9uICYmICFkb3VibGVQYXJlbg0KICAgICAgICAgICAgICAgICYmICghKHJldHVyblZhbHVlIGluc3RhbmNlb2YgRGltZW5zaW9uKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG5ldyBQYXJlbihyZXR1cm5WYWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdGhpcy52YWx1ZVtpXS5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubm9TcGFjaW5nICYmIGkgKyAxIDwgdGhpcy52YWx1ZS5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZCgnICcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgdGhyb3dBd2F5Q29tbWVudHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcihmdW5jdGlvbiAodikgew0KICAgICAgICAgICAgICAgIHJldHVybiAhKHYgaW5zdGFuY2VvZiBDb21tZW50KTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIGZ1bmN0aW9uQ2FsbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgew0KICAgICAgICBmdW5jdGlvbiBmdW5jdGlvbkNhbGxlcihuYW1lLCBjb250ZXh0LCBpbmRleCwgY3VycmVudEZpbGVJbmZvKSB7DQogICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7DQogICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Ow0KICAgICAgICAgICAgdGhpcy5jdXJyZW50RmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgICAgICB0aGlzLmZ1bmMgPSBjb250ZXh0LmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmdldCh0aGlzLm5hbWUpOw0KICAgICAgICB9DQogICAgICAgIGZ1bmN0aW9uQ2FsbGVyLnByb3RvdHlwZS5pc1ZhbGlkID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5mdW5jKTsNCiAgICAgICAgfTsNCiAgICAgICAgZnVuY3Rpb25DYWxsZXIucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoYXJncykgew0KICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCiAgICAgICAgICAgIGlmICghKEFycmF5LmlzQXJyYXkoYXJncykpKSB7DQogICAgICAgICAgICAgICAgYXJncyA9IFthcmdzXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBldmFsQXJncyA9IHRoaXMuZnVuYy5ldmFsQXJnczsNCiAgICAgICAgICAgIGlmIChldmFsQXJncyAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICBhcmdzID0gYXJncy5tYXAoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEuZXZhbChfdGhpcy5jb250ZXh0KTsgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgY29tbWVudEZpbHRlciA9IGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAhKGl0ZW0udHlwZSA9PT0gJ0NvbW1lbnQnKTsgfTsNCiAgICAgICAgICAgIC8vIFRoaXMgY29kZSBpcyB0ZXJyaWJsZSBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIGFzIHBlciB0aGlzIGlzc3VlLi4uDQogICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGVzcy9sZXNzLmpzL2lzc3Vlcy8yNDc3DQogICAgICAgICAgICBhcmdzID0gYXJncw0KICAgICAgICAgICAgICAgIC5maWx0ZXIoY29tbWVudEZpbHRlcikNCiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChpdGVtKSB7DQogICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ0V4cHJlc3Npb24nKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBzdWJOb2RlcyA9IGl0ZW0udmFsdWUuZmlsdGVyKGNvbW1lbnRGaWx0ZXIpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc3ViTm9kZXMubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGVzcy9sZXNzLmpzL2lzc3Vlcy8zNjE2DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5wYXJlbnMgJiYgc3ViTm9kZXNbMF0ub3AgPT09ICcvJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Yk5vZGVzWzBdOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKHN1Yk5vZGVzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgaWYgKGV2YWxBcmdzID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZ1bmMuYXBwbHkodGhpcywgX19zcHJlYWRBcnJheShbdGhpcy5jb250ZXh0XSwgYXJncykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnVuYy5hcHBseSh0aGlzLCBhcmdzKTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uQ2FsbGVyOw0KICAgIH0oKSk7CgogICAgLy8NCiAgICAvLyBBIGZ1bmN0aW9uIGNhbGwgbm9kZS4NCiAgICAvLw0KICAgIHZhciBDYWxsID0gZnVuY3Rpb24gKG5hbWUsIGFyZ3MsIGluZGV4LCBjdXJyZW50RmlsZUluZm8pIHsNCiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCiAgICAgICAgdGhpcy5hcmdzID0gYXJnczsNCiAgICAgICAgdGhpcy5jYWxjID0gbmFtZSA9PT0gJ2NhbGMnOw0KICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4Ow0KICAgICAgICB0aGlzLl9maWxlSW5mbyA9IGN1cnJlbnRGaWxlSW5mbzsNCiAgICB9Ow0KICAgIENhbGwucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdDYWxsJywNCiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiAodmlzaXRvcikgew0KICAgICAgICAgICAgaWYgKHRoaXMuYXJncykgew0KICAgICAgICAgICAgICAgIHRoaXMuYXJncyA9IHZpc2l0b3IudmlzaXRBcnJheSh0aGlzLmFyZ3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICAvLw0KICAgICAgICAvLyBXaGVuIGV2YWx1YXRpbmcgYSBmdW5jdGlvbiBjYWxsLA0KICAgICAgICAvLyB3ZSBlaXRoZXIgZmluZCB0aGUgZnVuY3Rpb24gaW4gdGhlIGZ1bmN0aW9uUmVnaXN0cnksDQogICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UgY2FsbCBpdCwgcGFzc2luZyB0aGUgIGV2YWx1YXRlZCBhcmd1bWVudHMsDQogICAgICAgIC8vIGlmIHRoaXMgcmV0dXJucyBudWxsIG9yIHdlIGNhbm5vdCBmaW5kIHRoZSBmdW5jdGlvbiwgd2UNCiAgICAgICAgLy8gc2ltcGx5IHByaW50IGl0IG91dCBhcyBpdCBhcHBlYXJlZCBvcmlnaW5hbGx5IFsyXS4NCiAgICAgICAgLy8NCiAgICAgICAgLy8gVGhlIHJlYXNvbiB3aHkgd2UgZXZhbHVhdGUgdGhlIGFyZ3VtZW50cywgaXMgaW4gdGhlIGNhc2Ugd2hlcmUNCiAgICAgICAgLy8gd2UgdHJ5IHRvIHBhc3MgYSB2YXJpYWJsZSB0byBhIGZ1bmN0aW9uLCBsaWtlOiBgc2F0dXJhdGUoQGNvbG9yKWAuDQogICAgICAgIC8vIFRoZSBmdW5jdGlvbiBzaG91bGQgcmVjZWl2ZSB0aGUgdmFsdWUsIG5vdCB0aGUgdmFyaWFibGUuDQogICAgICAgIC8vDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBUdXJuIG9mZiBtYXRoIGZvciBjYWxjKCksIGFuZCBzd2l0Y2ggYmFjayBvbiBmb3IgZXZhbHVhdGluZyBuZXN0ZWQgZnVuY3Rpb25zDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIHZhciBjdXJyZW50TWF0aENvbnRleHQgPSBjb250ZXh0Lm1hdGhPbjsNCiAgICAgICAgICAgIGNvbnRleHQubWF0aE9uID0gIXRoaXMuY2FsYzsNCiAgICAgICAgICAgIGlmICh0aGlzLmNhbGMgfHwgY29udGV4dC5pbkNhbGMpIHsNCiAgICAgICAgICAgICAgICBjb250ZXh0LmVudGVyQ2FsYygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGV4aXRDYWxjID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jYWxjIHx8IGNvbnRleHQuaW5DYWxjKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZXhpdENhbGMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY29udGV4dC5tYXRoT24gPSBjdXJyZW50TWF0aENvbnRleHQ7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgICAgIHZhciBmdW5jQ2FsbGVyID0gbmV3IGZ1bmN0aW9uQ2FsbGVyKHRoaXMubmFtZSwgY29udGV4dCwgdGhpcy5nZXRJbmRleCgpLCB0aGlzLmZpbGVJbmZvKCkpOw0KICAgICAgICAgICAgaWYgKGZ1bmNDYWxsZXIuaXNWYWxpZCgpKSB7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuY0NhbGxlci5jYWxsKHRoaXMuYXJncyk7DQogICAgICAgICAgICAgICAgICAgIGV4aXRDYWxjKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChlLmhhc093blByb3BlcnR5KCdsaW5lJykgJiYgZS5oYXNPd25Qcm9wZXJ0eSgnY29sdW1uJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgew0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZS50eXBlIHx8ICdSdW50aW1lJywNCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJFcnJvciBldmFsdWF0aW5nIGZ1bmN0aW9uIGAiICsgdGhpcy5uYW1lICsgImAiICsgKGUubWVzc2FnZSA/ICI6ICIgKyBlLm1lc3NhZ2UgOiAnJyksDQogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGUubGluZU51bWJlciwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZS5jb2x1bW5OdW1iZXINCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgLy8gUmVzdWx0cyB0aGF0IHRoYXQgYXJlIG5vdCBub2RlcyBhcmUgY2FzdCBhcyBBbm9ueW1vdXMgbm9kZXMNCiAgICAgICAgICAgICAgICAvLyBGYWxzeSB2YWx1ZXMgb3IgYm9vbGVhbnMgYXJlIHJldHVybmVkIGFzIGVtcHR5IG5vZGVzDQogICAgICAgICAgICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgTm9kZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0ID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQW5vbnltb3VzKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFub255bW91cyhyZXN1bHQudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmVzdWx0Ll9pbmRleCA9IHRoaXMuX2luZGV4Ow0KICAgICAgICAgICAgICAgIHJlc3VsdC5fZmlsZUluZm8gPSB0aGlzLl9maWxlSW5mbzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLmFyZ3MubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLmV2YWwoY29udGV4dCk7IH0pOw0KICAgICAgICAgICAgZXhpdENhbGMoKTsNCiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbCh0aGlzLm5hbWUsIGFyZ3MsIHRoaXMuZ2V0SW5kZXgoKSwgdGhpcy5maWxlSW5mbygpKTsNCiAgICAgICAgfSwNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICBvdXRwdXQuYWRkKHRoaXMubmFtZSArICIoIiwgdGhpcy5maWxlSW5mbygpLCB0aGlzLmdldEluZGV4KCkpOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFyZ3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB0aGlzLmFyZ3NbaV0uZ2VuQ1NTKGNvbnRleHQsIG91dHB1dCk7DQogICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGhpcy5hcmdzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKCcsICcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG91dHB1dC5hZGQoJyknKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCBpbmRleCwgY3VycmVudEZpbGVJbmZvKSB7DQogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQogICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7DQogICAgICAgIHRoaXMuX2ZpbGVJbmZvID0gY3VycmVudEZpbGVJbmZvOw0KICAgIH07DQogICAgVmFyaWFibGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdWYXJpYWJsZScsDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgdmFyaWFibGUsIG5hbWUgPSB0aGlzLm5hbWU7DQogICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCdAQCcpID09PSAwKSB7DQogICAgICAgICAgICAgICAgbmFtZSA9ICJAIiArIG5ldyBWYXJpYWJsZShuYW1lLnNsaWNlKDEpLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSkuZXZhbChjb250ZXh0KS52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLmV2YWx1YXRpbmcpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdOYW1lJywNCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlJlY3Vyc2l2ZSB2YXJpYWJsZSBkZWZpbml0aW9uIGZvciAiICsgbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZ2V0SW5kZXgoKSB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5ldmFsdWF0aW5nID0gdHJ1ZTsNCiAgICAgICAgICAgIHZhcmlhYmxlID0gdGhpcy5maW5kKGNvbnRleHQuZnJhbWVzLCBmdW5jdGlvbiAoZnJhbWUpIHsNCiAgICAgICAgICAgICAgICB2YXIgdiA9IGZyYW1lLnZhcmlhYmxlKG5hbWUpOw0KICAgICAgICAgICAgICAgIGlmICh2KSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2LmltcG9ydGFudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltcG9ydGFudFNjb3BlID0gY29udGV4dC5pbXBvcnRhbnRTY29wZVtjb250ZXh0LmltcG9ydGFudFNjb3BlLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50U2NvcGUuaW1wb3J0YW50ID0gdi5pbXBvcnRhbnQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaW4gY2FsYywgd3JhcCB2YXJzIGluIGEgZnVuY3Rpb24gY2FsbCB0byBjYXNjYWRlIGV2YWx1YXRlIGFyZ3MgZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuaW5DYWxjKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBDYWxsKCdfU0VMRicsIFt2LnZhbHVlXSkpLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi52YWx1ZS5ldmFsKGNvbnRleHQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBpZiAodmFyaWFibGUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRpbmcgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdOYW1lJywNCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogInZhcmlhYmxlICIgKyBuYW1lICsgIiBpcyB1bmRlZmluZWQiLA0KICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLA0KICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpIH07DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGZpbmQ6IGZ1bmN0aW9uIChvYmosIGZ1bikgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHIgPSB2b2lkIDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICByID0gZnVuLmNhbGwob2JqLCBvYmpbaV0pOw0KICAgICAgICAgICAgICAgIGlmIChyKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIFByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUsIGluZGV4LCBjdXJyZW50RmlsZUluZm8pIHsNCiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgfTsNCiAgICBQcm9wZXJ0eS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBOb2RlKCksIHsNCiAgICAgICAgdHlwZTogJ1Byb3BlcnR5JywNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eTsNCiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lOw0KICAgICAgICAgICAgLy8gVE9ETzogc2hvcnRlbiB0aGlzIHJlZmVyZW5jZQ0KICAgICAgICAgICAgdmFyIG1lcmdlUnVsZXMgPSBjb250ZXh0LnBsdWdpbk1hbmFnZXIubGVzcy52aXNpdG9ycy5Ub0NTU1Zpc2l0b3IucHJvdG90eXBlLl9tZXJnZVJ1bGVzOw0KICAgICAgICAgICAgaWYgKHRoaXMuZXZhbHVhdGluZykgew0KICAgICAgICAgICAgICAgIHRocm93IHsgdHlwZTogJ05hbWUnLA0KICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiUmVjdXJzaXZlIHByb3BlcnR5IHJlZmVyZW5jZSBmb3IgIiArIG5hbWUsDQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsDQogICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLmdldEluZGV4KCkgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGluZyA9IHRydWU7DQogICAgICAgICAgICBwcm9wZXJ0eSA9IHRoaXMuZmluZChjb250ZXh0LmZyYW1lcywgZnVuY3Rpb24gKGZyYW1lKSB7DQogICAgICAgICAgICAgICAgdmFyIHY7DQogICAgICAgICAgICAgICAgdmFyIHZBcnIgPSBmcmFtZS5wcm9wZXJ0eShuYW1lKTsNCiAgICAgICAgICAgICAgICBpZiAodkFycikgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZBcnIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2QXJyW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgdkFycltpXSA9IG5ldyBEZWNsYXJhdGlvbih2Lm5hbWUsIHYudmFsdWUsIHYuaW1wb3J0YW50LCB2Lm1lcmdlLCB2LmluZGV4LCB2LmN1cnJlbnRGaWxlSW5mbywgdi5pbmxpbmUsIHYudmFyaWFibGUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIG1lcmdlUnVsZXModkFycik7DQogICAgICAgICAgICAgICAgICAgIHYgPSB2QXJyW3ZBcnIubGVuZ3RoIC0gMV07DQogICAgICAgICAgICAgICAgICAgIGlmICh2LmltcG9ydGFudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltcG9ydGFudFNjb3BlID0gY29udGV4dC5pbXBvcnRhbnRTY29wZVtjb250ZXh0LmltcG9ydGFudFNjb3BlLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50U2NvcGUuaW1wb3J0YW50ID0gdi5pbXBvcnRhbnQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdiA9IHYudmFsdWUuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBpZiAocHJvcGVydHkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRpbmcgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdOYW1lJywNCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlByb3BlcnR5ICciICsgbmFtZSArICInIGlzIHVuZGVmaW5lZCIsDQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmN1cnJlbnRGaWxlSW5mby5maWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuaW5kZXggfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZmluZDogZnVuY3Rpb24gKG9iaiwgZnVuKSB7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgciA9IHZvaWQgMDsgaSA8IG9iai5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHIgPSBmdW4uY2FsbChvYmosIG9ialtpXSk7DQogICAgICAgICAgICAgICAgaWYgKHIpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgQXR0cmlidXRlID0gZnVuY3Rpb24gKGtleSwgb3AsIHZhbHVlKSB7DQogICAgICAgIHRoaXMua2V5ID0ga2V5Ow0KICAgICAgICB0aGlzLm9wID0gb3A7DQogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCiAgICB9Ow0KICAgIEF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBOb2RlKCksIHsNCiAgICAgICAgdHlwZTogJ0F0dHJpYnV0ZScsDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZSh0aGlzLmtleS5ldmFsID8gdGhpcy5rZXkuZXZhbChjb250ZXh0KSA6IHRoaXMua2V5LCB0aGlzLm9wLCAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmV2YWwpID8gdGhpcy52YWx1ZS5ldmFsKGNvbnRleHQpIDogdGhpcy52YWx1ZSk7DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLnRvQ1NTKGNvbnRleHQpKTsNCiAgICAgICAgfSwNCiAgICAgICAgdG9DU1M6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmtleS50b0NTUyA/IHRoaXMua2V5LnRvQ1NTKGNvbnRleHQpIDogdGhpcy5rZXk7DQogICAgICAgICAgICBpZiAodGhpcy5vcCkgew0KICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMub3A7DQogICAgICAgICAgICAgICAgdmFsdWUgKz0gKHRoaXMudmFsdWUudG9DU1MgPyB0aGlzLnZhbHVlLnRvQ1NTKGNvbnRleHQpIDogdGhpcy52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gIlsiICsgdmFsdWUgKyAiXSI7DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgUXVvdGVkID0gZnVuY3Rpb24gKHN0ciwgY29udGVudCwgZXNjYXBlZCwgaW5kZXgsIGN1cnJlbnRGaWxlSW5mbykgew0KICAgICAgICB0aGlzLmVzY2FwZWQgPSAoZXNjYXBlZCA9PSBudWxsKSA/IHRydWUgOiBlc2NhcGVkOw0KICAgICAgICB0aGlzLnZhbHVlID0gY29udGVudCB8fCAnJzsNCiAgICAgICAgdGhpcy5xdW90ZSA9IHN0ci5jaGFyQXQoMCk7DQogICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7DQogICAgICAgIHRoaXMuX2ZpbGVJbmZvID0gY3VycmVudEZpbGVJbmZvOw0KICAgICAgICB0aGlzLnZhcmlhYmxlUmVnZXggPSAvQFx7KFtcdy1dKylcfS9nOw0KICAgICAgICB0aGlzLnByb3BSZWdleCA9IC9cJFx7KFtcdy1dKylcfS9nOw0KICAgICAgICB0aGlzLmFsbG93Um9vdCA9IGVzY2FwZWQ7DQogICAgfTsNCiAgICBRdW90ZWQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdRdW90ZWQnLA0KICAgICAgICBnZW5DU1M6IGZ1bmN0aW9uIChjb250ZXh0LCBvdXRwdXQpIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5lc2NhcGVkKSB7DQogICAgICAgICAgICAgICAgb3V0cHV0LmFkZCh0aGlzLnF1b3RlLCB0aGlzLmZpbGVJbmZvKCksIHRoaXMuZ2V0SW5kZXgoKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvdXRwdXQuYWRkKHRoaXMudmFsdWUpOw0KICAgICAgICAgICAgaWYgKCF0aGlzLmVzY2FwZWQpIHsNCiAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKHRoaXMucXVvdGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBjb250YWluc1ZhcmlhYmxlczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubWF0Y2godGhpcy52YXJpYWJsZVJlZ2V4KTsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsNCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7DQogICAgICAgICAgICB2YXIgdmFyaWFibGVSZXBsYWNlbWVudCA9IGZ1bmN0aW9uIChfLCBuYW1lKSB7DQogICAgICAgICAgICAgICAgdmFyIHYgPSBuZXcgVmFyaWFibGUoIkAiICsgbmFtZSwgdGhhdC5nZXRJbmRleCgpLCB0aGF0LmZpbGVJbmZvKCkpLmV2YWwoY29udGV4dCwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuICh2IGluc3RhbmNlb2YgUXVvdGVkKSA/IHYudmFsdWUgOiB2LnRvQ1NTKCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVwbGFjZW1lbnQgPSBmdW5jdGlvbiAoXywgbmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciB2ID0gbmV3IFByb3BlcnR5KCIkIiArIG5hbWUsIHRoYXQuZ2V0SW5kZXgoKSwgdGhhdC5maWxlSW5mbygpKS5ldmFsKGNvbnRleHQsIHRydWUpOw0KICAgICAgICAgICAgICAgIHJldHVybiAodiBpbnN0YW5jZW9mIFF1b3RlZCkgPyB2LnZhbHVlIDogdi50b0NTUygpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGl0ZXJhdGl2ZVJlcGxhY2UodmFsdWUsIHJlZ2V4cCwgcmVwbGFjZW1lbnRGbmMpIHsNCiAgICAgICAgICAgICAgICB2YXIgZXZhbHVhdGVkVmFsdWUgPSB2YWx1ZTsNCiAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZXZhbHVhdGVkVmFsdWUudG9TdHJpbmcoKTsNCiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlZ2V4cCwgcmVwbGFjZW1lbnRGbmMpOw0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKHZhbHVlICE9PSBldmFsdWF0ZWRWYWx1ZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlZFZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFsdWUgPSBpdGVyYXRpdmVSZXBsYWNlKHZhbHVlLCB0aGlzLnZhcmlhYmxlUmVnZXgsIHZhcmlhYmxlUmVwbGFjZW1lbnQpOw0KICAgICAgICAgICAgdmFsdWUgPSBpdGVyYXRpdmVSZXBsYWNlKHZhbHVlLCB0aGlzLnByb3BSZWdleCwgcHJvcGVydHlSZXBsYWNlbWVudCk7DQogICAgICAgICAgICByZXR1cm4gbmV3IFF1b3RlZCh0aGlzLnF1b3RlICsgdmFsdWUgKyB0aGlzLnF1b3RlLCB2YWx1ZSwgdGhpcy5lc2NhcGVkLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSk7DQogICAgICAgIH0sDQogICAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uIChvdGhlcikgew0KICAgICAgICAgICAgLy8gd2hlbiBjb21wYXJpbmcgcXVvdGVkIHN0cmluZ3MgYWxsb3cgdGhlIHF1b3RlIHRvIGRpZmZlcg0KICAgICAgICAgICAgaWYgKG90aGVyLnR5cGUgPT09ICdRdW90ZWQnICYmICF0aGlzLmVzY2FwZWQgJiYgIW90aGVyLmVzY2FwZWQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZS5udW1lcmljQ29tcGFyZSh0aGlzLnZhbHVlLCBvdGhlci52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIudG9DU1MgJiYgdGhpcy50b0NTUygpID09PSBvdGhlci50b0NTUygpID8gMCA6IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIGVzY2FwZVBhdGgocGF0aCkgew0KICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9bXChcKSciXHNdL2csIGZ1bmN0aW9uIChtYXRjaCkgeyByZXR1cm4gIlxcIiArIG1hdGNoOyB9KTsNCiAgICB9DQogICAgdmFyIFVSTCA9IGZ1bmN0aW9uICh2YWwsIGluZGV4LCBjdXJyZW50RmlsZUluZm8sIGlzRXZhbGQpIHsNCiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbDsNCiAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsNCiAgICAgICAgdGhpcy5fZmlsZUluZm8gPSBjdXJyZW50RmlsZUluZm87DQogICAgICAgIHRoaXMuaXNFdmFsZCA9IGlzRXZhbGQ7DQogICAgfTsNCiAgICBVUkwucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdVcmwnLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmlzaXRvci52aXNpdCh0aGlzLnZhbHVlKTsNCiAgICAgICAgfSwNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICBvdXRwdXQuYWRkKCd1cmwoJyk7DQogICAgICAgICAgICB0aGlzLnZhbHVlLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICAgICAgb3V0cHV0LmFkZCgnKScpOw0KICAgICAgICB9LA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWUuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgIHZhciByb290cGF0aDsNCiAgICAgICAgICAgIGlmICghdGhpcy5pc0V2YWxkKSB7DQogICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByb290cGF0aCBpZiB0aGUgVVJMIHJlcXVpcmVzIGEgcmV3cml0ZQ0KICAgICAgICAgICAgICAgIHJvb3RwYXRoID0gdGhpcy5maWxlSW5mbygpICYmIHRoaXMuZmlsZUluZm8oKS5yb290cGF0aDsNCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvb3RwYXRoID09PSAnc3RyaW5nJyAmJg0KICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsLnZhbHVlID09PSAnc3RyaW5nJyAmJg0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnBhdGhSZXF1aXJlc1Jld3JpdGUodmFsLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5xdW90ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcm9vdHBhdGggPSBlc2NhcGVQYXRoKHJvb3RwYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWwudmFsdWUgPSBjb250ZXh0LnJld3JpdGVQYXRoKHZhbC52YWx1ZSwgcm9vdHBhdGgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsLnZhbHVlID0gY29udGV4dC5ub3JtYWxpemVQYXRoKHZhbC52YWx1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIEFkZCB1cmwgYXJncyBpZiBlbmFibGVkDQogICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudXJsQXJncykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC52YWx1ZS5tYXRjaCgvXlxzKmRhdGE6LykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxpbWl0ZXIgPSB2YWwudmFsdWUuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxBcmdzID0gZGVsaW1pdGVyICsgY29udGV4dC51cmxBcmdzOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC52YWx1ZS5pbmRleE9mKCcjJykgIT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnZhbHVlID0gdmFsLnZhbHVlLnJlcGxhY2UoJyMnLCB1cmxBcmdzICsgIiMiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC52YWx1ZSArPSB1cmxBcmdzOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodmFsLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSwgdHJ1ZSk7DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgTWVkaWEgPSBmdW5jdGlvbiAodmFsdWUsIGZlYXR1cmVzLCBpbmRleCwgY3VycmVudEZpbGVJbmZvLCB2aXNpYmlsaXR5SW5mbykgew0KICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4Ow0KICAgICAgICB0aGlzLl9maWxlSW5mbyA9IGN1cnJlbnRGaWxlSW5mbzsNCiAgICAgICAgdmFyIHNlbGVjdG9ycyA9IChuZXcgU2VsZWN0b3IoW10sIG51bGwsIG51bGwsIHRoaXMuX2luZGV4LCB0aGlzLl9maWxlSW5mbykpLmNyZWF0ZUVtcHR5U2VsZWN0b3JzKCk7DQogICAgICAgIHRoaXMuZmVhdHVyZXMgPSBuZXcgVmFsdWUoZmVhdHVyZXMpOw0KICAgICAgICB0aGlzLnJ1bGVzID0gW25ldyBSdWxlc2V0KHNlbGVjdG9ycywgdmFsdWUpXTsNCiAgICAgICAgdGhpcy5ydWxlc1swXS5hbGxvd0ltcG9ydHMgPSB0cnVlOw0KICAgICAgICB0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyh2aXNpYmlsaXR5SW5mbyk7DQogICAgICAgIHRoaXMuYWxsb3dSb290ID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQoc2VsZWN0b3JzLCB0aGlzKTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy5mZWF0dXJlcywgdGhpcyk7DQogICAgICAgIHRoaXMuc2V0UGFyZW50KHRoaXMucnVsZXMsIHRoaXMpOw0KICAgIH07DQogICAgTWVkaWEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgQXRSdWxlKCksIHsNCiAgICAgICAgdHlwZTogJ01lZGlhJywNCiAgICAgICAgaXNSdWxlc2V0TGlrZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0sDQogICAgICAgIGFjY2VwdDogZnVuY3Rpb24gKHZpc2l0b3IpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmZlYXR1cmVzKSB7DQogICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcyA9IHZpc2l0b3IudmlzaXQodGhpcy5mZWF0dXJlcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5ydWxlcykgew0KICAgICAgICAgICAgICAgIHRoaXMucnVsZXMgPSB2aXNpdG9yLnZpc2l0QXJyYXkodGhpcy5ydWxlcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGdlbkNTUzogZnVuY3Rpb24gKGNvbnRleHQsIG91dHB1dCkgew0KICAgICAgICAgICAgb3V0cHV0LmFkZCgnQG1lZGlhICcsIHRoaXMuX2ZpbGVJbmZvLCB0aGlzLl9pbmRleCk7DQogICAgICAgICAgICB0aGlzLmZlYXR1cmVzLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICAgICAgdGhpcy5vdXRwdXRSdWxlc2V0KGNvbnRleHQsIG91dHB1dCwgdGhpcy5ydWxlcyk7DQogICAgICAgIH0sDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICBpZiAoIWNvbnRleHQubWVkaWFCbG9ja3MpIHsNCiAgICAgICAgICAgICAgICBjb250ZXh0Lm1lZGlhQmxvY2tzID0gW107DQogICAgICAgICAgICAgICAgY29udGV4dC5tZWRpYVBhdGggPSBbXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtZWRpYSA9IG5ldyBNZWRpYShudWxsLCBbXSwgdGhpcy5faW5kZXgsIHRoaXMuX2ZpbGVJbmZvLCB0aGlzLnZpc2liaWxpdHlJbmZvKCkpOw0KICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdJbmZvKSB7DQogICAgICAgICAgICAgICAgdGhpcy5ydWxlc1swXS5kZWJ1Z0luZm8gPSB0aGlzLmRlYnVnSW5mbzsNCiAgICAgICAgICAgICAgICBtZWRpYS5kZWJ1Z0luZm8gPSB0aGlzLmRlYnVnSW5mbzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG1lZGlhLmZlYXR1cmVzID0gdGhpcy5mZWF0dXJlcy5ldmFsKGNvbnRleHQpOw0KICAgICAgICAgICAgY29udGV4dC5tZWRpYVBhdGgucHVzaChtZWRpYSk7DQogICAgICAgICAgICBjb250ZXh0Lm1lZGlhQmxvY2tzLnB1c2gobWVkaWEpOw0KICAgICAgICAgICAgdGhpcy5ydWxlc1swXS5mdW5jdGlvblJlZ2lzdHJ5ID0gY29udGV4dC5mcmFtZXNbMF0uZnVuY3Rpb25SZWdpc3RyeS5pbmhlcml0KCk7DQogICAgICAgICAgICBjb250ZXh0LmZyYW1lcy51bnNoaWZ0KHRoaXMucnVsZXNbMF0pOw0KICAgICAgICAgICAgbWVkaWEucnVsZXMgPSBbdGhpcy5ydWxlc1swXS5ldmFsKGNvbnRleHQpXTsNCiAgICAgICAgICAgIGNvbnRleHQuZnJhbWVzLnNoaWZ0KCk7DQogICAgICAgICAgICBjb250ZXh0Lm1lZGlhUGF0aC5wb3AoKTsNCiAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm1lZGlhUGF0aC5sZW5ndGggPT09IDAgPyBtZWRpYS5ldmFsVG9wKGNvbnRleHQpIDoNCiAgICAgICAgICAgICAgICBtZWRpYS5ldmFsTmVzdGVkKGNvbnRleHQpOw0KICAgICAgICB9LA0KICAgICAgICBldmFsVG9wOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7DQogICAgICAgICAgICAvLyBSZW5kZXIgYWxsIGRlcGVuZGVudCBNZWRpYSBibG9ja3MuDQogICAgICAgICAgICBpZiAoY29udGV4dC5tZWRpYUJsb2Nrcy5sZW5ndGggPiAxKSB7DQogICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IChuZXcgU2VsZWN0b3IoW10sIG51bGwsIG51bGwsIHRoaXMuZ2V0SW5kZXgoKSwgdGhpcy5maWxlSW5mbygpKSkuY3JlYXRlRW1wdHlTZWxlY3RvcnMoKTsNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUnVsZXNldChzZWxlY3RvcnMsIGNvbnRleHQubWVkaWFCbG9ja3MpOw0KICAgICAgICAgICAgICAgIHJlc3VsdC5tdWx0aU1lZGlhID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICByZXN1bHQuY29weVZpc2liaWxpdHlJbmZvKHRoaXMudmlzaWJpbGl0eUluZm8oKSk7DQogICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnQocmVzdWx0LCB0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0Lm1lZGlhQmxvY2tzOw0KICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQubWVkaWFQYXRoOw0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbE5lc3RlZDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciBpOw0KICAgICAgICAgICAgdmFyIHZhbHVlOw0KICAgICAgICAgICAgdmFyIHBhdGggPSBjb250ZXh0Lm1lZGlhUGF0aC5jb25jYXQoW3RoaXNdKTsNCiAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIG1lZGlhLXF1ZXJ5IGNvbmRpdGlvbnMgc2VwYXJhdGVkIHdpdGggYCxgIChPUikuDQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhbHVlID0gcGF0aFtpXS5mZWF0dXJlcyBpbnN0YW5jZW9mIFZhbHVlID8NCiAgICAgICAgICAgICAgICAgICAgcGF0aFtpXS5mZWF0dXJlcy52YWx1ZSA6IHBhdGhbaV0uZmVhdHVyZXM7DQogICAgICAgICAgICAgICAgcGF0aFtpXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gVHJhY2UgYWxsIHBlcm11dGF0aW9ucyB0byBnZW5lcmF0ZSB0aGUgcmVzdWx0aW5nIG1lZGlhLXF1ZXJ5Lg0KICAgICAgICAgICAgLy8NCiAgICAgICAgICAgIC8vIChhLCBiIGFuZCBjKSB3aXRoIG5lc3RlZCAoZCwgZSkgLT4NCiAgICAgICAgICAgIC8vICAgIGEgYW5kIGQNCiAgICAgICAgICAgIC8vICAgIGEgYW5kIGUNCiAgICAgICAgICAgIC8vICAgIGIgYW5kIGMgYW5kIGQNCiAgICAgICAgICAgIC8vICAgIGIgYW5kIGMgYW5kIGUNCiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMgPSBuZXcgVmFsdWUodGhpcy5wZXJtdXRlKHBhdGgpLm1hcChmdW5jdGlvbiAocGF0aCkgew0KICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLm1hcChmdW5jdGlvbiAoZnJhZ21lbnQpIHsgcmV0dXJuIGZyYWdtZW50LnRvQ1NTID8gZnJhZ21lbnQgOiBuZXcgQW5vbnltb3VzKGZyYWdtZW50KTsgfSk7DQogICAgICAgICAgICAgICAgZm9yIChpID0gcGF0aC5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7DQogICAgICAgICAgICAgICAgICAgIHBhdGguc3BsaWNlKGksIDAsIG5ldyBBbm9ueW1vdXMoJ2FuZCcpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKHBhdGgpOw0KICAgICAgICAgICAgfSkpOw0KICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy5mZWF0dXJlcywgdGhpcyk7DQogICAgICAgICAgICAvLyBGYWtlIGEgdHJlZS1ub2RlIHRoYXQgZG9lc24ndCBvdXRwdXQgYW55dGhpbmcuDQogICAgICAgICAgICByZXR1cm4gbmV3IFJ1bGVzZXQoW10sIFtdKTsNCiAgICAgICAgfSwNCiAgICAgICAgcGVybXV0ZTogZnVuY3Rpb24gKGFycikgew0KICAgICAgICAgICAgaWYgKGFyci5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChhcnIubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGFyclswXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsNCiAgICAgICAgICAgICAgICB2YXIgcmVzdCA9IHRoaXMucGVybXV0ZShhcnIuc2xpY2UoMSkpOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFyclswXS5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goW2FyclswXVtqXV0uY29uY2F0KHJlc3RbaV0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBidWJibGVTZWxlY3RvcnM6IGZ1bmN0aW9uIChzZWxlY3RvcnMpIHsNCiAgICAgICAgICAgIGlmICghc2VsZWN0b3JzKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5ydWxlcyA9IFtuZXcgUnVsZXNldChjb3B5QXJyYXkoc2VsZWN0b3JzKSwgW3RoaXMucnVsZXNbMF1dKV07DQogICAgICAgICAgICB0aGlzLnNldFBhcmVudCh0aGlzLnJ1bGVzLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIC8vDQogICAgLy8gQ1NTIEBpbXBvcnQgbm9kZQ0KICAgIC8vDQogICAgLy8gVGhlIGdlbmVyYWwgc3RyYXRlZ3kgaGVyZSBpcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gd2FpdA0KICAgIC8vIGZvciB0aGUgcGFyc2luZyB0byBiZSBjb21wbGV0ZWQsIGJlZm9yZSB3ZSBzdGFydCBpbXBvcnRpbmcNCiAgICAvLyB0aGUgZmlsZS4gVGhhdCdzIGJlY2F1c2UgaW4gdGhlIGNvbnRleHQgb2YgYSBicm93c2VyLA0KICAgIC8vIG1vc3Qgb2YgdGhlIHRpbWUgd2lsbCBiZSBzcGVudCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIHJlc3BvbmQuDQogICAgLy8NCiAgICAvLyBPbiBjcmVhdGlvbiwgd2UgcHVzaCB0aGUgaW1wb3J0IHBhdGggdG8gb3VyIGltcG9ydCBxdWV1ZSwgdGhvdWdoDQogICAgLy8gYGltcG9ydCxwdXNoYCwgd2UgYWxzbyBwYXNzIGl0IGEgY2FsbGJhY2ssIHdoaWNoIGl0J2xsIGNhbGwgb25jZQ0KICAgIC8vIHRoZSBmaWxlIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBwYXJzZWQuDQogICAgLy8NCiAgICB2YXIgSW1wb3J0ID0gZnVuY3Rpb24gKHBhdGgsIGZlYXR1cmVzLCBvcHRpb25zLCBpbmRleCwgY3VycmVudEZpbGVJbmZvLCB2aXNpYmlsaXR5SW5mbykgew0KICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOw0KICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4Ow0KICAgICAgICB0aGlzLl9maWxlSW5mbyA9IGN1cnJlbnRGaWxlSW5mbzsNCiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsNCiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOw0KICAgICAgICB0aGlzLmFsbG93Um9vdCA9IHRydWU7DQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVzcyAhPT0gdW5kZWZpbmVkIHx8IHRoaXMub3B0aW9ucy5pbmxpbmUpIHsNCiAgICAgICAgICAgIHRoaXMuY3NzID0gIXRoaXMub3B0aW9ucy5sZXNzIHx8IHRoaXMub3B0aW9ucy5pbmxpbmU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgcGF0aFZhbHVlID0gdGhpcy5nZXRQYXRoKCk7DQogICAgICAgICAgICBpZiAocGF0aFZhbHVlICYmIC9bI1wuXCZcP11jc3MoW1w/O10uKik/JC8udGVzdChwYXRoVmFsdWUpKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jc3MgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuY29weVZpc2liaWxpdHlJbmZvKHZpc2liaWxpdHlJbmZvKTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy5mZWF0dXJlcywgdGhpcyk7DQogICAgICAgIHRoaXMuc2V0UGFyZW50KHRoaXMucGF0aCwgdGhpcyk7DQogICAgfTsNCiAgICBJbXBvcnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdJbXBvcnQnLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICBpZiAodGhpcy5mZWF0dXJlcykgew0KICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMgPSB2aXNpdG9yLnZpc2l0KHRoaXMuZmVhdHVyZXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5wYXRoID0gdmlzaXRvci52aXNpdCh0aGlzLnBhdGgpOw0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXNQbHVnaW4gJiYgIXRoaXMub3B0aW9ucy5pbmxpbmUgJiYgdGhpcy5yb290KSB7DQogICAgICAgICAgICAgICAgdGhpcy5yb290ID0gdmlzaXRvci52aXNpdCh0aGlzLnJvb3QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBnZW5DU1M6IGZ1bmN0aW9uIChjb250ZXh0LCBvdXRwdXQpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmNzcyAmJiB0aGlzLnBhdGguX2ZpbGVJbmZvLnJlZmVyZW5jZSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgb3V0cHV0LmFkZCgnQGltcG9ydCAnLCB0aGlzLl9maWxlSW5mbywgdGhpcy5faW5kZXgpOw0KICAgICAgICAgICAgICAgIHRoaXMucGF0aC5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5mZWF0dXJlcykgew0KICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKCcgJyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMuZ2VuQ1NTKGNvbnRleHQsIG91dHB1dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQoJzsnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLnBhdGggaW5zdGFuY2VvZiBVUkwpID8NCiAgICAgICAgICAgICAgICB0aGlzLnBhdGgudmFsdWUudmFsdWUgOiB0aGlzLnBhdGgudmFsdWU7DQogICAgICAgIH0sDQogICAgICAgIGlzVmFyaWFibGVJbXBvcnQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy5wYXRoOw0KICAgICAgICAgICAgaWYgKHBhdGggaW5zdGFuY2VvZiBVUkwpIHsNCiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwYXRoIGluc3RhbmNlb2YgUXVvdGVkKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguY29udGFpbnNWYXJpYWJsZXMoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9LA0KICAgICAgICBldmFsRm9ySW1wb3J0OiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLnBhdGg7DQogICAgICAgICAgICBpZiAocGF0aCBpbnN0YW5jZW9mIFVSTCkgew0KICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBvcnQocGF0aC5ldmFsKGNvbnRleHQpLCB0aGlzLmZlYXR1cmVzLCB0aGlzLm9wdGlvbnMsIHRoaXMuX2luZGV4LCB0aGlzLl9maWxlSW5mbywgdGhpcy52aXNpYmlsaXR5SW5mbygpKTsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbFBhdGg6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMucGF0aC5ldmFsKGNvbnRleHQpOw0KICAgICAgICAgICAgdmFyIGZpbGVJbmZvID0gdGhpcy5fZmlsZUluZm87DQogICAgICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgVVJMKSkgew0KICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcm9vdHBhdGggaWYgdGhlIFVSTCByZXF1aXJlcyBhIHJld3JpdGUNCiAgICAgICAgICAgICAgICB2YXIgcGF0aFZhbHVlID0gcGF0aC52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZUluZm8gJiYNCiAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlICYmDQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucGF0aFJlcXVpcmVzUmV3cml0ZShwYXRoVmFsdWUpKSB7DQogICAgICAgICAgICAgICAgICAgIHBhdGgudmFsdWUgPSBjb250ZXh0LnJld3JpdGVQYXRoKHBhdGhWYWx1ZSwgZmlsZUluZm8ucm9vdHBhdGgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcGF0aC52YWx1ZSA9IGNvbnRleHQubm9ybWFsaXplUGF0aChwYXRoLnZhbHVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcGF0aDsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmRvRXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVmZXJlbmNlIHx8IHRoaXMuYmxvY2tzVmlzaWJpbGl0eSgpKSB7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggfHwgcmVzdWx0Lmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRWaXNpYmlsaXR5QmxvY2soKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkVmlzaWJpbGl0eUJsb2NrKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgfSwNCiAgICAgICAgZG9FdmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIHJ1bGVzZXQ7DQogICAgICAgICAgICB2YXIgcmVnaXN0cnk7DQogICAgICAgICAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLmZlYXR1cmVzICYmIHRoaXMuZmVhdHVyZXMuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXNQbHVnaW4pIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290ICYmIHRoaXMucm9vdC5ldmFsKSB7DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZS5tZXNzYWdlID0gJ1BsdWdpbiBlcnJvciBkdXJpbmcgZXZhbHVhdGlvbic7DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGVzc0Vycm9yKGUsIHRoaXMucm9vdC5pbXBvcnRzLCB0aGlzLnJvb3QuZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJlZ2lzdHJ5ID0gY29udGV4dC5mcmFtZXNbMF0gJiYgY29udGV4dC5mcmFtZXNbMF0uZnVuY3Rpb25SZWdpc3RyeTsNCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnkgJiYgdGhpcy5yb290ICYmIHRoaXMucm9vdC5mdW5jdGlvbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkuYWRkTXVsdGlwbGUodGhpcy5yb290LmZ1bmN0aW9ucyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBbXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLnNraXApIHsNCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2tpcCA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAgPSB0aGlzLnNraXAoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tpcCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbmxpbmUpIHsNCiAgICAgICAgICAgICAgICB2YXIgY29udGVudHMgPSBuZXcgQW5vbnltb3VzKHRoaXMucm9vdCwgMCwgew0KICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5pbXBvcnRlZEZpbGVuYW1lLA0KICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U6IHRoaXMucGF0aC5fZmlsZUluZm8gJiYgdGhpcy5wYXRoLl9maWxlSW5mby5yZWZlcmVuY2UNCiAgICAgICAgICAgICAgICB9LCB0cnVlLCB0cnVlKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlcyA/IG5ldyBNZWRpYShbY29udGVudHNdLCB0aGlzLmZlYXR1cmVzLnZhbHVlKSA6IFtjb250ZW50c107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNzcykgew0KICAgICAgICAgICAgICAgIHZhciBuZXdJbXBvcnQgPSBuZXcgSW1wb3J0KHRoaXMuZXZhbFBhdGgoY29udGV4dCksIGZlYXR1cmVzLCB0aGlzLm9wdGlvbnMsIHRoaXMuX2luZGV4KTsNCiAgICAgICAgICAgICAgICBpZiAoIW5ld0ltcG9ydC5jc3MgJiYgdGhpcy5lcnJvcikgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW1wb3J0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5yb290KSB7DQogICAgICAgICAgICAgICAgcnVsZXNldCA9IG5ldyBSdWxlc2V0KG51bGwsIGNvcHlBcnJheSh0aGlzLnJvb3QucnVsZXMpKTsNCiAgICAgICAgICAgICAgICBydWxlc2V0LmV2YWxJbXBvcnRzKGNvbnRleHQpOw0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVzID8gbmV3IE1lZGlhKHJ1bGVzZXQucnVsZXMsIHRoaXMuZmVhdHVyZXMudmFsdWUpIDogcnVsZXNldC5ydWxlczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBbXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBKc0V2YWxOb2RlID0gZnVuY3Rpb24gKCkgeyB9Ow0KICAgIEpzRXZhbE5vZGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIGV2YWx1YXRlSmF2YVNjcmlwdDogZnVuY3Rpb24gKGV4cHJlc3Npb24sIGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQ7DQogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7DQogICAgICAgICAgICB2YXIgZXZhbENvbnRleHQgPSB7fTsNCiAgICAgICAgICAgIGlmICghY29udGV4dC5qYXZhc2NyaXB0RW5hYmxlZCkgew0KICAgICAgICAgICAgICAgIHRocm93IHsgbWVzc2FnZTogJ0lubGluZSBKYXZhU2NyaXB0IGlzIG5vdCBlbmFibGVkLiBJcyBpdCBzZXQgaW4geW91ciBvcHRpb25zPycsDQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsDQogICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLmdldEluZGV4KCkgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoL0BceyhbXHctXSspXH0vZywgZnVuY3Rpb24gKF8sIG5hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5qc2lmeShuZXcgVmFyaWFibGUoIkAiICsgbmFtZSwgdGhhdC5nZXRJbmRleCgpLCB0aGF0LmZpbGVJbmZvKCkpLmV2YWwoY29udGV4dCkpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgRnVuY3Rpb24oInJldHVybiAoIiArIGV4cHJlc3Npb24gKyAiKSIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB7IG1lc3NhZ2U6ICJKYXZhU2NyaXB0IGV2YWx1YXRpb24gZXJyb3I6ICIgKyBlLm1lc3NhZ2UgKyAiIGZyb20gYCIgKyBleHByZXNzaW9uICsgImAiLA0KICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLA0KICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgdmFyaWFibGVzID0gY29udGV4dC5mcmFtZXNbMF0udmFyaWFibGVzKCk7DQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhcmlhYmxlcykgew0KICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZXMuaGFzT3duUHJvcGVydHkoaykpIHsNCiAgICAgICAgICAgICAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi8NCiAgICAgICAgICAgICAgICAgICAgZXZhbENvbnRleHRbay5zbGljZSgxKV0gPSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFyaWFibGVzW2tdLnZhbHVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9KUzogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmV2YWwoY29udGV4dCkudG9DU1MoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsbChldmFsQ29udGV4dCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgIHRocm93IHsgbWVzc2FnZTogIkphdmFTY3JpcHQgZXZhbHVhdGlvbiBlcnJvcjogJyIgKyBlLm5hbWUgKyAiOiAiICsgZS5tZXNzYWdlLnJlcGxhY2UoL1siXS9nLCAnXCcnKSArICInIiwNCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZ2V0SW5kZXgoKSB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgfSwNCiAgICAgICAganNpZnk6IGZ1bmN0aW9uIChvYmopIHsNCiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai52YWx1ZSkgJiYgKG9iai52YWx1ZS5sZW5ndGggPiAxKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiWyIgKyBvYmoudmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2LnRvQ1NTKCk7IH0pLmpvaW4oJywgJykgKyAiXSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnRvQ1NTKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgSmF2YVNjcmlwdCA9IGZ1bmN0aW9uIChzdHJpbmcsIGVzY2FwZWQsIGluZGV4LCBjdXJyZW50RmlsZUluZm8pIHsNCiAgICAgICAgdGhpcy5lc2NhcGVkID0gZXNjYXBlZDsNCiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gc3RyaW5nOw0KICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4Ow0KICAgICAgICB0aGlzLl9maWxlSW5mbyA9IGN1cnJlbnRGaWxlSW5mbzsNCiAgICB9Ow0KICAgIEphdmFTY3JpcHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgSnNFdmFsTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdKYXZhU2NyaXB0JywNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmV2YWx1YXRlSmF2YVNjcmlwdCh0aGlzLmV4cHJlc3Npb24sIGNvbnRleHQpOw0KICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgcmVzdWx0Ow0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInICYmICFpc05hTihyZXN1bHQpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24ocmVzdWx0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRdW90ZWQoIlwiIiArIHJlc3VsdCArICJcIiIsIHJlc3VsdCwgdGhpcy5lc2NhcGVkLCB0aGlzLl9pbmRleCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFub255bW91cyhyZXN1bHQuam9pbignLCAnKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFub255bW91cyhyZXN1bHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIEFzc2lnbm1lbnQgPSBmdW5jdGlvbiAoa2V5LCB2YWwpIHsNCiAgICAgICAgdGhpcy5rZXkgPSBrZXk7DQogICAgICAgIHRoaXMudmFsdWUgPSB2YWw7DQogICAgfTsNCiAgICBBc3NpZ25tZW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnQXNzaWdubWVudCcsDQogICAgICAgIGFjY2VwdDogZnVuY3Rpb24gKHZpc2l0b3IpIHsNCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2aXNpdG9yLnZpc2l0KHRoaXMudmFsdWUpOw0KICAgICAgICB9LA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUuZXZhbCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudCh0aGlzLmtleSwgdGhpcy52YWx1ZS5ldmFsKGNvbnRleHQpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9LA0KICAgICAgICBnZW5DU1M6IGZ1bmN0aW9uIChjb250ZXh0LCBvdXRwdXQpIHsNCiAgICAgICAgICAgIG91dHB1dC5hZGQodGhpcy5rZXkgKyAiPSIpOw0KICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUuZ2VuQ1NTKSB7DQogICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5nZW5DU1MoY29udGV4dCwgb3V0cHV0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIG91dHB1dC5hZGQodGhpcy52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgQ29uZGl0aW9uID0gZnVuY3Rpb24gKG9wLCBsLCByLCBpLCBuZWdhdGUpIHsNCiAgICAgICAgdGhpcy5vcCA9IG9wLnRyaW0oKTsNCiAgICAgICAgdGhpcy5sdmFsdWUgPSBsOw0KICAgICAgICB0aGlzLnJ2YWx1ZSA9IHI7DQogICAgICAgIHRoaXMuX2luZGV4ID0gaTsNCiAgICAgICAgdGhpcy5uZWdhdGUgPSBuZWdhdGU7DQogICAgfTsNCiAgICBDb25kaXRpb24ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdDb25kaXRpb24nLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICB0aGlzLmx2YWx1ZSA9IHZpc2l0b3IudmlzaXQodGhpcy5sdmFsdWUpOw0KICAgICAgICAgICAgdGhpcy5ydmFsdWUgPSB2aXNpdG9yLnZpc2l0KHRoaXMucnZhbHVlKTsNCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSAoZnVuY3Rpb24gKG9wLCBhLCBiKSB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdhbmQnOiByZXR1cm4gYSAmJiBiOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdvcic6IHJldHVybiBhIHx8IGI7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKE5vZGUuY29tcGFyZShhLCBiKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgLTE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcCA9PT0gJzwnIHx8IG9wID09PSAnPTwnIHx8IG9wID09PSAnPD0nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wID09PSAnPScgfHwgb3AgPT09ICc+PScgfHwgb3AgPT09ICc9PCcgfHwgb3AgPT09ICc8PSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AgPT09ICc+JyB8fCBvcCA9PT0gJz49JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkodGhpcy5vcCwgdGhpcy5sdmFsdWUuZXZhbChjb250ZXh0KSwgdGhpcy5ydmFsdWUuZXZhbChjb250ZXh0KSk7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGUgPyAhcmVzdWx0IDogcmVzdWx0Ow0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIFVuaWNvZGVEZXNjcmlwdG9yID0gZnVuY3Rpb24gKHZhbHVlKSB7DQogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCiAgICB9Ow0KICAgIFVuaWNvZGVEZXNjcmlwdG9yLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnVW5pY29kZURlc2NyaXB0b3InDQogICAgfSk7CgogICAgdmFyIE5lZ2F0aXZlID0gZnVuY3Rpb24gKG5vZGUpIHsNCiAgICAgICAgdGhpcy52YWx1ZSA9IG5vZGU7DQogICAgfTsNCiAgICBOZWdhdGl2ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBOb2RlKCksIHsNCiAgICAgICAgdHlwZTogJ05lZ2F0aXZlJywNCiAgICAgICAgZ2VuQ1NTOiBmdW5jdGlvbiAoY29udGV4dCwgb3V0cHV0KSB7DQogICAgICAgICAgICBvdXRwdXQuYWRkKCctJyk7DQogICAgICAgICAgICB0aGlzLnZhbHVlLmdlbkNTUyhjb250ZXh0LCBvdXRwdXQpOw0KICAgICAgICB9LA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNNYXRoT24oKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAobmV3IE9wZXJhdGlvbignKicsIFtuZXcgRGltZW5zaW9uKC0xKSwgdGhpcy52YWx1ZV0pKS5ldmFsKGNvbnRleHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBOZWdhdGl2ZSh0aGlzLnZhbHVlLmV2YWwoY29udGV4dCkpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIEV4dGVuZCA9IGZ1bmN0aW9uIChzZWxlY3Rvciwgb3B0aW9uLCBpbmRleCwgY3VycmVudEZpbGVJbmZvLCB2aXNpYmlsaXR5SW5mbykgew0KICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7DQogICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uOw0KICAgICAgICB0aGlzLm9iamVjdF9pZCA9IEV4dGVuZC5uZXh0X2lkKys7DQogICAgICAgIHRoaXMucGFyZW50X2lkcyA9IFt0aGlzLm9iamVjdF9pZF07DQogICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7DQogICAgICAgIHRoaXMuX2ZpbGVJbmZvID0gY3VycmVudEZpbGVJbmZvOw0KICAgICAgICB0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyh2aXNpYmlsaXR5SW5mbyk7DQogICAgICAgIHRoaXMuYWxsb3dSb290ID0gdHJ1ZTsNCiAgICAgICAgc3dpdGNoIChvcHRpb24pIHsNCiAgICAgICAgICAgIGNhc2UgJ2FsbCc6DQogICAgICAgICAgICAgICAgdGhpcy5hbGxvd0JlZm9yZSA9IHRydWU7DQogICAgICAgICAgICAgICAgdGhpcy5hbGxvd0FmdGVyID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgdGhpcy5hbGxvd0JlZm9yZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dBZnRlciA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2V0UGFyZW50KHRoaXMuc2VsZWN0b3IsIHRoaXMpOw0KICAgIH07DQogICAgRXh0ZW5kLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IE5vZGUoKSwgew0KICAgICAgICB0eXBlOiAnRXh0ZW5kJywNCiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiAodmlzaXRvcikgew0KICAgICAgICAgICAgdGhpcy5zZWxlY3RvciA9IHZpc2l0b3IudmlzaXQodGhpcy5zZWxlY3Rvcik7DQogICAgICAgIH0sDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuZCh0aGlzLnNlbGVjdG9yLmV2YWwoY29udGV4dCksIHRoaXMub3B0aW9uLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSwgdGhpcy52aXNpYmlsaXR5SW5mbygpKTsNCiAgICAgICAgfSwNCiAgICAgICAgY2xvbmU6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuZCh0aGlzLnNlbGVjdG9yLCB0aGlzLm9wdGlvbiwgdGhpcy5nZXRJbmRleCgpLCB0aGlzLmZpbGVJbmZvKCksIHRoaXMudmlzaWJpbGl0eUluZm8oKSk7DQogICAgICAgIH0sDQogICAgICAgIC8vIGl0IGNvbmNhdGVuYXRlcyAoam9pbnMpIGFsbCBzZWxlY3RvcnMgaW4gc2VsZWN0b3IgYXJyYXkNCiAgICAgICAgZmluZFNlbGZTZWxlY3RvcnM6IGZ1bmN0aW9uIChzZWxlY3RvcnMpIHsNCiAgICAgICAgICAgIHZhciBzZWxmRWxlbWVudHMgPSBbXSwgaSwgc2VsZWN0b3JFbGVtZW50czsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzZWxlY3RvckVsZW1lbnRzID0gc2VsZWN0b3JzW2ldLmVsZW1lbnRzOw0KICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSB0aGUgbG9naWMgaW4gZ2VuQ1NTIGZ1bmN0aW9uIGluc2lkZSB0aGUgc2VsZWN0b3Igbm9kZS4NCiAgICAgICAgICAgICAgICAvLyBmdXR1cmUgVE9ETyAtIG1vdmUgYm90aCBsb2dpY3MgaW50byB0aGUgc2VsZWN0b3Igam9pbmVyIHZpc2l0b3INCiAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgc2VsZWN0b3JFbGVtZW50cy5sZW5ndGggJiYgc2VsZWN0b3JFbGVtZW50c1swXS5jb21iaW5hdG9yLnZhbHVlID09PSAnJykgew0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckVsZW1lbnRzWzBdLmNvbWJpbmF0b3IudmFsdWUgPSAnICc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHNlbGZFbGVtZW50cyA9IHNlbGZFbGVtZW50cy5jb25jYXQoc2VsZWN0b3JzW2ldLmVsZW1lbnRzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuc2VsZlNlbGVjdG9ycyA9IFtuZXcgU2VsZWN0b3Ioc2VsZkVsZW1lbnRzKV07DQogICAgICAgICAgICB0aGlzLnNlbGZTZWxlY3RvcnNbMF0uY29weVZpc2liaWxpdHlJbmZvKHRoaXMudmlzaWJpbGl0eUluZm8oKSk7DQogICAgICAgIH0NCiAgICB9KTsNCiAgICBFeHRlbmQubmV4dF9pZCA9IDA7CgogICAgdmFyIFZhcmlhYmxlQ2FsbCA9IGZ1bmN0aW9uICh2YXJpYWJsZSwgaW5kZXgsIGN1cnJlbnRGaWxlSW5mbykgew0KICAgICAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7DQogICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7DQogICAgICAgIHRoaXMuX2ZpbGVJbmZvID0gY3VycmVudEZpbGVJbmZvOw0KICAgICAgICB0aGlzLmFsbG93Um9vdCA9IHRydWU7DQogICAgfTsNCiAgICBWYXJpYWJsZUNhbGwucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdWYXJpYWJsZUNhbGwnLA0KICAgICAgICBldmFsOiBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIHJ1bGVzOw0KICAgICAgICAgICAgdmFyIGRldGFjaGVkUnVsZXNldCA9IG5ldyBWYXJpYWJsZSh0aGlzLnZhcmlhYmxlLCB0aGlzLmdldEluZGV4KCksIHRoaXMuZmlsZUluZm8oKSkuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBMZXNzRXJyb3IoeyBtZXNzYWdlOiAiQ291bGQgbm90IGV2YWx1YXRlIHZhcmlhYmxlIGNhbGwgIiArIHRoaXMudmFyaWFibGUgfSk7DQogICAgICAgICAgICBpZiAoIWRldGFjaGVkUnVsZXNldC5ydWxlc2V0KSB7DQogICAgICAgICAgICAgICAgaWYgKGRldGFjaGVkUnVsZXNldC5ydWxlcykgew0KICAgICAgICAgICAgICAgICAgICBydWxlcyA9IGRldGFjaGVkUnVsZXNldDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXRhY2hlZFJ1bGVzZXQpKSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGVzID0gbmV3IFJ1bGVzZXQoJycsIGRldGFjaGVkUnVsZXNldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGV0YWNoZWRSdWxlc2V0LnZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICBydWxlcyA9IG5ldyBSdWxlc2V0KCcnLCBkZXRhY2hlZFJ1bGVzZXQudmFsdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRldGFjaGVkUnVsZXNldCA9IG5ldyBEZXRhY2hlZFJ1bGVzZXQocnVsZXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGRldGFjaGVkUnVsZXNldC5ydWxlc2V0KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRldGFjaGVkUnVsZXNldC5jYWxsRXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRocm93IGVycm9yOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIE5hbWVzcGFjZVZhbHVlID0gZnVuY3Rpb24gKHJ1bGVDYWxsLCBsb29rdXBzLCBpbmRleCwgZmlsZUluZm8pIHsNCiAgICAgICAgdGhpcy52YWx1ZSA9IHJ1bGVDYWxsOw0KICAgICAgICB0aGlzLmxvb2t1cHMgPSBsb29rdXBzOw0KICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4Ow0KICAgICAgICB0aGlzLl9maWxlSW5mbyA9IGZpbGVJbmZvOw0KICAgIH07DQogICAgTmFtZXNwYWNlVmFsdWUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdOYW1lc3BhY2VWYWx1ZScsDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICB2YXIgaSwgbmFtZSwgcnVsZXMgPSB0aGlzLnZhbHVlLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sb29rdXBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMubG9va3Vwc1tpXTsNCiAgICAgICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAgICAgKiBFdmFsJ2QgRFJzIHJldHVybiBydWxlc2V0cy4NCiAgICAgICAgICAgICAgICAgKiBFdmFsJ2QgbWl4aW5zIHJldHVybiBydWxlcywgc28gbGV0J3MgbWFrZSBhIHJ1bGVzZXQgaWYgd2UgbmVlZCBpdC4NCiAgICAgICAgICAgICAgICAgKiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvZiBsYXRlIHBhcnNpbmcgb2YgdmFsdWVzDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocnVsZXMpKSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGVzID0gbmV3IFJ1bGVzZXQoW25ldyBTZWxlY3RvcigpXSwgcnVsZXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJycpIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5sYXN0RGVjbGFyYXRpb24oKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICdAJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMSkgPT09ICdAJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJAIiArIG5ldyBWYXJpYWJsZShuYW1lLnN1YnN0cigxKSkuZXZhbChjb250ZXh0KS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMudmFyaWFibGVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBydWxlcyA9IHJ1bGVzLnZhcmlhYmxlKG5hbWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICghcnVsZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHsgdHlwZTogJ05hbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJ2YXJpYWJsZSAiICsgbmFtZSArICIgbm90IGZvdW5kIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLmdldEluZGV4KCkgfTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3Vic3RyaW5nKDAsIDIpID09PSAnJEAnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiQiICsgbmV3IFZhcmlhYmxlKG5hbWUuc3Vic3RyKDEpKS5ldmFsKGNvbnRleHQpLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuY2hhckF0KDApID09PSAnJCcgPyBuYW1lIDogIiQiICsgbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMucHJvcGVydGllcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5wcm9wZXJ0eShuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bGVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdOYW1lJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAicHJvcGVydHkgXCIiICsgbmFtZS5zdWJzdHIoMSkgKyAiXCIgbm90IGZvdW5kIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLmdldEluZGV4KCkgfTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzIGFyZSBhbiBhcnJheSBvZiB2YWx1ZXMsIHNpbmNlIGEgcnVsZXNldCBjYW4gaGF2ZSBtdWx0aXBsZSBwcm9wcy4NCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgcGljayB0aGUgbGFzdCBvbmUgKHRoZSAiY2FzY2FkZWQiIHZhbHVlKQ0KICAgICAgICAgICAgICAgICAgICBydWxlcyA9IHJ1bGVzW3J1bGVzLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAocnVsZXMudmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5ldmFsKGNvbnRleHQpLnZhbHVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAocnVsZXMucnVsZXNldCkgew0KICAgICAgICAgICAgICAgICAgICBydWxlcyA9IHJ1bGVzLnJ1bGVzZXQuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcnVsZXM7DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgRGVmaW5pdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCBwYXJhbXMsIHJ1bGVzLCBjb25kaXRpb24sIHZhcmlhZGljLCBmcmFtZXMsIHZpc2liaWxpdHlJbmZvKSB7DQogICAgICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgJ2Fub255bW91cyBtaXhpbic7DQogICAgICAgIHRoaXMuc2VsZWN0b3JzID0gW25ldyBTZWxlY3RvcihbbmV3IEVsZW1lbnQobnVsbCwgbmFtZSwgZmFsc2UsIHRoaXMuX2luZGV4LCB0aGlzLl9maWxlSW5mbyldKV07DQogICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOw0KICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsNCiAgICAgICAgdGhpcy52YXJpYWRpYyA9IHZhcmlhZGljOw0KICAgICAgICB0aGlzLmFyaXR5ID0gcGFyYW1zLmxlbmd0aDsNCiAgICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzOw0KICAgICAgICB0aGlzLl9sb29rdXBzID0ge307DQogICAgICAgIHZhciBvcHRpb25hbFBhcmFtZXRlcnMgPSBbXTsNCiAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHBhcmFtcy5yZWR1Y2UoZnVuY3Rpb24gKGNvdW50LCBwKSB7DQogICAgICAgICAgICBpZiAoIXAubmFtZSB8fCAocC5uYW1lICYmICFwLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBjb3VudCArIDE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBvcHRpb25hbFBhcmFtZXRlcnMucHVzaChwLm5hbWUpOw0KICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgMCk7DQogICAgICAgIHRoaXMub3B0aW9uYWxQYXJhbWV0ZXJzID0gb3B0aW9uYWxQYXJhbWV0ZXJzOw0KICAgICAgICB0aGlzLmZyYW1lcyA9IGZyYW1lczsNCiAgICAgICAgdGhpcy5jb3B5VmlzaWJpbGl0eUluZm8odmlzaWJpbGl0eUluZm8pOw0KICAgICAgICB0aGlzLmFsbG93Um9vdCA9IHRydWU7DQogICAgfTsNCiAgICBEZWZpbml0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IFJ1bGVzZXQoKSwgew0KICAgICAgICB0eXBlOiAnTWl4aW5EZWZpbml0aW9uJywNCiAgICAgICAgZXZhbEZpcnN0OiB0cnVlLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSB2aXNpdG9yLnZpc2l0QXJyYXkodGhpcy5wYXJhbXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5ydWxlcyA9IHZpc2l0b3IudmlzaXRBcnJheSh0aGlzLnJ1bGVzKTsNCiAgICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbikgew0KICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uID0gdmlzaXRvci52aXNpdCh0aGlzLmNvbmRpdGlvbik7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGV2YWxQYXJhbXM6IGZ1bmN0aW9uIChjb250ZXh0LCBtaXhpbkVudiwgYXJncywgZXZhbGRBcmd1bWVudHMpIHsNCiAgICAgICAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi8NCiAgICAgICAgICAgIHZhciBmcmFtZSA9IG5ldyBSdWxlc2V0KG51bGwsIG51bGwpOw0KICAgICAgICAgICAgdmFyIHZhcmFyZ3M7DQogICAgICAgICAgICB2YXIgYXJnOw0KICAgICAgICAgICAgdmFyIHBhcmFtcyA9IGNvcHlBcnJheSh0aGlzLnBhcmFtcyk7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIHZhciBqOw0KICAgICAgICAgICAgdmFyIHZhbDsNCiAgICAgICAgICAgIHZhciBuYW1lOw0KICAgICAgICAgICAgdmFyIGlzTmFtZWRGb3VuZDsNCiAgICAgICAgICAgIHZhciBhcmdJbmRleDsNCiAgICAgICAgICAgIHZhciBhcmdzTGVuZ3RoID0gMDsNCiAgICAgICAgICAgIGlmIChtaXhpbkVudi5mcmFtZXMgJiYgbWl4aW5FbnYuZnJhbWVzWzBdICYmIG1peGluRW52LmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5KSB7DQogICAgICAgICAgICAgICAgZnJhbWUuZnVuY3Rpb25SZWdpc3RyeSA9IG1peGluRW52LmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmluaGVyaXQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG1peGluRW52ID0gbmV3IGNvbnRleHRzLkV2YWwobWl4aW5FbnYsIFtmcmFtZV0uY29uY2F0KG1peGluRW52LmZyYW1lcykpOw0KICAgICAgICAgICAgaWYgKGFyZ3MpIHsNCiAgICAgICAgICAgICAgICBhcmdzID0gY29weUFycmF5KGFyZ3MpOw0KICAgICAgICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnc0xlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3NbaV07DQogICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID0gKGFyZyAmJiBhcmcubmFtZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmFtZWRGb3VuZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXZhbGRBcmd1bWVudHNbal0gJiYgbmFtZSA9PT0gcGFyYW1zW2pdLm5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbGRBcmd1bWVudHNbal0gPSBhcmcudmFsdWUuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucHJlcGVuZFJ1bGUobmV3IERlY2xhcmF0aW9uKG5hbWUsIGFyZy52YWx1ZS5ldmFsKGNvbnRleHQpKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTmFtZWRGb3VuZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hbWVkRm91bmQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNwbGljZShpLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdSdW50aW1lJywgbWVzc2FnZTogIk5hbWVkIGFyZ3VtZW50IGZvciAiICsgdGhpcy5uYW1lICsgIiAiICsgYXJnc1tpXS5uYW1lICsgIiBub3QgZm91bmQiIH07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhcmdJbmRleCA9IDA7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKGV2YWxkQXJndW1lbnRzW2ldKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBhcmcgPSBhcmdzICYmIGFyZ3NbYXJnSW5kZXhdOw0KICAgICAgICAgICAgICAgIGlmIChuYW1lID0gcGFyYW1zW2ldLm5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1tpXS52YXJpYWRpYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyYXJncyA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYXJnSW5kZXg7IGogPCBhcmdzTGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJhcmdzLnB1c2goYXJnc1tqXS52YWx1ZS5ldmFsKGNvbnRleHQpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnByZXBlbmRSdWxlKG5ldyBEZWNsYXJhdGlvbihuYW1lLCBuZXcgRXhwcmVzc2lvbih2YXJhcmdzKS5ldmFsKGNvbnRleHQpKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcmcgJiYgYXJnLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2FzIGEgbWl4aW4gY2FsbCwgcGFzcyBpbiBhIGRldGFjaGVkIHJ1bGVzZXQgb2YgaXQncyBldmFsJ2QgcnVsZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IG5ldyBEZXRhY2hlZFJ1bGVzZXQobmV3IFJ1bGVzZXQoJycsIHZhbCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1zW2ldLnZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcGFyYW1zW2ldLnZhbHVlLmV2YWwobWl4aW5FbnYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnJlc2V0Q2FjaGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHsgdHlwZTogJ1J1bnRpbWUnLCBtZXNzYWdlOiAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgIiArIHRoaXMubmFtZSArICIgKCIgKyBhcmdzTGVuZ3RoICsgIiBmb3IgIiArIHRoaXMuYXJpdHkgKyAiKSIgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnByZXBlbmRSdWxlKG5ldyBEZWNsYXJhdGlvbihuYW1lLCB2YWwpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWxkQXJndW1lbnRzW2ldID0gdmFsOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbaV0udmFyaWFkaWMgJiYgYXJncykgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBhcmdJbmRleDsgaiA8IGFyZ3NMZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXZhbGRBcmd1bWVudHNbal0gPSBhcmdzW2pdLnZhbHVlLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYXJnSW5kZXgrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmcmFtZTsNCiAgICAgICAgfSwNCiAgICAgICAgbWFrZUltcG9ydGFudDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHJ1bGVzID0gIXRoaXMucnVsZXMgPyB0aGlzLnJ1bGVzIDogdGhpcy5ydWxlcy5tYXAoZnVuY3Rpb24gKHIpIHsNCiAgICAgICAgICAgICAgICBpZiAoci5tYWtlSW1wb3J0YW50KSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByLm1ha2VJbXBvcnRhbnQodHJ1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgRGVmaW5pdGlvbih0aGlzLm5hbWUsIHRoaXMucGFyYW1zLCBydWxlcywgdGhpcy5jb25kaXRpb24sIHRoaXMudmFyaWFkaWMsIHRoaXMuZnJhbWVzKTsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0sDQogICAgICAgIGV2YWw6IGZ1bmN0aW9uIChjb250ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERlZmluaXRpb24odGhpcy5uYW1lLCB0aGlzLnBhcmFtcywgdGhpcy5ydWxlcywgdGhpcy5jb25kaXRpb24sIHRoaXMudmFyaWFkaWMsIHRoaXMuZnJhbWVzIHx8IGNvcHlBcnJheShjb250ZXh0LmZyYW1lcykpOw0KICAgICAgICB9LA0KICAgICAgICBldmFsQ2FsbDogZnVuY3Rpb24gKGNvbnRleHQsIGFyZ3MsIGltcG9ydGFudCkgew0KICAgICAgICAgICAgdmFyIF9hcmd1bWVudHMgPSBbXTsNCiAgICAgICAgICAgIHZhciBtaXhpbkZyYW1lcyA9IHRoaXMuZnJhbWVzID8gdGhpcy5mcmFtZXMuY29uY2F0KGNvbnRleHQuZnJhbWVzKSA6IGNvbnRleHQuZnJhbWVzOw0KICAgICAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5ldmFsUGFyYW1zKGNvbnRleHQsIG5ldyBjb250ZXh0cy5FdmFsKGNvbnRleHQsIG1peGluRnJhbWVzKSwgYXJncywgX2FyZ3VtZW50cyk7DQogICAgICAgICAgICB2YXIgcnVsZXM7DQogICAgICAgICAgICB2YXIgcnVsZXNldDsNCiAgICAgICAgICAgIGZyYW1lLnByZXBlbmRSdWxlKG5ldyBEZWNsYXJhdGlvbignQGFyZ3VtZW50cycsIG5ldyBFeHByZXNzaW9uKF9hcmd1bWVudHMpLmV2YWwoY29udGV4dCkpKTsNCiAgICAgICAgICAgIHJ1bGVzID0gY29weUFycmF5KHRoaXMucnVsZXMpOw0KICAgICAgICAgICAgcnVsZXNldCA9IG5ldyBSdWxlc2V0KG51bGwsIHJ1bGVzKTsNCiAgICAgICAgICAgIHJ1bGVzZXQub3JpZ2luYWxSdWxlc2V0ID0gdGhpczsNCiAgICAgICAgICAgIHJ1bGVzZXQgPSBydWxlc2V0LmV2YWwobmV3IGNvbnRleHRzLkV2YWwoY29udGV4dCwgW3RoaXMsIGZyYW1lXS5jb25jYXQobWl4aW5GcmFtZXMpKSk7DQogICAgICAgICAgICBpZiAoaW1wb3J0YW50KSB7DQogICAgICAgICAgICAgICAgcnVsZXNldCA9IHJ1bGVzZXQubWFrZUltcG9ydGFudCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJ1bGVzZXQ7DQogICAgICAgIH0sDQogICAgICAgIG1hdGNoQ29uZGl0aW9uOiBmdW5jdGlvbiAoYXJncywgY29udGV4dCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uICYmICF0aGlzLmNvbmRpdGlvbi5ldmFsKG5ldyBjb250ZXh0cy5FdmFsKGNvbnRleHQsIFt0aGlzLmV2YWxQYXJhbXMoY29udGV4dCwgLyogdGhlIHBhcmFtZXRlciB2YXJpYWJsZXMgKi8gbmV3IGNvbnRleHRzLkV2YWwoY29udGV4dCwgdGhpcy5mcmFtZXMgPyB0aGlzLmZyYW1lcy5jb25jYXQoY29udGV4dC5mcmFtZXMpIDogY29udGV4dC5mcmFtZXMpLCBhcmdzLCBbXSldDQogICAgICAgICAgICAgICAgLmNvbmNhdCh0aGlzLmZyYW1lcyB8fCBbXSkgLy8gdGhlIHBhcmVudCBuYW1lc3BhY2UvbWl4aW4gZnJhbWVzDQogICAgICAgICAgICAgICAgLmNvbmNhdChjb250ZXh0LmZyYW1lcykpKSkgeyAvLyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBmcmFtZXMNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfSwNCiAgICAgICAgbWF0Y2hBcmdzOiBmdW5jdGlvbiAoYXJncywgY29udGV4dCkgew0KICAgICAgICAgICAgdmFyIGFsbEFyZ3NDbnQgPSAoYXJncyAmJiBhcmdzLmxlbmd0aCkgfHwgMDsNCiAgICAgICAgICAgIHZhciBsZW47DQogICAgICAgICAgICB2YXIgb3B0aW9uYWxQYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25hbFBhcmFtZXRlcnM7DQogICAgICAgICAgICB2YXIgcmVxdWlyZWRBcmdzQ250ID0gIWFyZ3MgPyAwIDogYXJncy5yZWR1Y2UoZnVuY3Rpb24gKGNvdW50LCBwKSB7DQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsUGFyYW1ldGVycy5pbmRleE9mKHAubmFtZSkgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudCArIDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwgMCk7DQogICAgICAgICAgICBpZiAoIXRoaXMudmFyaWFkaWMpIHsNCiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRBcmdzQ250IDwgdGhpcy5yZXF1aXJlZCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChhbGxBcmdzQ250ID4gdGhpcy5wYXJhbXMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRBcmdzQ250IDwgKHRoaXMucmVxdWlyZWQgLSAxKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gY2hlY2sgcGF0dGVybnMNCiAgICAgICAgICAgIGxlbiA9IE1hdGgubWluKHJlcXVpcmVkQXJnc0NudCwgdGhpcy5hcml0eSk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtc1tpXS5uYW1lICYmICF0aGlzLnBhcmFtc1tpXS52YXJpYWRpYykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS52YWx1ZS5ldmFsKGNvbnRleHQpLnRvQ1NTKCkgIT0gdGhpcy5wYXJhbXNbaV0udmFsdWUuZXZhbChjb250ZXh0KS50b0NTUygpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHZhciBNaXhpbkNhbGwgPSBmdW5jdGlvbiAoZWxlbWVudHMsIGFyZ3MsIGluZGV4LCBjdXJyZW50RmlsZUluZm8sIGltcG9ydGFudCkgew0KICAgICAgICB0aGlzLnNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKGVsZW1lbnRzKTsNCiAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzIHx8IFtdOw0KICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4Ow0KICAgICAgICB0aGlzLl9maWxlSW5mbyA9IGN1cnJlbnRGaWxlSW5mbzsNCiAgICAgICAgdGhpcy5pbXBvcnRhbnQgPSBpbXBvcnRhbnQ7DQogICAgICAgIHRoaXMuYWxsb3dSb290ID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5zZXRQYXJlbnQodGhpcy5zZWxlY3RvciwgdGhpcyk7DQogICAgfTsNCiAgICBNaXhpbkNhbGwucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgTm9kZSgpLCB7DQogICAgICAgIHR5cGU6ICdNaXhpbkNhbGwnLA0KICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uICh2aXNpdG9yKSB7DQogICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rvcikgew0KICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSB2aXNpdG9yLnZpc2l0KHRoaXMuc2VsZWN0b3IpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMuYXJndW1lbnRzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHRoaXMuYXJndW1lbnRzID0gdmlzaXRvci52aXNpdEFycmF5KHRoaXMuYXJndW1lbnRzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZXZhbDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHZhciBtaXhpbnM7DQogICAgICAgICAgICB2YXIgbWl4aW47DQogICAgICAgICAgICB2YXIgbWl4aW5QYXRoOw0KICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTsNCiAgICAgICAgICAgIHZhciBhcmc7DQogICAgICAgICAgICB2YXIgYXJnVmFsdWU7DQogICAgICAgICAgICB2YXIgcnVsZXMgPSBbXTsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGZhbHNlOw0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICB2YXIgbTsNCiAgICAgICAgICAgIHZhciBmOw0KICAgICAgICAgICAgdmFyIGlzUmVjdXJzaXZlOw0KICAgICAgICAgICAgdmFyIGlzT25lRm91bmQ7DQogICAgICAgICAgICB2YXIgY2FuZGlkYXRlcyA9IFtdOw0KICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZTsNCiAgICAgICAgICAgIHZhciBjb25kaXRpb25SZXN1bHQgPSBbXTsNCiAgICAgICAgICAgIHZhciBkZWZhdWx0UmVzdWx0Ow0KICAgICAgICAgICAgdmFyIGRlZkZhbHNlRWl0aGVyQ2FzZSA9IC0xOw0KICAgICAgICAgICAgdmFyIGRlZk5vbmUgPSAwOw0KICAgICAgICAgICAgdmFyIGRlZlRydWUgPSAxOw0KICAgICAgICAgICAgdmFyIGRlZkZhbHNlID0gMjsNCiAgICAgICAgICAgIHZhciBjb3VudDsNCiAgICAgICAgICAgIHZhciBvcmlnaW5hbFJ1bGVzZXQ7DQogICAgICAgICAgICB2YXIgbm9Bcmd1bWVudHNGaWx0ZXI7DQogICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gdGhpcy5zZWxlY3Rvci5ldmFsKGNvbnRleHQpOw0KICAgICAgICAgICAgZnVuY3Rpb24gY2FsY0RlZkdyb3VwKG1peGluLCBtaXhpblBhdGgpIHsNCiAgICAgICAgICAgICAgICB2YXIgZiwgcCwgbmFtZXNwYWNlOw0KICAgICAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsNCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0W2ZdID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZ1bmMudmFsdWUoZik7DQogICAgICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBtaXhpblBhdGgubGVuZ3RoICYmIGNvbmRpdGlvblJlc3VsdFtmXTsgcCsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBtaXhpblBhdGhbcF07DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLm1hdGNoQ29uZGl0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0W2ZdID0gY29uZGl0aW9uUmVzdWx0W2ZdICYmIG5hbWVzcGFjZS5tYXRjaENvbmRpdGlvbihudWxsLCBjb250ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4ubWF0Y2hDb25kaXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdFtmXSA9IGNvbmRpdGlvblJlc3VsdFtmXSAmJiBtaXhpbi5tYXRjaENvbmRpdGlvbihhcmdzLCBjb250ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uUmVzdWx0WzBdIHx8IGNvbmRpdGlvblJlc3VsdFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uUmVzdWx0WzBdICE9IGNvbmRpdGlvblJlc3VsdFsxXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvblJlc3VsdFsxXSA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmVHJ1ZSA6IGRlZkZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZOb25lOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gZGVmRmFsc2VFaXRoZXJDYXNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgYXJnID0gdGhpcy5hcmd1bWVudHNbaV07DQogICAgICAgICAgICAgICAgYXJnVmFsdWUgPSBhcmcudmFsdWUuZXZhbChjb250ZXh0KTsNCiAgICAgICAgICAgICAgICBpZiAoYXJnLmV4cGFuZCAmJiBBcnJheS5pc0FycmF5KGFyZ1ZhbHVlLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICBhcmdWYWx1ZSA9IGFyZ1ZhbHVlLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgYXJnVmFsdWUubGVuZ3RoOyBtKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh7IHZhbHVlOiBhcmdWYWx1ZVttXSB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHsgbmFtZTogYXJnLm5hbWUsIHZhbHVlOiBhcmdWYWx1ZSB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBub0FyZ3VtZW50c0ZpbHRlciA9IGZ1bmN0aW9uIChydWxlKSB7IHJldHVybiBydWxlLm1hdGNoQXJncyhudWxsLCBjb250ZXh0KTsgfTsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0LmZyYW1lcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICgobWl4aW5zID0gY29udGV4dC5mcmFtZXNbaV0uZmluZCh0aGlzLnNlbGVjdG9yLCBudWxsLCBub0FyZ3VtZW50c0ZpbHRlcikpLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgaXNPbmVGb3VuZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIC8vIFRvIG1ha2UgYGRlZmF1bHQoKWAgZnVuY3Rpb24gaW5kZXBlbmRlbnQgb2YgZGVmaW5pdGlvbiBvcmRlciB3ZSBoYXZlIHR3byAic3VicGFzc2VzIiBoZXJlLg0KICAgICAgICAgICAgICAgICAgICAvLyBBdCBmaXJzdCB3ZSBldmFsdWF0ZSBlYWNoIGd1YXJkICp0d2ljZSogKHdpdGggYGRlZmF1bHQoKSA9PSB0cnVlYCBhbmQgYGRlZmF1bHQoKSA9PSBmYWxzZWApLA0KICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYnVpbGQgY2FuZGlkYXRlIGxpc3Qgd2l0aCBjb3JyZXNwb25kaW5nIGZsYWdzLiBUaGVuLCB3aGVuIHdlIGtub3cgYWxsIHBvc3NpYmxlIG1hdGNoZXMsDQogICAgICAgICAgICAgICAgICAgIC8vIHdlIG1ha2UgYSBmaW5hbCBkZWNpc2lvbi4NCiAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IG1peGlucy5sZW5ndGg7IG0rKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4gPSBtaXhpbnNbbV0ucnVsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluUGF0aCA9IG1peGluc1ttXS5wYXRoOw0KICAgICAgICAgICAgICAgICAgICAgICAgaXNSZWN1cnNpdmUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCBjb250ZXh0LmZyYW1lcy5sZW5ndGg7IGYrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIShtaXhpbiBpbnN0YW5jZW9mIERlZmluaXRpb24pKSAmJiBtaXhpbiA9PT0gKGNvbnRleHQuZnJhbWVzW2ZdLm9yaWdpbmFsUnVsZXNldCB8fCBjb250ZXh0LmZyYW1lc1tmXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZWN1cnNpdmUgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZWN1cnNpdmUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXhpbi5tYXRjaEFyZ3MoYXJncywgY29udGV4dCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSB7IG1peGluOiBtaXhpbiwgZ3JvdXA6IGNhbGNEZWZHcm91cChtaXhpbiwgbWl4aW5QYXRoKSB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuZ3JvdXAgIT09IGRlZkZhbHNlRWl0aGVyQ2FzZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goY2FuZGlkYXRlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGdW5jLnJlc2V0KCk7DQogICAgICAgICAgICAgICAgICAgIGNvdW50ID0gWzAsIDAsIDBdOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgY2FuZGlkYXRlcy5sZW5ndGg7IG0rKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgY291bnRbY2FuZGlkYXRlc1ttXS5ncm91cF0rKzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRbZGVmTm9uZV0gPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UmVzdWx0ID0gZGVmRmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UmVzdWx0ID0gZGVmVHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY291bnRbZGVmVHJ1ZV0gKyBjb3VudFtkZWZGYWxzZV0pID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHsgdHlwZTogJ1J1bnRpbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiQW1iaWd1b3VzIHVzZSBvZiBgZGVmYXVsdCgpYCBmb3VuZCB3aGVuIG1hdGNoaW5nIGZvciBgIiArIHRoaXMuZm9ybWF0KGFyZ3MpICsgImAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpLCBmaWxlbmFtZTogdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lIH07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBtKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXNbbV0uZ3JvdXA7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbmRpZGF0ZSA9PT0gZGVmTm9uZSkgfHwgKGNhbmRpZGF0ZSA9PT0gZGVmYXVsdFJlc3VsdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhpbiA9IGNhbmRpZGF0ZXNbbV0ubWl4aW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1peGluIGluc3RhbmNlb2YgRGVmaW5pdGlvbikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUnVsZXNldCA9IG1peGluLm9yaWdpbmFsUnVsZXNldCB8fCBtaXhpbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluID0gbmV3IERlZmluaXRpb24oJycsIFtdLCBtaXhpbi5ydWxlcywgbnVsbCwgZmFsc2UsIG51bGwsIG9yaWdpbmFsUnVsZXNldC52aXNpYmlsaXR5SW5mbygpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluLm9yaWdpbmFsUnVsZXNldCA9IG9yaWdpbmFsUnVsZXNldDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UnVsZXMgPSBtaXhpbi5ldmFsQ2FsbChjb250ZXh0LCBhcmdzLCB0aGlzLmltcG9ydGFudCkucnVsZXM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpc2liaWxpdHlUb1JlcGxhY2VtZW50KG5ld1J1bGVzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocnVsZXMsIG5ld1J1bGVzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgeyBtZXNzYWdlOiBlLm1lc3NhZ2UsIGluZGV4OiB0aGlzLmdldEluZGV4KCksIGZpbGVuYW1lOiB0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsIHN0YWNrOiBlLnN0YWNrIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVzOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGlzT25lRm91bmQpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdSdW50aW1lJywNCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIk5vIG1hdGNoaW5nIGRlZmluaXRpb24gd2FzIGZvdW5kIGZvciBgIiArIHRoaXMuZm9ybWF0KGFyZ3MpICsgImAiLA0KICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpLCBmaWxlbmFtZTogdGhpcy5maWxlSW5mbygpLmZpbGVuYW1lIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdOYW1lJywNCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5zZWxlY3Rvci50b0NTUygpLnRyaW0oKSArICIgaXMgdW5kZWZpbmVkIiwNCiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZ2V0SW5kZXgoKSwgZmlsZW5hbWU6IHRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBfc2V0VmlzaWJpbGl0eVRvUmVwbGFjZW1lbnQ6IGZ1bmN0aW9uIChyZXBsYWNlbWVudCkgew0KICAgICAgICAgICAgdmFyIGksIHJ1bGU7DQogICAgICAgICAgICBpZiAodGhpcy5ibG9ja3NWaXNpYmlsaXR5KCkpIHsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVwbGFjZW1lbnQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZSA9IHJlcGxhY2VtZW50W2ldOw0KICAgICAgICAgICAgICAgICAgICBydWxlLmFkZFZpc2liaWxpdHlCbG9jaygpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbiAoYXJncykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3IudG9DU1MoKS50cmltKCkgKyAiKCIgKyAoYXJncyA/IGFyZ3MubWFwKGZ1bmN0aW9uIChhKSB7DQogICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbHVlID0gJyc7DQogICAgICAgICAgICAgICAgaWYgKGEubmFtZSkgew0KICAgICAgICAgICAgICAgICAgICBhcmdWYWx1ZSArPSBhLm5hbWUgKyAiOiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChhLnZhbHVlLnRvQ1NTKSB7DQogICAgICAgICAgICAgICAgICAgIGFyZ1ZhbHVlICs9IGEudmFsdWUudG9DU1MoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGFyZ1ZhbHVlICs9ICc/Pz8nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gYXJnVmFsdWU7DQogICAgICAgICAgICB9KS5qb2luKCcsICcpIDogJycpICsgIikiOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIHRyZWUgPSB7DQogICAgICAgIE5vZGU6IE5vZGUsDQogICAgICAgIENvbG9yOiBDb2xvciwNCiAgICAgICAgQXRSdWxlOiBBdFJ1bGUsDQogICAgICAgIERldGFjaGVkUnVsZXNldDogRGV0YWNoZWRSdWxlc2V0LA0KICAgICAgICBPcGVyYXRpb246IE9wZXJhdGlvbiwNCiAgICAgICAgRGltZW5zaW9uOiBEaW1lbnNpb24sDQogICAgICAgIFVuaXQ6IFVuaXQsDQogICAgICAgIEtleXdvcmQ6IEtleXdvcmQsDQogICAgICAgIFZhcmlhYmxlOiBWYXJpYWJsZSwNCiAgICAgICAgUHJvcGVydHk6IFByb3BlcnR5LA0KICAgICAgICBSdWxlc2V0OiBSdWxlc2V0LA0KICAgICAgICBFbGVtZW50OiBFbGVtZW50LA0KICAgICAgICBBdHRyaWJ1dGU6IEF0dHJpYnV0ZSwNCiAgICAgICAgQ29tYmluYXRvcjogQ29tYmluYXRvciwNCiAgICAgICAgU2VsZWN0b3I6IFNlbGVjdG9yLA0KICAgICAgICBRdW90ZWQ6IFF1b3RlZCwNCiAgICAgICAgRXhwcmVzc2lvbjogRXhwcmVzc2lvbiwNCiAgICAgICAgRGVjbGFyYXRpb246IERlY2xhcmF0aW9uLA0KICAgICAgICBDYWxsOiBDYWxsLA0KICAgICAgICBVUkw6IFVSTCwNCiAgICAgICAgSW1wb3J0OiBJbXBvcnQsDQogICAgICAgIENvbW1lbnQ6IENvbW1lbnQsDQogICAgICAgIEFub255bW91czogQW5vbnltb3VzLA0KICAgICAgICBWYWx1ZTogVmFsdWUsDQogICAgICAgIEphdmFTY3JpcHQ6IEphdmFTY3JpcHQsDQogICAgICAgIEFzc2lnbm1lbnQ6IEFzc2lnbm1lbnQsDQogICAgICAgIENvbmRpdGlvbjogQ29uZGl0aW9uLA0KICAgICAgICBQYXJlbjogUGFyZW4sDQogICAgICAgIE1lZGlhOiBNZWRpYSwNCiAgICAgICAgVW5pY29kZURlc2NyaXB0b3I6IFVuaWNvZGVEZXNjcmlwdG9yLA0KICAgICAgICBOZWdhdGl2ZTogTmVnYXRpdmUsDQogICAgICAgIEV4dGVuZDogRXh0ZW5kLA0KICAgICAgICBWYXJpYWJsZUNhbGw6IFZhcmlhYmxlQ2FsbCwNCiAgICAgICAgTmFtZXNwYWNlVmFsdWU6IE5hbWVzcGFjZVZhbHVlLA0KICAgICAgICBtaXhpbjogew0KICAgICAgICAgICAgQ2FsbDogTWl4aW5DYWxsLA0KICAgICAgICAgICAgRGVmaW5pdGlvbjogRGVmaW5pdGlvbg0KICAgICAgICB9DQogICAgfTsKCiAgICB2YXIgQWJzdHJhY3RGaWxlTWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgZnVuY3Rpb24gQWJzdHJhY3RGaWxlTWFuYWdlcigpIHsNCiAgICAgICAgfQ0KICAgICAgICBBYnN0cmFjdEZpbGVNYW5hZ2VyLnByb3RvdHlwZS5nZXRQYXRoID0gZnVuY3Rpb24gKGZpbGVuYW1lKSB7DQogICAgICAgICAgICB2YXIgaiA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCc/Jyk7DQogICAgICAgICAgICBpZiAoaiA+IDApIHsNCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnNsaWNlKDAsIGopOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaiA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcvJyk7DQogICAgICAgICAgICBpZiAoaiA8IDApIHsNCiAgICAgICAgICAgICAgICBqID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJ1xcJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoaiA8IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuc2xpY2UoMCwgaiArIDEpOw0KICAgICAgICB9Ow0KICAgICAgICBBYnN0cmFjdEZpbGVNYW5hZ2VyLnByb3RvdHlwZS50cnlBcHBlbmRFeHRlbnNpb24gPSBmdW5jdGlvbiAocGF0aCwgZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gLyhcLlthLXpdKiQpfChbXD87XS4qKSQvLnRlc3QocGF0aCkgPyBwYXRoIDogcGF0aCArIGV4dDsNCiAgICAgICAgfTsNCiAgICAgICAgQWJzdHJhY3RGaWxlTWFuYWdlci5wcm90b3R5cGUudHJ5QXBwZW5kTGVzc0V4dGVuc2lvbiA9IGZ1bmN0aW9uIChwYXRoKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy50cnlBcHBlbmRFeHRlbnNpb24ocGF0aCwgJy5sZXNzJyk7DQogICAgICAgIH07DQogICAgICAgIEFic3RyYWN0RmlsZU1hbmFnZXIucHJvdG90eXBlLnN1cHBvcnRzU3luYyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgQWJzdHJhY3RGaWxlTWFuYWdlci5wcm90b3R5cGUuYWx3YXlzTWFrZVBhdGhzQWJzb2x1dGUgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH07DQogICAgICAgIEFic3RyYWN0RmlsZU1hbmFnZXIucHJvdG90eXBlLmlzUGF0aEFic29sdXRlID0gZnVuY3Rpb24gKGZpbGVuYW1lKSB7DQogICAgICAgICAgICByZXR1cm4gKC9eKD86W2Etei1dKzp8XC98XFx8IykvaSkudGVzdChmaWxlbmFtZSk7DQogICAgICAgIH07DQogICAgICAgIC8vIFRPRE86IHB1bGwgb3V0IC8gcmVwbGFjZT8NCiAgICAgICAgQWJzdHJhY3RGaWxlTWFuYWdlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChiYXNlUGF0aCwgbGF0ZXJQYXRoKSB7DQogICAgICAgICAgICBpZiAoIWJhc2VQYXRoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGxhdGVyUGF0aDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBiYXNlUGF0aCArIGxhdGVyUGF0aDsNCiAgICAgICAgfTsNCiAgICAgICAgQWJzdHJhY3RGaWxlTWFuYWdlci5wcm90b3R5cGUucGF0aERpZmYgPSBmdW5jdGlvbiAodXJsLCBiYXNlVXJsKSB7DQogICAgICAgICAgICAvLyBkaWZmIGJldHdlZW4gdHdvIHBhdGhzIHRvIGNyZWF0ZSBhIHJlbGF0aXZlIHBhdGgNCiAgICAgICAgICAgIHZhciB1cmxQYXJ0cyA9IHRoaXMuZXh0cmFjdFVybFBhcnRzKHVybCk7DQogICAgICAgICAgICB2YXIgYmFzZVVybFBhcnRzID0gdGhpcy5leHRyYWN0VXJsUGFydHMoYmFzZVVybCk7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIHZhciBtYXg7DQogICAgICAgICAgICB2YXIgdXJsRGlyZWN0b3JpZXM7DQogICAgICAgICAgICB2YXIgYmFzZVVybERpcmVjdG9yaWVzOw0KICAgICAgICAgICAgdmFyIGRpZmYgPSAnJzsNCiAgICAgICAgICAgIGlmICh1cmxQYXJ0cy5ob3N0UGFydCAhPT0gYmFzZVVybFBhcnRzLmhvc3RQYXJ0KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgoYmFzZVVybFBhcnRzLmRpcmVjdG9yaWVzLmxlbmd0aCwgdXJsUGFydHMuZGlyZWN0b3JpZXMubGVuZ3RoKTsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChiYXNlVXJsUGFydHMuZGlyZWN0b3JpZXNbaV0gIT09IHVybFBhcnRzLmRpcmVjdG9yaWVzW2ldKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJhc2VVcmxEaXJlY3RvcmllcyA9IGJhc2VVcmxQYXJ0cy5kaXJlY3Rvcmllcy5zbGljZShpKTsNCiAgICAgICAgICAgIHVybERpcmVjdG9yaWVzID0gdXJsUGFydHMuZGlyZWN0b3JpZXMuc2xpY2UoaSk7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmFzZVVybERpcmVjdG9yaWVzLmxlbmd0aCAtIDE7IGkrKykgew0KICAgICAgICAgICAgICAgIGRpZmYgKz0gJy4uLyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdXJsRGlyZWN0b3JpZXMubGVuZ3RoIC0gMTsgaSsrKSB7DQogICAgICAgICAgICAgICAgZGlmZiArPSB1cmxEaXJlY3Rvcmllc1tpXSArICIvIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBkaWZmOw0KICAgICAgICB9Ow0KICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24sIG5vdCBwYXJ0IG9mIEFQSQ0KICAgICAgICBBYnN0cmFjdEZpbGVNYW5hZ2VyLnByb3RvdHlwZS5leHRyYWN0VXJsUGFydHMgPSBmdW5jdGlvbiAodXJsLCBiYXNlVXJsKSB7DQogICAgICAgICAgICAvLyB1cmxQYXJ0c1sxXSA9IHByb3RvY29sOi8vaG9zdG5hbWUvIE9SIC8NCiAgICAgICAgICAgIC8vIHVybFBhcnRzWzJdID0gLyBpZiBwYXRoIHJlbGF0aXZlIHRvIGhvc3QgYmFzZQ0KICAgICAgICAgICAgLy8gdXJsUGFydHNbM10gPSBkaXJlY3Rvcmllcw0KICAgICAgICAgICAgLy8gdXJsUGFydHNbNF0gPSBmaWxlbmFtZQ0KICAgICAgICAgICAgLy8gdXJsUGFydHNbNV0gPSBwYXJhbWV0ZXJzDQogICAgICAgICAgICB2YXIgdXJsUGFydHNSZWdleCA9IC9eKCg/OlthLXotXSs6KT9cL3syfSg/OlteXC9cPyNdKlwvKXwoW1wvXFxdKSk/KCg/OlteXC9cXFw/I10qW1wvXFxdKSopKFteXC9cXFw/I10qKShbI1w/XS4qKT8kL2k7DQogICAgICAgICAgICB2YXIgdXJsUGFydHMgPSB1cmwubWF0Y2godXJsUGFydHNSZWdleCk7DQogICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB7fTsNCiAgICAgICAgICAgIHZhciByYXdEaXJlY3RvcmllcyA9IFtdOw0KICAgICAgICAgICAgdmFyIGRpcmVjdG9yaWVzID0gW107DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIHZhciBiYXNlVXJsUGFydHM7DQogICAgICAgICAgICBpZiAoIXVybFBhcnRzKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcGFyc2Ugc2hlZXQgaHJlZiAtICciICsgdXJsICsgIiciKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIFN0eWxlc2hlZXRzIGluIElFIGRvbid0IGFsd2F5cyByZXR1cm4gdGhlIGZ1bGwgcGF0aA0KICAgICAgICAgICAgaWYgKGJhc2VVcmwgJiYgKCF1cmxQYXJ0c1sxXSB8fCB1cmxQYXJ0c1syXSkpIHsNCiAgICAgICAgICAgICAgICBiYXNlVXJsUGFydHMgPSBiYXNlVXJsLm1hdGNoKHVybFBhcnRzUmVnZXgpOw0KICAgICAgICAgICAgICAgIGlmICghYmFzZVVybFBhcnRzKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHBhcnNlIHBhZ2UgdXJsIC0gJyIgKyBiYXNlVXJsICsgIiciKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdXJsUGFydHNbMV0gPSB1cmxQYXJ0c1sxXSB8fCBiYXNlVXJsUGFydHNbMV0gfHwgJyc7DQogICAgICAgICAgICAgICAgaWYgKCF1cmxQYXJ0c1syXSkgew0KICAgICAgICAgICAgICAgICAgICB1cmxQYXJ0c1szXSA9IGJhc2VVcmxQYXJ0c1szXSArIHVybFBhcnRzWzNdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh1cmxQYXJ0c1szXSkgew0KICAgICAgICAgICAgICAgIHJhd0RpcmVjdG9yaWVzID0gdXJsUGFydHNbM10ucmVwbGFjZSgvXFwvZywgJy8nKS5zcGxpdCgnLycpOw0KICAgICAgICAgICAgICAgIC8vIGNvbGxhcHNlICcuLicgYW5kIHNraXAgJy4nDQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhd0RpcmVjdG9yaWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChyYXdEaXJlY3Rvcmllc1tpXSA9PT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMucG9wKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF3RGlyZWN0b3JpZXNbaV0gIT09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMucHVzaChyYXdEaXJlY3Rvcmllc1tpXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm5lci5ob3N0UGFydCA9IHVybFBhcnRzWzFdOw0KICAgICAgICAgICAgcmV0dXJuZXIuZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsNCiAgICAgICAgICAgIHJldHVybmVyLnJhd1BhdGggPSAodXJsUGFydHNbMV0gfHwgJycpICsgcmF3RGlyZWN0b3JpZXMuam9pbignLycpOw0KICAgICAgICAgICAgcmV0dXJuZXIucGF0aCA9ICh1cmxQYXJ0c1sxXSB8fCAnJykgKyBkaXJlY3Rvcmllcy5qb2luKCcvJyk7DQogICAgICAgICAgICByZXR1cm5lci5maWxlbmFtZSA9IHVybFBhcnRzWzRdOw0KICAgICAgICAgICAgcmV0dXJuZXIuZmlsZVVybCA9IHJldHVybmVyLnBhdGggKyAodXJsUGFydHNbNF0gfHwgJycpOw0KICAgICAgICAgICAgcmV0dXJuZXIudXJsID0gcmV0dXJuZXIuZmlsZVVybCArICh1cmxQYXJ0c1s1XSB8fCAnJyk7DQogICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7DQogICAgICAgIH07DQogICAgICAgIHJldHVybiBBYnN0cmFjdEZpbGVNYW5hZ2VyOw0KICAgIH0oKSk7CgogICAgdmFyIEFic3RyYWN0UGx1Z2luTG9hZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgew0KICAgICAgICBmdW5jdGlvbiBBYnN0cmFjdFBsdWdpbkxvYWRlcigpIHsNCiAgICAgICAgICAgIC8vIEltcGxlbWVudGVkIGJ5IE5vZGUuanMgcGx1Z2luIGxvYWRlcg0KICAgICAgICAgICAgdGhpcy5yZXF1aXJlID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICBBYnN0cmFjdFBsdWdpbkxvYWRlci5wcm90b3R5cGUuZXZhbFBsdWdpbiA9IGZ1bmN0aW9uIChjb250ZW50cywgY29udGV4dCwgaW1wb3J0cywgcGx1Z2luT3B0aW9ucywgZmlsZUluZm8pIHsNCiAgICAgICAgICAgIHZhciBsb2FkZXIsIHJlZ2lzdHJ5LCBwbHVnaW5PYmosIGxvY2FsTW9kdWxlLCBwbHVnaW5NYW5hZ2VyLCBmaWxlbmFtZSwgcmVzdWx0Ow0KICAgICAgICAgICAgcGx1Z2luTWFuYWdlciA9IGNvbnRleHQucGx1Z2luTWFuYWdlcjsNCiAgICAgICAgICAgIGlmIChmaWxlSW5mbykgew0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZUluZm8gPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZUluZm87DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVJbmZvLmZpbGVuYW1lOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBzaG9ydG5hbWUgPSAobmV3IHRoaXMubGVzcy5GaWxlTWFuYWdlcigpKS5leHRyYWN0VXJsUGFydHMoZmlsZW5hbWUpLmZpbGVuYW1lOw0KICAgICAgICAgICAgaWYgKGZpbGVuYW1lKSB7DQogICAgICAgICAgICAgICAgcGx1Z2luT2JqID0gcGx1Z2luTWFuYWdlci5nZXQoZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgIGlmIChwbHVnaW5PYmopIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy50cnlTZXRPcHRpb25zKHBsdWdpbk9iaiwgZmlsZW5hbWUsIHNob3J0bmFtZSwgcGx1Z2luT3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW5PYmoudXNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luT2JqLnVzZS5jYWxsKHRoaXMuY29udGV4dCwgcGx1Z2luT2JqKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZS5tZXNzYWdlID0gZS5tZXNzYWdlIHx8ICdFcnJvciBkdXJpbmcgQHBsdWdpbiBjYWxsJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGVzc0Vycm9yKGUsIGltcG9ydHMsIGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luT2JqOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxvY2FsTW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9LA0KICAgICAgICAgICAgICAgIHBsdWdpbk1hbmFnZXI6IHBsdWdpbk1hbmFnZXIsDQogICAgICAgICAgICAgICAgZmlsZUluZm86IGZpbGVJbmZvDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgcmVnaXN0cnkgPSBmdW5jdGlvblJlZ2lzdHJ5LmNyZWF0ZSgpOw0KICAgICAgICAgICAgdmFyIHJlZ2lzdGVyUGx1Z2luID0gZnVuY3Rpb24gKG9iaikgew0KICAgICAgICAgICAgICAgIHBsdWdpbk9iaiA9IG9iajsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGxvYWRlciA9IG5ldyBGdW5jdGlvbignbW9kdWxlJywgJ3JlcXVpcmUnLCAncmVnaXN0ZXJQbHVnaW4nLCAnZnVuY3Rpb25zJywgJ3RyZWUnLCAnbGVzcycsICdmaWxlSW5mbycsIGNvbnRlbnRzKTsNCiAgICAgICAgICAgICAgICBsb2FkZXIobG9jYWxNb2R1bGUsIHRoaXMucmVxdWlyZShmaWxlbmFtZSksIHJlZ2lzdGVyUGx1Z2luLCByZWdpc3RyeSwgdGhpcy5sZXNzLnRyZWUsIHRoaXMubGVzcywgZmlsZUluZm8pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExlc3NFcnJvcihlLCBpbXBvcnRzLCBmaWxlbmFtZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIXBsdWdpbk9iaikgew0KICAgICAgICAgICAgICAgIHBsdWdpbk9iaiA9IGxvY2FsTW9kdWxlLmV4cG9ydHM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwbHVnaW5PYmogPSB0aGlzLnZhbGlkYXRlUGx1Z2luKHBsdWdpbk9iaiwgZmlsZW5hbWUsIHNob3J0bmFtZSk7DQogICAgICAgICAgICBpZiAocGx1Z2luT2JqIGluc3RhbmNlb2YgTGVzc0Vycm9yKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbk9iajsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwbHVnaW5PYmopIHsNCiAgICAgICAgICAgICAgICBwbHVnaW5PYmouaW1wb3J0cyA9IGltcG9ydHM7DQogICAgICAgICAgICAgICAgcGx1Z2luT2JqLmZpbGVuYW1lID0gZmlsZW5hbWU7DQogICAgICAgICAgICAgICAgLy8gRm9yIDwgMy54IChvciB1bnNwZWNpZmllZCBtaW5WZXJzaW9uKSAtIHNldE9wdGlvbnMoKSBiZWZvcmUgaW5zdGFsbCgpDQogICAgICAgICAgICAgICAgaWYgKCFwbHVnaW5PYmoubWluVmVyc2lvbiB8fCB0aGlzLmNvbXBhcmVWZXJzaW9uKCczLjAuMCcsIHBsdWdpbk9iai5taW5WZXJzaW9uKSA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy50cnlTZXRPcHRpb25zKHBsdWdpbk9iaiwgZmlsZW5hbWUsIHNob3J0bmFtZSwgcGx1Z2luT3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gUnVuIG9uIGZpcnN0IGxvYWQNCiAgICAgICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmFkZFBsdWdpbihwbHVnaW5PYmosIGZpbGVJbmZvLmZpbGVuYW1lLCByZWdpc3RyeSk7DQogICAgICAgICAgICAgICAgcGx1Z2luT2JqLmZ1bmN0aW9ucyA9IHJlZ2lzdHJ5LmdldExvY2FsRnVuY3Rpb25zKCk7DQogICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjYWxsIHNldE9wdGlvbnMgYWdhaW4gYmVjYXVzZSB0aGUgcGx1Z2luT2JqIG1pZ2h0IGhhdmUgZnVuY3Rpb25zDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy50cnlTZXRPcHRpb25zKHBsdWdpbk9iaiwgZmlsZW5hbWUsIHNob3J0bmFtZSwgcGx1Z2luT3B0aW9ucyk7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBSdW4gZXZlcnkgQHBsdWdpbiBjYWxsDQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbk9iai51c2UpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbk9iai51c2UuY2FsbCh0aGlzLmNvbnRleHQsIHBsdWdpbk9iaik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgZS5tZXNzYWdlID0gZS5tZXNzYWdlIHx8ICdFcnJvciBkdXJpbmcgQHBsdWdpbiBjYWxsJzsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZXNzRXJyb3IoZSwgaW1wb3J0cywgZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGVzc0Vycm9yKHsgbWVzc2FnZTogJ05vdCBhIHZhbGlkIHBsdWdpbicgfSwgaW1wb3J0cywgZmlsZW5hbWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHBsdWdpbk9iajsNCiAgICAgICAgfTsNCiAgICAgICAgQWJzdHJhY3RQbHVnaW5Mb2FkZXIucHJvdG90eXBlLnRyeVNldE9wdGlvbnMgPSBmdW5jdGlvbiAocGx1Z2luLCBmaWxlbmFtZSwgbmFtZSwgb3B0aW9ucykgew0KICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgIXBsdWdpbi5zZXRPcHRpb25zKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZXNzRXJyb3Ioew0KICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiT3B0aW9ucyBoYXZlIGJlZW4gcHJvdmlkZWQgYnV0IHRoZSBwbHVnaW4gIiArIG5hbWUgKyAiIGRvZXMgbm90IHN1cHBvcnQgYW55IG9wdGlvbnMuIg0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBwbHVnaW4uc2V0T3B0aW9ucyAmJiBwbHVnaW4uc2V0T3B0aW9ucyhvcHRpb25zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZXNzRXJyb3IoZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIEFic3RyYWN0UGx1Z2luTG9hZGVyLnByb3RvdHlwZS52YWxpZGF0ZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIGZpbGVuYW1lLCBuYW1lKSB7DQogICAgICAgICAgICBpZiAocGx1Z2luKSB7DQogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBwbHVnaW5zIGJlaW5nIGEgZnVuY3Rpb24NCiAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBwbHVnaW4gY2FuIGJlIG1vcmUgdXNhYmxlIHByb2dyYW1tYXRpY2FsbHkNCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICBwbHVnaW4gPSBuZXcgcGx1Z2luKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ubWluVmVyc2lvbikgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYXJlVmVyc2lvbihwbHVnaW4ubWluVmVyc2lvbiwgdGhpcy5sZXNzLnZlcnNpb24pIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZXNzRXJyb3Ioew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJQbHVnaW4gIiArIG5hbWUgKyAiIHJlcXVpcmVzIHZlcnNpb24gIiArIHRoaXMudmVyc2lvblRvU3RyaW5nKHBsdWdpbi5taW5WZXJzaW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9Ow0KICAgICAgICBBYnN0cmFjdFBsdWdpbkxvYWRlci5wcm90b3R5cGUuY29tcGFyZVZlcnNpb24gPSBmdW5jdGlvbiAoYVZlcnNpb24sIGJWZXJzaW9uKSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIGFWZXJzaW9uID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgIGFWZXJzaW9uID0gYVZlcnNpb24ubWF0Y2goL14oXGQrKVwuPyhcZCspP1wuPyhcZCspPy8pOw0KICAgICAgICAgICAgICAgIGFWZXJzaW9uLnNoaWZ0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFWZXJzaW9uLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKGFWZXJzaW9uW2ldICE9PSBiVmVyc2lvbltpXSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoYVZlcnNpb25baV0pID4gcGFyc2VJbnQoYlZlcnNpb25baV0pID8gLTEgOiAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9Ow0KICAgICAgICBBYnN0cmFjdFBsdWdpbkxvYWRlci5wcm90b3R5cGUudmVyc2lvblRvU3RyaW5nID0gZnVuY3Rpb24gKHZlcnNpb24pIHsNCiAgICAgICAgICAgIHZhciB2ZXJzaW9uU3RyaW5nID0gJyc7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnNpb24ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nICs9ICh2ZXJzaW9uU3RyaW5nID8gJy4nIDogJycpICsgdmVyc2lvbltpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uU3RyaW5nOw0KICAgICAgICB9Ow0KICAgICAgICBBYnN0cmFjdFBsdWdpbkxvYWRlci5wcm90b3R5cGUucHJpbnRVc2FnZSA9IGZ1bmN0aW9uIChwbHVnaW5zKSB7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgcGx1Z2luID0gcGx1Z2luc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnByaW50VXNhZ2UpIHsNCiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnByaW50VXNhZ2UoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHJldHVybiBBYnN0cmFjdFBsdWdpbkxvYWRlcjsNCiAgICB9KCkpOwoKICAgIHZhciBfdmlzaXRBcmdzID0geyB2aXNpdERlZXBlcjogdHJ1ZSB9Ow0KICAgIHZhciBfaGFzSW5kZXhlZCA9IGZhbHNlOw0KICAgIGZ1bmN0aW9uIF9ub29wKG5vZGUpIHsNCiAgICAgICAgcmV0dXJuIG5vZGU7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGluZGV4Tm9kZVR5cGVzKHBhcmVudCwgdGlja2VyKSB7DQogICAgICAgIC8vIGFkZCAudHlwZUluZGV4IHRvIHRyZWUgbm9kZSB0eXBlcyBmb3IgbG9va3VwIHRhYmxlDQogICAgICAgIHZhciBrZXksIGNoaWxkOw0KICAgICAgICBmb3IgKGtleSBpbiBwYXJlbnQpIHsNCiAgICAgICAgICAgIC8qIGVzbGludCBndWFyZC1mb3ItaW46IDAgKi8NCiAgICAgICAgICAgIGNoaWxkID0gcGFyZW50W2tleV07DQogICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBjaGlsZCkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoNCiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGJvdW5kIGZ1bmN0aW9ucyBkaXJlY3RseSBvbiB0cmVlIHdoaWNoIGRvIG5vdCBoYXZlIGEgcHJvdG90eXBlDQogICAgICAgICAgICAgICAgICAgIC8vIG9yIGFyZW4ndCBub2Rlcw0KICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQucHJvdG90eXBlICYmIGNoaWxkLnByb3RvdHlwZS50eXBlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm90b3R5cGUudHlwZUluZGV4ID0gdGlja2VyKys7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzoNCiAgICAgICAgICAgICAgICAgICAgdGlja2VyID0gaW5kZXhOb2RlVHlwZXMoY2hpbGQsIHRpY2tlcik7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aWNrZXI7DQogICAgfQ0KICAgIHZhciBWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgew0KICAgICAgICBmdW5jdGlvbiBWaXNpdG9yKGltcGxlbWVudGF0aW9uKSB7DQogICAgICAgICAgICB0aGlzLl9pbXBsZW1lbnRhdGlvbiA9IGltcGxlbWVudGF0aW9uOw0KICAgICAgICAgICAgdGhpcy5fdmlzaXRJbkNhY2hlID0ge307DQogICAgICAgICAgICB0aGlzLl92aXNpdE91dENhY2hlID0ge307DQogICAgICAgICAgICBpZiAoIV9oYXNJbmRleGVkKSB7DQogICAgICAgICAgICAgICAgaW5kZXhOb2RlVHlwZXModHJlZSwgMSk7DQogICAgICAgICAgICAgICAgX2hhc0luZGV4ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIFZpc2l0b3IucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKG5vZGUpIHsNCiAgICAgICAgICAgIGlmICghbm9kZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBub2RlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG5vZGVUeXBlSW5kZXggPSBub2RlLnR5cGVJbmRleDsNCiAgICAgICAgICAgIGlmICghbm9kZVR5cGVJbmRleCkgew0KICAgICAgICAgICAgICAgIC8vIE1peGluQ2FsbCBhcmdzIGFyZW4ndCBhIG5vZGUgdHlwZT8NCiAgICAgICAgICAgICAgICBpZiAobm9kZS52YWx1ZSAmJiBub2RlLnZhbHVlLnR5cGVJbmRleCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0KG5vZGUudmFsdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBpbXBsID0gdGhpcy5faW1wbGVtZW50YXRpb247DQogICAgICAgICAgICB2YXIgZnVuYyA9IHRoaXMuX3Zpc2l0SW5DYWNoZVtub2RlVHlwZUluZGV4XTsNCiAgICAgICAgICAgIHZhciBmdW5jT3V0ID0gdGhpcy5fdmlzaXRPdXRDYWNoZVtub2RlVHlwZUluZGV4XTsNCiAgICAgICAgICAgIHZhciB2aXNpdEFyZ3MgPSBfdmlzaXRBcmdzOw0KICAgICAgICAgICAgdmFyIGZuTmFtZTsNCiAgICAgICAgICAgIHZpc2l0QXJncy52aXNpdERlZXBlciA9IHRydWU7DQogICAgICAgICAgICBpZiAoIWZ1bmMpIHsNCiAgICAgICAgICAgICAgICBmbk5hbWUgPSAidmlzaXQiICsgbm9kZS50eXBlOw0KICAgICAgICAgICAgICAgIGZ1bmMgPSBpbXBsW2ZuTmFtZV0gfHwgX25vb3A7DQogICAgICAgICAgICAgICAgZnVuY091dCA9IGltcGxbZm5OYW1lICsgIk91dCJdIHx8IF9ub29wOw0KICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2l0SW5DYWNoZVtub2RlVHlwZUluZGV4XSA9IGZ1bmM7DQogICAgICAgICAgICAgICAgdGhpcy5fdmlzaXRPdXRDYWNoZVtub2RlVHlwZUluZGV4XSA9IGZ1bmNPdXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZnVuYyAhPT0gX25vb3ApIHsNCiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IGZ1bmMuY2FsbChpbXBsLCBub2RlLCB2aXNpdEFyZ3MpOw0KICAgICAgICAgICAgICAgIGlmIChub2RlICYmIGltcGwuaXNSZXBsYWNpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHZpc2l0QXJncy52aXNpdERlZXBlciAmJiBub2RlKSB7DQogICAgICAgICAgICAgICAgaWYgKG5vZGUubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBjbnQgPSBub2RlLmxlbmd0aDsgaSA8IGNudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVtpXS5hY2NlcHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlW2ldLmFjY2VwdCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmFjY2VwdCkgew0KICAgICAgICAgICAgICAgICAgICBub2RlLmFjY2VwdCh0aGlzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZnVuY091dCAhPSBfbm9vcCkgew0KICAgICAgICAgICAgICAgIGZ1bmNPdXQuY2FsbChpbXBsLCBub2RlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBub2RlOw0KICAgICAgICB9Ow0KICAgICAgICBWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFycmF5ID0gZnVuY3Rpb24gKG5vZGVzLCBub25SZXBsYWNpbmcpIHsNCiAgICAgICAgICAgIGlmICghbm9kZXMpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZXM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgY250ID0gbm9kZXMubGVuZ3RoOw0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICAvLyBOb24tcmVwbGFjaW5nDQogICAgICAgICAgICBpZiAobm9uUmVwbGFjaW5nIHx8ICF0aGlzLl9pbXBsZW1lbnRhdGlvbi5pc1JlcGxhY2luZykgew0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0KG5vZGVzW2ldKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVzOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gUmVwbGFjaW5nDQogICAgICAgICAgICB2YXIgb3V0ID0gW107DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXZhbGQgPSB0aGlzLnZpc2l0KG5vZGVzW2ldKTsNCiAgICAgICAgICAgICAgICBpZiAoZXZhbGQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCFldmFsZC5zcGxpY2UpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goZXZhbGQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChldmFsZC5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbGF0dGVuKGV2YWxkLCBvdXQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBvdXQ7DQogICAgICAgIH07DQogICAgICAgIFZpc2l0b3IucHJvdG90eXBlLmZsYXR0ZW4gPSBmdW5jdGlvbiAoYXJyLCBvdXQpIHsNCiAgICAgICAgICAgIGlmICghb3V0KSB7DQogICAgICAgICAgICAgICAgb3V0ID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgY250LCBpLCBpdGVtLCBuZXN0ZWRDbnQsIGosIG5lc3RlZEl0ZW07DQogICAgICAgICAgICBmb3IgKGkgPSAwLCBjbnQgPSBhcnIubGVuZ3RoOyBpIDwgY250OyBpKyspIHsNCiAgICAgICAgICAgICAgICBpdGVtID0gYXJyW2ldOw0KICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghaXRlbS5zcGxpY2UpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goaXRlbSk7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBuZXN0ZWRDbnQgPSBpdGVtLmxlbmd0aDsgaiA8IG5lc3RlZENudDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgIG5lc3RlZEl0ZW0gPSBpdGVtW2pdOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkSXRlbSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZEl0ZW0uc3BsaWNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChuZXN0ZWRJdGVtKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXN0ZWRJdGVtLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbGF0dGVuKG5lc3RlZEl0ZW0sIG91dCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gb3V0Ow0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4gVmlzaXRvcjsNCiAgICB9KCkpOwoKICAgIHZhciBJbXBvcnRTZXF1ZW5jZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7DQogICAgICAgIGZ1bmN0aW9uIEltcG9ydFNlcXVlbmNlcihvblNlcXVlbmNlckVtcHR5KSB7DQogICAgICAgICAgICB0aGlzLmltcG9ydHMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMudmFyaWFibGVJbXBvcnRzID0gW107DQogICAgICAgICAgICB0aGlzLl9vblNlcXVlbmNlckVtcHR5ID0gb25TZXF1ZW5jZXJFbXB0eTsNCiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnREZXB0aCA9IDA7DQogICAgICAgIH0NCiAgICAgICAgSW1wb3J0U2VxdWVuY2VyLnByb3RvdHlwZS5hZGRJbXBvcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIHZhciBpbXBvcnRTZXF1ZW5jZXIgPSB0aGlzLCBpbXBvcnRJdGVtID0gew0KICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjaywNCiAgICAgICAgICAgICAgICBhcmdzOiBudWxsLA0KICAgICAgICAgICAgICAgIGlzUmVhZHk6IGZhbHNlDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdGhpcy5pbXBvcnRzLnB1c2goaW1wb3J0SXRlbSk7DQogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIGltcG9ydEl0ZW0uYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7DQogICAgICAgICAgICAgICAgaW1wb3J0SXRlbS5pc1JlYWR5ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBpbXBvcnRTZXF1ZW5jZXIudHJ5UnVuKCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9Ow0KICAgICAgICBJbXBvcnRTZXF1ZW5jZXIucHJvdG90eXBlLmFkZFZhcmlhYmxlSW1wb3J0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7DQogICAgICAgICAgICB0aGlzLnZhcmlhYmxlSW1wb3J0cy5wdXNoKGNhbGxiYWNrKTsNCiAgICAgICAgfTsNCiAgICAgICAgSW1wb3J0U2VxdWVuY2VyLnByb3RvdHlwZS50cnlSdW4gPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLl9jdXJyZW50RGVwdGgrKzsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuaW1wb3J0cy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1wb3J0SXRlbSA9IHRoaXMuaW1wb3J0c1swXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW1wb3J0SXRlbS5pc1JlYWR5KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbXBvcnRzID0gdGhpcy5pbXBvcnRzLnNsaWNlKDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0SXRlbS5jYWxsYmFjay5hcHBseShudWxsLCBpbXBvcnRJdGVtLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhcmlhYmxlSW1wb3J0cy5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciB2YXJpYWJsZUltcG9ydCA9IHRoaXMudmFyaWFibGVJbXBvcnRzWzBdOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlSW1wb3J0cyA9IHRoaXMudmFyaWFibGVJbXBvcnRzLnNsaWNlKDEpOw0KICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUltcG9ydCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpbmFsbHkgew0KICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnREZXB0aC0tOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnREZXB0aCA9PT0gMCAmJiB0aGlzLl9vblNlcXVlbmNlckVtcHR5KSB7DQogICAgICAgICAgICAgICAgdGhpcy5fb25TZXF1ZW5jZXJFbXB0eSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4gSW1wb3J0U2VxdWVuY2VyOw0KICAgIH0oKSk7CgogICAgdmFyIEltcG9ydFZpc2l0b3IgPSBmdW5jdGlvbiAoaW1wb3J0ZXIsIGZpbmlzaCkgew0KICAgICAgICB0aGlzLl92aXNpdG9yID0gbmV3IFZpc2l0b3IodGhpcyk7DQogICAgICAgIHRoaXMuX2ltcG9ydGVyID0gaW1wb3J0ZXI7DQogICAgICAgIHRoaXMuX2ZpbmlzaCA9IGZpbmlzaDsNCiAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IGNvbnRleHRzLkV2YWwoKTsNCiAgICAgICAgdGhpcy5pbXBvcnRDb3VudCA9IDA7DQogICAgICAgIHRoaXMub25jZUZpbGVEZXRlY3Rpb25NYXAgPSB7fTsNCiAgICAgICAgdGhpcy5yZWN1cnNpb25EZXRlY3RvciA9IHt9Ow0KICAgICAgICB0aGlzLl9zZXF1ZW5jZXIgPSBuZXcgSW1wb3J0U2VxdWVuY2VyKHRoaXMuX29uU2VxdWVuY2VyRW1wdHkuYmluZCh0aGlzKSk7DQogICAgfTsNCiAgICBJbXBvcnRWaXNpdG9yLnByb3RvdHlwZSA9IHsNCiAgICAgICAgaXNSZXBsYWNpbmc6IGZhbHNlLA0KICAgICAgICBydW46IGZ1bmN0aW9uIChyb290KSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGNvbnRlbnRzDQogICAgICAgICAgICAgICAgdGhpcy5fdmlzaXRvci52aXNpdChyb290KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlOw0KICAgICAgICAgICAgdGhpcy5fc2VxdWVuY2VyLnRyeVJ1bigpOw0KICAgICAgICB9LA0KICAgICAgICBfb25TZXF1ZW5jZXJFbXB0eTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLmlzRmluaXNoZWQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLl9maW5pc2godGhpcy5lcnJvcik7DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0SW1wb3J0OiBmdW5jdGlvbiAoaW1wb3J0Tm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2YXIgaW5saW5lQ1NTID0gaW1wb3J0Tm9kZS5vcHRpb25zLmlubGluZTsNCiAgICAgICAgICAgIGlmICghaW1wb3J0Tm9kZS5jc3MgfHwgaW5saW5lQ1NTKSB7DQogICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgY29udGV4dHMuRXZhbCh0aGlzLmNvbnRleHQsIGNvcHlBcnJheSh0aGlzLmNvbnRleHQuZnJhbWVzKSk7DQogICAgICAgICAgICAgICAgdmFyIGltcG9ydFBhcmVudCA9IGNvbnRleHQuZnJhbWVzWzBdOw0KICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0Q291bnQrKzsNCiAgICAgICAgICAgICAgICBpZiAoaW1wb3J0Tm9kZS5pc1ZhcmlhYmxlSW1wb3J0KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VxdWVuY2VyLmFkZFZhcmlhYmxlSW1wb3J0KHRoaXMucHJvY2Vzc0ltcG9ydE5vZGUuYmluZCh0aGlzLCBpbXBvcnROb2RlLCBjb250ZXh0LCBpbXBvcnRQYXJlbnQpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ltcG9ydE5vZGUoaW1wb3J0Tm9kZSwgY29udGV4dCwgaW1wb3J0UGFyZW50KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2aXNpdEFyZ3MudmlzaXREZWVwZXIgPSBmYWxzZTsNCiAgICAgICAgfSwNCiAgICAgICAgcHJvY2Vzc0ltcG9ydE5vZGU6IGZ1bmN0aW9uIChpbXBvcnROb2RlLCBjb250ZXh0LCBpbXBvcnRQYXJlbnQpIHsNCiAgICAgICAgICAgIHZhciBldmFsZEltcG9ydE5vZGU7DQogICAgICAgICAgICB2YXIgaW5saW5lQ1NTID0gaW1wb3J0Tm9kZS5vcHRpb25zLmlubGluZTsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgZXZhbGRJbXBvcnROb2RlID0gaW1wb3J0Tm9kZS5ldmFsRm9ySW1wb3J0KGNvbnRleHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoIWUuZmlsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgZS5pbmRleCA9IGltcG9ydE5vZGUuZ2V0SW5kZXgoKTsNCiAgICAgICAgICAgICAgICAgICAgZS5maWxlbmFtZSA9IGltcG9ydE5vZGUuZmlsZUluZm8oKS5maWxlbmFtZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBldmFsIHByb3Blcmx5IGFuZCB0cmVhdCBhcyBjc3MNCiAgICAgICAgICAgICAgICBpbXBvcnROb2RlLmNzcyA9IHRydWU7DQogICAgICAgICAgICAgICAgLy8gaWYgdGhhdCBmYWlscywgdGhpcyBlcnJvciB3aWxsIGJlIHRocm93bg0KICAgICAgICAgICAgICAgIGltcG9ydE5vZGUuZXJyb3IgPSBlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGV2YWxkSW1wb3J0Tm9kZSAmJiAoIWV2YWxkSW1wb3J0Tm9kZS5jc3MgfHwgaW5saW5lQ1NTKSkgew0KICAgICAgICAgICAgICAgIGlmIChldmFsZEltcG9ydE5vZGUub3B0aW9ucy5tdWx0aXBsZSkgew0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmltcG9ydE11bHRpcGxlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gdHJ5IGFwcGVuZGluZyBpZiB3ZSBoYXZlbid0IGRldGVybWluZWQgaWYgaXQgaXMgY3NzIG9yIG5vdA0KICAgICAgICAgICAgICAgIHZhciB0cnlBcHBlbmRMZXNzRXh0ZW5zaW9uID0gZXZhbGRJbXBvcnROb2RlLmNzcyA9PT0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1wb3J0UGFyZW50LnJ1bGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRQYXJlbnQucnVsZXNbaV0gPT09IGltcG9ydE5vZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFBhcmVudC5ydWxlc1tpXSA9IGV2YWxkSW1wb3J0Tm9kZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBvbkltcG9ydGVkID0gdGhpcy5vbkltcG9ydGVkLmJpbmQodGhpcywgZXZhbGRJbXBvcnROb2RlLCBjb250ZXh0KSwgc2VxdWVuY2VkT25JbXBvcnRlZCA9IHRoaXMuX3NlcXVlbmNlci5hZGRJbXBvcnQob25JbXBvcnRlZCk7DQogICAgICAgICAgICAgICAgdGhpcy5faW1wb3J0ZXIucHVzaChldmFsZEltcG9ydE5vZGUuZ2V0UGF0aCgpLCB0cnlBcHBlbmRMZXNzRXh0ZW5zaW9uLCBldmFsZEltcG9ydE5vZGUuZmlsZUluZm8oKSwgZXZhbGRJbXBvcnROb2RlLm9wdGlvbnMsIHNlcXVlbmNlZE9uSW1wb3J0ZWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5pbXBvcnRDb3VudC0tOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRmluaXNoZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VxdWVuY2VyLnRyeVJ1bigpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgb25JbXBvcnRlZDogZnVuY3Rpb24gKGltcG9ydE5vZGUsIGNvbnRleHQsIGUsIHJvb3QsIGltcG9ydGVkQXRSb290LCBmdWxsUGF0aCkgew0KICAgICAgICAgICAgaWYgKGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoIWUuZmlsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgZS5pbmRleCA9IGltcG9ydE5vZGUuZ2V0SW5kZXgoKTsNCiAgICAgICAgICAgICAgICAgICAgZS5maWxlbmFtZSA9IGltcG9ydE5vZGUuZmlsZUluZm8oKS5maWxlbmFtZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgaW1wb3J0VmlzaXRvciA9IHRoaXMsIGlubGluZUNTUyA9IGltcG9ydE5vZGUub3B0aW9ucy5pbmxpbmUsIGlzUGx1Z2luID0gaW1wb3J0Tm9kZS5vcHRpb25zLmlzUGx1Z2luLCBpc09wdGlvbmFsID0gaW1wb3J0Tm9kZS5vcHRpb25zLm9wdGlvbmFsLCBkdXBsaWNhdGVJbXBvcnQgPSBpbXBvcnRlZEF0Um9vdCB8fCBmdWxsUGF0aCBpbiBpbXBvcnRWaXNpdG9yLnJlY3Vyc2lvbkRldGVjdG9yOw0KICAgICAgICAgICAgaWYgKCFjb250ZXh0LmltcG9ydE11bHRpcGxlKSB7DQogICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZUltcG9ydCkgew0KICAgICAgICAgICAgICAgICAgICBpbXBvcnROb2RlLnNraXAgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0Tm9kZS5za2lwID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxQYXRoIGluIGltcG9ydFZpc2l0b3Iub25jZUZpbGVEZXRlY3Rpb25NYXApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFZpc2l0b3Iub25jZUZpbGVEZXRlY3Rpb25NYXBbZnVsbFBhdGhdID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIWZ1bGxQYXRoICYmIGlzT3B0aW9uYWwpIHsNCiAgICAgICAgICAgICAgICBpbXBvcnROb2RlLnNraXAgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJvb3QpIHsNCiAgICAgICAgICAgICAgICBpbXBvcnROb2RlLnJvb3QgPSByb290Ow0KICAgICAgICAgICAgICAgIGltcG9ydE5vZGUuaW1wb3J0ZWRGaWxlbmFtZSA9IGZ1bGxQYXRoOw0KICAgICAgICAgICAgICAgIGlmICghaW5saW5lQ1NTICYmICFpc1BsdWdpbiAmJiAoY29udGV4dC5pbXBvcnRNdWx0aXBsZSB8fCAhZHVwbGljYXRlSW1wb3J0KSkgew0KICAgICAgICAgICAgICAgICAgICBpbXBvcnRWaXNpdG9yLnJlY3Vyc2lvbkRldGVjdG9yW2Z1bGxQYXRoXSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIHZhciBvbGRDb250ZXh0ID0gdGhpcy5jb250ZXh0Ow0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Ow0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlzaXRvci52aXNpdChyb290KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gb2xkQ29udGV4dDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpbXBvcnRWaXNpdG9yLmltcG9ydENvdW50LS07DQogICAgICAgICAgICBpZiAoaW1wb3J0VmlzaXRvci5pc0ZpbmlzaGVkKSB7DQogICAgICAgICAgICAgICAgaW1wb3J0VmlzaXRvci5fc2VxdWVuY2VyLnRyeVJ1bigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICB2aXNpdERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoZGVjbE5vZGUsIHZpc2l0QXJncykgew0KICAgICAgICAgICAgaWYgKGRlY2xOb2RlLnZhbHVlLnR5cGUgPT09ICdEZXRhY2hlZFJ1bGVzZXQnKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZyYW1lcy51bnNoaWZ0KGRlY2xOb2RlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHZpc2l0QXJncy52aXNpdERlZXBlciA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICB2aXNpdERlY2xhcmF0aW9uT3V0OiBmdW5jdGlvbiAoZGVjbE5vZGUpIHsNCiAgICAgICAgICAgIGlmIChkZWNsTm9kZS52YWx1ZS50eXBlID09PSAnRGV0YWNoZWRSdWxlc2V0Jykgew0KICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5mcmFtZXMuc2hpZnQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgdmlzaXRBdFJ1bGU6IGZ1bmN0aW9uIChhdFJ1bGVOb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIHRoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChhdFJ1bGVOb2RlKTsNCiAgICAgICAgfSwNCiAgICAgICAgdmlzaXRBdFJ1bGVPdXQ6IGZ1bmN0aW9uIChhdFJ1bGVOb2RlKSB7DQogICAgICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCk7DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0TWl4aW5EZWZpbml0aW9uOiBmdW5jdGlvbiAobWl4aW5EZWZpbml0aW9uTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVzLnVuc2hpZnQobWl4aW5EZWZpbml0aW9uTm9kZSk7DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0TWl4aW5EZWZpbml0aW9uT3V0OiBmdW5jdGlvbiAobWl4aW5EZWZpbml0aW9uTm9kZSkgew0KICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZyYW1lcy5zaGlmdCgpOw0KICAgICAgICB9LA0KICAgICAgICB2aXNpdFJ1bGVzZXQ6IGZ1bmN0aW9uIChydWxlc2V0Tm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVzLnVuc2hpZnQocnVsZXNldE5vZGUpOw0KICAgICAgICB9LA0KICAgICAgICB2aXNpdFJ1bGVzZXRPdXQ6IGZ1bmN0aW9uIChydWxlc2V0Tm9kZSkgew0KICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZyYW1lcy5zaGlmdCgpOw0KICAgICAgICB9LA0KICAgICAgICB2aXNpdE1lZGlhOiBmdW5jdGlvbiAobWVkaWFOb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIHRoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChtZWRpYU5vZGUucnVsZXNbMF0pOw0KICAgICAgICB9LA0KICAgICAgICB2aXNpdE1lZGlhT3V0OiBmdW5jdGlvbiAobWVkaWFOb2RlKSB7DQogICAgICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCk7DQogICAgICAgIH0NCiAgICB9OwoKICAgIHZhciBTZXRUcmVlVmlzaWJpbGl0eVZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7DQogICAgICAgIGZ1bmN0aW9uIFNldFRyZWVWaXNpYmlsaXR5VmlzaXRvcih2aXNpYmxlKSB7DQogICAgICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlOw0KICAgICAgICB9DQogICAgICAgIFNldFRyZWVWaXNpYmlsaXR5VmlzaXRvci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHJvb3QpIHsNCiAgICAgICAgICAgIHRoaXMudmlzaXQocm9vdCk7DQogICAgICAgIH07DQogICAgICAgIFNldFRyZWVWaXNpYmlsaXR5VmlzaXRvci5wcm90b3R5cGUudmlzaXRBcnJheSA9IGZ1bmN0aW9uIChub2Rlcykgew0KICAgICAgICAgICAgaWYgKCFub2Rlcykgew0KICAgICAgICAgICAgICAgIHJldHVybiBub2RlczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBjbnQgPSBub2Rlcy5sZW5ndGg7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgew0KICAgICAgICAgICAgICAgIHRoaXMudmlzaXQobm9kZXNbaV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5vZGVzOw0KICAgICAgICB9Ow0KICAgICAgICBTZXRUcmVlVmlzaWJpbGl0eVZpc2l0b3IucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKG5vZGUpIHsNCiAgICAgICAgICAgIGlmICghbm9kZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBub2RlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5vZGUuY29uc3RydWN0b3IgPT09IEFycmF5KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRBcnJheShub2RlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghbm9kZS5ibG9ja3NWaXNpYmlsaXR5IHx8IG5vZGUuYmxvY2tzVmlzaWJpbGl0eSgpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy52aXNpYmxlKSB7DQogICAgICAgICAgICAgICAgbm9kZS5lbnN1cmVWaXNpYmlsaXR5KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBub2RlLmVuc3VyZUludmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbm9kZS5hY2NlcHQodGhpcyk7DQogICAgICAgICAgICByZXR1cm4gbm9kZTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIFNldFRyZWVWaXNpYmlsaXR5VmlzaXRvcjsNCiAgICB9KCkpOwoKICAgIC8qIGpzaGludCBsb29wZnVuYzp0cnVlICovDQogICAgdmFyIEV4dGVuZEZpbmRlclZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7DQogICAgICAgIGZ1bmN0aW9uIEV4dGVuZEZpbmRlclZpc2l0b3IoKSB7DQogICAgICAgICAgICB0aGlzLl92aXNpdG9yID0gbmV3IFZpc2l0b3IodGhpcyk7DQogICAgICAgICAgICB0aGlzLmNvbnRleHRzID0gW107DQogICAgICAgICAgICB0aGlzLmFsbEV4dGVuZHNTdGFjayA9IFtbXV07DQogICAgICAgIH0NCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHJvb3QpIHsNCiAgICAgICAgICAgIHJvb3QgPSB0aGlzLl92aXNpdG9yLnZpc2l0KHJvb3QpOw0KICAgICAgICAgICAgcm9vdC5hbGxFeHRlbmRzID0gdGhpcy5hbGxFeHRlbmRzU3RhY2tbMF07DQogICAgICAgICAgICByZXR1cm4gcm9vdDsNCiAgICAgICAgfTsNCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChkZWNsTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2aXNpdEFyZ3MudmlzaXREZWVwZXIgPSBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRNaXhpbkRlZmluaXRpb24gPSBmdW5jdGlvbiAobWl4aW5EZWZpbml0aW9uTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2aXNpdEFyZ3MudmlzaXREZWVwZXIgPSBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRSdWxlc2V0ID0gZnVuY3Rpb24gKHJ1bGVzZXROb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIGlmIChydWxlc2V0Tm9kZS5yb290KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICB2YXIgajsNCiAgICAgICAgICAgIHZhciBleHRlbmQ7DQogICAgICAgICAgICB2YXIgYWxsU2VsZWN0b3JzRXh0ZW5kTGlzdCA9IFtdOw0KICAgICAgICAgICAgdmFyIGV4dGVuZExpc3Q7DQogICAgICAgICAgICAvLyBnZXQgJjpleHRlbmQoLmEpOyBydWxlcyB3aGljaCBhcHBseSB0byBhbGwgc2VsZWN0b3JzIGluIHRoaXMgcnVsZXNldA0KICAgICAgICAgICAgdmFyIHJ1bGVzID0gcnVsZXNldE5vZGUucnVsZXMsIHJ1bGVDbnQgPSBydWxlcyA/IHJ1bGVzLmxlbmd0aCA6IDA7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnVsZUNudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHJ1bGVzZXROb2RlLnJ1bGVzW2ldIGluc3RhbmNlb2YgdHJlZS5FeHRlbmQpIHsNCiAgICAgICAgICAgICAgICAgICAgYWxsU2VsZWN0b3JzRXh0ZW5kTGlzdC5wdXNoKHJ1bGVzW2ldKTsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXNldE5vZGUuZXh0ZW5kT25FdmVyeVBhdGggPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIG5vdyBmaW5kIGV2ZXJ5IHNlbGVjdG9yIGFuZCBhcHBseSB0aGUgZXh0ZW5kcyB0aGF0IGFwcGx5IHRvIGFsbCBleHRlbmRzDQogICAgICAgICAgICAvLyBhbmQgdGhlIG9uZXMgd2hpY2ggYXBwbHkgdG8gYW4gaW5kaXZpZHVhbCBleHRlbmQNCiAgICAgICAgICAgIHZhciBwYXRocyA9IHJ1bGVzZXROb2RlLnBhdGhzOw0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yUGF0aCA9IHBhdGhzW2ldLCBzZWxlY3RvciA9IHNlbGVjdG9yUGF0aFtzZWxlY3RvclBhdGgubGVuZ3RoIC0gMV0sIHNlbEV4dGVuZExpc3QgPSBzZWxlY3Rvci5leHRlbmRMaXN0Ow0KICAgICAgICAgICAgICAgIGV4dGVuZExpc3QgPSBzZWxFeHRlbmRMaXN0ID8gY29weUFycmF5KHNlbEV4dGVuZExpc3QpLmNvbmNhdChhbGxTZWxlY3RvcnNFeHRlbmRMaXN0KQ0KICAgICAgICAgICAgICAgICAgICA6IGFsbFNlbGVjdG9yc0V4dGVuZExpc3Q7DQogICAgICAgICAgICAgICAgaWYgKGV4dGVuZExpc3QpIHsNCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kTGlzdCA9IGV4dGVuZExpc3QubWFwKGZ1bmN0aW9uIChhbGxTZWxlY3RvcnNFeHRlbmQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxTZWxlY3RvcnNFeHRlbmQuY2xvbmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBleHRlbmRMaXN0Lmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZm91bmRFeHRlbmRzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kID0gZXh0ZW5kTGlzdFtqXTsNCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmZpbmRTZWxmU2VsZWN0b3JzKHNlbGVjdG9yUGF0aCk7DQogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5ydWxlc2V0ID0gcnVsZXNldE5vZGU7DQogICAgICAgICAgICAgICAgICAgIGlmIChqID09PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQuZmlyc3RFeHRlbmRPblRoaXNTZWxlY3RvclBhdGggPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsRXh0ZW5kc1N0YWNrW3RoaXMuYWxsRXh0ZW5kc1N0YWNrLmxlbmd0aCAtIDFdLnB1c2goZXh0ZW5kKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmNvbnRleHRzLnB1c2gocnVsZXNldE5vZGUuc2VsZWN0b3JzKTsNCiAgICAgICAgfTsNCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRSdWxlc2V0T3V0ID0gZnVuY3Rpb24gKHJ1bGVzZXROb2RlKSB7DQogICAgICAgICAgICBpZiAoIXJ1bGVzZXROb2RlLnJvb3QpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRzLmxlbmd0aCA9IHRoaXMuY29udGV4dHMubGVuZ3RoIC0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRNZWRpYSA9IGZ1bmN0aW9uIChtZWRpYU5vZGUsIHZpc2l0QXJncykgew0KICAgICAgICAgICAgbWVkaWFOb2RlLmFsbEV4dGVuZHMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2gobWVkaWFOb2RlLmFsbEV4dGVuZHMpOw0KICAgICAgICB9Ow0KICAgICAgICBFeHRlbmRGaW5kZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdE1lZGlhT3V0ID0gZnVuY3Rpb24gKG1lZGlhTm9kZSkgew0KICAgICAgICAgICAgdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoID0gdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoIC0gMTsNCiAgICAgICAgfTsNCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdFJ1bGUgPSBmdW5jdGlvbiAoYXRSdWxlTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICBhdFJ1bGVOb2RlLmFsbEV4dGVuZHMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2goYXRSdWxlTm9kZS5hbGxFeHRlbmRzKTsNCiAgICAgICAgfTsNCiAgICAgICAgRXh0ZW5kRmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdFJ1bGVPdXQgPSBmdW5jdGlvbiAoYXRSdWxlTm9kZSkgew0KICAgICAgICAgICAgdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoID0gdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoIC0gMTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIEV4dGVuZEZpbmRlclZpc2l0b3I7DQogICAgfSgpKTsNCiAgICB2YXIgUHJvY2Vzc0V4dGVuZHNWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgew0KICAgICAgICBmdW5jdGlvbiBQcm9jZXNzRXh0ZW5kc1Zpc2l0b3IoKSB7DQogICAgICAgICAgICB0aGlzLl92aXNpdG9yID0gbmV3IFZpc2l0b3IodGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgUHJvY2Vzc0V4dGVuZHNWaXNpdG9yLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAocm9vdCkgew0KICAgICAgICAgICAgdmFyIGV4dGVuZEZpbmRlciA9IG5ldyBFeHRlbmRGaW5kZXJWaXNpdG9yKCk7DQogICAgICAgICAgICB0aGlzLmV4dGVuZEluZGljZXMgPSB7fTsNCiAgICAgICAgICAgIGV4dGVuZEZpbmRlci5ydW4ocm9vdCk7DQogICAgICAgICAgICBpZiAoIWV4dGVuZEZpbmRlci5mb3VuZEV4dGVuZHMpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJvb3QuYWxsRXh0ZW5kcyA9IHJvb3QuYWxsRXh0ZW5kcy5jb25jYXQodGhpcy5kb0V4dGVuZENoYWluaW5nKHJvb3QuYWxsRXh0ZW5kcywgcm9vdC5hbGxFeHRlbmRzKSk7DQogICAgICAgICAgICB0aGlzLmFsbEV4dGVuZHNTdGFjayA9IFtyb290LmFsbEV4dGVuZHNdOw0KICAgICAgICAgICAgdmFyIG5ld1Jvb3QgPSB0aGlzLl92aXNpdG9yLnZpc2l0KHJvb3QpOw0KICAgICAgICAgICAgdGhpcy5jaGVja0V4dGVuZHNGb3JOb25NYXRjaGVkKHJvb3QuYWxsRXh0ZW5kcyk7DQogICAgICAgICAgICByZXR1cm4gbmV3Um9vdDsNCiAgICAgICAgfTsNCiAgICAgICAgUHJvY2Vzc0V4dGVuZHNWaXNpdG9yLnByb3RvdHlwZS5jaGVja0V4dGVuZHNGb3JOb25NYXRjaGVkID0gZnVuY3Rpb24gKGV4dGVuZExpc3QpIHsNCiAgICAgICAgICAgIHZhciBpbmRpY2VzID0gdGhpcy5leHRlbmRJbmRpY2VzOw0KICAgICAgICAgICAgZXh0ZW5kTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGV4dGVuZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAhZXh0ZW5kLmhhc0ZvdW5kTWF0Y2hlcyAmJiBleHRlbmQucGFyZW50X2lkcy5sZW5ndGggPT0gMTsNCiAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGV4dGVuZCkgew0KICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9ICdfdW5rbm93bl8nOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gZXh0ZW5kLnNlbGVjdG9yLnRvQ1NTKHt9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfQ0KICAgICAgICAgICAgICAgIGlmICghaW5kaWNlc1tleHRlbmQuaW5kZXggKyAiICIgKyBzZWxlY3Rvcl0pIHsNCiAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tleHRlbmQuaW5kZXggKyAiICIgKyBzZWxlY3Rvcl0gPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICBsb2dnZXIkMS53YXJuKCJleHRlbmQgJyIgKyBzZWxlY3RvciArICInIGhhcyBubyBtYXRjaGVzIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIFByb2Nlc3NFeHRlbmRzVmlzaXRvci5wcm90b3R5cGUuZG9FeHRlbmRDaGFpbmluZyA9IGZ1bmN0aW9uIChleHRlbmRzTGlzdCwgZXh0ZW5kc0xpc3RUYXJnZXQsIGl0ZXJhdGlvbkNvdW50KSB7DQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgLy8gY2hhaW5pbmcgaXMgZGlmZmVyZW50IGZyb20gbm9ybWFsIGV4dGVuc2lvbi4uIGlmIHdlIGV4dGVuZCBhbiBleHRlbmQgdGhlbiB3ZSBhcmUgbm90IGp1c3QgY29weWluZywgYWx0ZXJpbmcNCiAgICAgICAgICAgIC8vIGFuZCBwYXN0aW5nIHRoZSBzZWxlY3RvciB3ZSB3b3VsZCBkbyBub3JtYWxseSwgYnV0IHdlIGFyZSBhbHNvIGFkZGluZyBhbiBleHRlbmQgd2l0aCB0aGUgc2FtZSB0YXJnZXQgc2VsZWN0b3INCiAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhpcyBuZXcgZXh0ZW5kIGNhbiB0aGVuIGdvIGFuZCBhbHRlciBvdGhlciBleHRlbmRzDQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgLy8gdGhpcyBtZXRob2QgZGVhbHMgd2l0aCBhbGwgdGhlIGNoYWluaW5nIHdvcmsgLSB3aXRob3V0IGl0LCBleHRlbmQgaXMgZmxhdCBhbmQgZG9lc24ndCB3b3JrIG9uIG90aGVyIGV4dGVuZCBzZWxlY3RvcnMNCiAgICAgICAgICAgIC8vIHRoaXMgaXMgYWxzbyB0aGUgbW9zdCBleHBlbnNpdmUuLiBhbmQgYSBtYXRjaCBvbiBvbmUgc2VsZWN0b3IgY2FuIGNhdXNlIGFuIGV4dGVuc2lvbiBvZiBhIHNlbGVjdG9yIHdlIGhhZCBhbHJlYWR5DQogICAgICAgICAgICAvLyBwcm9jZXNzZWQgaWYgd2UgbG9vayBhdCBlYWNoIHNlbGVjdG9yIGF0IGEgdGltZSwgYXMgaXMgZG9uZSBpbiB2aXNpdFJ1bGVzZXQNCiAgICAgICAgICAgIHZhciBleHRlbmRJbmRleDsNCiAgICAgICAgICAgIHZhciB0YXJnZXRFeHRlbmRJbmRleDsNCiAgICAgICAgICAgIHZhciBtYXRjaGVzOw0KICAgICAgICAgICAgdmFyIGV4dGVuZHNUb0FkZCA9IFtdOw0KICAgICAgICAgICAgdmFyIG5ld1NlbGVjdG9yOw0KICAgICAgICAgICAgdmFyIGV4dGVuZFZpc2l0b3IgPSB0aGlzOw0KICAgICAgICAgICAgdmFyIHNlbGVjdG9yUGF0aDsNCiAgICAgICAgICAgIHZhciBleHRlbmQ7DQogICAgICAgICAgICB2YXIgdGFyZ2V0RXh0ZW5kOw0KICAgICAgICAgICAgdmFyIG5ld0V4dGVuZDsNCiAgICAgICAgICAgIGl0ZXJhdGlvbkNvdW50ID0gaXRlcmF0aW9uQ291bnQgfHwgMDsNCiAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBjb21wYXJpbmcgZXZlcnkgZXh0ZW5kIHdpdGggZXZlcnkgdGFyZ2V0IGV4dGVuZC4NCiAgICAgICAgICAgIC8vIGEgdGFyZ2V0IGV4dGVuZCBpcyB0aGUgb25lIG9uIHRoZSBydWxlc2V0IHdlIGFyZSBsb29raW5nIGF0IGNvcHkvZWRpdC9wYXN0aW5nIGluIHBsYWNlDQogICAgICAgICAgICAvLyBlLmcuICAuYTpleHRlbmQoLmIpIHt9ICBhbmQgLmI6ZXh0ZW5kKC5jKSB7fSB0aGVuIHRoZSBmaXJzdCBleHRlbmQgZXh0ZW5kcyB0aGUgc2Vjb25kIG9uZQ0KICAgICAgICAgICAgLy8gYW5kIHRoZSBzZWNvbmQgaXMgdGhlIHRhcmdldC4NCiAgICAgICAgICAgIC8vIHRoZSBzZXBhcmF0aW9uIGludG8gdHdvIGxpc3RzIGFsbG93cyB1cyB0byBwcm9jZXNzIGEgc3Vic2V0IG9mIGNoYWlucyB3aXRoIGEgYmlnZ2VyIHNldCwgYXMgaXMgdGhlDQogICAgICAgICAgICAvLyBjYXNlIHdoZW4gcHJvY2Vzc2luZyBtZWRpYSBxdWVyaWVzDQogICAgICAgICAgICBmb3IgKGV4dGVuZEluZGV4ID0gMDsgZXh0ZW5kSW5kZXggPCBleHRlbmRzTGlzdC5sZW5ndGg7IGV4dGVuZEluZGV4KyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKHRhcmdldEV4dGVuZEluZGV4ID0gMDsgdGFyZ2V0RXh0ZW5kSW5kZXggPCBleHRlbmRzTGlzdFRhcmdldC5sZW5ndGg7IHRhcmdldEV4dGVuZEluZGV4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kID0gZXh0ZW5kc0xpc3RbZXh0ZW5kSW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICB0YXJnZXRFeHRlbmQgPSBleHRlbmRzTGlzdFRhcmdldFt0YXJnZXRFeHRlbmRJbmRleF07DQogICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMNCiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuZC5wYXJlbnRfaWRzLmluZGV4T2YodGFyZ2V0RXh0ZW5kLm9iamVjdF9pZCkgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBhIG1hdGNoIGluIHRoZSB0YXJnZXQgZXh0ZW5kcyBzZWxmIHNlbGVjdG9yICh0aGUgYml0IGJlZm9yZSA6ZXh0ZW5kKQ0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvclBhdGggPSBbdGFyZ2V0RXh0ZW5kLnNlbGZTZWxlY3RvcnNbMF1dOw0KICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gZXh0ZW5kVmlzaXRvci5maW5kTWF0Y2goZXh0ZW5kLCBzZWxlY3RvclBhdGgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZC5oYXNGb3VuZE1hdGNoZXMgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZm91bmQgYSBtYXRjaCwgc28gZm9yIGVhY2ggc2VsZiBzZWxlY3Rvci4uDQogICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQuc2VsZlNlbGVjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChzZWxmU2VsZWN0b3IpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHRhcmdldEV4dGVuZC52aXNpYmlsaXR5SW5mbygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGV4dGVuZCBhcyB1c3VhbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9yID0gZXh0ZW5kVmlzaXRvci5leHRlbmRTZWxlY3RvcihtYXRjaGVzLCBzZWxlY3RvclBhdGgsIHNlbGZTZWxlY3RvciwgZXh0ZW5kLmlzVmlzaWJsZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbm93IHdlIGNyZWF0ZSBhIG5ldyBleHRlbmQgZnJvbSBpdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V4dGVuZCA9IG5ldyAodHJlZS5FeHRlbmQpKHRhcmdldEV4dGVuZC5zZWxlY3RvciwgdGFyZ2V0RXh0ZW5kLm9wdGlvbiwgMCwgdGFyZ2V0RXh0ZW5kLmZpbGVJbmZvKCksIGluZm8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V4dGVuZC5zZWxmU2VsZWN0b3JzID0gbmV3U2VsZWN0b3I7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBleHRlbmQgb250byB0aGUgbGlzdCBvZiBleHRlbmRzIGZvciB0aGF0IHNlbGVjdG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VsZWN0b3JbbmV3U2VsZWN0b3IubGVuZ3RoIC0gMV0uZXh0ZW5kTGlzdCA9IFtuZXdFeHRlbmRdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0aGF0IHdlIG5lZWQgdG8gYWRkIGl0Lg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHNUb0FkZC5wdXNoKG5ld0V4dGVuZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXh0ZW5kLnJ1bGVzZXQgPSB0YXJnZXRFeHRlbmQucnVsZXNldDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBpdHMgcGFyZW50cyBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V4dGVuZC5wYXJlbnRfaWRzID0gbmV3RXh0ZW5kLnBhcmVudF9pZHMuY29uY2F0KHRhcmdldEV4dGVuZC5wYXJlbnRfaWRzLCBleHRlbmQucGFyZW50X2lkcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHRoZSBzZWxlY3RvciBvbmNlLi4gaWYgd2UgaGF2ZSA6ZXh0ZW5kKC5hLC5iKSB0aGVuIG11bHRpcGxlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kcyB3aWxsIGxvb2sgYXQgdGhlIHNhbWUgc2VsZWN0b3IgcGF0aCwgc28gd2hlbiBleHRlbmRpbmcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IHRoYXQgYW55IG90aGVycyB3aWxsIGJlIGR1cGxpY2F0ZXMgaW4gdGVybXMgb2Ygd2hhdCBpcyBhZGRlZCB0byB0aGUgY3NzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEV4dGVuZC5maXJzdEV4dGVuZE9uVGhpc1NlbGVjdG9yUGF0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFeHRlbmQuZmlyc3RFeHRlbmRPblRoaXNTZWxlY3RvclBhdGggPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFeHRlbmQucnVsZXNldC5wYXRocy5wdXNoKG5ld1NlbGVjdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChleHRlbmRzVG9BZGQubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGRldGVjdCBjaXJjdWxhciByZWZlcmVuY2VzIHRvIHN0b3AgYSBzdGFjayBvdmVyZmxvdy4NCiAgICAgICAgICAgICAgICAvLyBtYXkgbm8gbG9uZ2VyIGJlIG5lZWRlZC4NCiAgICAgICAgICAgICAgICB0aGlzLmV4dGVuZENoYWluQ291bnQrKzsNCiAgICAgICAgICAgICAgICBpZiAoaXRlcmF0aW9uQ291bnQgPiAxMDApIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yT25lID0gJ3t1bmFibGUgdG8gY2FsY3VsYXRlfSc7DQogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvclR3byA9ICd7dW5hYmxlIHRvIGNhbGN1bGF0ZX0nOw0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JPbmUgPSBleHRlbmRzVG9BZGRbMF0uc2VsZlNlbGVjdG9yc1swXS50b0NTUygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JUd28gPSBleHRlbmRzVG9BZGRbMF0uc2VsZWN0b3IudG9DU1MoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9DQogICAgICAgICAgICAgICAgICAgIHRocm93IHsgbWVzc2FnZTogImV4dGVuZCBjaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQuIE9uZSBvZiB0aGUgY2lyY3VsYXIgZXh0ZW5kcyBpcyBjdXJyZW50bHk6IiArIHNlbGVjdG9yT25lICsgIjpleHRlbmQoIiArIHNlbGVjdG9yVHdvICsgIikiIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIG5vdyBwcm9jZXNzIHRoZSBuZXcgZXh0ZW5kcyBvbiB0aGUgZXhpc3RpbmcgcnVsZXMgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGEgZXh0ZW5kaW5nIGIgZXh0ZW5kaW5nIGMgZXh0ZW5kaW5nDQogICAgICAgICAgICAgICAgLy8gZCBleHRlbmRpbmcgZS4uLg0KICAgICAgICAgICAgICAgIHJldHVybiBleHRlbmRzVG9BZGQuY29uY2F0KGV4dGVuZFZpc2l0b3IuZG9FeHRlbmRDaGFpbmluZyhleHRlbmRzVG9BZGQsIGV4dGVuZHNMaXN0VGFyZ2V0LCBpdGVyYXRpb25Db3VudCArIDEpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBleHRlbmRzVG9BZGQ7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIFByb2Nlc3NFeHRlbmRzVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChydWxlTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2aXNpdEFyZ3MudmlzaXREZWVwZXIgPSBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgUHJvY2Vzc0V4dGVuZHNWaXNpdG9yLnByb3RvdHlwZS52aXNpdE1peGluRGVmaW5pdGlvbiA9IGZ1bmN0aW9uIChtaXhpbkRlZmluaXRpb25Ob2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIHZpc2l0QXJncy52aXNpdERlZXBlciA9IGZhbHNlOw0KICAgICAgICB9Ow0KICAgICAgICBQcm9jZXNzRXh0ZW5kc1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0U2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3JOb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIHZpc2l0QXJncy52aXNpdERlZXBlciA9IGZhbHNlOw0KICAgICAgICB9Ow0KICAgICAgICBQcm9jZXNzRXh0ZW5kc1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0UnVsZXNldCA9IGZ1bmN0aW9uIChydWxlc2V0Tm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICBpZiAocnVsZXNldE5vZGUucm9vdCkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtYXRjaGVzOw0KICAgICAgICAgICAgdmFyIHBhdGhJbmRleDsNCiAgICAgICAgICAgIHZhciBleHRlbmRJbmRleDsNCiAgICAgICAgICAgIHZhciBhbGxFeHRlbmRzID0gdGhpcy5hbGxFeHRlbmRzU3RhY2tbdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoIC0gMV07DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzVG9BZGQgPSBbXTsNCiAgICAgICAgICAgIHZhciBleHRlbmRWaXNpdG9yID0gdGhpczsNCiAgICAgICAgICAgIHZhciBzZWxlY3RvclBhdGg7DQogICAgICAgICAgICAvLyBsb29rIGF0IGVhY2ggc2VsZWN0b3IgcGF0aCBpbiB0aGUgcnVsZXNldCwgZmluZCBhbnkgZXh0ZW5kIG1hdGNoZXMgYW5kIHRoZW4gY29weSwgZmluZCBhbmQgcmVwbGFjZQ0KICAgICAgICAgICAgZm9yIChleHRlbmRJbmRleCA9IDA7IGV4dGVuZEluZGV4IDwgYWxsRXh0ZW5kcy5sZW5ndGg7IGV4dGVuZEluZGV4KyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKHBhdGhJbmRleCA9IDA7IHBhdGhJbmRleCA8IHJ1bGVzZXROb2RlLnBhdGhzLmxlbmd0aDsgcGF0aEluZGV4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JQYXRoID0gcnVsZXNldE5vZGUucGF0aHNbcGF0aEluZGV4XTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIGV4dGVuZHMgaGFwcGVucyBpbml0aWFsbHksIGJlZm9yZSB0aGUgbWFpbiBwYXNzDQogICAgICAgICAgICAgICAgICAgIGlmIChydWxlc2V0Tm9kZS5leHRlbmRPbkV2ZXJ5UGF0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuZExpc3QgPSBzZWxlY3RvclBhdGhbc2VsZWN0b3JQYXRoLmxlbmd0aCAtIDFdLmV4dGVuZExpc3Q7DQogICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmRMaXN0ICYmIGV4dGVuZExpc3QubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gdGhpcy5maW5kTWF0Y2goYWxsRXh0ZW5kc1tleHRlbmRJbmRleF0sIHNlbGVjdG9yUGF0aCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYWxsRXh0ZW5kc1tleHRlbmRJbmRleF0uaGFzRm91bmRNYXRjaGVzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbEV4dGVuZHNbZXh0ZW5kSW5kZXhdLnNlbGZTZWxlY3RvcnMuZm9yRWFjaChmdW5jdGlvbiAoc2VsZlNlbGVjdG9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuZGVkU2VsZWN0b3JzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkU2VsZWN0b3JzID0gZXh0ZW5kVmlzaXRvci5leHRlbmRTZWxlY3RvcihtYXRjaGVzLCBzZWxlY3RvclBhdGgsIHNlbGZTZWxlY3RvciwgYWxsRXh0ZW5kc1tleHRlbmRJbmRleF0uaXNWaXNpYmxlKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yc1RvQWRkLnB1c2goZXh0ZW5kZWRTZWxlY3RvcnMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBydWxlc2V0Tm9kZS5wYXRocyA9IHJ1bGVzZXROb2RlLnBhdGhzLmNvbmNhdChzZWxlY3RvcnNUb0FkZCk7DQogICAgICAgIH07DQogICAgICAgIFByb2Nlc3NFeHRlbmRzVmlzaXRvci5wcm90b3R5cGUuZmluZE1hdGNoID0gZnVuY3Rpb24gKGV4dGVuZCwgaGF5c3RhY2tTZWxlY3RvclBhdGgpIHsNCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICAvLyBsb29rIHRocm91Z2ggdGhlIGhheXN0YWNrIHNlbGVjdG9yIHBhdGggdG8gdHJ5IGFuZCBmaW5kIHRoZSBuZWVkbGUgLSBleHRlbmQuc2VsZWN0b3INCiAgICAgICAgICAgIC8vIHJldHVybnMgYW4gYXJyYXkgb2Ygc2VsZWN0b3IgbWF0Y2hlcyB0aGF0IGNhbiB0aGVuIGJlIHJlcGxhY2VkDQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgdmFyIGhheXN0YWNrU2VsZWN0b3JJbmRleDsNCiAgICAgICAgICAgIHZhciBoYWNrc3RhY2tTZWxlY3RvcjsNCiAgICAgICAgICAgIHZhciBoYWNrc3RhY2tFbGVtZW50SW5kZXg7DQogICAgICAgICAgICB2YXIgaGF5c3RhY2tFbGVtZW50Ow0KICAgICAgICAgICAgdmFyIHRhcmdldENvbWJpbmF0b3I7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIHZhciBleHRlbmRWaXNpdG9yID0gdGhpczsNCiAgICAgICAgICAgIHZhciBuZWVkbGVFbGVtZW50cyA9IGV4dGVuZC5zZWxlY3Rvci5lbGVtZW50czsNCiAgICAgICAgICAgIHZhciBwb3RlbnRpYWxNYXRjaGVzID0gW107DQogICAgICAgICAgICB2YXIgcG90ZW50aWFsTWF0Y2g7DQogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdOw0KICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBoYXlzdGFjayBlbGVtZW50cw0KICAgICAgICAgICAgZm9yIChoYXlzdGFja1NlbGVjdG9ySW5kZXggPSAwOyBoYXlzdGFja1NlbGVjdG9ySW5kZXggPCBoYXlzdGFja1NlbGVjdG9yUGF0aC5sZW5ndGg7IGhheXN0YWNrU2VsZWN0b3JJbmRleCsrKSB7DQogICAgICAgICAgICAgICAgaGFja3N0YWNrU2VsZWN0b3IgPSBoYXlzdGFja1NlbGVjdG9yUGF0aFtoYXlzdGFja1NlbGVjdG9ySW5kZXhdOw0KICAgICAgICAgICAgICAgIGZvciAoaGFja3N0YWNrRWxlbWVudEluZGV4ID0gMDsgaGFja3N0YWNrRWxlbWVudEluZGV4IDwgaGFja3N0YWNrU2VsZWN0b3IuZWxlbWVudHMubGVuZ3RoOyBoYWNrc3RhY2tFbGVtZW50SW5kZXgrKykgew0KICAgICAgICAgICAgICAgICAgICBoYXlzdGFja0VsZW1lbnQgPSBoYWNrc3RhY2tTZWxlY3Rvci5lbGVtZW50c1toYWNrc3RhY2tFbGVtZW50SW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhbGxvdyBlbGVtZW50cyBiZWZvcmUgb3VyIG1hdGNoIHdlIGNhbiBhZGQgYSBwb3RlbnRpYWwgbWF0Y2ggZXZlcnkgdGltZS4gb3RoZXJ3aXNlIG9ubHkgYXQgdGhlIGZpcnN0IGVsZW1lbnQuDQogICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmQuYWxsb3dCZWZvcmUgfHwgKGhheXN0YWNrU2VsZWN0b3JJbmRleCA9PT0gMCAmJiBoYWNrc3RhY2tFbGVtZW50SW5kZXggPT09IDApKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxNYXRjaGVzLnB1c2goeyBwYXRoSW5kZXg6IGhheXN0YWNrU2VsZWN0b3JJbmRleCwgaW5kZXg6IGhhY2tzdGFja0VsZW1lbnRJbmRleCwgbWF0Y2hlZDogMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29tYmluYXRvcjogaGF5c3RhY2tFbGVtZW50LmNvbWJpbmF0b3IgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvdGVudGlhbE1hdGNoZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbE1hdGNoID0gcG90ZW50aWFsTWF0Y2hlc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdG9ycyBhZGQgIiAiIG9udG8gdGhlIGZpcnN0IGVsZW1lbnQuIFdoZW4gd2UgdXNlICYgaXQgam9pbnMgdGhlIHNlbGVjdG9ycyB0b2dldGhlciwgYnV0IGlmIHdlIGRvbid0DQogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGVhY2ggc2VsZWN0b3IgaW4gaGF5c3RhY2tTZWxlY3RvclBhdGggaGFzIGEgc3BhY2UgYmVmb3JlIGl0IGFkZGVkIGluIHRoZSB0b0NTUyBwaGFzZS4gc28gd2UgbmVlZCB0bw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29yayBvdXQgd2hhdCB0aGUgcmVzdWx0aW5nIGNvbWJpbmF0b3Igd2lsbCBiZQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29tYmluYXRvciA9IGhheXN0YWNrRWxlbWVudC5jb21iaW5hdG9yLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldENvbWJpbmF0b3IgPT09ICcnICYmIGhhY2tzdGFja0VsZW1lbnRJbmRleCA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENvbWJpbmF0b3IgPSAnICc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBtYXRjaCwgbnVsbCBvdXIgbWF0Y2ggdG8gaW5kaWNhdGUgZmFpbHVyZQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleHRlbmRWaXNpdG9yLmlzRWxlbWVudFZhbHVlc0VxdWFsKG5lZWRsZUVsZW1lbnRzW3BvdGVudGlhbE1hdGNoLm1hdGNoZWRdLnZhbHVlLCBoYXlzdGFja0VsZW1lbnQudmFsdWUpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvdGVudGlhbE1hdGNoLm1hdGNoZWQgPiAwICYmIG5lZWRsZUVsZW1lbnRzW3BvdGVudGlhbE1hdGNoLm1hdGNoZWRdLmNvbWJpbmF0b3IudmFsdWUgIT09IHRhcmdldENvbWJpbmF0b3IpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTWF0Y2ggPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTWF0Y2gubWF0Y2hlZCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHN0aWxsIHZhbGlkIGFuZCBoYXZlIGZpbmlzaGVkLCB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBlbGVtZW50cyBhZnRlciBhbmQgd2hldGhlciB0aGVzZSBhcmUgYWxsb3dlZA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbE1hdGNoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTWF0Y2guZmluaXNoZWQgPSBwb3RlbnRpYWxNYXRjaC5tYXRjaGVkID09PSBuZWVkbGVFbGVtZW50cy5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbE1hdGNoLmZpbmlzaGVkICYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghZXh0ZW5kLmFsbG93QWZ0ZXIgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYWNrc3RhY2tFbGVtZW50SW5kZXggKyAxIDwgaGFja3N0YWNrU2VsZWN0b3IuZWxlbWVudHMubGVuZ3RoIHx8IGhheXN0YWNrU2VsZWN0b3JJbmRleCArIDEgPCBoYXlzdGFja1NlbGVjdG9yUGF0aC5sZW5ndGgpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxNYXRjaCA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbnVsbCB3ZSByZW1vdmUsIGlmIG5vdCwgd2UgYXJlIHN0aWxsIHZhbGlkLCBzbyBlaXRoZXIgcHVzaCBhcyBhIHZhbGlkIG1hdGNoIG9yIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocG90ZW50aWFsTWF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG90ZW50aWFsTWF0Y2guZmluaXNoZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTWF0Y2gubGVuZ3RoID0gbmVlZGxlRWxlbWVudHMubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxNYXRjaC5lbmRQYXRoSW5kZXggPSBoYXlzdGFja1NlbGVjdG9ySW5kZXg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbE1hdGNoLmVuZFBhdGhFbGVtZW50SW5kZXggPSBoYWNrc3RhY2tFbGVtZW50SW5kZXggKyAxOyAvLyBpbmRleCBhZnRlciBlbmQgb2YgbWF0Y2gNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTWF0Y2hlcy5sZW5ndGggPSAwOyAvLyB3ZSBkb24ndCBhbGxvdyBtYXRjaGVzIHRvIG92ZXJsYXAsIHNvIHN0YXJ0IG1hdGNoaW5nIGFnYWluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChwb3RlbnRpYWxNYXRjaCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTWF0Y2hlcy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7DQogICAgICAgIH07DQogICAgICAgIFByb2Nlc3NFeHRlbmRzVmlzaXRvci5wcm90b3R5cGUuaXNFbGVtZW50VmFsdWVzRXF1YWwgPSBmdW5jdGlvbiAoZWxlbWVudFZhbHVlMSwgZWxlbWVudFZhbHVlMikgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50VmFsdWUxID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxlbWVudFZhbHVlMiA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlMSA9PT0gZWxlbWVudFZhbHVlMjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChlbGVtZW50VmFsdWUxIGluc3RhbmNlb2YgdHJlZS5BdHRyaWJ1dGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFZhbHVlMS5vcCAhPT0gZWxlbWVudFZhbHVlMi5vcCB8fCBlbGVtZW50VmFsdWUxLmtleSAhPT0gZWxlbWVudFZhbHVlMi5rZXkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRWYWx1ZTEudmFsdWUgfHwgIWVsZW1lbnRWYWx1ZTIudmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZTEudmFsdWUgfHwgZWxlbWVudFZhbHVlMi52YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWUxID0gZWxlbWVudFZhbHVlMS52YWx1ZS52YWx1ZSB8fCBlbGVtZW50VmFsdWUxLnZhbHVlOw0KICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZTIgPSBlbGVtZW50VmFsdWUyLnZhbHVlLnZhbHVlIHx8IGVsZW1lbnRWYWx1ZTIudmFsdWU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZTEgPT09IGVsZW1lbnRWYWx1ZTI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbGVtZW50VmFsdWUxID0gZWxlbWVudFZhbHVlMS52YWx1ZTsNCiAgICAgICAgICAgIGVsZW1lbnRWYWx1ZTIgPSBlbGVtZW50VmFsdWUyLnZhbHVlOw0KICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZTEgaW5zdGFuY2VvZiB0cmVlLlNlbGVjdG9yKSB7DQogICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudFZhbHVlMiBpbnN0YW5jZW9mIHRyZWUuU2VsZWN0b3IpIHx8IGVsZW1lbnRWYWx1ZTEuZWxlbWVudHMubGVuZ3RoICE9PSBlbGVtZW50VmFsdWUyLmVsZW1lbnRzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudFZhbHVlMS5lbGVtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFZhbHVlMS5lbGVtZW50c1tpXS5jb21iaW5hdG9yLnZhbHVlICE9PSBlbGVtZW50VmFsdWUyLmVsZW1lbnRzW2ldLmNvbWJpbmF0b3IudmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSAwIHx8IChlbGVtZW50VmFsdWUxLmVsZW1lbnRzW2ldLmNvbWJpbmF0b3IudmFsdWUgfHwgJyAnKSAhPT0gKGVsZW1lbnRWYWx1ZTIuZWxlbWVudHNbaV0uY29tYmluYXRvci52YWx1ZSB8fCAnICcpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VsZW1lbnRWYWx1ZXNFcXVhbChlbGVtZW50VmFsdWUxLmVsZW1lbnRzW2ldLnZhbHVlLCBlbGVtZW50VmFsdWUyLmVsZW1lbnRzW2ldLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9Ow0KICAgICAgICBQcm9jZXNzRXh0ZW5kc1Zpc2l0b3IucHJvdG90eXBlLmV4dGVuZFNlbGVjdG9yID0gZnVuY3Rpb24gKG1hdGNoZXMsIHNlbGVjdG9yUGF0aCwgcmVwbGFjZW1lbnRTZWxlY3RvciwgaXNWaXNpYmxlKSB7DQogICAgICAgICAgICAvLyBmb3IgYSBzZXQgb2YgbWF0Y2hlcywgcmVwbGFjZSBlYWNoIG1hdGNoIHdpdGggdGhlIHJlcGxhY2VtZW50IHNlbGVjdG9yDQogICAgICAgICAgICB2YXIgY3VycmVudFNlbGVjdG9yUGF0aEluZGV4ID0gMCwgY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCA9IDAsIHBhdGggPSBbXSwgbWF0Y2hJbmRleCwgc2VsZWN0b3IsIGZpcnN0RWxlbWVudCwgbWF0Y2gsIG5ld0VsZW1lbnRzOw0KICAgICAgICAgICAgZm9yIChtYXRjaEluZGV4ID0gMDsgbWF0Y2hJbmRleCA8IG1hdGNoZXMubGVuZ3RoOyBtYXRjaEluZGV4KyspIHsNCiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXNbbWF0Y2hJbmRleF07DQogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvclBhdGhbbWF0Y2gucGF0aEluZGV4XTsNCiAgICAgICAgICAgICAgICBmaXJzdEVsZW1lbnQgPSBuZXcgdHJlZS5FbGVtZW50KG1hdGNoLmluaXRpYWxDb21iaW5hdG9yLCByZXBsYWNlbWVudFNlbGVjdG9yLmVsZW1lbnRzWzBdLnZhbHVlLCByZXBsYWNlbWVudFNlbGVjdG9yLmVsZW1lbnRzWzBdLmlzVmFyaWFibGUsIHJlcGxhY2VtZW50U2VsZWN0b3IuZWxlbWVudHNbMF0uZ2V0SW5kZXgoKSwgcmVwbGFjZW1lbnRTZWxlY3Rvci5lbGVtZW50c1swXS5maWxlSW5mbygpKTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2gucGF0aEluZGV4ID4gY3VycmVudFNlbGVjdG9yUGF0aEluZGV4ICYmIGN1cnJlbnRTZWxlY3RvclBhdGhFbGVtZW50SW5kZXggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIHBhdGhbcGF0aC5sZW5ndGggLSAxXS5lbGVtZW50cyA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgLmVsZW1lbnRzLmNvbmNhdChzZWxlY3RvclBhdGhbY3VycmVudFNlbGVjdG9yUGF0aEluZGV4XS5lbGVtZW50cy5zbGljZShjdXJyZW50U2VsZWN0b3JQYXRoRWxlbWVudEluZGV4KSk7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RvclBhdGhFbGVtZW50SW5kZXggPSAwOw0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0b3JQYXRoSW5kZXgrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbmV3RWxlbWVudHMgPSBzZWxlY3Rvci5lbGVtZW50cw0KICAgICAgICAgICAgICAgICAgICAuc2xpY2UoY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCwgbWF0Y2guaW5kZXgpDQogICAgICAgICAgICAgICAgICAgIC5jb25jYXQoW2ZpcnN0RWxlbWVudF0pDQogICAgICAgICAgICAgICAgICAgIC5jb25jYXQocmVwbGFjZW1lbnRTZWxlY3Rvci5lbGVtZW50cy5zbGljZSgxKSk7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleCA9PT0gbWF0Y2gucGF0aEluZGV4ICYmIG1hdGNoSW5kZXggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIHBhdGhbcGF0aC5sZW5ndGggLSAxXS5lbGVtZW50cyA9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoW3BhdGgubGVuZ3RoIC0gMV0uZWxlbWVudHMuY29uY2F0KG5ld0VsZW1lbnRzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmNvbmNhdChzZWxlY3RvclBhdGguc2xpY2UoY3VycmVudFNlbGVjdG9yUGF0aEluZGV4LCBtYXRjaC5wYXRoSW5kZXgpKTsNCiAgICAgICAgICAgICAgICAgICAgcGF0aC5wdXNoKG5ldyB0cmVlLlNlbGVjdG9yKG5ld0VsZW1lbnRzKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleCA9IG1hdGNoLmVuZFBhdGhJbmRleDsNCiAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0b3JQYXRoRWxlbWVudEluZGV4ID0gbWF0Y2guZW5kUGF0aEVsZW1lbnRJbmRleDsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCA+PSBzZWxlY3RvclBhdGhbY3VycmVudFNlbGVjdG9yUGF0aEluZGV4XS5lbGVtZW50cy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleCsrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjdXJyZW50U2VsZWN0b3JQYXRoSW5kZXggPCBzZWxlY3RvclBhdGgubGVuZ3RoICYmIGN1cnJlbnRTZWxlY3RvclBhdGhFbGVtZW50SW5kZXggPiAwKSB7DQogICAgICAgICAgICAgICAgcGF0aFtwYXRoLmxlbmd0aCAtIDFdLmVsZW1lbnRzID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdDQogICAgICAgICAgICAgICAgICAgIC5lbGVtZW50cy5jb25jYXQoc2VsZWN0b3JQYXRoW2N1cnJlbnRTZWxlY3RvclBhdGhJbmRleF0uZWxlbWVudHMuc2xpY2UoY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCkpOw0KICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcGF0aCA9IHBhdGguY29uY2F0KHNlbGVjdG9yUGF0aC5zbGljZShjdXJyZW50U2VsZWN0b3JQYXRoSW5kZXgsIHNlbGVjdG9yUGF0aC5sZW5ndGgpKTsNCiAgICAgICAgICAgIHBhdGggPSBwYXRoLm1hcChmdW5jdGlvbiAoY3VycmVudFZhbHVlKSB7DQogICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlLXVzZSBlbGVtZW50cyBoZXJlLCBiZWNhdXNlIHRoZSB2aXNpYmlsaXR5IHByb3BlcnR5IG1hdHRlcnMgb25seSBmb3Igc2VsZWN0b3JzDQogICAgICAgICAgICAgICAgdmFyIGRlcml2ZWQgPSBjdXJyZW50VmFsdWUuY3JlYXRlRGVyaXZlZChjdXJyZW50VmFsdWUuZWxlbWVudHMpOw0KICAgICAgICAgICAgICAgIGlmIChpc1Zpc2libGUpIHsNCiAgICAgICAgICAgICAgICAgICAgZGVyaXZlZC5lbnN1cmVWaXNpYmlsaXR5KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBkZXJpdmVkLmVuc3VyZUludmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gZGVyaXZlZDsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgcmV0dXJuIHBhdGg7DQogICAgICAgIH07DQogICAgICAgIFByb2Nlc3NFeHRlbmRzVmlzaXRvci5wcm90b3R5cGUudmlzaXRNZWRpYSA9IGZ1bmN0aW9uIChtZWRpYU5vZGUsIHZpc2l0QXJncykgew0KICAgICAgICAgICAgdmFyIG5ld0FsbEV4dGVuZHMgPSBtZWRpYU5vZGUuYWxsRXh0ZW5kcy5jb25jYXQodGhpcy5hbGxFeHRlbmRzU3RhY2tbdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoIC0gMV0pOw0KICAgICAgICAgICAgbmV3QWxsRXh0ZW5kcyA9IG5ld0FsbEV4dGVuZHMuY29uY2F0KHRoaXMuZG9FeHRlbmRDaGFpbmluZyhuZXdBbGxFeHRlbmRzLCBtZWRpYU5vZGUuYWxsRXh0ZW5kcykpOw0KICAgICAgICAgICAgdGhpcy5hbGxFeHRlbmRzU3RhY2sucHVzaChuZXdBbGxFeHRlbmRzKTsNCiAgICAgICAgfTsNCiAgICAgICAgUHJvY2Vzc0V4dGVuZHNWaXNpdG9yLnByb3RvdHlwZS52aXNpdE1lZGlhT3V0ID0gZnVuY3Rpb24gKG1lZGlhTm9kZSkgew0KICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IHRoaXMuYWxsRXh0ZW5kc1N0YWNrLmxlbmd0aCAtIDE7DQogICAgICAgICAgICB0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGggPSBsYXN0SW5kZXg7DQogICAgICAgIH07DQogICAgICAgIFByb2Nlc3NFeHRlbmRzVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdFJ1bGUgPSBmdW5jdGlvbiAoYXRSdWxlTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2YXIgbmV3QWxsRXh0ZW5kcyA9IGF0UnVsZU5vZGUuYWxsRXh0ZW5kcy5jb25jYXQodGhpcy5hbGxFeHRlbmRzU3RhY2tbdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoIC0gMV0pOw0KICAgICAgICAgICAgbmV3QWxsRXh0ZW5kcyA9IG5ld0FsbEV4dGVuZHMuY29uY2F0KHRoaXMuZG9FeHRlbmRDaGFpbmluZyhuZXdBbGxFeHRlbmRzLCBhdFJ1bGVOb2RlLmFsbEV4dGVuZHMpKTsNCiAgICAgICAgICAgIHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2gobmV3QWxsRXh0ZW5kcyk7DQogICAgICAgIH07DQogICAgICAgIFByb2Nlc3NFeHRlbmRzVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdFJ1bGVPdXQgPSBmdW5jdGlvbiAoYXRSdWxlTm9kZSkgew0KICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IHRoaXMuYWxsRXh0ZW5kc1N0YWNrLmxlbmd0aCAtIDE7DQogICAgICAgICAgICB0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGggPSBsYXN0SW5kZXg7DQogICAgICAgIH07DQogICAgICAgIHJldHVybiBQcm9jZXNzRXh0ZW5kc1Zpc2l0b3I7DQogICAgfSgpKTsKCiAgICB2YXIgSm9pblNlbGVjdG9yVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgZnVuY3Rpb24gSm9pblNlbGVjdG9yVmlzaXRvcigpIHsNCiAgICAgICAgICAgIHRoaXMuY29udGV4dHMgPSBbW11dOw0KICAgICAgICAgICAgdGhpcy5fdmlzaXRvciA9IG5ldyBWaXNpdG9yKHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIEpvaW5TZWxlY3RvclZpc2l0b3IucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChyb290KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXRvci52aXNpdChyb290KTsNCiAgICAgICAgfTsNCiAgICAgICAgSm9pblNlbGVjdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChkZWNsTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2aXNpdEFyZ3MudmlzaXREZWVwZXIgPSBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgSm9pblNlbGVjdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRNaXhpbkRlZmluaXRpb24gPSBmdW5jdGlvbiAobWl4aW5EZWZpbml0aW9uTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2aXNpdEFyZ3MudmlzaXREZWVwZXIgPSBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgSm9pblNlbGVjdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRSdWxlc2V0ID0gZnVuY3Rpb24gKHJ1bGVzZXROb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgdmFyIHBhdGhzID0gW107DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzOw0KICAgICAgICAgICAgdGhpcy5jb250ZXh0cy5wdXNoKHBhdGhzKTsNCiAgICAgICAgICAgIGlmICghcnVsZXNldE5vZGUucm9vdCkgew0KICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IHJ1bGVzZXROb2RlLnNlbGVjdG9yczsNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24gKHNlbGVjdG9yKSB7IHJldHVybiBzZWxlY3Rvci5nZXRJc091dHB1dCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXNldE5vZGUuc2VsZWN0b3JzID0gc2VsZWN0b3JzLmxlbmd0aCA/IHNlbGVjdG9ycyA6IChzZWxlY3RvcnMgPSBudWxsKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9ycykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXNldE5vZGUuam9pblNlbGVjdG9ycyhwYXRocywgY29udGV4dCwgc2VsZWN0b3JzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdG9ycykgew0KICAgICAgICAgICAgICAgICAgICBydWxlc2V0Tm9kZS5ydWxlcyA9IG51bGw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJ1bGVzZXROb2RlLnBhdGhzID0gcGF0aHM7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIEpvaW5TZWxlY3RvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0UnVsZXNldE91dCA9IGZ1bmN0aW9uIChydWxlc2V0Tm9kZSkgew0KICAgICAgICAgICAgdGhpcy5jb250ZXh0cy5sZW5ndGggPSB0aGlzLmNvbnRleHRzLmxlbmd0aCAtIDE7DQogICAgICAgIH07DQogICAgICAgIEpvaW5TZWxlY3RvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0TWVkaWEgPSBmdW5jdGlvbiAobWVkaWFOb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgbWVkaWFOb2RlLnJ1bGVzWzBdLnJvb3QgPSAoY29udGV4dC5sZW5ndGggPT09IDAgfHwgY29udGV4dFswXS5tdWx0aU1lZGlhKTsNCiAgICAgICAgfTsNCiAgICAgICAgSm9pblNlbGVjdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdFJ1bGUgPSBmdW5jdGlvbiAoYXRSdWxlTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dHNbdGhpcy5jb250ZXh0cy5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgIGlmIChhdFJ1bGVOb2RlLnJ1bGVzICYmIGF0UnVsZU5vZGUucnVsZXMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgYXRSdWxlTm9kZS5ydWxlc1swXS5yb290ID0gKGF0UnVsZU5vZGUuaXNSb290ZWQgfHwgY29udGV4dC5sZW5ndGggPT09IDAgfHwgbnVsbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHJldHVybiBKb2luU2VsZWN0b3JWaXNpdG9yOw0KICAgIH0oKSk7CgogICAgdmFyIENTU1Zpc2l0b3JVdGlscyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgZnVuY3Rpb24gQ1NTVmlzaXRvclV0aWxzKGNvbnRleHQpIHsNCiAgICAgICAgICAgIHRoaXMuX3Zpc2l0b3IgPSBuZXcgVmlzaXRvcih0aGlzKTsNCiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KICAgICAgICB9DQogICAgICAgIENTU1Zpc2l0b3JVdGlscy5wcm90b3R5cGUuY29udGFpbnNTaWxlbnROb25CbG9ja2VkQ2hpbGQgPSBmdW5jdGlvbiAoYm9keVJ1bGVzKSB7DQogICAgICAgICAgICB2YXIgcnVsZTsNCiAgICAgICAgICAgIGlmICghYm9keVJ1bGVzKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBib2R5UnVsZXMubGVuZ3RoOyByKyspIHsNCiAgICAgICAgICAgICAgICBydWxlID0gYm9keVJ1bGVzW3JdOw0KICAgICAgICAgICAgICAgIGlmIChydWxlLmlzU2lsZW50ICYmIHJ1bGUuaXNTaWxlbnQodGhpcy5fY29udGV4dCkgJiYgIXJ1bGUuYmxvY2tzVmlzaWJpbGl0eSgpKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhdHJ1bGUgY29udGFpbnMgc29tZXRoaW5nIHRoYXQgd2FzIHJlZmVyZW5jZWQgKGxpa2VseSBieSBleHRlbmQpDQogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBpdCBuZWVkcyB0byBiZSBzaG93biBpbiBvdXRwdXQgdG9vDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfTsNCiAgICAgICAgQ1NTVmlzaXRvclV0aWxzLnByb3RvdHlwZS5rZWVwT25seVZpc2libGVDaGlsZHMgPSBmdW5jdGlvbiAob3duZXIpIHsNCiAgICAgICAgICAgIGlmIChvd25lciAmJiBvd25lci5ydWxlcykgew0KICAgICAgICAgICAgICAgIG93bmVyLnJ1bGVzID0gb3duZXIucnVsZXMuZmlsdGVyKGZ1bmN0aW9uICh0aGluZykgeyByZXR1cm4gdGhpbmcuaXNWaXNpYmxlKCk7IH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICBDU1NWaXNpdG9yVXRpbHMucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAob3duZXIpIHsNCiAgICAgICAgICAgIHJldHVybiAob3duZXIgJiYgb3duZXIucnVsZXMpDQogICAgICAgICAgICAgICAgPyAob3duZXIucnVsZXMubGVuZ3RoID09PSAwKSA6IHRydWU7DQogICAgICAgIH07DQogICAgICAgIENTU1Zpc2l0b3JVdGlscy5wcm90b3R5cGUuaGFzVmlzaWJsZVNlbGVjdG9yID0gZnVuY3Rpb24gKHJ1bGVzZXROb2RlKSB7DQogICAgICAgICAgICByZXR1cm4gKHJ1bGVzZXROb2RlICYmIHJ1bGVzZXROb2RlLnBhdGhzKQ0KICAgICAgICAgICAgICAgID8gKHJ1bGVzZXROb2RlLnBhdGhzLmxlbmd0aCA+IDApIDogZmFsc2U7DQogICAgICAgIH07DQogICAgICAgIENTU1Zpc2l0b3JVdGlscy5wcm90b3R5cGUucmVzb2x2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAobm9kZSwgb3JpZ2luYWxSdWxlcykgew0KICAgICAgICAgICAgaWYgKCFub2RlLmJsb2Nrc1Zpc2liaWxpdHkoKSkgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkobm9kZSkgJiYgIXRoaXMuY29udGFpbnNTaWxlbnROb25CbG9ja2VkQ2hpbGQob3JpZ2luYWxSdWxlcykpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBjb21waWxlZFJ1bGVzQm9keSA9IG5vZGUucnVsZXNbMF07DQogICAgICAgICAgICB0aGlzLmtlZXBPbmx5VmlzaWJsZUNoaWxkcyhjb21waWxlZFJ1bGVzQm9keSk7DQogICAgICAgICAgICBpZiAodGhpcy5pc0VtcHR5KGNvbXBpbGVkUnVsZXNCb2R5KSkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG5vZGUuZW5zdXJlVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgbm9kZS5yZW1vdmVWaXNpYmlsaXR5QmxvY2soKTsNCiAgICAgICAgICAgIHJldHVybiBub2RlOw0KICAgICAgICB9Ow0KICAgICAgICBDU1NWaXNpdG9yVXRpbHMucHJvdG90eXBlLmlzVmlzaWJsZVJ1bGVzZXQgPSBmdW5jdGlvbiAocnVsZXNldE5vZGUpIHsNCiAgICAgICAgICAgIGlmIChydWxlc2V0Tm9kZS5maXJzdFJvb3QpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkocnVsZXNldE5vZGUpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCFydWxlc2V0Tm9kZS5yb290ICYmICF0aGlzLmhhc1Zpc2libGVTZWxlY3RvcihydWxlc2V0Tm9kZSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIENTU1Zpc2l0b3JVdGlsczsNCiAgICB9KCkpOw0KICAgIHZhciBUb0NTU1Zpc2l0b3IgPSBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICB0aGlzLl92aXNpdG9yID0gbmV3IFZpc2l0b3IodGhpcyk7DQogICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KICAgICAgICB0aGlzLnV0aWxzID0gbmV3IENTU1Zpc2l0b3JVdGlscyhjb250ZXh0KTsNCiAgICB9Ow0KICAgIFRvQ1NTVmlzaXRvci5wcm90b3R5cGUgPSB7DQogICAgICAgIGlzUmVwbGFjaW5nOiB0cnVlLA0KICAgICAgICBydW46IGZ1bmN0aW9uIChyb290KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXRvci52aXNpdChyb290KTsNCiAgICAgICAgfSwNCiAgICAgICAgdmlzaXREZWNsYXJhdGlvbjogZnVuY3Rpb24gKGRlY2xOb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIGlmIChkZWNsTm9kZS5ibG9ja3NWaXNpYmlsaXR5KCkgfHwgZGVjbE5vZGUudmFyaWFibGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZGVjbE5vZGU7DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0TWl4aW5EZWZpbml0aW9uOiBmdW5jdGlvbiAobWl4aW5Ob2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIC8vIG1peGluIGRlZmluaXRpb25zIGRvIG5vdCBnZXQgZXZhbCdkIC0gdGhpcyBtZWFucyB0aGV5IGtlZXAgc3RhdGUNCiAgICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY2xlYXIgdGhhdCBzdGF0ZSBoZXJlIHNvIGl0IGlzbid0IHVzZWQgaWYgdG9DU1MgaXMgY2FsbGVkIHR3aWNlDQogICAgICAgICAgICBtaXhpbk5vZGUuZnJhbWVzID0gW107DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0RXh0ZW5kOiBmdW5jdGlvbiAoZXh0ZW5kTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0Q29tbWVudDogZnVuY3Rpb24gKGNvbW1lbnROb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIGlmIChjb21tZW50Tm9kZS5ibG9ja3NWaXNpYmlsaXR5KCkgfHwgY29tbWVudE5vZGUuaXNTaWxlbnQodGhpcy5fY29udGV4dCkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY29tbWVudE5vZGU7DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0TWVkaWE6IGZ1bmN0aW9uIChtZWRpYU5vZGUsIHZpc2l0QXJncykgew0KICAgICAgICAgICAgdmFyIG9yaWdpbmFsUnVsZXMgPSBtZWRpYU5vZGUucnVsZXNbMF0ucnVsZXM7DQogICAgICAgICAgICBtZWRpYU5vZGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpOw0KICAgICAgICAgICAgdmlzaXRBcmdzLnZpc2l0RGVlcGVyID0gZmFsc2U7DQogICAgICAgICAgICByZXR1cm4gdGhpcy51dGlscy5yZXNvbHZlVmlzaWJpbGl0eShtZWRpYU5vZGUsIG9yaWdpbmFsUnVsZXMpOw0KICAgICAgICB9LA0KICAgICAgICB2aXNpdEltcG9ydDogZnVuY3Rpb24gKGltcG9ydE5vZGUsIHZpc2l0QXJncykgew0KICAgICAgICAgICAgaWYgKGltcG9ydE5vZGUuYmxvY2tzVmlzaWJpbGl0eSgpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGltcG9ydE5vZGU7DQogICAgICAgIH0sDQogICAgICAgIHZpc2l0QXRSdWxlOiBmdW5jdGlvbiAoYXRSdWxlTm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICBpZiAoYXRSdWxlTm9kZS5ydWxlcyAmJiBhdFJ1bGVOb2RlLnJ1bGVzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0QXRSdWxlV2l0aEJvZHkoYXRSdWxlTm9kZSwgdmlzaXRBcmdzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0QXRSdWxlV2l0aG91dEJvZHkoYXRSdWxlTm9kZSwgdmlzaXRBcmdzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgdmlzaXRBbm9ueW1vdXM6IGZ1bmN0aW9uIChhbm9ueW1vdXNOb2RlLCB2aXNpdEFyZ3MpIHsNCiAgICAgICAgICAgIGlmICghYW5vbnltb3VzTm9kZS5ibG9ja3NWaXNpYmlsaXR5KCkpIHsNCiAgICAgICAgICAgICAgICBhbm9ueW1vdXNOb2RlLmFjY2VwdCh0aGlzLl92aXNpdG9yKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gYW5vbnltb3VzTm9kZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgdmlzaXRBdFJ1bGVXaXRoQm9keTogZnVuY3Rpb24gKGF0UnVsZU5vZGUsIHZpc2l0QXJncykgew0KICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUgbmVzdGVkIHJ1bGVzZXQgYW5kIHRoYXQgb25lIGhhcyBubyBwYXRoLCB0aGVuIGl0IGlzDQogICAgICAgICAgICAvLyBqdXN0IGZha2UgcnVsZXNldA0KICAgICAgICAgICAgZnVuY3Rpb24gaGFzRmFrZVJ1bGVzZXQoYXRSdWxlTm9kZSkgew0KICAgICAgICAgICAgICAgIHZhciBib2R5UnVsZXMgPSBhdFJ1bGVOb2RlLnJ1bGVzOw0KICAgICAgICAgICAgICAgIHJldHVybiBib2R5UnVsZXMubGVuZ3RoID09PSAxICYmICghYm9keVJ1bGVzWzBdLnBhdGhzIHx8IGJvZHlSdWxlc1swXS5wYXRocy5sZW5ndGggPT09IDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Qm9keVJ1bGVzKGF0UnVsZU5vZGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgbm9kZVJ1bGVzID0gYXRSdWxlTm9kZS5ydWxlczsNCiAgICAgICAgICAgICAgICBpZiAoaGFzRmFrZVJ1bGVzZXQoYXRSdWxlTm9kZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVSdWxlc1swXS5ydWxlczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVSdWxlczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIGl0IGlzIHN0aWxsIHRydWUgdGhhdCBpdCBpcyBvbmx5IG9uZSBydWxlc2V0IGluIGFycmF5DQogICAgICAgICAgICAvLyB0aGlzIGlzIGxhc3Qgc3VjaCBtb21lbnQNCiAgICAgICAgICAgIC8vIHByb2Nlc3MgY2hpbGRzDQogICAgICAgICAgICB2YXIgb3JpZ2luYWxSdWxlcyA9IGdldEJvZHlSdWxlcyhhdFJ1bGVOb2RlKTsNCiAgICAgICAgICAgIGF0UnVsZU5vZGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpOw0KICAgICAgICAgICAgdmlzaXRBcmdzLnZpc2l0RGVlcGVyID0gZmFsc2U7DQogICAgICAgICAgICBpZiAoIXRoaXMudXRpbHMuaXNFbXB0eShhdFJ1bGVOb2RlKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuX21lcmdlUnVsZXMoYXRSdWxlTm9kZS5ydWxlc1swXS5ydWxlcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpcy51dGlscy5yZXNvbHZlVmlzaWJpbGl0eShhdFJ1bGVOb2RlLCBvcmlnaW5hbFJ1bGVzKTsNCiAgICAgICAgfSwNCiAgICAgICAgdmlzaXRBdFJ1bGVXaXRob3V0Qm9keTogZnVuY3Rpb24gKGF0UnVsZU5vZGUsIHZpc2l0QXJncykgew0KICAgICAgICAgICAgaWYgKGF0UnVsZU5vZGUuYmxvY2tzVmlzaWJpbGl0eSgpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGF0UnVsZU5vZGUubmFtZSA9PT0gJ0BjaGFyc2V0Jykgew0KICAgICAgICAgICAgICAgIC8vIE9ubHkgb3V0cHV0IHRoZSBkZWJ1ZyBpbmZvIHRvZ2V0aGVyIHdpdGggc3Vic2VxdWVudCBAY2hhcnNldCBkZWZpbml0aW9ucw0KICAgICAgICAgICAgICAgIC8vIGEgY29tbWVudCAob3IgQG1lZGlhIHN0YXRlbWVudCkgYmVmb3JlIHRoZSBhY3R1YWwgQGNoYXJzZXQgYXRydWxlIHdvdWxkDQogICAgICAgICAgICAgICAgLy8gYmUgY29uc2lkZXJlZCBpbGxlZ2FsIGNzcyBhcyBpdCBoYXMgdG8gYmUgb24gdGhlIGZpcnN0IGxpbmUNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGFyc2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChhdFJ1bGVOb2RlLmRlYnVnSW5mbykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgdHJlZS5Db21tZW50KCIvKiAiICsgYXRSdWxlTm9kZS50b0NTUyh0aGlzLl9jb250ZXh0KS5yZXBsYWNlKC9cbi9nLCAnJykgKyAiICovXG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQuZGVidWdJbmZvID0gYXRSdWxlTm9kZS5kZWJ1Z0luZm87DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXRvci52aXNpdChjb21tZW50KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuY2hhcnNldCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gYXRSdWxlTm9kZTsNCiAgICAgICAgfSwNCiAgICAgICAgY2hlY2tWYWxpZE5vZGVzOiBmdW5jdGlvbiAocnVsZXMsIGlzUm9vdCkgew0KICAgICAgICAgICAgaWYgKCFydWxlcykgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgcnVsZU5vZGUgPSBydWxlc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAoaXNSb290ICYmIHJ1bGVOb2RlIGluc3RhbmNlb2YgdHJlZS5EZWNsYXJhdGlvbiAmJiAhcnVsZU5vZGUudmFyaWFibGUpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgeyBtZXNzYWdlOiAnUHJvcGVydGllcyBtdXN0IGJlIGluc2lkZSBzZWxlY3RvciBibG9ja3MuIFRoZXkgY2Fubm90IGJlIGluIHRoZSByb290JywNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBydWxlTm9kZS5nZXRJbmRleCgpLCBmaWxlbmFtZTogcnVsZU5vZGUuZmlsZUluZm8oKSAmJiBydWxlTm9kZS5maWxlSW5mbygpLmZpbGVuYW1lIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChydWxlTm9kZSBpbnN0YW5jZW9mIHRyZWUuQ2FsbCkgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IG1lc3NhZ2U6ICJGdW5jdGlvbiAnIiArIHJ1bGVOb2RlLm5hbWUgKyAiJyBkaWQgbm90IHJldHVybiBhIHJvb3Qgbm9kZSIsDQogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogcnVsZU5vZGUuZ2V0SW5kZXgoKSwgZmlsZW5hbWU6IHJ1bGVOb2RlLmZpbGVJbmZvKCkgJiYgcnVsZU5vZGUuZmlsZUluZm8oKS5maWxlbmFtZSB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAocnVsZU5vZGUudHlwZSAmJiAhcnVsZU5vZGUuYWxsb3dSb290KSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IHsgbWVzc2FnZTogcnVsZU5vZGUudHlwZSArICIgbm9kZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCBoZXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBydWxlTm9kZS5nZXRJbmRleCgpLCBmaWxlbmFtZTogcnVsZU5vZGUuZmlsZUluZm8oKSAmJiBydWxlTm9kZS5maWxlSW5mbygpLmZpbGVuYW1lIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICB2aXNpdFJ1bGVzZXQ6IGZ1bmN0aW9uIChydWxlc2V0Tm9kZSwgdmlzaXRBcmdzKSB7DQogICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHJ1bGVzZXRzIGFyZSBuZXN0ZWQgaW50byBlYWNoIG90aGVyDQogICAgICAgICAgICB2YXIgcnVsZTsNCiAgICAgICAgICAgIHZhciBydWxlc2V0cyA9IFtdOw0KICAgICAgICAgICAgdGhpcy5jaGVja1ZhbGlkTm9kZXMocnVsZXNldE5vZGUucnVsZXMsIHJ1bGVzZXROb2RlLmZpcnN0Um9vdCk7DQogICAgICAgICAgICBpZiAoIXJ1bGVzZXROb2RlLnJvb3QpIHsNCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaW52aXNpYmxlIHBhdGhzDQogICAgICAgICAgICAgICAgdGhpcy5fY29tcGlsZVJ1bGVzZXRQYXRocyhydWxlc2V0Tm9kZSk7DQogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJ1bGVzZXRzIGZyb20gdGhpcyBydWxlc2V0IGJvZHkgYW5kIGNvbXBpbGUgdGhlbSBzZXBhcmF0ZWx5DQogICAgICAgICAgICAgICAgdmFyIG5vZGVSdWxlcyA9IHJ1bGVzZXROb2RlLnJ1bGVzOw0KICAgICAgICAgICAgICAgIHZhciBub2RlUnVsZUNudCA9IG5vZGVSdWxlcyA/IG5vZGVSdWxlcy5sZW5ndGggOiAwOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZVJ1bGVDbnQ7KSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGUgPSBub2RlUnVsZXNbaV07DQogICAgICAgICAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUucnVsZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpc2l0IGJlY2F1c2Ugd2UgYXJlIG1vdmluZyB0aGVtIG91dCBmcm9tIGJlaW5nIGEgY2hpbGQNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzZXRzLnB1c2godGhpcy5fdmlzaXRvci52aXNpdChydWxlKSk7DQogICAgICAgICAgICAgICAgICAgICAgICBub2RlUnVsZXMuc3BsaWNlKGksIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVJ1bGVDbnQtLTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gYWNjZXB0IHRoZSB2aXNpdG9yIHRvIHJlbW92ZSBydWxlcyBhbmQgcmVmYWN0b3IgaXRzZWxmDQogICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBjYW4gZGVjaWRlIG5vZ3cgd2hldGhlciB3ZSB3YW50IGl0IG9yIG5vdA0KICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgYm9keQ0KICAgICAgICAgICAgICAgIGlmIChub2RlUnVsZUNudCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXNldE5vZGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZXNldE5vZGUucnVsZXMgPSBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2aXNpdEFyZ3MudmlzaXREZWVwZXIgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgeyAvLyBpZiAoISBydWxlc2V0Tm9kZS5yb290KSB7DQogICAgICAgICAgICAgICAgcnVsZXNldE5vZGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpOw0KICAgICAgICAgICAgICAgIHZpc2l0QXJncy52aXNpdERlZXBlciA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJ1bGVzZXROb2RlLnJ1bGVzKSB7DQogICAgICAgICAgICAgICAgdGhpcy5fbWVyZ2VSdWxlcyhydWxlc2V0Tm9kZS5ydWxlcyk7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRHVwbGljYXRlUnVsZXMocnVsZXNldE5vZGUucnVsZXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gbm93IGRlY2lkZSB3aGV0aGVyIHdlIGtlZXAgdGhlIHJ1bGVzZXQNCiAgICAgICAgICAgIGlmICh0aGlzLnV0aWxzLmlzVmlzaWJsZVJ1bGVzZXQocnVsZXNldE5vZGUpKSB7DQogICAgICAgICAgICAgICAgcnVsZXNldE5vZGUuZW5zdXJlVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgICAgIHJ1bGVzZXRzLnNwbGljZSgwLCAwLCBydWxlc2V0Tm9kZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocnVsZXNldHMubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVzZXRzWzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJ1bGVzZXRzOw0KICAgICAgICB9LA0KICAgICAgICBfY29tcGlsZVJ1bGVzZXRQYXRoczogZnVuY3Rpb24gKHJ1bGVzZXROb2RlKSB7DQogICAgICAgICAgICBpZiAocnVsZXNldE5vZGUucGF0aHMpIHsNCiAgICAgICAgICAgICAgICBydWxlc2V0Tm9kZS5wYXRocyA9IHJ1bGVzZXROb2RlLnBhdGhzDQogICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHApIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICAgICAgICAgIGlmIChwWzBdLmVsZW1lbnRzWzBdLmNvbWJpbmF0b3IudmFsdWUgPT09ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcFswXS5lbGVtZW50c1swXS5jb21iaW5hdG9yID0gbmV3ICh0cmVlLkNvbWJpbmF0b3IpKCcnKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBbaV0uaXNWaXNpYmxlKCkgJiYgcFtpXS5nZXRJc091dHB1dCgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBfcmVtb3ZlRHVwbGljYXRlUnVsZXM6IGZ1bmN0aW9uIChydWxlcykgew0KICAgICAgICAgICAgaWYgKCFydWxlcykgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIHJlbW92ZSBkdXBsaWNhdGVzDQogICAgICAgICAgICB2YXIgcnVsZUNhY2hlID0ge307DQogICAgICAgICAgICB2YXIgcnVsZUxpc3Q7DQogICAgICAgICAgICB2YXIgcnVsZTsNCiAgICAgICAgICAgIHZhciBpOw0KICAgICAgICAgICAgZm9yIChpID0gcnVsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgICBydWxlID0gcnVsZXNbaV07DQogICAgICAgICAgICAgICAgaWYgKHJ1bGUgaW5zdGFuY2VvZiB0cmVlLkRlY2xhcmF0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghcnVsZUNhY2hlW3J1bGUubmFtZV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDYWNoZVtydWxlLm5hbWVdID0gcnVsZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVMaXN0ID0gcnVsZUNhY2hlW3J1bGUubmFtZV07DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUxpc3QgaW5zdGFuY2VvZiB0cmVlLkRlY2xhcmF0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3QgPSBydWxlQ2FjaGVbcnVsZS5uYW1lXSA9IFtydWxlQ2FjaGVbcnVsZS5uYW1lXS50b0NTUyh0aGlzLl9jb250ZXh0KV07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZUNTUyA9IHJ1bGUudG9DU1ModGhpcy5fY29udGV4dCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUxpc3QuaW5kZXhPZihydWxlQ1NTKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlTGlzdC5wdXNoKHJ1bGVDU1MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBfbWVyZ2VSdWxlczogZnVuY3Rpb24gKHJ1bGVzKSB7DQogICAgICAgICAgICBpZiAoIXJ1bGVzKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGdyb3VwcyA9IHt9Ow0KICAgICAgICAgICAgdmFyIGdyb3Vwc0FyciA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBydWxlID0gcnVsZXNbaV07DQogICAgICAgICAgICAgICAgaWYgKHJ1bGUubWVyZ2UpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IHJ1bGUubmFtZTsNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2tleV0gPyBydWxlcy5zcGxpY2UoaS0tLCAxKSA6DQogICAgICAgICAgICAgICAgICAgICAgICBncm91cHNBcnIucHVzaChncm91cHNba2V5XSA9IFtdKTsNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2tleV0ucHVzaChydWxlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBncm91cHNBcnIuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHsNCiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0XzEgPSBncm91cFswXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYWNlXzEgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hXzEgPSBbbmV3IHRyZWUuRXhwcmVzc2lvbihzcGFjZV8xKV07DQogICAgICAgICAgICAgICAgICAgIGdyb3VwLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocnVsZS5tZXJnZSA9PT0gJysnKSAmJiAoc3BhY2VfMS5sZW5ndGggPiAwKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hXzEucHVzaChuZXcgdHJlZS5FeHByZXNzaW9uKHNwYWNlXzEgPSBbXSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VfMS5wdXNoKHJ1bGUudmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzEuaW1wb3J0YW50ID0gcmVzdWx0XzEuaW1wb3J0YW50IHx8IHJ1bGUuaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzEudmFsdWUgPSBuZXcgdHJlZS5WYWx1ZShjb21tYV8xKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH07CgogICAgdmFyIHZpc2l0b3JzID0gew0KICAgICAgICBWaXNpdG9yOiBWaXNpdG9yLA0KICAgICAgICBJbXBvcnRWaXNpdG9yOiBJbXBvcnRWaXNpdG9yLA0KICAgICAgICBNYXJrVmlzaWJsZVNlbGVjdG9yc1Zpc2l0b3I6IFNldFRyZWVWaXNpYmlsaXR5VmlzaXRvciwNCiAgICAgICAgRXh0ZW5kVmlzaXRvcjogUHJvY2Vzc0V4dGVuZHNWaXNpdG9yLA0KICAgICAgICBKb2luU2VsZWN0b3JWaXNpdG9yOiBKb2luU2VsZWN0b3JWaXNpdG9yLA0KICAgICAgICBUb0NTU1Zpc2l0b3I6IFRvQ1NTVmlzaXRvcg0KICAgIH07CgogICAgLy8gU3BsaXQgdGhlIGlucHV0IGludG8gY2h1bmtzLg0KICAgIGZ1bmN0aW9uIGNodW5rZXIgKGlucHV0LCBmYWlsKSB7DQogICAgICAgIHZhciBsZW4gPSBpbnB1dC5sZW5ndGg7DQogICAgICAgIHZhciBsZXZlbCA9IDA7DQogICAgICAgIHZhciBwYXJlbkxldmVsID0gMDsNCiAgICAgICAgdmFyIGxhc3RPcGVuaW5nOw0KICAgICAgICB2YXIgbGFzdE9wZW5pbmdQYXJlbjsNCiAgICAgICAgdmFyIGxhc3RNdWx0aUNvbW1lbnQ7DQogICAgICAgIHZhciBsYXN0TXVsdGlDb21tZW50RW5kQnJhY2U7DQogICAgICAgIHZhciBjaHVua3MgPSBbXTsNCiAgICAgICAgdmFyIGVtaXRGcm9tID0gMDsNCiAgICAgICAgdmFyIGNodW5rZXJDdXJyZW50SW5kZXg7DQogICAgICAgIHZhciBjdXJyZW50Q2h1bmtTdGFydEluZGV4Ow0KICAgICAgICB2YXIgY2M7DQogICAgICAgIHZhciBjYzI7DQogICAgICAgIHZhciBtYXRjaGVkOw0KICAgICAgICBmdW5jdGlvbiBlbWl0Q2h1bmsoZm9yY2UpIHsNCiAgICAgICAgICAgIHZhciBsZW4gPSBjaHVua2VyQ3VycmVudEluZGV4IC0gZW1pdEZyb207DQogICAgICAgICAgICBpZiAoKChsZW4gPCA1MTIpICYmICFmb3JjZSkgfHwgIWxlbikgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNodW5rcy5wdXNoKGlucHV0LnNsaWNlKGVtaXRGcm9tLCBjaHVua2VyQ3VycmVudEluZGV4ICsgMSkpOw0KICAgICAgICAgICAgZW1pdEZyb20gPSBjaHVua2VyQ3VycmVudEluZGV4ICsgMTsNCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGNodW5rZXJDdXJyZW50SW5kZXggPSAwOyBjaHVua2VyQ3VycmVudEluZGV4IDwgbGVuOyBjaHVua2VyQ3VycmVudEluZGV4KyspIHsNCiAgICAgICAgICAgIGNjID0gaW5wdXQuY2hhckNvZGVBdChjaHVua2VyQ3VycmVudEluZGV4KTsNCiAgICAgICAgICAgIGlmICgoKGNjID49IDk3KSAmJiAoY2MgPD0gMTIyKSkgfHwgKGNjIDwgMzQpKSB7DQogICAgICAgICAgICAgICAgLy8gYS16IG9yIHdoaXRlc3BhY2UNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN3aXRjaCAoY2MpIHsNCiAgICAgICAgICAgICAgICBjYXNlIDQwOiAvLyAoDQogICAgICAgICAgICAgICAgICAgIHBhcmVuTGV2ZWwrKzsNCiAgICAgICAgICAgICAgICAgICAgbGFzdE9wZW5pbmdQYXJlbiA9IGNodW5rZXJDdXJyZW50SW5kZXg7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIGNhc2UgNDE6IC8vICkNCiAgICAgICAgICAgICAgICAgICAgaWYgKC0tcGFyZW5MZXZlbCA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKCdtaXNzaW5nIG9wZW5pbmcgYChgJywgY2h1bmtlckN1cnJlbnRJbmRleCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgY2FzZSA1OTogLy8gOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVuTGV2ZWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaHVuaygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIGNhc2UgMTIzOiAvLyB7DQogICAgICAgICAgICAgICAgICAgIGxldmVsKys7DQogICAgICAgICAgICAgICAgICAgIGxhc3RPcGVuaW5nID0gY2h1bmtlckN1cnJlbnRJbmRleDsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgY2FzZSAxMjU6IC8vIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKC0tbGV2ZWwgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCgnbWlzc2luZyBvcGVuaW5nIGB7YCcsIGNodW5rZXJDdXJyZW50SW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWwgJiYgIXBhcmVuTGV2ZWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaHVuaygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIGNhc2UgOTI6IC8vIFwNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rZXJDdXJyZW50SW5kZXggPCBsZW4gLSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjaHVua2VyQ3VycmVudEluZGV4Kys7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCgndW5lc2NhcGVkIGBcXGAnLCBjaHVua2VyQ3VycmVudEluZGV4KTsNCiAgICAgICAgICAgICAgICBjYXNlIDM0Og0KICAgICAgICAgICAgICAgIGNhc2UgMzk6DQogICAgICAgICAgICAgICAgY2FzZSA5NjogLy8gIiwgJyBhbmQgYA0KICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gMDsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudENodW5rU3RhcnRJbmRleCA9IGNodW5rZXJDdXJyZW50SW5kZXg7DQogICAgICAgICAgICAgICAgICAgIGZvciAoY2h1bmtlckN1cnJlbnRJbmRleCA9IGNodW5rZXJDdXJyZW50SW5kZXggKyAxOyBjaHVua2VyQ3VycmVudEluZGV4IDwgbGVuOyBjaHVua2VyQ3VycmVudEluZGV4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNjMiA9IGlucHV0LmNoYXJDb2RlQXQoY2h1bmtlckN1cnJlbnRJbmRleCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MyID4gOTYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYzIgPT0gY2MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYzIgPT0gOTIpIHsgLy8gXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua2VyQ3VycmVudEluZGV4ID09IGxlbiAtIDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ3VuZXNjYXBlZCBgXFxgJywgY2h1bmtlckN1cnJlbnRJbmRleCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZXJDdXJyZW50SW5kZXgrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoInVubWF0Y2hlZCBgIiArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2MpICsgImAiLCBjdXJyZW50Q2h1bmtTdGFydEluZGV4KTsNCiAgICAgICAgICAgICAgICBjYXNlIDQ3OiAvLyAvLCBjaGVjayBmb3IgY29tbWVudA0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW5MZXZlbCB8fCAoY2h1bmtlckN1cnJlbnRJbmRleCA9PSBsZW4gLSAxKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY2MyID0gaW5wdXQuY2hhckNvZGVBdChjaHVua2VyQ3VycmVudEluZGV4ICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChjYzIgPT0gNDcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8vLCBmaW5kIGxuZmVlZA0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaHVua2VyQ3VycmVudEluZGV4ID0gY2h1bmtlckN1cnJlbnRJbmRleCArIDI7IGNodW5rZXJDdXJyZW50SW5kZXggPCBsZW47IGNodW5rZXJDdXJyZW50SW5kZXgrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjMiA9IGlucHV0LmNoYXJDb2RlQXQoY2h1bmtlckN1cnJlbnRJbmRleCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYzIgPD0gMTMpICYmICgoY2MyID09IDEwKSB8fCAoY2MyID09IDEzKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNjMiA9PSA0Mikgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gLyosIGZpbmQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNdWx0aUNvbW1lbnQgPSBjdXJyZW50Q2h1bmtTdGFydEluZGV4ID0gY2h1bmtlckN1cnJlbnRJbmRleDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2h1bmtlckN1cnJlbnRJbmRleCA9IGNodW5rZXJDdXJyZW50SW5kZXggKyAyOyBjaHVua2VyQ3VycmVudEluZGV4IDwgbGVuIC0gMTsgY2h1bmtlckN1cnJlbnRJbmRleCsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MyID0gaW5wdXQuY2hhckNvZGVBdChjaHVua2VyQ3VycmVudEluZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MyID09IDEyNSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TXVsdGlDb21tZW50RW5kQnJhY2UgPSBjaHVua2VyQ3VycmVudEluZGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MyICE9IDQyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChjaHVua2VyQ3VycmVudEluZGV4ICsgMSkgPT0gNDcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rZXJDdXJyZW50SW5kZXggPT0gbGVuIC0gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKCdtaXNzaW5nIGNsb3NpbmcgYCovYCcsIGN1cnJlbnRDaHVua1N0YXJ0SW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlckN1cnJlbnRJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIGNhc2UgNDI6IC8vICosIGNoZWNrIGZvciB1bm1hdGNoZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgaWYgKChjaHVua2VyQ3VycmVudEluZGV4IDwgbGVuIC0gMSkgJiYgKGlucHV0LmNoYXJDb2RlQXQoY2h1bmtlckN1cnJlbnRJbmRleCArIDEpID09IDQ3KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ3VubWF0Y2hlZCBgLypgJywgY2h1bmtlckN1cnJlbnRJbmRleCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGxldmVsICE9PSAwKSB7DQogICAgICAgICAgICBpZiAoKGxhc3RNdWx0aUNvbW1lbnQgPiBsYXN0T3BlbmluZykgJiYgKGxhc3RNdWx0aUNvbW1lbnRFbmRCcmFjZSA+IGxhc3RNdWx0aUNvbW1lbnQpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ21pc3NpbmcgY2xvc2luZyBgfWAgb3IgYCovYCcsIGxhc3RPcGVuaW5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKCdtaXNzaW5nIGNsb3NpbmcgYH1gJywgbGFzdE9wZW5pbmcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHBhcmVuTGV2ZWwgIT09IDApIHsNCiAgICAgICAgICAgIHJldHVybiBmYWlsKCdtaXNzaW5nIGNsb3NpbmcgYClgJywgbGFzdE9wZW5pbmdQYXJlbik7DQogICAgICAgIH0NCiAgICAgICAgZW1pdENodW5rKHRydWUpOw0KICAgICAgICByZXR1cm4gY2h1bmtzOw0KICAgIH0KCiAgICB2YXIgZ2V0UGFyc2VySW5wdXQgPSAoZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgLy8gTGVzcyBpbnB1dCBzdHJpbmcNCiAgICAgICAgaW5wdXQ7DQogICAgICAgIHZhciAvLyBjdXJyZW50IGNodW5rDQogICAgICAgIGo7DQogICAgICAgIHZhciAvLyBob2xkcyBzdGF0ZSBmb3IgYmFja3RyYWNraW5nDQogICAgICAgIHNhdmVTdGFjayA9IFtdOw0KICAgICAgICB2YXIgLy8gZnVydGhlc3QgaW5kZXggdGhlIHBhcnNlciBoYXMgZ29uZSB0bw0KICAgICAgICBmdXJ0aGVzdDsNCiAgICAgICAgdmFyIC8vIGlmIHRoaXMgaXMgZnVydGhlc3Qgd2UgZ290IHRvLCB0aGlzIGlzIHRoZSBwcm9iYWJseSBjYXVzZQ0KICAgICAgICBmdXJ0aGVzdFBvc3NpYmxlRXJyb3JNZXNzYWdlOw0KICAgICAgICB2YXIgLy8gY2h1bmtpZmllZCBpbnB1dA0KICAgICAgICBjaHVua3M7DQogICAgICAgIHZhciAvLyBjdXJyZW50IGNodW5rDQogICAgICAgIGN1cnJlbnQ7DQogICAgICAgIHZhciAvLyBpbmRleCBvZiBjdXJyZW50IGNodW5rLCBpbiBgaW5wdXRgDQogICAgICAgIGN1cnJlbnRQb3M7DQogICAgICAgIHZhciBwYXJzZXJJbnB1dCA9IHt9Ow0KICAgICAgICB2YXIgQ0hBUkNPREVfU1BBQ0UgPSAzMjsNCiAgICAgICAgdmFyIENIQVJDT0RFX1RBQiA9IDk7DQogICAgICAgIHZhciBDSEFSQ09ERV9MRiA9IDEwOw0KICAgICAgICB2YXIgQ0hBUkNPREVfQ1IgPSAxMzsNCiAgICAgICAgdmFyIENIQVJDT0RFX1BMVVMgPSA0MzsNCiAgICAgICAgdmFyIENIQVJDT0RFX0NPTU1BID0gNDQ7DQogICAgICAgIHZhciBDSEFSQ09ERV9GT1JXQVJEX1NMQVNIID0gNDc7DQogICAgICAgIHZhciBDSEFSQ09ERV85ID0gNTc7DQogICAgICAgIGZ1bmN0aW9uIHNraXBXaGl0ZXNwYWNlKGxlbmd0aCkgew0KICAgICAgICAgICAgdmFyIG9sZGkgPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgdmFyIG9sZGogPSBqOw0KICAgICAgICAgICAgdmFyIGN1cnIgPSBwYXJzZXJJbnB1dC5pIC0gY3VycmVudFBvczsNCiAgICAgICAgICAgIHZhciBlbmRJbmRleCA9IHBhcnNlcklucHV0LmkgKyBjdXJyZW50Lmxlbmd0aCAtIGN1cnI7DQogICAgICAgICAgICB2YXIgbWVtID0gKHBhcnNlcklucHV0LmkgKz0gbGVuZ3RoKTsNCiAgICAgICAgICAgIHZhciBpbnAgPSBpbnB1dDsNCiAgICAgICAgICAgIHZhciBjOw0KICAgICAgICAgICAgdmFyIG5leHRDaGFyOw0KICAgICAgICAgICAgdmFyIGNvbW1lbnQ7DQogICAgICAgICAgICBmb3IgKDsgcGFyc2VySW5wdXQuaSA8IGVuZEluZGV4OyBwYXJzZXJJbnB1dC5pKyspIHsNCiAgICAgICAgICAgICAgICBjID0gaW5wLmNoYXJDb2RlQXQocGFyc2VySW5wdXQuaSk7DQogICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LmF1dG9Db21tZW50QWJzb3JiICYmIGMgPT09IENIQVJDT0RFX0ZPUldBUkRfU0xBU0gpIHsNCiAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSBpbnAuY2hhckF0KHBhcnNlcklucHV0LmkgKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB7IGluZGV4OiBwYXJzZXJJbnB1dC5pLCBpc0xpbmVDb21tZW50OiB0cnVlIH07DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dE5ld0xpbmUgPSBpbnAuaW5kZXhPZignXG4nLCBwYXJzZXJJbnB1dC5pICsgMik7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dE5ld0xpbmUgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5ld0xpbmUgPSBlbmRJbmRleDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmkgPSBuZXh0TmV3TGluZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQudGV4dCA9IGlucC5zdWJzdHIoY29tbWVudC5pbmRleCwgcGFyc2VySW5wdXQuaSAtIGNvbW1lbnQuaW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuY29tbWVudFN0b3JlLnB1c2goY29tbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXh0Q2hhciA9PT0gJyonKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFN0YXJTbGFzaCA9IGlucC5pbmRleE9mKCcqLycsIHBhcnNlcklucHV0LmkgKyAyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U3RhclNsYXNoID49IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogcGFyc2VySW5wdXQuaSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogaW5wLnN1YnN0cihwYXJzZXJJbnB1dC5pLCBuZXh0U3RhclNsYXNoICsgMiAtIHBhcnNlcklucHV0LmkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xpbmVDb21tZW50OiBmYWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuaSArPSBjb21tZW50LnRleHQubGVuZ3RoIC0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5jb21tZW50U3RvcmUucHVzaChjb21tZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKChjICE9PSBDSEFSQ09ERV9TUEFDRSkgJiYgKGMgIT09IENIQVJDT0RFX0xGKSAmJiAoYyAhPT0gQ0hBUkNPREVfVEFCKSAmJiAoYyAhPT0gQ0hBUkNPREVfQ1IpKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNsaWNlKGxlbmd0aCArIHBhcnNlcklucHV0LmkgLSBtZW0gKyBjdXJyKTsNCiAgICAgICAgICAgIGN1cnJlbnRQb3MgPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgaWYgKCFjdXJyZW50Lmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIGlmIChqIDwgY2h1bmtzLmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGNodW5rc1srK2pdOw0KICAgICAgICAgICAgICAgICAgICBza2lwV2hpdGVzcGFjZSgwKTsgLy8gc2tpcCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY2h1bmsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHRoaW5ncyBjaGFuZ2VkDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZpbmlzaGVkID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBvbGRpICE9PSBwYXJzZXJJbnB1dC5pIHx8IG9sZGogIT09IGo7DQogICAgICAgIH0NCiAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGN1cnJlbnRQb3MgPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgc2F2ZVN0YWNrLnB1c2goeyBjdXJyZW50OiBjdXJyZW50LCBpOiBwYXJzZXJJbnB1dC5pLCBqOiBqIH0pOw0KICAgICAgICB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlID0gZnVuY3Rpb24gKHBvc3NpYmxlRXJyb3JNZXNzYWdlKSB7DQogICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuaSA+IGZ1cnRoZXN0IHx8IChwYXJzZXJJbnB1dC5pID09PSBmdXJ0aGVzdCAmJiBwb3NzaWJsZUVycm9yTWVzc2FnZSAmJiAhZnVydGhlc3RQb3NzaWJsZUVycm9yTWVzc2FnZSkpIHsNCiAgICAgICAgICAgICAgICBmdXJ0aGVzdCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgZnVydGhlc3RQb3NzaWJsZUVycm9yTWVzc2FnZSA9IHBvc3NpYmxlRXJyb3JNZXNzYWdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHN0YXRlID0gc2F2ZVN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgY3VycmVudCA9IHN0YXRlLmN1cnJlbnQ7DQogICAgICAgICAgICBjdXJyZW50UG9zID0gcGFyc2VySW5wdXQuaSA9IHN0YXRlLmk7DQogICAgICAgICAgICBqID0gc3RhdGUuajsNCiAgICAgICAgfTsNCiAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc2F2ZVN0YWNrLnBvcCgpOw0KICAgICAgICB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC5pc1doaXRlc3BhY2UgPSBmdW5jdGlvbiAob2Zmc2V0KSB7DQogICAgICAgICAgICB2YXIgcG9zID0gcGFyc2VySW5wdXQuaSArIChvZmZzZXQgfHwgMCk7DQogICAgICAgICAgICB2YXIgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQocG9zKTsNCiAgICAgICAgICAgIHJldHVybiAoY29kZSA9PT0gQ0hBUkNPREVfU1BBQ0UgfHwgY29kZSA9PT0gQ0hBUkNPREVfQ1IgfHwgY29kZSA9PT0gQ0hBUkNPREVfVEFCIHx8IGNvZGUgPT09IENIQVJDT0RFX0xGKTsNCiAgICAgICAgfTsNCiAgICAgICAgLy8gU3BlY2lhbGl6YXRpb24gb2YgJCh0b2spDQogICAgICAgIHBhcnNlcklucHV0LiRyZSA9IGZ1bmN0aW9uICh0b2spIHsNCiAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC5pID4gY3VycmVudFBvcykgew0KICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNsaWNlKHBhcnNlcklucHV0LmkgLSBjdXJyZW50UG9zKTsNCiAgICAgICAgICAgICAgICBjdXJyZW50UG9zID0gcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtID0gdG9rLmV4ZWMoY3VycmVudCk7DQogICAgICAgICAgICBpZiAoIW0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNraXBXaGl0ZXNwYWNlKG1bMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBtLmxlbmd0aCA9PT0gMSA/IG1bMF0gOiBtOw0KICAgICAgICB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC4kY2hhciA9IGZ1bmN0aW9uICh0b2spIHsNCiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQXQocGFyc2VySW5wdXQuaSkgIT09IHRvaykgew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2tpcFdoaXRlc3BhY2UoMSk7DQogICAgICAgICAgICByZXR1cm4gdG9rOw0KICAgICAgICB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC4kc3RyID0gZnVuY3Rpb24gKHRvaykgew0KICAgICAgICAgICAgdmFyIHRva0xlbmd0aCA9IHRvay5sZW5ndGg7DQogICAgICAgICAgICAvLyBodHRwczovL2pzcGVyZi5jb20vc3RyaW5nLXN0YXJ0c3dpdGgvMjENCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rTGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckF0KHBhcnNlcklucHV0LmkgKyBpKSAhPT0gdG9rLmNoYXJBdChpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBza2lwV2hpdGVzcGFjZSh0b2tMZW5ndGgpOw0KICAgICAgICAgICAgcmV0dXJuIHRvazsNCiAgICAgICAgfTsNCiAgICAgICAgcGFyc2VySW5wdXQuJHF1b3RlZCA9IGZ1bmN0aW9uIChsb2MpIHsNCiAgICAgICAgICAgIHZhciBwb3MgPSBsb2MgfHwgcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgIHZhciBzdGFydENoYXIgPSBpbnB1dC5jaGFyQXQocG9zKTsNCiAgICAgICAgICAgIGlmIChzdGFydENoYXIgIT09ICdcJycgJiYgc3RhcnRDaGFyICE9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbGVuZ3RoID0gaW5wdXQubGVuZ3RoOw0KICAgICAgICAgICAgdmFyIGN1cnJlbnRQb3NpdGlvbiA9IHBvczsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpICsgY3VycmVudFBvc2l0aW9uIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dENoYXIgPSBpbnB1dC5jaGFyQXQoaSArIGN1cnJlbnRQb3NpdGlvbik7DQogICAgICAgICAgICAgICAgc3dpdGNoIChuZXh0Q2hhcikgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6DQogICAgICAgICAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOg0KICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBzdGFydENoYXI6DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gaW5wdXQuc3Vic3RyKGN1cnJlbnRQb3NpdGlvbiwgaSArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2MgJiYgbG9jICE9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFdoaXRlc3BhY2UoaSArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3N0YXJ0Q2hhciwgc3RyXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfTsNCiAgICAgICAgLyoqDQogICAgICAgICAqIFBlcm1pc3NpdmUgcGFyc2luZy4gSWdub3JlcyBldmVyeXRoaW5nIGV4Y2VwdCBtYXRjaGluZyB7fSBbXSAoKSBhbmQgcXVvdGVzDQogICAgICAgICAqIHVudGlsIG1hdGNoaW5nIHRva2VuIChvdXRzaWRlIG9mIGJsb2NrcykNCiAgICAgICAgICovDQogICAgICAgIHBhcnNlcklucHV0LiRwYXJzZVVudGlsID0gZnVuY3Rpb24gKHRvaykgew0KICAgICAgICAgICAgdmFyIHF1b3RlID0gJyc7DQogICAgICAgICAgICB2YXIgcmV0dXJuVmFsID0gbnVsbDsNCiAgICAgICAgICAgIHZhciBpbkNvbW1lbnQgPSBmYWxzZTsNCiAgICAgICAgICAgIHZhciBibG9ja0RlcHRoID0gMDsNCiAgICAgICAgICAgIHZhciBibG9ja1N0YWNrID0gW107DQogICAgICAgICAgICB2YXIgcGFyc2VHcm91cHMgPSBbXTsNCiAgICAgICAgICAgIHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGg7DQogICAgICAgICAgICB2YXIgc3RhcnRQb3MgPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgdmFyIGxhc3RQb3MgPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgdmFyIGkgPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgdmFyIGxvb3AgPSB0cnVlOw0KICAgICAgICAgICAgdmFyIHRlc3RDaGFyOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2sgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgdGVzdENoYXIgPSBmdW5jdGlvbiAoY2hhcikgeyByZXR1cm4gY2hhciA9PT0gdG9rOyB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgdGVzdENoYXIgPSBmdW5jdGlvbiAoY2hhcikgeyByZXR1cm4gdG9rLnRlc3QoY2hhcik7IH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgdmFyIG5leHRDaGFyID0gaW5wdXQuY2hhckF0KGkpOw0KICAgICAgICAgICAgICAgIGlmIChibG9ja0RlcHRoID09PSAwICYmIHRlc3RDaGFyKG5leHRDaGFyKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWwgPSBpbnB1dC5zdWJzdHIobGFzdFBvcywgaSAtIGxhc3RQb3MpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUdyb3Vwcy5wdXNoKHJldHVyblZhbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUdyb3Vwcy5wdXNoKCcgJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gcGFyc2VHcm91cHM7DQogICAgICAgICAgICAgICAgICAgIHNraXBXaGl0ZXNwYWNlKGkgLSBzdGFydFBvcyk7DQogICAgICAgICAgICAgICAgICAgIGxvb3AgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbkNvbW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJyonICYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hhckF0KGkgKyAxKSA9PT0gJy8nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrRGVwdGgtLTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1lbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobmV4dENoYXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSBpbnB1dC5jaGFyQXQoaSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VHcm91cHMucHVzaChpbnB1dC5zdWJzdHIobGFzdFBvcywgaSAtIGxhc3RQb3MgKyAxKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGkgKyAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJBdChpICsgMSkgPT09ICcqJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWVudCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrRGVwdGgrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICciJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IHBhcnNlcklucHV0LiRxdW90ZWQoaSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlR3JvdXBzLnB1c2goaW5wdXQuc3Vic3RyKGxhc3RQb3MsIGkgLSBsYXN0UG9zKSwgcXVvdGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IHF1b3RlWzFdLmxlbmd0aCAtIDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBpICsgMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBXaGl0ZXNwYWNlKGkgLSBzdGFydFBvcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbCA9IG5leHRDaGFyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTdGFjay5wdXNoKCd9Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tEZXB0aCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTdGFjay5wdXNoKCcpJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tEZXB0aCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTdGFjay5wdXNoKCddJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tEZXB0aCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcpJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGJsb2NrU3RhY2sucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09PSBleHBlY3RlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0RlcHRoLS07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRoZSBwYXJzZXIgdG8gdGhlIGVycm9yIGFuZCByZXR1cm4gZXhwZWN0ZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFdoaXRlc3BhY2UoaSAtIHN0YXJ0UG9zKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gZXhwZWN0ZWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaSsrOw0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSB3aGlsZSAobG9vcCk7DQogICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsID8gcmV0dXJuVmFsIDogbnVsbDsNCiAgICAgICAgfTsNCiAgICAgICAgcGFyc2VySW5wdXQuYXV0b0NvbW1lbnRBYnNvcmIgPSB0cnVlOw0KICAgICAgICBwYXJzZXJJbnB1dC5jb21tZW50U3RvcmUgPSBbXTsNCiAgICAgICAgcGFyc2VySW5wdXQuZmluaXNoZWQgPSBmYWxzZTsNCiAgICAgICAgLy8gU2FtZSBhcyAkKCksIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBwYXJzZXIsDQogICAgICAgIC8vIGp1c3QgcmV0dXJuIHRoZSBtYXRjaC4NCiAgICAgICAgcGFyc2VySW5wdXQucGVlayA9IGZ1bmN0aW9uICh0b2spIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgdG9rID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vanNwZXJmLmNvbS9zdHJpbmctc3RhcnRzd2l0aC8yMQ0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQXQocGFyc2VySW5wdXQuaSArIGkpICE9PSB0b2suY2hhckF0KGkpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rLnRlc3QoY3VycmVudCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIC8vIFNwZWNpYWxpemF0aW9uIG9mIHBlZWsoKQ0KICAgICAgICAvLyBUT0RPIHJlbW92ZSBvciBjaGFuZ2Ugc29tZSBjdXJyZW50Q2hhciBjYWxscyB0byBwZWVrQ2hhcg0KICAgICAgICBwYXJzZXJJbnB1dC5wZWVrQ2hhciA9IGZ1bmN0aW9uICh0b2spIHsgcmV0dXJuIGlucHV0LmNoYXJBdChwYXJzZXJJbnB1dC5pKSA9PT0gdG9rOyB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC5jdXJyZW50Q2hhciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlucHV0LmNoYXJBdChwYXJzZXJJbnB1dC5pKTsgfTsNCiAgICAgICAgcGFyc2VySW5wdXQucHJldkNoYXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpbnB1dC5jaGFyQXQocGFyc2VySW5wdXQuaSAtIDEpOyB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC5nZXRJbnB1dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlucHV0OyB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC5wZWVrTm90TnVtZXJpYyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBjID0gaW5wdXQuY2hhckNvZGVBdChwYXJzZXJJbnB1dC5pKTsNCiAgICAgICAgICAgIC8vIElzIHRoZSBmaXJzdCBjaGFyIG9mIHRoZSBkaW1lbnNpb24gMC05LCAnLicsICcrJyBvciAnLScNCiAgICAgICAgICAgIHJldHVybiAoYyA+IENIQVJDT0RFXzkgfHwgYyA8IENIQVJDT0RFX1BMVVMpIHx8IGMgPT09IENIQVJDT0RFX0ZPUldBUkRfU0xBU0ggfHwgYyA9PT0gQ0hBUkNPREVfQ09NTUE7DQogICAgICAgIH07DQogICAgICAgIHBhcnNlcklucHV0LnN0YXJ0ID0gZnVuY3Rpb24gKHN0ciwgY2h1bmtJbnB1dCwgZmFpbEZ1bmN0aW9uKSB7DQogICAgICAgICAgICBpbnB1dCA9IHN0cjsNCiAgICAgICAgICAgIHBhcnNlcklucHV0LmkgPSBqID0gY3VycmVudFBvcyA9IGZ1cnRoZXN0ID0gMDsNCiAgICAgICAgICAgIC8vIGNodW5raW5nIGFwcGFyZW50bHkgbWFrZXMgdGhpbmdzIHF1aWNrZXIgKGJ1dCBteSB0ZXN0cyBpbmRpY2F0ZQ0KICAgICAgICAgICAgLy8gaXQgbWlnaHQgYWN0dWFsbHkgbWFrZSB0aGluZ3Mgc2xvd2VyIGluIG5vZGUgYXQgbGVhc3QpDQogICAgICAgICAgICAvLyBhbmQgaXQgaXMgYSBub24tcGVyZmVjdCBwYXJzZSAtIGl0IGNhbid0IHJlY29nbmlzZQ0KICAgICAgICAgICAgLy8gdW5xdW90ZWQgdXJscywgbWVhbmluZyBpdCBjYW4ndCBkaXN0aW5ndWlzaCBjb21tZW50cw0KICAgICAgICAgICAgLy8gbWVhbmluZyBjb21tZW50cyB3aXRoIHF1b3RlcyBvciB7fSgpIGluIHRoZW0gZ2V0ICdjb3VudGVkJw0KICAgICAgICAgICAgLy8gYW5kIHRoZW4gbGVhZCB0byBwYXJzZSBlcnJvcnMuDQogICAgICAgICAgICAvLyBJbiBhZGRpdGlvbiBpZiB0aGUgY2h1bmtpbmcgY2h1bmtzIGluIHRoZSB3cm9uZyBwbGFjZSB3ZSBtaWdodA0KICAgICAgICAgICAgLy8gbm90IGJlIGFibGUgdG8gcGFyc2UgYSBwYXJzZXIgc3RhdGVtZW50IGluIG9uZSBnbw0KICAgICAgICAgICAgLy8gdGhpcyBpcyBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQgYnV0IGNhbiBiZSBzd2l0Y2hlZCBvbiB2aWEgYW4gb3B0aW9uDQogICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBpdCBjYXVzZXMgdG9vIG11Y2ggcGVyZm9ybWFuY2UgaXNzdWVzLg0KICAgICAgICAgICAgaWYgKGNodW5rSW5wdXQpIHsNCiAgICAgICAgICAgICAgICBjaHVua3MgPSBjaHVua2VyKHN0ciwgZmFpbEZ1bmN0aW9uKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGNodW5rcyA9IFtzdHJdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY3VycmVudCA9IGNodW5rc1swXTsNCiAgICAgICAgICAgIHNraXBXaGl0ZXNwYWNlKDApOw0KICAgICAgICB9Ow0KICAgICAgICBwYXJzZXJJbnB1dC5lbmQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgbWVzc2FnZTsNCiAgICAgICAgICAgIHZhciBpc0ZpbmlzaGVkID0gcGFyc2VySW5wdXQuaSA+PSBpbnB1dC5sZW5ndGg7DQogICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuaSA8IGZ1cnRoZXN0KSB7DQogICAgICAgICAgICAgICAgbWVzc2FnZSA9IGZ1cnRoZXN0UG9zc2libGVFcnJvck1lc3NhZ2U7DQogICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuaSA9IGZ1cnRoZXN0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICBpc0ZpbmlzaGVkOiBpc0ZpbmlzaGVkLA0KICAgICAgICAgICAgICAgIGZ1cnRoZXN0OiBwYXJzZXJJbnB1dC5pLA0KICAgICAgICAgICAgICAgIGZ1cnRoZXN0UG9zc2libGVFcnJvck1lc3NhZ2U6IG1lc3NhZ2UsDQogICAgICAgICAgICAgICAgZnVydGhlc3RSZWFjaGVkRW5kOiBwYXJzZXJJbnB1dC5pID49IGlucHV0Lmxlbmd0aCAtIDEsDQogICAgICAgICAgICAgICAgZnVydGhlc3RDaGFyOiBpbnB1dFtwYXJzZXJJbnB1dC5pXQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIHBhcnNlcklucHV0Ow0KICAgIH0pOwoKICAgIC8vDQogICAgLy8gbGVzcy5qcyAtIHBhcnNlcg0KICAgIC8vDQogICAgLy8gICAgQSByZWxhdGl2ZWx5IHN0cmFpZ2h0LWZvcndhcmQgcHJlZGljdGl2ZSBwYXJzZXIuDQogICAgLy8gICAgVGhlcmUgaXMgbm8gdG9rZW5pemF0aW9uL2xleGluZyBzdGFnZSwgdGhlIGlucHV0IGlzIHBhcnNlZA0KICAgIC8vICAgIGluIG9uZSBzd2VlcC4NCiAgICAvLw0KICAgIC8vICAgIFRvIG1ha2UgdGhlIHBhcnNlciBmYXN0IGVub3VnaCB0byBydW4gaW4gdGhlIGJyb3dzZXIsIHNldmVyYWwNCiAgICAvLyAgICBvcHRpbWl6YXRpb24gaGFkIHRvIGJlIG1hZGU6DQogICAgLy8NCiAgICAvLyAgICAtIE1hdGNoaW5nIGFuZCBzbGljaW5nIG9uIGEgaHVnZSBpbnB1dCBpcyBvZnRlbiBjYXVzZSBvZiBzbG93ZG93bnMuDQogICAgLy8gICAgICBUaGUgc29sdXRpb24gaXMgdG8gY2h1bmtpZnkgdGhlIGlucHV0IGludG8gc21hbGxlciBzdHJpbmdzLg0KICAgIC8vICAgICAgVGhlIGNodW5rcyBhcmUgc3RvcmVkIGluIHRoZSBgY2h1bmtzYCB2YXIsDQogICAgLy8gICAgICBgamAgaG9sZHMgdGhlIGN1cnJlbnQgY2h1bmsgaW5kZXgsIGFuZCBgY3VycmVudFBvc2AgaG9sZHMNCiAgICAvLyAgICAgIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaHVuayBpbiByZWxhdGlvbiB0byBgaW5wdXRgLg0KICAgIC8vICAgICAgVGhpcyBnaXZlcyB1cyBhbiBhbG1vc3QgNHggc3BlZWQtdXAuDQogICAgLy8NCiAgICAvLyAgICAtIEluIG1hbnkgY2FzZXMsIHdlIGRvbid0IG5lZWQgdG8gbWF0Y2ggaW5kaXZpZHVhbCB0b2tlbnM7DQogICAgLy8gICAgICBmb3IgZXhhbXBsZSwgaWYgYSB2YWx1ZSBkb2Vzbid0IGhvbGQgYW55IHZhcmlhYmxlcywgb3BlcmF0aW9ucw0KICAgIC8vICAgICAgb3IgZHluYW1pYyByZWZlcmVuY2VzLCB0aGUgcGFyc2VyIGNhbiBlZmZlY3RpdmVseSAnc2tpcCcgaXQsDQogICAgLy8gICAgICB0cmVhdGluZyBpdCBhcyBhIGxpdGVyYWwuDQogICAgLy8gICAgICBBbiBleGFtcGxlIHdvdWxkIGJlICcxcHggc29saWQgIzAwMCcgLSB3aGljaCBldmFsdWF0ZXMgdG8gaXRzZWxmLA0KICAgIC8vICAgICAgd2UgZG9uJ3QgbmVlZCB0byBrbm93IHdoYXQgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cyBhcmUuDQogICAgLy8gICAgICBUaGUgZHJhd2JhY2ssIG9mIGNvdXJzZSBpcyB0aGF0IHlvdSBkb24ndCBnZXQgdGhlIGJlbmVmaXRzIG9mDQogICAgLy8gICAgICBzeW50YXgtY2hlY2tpbmcgb24gdGhlIENTUy4gVGhpcyBnaXZlcyB1cyBhIDUwJSBzcGVlZC11cCBpbiB0aGUgcGFyc2VyLA0KICAgIC8vICAgICAgYW5kIGEgc21hbGxlciBzcGVlZC11cCBpbiB0aGUgY29kZS1nZW4uDQogICAgLy8NCiAgICAvLw0KICAgIC8vICAgIFRva2VuIG1hdGNoaW5nIGlzIGRvbmUgd2l0aCB0aGUgYCRgIGZ1bmN0aW9uLCB3aGljaCBlaXRoZXIgdGFrZXMNCiAgICAvLyAgICBhIHRlcm1pbmFsIHN0cmluZyBvciByZWdleHAsIG9yIGEgbm9uLXRlcm1pbmFsIGZ1bmN0aW9uIHRvIGNhbGwuDQogICAgLy8gICAgSXQgYWxzbyB0YWtlcyBjYXJlIG9mIG1vdmluZyBhbGwgdGhlIGluZGljZXMgZm9yd2FyZHMuDQogICAgLy8NCiAgICB2YXIgUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKGNvbnRleHQsIGltcG9ydHMsIGZpbGVJbmZvKSB7DQogICAgICAgIHZhciBwYXJzZXJzOw0KICAgICAgICB2YXIgcGFyc2VySW5wdXQgPSBnZXRQYXJzZXJJbnB1dCgpOw0KICAgICAgICBmdW5jdGlvbiBlcnJvcihtc2csIHR5cGUpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBMZXNzRXJyb3Ioew0KICAgICAgICAgICAgICAgIGluZGV4OiBwYXJzZXJJbnB1dC5pLA0KICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlSW5mby5maWxlbmFtZSwNCiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlIHx8ICdTeW50YXgnLA0KICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1zZw0KICAgICAgICAgICAgfSwgaW1wb3J0cyk7DQogICAgICAgIH0NCiAgICAgICAgZnVuY3Rpb24gZXhwZWN0KGFyZywgbXNnKSB7DQogICAgICAgICAgICAvLyBzb21lIG9sZGVyIGJyb3dzZXJzIHJldHVybiB0eXBlb2YgJ2Z1bmN0aW9uJyBmb3IgUmVnRXhwDQogICAgICAgICAgICB2YXIgcmVzdWx0ID0gKGFyZyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSA/IGFyZy5jYWxsKHBhcnNlcnMpIDogcGFyc2VySW5wdXQuJHJlKGFyZyk7DQogICAgICAgICAgICBpZiAocmVzdWx0KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yKG1zZyB8fCAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycNCiAgICAgICAgICAgICAgICA/ICJleHBlY3RlZCAnIiArIGFyZyArICInIGdvdCAnIiArIHBhcnNlcklucHV0LmN1cnJlbnRDaGFyKCkgKyAiJyINCiAgICAgICAgICAgICAgICA6ICd1bmV4cGVjdGVkIHRva2VuJykpOw0KICAgICAgICB9DQogICAgICAgIC8vIFNwZWNpYWxpemF0aW9uIG9mIGV4cGVjdCgpDQogICAgICAgIGZ1bmN0aW9uIGV4cGVjdENoYXIoYXJnLCBtc2cpIHsNCiAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC4kY2hhcihhcmcpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGFyZzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yKG1zZyB8fCAiZXhwZWN0ZWQgJyIgKyBhcmcgKyAiJyBnb3QgJyIgKyBwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpICsgIiciKTsNCiAgICAgICAgfQ0KICAgICAgICBmdW5jdGlvbiBnZXREZWJ1Z0luZm8oaW5kZXgpIHsNCiAgICAgICAgICAgIHZhciBmaWxlbmFtZSA9IGZpbGVJbmZvLmZpbGVuYW1lOw0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBnZXRMb2NhdGlvbihpbmRleCwgcGFyc2VySW5wdXQuZ2V0SW5wdXQoKSkubGluZSArIDEsDQogICAgICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVuYW1lDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIC8qKg0KICAgICAgICAgKiAgVXNlZCBhZnRlciBpbml0aWFsIHBhcnNpbmcgdG8gY3JlYXRlIG5vZGVzIG9uIHRoZSBmbHkNCiAgICAgICAgICoNCiAgICAgICAgICogIEBwYXJhbSB7U3RyaW5nfSBzdHIgICAgICAgICAgLSBzdHJpbmcgdG8gcGFyc2UNCiAgICAgICAgICogIEBwYXJhbSB7QXJyYXl9ICBwYXJzZUxpc3QgICAgLSBhcnJheSBvZiBwYXJzZXJzIHRvIHJ1biBpbnB1dCB0aHJvdWdoIGUuZy4gWyJ2YWx1ZSIsICJpbXBvcnRhbnQiXQ0KICAgICAgICAgKiAgQHBhcmFtIHtOdW1iZXJ9IGN1cnJlbnRJbmRleCAtIHN0YXJ0IG51bWJlciB0byBiZWdpbiBpbmRleGluZw0KICAgICAgICAgKiAgQHBhcmFtIHtPYmplY3R9IGZpbGVJbmZvICAgICAtIGZpbGVJbmZvIHRvIGF0dGFjaCB0byBjcmVhdGVkIG5vZGVzDQogICAgICAgICAqLw0KICAgICAgICBmdW5jdGlvbiBwYXJzZU5vZGUoc3RyLCBwYXJzZUxpc3QsIGN1cnJlbnRJbmRleCwgZmlsZUluZm8sIGNhbGxiYWNrKSB7DQogICAgICAgICAgICB2YXIgcmVzdWx0Ow0KICAgICAgICAgICAgdmFyIHJldHVybk5vZGVzID0gW107DQogICAgICAgICAgICB2YXIgcGFyc2VyID0gcGFyc2VySW5wdXQ7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHBhcnNlci5zdGFydChzdHIsIGZhbHNlLCBmdW5jdGlvbiBmYWlsKG1zZywgaW5kZXgpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soew0KICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbXNnLA0KICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgY3VycmVudEluZGV4DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwLCBwID0gdm9pZCAwLCBpID0gdm9pZCAwOyAocCA9IHBhcnNlTGlzdFt4XSk7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICBpID0gcGFyc2VyLmk7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcnNlcnNbcF0oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuX2luZGV4ID0gaSArIGN1cnJlbnRJbmRleDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuX2ZpbGVJbmZvID0gZmlsZUluZm87DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Ob2Rlcy5wdXNoKHJlc3VsdCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Ob2Rlcy5wdXNoKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBlbmRJbmZvID0gcGFyc2VyLmVuZCgpOw0KICAgICAgICAgICAgICAgIGlmIChlbmRJbmZvLmlzRmluaXNoZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0dXJuTm9kZXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSwgbnVsbCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGVzc0Vycm9yKHsNCiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGUuaW5kZXggKyBjdXJyZW50SW5kZXgsDQogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQ0KICAgICAgICAgICAgICAgIH0sIGltcG9ydHMsIGZpbGVJbmZvLmZpbGVuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAvLw0KICAgICAgICAvLyBUaGUgUGFyc2VyDQogICAgICAgIC8vDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBwYXJzZXJJbnB1dDogcGFyc2VySW5wdXQsDQogICAgICAgICAgICBpbXBvcnRzOiBpbXBvcnRzLA0KICAgICAgICAgICAgZmlsZUluZm86IGZpbGVJbmZvLA0KICAgICAgICAgICAgcGFyc2VOb2RlOiBwYXJzZU5vZGUsDQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgLy8gUGFyc2UgYW4gaW5wdXQgc3RyaW5nIGludG8gYW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUsDQogICAgICAgICAgICAvLyBAcGFyYW0gc3RyIEEgc3RyaW5nIGNvbnRhaW5pbmcgJ2xlc3MnIG1hcmt1cA0KICAgICAgICAgICAgLy8gQHBhcmFtIGNhbGxiYWNrIGNhbGwgYGNhbGxiYWNrYCB3aGVuIGRvbmUuDQogICAgICAgICAgICAvLyBAcGFyYW0gW2FkZGl0aW9uYWxEYXRhXSBBbiBvcHRpb25hbCBtYXAgd2hpY2ggY2FuIGNvbnRhaW5zIHZhcnMgLSBhIG1hcCAoa2V5LCB2YWx1ZSkgb2YgdmFyaWFibGVzIHRvIGFwcGx5DQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChzdHIsIGNhbGxiYWNrLCBhZGRpdGlvbmFsRGF0YSkgew0KICAgICAgICAgICAgICAgIHZhciByb290Ow0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG51bGw7DQogICAgICAgICAgICAgICAgdmFyIGdsb2JhbFZhcnM7DQogICAgICAgICAgICAgICAgdmFyIG1vZGlmeVZhcnM7DQogICAgICAgICAgICAgICAgdmFyIGlnbm9yZWQ7DQogICAgICAgICAgICAgICAgdmFyIHByZVRleHQgPSAnJzsNCiAgICAgICAgICAgICAgICBnbG9iYWxWYXJzID0gKGFkZGl0aW9uYWxEYXRhICYmIGFkZGl0aW9uYWxEYXRhLmdsb2JhbFZhcnMpID8gUGFyc2VyLnNlcmlhbGl6ZVZhcnMoYWRkaXRpb25hbERhdGEuZ2xvYmFsVmFycykgKyAiXG4iIDogJyc7DQogICAgICAgICAgICAgICAgbW9kaWZ5VmFycyA9IChhZGRpdGlvbmFsRGF0YSAmJiBhZGRpdGlvbmFsRGF0YS5tb2RpZnlWYXJzKSA/ICJcbiIgKyBQYXJzZXIuc2VyaWFsaXplVmFycyhhZGRpdGlvbmFsRGF0YS5tb2RpZnlWYXJzKSA6ICcnOw0KICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnBsdWdpbk1hbmFnZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZVByb2Nlc3NvcnMgPSBjb250ZXh0LnBsdWdpbk1hbmFnZXIuZ2V0UHJlUHJvY2Vzc29ycygpOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZVByb2Nlc3NvcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHByZVByb2Nlc3NvcnNbaV0ucHJvY2VzcyhzdHIsIHsgY29udGV4dDogY29udGV4dCwgaW1wb3J0czogaW1wb3J0cywgZmlsZUluZm86IGZpbGVJbmZvIH0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChnbG9iYWxWYXJzIHx8IChhZGRpdGlvbmFsRGF0YSAmJiBhZGRpdGlvbmFsRGF0YS5iYW5uZXIpKSB7DQogICAgICAgICAgICAgICAgICAgIHByZVRleHQgPSAoKGFkZGl0aW9uYWxEYXRhICYmIGFkZGl0aW9uYWxEYXRhLmJhbm5lcikgPyBhZGRpdGlvbmFsRGF0YS5iYW5uZXIgOiAnJykgKyBnbG9iYWxWYXJzOw0KICAgICAgICAgICAgICAgICAgICBpZ25vcmVkID0gaW1wb3J0cy5jb250ZW50c0lnbm9yZWRDaGFyczsNCiAgICAgICAgICAgICAgICAgICAgaWdub3JlZFtmaWxlSW5mby5maWxlbmFtZV0gPSBpZ25vcmVkW2ZpbGVJbmZvLmZpbGVuYW1lXSB8fCAwOw0KICAgICAgICAgICAgICAgICAgICBpZ25vcmVkW2ZpbGVJbmZvLmZpbGVuYW1lXSArPSBwcmVUZXh0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xyXG4/L2csICdcbicpOw0KICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwb3RlbnRpYWwgVVRGIEJ5dGUgT3JkZXIgTWFyaw0KICAgICAgICAgICAgICAgIHN0ciA9IHByZVRleHQgKyBzdHIucmVwbGFjZSgvXlx1RkVGRi8sICcnKSArIG1vZGlmeVZhcnM7DQogICAgICAgICAgICAgICAgaW1wb3J0cy5jb250ZW50c1tmaWxlSW5mby5maWxlbmFtZV0gPSBzdHI7DQogICAgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCB0aGUgcHJpbWFyeSBydWxlLg0KICAgICAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBzeW50YXggdHJlZSBpcyBoZWxkIHVuZGVyIGEgUnVsZXNldCBub2RlLA0KICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGByb290YCBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZSwgc28gbm8gYHt9YCBhcmUNCiAgICAgICAgICAgICAgICAvLyBvdXRwdXQuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgaW5wdXQgaXMgcGFyc2VkLg0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnN0YXJ0KHN0ciwgY29udGV4dC5jaHVua0lucHV0LCBmdW5jdGlvbiBmYWlsKG1zZywgaW5kZXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMZXNzRXJyb3Ioew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUGFyc2UnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1zZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZUluZm8uZmlsZW5hbWUNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGltcG9ydHMpOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgdHJlZS5Ob2RlLnByb3RvdHlwZS5wYXJzZSA9IHRoaXM7DQogICAgICAgICAgICAgICAgICAgIHJvb3QgPSBuZXcgdHJlZS5SdWxlc2V0KG51bGwsIHRoaXMucGFyc2Vycy5wcmltYXJ5KCkpOw0KICAgICAgICAgICAgICAgICAgICB0cmVlLk5vZGUucHJvdG90eXBlLnJvb3ROb2RlID0gcm9vdDsNCiAgICAgICAgICAgICAgICAgICAgcm9vdC5yb290ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgcm9vdC5maXJzdFJvb3QgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICByb290LmZ1bmN0aW9uUmVnaXN0cnkgPSBmdW5jdGlvblJlZ2lzdHJ5LmluaGVyaXQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBMZXNzRXJyb3IoZSwgaW1wb3J0cywgZmlsZUluZm8uZmlsZW5hbWUpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gSWYgYGlgIGlzIHNtYWxsZXIgdGhhbiB0aGUgYGlucHV0Lmxlbmd0aCAtIDFgLA0KICAgICAgICAgICAgICAgIC8vIGl0IG1lYW5zIHRoZSBwYXJzZXIgd2Fzbid0IGFibGUgdG8gcGFyc2UgdGhlIHdob2xlDQogICAgICAgICAgICAgICAgLy8gc3RyaW5nLCBzbyB3ZSd2ZSBnb3QgYSBwYXJzaW5nIGVycm9yLg0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIGV4dHJhY3QgYSBcbiBkZWxpbWl0ZWQgc3RyaW5nLA0KICAgICAgICAgICAgICAgIC8vIHNob3dpbmcgdGhlIGxpbmUgd2hlcmUgdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLg0KICAgICAgICAgICAgICAgIC8vIFdlIHNwbGl0IGl0IHVwIGludG8gdHdvIHBhcnRzICh0aGUgcGFydCB3aGljaCBwYXJzZWQsDQogICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBwYXJ0IHdoaWNoIGRpZG4ndCksIHNvIHdlIGNhbiBjb2xvciB0aGVtIGRpZmZlcmVudGx5Lg0KICAgICAgICAgICAgICAgIHZhciBlbmRJbmZvID0gcGFyc2VySW5wdXQuZW5kKCk7DQogICAgICAgICAgICAgICAgaWYgKCFlbmRJbmZvLmlzRmluaXNoZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBlbmRJbmZvLmZ1cnRoZXN0UG9zc2libGVFcnJvck1lc3NhZ2U7DQogICAgICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdVbnJlY29nbmlzZWQgaW5wdXQnOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZm8uZnVydGhlc3RDaGFyID09PSAnfScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcuIFBvc3NpYmx5IG1pc3Npbmcgb3BlbmluZyBcJ3tcJyc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbmRJbmZvLmZ1cnRoZXN0Q2hhciA9PT0gJyknKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSAnLiBQb3NzaWJseSBtaXNzaW5nIG9wZW5pbmcgXCcoXCcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5kSW5mby5mdXJ0aGVzdFJlYWNoZWRFbmQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcuIFBvc3NpYmx5IG1pc3Npbmcgc29tZXRoaW5nJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBMZXNzRXJyb3Ioew0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BhcnNlJywNCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogZW5kSW5mby5mdXJ0aGVzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlSW5mby5maWxlbmFtZQ0KICAgICAgICAgICAgICAgICAgICB9LCBpbXBvcnRzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFyIGZpbmlzaCA9IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAgICAgICAgIGUgPSBlcnJvciB8fCBlIHx8IGltcG9ydHMuZXJyb3I7DQogICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTGVzc0Vycm9yKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuZXcgTGVzc0Vycm9yKGUsIGltcG9ydHMsIGZpbGVJbmZvLmZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByb290KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgaWYgKGNvbnRleHQucHJvY2Vzc0ltcG9ydHMgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIG5ldyB2aXNpdG9ycy5JbXBvcnRWaXNpdG9yKGltcG9ydHMsIGZpbmlzaCkNCiAgICAgICAgICAgICAgICAgICAgICAgIC5ydW4ocm9vdCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICAvLyBIZXJlIGluLCB0aGUgcGFyc2luZyBydWxlcy9mdW5jdGlvbnMNCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICAvLyBUaGUgYmFzaWMgc3RydWN0dXJlIG9mIHRoZSBzeW50YXggdHJlZSBnZW5lcmF0ZWQgaXMgYXMgZm9sbG93czoNCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICAvLyAgIFJ1bGVzZXQgLT4gIERlY2xhcmF0aW9uIC0+IFZhbHVlIC0+IEV4cHJlc3Npb24gLT4gRW50aXR5DQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgLy8gSGVyZSdzIHNvbWUgTGVzcyBjb2RlOg0KICAgICAgICAgICAgLy8NCiAgICAgICAgICAgIC8vICAgIC5jbGFzcyB7DQogICAgICAgICAgICAvLyAgICAgIGNvbG9yOiAjZmZmOw0KICAgICAgICAgICAgLy8gICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwOw0KICAgICAgICAgICAgLy8gICAgICB3aWR0aDogQHcgKyA0cHg7DQogICAgICAgICAgICAvLyAgICAgID4gLmNoaWxkIHsuLi59DQogICAgICAgICAgICAvLyAgICB9DQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgLy8gQW5kIGhlcmUncyB3aGF0IHRoZSBwYXJzZSB0cmVlIG1pZ2h0IGxvb2sgbGlrZToNCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICAvLyAgICAgUnVsZXNldCAoU2VsZWN0b3IgJy5jbGFzcycsIFsNCiAgICAgICAgICAgIC8vICAgICAgICAgRGVjbGFyYXRpb24gKCJjb2xvciIsICBWYWx1ZSAoW0V4cHJlc3Npb24gW0NvbG9yICNmZmZdXSkpDQogICAgICAgICAgICAvLyAgICAgICAgIERlY2xhcmF0aW9uICgiYm9yZGVyIiwgVmFsdWUgKFtFeHByZXNzaW9uIFtEaW1lbnNpb24gMXB4XVtLZXl3b3JkICJzb2xpZCJdW0NvbG9yICMwMDBdXSkpDQogICAgICAgICAgICAvLyAgICAgICAgIERlY2xhcmF0aW9uICgid2lkdGgiLCAgVmFsdWUgKFtFeHByZXNzaW9uIFtPcGVyYXRpb24gIiArICIgW1ZhcmlhYmxlICJAdyJdW0RpbWVuc2lvbiA0cHhdXV0pKQ0KICAgICAgICAgICAgLy8gICAgICAgICBSdWxlc2V0IChTZWxlY3RvciBbRWxlbWVudCAnPicsICcuY2hpbGQnXSwgWy4uLl0pDQogICAgICAgICAgICAvLyAgICAgXSkNCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICAvLyAgSW4gZ2VuZXJhbCwgbW9zdCBydWxlcyB3aWxsIHRyeSB0byBwYXJzZSBhIHRva2VuIHdpdGggdGhlIGAkcmUoKWAgZnVuY3Rpb24sIGFuZCBpZiB0aGUgcmV0dXJuDQogICAgICAgICAgICAvLyAgdmFsdWUgaXMgdHJ1bHksIHdpbGwgcmV0dXJuIGEgbmV3IG5vZGUsIG9mIHRoZSByZWxldmFudCB0eXBlLiBTb21ldGltZXMsIHdlIG5lZWQgdG8gY2hlY2sNCiAgICAgICAgICAgIC8vICBmaXJzdCwgYmVmb3JlIHBhcnNpbmcsIHRoYXQncyB3aGVuIHdlIHVzZSBgcGVlaygpYC4NCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICBwYXJzZXJzOiBwYXJzZXJzID0gew0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gVGhlIGBwcmltYXJ5YCBydWxlIGlzIHRoZSAqZW50cnkqIGFuZCAqZXhpdCogcG9pbnQgb2YgdGhlIHBhcnNlci4NCiAgICAgICAgICAgICAgICAvLyBUaGUgcnVsZXMgaGVyZSBjYW4gYXBwZWFyIGF0IGFueSBsZXZlbCBvZiB0aGUgcGFyc2UgdHJlZS4NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIFRoZSByZWN1cnNpdmUgbmF0dXJlIG9mIHRoZSBncmFtbWFyIGlzIGFuIGludGVycGxheSBiZXR3ZWVuIHRoZSBgYmxvY2tgDQogICAgICAgICAgICAgICAgLy8gcnVsZSwgd2hpY2ggcmVwcmVzZW50cyBgeyAuLi4gfWAsIHRoZSBgcnVsZXNldGAgcnVsZSwgYW5kIHRoaXMgYHByaW1hcnlgIHJ1bGUsDQogICAgICAgICAgICAgICAgLy8gYXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBzaW1wbGlmaWVkIGdyYW1tYXI6DQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyAgICAgcHJpbWFyeSAg4oaSICAocnVsZXNldCB8IGRlY2xhcmF0aW9uKSsNCiAgICAgICAgICAgICAgICAvLyAgICAgcnVsZXNldCAg4oaSICBzZWxlY3RvcisgYmxvY2sNCiAgICAgICAgICAgICAgICAvLyAgICAgYmxvY2sgICAg4oaSICAneycgcHJpbWFyeSAnfScNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIE9ubHkgYXQgb25lIHBvaW50IGlzIHRoZSBwcmltYXJ5IHJ1bGUgbm90IGNhbGxlZCBmcm9tIHRoZQ0KICAgICAgICAgICAgICAgIC8vIGJsb2NrIHJ1bGU6IGF0IHRoZSByb290IGxldmVsLg0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgcHJpbWFyeTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgbWl4aW4gPSB0aGlzLm1peGluOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IFtdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZTsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHRoaXMuY29tbWVudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5wdXNoKG5vZGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHByb2Nlc3MgY29tbWVudHMgYmVmb3JlIGRlY2lkaW5nIGlmIGZpbmlzaGVkDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuZmluaXNoZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC5wZWVrKCd9JykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLmV4dGVuZFJ1bGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHJvb3QuY29uY2F0KG5vZGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG1peGluLmRlZmluaXRpb24oKSB8fCB0aGlzLmRlY2xhcmF0aW9uKCkgfHwgbWl4aW4uY2FsbChmYWxzZSwgZmFsc2UpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlc2V0KCkgfHwgdGhpcy52YXJpYWJsZUNhbGwoKSB8fCB0aGlzLmVudGl0aWVzLmNhbGwoKSB8fCB0aGlzLmF0cnVsZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LnB1c2gobm9kZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmRTZW1pQ29sb24gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyc2VySW5wdXQuJGNoYXIoJzsnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFNlbWlDb2xvbiA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRTZW1pQ29sb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByb290Ow0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8gY29tbWVudHMgYXJlIGNvbGxlY3RlZCBieSB0aGUgbWFpbiBwYXJzaW5nIG1lY2hhbmlzbSBhbmQgdGhlbiBhc3NpZ25lZCB0byBub2Rlcw0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBjdXJyZW50IHN0cnVjdHVyZSBhbGxvd3MgaXQNCiAgICAgICAgICAgICAgICBjb21tZW50OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC5jb21tZW50U3RvcmUubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHBhcnNlcklucHV0LmNvbW1lbnRTdG9yZS5zaGlmdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5Db21tZW50KShjb21tZW50LnRleHQsIGNvbW1lbnQuaXNMaW5lQ29tbWVudCwgY29tbWVudC5pbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEVudGl0aWVzIGFyZSB0b2tlbnMgd2hpY2ggY2FuIGJlIGZvdW5kIGluc2lkZSBhbiBFeHByZXNzaW9uDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICBlbnRpdGllczogew0KICAgICAgICAgICAgICAgICAgICBtaXhpbkxvb2t1cDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcnMubWl4aW4uY2FsbCh0cnVlLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gQSBzdHJpbmcsIHdoaWNoIHN1cHBvcnRzIGVzY2FwaW5nICIgYW5kICcNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gICAgICJtaWxreSB3YXkiICdoZVwncyB0aGUgb25lIScNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgcXVvdGVkOiBmdW5jdGlvbiAoZm9yY2VFc2NhcGVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0VzY2FwZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnNhdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC4kY2hhcignficpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFc2NhcGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcmNlRXNjYXBlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBwYXJzZXJJbnB1dC4kcXVvdGVkKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuUXVvdGVkKShzdHIuY2hhckF0KDApLCBzdHIuc3Vic3RyKDEsIHN0ci5sZW5ndGggLSAyKSwgaXNFc2NhcGVkLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyBBIGNhdGNoLWFsbCB3b3JkLCBzdWNoIGFzOg0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmxhY2sgYm9yZGVyLWNvbGxhcHNlDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gcGFyc2VySW5wdXQuJGNoYXIoJyUnKSB8fCBwYXJzZXJJbnB1dC4kcmUoL15cWz8oPzpbXHctXXxcXCg/OltBLUZhLWYwLTldezEsNn0gP3xbXkEtRmEtZjAtOV0pKStcXT8vKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyZWUuQ29sb3IuZnJvbUtleXdvcmQoaykgfHwgbmV3ICh0cmVlLktleXdvcmQpKGspOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyBBIGZ1bmN0aW9uIGNhbGwNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJnYigyNTUsIDAsIDI1NSkNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgcGFyc2VkIHdpdGggdGhlIGBlbnRpdGllcy5hcmd1bWVudHNgIHBhcnNlci4NCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgY2FsbDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnczsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmdW5jOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2Nhc2UtaW5zZW5zaXRpdmUtcmVnZXgtdnMtc3RydG9sb3dlci10aGVuLXJlZ2V4LzE4DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQucGVlaygvXnVybFwoL2kpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhcnNlcklucHV0LiRyZSgvXihbXHctXSt8JXx+fHByb2dpZDpbXHdcLl0rKVwoLyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVsxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSB0aGlzLmN1c3RvbUZ1bmNDYWxsKG5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gZnVuYy5wYXJzZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzICYmIGZ1bmMuc3RvcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3M7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IHRoaXMuYXJndW1lbnRzKGFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXJJbnB1dC4kY2hhcignKScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgnQ291bGQgbm90IHBhcnNlIGNhbGwgYXJndW1lbnRzIG9yIG1pc3NpbmcgXCcpXCcnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuQ2FsbCkobmFtZSwgYXJncywgaW5kZXgsIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2luZyBydWxlcyBmb3IgZnVuY3Rpb25zIHdpdGggbm9uLXN0YW5kYXJkIGFyZ3MsIGUuZy46DQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vICAgICBib29sZWFuKG5vdCgyID4gMSkpDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vICAgICBUaGlzIGlzIGEgcXVpY2sgcHJvdG90eXBlLCB0byBiZSBtb2RpZmllZC9pbXByb3ZlZCB3aGVuDQogICAgICAgICAgICAgICAgICAgIC8vICAgICBtb3JlIGN1c3RvbS1wYXJzZWQgZnVuY3MgY29tZSAoZS5nLiBgc2VsZWN0b3IoLi4uKWApDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIGN1c3RvbUZ1bmNDYWxsOiBmdW5jdGlvbiAobmFtZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgLyogSWRlYWxseSB0aGUgdGFibGUgaXMgdG8gYmUgbW92ZWQgb3V0IG9mIGhlcmUgZm9yIGZhc3RlciBwZXJmLiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCdzIHF1aXRlIHRyaWNreSBzaW5jZSBpdCByZWxpZXMgb24gYWxsIHRoZXNlIGBwYXJzZXJzYA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGBleHBlY3RgIGF2YWlsYWJsZSBvbmx5IGhlcmUgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE6IGYocGFyc2Vycy5pZUFscGhhLCB0cnVlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuOiBmKGNvbmRpdGlvbiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmJzogZihjb25kaXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICB9W25hbWUudG9Mb3dlckNhc2UoKV07DQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHBhcnNlLCBzdG9wKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2U6IHBhcnNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wOiBzdG9wIC8vIHdoZW4gdHJ1ZSAtIHN0b3AgYWZ0ZXIgcGFyc2UoKSBhbmQgcmV0dXJuIGl0cyByZXN1bHQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgY29udGludWUgZm9yIHBsYWluIGFyZ3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29uZGl0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXhwZWN0KHBhcnNlcnMuY29uZGl0aW9uLCAnZXhwZWN0ZWQgY29uZGl0aW9uJyldOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IGZ1bmN0aW9uIChwcmV2QXJncykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3NDb21tYSA9IHByZXZBcmdzIHx8IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3NTZW1pQ29sb24gPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1NlbWlDb2xvblNlcGFyYXRlZDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnNhdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZBcmdzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZBcmdzID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlcnMuZGV0YWNoZWRSdWxlc2V0KCkgfHwgdGhpcy5hc3NpZ25tZW50KCkgfHwgcGFyc2Vycy5leHByZXNzaW9uKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS52YWx1ZSAmJiB2YWx1ZS52YWx1ZS5sZW5ndGggPT0gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZVswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzQ29tbWEucHVzaCh2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC4kY2hhcignLCcpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJzsnKSB8fCBpc1NlbWlDb2xvblNlcGFyYXRlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbWlDb2xvblNlcGFyYXRlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKGFyZ3NDb21tYS5sZW5ndGggPCAxKSA/IGFyZ3NDb21tYVswXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgdHJlZS5WYWx1ZShhcmdzQ29tbWEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzU2VtaUNvbG9uLnB1c2godmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzQ29tbWEgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1NlbWlDb2xvblNlcGFyYXRlZCA/IGFyZ3NTZW1pQ29sb24gOiBhcmdzQ29tbWE7DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIGxpdGVyYWw6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbigpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xvcigpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdW90ZWQoKSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5pY29kZURlc2NyaXB0b3IoKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWdubWVudHMgYXJlIGFyZ3VtZW50IGVudGl0aWVzIGZvciBjYWxscy4NCiAgICAgICAgICAgICAgICAgICAgLy8gVGhleSBhcmUgcHJlc2VudCBpbiBpZSBmaWx0ZXIgcHJvcGVydGllcyBhcyBzaG93biBiZWxvdy4NCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKCAqb3BhY2l0eT01MCogKQ0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGFyc2VySW5wdXQuJHJlKC9eXHcrKD89XHM/PSkvaSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCc9JykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZXJzLmVudGl0eSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5Bc3NpZ25tZW50KShrZXksIHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdXJsKCkgdG9rZW5zDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBhIHNwZWNpZmljIHJ1bGUgZm9yIHVybHMsIGJlY2F1c2UgdGhleSBkb24ndCByZWFsbHkgYmVoYXZlIGxpa2UNCiAgICAgICAgICAgICAgICAgICAgLy8gc3RhbmRhcmQgZnVuY3Rpb24gY2FsbHMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGFyZ3VtZW50IGRvZXNuJ3QgaGF2ZQ0KICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBlbmNsb3NlZCB3aXRoaW4gYSBzdHJpbmcsIHNvIGl0IGNhbid0IGJlIHBhcnNlZCBhcyBhbiBFeHByZXNzaW9uLg0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICB1cmw6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5hdXRvQ29tbWVudEFic29yYiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXJJbnB1dC4kc3RyKCd1cmwoJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5hdXRvQ29tbWVudEFic29yYiA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnF1b3RlZCgpIHx8IHRoaXMudmFyaWFibGUoKSB8fCB0aGlzLnByb3BlcnR5KCkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC4kcmUoL14oPzooPzpcXFtcKFwpJyJdKXxbXlwoXCknIl0pKy8pIHx8ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuYXV0b0NvbW1lbnRBYnNvcmIgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0Q2hhcignKScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5VUkwpKCh2YWx1ZS52YWx1ZSAhPSBudWxsIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiB0cmVlLlZhcmlhYmxlIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiB0cmVlLlByb3BlcnR5KSA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgOiBuZXcgKHRyZWUuQW5vbnltb3VzKSh2YWx1ZSwgaW5kZXgpLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyBBIFZhcmlhYmxlIGVudGl0eSwgc3VjaCBhcyBgQGZpbmtgLCBpbg0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyAgICAgd2lkdGg6IEBmaW5rICsgMnB4DQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBhIGRpZmZlcmVudCBwYXJzZXIgZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zLA0KICAgICAgICAgICAgICAgICAgICAvLyBzZWUgYHBhcnNlcnMudmFyaWFibGVgLg0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LmN1cnJlbnRDaGFyKCkgPT09ICdAJyAmJiAobmFtZSA9IHBhcnNlcklucHV0LiRyZSgvXkBAP1tcdy1dKy8pKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gcGFyc2VySW5wdXQuY3VycmVudENoYXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcoJyB8fCBjaCA9PT0gJ1snICYmICFwYXJzZXJJbnB1dC5wcmV2Q2hhcigpLm1hdGNoKC9eXHMvKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1heSBiZSBhIFZhcmlhYmxlQ2FsbCBsb29rdXANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlcnMudmFyaWFibGVDYWxsKG5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5WYXJpYWJsZSkobmFtZSwgaW5kZXgsIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgLy8gQSB2YXJpYWJsZSBlbnRpdHkgdXNpbmcgdGhlIHByb3RlY3RpdmUge30gZS5nLiBAe3Zhcn0NCiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVDdXJseTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cmx5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpID09PSAnQCcgJiYgKGN1cmx5ID0gcGFyc2VySW5wdXQuJHJlKC9eQFx7KFtcdy1dKylcfS8pKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuVmFyaWFibGUpKCJAIiArIGN1cmx5WzFdLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyBBIFByb3BlcnR5IGFjY2Vzc29yLCBzdWNoIGFzIGAkY29sb3JgLCBpbg0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuY3VycmVudENoYXIoKSA9PT0gJyQnICYmIChuYW1lID0gcGFyc2VySW5wdXQuJHJlKC9eXCRbXHctXSsvKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLlByb3BlcnR5KShuYW1lLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAvLyBBIHByb3BlcnR5IGVudGl0eSB1c2VpbmcgdGhlIHByb3RlY3RpdmUge30gZS5nLiAke3Byb3B9DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3VybHk6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJseTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuY3VycmVudENoYXIoKSA9PT0gJyQnICYmIChjdXJseSA9IHBhcnNlcklucHV0LiRyZSgvXlwkXHsoW1x3LV0rKVx9LykpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5Qcm9wZXJ0eSkoIiQiICsgY3VybHlbMV0sIGluZGV4LCBmaWxlSW5mbyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vIEEgSGV4YWRlY2ltYWwgY29sb3INCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gICAgICM0RjNDMkYNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gYHJnYmAgYW5kIGBoc2xgIGNvbG9ycyBhcmUgcGFyc2VkIHRocm91Z2ggdGhlIGBlbnRpdGllcy5jYWxsYCBwYXJzZXIuDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmdiOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LmN1cnJlbnRDaGFyKCkgPT09ICcjJyAmJiAocmdiID0gcGFyc2VySW5wdXQuJHJlKC9eIyhbQS1GYS1mMC05XXs4fXxbQS1GYS1mMC05XXs2fXxbQS1GYS1mMC05XXszLDR9KShbXHcuI1xbXSk/LykpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZ2JbMl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuQ29sb3IpKHJnYlsxXSwgdW5kZWZpbmVkLCByZ2JbMF0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgY29sb3JLZXl3b3JkOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0b0NvbW1lbnRBYnNvcmIgPSBwYXJzZXJJbnB1dC5hdXRvQ29tbWVudEFic29yYjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmF1dG9Db21tZW50QWJzb3JiID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IHBhcnNlcklucHV0LiRyZSgvXltfQS1aYS16LV1bX0EtWmEtejAtOS1dKy8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuYXV0b0NvbW1lbnRBYnNvcmIgPSBhdXRvQ29tbWVudEFic29yYjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IHRyZWUuQ29sb3IuZnJvbUtleXdvcmQoayk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC4kc3RyKGspOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gQSBEaW1lbnNpb24sIHRoYXQgaXMsIGEgbnVtYmVyIGFuZCBhIHVuaXQNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gICAgIDAuNWVtIDk1JQ0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb246IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC5wZWVrTm90TnVtZXJpYygpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VySW5wdXQuJHJlKC9eKFsrLV0/XGQqXC4/XGQrKSglfFthLXpfXSspPy9pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuRGltZW5zaW9uKSh2YWx1ZVsxXSwgdmFsdWVbMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyBBIHVuaWNvZGUgZGVzY3JpcHRvciwgYXMgaXMgdXNlZCBpbiB1bmljb2RlLXJhbmdlDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vIFUrMD8/ICBvciBVKzAwQTEtMDBBOQ0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICB1bmljb2RlRGVzY3JpcHRvcjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgdWQgPSBwYXJzZXJJbnB1dC4kcmUoL15VXCtbMC05YS1mQS1GP10rKFwtWzAtOWEtZkEtRj9dKyk/Lyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLlVuaWNvZGVEZXNjcmlwdG9yKSh1ZFswXSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vIEphdmFTY3JpcHQgY29kZSB0byBiZSBldmFsdWF0ZWQNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGB3aW5kb3cubG9jYXRpb24uaHJlZmANCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpzOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnNhdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlc2NhcGUgPSBwYXJzZXJJbnB1dC4kY2hhcignficpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpzUXVvdGUgPSBwYXJzZXJJbnB1dC4kY2hhcignYCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFqc1F1b3RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGpzID0gcGFyc2VySW5wdXQuJHJlKC9eW15gXSpgLyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLkphdmFTY3JpcHQpKGpzLnN1YnN0cigwLCBqcy5sZW5ndGggLSAxKSwgQm9vbGVhbihlc2NhcGUpLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgnaW52YWxpZCBqYXZhc2NyaXB0IGRlZmluaXRpb24nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyBUaGUgdmFyaWFibGUgcGFydCBvZiBhIHZhcmlhYmxlIGRlZmluaXRpb24uIFVzZWQgaW4gdGhlIGBydWxlYCBwYXJzZXINCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vICAgICBAZmluazoNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lOw0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuY3VycmVudENoYXIoKSA9PT0gJ0AnICYmIChuYW1lID0gcGFyc2VySW5wdXQuJHJlKC9eKEBbXHctXSspXHMqOi8pKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVbMV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gQ2FsbCBhIHZhcmlhYmxlIHZhbHVlIHRvIHJldHJpZXZlIGEgZGV0YWNoZWQgcnVsZXNldA0KICAgICAgICAgICAgICAgIC8vIG9yIGEgdmFsdWUgZnJvbSBhIGRldGFjaGVkIHJ1bGVzZXQncyBydWxlcy4NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vICAgICBAZmluaygpOw0KICAgICAgICAgICAgICAgIC8vICAgICBAZmluazsNCiAgICAgICAgICAgICAgICAvLyAgICAgY29sb3I6IEBmaW5rW0Bjb2xvcl07DQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICB2YXJpYWJsZUNhbGw6IGZ1bmN0aW9uIChwYXJzZWROYW1lKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBsb29rdXBzOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgIHZhciBpblZhbHVlID0gISFwYXJzZWROYW1lOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IHBhcnNlZE5hbWU7DQogICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnNhdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgfHwgKHBhcnNlcklucHV0LmN1cnJlbnRDaGFyKCkgPT09ICdAJw0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG5hbWUgPSBwYXJzZXJJbnB1dC4kcmUoL14oQFtcdy1dKykoXChccypcKSk/LykpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwcyA9IHRoaXMubWl4aW4ucnVsZUxvb2t1cHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9va3VwcyAmJiAoKGluVmFsdWUgJiYgcGFyc2VySW5wdXQuJHN0cignKCknKSAhPT0gJygpJykgfHwgKG5hbWVbMl0gIT09ICcoKScpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoJ01pc3NpbmcgXCdbLi4uXVwnIGxvb2t1cCBpbiB2YXJpYWJsZSBjYWxsJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpblZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbMV07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbCA9IG5ldyB0cmVlLlZhcmlhYmxlQ2FsbChuYW1lLCBpLCBmaWxlSW5mbyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluVmFsdWUgJiYgcGFyc2Vycy5lbmQoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0cmVlLk5hbWVzcGFjZVZhbHVlKGNhbGwsIGxvb2t1cHMsIGksIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIGV4dGVuZCBzeW50YXggLSB1c2VkIHRvIGV4dGVuZCBzZWxlY3RvcnMNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIGV4dGVuZDogZnVuY3Rpb24gKGlzUnVsZSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHM7DQogICAgICAgICAgICAgICAgICAgIHZhciBlOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9uOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZXh0ZW5kTGlzdDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuZDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXJJbnB1dC4kc3RyKGlzUnVsZSA/ICcmOmV4dGVuZCgnIDogJzpleHRlbmQoJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCEob3B0aW9uID0gcGFyc2VySW5wdXQuJHJlKC9eKGFsbCkoPz1ccyooXCl8LCkpLykpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuZWxlbWVudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IFtlXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBvcHRpb24gJiYgb3B0aW9uWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50cykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdNaXNzaW5nIHRhcmdldCBzZWxlY3RvciBmb3IgOmV4dGVuZCgpLicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kID0gbmV3ICh0cmVlLkV4dGVuZCkobmV3ICh0cmVlLlNlbGVjdG9yKShlbGVtZW50cyksIG9wdGlvbiwgaW5kZXgsIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmRMaXN0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kTGlzdC5wdXNoKGV4dGVuZCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRMaXN0ID0gW2V4dGVuZF07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlcklucHV0LiRjaGFyKCcsJykpOw0KICAgICAgICAgICAgICAgICAgICBleHBlY3QoL15cKS8pOw0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNSdWxlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoL147Lyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVuZExpc3Q7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIGV4dGVuZFJ1bGUgLSB1c2VkIGluIGEgcnVsZSB0byBleHRlbmQgYWxsIHRoZSBwYXJlbnQgc2VsZWN0b3JzDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICBleHRlbmRSdWxlOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVuZCh0cnVlKTsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gTWl4aW5zDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICBtaXhpbjogew0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyBBIE1peGluIGNhbGwsIHdpdGggYW4gb3B0aW9uYWwgYXJndW1lbnQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyAgICAgI21peGlucyA+IC5zcXVhcmUoI2ZmZik7DQogICAgICAgICAgICAgICAgICAgIC8vICAgICAjbWl4aW5zLnNxdWFyZSgjZmZmKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC5yb3VuZGVkKDRweCwgYmxhY2spOw0KICAgICAgICAgICAgICAgICAgICAvLyAgICAgLmJ1dHRvbjsNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGxvb2t1cCAvIHJldHVybiBhIHZhbHVlIHVzaW5nIHRoZSBsb29rdXAgc3ludGF4Og0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29sb3I6ICNtaXhpbi5zcXVhcmUoI2ZmZilbQGNvbG9yXTsNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGB3aGlsZWAgbG9vcCBpcyB0aGVyZSBiZWNhdXNlIG1peGlucyBjYW4gYmUNCiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlZCwgYnV0IHdlIG9ubHkgc3VwcG9ydCB0aGUgY2hpbGQgYW5kIGRlc2NlbmRhbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0b3IgZm9yIG5vdy4NCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgY2FsbDogZnVuY3Rpb24gKGluVmFsdWUsIGdldExvb2t1cCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltcG9ydGFudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvb2t1cHM7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3M7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFzUGFyZW5zOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT09ICcuJyAmJiBzICE9PSAnIycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7IC8vIHN0b3AgdXMgYWJzb3JiaW5nIHBhcnQgb2YgYW4gaW52YWxpZCBzZWxlY3Rvcg0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJygnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gdGhpcy5hcmdzKHRydWUpLmFyZ3M7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdENoYXIoJyknKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFyZW5zID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvb2t1cCAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwcyA9IHRoaXMucnVsZUxvb2t1cHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvb2t1cCA9PT0gdHJ1ZSAmJiAhbG9va3Vwcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluVmFsdWUgJiYgIWxvb2t1cHMgJiYgIWhhc1BhcmVucykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IGEgdmFsaWQgaW4tdmFsdWUgbWl4aW4gY2FsbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpblZhbHVlICYmIHBhcnNlcnMuaW1wb3J0YW50KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluVmFsdWUgfHwgcGFyc2Vycy5lbmQoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1peGluID0gbmV3ICh0cmVlLm1peGluLkNhbGwpKGVsZW1lbnRzLCBhcmdzLCBpbmRleCwgZmlsZUluZm8sICFsb29rdXBzICYmIGltcG9ydGFudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29rdXBzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRyZWUuTmFtZXNwYWNlVmFsdWUobWl4aW4sIGxvb2t1cHMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1peGluOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAgICAgICAgICogTWF0Y2hpbmcgZWxlbWVudHMgZm9yIG1peGlucw0KICAgICAgICAgICAgICAgICAgICAgKiAoU3RhcnQgd2l0aCAuIG9yICMgYW5kIGNhbiBoYXZlID4gKQ0KICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50czsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtSW5kZXg7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSAvXlsjLl0oPzpbXHctXXxcXCg/OltBLUZhLWYwLTldezEsNn0gP3xbXkEtRmEtZjAtOV0pKSsvOw0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtSW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBwYXJzZXJJbnB1dC4kcmUocmUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IG5ldyAodHJlZS5FbGVtZW50KShjLCBlLCBmYWxzZSwgZWxlbUluZGV4LCBmaWxlSW5mbyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IFtlbGVtXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHBhcnNlcklucHV0LiRjaGFyKCc+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudHM7DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIGFyZ3M6IGZ1bmN0aW9uIChpc0NhbGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IHBhcnNlcnMuZW50aXRpZXM7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB7IGFyZ3M6IG51bGwsIHZhcmlhZGljOiBmYWxzZSB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnc1NlbWlDb2xvbiA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3NDb21tYSA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2VtaUNvbG9uU2VwYXJhdGVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25Db250YWluc05hbWVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZUxvb3A7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cGFuZDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYXNTZXAgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlcnMuZGV0YWNoZWRSdWxlc2V0KCkgfHwgcGFyc2Vycy5leHByZXNzaW9uKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5jb21tZW50U3RvcmUubGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LiRzdHIoJy4uLicpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lci52YXJpYWRpYyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJzsnKSAmJiAhaXNTZW1pQ29sb25TZXBhcmF0ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbWlDb2xvblNlcGFyYXRlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTZW1pQ29sb25TZXBhcmF0ZWQgPyBhcmdzU2VtaUNvbG9uIDogYXJnc0NvbW1hKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXNoKHsgdmFyaWFkaWM6IHRydWUgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBlbnRpdGllcy52YXJpYWJsZSgpIHx8IGVudGl0aWVzLnByb3BlcnR5KCkgfHwgZW50aXRpZXMubGl0ZXJhbCgpIHx8IGVudGl0aWVzLmtleXdvcmQoKSB8fCB0aGlzLmNhbGwodHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJnIHx8ICFoYXNTZXApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMb29wID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLnRocm93QXdheUNvbW1lbnRzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy50aHJvd0F3YXlDb21tZW50cygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFyZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhYmxlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcudmFsdWUgJiYgYXJnLnZhbHVlLmxlbmd0aCA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcmcudmFsdWVbMF07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGFyZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAmJiAodmFsIGluc3RhbmNlb2YgdHJlZS5WYXJpYWJsZSB8fCB2YWwgaW5zdGFuY2VvZiB0cmVlLlByb3BlcnR5KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJzonKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZW1pQ29sb25TZXBhcmF0ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCBtaXggOyBhbmQgLCBhcyBkZWxpbWl0ZXIgdHlwZXMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRhaW5zTmFtZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZXJzLmRldGFjaGVkUnVsZXNldCgpIHx8IHBhcnNlcnMuZXhwcmVzc2lvbigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NhbGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ2NvdWxkIG5vdCB1bmRlcnN0YW5kIHZhbHVlIGZvciBuYW1lZCBhcmd1bWVudCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lci5hcmdzID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTG9vcCA9IChuYW1lID0gdmFsLm5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlcklucHV0LiRzdHIoJy4uLicpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2FsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVyLnZhcmlhZGljID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJzsnKSAmJiAhaXNTZW1pQ29sb25TZXBhcmF0ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZW1pQ29sb25TZXBhcmF0ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTZW1pQ29sb25TZXBhcmF0ZWQgPyBhcmdzU2VtaUNvbG9uIDogYXJnc0NvbW1hKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHVzaCh7IG5hbWU6IGFyZy5uYW1lLCB2YXJpYWRpYzogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWlzQ2FsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVMb29wID0gdmFsLm5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzQ29tbWEucHVzaCh7IG5hbWU6IG5hbWVMb29wLCB2YWx1ZTogdmFsdWUsIGV4cGFuZDogZXhwYW5kIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC4kY2hhcignLCcpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NlcCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNTZXAgPSBwYXJzZXJJbnB1dC4kY2hhcignOycpID09PSAnOyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1NlcCB8fCBpc1NlbWlDb2xvblNlcGFyYXRlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbkNvbnRhaW5zTmFtZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgbWl4IDsgYW5kICwgYXMgZGVsaW1pdGVyIHR5cGVzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZW1pQ29sb25TZXBhcmF0ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbnMubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgKHRyZWUuVmFsdWUpKGV4cHJlc3Npb25zKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzU2VtaUNvbG9uLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUsIGV4cGFuZDogZXhwYW5kIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRhaW5zTmFtZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVyLmFyZ3MgPSBpc1NlbWlDb2xvblNlcGFyYXRlZCA/IGFyZ3NTZW1pQ29sb24gOiBhcmdzQ29tbWE7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vIEEgTWl4aW4gZGVmaW5pdGlvbiwgd2l0aCBhIGxpc3Qgb2YgcGFyYW1ldGVycw0KICAgICAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgICAgICAvLyAgICAgLnJvdW5kZWQgKEByYWRpdXM6IDJweCwgQGNvbG9yKSB7DQogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAuLi4NCiAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0NCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gVW50aWwgd2UgaGF2ZSBhIGZpbmVyIGdyYWluZWQgc3RhdGUtbWFjaGluZSwgd2UgaGF2ZSB0bw0KICAgICAgICAgICAgICAgICAgICAvLyBkbyBhIGxvb2stYWhlYWQsIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGEgbWl4aW4gY2FsbC4NCiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIHRoZSBgcnVsZWAgZnVuY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIHN0YXJ0IGJ5IG1hdGNoaW5nIGAucm91bmRlZCAoYCwgYW5kIHRoZW4gcHJvY2VlZCBvbiB0bw0KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXJndW1lbnQgbGlzdCwgd2hpY2ggaGFzIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWVzLg0KICAgICAgICAgICAgICAgICAgICAvLyBXZSBzdG9yZSB0aGUgcGFyYW1ldGVycyBpbiBgcGFyYW1zYCwgd2l0aCBhIGB2YWx1ZWAga2V5LA0KICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHZhbHVlLCBzdWNoIGFzIGluIHRoZSBjYXNlIG9mIGBAcmFkaXVzYC4NCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB3ZSd2ZSBnb3Qgb3VyIHBhcmFtcyBsaXN0LCBhbmQgYSBjbG9zaW5nIGApYCwgd2UgcGFyc2UNCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGB7Li4ufWAgYmxvY2suDQogICAgICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb246IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bGVzZXQ7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YXJpYWRpYyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpICE9PSAnLicgJiYgcGFyc2VySW5wdXQuY3VycmVudENoYXIoKSAhPT0gJyMnKSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnBlZWsoL15bXntdKlx9LykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHBhcnNlcklucHV0LiRyZSgvXihbIy5dKD86W1x3LV18XFwoPzpbQS1GYS1mMC05XXsxLDZ9ID98W15BLUZhLWYwLTldKSkrKVxzKlwoLyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbWF0Y2hbMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ0luZm8gPSB0aGlzLmFyZ3MoZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFyZ0luZm8uYXJnczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWRpYyA9IGFyZ0luZm8udmFyaWFkaWM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLm1peGluY2FsbCgiQHthfSIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIGEgYml0IGxpa2UgYSBtaXhpbiBkZWZpbml0aW9uLi4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLm1peGluY2FsbChAYToge3J1bGU6IHNldDt9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGJlIG5pY2UgYW5kIHJlc3RvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCcpJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgnTWlzc2luZyBjbG9zaW5nIFwnKVwnJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuY29tbWVudFN0b3JlLmxlbmd0aCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LiRzdHIoJ3doZW4nKSkgeyAvLyBHdWFyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kID0gZXhwZWN0KHBhcnNlcnMuY29uZGl0aW9ucywgJ2V4cGVjdGVkIGNvbmRpdGlvbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlc2V0ID0gcGFyc2Vycy5ibG9jaygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlc2V0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLm1peGluLkRlZmluaXRpb24pKG5hbWUsIHBhcmFtcywgcnVsZXNldCwgY29uZCwgdmFyaWFkaWMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgcnVsZUxvb2t1cHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydWxlOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvb2t1cHMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpICE9PSAnWycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnNhdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlID0gdGhpcy5sb29rdXBWYWx1ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVsZSAmJiBydWxlICE9PSAnJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBzLnB1c2gocnVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9va3Vwcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cHM7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIGxvb2t1cFZhbHVlOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCdbJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBwYXJzZXJJbnB1dC4kcmUoL14oPzpbQCRdezAsMn0pW19hLXpBLVowLTktXSovKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VySW5wdXQuJGNoYXIoJ10nKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSB8fCBuYW1lID09PSAnJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEVudGl0aWVzIGFyZSB0aGUgc21hbGxlc3QgcmVjb2duaXplZCB0b2tlbiwNCiAgICAgICAgICAgICAgICAvLyBhbmQgY2FuIGJlIGZvdW5kIGluc2lkZSBhIHJ1bGUncyB2YWx1ZS4NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIGVudGl0eTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXRpZXMgPSB0aGlzLmVudGl0aWVzOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50KCkgfHwgZW50aXRpZXMubGl0ZXJhbCgpIHx8IGVudGl0aWVzLnZhcmlhYmxlKCkgfHwgZW50aXRpZXMudXJsKCkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLnByb3BlcnR5KCkgfHwgZW50aXRpZXMuY2FsbCgpIHx8IGVudGl0aWVzLmtleXdvcmQoKSB8fCB0aGlzLm1peGluLmNhbGwodHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLmphdmFzY3JpcHQoKTsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gQSBEZWNsYXJhdGlvbiB0ZXJtaW5hdG9yLiBOb3RlIHRoYXQgd2UgdXNlIGBwZWVrKClgIHRvIGNoZWNrIGZvciAnfScsDQogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgYGJsb2NrYCBydWxlIHdpbGwgYmUgZXhwZWN0aW5nIGl0LCBidXQgd2Ugc3RpbGwgbmVlZCB0byBtYWtlIHN1cmUNCiAgICAgICAgICAgICAgICAvLyBpdCdzIHRoZXJlLCBpZiAnOycgd2FzIG9taXR0ZWQuDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICBlbmQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcklucHV0LiRjaGFyKCc7JykgfHwgcGFyc2VySW5wdXQucGVlaygnfScpOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyBJRSdzIGFscGhhIGZ1bmN0aW9uDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyAgICAgYWxwaGEob3BhY2l0eT04OCkNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIGllQWxwaGE6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jYXNlLWluc2Vuc2l0aXZlLXJlZ2V4LXZzLXN0cnRvbG93ZXItdGhlbi1yZWdleC8xOA0KICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRyZSgvXm9wYWNpdHk9L2kpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZXJJbnB1dC4kcmUoL15cZCsvKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBleHBlY3QocGFyc2Vycy5lbnRpdGllcy52YXJpYWJsZSwgJ0NvdWxkIG5vdCBwYXJzZSBhbHBoYScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiQHsiICsgdmFsdWUubmFtZS5zbGljZSgxKSArICJ9IjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBleHBlY3RDaGFyKCcpJyk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdHJlZS5RdW90ZWQoJycsICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSArICIpIik7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEEgU2VsZWN0b3IgRWxlbWVudA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gICAgIGRpdg0KICAgICAgICAgICAgICAgIC8vICAgICArIGgxDQogICAgICAgICAgICAgICAgLy8gICAgICNzb2Nrcw0KICAgICAgICAgICAgICAgIC8vICAgICBpbnB1dFt0eXBlPSJ0ZXh0Il0NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEVsZW1lbnRzIGFyZSB0aGUgYnVpbGRpbmcgYmxvY2tzIGZvciBTZWxlY3RvcnMsDQogICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgbWFkZSBvdXQgb2YgYSBgQ29tYmluYXRvcmAgKHNlZSBjb21iaW5hdG9yIHJ1bGUpLA0KICAgICAgICAgICAgICAgIC8vIGFuZCBhbiBlbGVtZW50IG5hbWUsIHN1Y2ggYXMgYSB0YWcgYSBjbGFzcywgb3IgYCpgLg0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgZWxlbWVudDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGM7DQogICAgICAgICAgICAgICAgICAgIHZhciB2Ow0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5jb21iaW5hdG9yKCk7DQogICAgICAgICAgICAgICAgICAgIGUgPSBwYXJzZXJJbnB1dC4kcmUoL14oPzpcZCtcLlxkK3xcZCspJS8pIHx8DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC4kcmUoL14oPzpbLiNdP3w6KikoPzpbXHctXXxbXlx4MDAtXHg5Zl18XFwoPzpbQS1GYS1mMC05XXsxLDZ9ID98W15BLUZhLWYwLTldKSkrLykgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LiRjaGFyKCcqJykgfHwgcGFyc2VySW5wdXQuJGNoYXIoJyYnKSB8fCB0aGlzLmF0dHJpYnV0ZSgpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC4kcmUoL15cKFteJigpQF0rXCkvKSB8fCBwYXJzZXJJbnB1dC4kcmUoL15bXC4jOl0oPz1AKS8pIHx8DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVudGl0aWVzLnZhcmlhYmxlQ3VybHkoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJygnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodiA9IHRoaXMuc2VsZWN0b3IoZmFsc2UpKSAmJiBwYXJzZXJJbnB1dC4kY2hhcignKScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuZXcgKHRyZWUuUGFyZW4pKHYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoJ01pc3NpbmcgY2xvc2luZyBcJylcJycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLkVsZW1lbnQpKGMsIGUsIGUgaW5zdGFuY2VvZiB0cmVlLlZhcmlhYmxlLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIENvbWJpbmF0b3JzIGNvbWJpbmUgZWxlbWVudHMgdG9nZXRoZXIsIGluIGEgU2VsZWN0b3IuDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG91ciBwYXJzZXIgaXNuJ3Qgd2hpdGUtc3BhY2Ugc2Vuc2l0aXZlLCBzcGVjaWFsIGNhcmUNCiAgICAgICAgICAgICAgICAvLyBoYXMgdG8gYmUgdGFrZW4sIHdoZW4gcGFyc2luZyB0aGUgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBgIGAsDQogICAgICAgICAgICAgICAgLy8gYXMgaXQncyBhbiBlbXB0eSBzcGFjZS4gV2UgaGF2ZSB0byBjaGVjayB0aGUgcHJldmlvdXMgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgLy8gaW4gdGhlIGlucHV0LCB0byBzZWUgaWYgaXQncyBhIGAgYCBjaGFyYWN0ZXIuIE1vcmUgaW5mbyBvbiBob3cNCiAgICAgICAgICAgICAgICAvLyB3ZSBkZWFsIHdpdGggdGhpcyBpbiAqY29tYmluYXRvci5qcyouDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICBjb21iaW5hdG9yOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gcGFyc2VySW5wdXQuY3VycmVudENoYXIoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICcvJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNsYXNoZWRDb21iaW5hdG9yID0gcGFyc2VySW5wdXQuJHJlKC9eXC9bYS16XStcLy9pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbGFzaGVkQ29tYmluYXRvcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuQ29tYmluYXRvcikoc2xhc2hlZENvbWJpbmF0b3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnPicgfHwgYyA9PT0gJysnIHx8IGMgPT09ICd+JyB8fCBjID09PSAnfCcgfHwgYyA9PT0gJ14nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5pKys7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ14nICYmIHBhcnNlcklucHV0LmN1cnJlbnRDaGFyKCkgPT09ICdeJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXl4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmkrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJzZXJJbnB1dC5pc1doaXRlc3BhY2UoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmkrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuQ29tYmluYXRvcikoYyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VySW5wdXQuaXNXaGl0ZXNwYWNlKC0xKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5Db21iaW5hdG9yKSgnICcpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5Db21iaW5hdG9yKShudWxsKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyBBIENTUyBTZWxlY3Rvcg0KICAgICAgICAgICAgICAgIC8vIHdpdGggbGVzcyBleHRlbnNpb25zIGUuZy4gdGhlIGFiaWxpdHkgdG8gZXh0ZW5kIGFuZCBndWFyZA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gICAgIC5jbGFzcyA+IGRpdiArIGgxDQogICAgICAgICAgICAgICAgLy8gICAgIGxpIGE6aG92ZXINCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIFNlbGVjdG9ycyBhcmUgbWFkZSBvdXQgb2Ygb25lIG9yIG1vcmUgRWxlbWVudHMsIHNlZSBhYm92ZS4NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBmdW5jdGlvbiAoaXNMZXNzKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50czsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuZExpc3Q7DQogICAgICAgICAgICAgICAgICAgIHZhciBjOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbEV4dGVuZHM7DQogICAgICAgICAgICAgICAgICAgIHZhciB3aGVuOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uOw0KICAgICAgICAgICAgICAgICAgICBpc0xlc3MgPSBpc0xlc3MgIT09IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGlzTGVzcyAmJiAoZXh0ZW5kTGlzdCA9IHRoaXMuZXh0ZW5kKCkpKSB8fCAoaXNMZXNzICYmICh3aGVuID0gcGFyc2VySW5wdXQuJHN0cignd2hlbicpKSkgfHwgKGUgPSB0aGlzLmVsZW1lbnQoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGVuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gZXhwZWN0KHRoaXMuY29uZGl0aW9ucywgJ2V4cGVjdGVkIGNvbmRpdGlvbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uZGl0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0NTUyBndWFyZCBjYW4gb25seSBiZSB1c2VkIGF0IHRoZSBlbmQgb2Ygc2VsZWN0b3InKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuZExpc3QpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRXh0ZW5kcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxFeHRlbmRzID0gYWxsRXh0ZW5kcy5jb25jYXQoZXh0ZW5kTGlzdCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxFeHRlbmRzID0gZXh0ZW5kTGlzdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRXh0ZW5kcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXh0ZW5kIGNhbiBvbmx5IGJlIHVzZWQgYXQgdGhlIGVuZCBvZiBzZWxlY3RvcicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcGFyc2VySW5wdXQuY3VycmVudENoYXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gW2VdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAneycgfHwgYyA9PT0gJ30nIHx8IGMgPT09ICc7JyB8fCBjID09PSAnLCcgfHwgYyA9PT0gJyknKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLlNlbGVjdG9yKShlbGVtZW50cywgYWxsRXh0ZW5kcywgY29uZGl0aW9uLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChhbGxFeHRlbmRzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXh0ZW5kIG11c3QgYmUgdXNlZCB0byBleHRlbmQgYSBzZWxlY3RvciwgaXQgY2Fubm90IGJlIHVzZWQgb24gaXRzIG93bicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBzZWxlY3RvcnM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHM7DQogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcnM7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzID0gdGhpcy5zZWxlY3RvcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLnB1c2gocyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMgPSBbc107DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5jb21tZW50U3RvcmUubGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmNvbmRpdGlvbiAmJiBzZWxlY3RvcnMubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJHdWFyZHMgYXJlIG9ubHkgY3VycmVudGx5IGFsbG93ZWQgb24gYSBzaW5nbGUgc2VsZWN0b3IuIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCcsJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmNvbmRpdGlvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJHdWFyZHMgYXJlIG9ubHkgY3VycmVudGx5IGFsbG93ZWQgb24gYSBzaW5nbGUgc2VsZWN0b3IuIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5jb21tZW50U3RvcmUubGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3JzOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgYXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VySW5wdXQuJGNoYXIoJ1snKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IHRoaXMuZW50aXRpZXM7DQogICAgICAgICAgICAgICAgICAgIHZhciBrZXk7DQogICAgICAgICAgICAgICAgICAgIHZhciB2YWw7DQogICAgICAgICAgICAgICAgICAgIHZhciBvcDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5ID0gZW50aXRpZXMudmFyaWFibGVDdXJseSgpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZXhwZWN0KC9eKD86W19BLVphLXowLTktXCpdKlx8KT8oPzpbX0EtWmEtejAtOS1dfFxcLikrLyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgb3AgPSBwYXJzZXJJbnB1dC4kcmUoL15bfH4qJF5dPz0vKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBlbnRpdGllcy5xdW90ZWQoKSB8fCBwYXJzZXJJbnB1dC4kcmUoL15bMC05XSslLykgfHwgcGFyc2VySW5wdXQuJHJlKC9eW1x3LV0rLykgfHwgZW50aXRpZXMudmFyaWFibGVDdXJseSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGV4cGVjdENoYXIoJ10nKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5BdHRyaWJ1dGUpKGtleSwgb3AsIHZhbCk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIFRoZSBgYmxvY2tgIHJ1bGUgaXMgdXNlZCBieSBgcnVsZXNldGAgYW5kIGBtaXhpbi5kZWZpbml0aW9uYC4NCiAgICAgICAgICAgICAgICAvLyBJdCdzIGEgd3JhcHBlciBhcm91bmQgdGhlIGBwcmltYXJ5YCBydWxlLCB3aXRoIGFkZGVkIGB7fWAuDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICBibG9jazogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LiRjaGFyKCd7JykgJiYgKGNvbnRlbnQgPSB0aGlzLnByaW1hcnkoKSkgJiYgcGFyc2VySW5wdXQuJGNoYXIoJ30nKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIGJsb2NrUnVsZXNldDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLmJsb2NrKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykgew0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBuZXcgdHJlZS5SdWxlc2V0KG51bGwsIGJsb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBkZXRhY2hlZFJ1bGVzZXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ0luZm87DQogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXM7DQogICAgICAgICAgICAgICAgICAgIHZhciB2YXJpYWRpYzsNCiAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJHJlKC9eWy4jXVwoLykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgICAgICogRFIgYXJncyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBmb3IgZWFjaCgpIGZ1bmN0aW9uLCBhbmQgbm90DQogICAgICAgICAgICAgICAgICAgICAgICAgKiB5ZXQgc2V0dGFibGUgYXMgYEBkcjogIyhAYXJnKSB7fWANCiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgc2hvdWxkIGJlIGRvbmUgd2hlbiBEUnMgYXJlIG1lcmdlZCB3aXRoIG1peGlucy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2xlc3MvbGVzcy1tZXRhL2lzc3Vlcy8xNg0KICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAgICBhcmdJbmZvID0gdGhpcy5taXhpbi5hcmdzKGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFyZ0luZm8uYXJnczsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhZGljID0gYXJnSW5mby52YXJpYWRpYzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VySW5wdXQuJGNoYXIoJyknKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIGJsb2NrUnVsZXNldCA9IHRoaXMuYmxvY2tSdWxlc2V0KCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChibG9ja1J1bGVzZXQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdHJlZS5taXhpbi5EZWZpbml0aW9uKG51bGwsIHBhcmFtcywgYmxvY2tSdWxlc2V0LCBudWxsLCB2YXJpYWRpYyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRyZWUuRGV0YWNoZWRSdWxlc2V0KGJsb2NrUnVsZXNldCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyBkaXYsIC5jbGFzcywgYm9keSA+IHAgey4uLn0NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIHJ1bGVzZXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yczsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bGVzOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZGVidWdJbmZvOw0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmR1bXBMaW5lTnVtYmVycykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdJbmZvID0gZ2V0RGVidWdJbmZvKHBhcnNlcklucHV0LmkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IHRoaXMuc2VsZWN0b3JzKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvcnMgJiYgKHJ1bGVzID0gdGhpcy5ibG9jaygpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZXNldCA9IG5ldyAodHJlZS5SdWxlc2V0KShzZWxlY3RvcnMsIHJ1bGVzLCBjb250ZXh0LnN0cmljdEltcG9ydHMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZHVtcExpbmVOdW1iZXJzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXNldC5kZWJ1Z0luZm8gPSBkZWJ1Z0luZm87DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVsZXNldDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgZGVjbGFyYXRpb246IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWU7DQogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc0RSOw0KICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHBhcnNlcklucHV0LmN1cnJlbnRDaGFyKCk7DQogICAgICAgICAgICAgICAgICAgIHZhciBpbXBvcnRhbnQ7DQogICAgICAgICAgICAgICAgICAgIHZhciBtZXJnZTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVmFyaWFibGU7DQogICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnLicgfHwgYyA9PT0gJyMnIHx8IGMgPT09ICcmJyB8fCBjID09PSAnOicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLnZhcmlhYmxlKCkgfHwgdGhpcy5ydWxlUHJvcGVydHkoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFyaWFibGUgPSB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZyc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYXJpYWJsZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kZXRhY2hlZFJ1bGVzZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRFIgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmNvbW1lbnRTdG9yZS5sZW5ndGggPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmFtZSByZXR1cm5lZCBieSB0aGlzLnJ1bGVQcm9wZXJ0eSgpIGlzIGFsd2F5cyBhbiBhcnJheSBvZiB0aGUgZm9ybToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbc3RyaW5nLTEsIC4uLiwgc3RyaW5nLW4sICIiXSBvciBbc3RyaW5nLTEsIC4uLiwgc3RyaW5nLW4sICIrIl0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBlYWNoIGl0ZW0gaXMgYSB0cmVlLktleXdvcmQgb3IgdHJlZS5WYXJpYWJsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlID0gIWlzVmFyaWFibGUgJiYgbmFtZS5sZW5ndGggPiAxICYmIG5hbWUucG9wKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3VzdG9tIHByb3BlcnR5IHZhbHVlcyBnZXQgcGVybWlzc2l2ZSBwYXJzaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMF0udmFsdWUgJiYgbmFtZVswXS52YWx1ZS5zbGljZSgwLCAyKSA9PT0gJy0tJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGVybWlzc2l2ZVZhbHVlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBzdG9yZSB2YWx1ZXMgYXMgYW5vbnltb3VzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgbmVlZCB0aGUgdmFsdWUgbGF0ZXIgd2UnbGwgcmUtcGFyc2UgaXQgaW4gcnVsZXNldC5wYXJzZVZhbHVlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5hbm9ueW1vdXNWYWx1ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFub255bW91cyB2YWx1ZXMgYWJzb3JiIHRoZSBlbmQgJzsnIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB0aGVtIHRvIHdvcmsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5EZWNsYXJhdGlvbikobmFtZSwgdmFsdWUsIGZhbHNlLCBtZXJnZSwgaW5kZXgsIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCA9IHRoaXMuaW1wb3J0YW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVmFyaWFibGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXMgYSBsYXN0IHJlc29ydCwgdHJ5IHBlcm1pc3NpdmVWYWx1ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGVybWlzc2l2ZVZhbHVlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmICh0aGlzLmVuZCgpIHx8IGhhc0RSKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuRGVjbGFyYXRpb24pKG5hbWUsIHZhbHVlLCBpbXBvcnRhbnQsIG1lcmdlLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBhbm9ueW1vdXNWYWx1ZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBwYXJzZXJJbnB1dC4kcmUoL14oW14uI0BcJCtcLyciKmAoO3t9LV0qKTsvKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLkFub255bW91cykobWF0Y2hbMV0sIGluZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICogVXNlZCBmb3IgY3VzdG9tIHByb3BlcnRpZXMsIGF0LXJ1bGVzLCBhbmQgdmFyaWFibGVzIChhcyBmYWxsYmFjaykNCiAgICAgICAgICAgICAgICAgKiBQYXJzZXMgYWxtb3N0IGFueXRoaW5nIGluc2lkZSBvZiB7fSBbXSAoKSAiIiBibG9ja3MNCiAgICAgICAgICAgICAgICAgKiB1bnRpbCBpdCByZWFjaGVzIG91dGVyLW1vc3QgdG9rZW5zLg0KICAgICAgICAgICAgICAgICAqDQogICAgICAgICAgICAgICAgICogRmlyc3QsIGl0IHdpbGwgdHJ5IHRvIHBhcnNlIGNvbW1lbnRzIGFuZCBlbnRpdGllcyB0byByZWFjaA0KICAgICAgICAgICAgICAgICAqIHRoZSBlbmQuIFRoaXMgaXMgbW9zdGx5IGxpa2UgdGhlIEV4cHJlc3Npb24gcGFyc2VyIGV4Y2VwdCBubw0KICAgICAgICAgICAgICAgICAqIG1hdGggaXMgYWxsb3dlZC4NCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBwZXJtaXNzaXZlVmFsdWU6IGZ1bmN0aW9uICh1bnRpbFRva2Vucykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGU7DQogICAgICAgICAgICAgICAgICAgIHZhciBkb25lOw0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHZhciB0b2sgPSB1bnRpbFRva2VucyB8fCAnOyc7DQogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdGVzdEN1cnJlbnRDaGFyKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXIgPSBwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2sgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXIgPT09IHRvazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2sudGVzdChjaGFyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAodGVzdEN1cnJlbnRDaGFyKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdOw0KICAgICAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5jb21tZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnB1c2goZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5lbnRpdHkoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUucHVzaChlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoZSk7DQogICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0ZXN0Q3VycmVudENoYXIoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3ICh0cmVlLkV4cHJlc3Npb24pKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgc3BhY2UgYmVmb3JlICRwYXJzZVVudGlsIGFzIGl0IHdpbGwgbm90DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQucHJldkNoYXIoKSA9PT0gJyAnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IHRyZWUuQW5vbnltb3VzKCcgJywgaW5kZXgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VySW5wdXQuJHBhcnNlVW50aWwodG9rKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAnIiArIHZhbHVlICsgIiciLCAnUGFyc2UnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEgJiYgdmFsdWVbMF0gPT09ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdHJlZS5Bbm9ueW1vdXMoJycsIGluZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdm9pZCAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHZhbHVlW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IGFjdHVhbCBxdW90ZXMgYXMgbm9ybWFsIHF1b3RlZCB2YWx1ZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IHRyZWUuUXVvdGVkKGl0ZW1bMF0sIGl0ZW1bMV0sIHRydWUsIGluZGV4LCBmaWxlSW5mbykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IHZhbHVlLmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnRyaW0oKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmVhdCBsaWtlIHF1b3RlZCB2YWx1ZXMsIGJ1dCByZXBsYWNlIHZhcnMgbGlrZSB1bnF1b3RlZCBleHByZXNzaW9ucw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVvdGUgPSBuZXcgdHJlZS5RdW90ZWQoJ1wnJywgaXRlbSwgdHJ1ZSwgaW5kZXgsIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUudmFyaWFibGVSZWdleCA9IC9AKFtcdy1dKykvZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUucHJvcFJlZ2V4ID0gL1wkKFtcdy1dKykvZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0cmVlLkV4cHJlc3Npb24ocmVzdWx0LCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEFuIEBpbXBvcnQgYXRydWxlDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyAgICAgQGltcG9ydCAibGliIjsNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiBvdXIgZW52aXJvbm1lbnQsIGltcG9ydGluZyBpcyBkb25lIGRpZmZlcmVudGx5Og0KICAgICAgICAgICAgICAgIC8vIEluIHRoZSBicm93c2VyLCBpdCdzIGFuIFhIUiByZXF1ZXN0LCBpbiBOb2RlLCBpdCB3b3VsZCBiZSBhDQogICAgICAgICAgICAgICAgLy8gZmlsZS1zeXN0ZW0gb3BlcmF0aW9uLiBUaGUgZnVuY3Rpb24gdXNlZCBmb3IgaW1wb3J0aW5nIGlzDQogICAgICAgICAgICAgICAgLy8gc3RvcmVkIGluIGBpbXBvcnRgLCB3aGljaCB3ZSBwYXNzIHRvIHRoZSBJbXBvcnQgY29uc3RydWN0b3IuDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAnaW1wb3J0JzogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVzOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZGlyID0gcGFyc2VySW5wdXQuJHJlKC9eQGltcG9ydD9ccysvKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRpcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAoZGlyID8gdGhpcy5pbXBvcnRPcHRpb25zKCkgOiBudWxsKSB8fCB7fTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGF0aCA9IHRoaXMuZW50aXRpZXMucXVvdGVkKCkgfHwgdGhpcy5lbnRpdGllcy51cmwoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IHRoaXMubWVkaWFGZWF0dXJlcygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VySW5wdXQuJGNoYXIoJzsnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5pID0gaW5kZXg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdtaXNzaW5nIHNlbWktY29sb24gb3IgdW5yZWNvZ25pc2VkIG1lZGlhIGZlYXR1cmVzIG9uIGltcG9ydCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IGZlYXR1cmVzICYmIG5ldyAodHJlZS5WYWx1ZSkoZmVhdHVyZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuSW1wb3J0KShwYXRoLCBmZWF0dXJlcywgb3B0aW9ucywgaW5kZXgsIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmkgPSBpbmRleDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignbWFsZm9ybWVkIGltcG9ydCBzdGF0ZW1lbnQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgaW1wb3J0T3B0aW9uczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgbzsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbk5hbWU7DQogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBvcHRpb25zLCBzdXJyb3VuZGVkIGJ5IHBhcmVucw0KICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCcoJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB0aGlzLmltcG9ydE9wdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25OYW1lID0gbzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25OYW1lKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nzcyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25OYW1lID0gJ2xlc3MnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvbmNlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk5hbWUgPSAnbXVsdGlwbGUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zW29wdGlvbk5hbWVdID0gdmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXJJbnB1dC4kY2hhcignLCcpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobyk7DQogICAgICAgICAgICAgICAgICAgIGV4cGVjdENoYXIoJyknKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBpbXBvcnRPcHRpb246IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdCA9IHBhcnNlcklucHV0LiRyZSgvXihsZXNzfGNzc3xtdWx0aXBsZXxvbmNlfGlubGluZXxyZWZlcmVuY2V8b3B0aW9uYWwpLyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRbMV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIG1lZGlhRmVhdHVyZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXRpZXMgPSB0aGlzLmVudGl0aWVzOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGU7DQogICAgICAgICAgICAgICAgICAgIHZhciBwOw0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlbnRpdGllcy5rZXl3b3JkKCkgfHwgZW50aXRpZXMudmFyaWFibGUoKSB8fCBlbnRpdGllcy5taXhpbkxvb2t1cCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VySW5wdXQuJGNoYXIoJygnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSB0aGlzLnByb3BlcnR5KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMudmFsdWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJyknKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCAmJiBlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5ldyAodHJlZS5QYXJlbikobmV3ICh0cmVlLkRlY2xhcmF0aW9uKShwLCBlLCBudWxsLCBudWxsLCBwYXJzZXJJbnB1dC5pLCBmaWxlSW5mbywgdHJ1ZSkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5ldyAodHJlZS5QYXJlbikoZSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ2JhZGx5IGZvcm1lZCBtZWRpYSBmZWF0dXJlIGRlZmluaXRpb24nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ01pc3NpbmcgY2xvc2luZyBcJylcJycsICdQYXJzZScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoZSk7DQogICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodHJlZS5FeHByZXNzaW9uKShub2Rlcyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIG1lZGlhRmVhdHVyZXM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0aWVzID0gdGhpcy5lbnRpdGllczsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVzID0gW107DQogICAgICAgICAgICAgICAgICAgIHZhciBlOw0KICAgICAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5tZWRpYUZlYXR1cmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaChlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCcsJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGVudGl0aWVzLnZhcmlhYmxlKCkgfHwgZW50aXRpZXMubWl4aW5Mb29rdXAoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCcsJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmxlbmd0aCA+IDAgPyBmZWF0dXJlcyA6IG51bGw7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBtZWRpYTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZXM7DQogICAgICAgICAgICAgICAgICAgIHZhciBydWxlczsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lZGlhOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZGVidWdJbmZvOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5kdW1wTGluZU51bWJlcnMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnSW5mbyA9IGdldERlYnVnSW5mbyhpbmRleCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJHN0cignQG1lZGlhJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gdGhpcy5tZWRpYUZlYXR1cmVzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBydWxlcyA9IHRoaXMuYmxvY2soKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVsZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignbWVkaWEgZGVmaW5pdGlvbnMgcmVxdWlyZSBibG9jayBzdGF0ZW1lbnRzIGFmdGVyIGFueSBmZWF0dXJlcycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBtZWRpYSA9IG5ldyAodHJlZS5NZWRpYSkocnVsZXMsIGZlYXR1cmVzLCBpbmRleCwgZmlsZUluZm8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZHVtcExpbmVOdW1iZXJzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEuZGVidWdJbmZvID0gZGVidWdJbmZvOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lZGlhOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gQSBAcGx1Z2luIGRpcmVjdGl2ZSwgdXNlZCB0byBpbXBvcnQgcGx1Z2lucyBkeW5hbWljYWxseS4NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vICAgICBAcGx1Z2luIChhcmdzKSAibGliIjsNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIHBsdWdpbjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3M7DQogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZGlyID0gcGFyc2VySW5wdXQuJHJlKC9eQHBsdWdpbj9ccysvKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRpcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IHRoaXMucGx1Z2luQXJncygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5BcmdzOiBhcmdzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BsdWdpbjogdHJ1ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0geyBpc1BsdWdpbjogdHJ1ZSB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYXRoID0gdGhpcy5lbnRpdGllcy5xdW90ZWQoKSB8fCB0aGlzLmVudGl0aWVzLnVybCgpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VySW5wdXQuJGNoYXIoJzsnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5pID0gaW5kZXg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdtaXNzaW5nIHNlbWktY29sb24gb24gQHBsdWdpbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLkltcG9ydCkocGF0aCwgbnVsbCwgb3B0aW9ucywgaW5kZXgsIGZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmkgPSBpbmRleDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignbWFsZm9ybWVkIEBwbHVnaW4gc3RhdGVtZW50Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHBsdWdpbkFyZ3M6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBvcHRpb25zLCBzdXJyb3VuZGVkIGJ5IHBhcmVucw0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5zYXZlKCk7DQogICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VySW5wdXQuJGNoYXIoJygnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBwYXJzZXJJbnB1dC4kcmUoL15ccyooW15cKTtdKylcKVxzKi8pOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1sxXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnc1sxXS50cmltKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyBBIENTUyBBdFJ1bGUNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vICAgICBAY2hhcnNldCAidXRmLTgiOw0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgYXRydWxlOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lOw0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHZhciBydWxlczsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5vblZlbmRvclNwZWNpZmljTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc0lkZW50aWZpZXI7DQogICAgICAgICAgICAgICAgICAgIHZhciBoYXNFeHByZXNzaW9uOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaGFzVW5rbm93bjsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc0Jsb2NrID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlzUm9vdGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LmN1cnJlbnRDaGFyKCkgIT09ICdAJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpc1snaW1wb3J0J10oKSB8fCB0aGlzLnBsdWdpbigpIHx8IHRoaXMubWVkaWEoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGFyc2VySW5wdXQuJHJlKC9eQFthLXotXSsvKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbm9uVmVuZG9yU3BlY2lmaWNOYW1lID0gbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDEpID09ICctJyAmJiBuYW1lLmluZGV4T2YoJy0nLCAyKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vblZlbmRvclNwZWNpZmljTmFtZSA9ICJAIiArIG5hbWUuc2xpY2UobmFtZS5pbmRleE9mKCctJywgMikgKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vblZlbmRvclNwZWNpZmljTmFtZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQGNoYXJzZXQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0lkZW50aWZpZXIgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0Jsb2NrID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdAbmFtZXNwYWNlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFeHByZXNzaW9uID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNCbG9jayA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQGtleWZyYW1lcyc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdAY291bnRlci1zdHlsZSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSWRlbnRpZmllciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdAZG9jdW1lbnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQHN1cHBvcnRzJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmtub3duID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Jvb3RlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmtub3duID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5jb21tZW50U3RvcmUubGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0lkZW50aWZpZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5lbnRpdHkoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiZXhwZWN0ZWQgIiArIG5hbWUgKyAiIGlkZW50aWZpZXIiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNFeHByZXNzaW9uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJleHBlY3RlZCAiICsgbmFtZSArICIgZXhwcmVzc2lvbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhc1Vua25vd24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wZXJtaXNzaXZlVmFsdWUoL15beztdLyk7DQogICAgICAgICAgICAgICAgICAgICAgICBoYXNCbG9jayA9IChwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpID09PSAneycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQmxvY2sgJiYgcGFyc2VySW5wdXQuY3VycmVudENoYXIoKSAhPT0gJzsnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKG5hbWUgKyAiIHJ1bGUgaXMgbWlzc2luZyBibG9jayBvciBlbmRpbmcgc2VtaS1jb2xvbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF2YWx1ZS52YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmxvY2spIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzID0gdGhpcy5ibG9ja1J1bGVzZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMgfHwgKCFoYXNCbG9jayAmJiB2YWx1ZSAmJiBwYXJzZXJJbnB1dC4kY2hhcignOycpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICh0cmVlLkF0UnVsZSkobmFtZSwgdmFsdWUsIHJ1bGVzLCBpbmRleCwgZmlsZUluZm8sIGNvbnRleHQuZHVtcExpbmVOdW1iZXJzID8gZ2V0RGVidWdJbmZvKGluZGV4KSA6IG51bGwsIGlzUm9vdGVkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCdhdC1ydWxlIG9wdGlvbnMgbm90IHJlY29nbmlzZWQnKTsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gQSBWYWx1ZSBpcyBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIEV4cHJlc3Npb25zDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyAgICAgZm9udC1mYW1pbHk6IEJhc2tlcnZpbGxlLCBHZW9yZ2lhLCBzZXJpZjsNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEluIGEgUnVsZSwgYSBWYWx1ZSByZXByZXNlbnRzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGA6YCwNCiAgICAgICAgICAgICAgICAvLyBhbmQgYmVmb3JlIHRoZSBgO2AuDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107DQogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLmV4cHJlc3Npb24oKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCcsJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuVmFsdWUpKGV4cHJlc3Npb25zLCBpbmRleCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIGltcG9ydGFudDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuY3VycmVudENoYXIoKSA9PT0gJyEnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VySW5wdXQuJHJlKC9eISAqaW1wb3J0YW50Lyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHN1YjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgYTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGU7DQogICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnNhdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LiRjaGFyKCcoJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB0aGlzLmFkZGl0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBwYXJzZXJJbnB1dC4kY2hhcignKScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG5ldyAodHJlZS5FeHByZXNzaW9uKShbYV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGFyZW5zID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoJ0V4cGVjdGVkIFwnKVwnJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgbXVsdGlwbGljYXRpb246IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG07DQogICAgICAgICAgICAgICAgICAgIHZhciBhOw0KICAgICAgICAgICAgICAgICAgICB2YXIgb3A7DQogICAgICAgICAgICAgICAgICAgIHZhciBvcGVyYXRpb247DQogICAgICAgICAgICAgICAgICAgIHZhciBpc1NwYWNlZDsNCiAgICAgICAgICAgICAgICAgICAgbSA9IHRoaXMub3BlcmFuZCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaXNTcGFjZWQgPSBwYXJzZXJJbnB1dC5pc1doaXRlc3BhY2UoLTEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQucGVlaygvXlwvWypcL10vKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gcGFyc2VySW5wdXQuJGNoYXIoJy8nKSB8fCBwYXJzZXJJbnB1dC4kY2hhcignKicpIHx8IHBhcnNlcklucHV0LiRzdHIoJy4vJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB0aGlzLm9wZXJhbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5wYXJlbnNJbk9wID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnBhcmVuc0luT3AgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IG5ldyAodHJlZS5PcGVyYXRpb24pKG9wLCBbb3BlcmF0aW9uIHx8IG0sIGFdLCBpc1NwYWNlZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTcGFjZWQgPSBwYXJzZXJJbnB1dC5pc1doaXRlc3BhY2UoLTEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbiB8fCBtOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBhZGRpdGlvbjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgbTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGE7DQogICAgICAgICAgICAgICAgICAgIHZhciBvcDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wZXJhdGlvbjsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlzU3BhY2VkOw0KICAgICAgICAgICAgICAgICAgICBtID0gdGhpcy5tdWx0aXBsaWNhdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaXNTcGFjZWQgPSBwYXJzZXJJbnB1dC5pc1doaXRlc3BhY2UoLTEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHBhcnNlcklucHV0LiRyZSgvXlstK11ccysvKSB8fCAoIWlzU3BhY2VkICYmIChwYXJzZXJJbnB1dC4kY2hhcignKycpIHx8IHBhcnNlcklucHV0LiRjaGFyKCctJykpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdGhpcy5tdWx0aXBsaWNhdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5wYXJlbnNJbk9wID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnBhcmVuc0luT3AgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IG5ldyAodHJlZS5PcGVyYXRpb24pKG9wLCBbb3BlcmF0aW9uIHx8IG0sIGFdLCBpc1NwYWNlZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTcGFjZWQgPSBwYXJzZXJJbnB1dC5pc1doaXRlc3BhY2UoLTEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbiB8fCBtOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBhOw0KICAgICAgICAgICAgICAgICAgICB2YXIgYjsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VySW5wdXQuaTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbjsNCiAgICAgICAgICAgICAgICAgICAgYSA9IHRoaXMuY29uZGl0aW9uKHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LnBlZWsoL14sXHMqKG5vdFxzKik/XCgvKSB8fCAhcGFyc2VySW5wdXQuJGNoYXIoJywnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuY29uZGl0aW9uKHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gbmV3ICh0cmVlLkNvbmRpdGlvbikoJ29yJywgY29uZGl0aW9uIHx8IGEsIGIsIGluZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24gfHwgYTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgY29uZGl0aW9uOiBmdW5jdGlvbiAobmVlZHNQYXJlbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxvZ2ljYWw7DQogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0Ow0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvcigpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXJJbnB1dC4kc3RyKCdvcicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY29uZGl0aW9uQW5kKG5lZWRzUGFyZW5zKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBsb2dpY2FsID0gb3IoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0aGlzLmNvbmRpdGlvbihuZWVkc1BhcmVucyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyAodHJlZS5Db25kaXRpb24pKGxvZ2ljYWwsIHJlc3VsdCwgbmV4dCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIGNvbmRpdGlvbkFuZDogZnVuY3Rpb24gKG5lZWRzUGFyZW5zKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7DQogICAgICAgICAgICAgICAgICAgIHZhciBsb2dpY2FsOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnNpZGVDb25kaXRpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZCA9IHNlbGYubmVnYXRlZENvbmRpdGlvbihuZWVkc1BhcmVucykgfHwgc2VsZi5wYXJlbnRoZXNpc0NvbmRpdGlvbihuZWVkc1BhcmVucyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmQgJiYgIW5lZWRzUGFyZW5zKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXRvbWljQ29uZGl0aW9uKG5lZWRzUGFyZW5zKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25kOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFuZCgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXJJbnB1dC4kc3RyKCdhbmQnKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpbnNpZGVDb25kaXRpb24oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBsb2dpY2FsID0gYW5kKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdGhpcy5jb25kaXRpb25BbmQobmVlZHNQYXJlbnMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgKHRyZWUuQ29uZGl0aW9uKShsb2dpY2FsLCByZXN1bHQsIG5leHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBuZWdhdGVkQ29uZGl0aW9uOiBmdW5jdGlvbiAobmVlZHNQYXJlbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LiRzdHIoJ25vdCcpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJlbnRoZXNpc0NvbmRpdGlvbihuZWVkc1BhcmVucyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm5lZ2F0ZSA9ICFyZXN1bHQubmVnYXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcGFyZW50aGVzaXNDb25kaXRpb246IGZ1bmN0aW9uIChuZWVkc1BhcmVucykgew0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0cnlDb25kaXRpb25Gb2xsb3dlZEJ5UGFyZW50aGVzaXMobWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib2R5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IG1lLmNvbmRpdGlvbihuZWVkc1BhcmVucyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJvZHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXJJbnB1dC4kY2hhcignKScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQucmVzdG9yZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHk7DQogICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnNhdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXJJbnB1dC4kc3RyKCcoJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBib2R5ID0gdHJ5Q29uZGl0aW9uRm9sbG93ZWRCeVBhcmVudGhlc2lzKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYm9keSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuZm9yZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5hdG9taWNDb25kaXRpb24obmVlZHNQYXJlbnMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIWJvZHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlcklucHV0LiRjaGFyKCcpJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LnJlc3RvcmUoImV4cGVjdGVkICcpJyBnb3QgJyIgKyBwYXJzZXJJbnB1dC5jdXJyZW50Q2hhcigpICsgIiciKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBhdG9taWNDb25kaXRpb246IGZ1bmN0aW9uIChuZWVkc1BhcmVucykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXRpZXMgPSB0aGlzLmVudGl0aWVzOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZXJJbnB1dC5pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgYTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGI7DQogICAgICAgICAgICAgICAgICAgIHZhciBjOw0KICAgICAgICAgICAgICAgICAgICB2YXIgb3A7DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbmQoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRpdGlvbigpIHx8IGVudGl0aWVzLmtleXdvcmQoKSB8fCBlbnRpdGllcy5xdW90ZWQoKSB8fCBlbnRpdGllcy5taXhpbkxvb2t1cCgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbmQgPSBjb25kLmJpbmQodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIGEgPSBjb25kKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChhKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJz4nKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC4kY2hhcignPScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gJz49JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gJz4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlcklucHV0LiRjaGFyKCc8JykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VySW5wdXQuJGNoYXIoJz0nKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9ICc8PSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9ICc8JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJzZXJJbnB1dC4kY2hhcignPScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcklucHV0LiRjaGFyKCc+JykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSAnPT4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJzZXJJbnB1dC4kY2hhcignPCcpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gJz08JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gJz0nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBjb25kKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG5ldyAodHJlZS5Db25kaXRpb24pKG9wLCBhLCBiLCBpbmRleCwgZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ2V4cGVjdGVkIGV4cHJlc3Npb24nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbmV3ICh0cmVlLkNvbmRpdGlvbikoJz0nLCBhLCBuZXcgKHRyZWUuS2V5d29yZCkoJ3RydWUnKSwgaW5kZXgsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEFuIG9wZXJhbmQgaXMgYW55dGhpbmcgdGhhdCBjYW4gYmUgcGFydCBvZiBhbiBvcGVyYXRpb24sDQogICAgICAgICAgICAgICAgLy8gc3VjaCBhcyBhIENvbG9yLCBvciBhIFZhcmlhYmxlDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICBvcGVyYW5kOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IHRoaXMuZW50aXRpZXM7DQogICAgICAgICAgICAgICAgICAgIHZhciBuZWdhdGU7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJJbnB1dC5wZWVrKC9eLVtAXCRcKF0vKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRlID0gcGFyc2VySW5wdXQuJGNoYXIoJy0nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRoaXMuc3ViKCkgfHwgZW50aXRpZXMuZGltZW5zaW9uKCkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLmNvbG9yKCkgfHwgZW50aXRpZXMudmFyaWFibGUoKSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMucHJvcGVydHkoKSB8fCBlbnRpdGllcy5jYWxsKCkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLnF1b3RlZCh0cnVlKSB8fCBlbnRpdGllcy5jb2xvcktleXdvcmQoKSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMubWl4aW5Mb29rdXAoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgby5wYXJlbnNJbk9wID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBuZXcgKHRyZWUuTmVnYXRpdmUpKG8pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAvLyBFeHByZXNzaW9ucyBlaXRoZXIgcmVwcmVzZW50IG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zLA0KICAgICAgICAgICAgICAgIC8vIG9yIHdoaXRlLXNwYWNlIGRlbGltaXRlZCBFbnRpdGllcy4NCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vICAgICAxcHggc29saWQgYmxhY2sNCiAgICAgICAgICAgICAgICAvLyAgICAgQHZhciAqIDINCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0aWVzID0gW107DQogICAgICAgICAgICAgICAgICAgIHZhciBlOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZGVsaW07DQogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLmNvbW1lbnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLmFkZGl0aW9uKCkgfHwgdGhpcy5lbnRpdHkoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgdHJlZS5Db21tZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLnB1c2goZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9ucyBkbyBub3QgYWxsb3cga2V5d29yZCAiLyIgZGltZW5zaW9uIChlLmcuIHNtYWxsLzIwcHgpIHNvIHdlIHN1cHBvcnQgdGhhdCBoZXJlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXJJbnB1dC5wZWVrKC9eXC9bXC8qXS8pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltID0gcGFyc2VySW5wdXQuJGNoYXIoJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllcy5wdXNoKG5ldyAodHJlZS5Bbm9ueW1vdXMpKGRlbGltLCBpbmRleCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0aWVzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKHRyZWUuRXhwcmVzc2lvbikoZW50aXRpZXMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IHBhcnNlcklucHV0LiRyZSgvXihcKj8tP1tfYS16QS1aMC05LV0rKVxzKjovKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lWzFdOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBydWxlUHJvcGVydHk6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gW107DQogICAgICAgICAgICAgICAgICAgIHZhciBzOw0KICAgICAgICAgICAgICAgICAgICB2YXIgazsNCiAgICAgICAgICAgICAgICAgICAgcGFyc2VySW5wdXQuc2F2ZSgpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgc2ltcGxlUHJvcGVydHkgPSBwYXJzZXJJbnB1dC4kcmUoL14oW19hLXpBLVowLTktXSspXHMqOi8pOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc2ltcGxlUHJvcGVydHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBbbmV3ICh0cmVlLktleXdvcmQpKHNpbXBsZVByb3BlcnR5WzFdKV07DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5mb3JnZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1hdGNoKHJlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlcklucHV0Lmk7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSBwYXJzZXJJbnB1dC4kcmUocmUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgucHVzaChpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5wdXNoKGNodW5rWzFdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBtYXRjaCgvXihcKj8pLyk7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKC9eKCg/Oltcdy1dKyl8KD86W0BcJF1ce1tcdy1dK1x9KSkvKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgobmFtZS5sZW5ndGggPiAxKSAmJiBtYXRjaCgvXigoPzpcK198XCspPylccyo6LykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcklucHV0LmZvcmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgbGFzdCwgd2UgaGF2ZSB0aGUgY29tcGxldGUgbWF0Y2ggbm93LiBtb3ZlIGZvcndhcmQsDQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IG5hbWUgcGFydGljbGVzIHRvIHRyZWUgb2JqZWN0cyBhbmQgcmV0dXJuOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT09ICcnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zaGlmdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LnNoaWZ0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbmFtZS5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBuYW1lW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVba10gPSAocy5jaGFyQXQoMCkgIT09ICdAJyAmJiBzLmNoYXJBdCgwKSAhPT0gJyQnKSA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAodHJlZS5LZXl3b3JkKShzKSA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLmNoYXJBdCgwKSA9PT0gJ0AnID8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAodHJlZS5WYXJpYWJsZSkoIkAiICsgcy5zbGljZSgyLCAtMSksIGluZGV4W2tdLCBmaWxlSW5mbykgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ICh0cmVlLlByb3BlcnR5KSgiJCIgKyBzLnNsaWNlKDIsIC0xKSwgaW5kZXhba10sIGZpbGVJbmZvKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJJbnB1dC5yZXN0b3JlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH07DQogICAgUGFyc2VyLnNlcmlhbGl6ZVZhcnMgPSBmdW5jdGlvbiAodmFycykgew0KICAgICAgICB2YXIgcyA9ICcnOw0KICAgICAgICBmb3IgKHZhciBuYW1lXzEgaW4gdmFycykgew0KICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhcnMsIG5hbWVfMSkpIHsNCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YXJzW25hbWVfMV07DQogICAgICAgICAgICAgICAgcyArPSAoKG5hbWVfMVswXSA9PT0gJ0AnKSA/ICcnIDogJ0AnKSArIG5hbWVfMSArICI6ICIgKyB2YWx1ZSArICgoU3RyaW5nKHZhbHVlKS5zbGljZSgtMSkgPT09ICc7JykgPyAnJyA6ICc7Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHM7DQogICAgfTsKCiAgICBmdW5jdGlvbiBib29sZWFuKGNvbmRpdGlvbikgew0KICAgICAgICByZXR1cm4gY29uZGl0aW9uID8gS2V5d29yZC5UcnVlIDogS2V5d29yZC5GYWxzZTsNCiAgICB9DQogICAgLyoqDQogICAgICogRnVuY3Rpb25zIHdpdGggZXZhbEFyZ3Mgc2V0IHRvIGZhbHNlIGFyZSBzZW50IGNvbnRleHQNCiAgICAgKiBhcyB0aGUgZmlyc3QgYXJndW1lbnQuDQogICAgICovDQogICAgZnVuY3Rpb24gSWYoY29udGV4dCwgY29uZGl0aW9uLCB0cnVlVmFsdWUsIGZhbHNlVmFsdWUpIHsNCiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5ldmFsKGNvbnRleHQpID8gdHJ1ZVZhbHVlLmV2YWwoY29udGV4dCkNCiAgICAgICAgICAgIDogKGZhbHNlVmFsdWUgPyBmYWxzZVZhbHVlLmV2YWwoY29udGV4dCkgOiBuZXcgQW5vbnltb3VzKTsNCiAgICB9DQogICAgSWYuZXZhbEFyZ3MgPSBmYWxzZTsNCiAgICBmdW5jdGlvbiBpc2RlZmluZWQoY29udGV4dCwgdmFyaWFibGUpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHZhcmlhYmxlLmV2YWwoY29udGV4dCk7DQogICAgICAgICAgICByZXR1cm4gS2V5d29yZC5UcnVlOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICByZXR1cm4gS2V5d29yZC5GYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpc2RlZmluZWQuZXZhbEFyZ3MgPSBmYWxzZTsNCiAgICB2YXIgYm9vbGVhbiQxID0geyBpc2RlZmluZWQ6IGlzZGVmaW5lZCwgYm9vbGVhbjogYm9vbGVhbiwgJ2lmJzogSWYgfTsKCiAgICB2YXIgY29sb3JGdW5jdGlvbnM7DQogICAgZnVuY3Rpb24gY2xhbXAodmFsKSB7DQogICAgICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCB2YWwpKTsNCiAgICB9DQogICAgZnVuY3Rpb24gaHNsYShvcmlnQ29sb3IsIGhzbCkgew0KICAgICAgICB2YXIgY29sb3IgPSBjb2xvckZ1bmN0aW9ucy5oc2xhKGhzbC5oLCBoc2wucywgaHNsLmwsIGhzbC5hKTsNCiAgICAgICAgaWYgKGNvbG9yKSB7DQogICAgICAgICAgICBpZiAob3JpZ0NvbG9yLnZhbHVlICYmDQogICAgICAgICAgICAgICAgL14ocmdifGhzbCkvLnRlc3Qob3JpZ0NvbG9yLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gb3JpZ0NvbG9yLnZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSAncmdiJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjb2xvcjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBmdW5jdGlvbiB0b0hTTChjb2xvcikgew0KICAgICAgICBpZiAoY29sb3IudG9IU0wpIHsNCiAgICAgICAgICAgIHJldHVybiBjb2xvci50b0hTTCgpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCBjYW5ub3QgYmUgZXZhbHVhdGVkIHRvIGEgY29sb3InKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBmdW5jdGlvbiB0b0hTVihjb2xvcikgew0KICAgICAgICBpZiAoY29sb3IudG9IU1YpIHsNCiAgICAgICAgICAgIHJldHVybiBjb2xvci50b0hTVigpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCBjYW5ub3QgYmUgZXZhbHVhdGVkIHRvIGEgY29sb3InKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBmdW5jdGlvbiBudW1iZXIkMShuKSB7DQogICAgICAgIGlmIChuIGluc3RhbmNlb2YgRGltZW5zaW9uKSB7DQogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChuLnVuaXQuaXMoJyUnKSA/IG4udmFsdWUgLyAxMDAgOiBuLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmICh0eXBlb2YgbiA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgIHJldHVybiBuOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGhyb3cgew0KICAgICAgICAgICAgICAgIHR5cGU6ICdBcmd1bWVudCcsDQogICAgICAgICAgICAgICAgbWVzc2FnZTogJ2NvbG9yIGZ1bmN0aW9ucyB0YWtlIG51bWJlcnMgYXMgcGFyYW1ldGVycycNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICB9DQogICAgZnVuY3Rpb24gc2NhbGVkKG4sIHNpemUpIHsNCiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBEaW1lbnNpb24gJiYgbi51bml0LmlzKCclJykpIHsNCiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG4udmFsdWUgKiBzaXplIC8gMTAwKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiBudW1iZXIkMShuKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBjb2xvckZ1bmN0aW9ucyA9IHsNCiAgICAgICAgcmdiOiBmdW5jdGlvbiAociwgZywgYikgew0KICAgICAgICAgICAgdmFyIGEgPSAxOw0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBDb21tYS1sZXNzIHN5bnRheA0KICAgICAgICAgICAgICogICBlLmcuIHJnYigwIDEyOCAyNTUgLyA1MCUpDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgRXhwcmVzc2lvbikgew0KICAgICAgICAgICAgICAgIHZhciB2YWwgPSByLnZhbHVlOw0KICAgICAgICAgICAgICAgIHIgPSB2YWxbMF07DQogICAgICAgICAgICAgICAgZyA9IHZhbFsxXTsNCiAgICAgICAgICAgICAgICBiID0gdmFsWzJdOw0KICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAqIEB0b2RvIC0gc2hvdWxkIHRoaXMgYmUgbm9ybWFsaXplZCBpbg0KICAgICAgICAgICAgICAgICAqICAgZnVuY3Rpb24gY2FsbGVyPyBPciBwYXJzZWQgZGlmZmVyZW50bHk/DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wID0gYjsNCiAgICAgICAgICAgICAgICAgICAgYiA9IG9wLm9wZXJhbmRzWzBdOw0KICAgICAgICAgICAgICAgICAgICBhID0gb3Aub3BlcmFuZHNbMV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGNvbG9yID0gY29sb3JGdW5jdGlvbnMucmdiYShyLCBnLCBiLCBhKTsNCiAgICAgICAgICAgIGlmIChjb2xvcikgew0KICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gJ3JnYic7DQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICByZ2JhOiBmdW5jdGlvbiAociwgZywgYiwgYSkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIENvbG9yKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhID0gbnVtYmVyJDEoZyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhID0gci5hbHBoYTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKHIucmdiLCBhLCAncmdiYScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgcmdiID0gW3IsIGcsIGJdLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gc2NhbGVkKGMsIDI1NSk7IH0pOw0KICAgICAgICAgICAgICAgIGEgPSBudW1iZXIkMShhKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKHJnYiwgYSwgJ3JnYmEnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKSB7IH0NCiAgICAgICAgfSwNCiAgICAgICAgaHNsOiBmdW5jdGlvbiAoaCwgcywgbCkgew0KICAgICAgICAgICAgdmFyIGEgPSAxOw0KICAgICAgICAgICAgaWYgKGggaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbCA9IGgudmFsdWU7DQogICAgICAgICAgICAgICAgaCA9IHZhbFswXTsNCiAgICAgICAgICAgICAgICBzID0gdmFsWzFdOw0KICAgICAgICAgICAgICAgIGwgPSB2YWxbMl07DQogICAgICAgICAgICAgICAgaWYgKGwgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wID0gbDsNCiAgICAgICAgICAgICAgICAgICAgbCA9IG9wLm9wZXJhbmRzWzBdOw0KICAgICAgICAgICAgICAgICAgICBhID0gb3Aub3BlcmFuZHNbMV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGNvbG9yID0gY29sb3JGdW5jdGlvbnMuaHNsYShoLCBzLCBsLCBhKTsNCiAgICAgICAgICAgIGlmIChjb2xvcikgew0KICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gJ2hzbCc7DQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBoc2xhOiBmdW5jdGlvbiAoaCwgcywgbCwgYSkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAoaCBpbnN0YW5jZW9mIENvbG9yKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhID0gbnVtYmVyJDEocyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhID0gaC5hbHBoYTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKGgucmdiLCBhLCAnaHNsYScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgbTFfMTsNCiAgICAgICAgICAgICAgICB2YXIgbTJfMTsNCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBodWUoaCkgew0KICAgICAgICAgICAgICAgICAgICBoID0gaCA8IDAgPyBoICsgMSA6IChoID4gMSA/IGggLSAxIDogaCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChoICogNiA8IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtMV8xICsgKG0yXzEgLSBtMV8xKSAqIGggKiA2Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGggKiAyIDwgMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0yXzE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaCAqIDMgPCAyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTFfMSArIChtMl8xIC0gbTFfMSkgKiAoMiAvIDMgLSBoKSAqIDY7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTFfMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBoID0gKG51bWJlciQxKGgpICUgMzYwKSAvIDM2MDsNCiAgICAgICAgICAgICAgICBzID0gY2xhbXAobnVtYmVyJDEocykpOw0KICAgICAgICAgICAgICAgIGwgPSBjbGFtcChudW1iZXIkMShsKSk7DQogICAgICAgICAgICAgICAgYSA9IGNsYW1wKG51bWJlciQxKGEpKTsNCiAgICAgICAgICAgICAgICBtMl8xID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7DQogICAgICAgICAgICAgICAgbTFfMSA9IGwgKiAyIC0gbTJfMTsNCiAgICAgICAgICAgICAgICB2YXIgcmdiID0gWw0KICAgICAgICAgICAgICAgICAgICBodWUoaCArIDEgLyAzKSAqIDI1NSwNCiAgICAgICAgICAgICAgICAgICAgaHVlKGgpICogMjU1LA0KICAgICAgICAgICAgICAgICAgICBodWUoaCAtIDEgLyAzKSAqIDI1NQ0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgYSA9IG51bWJlciQxKGEpOw0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IocmdiLCBhLCAnaHNsYScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQ0KICAgICAgICB9LA0KICAgICAgICBoc3Y6IGZ1bmN0aW9uIChoLCBzLCB2KSB7DQogICAgICAgICAgICByZXR1cm4gY29sb3JGdW5jdGlvbnMuaHN2YShoLCBzLCB2LCAxLjApOw0KICAgICAgICB9LA0KICAgICAgICBoc3ZhOiBmdW5jdGlvbiAoaCwgcywgdiwgYSkgew0KICAgICAgICAgICAgaCA9ICgobnVtYmVyJDEoaCkgJSAzNjApIC8gMzYwKSAqIDM2MDsNCiAgICAgICAgICAgIHMgPSBudW1iZXIkMShzKTsNCiAgICAgICAgICAgIHYgPSBudW1iZXIkMSh2KTsNCiAgICAgICAgICAgIGEgPSBudW1iZXIkMShhKTsNCiAgICAgICAgICAgIHZhciBpOw0KICAgICAgICAgICAgdmFyIGY7DQogICAgICAgICAgICBpID0gTWF0aC5mbG9vcigoaCAvIDYwKSAlIDYpOw0KICAgICAgICAgICAgZiA9IChoIC8gNjApIC0gaTsNCiAgICAgICAgICAgIHZhciB2cyA9IFt2LA0KICAgICAgICAgICAgICAgIHYgKiAoMSAtIHMpLA0KICAgICAgICAgICAgICAgIHYgKiAoMSAtIGYgKiBzKSwNCiAgICAgICAgICAgICAgICB2ICogKDEgLSAoMSAtIGYpICogcyldOw0KICAgICAgICAgICAgdmFyIHBlcm0gPSBbWzAsIDMsIDFdLA0KICAgICAgICAgICAgICAgIFsyLCAwLCAxXSwNCiAgICAgICAgICAgICAgICBbMSwgMCwgM10sDQogICAgICAgICAgICAgICAgWzEsIDIsIDBdLA0KICAgICAgICAgICAgICAgIFszLCAxLCAwXSwNCiAgICAgICAgICAgICAgICBbMCwgMSwgMl1dOw0KICAgICAgICAgICAgcmV0dXJuIGNvbG9yRnVuY3Rpb25zLnJnYmEodnNbcGVybVtpXVswXV0gKiAyNTUsIHZzW3Blcm1baV1bMV1dICogMjU1LCB2c1twZXJtW2ldWzJdXSAqIDI1NSwgYSk7DQogICAgICAgIH0sDQogICAgICAgIGh1ZTogZnVuY3Rpb24gKGNvbG9yKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih0b0hTTChjb2xvcikuaCk7DQogICAgICAgIH0sDQogICAgICAgIHNhdHVyYXRpb246IGZ1bmN0aW9uIChjb2xvcikgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24odG9IU0woY29sb3IpLnMgKiAxMDAsICclJyk7DQogICAgICAgIH0sDQogICAgICAgIGxpZ2h0bmVzczogZnVuY3Rpb24gKGNvbG9yKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih0b0hTTChjb2xvcikubCAqIDEwMCwgJyUnKTsNCiAgICAgICAgfSwNCiAgICAgICAgaHN2aHVlOiBmdW5jdGlvbiAoY29sb3IpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHRvSFNWKGNvbG9yKS5oKTsNCiAgICAgICAgfSwNCiAgICAgICAgaHN2c2F0dXJhdGlvbjogZnVuY3Rpb24gKGNvbG9yKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih0b0hTVihjb2xvcikucyAqIDEwMCwgJyUnKTsNCiAgICAgICAgfSwNCiAgICAgICAgaHN2dmFsdWU6IGZ1bmN0aW9uIChjb2xvcikgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24odG9IU1YoY29sb3IpLnYgKiAxMDAsICclJyk7DQogICAgICAgIH0sDQogICAgICAgIHJlZDogZnVuY3Rpb24gKGNvbG9yKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihjb2xvci5yZ2JbMF0pOw0KICAgICAgICB9LA0KICAgICAgICBncmVlbjogZnVuY3Rpb24gKGNvbG9yKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihjb2xvci5yZ2JbMV0pOw0KICAgICAgICB9LA0KICAgICAgICBibHVlOiBmdW5jdGlvbiAoY29sb3IpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKGNvbG9yLnJnYlsyXSk7DQogICAgICAgIH0sDQogICAgICAgIGFscGhhOiBmdW5jdGlvbiAoY29sb3IpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHRvSFNMKGNvbG9yKS5hKTsNCiAgICAgICAgfSwNCiAgICAgICAgbHVtYTogZnVuY3Rpb24gKGNvbG9yKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihjb2xvci5sdW1hKCkgKiBjb2xvci5hbHBoYSAqIDEwMCwgJyUnKTsNCiAgICAgICAgfSwNCiAgICAgICAgbHVtaW5hbmNlOiBmdW5jdGlvbiAoY29sb3IpIHsNCiAgICAgICAgICAgIHZhciBsdW1pbmFuY2UgPSAoMC4yMTI2ICogY29sb3IucmdiWzBdIC8gMjU1KSArDQogICAgICAgICAgICAgICAgKDAuNzE1MiAqIGNvbG9yLnJnYlsxXSAvIDI1NSkgKw0KICAgICAgICAgICAgICAgICgwLjA3MjIgKiBjb2xvci5yZ2JbMl0gLyAyNTUpOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24obHVtaW5hbmNlICogY29sb3IuYWxwaGEgKiAxMDAsICclJyk7DQogICAgICAgIH0sDQogICAgICAgIHNhdHVyYXRlOiBmdW5jdGlvbiAoY29sb3IsIGFtb3VudCwgbWV0aG9kKSB7DQogICAgICAgICAgICAvLyBmaWx0ZXI6IHNhdHVyYXRlKDMuMik7DQogICAgICAgICAgICAvLyBzaG91bGQgYmUga2VwdCBhcyBpcywgc28gY2hlY2sgZm9yIGNvbG9yDQogICAgICAgICAgICBpZiAoIWNvbG9yLnJnYikgew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGhzbCA9IHRvSFNMKGNvbG9yKTsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAndW5kZWZpbmVkJyAmJiBtZXRob2QudmFsdWUgPT09ICdyZWxhdGl2ZScpIHsNCiAgICAgICAgICAgICAgICBoc2wucyArPSBoc2wucyAqIGFtb3VudC52YWx1ZSAvIDEwMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGhzbC5zICs9IGFtb3VudC52YWx1ZSAvIDEwMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGhzbC5zID0gY2xhbXAoaHNsLnMpOw0KICAgICAgICAgICAgcmV0dXJuIGhzbGEoY29sb3IsIGhzbCk7DQogICAgICAgIH0sDQogICAgICAgIGRlc2F0dXJhdGU6IGZ1bmN0aW9uIChjb2xvciwgYW1vdW50LCBtZXRob2QpIHsNCiAgICAgICAgICAgIHZhciBoc2wgPSB0b0hTTChjb2xvcik7DQogICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ3VuZGVmaW5lZCcgJiYgbWV0aG9kLnZhbHVlID09PSAncmVsYXRpdmUnKSB7DQogICAgICAgICAgICAgICAgaHNsLnMgLT0gaHNsLnMgKiBhbW91bnQudmFsdWUgLyAxMDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBoc2wucyAtPSBhbW91bnQudmFsdWUgLyAxMDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBoc2wucyA9IGNsYW1wKGhzbC5zKTsNCiAgICAgICAgICAgIHJldHVybiBoc2xhKGNvbG9yLCBoc2wpOw0KICAgICAgICB9LA0KICAgICAgICBsaWdodGVuOiBmdW5jdGlvbiAoY29sb3IsIGFtb3VudCwgbWV0aG9kKSB7DQogICAgICAgICAgICB2YXIgaHNsID0gdG9IU0woY29sb3IpOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09ICd1bmRlZmluZWQnICYmIG1ldGhvZC52YWx1ZSA9PT0gJ3JlbGF0aXZlJykgew0KICAgICAgICAgICAgICAgIGhzbC5sICs9IGhzbC5sICogYW1vdW50LnZhbHVlIC8gMTAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgaHNsLmwgKz0gYW1vdW50LnZhbHVlIC8gMTAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaHNsLmwgPSBjbGFtcChoc2wubCk7DQogICAgICAgICAgICByZXR1cm4gaHNsYShjb2xvciwgaHNsKTsNCiAgICAgICAgfSwNCiAgICAgICAgZGFya2VuOiBmdW5jdGlvbiAoY29sb3IsIGFtb3VudCwgbWV0aG9kKSB7DQogICAgICAgICAgICB2YXIgaHNsID0gdG9IU0woY29sb3IpOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09ICd1bmRlZmluZWQnICYmIG1ldGhvZC52YWx1ZSA9PT0gJ3JlbGF0aXZlJykgew0KICAgICAgICAgICAgICAgIGhzbC5sIC09IGhzbC5sICogYW1vdW50LnZhbHVlIC8gMTAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgaHNsLmwgLT0gYW1vdW50LnZhbHVlIC8gMTAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaHNsLmwgPSBjbGFtcChoc2wubCk7DQogICAgICAgICAgICByZXR1cm4gaHNsYShjb2xvciwgaHNsKTsNCiAgICAgICAgfSwNCiAgICAgICAgZmFkZWluOiBmdW5jdGlvbiAoY29sb3IsIGFtb3VudCwgbWV0aG9kKSB7DQogICAgICAgICAgICB2YXIgaHNsID0gdG9IU0woY29sb3IpOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09ICd1bmRlZmluZWQnICYmIG1ldGhvZC52YWx1ZSA9PT0gJ3JlbGF0aXZlJykgew0KICAgICAgICAgICAgICAgIGhzbC5hICs9IGhzbC5hICogYW1vdW50LnZhbHVlIC8gMTAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgaHNsLmEgKz0gYW1vdW50LnZhbHVlIC8gMTAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaHNsLmEgPSBjbGFtcChoc2wuYSk7DQogICAgICAgICAgICByZXR1cm4gaHNsYShjb2xvciwgaHNsKTsNCiAgICAgICAgfSwNCiAgICAgICAgZmFkZW91dDogZnVuY3Rpb24gKGNvbG9yLCBhbW91bnQsIG1ldGhvZCkgew0KICAgICAgICAgICAgdmFyIGhzbCA9IHRvSFNMKGNvbG9yKTsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAndW5kZWZpbmVkJyAmJiBtZXRob2QudmFsdWUgPT09ICdyZWxhdGl2ZScpIHsNCiAgICAgICAgICAgICAgICBoc2wuYSAtPSBoc2wuYSAqIGFtb3VudC52YWx1ZSAvIDEwMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGhzbC5hIC09IGFtb3VudC52YWx1ZSAvIDEwMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGhzbC5hID0gY2xhbXAoaHNsLmEpOw0KICAgICAgICAgICAgcmV0dXJuIGhzbGEoY29sb3IsIGhzbCk7DQogICAgICAgIH0sDQogICAgICAgIGZhZGU6IGZ1bmN0aW9uIChjb2xvciwgYW1vdW50KSB7DQogICAgICAgICAgICB2YXIgaHNsID0gdG9IU0woY29sb3IpOw0KICAgICAgICAgICAgaHNsLmEgPSBhbW91bnQudmFsdWUgLyAxMDA7DQogICAgICAgICAgICBoc2wuYSA9IGNsYW1wKGhzbC5hKTsNCiAgICAgICAgICAgIHJldHVybiBoc2xhKGNvbG9yLCBoc2wpOw0KICAgICAgICB9LA0KICAgICAgICBzcGluOiBmdW5jdGlvbiAoY29sb3IsIGFtb3VudCkgew0KICAgICAgICAgICAgdmFyIGhzbCA9IHRvSFNMKGNvbG9yKTsNCiAgICAgICAgICAgIHZhciBodWUgPSAoaHNsLmggKyBhbW91bnQudmFsdWUpICUgMzYwOw0KICAgICAgICAgICAgaHNsLmggPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlOw0KICAgICAgICAgICAgcmV0dXJuIGhzbGEoY29sb3IsIGhzbCk7DQogICAgICAgIH0sDQogICAgICAgIC8vDQogICAgICAgIC8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IEhhbXB0b24gQ2F0bGluLCBOYXRhbGllIFdlaXplbmJhdW0sIGFuZCBDaHJpcyBFcHBzdGVpbg0KICAgICAgICAvLyBodHRwOi8vc2Fzcy1sYW5nLmNvbQ0KICAgICAgICAvLw0KICAgICAgICBtaXg6IGZ1bmN0aW9uIChjb2xvcjEsIGNvbG9yMiwgd2VpZ2h0KSB7DQogICAgICAgICAgICBpZiAoIXdlaWdodCkgew0KICAgICAgICAgICAgICAgIHdlaWdodCA9IG5ldyBEaW1lbnNpb24oNTApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHAgPSB3ZWlnaHQudmFsdWUgLyAxMDAuMDsNCiAgICAgICAgICAgIHZhciB3ID0gcCAqIDIgLSAxOw0KICAgICAgICAgICAgdmFyIGEgPSB0b0hTTChjb2xvcjEpLmEgLSB0b0hTTChjb2xvcjIpLmE7DQogICAgICAgICAgICB2YXIgdzEgPSAoKCh3ICogYSA9PSAtMSkgPyB3IDogKHcgKyBhKSAvICgxICsgdyAqIGEpKSArIDEpIC8gMi4wOw0KICAgICAgICAgICAgdmFyIHcyID0gMSAtIHcxOw0KICAgICAgICAgICAgdmFyIHJnYiA9IFtjb2xvcjEucmdiWzBdICogdzEgKyBjb2xvcjIucmdiWzBdICogdzIsDQogICAgICAgICAgICAgICAgY29sb3IxLnJnYlsxXSAqIHcxICsgY29sb3IyLnJnYlsxXSAqIHcyLA0KICAgICAgICAgICAgICAgIGNvbG9yMS5yZ2JbMl0gKiB3MSArIGNvbG9yMi5yZ2JbMl0gKiB3Ml07DQogICAgICAgICAgICB2YXIgYWxwaGEgPSBjb2xvcjEuYWxwaGEgKiBwICsgY29sb3IyLmFscGhhICogKDEgLSBwKTsNCiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IocmdiLCBhbHBoYSk7DQogICAgICAgIH0sDQogICAgICAgIGdyZXlzY2FsZTogZnVuY3Rpb24gKGNvbG9yKSB7DQogICAgICAgICAgICByZXR1cm4gY29sb3JGdW5jdGlvbnMuZGVzYXR1cmF0ZShjb2xvciwgbmV3IERpbWVuc2lvbigxMDApKTsNCiAgICAgICAgfSwNCiAgICAgICAgY29udHJhc3Q6IGZ1bmN0aW9uIChjb2xvciwgZGFyaywgbGlnaHQsIHRocmVzaG9sZCkgew0KICAgICAgICAgICAgLy8gZmlsdGVyOiBjb250cmFzdCgzLjIpOw0KICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGtlcHQgYXMgaXMsIHNvIGNoZWNrIGZvciBjb2xvcg0KICAgICAgICAgICAgaWYgKCFjb2xvci5yZ2IpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0eXBlb2YgbGlnaHQgPT09ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICAgICAgbGlnaHQgPSBjb2xvckZ1bmN0aW9ucy5yZ2JhKDI1NSwgMjU1LCAyNTUsIDEuMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodHlwZW9mIGRhcmsgPT09ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICAgICAgZGFyayA9IGNvbG9yRnVuY3Rpb25zLnJnYmEoMCwgMCwgMCwgMS4wKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggaXMgYWN0dWFsbHkgbGlnaHQgYW5kIGRhcms6DQogICAgICAgICAgICBpZiAoZGFyay5sdW1hKCkgPiBsaWdodC5sdW1hKCkpIHsNCiAgICAgICAgICAgICAgICB2YXIgdCA9IGxpZ2h0Ow0KICAgICAgICAgICAgICAgIGxpZ2h0ID0gZGFyazsNCiAgICAgICAgICAgICAgICBkYXJrID0gdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhyZXNob2xkID09PSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IDAuNDM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBudW1iZXIkMSh0aHJlc2hvbGQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGNvbG9yLmx1bWEoKSA8IHRocmVzaG9sZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBsaWdodDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBkYXJrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICAvLyBDaGFuZ2VzIG1hZGUgaW4gMi43LjAgLSBSZXZlcnRlZCBpbiAzLjAuMA0KICAgICAgICAvLyBjb250cmFzdDogZnVuY3Rpb24gKGNvbG9yLCBjb2xvcjEsIGNvbG9yMiwgdGhyZXNob2xkKSB7DQogICAgICAgIC8vICAgICAvLyBSZXR1cm4gd2hpY2ggb2YgYGNvbG9yMWAgYW5kIGBjb2xvcjJgIGhhcyB0aGUgZ3JlYXRlc3QgY29udHJhc3Qgd2l0aCBgY29sb3JgDQogICAgICAgIC8vICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIFdDQUcgY29udHJhc3QgcmF0aW8gY2FsY3VsYXRpb24uDQogICAgICAgIC8vICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmDQogICAgICAgIC8vICAgICAvLyBUaGUgdGhyZXNob2xkIHBhcmFtIGlzIG5vIGxvbmdlciB1c2VkLCBpbiBsaW5lIHdpdGggU0FTUy4NCiAgICAgICAgLy8gICAgIC8vIGZpbHRlcjogY29udHJhc3QoMy4yKTsNCiAgICAgICAgLy8gICAgIC8vIHNob3VsZCBiZSBrZXB0IGFzIGlzLCBzbyBjaGVjayBmb3IgY29sb3INCiAgICAgICAgLy8gICAgIGlmICghY29sb3IucmdiKSB7DQogICAgICAgIC8vICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIC8vICAgICB9DQogICAgICAgIC8vICAgICBpZiAodHlwZW9mIGNvbG9yMSA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICAgICAgLy8gICAgICAgICBjb2xvcjEgPSBjb2xvckZ1bmN0aW9ucy5yZ2JhKDAsIDAsIDAsIDEuMCk7DQogICAgICAgIC8vICAgICB9DQogICAgICAgIC8vICAgICBpZiAodHlwZW9mIGNvbG9yMiA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICAgICAgLy8gICAgICAgICBjb2xvcjIgPSBjb2xvckZ1bmN0aW9ucy5yZ2JhKDI1NSwgMjU1LCAyNTUsIDEuMCk7DQogICAgICAgIC8vICAgICB9DQogICAgICAgIC8vICAgICB2YXIgY29udHJhc3QxLCBjb250cmFzdDI7DQogICAgICAgIC8vICAgICB2YXIgbHVtYSA9IGNvbG9yLmx1bWEoKTsNCiAgICAgICAgLy8gICAgIHZhciBsdW1hMSA9IGNvbG9yMS5sdW1hKCk7DQogICAgICAgIC8vICAgICB2YXIgbHVtYTIgPSBjb2xvcjIubHVtYSgpOw0KICAgICAgICAvLyAgICAgLy8gQ2FsY3VsYXRlIGNvbnRyYXN0IHJhdGlvcyBmb3IgZWFjaCBjb2xvcg0KICAgICAgICAvLyAgICAgaWYgKGx1bWEgPiBsdW1hMSkgew0KICAgICAgICAvLyAgICAgICAgIGNvbnRyYXN0MSA9IChsdW1hICsgMC4wNSkgLyAobHVtYTEgKyAwLjA1KTsNCiAgICAgICAgLy8gICAgIH0gZWxzZSB7DQogICAgICAgIC8vICAgICAgICAgY29udHJhc3QxID0gKGx1bWExICsgMC4wNSkgLyAobHVtYSArIDAuMDUpOw0KICAgICAgICAvLyAgICAgfQ0KICAgICAgICAvLyAgICAgaWYgKGx1bWEgPiBsdW1hMikgew0KICAgICAgICAvLyAgICAgICAgIGNvbnRyYXN0MiA9IChsdW1hICsgMC4wNSkgLyAobHVtYTIgKyAwLjA1KTsNCiAgICAgICAgLy8gICAgIH0gZWxzZSB7DQogICAgICAgIC8vICAgICAgICAgY29udHJhc3QyID0gKGx1bWEyICsgMC4wNSkgLyAobHVtYSArIDAuMDUpOw0KICAgICAgICAvLyAgICAgfQ0KICAgICAgICAvLyAgICAgaWYgKGNvbnRyYXN0MSA+IGNvbnRyYXN0Mikgew0KICAgICAgICAvLyAgICAgICAgIHJldHVybiBjb2xvcjE7DQogICAgICAgIC8vICAgICB9IGVsc2Ugew0KICAgICAgICAvLyAgICAgICAgIHJldHVybiBjb2xvcjI7DQogICAgICAgIC8vICAgICB9DQogICAgICAgIC8vIH0sDQogICAgICAgIGFyZ2I6IGZ1bmN0aW9uIChjb2xvcikgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXMoY29sb3IudG9BUkdCKCkpOw0KICAgICAgICB9LA0KICAgICAgICBjb2xvcjogZnVuY3Rpb24gKGMpIHsNCiAgICAgICAgICAgIGlmICgoYyBpbnN0YW5jZW9mIFF1b3RlZCkgJiYNCiAgICAgICAgICAgICAgICAoL14jKFtBLUZhLWYwLTldezh9fFtBLUZhLWYwLTldezZ9fFtBLUZhLWYwLTldezMsNH0pJC9pLnRlc3QoYy52YWx1ZSkpKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbCA9IGMudmFsdWUuc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcih2YWwsIHVuZGVmaW5lZCwgIiMiICsgdmFsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgoYyBpbnN0YW5jZW9mIENvbG9yKSB8fCAoYyA9IENvbG9yLmZyb21LZXl3b3JkKGMudmFsdWUpKSkgew0KICAgICAgICAgICAgICAgIGMudmFsdWUgPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIGM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aHJvdyB7DQogICAgICAgICAgICAgICAgdHlwZTogJ0FyZ3VtZW50JywNCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnYXJndW1lbnQgbXVzdCBiZSBhIGNvbG9yIGtleXdvcmQgb3IgM3w0fDZ8OCBkaWdpdCBoZXggZS5nLiAjRkZGJw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSwNCiAgICAgICAgdGludDogZnVuY3Rpb24gKGNvbG9yLCBhbW91bnQpIHsNCiAgICAgICAgICAgIHJldHVybiBjb2xvckZ1bmN0aW9ucy5taXgoY29sb3JGdW5jdGlvbnMucmdiKDI1NSwgMjU1LCAyNTUpLCBjb2xvciwgYW1vdW50KTsNCiAgICAgICAgfSwNCiAgICAgICAgc2hhZGU6IGZ1bmN0aW9uIChjb2xvciwgYW1vdW50KSB7DQogICAgICAgICAgICByZXR1cm4gY29sb3JGdW5jdGlvbnMubWl4KGNvbG9yRnVuY3Rpb25zLnJnYigwLCAwLCAwKSwgY29sb3IsIGFtb3VudCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIHZhciBjb2xvciA9IGNvbG9yRnVuY3Rpb25zOwoKICAgIC8vIENvbG9yIEJsZW5kaW5nDQogICAgLy8gcmVmOiBodHRwOi8vd3d3LnczLm9yZy9UUi9jb21wb3NpdGluZy0xDQogICAgZnVuY3Rpb24gY29sb3JCbGVuZChtb2RlLCBjb2xvcjEsIGNvbG9yMikgew0KICAgICAgICB2YXIgYWIgPSBjb2xvcjEuYWxwaGE7IC8vIHJlc3VsdA0KICAgICAgICB2YXIgLy8gYmFja2Ryb3ANCiAgICAgICAgY2I7DQogICAgICAgIHZhciBhcyA9IGNvbG9yMi5hbHBoYTsNCiAgICAgICAgdmFyIC8vIHNvdXJjZQ0KICAgICAgICBjczsNCiAgICAgICAgdmFyIGFyOw0KICAgICAgICB2YXIgY3I7DQogICAgICAgIHZhciByID0gW107DQogICAgICAgIGFyID0gYXMgKyBhYiAqICgxIC0gYXMpOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgew0KICAgICAgICAgICAgY2IgPSBjb2xvcjEucmdiW2ldIC8gMjU1Ow0KICAgICAgICAgICAgY3MgPSBjb2xvcjIucmdiW2ldIC8gMjU1Ow0KICAgICAgICAgICAgY3IgPSBtb2RlKGNiLCBjcyk7DQogICAgICAgICAgICBpZiAoYXIpIHsNCiAgICAgICAgICAgICAgICBjciA9IChhcyAqIGNzICsgYWIgKiAoY2IgLQ0KICAgICAgICAgICAgICAgICAgICBhcyAqIChjYiArIGNzIC0gY3IpKSkgLyBhcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJbaV0gPSBjciAqIDI1NTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbmV3IENvbG9yKHIsIGFyKTsNCiAgICB9DQogICAgdmFyIGNvbG9yQmxlbmRNb2RlRnVuY3Rpb25zID0gew0KICAgICAgICBtdWx0aXBseTogZnVuY3Rpb24gKGNiLCBjcykgew0KICAgICAgICAgICAgcmV0dXJuIGNiICogY3M7DQogICAgICAgIH0sDQogICAgICAgIHNjcmVlbjogZnVuY3Rpb24gKGNiLCBjcykgew0KICAgICAgICAgICAgcmV0dXJuIGNiICsgY3MgLSBjYiAqIGNzOw0KICAgICAgICB9LA0KICAgICAgICBvdmVybGF5OiBmdW5jdGlvbiAoY2IsIGNzKSB7DQogICAgICAgICAgICBjYiAqPSAyOw0KICAgICAgICAgICAgcmV0dXJuIChjYiA8PSAxKSA/DQogICAgICAgICAgICAgICAgY29sb3JCbGVuZE1vZGVGdW5jdGlvbnMubXVsdGlwbHkoY2IsIGNzKSA6DQogICAgICAgICAgICAgICAgY29sb3JCbGVuZE1vZGVGdW5jdGlvbnMuc2NyZWVuKGNiIC0gMSwgY3MpOw0KICAgICAgICB9LA0KICAgICAgICBzb2Z0bGlnaHQ6IGZ1bmN0aW9uIChjYiwgY3MpIHsNCiAgICAgICAgICAgIHZhciBkID0gMTsNCiAgICAgICAgICAgIHZhciBlID0gY2I7DQogICAgICAgICAgICBpZiAoY3MgPiAwLjUpIHsNCiAgICAgICAgICAgICAgICBlID0gMTsNCiAgICAgICAgICAgICAgICBkID0gKGNiID4gMC4yNSkgPyBNYXRoLnNxcnQoY2IpDQogICAgICAgICAgICAgICAgICAgIDogKCgxNiAqIGNiIC0gMTIpICogY2IgKyA0KSAqIGNiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGNiIC0gKDEgLSAyICogY3MpICogZSAqIChkIC0gY2IpOw0KICAgICAgICB9LA0KICAgICAgICBoYXJkbGlnaHQ6IGZ1bmN0aW9uIChjYiwgY3MpIHsNCiAgICAgICAgICAgIHJldHVybiBjb2xvckJsZW5kTW9kZUZ1bmN0aW9ucy5vdmVybGF5KGNzLCBjYik7DQogICAgICAgIH0sDQogICAgICAgIGRpZmZlcmVuY2U6IGZ1bmN0aW9uIChjYiwgY3MpIHsNCiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhjYiAtIGNzKTsNCiAgICAgICAgfSwNCiAgICAgICAgZXhjbHVzaW9uOiBmdW5jdGlvbiAoY2IsIGNzKSB7DQogICAgICAgICAgICByZXR1cm4gY2IgKyBjcyAtIDIgKiBjYiAqIGNzOw0KICAgICAgICB9LA0KICAgICAgICAvLyBub24tdzNjIGZ1bmN0aW9uczoNCiAgICAgICAgYXZlcmFnZTogZnVuY3Rpb24gKGNiLCBjcykgew0KICAgICAgICAgICAgcmV0dXJuIChjYiArIGNzKSAvIDI7DQogICAgICAgIH0sDQogICAgICAgIG5lZ2F0aW9uOiBmdW5jdGlvbiAoY2IsIGNzKSB7DQogICAgICAgICAgICByZXR1cm4gMSAtIE1hdGguYWJzKGNiICsgY3MgLSAxKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgZm9yICh2YXIgZiQxIGluIGNvbG9yQmxlbmRNb2RlRnVuY3Rpb25zKSB7DQogICAgICAgIGlmIChjb2xvckJsZW5kTW9kZUZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eShmJDEpKSB7DQogICAgICAgICAgICBjb2xvckJsZW5kW2YkMV0gPSBjb2xvckJsZW5kLmJpbmQobnVsbCwgY29sb3JCbGVuZE1vZGVGdW5jdGlvbnNbZiQxXSk7DQogICAgICAgIH0NCiAgICB9CgogICAgdmFyIGRhdGFVcmkgPSAoZnVuY3Rpb24gKGVudmlyb25tZW50KSB7DQogICAgICAgIHZhciBmYWxsYmFjayA9IGZ1bmN0aW9uIChmdW5jdGlvblRoaXMsIG5vZGUpIHsgcmV0dXJuIG5ldyBVUkwobm9kZSwgZnVuY3Rpb25UaGlzLmluZGV4LCBmdW5jdGlvblRoaXMuY3VycmVudEZpbGVJbmZvKS5ldmFsKGZ1bmN0aW9uVGhpcy5jb250ZXh0KTsgfTsNCiAgICAgICAgcmV0dXJuIHsgJ2RhdGEtdXJpJzogZnVuY3Rpb24gKG1pbWV0eXBlTm9kZSwgZmlsZVBhdGhOb2RlKSB7DQogICAgICAgICAgICAgICAgaWYgKCFmaWxlUGF0aE5vZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGhOb2RlID0gbWltZXR5cGVOb2RlOw0KICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZU5vZGUgPSBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgbWltZXR5cGUgPSBtaW1ldHlwZU5vZGUgJiYgbWltZXR5cGVOb2RlLnZhbHVlOw0KICAgICAgICAgICAgICAgIHZhciBmaWxlUGF0aCA9IGZpbGVQYXRoTm9kZS52YWx1ZTsNCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEZpbGVJbmZvID0gdGhpcy5jdXJyZW50RmlsZUluZm87DQogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnREaXJlY3RvcnkgPSBjdXJyZW50RmlsZUluZm8ucmV3cml0ZVVybHMgPw0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZUluZm8uY3VycmVudERpcmVjdG9yeSA6IGN1cnJlbnRGaWxlSW5mby5lbnRyeVBhdGg7DQogICAgICAgICAgICAgICAgdmFyIGZyYWdtZW50U3RhcnQgPSBmaWxlUGF0aC5pbmRleE9mKCcjJyk7DQogICAgICAgICAgICAgICAgdmFyIGZyYWdtZW50ID0gJyc7DQogICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50U3RhcnQgIT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gZmlsZVBhdGguc2xpY2UoZnJhZ21lbnRTdGFydCk7DQogICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGguc2xpY2UoMCwgZnJhZ21lbnRTdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY2xvbmUodGhpcy5jb250ZXh0KTsNCiAgICAgICAgICAgICAgICBjb250ZXh0LnJhd0J1ZmZlciA9IHRydWU7DQogICAgICAgICAgICAgICAgdmFyIGZpbGVNYW5hZ2VyID0gZW52aXJvbm1lbnQuZ2V0RmlsZU1hbmFnZXIoZmlsZVBhdGgsIGN1cnJlbnREaXJlY3RvcnksIGNvbnRleHQsIGVudmlyb25tZW50LCB0cnVlKTsNCiAgICAgICAgICAgICAgICBpZiAoIWZpbGVNYW5hZ2VyKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayh0aGlzLCBmaWxlUGF0aE5vZGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgdXNlQmFzZTY0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgLy8gZGV0ZWN0IHRoZSBtaW1ldHlwZSBpZiBub3QgZ2l2ZW4NCiAgICAgICAgICAgICAgICBpZiAoIW1pbWV0eXBlTm9kZSkgew0KICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZSA9IGVudmlyb25tZW50Lm1pbWVMb29rdXAoZmlsZVBhdGgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobWltZXR5cGUgPT09ICdpbWFnZS9zdmcreG1sJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlQmFzZTY0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYmFzZSA2NCB1bmxlc3MgaXQncyBhbiBBU0NJSSBvciBVVEYtOCBmb3JtYXQNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGFyc2V0ID0gZW52aXJvbm1lbnQuY2hhcnNldExvb2t1cChtaW1ldHlwZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VCYXNlNjQgPSBbJ1VTLUFTQ0lJJywgJ1VURi04J10uaW5kZXhPZihjaGFyc2V0KSA8IDA7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUJhc2U2NCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGUgKz0gJztiYXNlNjQnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB1c2VCYXNlNjQgPSAvO2Jhc2U2NCQvLnRlc3QobWltZXR5cGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgZmlsZVN5bmMgPSBmaWxlTWFuYWdlci5sb2FkRmlsZVN5bmMoZmlsZVBhdGgsIGN1cnJlbnREaXJlY3RvcnksIGNvbnRleHQsIGVudmlyb25tZW50KTsNCiAgICAgICAgICAgICAgICBpZiAoIWZpbGVTeW5jLmNvbnRlbnRzKSB7DQogICAgICAgICAgICAgICAgICAgIGxvZ2dlciQxLndhcm4oIlNraXBwZWQgZGF0YS11cmkgZW1iZWRkaW5nIG9mICIgKyBmaWxlUGF0aCArICIgYmVjYXVzZSBmaWxlIG5vdCBmb3VuZCIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2sodGhpcywgZmlsZVBhdGhOb2RlIHx8IG1pbWV0eXBlTm9kZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBidWYgPSBmaWxlU3luYy5jb250ZW50czsNCiAgICAgICAgICAgICAgICBpZiAodXNlQmFzZTY0ICYmICFlbnZpcm9ubWVudC5lbmNvZGVCYXNlNjQpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKHRoaXMsIGZpbGVQYXRoTm9kZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJ1ZiA9IHVzZUJhc2U2NCA/IGVudmlyb25tZW50LmVuY29kZUJhc2U2NChidWYpIDogZW5jb2RlVVJJQ29tcG9uZW50KGJ1Zik7DQogICAgICAgICAgICAgICAgdmFyIHVyaSA9ICJkYXRhOiIgKyBtaW1ldHlwZSArICIsIiArIGJ1ZiArIGZyYWdtZW50Ow0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKG5ldyBRdW90ZWQoIlwiIiArIHVyaSArICJcIiIsIHVyaSwgZmFsc2UsIHRoaXMuaW5kZXgsIHRoaXMuY3VycmVudEZpbGVJbmZvKSwgdGhpcy5pbmRleCwgdGhpcy5jdXJyZW50RmlsZUluZm8pOw0KICAgICAgICAgICAgfSB9Ow0KICAgIH0pOwoKICAgIHZhciBnZXRJdGVtc0Zyb21Ob2RlID0gZnVuY3Rpb24gKG5vZGUpIHsNCiAgICAgICAgLy8gaGFuZGxlIG5vbi1hcnJheSB2YWx1ZXMgYXMgYW4gYXJyYXkgb2YgbGVuZ3RoIDENCiAgICAgICAgLy8gcmV0dXJuICd1bmRlZmluZWQnIGlmIGluZGV4IGlzIGludmFsaWQNCiAgICAgICAgdmFyIGl0ZW1zID0gQXJyYXkuaXNBcnJheShub2RlLnZhbHVlKSA/DQogICAgICAgICAgICBub2RlLnZhbHVlIDogQXJyYXkobm9kZSk7DQogICAgICAgIHJldHVybiBpdGVtczsNCiAgICB9Ow0KICAgIHZhciBsaXN0ID0gew0KICAgICAgICBfU0VMRjogZnVuY3Rpb24gKG4pIHsNCiAgICAgICAgICAgIHJldHVybiBuOw0KICAgICAgICB9LA0KICAgICAgICAnfic6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBleHByID0gW107DQogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgew0KICAgICAgICAgICAgICAgIGV4cHJbX2ldID0gYXJndW1lbnRzW19pXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChleHByLmxlbmd0aCA9PT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBleHByWzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZShleHByKTsNCiAgICAgICAgfSwNCiAgICAgICAgZXh0cmFjdDogZnVuY3Rpb24gKHZhbHVlcywgaW5kZXgpIHsNCiAgICAgICAgICAgIC8vICgxLWJhc2VkIGluZGV4KQ0KICAgICAgICAgICAgaW5kZXggPSBpbmRleC52YWx1ZSAtIDE7DQogICAgICAgICAgICByZXR1cm4gZ2V0SXRlbXNGcm9tTm9kZSh2YWx1ZXMpW2luZGV4XTsNCiAgICAgICAgfSwNCiAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAodmFsdWVzKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihnZXRJdGVtc0Zyb21Ob2RlKHZhbHVlcykubGVuZ3RoKTsNCiAgICAgICAgfSwNCiAgICAgICAgLyoqDQogICAgICAgICAqIENyZWF0ZXMgYSBMZXNzIGxpc3Qgb2YgaW5jcmVtZW50YWwgdmFsdWVzLg0KICAgICAgICAgKiBNb2RlbGVkIGFmdGVyIExvZGFzaCdzIHJhbmdlIGZ1bmN0aW9uLCBhbHNvIGV4aXN0cyBuYXRpdmVseSBpbiBQSFANCiAgICAgICAgICoNCiAgICAgICAgICogQHBhcmFtIHtEaW1lbnNpb259IFtzdGFydD0xXQ0KICAgICAgICAgKiBAcGFyYW0ge0RpbWVuc2lvbn0gZW5kICAtIGUuZy4gMTAgb3IgMTBweCAtIHVuaXQgaXMgYWRkZWQgdG8gb3V0cHV0DQogICAgICAgICAqIEBwYXJhbSB7RGltZW5zaW9ufSBbc3RlcD0xXQ0KICAgICAgICAgKi8NCiAgICAgICAgcmFuZ2U6IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBzdGVwKSB7DQogICAgICAgICAgICB2YXIgZnJvbTsNCiAgICAgICAgICAgIHZhciB0bzsNCiAgICAgICAgICAgIHZhciBzdGVwVmFsdWUgPSAxOw0KICAgICAgICAgICAgdmFyIGxpc3QgPSBbXTsNCiAgICAgICAgICAgIGlmIChlbmQpIHsNCiAgICAgICAgICAgICAgICB0byA9IGVuZDsNCiAgICAgICAgICAgICAgICBmcm9tID0gc3RhcnQudmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHN0ZXApIHsNCiAgICAgICAgICAgICAgICAgICAgc3RlcFZhbHVlID0gc3RlcC52YWx1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBmcm9tID0gMTsNCiAgICAgICAgICAgICAgICB0byA9IHN0YXJ0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IGZyb207IGkgPD0gdG8udmFsdWU7IGkgKz0gc3RlcFZhbHVlKSB7DQogICAgICAgICAgICAgICAgbGlzdC5wdXNoKG5ldyBEaW1lbnNpb24oaSwgdG8udW5pdCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKGxpc3QpOw0KICAgICAgICB9LA0KICAgICAgICBlYWNoOiBmdW5jdGlvbiAobGlzdCwgcnMpIHsNCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQogICAgICAgICAgICB2YXIgcnVsZXMgPSBbXTsNCiAgICAgICAgICAgIHZhciBuZXdSdWxlczsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvcjsNCiAgICAgICAgICAgIHZhciB0cnlFdmFsID0gZnVuY3Rpb24gKHZhbCkgew0KICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBOb2RlKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwuZXZhbChfdGhpcy5jb250ZXh0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBpZiAobGlzdC52YWx1ZSAmJiAhKGxpc3QgaW5zdGFuY2VvZiBRdW90ZWQpKSB7DQogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdC52YWx1ZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBsaXN0LnZhbHVlLm1hcCh0cnlFdmFsKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gW3RyeUV2YWwobGlzdC52YWx1ZSldOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGxpc3QucnVsZXNldCkgew0KICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gdHJ5RXZhbChsaXN0LnJ1bGVzZXQpLnJ1bGVzOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAobGlzdC5ydWxlcykgew0KICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gbGlzdC5ydWxlcy5tYXAodHJ5RXZhbCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxpc3QpKSB7DQogICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBsaXN0Lm1hcCh0cnlFdmFsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gW3RyeUV2YWwobGlzdCldOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHZhbHVlTmFtZSA9ICdAdmFsdWUnOw0KICAgICAgICAgICAgdmFyIGtleU5hbWUgPSAnQGtleSc7DQogICAgICAgICAgICB2YXIgaW5kZXhOYW1lID0gJ0BpbmRleCc7DQogICAgICAgICAgICBpZiAocnMucGFyYW1zKSB7DQogICAgICAgICAgICAgICAgdmFsdWVOYW1lID0gcnMucGFyYW1zWzBdICYmIHJzLnBhcmFtc1swXS5uYW1lOw0KICAgICAgICAgICAgICAgIGtleU5hbWUgPSBycy5wYXJhbXNbMV0gJiYgcnMucGFyYW1zWzFdLm5hbWU7DQogICAgICAgICAgICAgICAgaW5kZXhOYW1lID0gcnMucGFyYW1zWzJdICYmIHJzLnBhcmFtc1syXS5uYW1lOw0KICAgICAgICAgICAgICAgIHJzID0gcnMucnVsZXM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBycyA9IHJzLnJ1bGVzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXJhdG9yLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZvaWQgMDsNCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2b2lkIDA7DQogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVyYXRvcltpXTsNCiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERlY2xhcmF0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgIGtleSA9IHR5cGVvZiBpdGVtLm5hbWUgPT09ICdzdHJpbmcnID8gaXRlbS5uYW1lIDogaXRlbS5uYW1lWzBdLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0ZW0udmFsdWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBrZXkgPSBuZXcgRGltZW5zaW9uKGkgKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpdGVtOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG5ld1J1bGVzID0gcnMucnVsZXMuc2xpY2UoMCk7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlTmFtZSkgew0KICAgICAgICAgICAgICAgICAgICBuZXdSdWxlcy5wdXNoKG5ldyBEZWNsYXJhdGlvbih2YWx1ZU5hbWUsIHZhbHVlLCBmYWxzZSwgZmFsc2UsIHRoaXMuaW5kZXgsIHRoaXMuY3VycmVudEZpbGVJbmZvKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChpbmRleE5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgbmV3UnVsZXMucHVzaChuZXcgRGVjbGFyYXRpb24oaW5kZXhOYW1lLCBuZXcgRGltZW5zaW9uKGkgKyAxKSwgZmFsc2UsIGZhbHNlLCB0aGlzLmluZGV4LCB0aGlzLmN1cnJlbnRGaWxlSW5mbykpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoa2V5TmFtZSkgew0KICAgICAgICAgICAgICAgICAgICBuZXdSdWxlcy5wdXNoKG5ldyBEZWNsYXJhdGlvbihrZXlOYW1lLCBrZXksIGZhbHNlLCBmYWxzZSwgdGhpcy5pbmRleCwgdGhpcy5jdXJyZW50RmlsZUluZm8pKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcnVsZXMucHVzaChuZXcgUnVsZXNldChbbmV3IChTZWxlY3RvcikoW25ldyBFbGVtZW50KCIiLCAnJicpXSldLCBuZXdSdWxlcywgcnMuc3RyaWN0SW1wb3J0cywgcnMudmlzaWJpbGl0eUluZm8oKSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSdWxlc2V0KFtuZXcgKFNlbGVjdG9yKShbbmV3IEVsZW1lbnQoIiIsICcmJyldKV0sIHJ1bGVzLCBycy5zdHJpY3RJbXBvcnRzLCBycy52aXNpYmlsaXR5SW5mbygpKS5ldmFsKHRoaXMuY29udGV4dCk7DQogICAgICAgIH0NCiAgICB9OwoKICAgIHZhciBNYXRoSGVscGVyID0gZnVuY3Rpb24gKGZuLCB1bml0LCBuKSB7DQogICAgICAgIGlmICghKG4gaW5zdGFuY2VvZiBEaW1lbnNpb24pKSB7DQogICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdBcmd1bWVudCcsIG1lc3NhZ2U6ICdhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyB9Ow0KICAgICAgICB9DQogICAgICAgIGlmICh1bml0ID09IG51bGwpIHsNCiAgICAgICAgICAgIHVuaXQgPSBuLnVuaXQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBuID0gbi51bmlmeSgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKGZuKHBhcnNlRmxvYXQobi52YWx1ZSkpLCB1bml0KTsNCiAgICB9OwoKICAgIHZhciBtYXRoRnVuY3Rpb25zID0gew0KICAgICAgICAvLyBuYW1lLCAgdW5pdA0KICAgICAgICBjZWlsOiBudWxsLA0KICAgICAgICBmbG9vcjogbnVsbCwNCiAgICAgICAgc3FydDogbnVsbCwNCiAgICAgICAgYWJzOiBudWxsLA0KICAgICAgICB0YW46ICcnLA0KICAgICAgICBzaW46ICcnLA0KICAgICAgICBjb3M6ICcnLA0KICAgICAgICBhdGFuOiAncmFkJywNCiAgICAgICAgYXNpbjogJ3JhZCcsDQogICAgICAgIGFjb3M6ICdyYWQnDQogICAgfTsNCiAgICBmb3IgKHZhciBmIGluIG1hdGhGdW5jdGlvbnMpIHsNCiAgICAgICAgaWYgKG1hdGhGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkoZikpIHsNCiAgICAgICAgICAgIG1hdGhGdW5jdGlvbnNbZl0gPSBNYXRoSGVscGVyLmJpbmQobnVsbCwgTWF0aFtmXSwgbWF0aEZ1bmN0aW9uc1tmXSk7DQogICAgICAgIH0NCiAgICB9DQogICAgbWF0aEZ1bmN0aW9ucy5yb3VuZCA9IGZ1bmN0aW9uIChuLCBmKSB7DQogICAgICAgIHZhciBmcmFjdGlvbiA9IHR5cGVvZiBmID09PSAndW5kZWZpbmVkJyA/IDAgOiBmLnZhbHVlOw0KICAgICAgICByZXR1cm4gTWF0aEhlbHBlcihmdW5jdGlvbiAobnVtKSB7IHJldHVybiBudW0udG9GaXhlZChmcmFjdGlvbik7IH0sIG51bGwsIG4pOw0KICAgIH07CgogICAgdmFyIG1pbk1heCA9IGZ1bmN0aW9uIChpc01pbiwgYXJncykgew0KICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7DQogICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHsNCiAgICAgICAgICAgIGNhc2UgMDogdGhyb3cgeyB0eXBlOiAnQXJndW1lbnQnLCBtZXNzYWdlOiAnb25lIG9yIG1vcmUgYXJndW1lbnRzIHJlcXVpcmVkJyB9Ow0KICAgICAgICB9DQogICAgICAgIHZhciBpOyAvLyBrZXkgaXMgdGhlIHVuaXQudG9TdHJpbmcoKSBmb3IgdW5pZmllZCBEaW1lbnNpb24gdmFsdWVzLA0KICAgICAgICB2YXIgajsNCiAgICAgICAgdmFyIGN1cnJlbnQ7DQogICAgICAgIHZhciBjdXJyZW50VW5pZmllZDsNCiAgICAgICAgdmFyIHJlZmVyZW5jZVVuaWZpZWQ7DQogICAgICAgIHZhciB1bml0Ow0KICAgICAgICB2YXIgdW5pdFN0YXRpYzsNCiAgICAgICAgdmFyIHVuaXRDbG9uZTsNCiAgICAgICAgdmFyIC8vIGVsZW1zIG9ubHkgY29udGFpbnMgb3JpZ2luYWwgYXJndW1lbnQgdmFsdWVzLg0KICAgICAgICBvcmRlciA9IFtdOw0KICAgICAgICB2YXIgdmFsdWVzID0ge307DQogICAgICAgIC8vIHZhbHVlIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBvcmRlciBhcnJheS4NCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGN1cnJlbnQgPSBhcmdzW2ldOw0KICAgICAgICAgICAgaWYgKCEoY3VycmVudCBpbnN0YW5jZW9mIERpbWVuc2lvbikpIHsNCiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzW2ldLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShhcmdzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzW2ldLnZhbHVlKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY3VycmVudFVuaWZpZWQgPSBjdXJyZW50LnVuaXQudG9TdHJpbmcoKSA9PT0gJycgJiYgdW5pdENsb25lICE9PSB1bmRlZmluZWQgPyBuZXcgRGltZW5zaW9uKGN1cnJlbnQudmFsdWUsIHVuaXRDbG9uZSkudW5pZnkoKSA6IGN1cnJlbnQudW5pZnkoKTsNCiAgICAgICAgICAgIHVuaXQgPSBjdXJyZW50VW5pZmllZC51bml0LnRvU3RyaW5nKCkgPT09ICcnICYmIHVuaXRTdGF0aWMgIT09IHVuZGVmaW5lZCA/IHVuaXRTdGF0aWMgOiBjdXJyZW50VW5pZmllZC51bml0LnRvU3RyaW5nKCk7DQogICAgICAgICAgICB1bml0U3RhdGljID0gdW5pdCAhPT0gJycgJiYgdW5pdFN0YXRpYyA9PT0gdW5kZWZpbmVkIHx8IHVuaXQgIT09ICcnICYmIG9yZGVyWzBdLnVuaWZ5KCkudW5pdC50b1N0cmluZygpID09PSAnJyA/IHVuaXQgOiB1bml0U3RhdGljOw0KICAgICAgICAgICAgdW5pdENsb25lID0gdW5pdCAhPT0gJycgJiYgdW5pdENsb25lID09PSB1bmRlZmluZWQgPyBjdXJyZW50LnVuaXQudG9TdHJpbmcoKSA6IHVuaXRDbG9uZTsNCiAgICAgICAgICAgIGogPSB2YWx1ZXNbJyddICE9PSB1bmRlZmluZWQgJiYgdW5pdCAhPT0gJycgJiYgdW5pdCA9PT0gdW5pdFN0YXRpYyA/IHZhbHVlc1snJ10gOiB2YWx1ZXNbdW5pdF07DQogICAgICAgICAgICBpZiAoaiA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgaWYgKHVuaXRTdGF0aWMgIT09IHVuZGVmaW5lZCAmJiB1bml0ICE9PSB1bml0U3RhdGljKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IHsgdHlwZTogJ0FyZ3VtZW50JywgbWVzc2FnZTogJ2luY29tcGF0aWJsZSB0eXBlcycgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFsdWVzW3VuaXRdID0gb3JkZXIubGVuZ3RoOw0KICAgICAgICAgICAgICAgIG9yZGVyLnB1c2goY3VycmVudCk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZWZlcmVuY2VVbmlmaWVkID0gb3JkZXJbal0udW5pdC50b1N0cmluZygpID09PSAnJyAmJiB1bml0Q2xvbmUgIT09IHVuZGVmaW5lZCA/IG5ldyBEaW1lbnNpb24ob3JkZXJbal0udmFsdWUsIHVuaXRDbG9uZSkudW5pZnkoKSA6IG9yZGVyW2pdLnVuaWZ5KCk7DQogICAgICAgICAgICBpZiAoaXNNaW4gJiYgY3VycmVudFVuaWZpZWQudmFsdWUgPCByZWZlcmVuY2VVbmlmaWVkLnZhbHVlIHx8DQogICAgICAgICAgICAgICAgIWlzTWluICYmIGN1cnJlbnRVbmlmaWVkLnZhbHVlID4gcmVmZXJlbmNlVW5pZmllZC52YWx1ZSkgew0KICAgICAgICAgICAgICAgIG9yZGVyW2pdID0gY3VycmVudDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAob3JkZXIubGVuZ3RoID09IDEpIHsNCiAgICAgICAgICAgIHJldHVybiBvcmRlclswXTsNCiAgICAgICAgfQ0KICAgICAgICBhcmdzID0gb3JkZXIubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLnRvQ1NTKHRoaXMuY29udGV4dCk7IH0pLmpvaW4odGhpcy5jb250ZXh0LmNvbXByZXNzID8gJywnIDogJywgJyk7DQogICAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzKChpc01pbiA/ICdtaW4nIDogJ21heCcpICsgIigiICsgYXJncyArICIpIik7DQogICAgfTsNCiAgICB2YXIgbnVtYmVyID0gew0KICAgICAgICBtaW46IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBhcmdzID0gW107DQogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgew0KICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG1pbk1heCh0cnVlLCBhcmdzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKSB7IH0NCiAgICAgICAgfSwNCiAgICAgICAgbWF4OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgYXJncyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsNCiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiBtaW5NYXgoZmFsc2UsIGFyZ3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQ0KICAgICAgICB9LA0KICAgICAgICBjb252ZXJ0OiBmdW5jdGlvbiAodmFsLCB1bml0KSB7DQogICAgICAgICAgICByZXR1cm4gdmFsLmNvbnZlcnRUbyh1bml0LnZhbHVlKTsNCiAgICAgICAgfSwNCiAgICAgICAgcGk6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKE1hdGguUEkpOw0KICAgICAgICB9LA0KICAgICAgICBtb2Q6IGZ1bmN0aW9uIChhLCBiKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihhLnZhbHVlICUgYi52YWx1ZSwgYS51bml0KTsNCiAgICAgICAgfSwNCiAgICAgICAgcG93OiBmdW5jdGlvbiAoeCwgeSkgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICB4ID0gbmV3IERpbWVuc2lvbih4KTsNCiAgICAgICAgICAgICAgICB5ID0gbmV3IERpbWVuc2lvbih5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKCEoeCBpbnN0YW5jZW9mIERpbWVuc2lvbikgfHwgISh5IGluc3RhbmNlb2YgRGltZW5zaW9uKSkgew0KICAgICAgICAgICAgICAgIHRocm93IHsgdHlwZTogJ0FyZ3VtZW50JywgbWVzc2FnZTogJ2FyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMnIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihNYXRoLnBvdyh4LnZhbHVlLCB5LnZhbHVlKSwgeC51bml0KTsNCiAgICAgICAgfSwNCiAgICAgICAgcGVyY2VudGFnZTogZnVuY3Rpb24gKG4pIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBNYXRoSGVscGVyKGZ1bmN0aW9uIChudW0pIHsgcmV0dXJuIG51bSAqIDEwMDsgfSwgJyUnLCBuKTsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0NCiAgICB9OwoKICAgIHZhciBzdHJpbmcgPSB7DQogICAgICAgIGU6IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUXVvdGVkKCciJywgc3RyIGluc3RhbmNlb2YgSmF2YVNjcmlwdCA/IHN0ci5ldmFsdWF0ZWQgOiBzdHIudmFsdWUsIHRydWUpOw0KICAgICAgICB9LA0KICAgICAgICBlc2NhcGU6IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzKGVuY29kZVVSSShzdHIudmFsdWUpLnJlcGxhY2UoLz0vZywgJyUzRCcpLnJlcGxhY2UoLzovZywgJyUzQScpLnJlcGxhY2UoLyMvZywgJyUyMycpLnJlcGxhY2UoLzsvZywgJyUzQicpDQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL1woL2csICclMjgnKS5yZXBsYWNlKC9cKS9nLCAnJTI5JykpOw0KICAgICAgICB9LA0KICAgICAgICByZXBsYWNlOiBmdW5jdGlvbiAoc3RyaW5nLCBwYXR0ZXJuLCByZXBsYWNlbWVudCwgZmxhZ3MpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBzdHJpbmcudmFsdWU7DQogICAgICAgICAgICByZXBsYWNlbWVudCA9IChyZXBsYWNlbWVudC50eXBlID09PSAnUXVvdGVkJykgPw0KICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LnZhbHVlIDogcmVwbGFjZW1lbnQudG9DU1MoKTsNCiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKG5ldyBSZWdFeHAocGF0dGVybi52YWx1ZSwgZmxhZ3MgPyBmbGFncy52YWx1ZSA6ICcnKSwgcmVwbGFjZW1lbnQpOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBRdW90ZWQoc3RyaW5nLnF1b3RlIHx8ICcnLCByZXN1bHQsIHN0cmluZy5lc2NhcGVkKTsNCiAgICAgICAgfSwNCiAgICAgICAgJyUnOiBmdW5jdGlvbiAoc3RyaW5nIC8qIGFyZywgYXJnLCAuLi4gKi8pIHsNCiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBzdHJpbmcudmFsdWU7DQogICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7DQogICAgICAgICAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi8NCiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJVtzZGFdL2ksIGZ1bmN0aW9uICh0b2tlbikgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAoKGFyZ3NbaV0udHlwZSA9PT0gJ1F1b3RlZCcpICYmDQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5tYXRjaCgvcy9pKSkgPyBhcmdzW2ldLnZhbHVlIDogYXJnc1tpXS50b0NTUygpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4ubWF0Y2goL1tBLVpdJC8pID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSA6IHZhbHVlOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIF9sb29wXzEoaSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvJSUvZywgJyUnKTsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUXVvdGVkKHN0cmluZy5xdW90ZSB8fCAnJywgcmVzdWx0LCBzdHJpbmcuZXNjYXBlZCk7DQogICAgICAgIH0NCiAgICB9OwoKICAgIHZhciBzdmcgPSAoZnVuY3Rpb24gKGVudmlyb25tZW50KSB7DQogICAgICAgIHJldHVybiB7ICdzdmctZ3JhZGllbnQnOiBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7DQogICAgICAgICAgICAgICAgdmFyIHN0b3BzOw0KICAgICAgICAgICAgICAgIHZhciBncmFkaWVudERpcmVjdGlvblN2ZzsNCiAgICAgICAgICAgICAgICB2YXIgZ3JhZGllbnRUeXBlID0gJ2xpbmVhcic7DQogICAgICAgICAgICAgICAgdmFyIHJlY3RhbmdsZURpbWVuc2lvbiA9ICd4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIic7DQogICAgICAgICAgICAgICAgdmFyIHJlbmRlckVudiA9IHsgY29tcHJlc3M6IGZhbHNlIH07DQogICAgICAgICAgICAgICAgdmFyIHJldHVybmVyOw0KICAgICAgICAgICAgICAgIHZhciBkaXJlY3Rpb25WYWx1ZSA9IGRpcmVjdGlvbi50b0NTUyhyZW5kZXJFbnYpOw0KICAgICAgICAgICAgICAgIHZhciBpOw0KICAgICAgICAgICAgICAgIHZhciBjb2xvcjsNCiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb247DQogICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uVmFsdWU7DQogICAgICAgICAgICAgICAgdmFyIGFscGhhOw0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRocm93QXJndW1lbnREZXNjcmlwdG9yKCkgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdBcmd1bWVudCcsDQogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc3ZnLWdyYWRpZW50IGV4cGVjdHMgZGlyZWN0aW9uLCBzdGFydF9jb2xvciBbc3RhcnRfcG9zaXRpb25dLCBbY29sb3IgcG9zaXRpb24sXS4uLiwnICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGVuZF9jb2xvciBbZW5kX3Bvc2l0aW9uXSBvciBkaXJlY3Rpb24sIGNvbG9yIGxpc3QnIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1sxXS52YWx1ZS5sZW5ndGggPCAyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0FyZ3VtZW50RGVzY3JpcHRvcigpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHN0b3BzID0gYXJndW1lbnRzWzFdLnZhbHVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgew0KICAgICAgICAgICAgICAgICAgICB0aHJvd0FyZ3VtZW50RGVzY3JpcHRvcigpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc3RvcHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvblZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvIGJvdHRvbSc6DQogICAgICAgICAgICAgICAgICAgICAgICBncmFkaWVudERpcmVjdGlvblN2ZyA9ICd4MT0iMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMTAwJSInOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvIHJpZ2h0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50RGlyZWN0aW9uU3ZnID0gJ3gxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIic7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAndG8gYm90dG9tIHJpZ2h0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50RGlyZWN0aW9uU3ZnID0gJ3gxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjEwMCUiJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICd0byB0b3AgcmlnaHQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnREaXJlY3Rpb25TdmcgPSAneDE9IjAlIiB5MT0iMTAwJSIgeDI9IjEwMCUiIHkyPSIwJSInOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VsbGlwc2UnOg0KICAgICAgICAgICAgICAgICAgICBjYXNlICdlbGxpcHNlIGF0IGNlbnRlcic6DQogICAgICAgICAgICAgICAgICAgICAgICBncmFkaWVudFR5cGUgPSAncmFkaWFsJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50RGlyZWN0aW9uU3ZnID0gJ2N4PSI1MCUiIGN5PSI1MCUiIHI9Ijc1JSInOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlRGltZW5zaW9uID0gJ3g9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSInOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdBcmd1bWVudCcsIG1lc3NhZ2U6ICdzdmctZ3JhZGllbnQgZGlyZWN0aW9uIG11c3QgYmUgXCd0byBib3R0b21cJywgXCd0byByaWdodFwnLCcgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIFwndG8gYm90dG9tIHJpZ2h0XCcsIFwndG8gdG9wIHJpZ2h0XCcgb3IgXCdlbGxpcHNlIGF0IGNlbnRlclwnJyB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm5lciA9ICI8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEgMVwiPjwiICsgZ3JhZGllbnRUeXBlICsgIkdyYWRpZW50IGlkPVwiZ1wiICIgKyBncmFkaWVudERpcmVjdGlvblN2ZyArICI+IjsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RvcHMubGVuZ3RoOyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3BzW2ldIGluc3RhbmNlb2YgRXhwcmVzc2lvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzdG9wc1tpXS52YWx1ZVswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc3RvcHNbaV0udmFsdWVbMV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHN0b3BzW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sb3IgaW5zdGFuY2VvZiBDb2xvcikgfHwgKCEoKGkgPT09IDAgfHwgaSArIDEgPT09IHN0b3BzLmxlbmd0aCkgJiYgcG9zaXRpb24gPT09IHVuZGVmaW5lZCkgJiYgIShwb3NpdGlvbiBpbnN0YW5jZW9mIERpbWVuc2lvbikpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0FyZ3VtZW50RGVzY3JpcHRvcigpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVmFsdWUgPSBwb3NpdGlvbiA/IHBvc2l0aW9uLnRvQ1NTKHJlbmRlckVudikgOiBpID09PSAwID8gJzAlJyA6ICcxMDAlJzsNCiAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBjb2xvci5hbHBoYTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZXIgKz0gIjxzdG9wIG9mZnNldD1cIiIgKyBwb3NpdGlvblZhbHVlICsgIlwiIHN0b3AtY29sb3I9XCIiICsgY29sb3IudG9SR0IoKSArICJcIiIgKyAoYWxwaGEgPCAxID8gIiBzdG9wLW9wYWNpdHk9XCIiICsgYWxwaGEgKyAiXCIiIDogJycpICsgIi8+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuZXIgKz0gIjwvIiArIGdyYWRpZW50VHlwZSArICJHcmFkaWVudD48cmVjdCAiICsgcmVjdGFuZ2xlRGltZW5zaW9uICsgIiBmaWxsPVwidXJsKCNnKVwiIC8+PC9zdmc+IjsNCiAgICAgICAgICAgICAgICByZXR1cm5lciA9IGVuY29kZVVSSUNvbXBvbmVudChyZXR1cm5lcik7DQogICAgICAgICAgICAgICAgcmV0dXJuZXIgPSAiZGF0YTppbWFnZS9zdmcreG1sLCIgKyByZXR1cm5lcjsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTChuZXcgUXVvdGVkKCInIiArIHJldHVybmVyICsgIiciLCByZXR1cm5lciwgZmFsc2UsIHRoaXMuaW5kZXgsIHRoaXMuY3VycmVudEZpbGVJbmZvKSwgdGhpcy5pbmRleCwgdGhpcy5jdXJyZW50RmlsZUluZm8pOw0KICAgICAgICAgICAgfSB9Ow0KICAgIH0pOwoKICAgIHZhciBpc2EgPSBmdW5jdGlvbiAobiwgVHlwZSkgeyByZXR1cm4gKG4gaW5zdGFuY2VvZiBUeXBlKSA/IEtleXdvcmQuVHJ1ZSA6IEtleXdvcmQuRmFsc2U7IH07DQogICAgdmFyIGlzdW5pdCA9IGZ1bmN0aW9uIChuLCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgIHRocm93IHsgdHlwZTogJ0FyZ3VtZW50JywgbWVzc2FnZTogJ21pc3NpbmcgdGhlIHJlcXVpcmVkIHNlY29uZCBhcmd1bWVudCB0byBpc3VuaXQuJyB9Ow0KICAgICAgICB9DQogICAgICAgIHVuaXQgPSB0eXBlb2YgdW5pdC52YWx1ZSA9PT0gJ3N0cmluZycgPyB1bml0LnZhbHVlIDogdW5pdDsNCiAgICAgICAgaWYgKHR5cGVvZiB1bml0ICE9PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgdGhyb3cgeyB0eXBlOiAnQXJndW1lbnQnLCBtZXNzYWdlOiAnU2Vjb25kIGFyZ3VtZW50IHRvIGlzdW5pdCBzaG91bGQgYmUgYSB1bml0IG9yIGEgc3RyaW5nLicgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gKG4gaW5zdGFuY2VvZiBEaW1lbnNpb24pICYmIG4udW5pdC5pcyh1bml0KSA/IEtleXdvcmQuVHJ1ZSA6IEtleXdvcmQuRmFsc2U7DQogICAgfTsNCiAgICB2YXIgdHlwZXMgPSB7DQogICAgICAgIGlzcnVsZXNldDogZnVuY3Rpb24gKG4pIHsNCiAgICAgICAgICAgIHJldHVybiBpc2EobiwgRGV0YWNoZWRSdWxlc2V0KTsNCiAgICAgICAgfSwNCiAgICAgICAgaXNjb2xvcjogZnVuY3Rpb24gKG4pIHsNCiAgICAgICAgICAgIHJldHVybiBpc2EobiwgQ29sb3IpOw0KICAgICAgICB9LA0KICAgICAgICBpc251bWJlcjogZnVuY3Rpb24gKG4pIHsNCiAgICAgICAgICAgIHJldHVybiBpc2EobiwgRGltZW5zaW9uKTsNCiAgICAgICAgfSwNCiAgICAgICAgaXNzdHJpbmc6IGZ1bmN0aW9uIChuKSB7DQogICAgICAgICAgICByZXR1cm4gaXNhKG4sIFF1b3RlZCk7DQogICAgICAgIH0sDQogICAgICAgIGlza2V5d29yZDogZnVuY3Rpb24gKG4pIHsNCiAgICAgICAgICAgIHJldHVybiBpc2EobiwgS2V5d29yZCk7DQogICAgICAgIH0sDQogICAgICAgIGlzdXJsOiBmdW5jdGlvbiAobikgew0KICAgICAgICAgICAgcmV0dXJuIGlzYShuLCBVUkwpOw0KICAgICAgICB9LA0KICAgICAgICBpc3BpeGVsOiBmdW5jdGlvbiAobikgew0KICAgICAgICAgICAgcmV0dXJuIGlzdW5pdChuLCAncHgnKTsNCiAgICAgICAgfSwNCiAgICAgICAgaXNwZXJjZW50YWdlOiBmdW5jdGlvbiAobikgew0KICAgICAgICAgICAgcmV0dXJuIGlzdW5pdChuLCAnJScpOw0KICAgICAgICB9LA0KICAgICAgICBpc2VtOiBmdW5jdGlvbiAobikgew0KICAgICAgICAgICAgcmV0dXJuIGlzdW5pdChuLCAnZW0nKTsNCiAgICAgICAgfSwNCiAgICAgICAgaXN1bml0OiBpc3VuaXQsDQogICAgICAgIHVuaXQ6IGZ1bmN0aW9uICh2YWwsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIERpbWVuc2lvbikpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdBcmd1bWVudCcsDQogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJ0aGUgZmlyc3QgYXJndW1lbnQgdG8gdW5pdCBtdXN0IGJlIGEgbnVtYmVyIiArICh2YWwgaW5zdGFuY2VvZiBPcGVyYXRpb24gPyAnLiBIYXZlIHlvdSBmb3Jnb3R0ZW4gcGFyZW50aGVzaXM/JyA6ICcnKSB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHVuaXQpIHsNCiAgICAgICAgICAgICAgICBpZiAodW5pdCBpbnN0YW5jZW9mIEtleXdvcmQpIHsNCiAgICAgICAgICAgICAgICAgICAgdW5pdCA9IHVuaXQudmFsdWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB1bml0ID0gdW5pdC50b0NTUygpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHVuaXQgPSAnJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHZhbC52YWx1ZSwgdW5pdCk7DQogICAgICAgIH0sDQogICAgICAgICdnZXQtdW5pdCc6IGZ1bmN0aW9uIChuKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IEFub255bW91cyhuLnVuaXQpOw0KICAgICAgICB9DQogICAgfTsKCiAgICB2YXIgZnVuY3Rpb25zID0gKGZ1bmN0aW9uIChlbnZpcm9ubWVudCkgew0KICAgICAgICB2YXIgZnVuY3Rpb25zID0geyBmdW5jdGlvblJlZ2lzdHJ5OiBmdW5jdGlvblJlZ2lzdHJ5LCBmdW5jdGlvbkNhbGxlcjogZnVuY3Rpb25DYWxsZXIgfTsNCiAgICAgICAgLy8gcmVnaXN0ZXIgZnVuY3Rpb25zDQogICAgICAgIGZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUoYm9vbGVhbiQxKTsNCiAgICAgICAgZnVuY3Rpb25SZWdpc3RyeS5hZGQoJ2RlZmF1bHQnLCBkZWZhdWx0RnVuYy5ldmFsLmJpbmQoZGVmYXVsdEZ1bmMpKTsNCiAgICAgICAgZnVuY3Rpb25SZWdpc3RyeS5hZGRNdWx0aXBsZShjb2xvcik7DQogICAgICAgIGZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUoY29sb3JCbGVuZCk7DQogICAgICAgIGZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUoZGF0YVVyaShlbnZpcm9ubWVudCkpOw0KICAgICAgICBmdW5jdGlvblJlZ2lzdHJ5LmFkZE11bHRpcGxlKGxpc3QpOw0KICAgICAgICBmdW5jdGlvblJlZ2lzdHJ5LmFkZE11bHRpcGxlKG1hdGhGdW5jdGlvbnMpOw0KICAgICAgICBmdW5jdGlvblJlZ2lzdHJ5LmFkZE11bHRpcGxlKG51bWJlcik7DQogICAgICAgIGZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUoc3RyaW5nKTsNCiAgICAgICAgZnVuY3Rpb25SZWdpc3RyeS5hZGRNdWx0aXBsZShzdmcoKSk7DQogICAgICAgIGZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUodHlwZXMpOw0KICAgICAgICByZXR1cm4gZnVuY3Rpb25zOw0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVRyZWUgKHJvb3QsIG9wdGlvbnMpIHsNCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQogICAgICAgIHZhciBldmFsZFJvb3Q7DQogICAgICAgIHZhciB2YXJpYWJsZXMgPSBvcHRpb25zLnZhcmlhYmxlczsNCiAgICAgICAgdmFyIGV2YWxFbnYgPSBuZXcgY29udGV4dHMuRXZhbChvcHRpb25zKTsNCiAgICAgICAgLy8NCiAgICAgICAgLy8gQWxsb3dzIHNldHRpbmcgdmFyaWFibGVzIHdpdGggYSBoYXNoLCBzbzoNCiAgICAgICAgLy8NCiAgICAgICAgLy8gICBgeyBjb2xvcjogbmV3IHRyZWUuQ29sb3IoJyNmMDEnKSB9YCB3aWxsIGJlY29tZToNCiAgICAgICAgLy8NCiAgICAgICAgLy8gICBuZXcgdHJlZS5EZWNsYXJhdGlvbignQGNvbG9yJywNCiAgICAgICAgLy8gICAgIG5ldyB0cmVlLlZhbHVlKFsNCiAgICAgICAgLy8gICAgICAgbmV3IHRyZWUuRXhwcmVzc2lvbihbDQogICAgICAgIC8vICAgICAgICAgbmV3IHRyZWUuQ29sb3IoJyNmMDEnKQ0KICAgICAgICAvLyAgICAgICBdKQ0KICAgICAgICAvLyAgICAgXSkNCiAgICAgICAgLy8gICApDQogICAgICAgIC8vDQogICAgICAgIGlmICh0eXBlb2YgdmFyaWFibGVzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YXJpYWJsZXMpKSB7DQogICAgICAgICAgICB2YXJpYWJsZXMgPSBPYmplY3Qua2V5cyh2YXJpYWJsZXMpLm1hcChmdW5jdGlvbiAoaykgew0KICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhcmlhYmxlc1trXTsNCiAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIHRyZWUuVmFsdWUpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgdHJlZS5FeHByZXNzaW9uKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgdHJlZS5FeHByZXNzaW9uKFt2YWx1ZV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IHRyZWUuVmFsdWUoW3ZhbHVlXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdHJlZS5EZWNsYXJhdGlvbigiQCIgKyBrLCB2YWx1ZSwgZmFsc2UsIG51bGwsIDApOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBldmFsRW52LmZyYW1lcyA9IFtuZXcgdHJlZS5SdWxlc2V0KG51bGwsIHZhcmlhYmxlcyldOw0KICAgICAgICB9DQogICAgICAgIHZhciB2aXNpdG9ycyQxID0gWw0KICAgICAgICAgICAgbmV3IHZpc2l0b3JzLkpvaW5TZWxlY3RvclZpc2l0b3IoKSwNCiAgICAgICAgICAgIG5ldyB2aXNpdG9ycy5NYXJrVmlzaWJsZVNlbGVjdG9yc1Zpc2l0b3IodHJ1ZSksDQogICAgICAgICAgICBuZXcgdmlzaXRvcnMuRXh0ZW5kVmlzaXRvcigpLA0KICAgICAgICAgICAgbmV3IHZpc2l0b3JzLlRvQ1NTVmlzaXRvcih7IGNvbXByZXNzOiBCb29sZWFuKG9wdGlvbnMuY29tcHJlc3MpIH0pDQogICAgICAgIF07DQogICAgICAgIHZhciBwcmVFdmFsVmlzaXRvcnMgPSBbXTsNCiAgICAgICAgdmFyIHY7DQogICAgICAgIHZhciB2aXNpdG9ySXRlcmF0b3I7DQogICAgICAgIC8qKg0KICAgICAgICAgKiBmaXJzdCgpIC8gZ2V0KCkgYWxsb3dzIHZpc2l0b3JzIHRvIGJlIGFkZGVkIHdoaWxlIHZpc2l0aW5nDQogICAgICAgICAqDQogICAgICAgICAqIEB0b2RvIEFkZCBzY29waW5nIGZvciB2aXNpdG9ycyBqdXN0IGxpa2UgZnVuY3Rpb25zIGZvciBAcGx1Z2luOyByaWdodCBub3cgdGhleSdyZSBnbG9iYWwNCiAgICAgICAgICovDQogICAgICAgIGlmIChvcHRpb25zLnBsdWdpbk1hbmFnZXIpIHsNCiAgICAgICAgICAgIHZpc2l0b3JJdGVyYXRvciA9IG9wdGlvbnMucGx1Z2luTWFuYWdlci52aXNpdG9yKCk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykgew0KICAgICAgICAgICAgICAgIHZpc2l0b3JJdGVyYXRvci5maXJzdCgpOw0KICAgICAgICAgICAgICAgIHdoaWxlICgodiA9IHZpc2l0b3JJdGVyYXRvci5nZXQoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHYuaXNQcmVFdmFsVmlzaXRvcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgcHJlRXZhbFZpc2l0b3JzLmluZGV4T2YodikgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlRXZhbFZpc2l0b3JzLnB1c2godik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5ydW4ocm9vdCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCB2aXNpdG9ycyQxLmluZGV4T2YodikgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuaXNQcmVWaXNpdG9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JzJDEudW5zaGlmdCh2KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JzJDEucHVzaCh2KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZXZhbGRSb290ID0gcm9vdC5ldmFsKGV2YWxFbnYpOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc2l0b3JzJDEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZpc2l0b3JzJDFbaV0ucnVuKGV2YWxkUm9vdCk7DQogICAgICAgIH0NCiAgICAgICAgLy8gUnVuIGFueSByZW1haW5pbmcgdmlzaXRvcnMgYWRkZWQgYWZ0ZXIgZXZhbCBwYXNzDQogICAgICAgIGlmIChvcHRpb25zLnBsdWdpbk1hbmFnZXIpIHsNCiAgICAgICAgICAgIHZpc2l0b3JJdGVyYXRvci5maXJzdCgpOw0KICAgICAgICAgICAgd2hpbGUgKCh2ID0gdmlzaXRvckl0ZXJhdG9yLmdldCgpKSkgew0KICAgICAgICAgICAgICAgIGlmICh2aXNpdG9ycyQxLmluZGV4T2YodikgPT09IC0xICYmIHByZUV2YWxWaXNpdG9ycy5pbmRleE9mKHYpID09PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2LnJ1bihldmFsZFJvb3QpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZXZhbGRSb290Ow0KICAgIH0KCiAgICAvKioNCiAgICAgKiBQbHVnaW4gTWFuYWdlcg0KICAgICAqLw0KICAgIHZhciBQbHVnaW5NYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgew0KICAgICAgICBmdW5jdGlvbiBQbHVnaW5NYW5hZ2VyKGxlc3MpIHsNCiAgICAgICAgICAgIHRoaXMubGVzcyA9IGxlc3M7DQogICAgICAgICAgICB0aGlzLnZpc2l0b3JzID0gW107DQogICAgICAgICAgICB0aGlzLnByZVByb2Nlc3NvcnMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMucG9zdFByb2Nlc3NvcnMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuaW5zdGFsbGVkUGx1Z2lucyA9IFtdOw0KICAgICAgICAgICAgdGhpcy5maWxlTWFuYWdlcnMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSAtMTsNCiAgICAgICAgICAgIHRoaXMucGx1Z2luQ2FjaGUgPSB7fTsNCiAgICAgICAgICAgIHRoaXMuTG9hZGVyID0gbmV3IGxlc3MuUGx1Z2luTG9hZGVyKGxlc3MpOw0KICAgICAgICB9DQogICAgICAgIC8qKg0KICAgICAgICAgKiBBZGRzIGFsbCB0aGUgcGx1Z2lucyBpbiB0aGUgYXJyYXkNCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcGx1Z2lucw0KICAgICAgICAgKi8NCiAgICAgICAgUGx1Z2luTWFuYWdlci5wcm90b3R5cGUuYWRkUGx1Z2lucyA9IGZ1bmN0aW9uIChwbHVnaW5zKSB7DQogICAgICAgICAgICBpZiAocGx1Z2lucykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBsdWdpbihwbHVnaW5zW2ldKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIC8qKg0KICAgICAgICAgKg0KICAgICAgICAgKiBAcGFyYW0gcGx1Z2luDQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZQ0KICAgICAgICAgKi8NCiAgICAgICAgUGx1Z2luTWFuYWdlci5wcm90b3R5cGUuYWRkUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgZmlsZW5hbWUsIGZ1bmN0aW9uUmVnaXN0cnkpIHsNCiAgICAgICAgICAgIHRoaXMuaW5zdGFsbGVkUGx1Z2lucy5wdXNoKHBsdWdpbik7DQogICAgICAgICAgICBpZiAoZmlsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbkNhY2hlW2ZpbGVuYW1lXSA9IHBsdWdpbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwbHVnaW4uaW5zdGFsbCkgew0KICAgICAgICAgICAgICAgIHBsdWdpbi5pbnN0YWxsKHRoaXMubGVzcywgdGhpcywgZnVuY3Rpb25SZWdpc3RyeSB8fCB0aGlzLmxlc3MuZnVuY3Rpb25zLmZ1bmN0aW9uUmVnaXN0cnkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICAvKioNCiAgICAgICAgICoNCiAgICAgICAgICogQHBhcmFtIGZpbGVuYW1lDQogICAgICAgICAqLw0KICAgICAgICBQbHVnaW5NYW5hZ2VyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoZmlsZW5hbWUpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsdWdpbkNhY2hlW2ZpbGVuYW1lXTsNCiAgICAgICAgfTsNCiAgICAgICAgLyoqDQogICAgICAgICAqIEFkZHMgYSB2aXNpdG9yLiBUaGUgdmlzaXRvciBvYmplY3QgaGFzIG9wdGlvbnMgb24gaXRzZWxmIHRvIGRldGVybWluZQ0KICAgICAgICAgKiB3aGVuIGl0IHNob3VsZCBydW4uDQogICAgICAgICAqIEBwYXJhbSB2aXNpdG9yDQogICAgICAgICAqLw0KICAgICAgICBQbHVnaW5NYW5hZ2VyLnByb3RvdHlwZS5hZGRWaXNpdG9yID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsNCiAgICAgICAgICAgIHRoaXMudmlzaXRvcnMucHVzaCh2aXNpdG9yKTsNCiAgICAgICAgfTsNCiAgICAgICAgLyoqDQogICAgICAgICAqIEFkZHMgYSBwcmUgcHJvY2Vzc29yIG9iamVjdA0KICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gcHJlUHJvY2Vzc29yDQogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwcmlvcml0eSAtIGd1aWRlbGluZXMgMSA9IGJlZm9yZSBpbXBvcnQsIDEwMDAgPSBpbXBvcnQsIDIwMDAgPSBhZnRlciBpbXBvcnQNCiAgICAgICAgICovDQogICAgICAgIFBsdWdpbk1hbmFnZXIucHJvdG90eXBlLmFkZFByZVByb2Nlc3NvciA9IGZ1bmN0aW9uIChwcmVQcm9jZXNzb3IsIHByaW9yaXR5KSB7DQogICAgICAgICAgICB2YXIgaW5kZXhUb0luc2VydEF0Ow0KICAgICAgICAgICAgZm9yIChpbmRleFRvSW5zZXJ0QXQgPSAwOyBpbmRleFRvSW5zZXJ0QXQgPCB0aGlzLnByZVByb2Nlc3NvcnMubGVuZ3RoOyBpbmRleFRvSW5zZXJ0QXQrKykgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZVByb2Nlc3NvcnNbaW5kZXhUb0luc2VydEF0XS5wcmlvcml0eSA+PSBwcmlvcml0eSkgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnByZVByb2Nlc3NvcnMuc3BsaWNlKGluZGV4VG9JbnNlcnRBdCwgMCwgeyBwcmVQcm9jZXNzb3I6IHByZVByb2Nlc3NvciwgcHJpb3JpdHk6IHByaW9yaXR5IH0pOw0KICAgICAgICB9Ow0KICAgICAgICAvKioNCiAgICAgICAgICogQWRkcyBhIHBvc3QgcHJvY2Vzc29yIG9iamVjdA0KICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gcG9zdFByb2Nlc3Nvcg0KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gcHJpb3JpdHkgLSBndWlkZWxpbmVzIDEgPSBiZWZvcmUgY29tcHJlc3Npb24sIDEwMDAgPSBjb21wcmVzc2lvbiwgMjAwMCA9IGFmdGVyIGNvbXByZXNzaW9uDQogICAgICAgICAqLw0KICAgICAgICBQbHVnaW5NYW5hZ2VyLnByb3RvdHlwZS5hZGRQb3N0UHJvY2Vzc29yID0gZnVuY3Rpb24gKHBvc3RQcm9jZXNzb3IsIHByaW9yaXR5KSB7DQogICAgICAgICAgICB2YXIgaW5kZXhUb0luc2VydEF0Ow0KICAgICAgICAgICAgZm9yIChpbmRleFRvSW5zZXJ0QXQgPSAwOyBpbmRleFRvSW5zZXJ0QXQgPCB0aGlzLnBvc3RQcm9jZXNzb3JzLmxlbmd0aDsgaW5kZXhUb0luc2VydEF0KyspIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wb3N0UHJvY2Vzc29yc1tpbmRleFRvSW5zZXJ0QXRdLnByaW9yaXR5ID49IHByaW9yaXR5KSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucG9zdFByb2Nlc3NvcnMuc3BsaWNlKGluZGV4VG9JbnNlcnRBdCwgMCwgeyBwb3N0UHJvY2Vzc29yOiBwb3N0UHJvY2Vzc29yLCBwcmlvcml0eTogcHJpb3JpdHkgfSk7DQogICAgICAgIH07DQogICAgICAgIC8qKg0KICAgICAgICAgKg0KICAgICAgICAgKiBAcGFyYW0gbWFuYWdlcg0KICAgICAgICAgKi8NCiAgICAgICAgUGx1Z2luTWFuYWdlci5wcm90b3R5cGUuYWRkRmlsZU1hbmFnZXIgPSBmdW5jdGlvbiAobWFuYWdlcikgew0KICAgICAgICAgICAgdGhpcy5maWxlTWFuYWdlcnMucHVzaChtYW5hZ2VyKTsNCiAgICAgICAgfTsNCiAgICAgICAgLyoqDQogICAgICAgICAqDQogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0NCiAgICAgICAgICogQHByaXZhdGUNCiAgICAgICAgICovDQogICAgICAgIFBsdWdpbk1hbmFnZXIucHJvdG90eXBlLmdldFByZVByb2Nlc3NvcnMgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgcHJlUHJvY2Vzc29ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByZVByb2Nlc3NvcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzb3JzLnB1c2godGhpcy5wcmVQcm9jZXNzb3JzW2ldLnByZVByb2Nlc3Nvcik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcHJlUHJvY2Vzc29yczsNCiAgICAgICAgfTsNCiAgICAgICAgLyoqDQogICAgICAgICAqDQogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0NCiAgICAgICAgICogQHByaXZhdGUNCiAgICAgICAgICovDQogICAgICAgIFBsdWdpbk1hbmFnZXIucHJvdG90eXBlLmdldFBvc3RQcm9jZXNzb3JzID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHBvc3RQcm9jZXNzb3JzID0gW107DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9zdFByb2Nlc3NvcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBwb3N0UHJvY2Vzc29ycy5wdXNoKHRoaXMucG9zdFByb2Nlc3NvcnNbaV0ucG9zdFByb2Nlc3Nvcik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcG9zdFByb2Nlc3NvcnM7DQogICAgICAgIH07DQogICAgICAgIC8qKg0KICAgICAgICAgKg0KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9DQogICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAqLw0KICAgICAgICBQbHVnaW5NYW5hZ2VyLnByb3RvdHlwZS5nZXRWaXNpdG9ycyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0b3JzOw0KICAgICAgICB9Ow0KICAgICAgICBQbHVnaW5NYW5hZ2VyLnByb3RvdHlwZS52aXNpdG9yID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICBmaXJzdDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZXJhdG9yID0gLTE7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZpc2l0b3JzW3NlbGYuaXRlcmF0b3JdOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlcmF0b3IgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmlzaXRvcnNbc2VsZi5pdGVyYXRvcl07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfTsNCiAgICAgICAgLyoqDQogICAgICAgICAqDQogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0NCiAgICAgICAgICogQHByaXZhdGUNCiAgICAgICAgICovDQogICAgICAgIFBsdWdpbk1hbmFnZXIucHJvdG90eXBlLmdldEZpbGVNYW5hZ2VycyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVNYW5hZ2VyczsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIFBsdWdpbk1hbmFnZXI7DQogICAgfSgpKTsNCiAgICB2YXIgcG07DQogICAgdmFyIFBsdWdpbk1hbmFnZXJGYWN0b3J5ID0gZnVuY3Rpb24gKGxlc3MsIG5ld0ZhY3RvcnkpIHsNCiAgICAgICAgaWYgKG5ld0ZhY3RvcnkgfHwgIXBtKSB7DQogICAgICAgICAgICBwbSA9IG5ldyBQbHVnaW5NYW5hZ2VyKGxlc3MpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwbTsNCiAgICB9OwoKICAgIGZ1bmN0aW9uIFNvdXJjZU1hcE91dHB1dCAoZW52aXJvbm1lbnQpIHsNCiAgICAgICAgdmFyIFNvdXJjZU1hcE91dHB1dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIFNvdXJjZU1hcE91dHB1dChvcHRpb25zKSB7DQogICAgICAgICAgICAgICAgdGhpcy5fY3NzID0gW107DQogICAgICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBvcHRpb25zLnJvb3ROb2RlOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRzTWFwID0gb3B0aW9ucy5jb250ZW50c01hcDsNCiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50c0lnbm9yZWRDaGFyc01hcCA9IG9wdGlvbnMuY29udGVudHNJZ25vcmVkQ2hhcnNNYXA7DQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlTWFwRmlsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlTWFwRmlsZW5hbWUgPSBvcHRpb25zLnNvdXJjZU1hcEZpbGVuYW1lLnJlcGxhY2UoL1xcL2csICcvJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dEZpbGVuYW1lID0gb3B0aW9ucy5vdXRwdXRGaWxlbmFtZTsNCiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZU1hcFVSTCA9IG9wdGlvbnMuc291cmNlTWFwVVJMOw0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNvdXJjZU1hcEJhc2VwYXRoKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZU1hcEJhc2VwYXRoID0gb3B0aW9ucy5zb3VyY2VNYXBCYXNlcGF0aC5yZXBsYWNlKC9cXC9nLCAnLycpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zb3VyY2VNYXBSb290cGF0aCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VNYXBSb290cGF0aCA9IG9wdGlvbnMuc291cmNlTWFwUm9vdHBhdGgucmVwbGFjZSgvXFwvZywgJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZU1hcFJvb3RwYXRoLmNoYXJBdCh0aGlzLl9zb3VyY2VNYXBSb290cGF0aC5sZW5ndGggLSAxKSAhPT0gJy8nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VNYXBSb290cGF0aCArPSAnLyc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZU1hcFJvb3RwYXRoID0gJyc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dFNvdXJjZUZpbGVzID0gb3B0aW9ucy5vdXRwdXRTb3VyY2VGaWxlczsNCiAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VNYXBHZW5lcmF0b3JDb25zdHJ1Y3RvciA9IGVudmlyb25tZW50LmdldFNvdXJjZU1hcEdlbmVyYXRvcigpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVOdW1iZXIgPSAwOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbiA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBTb3VyY2VNYXBPdXRwdXQucHJvdG90eXBlLnJlbW92ZUJhc2VwYXRoID0gZnVuY3Rpb24gKHBhdGgpIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc291cmNlTWFwQmFzZXBhdGggJiYgcGF0aC5pbmRleE9mKHRoaXMuX3NvdXJjZU1hcEJhc2VwYXRoKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcodGhpcy5fc291cmNlTWFwQmFzZXBhdGgubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguY2hhckF0KDApID09PSAnXFwnIHx8IHBhdGguY2hhckF0KDApID09PSAnLycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBTb3VyY2VNYXBPdXRwdXQucHJvdG90eXBlLm5vcm1hbGl6ZUZpbGVuYW1lID0gZnVuY3Rpb24gKGZpbGVuYW1lKSB7DQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKC9cXC9nLCAnLycpOw0KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gdGhpcy5yZW1vdmVCYXNlcGF0aChmaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9zb3VyY2VNYXBSb290cGF0aCB8fCAnJykgKyBmaWxlbmFtZTsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBTb3VyY2VNYXBPdXRwdXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChjaHVuaywgZmlsZUluZm8sIGluZGV4LCBtYXBMaW5lcykgew0KICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhZGRpbmcgZW1wdHkgc3RyaW5ncw0KICAgICAgICAgICAgICAgIGlmICghY2h1bmspIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgbGluZXMsIHNvdXJjZUxpbmVzLCBjb2x1bW5zLCBzb3VyY2VDb2x1bW5zLCBpOw0KICAgICAgICAgICAgICAgIGlmIChmaWxlSW5mbyAmJiBmaWxlSW5mby5maWxlbmFtZSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRTb3VyY2UgPSB0aGlzLl9jb250ZW50c01hcFtmaWxlSW5mby5maWxlbmFtZV07DQogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB2YXJzL2Jhbm5lciBhZGRlZCB0byB0aGUgdG9wIG9mIHRoZSBmaWxlDQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb250ZW50c0lnbm9yZWRDaGFyc01hcFtmaWxlSW5mby5maWxlbmFtZV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgaW5kZXgNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4IC09IHRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwW2ZpbGVJbmZvLmZpbGVuYW1lXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIHNvdXJjZQ0KICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZS5zbGljZSh0aGlzLl9jb250ZW50c0lnbm9yZWRDaGFyc01hcFtmaWxlSW5mby5maWxlbmFtZV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgKiBpZ25vcmUgZW1wdHkgY29udGVudCwgb3IgZmFpbHNhZmUNCiAgICAgICAgICAgICAgICAgICAgICogaWYgY29udGVudHMgbWFwIGlzIGluY29ycmVjdA0KICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U291cmNlID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nzcy5wdXNoKGNodW5rKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IGlucHV0U291cmNlLnN1YnN0cmluZygwLCBpbmRleCk7DQogICAgICAgICAgICAgICAgICAgIHNvdXJjZUxpbmVzID0gaW5wdXRTb3VyY2Uuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbHVtbnMgPSBzb3VyY2VMaW5lc1tzb3VyY2VMaW5lcy5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGluZXMgPSBjaHVuay5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgICAgICBjb2x1bW5zID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV07DQogICAgICAgICAgICAgICAgaWYgKGZpbGVJbmZvICYmIGZpbGVJbmZvLmZpbGVuYW1lKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghbWFwTGluZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvci5hZGRNYXBwaW5nKHsgZ2VuZXJhdGVkOiB7IGxpbmU6IHRoaXMuX2xpbmVOdW1iZXIgKyAxLCBjb2x1bW46IHRoaXMuX2NvbHVtbiB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsOiB7IGxpbmU6IHNvdXJjZUxpbmVzLmxlbmd0aCwgY29sdW1uOiBzb3VyY2VDb2x1bW5zLmxlbmd0aCB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVGaWxlbmFtZShmaWxlSW5mby5maWxlbmFtZSkgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VNYXBHZW5lcmF0b3IuYWRkTWFwcGluZyh7IGdlbmVyYXRlZDogeyBsaW5lOiB0aGlzLl9saW5lTnVtYmVyICsgaSArIDEsIGNvbHVtbjogaSA9PT0gMCA/IHRoaXMuX2NvbHVtbiA6IDAgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6IHsgbGluZTogc291cmNlTGluZXMubGVuZ3RoICsgaSwgY29sdW1uOiBpID09PSAwID8gc291cmNlQ29sdW1ucy5sZW5ndGggOiAwIH0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVGaWxlbmFtZShmaWxlSW5mby5maWxlbmFtZSkgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW4gKz0gY29sdW1ucy5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9saW5lTnVtYmVyICs9IGxpbmVzLmxlbmd0aCAtIDE7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbiA9IGNvbHVtbnMubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLl9jc3MucHVzaChjaHVuayk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgU291cmNlTWFwT3V0cHV0LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jc3MubGVuZ3RoID09PSAwOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIFNvdXJjZU1hcE91dHB1dC5wcm90b3R5cGUudG9DU1MgPSBmdW5jdGlvbiAoY29udGV4dCkgew0KICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvciA9IG5ldyB0aGlzLl9zb3VyY2VNYXBHZW5lcmF0b3JDb25zdHJ1Y3Rvcih7IGZpbGU6IHRoaXMuX291dHB1dEZpbGVuYW1lLCBzb3VyY2VSb290OiBudWxsIH0pOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vdXRwdXRTb3VyY2VGaWxlcykgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmaWxlbmFtZSBpbiB0aGlzLl9jb250ZW50c01hcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRzTWFwLmhhc093blByb3BlcnR5KGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLl9jb250ZW50c01hcFtmaWxlbmFtZV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwW2ZpbGVuYW1lXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc2xpY2UodGhpcy5fY29udGVudHNJZ25vcmVkQ2hhcnNNYXBbZmlsZW5hbWVdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlTWFwR2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQodGhpcy5ub3JtYWxpemVGaWxlbmFtZShmaWxlbmFtZSksIHNvdXJjZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuZ2VuQ1NTKGNvbnRleHQsIHRoaXMpOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jc3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwVVJMID0gdm9pZCAwOw0KICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvci50b0pTT04oKSk7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZU1hcFVSTCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTWFwVVJMID0gdGhpcy5zb3VyY2VNYXBVUkw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fc291cmNlTWFwRmlsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcFVSTCA9IHRoaXMuX3NvdXJjZU1hcEZpbGVuYW1lOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlTWFwVVJMID0gc291cmNlTWFwVVJMOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZU1hcCA9IHNvdXJjZU1hcENvbnRlbnQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jc3Muam9pbignJyk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgcmV0dXJuIFNvdXJjZU1hcE91dHB1dDsNCiAgICAgICAgfSgpKTsNCiAgICAgICAgcmV0dXJuIFNvdXJjZU1hcE91dHB1dDsNCiAgICB9CgogICAgZnVuY3Rpb24gU291cmNlTWFwQnVpbGRlciAoU291cmNlTWFwT3V0cHV0LCBlbnZpcm9ubWVudCkgew0KICAgICAgICB2YXIgU291cmNlTWFwQnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEJ1aWxkZXIob3B0aW9ucykgew0KICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBTb3VyY2VNYXBCdWlsZGVyLnByb3RvdHlwZS50b0NTUyA9IGZ1bmN0aW9uIChyb290Tm9kZSwgb3B0aW9ucywgaW1wb3J0cykgew0KICAgICAgICAgICAgICAgIHZhciBzb3VyY2VNYXBPdXRwdXQgPSBuZXcgU291cmNlTWFwT3V0cHV0KHsNCiAgICAgICAgICAgICAgICAgICAgY29udGVudHNJZ25vcmVkQ2hhcnNNYXA6IGltcG9ydHMuY29udGVudHNJZ25vcmVkQ2hhcnMsDQogICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlOiByb290Tm9kZSwNCiAgICAgICAgICAgICAgICAgICAgY29udGVudHNNYXA6IGltcG9ydHMuY29udGVudHMsDQogICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcEZpbGVuYW1lOiB0aGlzLm9wdGlvbnMuc291cmNlTWFwRmlsZW5hbWUsDQogICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcFVSTDogdGhpcy5vcHRpb25zLnNvdXJjZU1hcFVSTCwNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZW5hbWU6IHRoaXMub3B0aW9ucy5zb3VyY2VNYXBPdXRwdXRGaWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgc291cmNlTWFwQmFzZXBhdGg6IHRoaXMub3B0aW9ucy5zb3VyY2VNYXBCYXNlcGF0aCwNCiAgICAgICAgICAgICAgICAgICAgc291cmNlTWFwUm9vdHBhdGg6IHRoaXMub3B0aW9ucy5zb3VyY2VNYXBSb290cGF0aCwNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0U291cmNlRmlsZXM6IHRoaXMub3B0aW9ucy5vdXRwdXRTb3VyY2VGaWxlcywNCiAgICAgICAgICAgICAgICAgICAgc291cmNlTWFwR2VuZXJhdG9yOiB0aGlzLm9wdGlvbnMuc291cmNlTWFwR2VuZXJhdG9yLA0KICAgICAgICAgICAgICAgICAgICBzb3VyY2VNYXBGaWxlSW5saW5lOiB0aGlzLm9wdGlvbnMuc291cmNlTWFwRmlsZUlubGluZSwNCiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVNvdXJjZW1hcEFubm90YXRpb246IHRoaXMub3B0aW9ucy5kaXNhYmxlU291cmNlbWFwQW5ub3RhdGlvbg0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIHZhciBjc3MgPSBzb3VyY2VNYXBPdXRwdXQudG9DU1Mob3B0aW9ucyk7DQogICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VNYXAgPSBzb3VyY2VNYXBPdXRwdXQuc291cmNlTWFwOw0KICAgICAgICAgICAgICAgIHRoaXMuc291cmNlTWFwVVJMID0gc291cmNlTWFwT3V0cHV0LnNvdXJjZU1hcFVSTDsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNvdXJjZU1hcElucHV0RmlsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VNYXBJbnB1dEZpbGVuYW1lID0gc291cmNlTWFwT3V0cHV0Lm5vcm1hbGl6ZUZpbGVuYW1lKHRoaXMub3B0aW9ucy5zb3VyY2VNYXBJbnB1dEZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VNYXBCYXNlcGF0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc291cmNlTWFwVVJMICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VNYXBVUkwgPSBzb3VyY2VNYXBPdXRwdXQucmVtb3ZlQmFzZXBhdGgodGhpcy5zb3VyY2VNYXBVUkwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gY3NzICsgdGhpcy5nZXRDU1NBcHBlbmRhZ2UoKTsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBTb3VyY2VNYXBCdWlsZGVyLnByb3RvdHlwZS5nZXRDU1NBcHBlbmRhZ2UgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcFVSTCA9IHRoaXMuc291cmNlTWFwVVJMOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc291cmNlTWFwRmlsZUlubGluZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VNYXAgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcFVSTCA9ICJkYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCIgKyBlbnZpcm9ubWVudC5lbmNvZGVCYXNlNjQodGhpcy5zb3VyY2VNYXApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVTb3VyY2VtYXBBbm5vdGF0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHNvdXJjZU1hcFVSTCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi8qIyBzb3VyY2VNYXBwaW5nVVJMPSIgKyBzb3VyY2VNYXBVUkwgKyAiICovIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIFNvdXJjZU1hcEJ1aWxkZXIucHJvdG90eXBlLmdldEV4dGVybmFsU291cmNlTWFwID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZU1hcDsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBTb3VyY2VNYXBCdWlsZGVyLnByb3RvdHlwZS5zZXRFeHRlcm5hbFNvdXJjZU1hcCA9IGZ1bmN0aW9uIChzb3VyY2VNYXApIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZU1hcCA9IHNvdXJjZU1hcDsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBTb3VyY2VNYXBCdWlsZGVyLnByb3RvdHlwZS5pc0lubGluZSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNvdXJjZU1hcEZpbGVJbmxpbmU7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgU291cmNlTWFwQnVpbGRlci5wcm90b3R5cGUuZ2V0U291cmNlTWFwVVJMID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZU1hcFVSTDsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBTb3VyY2VNYXBCdWlsZGVyLnByb3RvdHlwZS5nZXRPdXRwdXRGaWxlbmFtZSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNvdXJjZU1hcE91dHB1dEZpbGVuYW1lOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIFNvdXJjZU1hcEJ1aWxkZXIucHJvdG90eXBlLmdldElucHV0RmlsZW5hbWUgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlTWFwSW5wdXRGaWxlbmFtZTsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICByZXR1cm4gU291cmNlTWFwQnVpbGRlcjsNCiAgICAgICAgfSgpKTsNCiAgICAgICAgcmV0dXJuIFNvdXJjZU1hcEJ1aWxkZXI7DQogICAgfQoKICAgIGZ1bmN0aW9uIFBhcnNlVHJlZSAoU291cmNlTWFwQnVpbGRlcikgew0KICAgICAgICB2YXIgUGFyc2VUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgZnVuY3Rpb24gUGFyc2VUcmVlKHJvb3QsIGltcG9ydHMpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290Ow0KICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0cyA9IGltcG9ydHM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBQYXJzZVRyZWUucHJvdG90eXBlLnRvQ1NTID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsNCiAgICAgICAgICAgICAgICB2YXIgZXZhbGRSb290Ow0KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTsNCiAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwQnVpbGRlcjsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICBldmFsZFJvb3QgPSB0cmFuc2Zvcm1UcmVlKHRoaXMucm9vdCwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMZXNzRXJyb3IoZSwgdGhpcy5pbXBvcnRzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXByZXNzID0gQm9vbGVhbihvcHRpb25zLmNvbXByZXNzKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIkMS53YXJuKCdUaGUgY29tcHJlc3Mgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuICcgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXZSByZWNvbW1lbmQgeW91IHVzZSBhIGRlZGljYXRlZCBjc3MgbWluaWZpZXIsIGZvciBpbnN0YW5jZSBzZWUgbGVzcy1wbHVnaW4tY2xlYW4tY3NzLicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciB0b0NTU09wdGlvbnMgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzczogY29tcHJlc3MsDQogICAgICAgICAgICAgICAgICAgICAgICBkdW1wTGluZU51bWJlcnM6IG9wdGlvbnMuZHVtcExpbmVOdW1iZXJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0VW5pdHM6IEJvb2xlYW4ob3B0aW9ucy5zdHJpY3RVbml0cyksDQogICAgICAgICAgICAgICAgICAgICAgICBudW1QcmVjaXNpb246IDgNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlTWFwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VNYXBCdWlsZGVyID0gbmV3IFNvdXJjZU1hcEJ1aWxkZXIob3B0aW9ucy5zb3VyY2VNYXApOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNzcyA9IHNvdXJjZU1hcEJ1aWxkZXIudG9DU1MoZXZhbGRSb290LCB0b0NTU09wdGlvbnMsIHRoaXMuaW1wb3J0cyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY3NzID0gZXZhbGRSb290LnRvQ1NTKHRvQ1NTT3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExlc3NFcnJvcihlLCB0aGlzLmltcG9ydHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wbHVnaW5NYW5hZ2VyKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBwb3N0UHJvY2Vzc29ycyA9IG9wdGlvbnMucGx1Z2luTWFuYWdlci5nZXRQb3N0UHJvY2Vzc29ycygpOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc3RQcm9jZXNzb3JzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY3NzID0gcG9zdFByb2Nlc3NvcnNbaV0ucHJvY2VzcyhyZXN1bHQuY3NzLCB7IHNvdXJjZU1hcDogc291cmNlTWFwQnVpbGRlciwgb3B0aW9uczogb3B0aW9ucywgaW1wb3J0czogdGhpcy5pbXBvcnRzIH0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNvdXJjZU1hcCkgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQubWFwID0gc291cmNlTWFwQnVpbGRlci5nZXRFeHRlcm5hbFNvdXJjZU1hcCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXN1bHQuaW1wb3J0cyA9IFtdOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGZpbGUgaW4gdGhpcy5pbXBvcnRzLmZpbGVzKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydHMuZmlsZXMuaGFzT3duUHJvcGVydHkoZmlsZSkgJiYgZmlsZSAhPT0gdGhpcy5pbXBvcnRzLnJvb3RGaWxlbmFtZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmltcG9ydHMucHVzaChmaWxlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHJldHVybiBQYXJzZVRyZWU7DQogICAgICAgIH0oKSk7DQogICAgICAgIHJldHVybiBQYXJzZVRyZWU7DQogICAgfQoKICAgIGZ1bmN0aW9uIEltcG9ydE1hbmFnZXIgKGVudmlyb25tZW50KSB7DQogICAgICAgIC8vIEZpbGVJbmZvID0gew0KICAgICAgICAvLyAgJ3Jld3JpdGVVcmxzJyAtIG9wdGlvbiAtIHdoZXRoZXIgdG8gYWRqdXN0IFVSTCdzIHRvIGJlIHJlbGF0aXZlDQogICAgICAgIC8vICAnZmlsZW5hbWUnIC0gZnVsbCByZXNvbHZlZCBmaWxlbmFtZSBvZiBjdXJyZW50IGZpbGUNCiAgICAgICAgLy8gICdyb290cGF0aCcgLSBwYXRoIHRvIGFwcGVuZCB0byBub3JtYWwgVVJMcyBmb3IgdGhpcyBub2RlDQogICAgICAgIC8vICAnY3VycmVudERpcmVjdG9yeScgLSBwYXRoIHRvIHRoZSBjdXJyZW50IGZpbGUsIGFic29sdXRlDQogICAgICAgIC8vICAncm9vdEZpbGVuYW1lJyAtIGZpbGVuYW1lIG9mIHRoZSBiYXNlIGZpbGUNCiAgICAgICAgLy8gICdlbnRyeVBhdGgnIC0gYWJzb2x1dGUgcGF0aCB0byB0aGUgZW50cnkgZmlsZQ0KICAgICAgICAvLyAgJ3JlZmVyZW5jZScgLSB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBub3QgYmUgb3V0cHV0IGFuZCBvbmx5IG91dHB1dCBwYXJ0cyB0aGF0IGFyZSByZWZlcmVuY2VkDQogICAgICAgIHZhciBJbXBvcnRNYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgZnVuY3Rpb24gSW1wb3J0TWFuYWdlcihsZXNzLCBjb250ZXh0LCByb290RmlsZUluZm8pIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxlc3MgPSBsZXNzOw0KICAgICAgICAgICAgICAgIHRoaXMucm9vdEZpbGVuYW1lID0gcm9vdEZpbGVJbmZvLmZpbGVuYW1lOw0KICAgICAgICAgICAgICAgIHRoaXMucGF0aHMgPSBjb250ZXh0LnBhdGhzIHx8IFtdOyAvLyBTZWFyY2ggcGF0aHMsIHdoZW4gaW1wb3J0aW5nDQogICAgICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IHt9OyAvLyBtYXAgLSBmaWxlbmFtZSB0byBjb250ZW50cyBvZiBhbGwgdGhlIGZpbGVzDQogICAgICAgICAgICAgICAgdGhpcy5jb250ZW50c0lnbm9yZWRDaGFycyA9IHt9OyAvLyBtYXAgLSBmaWxlbmFtZSB0byBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZmlsZSB0byBpZ25vcmUNCiAgICAgICAgICAgICAgICB0aGlzLm1pbWUgPSBjb250ZXh0Lm1pbWU7DQogICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7DQogICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsNCiAgICAgICAgICAgICAgICAvLyBEZXByZWNhdGVkPyBVbnVzZWQgb3V0c2lkZSBvZiBoZXJlLCBjb3VsZCBiZSB1c2VmdWwuDQogICAgICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdOyAvLyBGaWxlcyB3aGljaCBoYXZlbid0IGJlZW4gaW1wb3J0ZWQgeWV0DQogICAgICAgICAgICAgICAgdGhpcy5maWxlcyA9IHt9OyAvLyBIb2xkcyB0aGUgaW1wb3J0ZWQgcGFyc2UgdHJlZXMuDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIEFkZCBhbiBpbXBvcnQgdG8gYmUgaW1wb3J0ZWQNCiAgICAgICAgICAgICAqIEBwYXJhbSBwYXRoIC0gdGhlIHJhdyBwYXRoDQogICAgICAgICAgICAgKiBAcGFyYW0gdHJ5QXBwZW5kRXh0ZW5zaW9uIC0gd2hldGhlciB0byB0cnkgYXBwZW5kaW5nIGEgZmlsZSBleHRlbnNpb24gKC5sZXNzIG9yIC5qcyBpZiB0aGUgcGF0aCBoYXMgbm8gZXh0ZW5zaW9uKQ0KICAgICAgICAgICAgICogQHBhcmFtIGN1cnJlbnRGaWxlSW5mbyAtIHRoZSBjdXJyZW50IGZpbGUgaW5mbyAodXNlZCBmb3IgaW5zdGFuY2UgdG8gd29yayBvdXQgcmVsYXRpdmUgcGF0aHMpDQogICAgICAgICAgICAgKiBAcGFyYW0gaW1wb3J0T3B0aW9ucyAtIGltcG9ydCBvcHRpb25zDQogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBjYWxsYmFjayBmb3Igd2hlbiBpdCBpcyBpbXBvcnRlZA0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBJbXBvcnRNYW5hZ2VyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHBhdGgsIHRyeUFwcGVuZEV4dGVuc2lvbiwgY3VycmVudEZpbGVJbmZvLCBpbXBvcnRPcHRpb25zLCBjYWxsYmFjaykgew0KICAgICAgICAgICAgICAgIHZhciBpbXBvcnRNYW5hZ2VyID0gdGhpcywgcGx1Z2luTG9hZGVyID0gdGhpcy5jb250ZXh0LnBsdWdpbk1hbmFnZXIuTG9hZGVyOw0KICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChwYXRoKTsNCiAgICAgICAgICAgICAgICB2YXIgZmlsZVBhcnNlZEZ1bmMgPSBmdW5jdGlvbiAoZSwgcm9vdCwgZnVsbFBhdGgpIHsNCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0TWFuYWdlci5xdWV1ZS5zcGxpY2UoaW1wb3J0TWFuYWdlci5xdWV1ZS5pbmRleE9mKHBhdGgpLCAxKTsgLy8gUmVtb3ZlIHRoZSBwYXRoIGZyb20gdGhlIHF1ZXVlDQogICAgICAgICAgICAgICAgICAgIHZhciBpbXBvcnRlZEVxdWFsc1Jvb3QgPSBmdWxsUGF0aCA9PT0gaW1wb3J0TWFuYWdlci5yb290RmlsZW5hbWU7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRPcHRpb25zLm9wdGlvbmFsICYmIGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgcnVsZXM6IFtdIH0sIGZhbHNlLCBudWxsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciQxLmluZm8oIlRoZSBmaWxlICIgKyBmdWxsUGF0aCArICIgd2FzIHNraXBwZWQgYmVjYXVzZSBpdCB3YXMgbm90IGZvdW5kIGFuZCB0aGUgaW1wb3J0IHdhcyBtYXJrZWQgb3B0aW9uYWwuIik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgaW1wb3J0cyBhcmVuJ3QgY2FjaGVkIGhlcmUuDQogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBzdGFydCB0byBjYWNoZSB0aGVtLCBwbGVhc2UgbWFrZSBzdXJlIHRoZXkgd29uJ3QgY29uZmxpY3Qgd2l0aCBub24taW5saW5lIGltcG9ydHMgb2YgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIG5hbWUgYXMgdGhleSB1c2VkIHRvIGRvIGJlZm9yZSB0aGlzIGNvbW1lbnQgYW5kIHRoZSBjb25kaXRpb24gYmVsb3cgaGF2ZSBiZWVuIGFkZGVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBvcnRNYW5hZ2VyLmZpbGVzW2Z1bGxQYXRoXSAmJiAhaW1wb3J0T3B0aW9ucy5pbmxpbmUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRNYW5hZ2VyLmZpbGVzW2Z1bGxQYXRoXSA9IHsgcm9vdDogcm9vdCwgb3B0aW9uczogaW1wb3J0T3B0aW9ucyB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgIWltcG9ydE1hbmFnZXIuZXJyb3IpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRNYW5hZ2VyLmVycm9yID0gZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUsIHJvb3QsIGltcG9ydGVkRXF1YWxzUm9vdCwgZnVsbFBhdGgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB2YXIgbmV3RmlsZUluZm8gPSB7DQogICAgICAgICAgICAgICAgICAgIHJld3JpdGVVcmxzOiB0aGlzLmNvbnRleHQucmV3cml0ZVVybHMsDQogICAgICAgICAgICAgICAgICAgIGVudHJ5UGF0aDogY3VycmVudEZpbGVJbmZvLmVudHJ5UGF0aCwNCiAgICAgICAgICAgICAgICAgICAgcm9vdHBhdGg6IGN1cnJlbnRGaWxlSW5mby5yb290cGF0aCwNCiAgICAgICAgICAgICAgICAgICAgcm9vdEZpbGVuYW1lOiBjdXJyZW50RmlsZUluZm8ucm9vdEZpbGVuYW1lDQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB2YXIgZmlsZU1hbmFnZXIgPSBlbnZpcm9ubWVudC5nZXRGaWxlTWFuYWdlcihwYXRoLCBjdXJyZW50RmlsZUluZm8uY3VycmVudERpcmVjdG9yeSwgdGhpcy5jb250ZXh0LCBlbnZpcm9ubWVudCk7DQogICAgICAgICAgICAgICAgaWYgKCFmaWxlTWFuYWdlcikgew0KICAgICAgICAgICAgICAgICAgICBmaWxlUGFyc2VkRnVuYyh7IG1lc3NhZ2U6ICJDb3VsZCBub3QgZmluZCBhIGZpbGUtbWFuYWdlciBmb3IgIiArIHBhdGggfSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFyIGxvYWRGaWxlQ2FsbGJhY2sgPSBmdW5jdGlvbiAobG9hZGVkRmlsZSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcGx1Z2luOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRGaWxlbmFtZSA9IGxvYWRlZEZpbGUuZmlsZW5hbWU7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50cyA9IGxvYWRlZEZpbGUuY29udGVudHMucmVwbGFjZSgvXlx1RkVGRi8sICcnKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBvbiBhbiB1cGRhdGVkIHJvb3RwYXRoIGlmIHBhdGggb2YgaW1wb3J0ZWQgZmlsZSBpcyByZWxhdGl2ZSBhbmQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAvLyBpcyBpbiBhIChzdWJ8c3VwKSBkaXJlY3RvcnkNCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gRXhhbXBsZXM6DQogICAgICAgICAgICAgICAgICAgIC8vIC0gSWYgcGF0aCBvZiBpbXBvcnRlZCBmaWxlIGlzICdtb2R1bGUvbmF2L25hdi5sZXNzJyBhbmQgcm9vdHBhdGggaXMgJ2xlc3MvJywNCiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGVuIHJvb3RwYXRoIHNob3VsZCBiZWNvbWUgJ2xlc3MvbW9kdWxlL25hdi8nDQogICAgICAgICAgICAgICAgICAgIC8vIC0gSWYgcGF0aCBvZiBpbXBvcnRlZCBmaWxlIGlzICcuLi9taXhpbnMubGVzcycgYW5kIHJvb3RwYXRoIGlzICdsZXNzLycsDQogICAgICAgICAgICAgICAgICAgIC8vICAgdGhlbiByb290cGF0aCBzaG91bGQgYmVjb21lICdsZXNzLy4uLycNCiAgICAgICAgICAgICAgICAgICAgbmV3RmlsZUluZm8uY3VycmVudERpcmVjdG9yeSA9IGZpbGVNYW5hZ2VyLmdldFBhdGgocmVzb2x2ZWRGaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChuZXdGaWxlSW5mby5yZXdyaXRlVXJscykgew0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3RmlsZUluZm8ucm9vdHBhdGggPSBmaWxlTWFuYWdlci5qb2luKChpbXBvcnRNYW5hZ2VyLmNvbnRleHQucm9vdHBhdGggfHwgJycpLCBmaWxlTWFuYWdlci5wYXRoRGlmZihuZXdGaWxlSW5mby5jdXJyZW50RGlyZWN0b3J5LCBuZXdGaWxlSW5mby5lbnRyeVBhdGgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZU1hbmFnZXIuaXNQYXRoQWJzb2x1dGUobmV3RmlsZUluZm8ucm9vdHBhdGgpICYmIGZpbGVNYW5hZ2VyLmFsd2F5c01ha2VQYXRoc0Fic29sdXRlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGaWxlSW5mby5yb290cGF0aCA9IGZpbGVNYW5hZ2VyLmpvaW4obmV3RmlsZUluZm8uZW50cnlQYXRoLCBuZXdGaWxlSW5mby5yb290cGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbmV3RmlsZUluZm8uZmlsZW5hbWUgPSByZXNvbHZlZEZpbGVuYW1lOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW52ID0gbmV3IGNvbnRleHRzLlBhcnNlKGltcG9ydE1hbmFnZXIuY29udGV4dCk7DQogICAgICAgICAgICAgICAgICAgIG5ld0Vudi5wcm9jZXNzSW1wb3J0cyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICBpbXBvcnRNYW5hZ2VyLmNvbnRlbnRzW3Jlc29sdmVkRmlsZW5hbWVdID0gY29udGVudHM7DQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmlsZUluZm8ucmVmZXJlbmNlIHx8IGltcG9ydE9wdGlvbnMucmVmZXJlbmNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXdGaWxlSW5mby5yZWZlcmVuY2UgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRPcHRpb25zLmlzUGx1Z2luKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4gPSBwbHVnaW5Mb2FkZXIuZXZhbFBsdWdpbihjb250ZW50cywgbmV3RW52LCBpbXBvcnRNYW5hZ2VyLCBpbXBvcnRPcHRpb25zLnBsdWdpbkFyZ3MsIG5ld0ZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4gaW5zdGFuY2VvZiBMZXNzRXJyb3IpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGFyc2VkRnVuYyhwbHVnaW4sIG51bGwsIHJlc29sdmVkRmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhcnNlZEZ1bmMobnVsbCwgcGx1Z2luLCByZXNvbHZlZEZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRPcHRpb25zLmlubGluZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhcnNlZEZ1bmMobnVsbCwgY29udGVudHMsIHJlc29sdmVkRmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IChtdWx0aXBsZSkgcGFyc2UgdHJlZXMgYXBwYXJlbnRseSBnZXQgYWx0ZXJlZCBhbmQgY2FuJ3QgYmUgY2FjaGVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgd2h5IHRoaXMgaXMNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRNYW5hZ2VyLmZpbGVzW3Jlc29sdmVkRmlsZW5hbWVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWltcG9ydE1hbmFnZXIuZmlsZXNbcmVzb2x2ZWRGaWxlbmFtZV0ub3B0aW9ucy5tdWx0aXBsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpbXBvcnRPcHRpb25zLm11bHRpcGxlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhcnNlZEZ1bmMobnVsbCwgaW1wb3J0TWFuYWdlci5maWxlc1tyZXNvbHZlZEZpbGVuYW1lXS5yb290LCByZXNvbHZlZEZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJzZXIobmV3RW52LCBpbXBvcnRNYW5hZ2VyLCBuZXdGaWxlSW5mbykucGFyc2UoY29udGVudHMsIGZ1bmN0aW9uIChlLCByb290KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXJzZWRGdW5jKGUsIHJvb3QsIHJlc29sdmVkRmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB2YXIgbG9hZGVkRmlsZTsNCiAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZTsNCiAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNsb25lKHRoaXMuY29udGV4dCk7DQogICAgICAgICAgICAgICAgaWYgKHRyeUFwcGVuZEV4dGVuc2lvbikgew0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmV4dCA9IGltcG9ydE9wdGlvbnMuaXNQbHVnaW4gPyAnLmpzJyA6ICcubGVzcyc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChpbXBvcnRPcHRpb25zLmlzUGx1Z2luKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubWltZSA9ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuc3luY0ltcG9ydCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRmlsZSA9IHBsdWdpbkxvYWRlci5sb2FkUGx1Z2luU3luYyhwYXRoLCBjdXJyZW50RmlsZUluZm8uY3VycmVudERpcmVjdG9yeSwgY29udGV4dCwgZW52aXJvbm1lbnQsIGZpbGVNYW5hZ2VyKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBwbHVnaW5Mb2FkZXIubG9hZFBsdWdpbihwYXRoLCBjdXJyZW50RmlsZUluZm8uY3VycmVudERpcmVjdG9yeSwgY29udGV4dCwgZW52aXJvbm1lbnQsIGZpbGVNYW5hZ2VyKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuc3luY0ltcG9ydCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRmlsZSA9IGZpbGVNYW5hZ2VyLmxvYWRGaWxlU3luYyhwYXRoLCBjdXJyZW50RmlsZUluZm8uY3VycmVudERpcmVjdG9yeSwgY29udGV4dCwgZW52aXJvbm1lbnQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGZpbGVNYW5hZ2VyLmxvYWRGaWxlKHBhdGgsIGN1cnJlbnRGaWxlSW5mby5jdXJyZW50RGlyZWN0b3J5LCBjb250ZXh0LCBlbnZpcm9ubWVudCwgZnVuY3Rpb24gKGVyciwgbG9hZGVkRmlsZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhcnNlZEZ1bmMoZXJyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRGaWxlQ2FsbGJhY2sobG9hZGVkRmlsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGxvYWRlZEZpbGUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2FkZWRGaWxlLmZpbGVuYW1lKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGFyc2VkRnVuYyhsb2FkZWRGaWxlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRGaWxlQ2FsbGJhY2sobG9hZGVkRmlsZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvbWlzZSkgew0KICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnRoZW4obG9hZEZpbGVDYWxsYmFjaywgZmlsZVBhcnNlZEZ1bmMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICByZXR1cm4gSW1wb3J0TWFuYWdlcjsNCiAgICAgICAgfSgpKTsNCiAgICAgICAgcmV0dXJuIEltcG9ydE1hbmFnZXI7DQogICAgfQoKICAgIGZ1bmN0aW9uIFBhcnNlIChlbnZpcm9ubWVudCwgUGFyc2VUcmVlLCBJbXBvcnRNYW5hZ2VyKSB7DQogICAgICAgIHZhciBwYXJzZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gb3B0aW9uczsNCiAgICAgICAgICAgICAgICBvcHRpb25zID0gY29weU9wdGlvbnModGhpcy5vcHRpb25zLCB7fSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBvcHRpb25zID0gY29weU9wdGlvbnModGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICB2YXIgc2VsZl8xID0gdGhpczsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgICAgICAgICAgICBwYXJzZS5jYWxsKHNlbGZfMSwgaW5wdXQsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIsIG91dHB1dCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjb250ZXh0XzE7DQogICAgICAgICAgICAgICAgdmFyIHJvb3RGaWxlSW5mbyA9IHZvaWQgMDsNCiAgICAgICAgICAgICAgICB2YXIgcGx1Z2luTWFuYWdlcl8xID0gbmV3IFBsdWdpbk1hbmFnZXJGYWN0b3J5KHRoaXMsICFvcHRpb25zLnJlVXNlUGx1Z2luTWFuYWdlcik7DQogICAgICAgICAgICAgICAgb3B0aW9ucy5wbHVnaW5NYW5hZ2VyID0gcGx1Z2luTWFuYWdlcl8xOw0KICAgICAgICAgICAgICAgIGNvbnRleHRfMSA9IG5ldyBjb250ZXh0cy5QYXJzZShvcHRpb25zKTsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yb290RmlsZUluZm8pIHsNCiAgICAgICAgICAgICAgICAgICAgcm9vdEZpbGVJbmZvID0gb3B0aW9ucy5yb290RmlsZUluZm87DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBvcHRpb25zLmZpbGVuYW1lIHx8ICdpbnB1dCc7DQogICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeVBhdGggPSBmaWxlbmFtZS5yZXBsYWNlKC9bXlwvXFxdKiQvLCAnJyk7DQogICAgICAgICAgICAgICAgICAgIHJvb3RGaWxlSW5mbyA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVVcmxzOiBjb250ZXh0XzEucmV3cml0ZVVybHMsDQogICAgICAgICAgICAgICAgICAgICAgICByb290cGF0aDogY29udGV4dF8xLnJvb3RwYXRoIHx8ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERpcmVjdG9yeTogZW50cnlQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlQYXRoOiBlbnRyeVBhdGgsDQogICAgICAgICAgICAgICAgICAgICAgICByb290RmlsZW5hbWU6IGZpbGVuYW1lDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpbiBhIG1pc3NpbmcgdHJhaWxpbmcgc2xhc2gNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3RGaWxlSW5mby5yb290cGF0aCAmJiByb290RmlsZUluZm8ucm9vdHBhdGguc2xpY2UoLTEpICE9PSAnLycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RGaWxlSW5mby5yb290cGF0aCArPSAnLyc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFyIGltcG9ydHNfMSA9IG5ldyBJbXBvcnRNYW5hZ2VyKHRoaXMsIGNvbnRleHRfMSwgcm9vdEZpbGVJbmZvKTsNCiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydE1hbmFnZXIgPSBpbXBvcnRzXzE7DQogICAgICAgICAgICAgICAgLy8gVE9ETzogYWxsb3cgdGhlIHBsdWdpbnMgdG8gYmUganVzdCBhIGxpc3Qgb2YgcGF0aHMgb3IgbmFtZXMNCiAgICAgICAgICAgICAgICAvLyBEbyBhbiBhc3luYyBwbHVnaW4gcXVldWUgbGlrZSBsZXNzYw0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2YWxSZXN1bHQsIGNvbnRlbnRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5maWxlQ29udGVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gcGx1Z2luLmZpbGVDb250ZW50LnJlcGxhY2UoL15cdUZFRkYvLCAnJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbFJlc3VsdCA9IHBsdWdpbk1hbmFnZXJfMS5Mb2FkZXIuZXZhbFBsdWdpbihjb250ZW50cywgY29udGV4dF8xLCBpbXBvcnRzXzEsIHBsdWdpbi5vcHRpb25zLCBwbHVnaW4uZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmFsUmVzdWx0IGluc3RhbmNlb2YgTGVzc0Vycm9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhldmFsUmVzdWx0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5NYW5hZ2VyXzEuYWRkUGx1Z2luKHBsdWdpbik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBuZXcgUGFyc2VyKGNvbnRleHRfMSwgaW1wb3J0c18xLCByb290RmlsZUluZm8pDQogICAgICAgICAgICAgICAgICAgIC5wYXJzZShpbnB1dCwgZnVuY3Rpb24gKGUsIHJvb3QpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByb290LCBpbXBvcnRzXzEsIG9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIH0sIG9wdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4gcGFyc2U7DQogICAgfQoKICAgIGZ1bmN0aW9uIFJlbmRlciAoZW52aXJvbm1lbnQsIFBhcnNlVHJlZSwgSW1wb3J0TWFuYWdlcikgew0KICAgICAgICB2YXIgcmVuZGVyID0gZnVuY3Rpb24gKGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zOw0KICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBjb3B5T3B0aW9ucyh0aGlzLm9wdGlvbnMsIHt9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBjb3B5T3B0aW9ucyh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwge30pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykgew0KICAgICAgICAgICAgICAgIHZhciBzZWxmXzEgPSB0aGlzOw0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICAgICAgICAgIHJlbmRlci5jYWxsKHNlbGZfMSwgaW5wdXQsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIsIG91dHB1dCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMucGFyc2UoaW5wdXQsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIsIHJvb3QsIGltcG9ydHMsIG9wdGlvbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZVRyZWUgPSBuZXcgUGFyc2VUcmVlKHJvb3QsIGltcG9ydHMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VUcmVlLnRvQ1NTKG9wdGlvbnMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHJldHVybiByZW5kZXI7DQogICAgfQoKICAgIHZhciB2ZXJzaW9uID0gIjQuMS4yIjsKCiAgICBmdW5jdGlvbiBwYXJzZU5vZGVWZXJzaW9uKHZlcnNpb24pIHsKICAgICAgdmFyIG1hdGNoID0gdmVyc2lvbi5tYXRjaCgvXnYoXGR7MSwyfSlcLihcZHsxLDJ9KVwuKFxkezEsMn0pKD86LShbMC05QS1aYS16LS5dKykpPyg/OlwrKFswLTlBLVphLXotLl0rKSk/JC8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW4KICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlOiAnICsgdmVyc2lvbik7CiAgICAgIH0KCiAgICAgIHZhciByZXMgPSB7CiAgICAgICAgbWFqb3I6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksCiAgICAgICAgbWlub3I6IHBhcnNlSW50KG1hdGNoWzJdLCAxMCksCiAgICAgICAgcGF0Y2g6IHBhcnNlSW50KG1hdGNoWzNdLCAxMCksCiAgICAgICAgcHJlOiBtYXRjaFs0XSB8fCAnJywKICAgICAgICBidWlsZDogbWF0Y2hbNV0gfHwgJycsCiAgICAgIH07CgogICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIHZhciBwYXJzZU5vZGVWZXJzaW9uXzEgPSBwYXJzZU5vZGVWZXJzaW9uOwoKICAgIGZ1bmN0aW9uIGxlc3NSb290IChlbnZpcm9ubWVudCwgZmlsZU1hbmFnZXJzKSB7DQogICAgICAgIHZhciBzb3VyY2VNYXBPdXRwdXQsIHNvdXJjZU1hcEJ1aWxkZXIsIHBhcnNlVHJlZSwgaW1wb3J0TWFuYWdlcjsNCiAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQoZW52aXJvbm1lbnQsIGZpbGVNYW5hZ2Vycyk7DQogICAgICAgIHNvdXJjZU1hcE91dHB1dCA9IFNvdXJjZU1hcE91dHB1dChlbnZpcm9ubWVudCk7DQogICAgICAgIHNvdXJjZU1hcEJ1aWxkZXIgPSBTb3VyY2VNYXBCdWlsZGVyKHNvdXJjZU1hcE91dHB1dCwgZW52aXJvbm1lbnQpOw0KICAgICAgICBwYXJzZVRyZWUgPSBQYXJzZVRyZWUoc291cmNlTWFwQnVpbGRlcik7DQogICAgICAgIGltcG9ydE1hbmFnZXIgPSBJbXBvcnRNYW5hZ2VyKGVudmlyb25tZW50KTsNCiAgICAgICAgdmFyIHJlbmRlciA9IFJlbmRlcihlbnZpcm9ubWVudCwgcGFyc2VUcmVlKTsNCiAgICAgICAgdmFyIHBhcnNlID0gUGFyc2UoZW52aXJvbm1lbnQsIHBhcnNlVHJlZSwgaW1wb3J0TWFuYWdlcik7DQogICAgICAgIHZhciB2ID0gcGFyc2VOb2RlVmVyc2lvbl8xKCJ2IiArIHZlcnNpb24pOw0KICAgICAgICB2YXIgaW5pdGlhbCA9IHsNCiAgICAgICAgICAgIHZlcnNpb246IFt2Lm1ham9yLCB2Lm1pbm9yLCB2LnBhdGNoXSwNCiAgICAgICAgICAgIGRhdGE6IGRhdGEsDQogICAgICAgICAgICB0cmVlOiB0cmVlLA0KICAgICAgICAgICAgRW52aXJvbm1lbnQ6IEVudmlyb25tZW50LA0KICAgICAgICAgICAgQWJzdHJhY3RGaWxlTWFuYWdlcjogQWJzdHJhY3RGaWxlTWFuYWdlciwNCiAgICAgICAgICAgIEFic3RyYWN0UGx1Z2luTG9hZGVyOiBBYnN0cmFjdFBsdWdpbkxvYWRlciwNCiAgICAgICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCwNCiAgICAgICAgICAgIHZpc2l0b3JzOiB2aXNpdG9ycywNCiAgICAgICAgICAgIFBhcnNlcjogUGFyc2VyLA0KICAgICAgICAgICAgZnVuY3Rpb25zOiBmdW5jdGlvbnMoZW52aXJvbm1lbnQpLA0KICAgICAgICAgICAgY29udGV4dHM6IGNvbnRleHRzLA0KICAgICAgICAgICAgU291cmNlTWFwT3V0cHV0OiBzb3VyY2VNYXBPdXRwdXQsDQogICAgICAgICAgICBTb3VyY2VNYXBCdWlsZGVyOiBzb3VyY2VNYXBCdWlsZGVyLA0KICAgICAgICAgICAgUGFyc2VUcmVlOiBwYXJzZVRyZWUsDQogICAgICAgICAgICBJbXBvcnRNYW5hZ2VyOiBpbXBvcnRNYW5hZ2VyLA0KICAgICAgICAgICAgcmVuZGVyOiByZW5kZXIsDQogICAgICAgICAgICBwYXJzZTogcGFyc2UsDQogICAgICAgICAgICBMZXNzRXJyb3I6IExlc3NFcnJvciwNCiAgICAgICAgICAgIHRyYW5zZm9ybVRyZWU6IHRyYW5zZm9ybVRyZWUsDQogICAgICAgICAgICB1dGlsczogdXRpbHMsDQogICAgICAgICAgICBQbHVnaW5NYW5hZ2VyOiBQbHVnaW5NYW5hZ2VyRmFjdG9yeSwNCiAgICAgICAgICAgIGxvZ2dlcjogbG9nZ2VyJDENCiAgICAgICAgfTsNCiAgICAgICAgLy8gQ3JlYXRlIGEgcHVibGljIEFQSQ0KICAgICAgICB2YXIgY3RvciA9IGZ1bmN0aW9uICh0KSB7DQogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTsNCiAgICAgICAgICAgICAgICB0LmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIG9iajsNCiAgICAgICAgICAgIH07DQogICAgICAgIH07DQogICAgICAgIHZhciB0Ow0KICAgICAgICB2YXIgYXBpID0gT2JqZWN0LmNyZWF0ZShpbml0aWFsKTsNCiAgICAgICAgZm9yICh2YXIgbiBpbiBpbml0aWFsLnRyZWUpIHsNCiAgICAgICAgICAgIC8qIGVzbGludCBndWFyZC1mb3ItaW46IDAgKi8NCiAgICAgICAgICAgIHQgPSBpbml0aWFsLnRyZWVbbl07DQogICAgICAgICAgICBpZiAodHlwZW9mIHQgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgICAgICBhcGlbbi50b0xvd2VyQ2FzZSgpXSA9IGN0b3IodCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBhcGlbbl0gPSBPYmplY3QuY3JlYXRlKG51bGwpOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gdCkgew0KICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQgZ3VhcmQtZm9yLWluOiAwICovDQogICAgICAgICAgICAgICAgICAgIGFwaVtuXVtvLnRvTG93ZXJDYXNlKCldID0gY3Rvcih0W29dKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLyoqDQogICAgICAgICAqIFNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhc3N1bWUgYSBgdGhpc2AgY29udGV4dCBvZiB0aGUgQVBJIG9iamVjdCwNCiAgICAgICAgICogd2hpY2ggY2F1c2VzIGl0IHRvIGZhaWwgd2hlbiB3cmFwcGVkIGZvciBFUzYgaW1wb3J0cy4NCiAgICAgICAgICoNCiAgICAgICAgICogQW4gYXNzdW1lZCBgdGhpc2Agc2hvdWxkIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4NCiAgICAgICAgICovDQogICAgICAgIGluaXRpYWwucGFyc2UgPSBpbml0aWFsLnBhcnNlLmJpbmQoYXBpKTsNCiAgICAgICAgaW5pdGlhbC5yZW5kZXIgPSBpbml0aWFsLnJlbmRlci5iaW5kKGFwaSk7DQogICAgICAgIHJldHVybiBhcGk7DQogICAgfQoKICAgIC8qIGdsb2JhbCB3aW5kb3csIFhNTEh0dHBSZXF1ZXN0ICovDQogICAgdmFyIG9wdGlvbnMkMTsNCiAgICB2YXIgbG9nZ2VyOw0KICAgIHZhciBmaWxlQ2FjaGUgPSB7fTsNCiAgICAvLyBUT0RPUyAtIG1vdmUgbG9nIHNvbWV3aGVyZS4gcGF0aERpZmYgYW5kIGRvaW5nIHNvbWV0aGluZyBzaW1pbGFyIGluIG5vZGUuIHVzZSBwYXRoRGlmZiBpbiB0aGUgb3RoZXIgYnJvd3NlciBmaWxlIGZvciB0aGUgaW5pdGlhbCBsb2FkDQogICAgdmFyIEZpbGVNYW5hZ2VyID0gZnVuY3Rpb24gKCkgeyB9Ow0KICAgIEZpbGVNYW5hZ2VyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IEFic3RyYWN0RmlsZU1hbmFnZXIoKSwgew0KICAgICAgICBhbHdheXNNYWtlUGF0aHNBYnNvbHV0ZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0sDQogICAgICAgIGpvaW46IGZ1bmN0aW9uIChiYXNlUGF0aCwgbGF0ZXJQYXRoKSB7DQogICAgICAgICAgICBpZiAoIWJhc2VQYXRoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGxhdGVyUGF0aDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RVcmxQYXJ0cyhsYXRlclBhdGgsIGJhc2VQYXRoKS5wYXRoOw0KICAgICAgICB9LA0KICAgICAgICBkb1hIUjogZnVuY3Rpb24gKHVybCwgdHlwZSwgY2FsbGJhY2ssIGVycmJhY2spIHsNCiAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsNCiAgICAgICAgICAgIHZhciBhc3luYyA9IG9wdGlvbnMkMS5pc0ZpbGVQcm90b2NvbCA/IG9wdGlvbnMkMS5maWxlQXN5bmMgOiB0cnVlOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiB4aHIub3ZlcnJpZGVNaW1lVHlwZSA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2NzcycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJYSFI6IEdldHRpbmcgJyIgKyB1cmwgKyAiJyIpOw0KICAgICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgYXN5bmMpOw0KICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsIHR5cGUgfHwgJ3RleHQveC1sZXNzLCB0ZXh0L2NzczsgcT0wLjksICovKjsgcT0wLjUnKTsNCiAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOw0KICAgICAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UoeGhyLCBjYWxsYmFjaywgZXJyYmFjaykgew0KICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhoci5yZXNwb25zZVRleHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignTGFzdC1Nb2RpZmllZCcpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVycmJhY2sgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayh4aHIuc3RhdHVzLCB1cmwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChvcHRpb25zJDEuaXNGaWxlUHJvdG9jb2wgJiYgIW9wdGlvbnMkMS5maWxlQXN5bmMpIHsNCiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMCB8fCAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soeGhyLnJlc3BvbnNlVGV4dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBlcnJiYWNrKHhoci5zdGF0dXMsIHVybCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoYXN5bmMpIHsNCiAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT0gNCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UoeGhyLCBjYWxsYmFjaywgZXJyYmFjayk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UoeGhyLCBjYWxsYmFjaywgZXJyYmFjayk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIHN1cHBvcnRzOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfSwNCiAgICAgICAgY2xlYXJGaWxlQ2FjaGU6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGZpbGVDYWNoZSA9IHt9Ow0KICAgICAgICB9LA0KICAgICAgICBsb2FkRmlsZTogZnVuY3Rpb24gKGZpbGVuYW1lLCBjdXJyZW50RGlyZWN0b3J5LCBvcHRpb25zLCBlbnZpcm9ubWVudCkgew0KICAgICAgICAgICAgLy8gVE9ETzogQWRkIHByZWZpeCBzdXBwb3J0IGxpa2UgbGVzcy1ub2RlPw0KICAgICAgICAgICAgLy8gV2hhdCBhYm91dCBtdWx0aXBsZSBwYXRocz8NCiAgICAgICAgICAgIGlmIChjdXJyZW50RGlyZWN0b3J5ICYmICF0aGlzLmlzUGF0aEFic29sdXRlKGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gY3VycmVudERpcmVjdG9yeSArIGZpbGVuYW1lOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmlsZW5hbWUgPSBvcHRpb25zLmV4dCA/IHRoaXMudHJ5QXBwZW5kRXh0ZW5zaW9uKGZpbGVuYW1lLCBvcHRpb25zLmV4dCkgOiBmaWxlbmFtZTsNCiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9Ow0KICAgICAgICAgICAgLy8gc2hlZXQgbWF5IGJlIHNldCB0byB0aGUgc3R5bGVzaGVldCBmb3IgdGhlIGluaXRpYWwgbG9hZCBvciBhIGNvbGxlY3Rpb24gb2YgcHJvcGVydGllcyBpbmNsdWRpbmcNCiAgICAgICAgICAgIC8vIHNvbWUgY29udGV4dCB2YXJpYWJsZXMgZm9yIGltcG9ydHMNCiAgICAgICAgICAgIHZhciBocmVmUGFydHMgPSB0aGlzLmV4dHJhY3RVcmxQYXJ0cyhmaWxlbmFtZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpOw0KICAgICAgICAgICAgdmFyIGhyZWYgPSBocmVmUGFydHMudXJsOw0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy51c2VGaWxlQ2FjaGUgJiYgZmlsZUNhY2hlW2hyZWZdKSB7DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVzc1RleHQgPSBmaWxlQ2FjaGVbaHJlZl07DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IGNvbnRlbnRzOiBsZXNzVGV4dCwgZmlsZW5hbWU6IGhyZWYsIHdlYkluZm86IHsgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZSgpIH0gfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoeyBmaWxlbmFtZTogaHJlZiwgbWVzc2FnZTogIkVycm9yIGxvYWRpbmcgZmlsZSAiICsgaHJlZiArICIgZXJyb3Igd2FzICIgKyBlLm1lc3NhZ2UgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgc2VsZi5kb1hIUihocmVmLCBvcHRpb25zLm1pbWUsIGZ1bmN0aW9uIGRvWEhSQ2FsbGJhY2soZGF0YSwgbGFzdE1vZGlmaWVkKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIHBlciBmaWxlIGNhY2hlDQogICAgICAgICAgICAgICAgICAgIGZpbGVDYWNoZVtocmVmXSA9IGRhdGE7DQogICAgICAgICAgICAgICAgICAgIC8vIFVzZSByZW1vdGUgY29weSAocmUtcGFyc2UpDQogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBjb250ZW50czogZGF0YSwgZmlsZW5hbWU6IGhyZWYsIHdlYkluZm86IHsgbGFzdE1vZGlmaWVkOiBsYXN0TW9kaWZpZWQgfSB9KTsNCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiBkb1hIUkVycm9yKHN0YXR1cywgdXJsKSB7DQogICAgICAgICAgICAgICAgICAgIHJlamVjdCh7IHR5cGU6ICdGaWxlJywgbWVzc2FnZTogIiciICsgdXJsICsgIicgd2Fzbid0IGZvdW5kICgiICsgc3RhdHVzICsgIikiLCBocmVmOiBocmVmIH0pOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICB9KTsNCiAgICB2YXIgRk0gPSAoZnVuY3Rpb24gKG9wdHMsIGxvZykgew0KICAgICAgICBvcHRpb25zJDEgPSBvcHRzOw0KICAgICAgICBsb2dnZXIgPSBsb2c7DQogICAgICAgIHJldHVybiBGaWxlTWFuYWdlcjsNCiAgICB9KTsKCiAgICAvLyBUT0RPOiBBZGQgdGVzdHMgZm9yIGJyb3dzZXIgQHBsdWdpbg0KICAgIC8qKg0KICAgICAqIEJyb3dzZXIgUGx1Z2luIExvYWRlcg0KICAgICAqLw0KICAgIHZhciBQbHVnaW5Mb2FkZXIgPSBmdW5jdGlvbiAobGVzcykgew0KICAgICAgICB0aGlzLmxlc3MgPSBsZXNzOw0KICAgICAgICAvLyBTaG91bGQgd2Ugc2hpbSB0aGlzLnJlcXVpcmUgZm9yIGJyb3dzZXI/IFByb2JhYmx5IG5vdD8NCiAgICB9Ow0KICAgIFBsdWdpbkxvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBBYnN0cmFjdFBsdWdpbkxvYWRlcigpLCB7DQogICAgICAgIGxvYWRQbHVnaW46IGZ1bmN0aW9uIChmaWxlbmFtZSwgYmFzZVBhdGgsIGNvbnRleHQsIGVudmlyb25tZW50LCBmaWxlTWFuYWdlcikgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHsNCiAgICAgICAgICAgICAgICBmaWxlTWFuYWdlci5sb2FkRmlsZShmaWxlbmFtZSwgYmFzZVBhdGgsIGNvbnRleHQsIGVudmlyb25tZW50KQ0KICAgICAgICAgICAgICAgICAgICAudGhlbihmdWxmaWxsKS5jYXRjaChyZWplY3QpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICB9KTsKCiAgICB2YXIgTG9nTGlzdGVuZXIgPSAoZnVuY3Rpb24gKGxlc3MsIG9wdGlvbnMpIHsNCiAgICAgICAgdmFyIGxvZ0xldmVsX2RlYnVnID0gNDsNCiAgICAgICAgdmFyIGxvZ0xldmVsX2luZm8gPSAzOw0KICAgICAgICB2YXIgbG9nTGV2ZWxfd2FybiA9IDI7DQogICAgICAgIHZhciBsb2dMZXZlbF9lcnJvciA9IDE7DQogICAgICAgIC8vIFRoZSBhbW91bnQgb2YgbG9nZ2luZyBpbiB0aGUgamF2YXNjcmlwdCBjb25zb2xlLg0KICAgICAgICAvLyAzIC0gRGVidWcsIGluZm9ybWF0aW9uIGFuZCBlcnJvcnMNCiAgICAgICAgLy8gMiAtIEluZm9ybWF0aW9uIGFuZCBlcnJvcnMNCiAgICAgICAgLy8gMSAtIEVycm9ycw0KICAgICAgICAvLyAwIC0gTm9uZQ0KICAgICAgICAvLyBEZWZhdWx0cyB0byAyDQogICAgICAgIG9wdGlvbnMubG9nTGV2ZWwgPSB0eXBlb2Ygb3B0aW9ucy5sb2dMZXZlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLmxvZ0xldmVsIDogKG9wdGlvbnMuZW52ID09PSAnZGV2ZWxvcG1lbnQnID8gbG9nTGV2ZWxfaW5mbyA6IGxvZ0xldmVsX2Vycm9yKTsNCiAgICAgICAgaWYgKCFvcHRpb25zLmxvZ2dlcnMpIHsNCiAgICAgICAgICAgIG9wdGlvbnMubG9nZ2VycyA9IFt7DQogICAgICAgICAgICAgICAgICAgIGRlYnVnOiBmdW5jdGlvbiAobXNnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sb2dMZXZlbCA+PSBsb2dMZXZlbF9kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIGluZm86IGZ1bmN0aW9uIChtc2cpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxvZ0xldmVsID49IGxvZ0xldmVsX2luZm8pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICB3YXJuOiBmdW5jdGlvbiAobXNnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sb2dMZXZlbCA+PSBsb2dMZXZlbF93YXJuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1zZyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAobXNnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sb2dMZXZlbCA+PSBsb2dMZXZlbF9lcnJvcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH1dOw0KICAgICAgICB9DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5sb2dnZXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBsZXNzLmxvZ2dlci5hZGRMaXN0ZW5lcihvcHRpb25zLmxvZ2dlcnNbaV0pOw0KICAgICAgICB9DQogICAgfSk7CgogICAgdmFyIEVycm9yUmVwb3J0aW5nID0gKGZ1bmN0aW9uICh3aW5kb3csIGxlc3MsIG9wdGlvbnMpIHsNCiAgICAgICAgZnVuY3Rpb24gZXJyb3JIVE1MKGUsIHJvb3RIcmVmKSB7DQogICAgICAgICAgICB2YXIgaWQgPSAibGVzcy1lcnJvci1tZXNzYWdlOiIgKyBleHRyYWN0SWQocm9vdEhyZWYgfHwgJycpOw0KICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJzxsaT48bGFiZWw+e2xpbmV9PC9sYWJlbD48cHJlIGNsYXNzPSJ7Y2xhc3N9Ij57Y29udGVudH08L3ByZT48L2xpPic7DQogICAgICAgICAgICB2YXIgZWxlbSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgICAgIHZhciB0aW1lcjsNCiAgICAgICAgICAgIHZhciBjb250ZW50Ow0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgdmFyIGZpbGVuYW1lID0gZS5maWxlbmFtZSB8fCByb290SHJlZjsNCiAgICAgICAgICAgIHZhciBmaWxlbmFtZU5vUGF0aCA9IGZpbGVuYW1lLm1hdGNoKC8oW15cL10rKFw/LiopPykkLylbMV07DQogICAgICAgICAgICBlbGVtLmlkID0gaWQ7DQogICAgICAgICAgICBlbGVtLmNsYXNzTmFtZSA9ICdsZXNzLWVycm9yLW1lc3NhZ2UnOw0KICAgICAgICAgICAgY29udGVudCA9ICI8aDM+IiArIChlLnR5cGUgfHwgJ1N5bnRheCcpICsgIkVycm9yOiAiICsgKGUubWVzc2FnZSB8fCAnVGhlcmUgaXMgYW4gZXJyb3IgaW4geW91ciAubGVzcyBmaWxlJykgKw0KICAgICAgICAgICAgICAgICgiPC9oMz48cD5pbiA8YSBocmVmPVwiIiArIGZpbGVuYW1lICsgIlwiPiIgKyBmaWxlbmFtZU5vUGF0aCArICI8L2E+ICIpOw0KICAgICAgICAgICAgdmFyIGVycm9ybGluZSA9IGZ1bmN0aW9uIChlLCBpLCBjbGFzc25hbWUpIHsNCiAgICAgICAgICAgICAgICBpZiAoZS5leHRyYWN0W2ldICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2godGVtcGxhdGUucmVwbGFjZSgvXHtsaW5lXH0vLCAocGFyc2VJbnQoZS5saW5lLCAxMCkgfHwgMCkgKyAoaSAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1x7Y2xhc3NcfS8sIGNsYXNzbmFtZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9ce2NvbnRlbnRcfS8sIGUuZXh0cmFjdFtpXSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBpZiAoZS5saW5lKSB7DQogICAgICAgICAgICAgICAgZXJyb3JsaW5lKGUsIDAsICcnKTsNCiAgICAgICAgICAgICAgICBlcnJvcmxpbmUoZSwgMSwgJ2xpbmUnKTsNCiAgICAgICAgICAgICAgICBlcnJvcmxpbmUoZSwgMiwgJycpOw0KICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gIm9uIGxpbmUgIiArIGUubGluZSArICIsIGNvbHVtbiAiICsgKGUuY29sdW1uICsgMSkgKyAiOjwvcD48dWw+IiArIGVycm9ycy5qb2luKCcnKSArICI8L3VsPiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZS5zdGFjayAmJiAoZS5leHRyYWN0IHx8IG9wdGlvbnMubG9nTGV2ZWwgPj0gNCkpIHsNCiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICI8YnIvPlN0YWNrIFRyYWNlPC9iciAvPiIgKyBlLnN0YWNrLnNwbGl0KCdcbicpLnNsaWNlKDEpLmpvaW4oJzxici8+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbGVtLmlubmVySFRNTCA9IGNvbnRlbnQ7DQogICAgICAgICAgICAvLyBDU1MgZm9yIGVycm9yIG1lc3NhZ2VzDQogICAgICAgICAgICBicm93c2VyLmNyZWF0ZUNTUyh3aW5kb3cuZG9jdW1lbnQsIFsNCiAgICAgICAgICAgICAgICAnLmxlc3MtZXJyb3ItbWVzc2FnZSB1bCwgLmxlc3MtZXJyb3ItbWVzc2FnZSBsaSB7JywNCiAgICAgICAgICAgICAgICAnbGlzdC1zdHlsZS10eXBlOiBub25lOycsDQogICAgICAgICAgICAgICAgJ21hcmdpbi1yaWdodDogMTVweDsnLA0KICAgICAgICAgICAgICAgICdwYWRkaW5nOiA0cHggMDsnLA0KICAgICAgICAgICAgICAgICdtYXJnaW46IDA7JywNCiAgICAgICAgICAgICAgICAnfScsDQogICAgICAgICAgICAgICAgJy5sZXNzLWVycm9yLW1lc3NhZ2UgbGFiZWwgeycsDQogICAgICAgICAgICAgICAgJ2ZvbnQtc2l6ZTogMTJweDsnLA0KICAgICAgICAgICAgICAgICdtYXJnaW4tcmlnaHQ6IDE1cHg7JywNCiAgICAgICAgICAgICAgICAncGFkZGluZzogNHB4IDA7JywNCiAgICAgICAgICAgICAgICAnY29sb3I6ICNjYzc3Nzc7JywNCiAgICAgICAgICAgICAgICAnfScsDQogICAgICAgICAgICAgICAgJy5sZXNzLWVycm9yLW1lc3NhZ2UgcHJlIHsnLA0KICAgICAgICAgICAgICAgICdjb2xvcjogI2RkNjY2NjsnLA0KICAgICAgICAgICAgICAgICdwYWRkaW5nOiA0cHggMDsnLA0KICAgICAgICAgICAgICAgICdtYXJnaW46IDA7JywNCiAgICAgICAgICAgICAgICAnZGlzcGxheTogaW5saW5lLWJsb2NrOycsDQogICAgICAgICAgICAgICAgJ30nLA0KICAgICAgICAgICAgICAgICcubGVzcy1lcnJvci1tZXNzYWdlIHByZS5saW5lIHsnLA0KICAgICAgICAgICAgICAgICdjb2xvcjogI2ZmMDAwMDsnLA0KICAgICAgICAgICAgICAgICd9JywNCiAgICAgICAgICAgICAgICAnLmxlc3MtZXJyb3ItbWVzc2FnZSBoMyB7JywNCiAgICAgICAgICAgICAgICAnZm9udC1zaXplOiAyMHB4OycsDQogICAgICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0OiBib2xkOycsDQogICAgICAgICAgICAgICAgJ3BhZGRpbmc6IDE1cHggMCA1cHggMDsnLA0KICAgICAgICAgICAgICAgICdtYXJnaW46IDA7JywNCiAgICAgICAgICAgICAgICAnfScsDQogICAgICAgICAgICAgICAgJy5sZXNzLWVycm9yLW1lc3NhZ2UgYSB7JywNCiAgICAgICAgICAgICAgICAnY29sb3I6ICMxMGEnLA0KICAgICAgICAgICAgICAgICd9JywNCiAgICAgICAgICAgICAgICAnLmxlc3MtZXJyb3ItbWVzc2FnZSAuZXJyb3IgeycsDQogICAgICAgICAgICAgICAgJ2NvbG9yOiByZWQ7JywNCiAgICAgICAgICAgICAgICAnZm9udC13ZWlnaHQ6IGJvbGQ7JywNCiAgICAgICAgICAgICAgICAncGFkZGluZy1ib3R0b206IDJweDsnLA0KICAgICAgICAgICAgICAgICdib3JkZXItYm90dG9tOiAxcHggZGFzaGVkIHJlZDsnLA0KICAgICAgICAgICAgICAgICd9Jw0KICAgICAgICAgICAgXS5qb2luKCdcbicpLCB7IHRpdGxlOiAnZXJyb3ItbWVzc2FnZScgfSk7DQogICAgICAgICAgICBlbGVtLnN0eWxlLmNzc1RleHQgPSBbDQogICAgICAgICAgICAgICAgJ2ZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgJ2JvcmRlcjogMXB4IHNvbGlkICNlMDAnLA0KICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlJywNCiAgICAgICAgICAgICAgICAnYm9yZGVyLXJhZGl1czogNXB4JywNCiAgICAgICAgICAgICAgICAnLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHgnLA0KICAgICAgICAgICAgICAgICctbW96LWJvcmRlci1yYWRpdXM6IDVweCcsDQogICAgICAgICAgICAgICAgJ2NvbG9yOiAjZTAwJywNCiAgICAgICAgICAgICAgICAncGFkZGluZzogMTVweCcsDQogICAgICAgICAgICAgICAgJ21hcmdpbi1ib3R0b206IDE1cHgnDQogICAgICAgICAgICBdLmpvaW4oJzsnKTsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudiA9PT0gJ2RldmVsb3BtZW50Jykgew0KICAgICAgICAgICAgICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7DQogICAgICAgICAgICAgICAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LnJlcGxhY2VDaGlsZChlbGVtLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5pbnNlcnRCZWZvcmUoZWxlbSwgYm9keS5maXJzdENoaWxkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwgMTApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZ1bmN0aW9uIHJlbW92ZUVycm9ySFRNTChwYXRoKSB7DQogICAgICAgICAgICB2YXIgbm9kZSA9IHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGVzcy1lcnJvci1tZXNzYWdlOiIgKyBleHRyYWN0SWQocGF0aCkpOw0KICAgICAgICAgICAgaWYgKG5vZGUpIHsNCiAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlRXJyb3IocGF0aCkgew0KICAgICAgICAgICAgaWYgKCFvcHRpb25zLmVycm9yUmVwb3J0aW5nIHx8IG9wdGlvbnMuZXJyb3JSZXBvcnRpbmcgPT09ICdodG1sJykgew0KICAgICAgICAgICAgICAgIHJlbW92ZUVycm9ySFRNTChwYXRoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZXJyb3JSZXBvcnRpbmcgPT09ICdjb25zb2xlJykgOw0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuZXJyb3JSZXBvcnRpbmcgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgICAgICBvcHRpb25zLmVycm9yUmVwb3J0aW5nKCdyZW1vdmUnLCBwYXRoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmdW5jdGlvbiBlcnJvckNvbnNvbGUoZSwgcm9vdEhyZWYpIHsNCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICd7bGluZX0ge2NvbnRlbnR9JzsNCiAgICAgICAgICAgIHZhciBmaWxlbmFtZSA9IGUuZmlsZW5hbWUgfHwgcm9vdEhyZWY7DQogICAgICAgICAgICB2YXIgZXJyb3JzID0gW107DQogICAgICAgICAgICB2YXIgY29udGVudCA9IChlLnR5cGUgfHwgJ1N5bnRheCcpICsgIkVycm9yOiAiICsgKGUubWVzc2FnZSB8fCAnVGhlcmUgaXMgYW4gZXJyb3IgaW4geW91ciAubGVzcyBmaWxlJykgKyAiIGluICIgKyBmaWxlbmFtZTsNCiAgICAgICAgICAgIHZhciBlcnJvcmxpbmUgPSBmdW5jdGlvbiAoZSwgaSwgY2xhc3NuYW1lKSB7DQogICAgICAgICAgICAgICAgaWYgKGUuZXh0cmFjdFtpXSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHRlbXBsYXRlLnJlcGxhY2UoL1x7bGluZVx9LywgKHBhcnNlSW50KGUubGluZSwgMTApIHx8IDApICsgKGkgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9ce2NsYXNzXH0vLCBjbGFzc25hbWUpDQogICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXHtjb250ZW50XH0vLCBlLmV4dHJhY3RbaV0pKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKGUubGluZSkgew0KICAgICAgICAgICAgICAgIGVycm9ybGluZShlLCAwLCAnJyk7DQogICAgICAgICAgICAgICAgZXJyb3JsaW5lKGUsIDEsICdsaW5lJyk7DQogICAgICAgICAgICAgICAgZXJyb3JsaW5lKGUsIDIsICcnKTsNCiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICIgb24gbGluZSAiICsgZS5saW5lICsgIiwgY29sdW1uICIgKyAoZS5jb2x1bW4gKyAxKSArICI6XG4iICsgZXJyb3JzLmpvaW4oJ1xuJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZS5zdGFjayAmJiAoZS5leHRyYWN0IHx8IG9wdGlvbnMubG9nTGV2ZWwgPj0gNCkpIHsNCiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICJcblN0YWNrIFRyYWNlXG4iICsgZS5zdGFjazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxlc3MubG9nZ2VyLmVycm9yKGNvbnRlbnQpOw0KICAgICAgICB9DQogICAgICAgIGZ1bmN0aW9uIGVycm9yKGUsIHJvb3RIcmVmKSB7DQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZXJyb3JSZXBvcnRpbmcgfHwgb3B0aW9ucy5lcnJvclJlcG9ydGluZyA9PT0gJ2h0bWwnKSB7DQogICAgICAgICAgICAgICAgZXJyb3JIVE1MKGUsIHJvb3RIcmVmKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZXJyb3JSZXBvcnRpbmcgPT09ICdjb25zb2xlJykgew0KICAgICAgICAgICAgICAgIGVycm9yQ29uc29sZShlLCByb290SHJlZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5lcnJvclJlcG9ydGluZyA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgIG9wdGlvbnMuZXJyb3JSZXBvcnRpbmcoJ2FkZCcsIGUsIHJvb3RIcmVmKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgYWRkOiBlcnJvciwNCiAgICAgICAgICAgIHJlbW92ZTogcmVtb3ZlRXJyb3INCiAgICAgICAgfTsNCiAgICB9KTsKCiAgICAvLyBDYWNoZSBzeXN0ZW0gaXMgYSBiaXQgb3V0ZGF0ZWQgYW5kIGNvdWxkIGRvIHdpdGggd29yaw0KICAgIHZhciBDYWNoZSA9IChmdW5jdGlvbiAod2luZG93LCBvcHRpb25zLCBsb2dnZXIpIHsNCiAgICAgICAgdmFyIGNhY2hlID0gbnVsbDsNCiAgICAgICAgaWYgKG9wdGlvbnMuZW52ICE9PSAnZGV2ZWxvcG1lbnQnKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGNhY2hlID0gKHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykgPyBudWxsIDogd2luZG93LmxvY2FsU3RvcmFnZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChfKSB7IH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgc2V0Q1NTOiBmdW5jdGlvbiAocGF0aCwgbGFzdE1vZGlmaWVkLCBtb2RpZnlWYXJzLCBzdHlsZXMpIHsNCiAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsNCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInNhdmluZyAiICsgcGF0aCArICIgdG8gY2FjaGUuIik7DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXRJdGVtKHBhdGgsIHN0eWxlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXRJdGVtKHBhdGggKyAiOnRpbWVzdGFtcCIsIGxhc3RNb2RpZmllZCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZ5VmFycykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldEl0ZW0ocGF0aCArICI6dmFycyIsIEpTT04uc3RyaW5naWZ5KG1vZGlmeVZhcnMpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGNvdWxkIGRvIHdpdGggYWRkaW5nIG1vcmUgcm9idXN0IGVycm9yIGhhbmRsaW5nDQogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImZhaWxlZCB0byBzYXZlIFwiIiArIHBhdGggKyAiXCIgdG8gbG9jYWwgc3RvcmFnZSBmb3IgY2FjaGluZy4iKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBnZXRDU1M6IGZ1bmN0aW9uIChwYXRoLCB3ZWJJbmZvLCBtb2RpZnlWYXJzKSB7DQogICAgICAgICAgICAgICAgdmFyIGNzcyA9IGNhY2hlICYmIGNhY2hlLmdldEl0ZW0ocGF0aCk7DQogICAgICAgICAgICAgICAgdmFyIHRpbWVzdGFtcCA9IGNhY2hlICYmIGNhY2hlLmdldEl0ZW0ocGF0aCArICI6dGltZXN0YW1wIik7DQogICAgICAgICAgICAgICAgdmFyIHZhcnMgPSBjYWNoZSAmJiBjYWNoZS5nZXRJdGVtKHBhdGggKyAiOnZhcnMiKTsNCiAgICAgICAgICAgICAgICBtb2RpZnlWYXJzID0gbW9kaWZ5VmFycyB8fCB7fTsNCiAgICAgICAgICAgICAgICB2YXJzID0gdmFycyB8fCAie30iOyAvLyBpZiBub3Qgc2V0LCB0cmVhdCBhcyB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhbiBlbXB0eSBvYmplY3QNCiAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wICYmIHdlYkluZm8ubGFzdE1vZGlmaWVkICYmDQogICAgICAgICAgICAgICAgICAgIChuZXcgRGF0ZSh3ZWJJbmZvLmxhc3RNb2RpZmllZCkudmFsdWVPZigpID09PQ0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUodGltZXN0YW1wKS52YWx1ZU9mKCkpICYmDQogICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1vZGlmeVZhcnMpID09PSB2YXJzKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIFVzZSBsb2NhbCBjb3B5DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjc3M7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH0pOwoKICAgIHZhciBJbWFnZVNpemUgPSAoZnVuY3Rpb24gKCkgew0KICAgICAgICBmdW5jdGlvbiBpbWFnZVNpemUoKSB7DQogICAgICAgICAgICB0aHJvdyB7DQogICAgICAgICAgICAgICAgdHlwZTogJ1J1bnRpbWUnLA0KICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbWFnZSBzaXplIGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIHZlcnNpb24gb2YgbGVzcycNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgdmFyIGltYWdlRnVuY3Rpb25zID0gew0KICAgICAgICAgICAgJ2ltYWdlLXNpemUnOiBmdW5jdGlvbiAoZmlsZVBhdGhOb2RlKSB7DQogICAgICAgICAgICAgICAgaW1hZ2VTaXplKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICdpbWFnZS13aWR0aCc6IGZ1bmN0aW9uIChmaWxlUGF0aE5vZGUpIHsNCiAgICAgICAgICAgICAgICBpbWFnZVNpemUoKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgJ2ltYWdlLWhlaWdodCc6IGZ1bmN0aW9uIChmaWxlUGF0aE5vZGUpIHsNCiAgICAgICAgICAgICAgICBpbWFnZVNpemUoKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIGZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUoaW1hZ2VGdW5jdGlvbnMpOw0KICAgIH0pOwoKICAgIC8vDQogICAgdmFyIHJvb3QgPSAoZnVuY3Rpb24gKHdpbmRvdywgb3B0aW9ucykgew0KICAgICAgICB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7DQogICAgICAgIHZhciBsZXNzID0gbGVzc1Jvb3QoKTsNCiAgICAgICAgbGVzcy5vcHRpb25zID0gb3B0aW9uczsNCiAgICAgICAgdmFyIGVudmlyb25tZW50ID0gbGVzcy5lbnZpcm9ubWVudDsNCiAgICAgICAgdmFyIEZpbGVNYW5hZ2VyID0gRk0ob3B0aW9ucywgbGVzcy5sb2dnZXIpOw0KICAgICAgICB2YXIgZmlsZU1hbmFnZXIgPSBuZXcgRmlsZU1hbmFnZXIoKTsNCiAgICAgICAgZW52aXJvbm1lbnQuYWRkRmlsZU1hbmFnZXIoZmlsZU1hbmFnZXIpOw0KICAgICAgICBsZXNzLkZpbGVNYW5hZ2VyID0gRmlsZU1hbmFnZXI7DQogICAgICAgIGxlc3MuUGx1Z2luTG9hZGVyID0gUGx1Z2luTG9hZGVyOw0KICAgICAgICBMb2dMaXN0ZW5lcihsZXNzLCBvcHRpb25zKTsNCiAgICAgICAgdmFyIGVycm9ycyA9IEVycm9yUmVwb3J0aW5nKHdpbmRvdywgbGVzcywgb3B0aW9ucyk7DQogICAgICAgIHZhciBjYWNoZSA9IGxlc3MuY2FjaGUgPSBvcHRpb25zLmNhY2hlIHx8IENhY2hlKHdpbmRvdywgb3B0aW9ucywgbGVzcy5sb2dnZXIpOw0KICAgICAgICBJbWFnZVNpemUobGVzcy5lbnZpcm9ubWVudCk7DQogICAgICAgIC8vIFNldHVwIHVzZXIgZnVuY3Rpb25zIC0gRGVwcmVjYXRlPw0KICAgICAgICBpZiAob3B0aW9ucy5mdW5jdGlvbnMpIHsNCiAgICAgICAgICAgIGxlc3MuZnVuY3Rpb25zLmZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUob3B0aW9ucy5mdW5jdGlvbnMpOw0KICAgICAgICB9DQogICAgICAgIHZhciB0eXBlUGF0dGVybiA9IC9edGV4dFwvKHgtKT9sZXNzJC87DQogICAgICAgIGZ1bmN0aW9uIGNsb25lKG9iaikgew0KICAgICAgICAgICAgdmFyIGNsb25lZCA9IHt9Ow0KICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsNCiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7DQogICAgICAgICAgICAgICAgICAgIGNsb25lZFtwcm9wXSA9IG9ialtwcm9wXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY2xvbmVkOw0KICAgICAgICB9DQogICAgICAgIC8vIG9ubHkgcmVhbGx5IG5lZWRlZCBmb3IgcGhhbnRvbQ0KICAgICAgICBmdW5jdGlvbiBiaW5kKGZ1bmMsIHRoaXNBcmcpIHsNCiAgICAgICAgICAgIHZhciBjdXJyeUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOw0KICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGN1cnJ5QXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIGZ1bmN0aW9uIGxvYWRTdHlsZXMobW9kaWZ5VmFycykgew0KICAgICAgICAgICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdHlsZScpOw0KICAgICAgICAgICAgdmFyIHN0eWxlOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAoc3R5bGUudHlwZS5tYXRjaCh0eXBlUGF0dGVybikpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlT3B0aW9ucyA9IGNsb25lKG9wdGlvbnMpOw0KICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZU9wdGlvbnMubW9kaWZ5VmFycyA9IG1vZGlmeVZhcnM7DQogICAgICAgICAgICAgICAgICAgIHZhciBsZXNzVGV4dCA9IHN0eWxlLmlubmVySFRNTCB8fCAnJzsNCiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPcHRpb25zLmZpbGVuYW1lID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZi5yZXBsYWNlKC8jLiokLywgJycpOw0KICAgICAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6dHJ1ZSAqLw0KICAgICAgICAgICAgICAgICAgICAvLyB1c2UgY2xvc3VyZSB0byBzdG9yZSBjdXJyZW50IHN0eWxlDQogICAgICAgICAgICAgICAgICAgIGxlc3MucmVuZGVyKGxlc3NUZXh0LCBpbnN0YW5jZU9wdGlvbnMsIGJpbmQoZnVuY3Rpb24gKHN0eWxlLCBlLCByZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChlLCAnaW5saW5lJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc3R5bGVTaGVldCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXN1bHQuY3NzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gcmVzdWx0LmNzczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sIG51bGwsIHN0eWxlKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZ1bmN0aW9uIGxvYWRTdHlsZVNoZWV0KHNoZWV0LCBjYWxsYmFjaywgcmVsb2FkLCByZW1haW5pbmcsIG1vZGlmeVZhcnMpIHsNCiAgICAgICAgICAgIHZhciBpbnN0YW5jZU9wdGlvbnMgPSBjbG9uZShvcHRpb25zKTsNCiAgICAgICAgICAgIGFkZERhdGFBdHRyKGluc3RhbmNlT3B0aW9ucywgc2hlZXQpOw0KICAgICAgICAgICAgaW5zdGFuY2VPcHRpb25zLm1pbWUgPSBzaGVldC50eXBlOw0KICAgICAgICAgICAgaWYgKG1vZGlmeVZhcnMpIHsNCiAgICAgICAgICAgICAgICBpbnN0YW5jZU9wdGlvbnMubW9kaWZ5VmFycyA9IG1vZGlmeVZhcnM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmdW5jdGlvbiBsb2FkSW5pdGlhbEZpbGVDYWxsYmFjayhsb2FkZWRGaWxlKSB7DQogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBsb2FkZWRGaWxlLmNvbnRlbnRzOw0KICAgICAgICAgICAgICAgIHZhciBwYXRoID0gbG9hZGVkRmlsZS5maWxlbmFtZTsNCiAgICAgICAgICAgICAgICB2YXIgd2ViSW5mbyA9IGxvYWRlZEZpbGUud2ViSW5mbzsNCiAgICAgICAgICAgICAgICB2YXIgbmV3RmlsZUluZm8gPSB7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3Rvcnk6IGZpbGVNYW5hZ2VyLmdldFBhdGgocGF0aCksDQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXRoLA0KICAgICAgICAgICAgICAgICAgICByb290RmlsZW5hbWU6IHBhdGgsDQogICAgICAgICAgICAgICAgICAgIHJld3JpdGVVcmxzOiBpbnN0YW5jZU9wdGlvbnMucmV3cml0ZVVybHMNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIG5ld0ZpbGVJbmZvLmVudHJ5UGF0aCA9IG5ld0ZpbGVJbmZvLmN1cnJlbnREaXJlY3Rvcnk7DQogICAgICAgICAgICAgICAgbmV3RmlsZUluZm8ucm9vdHBhdGggPSBpbnN0YW5jZU9wdGlvbnMucm9vdHBhdGggfHwgbmV3RmlsZUluZm8uY3VycmVudERpcmVjdG9yeTsNCiAgICAgICAgICAgICAgICBpZiAod2ViSW5mbykgew0KICAgICAgICAgICAgICAgICAgICB3ZWJJbmZvLnJlbWFpbmluZyA9IHJlbWFpbmluZzsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNzcyA9IGNhY2hlLmdldENTUyhwYXRoLCB3ZWJJbmZvLCBpbnN0YW5jZU9wdGlvbnMubW9kaWZ5VmFycyk7DQogICAgICAgICAgICAgICAgICAgIGlmICghcmVsb2FkICYmIGNzcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2ViSW5mby5sb2NhbCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBjc3MsIGRhdGEsIHNoZWV0LCB3ZWJJbmZvLCBwYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBUT0RPIGFkZCB0ZXN0cyBhcm91bmQgaG93IHRoaXMgYmVoYXZlcyB3aGVuIHJlbG9hZGluZw0KICAgICAgICAgICAgICAgIGVycm9ycy5yZW1vdmUocGF0aCk7DQogICAgICAgICAgICAgICAgaW5zdGFuY2VPcHRpb25zLnJvb3RGaWxlSW5mbyA9IG5ld0ZpbGVJbmZvOw0KICAgICAgICAgICAgICAgIGxlc3MucmVuZGVyKGRhdGEsIGluc3RhbmNlT3B0aW9ucywgZnVuY3Rpb24gKGUsIHJlc3VsdCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZS5ocmVmID0gcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0Q1NTKHNoZWV0LmhyZWYsIHdlYkluZm8ubGFzdE1vZGlmaWVkLCBpbnN0YW5jZU9wdGlvbnMubW9kaWZ5VmFycywgcmVzdWx0LmNzcyk7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQuY3NzLCBkYXRhLCBzaGVldCwgd2ViSW5mbywgcGF0aCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpbGVNYW5hZ2VyLmxvYWRGaWxlKHNoZWV0LmhyZWYsIG51bGwsIGluc3RhbmNlT3B0aW9ucywgZW52aXJvbm1lbnQpDQogICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGxvYWRlZEZpbGUpIHsNCiAgICAgICAgICAgICAgICBsb2FkSW5pdGlhbEZpbGVDYWxsYmFjayhsb2FkZWRGaWxlKTsNCiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpOw0KICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBmdW5jdGlvbiBsb2FkU3R5bGVTaGVldHMoY2FsbGJhY2ssIHJlbG9hZCwgbW9kaWZ5VmFycykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXNzLnNoZWV0cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGxvYWRTdHlsZVNoZWV0KGxlc3Muc2hlZXRzW2ldLCBjYWxsYmFjaywgcmVsb2FkLCBsZXNzLnNoZWV0cy5sZW5ndGggLSAoaSArIDEpLCBtb2RpZnlWYXJzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmdW5jdGlvbiBpbml0UnVubmluZ01vZGUoKSB7DQogICAgICAgICAgICBpZiAobGVzcy5lbnYgPT09ICdkZXZlbG9wbWVudCcpIHsNCiAgICAgICAgICAgICAgICBsZXNzLndhdGNoVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChsZXNzLndhdGNoTW9kZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1hbmFnZXIuY2xlYXJGaWxlQ2FjaGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRTdHlsZVNoZWV0cyhmdW5jdGlvbiAoZSwgY3NzLCBfLCBzaGVldCwgd2ViSW5mbykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoZSwgZS5ocmVmIHx8IHNoZWV0LmhyZWYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjc3MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlci5jcmVhdGVDU1Mod2luZG93LmRvY3VtZW50LCBjc3MsIHNoZWV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0sIG9wdGlvbnMucG9sbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8NCiAgICAgICAgLy8gV2F0Y2ggbW9kZQ0KICAgICAgICAvLw0KICAgICAgICBsZXNzLndhdGNoID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCFsZXNzLndhdGNoTW9kZSkgew0KICAgICAgICAgICAgICAgIGxlc3MuZW52ID0gJ2RldmVsb3BtZW50JzsNCiAgICAgICAgICAgICAgICBpbml0UnVubmluZ01vZGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMud2F0Y2hNb2RlID0gdHJ1ZTsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9Ow0KICAgICAgICBsZXNzLnVud2F0Y2ggPSBmdW5jdGlvbiAoKSB7IGNsZWFySW50ZXJ2YWwobGVzcy53YXRjaFRpbWVyKTsgdGhpcy53YXRjaE1vZGUgPSBmYWxzZTsgcmV0dXJuIGZhbHNlOyB9Ow0KICAgICAgICAvLw0KICAgICAgICAvLyBTeW5jaHJvbm91c2x5IGdldCBhbGwgPGxpbms+IHRhZ3Mgd2l0aCB0aGUgJ3JlbCcgYXR0cmlidXRlIHNldCB0bw0KICAgICAgICAvLyAic3R5bGVzaGVldC9sZXNzIi4NCiAgICAgICAgLy8NCiAgICAgICAgbGVzcy5yZWdpc3RlclN0eWxlc2hlZXRzSW1tZWRpYXRlbHkgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGluaycpOw0KICAgICAgICAgICAgbGVzcy5zaGVldHMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAobGlua3NbaV0ucmVsID09PSAnc3R5bGVzaGVldC9sZXNzJyB8fCAobGlua3NbaV0ucmVsLm1hdGNoKC9zdHlsZXNoZWV0LykgJiYNCiAgICAgICAgICAgICAgICAgICAgKGxpbmtzW2ldLnR5cGUubWF0Y2godHlwZVBhdHRlcm4pKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgbGVzcy5zaGVldHMucHVzaChsaW5rc1tpXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICAvLw0KICAgICAgICAvLyBBc3luY2hyb25vdXNseSBnZXQgYWxsIDxsaW5rPiB0YWdzIHdpdGggdGhlICdyZWwnIGF0dHJpYnV0ZSBzZXQgdG8NCiAgICAgICAgLy8gInN0eWxlc2hlZXQvbGVzcyIsIHJldHVybmluZyBhIFByb21pc2UuDQogICAgICAgIC8vDQogICAgICAgIGxlc3MucmVnaXN0ZXJTdHlsZXNoZWV0cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGxlc3MucmVnaXN0ZXJTdHlsZXNoZWV0c0ltbWVkaWF0ZWx5KCk7DQogICAgICAgICAgICByZXNvbHZlKCk7DQogICAgICAgIH0pOyB9Ow0KICAgICAgICAvLw0KICAgICAgICAvLyBXaXRoIHRoaXMgZnVuY3Rpb24sIGl0J3MgcG9zc2libGUgdG8gYWx0ZXIgdmFyaWFibGVzIGFuZCByZS1yZW5kZXINCiAgICAgICAgLy8gQ1NTIHdpdGhvdXQgcmVsb2FkaW5nIGxlc3MtZmlsZXMNCiAgICAgICAgLy8NCiAgICAgICAgbGVzcy5tb2RpZnlWYXJzID0gZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gbGVzcy5yZWZyZXNoKHRydWUsIHJlY29yZCwgZmFsc2UpOyB9Ow0KICAgICAgICBsZXNzLnJlZnJlc2ggPSBmdW5jdGlvbiAocmVsb2FkLCBtb2RpZnlWYXJzLCBjbGVhckZpbGVDYWNoZSkgew0KICAgICAgICAgICAgaWYgKChyZWxvYWQgfHwgY2xlYXJGaWxlQ2FjaGUpICYmIGNsZWFyRmlsZUNhY2hlICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgIGZpbGVNYW5hZ2VyLmNsZWFyRmlsZUNhY2hlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgICAgICAgIHZhciBzdGFydFRpbWU7DQogICAgICAgICAgICAgICAgdmFyIGVuZFRpbWU7DQogICAgICAgICAgICAgICAgdmFyIHRvdGFsTWlsbGlzZWNvbmRzOw0KICAgICAgICAgICAgICAgIHZhciByZW1haW5pbmdTaGVldHM7DQogICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gZW5kVGltZSA9IG5ldyBEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gU2V0IGNvdW50ZXIgZm9yIHJlbWFpbmluZyB1bnByb2Nlc3NlZCBzaGVldHMNCiAgICAgICAgICAgICAgICByZW1haW5pbmdTaGVldHMgPSBsZXNzLnNoZWV0cy5sZW5ndGg7DQogICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1NoZWV0cyA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBlbmRUaW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgdG90YWxNaWxsaXNlY29uZHMgPSBlbmRUaW1lIC0gc3RhcnRUaW1lOw0KICAgICAgICAgICAgICAgICAgICBsZXNzLmxvZ2dlci5pbmZvKCdMZXNzIGhhcyBmaW5pc2hlZCBhbmQgbm8gc2hlZXRzIHdlcmUgbG9hZGVkLicpOw0KICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogZW5kVGltZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTWlsbGlzZWNvbmRzOiB0b3RhbE1pbGxpc2Vjb25kcywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0czogbGVzcy5zaGVldHMubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gUmVsaWVzIG9uIGxlc3Muc2hlZXRzIGFycmF5LCBjYWxsYmFjayBzZWVtcyB0byBiZSBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBmb3IgZXZlcnkgZWxlbWVudCBvZiB0aGUgYXJyYXkNCiAgICAgICAgICAgICAgICAgICAgbG9hZFN0eWxlU2hlZXRzKGZ1bmN0aW9uIChlLCBjc3MsIF8sIHNoZWV0LCB3ZWJJbmZvKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoZSwgZS5ocmVmIHx8IHNoZWV0LmhyZWYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAod2ViSW5mby5sb2NhbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MubG9nZ2VyLmluZm8oIkxvYWRpbmcgIiArIHNoZWV0LmhyZWYgKyAiIGZyb20gY2FjaGUuIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzLmxvZ2dlci5pbmZvKCJSZW5kZXJlZCAiICsgc2hlZXQuaHJlZiArICIgc3VjY2Vzc2Z1bGx5LiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlci5jcmVhdGVDU1Mod2luZG93LmRvY3VtZW50LCBjc3MsIHNoZWV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MubG9nZ2VyLmluZm8oIkNTUyBmb3IgIiArIHNoZWV0LmhyZWYgKyAiIGdlbmVyYXRlZCBpbiAiICsgKG5ldyBEYXRlKCkgLSBlbmRUaW1lKSArICJtcyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgY29tcGxldGVkIHNoZWV0DQogICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTaGVldHMtLTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBsYXN0IHJlbWFpbmluZyBzaGVldCB3YXMgcHJvY2Vzc2VkIGFuZCB0aGVuIGNhbGwgdGhlIHByb21pc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdTaGVldHMgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbE1pbGxpc2Vjb25kcyA9IG5ldyBEYXRlKCkgLSBzdGFydFRpbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcy5sb2dnZXIuaW5mbygiTGVzcyBoYXMgZmluaXNoZWQuIENTUyBnZW5lcmF0ZWQgaW4gIiArIHRvdGFsTWlsbGlzZWNvbmRzICsgIm1zIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiBlbmRUaW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbE1pbGxpc2Vjb25kczogdG90YWxNaWxsaXNlY29uZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0czogbGVzcy5zaGVldHMubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgfSwgcmVsb2FkLCBtb2RpZnlWYXJzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbG9hZFN0eWxlcyhtb2RpZnlWYXJzKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9Ow0KICAgICAgICBsZXNzLnJlZnJlc2hTdHlsZXMgPSBsb2FkU3R5bGVzOw0KICAgICAgICByZXR1cm4gbGVzczsNCiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBLaWNrcyBvZmYgbGVzcyBhbmQgY29tcGlsZXMgYW55IHN0eWxlc2hlZXRzDQogICAgICogdXNlZCBpbiB0aGUgYnJvd3NlciBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIGxlc3MNCiAgICAgKiB0byBraWNrLXN0YXJ0IGxlc3MgdXNpbmcgdGhlIGJyb3dzZXIgYXBpDQogICAgICovDQogICAgdmFyIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucygpOw0KICAgIGlmICh3aW5kb3cubGVzcykgew0KICAgICAgICBmb3IgKHZhciBrZXkgaW4gd2luZG93Lmxlc3MpIHsNCiAgICAgICAgICAgIGlmICh3aW5kb3cubGVzcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQogICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gd2luZG93Lmxlc3Nba2V5XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBhZGREZWZhdWx0T3B0aW9ucyh3aW5kb3csIG9wdGlvbnMpOw0KICAgIG9wdGlvbnMucGx1Z2lucyA9IG9wdGlvbnMucGx1Z2lucyB8fCBbXTsNCiAgICBpZiAod2luZG93LkxFU1NfUExVR0lOUykgew0KICAgICAgICBvcHRpb25zLnBsdWdpbnMgPSBvcHRpb25zLnBsdWdpbnMuY29uY2F0KHdpbmRvdy5MRVNTX1BMVUdJTlMpOw0KICAgIH0NCiAgICB2YXIgbGVzcyA9IHJvb3Qod2luZG93LCBvcHRpb25zKTsNCiAgICB3aW5kb3cubGVzcyA9IGxlc3M7DQogICAgdmFyIGNzczsNCiAgICB2YXIgaGVhZDsNCiAgICB2YXIgc3R5bGU7DQogICAgLy8gQWx3YXlzIHJlc3RvcmUgcGFnZSB2aXNpYmlsaXR5DQogICAgZnVuY3Rpb24gcmVzb2x2ZU9yUmVqZWN0KGRhdGEpIHsNCiAgICAgICAgaWYgKGRhdGEuZmlsZW5hbWUpIHsNCiAgICAgICAgICAgIGNvbnNvbGUud2FybihkYXRhKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIW9wdGlvbnMuYXN5bmMpIHsNCiAgICAgICAgICAgIGhlYWQucmVtb3ZlQ2hpbGQoc3R5bGUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChvcHRpb25zLm9uUmVhZHkpIHsNCiAgICAgICAgaWYgKC8hd2F0Y2gvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhhc2gpKSB7DQogICAgICAgICAgICBsZXNzLndhdGNoKCk7DQogICAgICAgIH0NCiAgICAgICAgLy8gU2ltdWxhdGUgc3luY2hyb25vdXMgc3R5bGVzaGVldCBsb2FkaW5nIGJ5IGhpZGluZyBwYWdlIHJlbmRlcmluZw0KICAgICAgICBpZiAoIW9wdGlvbnMuYXN5bmMpIHsNCiAgICAgICAgICAgIGNzcyA9ICdib2R5IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50IH0nOw0KICAgICAgICAgICAgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsNCiAgICAgICAgICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICAgICAgICAgIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnOw0KICAgICAgICAgICAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHsNCiAgICAgICAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOw0KICAgICAgICB9DQogICAgICAgIGxlc3MucmVnaXN0ZXJTdHlsZXNoZWV0c0ltbWVkaWF0ZWx5KCk7DQogICAgICAgIGxlc3MucGFnZUxvYWRGaW5pc2hlZCA9IGxlc3MucmVmcmVzaChsZXNzLmVudiA9PT0gJ2RldmVsb3BtZW50JykudGhlbihyZXNvbHZlT3JSZWplY3QsIHJlc29sdmVPclJlamVjdCk7DQogICAgfQoKICAgIHJldHVybiBsZXNzOwoKfSkpKTsK"}]},{"name":"🔥持续更新🔥 CSDN广告完全过滤、人性化脚本优化:🆕 不用再登录了!让你体验令人惊喜的崭新CSDN。","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["*://*.csdn.net/*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["www.csdn.net"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1637743687985,"data":{}},"enabled":true,"position":11,"file_url":"https://greasyfork.org/scripts/378351-%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0-csdn%E5%B9%BF%E5%91%8A%E5%AE%8C%E5%85%A8%E8%BF%87%E6%BB%A4-%E4%BA%BA%E6%80%A7%E5%8C%96%E8%84%9A%E6%9C%AC%E4%BC%98%E5%8C%96-%E4%B8%8D%E7%94%A8%E5%86%8D%E7%99%BB%E5%BD%95%E4%BA%86-%E8%AE%A9%E4%BD%A0%E4%BD%93%E9%AA%8C%E4%BB%A4%E4%BA%BA%E6%83%8A%E5%96%9C%E7%9A%84%E5%B4%AD%E6%96%B0csdn/code/%F0%9F%94%A5%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%F0%9F%94%A5%20CSDN%E5%B9%BF%E5%91%8A%E5%AE%8C%E5%85%A8%E8%BF%87%E6%BB%A4%E3%80%81%E4%BA%BA%E6%80%A7%E5%8C%96%E8%84%9A%E6%9C%AC%E4%BC%98%E5%8C%96%EF%BC%9A%F0%9F%86%95%20%E4%B8%8D%E7%94%A8%E5%86%8D%E7%99%BB%E5%BD%95%E4%BA%86%EF%BC%81%E8%AE%A9%E4%BD%A0%E4%BD%93%E9%AA%8C%E4%BB%A4%E4%BA%BA%E6%83%8A%E5%96%9C%E7%9A%84%E5%B4%AD%E6%96%B0CSDN%E3%80%82.user.js","uuid":"7bb0024b-d12b-4d09-bb5b-a7742dc59ef3","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDwn5Sl5oyB57ut5pu05paw8J+UpSBDU0RO5bm/5ZGK5a6M5YWo6L+H5ruk44CB5Lq65oCn5YyW6ISa5pys5LyY5YyW77ya8J+GlSDkuI3nlKjlho3nmbvlvZXkuobvvIHorqnkvaDkvZPpqozku6Tkurrmg4rllpznmoTltK3mlrBDU0RO44CCCi8vIEBuYW1lc3BhY2UgICAgaHR0cHM6Ly9naXRodWIuY29tL2FkbGVyZWQKLy8gQHZlcnNpb24gICAgICA0LjAuNwovLyBAZGVzY3JpcHRpb24gIOKaoe+4j+WFqOaWsDQuMOeJiOacrO+8geaLpeacieaVsOmhueeLrOWutuWKn+iDveeahOacgOW8ukNTRE7ohJrmnKzvvIzkuI3mnI3mr5TkuIDmr5TimqHvuI988J+VtuaXoOmcgOeZu+W9lUNTRE7vvIzojrflvpfmr5TkvJrlkZjmm7TkvbPnmoTkvZPpqox88J+WpeiHquWumuS5ieiDjOaZr+Wbvu+8jOWIhui+qOeOh+iHqumAgumFje+8jOWIhuWxj+S4jeeUqOa7muWKqHzwn5K+6LaF57qn6aKE5LyY5YyWfPCflJbni6zlrrbotoXnuqflhY3kvJrlkZh88J+Pt+eLrOWutuWOn+WIm+aWh+eroOWFjeeZu+W9leWxleW8gHzwn5SM54us5a625o6o6I2Q5YaF5a656Ieq55Sx5byA5YWzfPCfk6Dni6zlrrblhY3nmbvlvZXlpI3liLZ88J+Ul+eLrOWutumYsuWklumTvumHjeWumuWQkXzwn5Od54us5a626K665Z2b5pyq55m75b2V6Ieq5Yqo5bGV5byA5paH56ug44CB6K+E6K66fPCfjLXlhajpnaLlh4DljJZ88J+TiOayiea1uOmYheivu3zwn6e05YeA5YyW5Ymq6LS05p2/fPCfk5XkvZzogIXkv6Hmga/mlofnq6Dpobbpg6jlsZXnpLoKLy8gQGF1dGhvciAgICAgICBBZGxlcgovLyBAY29ubmVjdCAgICAgIHd3dy5jc2RuLm5ldAovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmNzZG4ubmV0LyoKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2pxdWVyeS5jb29raWUvanF1ZXJ5LmNvb2tpZS5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbnByb2dyZXNzQDAuMi4wL25wcm9ncmVzcy5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2xpcGJvYXJkQDIuMC42L2Rpc3QvY2xpcGJvYXJkLm1pbi5qcwovLyBAc3VwcG9ydFVSTCAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hZGxlcmVkL0NTRE5HcmVlbmVyL2lzc3Vlcy9uZXc/YXNzaWduZWVzPWFkbGVyZWQmbGFiZWxzPWhlbHArd2FudGVkJnRlbXBsYXRlPUlTU1VFX1RFTVBMQVRFLm1kJnRpdGxlPQovLyBAY29udHJpYnV0aW9uVVJMIGh0dHBzOi8vZG9jLnN0YWNrb3ZlcmZsb3cud2lraS93ZWIvIy8yMT9wYWdlX2lkPTEzOAovLyBAZ3JhbnQgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9nZXRWYWx1ZQovLyBAYW50aWZlYXR1cmUgIHRyYWNraW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pj4+IOivtOaYju+8muaIkeS7rOS7heS8muWcqENTRE7pobXpnaLmlLbpm4bmgqjkvb/nlKhDU0ROR3JlZW5lcueahOaDheWGte+8jOW4ruWKqeaIkeS7rOS6huino0NTRE5HcmVlbmVy55qE55So5oi35pWw6YeP44CC6L+Z5Liq5pON5L2c5LuF5Lya5pS26ZuG5oKo55qESVDlnLDlnYDkv6Hmga/vvIzkuI3ljIXlkKvmgqjpvKDmoIfjgIHplK7nm5jngrnlh7vlnKjlhoXnmoTmiYDmnInmk43kvZzvvIzmsqHmnInku7vkvZXlronlhajpo47pmanvvIzkuI3kvJrkuqfnlJ/mgKfog73mjZ/ogJfjgILkuLrkuobkv53miqTmgqjnmoTnn6Xmg4XmnYPku6Xlj4rkvb/nlKjkvZPpqozvvIznibnlkYrnn6Xkuo7mgqjjgILku6PnoIHlvIDmupDlj6/lrqHorqHvvIxDU0ROR3JlZW5lcuiAgeeJjOiEmuacrO+8jOacieWPo+eahueikeOAguivt+aCqOaUvuW/g+WuieijheOAgiA8PDw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBAbm90ZSAgICAgICAgIDIxLTEwLTIxIDQuMC43IOWxj+iUvee6ouWMhembqAovLyBAbm90ZSAgICAgICAgIDIxLTA5LTI0IDQuMC42IOS/ruWkjeeZu+W9leW8ueeql+aXoOazleW9u+W6leWOu+mZpOeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIxLTA5LTIwIDQuMC41IOWinuWKoOiHquWumuS5ieiDjOaZr+WKn+iDvQovLyBAbm90ZSAgICAgICAgIDIxLTA5LTEzIDQuMC40IOWinuWKoOS4gOS4quayoeacieaUtumSseeahOW5v+WRiu+8iOWcqOiuvue9rumHjO+8jOS4jeW9seWTjeS9k+mqjO+8iQovLyBAbm90ZSAgICAgICAgIDIxLTA5LTAxIDQuMC4zIOWinuWKoOeUqOaIt+S9v+eUqOaDheWGtee7n+iuoeaooeWdlwovLyBAbm90ZSAgICAgICAgIDIxLTA4LTI1IDQuMC4yIOS/ruWkjeWPs+S+p+e9rumhtuagj+aMiemSrua2iOWkseeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIxLTA4LTIxIDQuMC4xIOWOu+mZpOWPs+S+p+aCrOa1ruagj++8jOS8mOWMluiEmuacrAovLyBAbm90ZSAgICAgICAgIDIxLTA4LTIwIDQuMC4wIOWFqOaWsDQuMOWPkeW4g++8gVVJ576O5YyW77yM5Luj56CB5LyY5YyW77yM5YW85a65RmlyZWZveO+8jOabtOWkmuaOkueJiOaooeW8jwovLyBAbm90ZSAgICAgICAgIDIxLTA4LTIwIDMuNS43IOS/ruWkjeaXoOazleWujOaVtOWkjeWItuOAgeS/neWtmGNzZG7nmoTnvZHpobXkvJrot7PovazpppbpobXnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMS0wOC0xOSAzLjUuNiDoh6rliqjpmpDol4/lupXmoI/lip/og73mlLnkuLrlp4vnu4jpmpDol4/lupXmoI8KLy8gQG5vdGUgICAgICAgICAyMS0wOC0xOCAzLjUuNSDkv67lpI3ml6Dms5XpgInmi6nlpI3liLbnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMS0wNi0xNyAzLjUuNCDljrvpmaTlj7PkvqfnuqLljIXmgqzmta7nqpcKLy8gQG5vdGUgICAgICAgICAyMS0wNC0xOCAzLjUuMyDlop7liqDmmL7npLrlsI/lupfnmoTorr7lrpoKLy8gQG5vdGUgICAgICAgICAyMS0wMy0xMyAzLjUuMiDljrvkuLvpobXlub/lkYrvvIzljrvmlofnq6DpobXpnaLmjqjojZDlhoXlrrlUaXRsZQovLyBAbm90ZSAgICAgICAgIDIxLTAzLTAxIDMuNS4xIOS/ruaUueaWh+ahiAovLyBAbm90ZSAgICAgICAgIDIxLTAyLTA2IDMuNS4wIOS/ruWkjeS4iuS8oOi1hOa6kOeVjOmdouagh+etvumAieaLqea2iOWkseeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIxLTAxLTE3IDMuNC45IOWIoOmZpOaWh+eroOmhteWSjOiuuuWdm+W5v+WRiu+8jOaaguaXtuWBnOeUqOWPs+S+p+agj+a7muWKqOWKn+iDve+8iENTRE7pmZDliLbvvIkKLy8gQG5vdGUgICAgICAgICAyMS0wMS0xNSAzLjQuOCDkv53lrZjmjInpkq7kvJjljJbvvIzkv67lpI3mmL7npLrliJvkvZzkuK3lv4PmjInpkq7lip/og73lpLHmlYjnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMS0wMS0xNSAzLjQuNyDmlLnov5vohJrmnKznu4boioLvvIzlop7liqDlub/lkYrlsY/olL3og73lipvvvIzkv67lpI3nu7/ljJbmjInpkq7plJnkvY3nmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0xMi0yNSAzLjQuNiDkuLvpobXpg6jliIbltYzlhaXlvI/lub/lkYrliKDpmaQKLy8gQG5vdGUgICAgICAgICAyMC0xMi0xOCAzLjQuNSDkv67lpI3nu7/ljJborr7lrprmjInpkq7mjpLniYjkuI3mraPnoa7nmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0xMi0xNSAzLjQuNCDkv67lpI3kuobmn5DkupvlrZDpobXmmL7npLrkuI3mraPluLjnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0xMC0yMyAzLjQuMyDpgILlupTmlrDniYhDU0RO77yM5Y676Zmk5Li76aG15ZKM55m75b2V6aG15bm/5ZGK77yM5Lul5Y+K55m75b2V5o+Q56S677yM5bm256e76Zmk5bqV6YOo5L+h5oGvCi8vIEBub3RlICAgICAgICAgMjAtMTAtMjAgMy40LjIg5Yig6Zmk5Y+z5L6n5bm/5ZGKCi8vIEBub3RlICAgICAgICAgMjAtMDktMjYgMy40LjEg5L+u5pS55o6S54mI6K6+5a6a77yM5L+u5aSN55m75b2V5qGG5by55Ye655qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMDktMjQgMy40LjAg57Sn5oCl5L+u5aSN55Sx5LqOQ1NETuWJjeerr+agt+W8j+S/ruaUueWvvOiHtOiuvuWumuW8gOWFs+S4ouWkseeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIwLTA4LTI3IDMuMy45IOe0p+aApeS/ruWkjeeUseS6jkNTRE7liY3nq6/moLflvI/kv67mlLnlr7zoh7TohJrmnKzlpLHmlYjnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wOC0yNiAzLjMuOCDlkIjms5XohJrmnKzmj5DnpLoKLy8gQG5vdGUgICAgICAgICAyMC0wNy0yMCAzLjMuNyDkv67lpI3oj5zljZXmoI/lnKjliJvkvZzkuK3lv4PmmL7npLrlvILluLjnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wNy0xOCAzLjMuNiDlt6XlhbfnrrHmjInpkq7kvJjljJYKLy8gQG5vdGUgICAgICAgICAyMC0wNy0wNSAzLjMuNSDor4TorrrlpI3liLblip/og73kuqTkupLkvJjljJYKLy8gQG5vdGUgICAgICAgICAyMC0wNy0wNCAzLjMuNCDkv67lpI3lj7PkvqfmoI/mtojlpLHnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wNy0wMyAzLjMuMyDmlrDlop7lpI3liLbor4Torrrlip/og73vvIHliKDpmaTpobbpg6jlub/lkYoKLy8gQG5vdGUgICAgICAgICAyMC0wNi0yOCAzLjMuMiDmj5DnpLrkv67mlLkKLy8gQG5vdGUgICAgICAgICAyMC0wNi0yNyAzLjMuMSDlvLnnqpfmj5DnpLrpgLvovpHkv67mlLnkuLrku4Xmj5DnpLrkuIDmrKHjgIIKLy8gQG5vdGUgICAgICAgICAyMC0wNi0yNyAzLjMuMCDnvZHnq5nmoIfpopjmlrDmtojmga/mj5DphpLljrvpmaQKLy8gQG5vdGUgICAgICAgICAyMC0wNi0yNiAzLjIuOSDmgaLlpI1HcmVhc3lGb3Jr5bmz5Y+w6ISa5pys5pSv5oyBCi8vIEBub3RlICAgICAgICAgMjAtMDYtMjEgMy4yLjAg6ISa5pys6L+B56e76YCa55+lCi8vIEBub3RlICAgICAgICAgMjAtMDYtMjEgMy4xLjkg5aKe5Yqg6Ieq5Yqo6ZqQ6JeP5bqV5qCP5Yqf6IO9Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMjEgMy4xLjgg5aKe5Yqg6Ieq5Yqo6ZqQ6JeP6aG25qCP5Yqf6IO977yM5L+u5aSN6YCJ6aG556qX5Y+j6KKr54K56LWe6ZW/5p2h5oyh5L2P55qEQnVn77yM6YCJ6aG556qX5Y+j5biD5bGA5L+u5pS5Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMjAgMy4xLjcg6K6+572u56qX5Y+j5aSn5bCP5Zu65a6a77yM5aKe5Yqg5omT6LWP5YWl5Y+jCi8vIEBub3RlICAgICAgICAgMjAtMDYtMTkgMy4xLjYg5pi+56S65o6o6I2Q5YaF5a655oyJ6ZKu5Zue5b2S77yM5paw5biD5bGA57Sn5oCl5L+u5aSNCi8vIEBub3RlICAgICAgICAgMjAtMDYtMTggMy4xLjUg6Ieq5a6a5LmJ5Yqf6IO95pu05pawCi8vIEBub3RlICAgICAgICAgMjAtMDYtMTYgMy4xLjQg5pSv5oyB5aSn6YOo5YiG5Yqf6IO95qih5Z2X5YyW5pi+56S6Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMTQgMy4xLjMg57u/5YyW6K6+5a6a5LyY5YyWCi8vIEBub3RlICAgICAgICAgMjAtMDYtMTQgMy4xLjIgSVNTVUXmqKHmnb/osIPmlbRTdXBwb3J0IFVSTAovLyBAbm90ZSAgICAgICAgIDIwLTA2LTE0IDMuMS4xIOWinuWKoOaQnOWNmuS4u+aWh+eroOaooeWdlwovLyBAbm90ZSAgICAgICAgIDIwLTA2LTEzIDMuMS4wIOS/ruWkjeiuvue9rui/h+acn+eahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIwLTA2LTEyIDMuMC45IOagh+mimOWbnua7mgovLyBAbm90ZSAgICAgICAgIDIwLTA2LTEyIDMuMC44IOS4u+mhteW5v+WRiuWIoOmZpO+8jOe7v+WMluiuvue9ruS7heaYvuekuuWcqOaWh+eroOmhtemdou+8jOWIoOmZpOmhteiEmu+8jOmhtumDqOS8mOWMlu+8jOiLpeW5sue7huiKguS8mOWMlgovLyBAbm90ZSAgICAgICAgIDIwLTA2LTExIDMuMC43IOWinuWKoOWumOaWuVFR5Lqk5rWB576k77yM5aKe5Yqg5YWz6Zet5by65Yi255m96Imy5Li76aKY5Yqf6IO9Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMTEgMy4wLjYg55So5oi35ZCN54mH5Yqf6IO95LyY5YyWCi8vIEBub3RlICAgICAgICAgMjAtMDYtMTEgMy4wLjUg5LyY5YyW5Yqg6L296YCf5bqmCi8vIEBub3RlICAgICAgICAgMjAtMDYtMTAgMy4wLjQg5L+u5aSN6K6+572u55WM6Z2i6YGu5oyh55qE6Zeu6aKY77yM5pi+56S65Y2a5Li75aS05YOPCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDkgMy4wLjMg6buY6K6k6K6+5a6a5L+u5pS5Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMDkgMy4wLjIg5L+u5aSN5o6o6I2Q5YaF5a655oyJ6ZKu5Yi35paw5LiN55Sf5pWI55qE6Zeu6aKY77yM5aKe5Yqg5bel5YW3566x5o+Q56S65qGGCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDggMy4wLjEg6K6+572u5Lit5b+D5o6o5Ye677yB5aKe5Yqg5rWP6KeI5pWI5p6c6YCJ6aG5ICYmIEdyZWVuIEJvb2sgSWNvbiBVcGRhdGUKLy8gQG5vdGUgICAgICAgICAyMC0wNi0wOCAzLjAuMCDorr7nva7kuK3lv4Pmjqjlh7rvvIHlop7liqDmtY/op4jmlYjmnpzpgInpobkKLy8gQG5vdGUgICAgICAgICAyMC0wNi0wNyAyLjQuMiDorr7nva7op6PogKbvvIzkuIvkuKrniYjmnKzmkJ7phY3nva7kuK3lv4MKLy8gQG5vdGUgICAgICAgICAyMC0wNi0wNiAyLjQuMSDkv67lpI3mlofnq6DlhoXlrrnmtojlpLHnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wNi0wNCAyLjQuMCDkv67lpI3mjqjojZDmjInpkq7plJnkvY3nmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wNi0wNCAyLjMuOSDnqoTlsY/pgILphY3kvJjljJYKLy8gQG5vdGUgICAgICAgICAyMC0wNi0wNCAyLjMuOCDpu5HlpJzmqKHlvI/lh7rnjrDpl67popjvvIzntKfmgKXlm57moaPliLAgMi4zLjYKLy8gQG5vdGUgICAgICAgICAyMC0wNi0wMyAyLjMuNyDmhJ/osKIgQEFsZXhMV1Qg5aKe5Yqg6buR5pqX5qih5byPCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDIgMi4zLjYgQWRzQnlHb29nbGUg5Yig6ZmkCi8vIEBub3RlICAgICAgICAgMjAtMDUtMjUgMi4zLjUg5oSf6LCiIEBSeWFuSVBPIOS/ruWkjSBDYW5ub3QgcmVhZCBwcm9wZXJ0eSAncmVwbGFjZScgb2YgdW5kZWZpbmVkIOaKpemUmeeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIwLTA1LTI0IDIuMy40IOS/ruWkjeWFjeeZu+W9leWkjeWItuWKn+iDvQovLyBAbm90ZSAgICAgICAgIDIwLTA1LTIyIDIuMy4zIExvZ2/kuI7og4zmma/lkIzmraUKLy8gQG5vdGUgICAgICAgICAyMC0wNS0yMiAyLjMuMiDmt7HluqbliKDpmaTog4zmma8KLy8gQG5vdGUgICAgICAgICAyMC0wNS0yMCAyLjMuMSDpgJrov4dyZXF1aXJl5L2/55SoTlByb2dyZXNzCi8vIEBub3RlICAgICAgICAgMjAtMDUtMjAgMi4zLjAg5pi+56S65o6o6I2Q5YaF5a655oyJ6ZKu5qC35byP5YaF572u77yM5YmU6ZmkQ0ROCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTcgMi4yLjkg6L+b5bqm5p2h5qC35byP5pu05paw77yM5pe26Ze05bu25pe25LyY5YyWCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTcgMi4yLjgg5pu05paw6ISa5pys5o+P6L+w77yM5bGV5byA6K+E6K6655qE5omA5pyJ5Zue5aSN77yM5Yig6Zmk5Yib5L2c5Lit5b+D5oyJ6ZKu77yM5Yqg6L296L+b5bqm5p2hCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTcgMi4yLjcg5pu05paw6ISa5pys5o+P6L+wCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTYgMi4yLjYg5L+u5aSN56ys5LiA5qyh54K55Ye75pi+56S65o6o6I2Q5YaF5a655peg5Y+N5bqU55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTYgMi4yLjUg5Yig6Zmk5oqi5rKZ5Y+R6KeS5qCH77yM5L+u5pS55pi+56S65o6o6I2Q5YaF5a655oyJ6ZKu5qC35byPCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTYgMi4yLjQg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcSGVyb25aaGFuZ+KAneeahElzc3Vl5bu66K6u77yM5Yig6Zmk5omA5pyJ5Y2a5a6i6Iqx6YeM6IOh5ZOo55qE6IOM5pmv77yM5Li76aG15YiG57G75Lit5bm/5ZGK5riF6Zmk77yMQ1NT5qC35byP5o6n5Yi25a695bqm6YCC6YWN5Luj56CB5LyY5YyWCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTYgMi4yLjMg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcUmV0aXJlZFdvcmxk4oCd55qE5Luj56CB6LSh54yu77yM5L2/55SoQ1NT5p2l5o6n5Yi25qC35byP77yM6ICM5LiN5pivSlPvvIzlop7lpKfngbXmtLvmgKfjgIIKLy8gQG5vdGUgICAgICAgICAyMC0wNS0xMyAyLjIuMiDlsY/olL3mgqjnmoTnvKnmlL7kuI3mmK8xMDAl55qE5o+Q56S6Ci8vIEBub3RlICAgICAgICAgMjAtMDQtMjkgMi4yLjEg5oSf6LCi5aSn5a6255qE5pSv5oyB77yM5aKe5Yqg55uu5b2V5pi+56S677yM6Ieq5Yqo5Yik5pat5piv5ZCm5a2Y5Zyo55uu5b2V6LCD5pW06aG16Z2i5a695bqm77yM5bGP6JS95paw5aKe5bm/5ZGK77yM5qyi6L+O5aSn5a625L2T6aqM5bm25o+Q5Ye65oSP6KeB77yBCi8vIEBub3RlICAgICAgICAgMjAtMDQtMTUgMi4yLjAg5LiA5Lqb5bm/5ZGK6KKr5YW25LuW5o+S5Lu25bGP6JS95a+86Ie055qE5byC5bi45peg6KeG5LmLCi8vIEBub3RlICAgICAgICAgMjAtMDMtMzAgMi4xLjkg5bmy5o6J4oCc6K6w5b2V5L2g55qE5Yib5L2c5Y6G56iL4oCd77yM5bmy5o6J5pyq55m75b2V5oOF5Ya15LiL55qE6KeS5qCH5o+Q6YaSCi8vIEBub3RlICAgICAgICAgMjAtMDMtMTMgMi4xLjgg56qE5bGP6YCC6YWN5Yqg5by6Ci8vIEBub3RlICAgICAgICAgMjAtMDMtMTMgMi4xLjcg5pu05paw566A5LuLCi8vIEBub3RlICAgICAgICAgMjAtMDMtMTIgMi4xLjYg5a695bqm6Ieq6YCC5bqU77yI5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+LTGVvbkc355qE5bu66K6u77yJ77yB5L+u5aSN5Ymq6LS05p2/5YeA5YyW5peg5pWI55qE6Zeu6aKY44CCCi8vIEBub3RlICAgICAgICAgMjAtMDMtMDQgMi4xLjUg6YCC6YWNQWRHdWFyZAovLyBAbm90ZSAgICAgICAgIDIwLTAyLTI3IDIuMS40IOS8mOWMluWFjeeZu+W9leWkjeWItgovLyBAbm90ZSAgICAgICAgIDIwLTAyLTI1IDIuMS4zIOWFjeeZu+W9leWkjeWItuabtOaWsO+8jOeOsOW3suWPr+eUqAovLyBAbm90ZSAgICAgICAgIDIwLTAyLTI0IDIuMS4yIEJ5IEdpdGh1YkBKYWxpbldhbmcg5pu05pS55Y676Zmk5Ymq6LS05p2/5Yqr5oyB55qE5pa55byP77yM5L2/5b6X5Y6f5paH5qC85byP5Zyo5aSN5Yi25pe26IO95aSf5L+d55WZCi8vIEBub3RlICAgICAgICAgMjAtMDItMjIgMi4xLjEg57Sn5oCl5L+u5aSN55Sx5LqOIENTRE4g5L+u5pS55YmN56uv57uT5p6E5a+86Ie055qE5paH56ug6ZSZ5L2NCi8vIEBub3RlICAgICAgICAgMjAtMDItMTEgMi4xLjAg6Iul5bmy5Yqo55S75LyY5YyW77yM6KeG6KeJ5L2T6aqM5pu05rWB55WFCi8vIEBub3RlICAgICAgICAgMjAtMDItMDYgMi4wLjkg5q2m5rGJ5Yqg5rK577yB5L+u5pS55o6o6I2Q5YaF5a655YiH5o2i5byA5YWz5L2N572u77yM5YeP5bCR6L+d5ZKM5oSfCi8vIEBub3RlICAgICAgICAgMjAtMDEtMTcgMi4wLjgg5Y676Zmk5Y+z5L6n5bm/5ZGKCi8vIEBub3RlICAgICAgICAgMjAtMDEtMTcgMi4wLjcg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcZ2xlYW5z4oCd55qE5bu66K6u77yM5Y675o6J6aG15aS05bm/5ZGKCi8vIEBub3RlICAgICAgICAgMTktMTItMTIgMi4wLjYg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCceWV4dWVzb25n4oCd55qE5bu66K6u77yM5bCG5L2c6ICF5L+h5oGv5Zyo5paH56ug6aG26YOo5bGV56S6Ci8vIEBub3RlICAgICAgICAgMTktMTAtMzAgMi4wLjUg576O5YyW6ZqQ6JeP5oyJ6ZKu77yM5aKe5Yqg54K55Ye75Yqo55S7Ci8vIEBub3RlICAgICAgICAgMTktMTAtMzAgMi4wLjQg5Yig6ZmkQ1NETuWumOaWueWcqOS4u+mhteaOqOmAgeeahOaWh+eroO+8iOWkp+WkmuaYr+W5v+WRiu+8iQovLyBAbm90ZSAgICAgICAgIDE5LTEwLTMwIDIuMC4zIOa3u+WKoOabtOWkmuWxj+iUveiEmuacrAovLyBAbm90ZSAgICAgICAgIDE5LTEwLTMwIDIuMC4wIOelneiHquW3seeUn+aXpeW/q+S5kH7lrozlhajph43lhplDU0ROR3JlZW5lcu+8jOe7n+S4gOS9v+eUqEpRdWVyee+8jOaViOeOh+abtOmrmAovLyBAbm90ZSAgICAgICAgIDE5LTEwLTI3IDEuNS4yIOWIoOmZpOWIhuS6q+a1t+aKpeaPkOekuiYm5oSf6LCiR2l0SHVi55qE5pyL5Y+L4oCcQ0hOLVNUVURFTlTigJ3nmoTlj43ppojvvIzljrvpmaTlupXpg6jor77nqIvmjqjojZAKLy8gQG5vdGUgICAgICAgICAxOS0xMC0yNyAxLjUuMSDmhJ/osKLmnaXoh6pHaXRIdWLnmoTmnIvlj4vigJxDSE4tU1RVREVOVOKAneeahOe7huiHtOWkjeeOsOWPjemmiO+8jOWOu+mZpOS6huW6lemDqOeahOivvueoi+aOqOiNkOW5v+WRigovLyBAbm90ZSAgICAgICAgIDE5LTEwLTA0IDEuNS4wIOenu+mZpOS6huW6lemDqOS4u+mimOS/oeaBr+WSjOaJk+i1jwovLyBAbm90ZSAgICAgICAgIDE5LTA5LTEwIDEuNC45IOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi+KAnHByb2dyYW1tZXJaZeKAneeahOe7huiHtOWkjeeOsOWPjemmiO+8jOS/ruWkjeS6huivhOiuuuWMuueCueWHu+afpeeci+WbnuWkjeWQju+8jOW3sue7j+WxleW8gOeahOivhOiuuuS8muaUtui1t+eahOmXrumimAovLyBAbm90ZSAgICAgICAgIDE5LTA5LTA0IDEuNC44IOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi+KAnGR3ZGN0aOKAneeahOe7huiHtOWkjeeOsOWPjemmiO+8jOeOsOWcqOafpeeci+WOn+WIm+aWh+eroOS4jeS8muaXoOmZkOW8ueeZu+W9leeql+WPo+S6hu+8jOS4lOWKoOW8uuS6huiHquWKqOWxleW8gOWKn+iDvQovLyBAbm90ZSAgICAgICAgIDE5LTA4LTIwIDEuNC43IOaEn+iwouayueWPieeUqOaIt+KAnFN1cHJlbWVTaXLigJ3nmoTlj43ppojvvIzkv67lpI3kuoblj7Pkvqfmgqzmta7moI/pga7mjKHmlofnq6DnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAxOS0wOC0xNCAxLjQuNiDml6Dor63jgILliJrmm7TmlrDnmoTlhY3nmbvlvZXlpI3liLbvvIzlj4jmlLnkuobjgILkv67lpI3vvIEKLy8gQG5vdGUgICAgICAgICAxOS0wOC0xMyAxLjQuNSDmm7TmlrDkuobni6zlrrblip/og73vvJrlhY3nmbvlvZXlpI3liLYKLy8gQG5vdGUgICAgICAgICAxOS0wOC0xMyAxLjQuNCDmhJ/osKLmnaXoh6pHaXRIdWLnmoTmnIvlj4vigJxpYW1zdW54aW5n4oCd55qE5Y+N6aaI77yM5L+u5aSN5LqG6aG26YOo5LiN6LS06L6555qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMTktMDgtMDEgMS40LjMg5oSf6LCi5rK55Y+J55So5oi34oCcZGRkZHnigJ3nmoTlj43ppojvvIzljrvpmaTkuobmm7TlpJrmjqjlub/lub/lkYoKLy8gQG5vdGUgICAgICAgICAxOS0wNy0zMCAxLjQuMiDmhJ/osKLmsrnlj4nnlKjmiLfigJzlkajkuYnmnbDigJ3nmoTlj43ppojvvIzlop7liqDkuobpmLJDU0RO5aSW6ZO+6YeN5a6a5ZCR55qE5Yqf6IO977yIQ1NETuiHrea1geawk++8iQovLyBAbm90ZSAgICAgICAgIDE5LTA3LTIwIDEuNC4xIOS/ruWkjeS6huaOqOiNkOWGheWuueW8gOWFs+i3qOaWh+eroOaXoOaViOmXrumimO+8iOW/mOS6humFjee9rkNvb2tpZeS9nOeUqOWfn++8iQovLyBAbm90ZSAgICAgICAgIDE5LTA3LTE5IDEuNC4wIDEuIOaehOaetuWkp+abtOaWsCAyLiDmhJ/osKLmnaXoh6pHaXRIdWLnmoTmnIvlj4sibHVrZW1pbiLnmoTlj43ppojvvIzliqDlhaXkuobkuIvmlrnmjqjojZDlhoXlrrnmmK/lkKbpmpDol4/lvIDlhbPvvIjlrp7nlKjvvIkKLy8gQG5vdGUgICAgICAgICAxOS0wNy0xMyAxLjMuMCDmhJ/osKLmnaXoh6pHaXRIdWLnmoTmnIvlj4vigJxIb2xhcGxhY2XigJ3nmoTlj43ppojvvIzkv67lpI3kuobmlofnq6Dml6Dms5Xoh6rliqjlsZXlvIDnmoTpl67popjvvIhDU0RO5oC75pS56L+Z5Liq77yM5Luk5Lq65aS055a877yJCi8vIEBub3RlICAgICAgICAgMTktMDYtMDggMS4yLjYg5oSf6LCi5rK55Y+J55So5oi34oCcRGVza3lBa2nigJ3nmoTlj43ppojvvIzkv67lpI3kuobmlofnq6Dml6Dms5Xoh6rliqjlsZXlvIDnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAxOS0wNi0wNyAxLjIuNCDkv67lpI3kuobnmbvlvZXlkI7or4Torrrml6Dms5XmraPluLjmiZPlvIDnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAxOS0wNi0wNyAxLjIuMyDmhJ/osKLmsrnlj4nnlKjmiLci5rC46L+c55qE5q6/5LiLIueahOWPjemmiO+8jOWcqOS4gOS4iuWNiOeahOWKquWKm+aUu+WFi+S4i++8jOe7iOS6juWunueOsOS6huacqueZu+W9leWxleW8gOivhOiuuueahOivreWPpQovLyBAbm90ZSAgICAgICAgIDE5LTA2LTA1IDEuMi4wIOS/ruWkjeS6huivhOiuuuaXoOazleiHquWKqOWxleW8gOeahEJVRwovLyBAbm90ZSAgICAgICAgIDE5LTA2LTA0IDEuMS45IOS/ruWkjeS6huaXoOazleiHquWKqOWxleW8gOeahEJVR++8iOiHqumXreS6hu+8iQovLyBAbm90ZSAgICAgICAgIDE5LTA2LTA0IDEuMS42IENTRE7lpKrlnY/kuobvvIzmiorigJzmtojmga/igJ3mjInpkq7nmoRDbGFzc+iuvue9ruaIkOS6huKAnEdpdENoYXTigJ3vvIzmiYDku6Xkv67lpI3kuobigJzmtojmga/igJ3mjInpkq7mtojlpLHnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAxOS0wNi0wNCAxLjEuNSAxLiDkvJjljJbkuoborrrlnZvkvZPpqowgMi7nvo7ljJbjgIHkvJjljJbku6PnoIHnu5PmnoQKLy8gQG5vdGUgICAgICAgICAxOS0wNi0wNCAxLjEuNCDmhJ/osKLmnaXoh6pHaXRIdWLnmoTmnIvlj4vigJxpYW1zdW54aW5n4oCd55qE5Y+N6aaI77yM5aKe5Yqg5LqG6K665Z2b5bm/5ZGK5Yy56YWN6KeE5YiZCi8vIEBub3RlICAgICAgICAgMTktMDYtMDMgMS4xLjMg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcd2FuZ3dlaTEzNeKAneeahOWPjemmiO+8jOWOu+mZpOS6huivhOiuuuWMuuS4iuaWueeahOW5v+WRigovLyBAbm90ZSAgICAgICAgIDE5LTA1LTI3IDEuMS4yIOaEn+iwouayueWPieeUqOaIt+KAnOWkj+S8n+adsOKAneeahOWPjemmiO+8jOS/ruWkjeS6huWvjOaWh+acrOe8lui+keWZqOaXoOazleS9v+eUqOeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDE5LTA1LTI1IDEuMS4wIDEuIOS/ruWkjeS6huS4u+mhteW5v+WRiueahOmXrumimCAyLiDorrrlnZvoh6rliqjlsZXlvIAgMy4g6K665Z2b5bm/5ZGK5raI6ZmkCi8vIEBub3RlICAgICAgICAgMTktMDUtMjUgMS4wLjkg5oSf6LCi5rK55Y+J55So5oi34oCc5rij5rij5LiN5YeG6K+06K+d4oCd55qE5Y+N6aaI77yM5L+u5aSN5LqG5pS26JeP5oyJ6ZKu5raI5aSx55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMTktMDMtMDEgMS4wLjMg5re75Yqg6aG16Z2i6YCJ5oup5oCn6L+H5ruk6KeE5YiZCi8vIEBub3RlICAgICAgICAgMTktMDMtMDEgMS4wLjIg5aKe5Yqg5LqG5YeA5YyW5Ymq6LS05p2/5Yqf6IO9Ci8vIEBub3RlICAgICAgICAgMTktMDMtMDEgMS4wLjEg5L+u5aSN5LqG5o6S54mI6Zeu6aKYLCDkvJjljJbkuobku6PnoIHnu5PmnoQKLy8gQG5vdGUgICAgICAgICAxOS0wMi0yNiAxLjAuMCDliJ3niYjlj5HluIMKLy8gPT0vVXNlclNjcmlwdD09CnZhciB2ZXJzaW9uID0gIjQuMC43IjsKdmFyIGN1cnJlbnRVUkwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKaWYgKGN1cnJlbnRVUkwuaW5kZXhPZigiPyIpICE9PSAtMSkgewogICAgY3VycmVudFVSTCA9IGN1cnJlbnRVUkwuc3Vic3RyaW5nKDAsIGN1cnJlbnRVUkwuaW5kZXhPZigiPyIpKTsKfQp2YXIgbGlzdDsKdmFyIHdpbmRvd1RvcCA9IDA7CnZhciBzdGFydFRpbWVNaWxsaSA9IERhdGUubm93KCk7CnZhciBzdG9wVGltZU1pbGxpID0gMDsKLy8g6YWN572u5o6n5Yi257G7CmNsYXNzIENvbmZpZyB7CiAgICBnZXQoa2V5LCB2YWx1ZSkgewogICAgICAgIHZhciBjb29raWUgPSAkLmNvb2tpZShrZXkpOwogICAgICAgIGlmIChjb29raWUgPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIlJlbmV3IGtleTogIiArIGtleSArICIgOiAiICsgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUuZGVidWcoIlJlYWQga2V5OiAiICsga2V5ICsgIiA6ICIgKyBjb29raWUpOwogICAgICAgIGlmIChjb29raWUgPT09ICJ0cnVlIikgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgIGlmIChjb29raWUgPT09ICJmYWxzZSIpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgcmV0dXJuIGNvb2tpZTsKICAgIH0KCiAgICBnZXRTKGtleSwgdmFsdWUpIHsKICAgICAgICB2YXIgY29va2llID0gJC5jb29raWUoa2V5KTsKICAgICAgICBpZiAoY29va2llID09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJSZW5ldyBrZXk6ICIgKyBrZXkgKyAiIDogIiArIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICBjb25zb2xlLmRlYnVnKCJSZWFkIGtleTogIiArIGtleSArICIgOiAiICsgY29va2llKTsKICAgICAgICByZXR1cm4gY29va2llOwogICAgfQoKICAgIHNldChzZXRLZXksIHNldFZhbHVlKSB7CiAgICAgICAgJC5jb29raWUoc2V0S2V5LCBzZXRWYWx1ZSwgewogICAgICAgICAgICBwYXRoOiAnLycsCiAgICAgICAgICAgIGV4cGlyZXM6IDM2NQogICAgICAgIH0pOwogICAgICAgIGNvbnNvbGUuZGVidWcoIktleSBzZXQ6ICIgKyBzZXRLZXkgKyAiIDogIiArIHNldFZhbHVlKTsKICAgIH0KCiAgICBsaXN0ZW5CdXR0b24oZWxlbWVudCwgbGlzdGVuS2V5LCB0cnVlQWN0aW9uLCBmYWxzZUFjdGlvbikgewogICAgICAgICQoZWxlbWVudCkuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgc3RhdHVzID0gbmV3IENvbmZpZygpLmdldChsaXN0ZW5LZXksIHRydWUpOwogICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJTdGF0dXM6ICIgKyBzdGF0dXMpOwogICAgICAgICAgICBpZiAoc3RhdHVzID09PSAidHJ1ZSIgfHwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJLZXkgc2V0OiAiICsgbGlzdGVuS2V5ICsgIiA6OiAiICsgZmFsc2UpOwogICAgICAgICAgICAgICAgbmV3IENvbmZpZygpLnNldChsaXN0ZW5LZXksIGZhbHNlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIktleSBzZXQ6ICIgKyBsaXN0ZW5LZXkgKyAiIDo6ICIgKyB0cnVlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQobGlzdGVuS2V5LCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGxpc3RlbkJ1dHRvbkFuZEFjdGlvbihlbGVtZW50LCBsaXN0ZW5LZXksIHRydWVBY3Rpb24sIGZhbHNlQWN0aW9uKSB7CiAgICAgICAgJChlbGVtZW50KS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBuZXcgQ29uZmlnKCkuZ2V0KGxpc3RlbktleSwgdHJ1ZSk7CiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIlN0YXR1czogIiArIHN0YXR1cyk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICJ0cnVlIiB8fCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIktleSBzZXQ6ICIgKyBsaXN0ZW5LZXkgKyAiIDo6ICIgKyBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KGxpc3RlbktleSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZmFsc2VBY3Rpb24oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIktleSBzZXQ6ICIgKyBsaXN0ZW5LZXkgKyAiIDo6ICIgKyB0cnVlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQobGlzdGVuS2V5LCB0cnVlKTsKICAgICAgICAgICAgICAgIHRydWVBY3Rpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQp9CnZhciBjb25maWcgPSBuZXcgQ29uZmlnKCk7CnZhciBwcm9ncmVzcyA9IDA7CmNsYXNzIFByb2dyZXNzIHsKICAgIGluaXQoKSB7CiAgICAgICAgcHJvZ3Jlc3MgPSAwOwogICAgICAgIE5Qcm9ncmVzcy5zdGFydCgpOwogICAgICAgICQoIiNncmVlbmVyUHJvZ3Jlc3MiKS50ZXh0KCLnu7/ljJbkuK0uLi4iKTsKICAgICAgICAkKCIudG9vbGJhci1zZWFyY2giKS5oaWRlKCk7CiAgICB9CgogICAgc2V0UHJvZ3Jlc3MocCkgewogICAgICAgIHByb2dyZXNzID0gcDsKICAgICAgICAkKCIjZ3JlZW5lclByb2dyZXNzIikudGV4dChwcm9ncmVzcyArICIlIik7CiAgICAgICAgTlByb2dyZXNzLnNldChwcm9ncmVzcyAvIDEwMCk7CiAgICAgICAgY29uc29sZS5sb2cocHJvZ3Jlc3MgKyAiJSIpOwogICAgfQoKICAgIGluY1Byb2dyZXNzKHApIHsKICAgICAgICBwcm9ncmVzcyA9IHByb2dyZXNzICsgcDsKICAgICAgICBwcm9ncmVzcyA9IHByb2dyZXNzID4gMTAwID8gMTAwIDogcHJvZ3Jlc3M7CiAgICAgICAgJCgiI2dyZWVuZXJQcm9ncmVzcyIpLnRleHQocHJvZ3Jlc3MgKyAiJSIpOwogICAgICAgIE5Qcm9ncmVzcy5zZXQocHJvZ3Jlc3MgLyAxMDApOwogICAgICAgIGNvbnNvbGUubG9nKHByb2dyZXNzICsgIiUiKTsKICAgIH0KCiAgICBkb25lKCkgewogICAgICAgIHByb2dyZXNzID0gMTAwOwogICAgICAgIE5Qcm9ncmVzcy5kb25lKCk7CiAgICAgICAgJCgiI2dyZWVuZXJQcm9ncmVzcyIpLmh0bWwocHJvdGVjdF9zdmcgKyAnIENTRE5HcmVlbmVyIOato+WcqOWuiOaKpOaCqOeahOa1j+iniOS9k+mqjCcpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoIiNncmVlbmVyUHJvZ3Jlc3MiKS5mYWRlT3V0KDUwMCk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCIudG9vbGJhci1zZWFyY2giKS5mYWRlSW4oNTAwKTsKICAgICAgICAgICAgICAgIGlmICghaXNGaXJlZm94KCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyDmj5DnpLoKICAgICAgICAgICAgICAgICAgICBsZXQgdGlwc0Nvb2tpZSA9IGNvbmZpZy5nZXQoInNob3dUaXAiLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGlwc0Nvb2tpZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzaG93VGlwcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0KCJzaG93VGlwIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0sIDE1MDApOwogICAgfQp9CnZhciBwcm9ncmVzc29yID0gbmV3IFByb2dyZXNzKCk7CgovLyDoh6rlrprkuYkgQ1NTCi8vIOi/m+W6puadoQokKCdoZWFkJykuYXBwZW5kKCI8c3R5bGU+I25wcm9ncmVzc3twb2ludGVyLWV2ZW50czpub25lfSNucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kOiNmNDQ0NDQ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDMxO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoycHh9I25wcm9ncmVzcyAucGVne2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt3aWR0aDoxMDBweDtoZWlnaHQ6MTAwJTtib3gtc2hhZG93OjAgMCAxMHB4ICNmNDQ0NDQsMCAwIDVweCAjZjQ0NDQ0O29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoM2RlZykgdHJhbnNsYXRlKDAsLTRweCk7LW1zLXRyYW5zZm9ybTpyb3RhdGUoM2RlZykgdHJhbnNsYXRlKDAsLTRweCk7dHJhbnNmb3JtOnJvdGF0ZSgzZGVnKSB0cmFuc2xhdGUoMCwtNHB4KX0jbnByb2dyZXNzIC5zcGlubmVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDMxO3RvcDoxNXB4O3JpZ2h0OjE1cHh9I25wcm9ncmVzcyAuc3Bpbm5lci1pY29ue3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7Ym94LXNpemluZzpib3JkZXItYm94O2JvcmRlcjpzb2xpZCAycHggdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1jb2xvcjojZjQ0NDQ0O2JvcmRlci1sZWZ0LWNvbG9yOiNmNDQ0NDQ7Ym9yZGVyLXJhZGl1czo1MCU7LXdlYmtpdC1hbmltYXRpb246bnByb2dyZXNzLXNwaW5uZXIgLjRzIGxpbmVhciBpbmZpbml0ZTthbmltYXRpb246bnByb2dyZXNzLXNwaW5uZXIgLjRzIGxpbmVhciBpbmZpbml0ZX0ubnByb2dyZXNzLWN1c3RvbS1wYXJlbnR7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5ucHJvZ3Jlc3MtY3VzdG9tLXBhcmVudCAjbnByb2dyZXNzIC5iYXIsLm5wcm9ncmVzcy1jdXN0b20tcGFyZW50ICNucHJvZ3Jlc3MgLnNwaW5uZXJ7cG9zaXRpb246YWJzb2x1dGV9QC13ZWJraXQta2V5ZnJhbWVzIG5wcm9ncmVzcy1zcGlubmVyezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIG5wcm9ncmVzcy1zcGlubmVyezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fTwvc3R5bGU+Iik7Ci8vIOiuvue9rueql+WPowokKCdoZWFkJykuYXBwZW5kKCI8c3R5bGU+LmJsYWNrX292ZXJsYXl7dG9wOjAlO2xlZnQ6MCU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7ei1pbmRleDoxMDAxOy1tb3otb3BhY2l0eTowLjg7b3BhY2l0eTouMTA7ZmlsdGVyOmFscGhhKG9wYWNpdHk9ODgpfS5ibGFja19vdmVybGF5LC53aGl0ZV9jb250ZW50e2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZX0ud2hpdGVfY29udGVudHt6LWluZGV4Ojk5OTkhaW1wb3J0YW50O3RvcDoyNSU7bGVmdDoyNSU7d2lkdGg6NjUwcHg7aGVpZ2h0OjYwJTtwYWRkaW5nOjIwcHg7Ym9yZGVyOjBweDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC45KTt6LWluZGV4OjEwMDI7b3ZlcmZsb3c6YXV0b308L3N0eWxlPiIpOwovLyDmj5DnpLrmnaEKJCgnaGVhZCcpLmFwcGVuZCgiPHN0eWxlPi50cmlwc2NvbntwYWRkaW5nOjEwcHh9PC9zdHlsZT4iKTsKLy8g5oyJ6ZKu77yI5pen77yJCiQoJ2hlYWQnKS5hcHBlbmQoIjxzdHlsZT4jdG9nZ2xlLWJ1dHRvbntkaXNwbGF5Om5vbmV9LmJ1dHRvbi1sYWJlbHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo4MnB4O2JhY2tncm91bmQtY29sb3I6I2NjYztib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czozMHB4O2N1cnNvcjpwb2ludGVyfS5jaXJjbGV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5idXR0b24tbGFiZWwgLnRleHR7bGluZS1oZWlnaHQ6MzBweDtmb250LXNpemU6MThweDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0ub257Y29sb3I6I2ZmZjtkaXNwbGF5Om5vbmU7dGV4dC1pbmRlbnQ6MTBweH0ub2Zme2NvbG9yOiNmZmY7ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1pbmRlbnQ6NTNweH0uYnV0dG9uLWxhYmVsIC5jaXJjbGV7bGVmdDowO3RyYW5zaXRpb246YWxsIC4zc30jdG9nZ2xlLWJ1dHRvbjpjaGVja2VkK2xhYmVsLmJ1dHRvbi1sYWJlbCAuY2lyY2xle2xlZnQ6NTBweH0jdG9nZ2xlLWJ1dHRvbjpjaGVja2VkK2xhYmVsLmJ1dHRvbi1sYWJlbCAub257ZGlzcGxheTppbmxpbmUtYmxvY2t9I3RvZ2dsZS1idXR0b246Y2hlY2tlZCtsYWJlbC5idXR0b24tbGFiZWwgLm9mZntkaXNwbGF5Om5vbmV9I3RvZ2dsZS1idXR0b246Y2hlY2tlZCtsYWJlbC5idXR0b24tbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojNzhkNjkwfTwvc3R5bGU+Iik7Ci8vIOS/neWtmOaMiemSrgokKCdoZWFkJykuYXBwZW5kKCI8c3R5bGU+LnNhdmVCdXR0b257YmFja2dyb3VuZC1jb2xvcjojMTlhNGVkO2JvcmRlcjpub25lO2NvbG9yOiNmZmY7cGFkZGluZzo1cHggMTVweDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MTRweDtjdXJzb3I6cG9pbnRlcn08L3N0eWxlPiIpOwovLyBTdGFyIOagt+W8jwokKCdoZWFkJykuYXBwZW5kKCI8c3R5bGU+LmdpdmVNZU9uZVN0YXI6aG92ZXJ7Y29sb3I6I0ZGNjlCNDt9PC9zdHlsZT4iKTsKLy8g6K6+572u56qX5Y+j5paH5a2X5pWI5p6cCmlmIChpc0ZpcmVmb3goKSkgewogICAgJCgnaGVhZCcpLmFwcGVuZCgiPHN0eWxlPi5jb25maWdDb250YWluZXIgbGFiZWx7Zm9udC1zaXplOjE1cHh9LmNvbmZpZ0NvbnRhaW5lciBwe2ZvbnQtc2l6ZToxNXB4fS5naXZlTWVPbmVTdGFye2ZvbnQtc2l6ZToxNXB4fS5jb25maWdDb250YWluZXIgLnRpdGxle2ZvbnQtc2l6ZToyMHB4fS5jb25maWdDb250YWluZXIgLmJvbGR7Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW4tYm90dG9tOjVweH08L3N0eWxlPiIpOwp9IGVsc2UgewogICAgJCgnaGVhZCcpLmFwcGVuZCgiPHN0eWxlPi5jb25maWdDb250YWluZXIgbGFiZWx7Zm9udC1zaXplOjVweH0uY29uZmlnQ29udGFpbmVyIHB7Zm9udC1zaXplOjEwcHh9LmdpdmVNZU9uZVN0YXJ7Zm9udC1zaXplOjE1cHh9LmNvbmZpZ0NvbnRhaW5lciAudGl0bGV7Zm9udC1zaXplOjIwcHh9LmNvbmZpZ0NvbnRhaW5lciAuYm9sZHtmb250LXdlaWdodDpib2xkO21hcmdpbi1ib3R0b206NXB4fTwvc3R5bGU+Iik7Cn0KLy8gU1ZHCi8vdmFyIHNhdmVfc3ZnID0gJzxzdmcgdD0iMTU5NTA4MjY1MDE3MyIgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAxMDc1IDEwMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwLWlkPSIyMDc4IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjE0MCI+PHBhdGggZD0iTTc1My43NjM5MDIgNjg1LjgzMDI0NGE0OC45NTIxOTUgNDguOTUyMTk1IDAgMCAxIDQ5LjE1Mi00OC43MDI0MzljODEuNDIwNDg4IDAgMTQxLjE2MjE0Ni02NS4zODYxNDYgMTQxLjE2MjE0Ny0xNDYuMDU3MzY2IDAtNDMuNTA3NTEyLTEzLjAzNzI2OC04Mi40MTk1MTItNDMuNDU3NTYxLTEwOS4yNDMzMTdhMTQyLjM2MDk3NiAxNDIuMzYwOTc2IDAgMCAwLTIwLjI4MDE5NS0xNC45MzU0MTUgMTU4LjA0NTY1OSAxNTguMDQ1NjU5IDAgMCAwLTExLjIzOTAyNS02LjI0MzkwMmwtMi43NDczMTctMS4yOTg3MzJhMTU1Ljg0NzgwNSAxNTUuODQ3ODA1IDAgMCAwLTkuMTkxMDI0LTMuOTk2MDk3Yy0xLjM0ODY4My0wLjU0OTQ2My0yLjY5NzM2Ni0wLjk5OTAyNC00LjA5Ni0xLjQ5ODUzN2ExNTIuMzUxMjIgMTUyLjM1MTIyIDAgMCAwLTguNDkxNzA3LTIuODQ3MjE5Yy0xLjk0ODA5OC0wLjU5OTQxNS0zLjg5NjE5NS0wLjk5OTAyNC01Ljg0NDI5My0xLjQ5ODUzNy0yLjQ5NzU2MS0wLjU5OTQxNS00Ljk0NTE3MS0xLjI0ODc4LTcuNDkyNjgzLTEuNzQ4MjkzLTIuNTk3NDYzLTAuNDk5NTEyLTUuMzQ0NzgtMC44OTkxMjItOC4wNDIxNDYtMS4yNDg3OC0xLjk0ODA5OC0wLjI0OTc1Ni0zLjg0NjI0NC0wLjU5OTQxNS01Ljg0NDI5My0wLjc5OTIyYTE1My4xNTA0MzkgMTUzLjE1MDQzOSAwIDAgMC0xNC40MzU5MDMtMC43NDkyNjhjLTEuNDk4NTM3IDAtMi45OTcwNzMgMC4xOTk4MDUtNC41NDU1NjEgMC4yNDk3NTZhMjY1LjM5MDgyOSAyNjUuMzkwODI5IDAgMCAwLTUuNTk0NTM2LTI0LjUyNjA0OWMtMC40OTk1MTItMS45OTgwNDktMS4yOTg3MzItMy44NDYyNDQtMS44OTgxNDYtNS44NDQyOTJhMjY3LjQzODgyOSAyNjcuNDM4ODI5IDAgMCAwLTUuOTQ0MTk2LTE3Ljk4MjQzOWMtMC42NDkzNjYtMS43OTgyNDQtMS40OTg1MzctMy40OTY1ODUtMi4xOTc4NTMtNS4yOTQ4M2EyODMuMTIzNTEyIDI4My4xMjM1MTIgMCAwIDAtNy43NDI0MzktMTcuNzMyNjgzTDc3Mi43NDUzNjYgMjY5LjczNjU4NWEyODIuOTczNjU5IDI4Mi45NzM2NTkgMCAwIDAtOS43OTA0MzktMTcuODMyNTg1QzcxNC4zMDI0MzkgMTcxLjU4MjQzOSA2MjUuODg4NzggMTI0Ljg3ODA0OSA1MjQuNDg3ODA1IDEyNC44NzgwNDljLTEwMS40MDA5NzYgMC0xODkuOTE0NTM3IDQ2LjY1NDQzOS0yMzguNTE3MDczIDEyNi45NzYtMy40OTY1ODUgNS43OTQzNDEtNi42OTM0NjMgMTEuNzg4NDg4LTkuNzkwNDM5IDE3LjgzMjU4NWwtMi4xOTc4NTQgNC4wOTZhMjgzLjUyMzEyMiAyODMuNTIzMTIyIDAgMCAwLTcuNzQyNDM5IDE3LjczMjY4M2wtMi4xOTc4NTQgNS4yNDQ4NzhjLTIuMjQ3ODA1IDUuODk0MjQ0LTQuMTQ1OTUxIDExLjk4ODI5My01Ljk5NDE0NiAxOC4wMzIzOS0wLjU0OTQ2MyAxLjk5ODA0OS0xLjI5ODczMiAzLjg0NjI0NC0xLjg0ODE5NSA1Ljg0NDI5M2EyNjYuNzM5NTEyIDI2Ni43Mzk1MTIgMCAwIDAtNS41OTQ1MzcgMjQuNDc2MDk4Yy0xLjQ5ODUzNyAwLTIuOTk3MDczLTAuMTk5ODA1LTQuNTQ1NTYxLTAuMTk5ODA1LTQuODk1MjIgMC05LjY5MDUzNyAwLjI5OTcwNy0xNC40ODU4NTMgMC43NDkyNjgtMS45OTgwNDkgMC4xOTk4MDUtMy44NDYyNDQgMC40OTk1MTItNS43OTQzNDIgMC43OTkyMi0yLjY5NzM2NiAwLjM0OTY1OS01LjQ0NDY4MyAwLjY5OTMxNy04LjA5MjA5NyAxLjI0ODc4LTIuNDk3NTYxIDAuNDk5NTEyLTQuOTk1MTIyIDEuMTQ4ODc4LTcuNDkyNjgzIDEuNzQ4MjkzLTEuODk4MTQ2IDAuNDk5NTEyLTMuODQ2MjQ0IDAuODk5MTIyLTUuNzk0MzQyIDEuNDk4NTM2YTE1My42NDk5NTEgMTUzLjY0OTk1MSAwIDAgMC04LjQ5MTcwNyAyLjc5NzI2OWwtNC4wOTYgMS40OTg1MzZhMTY0LjI4OTU2MSAxNjQuMjg5NTYxIDAgMCAwLTkuMjQwOTc2IDMuOTk2MDk4bC0yLjY5NzM2NiAxLjM0ODY4M2ExNDUuNTU3ODU0IDE0NS41NTc4NTQgMCAwIDAtMzEuNDY5MjY4IDIxLjE3OTMxN0MxMTcuODg0ODc4IDQwOC42MDA5NzYgMTA0Ljg5NzU2MSA0NDcuNTYyOTI3IDEwNC44OTc1NjEgNDkxLjA3MDQzOWMwIDgwLjY3MTIyIDU5Ljc0MTY1OSAxNDYuMDU3MzY2IDE0MS4xNjIxNDYgMTQ2LjA1NzM2NmE0OC45NTIxOTUgNDguOTUyMTk1IDAgMCAxIDQ5LjE1MiA0OC43MDI0MzkgNDguOTUyMTk1IDQ4Ljk1MjE5NSAwIDAgMS00OS4xNTIgNDguNzAyNDM5Yy0xMzUuNzE3NDYzIDAtMjQ1LjcxMDA0OS0xMDguOTkzNTYxLTI0NS43MTAwNDgtMjQzLjQ2MjI0NCAwLTEwOS42OTI4NzggNzMuMjI4NDg4LTIwMi40MDIzNDEgMTczLjgzMDI0My0yMzIuODcyNTg1QTM3NS44MzI5NzYgMzc1LjgzMjk3NiAwIDAgMSA1MjQuNDg3ODA1IDIwLjMzMDE0NmEzNzUuODgyOTI3IDM3NS44ODI5MjcgMCAwIDEgMzUwLjMwNzkwMiAyMzcuODY3NzA4YzEwMC42MDE3NTYgMzAuNDcwMjQ0IDE3My44MzAyNDQgMTIzLjE3OTcwNyAxNzMuODMwMjQ0IDIzMi44NzI1ODUgMCAxMzQuNDY4NjgzLTEwOS45OTI1ODUgMjQzLjQ2MjI0NC0yNDUuNzEwMDQ5IDI0My40NjIyNDRhNDguOTUyMTk1IDQ4Ljk1MjE5NSAwIDAgMS00OS4xMDIwNDgtNDguNzAyNDM5eiIgcC1pZD0iMjA3OSI+PC9wYXRoPjxwYXRoIGQ9Ik00ODcuOTczNDYzIDM4Ni4xMjI5MjdhNDkuMTAyMDQ5IDQ5LjEwMjA0OSAwIDAgMSA3Mi45Mjg3ODEgMC4wOTk5MDJsMTQ3LjM1NjA5NyAxNjIuMDQxNzU2YzYuOTkzMTcxIDcuNzQyNDM5IDExLjQ4ODc4IDE5LjQzMTAyNCAxMi41Mzc3NTcgMzAuMTIwNTg2bDAuMjQ5NzU2IDEyLjkzNzM2NmMwIDE5LjQ4MDk3Ni0yMC40OCAzOS42NjEyNjgtMzkuMjExNzA4IDM5LjY2MTI2OGgtMTA0Ljg5NzU2MXYyNjIuOTkzMTcxYTUyLjQ0ODc4IDUyLjQ0ODc4IDAgMSAxLTEwNC44OTc1NjEgMHYtMjYyLjk5MzE3MWgtMTA0Ljg5NzU2MWMtMTMuODg2NDM5IDAtMzkuMjExNzA3LTIxLjcyODc4LTM5LjIxMTcwNy0zOS42NjEyNjh2LTEyLjk4NzMxN2MwLTEyLjQ4NzgwNSA0Ljc5NTMxNy0yMS4yNzkyMiAxMi42Mzc2NTktMjkuOTIwNzgxbDE0Ny4zNTYwOTctMTYyLjI5MTUxMnoiIHAtaWQ9IjIwODAiPjwvcGF0aD48L3N2Zz4nOwp2YXIgc3Rhcl9zdmdfMSA9ICc8c3ZnIHQ9IjE1OTUwODM2MzE2ODUiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTA1MSAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iMjE3MyIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPjxwYXRoIGQ9Ik01MjUuODM3ODM4IDg1Mi40MTA4MTFMMTk5LjI2NDg2NSAxMDAxLjg1OTQ1OWw0MS41MTM1MTMtMzU3LjAxNjIxNkwwIDM4MS45MjQzMjRsMzUxLjQ4MTA4MS02OS4xODkxODlMNTI1LjgzNzgzOCAwbDE3NC4zNTY3NTcgMzEyLjczNTEzNUwxMDUxLjY3NTY3NiAzODEuOTI0MzI0bC0yNDAuNzc4Mzc5IDI2Mi45MTg5MTkgNDEuNTEzNTE0IDM1Ny4wMTYyMTZ6IiBmaWxsPSIjRkZENTY2IiBwLWlkPSIyMTc0Ij48L3BhdGg+PC9zdmc+JzsKdmFyIHN0YXJfc3ZnXzIgPSAnIDxzdmcgdD0iMTU5NTA4MzcxNTMxMiIgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwLWlkPSI3ODQ4IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjE0MCI+PHBhdGggZD0iTTEwMTQuMDAxMzQ3IDg2Ni4wOTAyMzZMODEwLjIzNTY5IDY2Mi4zMjQ1NzlsMTQ1LjQ5NzY0My04NC4xMjY1OTljMTEuMzc3Nzc4LTYuNTUwODQyIDE3LjkyODYyLTE4Ljk2Mjk2MyAxNi44OTQyNzYtMzIuMDY0NjQ3LTEuMDM0MzQzLTEzLjEwMTY4NC05LjMwOTA5MS0yNC40Nzk0NjEtMjEuMzc2NDMxLTI5LjMwNjM5N2wtNjQ4LjE4ODU1Mi0yNTguNTg1ODU5Yy0xMi43NTY5MDItNS4xNzE3MTctMjcuMjM3NzEtMi4wNjg2ODctMzYuODkxNTgyIDcuNTg1MTg2LTkuNjUzODcyIDkuNjUzODcyLTEyLjc1NjkwMiAyNC4xMzQ2OC03LjU4NTE4NSAzNi44OTE1ODJsMjU4LjU4NTg1OCA2NDguNTMzMzMzYzQuODI2OTM2IDEyLjA2NzM0IDE2LjIwNDcxNCAyMC42ODY4NjkgMjkuMzA2Mzk3IDIxLjM3NjQzMSAxMy4xMDE2ODQgMS4wMzQzNDMgMjUuNTEzODA1LTUuNTE2NDk4IDMyLjA2NDY0Ny0xNi44OTQyNzZsODQuMTI2NTk5LTE0NS40OTc2NDMgMjAzLjc2NTY1NyAyMDMuNzY1NjU3YzYuNTUwODQyIDYuNTUwODQyIDE1LjE3MDM3IDkuOTk4NjUzIDI0LjEzNDY4IDkuOTk4NjUzIDguOTY0MzEgMCAxNy45Mjg2Mi0zLjQ0NzgxMSAyNC4xMzQ2OC05Ljk5ODY1M2w5OS4yOTY5Ny05OS4yOTY5N2MxMy40NDY0NjUtMTMuNDQ2NDY1IDEzLjQ0NjQ2NS0zNS4xNjc2NzcgMC00OC42MTQxNDF6TTE1MC4zMjQ1NzkgMTAyLjA1NTIxOWMtMTMuNDQ2NDY1LTEzLjQ0NjQ2NS0zNS4xNjc2NzctMTMuNDQ2NDY1LTQ4LjI2OTM2IDAtMTMuNDQ2NDY1IDEzLjQ0NjQ2NS0xMy40NDY0NjUgMzUuMTY3Njc3IDAgNDguMjY5MzZsNzYuMTk2NjMzIDc2LjE5NjYzM2M2LjU1MDg0MiA2LjU1MDg0MiAxNS41MTUxNTIgOS45OTg2NTMgMjQuMTM0NjggOS45OTg2NTNzMTcuNTgzODM4LTMuNDQ3ODExIDI0LjEzNDY4LTkuOTk4NjUzYzEzLjQ0NjQ2NS0xMy40NDY0NjUgMTMuNDQ2NDY1LTM1LjE2NzY3NyAwLTQ4LjI2OTM2TDE1MC4zMjQ1NzkgMTAyLjA1NTIxOXpNMTc2LjE4MzE2NSAzMzguNTc1MDg0YzAtMTguOTYyOTYzLTE1LjE3MDM3LTM0LjEzMzMzMy0zNC4xMzMzMzMtMzQuMTMzMzMzSDM0LjEzMzMzM2MtMTguOTYyOTYzIDAtMzQuMTMzMzMzIDE1LjE3MDM3LTM0LjEzMzMzMyAzNC4xMzMzMzNzMTUuMTcwMzcgMzQuMTMzMzMzIDM0LjEzMzMzMyAzNC4xMzMzMzRoMTA3LjU3MTcxOGMxOC45NjI5NjMgMCAzNC40NzgxMTQtMTUuMTcwMzcgMzQuNDc4MTE0LTM0LjEzMzMzNHpNMTYyLjM5MTkxOSA0NDQuNDIyODk2bC03Ni4xOTY2MzMgNzUuODUxODUxYy0xMy40NDY0NjUgMTMuNDQ2NDY1LTEzLjQ0NjQ2NSAzNS4xNjc2NzcgMCA0OC4yNjkzNjEgNi41NTA4NDIgNi41NTA4NDIgMTUuNTE1MTUyIDkuOTk4NjUzIDI0LjEzNDY4IDkuOTk4NjUzczE3LjU4MzgzOC0zLjQ0NzgxMSAyNC4xMzQ2OC05Ljk5ODY1M2w3Ni4xOTY2MzMtNzYuMTk2NjMzYzEzLjQ0NjQ2NS0xMy40NDY0NjUgMTMuNDQ2NDY1LTM1LjE2NzY3NyAwLTQ4LjI2OTM2MS0xMy40NDY0NjUtMTMuMTAxNjg0LTM1LjE2NzY3Ny0xMy4xMDE2ODQtNDguMjY5MzYgMC4zNDQ3ODJ6TTMzOC41NzUwODQgMTc2LjE4MzE2NWMxOC45NjI5NjMgMCAzNC4xMzMzMzMtMTUuMTcwMzcgMzQuMTMzMzM0LTM0LjEzMzMzM1YzNC4xMzMzMzNjMC0xOC45NjI5NjMtMTUuMTcwMzctMzQuMTMzMzMzLTM0LjEzMzMzNC0zNC4xMzMzMzNzLTM0LjEzMzMzMyAxNS4xNzAzNy0zNC4xMzMzMzMgMzQuMTMzMzMzdjEwNy41NzE3MThjMCAxOC45NjI5NjMgMTUuMTcwMzcgMzQuNDc4MTE0IDM0LjEzMzMzMyAzNC40NzgxMTR6TTQ2OC41NTc1NzYgMjIwLjY1OTkzM2M4LjYxOTUyOSAwIDE3LjU4MzgzOC0zLjQ0NzgxMSAyNC4xMzQ2OC05Ljk5ODY1NEw1NjguODg4ODg5IDEzNC40NjQ2NDZjMTMuNDQ2NDY1LTEzLjQ0NjQ2NSAxMy40NDY0NjUtMzUuMTY3Njc3IDAtNDguMjY5MzYtMTMuNDQ2NDY1LTEzLjQ0NjQ2NS0zNS4xNjc2NzctMTMuNDQ2NDY1LTQ4LjI2OTM2IDBsLTc2LjE5NjYzMyA3Ni4xOTY2MzNjLTEzLjQ0NjQ2NSAxMy40NDY0NjUtMTMuNDQ2NDY1IDM1LjE2NzY3NyAwIDQ4LjI2OTM2IDYuNTUwODQyIDYuNTUwODQyIDE1LjUxNTE1MiA5Ljk5ODY1MyAyNC4xMzQ2OCA5Ljk5ODY1NHoiIGZpbGw9IiMyYzJjMmMiIHAtaWQ9Ijc4NDkiPjwvcGF0aD48L3N2Zz4nOwp2YXIgc3Rhcl9zdmdfMyA9ICcgPHN2ZyB0PSIxNTk1MDgzOTI1NDM4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEyMDQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQ4MDkiIHdpZHRoPSIxNDAiIGhlaWdodD0iMTQwIj48cGF0aCBkPSJNMTA4OC44NjQzNDggNjE4LjEzNzAxYTE1NTUuMDA5Mzg0IDE1NTUuMDA5Mzg0IDAgMCAxLTE1MC4yNzMwMDQgMTY3LjEzNzMwOGMtNTIuODgxNjQyIDUxLjE5NTIxMi0xMDcuOTMxNTUyIDEwMS4xODU4My0xNjMuNjQzOTg5IDE0Ny4yNjE1MjEtMzMuODQ5MDY5IDI3LjUyNDk1NS02MC4yMjk2NjEgNDguNjY1NTY2LTc2LjE5MDUyMSA2MC4yMjk2NjFhMTYyLjk4MTQ2MiAxNjIuOTgxNDYyIDAgMCAxLTE5MS44OTE2OTkgMGMtMTUuNTM5MjUzLTEyLjA0NTkzMi00Mi4xNjA3NjMtMzIuNjQ0NDc2LTc2LjE5MDUyMS02MC44MzE5NTdhMjYzOC40ODA3NTQgMjYzOC40ODA3NTQgMCAwIDEtMTY0LjM2Njc0NS0xNDcuMjYxNTIxIDE1NzkuMTAxMjQ5IDE1NzkuMTAxMjQ5IDAgMCAxLTE1MC4yNzMwMDQtMTY1LjgxMjI1N0E0NjguMTA0OTI0IDQ2OC4xMDQ5MjQgMCAwIDEgMC4xNTI5OTggMzQ0Ljc1NDU3OSAzMTUuNTQzMTkzIDMxNS41NDMxOTMgMCAwIDEgMTA5LjA0ODIyNSA5Ni4zNjc0NTdhMzk5LjQ0MzExMSAzOTkuNDQzMTExIDAgMCAxIDQ5My44ODMyMTktMjAuNDc4MDg0IDM5OC42NjAxMjUgMzk4LjY2MDEyNSAwIDAgMSA0OTMuODgzMjE5IDIwLjQ3ODA4NEEzMTUuNDgyOTY0IDMxNS40ODI5NjQgMCAwIDEgMTIwNC43NDYyMTUgMzQzLjMwOTA2N2E0NjYuODQwMTAxIDQ2Ni44NDAxMDEgMCAwIDEtMTE1LjcwMTE3OCAyNzQuNjQ3MjU0eiIgZmlsbD0iI0ZFNEI4MyIgcC1pZD0iNDgxMCI+PC9wYXRoPjwvc3ZnPic7CnZhciBzdGFyX3N2Z180ID0gJyA8c3ZnIHQ9IjE1OTUwODQwODkxMTUiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iODAwOCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPjxwYXRoIGQ9Ik01MTIgNDYuNTQ1NDU1QzI1NiA0Ni41NDU0NTUgNDYuNTQ1NDU1IDI1NiA0Ni41NDU0NTUgNTEyczIwOS40NTQ1NDUgNDY1LjQ1NDU0NSA0NjUuNDU0NTQ1IDQ2NS40NTQ1NDUgNDY1LjQ1NDU0NS0yMDkuNDU0NTQ1IDQ2NS40NTQ1NDUtNDY1LjQ1NDU0NVM3NjggNDYuNTQ1NDU1IDUxMiA0Ni41NDU0NTV6IG0wIDgzNy44MTgxODFjLTIwNC44IDAtMzcyLjM2MzYzNi0xNjcuNTYzNjM2LTM3Mi4zNjM2MzYtMzcyLjM2MzYzNnMxNjcuNTYzNjM2LTM3Mi4zNjM2MzYgMzcyLjM2MzYzNi0zNzIuMzYzNjM2IDM3Mi4zNjM2MzYgMTY3LjU2MzYzNiAzNzIuMzYzNjM2IDM3Mi4zNjM2MzYtMTY3LjU2MzYzNiAzNzIuMzYzNjM2LTM3Mi4zNjM2MzYgMzcyLjM2MzYzNnoiIGZpbGw9IiMwMEM1QzUiIHAtaWQ9IjgwMDkiPjwvcGF0aD48cGF0aCBkPSJNNjU2LjI5MDkwOSA1ODYuNDcyNzI3Yy03OS4xMjcyNzMgNjkuODE4MTgyLTIwOS40NTQ1NDUgNjkuODE4MTgyLTI4OC41ODE4MTggMC0xOC42MTgxODItMTMuOTYzNjM2LTQxLjg5MDkwOS0xMy45NjM2MzYtNjAuNTA5MDkxIDQuNjU0NTQ2LTEzLjk2MzYzNiAxMy45NjM2MzYtMTMuOTYzNjM2IDQxLjg5MDkwOSA0LjY1NDU0NSA2MC41MDkwOTEgNTUuODU0NTQ1IDUxLjIgMTI1LjY3MjcyNyA3NC40NzI3MjcgMjAwLjE0NTQ1NSA3NC40NzI3MjdzMTQ0LjI5MDkwOS0yNy45MjcyNzMgMjAwLjE0NTQ1NS03NC40NzI3MjdjMTguNjE4MTgyLTEzLjk2MzYzNiAxOC42MTgxODItNDEuODkwOTA5IDQuNjU0NTQ1LTYwLjUwOTA5MXMtNDEuODkwOTA5LTE4LjYxODE4Mi02MC41MDkwOTEtNC42NTQ1NDZ6TTM1OC40IDQ2MC44YzI3LjkyNzI3MyAwIDUxLjItMjMuMjcyNzI3IDUxLjItNTEuMnMtMjMuMjcyNzI3LTU1Ljg1NDU0NS01MS4yLTU1Ljg1NDU0NWMtMjcuOTI3MjczIDAtNTEuMiAyMy4yNzI3MjctNTEuMiA1MS4yczIzLjI3MjcyNyA1NS44NTQ1NDUgNTEuMiA1NS44NTQ1NDV6TTY2NS42IDQ2MC44YzI3LjkyNzI3MyAwIDUxLjItMjMuMjcyNzI3IDUxLjItNTEuMnMtMjMuMjcyNzI3LTUxLjItNTEuMi01MS4yLTUxLjIgMjMuMjcyNzI3LTUxLjIgNTEuMiAyMy4yNzI3MjcgNTEuMiA1MS4yIDUxLjJ6IiBmaWxsPSIjMDBDNUM1IiBwLWlkPSI4MDEwIj48L3BhdGg+PC9zdmc+JzsKdmFyIHN0YXJfc3ZnID0gc3Rhcl9zdmdfMSArIHN0YXJfc3ZnXzIgKyBzdGFyX3N2Z18zICsgc3Rhcl9zdmdfNDsKdmFyIGRvbmF0ZV9zdmcgPSAnPHN2ZyB0PSIxNTkyOTgyNTA4MjU4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQyMDciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PHBhdGggZD0iTTY2NC40OCAyMzQuNDMyYTMyIDMyIDAgMCAwLTQ1LjI0OC0wLjhsLTc2LjI1NiA3My42LTczLjM0NC03My4yMTZhMzIgMzIgMCAxIDAtNDUuMjQ4IDQ1LjMxMmw3Mi4zODQgNzIuMjU2aC00OS4yOGEzMiAzMiAwIDAgMCAwIDY0aDYzLjc3NnYzMmgtNjMuNzc2YTMyIDMyIDAgMCAwIDAgNjRoNjMuNzc2djY1LjY2NGEzMiAzMiAwIDEgMCA2NCAwdi02NS42NjRoNjQuMjg4YTMyIDMyIDAgMSAwIDAtNjRoLTY0LjI4OHYtMzJoNjQuMjg4YTMyIDMyIDAgMSAwIDAtNjRoLTUwLjM2OGw3NC40NjQtNzEuODcyYTMyLjAzMiAzMi4wMzIgMCAwIDAgMC44MzItNDUuMjh6IG0yNzUuMiA1MDMuNTUyYTkwMTcuNTY4IDkwMTcuNTY4IDAgMCAwLTE0MS42NjQtNTYuNzM2IDM2OC41MTIgMzY4LjUxMiAwIDAgMCA5Ny41NjgtMjQ4LjYwOGMwLTIwMi45MTItMTY1LjEyLTM2OC0zNjguMDY0LTM2OHMtMzY4IDE2NS4wODgtMzY4IDM2OGMwIDE2LjIyNCAxLjAyNCAzMi4zNTIgMy4wNzIgNDcuOTY4IDIuMzA0IDE3LjUwNCAxOC40OTYgMjkuNjY0IDM1LjkwNCAyNy41ODRhMzIgMzIgMCAwIDAgMjcuNTg0LTM1LjkwNCAzMDQuNTEyIDMwNC41MTIgMCAwIDEtMi41Ni0zOS42NDhjMC0xNjcuNjE2IDEzNi4zODQtMzA0IDMwNC0zMDQgMTY3LjY0OCAwIDMwNC4wNjQgMTM2LjM4NCAzMDQuMDY0IDMwNGEzMDAuNTQ0IDMwMC41NDQgMCAwIDEtOTYuMTI4IDIyMS40NzJjLTAuNzY4IDAuNzM2LTEuMDg4IDEuNzYtMS44MjQgMi41MjgtNDIuODQ4LTE1LjkzNi03OS4zMjgtMjguNDgtOTMuNzYtMzAuNjU2LTI0Ljg5Ni0zLjkwNC00OC42NzIgNy42MTYtNjMuMTA0IDI4Ljg5Ni0xMi4wMzIgMTcuNzkyLTE1LjA3MiAzOC44MTYtOC4wOTYgNTYuMjU2IDQuMjg4IDEwLjY1NiAyMC41MTIgMzIuODk2IDM5Ljc3NiA1Ny4yOC00Ni40MzItMC4wNjQtMTE3LjMxMi02LjMzNi0xOTIuODMyLTM1LjQ4OC0zMS4yNjQtMTIuMDY0LTY5LjQ0LTUyLjY0LTEwMy4xMzYtODguNDE2LTQ3Ljk2OC01MC45NzYtOTMuMjgtOTkuMTA0LTE0Mi41Ni05OS4xMDQtMTguMzM2IDAtMzUuNzQ0IDYuODQ4LTUwLjMzNiAxOS43NzYtMTguMjQgMTYuMjI0LTM1LjEzNiA0OC4zMi0xMiAxMDkuMjQ4IDQyLjYyNCAxMTIuMTYgMjA4LjU0NCAyODUuMTIgMzQxLjcyOCAyODUuMTJoNDc4LjE0NGEzMiAzMiAwIDAgMCAzMi0zMnYtMTYwYTMxLjg0IDMxLjg0IDAgMCAwLTE5Ljc3Ni0yOS41Njh6IG0tNDQuMTYgMTU3LjZoLTQ0NS4xMmwtMS4wMjQgMzJ2LTMyYy05Ny42IDAtMjQ3LjA3Mi0xNTIuMTI4LTI4MS45Mi0yNDMuODcyLTEwLjExMi0yNi42NTYtNi43Mi0zNy40MDgtNS4zNDQtMzguNjI0IDQuMTI4LTMuNjQ4IDYuNTI4LTMuNjQ4IDcuODQtMy42NDggMjEuNjMyIDAgNjQuNjA4IDQ1LjYzMiA5NS45NjggNzguOTQ0IDQwLjIyNCA0Mi43NTIgODEuODU2IDg2Ljk0NCAxMjYuNjU2IDEwNC4yNTYgODUuMjE2IDMyLjg5NiAxNjQuODk2IDM5LjgwOCAyMTYuNzM2IDM5LjgwOCA0MS4zNzYgMCA2Ny41ODQtNC4zNTIgNjguNjcyLTQuNTQ0YTMyIDMyIDAgMCAwIDE5LjEzNi01Mi4xNmMtMjcuMDA4LTMyLjA5Ni01OC41OTItNzEuODA4LTY3LjI5Ni04NS4zNDQgMC4yODgtMC41NzYgMC41MTItMS4wMjQgMC4zNTItMS4xNTIgMjIuODQ4IDMuNDg4IDE2Mi40MzIgNTcuOTUyIDI2NS4yOCA5OS44NHYxMDYuNDk2eiIgcC1pZD0iNDIwOCI+PC9wYXRoPjwvc3ZnPic7CnZhciBzZXRfc3ZnID0gJzxzdmcgdD0iMTU5Mjk4Mjk3MDM3NSIgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwLWlkPSIxMDExMiIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48cGF0aCBkPSJNMjU2IDEwMi40aDUxMmwyNTYgMjU2LTUxMiA1NjMuMkwwIDM1OC40eiIgZmlsbD0iIzI2Q0Q2MyIgcC1pZD0iMTAxMTMiPjwvcGF0aD48cGF0aCBkPSJNMjU2IDEwMi40bDI1NiAyNTZIMHpNNzY4IDEwMi40bDI1NiAyNTZINTEyek01MTIgOTIxLjZsMjA0LjgtNTYzLjJIMzA3LjJ6IiBmaWxsPSIjMTRBMzQ1IiBwLWlkPSIxMDExNCI+PC9wYXRoPjwvc3ZnPic7CnZhciBzYXZlX3N2ZyA9ICc8c3ZnIHQ9IjE2Mjk0NDg1ODgzNTEiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iNzg0OSIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPjxwYXRoIGQ9Ik01MTIgMEMyMjkuMiAwIDAgMjI5LjIgMCA1MTJzMjI5LjIgNTEyIDUxMiA1MTIgNTEyLTIyOS4yIDUxMi01MTJTNzk0LjggMCA1MTIgMHogbTAgOTQ1LjJDMjczLjEgOTQ1LjIgNzguOCA3NTAuOSA3OC44IDUxMlMyNzMuMSA3OC44IDUxMiA3OC44IDk0NS4yIDI3My4xIDk0NS4yIDUxMiA3NTAuOSA5NDUuMiA1MTIgOTQ1LjJ6IiBwLWlkPSI3ODUwIiBmaWxsPSIjZmZmZmZmIj48L3BhdGg+PHBhdGggZD0iTTY4MC45IDM1OS40TDQ2MSA1ODIuMyAzNDEuNiA0NzMuNmMtMTYtMTQuNi00MS0xMy40LTU1LjYgMi42LTE0LjcgMTYuMS0xMy41IDQxIDIuNiA1NS42TDQzNiA2NjYuMWM3LjUgNi44IDE3IDEwLjIgMjYuNSAxMC4yIDEwLjIgMCAyMC4zLTMuOSAyOC0xMS43TDczNyA0MTQuN2MxNS4zLTE1LjUgMTUuMS00MC40LTAuNC01NS43LTE1LjUtMTUuMi00MC41LTE1LjEtNTUuNyAwLjR6IiBwLWlkPSI3ODUxIiBmaWxsPSIjZmZmZmZmIj48L3BhdGg+PC9zdmc+JzsKdmFyIHNldHRpbmdzX3N2ZyA9ICc8c3ZnIHQ9IjE2Mjk0MzMzNjA0NjIiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iMjg3MCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPjxwYXRoIGQ9Ik0xMDA2LjQzOCAxNy41NDhjLTAuMDMyIDAtNDMwLjQzLTExMi45NjYtNzgwLjQ1IDIzNy4wMjItMjg4Ljk5IDI4OS4wMDgtMzMuNTIyIDU3Ni45NjYtMzMuNTIyIDU3Ni45NjZzMjg3Ljk1OCAyNTUuNDg0IDU3Ni45NTItMzMuNTVDMTExOS40MzYgNDQ4LjAxMiAxMDA2LjQ2OCAxNy42MTIgMTAwNi40MzggMTcuNTQ4eiIgZmlsbD0iIzlFRDM2QSIgcC1pZD0iMjg3MSI+PC9wYXRoPjxwYXRoIGQ9Ik0xMDA2LjQzOCAxNy41NDhsLTQyLjY3NC04LjIxNmMwLjAzMiAwLjA2MiAxMTIuOTk4IDQzOC42NzgtMjM2Ljk5IDc4OC42NTItOTYuMzQ0IDk2LjQwNi0xOTIuNTk4IDEzMi4yMDgtMjc4LjEwNCAxMzcuMTQ0IDk1LjQxIDUuNSAyMDgtMjQuMzY4IDMyMC43NDgtMTM3LjE0NEMxMTE5LjQzNiA0NDguMDEyIDEwMDYuNDY4IDE3LjYxMiAxMDA2LjQzOCAxNy41NDh6IiBmaWxsPSIjRkZGRkZGIiBvcGFjaXR5PSIuMiIgcC1pZD0iMjg3MiI+PC9wYXRoPjxwYXRoIGQ9Ik02MDAuNDA2IDQyMy42MTJjLTguMzA4LTguMzQtMjEuODM2LTguMzQtMzAuMTQ4IDBMNi40IDk4Ny40MjZjLTguMzI2IDguMzcyLTguMzI2IDIxLjg2OCAwIDMwLjE4IDguMzI2IDguMzA4IDIxLjgyMiA4LjMwOCAzMC4xNjIgMEw2MDAuNDA2IDQ1My43NmM4LjM0LTguMzQyIDguMzQtMjEuODM4IDAtMzAuMTQ4eiIgZmlsbD0iIzhBQzA1NCIgcC1pZD0iMjg3MyI+PC9wYXRoPjwvc3ZnPic7CnZhciBwcm90ZWN0X3N2ZyA9ICc8c3ZnIHQ9IjE2Mjk1NjA1Mzg4MDUiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iMzIxMiIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPjxwYXRoIGQ9Ik04MDAuMyAyMDUuMUw1MzQuOCAxMTZjLTE2LTUuNC0zMy4zLTUuMy00OS4yIDAuMmwtMjY0LjUgOTIuM2MtMjkuMyAxMC00OSAzNy41LTQ5LjEgNjguNGwxLjcgMjY1LjRjMC43IDgxIDMxLjEgMTU4LjkgODUuNiAyMTguOSAyNSAyNy43IDU2LjkgNTEuNSA5Ny44IDcyLjdsMTQ0IDc0LjZjOSA0LjcgMTkuNyA0LjYgMjguNy0wLjJMNjcyLjUgODMyYzQwLjQtMjEuNiA3Mi4yLTQ1LjcgOTYuOS03My44IDUzLjYtNjAuNiA4My0xMzguOSA4Mi42LTIxOS44bC0xLjctMjY1LjZjLTAuNS0zMC45LTIwLjUtNTguMS01MC02Ny43eiIgZmlsbD0iIzA3QzE2MCIgcC1pZD0iMzIxMyI+PC9wYXRoPjxwYXRoIGQ9Ik00NzQuMSA2NTJjLTcuMSAwLTEzLjgtMi44LTE4LjktNy44bC0xNTEtMTUxLjFjLTEwLjQtMTAuNC0xMC40LTI3LjQgMC0zNy44czI3LjQtMTAuNCAzNy44IDBsMTMyLjEgMTMyLjIgMjA3LjctMjA3LjdjMTAuNC0xMC40IDI3LjQtMTAuNCAzNy44IDAgMTAuNCAxMC40IDEwLjQgMjcuNCAwIDM3LjhMNDkzIDY0NC4yYy01IDUtMTEuOCA3LjgtMTguOSA3Ljh6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSIzMjE0Ij48L3BhdGg+PC9zdmc+JzsKCi8vIGpxdWVyeS5zaG93dGlwcy5qcwooZnVuY3Rpb24oalF1ZXJ5KSB7CglqUXVlcnkuZm4uc2hvd1RpcHMgPSBmdW5jdGlvbihvcHRpb25zLGVsZW0pewoJCXZhciBjb25maWcgPSB7CgkJCXNraW46InRyaXBzIiwKCQkJY29udGVudDokKHRoaXMpLmF0dHIoInRpcHMiKXx8IuW8ueWHuuexu+Wei+eahOawlOazoeaPkOekuu+8gSIsICAvL+awlOazoeaPkOekuuWGheWuuemHjOmdouWPr+S7peaYr0hUTUzvvIzpu5jorqTmmL7npLroh6rlrprkuYnnmoTmj5DnpLrlhoXlrrkKCQkJd2lkdGg6ImF1dG8iLCAgLy/pu5jorqTkuLphdXRv77yM5Y+v5Lul5YaZ5YW35L2T5bC65a+45aaC77yaMjAwCgkJCWFsaWduVG86WyJyaWdodCIsImNlbnRlciJdLCAgLy/nrq3lpLTmlrnlkJEKCQkJY29sb3I6WyJyZ2IoMjQ3LCAyMDYsIDU3KSIsIiNGRkZFRjQiXSwgIC8v6L+Z6YeM5piv5o+Q56S65bGC55qE6aOO5qC877yM56ys5LiA5Liq5Y+C5pWw5Li65o+Q56S66L655qGG6aKc6Imy77yM56ys5LqM5Liq5Y+C5pWw5Li65o+Q56S66IOM5pmv6aKc6ImyCgkJCXR5cGU6Imh0bWwiLCAgIC8v5pi+56S65YaF5a6557G75Z6LCgkJCXRyaWdnZXI6ImNsaWNrIiwgICAgLy/pu5jorqTkuLrngrnlh7vmmL7npLrvvIxzaG935Li65Yid5aeL5YyW5bCx5pi+56S677yMaG92ZXLkuLrnu4/ov4fmmL7npLrvvIxmb2N1c+eEpueCueaYvuekuu+8jG1vdXNl6Lef6ZqP6byg5qCH5pi+56S66ZqQ6JePCgkJCXNwYWNpbmc6MTAsICAvL+m7mOiupOS4uueureWktOi3neemu+WvueixoeeahOWwuuWvuAoJCQljdXN0b21pZDoiIiwgIC8v6Ieq5a6a5LmJSUQKCQkJaXNjbG9zZTpmYWxzZSwgICAvL+aYr+WQpuaYvuekuuWFs+mXreaMiemSrgoJCQlzdWNjZXNzIDogbnVsbCAgICAvL+aIkOWKn+WQjueahOWbnuiwg+WHveaVsAoJCX07CgkJdmFyIG9wdHMgPSBqUXVlcnkuZXh0ZW5kKGNvbmZpZywgb3B0aW9ucyk7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQl2YXIgdGhhdCA9IGpRdWVyeSh0aGlzKSx0aXBCb3gsdGlwSWQsc2VsZkgsc2VsZlcsY29uSWQsZG9jVywgc3BhID0gb3B0cy5zcGFjaW5nLCBza2luPW9wdHMuc2tpbjsKCQkJdmFyIE1hdGhyYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5OTk5OTk5KTsKICAgICAgICAgICAgdmFyIHBtciA9IChvcHRzLmN1c3RvbWlkPT0iIikgPyBNYXRocmFuZG9tIDpvcHRzLmN1c3RvbWlkLnJlcGxhY2UoL1sjLl0vLCAiIik7CgkJCXZhciBwb2ludGVyPW9wdHMuYWxpZ25Uby5sZW5ndGg9PT0xID8gJycrb3B0cy5hbGlnblRvWzBdKycnIDogJycrb3B0cy5hbGlnblRvWzBdKyctJytvcHRzLmFsaWduVG9bMV0rJyc7CgoJCQlpZih0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJykgewoJCQkJaWYoZWxlbSA9PSJzaG93Iil7CgkJCQkJalF1ZXJ5KCcjdGlwJytwbXIpLnNob3coKTsgIGpRdWVyeSgiI2NvbiIrcG1yKS5odG1sKG9wdHMuY29udGVudCk7CgkJCQkJc2hvd1Bvc2l0aW9uKHBvaW50ZXIsalF1ZXJ5KCcjdGlwJytwbXIpKTsKCQkJCQl9OwoJCQkJaWYoZWxlbSA9PSJoaWRlIil7alF1ZXJ5KCcjdGlwJytwbXIpLmhpZGUoKX07CgkJCX07CgkJCWlmKHR5cGVvZiBlbGVtID09ICcnIHx8IHR5cGVvZiBlbGVtID09IHVuZGVmaW5lZCl7cmV0dXJuIHRydWV9OwoJCQlpZihqUXVlcnkoJyN0aXAnK3BtcikubGVuZ3RoPT0xKXtyZXR1cm4gZmFsc2U7fQoJCQl0aXBCb3g9alF1ZXJ5KCc8ZGl2IGNsYXNzPSInK3NraW4rJyAnK3NraW4rJy0nK3BvaW50ZXIrJyIgaWQ9InRpcCcrcG1yKyciPjxpPjwvaT48ZW0+PC9lbT48ZGl2IGNsYXNzPSInK3NraW4rJ2NvbiIgaWQ9ImNvbicrcG1yKyciPjwvZGl2PjwvZGl2PicpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwoJCQl0aXBJZCA9IGpRdWVyeSgiI3RpcCIrcG1yKTsKCQkJY29uSWQgPSBqUXVlcnkoIiNjb24iK3Btcik7CgoJCQl2YXIgZWRnZWNvbG9yPSdib3JkZXItJytvcHRzLmFsaWduVG9bMF0rJy1jb2xvcicsIHRmaT10aXBJZC5maW5kKCJpIiksIHRmZW09dGlwSWQuZmluZCgiZW0iKSwgdGZpZW09dGlwSWQuZmluZCgiaSxlbSIpOwoJCQl0aXBJZC5jc3Moeydwb3NpdGlvbic6J2Fic29sdXRlJyxib3JkZXI6JzFweCBzb2xpZCcsJ2JvcmRlci1jb2xvcic6b3B0cy5jb2xvclswXSwnYmFja2dyb3VuZC1jb2xvcic6b3B0cy5jb2xvclsxXX0pOwoJCQlpZihvcHRzLmFsaWduVG9bMV09PSdjZW50ZXInKXsgdmFyIG9mZnBvcz01MCxwZXJjZW49IiUiOyB9ZWxzZXsgdmFyIG9mZnBvcz01LHBlcmNlbj0icHgiOyB9OwoJCQl0ZmllbS5jc3Moe3dpZHRoOjAsaGVpZ2h0OjAsY29udGVudDonJywncG9zaXRpb24nOidhYnNvbHV0ZSd9KQoJCQl0ZmkuY3NzKHtib3JkZXI6JzhweCBzb2xpZCB0cmFuc3BhcmVudCcsJ3otaW5kZXgnOjV9KTsKCQkJdGZlbS5jc3Moe2JvcmRlcjonN3B4IHNvbGlkIHRyYW5zcGFyZW50Jywnei1pbmRleCc6MTB9KTsKCQkJc3dpdGNoIChwb2ludGVyKSB7CgkJCQljYXNlICd0b3AtY2VudGVyJzoKCQkJCWNhc2UgJ2JvdHRvbS1jZW50ZXInOgoJCQkJY2FzZSAndG9wLWxlZnQnOgoJCQkJY2FzZSAnYm90dG9tLWxlZnQnOgoJCQkJCXZhciBwb2k9ImxlZnQiOwoJCQkJCWlmKHBvaW50ZXI9PSd0b3AtY2VudGVyJyB8fCBwb2ludGVyPT0nYm90dG9tLWNlbnRlcicpewoJCQkJCQl0ZmkuY3NzKHsibWFyZ2luLWxlZnQiOiItOHB4In0pOwoJCQkJCQl0ZmVtLmNzcyh7Im1hcmdpbi1sZWZ0IjoiLTdweCJ9KTsKCQkJCQl9CgkJCQkgICAgYnJlYWs7CgkJCQljYXNlICdsZWZ0LWNlbnRlcic6CgkJCQljYXNlICdyaWdodC1jZW50ZXInOgoJCQkJY2FzZSAnbGVmdC10b3AnOgoJCQkJY2FzZSAncmlnaHQtdG9wJzoKCQkJCQl2YXIgcG9pPSJ0b3AiOwoJCQkJCWlmKHBvaW50ZXI9PSdsZWZ0LWNlbnRlcicgfHwgcG9pbnRlcj09J3JpZ2h0LWNlbnRlcicpewoJCQkJCQl0ZmkuY3NzKHsibWFyZ2luLXRvcCI6Ii04cHgifSk7CgkJCQkJCXRmZW0uY3NzKHsibWFyZ2luLXRvcCI6Ii03cHgifSk7CgkJCQkJfQoJCQkJICAgIGJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQl2YXIgcG9pPSJyaWdodCI7CgkJCQkgICAgYnJlYWs7CgkJCX07CgoJCQlpZihwb2ludGVyPT0nZm9sbG93Jyl7CgkJCQl0ZmkuY3NzKHsnYm9yZGVyLWJvdHRvbS1jb2xvcic6b3B0cy5jb2xvclswXSxsZWZ0OicnK29mZnBvcytwZXJjZW4rJycsYm90dG9tOicxMDAlJ30pOwoJCQkJdGZlbS5jc3Moeydib3JkZXItYm90dG9tLWNvbG9yJzpvcHRzLmNvbG9yWzFdLGxlZnQ6JycrKG9mZnBvcysob3B0cy5hbGlnblRvWzFdPT0nY2VudGVyJz8wOjEpKStwZXJjZW4rJycsYm90dG9tOicxMDAlJ30pOwoJCQl9ZWxzZXsKCQkJCXRmaS5jc3MoZWRnZWNvbG9yLG9wdHMuY29sb3JbMF0pLmNzcyhwb2ksJycrb2ZmcG9zK3BlcmNlbisnJyk7CgkJCQl0ZmVtLmNzcyhlZGdlY29sb3Isb3B0cy5jb2xvclsxXSkuY3NzKHBvaSwnJysob2ZmcG9zKyhvcHRzLmFsaWduVG9bMV09PSdjZW50ZXInPzA6MSkpK3BlcmNlbisnJyk7CgkJCQl0ZmllbS5jc3Mob3B0cy5hbGlnblRvWzBdLCcxMDAlJyk7CgkJCX07CgoJCQlzd2l0Y2ggKG9wdHMudHlwZSkgewoJCQkJY2FzZSAnaHRtbCc6Y29uSWQuaHRtbChvcHRzLmNvbnRlbnQpOyBicmVhazsKCQkJCWNhc2UgJ2lkJyAgOgoJCQkJICAgIHZhciB0ZW1waWQ9alF1ZXJ5KG9wdHMuY29udGVudCkgLHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQkJCQlpZih0ZW1waWQuY3NzKCJkaXNwbGF5IikgPT0gIm5vbmUiKXsgIHRlbXBpZC5jc3Moe2Rpc3BsYXk6ImJsb2NrIn0pOyB9CgkJCQkJY29uSWQuYXBwZW5kKHRlbXBpZCk7CgkJCQkgICAgYnJlYWs7CgkJCX07CgkJCWlmKG9wdHMuaXNjbG9zZSl7CgkJCQlqUXVlcnkoJzxzcGFuIGNsYXNzPSInK3NraW4rJ2Nsb3NlIiBpZD0iY2xvc2UnK3BtcisnIj4mdGltZXM7PC9zcGFuPicpLmFwcGVuZFRvKHRpcElkKTsKCQkJCXRpcElkLmZpbmQoIiNjbG9zZSIrcG1yKyIiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGlwSWQuaGlkZSgpO30pOwoJCQl9CgoJCQlpZih0eXBlb2Ygb3B0cy53aWR0aCA9PT0gJ3N0cmluZycpewoJCQkJZG9jVyA9IHBhcnNlSW50KGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgqKG9wdHMud2lkdGgucmVwbGFjZSgnJScsJycpLzEwMCkpOwoJCQkJKHR5cGVvZiBvcHRzLndpZHRoID09ICdhdXRvJyB8fCB0eXBlb2Ygb3B0cy53aWR0aCA9PSAnJykgPyB0aXBCb3guY3NzKHt3aWR0aDonYXV0byd9KSA6IHRpcEJveC5jc3Moe3dpZHRoOmRvY1d9KTsKCQkJCXRpcEJveC5oZWlnaHQoKTsKCQkJfWVsc2V7CgkJCQl0aXBCb3gud2lkdGgob3B0cy53aWR0aCkuaGVpZ2h0KCk7CgkJCX0KICAgICAgICAgICAgZnVuY3Rpb24gc2hvd1Bvc2l0aW9uKHBvaW50ZXIsY2VsbCl7CgkJCQl2YXIgc2VsZkggPSB0aGF0Lm91dGVySGVpZ2h0KHRydWUpLCBzZWxmVyA9IHRoYXQub3V0ZXJXaWR0aCh0cnVlKTsKCQkJCXZhciBwb3N0PXRoYXQub2Zmc2V0KCkudG9wLCBwb3NsPXRoYXQub2Zmc2V0KCkubGVmdDsKCQkJCXZhciB0aXBDZWxsPShjZWxsPT0iIiB8fCBjZWxsPT11bmRlZmluZWQpID8gdGlwSWQgOiBjZWxsOwoJCQkgICAgdmFyIHRpcEg9dGlwQ2VsbC5vdXRlckhlaWdodCh0cnVlKSwgdGlwVz10aXBDZWxsLm91dGVyV2lkdGgodHJ1ZSk7CgoJCQkJc3dpdGNoIChwb2ludGVyKSB7CgkJCQkJY2FzZSAndG9wLWxlZnQnOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3QtdGlwSC1zcGEsbGVmdDpwb3NsfSk7IGJyZWFrOwoJCQkJCWNhc2UgJ3RvcC1jZW50ZXInOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3QtdGlwSC1zcGEsbGVmdDpwb3NsLSh0aXBXLzIpKyhzZWxmVy8yKX0pOyBicmVhazsKCQkJCQljYXNlICd0b3AtcmlnaHQnOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3QtdGlwSC1zcGEsbGVmdDpwb3NsLSh0aXBXLXNlbGZXKX0pOyBicmVhazsKCQkJCQljYXNlICdib3R0b20tbGVmdCc6IHRpcENlbGwuY3NzKHt0b3A6cG9zdCtzZWxmSCtzcGEsbGVmdDpwb3NsfSk7IGJyZWFrOwoJCQkJCWNhc2UgJ2JvdHRvbS1jZW50ZXInOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3Qrc2VsZkgrc3BhLGxlZnQ6cG9zbC0odGlwVy8yKSsoc2VsZlcvMil9KTsgYnJlYWs7CgkJCQkJY2FzZSAnYm90dG9tLXJpZ2h0JzogdGlwQ2VsbC5jc3Moe3RvcDpwb3N0K3NlbGZIK3NwYSxsZWZ0OnBvc2wtKHRpcFctc2VsZlcpfSk7IGJyZWFrOwoJCQkJCWNhc2UgJ2xlZnQtdG9wJzogdGlwQ2VsbC5jc3Moe3RvcDpwb3N0LGxlZnQ6cG9zbC10aXBXLXNwYX0pOyBicmVhazsKCQkJCQljYXNlICdsZWZ0LWNlbnRlcic6IHRpcENlbGwuY3NzKHt0b3A6cG9zdC0odGlwSC8yKSsoc2VsZkgvMiksbGVmdDpwb3NsLXRpcFctc3BhfSk7IGJyZWFrOwoJCQkJCWNhc2UgJ3JpZ2h0LXRvcCc6IHRpcENlbGwuY3NzKHt0b3A6cG9zdCxsZWZ0OnBvc2wrc2VsZlcrc3BhfSk7IGJyZWFrOwoJCQkJCWNhc2UgJ3JpZ2h0LWNlbnRlcic6IHRpcENlbGwuY3NzKHt0b3A6cG9zdC0odGlwSC8yKSsoc2VsZkgvMiksbGVmdDpwb3NsK3NlbGZXK3NwYX0pOyBicmVhazsKCQkJCQljYXNlICdmb2xsb3cnOiB0aGF0Lm1vdXNlbW92ZShmdW5jdGlvbihlKSB7IHRpcENlbGwuY3NzKHt0b3A6ZS5wYWdlWSArIDMwLGxlZnQ6ZS5wYWdlWCAtIDZ9KTsgfSk7IGJyZWFrOwoJCQkJfTsKCQkJfQoJCQl0aXBCb3guaGlkZSgpOwoJCQlzd2l0Y2ggKG9wdHMudHJpZ2dlcil7CgkJCQljYXNlICdzaG93JzpzaG93UG9zaXRpb24ocG9pbnRlcik7dGlwQm94LnNob3coKTticmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2NsaWNrJzp0aGF0LmNsaWNrKGZ1bmN0aW9uKCl7c2hvd1Bvc2l0aW9uKHBvaW50ZXIpO3RpcEJveC5zaG93KCk7fSk7YnJlYWs7CgkJCQljYXNlICdob3Zlcic6dGhhdC5ob3ZlcihmdW5jdGlvbigpe3Nob3dQb3NpdGlvbihwb2ludGVyKTt0aXBCb3guc2hvdygpOyB0aXBCb3gub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXtqUXVlcnkodGhpcykuc2hvdygpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe2pRdWVyeSh0aGlzKS5oaWRlKCl9KX0sZnVuY3Rpb24oKXt0aXBCb3guaGlkZSgpO30pO2JyZWFrOwoJCQkJY2FzZSAnZm9jdXMnOnRoYXQuZm9jdXMoZnVuY3Rpb24oKXtzaG93UG9zaXRpb24ocG9pbnRlcik7dGlwQm94LnNob3coKTt9KTsgIHRoYXQuYmx1cihmdW5jdGlvbigpe3RpcEJveC5oaWRlKCk7fSk7YnJlYWs7CgkJCQljYXNlICdtb3VzZSc6dGhhdC5ob3ZlcihmdW5jdGlvbigpe3Nob3dQb3NpdGlvbihwb2ludGVyKTt0aXBCb3guc2hvdygpO30sZnVuY3Rpb24oKXt0aXBCb3guaGlkZSgpO30pO2JyZWFrOwoJCQl9OwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7b3B0cy5zdWNjZXNzICYmIG9wdHMuc3VjY2VzcygpO30sIDEpOwoJCX0pOwoJfQp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBsKCJDU0ROR3JlZW5lciBWIiArIHZlcnNpb24pOwogICAgaWYgKGlzRmlyZWZveCgpKSB7CiAgICAgICAgY29uc29sZS5sb2coIuaCqOato+WcqOS9v+eUqOeBq+eLkOa1j+iniOWZqO+8jOWwhuS9v+eUqOWFvOWuueaooeW8j+i/kOihjCBDU0ROR3JlZW5lcuOAgiIpOwogICAgfQogICAgcHJvZ3Jlc3Nvci5pbml0KCk7CgogICAgLy8g57u/5YyW6K6+5a6a5oyJ6ZKu54K55Ye75LqL5Lu2CiAgICBsZXQganNzID0gIiI7CiAgICBqc3MgKz0gIjxzY3JpcHQ+ZnVuY3Rpb24gc2hvd0NvbmZpZygpIHsiOwogICAganNzICs9ICIkKHdpbmRvdykuc2Nyb2xsVG9wKDApOyI7CiAgICBqc3MgKz0gIiQoJy53aGl0ZV9jb250ZW50JykuZmFkZUluKDUwMCk7IjsKICAgIGpzcyArPSAiJCgnYm9keScpLmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7IjsKICAgIGpzcyArPSAiJCgnYm9keScpLmNzcygnZmlsdGVyJywnYmx1cigzcHgpJyk7IjsKICAgIGpzcyArPSAiJCgnYm9keScpLmNzcygncG9pbnRlci1ldmVudHMnLCdub25lJykiOwogICAganNzICs9ICJ9PC9zY3JpcHQ+IjsKICAgICQoImJvZHkiKS5hcHBlbmQoanNzKTsKCiAgICAvLyDkv53lrZjmjInpkq7ngrnlh7vkuovku7YKICAgIGxldCBzYXZlSnNzID0gIiI7CiAgICBzYXZlSnNzICs9ICI8c2NyaXB0PmZ1bmN0aW9uIHNhdmVBbmRSZWxvYWQoKSB7IjsKICAgIHNhdmVKc3MgKz0gIiQoJyNjb25maWdDb250ZW50JykuZmFkZU91dCgyMDApOyI7CiAgICBzYXZlSnNzICs9ICJzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sMjAwKSI7CiAgICBzYXZlSnNzICs9ICJ9PC9zY3JpcHQ+IjsKICAgICQoImJvZHkiKS5hcHBlbmQoc2F2ZUpzcyk7CgogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYmxvY2tVUkwgPSBjdXJyZW50VVJMLnNwbGl0KCIvIikubGVuZ3RoOwogICAgICAgIHZhciBtYWluID0gLyh3d3dcLmNzZG5cLm5ldFwvKSQvOwogICAgICAgIHZhciBtYWluTmF2ID0gL25hdi87CiAgICAgICAgdmFyIGFydGljbGUgPSAvYXJ0aWNsZS87CiAgICAgICAgdmFyIGJicyA9IC9iYnNcLmNzZG5cLm5ldC87CiAgICAgICAgdmFyIGJsb2cgPSAvYmxvZ1wuY3NkblwubmV0LzsKICAgICAgICB2YXIgYmxvZzIgPSAvXC9hcnRpY2xlXC9saXN0XC8vOwogICAgICAgIHZhciBkb3dubG9hZCA9IC9kb3dubG9hZFwuY3NkblwubmV0LzsKICAgICAgICB2YXIgbG9naW4gPSAvcGFzc3BvcnRcLmNzZG5cLm5ldC87CiAgICAgICAgdmFyIHpvbmUgPSAvbWVcLmNzZG5cLm5ldC87CiAgICAgICAgdmFyIG90aGVyID0gLyh3d3dcLmNzZG5cLm5ldFwvKS87CiAgICAgICAgdmFyIG1wID0gL21wXC5jc2RuXC5uZXQvOwoKICAgICAgICAvLyDmlbDnu4TliJ3lp4vljJYKICAgICAgICBsaXN0ID0gW107CiAgICAgICAgLy8g5aS06YOo5YiGCiAgICAgICAgLy8gQVBQCiAgICAgICAgLy8gcHV0KCIuYXBwLWFwcCIpOwogICAgICAgIC8vIFZJUAogICAgICAgIHB1dCgiLnZpcC1jYWlzZSIpOwogICAgICAgIC8vIOiusOW9leS9oOeahOaIkOmVv+WOhueoi++8iOiusOS4quavm++8iQogICAgICAgIHB1dCgiI3dyaXRlR3VpZGUiKTsKICAgICAgICAvLyDmlrDpgJrnn6XlsI/lnIbngrnvvIjmnKrnmbvlvZXmiY3mtojmjonvvIkKICAgICAgICBpZiAoJCgiLnVzZXJpbmZvIGEiKS50ZXh0KCkgPT09ICfnmbvlvZUv5rOo5YaMJykgewogICAgICAgICAgICBwdXQoIiNtc2ctY2lyY2xlIik7CiAgICAgICAgfQogICAgICAgIC8vIOmhtumDqOiwt+atjOW5v+WRigogICAgICAgIHB1dCgiLmFkc2J5Z29vZ2xlIik7CiAgICAgICAgLy8g5oKs5rWu5Zyo6aG25qCP5oyJ6ZKu5LiK5Ye6546w55qE5LqM57u056CBCiAgICAgICAgcHV0KCIuYXBwQ29udHJvbCIpOwogICAgICAgIC8vIOmhtumDqOW5v+WRigogICAgICAgIHB1dCgiLmFkdmVydC1iZyIpOwoKICAgICAgICBpZiAobWFpbi50ZXN0KGN1cnJlbnRVUkwpIHx8IG1haW5OYXYudGVzdChjdXJyZW50VVJMKSkgewogICAgICAgICAgICBsKCLmraPlnKjkvJjljJbkuLvpobXkvZPpqowuLi4iKTsKICAgICAgICAgICAgLy8g5bi46KeECiAgICAgICAgICAgIC8vIOWktOmDqOW5v+WRigogICAgICAgICAgICBwdXQoIi5iYW5uZXItYWQtYm94Iik7CiAgICAgICAgICAgIC8vIOW1jOWFpeW5v+WRigogICAgICAgICAgICBwdXQoIiNrcF9ib3hfMjExIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5zbGlkZS1vdXRlciIpOwogICAgICAgICAgICAvLyDlj7Pkvqfor6bmg4UKICAgICAgICAgICAgcHV0KCIucGVyc2lvbl9hcnRpY2xlIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+aOqOiNkAogICAgICAgICAgICAkKCIuZmVlZF9jb21wYW55IikucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIOW5v+WRiui9ruaSrQogICAgICAgICAgICBwdXQoIi5lbC1jYXJvdXNlbF9fY29udGFpbmVyIik7CiAgICAgICAgICAgIC8vIOmhtumDqOaoquW5hQogICAgICAgICAgICBwdXQoIi50b29sYmFyLWFkdmVydCIpOwogICAgICAgICAgICAvLyDpobbmoI9WSVDpgInpobkKICAgICAgICAgICAgJCgnLnRvb2xiYXItc3ViTWVudS1ib3gnKS5maW5kKCJbaHJlZj0naHR0cHM6Ly9tYWxsLmNzZG4ubmV0L3ZpcCddIikucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIENTRE7lt6Xlhbflub/lkYoKICAgICAgICAgICAgcHV0KCIjZmxvb3ItYWRfNjQiKTsKICAgICAgICAgICAgY2xlYW4oMTApOwogICAgICAgICAgICAvLyBjb21tb24oNSwgMTApOwogICAgICAgICAgICAvLyDljZrlrqLlj4rkuLvpobXkvJjljJYKICAgICAgICAgICAgY29tbW9uKDksIDEwKTsKICAgICAgICAgICAgbG9vcCgzKTsKICAgICAgICAgICAgbG9vcCgxKTsKICAgICAgICB9IGVsc2UgaWYgKChibG9nLnRlc3QoY3VycmVudFVSTCkgJiYgYmxvY2tVUkwgPT09IDQpIHx8IGJsb2cyLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW5Liq5Lq65Y2a5a6i5Li76aG15L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDlpLTpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIuYmFubmVyLWFkLWJveCIpOwogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIuc2xpZGUtb3V0ZXIiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n6K+m5oOFCiAgICAgICAgICAgIHB1dCgiLnBlcnNpb25fYXJ0aWNsZSIpOwogICAgICAgICAgICAvLyDlt6bkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIubWI4Iik7CiAgICAgICAgICAgIHB1dCgiI2twX2JveF81MDMiKTsKICAgICAgICAgICAgcHV0KCIja3BfYm94XzIxNCIpOwogICAgICAgICAgICBjbGVhbigxMCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIGxvb3AoMyk7CiAgICAgICAgICAgIGxvb3AoMSk7CiAgICAgICAgfSBlbHNlIGlmIChhcnRpY2xlLnRlc3QoY3VycmVudFVSTCkgJiYgIW1wLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW6ZiF6K+75L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOe7v+WMluiuvuWumgogICAgICAgICAgICBpZiAoaXNGaXJlZm94KCkpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiLnRvb2xiYXItY29udGFpbmVyLW1pZGRsZSIpLnByZXBlbmQoIjxkaXYgaWQ9J2dyZWVuZXJQcm9ncmVzcycgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgICAgIGxldCBodG1sT2YwID0gJzxkaXYgY2xhc3M9InRvb2xiYXItYnRuIGNzZG4tdG9vbGJhci1mbCI+PGEgaWQ9ImdyZWVuZXJTZXR0aW5ncyIgdGl0bGU9IueCueWHu+aJk+W8gCBDU0ROR3JlZW5lciDnu7/ljJborr7lrpoiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0ic2hvd0NvbmZpZygpOyI+JyArIHNldHRpbmdzX3N2ZyArICc8L2E+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAkKCIudG9vbGJhci1idG5zIikucHJlcGVuZChodG1sT2YwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaXJlZm94KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5o+Q56S6CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXBzQ29va2llID0gY29uZmlnLmdldCgic2hvd1RpcCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlwc0Nvb2tpZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0KCJzaG93VGlwIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiLnRvb2xiYXItY29udGFpbmVyLW1pZGRsZSIpLnByZXBlbmQoIjxkaXYgaWQ9J2dyZWVuZXJQcm9ncmVzcycgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgbGV0IGh0bWxPZjAgPSAnPGRpdiBjbGFzcz0idG9vbGJhci1idG4gY3Nkbi10b29sYmFyLWZsIj48YSBpZD0iZ3JlZW5lclNldHRpbmdzIiB0aXRsZT0i54K55Ye75omT5byAIENTRE5HcmVlbmVyIOe7v+WMluiuvuWumiIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJzaG93Q29uZmlnKCk7Ij4nICsgc2V0dGluZ3Nfc3ZnICsgJzwvYT48L2Rpdj4nOwogICAgICAgICAgICAgICAgJCgiLnRvb2xiYXItYnRucyIpLnByZXBlbmQoaHRtbE9mMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5bi46KeECiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRiu+8jOaUvuWIsOesrOS4gOS4qua4hemZpAogICAgICAgICAgICAvLyBwdXQoIi5yZWNvbW1lbmQtcmlnaHQiKTsKICAgICAgICAgICAgcHV0KCIjYWRkQWRCb3giKTsKICAgICAgICAgICAgLy8gcHV0KCIuYXNpZGUtYm94LmtpbmRfcGVyc29uLmQtZmxleC5mbGV4LWNvbHVtbiIpOwogICAgICAgICAgICBwdXQoIi5yZWNvbW1lbmQtdG9wLWFkYm94Iik7CiAgICAgICAgICAgIC8vIHB1dCgiLnJlY29tbWVuZC1saXN0LWJveC5kLWZsZXguZmxleC1jb2x1bW4uYXNpZGUtYm94Iik7CiAgICAgICAgICAgIC8vIOW3puS+p+W5v+WRigogICAgICAgICAgICAvLyBwdXQoIiNjb250YWluZXIiKTsKICAgICAgICAgICAgLy8g5b+r5p2l5YaZ5Y2a5a6i5ZCnCiAgICAgICAgICAgIHB1dCgiLmJsb2dfdGlwX2JveCIpOwogICAgICAgICAgICAvLyDmjqjojZDlhbPms6jnlKjmiLcKICAgICAgICAgICAgcHV0KCIuYmxvZy1leHBlcnQtcmVjb21tZW5kLWJveCIpOwogICAgICAgICAgICAvLyDlj7PkuIvop5JWSVAKICAgICAgICAgICAgcHV0KCIubWVhdS1nb3RvcC1ib3giKTsKICAgICAgICAgICAgLy8g5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLm1lZGlhdl9hZCIpOwogICAgICAgICAgICBwdXQoIi5wdWxsbG9nLWJveCIpOwogICAgICAgICAgICBwdXQoIi5yZWNvbW1lbmQtYWQtYm94Iik7CiAgICAgICAgICAgIHB1dCgiLmJveC1zaGFkb3ciKTsKICAgICAgICAgICAgcHV0KCIudHlwZV9ob3Rfd29yZCIpOwogICAgICAgICAgICBwdXQoIi5mb3VydGhfY29sdW1uIik7CiAgICAgICAgICAgIC8vIOmrmOWIhui+qOeOh+aXtuWPs+S+p+aWh+eroOaOqOiNkAogICAgICAgICAgICAvLyBwdXQoIi5yaWdodC1pdGVtIik7CiAgICAgICAgICAgIC8vIOW5v+WRigogICAgICAgICAgICBwdXQoIiNhc2lkZUZvb3RlciIpOwogICAgICAgICAgICBwdXQoIiNhZC1kaXYiKTsKICAgICAgICAgICAgcHV0KCIjNDc5Iik7CiAgICAgICAgICAgIHB1dCgiIzQ4MCIpOwogICAgICAgICAgICAvLyDmiZPotY8KICAgICAgICAgICAgcHV0KCIucG9zdFRpbWUiKTsKICAgICAgICAgICAgLy8g6K++56iL5o6o6I2QCiAgICAgICAgICAgIHB1dCgiLnQwIik7CiAgICAgICAgICAgIC8vIOWIhuS6q+a1t+aKpQogICAgICAgICAgICBwdXQoIi5zaGFyZVN1Z2dlc3QiKTsKICAgICAgICAgICAgLy8g5bqV6YOo5Li76aKYCiAgICAgICAgICAgIHB1dCgiLnRlbXBsYXRlLWJveCIpOwogICAgICAgICAgICAvLyDor4TorrrljLrlub/lkYoKICAgICAgICAgICAgcHV0KCJkaXYjZG1wX2FkXzU4Iik7CiAgICAgICAgICAgIC8vIOaJk+i1jwogICAgICAgICAgICBwdXQoIi5yZXdhcmQtdXNlci1ib3giKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5omT6LWP5oyJ6ZKuCiAgICAgICAgICAgIHB1dCgiLnRvLXJld2FyZCIpOwogICAgICAgICAgICAvLyDmjqjojZDlhoXlrrnlub/lkYoKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXJlY29tbWVuZC1ib3giKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLmluZGV4U3VwZXJpc2UiKTsKICAgICAgICAgICAgLy8g5oqi5rKZ5Y+R6KeS5qCHCiAgICAgICAgICAgIHB1dCgiLmNvbW1lbnQtc29mYS1mbGFnIik7CiAgICAgICAgICAgIC8vIOmhtWppbwogICAgICAgICAgICBwdXQoIi5ib3R0b20tcHViLWZvb3RlciIpOwogICAgICAgICAgICAvLyDnmbvlvZXmn6XnnIvmnKror7vmtojmga8KICAgICAgICAgICAgcHV0KCIudG9vbGJhci1ub3RpY2UtYnViYmxlIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5yZWNvbW1lbmQtdG9wLWFkYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+Wbm+S4quW5v+WRigogICAgICAgICAgICBwdXQoIi5wcm9ncmFtbWVyMUJveCIpOwogICAgICAgICAgICBwdXQoIi5wcm9ncmFtbWVyMkJveCIpOwogICAgICAgICAgICBwdXQoIi5wcm9ncmFtbWVyM0JveCIpOwogICAgICAgICAgICBwdXQoIi5wcm9ncmFtbWVyNEJveCIpOwogICAgICAgICAgICAvLyDngrnotZ7msJTms6EKICAgICAgICAgICAgcHV0KCIudHJpcGxldC1wcm9tcHQiKTsKICAgICAgICAgICAgLy8g6aG26YOo5qiq5bmFCiAgICAgICAgICAgIHB1dCgiLnRvb2xiYXItYWR2ZXJ0Iik7CiAgICAgICAgICAgIC8vIOW6lemDqOS/oeaBrwogICAgICAgICAgICBwdXQoIi5ibG9nLWZvb3Rlci1ib3R0b20iKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5qCP5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiIzY1MjciKTsKICAgICAgICAgICAgcHV0KCIjcmVjb21tZW5kQWRCb3giKTsKICAgICAgICAgICAgLy8g5o6o6I2Q5YaF5a65VGl0bGUKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXRpdC1tb2QiKTsKICAgICAgICAgICAgLy8g57qi5YyF5o+Q6YaSCiAgICAgICAgICAgIHB1dCgiLmNzZG4tcmVkcGFjay1sb3R0ZXJ5LWJ0bi1ib3giKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5oKs5rWu5qCP6Zmk572u6aG25Lul5aSW55qE5oyJ6ZKuCiAgICAgICAgICAgIHB1dCgiLm9wdGlvbi1ib3hbZGF0YS10eXBlPSdndWlkZSddLC5vcHRpb24tYm94W2RhdGEtdHlwZT0nY3MnXSwub3B0aW9uLWJveFtkYXRhLXR5cGU9J3JlcG9ydCddLC5jc2RuLWNvbW1vbi1sb2dvLWFkdmVydCIpOwogICAgICAgICAgICBjbGVhbigxMCk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgIC8vIOWxleW8gOivhOiuuueahOaJgOacieWbnuWkjQogICAgICAgICAgICAgICAkKCcuYnRuLXJlYWQtcmVwbHknKS5jbGljaygpOwogICAgICAgICAgICB9LCAxNTAwKTsKICAgICAgICAgICAgLy8g5Li75Yqo5Yqg5YWl5Y+z5L6n5qCPCiAgICAgICAgICAgIGlmICgkKCIucmVjb21tZW5kLXJpZ2h0IikubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAkKCIjbWFpbkJveCIpLmFmdGVyKCc8ZGl2IGNsYXNzPSJyZWNvbW1lbmQtcmlnaHQgIGFsaWduLWl0ZW1zLXN0cmV0Y2ggY2xlYXJmaXgiIGlkPSJyaWdodEFzaWRlIj48YXNpZGUgY2xhc3M9InJlY29tbWVuZC1yaWdodF9hc2lkZSI+PGRpdiBpZD0icmVjb21tZW5kLXJpZ2h0IiBzdHlsZT0iaGVpZ2h0OiAxMDAlOyBwb3NpdGlvbjogZml4ZWQ7IHRvcDogNTJweDsgb3ZlcmZsb3c6IHNjcm9sbDsiPjwvZGl2PjwvYXNpZGU+PC9kaXY+Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5LiK5qCP5oyJ6ZKu5Yig6ZmkCiAgICAgICAgICAgICQoIi50b29sYmFyLW1lbnVzID4gbGkgPiBhOmNvbnRhaW5zKCfkuJPmoI/or77nqIsnKSIpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgICAgICAkKCIudG9vbGJhci1tZW51cyA+IGxpID4gYTpjb250YWlucygn5o+S5Lu2JykiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgJCgiLnRvb2xiYXItbWVudXMgPiBsaSA+IGE6Y29udGFpbnMoJ+iupOivgScpIikucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIOS/ruWkjeaXoOazlemAieaLqeWkjeWItgogICAgICAgICAgICAkKCJjb2RlIikuY3NzKCJ1c2VyLXNlbGVjdCIsImF1dG8iKTsKICAgICAgICAgICAgJCgiI2NvbnRlbnRfdmlld3MiKS5jc3MoInVzZXItc2VsZWN0IiwiYXV0byIpOwogICAgICAgICAgICAkKCJwcmUiKS5jc3MoInVzZXItc2VsZWN0IiwiYXV0byIpOzcKICAgICAgICAgICAgLy8g5Zu+54mH5re35paH5a2X5pe277yM5peg5rOV5a6M5pW05aSN5Yi277yM5Zu+54mH5LiN5Lya6KKr5aSN5Yi25LiL5p2lIGh0dHBzOi8vZ2l0aHViLmNvbS9hZGxlcmVkL0NTRE5HcmVlbmVyL2lzc3Vlcy84NwogICAgICAgICAgICAvL2xldCBlbCA9ICQoIm1haW4gLmJsb2ctY29udGVudC1ib3giKVswXTsKICAgICAgICAgICAgLy9sZXQgZWxDbG9uZSA9IGVsLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgLy9lbC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlbENsb25lLCBlbCk7CiAgICAgICAgICAgIC8vIOS/neWtmGNzZG7nmoTnvZHpobXlho3mrKHmiZPlvIDkvJroh6rliqjot7PovazliLDpppbpobUgaHR0cHM6Ly9naXRodWIuY29tL2FkbGVyZWQvQ1NETkdyZWVuZXIvaXNzdWVzLzk3CiAgICAgICAgICAgICQoIltvbmVycm9yXSIpLnJlbW92ZSgpOwogICAgICAgICAgICAvLyBDU0RO6YeN5a6a5ZCR5aSW6ZO+5LiN6IO95Zyo5paw55qE56qX5Y+j6Lez6L2sIGh0dHBzOi8vZ2l0aHViLmNvbS9hZGxlcmVkL0NTRE5HcmVlbmVyL2lzc3Vlcy84MAogICAgICAgICAgICAkKCIjYXJ0aWNsZV9jb250ZW50IGFbaHJlZl0iKS5hdHRyKCJ0YXJnZXQiLCAiX2JsYW5rIik7CiAgICAgICAgICAgIC8vIOaQnOe0ouahhuS8mOWMlgogICAgICAgICAgICAvLyQoIiN0b29sYmFyLXNlYXJjaC1pbnB1dCIpLmNzcygid2lkdGgiLCAiY2FsYygxMDAlIC0gNDAwcHgpIik7CiAgICAgICAgICAgIC8vIOe7v+WMluiuvue9rgogICAgICAgICAgICBjb21tb24oNiwgMSk7CiAgICAgICAgICAgIC8vIOWxj+W5lemAgumFjQogICAgICAgICAgICBjb21tb24oNCwgMSk7CiAgICAgICAgICAgIC8vIOivhOiuugogICAgICAgICAgICBjb21tb24oMSwgMzApOwogICAgICAgICAgICAvLyDlhbblroMKICAgICAgICAgICAgY29tbW9uKDIsIDIwKTsKICAgICAgICAgICAgLy8g6aG26YOo5pi+56S65L2c6ICF5L+h5oGvCiAgICAgICAgICAgIGNvbW1vbig4LCAxKTsKICAgICAgICAgICAgLy8g5Y2a5a6i5Y+K5Li76aG15LyY5YyWCiAgICAgICAgICAgIGNvbW1vbig5LCAxMCk7CiAgICAgICAgICAgIC8vIOW+queOr+e6v+eoi+W8gOWniwogICAgICAgICAgICBsb29wKDIpOwogICAgICAgICAgICBsb29wKDMpOwogICAgICAgIH0gZWxzZSBpZiAoYmJzLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW6K665Z2b5L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDor4TorrrltYzlhaXlsI/lub/lkYoKICAgICAgICAgICAgcHV0KCIucG9zdF9yZWNvbW1lbmQiKTsKICAgICAgICAgICAgLy8g5bqV6YOo5o6o6I2QCiAgICAgICAgICAgIHB1dCgiI3Bvc3RfZmVlZF93cmFwIik7CiAgICAgICAgICAgIC8vIOW6lemDqOebuOWFs+aWh+eroOmHjOmdoueahOW5v+WRigogICAgICAgICAgICBwdXQoIi5iYnNfZmVlZF9hZF9ib3giKTsKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLWFkLWJveCIpOwogICAgICAgICAgICAvLyDlupXpg6jnm7jlhbPmloflrZfph4zpnaLnmoTng63or43mj5DnpLoKICAgICAgICAgICAgcHV0KCIudHlwZV9ob3Rfd29yZCIpOwogICAgICAgICAgICAvLyDlupXpg6jok53oibJmbGV45bGe5oCn55qE5bm/5ZGK5qCPK+eZu+W9leazqOWGjOahhgogICAgICAgICAgICBwdXQoIi5wdWxsbG9nLWJveCIpOwogICAgICAgICAgICAvLyDnjJzkvaDllpzmrKIKICAgICAgICAgICAgcHV0KCIucGVyc29uYWxpemVkLXJlY29tbWVuZC1ib3giKTsKICAgICAgICAgICAgLy8g5Y+R5biW5YeP5Y2K5o+Q56S6CiAgICAgICAgICAgIHB1dCgiLnRvdGFzdC1ib3giKTsKICAgICAgICAgICAgLy8g6aG26YOo5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC1yaWdodCIpOwogICAgICAgICAgICAvLyDpobbpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIuYWRfdG9wIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5hZF8xIik7CiAgICAgICAgICAgIGNsZWFuKDEwKTsKICAgICAgICAgICAgLy8g5bGV5byACiAgICAgICAgICAgIGNvbW1vbigzLCA1MCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIGxvb3AoMyk7CiAgICAgICAgfSBlbHNlIGlmIChkb3dubG9hZC50ZXN0KGN1cnJlbnRVUkwpKSB7CiAgICAgICAgICAgIGwoIuato+WcqOS8mOWMluS4i+i9vemhteS9k+mqjC4uLiIpOwogICAgICAgICAgICAvLyDluLjop4QKICAgICAgICAgICAgcHV0KCIuZml4ZWRfZGwiKTsKICAgICAgICAgICAgcHV0KCJpbmRleFN1cGVyaXNlIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+aOqOiNkAogICAgICAgICAgICBwdXQoIi5jb250ZW50X3JlY29tIik7CiAgICAgICAgICAgIGNsZWFuKDEwKTsKICAgICAgICAgICAgLy8gY29tbW9uKDUsIDEwKTsKICAgICAgICAgICAgbG9vcCgzKTsKICAgICAgICB9IGVsc2UgaWYgKGxvZ2luLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW55m75b2V6aG15L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDnmbvlvZXnlYzpnaLlpKflm77lub/lkYoKICAgICAgICAgICAgcHV0KCIubWFpbi10dSIpOwogICAgICAgICAgICBjbGVhbigxMCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIGxvb3AoMyk7CiAgICAgICAgfSBlbHNlIGlmICh6b25lLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW5Liq5Lq656m66Ze05L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICBjbGVhbigxMCk7CiAgICAgICAgICAgIGNvbW1vbig3LCAxMCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIGxvb3AoMyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbCgi5ZOm6LGB77yM5aW95YGP6Zeo55qE6aG16Z2i77yM5oiR5p2l6K+V552A5LyY5YyW5LiA5LiL5ZOmLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDlsZXlvIDlhajmlocKICAgICAgICAgICAgJCgnLnJlYWRtb3JlX2J0bicpLmNsaWNrKCk7CiAgICAgICAgICAgIC8vICoqKiBpbmRleCAqKioKICAgICAgICAgICAgLy8g5aS06YOo5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLmJhbm5lci1hZC1ib3giKTsKICAgICAgICAgICAgLy8g5bWM5YWl5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiI2twX2JveF8yMTEiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnNsaWRlLW91dGVyIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+ivpuaDhQogICAgICAgICAgICBwdXQoIi5wZXJzaW9uX2FydGljbGUiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5o6o6I2QCiAgICAgICAgICAgICQoIi5mZWVkX2NvbXBhbnkiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8gKioqIGFydGljbGUgKioqCiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYrvvIzmlL7liLDnrKzkuIDkuKrmuIXpmaQKICAgICAgICAgICAgcHV0KCIjYWRkQWRCb3giKTsKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXRvcC1hZGJveCIpOwogICAgICAgICAgICAvLyDlv6vmnaXlhpnljZrlrqLlkKcKICAgICAgICAgICAgcHV0KCIuYmxvZ190aXBfYm94Iik7CiAgICAgICAgICAgIC8vIOaOqOiNkOWFs+azqOeUqOaItwogICAgICAgICAgICBwdXQoIi5ibG9nLWV4cGVydC1yZWNvbW1lbmQtYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S4i+inklZJUAogICAgICAgICAgICBwdXQoIi5tZWF1LWdvdG9wLWJveCIpOwogICAgICAgICAgICAvLyDlub/lkYoKICAgICAgICAgICAgcHV0KCIubWVkaWF2X2FkIik7CiAgICAgICAgICAgIHB1dCgiLnB1bGxsb2ctYm94Iik7CiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC1hZC1ib3giKTsKICAgICAgICAgICAgLy9wdXQoIi5ib3gtc2hhZG93Iik7IOafkOS6m+mhtemdouW8guW4uO+8jOS+i+WmgmNsb3VkLmNzZG4ubmV0CiAgICAgICAgICAgIHB1dCgiLnR5cGVfaG90X3dvcmQiKTsKICAgICAgICAgICAgcHV0KCIuZm91cnRoX2NvbHVtbiIpOwogICAgICAgICAgICAvLyBjbG91ZC5jc2RuLm5ldCDlpLTpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIja3BfYm94XzExOCIpOwogICAgICAgICAgICAvLyDlub/lkYoKICAgICAgICAgICAgcHV0KCIjYXNpZGVGb290ZXIiKTsKICAgICAgICAgICAgcHV0KCIjYWQtZGl2Iik7CiAgICAgICAgICAgIHB1dCgiIzQ3OSIpOwogICAgICAgICAgICBwdXQoIiM0ODAiKTsKICAgICAgICAgICAgLy8g5omT6LWPCiAgICAgICAgICAgIHB1dCgiLnBvc3RUaW1lIik7CiAgICAgICAgICAgIC8vIOivvueoi+aOqOiNkAogICAgICAgICAgICBwdXQoIi50MCIpOwogICAgICAgICAgICAvLyDliIbkuqvmtbfmiqUKICAgICAgICAgICAgcHV0KCIuc2hhcmVTdWdnZXN0Iik7CiAgICAgICAgICAgIC8vIOW6lemDqOS4u+mimAogICAgICAgICAgICBwdXQoIi50ZW1wbGF0ZS1ib3giKTsKICAgICAgICAgICAgLy8g6K+E6K665Yy65bm/5ZGKCiAgICAgICAgICAgIHB1dCgiZGl2I2RtcF9hZF81OCIpOwogICAgICAgICAgICAvLyDmiZPotY8KICAgICAgICAgICAgcHV0KCIucmV3YXJkLXVzZXItYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+aJk+i1j+aMiemSrgogICAgICAgICAgICBwdXQoIi50by1yZXdhcmQiKTsKICAgICAgICAgICAgLy8g5o6o6I2Q5YaF5a655bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC1yZWNvbW1lbmQtYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5pbmRleFN1cGVyaXNlIik7CiAgICAgICAgICAgIC8vIOaKouaymeWPkeinkuaghwogICAgICAgICAgICBwdXQoIi5jb21tZW50LXNvZmEtZmxhZyIpOwogICAgICAgICAgICAvLyDpobVqaW8KICAgICAgICAgICAgcHV0KCIuYm90dG9tLXB1Yi1mb290ZXIiKTsKICAgICAgICAgICAgLy8g55m75b2V5p+l55yL5pyq6K+75raI5oGvCiAgICAgICAgICAgIHB1dCgiLnRvb2xiYXItbm90aWNlLWJ1YmJsZSIpOwogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXRvcC1hZGJveCIpOwogICAgICAgICAgICAvLyDlrabpmaLlvLnlh7rlub/lkYoKICAgICAgICAgICAgJCgiLmZvdWNlX2Nsb3NlX2J0biIpLmNsaWNrKCk7CiAgICAgICAgICAgIC8vIOWFtuWugwogICAgICAgICAgICAvLyDlpLTpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIuYmFubmVyLWFkLWJveCIpOwogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIuc2xpZGUtb3V0ZXIiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n6K+m5oOFCiAgICAgICAgICAgIHB1dCgiLnBlcnNpb25fYXJ0aWNsZSIpOwogICAgICAgICAgICAvLyDlt6bkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIja3BfYm94XzUwMyIpOwogICAgICAgICAgICBwdXQoIiNrcF9ib3hfMjE0Iik7CiAgICAgICAgICAgIC8vICoqKiBiYnMgKioqCiAgICAgICAgICAgIC8vIOivhOiuuuW1jOWFpeWwj+W5v+WRigogICAgICAgICAgICBwdXQoIi5wb3N0X3JlY29tbWVuZCIpOwogICAgICAgICAgICAvLyDlupXpg6jmjqjojZAKICAgICAgICAgICAgcHV0KCIjcG9zdF9mZWVkX3dyYXAiKTsKICAgICAgICAgICAgLy8g5bqV6YOo55u45YWz5paH56ug6YeM6Z2i55qE5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLmJic19mZWVkX2FkX2JveCIpOwogICAgICAgICAgICBwdXQoIi5yZWNvbW1lbmQtYWQtYm94Iik7CiAgICAgICAgICAgIC8vIOW6lemDqOebuOWFs+aWh+Wtl+mHjOmdoueahOeDreivjeaPkOekugogICAgICAgICAgICBwdXQoIi50eXBlX2hvdF93b3JkIik7CiAgICAgICAgICAgIC8vIOW6lemDqOiTneiJsmZsZXjlsZ7mgKfnmoTlub/lkYrmoI8r55m75b2V5rOo5YaM5qGGCiAgICAgICAgICAgIHB1dCgiLnB1bGxsb2ctYm94Iik7CiAgICAgICAgICAgIC8vIOeMnOS9oOWWnOasogogICAgICAgICAgICBwdXQoIi5wZXJzb25hbGl6ZWQtcmVjb21tZW5kLWJveCIpOwogICAgICAgICAgICAvLyDlj5HluJblh4/ljYrmj5DnpLoKICAgICAgICAgICAgcHV0KCIudG90YXN0LWJveCIpOwogICAgICAgICAgICAvLyDpobbpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXJpZ2h0Iik7CiAgICAgICAgICAgIC8vIOmhtumDqOW5v+WRigogICAgICAgICAgICBwdXQoIi5hZF90b3AiKTsKICAgICAgICAgICAgLy8gKioqIGRvd25sb2FkICoqKgogICAgICAgICAgICBwdXQoIi5maXhlZF9kbCIpOwogICAgICAgICAgICBwdXQoImluZGV4U3VwZXJpc2UiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5o6o6I2QCiAgICAgICAgICAgIHB1dCgiLmNvbnRlbnRfcmVjb20iKTsKICAgICAgICAgICAgY2xlYW4oMTApOwogICAgICAgIH0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBwcm9ncmVzc29yLmRvbmUoKTsKICAgICAgICB9LCAwKTsKICAgICAgICBzdG9wVGltZU1pbGxpID0gRGF0ZS5ub3coKTsKICAgICAgICBsKCLkvJjljJblrozmr5UhIOiAl+aXtiAiICsgKHN0b3BUaW1lTWlsbGkgLSBzdGFydFRpbWVNaWxsaSkgKyAibXMiKTsKICAgICAgICAvLyDlu7bov5/ltYzlhaXnlKjmiLfkvb/nlKjohJrmnKzmg4XlhrVKU++8jOS4jeW9seWTjeaAp+iDvQogICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxzY3JpcHQgY2hhcnNldD0iVVRGLTgiIGlkPSJMQV9DT0xMRUNUIiBzcmM9Ii8vc2RrLjUxLmxhL2pzLXNkay1wcm8ubWluLmpzIj48L3NjcmlwdD4nKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8c2NyaXB0PkxBLmluaXQoe2lkOiAiSlFURGlPVloycFJqR2ExSyIsY2s6ICJKUVREaU9WWjJwUmpHYTFLIn0pPC9zY3JpcHQ+Jyk7CiAgICAgICAgfSwgMjAwMCk7CiAgICB9LCAwKTsKfSkoKTsKCmZ1bmN0aW9uIGwobG9nKSB7CiAgICBjb25zb2xlLmxvZygiW0NTRE5HcmVlbmVyXSAiICsgbG9nKTsKfQoKZnVuY3Rpb24gZShlcnJvcikgewogICAgY29uc29sZS5lcnJvcigiW0NTRE5HcmVlbmVyXSAiICsgZXJyb3IpOwp9CgpmdW5jdGlvbiBjbGVhcigpIHsKICAgIGxpc3QgPSBbXTsKfQoKZnVuY3Rpb24gcHV0KHRhZykgewogICAgbGlzdC5wdXNoKHRhZyk7Cn0KCmZ1bmN0aW9uIGNsZWFuKHRpbWVzKSB7CiAgICB2YXIgbG9vcCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAtLXRpbWVzOwogICAgICAgIGlmICh0aW1lcyA8PSAwKSB7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwobG9vcCk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGlzdC5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAkKGxpc3Rba10pLnJlbW92ZSgpOwogICAgICAgIH0KICAgIH0sIDEwMCk7CiAgICBwcm9ncmVzc29yLmluY1Byb2dyZXNzKDEwKTsKfQoKZnVuY3Rpb24gbG9vcChudW0pIHsKICAgIHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAobnVtID09PSAxKSB7CiAgICAgICAgICAgIC8vIOS4u+mhteS4remXtOeahOW5v+WRigogICAgICAgICAgICAkKCIuSl9hZHYiKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5Li76aG15pyJ5paw55qE5YaF5a655qiq5p2hCiAgICAgICAgICAgICQoIi5mZWVkLWZpeC1ib3giKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5Li76aG15bm/5ZGKIGlmcmFtZQogICAgICAgICAgICBpZiAoY3VycmVudFVSTCA9PSAiaHR0cHM6Ly93d3cuY3Nkbi5uZXQvIikgewogICAgICAgICAgICAgICAgJCgiaWZyYW1lIikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5Yig6ZmkIENTRE4g5a6Y5pa55Zyo5Li76aG155qE5paH56ug77yI5aSn5aSa5piv5bm/5ZGK77yJCiAgICAgICAgICAgICQoImxpLmNsZWFyZml4IikuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgYmFubmVkID0gL2NzZG48XC9hPi87CiAgICAgICAgICAgICAgICB2YXIgYU1hcmsgPSAkKGVsZSkuZmluZCgiLm5hbWUiKS5odG1sKCk7CiAgICAgICAgICAgICAgICBpZiAoYmFubmVkLnRlc3QoYU1hcmspKSB7CiAgICAgICAgICAgICAgICAgICAgJChlbGUpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8g5Li76aG15bm/5ZGKCiAgICAgICAgICAgICQoImxpIikuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgbGV0IHNlbGYgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlID0gc2VsZi5hdHRyKCdkYXRhLXR5cGUnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2FkJykgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyDkuLvpobXlub/lkYoKICAgICAgICAgICAgJCgibGkgPiBkaXYgPiBkaXYgPiBoMiA+IGFbaHJlZio9J2h0dHBzOi8vZWR1LmNzZG4ubmV0J10iKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgJCgibGkgPiBkaXYgPiBkaXYgPiBoMiA+IGFbaHJlZio9J2h0dHBzOi8vbWFya2V0aW5nLmNzZG4ubmV0J10iKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5a6Y5pa56ISa5pys5qiq5bmFCiAgICAgICAgICAgICQoIi50b29sYmFyLWFkdmVydCIpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09PSAyKSB7CiAgICAgICAgICAgIC8vIOivhOiuuuafpeeci+abtOWkmuWxleW8gOebkeWQrAogICAgICAgICAgICAkKCJkaXYuY29tbWVudC1saXN0LWJveCIpLmNzcygibWF4LWhlaWdodCIsICJub25lIik7CiAgICAgICAgICAgIC8vIOWxj+iUveaCqOeahOe8qeaUvuS4jeaYrzEwMCXnmoTmj5DnpLoKICAgICAgICAgICAgJCgnLmxlZnRQb3AnKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5a6Y5pa56ISa5pys5qiq5bmFCiAgICAgICAgICAgICQoIi50b29sYmFyLWFkdmVydCIpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09IDMpIHsKICAgICAgICAgICAgLy8g5b6q546v5Yig6Zmk55m75b2V5o+Q56S65qGGCiAgICAgICAgICAgICQoIi5wYXNzcG9ydC1sb2dpbi1jb250YWluZXIiKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g57qi5YyF6ZuoCiAgICAgICAgICAgICQoIiNjc2RuLXJlZHBhY2siKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICB9LCA1MDApOwp9CgpmdW5jdGlvbiBjb21tb24obnVtLCB0aW1lcykgewogICAgdmFyIGxvb3AgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgLS10aW1lczsKICAgICAgICBpZiAodGltZXMgPD0gMCkgewogICAgICAgICAgICBjbGVhckludGVydmFsKGxvb3ApOwogICAgICAgIH0KICAgICAgICBpZiAobnVtID09PSAxKSB7CiAgICAgICAgICAgIC8vIOafpeeci+abtOWkmgogICAgICAgICAgICAkKCIuYnRuLXJlYWRtb3JlIikucmVtb3ZlQ2xhc3MoIm5vLWxvZ2luIik7CiAgICAgICAgICAgICQoIi5idG4tcmVhZG1vcmUiKS5hZGRDbGFzcygiZmFucy1yZWFkLW1vcmUiKTsKICAgICAgICAgICAgJCgiLmJ0bi1yZWFkbW9yZSIpLnJlbW92ZUF0dHIoImhyZWYiKTsKICAgICAgICAgICAgJCgiLmJ0bi1yZWFkbW9yZSIpLnJlbW92ZUF0dHIoInRhcmdldCIpOwogICAgICAgICAgICAkKCIuYnRuLXJlYWRtb3JlIikucmVtb3ZlQXR0cigicmVsIik7CiAgICAgICAgICAgICQoIi5idG4tcmVhZG1vcmUiKS5jbGljaygpOwogICAgICAgICAgICAvLyDlt7LnmbvlvZXnlKjmiLflsZXlvIDor4TorroKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG5Nb3JlQ29tbWVudCIpLmNsaWNrKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgIC8vIOWIoOmZpOafpeeci+abtOWkmuaMiemSrgogICAgICAgICAgICAkKCIjYnRuTW9yZUNvbW1lbnQiKS5wYXJlbnQoImRpdi5vcHQtYm94IikucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIOWxleW8gOWGheWuuQogICAgICAgICAgICAkKCJkaXYuY29tbWVudC1saXN0LWJveCIpLmNzcygibWF4LWhlaWdodCIsICJub25lIik7CiAgICAgICAgICAgIC8vIOaUueWbnuiDjOaZr+minOiJsgogICAgICAgICAgICAkKCIubG9naW4tbWFyayIpLnJlbW92ZSgpOwogICAgICAgICAgICAvLyDliKDpmaTnmbvlvZXmoYYKICAgICAgICAgICAgJCgiLmxvZ2luLWJveCIpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09PSAyKSB7CiAgICAgICAgICAgIC8vIOaMoeS9j+ivhOiuuueahOKAnOWHuuWktOaOqOiNkOKAnQogICAgICAgICAgICBpZiAoJCgiLnJlY29tbWVuZC1ib3giKS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAkKCIucmVjb21tZW5kLWJveCIpWzBdLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOWOu+WklumTvgogICAgICAgICAgICAkKCIjY29udGVudF92aWV3cyIpLm9mZigpOwogICAgICAgICAgICAvLyDljrvpmaTmjqjlub/lub/lkYoKICAgICAgICAgICAgJCgibGlbZGF0YS10eXBlPSdhZCddIikucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIOWFjeeZu+W9leWkjeWItgogICAgICAgICAgICAkKCIuaGxqcy1idXR0b24iKS5yZW1vdmVDbGFzcygic2lnbmluIik7CiAgICAgICAgICAgICQoIi5obGpzLWJ1dHRvbiIpLmFkZENsYXNzKCJ7Mn0iKTsKICAgICAgICAgICAgJCgiLmhsanMtYnV0dG9uIikuYXR0cigiZGF0YS10aXRsZSIsICLlhY3nmbvlvZXlpI3liLYiKTsKICAgICAgICAgICAgJCgiLmhsanMtYnV0dG9uIikuYXR0cigib25jbGljayIsICJobGpzLmNvcHlDb2RlKGV2ZW50KSIpOwogICAgICAgICAgICAvLyDljrvpmaTliarotLTmnb/liqvmjIEKICAgICAgICAgICAgJCgiY29kZSIpLmF0dHIoIm9uY2xpY2siLCAibWRjcC5jb3B5Q29kZShldmVudCkiKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIOWkjeWItuaXtuS/neeVmeWOn+aWh+agvOW8j++8jOWPguiAgyBodHRwczovL2dyZWFzeWZvcmsub3JnL2VuL3NjcmlwdHMvMzkwNTAyLWNzZG5yZW1vdmVjb3B5cmlnaHQvY29kZQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgImFydGljbGVUeXBlIiwgewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3Nkbi5jb3B5cmlnaHQuaW5pdCgiIiwgIiIsICIiKTsKICAgICAgICAgICAgLy8g6aG15aS05bm/5ZGKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJjb2x1bW4tYWR2ZXJ0LWJveCIpWzBdLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAvLyDoh6rliqjmo4DmtYvmmK/lkKbmnInnm67lvZXvvIzlpoLmnpzmsqHmnInliJnliKDpmaTlj7PovrnmoI/vvIzmlofnq6DlsYXkuK0KICAgICAgICAgICAgaWYgKCQoIi5yZWNvbW1lbmQtcmlnaHRfYXNpZGUiKS5odG1sKCkgJiYgJCgiLnJlY29tbWVuZC1yaWdodF9hc2lkZSIpLmh0bWwoKS5yZXBsYWNlKC9bXHJcbl0vZywgIiIpLnJlcGxhY2UoLyhccykvZywgIiIpID09PSAiIikgewogICAgICAgICAgICAgICAgJCgiI3JpZ2h0QXNpZGUiKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkKCIucmVjb21tZW5kLXJpZ2h0X2FzaWRlIikuaHRtbCgpICYmICQoIiNyZWNvbW1lbmQtcmlnaHQiKS5odG1sKCkucmVwbGFjZSgvW1xyXG5dL2csICIiKS5yZXBsYWNlKC8oXHMpL2csICIiKSA9PT0gIiIpIHsKICAgICAgICAgICAgICAgICQoIiNyaWdodEFzaWRlIikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g55m75b2V5oyJ6ZKu5paH5a2X5aSq5aSa77yM5L+u5pS5CiAgICAgICAgICAgICQoImEiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcykuYXR0cignaHJlZicpID09PSAnaHR0cHM6Ly9wYXNzcG9ydC5jc2RuLm5ldC9hY2NvdW50L2xvZ2luJykgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuaHRtbCgn55m75YWlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyDpobbmoI/lub/lkYoKICAgICAgICAgICAgJCgibGkiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGUgPSBzZWxmLmF0dHIoJ2RhdGEtc3ViLW1lbnUtdHlwZScpOwogICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAndmlwJykgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyDpobbmoI9WSVDpgInpobkKICAgICAgICAgICAgJCgnLnRvb2xiYXItc3ViTWVudS1ib3gnKS5maW5kKCJbaHJlZj0naHR0cHM6Ly9tYWxsLmNzZG4ubmV0L3ZpcCddIikucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMykgewogICAgICAgICAgICAvL+iuuuWdm+iHquWKqOWxleW8gAogICAgICAgICAgICAkKCIuanNfc2hvd190b3BpYyIpLmNsaWNrKCk7CiAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gNCkgewogICAgICAgICAgICAvKiog6YWN572u5o6n5Yi2ICoqLwogICAgICAgICAgICBsZXQgY29uZmlnID0gbmV3IENvbmZpZygpOwogICAgICAgICAgICBsZXQgc21Db29raWUgPSBjb25maWcuZ2V0KCJzY3Itc20iLCB0cnVlKTsKICAgICAgICAgICAgbGV0IG1kQ29va2llID0gY29uZmlnLmdldCgic2NyLW1kIiwgZmFsc2UpOwogICAgICAgICAgICBsZXQgbGdDb29raWUgPSBjb25maWcuZ2V0KCJzY3ItbGciLCBmYWxzZSk7CiAgICAgICAgICAgIGxldCBmb0Nvb2tpZSA9IGNvbmZpZy5nZXQoInNjci1mbyIsIGZhbHNlKQoKICAgICAgICAgICAgJCgiI3Njci1zbSIpLnByb3AoImNoZWNrZWQiLCBzbUNvb2tpZSk7CiAgICAgICAgICAgICQoIiNzY3ItbWQiKS5wcm9wKCJjaGVja2VkIiwgbWRDb29raWUpOwogICAgICAgICAgICAkKCIjc2NyLWxnIikucHJvcCgiY2hlY2tlZCIsIGxnQ29va2llKTsKICAgICAgICAgICAgJCgiI3Njci1mbyIpLnByb3AoImNoZWNrZWQiLCBmb0Nvb2tpZSk7CgogICAgICAgICAgICBpZiAoc21Db29raWUpIHsKICAgICAgICAgICAgICAgIC8vIFNtYWxsIFNjcmVlbiBNb2RlCiAgICAgICAgICAgICAgICAkKCIubWFpbl9mYXRoZXIiKS5yZW1vdmVDbGFzcygianVzdGlmeS1jb250ZW50LWNlbnRlciIpOwogICAgICAgICAgICAgICAgR01fYWRkU3R5bGUoYAogICAgICAgICAgICAgICAgbWFpbnsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogYXV0byFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgZmxvYXQ6IG5vbmUhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIG1heC13aWR0aDogOTB2dzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1haW4gYXJ0aWNsZSBpbWd7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgICAgICAgICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYCk7CiAgICAgICAgICAgICAgICAkKCIjbWFpbkJveCIpLmNzcygid2lkdGgiLCAiMTAwJSIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1kQ29va2llKSB7CiAgICAgICAgICAgICAgICAvLyBNaWRkbGUgU2NyZWVuIE1vZGUKICAgICAgICAgICAgICAgICQoIi5tYWluX2ZhdGhlciIpLnJlbW92ZUNsYXNzKCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGdDb29raWUpIHsKICAgICAgICAgICAgICAgIC8vIExhcmdlIFNjcmVlbiBNb2RlCiAgICAgICAgICAgICAgICAkKCIuY29udGFpbmVyIikuY3NzKCJtYXJnaW4iLCAiMCBhdXRvIikKICAgICAgICAgICAgfSBlbHNlIGlmIChmb0Nvb2tpZSkgewogICAgICAgICAgICAgICAgLy8gRm9jdXMgbW9kZQogICAgICAgICAgICAgICAgJCgiLnJlY29tbWVuZC1yaWdodCIpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJCgiLmNvbnRhaW5lciIpLmNzcygid2lkdGgiLCAiMTAwJSIpOwogICAgICAgICAgICAgICAgJCgiLmNvbnRhaW5lciA+IG1haW4iKS5jc3MoIndpZHRoIiwgIjEwMCUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g5bGP5bmV5bC65a+45Y2V6YCJ55uR5ZCsCiAgICAgICAgICAgICQoIiNzY3Itc20iKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3Itc20iLCB0cnVlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1tZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1sZyIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1mbyIsIGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoIiNzY3ItbWQiKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1zbSIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1sZyIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1mbyIsIGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoIiNzY3ItbGciKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbGciLCB0cnVlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1zbSIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1tZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1mbyIsIGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoIiNzY3ItZm8iKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItZm8iLCB0cnVlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1zbSIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1tZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQoInNjci1sZyIsIGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpuS4uueZu+W9leeKtuaAgQogICAgICAgICAgICAkKCJhIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ2hyZWYnKSA9PT0gJ2h0dHBzOi8vcGFzc3BvcnQuY3Nkbi5uZXQvYWNjb3VudC9sb2dpbicpIHsKICAgICAgICAgICAgICAgICAgICAvLyDmnKrnmbvlvZXliKDpmaTml6DnlKjmjInpkq4KICAgICAgICAgICAgICAgICAgICAkKCJhOmNvbnRhaW5zKCfkvJrlkZjkuK3lv4MnKSIpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICQoImE6Y29udGFpbnMoJ+aUtuiXjycpIikucGFyZW50KClbMF0ucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgJCgiYTpjb250YWlucygn5Yqo5oCBJykiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAkKCJhOmNvbnRhaW5zKCfliJvkvZwnKSIpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSA1KSB7CiAgICAgICAgICAgIC8vIOaUueWbnuiDjOaZr+minOiJsgogICAgICAgICAgICAkKCIubG9naW4tbWFyayIpLnJlbW92ZSgpOwogICAgICAgICAgICAvLyDliKDpmaTnmbvlvZXmoYYKICAgICAgICAgICAgJCgiLmxvZ2luLWJveCIpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09IDYpIHsKICAgICAgICAgICAgbGV0IGRpZCA9IGZhbHNlOwogICAgICAgICAgICBsZXQgY29uZmlnSFRNTCA9ICcnOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8ZGl2IGNsYXNzPSJjb25maWdDb250YWluZXIiPjxwPjxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FkbGVyZWQvQ1NETkdyZWVuZXIiIHRhcmdldD0iX2JsYW5rIj5DU0ROR3JlZW5lcjwvYT4gPHN1cD5WJyArIHZlcnNpb24gKyAnICcgKyBzZXR0aW5nc19zdmcgKyAnPC9zdXA+PC9wPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxwPjxhIGhyZWY9Ii8vc2hhbmcucXEuY29tL3dwYS9xdW53cGE/aWRrZXk9ZDdhZDZlYWQzZjU3NzIyZTdmMDBhNDI4MWFlNzVkYmFjMjEzMmM1YThjZjMyMTk5MmQ1NzMwOTAzN2ZjYWY2MyIgdGFyZ2V0PSJfYmxhbmsiPuWumOaWuSBRUSDkuqTmtYHnvqTvvJoxMDQyMzcwNDUzPC9hPjwvcD48YnI+JzsKCiAgICAgICAgICAgIC8vIOiuvuWumu+8muaOqOiNkOWGheWuueaMiemSrgogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8cCBjbGFzcz0iYm9sZCI+5qC55o2u5bGP5bmV5bC65a+477yM6YCC6YWN54mI5byPPC9wPjxwPuW7uuiurumAkOS4quWwneivleWQjumAieaLqemAguWQiOS9oOeahOeJiOW8j++8jOWxj+W5lei/h+Wwj+aIluiAheeJiOW8j+mAieaLqeS4jeato+ehruWPs+S+p+agj+WPr+iDveayoeacieepuumXtOaYvuekuu+8jOWvvOiHtOS+p+agj+WumuWItuaXoOaViO+8iOivt+Wwneivleiwg+iKgua1j+iniOWZqOe8qeaUvu+8jOW/q+aNt+mUriBDdHJsK+m8oOagh+a7mui9ru+8ieOAgjwvcD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8bGFiZWw+PGlucHV0IG5hbWU9ImRpc3BsYXlNb2RlIiB0eXBlPSJyYWRpbyIgdmFsdWU9IiIgaWQ9InNjci1zbSIgLz4g5bmz6ZO65qih5byPKOS8mOWMlueJiCkgPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8bGFiZWw+PGlucHV0IG5hbWU9ImRpc3BsYXlNb2RlIiB0eXBlPSJyYWRpbyIgdmFsdWU9IiIgaWQ9InNjci1tZCIgLz4g6YCC5bqU5qih5byPIDwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGxhYmVsPjxpbnB1dCBuYW1lPSJkaXNwbGF5TW9kZSIgdHlwZT0icmFkaW8iIHZhbHVlPSIiIGlkPSJzY3ItbGciIC8+IOWxheS4reaooeW8jyA8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxsYWJlbD48aW5wdXQgbmFtZT0iZGlzcGxheU1vZGUiIHR5cGU9InJhZGlvIiB2YWx1ZT0iIiBpZD0ic2NyLWZvIiAvPiDmsonmtbjmqKHlvI8o5peg5L6n5qCPKTwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGhyIHN0eWxlPSJoZWlnaHQ6MXB4O2JvcmRlcjpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkICNjY2NjY2M7bWFyZ2luOiA1cHggMHB4IDVweCAwcHg7IiAvPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxwIGNsYXNzPSJib2xkIj7pgJrnlKjorr7lrpo8L3A+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPHA+6Ieq5a6a5LmJ6IOM5pmv5Zu+77yaIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYmFja2dyb3VuZEltZ1VybCIgcGxhY2Vob2xkZXI9IuWbvueJh+aJgOWcqOe9keWdgOaIlkJhc2U2NCIgc3R5bGU9ImJvcmRlci1yYWRpdXM6IDJweDtib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwO3BhZGRpbmc6NXB4O3dpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbTo1cHg7Ij4gPGlucHV0IHN0eWxlPSJtYXJnaW4tYm90dG9tOjVweDsiIGFjY2VwdD0iaW1hZ2UvKiIgaWQ9InVwbG9hZF9iZyIgdHlwZT0iZmlsZSI+PC9wPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1yZWNvbW1lbmQtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLXJlY29tbWVuZC1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuuaOqOiNkOWGheWuuTwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1zaG9wLWJ1dHRvbiI+IDxsYWJlbCBmb3I9InRvZ2dsZS1zaG9wLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5pi+56S65bCP5bqXPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLXdoaXRldGhlbWUtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLXdoaXRldGhlbWUtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7nmb3oibLkuLvpopgmRGFyayBSZWFkZXLlhbzlrrnmqKHlvI88YnI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjODA4MDgwOyI+IyDpgInpobnkvZznlKjvvJrlvIDlkK/lkI7lj6/pgJrov4dEYXJrIFJlYWRlcuaPkuS7tueBtea0u+aOp+WItueZveiJsuS4jum7keaal+aooeW8j++8jDxhIHN0eWxlPSJjb2xvcjogZ3JlZW47IiBocmVmPSJodHRwczovL2Nocm9tZS56enptaC5jbi9pbmZvP3Rva2VuPWVpbWFkcGJjYmZubWJrb3Bvb2pmZWtobmtoZGJpZWVoIiB0YXJnZXQ9Il9ibGFuayI+5o+S5Lu25LiL6L295Zyw5Z2A54K55oiRPC9hPjwvc3Bhbj48L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtYXV0b3NpemUtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWF1dG9zaXplLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5a695bqm6Ieq5Yqo6YCC5bqUPGJyPjxzcGFuIHN0eWxlPSJjb2xvcjogIzgwODA4MDsiPiMg6YCJ6aG55L2c55So77ya5byA5ZCv5q2k6YCJ6aG55Y+v5Lul5Zyo6aG16Z2i5a695bqm57yp5bCP5pe26Ieq5Yqo5YiH5o2i6Iez5bCP5bGP5qih5byPPC9zcGFuPjwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1hdXRvaGlkZXRvb2xiYXItYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWF1dG9oaWRldG9vbGJhci1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuWQkeS4i+a7muWKqOiHquWKqOmakOiXj+mhtuagjzwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1hdXRvaGlkZWJvdHRvbWJhci1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtYXV0b2hpZGVib3R0b21iYXItYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7lp4vnu4jpmpDol4/lupXmoI88L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtd3JpdGVibG9nLWJ1dHRvbiI+IDxsYWJlbCBmb3I9InRvZ2dsZS13cml0ZWJsb2ctYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrliJvkvZzkuK3lv4PmjInpkq48L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aHIgc3R5bGU9ImhlaWdodDoxcHg7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2NjY2NjYzttYXJnaW46IDVweCAwcHggNXB4IDBweDsiIC8+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPHAgY2xhc3M9ImJvbGQiPjxiPuWPs+S+p+agj+WumuWItjwvYj48L3A+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLWF1dGhvcmNhcmQtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWF1dGhvcmNhcmQtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrkvZzogIXlkI3niYc8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtc2VhcmNoYmxvZy1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtc2VhcmNoYmxvZy1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuuaQnOWNmuS4u+aWh+eroDwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1uZXdhcnRpY2xlLWJ1dHRvbiI+IDxsYWJlbCBmb3I9InRvZ2dsZS1uZXdhcnRpY2xlLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5pi+56S65pyA5paw5paH56ugPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLWhvdGFydGljbGUtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWhvdGFydGljbGUtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrng63pl6jmlofnq6A8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtbmV3Y29tbWVudHMtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLW5ld2NvbW1lbnRzLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5pi+56S65pyA5paw6K+E6K66PC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLWtpbmRwZXJzb24tYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWtpbmRwZXJzb24tYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrliIbnsbvkuJPmoI88L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtcmVjb21tZW5kYXJ0aWNsZS1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtcmVjb21tZW5kYXJ0aWNsZS1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuuaOqOiNkOaWh+eroDwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1hcmNoaXZlLWJ1dHRvbiI+IDxsYWJlbCBmb3I9InRvZ2dsZS1hcmNoaXZlLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5pi+56S65b2S5qGjPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLWNvbnRlbnQtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWNvbnRlbnQtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrnm67lvZU8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj48YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGRpdj48aDY+5rKh5pyJ5pS26ZKx55qE5bm/5ZGKPC9oNj48cD7vvIjlm6DkuLrmmK/kvZzogIXmnKzkurrlu7rorr7nmoTnpL7ljLrvvZ48L3A+PHA+56S+5Yy65bu66K6+5Yid5pyf5YWN6LS55Y2H57qn5rC45LmF6LaF57qn5Lya5ZGY5YiG57uE77yM5qyi6L+O5bCP5LyZ5Ly05Lus5LiA6LW35p2l546p77yBPC9wPjxhIGhyZWY9Imh0dHBzOi8vcHdsLmljdSIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJodHRwczovL3ozLmF4MXguY29tLzIwMjEvMDkvMTMvNDlMVGFRLnBuZyIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ii8+PC9hPjwvZGl2Pic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYWRsZXJlZC9DU0ROR3JlZW5lciIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJnaXZlTWVPbmVTdGFyIj4nICsgc3Rhcl9zdmcgKyAnIDxiPueCueaIkX48L2I+IOWKqOWKqOWwj+aJi+WcqCBHaXRIdWIg54K55LiqIFN0YXIg5ZKM5YWz5rOo77yM5pSv5oyB5oiR57un57ut57u05oqk6ISa5pysIDopPC9hPjxicj48YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPHA+54m55Yir5o+Q56S677yaQ1NETkdyZWVuZXIg6ISa5pys5LiN5o+Q5L6b5Lu75L2V5Lya5ZGY5paH56ug56C06Kej44CB5Lya5ZGY6LWE5rqQ5LiL6L295Yqf6IO977yM5LuF6YCC55So5LqO5YmN56uv5LyY5YyW77yM6K+35ZyoQ1NETuWumOaWuea4oOmBk+i0reS5sENTRE7kvJrlkZjkvZPpqozku5jotLnlip/og73jgII8L3A+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGhyIHN0eWxlPSJoZWlnaHQ6MXB4O2JvcmRlcjpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkICNjY2NjY2M7bWFyZ2luOiA1cHggMHB4IDVweCAwcHg7IiAvPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwoKICAgICAgICAgICAgLy8gY29uZmlnSFRNTCArPSAnPGEgaHJlZj0iaHR0cHM6Ly9kb2Muc3RhY2tvdmVyZmxvdy53aWtpL3dlYi8jLzIxP3BhZ2VfaWQ9MTM4IiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9Im1hcmdpbi10b3A6IDVweDsgZGlzcGxheTogYmxvY2s7Ij4nICsgZG9uYXRlX3N2ZyArICcg5oiR5piv6ICB5p2/77yM5oqV5biB5omT6LWPPC9hPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzwvZGl2PjwvZGl2PjxkaXYgaWQ9ImZhZGUiIGNsYXNzPSJibGFja19vdmVybGF5Ij48L2Rpdj4nOwogICAgICAgICAgICBsZXQgc2F2ZUJ1dHRvbiA9ICc8YnV0dG9uIGNsYXNzPSJzYXZlQnV0dG9uIiBzdHlsZT0icG9zaXRpb246IHN0aWNreTt0b3A6IDVweDtsZWZ0OiBjYWxjKDEwMCUgLSA4MHB4KTsiIG9uY2xpY2s9InNhdmVBbmRSZWxvYWQoKTsiPicgKyBzYXZlX3N2ZyArICcg5bqU55SoPC9idXR0b24+JzsKICAgICAgICAgICAgLy8g57u/5YyW5Zmo6K6+5a6aCiAgICAgICAgICAgICQoImJvZHkiKS5hZnRlcignPGRpdiBpZD0iY29uZmlnQ29udGVudCIgY2xhc3M9IndoaXRlX2NvbnRlbnQiPicgKyBzYXZlQnV0dG9uICsgY29uZmlnSFRNTCk7CgogICAgICAgICAgICAvKiog6YWN572u5o6n5Yi2ICoqLwogICAgICAgICAgICAvLyDmjqjojZDlhoXlrrkKICAgICAgICAgICAgJCgiLmJsb2ctY29udGVudC1ib3giKS5hcHBlbmQoIjxicj48ZGl2IGNsYXNzPSdibG9nLWNvbnRlbnQtYm94JyBpZD0ncmVjb21tZW5kU3dpdGNoJyBzdHlsZT0ndGV4dC1hbGlnbjogcmlnaHQ7Jz48L2Rpdj4iKTsKICAgICAgICAgICAgJCgiI3JlY29tbWVuZFN3aXRjaDpsYXN0IikuYXBwZW5kKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWJ1dHRvbiIgY2xhc3M9ImJ1dHRvbi1sYWJlbCI+IDxzcGFuIGNsYXNzPSJjaXJjbGUiPjwvc3Bhbj4gPHNwYW4gY2xhc3M9InRleHQgb24iPiZuYnNwOzwvc3Bhbj4gPHNwYW4gY2xhc3M9InRleHQgb2ZmIj4mbmJzcDs8L3NwYW4+IDwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHAgc3R5bGU9Im1hcmdpbi10b3A6IDVweDsgZm9udC1zaXplOiAxM3B4OyI+5pi+56S65o6o6I2Q5YaF5a65PC9wPicpOwogICAgICAgICAgICBsZXQgcmVjb21tZW5kQ29va2llID0gY29uZmlnLmdldCgicmVjb21tZW5kIiwgZmFsc2UpOwogICAgICAgICAgICBpZiAoIXJlY29tbWVuZENvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiLnJlY29tbWVuZC1ib3giKS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlY29tbWVuZENvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1yZWNvbW1lbmQtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXJlY29tbWVuZC1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtcmVjb21tZW5kLWJ1dHRvbiIsICJyZWNvbW1lbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7JCgiLnJlY29tbWVuZC1ib3giKS5zbGlkZURvd24oMjAwKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7JCgiLnJlY29tbWVuZC1ib3giKS5zbGlkZVVwKDIwMCk7fSk7CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b25BbmRBY3Rpb24oIiN0b2dnbGUtYnV0dG9uIiwgInJlY29tbWVuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7JCgiLnJlY29tbWVuZC1ib3giKS5zbGlkZURvd24oMjAwKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7JCgiLnJlY29tbWVuZC1ib3giKS5zbGlkZVVwKDIwMCk7fSk7CgogICAgICAgICAgICAvLyDmmL7npLrlsI/lupcKICAgICAgICAgICAgbGV0IHNob3BDb29raWUgPSBjb25maWcuZ2V0KCdzaG9wJyxmYWxzZSk7CiAgICAgICAgICAgIGlmKCFzaG9wQ29va2llKXsKICAgICAgICAgICAgICAgICQoIiNjc2RuLXNob3Atd2luZG93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2NzZG4tc2hvcC13aW5kb3ctdG9wIikuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzaG9wQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXNob3AtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1zaG9wLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1zaG9wLWJ1dHRvbiIsICJzaG9wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g5pi+56S65L2c6ICF5ZCN54mHCiAgICAgICAgICAgIGxldCBhdXRob3JDYXJkQ29va2llID0gY29uZmlnLmdldCgiYXV0aG9yQ2FyZCIsIHRydWUpOwogICAgICAgICAgICBpZiAoYXV0aG9yQ2FyZENvb2tpZSkgewogICAgICAgICAgICAgICAgLy8g5Y2a5Li75L+h5oGvCiAgICAgICAgICAgICAgICAkKCcjcmVjb21tZW5kLXJpZ2h0JykuYXBwZW5kKCQoJyNhc2lkZVByb2ZpbGUnKS5wcm9wKCJvdXRlckhUTUwiKSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZVByb2ZpbGUnKS5hdHRyKCJzdHlsZSIsICJtYXJnaW4tdG9wOiA4cHg7IHdpZHRoOiAzMDBweDsiKTsKICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGF1dGhvckNhcmRDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtYXV0aG9yY2FyZC1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWF1dGhvcmNhcmQtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubGlzdGVuQnV0dG9uKCIjdG9nZ2xlLWF1dGhvcmNhcmQtYnV0dG9uIiwgImF1dGhvckNhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g5by65Yi255m96Imy5Li76aKYCiAgICAgICAgICAgIGxldCB3aGl0ZVRoZW1lQ29va2llID0gY29uZmlnLmdldCgid2hpdGVUaGVtZSIsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKHdoaXRlVGhlbWVDb29raWUpIHsKICAgICAgICAgICAgICAgIC8vIOiDjOaZr+WIoOmZpAogICAgICAgICAgICAgICAgJCgnLm1haW5fZmF0aGVyJykuYXR0cignc3R5bGUnLCAnYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmY3OyBiYWNrZ3JvdW5kOiAjZjVmNmY3OycpOwogICAgICAgICAgICAgICAgJCgnW2hyZWZePSJodHRwczovL2NzZG5pbWcuY24vcmVsZWFzZS9waG9lbml4L3RlbXBsYXRlL3RoZW1lc19za2luLyJdJykuYXR0cignaHJlZicsICdodHRwczovL2NzZG5pbWcuY24vcmVsZWFzZS9waG9lbml4L3RlbXBsYXRlL3RoZW1lc19za2luL3NraW4tdGVjaG5vbG9neS9za2luLXRlY2hub2xvZ3ktNjMzNjU0OTU1Ny5taW4uY3NzJyk7CiAgICAgICAgICAgICAgICAkKCcjY3Nkbi10b29sYmFyJykucmVtb3ZlQ2xhc3MoJ2NzZG4tdG9vbGJhci1za2luLWJsYWNrJyk7CiAgICAgICAgICAgICAgICAkKCcuY3Nkbi1sb2dvJykuYXR0cignc3JjJywgJy8vY3NkbmltZy5jbi9jZG4vY29udGVudC10b29sYmFyL2NzZG4tbG9nby5wbmc/dj0yMDIwMDQxNi4xJyk7CiAgICAgICAgICAgICAgICAkKCdodG1sJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmNWY2ZjcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2hpdGVUaGVtZUNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS13aGl0ZXRoZW1lLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtd2hpdGV0aGVtZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtd2hpdGV0aGVtZS1idXR0b24iLCAid2hpdGVUaGVtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDog4zmma/lm74KICAgICAgICAgICAgbGV0IGJhY2tncm91bmRJbWFnZSA9IEdNX2dldFZhbHVlKCJiYWNrZ3JvdW5kSW1hZ2UiLCAiIik7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kSW1hZ2UgIT09ICIiKSB7CiAgICAgICAgICAgICAgICAkKCIjYmFja2dyb3VuZEltZ1VybCIpLnZhbChiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICAgICAgJCgiLm1haW5fZmF0aGVyIikuYXR0cignc3R5bGUnLCAnYmFja2dyb3VuZC1pbWFnZTp1cmwoJyArIGJhY2tncm91bmRJbWFnZSArICcpO2JhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZDtiYWNrZ3JvdW5kLXNpemU6MTAwJTsnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkKCcjYmFja2dyb3VuZEltZ1VybCcpLm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImJhY2tncm91bmRJbWFnZSIsICQoIiNiYWNrZ3JvdW5kSW1nVXJsIikudmFsKCkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJCgnI2JhY2tncm91bmRJbWdVcmwnKS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiYmFja2dyb3VuZEltYWdlIiwgJCgiI2JhY2tncm91bmRJbWdVcmwiKS52YWwoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCIjdXBsb2FkX2JnIikub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbGV0IGZpbGUgPSAkKCIjdXBsb2FkX2JnIilbMF0uZmlsZXNbMF07CiAgICAgICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGxldCBiYXNlNjQgPSBlLnRhcmdldC5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgJCgnI2JhY2tncm91bmRJbWdVcmwnKS52YWwoYmFzZTY0KTsKICAgICAgICAgICAgICAgICAgICAkKCcjYmFja2dyb3VuZEltZ1VybCcpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g5pCc5Y2a5Li75paH56ugCiAgICAgICAgICAgIGxldCBzZWFyY2hCbG9nQ29va2llID0gY29uZmlnLmdldCgic2VhcmNoQmxvZyIsIGZhbHNlKTsKICAgICAgICAgICAgaWYoc2VhcmNoQmxvZ0Nvb2tpZSkgewogICAgICAgICAgICAgICAgJCgnI3JlY29tbWVuZC1yaWdodCcpLmFwcGVuZCgkKCcjYXNpZGVTZWFyY2hBcnRpY2xlJykucHJvcCgib3V0ZXJIVE1MIikpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjYXNpZGVTZWFyY2hBcnRpY2xlJykuYXR0cigic3R5bGUiLCAibWFyZ2luLXRvcDogOHB4OyB3aWR0aDogMzAwcHg7Iik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAkKCIjc2VhcmNoLWJsb2ctd29yZHMiKQogICAgICAgICAgICAgICAgICAgICAgLCBuID0gJCgiLmJ0bi1zZWFyY2gtYmxvZyIpOwogICAgICAgICAgICAgICAgICAgIGkua2V5dXAoZnVuY3Rpb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQua2V5Q29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEzID09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZW5jb2RlVVJJQ29tcG9uZW50KGkudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICIvL3NvLmNzZG4ubmV0L3NvL3NlYXJjaC9zLmRvP3E9IiArIGUgKyAiJnQ9YmxvZyZ1PSIgKyB1c2VybmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbi5vbigiY2xpY2siLCBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZW5jb2RlVVJJQ29tcG9uZW50KGkudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAiLy9zby5jc2RuLm5ldC9zby9zZWFyY2gvcy5kbz9xPSIgKyBuICsgIiZ0PWJsb2cmdT0iICsgdXNlcm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihlKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2VhcmNoQmxvZ0Nvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1zZWFyY2hibG9nLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtc2VhcmNoYmxvZy1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtc2VhcmNoYmxvZy1idXR0b24iLCAic2VhcmNoQmxvZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDmnIDmlrDmlofnq6AKICAgICAgICAgICAgbGV0IG5ld0FydGljbGVDb29raWUgPSBjb25maWcuZ2V0KCJuZXdBcnRpY2xlIiwgZmFsc2UpOwogICAgICAgICAgICBpZiAobmV3QXJ0aWNsZUNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgnI3JlY29tbWVuZC1yaWdodCcpLmFwcGVuZCgkKCcjYXNpZGVOZXdBcnRpY2xlJykucHJvcCgib3V0ZXJIVE1MIikpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjYXNpZGVOZXdBcnRpY2xlJykuYXR0cigic3R5bGUiLCAibWFyZ2luLXRvcDogOHB4OyB3aWR0aDogMzAwcHg7Iik7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV3QXJ0aWNsZUNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1uZXdhcnRpY2xlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtbmV3YXJ0aWNsZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtbmV3YXJ0aWNsZS1idXR0b24iLCAibmV3QXJ0aWNsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDng63pl6jmlofnq6AKICAgICAgICAgICAgbGV0IGhvdEFydGljbGVDb29raWUgPSBjb25maWcuZ2V0KCJob3RBcnRpY2xlIiwgZmFsc2UpOwogICAgICAgICAgICBpZiAoaG90QXJ0aWNsZUNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgnI3JlY29tbWVuZC1yaWdodCcpLmFwcGVuZCgkKCIjYXNpZGVIb3RBcnRpY2xlIikucHJvcCgib3V0ZXJIVE1MIikpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjYXNpZGVIb3RBcnRpY2xlJykuYXR0cigic3R5bGUiLCAibWFyZ2luLXRvcDogOHB4OyB3aWR0aDogMzAwcHg7Iik7CiAgICAgICAgICAgICAgICAgICAgJCgnI2FzaWRlSG90QXJ0aWNsZSBpbWcnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChob3RBcnRpY2xlQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWhvdGFydGljbGUtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1ob3RhcnRpY2xlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1ob3RhcnRpY2xlLWJ1dHRvbiIsICJob3RBcnRpY2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOacgOaWsOivhOiuugogICAgICAgICAgICBsZXQgbmV3Q29tbWVudHNDb29raWUgPSBjb25maWcuZ2V0KCJuZXdDb21tZW50cyIsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKG5ld0NvbW1lbnRzQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCcjcmVjb21tZW5kLXJpZ2h0JykuYXBwZW5kKCQoIiNhc2lkZU5ld0NvbW1lbnRzIikucHJvcCgib3V0ZXJIVE1MIikpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjYXNpZGVOZXdDb21tZW50cycpLmF0dHIoInN0eWxlIiwgIm1hcmdpbi10b3A6IDhweDsgd2lkdGg6IDMwMHB4OyIpOwogICAgICAgICAgICAgICAgICAgICQoIi5jb21tZW50LmVsbGlwc2lzIikuYXR0cigic3R5bGUiLCAibWF4LWhlaWdodDogbm9uZTsiKTsKICAgICAgICAgICAgICAgICAgICAkKCIudGl0bGUudGV4dC10cnVuY2F0ZSIpLmF0dHIoInN0eWxlIiwgInBhZGRpbmc6IDAiKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdDb21tZW50c0Nvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1uZXdjb21tZW50cy1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLW5ld2NvbW1lbnRzLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1uZXdjb21tZW50cy1idXR0b24iLCAibmV3Q29tbWVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g5YiG57G75LiT5qCPCiAgICAgICAgICAgIGxldCBraW5kUGVyc29uQ29va2llID0gY29uZmlnLmdldCgia2luZFBlcnNvbiIsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKCFraW5kUGVyc29uQ29va2llKSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZUNhdGVnb3J5JykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgJCgnLmtpbmRfcGVyc29uJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoJyNyZWNvbW1lbmQtcmlnaHQnKS5hcHBlbmQoJCgiI2FzaWRlQ2F0ZWdvcnkiKS5wcm9wKCJvdXRlckhUTUwiKSk7CiAgICAgICAgICAgICAgICBpZiAoJCgiI2FzaWRlQ2F0ZWdvcnkiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmtpbmRfcGVyc29uJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoJy5raW5kX3BlcnNvbicpLmF0dHIoInN0eWxlIiwgIm1hcmdpbi10b3A6IDhweDsgd2lkdGg6IDMwMHB4OyBoZWlnaHQ6MjU1cHg7Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZUNhdGVnb3J5JykuYXR0cigic3R5bGUiLCAibWFyZ2luLXRvcDogOHB4OyB3aWR0aDogMzAwcHg7IGRpc3BsYXk6YmxvY2sgIWltcG9ydGFudDsiKTsKICAgICAgICAgICAgICAgICAgICAkKCJhLmZsZXhpYmxlLWJ0biIpLmNsaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJ2Rpdi5hc2lkZS1ib3gnKS5yZW1vdmVDbGFzcygnZmxleGlibGUtYm94Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50cygicC50ZXh0LWNlbnRlciIpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChraW5kUGVyc29uQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWtpbmRwZXJzb24tYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1raW5kcGVyc29uLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1raW5kcGVyc29uLWJ1dHRvbiIsICJraW5kUGVyc29uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOebruW9lQogICAgICAgICAgICBsZXQgY29udGVudENvb2tpZSA9IGNvbmZpZy5nZXQoImNvbnRlbnQiLCB0cnVlKTsKICAgICAgICAgICAgaWYgKCFjb250ZW50Q29va2llKSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJy5hbGlnbi1pdGVtcy1zdHJldGNoLmdyb3VwX2l0ZW0nKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb250ZW50Q29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWNvbnRlbnQtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1jb250ZW50LWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1jb250ZW50LWJ1dHRvbiIsICJjb250ZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOaOqOiNkOaWh+eroAogICAgICAgICAgICBsZXQgcmVjb21tZW5kQXJ0aWNsZUNvb2tpZSA9IGNvbmZpZy5nZXQoInJlY29tbWVuZEFydGljbGUiLCBmYWxzZSk7CiAgICAgICAgICAgIGlmICghcmVjb21tZW5kQXJ0aWNsZUNvb2tpZSkgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcucmVjb21tZW5kLWxpc3QtYm94JykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLnJlY29tbWVuZC1saXN0LWJveCcpLmF0dHIoInN0eWxlIiwgIm1hcmdpbi10b3A6IDhweDsgd2lkdGg6IDMwMHB4OyBoZWlnaHQ6MjU1cHg7Iik7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVjb21tZW5kQXJ0aWNsZUNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1yZWNvbW1lbmRhcnRpY2xlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtcmVjb21tZW5kYXJ0aWNsZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtcmVjb21tZW5kYXJ0aWNsZS1idXR0b24iLCAicmVjb21tZW5kQXJ0aWNsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDlvZLmoaMKICAgICAgICAgICAgbGV0IGFyY2hpdmVDb29raWUgPSBjb25maWcuZ2V0KCJhcmNoaXZlIiwgZmFsc2UpOwogICAgICAgICAgICBpZiAoIWFyY2hpdmVDb29raWUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2FzaWRlQXJjaGl2ZScpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCcjcmVjb21tZW5kLXJpZ2h0JykuYXBwZW5kKCQoIiNhc2lkZUFyY2hpdmUiKS5wcm9wKCJvdXRlckhUTUwiKSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZUFyY2hpdmUnKS5hdHRyKCJzdHlsZSIsICJtYXJnaW4tdG9wOiA4cHg7IHdpZHRoOiAzMDBweDsgZGlzcGxheTpibG9jayAhaW1wb3J0YW50OyIpOwogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJjaGl2ZUNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hcmNoaXZlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtYXJjaGl2ZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtYXJjaGl2ZS1idXR0b24iLCAiYXJjaGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDoh6rliqjpnaDlt6blubPpk7oKICAgICAgICAgICAgbGV0IGF1dG9TaXplQ29va2llID0gY29uZmlnLmdldCgiYXV0b1NpemUiLCBmYWxzZSk7CiAgICAgICAgICAgIGlmIChhdXRvU2l6ZUNvb2tpZSkgewogICAgICAgICAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIC8vIOaWh+eroOWuveW6puiHqumAguW6lAogICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDExMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Yig6Zmk5Y6f5pyJ5ZON5bqU5byP5qC35byPCiAgICAgICAgICAgICAgICAgICAgICAgICQoIi5tYWluX2ZhdGhlciIpLnJlbW92ZUNsYXNzKCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICQoImFydGljbGUiKS53aWR0aCh3aW5kb3cuaW5uZXJXaWR0aCAtIDE1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX2FkZFN0eWxlKGAKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhdXRvIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0OiBub25lIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heC13aWR0aDogOTB2dzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBtYWluIGFydGljbGUgaW1newogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBgKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlkID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCJhcnRpY2xlIikucmVtb3ZlQXR0cigic3R5bGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXV0b1NpemVDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtYXV0b3NpemUtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hdXRvc2l6ZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtYXV0b3NpemUtYnV0dG9uIiwgImF1dG9TaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOiHquWKqOmakOiXj+mhtuagjwogICAgICAgICAgICBsZXQgYXV0b0hpZGVUb29sYmFyQ29va2llID0gY29uZmlnLmdldCgiYXV0b0hpZGVUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChhdXRvSGlkZVRvb2xiYXJDb29raWUpIHsKICAgICAgICAgICAgICAgICQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPiAxMDApIHsKICAgICAgICAgICAgICAgIAkgICAgbGV0IHNjcm9sbFMgPSAkKHRoaXMpLnNjcm9sbFRvcCgpOwogICAgICAgICAgICAgICAgCSAgICBpZiAoc2Nyb2xsUyA+PSB3aW5kb3dUb3ApIHsKICAgICAgICAgICAgICAgIAkgICAgCSQoJyNjc2RuLXRvb2xiYXInKS5zbGlkZVVwKDEwMCk7CiAgICAgICAgICAgICAgICAJICAgIAl3aW5kb3dUb3AgPSBzY3JvbGxTOwogICAgICAgICAgICAgICAgCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgCSAgICAJJCgnI2NzZG4tdG9vbGJhcicpLnNsaWRlRG93bigxMDApOwogICAgICAgICAgICAgICAgCSAgICAJd2luZG93VG9wID0gc2Nyb2xsUzsKICAgICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhdXRvSGlkZVRvb2xiYXJDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtYXV0b2hpZGV0b29sYmFyLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtYXV0b2hpZGV0b29sYmFyLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1hdXRvaGlkZXRvb2xiYXItYnV0dG9uIiwgImF1dG9IaWRlVG9vbGJhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDoh6rliqjpmpDol4/lupXmoI8KICAgICAgICAgICAgbGV0IGF1dG9IaWRlQm90dG9tQmFyQ29va2llID0gY29uZmlnLmdldCgiYXV0b0hpZGVCb3R0b21CYXIiLCB0cnVlKTsKICAgICAgICAgICAgaWYgKGF1dG9IaWRlQm90dG9tQmFyQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9vbEJhckJveCAubGVmdC10b29sYm94IikuY3NzKHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogInJlbGF0aXZlIiwKICAgICAgICAgICAgICAgIAlsZWZ0OiAiMHB4IiwKICAgICAgICAgICAgICAgIAlib3R0b206ICIwIiwKICAgICAgICAgICAgICAgIAl3aWR0aDogJCgiI3Rvb2xCYXJCb3giKS53aWR0aCgpICsgInB4IgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgCSQoIiN0b29sQmFyQm94IC5sZWZ0LXRvb2xib3giKS5jc3MoewogICAgICAgICAgICAgICAgCQlwb3NpdGlvbjogInJlbGF0aXZlIiwKICAgICAgICAgICAgICAgIAkJbGVmdDogIjBweCIsCiAgICAgICAgICAgICAgICAJCWJvdHRvbTogIjAiLAogICAgICAgICAgICAgICAgCQl3aWR0aDogJCgiI3Rvb2xCYXJCb3giKS53aWR0aCgpICsgInB4IgogICAgICAgICAgICAgICAgCX0pCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXV0b0hpZGVCb3R0b21CYXJDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtYXV0b2hpZGVib3R0b21iYXItYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hdXRvaGlkZWJvdHRvbWJhci1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtYXV0b2hpZGVib3R0b21iYXItYnV0dG9uIiwgImF1dG9IaWRlQm90dG9tQmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOWIm+S9nOS4reW/g+aMiemSrgogICAgICAgICAgICBsZXQgd3JpdGVCbG9nQ29va2llID0gY29uZmlnLmdldCgid3JpdGVCbG9nIiwgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghd3JpdGVCbG9nQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIudG9vbGJhci1idG4td3JpdGUiKS5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod3JpdGVCbG9nQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXdyaXRlYmxvZy1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXdyaXRlYmxvZy1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtd3JpdGVibG9nLWJ1dHRvbiIsICJ3cml0ZUJsb2ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g5Y+z5L6n5rua5Yqo5p2hCiAgICAgICAgICAgIC8qKiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxldCByaWdodFNpZGVIZWlnaHQgPSAwOwogICAgICAgICAgICAgICAgbGV0IHBhZ2VIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICByaWdodFNpZGVIZWlnaHQgKz0gZ2V0SGVpZ2h0KCQoJy5hbGlnbi1pdGVtcy1zdHJldGNoLmdyb3VwX2l0ZW0nKS5wYXJlbnQoKSk7CiAgICAgICAgICAgICAgICByaWdodFNpZGVIZWlnaHQgKz0gZ2V0SGVpZ2h0KCQoIiNhc2lkZVByb2ZpbGUiKSk7CiAgICAgICAgICAgICAgICByaWdodFNpZGVIZWlnaHQgKz0gZ2V0SGVpZ2h0KCQoIiNhc2lkZVNlYXJjaEFydGljbGUiKSk7CiAgICAgICAgICAgICAgICByaWdodFNpZGVIZWlnaHQgKz0gZ2V0SGVpZ2h0KCQoIiNhc2lkZU5ld0FydGljbGUiKSk7CiAgICAgICAgICAgICAgICByaWdodFNpZGVIZWlnaHQgKz0gZ2V0SGVpZ2h0KCQoIiNhc2lkZUhvdEFydGljbGUiKSk7CiAgICAgICAgICAgICAgICByaWdodFNpZGVIZWlnaHQgKz0gZ2V0SGVpZ2h0KCQoIiNhc2lkZU5ld0NvbW1lbnRzIikpOwogICAgICAgICAgICAgICAgcmlnaHRTaWRlSGVpZ2h0ICs9IGdldEhlaWdodCgkKCIjYXNpZGVDYXRlZ29yeSIpKTsKICAgICAgICAgICAgICAgIHJpZ2h0U2lkZUhlaWdodCArPSBnZXRIZWlnaHQoJCgiI2FzaWRlQXJjaGl2ZSIpKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIlJpZ2h0IHNpZGUgdG90YWwgaGVpZ2h0OiAiICsgcmlnaHRTaWRlSGVpZ2h0KTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIlBhZ2UgaGVpZ2h0OiAiICsgcGFnZUhlaWdodCk7CiAgICAgICAgICAgICAgICBpZiAocmlnaHRTaWRlSGVpZ2h0ID4gcGFnZUhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICQoJyNyZWNvbW1lbmQtcmlnaHQnKS5jc3MoIm92ZXJmbG93IiwgInNjcm9sbCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCAxNTAwKTsgKi8KICAgICAgICB9IGVsc2UgaWYgKG51bSA9PT0gNykgewogICAgICAgICAgICAkKCIubWVfciIpWzFdLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09PSA4KSB7CiAgICAgICAgICAgIC8qICQoIi5hcnRpY2xlLWJhci10b3AiKS5hcHBlbmQoIjxicj4iKTsKICAgICAgICAgICAgJCgiLmFydGljbGUtYmFyLXRvcCIpLmFwcGVuZCgkKCIuYXNpZGUtYm94LWZvb3RlckNsYXNzaWZ5IikuY2hpbGRyZW4oImRkIikuaHRtbCgpKTsKICAgICAgICAgICAgJCgiZGwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuY2hpbGRyZW4oImR0Iik7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkKHRoaXMpLmNoaWxkcmVuKCJkZCIpLmNoaWxkcmVuKCJzcGFuIik7CiAgICAgICAgICAgICAgICBpZiAoa2V5Lmh0bWwoKS5pbmRleE9mKCLljp/liJsiKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgIGtleSA9ICQodGhpcykuY2hpbGRyZW4oImR0IikuY2hpbGRyZW4oImEiKQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJCh0aGlzKS5jaGlsZHJlbigiZGQiKS5jaGlsZHJlbigiYSIpLmNoaWxkcmVuKCJzcGFuIik7CiAgICAgICAgICAgICAgICAgICAgYWRkSW5mbyhrZXksIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmh0bWwoKSAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBhZGRJbmZvKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICk7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZEluZm8oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIGJpbmQgPSBrZXkuaHRtbCgpICsgIiZuYnNwOyIgKyB2YWx1ZS5odG1sKCkgKyAiJm5ic3A7Jm5ic3A7IjsKICAgICAgICAgICAgICAgICQoIi5hcnRpY2xlLWJhci10b3AiKS5hcHBlbmQoYmluZCArICIgIik7CiAgICAgICAgICAgIH0gKi8KICAgICAgICAgICAgJCgiLmJsb2dfY29udGFpbmVyX2FzaWRlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyDmoIfpopjmtojmga/mj5DphpLljrvpmaQKICAgICAgICAgICAgbGV0IHRpdGxlID0gZG9jdW1lbnQudGl0bGUucmVwbGFjZSgvXlwoLio/XCkvZywgIiIpOwogICAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IHRpdGxlOwogICAgICAgICAgICAvLyDor4TorrrlpI3liLbmjInpkq4KICAgICAgICAgICAgJCgnLmNvbW1lbnQtYm94JykucHJlcGVuZCgnPGJ1dHRvbiBjbGFzcz0iY29tbWVudC1oaWRkZW4tdGV4dCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q09QWSBCVVRUT048L2J1dHRvbj4nKTsKICAgICAgICAgICAgJCgnLm5ldy1vcHQtYm94Lm5ldy1vcHQtYm94LWJnJykucHJlcGVuZCgnPGEgY2xhc3M9ImJ0biBidG4tcmVwb3J0IGJ0bi1jb3B5IiBvbmNsaWNrPSJqYXZhc2NyaXB0OiQoXCcuY29tbWVudC1oaWRkZW4tdGV4dFwnKS5hdHRyKFwnZGF0YS1jbGlwYm9hcmQtdGV4dFwnLCQodGhpcykucGFyZW50KCkucGFyZW50KCkuZmluZChcJy5uZXctY29tbWVudFwnKS50ZXh0KCkpIj7lpI3liLbor4Torro8L2E+PHNwYW4gY2xhc3M9ImJ0bi1iYXIiPjwvc3Bhbj4nKTsKICAgICAgICAgICAgJCgnLmJ0bi1jb3B5JykuY2xpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZEpTKCcuY29tbWVudC1oaWRkZW4tdGV4dCcpOwogICAgICAgICAgICAgICAgY2xpcGJvYXJkLm9uKCdzdWNjZXNzJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnQWN0aW9uOicsIGUuYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1RleHQ6JywgZS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1RyaWdnZXI6JywgZS50cmlnZ2VyKTsKICAgICAgICAgICAgICAgICAgICBlLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgJCgnLmJ0bi1jb3B5JykuaHRtbCgn5oiQ5YqfJyk7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmJ0bi1jb3B5JykuaHRtbCgn5aSN5Yi26K+E6K66Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNsaXBib2FyZC5vbignZXJyb3InLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQWN0aW9uOicsIGUuYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUcmlnZ2VyOicsIGUudHJpZ2dlcik7CiAgICAgICAgICAgICAgICAgICAgJCgnLmJ0bi1jb3B5JykuaHRtbCgn5aSx6LSl77yM6K+35omL5Yqo5aSN5Yi2Jyk7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmJ0bi1jb3B5JykuaHRtbCgn5aSN5Yi26K+E6K66Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICQoIi5jb21tZW50LWhpZGRlbi10ZXh0IikuY2xpY2soKTsKICAgICAgICAgICAgICAgIGNsaXBib2FyZC5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09PSA5KSB7CiAgICAgICAgICAgIC8vIOWIoOmZpENTRE4gTE9HT+aCrOa1ruWQjueahOS6jOe7tOeggQogICAgICAgICAgICAkKCIudG9vbGJhci1zdWJNZW51ID4gaW1nIikucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgfSwgMTAwKTsKICAgIHByb2dyZXNzb3IuaW5jUHJvZ3Jlc3MoMTApOwp9CgpmdW5jdGlvbiBzaG93VGlwcygpIHsKCXZhciBjb25maWcgPSB7CgkJY29udGVudDogIuasoui/juS9v+eUqCBDU0ROR3JlZW5lcu+8jOe7v+WMluiuvuWumuaMiemSruWcqOi/memHjO+8gTxicj48YSBvbmNsaWNrPSdqYXZhc2NyaXB0OiQoXCIudHJpcHNcIikucmVtb3ZlKCk7Jz7lpb3nmoTvvIzku6XlkI7kuI3lho3mj5DnpLrmiJE8L2E+IiwKCQl0eXBlOiAiaHRtbCIsCgkJYWxpZ25UbzogWyJib3R0b20iLCAicmlnaHQiXSwKCQl0cmlnZ2VyOiAic2hvdyIsCgkJaXNjbG9zZTogZmFsc2UsCgkJY29sb3I6IFsiI0IyRTI4MSIsICIjQjJFMjgxIl0KCX07CgkkKCIjZ3JlZW5lclNldHRpbmdzIikuc2hvd1RpcHMoY29uZmlnKTsKfQoKZnVuY3Rpb24gZ2V0SGVpZ2h0KGVsZW1lbnQpIHsKICAgIGxldCBvdXRlckhlaWdodCA9IGVsZW1lbnQub3V0ZXJIZWlnaHQoKTsKICAgIGlmIChvdXRlckhlaWdodCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIG91dGVySGVpZ2h0Owp9CgpmdW5jdGlvbiBpc0ZpcmVmb3goKSB7CiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IikgPiAwOwp9Cg==","requires":[{"meta":{"name":"jquery.cookie.js","url":"https://cdn.jsdelivr.net/npm/jquery.cookie/jquery.cookie.js","ts":1637743688162,"mimetype":"text/javascript"},"source":"LyohCiAqIGpRdWVyeSBDb29raWUgUGx1Z2luIHYxLjQuMQogKiBodHRwczovL2dpdGh1Yi5jb20vY2FyaGFydGwvanF1ZXJ5LWNvb2tpZQogKgogKiBDb3B5cmlnaHQgMjAxMyBLbGF1cyBIYXJ0bAogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICovCihmdW5jdGlvbiAoZmFjdG9yeSkgewoJaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewoJCS8vIEFNRAoJCWRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKCX0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CgkJLy8gQ29tbW9uSlMKCQlmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKTsKCX0gZWxzZSB7CgkJLy8gQnJvd3NlciBnbG9iYWxzCgkJZmFjdG9yeShqUXVlcnkpOwoJfQp9KGZ1bmN0aW9uICgkKSB7CgoJdmFyIHBsdXNlcyA9IC9cKy9nOwoKCWZ1bmN0aW9uIGVuY29kZShzKSB7CgkJcmV0dXJuIGNvbmZpZy5yYXcgPyBzIDogZW5jb2RlVVJJQ29tcG9uZW50KHMpOwoJfQoKCWZ1bmN0aW9uIGRlY29kZShzKSB7CgkJcmV0dXJuIGNvbmZpZy5yYXcgPyBzIDogZGVjb2RlVVJJQ29tcG9uZW50KHMpOwoJfQoKCWZ1bmN0aW9uIHN0cmluZ2lmeUNvb2tpZVZhbHVlKHZhbHVlKSB7CgkJcmV0dXJuIGVuY29kZShjb25maWcuanNvbiA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IFN0cmluZyh2YWx1ZSkpOwoJfQoKCWZ1bmN0aW9uIHBhcnNlQ29va2llVmFsdWUocykgewoJCWlmIChzLmluZGV4T2YoJyInKSA9PT0gMCkgewoJCQkvLyBUaGlzIGlzIGEgcXVvdGVkIGNvb2tpZSBhcyBhY2NvcmRpbmcgdG8gUkZDMjA2OCwgdW5lc2NhcGUuLi4KCQkJcyA9IHMuc2xpY2UoMSwgLTEpLnJlcGxhY2UoL1xcIi9nLCAnIicpLnJlcGxhY2UoL1xcXFwvZywgJ1xcJyk7CgkJfQoKCQl0cnkgewoJCQkvLyBSZXBsYWNlIHNlcnZlci1zaWRlIHdyaXR0ZW4gcGx1c2VzIHdpdGggc3BhY2VzLgoJCQkvLyBJZiB3ZSBjYW4ndCBkZWNvZGUgdGhlIGNvb2tpZSwgaWdub3JlIGl0LCBpdCdzIHVudXNhYmxlLgoJCQkvLyBJZiB3ZSBjYW4ndCBwYXJzZSB0aGUgY29va2llLCBpZ25vcmUgaXQsIGl0J3MgdW51c2FibGUuCgkJCXMgPSBkZWNvZGVVUklDb21wb25lbnQocy5yZXBsYWNlKHBsdXNlcywgJyAnKSk7CgkJCXJldHVybiBjb25maWcuanNvbiA/IEpTT04ucGFyc2UocykgOiBzOwoJCX0gY2F0Y2goZSkge30KCX0KCglmdW5jdGlvbiByZWFkKHMsIGNvbnZlcnRlcikgewoJCXZhciB2YWx1ZSA9IGNvbmZpZy5yYXcgPyBzIDogcGFyc2VDb29raWVWYWx1ZShzKTsKCQlyZXR1cm4gJC5pc0Z1bmN0aW9uKGNvbnZlcnRlcikgPyBjb252ZXJ0ZXIodmFsdWUpIDogdmFsdWU7Cgl9CgoJdmFyIGNvbmZpZyA9ICQuY29va2llID0gZnVuY3Rpb24gKGtleSwgdmFsdWUsIG9wdGlvbnMpIHsKCgkJLy8gV3JpdGUKCgkJaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgISQuaXNGdW5jdGlvbih2YWx1ZSkpIHsKCQkJb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBjb25maWcuZGVmYXVsdHMsIG9wdGlvbnMpOwoKCQkJaWYgKHR5cGVvZiBvcHRpb25zLmV4cGlyZXMgPT09ICdudW1iZXInKSB7CgkJCQl2YXIgZGF5cyA9IG9wdGlvbnMuZXhwaXJlcywgdCA9IG9wdGlvbnMuZXhwaXJlcyA9IG5ldyBEYXRlKCk7CgkJCQl0LnNldFRpbWUoK3QgKyBkYXlzICogODY0ZSs1KTsKCQkJfQoKCQkJcmV0dXJuIChkb2N1bWVudC5jb29raWUgPSBbCgkJCQllbmNvZGUoa2V5KSwgJz0nLCBzdHJpbmdpZnlDb29raWVWYWx1ZSh2YWx1ZSksCgkJCQlvcHRpb25zLmV4cGlyZXMgPyAnOyBleHBpcmVzPScgKyBvcHRpb25zLmV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnLCAvLyB1c2UgZXhwaXJlcyBhdHRyaWJ1dGUsIG1heC1hZ2UgaXMgbm90IHN1cHBvcnRlZCBieSBJRQoJCQkJb3B0aW9ucy5wYXRoICAgID8gJzsgcGF0aD0nICsgb3B0aW9ucy5wYXRoIDogJycsCgkJCQlvcHRpb25zLmRvbWFpbiAgPyAnOyBkb21haW49JyArIG9wdGlvbnMuZG9tYWluIDogJycsCgkJCQlvcHRpb25zLnNlY3VyZSAgPyAnOyBzZWN1cmUnIDogJycKCQkJXS5qb2luKCcnKSk7CgkJfQoKCQkvLyBSZWFkCgoJCXZhciByZXN1bHQgPSBrZXkgPyB1bmRlZmluZWQgOiB7fTsKCgkJLy8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheQoJCS8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLiBBbHNvIHByZXZlbnRzIG9kZCByZXN1bHQgd2hlbgoJCS8vIGNhbGxpbmcgJC5jb29raWUoKS4KCQl2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdOwoKCQlmb3IgKHZhciBpID0gMCwgbCA9IGNvb2tpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCXZhciBwYXJ0cyA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTsKCQkJdmFyIG5hbWUgPSBkZWNvZGUocGFydHMuc2hpZnQoKSk7CgkJCXZhciBjb29raWUgPSBwYXJ0cy5qb2luKCc9Jyk7CgoJCQlpZiAoa2V5ICYmIGtleSA9PT0gbmFtZSkgewoJCQkJLy8gSWYgc2Vjb25kIGFyZ3VtZW50ICh2YWx1ZSkgaXMgYSBmdW5jdGlvbiBpdCdzIGEgY29udmVydGVyLi4uCgkJCQlyZXN1bHQgPSByZWFkKGNvb2tpZSwgdmFsdWUpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCS8vIFByZXZlbnQgc3RvcmluZyBhIGNvb2tpZSB0aGF0IHdlIGNvdWxkbid0IGRlY29kZS4KCQkJaWYgKCFrZXkgJiYgKGNvb2tpZSA9IHJlYWQoY29va2llKSkgIT09IHVuZGVmaW5lZCkgewoJCQkJcmVzdWx0W25hbWVdID0gY29va2llOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmVzdWx0OwoJfTsKCgljb25maWcuZGVmYXVsdHMgPSB7fTsKCgkkLnJlbW92ZUNvb2tpZSA9IGZ1bmN0aW9uIChrZXksIG9wdGlvbnMpIHsKCQlpZiAoJC5jb29raWUoa2V5KSA9PT0gdW5kZWZpbmVkKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIE11c3Qgbm90IGFsdGVyIG9wdGlvbnMsIHRodXMgZXh0ZW5kaW5nIGEgZnJlc2ggb2JqZWN0Li4uCgkJJC5jb29raWUoa2V5LCAnJywgJC5leHRlbmQoe30sIG9wdGlvbnMsIHsgZXhwaXJlczogLTEgfSkpOwoJCXJldHVybiAhJC5jb29raWUoa2V5KTsKCX07Cgp9KSk7Cg=="},{"meta":{"name":"nprogress.js","url":"https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.js","ts":1637743688173,"mimetype":"text/javascript"},"source":"LyogTlByb2dyZXNzLCAoYykgMjAxMywgMjAxNCBSaWNvIFN0YS4gQ3J1eiAtIGh0dHA6Ly9yaWNvc3RhY3J1ei5jb20vbnByb2dyZXNzCiAqIEBsaWNlbnNlIE1JVCAqLwoKOyhmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7CgogIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgIGRlZmluZShmYWN0b3J5KTsKICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykgewogICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgfSBlbHNlIHsKICAgIHJvb3QuTlByb2dyZXNzID0gZmFjdG9yeSgpOwogIH0KCn0pKHRoaXMsIGZ1bmN0aW9uKCkgewogIHZhciBOUHJvZ3Jlc3MgPSB7fTsKCiAgTlByb2dyZXNzLnZlcnNpb24gPSAnMC4yLjAnOwoKICB2YXIgU2V0dGluZ3MgPSBOUHJvZ3Jlc3Muc2V0dGluZ3MgPSB7CiAgICBtaW5pbXVtOiAwLjA4LAogICAgZWFzaW5nOiAnZWFzZScsCiAgICBwb3NpdGlvblVzaW5nOiAnJywKICAgIHNwZWVkOiAyMDAsCiAgICB0cmlja2xlOiB0cnVlLAogICAgdHJpY2tsZVJhdGU6IDAuMDIsCiAgICB0cmlja2xlU3BlZWQ6IDgwMCwKICAgIHNob3dTcGlubmVyOiB0cnVlLAogICAgYmFyU2VsZWN0b3I6ICdbcm9sZT0iYmFyIl0nLAogICAgc3Bpbm5lclNlbGVjdG9yOiAnW3JvbGU9InNwaW5uZXIiXScsCiAgICBwYXJlbnQ6ICdib2R5JywKICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz0iYmFyIiByb2xlPSJiYXIiPjxkaXYgY2xhc3M9InBlZyI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic3Bpbm5lciIgcm9sZT0ic3Bpbm5lciI+PGRpdiBjbGFzcz0ic3Bpbm5lci1pY29uIj48L2Rpdj48L2Rpdj4nCiAgfTsKCiAgLyoqCiAgICogVXBkYXRlcyBjb25maWd1cmF0aW9uLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5jb25maWd1cmUoewogICAqICAgICAgIG1pbmltdW06IDAuMQogICAqICAgICB9KTsKICAgKi8KICBOUHJvZ3Jlc3MuY29uZmlndXJlID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgdmFyIGtleSwgdmFsdWU7CiAgICBmb3IgKGtleSBpbiBvcHRpb25zKSB7CiAgICAgIHZhbHVlID0gb3B0aW9uc1trZXldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpIFNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAvKioKICAgKiBMYXN0IG51bWJlci4KICAgKi8KCiAgTlByb2dyZXNzLnN0YXR1cyA9IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIHByb2dyZXNzIGJhciBzdGF0dXMsIHdoZXJlIGBuYCBpcyBhIG51bWJlciBmcm9tIGAwLjBgIHRvIGAxLjBgLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5zZXQoMC40KTsKICAgKiAgICAgTlByb2dyZXNzLnNldCgxLjApOwogICAqLwoKICBOUHJvZ3Jlc3Muc2V0ID0gZnVuY3Rpb24obikgewogICAgdmFyIHN0YXJ0ZWQgPSBOUHJvZ3Jlc3MuaXNTdGFydGVkKCk7CgogICAgbiA9IGNsYW1wKG4sIFNldHRpbmdzLm1pbmltdW0sIDEpOwogICAgTlByb2dyZXNzLnN0YXR1cyA9IChuID09PSAxID8gbnVsbCA6IG4pOwoKICAgIHZhciBwcm9ncmVzcyA9IE5Qcm9ncmVzcy5yZW5kZXIoIXN0YXJ0ZWQpLAogICAgICAgIGJhciAgICAgID0gcHJvZ3Jlc3MucXVlcnlTZWxlY3RvcihTZXR0aW5ncy5iYXJTZWxlY3RvciksCiAgICAgICAgc3BlZWQgICAgPSBTZXR0aW5ncy5zcGVlZCwKICAgICAgICBlYXNlICAgICA9IFNldHRpbmdzLmVhc2luZzsKCiAgICBwcm9ncmVzcy5vZmZzZXRXaWR0aDsgLyogUmVwYWludCAqLwoKICAgIHF1ZXVlKGZ1bmN0aW9uKG5leHQpIHsKICAgICAgLy8gU2V0IHBvc2l0aW9uVXNpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBzZXQKICAgICAgaWYgKFNldHRpbmdzLnBvc2l0aW9uVXNpbmcgPT09ICcnKSBTZXR0aW5ncy5wb3NpdGlvblVzaW5nID0gTlByb2dyZXNzLmdldFBvc2l0aW9uaW5nQ1NTKCk7CgogICAgICAvLyBBZGQgdHJhbnNpdGlvbgogICAgICBjc3MoYmFyLCBiYXJQb3NpdGlvbkNTUyhuLCBzcGVlZCwgZWFzZSkpOwoKICAgICAgaWYgKG4gPT09IDEpIHsKICAgICAgICAvLyBGYWRlIG91dAogICAgICAgIGNzcyhwcm9ncmVzcywgeyAKICAgICAgICAgIHRyYW5zaXRpb246ICdub25lJywgCiAgICAgICAgICBvcGFjaXR5OiAxIAogICAgICAgIH0pOwogICAgICAgIHByb2dyZXNzLm9mZnNldFdpZHRoOyAvKiBSZXBhaW50ICovCgogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICBjc3MocHJvZ3Jlc3MsIHsgCiAgICAgICAgICAgIHRyYW5zaXRpb246ICdhbGwgJyArIHNwZWVkICsgJ21zIGxpbmVhcicsIAogICAgICAgICAgICBvcGFjaXR5OiAwIAogICAgICAgICAgfSk7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBOUHJvZ3Jlc3MucmVtb3ZlKCk7CiAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgIH0sIHNwZWVkKTsKICAgICAgICB9LCBzcGVlZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0VGltZW91dChuZXh0LCBzcGVlZCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiB0aGlzOwogIH07CgogIE5Qcm9ncmVzcy5pc1N0YXJ0ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0eXBlb2YgTlByb2dyZXNzLnN0YXR1cyA9PT0gJ251bWJlcic7CiAgfTsKCiAgLyoqCiAgICogU2hvd3MgdGhlIHByb2dyZXNzIGJhci4KICAgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHNldHRpbmcgdGhlIHN0YXR1cyB0byAwJSwgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBnbyBiYWNrd2FyZHMuCiAgICoKICAgKiAgICAgTlByb2dyZXNzLnN0YXJ0KCk7CiAgICoKICAgKi8KICBOUHJvZ3Jlc3Muc3RhcnQgPSBmdW5jdGlvbigpIHsKICAgIGlmICghTlByb2dyZXNzLnN0YXR1cykgTlByb2dyZXNzLnNldCgwKTsKCiAgICB2YXIgd29yayA9IGZ1bmN0aW9uKCkgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghTlByb2dyZXNzLnN0YXR1cykgcmV0dXJuOwogICAgICAgIE5Qcm9ncmVzcy50cmlja2xlKCk7CiAgICAgICAgd29yaygpOwogICAgICB9LCBTZXR0aW5ncy50cmlja2xlU3BlZWQpOwogICAgfTsKCiAgICBpZiAoU2V0dGluZ3MudHJpY2tsZSkgd29yaygpOwoKICAgIHJldHVybiB0aGlzOwogIH07CgogIC8qKgogICAqIEhpZGVzIHRoZSBwcm9ncmVzcyBiYXIuCiAgICogVGhpcyBpcyB0aGUgKnNvcnQgb2YqIHRoZSBzYW1lIGFzIHNldHRpbmcgdGhlIHN0YXR1cyB0byAxMDAlLCB3aXRoIHRoZQogICAqIGRpZmZlcmVuY2UgYmVpbmcgYGRvbmUoKWAgbWFrZXMgc29tZSBwbGFjZWJvIGVmZmVjdCBvZiBzb21lIHJlYWxpc3RpYyBtb3Rpb24uCiAgICoKICAgKiAgICAgTlByb2dyZXNzLmRvbmUoKTsKICAgKgogICAqIElmIGB0cnVlYCBpcyBwYXNzZWQsIGl0IHdpbGwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyIGV2ZW4gaWYgaXRzIGhpZGRlbi4KICAgKgogICAqICAgICBOUHJvZ3Jlc3MuZG9uZSh0cnVlKTsKICAgKi8KCiAgTlByb2dyZXNzLmRvbmUgPSBmdW5jdGlvbihmb3JjZSkgewogICAgaWYgKCFmb3JjZSAmJiAhTlByb2dyZXNzLnN0YXR1cykgcmV0dXJuIHRoaXM7CgogICAgcmV0dXJuIE5Qcm9ncmVzcy5pbmMoMC4zICsgMC41ICogTWF0aC5yYW5kb20oKSkuc2V0KDEpOwogIH07CgogIC8qKgogICAqIEluY3JlbWVudHMgYnkgYSByYW5kb20gYW1vdW50LgogICAqLwoKICBOUHJvZ3Jlc3MuaW5jID0gZnVuY3Rpb24oYW1vdW50KSB7CiAgICB2YXIgbiA9IE5Qcm9ncmVzcy5zdGF0dXM7CgogICAgaWYgKCFuKSB7CiAgICAgIHJldHVybiBOUHJvZ3Jlc3Muc3RhcnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykgewogICAgICAgIGFtb3VudCA9ICgxIC0gbikgKiBjbGFtcChNYXRoLnJhbmRvbSgpICogbiwgMC4xLCAwLjk1KTsKICAgICAgfQoKICAgICAgbiA9IGNsYW1wKG4gKyBhbW91bnQsIDAsIDAuOTk0KTsKICAgICAgcmV0dXJuIE5Qcm9ncmVzcy5zZXQobik7CiAgICB9CiAgfTsKCiAgTlByb2dyZXNzLnRyaWNrbGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBOUHJvZ3Jlc3MuaW5jKE1hdGgucmFuZG9tKCkgKiBTZXR0aW5ncy50cmlja2xlUmF0ZSk7CiAgfTsKCiAgLyoqCiAgICogV2FpdHMgZm9yIGFsbCBzdXBwbGllZCBqUXVlcnkgcHJvbWlzZXMgYW5kCiAgICogaW5jcmVhc2VzIHRoZSBwcm9ncmVzcyBhcyB0aGUgcHJvbWlzZXMgcmVzb2x2ZS4KICAgKgogICAqIEBwYXJhbSAkcHJvbWlzZSBqUVVlcnkgUHJvbWlzZQogICAqLwogIChmdW5jdGlvbigpIHsKICAgIHZhciBpbml0aWFsID0gMCwgY3VycmVudCA9IDA7CgogICAgTlByb2dyZXNzLnByb21pc2UgPSBmdW5jdGlvbigkcHJvbWlzZSkgewogICAgICBpZiAoISRwcm9taXNlIHx8ICRwcm9taXNlLnN0YXRlKCkgPT09ICJyZXNvbHZlZCIpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQoKICAgICAgaWYgKGN1cnJlbnQgPT09IDApIHsKICAgICAgICBOUHJvZ3Jlc3Muc3RhcnQoKTsKICAgICAgfQoKICAgICAgaW5pdGlhbCsrOwogICAgICBjdXJyZW50Kys7CgogICAgICAkcHJvbWlzZS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgY3VycmVudC0tOwogICAgICAgIGlmIChjdXJyZW50ID09PSAwKSB7CiAgICAgICAgICAgIGluaXRpYWwgPSAwOwogICAgICAgICAgICBOUHJvZ3Jlc3MuZG9uZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIE5Qcm9ncmVzcy5zZXQoKGluaXRpYWwgLSBjdXJyZW50KSAvIGluaXRpYWwpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogIH0pKCk7CgogIC8qKgogICAqIChJbnRlcm5hbCkgcmVuZGVycyB0aGUgcHJvZ3Jlc3MgYmFyIG1hcmt1cCBiYXNlZCBvbiB0aGUgYHRlbXBsYXRlYAogICAqIHNldHRpbmcuCiAgICovCgogIE5Qcm9ncmVzcy5yZW5kZXIgPSBmdW5jdGlvbihmcm9tU3RhcnQpIHsKICAgIGlmIChOUHJvZ3Jlc3MuaXNSZW5kZXJlZCgpKSByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25wcm9ncmVzcycpOwoKICAgIGFkZENsYXNzKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ25wcm9ncmVzcy1idXN5Jyk7CiAgICAKICAgIHZhciBwcm9ncmVzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcHJvZ3Jlc3MuaWQgPSAnbnByb2dyZXNzJzsKICAgIHByb2dyZXNzLmlubmVySFRNTCA9IFNldHRpbmdzLnRlbXBsYXRlOwoKICAgIHZhciBiYXIgICAgICA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3MuYmFyU2VsZWN0b3IpLAogICAgICAgIHBlcmMgICAgID0gZnJvbVN0YXJ0ID8gJy0xMDAnIDogdG9CYXJQZXJjKE5Qcm9ncmVzcy5zdGF0dXMgfHwgMCksCiAgICAgICAgcGFyZW50ICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFNldHRpbmdzLnBhcmVudCksCiAgICAgICAgc3Bpbm5lcjsKICAgIAogICAgY3NzKGJhciwgewogICAgICB0cmFuc2l0aW9uOiAnYWxsIDAgbGluZWFyJywKICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyArIHBlcmMgKyAnJSwwLDApJwogICAgfSk7CgogICAgaWYgKCFTZXR0aW5ncy5zaG93U3Bpbm5lcikgewogICAgICBzcGlubmVyID0gcHJvZ3Jlc3MucXVlcnlTZWxlY3RvcihTZXR0aW5ncy5zcGlubmVyU2VsZWN0b3IpOwogICAgICBzcGlubmVyICYmIHJlbW92ZUVsZW1lbnQoc3Bpbm5lcik7CiAgICB9CgogICAgaWYgKHBhcmVudCAhPSBkb2N1bWVudC5ib2R5KSB7CiAgICAgIGFkZENsYXNzKHBhcmVudCwgJ25wcm9ncmVzcy1jdXN0b20tcGFyZW50Jyk7CiAgICB9CgogICAgcGFyZW50LmFwcGVuZENoaWxkKHByb2dyZXNzKTsKICAgIHJldHVybiBwcm9ncmVzczsKICB9OwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50LiBPcHBvc2l0ZSBvZiByZW5kZXIoKS4KICAgKi8KCiAgTlByb2dyZXNzLnJlbW92ZSA9IGZ1bmN0aW9uKCkgewogICAgcmVtb3ZlQ2xhc3MoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnbnByb2dyZXNzLWJ1c3knKTsKICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3MucGFyZW50KSwgJ25wcm9ncmVzcy1jdXN0b20tcGFyZW50Jyk7CiAgICB2YXIgcHJvZ3Jlc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnByb2dyZXNzJyk7CiAgICBwcm9ncmVzcyAmJiByZW1vdmVFbGVtZW50KHByb2dyZXNzKTsKICB9OwoKICAvKioKICAgKiBDaGVja3MgaWYgdGhlIHByb2dyZXNzIGJhciBpcyByZW5kZXJlZC4KICAgKi8KCiAgTlByb2dyZXNzLmlzUmVuZGVyZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCducHJvZ3Jlc3MnKTsKICB9OwoKICAvKioKICAgKiBEZXRlcm1pbmUgd2hpY2ggcG9zaXRpb25pbmcgQ1NTIHJ1bGUgdG8gdXNlLgogICAqLwoKICBOUHJvZ3Jlc3MuZ2V0UG9zaXRpb25pbmdDU1MgPSBmdW5jdGlvbigpIHsKICAgIC8vIFNuaWZmIG9uIGRvY3VtZW50LmJvZHkuc3R5bGUKICAgIHZhciBib2R5U3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlOwoKICAgIC8vIFNuaWZmIHByZWZpeGVzCiAgICB2YXIgdmVuZG9yUHJlZml4ID0gKCdXZWJraXRUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnV2Via2l0JyA6CiAgICAgICAgICAgICAgICAgICAgICAgKCdNb3pUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnTW96JyA6CiAgICAgICAgICAgICAgICAgICAgICAgKCdtc1RyYW5zZm9ybScgaW4gYm9keVN0eWxlKSA/ICdtcycgOgogICAgICAgICAgICAgICAgICAgICAgICgnT1RyYW5zZm9ybScgaW4gYm9keVN0eWxlKSA/ICdPJyA6ICcnOwoKICAgIGlmICh2ZW5kb3JQcmVmaXggKyAnUGVyc3BlY3RpdmUnIGluIGJvZHlTdHlsZSkgewogICAgICAvLyBNb2Rlcm4gYnJvd3NlcnMgd2l0aCAzRCBzdXBwb3J0LCBlLmcuIFdlYmtpdCwgSUUxMAogICAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkJzsKICAgIH0gZWxzZSBpZiAodmVuZG9yUHJlZml4ICsgJ1RyYW5zZm9ybScgaW4gYm9keVN0eWxlKSB7CiAgICAgIC8vIEJyb3dzZXJzIHdpdGhvdXQgM0Qgc3VwcG9ydCwgZS5nLiBJRTkKICAgICAgcmV0dXJuICd0cmFuc2xhdGUnOwogICAgfSBlbHNlIHsKICAgICAgLy8gQnJvd3NlcnMgd2l0aG91dCB0cmFuc2xhdGUoKSBzdXBwb3J0LCBlLmcuIElFNy04CiAgICAgIHJldHVybiAnbWFyZ2luJzsKICAgIH0KICB9OwoKICAvKioKICAgKiBIZWxwZXJzCiAgICovCgogIGZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7CiAgICBpZiAobiA8IG1pbikgcmV0dXJuIG1pbjsKICAgIGlmIChuID4gbWF4KSByZXR1cm4gbWF4OwogICAgcmV0dXJuIG47CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIGNvbnZlcnRzIGEgcGVyY2VudGFnZSAoYDAuLjFgKSB0byBhIGJhciB0cmFuc2xhdGVYCiAgICogcGVyY2VudGFnZSAoYC0xMDAlLi4wJWApLgogICAqLwoKICBmdW5jdGlvbiB0b0JhclBlcmMobikgewogICAgcmV0dXJuICgtMSArIG4pICogMTAwOwogIH0KCgogIC8qKgogICAqIChJbnRlcm5hbCkgcmV0dXJucyB0aGUgY29ycmVjdCBDU1MgZm9yIGNoYW5naW5nIHRoZSBiYXIncwogICAqIHBvc2l0aW9uIGdpdmVuIGFuIG4gcGVyY2VudGFnZSwgYW5kIHNwZWVkIGFuZCBlYXNlIGZyb20gU2V0dGluZ3MKICAgKi8KCiAgZnVuY3Rpb24gYmFyUG9zaXRpb25DU1Mobiwgc3BlZWQsIGVhc2UpIHsKICAgIHZhciBiYXJDU1M7CgogICAgaWYgKFNldHRpbmdzLnBvc2l0aW9uVXNpbmcgPT09ICd0cmFuc2xhdGUzZCcpIHsKICAgICAgYmFyQ1NTID0geyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnK3RvQmFyUGVyYyhuKSsnJSwwLDApJyB9OwogICAgfSBlbHNlIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAndHJhbnNsYXRlJykgewogICAgICBiYXJDU1MgPSB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnK3RvQmFyUGVyYyhuKSsnJSwwKScgfTsKICAgIH0gZWxzZSB7CiAgICAgIGJhckNTUyA9IHsgJ21hcmdpbi1sZWZ0JzogdG9CYXJQZXJjKG4pKyclJyB9OwogICAgfQoKICAgIGJhckNTUy50cmFuc2l0aW9uID0gJ2FsbCAnK3NwZWVkKydtcyAnK2Vhc2U7CgogICAgcmV0dXJuIGJhckNTUzsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgUXVldWVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICovCgogIHZhciBxdWV1ZSA9IChmdW5jdGlvbigpIHsKICAgIHZhciBwZW5kaW5nID0gW107CiAgICAKICAgIGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgIHZhciBmbiA9IHBlbmRpbmcuc2hpZnQoKTsKICAgICAgaWYgKGZuKSB7CiAgICAgICAgZm4obmV4dCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oZm4pIHsKICAgICAgcGVuZGluZy5wdXNoKGZuKTsKICAgICAgaWYgKHBlbmRpbmcubGVuZ3RoID09IDEpIG5leHQoKTsKICAgIH07CiAgfSkoKTsKCiAgLyoqCiAgICogKEludGVybmFsKSBBcHBsaWVzIGNzcyBwcm9wZXJ0aWVzIHRvIGFuIGVsZW1lbnQsIHNpbWlsYXIgdG8gdGhlIGpRdWVyeSAKICAgKiBjc3MgbWV0aG9kLgogICAqCiAgICogV2hpbGUgdGhpcyBoZWxwZXIgZG9lcyBhc3Npc3Qgd2l0aCB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkgbmFtZXMsIGl0IAogICAqIGRvZXMgbm90IHBlcmZvcm0gYW55IG1hbmlwdWxhdGlvbiBvZiB2YWx1ZXMgcHJpb3IgdG8gc2V0dGluZyBzdHlsZXMuCiAgICovCgogIHZhciBjc3MgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgY3NzUHJlZml4ZXMgPSBbICdXZWJraXQnLCAnTycsICdNb3onLCAnbXMnIF0sCiAgICAgICAgY3NzUHJvcHMgICAgPSB7fTsKCiAgICBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyaW5nKSB7CiAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXi1tcy0vLCAnbXMtJykucmVwbGFjZSgvLShbXGRhLXpdKS9naSwgZnVuY3Rpb24obWF0Y2gsIGxldHRlcikgewogICAgICAgIHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0VmVuZG9yUHJvcChuYW1lKSB7CiAgICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmJvZHkuc3R5bGU7CiAgICAgIGlmIChuYW1lIGluIHN0eWxlKSByZXR1cm4gbmFtZTsKCiAgICAgIHZhciBpID0gY3NzUHJlZml4ZXMubGVuZ3RoLAogICAgICAgICAgY2FwTmFtZSA9IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLAogICAgICAgICAgdmVuZG9yTmFtZTsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIHZlbmRvck5hbWUgPSBjc3NQcmVmaXhlc1tpXSArIGNhcE5hbWU7CiAgICAgICAgaWYgKHZlbmRvck5hbWUgaW4gc3R5bGUpIHJldHVybiB2ZW5kb3JOYW1lOwogICAgICB9CgogICAgICByZXR1cm4gbmFtZTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTdHlsZVByb3AobmFtZSkgewogICAgICBuYW1lID0gY2FtZWxDYXNlKG5hbWUpOwogICAgICByZXR1cm4gY3NzUHJvcHNbbmFtZV0gfHwgKGNzc1Byb3BzW25hbWVdID0gZ2V0VmVuZG9yUHJvcChuYW1lKSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlDc3MoZWxlbWVudCwgcHJvcCwgdmFsdWUpIHsKICAgICAgcHJvcCA9IGdldFN0eWxlUHJvcChwcm9wKTsKICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHZhbHVlOwogICAgfQoKICAgIHJldHVybiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0aWVzKSB7CiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAogICAgICAgICAgcHJvcCwgCiAgICAgICAgICB2YWx1ZTsKCiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgZm9yIChwcm9wIGluIHByb3BlcnRpZXMpIHsKICAgICAgICAgIHZhbHVlID0gcHJvcGVydGllc1twcm9wXTsKICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIGFwcGx5Q3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBwbHlDc3MoZWxlbWVudCwgYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgIH0KICAgIH0KICB9KSgpOwoKICAvKioKICAgKiAoSW50ZXJuYWwpIERldGVybWluZXMgaWYgYW4gZWxlbWVudCBvciBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBuYW1lcyBjb250YWlucyBhIGNsYXNzIG5hbWUuCiAgICovCgogIGZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIG5hbWUpIHsKICAgIHZhciBsaXN0ID0gdHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycgPyBlbGVtZW50IDogY2xhc3NMaXN0KGVsZW1lbnQpOwogICAgcmV0dXJuIGxpc3QuaW5kZXhPZignICcgKyBuYW1lICsgJyAnKSA+PSAwOwogIH0KCiAgLyoqCiAgICogKEludGVybmFsKSBBZGRzIGEgY2xhc3MgdG8gYW4gZWxlbWVudC4KICAgKi8KCiAgZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgbmFtZSkgewogICAgdmFyIG9sZExpc3QgPSBjbGFzc0xpc3QoZWxlbWVudCksCiAgICAgICAgbmV3TGlzdCA9IG9sZExpc3QgKyBuYW1lOwoKICAgIGlmIChoYXNDbGFzcyhvbGRMaXN0LCBuYW1lKSkgcmV0dXJuOyAKCiAgICAvLyBUcmltIHRoZSBvcGVuaW5nIHNwYWNlLgogICAgZWxlbWVudC5jbGFzc05hbWUgPSBuZXdMaXN0LnN1YnN0cmluZygxKTsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgUmVtb3ZlcyBhIGNsYXNzIGZyb20gYW4gZWxlbWVudC4KICAgKi8KCiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgbmFtZSkgewogICAgdmFyIG9sZExpc3QgPSBjbGFzc0xpc3QoZWxlbWVudCksCiAgICAgICAgbmV3TGlzdDsKCiAgICBpZiAoIWhhc0NsYXNzKGVsZW1lbnQsIG5hbWUpKSByZXR1cm47CgogICAgLy8gUmVwbGFjZSB0aGUgY2xhc3MgbmFtZS4KICAgIG5ld0xpc3QgPSBvbGRMaXN0LnJlcGxhY2UoJyAnICsgbmFtZSArICcgJywgJyAnKTsKCiAgICAvLyBUcmltIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHNwYWNlcy4KICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3TGlzdC5zdWJzdHJpbmcoMSwgbmV3TGlzdC5sZW5ndGggLSAxKTsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgR2V0cyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBjbGFzcyBuYW1lcyBvbiB0aGUgZWxlbWVudC4gCiAgICogVGhlIGxpc3QgaXMgd3JhcHBlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIG9uIGVhY2ggZW5kIHRvIGZhY2lsaXRhdGUgZmluZGluZyAKICAgKiBtYXRjaGVzIHdpdGhpbiB0aGUgbGlzdC4KICAgKi8KCiAgZnVuY3Rpb24gY2xhc3NMaXN0KGVsZW1lbnQpIHsKICAgIHJldHVybiAoJyAnICsgKGVsZW1lbnQuY2xhc3NOYW1lIHx8ICcnKSArICcgJykucmVwbGFjZSgvXHMrL2dpLCAnICcpOwogIH0KCiAgLyoqCiAgICogKEludGVybmFsKSBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NLgogICAqLwoKICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlICYmIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKICB9CgogIHJldHVybiBOUHJvZ3Jlc3M7Cn0pOwoK"},{"meta":{"name":"clipboard.min.js","url":"https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js","ts":1637743688139,"mimetype":"text/javascript"},"source":"LyohCiAqIGNsaXBib2FyZC5qcyB2Mi4wLjYKICogaHR0cHM6Ly9jbGlwYm9hcmRqcy5jb20vCiAqIAogKiBMaWNlbnNlZCBNSVQgwqkgWmVubyBSb2NoYQogKi8KIWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuQ2xpcGJvYXJkSlM9ZSgpOnQuQ2xpcGJvYXJkSlM9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIG89e30sci5tPW49W2Z1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCJTRUxFQ1QiPT09dC5ub2RlTmFtZSl0LmZvY3VzKCksZT10LnZhbHVlO2Vsc2UgaWYoIklOUFVUIj09PXQubm9kZU5hbWV8fCJURVhUQVJFQSI9PT10Lm5vZGVOYW1lKXt2YXIgbj10Lmhhc0F0dHJpYnV0ZSgicmVhZG9ubHkiKTtufHx0LnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKSx0LnNlbGVjdCgpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksbnx8dC5yZW1vdmVBdHRyaWJ1dGUoInJlYWRvbmx5IiksZT10LnZhbHVlfWVsc2V7dC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpJiZ0LmZvY3VzKCk7dmFyIG89d2luZG93LmdldFNlbGVjdGlvbigpLHI9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtyLnNlbGVjdE5vZGVDb250ZW50cyh0KSxvLnJlbW92ZUFsbFJhbmdlcygpLG8uYWRkUmFuZ2UociksZT1vLnRvU3RyaW5nKCl9cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt9bi5wcm90b3R5cGU9e29uOmZ1bmN0aW9uKHQsZSxuKXt2YXIgbz10aGlzLmV8fCh0aGlzLmU9e30pO3JldHVybihvW3RdfHwob1t0XT1bXSkpLnB1c2goe2ZuOmUsY3R4Om59KSx0aGlzfSxvbmNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgbz10aGlzO2Z1bmN0aW9uIHIoKXtvLm9mZih0LHIpLGUuYXBwbHkobixhcmd1bWVudHMpfXJldHVybiByLl89ZSx0aGlzLm9uKHQscixuKX0sZW1pdDpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbj0oKHRoaXMuZXx8KHRoaXMuZT17fSkpW3RdfHxbXSkuc2xpY2UoKSxvPTAscj1uLmxlbmd0aDtvPHI7bysrKW5bb10uZm4uYXBwbHkobltvXS5jdHgsZSk7cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXx8KHRoaXMuZT17fSksbz1uW3RdLHI9W107aWYobyYmZSlmb3IodmFyIGk9MCxhPW8ubGVuZ3RoO2k8YTtpKyspb1tpXS5mbiE9PWUmJm9baV0uZm4uXyE9PWUmJnIucHVzaChvW2ldKTtyZXR1cm4gci5sZW5ndGg/blt0XT1yOmRlbGV0ZSBuW3RdLHRoaXN9fSx0LmV4cG9ydHM9bix0LmV4cG9ydHMuVGlueUVtaXR0ZXI9bn0sZnVuY3Rpb24odCxlLG4pe3ZhciBkPW4oMyksaD1uKDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYoIXQmJiFlJiYhbil0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzIik7aWYoIWQuc3RyaW5nKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIlNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nIik7aWYoIWQuZm4obikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhpcmQgYXJndW1lbnQgbXVzdCBiZSBhIEZ1bmN0aW9uIik7aWYoZC5ub2RlKHQpKXJldHVybiBzPWUsZj1uLCh1PXQpLmFkZEV2ZW50TGlzdGVuZXIocyxmKSx7ZGVzdHJveTpmdW5jdGlvbigpe3UucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGYpfX07aWYoZC5ub2RlTGlzdCh0KSlyZXR1cm4gYT10LGM9ZSxsPW4sQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcihjLGwpfSkse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGMsbCl9KX19O2lmKGQuc3RyaW5nKHQpKXJldHVybiBvPXQscj1lLGk9bixoKGRvY3VtZW50LmJvZHksbyxyLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QiKTt2YXIgbyxyLGksYSxjLGwsdSxzLGZ9fSxmdW5jdGlvbih0LG4pe24ubm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiYxPT09dC5ub2RlVHlwZX0sbi5ub2RlTGlzdD1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7cmV0dXJuIHZvaWQgMCE9PXQmJigiW29iamVjdCBOb2RlTGlzdF0iPT09ZXx8IltvYmplY3QgSFRNTENvbGxlY3Rpb25dIj09PWUpJiYibGVuZ3RoImluIHQmJigwPT09dC5sZW5ndGh8fG4ubm9kZSh0WzBdKSl9LG4uc3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIFN0cmluZ30sbi5mbj1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBhPW4oNSk7ZnVuY3Rpb24gaSh0LGUsbixvLHIpe3ZhciBpPWZ1bmN0aW9uKGUsbix0LG8pe3JldHVybiBmdW5jdGlvbih0KXt0LmRlbGVnYXRlVGFyZ2V0PWEodC50YXJnZXQsbiksdC5kZWxlZ2F0ZVRhcmdldCYmby5jYWxsKGUsdCl9fS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihuLGkscikse2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixpLHIpfX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8scil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuYWRkRXZlbnRMaXN0ZW5lcj9pLmFwcGx5KG51bGwsYXJndW1lbnRzKToiZnVuY3Rpb24iPT10eXBlb2Ygbj9pLmJpbmQobnVsbCxkb2N1bWVudCkuYXBwbHkobnVsbCxhcmd1bWVudHMpOigic3RyaW5nIj09dHlwZW9mIHQmJih0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCkpLEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGZ1bmN0aW9uKHQpe3JldHVybiBpKHQsZSxuLG8scil9KSl9fSxmdW5jdGlvbih0LGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgRWxlbWVudCYmIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpe3ZhciBuPUVsZW1lbnQucHJvdG90eXBlO24ubWF0Y2hlcz1uLm1hdGNoZXNTZWxlY3Rvcnx8bi5tb3pNYXRjaGVzU2VsZWN0b3J8fG4ubXNNYXRjaGVzU2VsZWN0b3J8fG4ub01hdGNoZXNTZWxlY3Rvcnx8bi53ZWJraXRNYXRjaGVzU2VsZWN0b3J9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKDt0JiY5IT09dC5ub2RlVHlwZTspe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm1hdGNoZXMmJnQubWF0Y2hlcyhlKSlyZXR1cm4gdDt0PXQucGFyZW50Tm9kZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24ucihlKTt2YXIgbz1uKDApLHI9bi5uKG8pLGk9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9O2Z1bmN0aW9uIGEodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1mdW5jdGlvbiBjKHQpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLGMpLHRoaXMucmVzb2x2ZU9wdGlvbnModCksdGhpcy5pbml0U2VsZWN0aW9uKCl9dmFyIGw9KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmYSh0LnByb3RvdHlwZSxlKSxuJiZhKHQsbiksdH0oYyxbe2tleToicmVzb2x2ZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPTA8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD90Ont9O3RoaXMuYWN0aW9uPWUuYWN0aW9uLHRoaXMuY29udGFpbmVyPWUuY29udGFpbmVyLHRoaXMuZW1pdHRlcj1lLmVtaXR0ZXIsdGhpcy50YXJnZXQ9ZS50YXJnZXQsdGhpcy50ZXh0PWUudGV4dCx0aGlzLnRyaWdnZXI9ZS50cmlnZ2VyLHRoaXMuc2VsZWN0ZWRUZXh0PSIifX0se2tleToiaW5pdFNlbGVjdGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRleHQ/dGhpcy5zZWxlY3RGYWtlKCk6dGhpcy50YXJnZXQmJnRoaXMuc2VsZWN0VGFyZ2V0KCl9fSx7a2V5OiJzZWxlY3RGYWtlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT0icnRsIj09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGlyIik7dGhpcy5yZW1vdmVGYWtlKCksdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHQucmVtb3ZlRmFrZSgpfSx0aGlzLmZha2VIYW5kbGVyPXRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2spfHwhMCx0aGlzLmZha2VFbGVtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIiksdGhpcy5mYWtlRWxlbS5zdHlsZS5mb250U2l6ZT0iMTJwdCIsdGhpcy5mYWtlRWxlbS5zdHlsZS5ib3JkZXI9IjAiLHRoaXMuZmFrZUVsZW0uc3R5bGUucGFkZGluZz0iMCIsdGhpcy5mYWtlRWxlbS5zdHlsZS5tYXJnaW49IjAiLHRoaXMuZmFrZUVsZW0uc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmZha2VFbGVtLnN0eWxlW2U/InJpZ2h0IjoibGVmdCJdPSItOTk5OXB4Ijt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7dGhpcy5mYWtlRWxlbS5zdHlsZS50b3A9bisicHgiLHRoaXMuZmFrZUVsZW0uc2V0QXR0cmlidXRlKCJyZWFkb25seSIsIiIpLHRoaXMuZmFrZUVsZW0udmFsdWU9dGhpcy50ZXh0LHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuc2VsZWN0ZWRUZXh0PXIoKSh0aGlzLmZha2VFbGVtKSx0aGlzLmNvcHlUZXh0KCl9fSx7a2V5OiJyZW1vdmVGYWtlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZmFrZUhhbmRsZXImJih0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKSx0aGlzLmZha2VIYW5kbGVyPW51bGwsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrPW51bGwpLHRoaXMuZmFrZUVsZW0mJih0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmZha2VFbGVtKSx0aGlzLmZha2VFbGVtPW51bGwpfX0se2tleToic2VsZWN0VGFyZ2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRUZXh0PXIoKSh0aGlzLnRhcmdldCksdGhpcy5jb3B5VGV4dCgpfX0se2tleToiY29weVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwO3RyeXtlPWRvY3VtZW50LmV4ZWNDb21tYW5kKHRoaXMuYWN0aW9uKX1jYXRjaCh0KXtlPSExfXRoaXMuaGFuZGxlUmVzdWx0KGUpfX0se2tleToiaGFuZGxlUmVzdWx0Iix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmVtaXR0ZXIuZW1pdCh0PyJzdWNjZXNzIjoiZXJyb3IiLHthY3Rpb246dGhpcy5hY3Rpb24sdGV4dDp0aGlzLnNlbGVjdGVkVGV4dCx0cmlnZ2VyOnRoaXMudHJpZ2dlcixjbGVhclNlbGVjdGlvbjp0aGlzLmNsZWFyU2VsZWN0aW9uLmJpbmQodGhpcyl9KX19LHtrZXk6ImNsZWFyU2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudHJpZ2dlciYmdGhpcy50cmlnZ2VyLmZvY3VzKCksZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCksd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpfX0se2tleToiZGVzdHJveSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUZha2UoKX19LHtrZXk6ImFjdGlvbiIsc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPTA8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD90OiJjb3B5IjtpZih0aGlzLl9hY3Rpb249ZSwiY29weSIhPT10aGlzLl9hY3Rpb24mJiJjdXQiIT09dGhpcy5fYWN0aW9uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCAiYWN0aW9uIiB2YWx1ZSwgdXNlIGVpdGhlciAiY29weSIgb3IgImN1dCInKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGlvbn19LHtrZXk6InRhcmdldCIsc2V0OmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe2lmKCF0fHwib2JqZWN0IiE9PSh2b2lkIDA9PT10PyJ1bmRlZmluZWQiOmkodCkpfHwxIT09dC5ub2RlVHlwZSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtpZigiY29weSI9PT10aGlzLmFjdGlvbiYmdC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIGF0dHJpYnV0ZS4gUGxlYXNlIHVzZSAicmVhZG9ubHkiIGluc3RlYWQgb2YgImRpc2FibGVkIiBhdHRyaWJ1dGUnKTtpZigiY3V0Ij09PXRoaXMuYWN0aW9uJiYodC5oYXNBdHRyaWJ1dGUoInJlYWRvbmx5Iil8fHQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpO3RoaXMuX3RhcmdldD10fX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RhcmdldH19XSksYyksdT1uKDEpLHM9bi5uKHUpLGY9bigyKSxkPW4ubihmKSxoPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmeSh0LnByb3RvdHlwZSxlKSxuJiZ5KHQsbiksdH07ZnVuY3Rpb24geSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXZhciBtPShmdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9KHYscy5hKSxwKHYsW3trZXk6InJlc29sdmVPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0wPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PXQ/dDp7fTt0aGlzLmFjdGlvbj0iZnVuY3Rpb24iPT10eXBlb2YgZS5hY3Rpb24/ZS5hY3Rpb246dGhpcy5kZWZhdWx0QWN0aW9uLHRoaXMudGFyZ2V0PSJmdW5jdGlvbiI9PXR5cGVvZiBlLnRhcmdldD9lLnRhcmdldDp0aGlzLmRlZmF1bHRUYXJnZXQsdGhpcy50ZXh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlLnRleHQ/ZS50ZXh0OnRoaXMuZGVmYXVsdFRleHQsdGhpcy5jb250YWluZXI9Im9iamVjdCI9PT1oKGUuY29udGFpbmVyKT9lLmNvbnRhaW5lcjpkb2N1bWVudC5ib2R5fX0se2tleToibGlzdGVuQ2xpY2siLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5saXN0ZW5lcj1kKCkodCwiY2xpY2siLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uQ2xpY2sodCl9KX19LHtrZXk6Im9uQ2xpY2siLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGVsZWdhdGVUYXJnZXR8fHQuY3VycmVudFRhcmdldDt0aGlzLmNsaXBib2FyZEFjdGlvbiYmKHRoaXMuY2xpcGJvYXJkQWN0aW9uPW51bGwpLHRoaXMuY2xpcGJvYXJkQWN0aW9uPW5ldyBsKHthY3Rpb246dGhpcy5hY3Rpb24oZSksdGFyZ2V0OnRoaXMudGFyZ2V0KGUpLHRleHQ6dGhpcy50ZXh0KGUpLGNvbnRhaW5lcjp0aGlzLmNvbnRhaW5lcix0cmlnZ2VyOmUsZW1pdHRlcjp0aGlzfSl9fSx7a2V5OiJkZWZhdWx0QWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYigiYWN0aW9uIix0KX19LHtrZXk6ImRlZmF1bHRUYXJnZXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWIoInRhcmdldCIsdCk7aWYoZSlyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKX19LHtrZXk6ImRlZmF1bHRUZXh0Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYigidGV4dCIsdCl9fSx7a2V5OiJkZXN0cm95Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubGlzdGVuZXIuZGVzdHJveSgpLHRoaXMuY2xpcGJvYXJkQWN0aW9uJiYodGhpcy5jbGlwYm9hcmRBY3Rpb24uZGVzdHJveSgpLHRoaXMuY2xpcGJvYXJkQWN0aW9uPW51bGwpfX1dLFt7a2V5OiJpc1N1cHBvcnRlZCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT10P3Q6WyJjb3B5IiwiY3V0Il0sbj0ic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUsbz0hIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZDtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe289byYmISFkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQodCl9KSxvfX1dKSx2KTtmdW5jdGlvbiB2KHQsZSl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdik7dmFyIG49ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX0odGhpcywodi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih2KSkuY2FsbCh0aGlzKSk7cmV0dXJuIG4ucmVzb2x2ZU9wdGlvbnMoZSksbi5saXN0ZW5DbGljayh0KSxufWZ1bmN0aW9uIGIodCxlKXt2YXIgbj0iZGF0YS1jbGlwYm9hcmQtIit0O2lmKGUuaGFzQXR0cmlidXRlKG4pKXJldHVybiBlLmdldEF0dHJpYnV0ZShuKX1lLmRlZmF1bHQ9bX1dLHIuYz1vLHIuZD1mdW5jdGlvbih0LGUsbil7ci5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Om59KX0sci5yPWZ1bmN0aW9uKHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LHIudD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9cihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihyLnIobiksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSlyLmQobixvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiBufSxyLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIHIuZChlLCJhIixlKSxlfSxyLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LHIucD0iIixyKHIucz02KS5kZWZhdWx0O2Z1bmN0aW9uIHIodCl7aWYob1t0XSlyZXR1cm4gb1t0XS5leHBvcnRzO3ZhciBlPW9bdF09e2k6dCxsOiExLGV4cG9ydHM6e319O3JldHVybiBuW3RdLmNhbGwoZS5leHBvcnRzLGUsZS5leHBvcnRzLHIpLGUubD0hMCxlLmV4cG9ydHN9dmFyIG4sb30pOw=="}]},{"name":"解析腾讯,优酷,爱奇艺等全网会员视频,vip视频,添加百度网盘超级会员账号共享","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["*://v.youku.com/v_*","*://m.youku.com/v*","*://m.youku.com/a*","*://*.iqiyi.com/v_*","*://*.iqiyi.com/w_*","*://*.iqiyi.com/a_*","*://*.iqiyi.com/dianying/*","*://*.le.com/ptv/vplay/*","*v.qq.com/x/cover/*","*v.qq.com/x/page/*","*v.qq.com/play*","*://pan.baidu.com/*","*://*.tudou.com/listplay/*","*://*.tudou.com/albumplay/*","*://*.tudou.com/programs/view/*","*://*.mgtv.com/b/*","*://film.sohu.com/album/*","*://tv.sohu.com/*","*://*.bilibili.com/video/*","*://*.bilibili.com/anime/*","*://*.bilibili.com/bangumi/play/*","*://vip.pptv.com/show/*","*://v.pptv.com/show/*","*://*.baofeng.com/play/*","*://v.yinyuetai.com/video/*","*://v.yinyuetai.com/playlist/*","*://vip.1905.com/play/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1637743695952,"data":{}},"enabled":true,"position":12,"file_url":"https://greasyfork.org/scripts/418436-%E8%A7%A3%E6%9E%90%E8%85%BE%E8%AE%AF-%E4%BC%98%E9%85%B7-%E7%88%B1%E5%A5%87%E8%89%BA%E7%AD%89%E5%85%A8%E7%BD%91%E4%BC%9A%E5%91%98%E8%A7%86%E9%A2%91-vip%E8%A7%86%E9%A2%91-%E6%B7%BB%E5%8A%A0%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E8%B6%85%E7%BA%A7%E4%BC%9A%E5%91%98%E8%B4%A6%E5%8F%B7%E5%85%B1%E4%BA%AB/code/%E8%A7%A3%E6%9E%90%E8%85%BE%E8%AE%AF%EF%BC%8C%E4%BC%98%E9%85%B7%EF%BC%8C%E7%88%B1%E5%A5%87%E8%89%BA%E7%AD%89%E5%85%A8%E7%BD%91%E4%BC%9A%E5%91%98%E8%A7%86%E9%A2%91%EF%BC%8Cvip%E8%A7%86%E9%A2%91%EF%BC%8C%E6%B7%BB%E5%8A%A0%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E8%B6%85%E7%BA%A7%E4%BC%9A%E5%91%98%E8%B4%A6%E5%8F%B7%E5%85%B1%E4%BA%AB.user.js","uuid":"7d4d3b5a-e58b-471d-b071-f56bfe911353","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIOino+aekOiFvuiur++8jOS8mOmFt++8jOeIseWlh+iJuuetieWFqOe9keS8muWRmOinhumike+8jHZpcOinhumike+8jOa3u+WKoOeZvuW6pue9keebmOi2hee6p+S8muWRmOi0puWPt+WFseS6qwovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi91c2Vycy83MDQxMDYKLy8gQHZlcnNpb24gICAgICAgICAgIDIuNS4xCi8vIEBpY29uICAgICAgICAgICAgICAKLy8gQGRlc2NyaXB0aW9uICAgICAgIOino+aekOS8muWRmOinhumike+8jHZpcOinhumike+8jOaUr+aMgeiFvuiur++8jOS8mOmFt++8jOeIseWlh+iJuu+8jOiKkuaenO+8jHBwdHbnrYkKLy8gQGFudGlmZWF0dXJlICAgICAgVGhlIHNjcmlwdCBjb3BpZXMgdGhlIFVSTCB0byB0aGUgcGFyc2luZyBzaXRlLCBzbyB0aGUgcGFnZSBjb250YWlucyBwYXJ0IG9mIHRoZSBwYXJzaW5nIHNpdGUgYWRzCi8vIEBhdXRob3IgICAgICAgICAgICBqbG1mCi8vIEBsaWNlbnNlICAgICAgICAgICBNSVQKLy8gQHN1cHBvcnRVUkwgICAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vdXNlcnMvNzA0MTA2Ci8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vdi55b3VrdS5jb20vdl8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vbS55b3VrdS5jb20vdioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9tLnlvdWt1LmNvbS9hKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovLyouaXFpeWkuY29tL3ZfKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovLyouaXFpeWkuY29tL3dfKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovLyouaXFpeWkuY29tL2FfKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovLyouaXFpeWkuY29tL2RpYW55aW5nLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLmxlLmNvbS9wdHYvdnBsYXkvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKnYucXEuY29tL3gvY292ZXIvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKnYucXEuY29tL3gvcGFnZS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqdi5xcS5jb20vcGxheSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLnR1ZG91LmNvbS9saXN0cGxheS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vKi50dWRvdS5jb20vYWxidW1wbGF5LyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLnR1ZG91LmNvbS9wcm9ncmFtcy92aWV3LyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLm1ndHYuY29tL2IvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL2ZpbG0uc29odS5jb20vYWxidW0vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3R2LnNvaHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLmJpbGliaWxpLmNvbS92aWRlby8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vKi5iaWxpYmlsaS5jb20vYW5pbWUvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovLyouYmlsaWJpbGkuY29tL2Jhbmd1bWkvcGxheS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vdmlwLnBwdHYuY29tL3Nob3cvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3YucHB0di5jb20vc2hvdy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vKi5iYW9mZW5nLmNvbS9wbGF5LyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly92Lnlpbnl1ZXRhaS5jb20vdmlkZW8vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3YueWlueXVldGFpLmNvbS9wbGF5bGlzdC8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vdmlwLjE5MDUuY29tL3BsYXkvKgovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9jZG4uYm9vdGNzcy5jb20vanF1ZXJ5LzEuMTIuNC9qcXVlcnkubWluLmpzCi8vIEBydW4tYXQgICAgICAgICAgICBkb2N1bWVudC1pZGxlCi8vIEBncmFudCAgICAgICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2FkZFN0eWxlCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIEdNX2FkZFN0eWxlKCcuaC1pY29uLXBsYXkge2NvbG9yOiAjZDkyNmI1O2ZpbGw6ICNkOTI2YjU7aGVpZ2h0OiA4MHB4O3dpZHRoOiA4MHB4O3Bvc2l0aW9uOiBmaXhlZDt6LWluZGV4OiA5OTk5OTt0b3A6IDBweDtsZWZ0OiAwO2N1cnNvcjogcG9pbnRlcjt9ICAuaC1vbCB7cG9zaXRpb246IGZpeGVkO3RvcDogMzBweDtsZWZ0OiAyMHB4O3otaW5kZXg6IDk5OTk5O2NvdW50ZXItcmVzZXQ6IGxpO2xpc3Qtc3R5bGU6IG5vbmU7Zm9udC1zaXplOiA4cHg7cGFkZGluZzogMDttYXJnaW4tYm90dG9tOiAyZW07dGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAuNSk7ZGlzcGxheTogbm9uZTt9ICAuaC1vbCBhIHtwb3NpdGlvbjogcmVsYXRpdmU7ZGlzcGxheTogYmxvY2s7cGFkZGluZzogM3B4IDEwcHggM3B4IDJlbTttYXJnaW46IDAuNWVtIDA7YmFja2dyb3VuZDogI2RkZDtjb2xvcjogIzQ0NDt0ZXh0LWRlY29yYXRpb246IG5vbmU7Ym9yZGVyLXJhZGl1czogMC4zZW07dHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZS1vdXQ7fSAgLmgtb2wgYTpob3ZlciB7YmFja2dyb3VuZDogI2VlZTtjb2xvcjogI2ZmNmY1Yzt0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlLW91dDt9ICAuaC1vbCBhOjpiZWZvcmUge2NvbnRlbnQ6IGNvdW50ZXIobGkpO2NvdW50ZXItaW5jcmVtZW50OiBsaTtwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogLTEuMmVtO3RvcDogNTAlO21hcmdpbi10b3A6IC0xLjJlbTtiYWNrZ3JvdW5kOiAjODdjZWViO2hlaWdodDogMmVtO3dpZHRoOiAyZW07bGluZS1oZWlnaHQ6IDJlbTtib3JkZXI6IDAuMmVtIHNvbGlkICNmZmY7dGV4dC1hbGlnbjogY2VudGVyO2ZvbnQtd2VpZ2h0OiBib2xkO2JvcmRlci1yYWRpdXM6IDJlbTt9Jyk7CgogIGxldCBhcGkgPSBbCnsibmFtZSI6Ik9L6Kej5p6QIiwidXJsIjoiaHR0cHM6Ly9va2p4LmNjLz91cmw9In0sICAKeyJuYW1lIjoiMmsiLCJ1cmwiOiJodHRwczovL3ZpcC4ya3R2Yi5jb20vcGxheWVyLz91cmw9In0sICAgICAgCnsibmFtZSI6IlBhcndpeCIsInVybCI6Imh0dHBzOi8vdmlwLnBhcndpeC5jb206NDQzMy9wbGF5ZXIvP3VybD0ifSwKeyJuYW1lIjoibWllZGUiLCJ1cmwiOiJodHRwczovL3d3dy5taWVkZS50b3AvamlleGkvP3VybD0iLCJ0IjoibSJ9LCAKeyJuYW1lIjoiYmwiLCJ1cmwiOiJodHRwczovL3ZpcC5ibGppZXguY29tLz92PSJ9LCAgIAp7Im5hbWUiOiJtbWt2IiwidXJsIjoiaHR0cHM6Ly9qeC5tbWt2LmNuL3R2LnBocD91cmw9In0sCnsibmFtZSI6Im13MCIsInVybCI6Imh0dHBzOi8vangubXcwLmNjLz91cmw9In0sICAgICAgICAKeyJuYW1lIjoiZXJnYW4iLCJ1cmwiOiJodHRwczovL2p4LmVyZ2FuLnRvcC8/dXJsPSJ9LCAKeyJuYW1lIjoi5piO5pelMiIsInVybCI6Imh0dHBzOi8vangueWluZ3hpYW5nYmFvLmNuL3ZpcC5waHA/dXJsPSJ9LCAKeyJuYW1lIjoi5piO5pelIiwidXJsIjoiaHR0cHM6Ly9qeC5qaXVib2p4LmNvbS92aXAucGhwP3VybD0ifSwgICAgIAp7Im5hbWUiOiLkuYXmkq3lpKfmoJEiLCJ1cmwiOiJodHRwczovL2p4Lndsc3N5cy54eXovdmlwLnBocD91cmw9In0sCntuYW1lOiAnTTE5NzAnLCB1cmw6ICdodHRwczovL3oxLm0xOTA3LmNuLz9qeD0nfSwgICAKeyJuYW1lIjoi5YG25YOPIiwidXJsIjoiaHR0cHM6Ly9qeC5haWRvdWVyLm5ldC8/dXJsPSJ9LCAgCnsibmFtZSI6Iuinhumikea1gSIsInVybCI6Imh0dHBzOi8vangubTN1OC50di9qaWV4aS8/dXJsPSJ9LCAgICAgIAp7Im5hbWUiOiI2MCIsInVybCI6Imh0dHA6Ly82MGp4LmNvbS8/dXJsPSJ9LCAgICAgICAgICAgICAgCnsibmFtZSI6IuWFqOawkSIsInVybCI6Imh0dHBzOi8vangucXVhbm1pbmdqaWV4aS5jb20vP3VybD0ifSwgIAp7Im5hbWUiOiLop6PmnpBsYSIsInVybCI6Imh0dHBzOi8vYXBpLmppZXhpLmxhLz91cmw9In0sCnsibmFtZSI6IkNIb2siLCJ1cmwiOiJodHRwczovL3d3dy5nYWk0LmNvbS8/dXJsPSJ9LCAgIAp7Im5hbWUiOiJhZG1pbmlzdHJhdG9ydyIsInVybCI6Imh0dHBzOi8vd3d3LmFkbWluaXN0cmF0b3J3LmNvbS92aWRlby5waHA/dXJsPSJ9LAp7Im5hbWUiOiLnmb7luqbnvZHnm5jkvJrlkZjlhbHkuqsiLCJ1cmwiOiJodHRwOi8vbXAud2VpeGluLnFxLmNvbS9zP19fYml6PU16STNPVFUwTmprME5BPT0mbWlkPTIyNDc0ODUyMDAmaWR4PTEmc249YzM5OGNhMGZhODMwYzNkZmM5YTI1MTVmNGM0NTFiMmYmY2hrc209ZWI0NzVhM2ZkYzMwZDMyOWY4OTkzZDYzNDVhZTU3NWNjM2VmYTcyNjViYTA5NGUxZGRmZDAzMGJhMWNkODhhOTBkMjk2Mzc2NmE5MyNyZCJ9LF07CgogIGxldCBtYWluID0gewogICAgc2hvd0J1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICBpZiAobG9jYXRpb24uaG9zdC5tYXRjaCgveW91a3V8aXFpeWl8bGV8cXF8dHVkb3V8bWd0dnxzb2h1fGFjZnVufGJpbGliaWxpfHBwdHZ8YmFvZmVuZ3x5aW55dWV0YWkvaWcpKSB7CiAgICAgICAgbGV0IG1haW5CdXR0b24gPSAnPGRpdiBjbGFzcz0iaC1pY29uLXBsYXkiIHRpdGxlPSJDbGljayBzaG93IHJlc29sdmUgYWRkcmVzcyI+PHN2ZyB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHBhdGggZD0iTTQyMi42IDE5My42Yy01LjMtNDUuMy0yMy4zLTUxLjYtNTktNTQgLTUwLjgtMy41LTE2NC4zLTMuNS0yMTUuMSAwIC0zNS43IDIuNC01My43IDguNy01OSA1NCAtNCAzMy42LTQgOTEuMSAwIDEyNC44IDUuMyA0NS4zIDIzLjMgNTEuNiA1OSA1NCA1MC45IDMuNSAxNjQuMyAzLjUgMjE1LjEgMCAzNS43LTIuNCA1My43LTguNyA1OS01NEM0MjYuNiAyODQuOCA0MjYuNiAyMjcuMyA0MjIuNiAxOTMuNnpNMjIyLjIgMzAzLjR2LTk0LjZsOTAuNyA0Ny4zTDIyMi4yIDMwMy40eiI+PC9wYXRoPjwvc3ZnPjwvZGl2Pic7CiAgICAgICAgbGV0IGFwaUxpc3QgPSAnPG9sIGNsYXNzPSJoLW9sIj48L29sPic7CiAgICAgICAgbGV0IGdpdGh1YiA9ICc8aWZyYW1lIHNyYz0iaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi91c2Vycy83MDQxMDYmcmVwbz1tZWRpYSZ0eXBlPXN0YXImY291bnQ9dHJ1ZSIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0iMCIgc3R5bGU9ImhlaWdodDogMjBweDttYXgtd2lkdGg6IDExMHB4O3BhZGRpbmc6IDAgNXB4O2JveC1zaXppbmc6IGJvcmRlci1ib3g7bWFyZ2luLXRvcDogMTBweDsiPjwvaWZyYW1lPic7CgogICAgICAgICQodG9wLmRvY3VtZW50LmJvZHkpLmFwcGVuZChtYWluQnV0dG9uKTsKICAgICAgICAkKHRvcC5kb2N1bWVudC5ib2R5KS5hcHBlbmQoYXBpTGlzdCk7CgogICAgICAgIGFwaS5mb3JFYWNoKCh2YWwsIGluZGV4KSA9PiB7CiAgICAgICAgICAkKCcuaC1vbCcpLmFwcGVuZChgPGxpPjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke3ZhbC51cmwgKyBlbmNvZGVVUkkobG9jYXRpb24uaHJlZil9Ij4ke3ZhbC5uYW1lfTwvYT48L2xpPmApCiAgICAgICAgfSk7CiAgICAgICAgLy9GZWVkYmFjayBidXR0b24KICAgICAgICAkKCcuaC1vbCcpLmFwcGVuZChgPGxpPjxhIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6ICM5OTk7IiBocmVmPSJodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3VzZXJzLzcwNDEwNiI+Q2xpY2sgb24gdGhlIGZlZWRiYWNrPC9hPjwvbGk+YCk7CiAgICAgICAgJCgnLmgtb2wnKS5hcHBlbmQoZ2l0aHViKTsKCiAgICAgICAgJCh0b3AuZG9jdW1lbnQuYm9keSkub24oJ2NsaWNrJywgJy5oLWljb24tcGxheScsICgpID0+IHsKICAgICAgICAgICQoJy5oLW9sJykuZmFkZVRvZ2dsZSgnZmFzdCcpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfTsKCiAgJChmdW5jdGlvbiAoKSB7CiAgICBtYWluLnNob3dCdXR0b24oKTsKICB9KTsKfSkoKTsK","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js","ts":1637743696397,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMS4xMi40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmUuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZWFjaCh0aGlzLGEpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpnLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihuLmlzUGxhaW5PYmplY3QoYyl8fChiPW4uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbi5pc0FycmF5KGEpP2E6W10pOmY9YSYmbi5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1uLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnRvU3RyaW5nKCk7cmV0dXJuIW4uaXNBcnJheShhKSYmYi1wYXJzZUZsb2F0KGIpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKCFsLm93bkZpcnN0KWZvcihiIGluIGEpcmV0dXJuIGsuY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxrLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGgpcmV0dXJuIGguY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWUuY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGQpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYobi5mbltTeW1ib2wuaXRlcmF0b3JdPWNbU3ltYm9sLml0ZXJhdG9yXSksbi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj0hIWEmJiJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2EoKSx6PWdhKCksQT1nYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitNKyIpKXwpIitMKyIqXFxdIixPPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTisiKSopfC4qKVxcKXwpIixQPW5ldyBSZWdFeHAoTCsiKyIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxUPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFU9bmV3IFJlZ0V4cChPKSxWPW5ldyBSZWdFeHAoIl4iK00rIiQiKSxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK04pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitPKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWT0vXmhcZCQvaSxaPS9eW157XStce1xzKlxbbmF0aXZlIFx3LywkPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sXz0vWyt+XS8sYWE9Lyd8XFwvZyxiYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksY2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGRhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZmEoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3PWImJmIub3duZXJEb2N1bWVudCx4PWI/Yi5ub2RlVHlwZTo5O2lmKGQ9ZHx8W10sInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PXgmJjkhPT14JiYxMSE9PXgpcmV0dXJuIGQ7aWYoIWUmJigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixwKSl7aWYoMTEhPT14JiYobz0kLmV4ZWMoYSkpKWlmKGY9b1sxXSl7aWYoOT09PXgpe2lmKCEoaj1iLmdldEVsZW1lbnRCeUlkKGYpKSlyZXR1cm4gZDtpZihqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZSBpZih3JiYoaj13LmdldEVsZW1lbnRCeUlkKGYpKSYmdChiLGopJiZqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZXtpZihvWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoZj1vWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZikpLGR9aWYoYy5xc2EmJiFBW2ErIiAiXSYmKCFxfHwhcS50ZXN0KGEpKSl7aWYoMSE9PXgpdz1iLHM9YTtlbHNlIGlmKCJvYmplY3QiIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoaz1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/az1rLnJlcGxhY2UoYWEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLGs9dSkscj1nKGEpLGg9ci5sZW5ndGgsbD1WLnRlc3Qoayk/IiMiK2s6IltpZD0nIitrKyInXSI7d2hpbGUoaC0tKXJbaF09bCsiICIrcWEocltoXSk7cz1yLmpvaW4oIiwiKSx3PV8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8Yn1pZihzKXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbChzKSksZH1jYXRjaCh5KXt9ZmluYWxseXtrPT09dSYmYi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gaShhLnJlcGxhY2UoUSwiJDEiKSxiLGQsZSl9ZnVuY3Rpb24gZ2EoKXt2YXIgYT1bXTtmdW5jdGlvbiBiKGMsZSl7cmV0dXJuIGEucHVzaChjKyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIGJbYS5zaGlmdCgpXSxiW2MrIiAiXT1lfXJldHVybiBifWZ1bmN0aW9uIGhhKGEpe3JldHVybiBhW3VdPSEwLGF9ZnVuY3Rpb24gaWEoYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuISFhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuc3BsaXQoInwiKSxlPWMubGVuZ3RoO3doaWxlKGUtLSlkLmF0dHJIYW5kbGVbY1tlXV09Yn1mdW5jdGlvbiBrYShhLGIpe3ZhciBjPWImJmEsZD1jJiYxPT09YS5ub2RlVHlwZSYmMT09PWIubm9kZVR5cGUmJih+Yi5zb3VyY2VJbmRleHx8QyktKH5hLnNvdXJjZUluZGV4fHxDKTtpZihkKXJldHVybiBkO2lmKGMpd2hpbGUoYz1jLm5leHRTaWJsaW5nKWlmKGM9PT1iKXJldHVybi0xO3JldHVybiBhPzE6LTF9ZnVuY3Rpb24gbGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YyYmYi50eXBlPT09YX19ZnVuY3Rpb24gbWEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PWN8fCJidXR0b24iPT09YykmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBoYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixoYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIG9hKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1mYS5zdXBwb3J0PXt9LGY9ZmEuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiPyJIVE1MIiE9PWIubm9kZU5hbWU6ITF9LG09ZmEuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZSxnPWE/YS5vd25lckRvY3VtZW50fHxhOnY7cmV0dXJuIGchPT1uJiY5PT09Zy5ub2RlVHlwZSYmZy5kb2N1bWVudEVsZW1lbnQ/KG49ZyxvPW4uZG9jdW1lbnRFbGVtZW50LHA9IWYobiksKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1pYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVoudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1pYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT1aLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGlhKGZ1bmN0aW9uKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVoudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmaWEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLE8pfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj1aLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHxaLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1ufHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PW58fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxnPVthXSxoPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1uPy0xOmI9PT1uPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGthKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWcudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO3doaWxlKGdbZF09PT1oW2RdKWQrKztyZXR1cm4gZD9rYShnW2RdLGhbZF0pOmdbZF09PT12Py0xOmhbZF09PT12PzE6MH0sbik6bn0sZmEubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYShhLG51bGwsbnVsbCxiKX0sZmEubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFQsIj0nJDEnXSIpLGMubWF0Y2hlc1NlbGVjdG9yJiZwJiYhQVtiKyIgIl0mJighcnx8IXIudGVzdChiKSkmJighcXx8IXEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGZhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGZhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZmEuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGZhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZmEudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWZhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1mYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpoYSxtYXRjaDpXLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYmEsY2EpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGJhLGNhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZmEuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZmEuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFcuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVS50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZmEuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShQLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2hhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1KKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmhhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShRLCIkMSIpKTtyZXR1cm4gZFt1XT9oYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmEoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoYmEsY2EpLGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBWLnRlc3QoYXx8IiIpfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxiLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBjPWMudG9Mb3dlckNhc2UoKSxjPT09YXx8MD09PWMuaW5kZXhPZihhKyItIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFkudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6bmEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om5hKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpuYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6bmEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bGEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bWEoYik7ZnVuY3Rpb24gcGEoKXt9cGEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBwYSxnPWZhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1SLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1TLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFEsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1XW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/ZmEuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBxYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHJhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGosaz1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGo9Ylt1XXx8KGJbdV09e30pLGk9altiLnVuaXF1ZUlEXXx8KGpbYi51bmlxdWVJRF09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGtbMl09aFsyXTtpZihpW2RdPWssa1syXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHRhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZmEoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHVhKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJihjJiYhYyhmLGQsZSl8fChnLnB1c2goZiksaiYmYi5wdXNoKGgpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9dmEoZCkpLGUmJiFlW3VdJiYoZT12YShlLGYpKSxoYShmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx0YShifHwiKiIsaC5ub2RlVHlwZT9baF06aCxbXSkscT0hYXx8IWYmJmI/cDp1YShwLG0sYSxoLGkpLHI9Yz9lfHwoZj9hOm98fGQpP1tdOmc6cTtpZihjJiZjKHEscixoLGkpLGQpe2o9dWEocixuKSxkKGosW10saCxpKSxrPWoubGVuZ3RoO3doaWxlKGstLSkobD1qW2tdKSYmKHJbbltrXV09IShxW25ba11dPWwpKX1pZihmKXtpZihlfHxhKXtpZihlKXtqPVtdLGs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiZqLnB1c2gocVtrXT1sKTtlKG51bGwscj1bXSxqLGkpfWs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiYoaj1lP0ooZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXVhKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpILmFwcGx5KGcscil9KX1mdW5jdGlvbiB3YShhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saD1nfHxkLnJlbGF0aXZlWyIgIl0saT1nPzE6MCxrPXJhKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saCwhMCksbD1yYShmdW5jdGlvbihhKXtyZXR1cm4gSihiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7dmFyIGU9IWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSk7cmV0dXJuIGI9bnVsbCxlfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtyYShzYShtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gdmEoaT4xJiZzYShtKSxpPjEmJnFhKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09YVtpLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoUSwiJDEiKSxjLGU+aSYmd2EoYS5zbGljZShpLGUpKSxmPmUmJndhKGE9YS5zbGljZShlKSksZj5lJiZxYShhKSl9bS5wdXNoKGMpfXJldHVybiBzYShtKX1mdW5jdGlvbiB4YShhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxvLHEscj0wLHM9IjAiLHQ9ZiYmW10sdT1bXSx2PWoseD1mfHxlJiZkLmZpbmQuVEFHKCIqIixrKSx5PXcrPW51bGw9PXY/MTpNYXRoLnJhbmRvbSgpfHwuMSx6PXgubGVuZ3RoO2ZvcihrJiYoaj1nPT09bnx8Z3x8ayk7cyE9PXomJm51bGwhPShsPXhbc10pO3MrKyl7aWYoZSYmbCl7bz0wLGd8fGwub3duZXJEb2N1bWVudD09PW58fChtKGwpLGg9IXApO3doaWxlKHE9YVtvKytdKWlmKHEobCxnfHxuLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9eSl9YyYmKChsPSFxJiZsKSYmci0tLGYmJnQucHVzaChsKSl9aWYocis9cyxjJiZzIT09cil7bz0wO3doaWxlKHE9YltvKytdKXEodCx1LGcsaCk7aWYoZil7aWYocj4wKXdoaWxlKHMtLSl0W3NdfHx1W3NdfHwodVtzXT1GLmNhbGwoaSkpO3U9dWEodSl9SC5hcHBseShpLHUpLGsmJiFmJiZ1Lmxlbmd0aD4wJiZyK2IubGVuZ3RoPjEmJmZhLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXksaj12KSx0fTtyZXR1cm4gYz9oYShmKTpmfXJldHVybiBoPWZhLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErIiAiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj13YShiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseGEoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWZhLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEsbz0hZiYmZyhhPW4uc2VsZWN0b3J8fGEpO2lmKGU9ZXx8W10sMT09PW8ubGVuZ3RoKXtpZihqPW9bMF09b1swXS5zbGljZSgwKSxqLmxlbmd0aD4yJiYiSUQiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1XLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShiYSxjYSksXy50ZXN0KGpbMF0udHlwZSkmJm9hKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSwhYnx8Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGphKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGphKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlU29ydD1uLnVuaXF1ZT10LnVuaXF1ZVNvcnQsbi50ZXh0PXQuZ2V0VGV4dCxuLmlzWE1MRG9jPXQuaXNYTUwsbi5jb250YWlucz10LmNvbnRhaW5zO3ZhciB1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sdj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY30sdz1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHg9L148KFtcdy1dKylccypcLz8+KD86PFwvXDE+fCkkLyx5PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24geihhLGIsYyl7aWYobi5pc0Z1bmN0aW9uKGIpKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih5LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBuLmluQXJyYXkoYSxiKT4tMSE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9uLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm4uZmluZC5tYXRjaGVzKGEsbi5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxuLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobi5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyluLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9uLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheih0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdy50ZXN0KGEpP24oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgQSxCPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQz1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxBLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hLmNoYXJBdCgwKSYmIj4iPT09YS5jaGFyQXQoYS5sZW5ndGgtMSkmJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06Qi5leGVjKGEpLCFlfHwhZVsxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fGMpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGVbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChlWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmQsITApKSx4LnRlc3QoZVsxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoZSBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKGJbZV0pOnRoaXMuYXR0cihlLGJbZV0pO3JldHVybiB0aGlzfWlmKGY9ZC5nZXRFbGVtZW50QnlJZChlWzJdKSxmJiZmLnBhcmVudE5vZGUpe2lmKGYuaWQhPT1lWzJdKXJldHVybiBBLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWZ9cmV0dXJuIHRoaXMuY29udGV4dD1kLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpPyJ1bmRlZmluZWQiIT10eXBlb2YgYy5yZWFkeT9jLnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0MucHJvdG90eXBlPW4uZm4sQT1uKGQpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW4oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihuLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dy50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlU29ydChmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWVTb3J0KG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEYoYSxiKXtkbyBhPWFbYl07d2hpbGUoYSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gdigoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihFW2FdfHwoZT1uLnVuaXF1ZVNvcnQoZSkpLEQudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRz0vXFMrL2c7ZnVuY3Rpb24gSChhKXt2YXIgYj17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRyl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmPVtdLGc9W10saD0tMSxpPWZ1bmN0aW9uKCl7Zm9yKGU9YS5vbmNlLGQ9Yj0hMDtnLmxlbmd0aDtoPS0xKXtjPWcuc2hpZnQoKTt3aGlsZSgrK2g8Zi5sZW5ndGgpZltoXS5hcHBseShjWzBdLGNbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihoPWYubGVuZ3RoLGM9ITEpfWEubWVtb3J5fHwoYz0hMSksYj0hMSxlJiYoZj1jP1tdOiIiKX0saj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGYmJihjJiYhYiYmKGg9Zi5sZW5ndGgtMSxnLnB1c2goYykpLGZ1bmN0aW9uIGQoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXtuLmlzRnVuY3Rpb24oYyk/YS51bmlxdWUmJmouaGFzKGMpfHxmLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09bi50eXBlKGMpJiZkKGMpfSl9KGFyZ3VtZW50cyksYyYmIWImJmkoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixmLGMpKT4tMSlmLnNwbGljZShjLDEpLGg+PWMmJmgtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxmKT4tMTpmLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBmJiYoZj1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBlPWc9W10sZj1jPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZT0hMCxjfHxqLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhjLm5vdGlmeSkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1lLmNhbGwoYXJndW1lbnRzKSxkPWMubGVuZ3RoLGY9MSE9PWR8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2Q6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZS5jYWxsKGFyZ3VtZW50cyk6ZCxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGQ+MSlmb3IoaT1uZXcgQXJyYXkoZCksaj1uZXcgQXJyYXkoZCksaz1uZXcgQXJyYXkoZCk7ZD5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5wcm9ncmVzcyhoKGIsaixpKSkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEkucmVzb2x2ZVdpdGgoZCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4oZCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEooKXtkLmFkZEV2ZW50TGlzdGVuZXI/KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixLKSk6KGQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5kZXRhY2hFdmVudCgib25sb2FkIixLKSl9ZnVuY3Rpb24gSygpeyhkLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWEuZXZlbnQudHlwZXx8ImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZSkmJihKKCksbi5yZWFkeSgpKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIUkpaWYoST1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09ZC5yZWFkeVN0YXRlJiYhZC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwpYS5zZXRUaW1lb3V0KG4ucmVhZHkpO2Vsc2UgaWYoZC5hZGRFdmVudExpc3RlbmVyKWQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixLKTtlbHNle2QuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5hdHRhY2hFdmVudCgib25sb2FkIixLKTt2YXIgYz0hMTt0cnl7Yz1udWxsPT1hLmZyYW1lRWxlbWVudCYmZC5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZSl7fWMmJmMuZG9TY3JvbGwmJiFmdW5jdGlvbiBmKCl7aWYoIW4uaXNSZWFkeSl7dHJ5e2MuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChiKXtyZXR1cm4gYS5zZXRUaW1lb3V0KGYsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBMO2ZvcihMIGluIG4obCkpYnJlYWs7bC5vd25GaXJzdD0iMCI9PT1MLGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxuKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGU7Yz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGIuc3R5bGUuem9vbSYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsbC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChlKSl9KSxmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX1hPW51bGx9KCk7dmFyIE09ZnVuY3Rpb24oYSl7dmFyIGI9bi5ub0RhdGFbKGEubm9kZU5hbWUrIiAiKS50b0xvd2VyQ2FzZSgpXSxjPSthLm5vZGVUeXBlfHwxO3JldHVybiAxIT09YyYmOSE9PWM/ITE6IWJ8fGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9LE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwOwp9cmV0dXJuIGN9ZnVuY3Rpb24gUShhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbi5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFIoYSxiLGQsZSl7aWYoTShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksIm9iamVjdCIhPXR5cGVvZiBiJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGU/altrXT1uLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1uLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbi5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbi5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKE0oYSkpe3ZhciBkLGUsZj1hLm5vZGVUeXBlLGc9Zj9uLmNhY2hlOmEsaD1mP2Fbbi5leHBhbmRvXTpuLmV4cGFuZG87aWYoZ1toXSl7aWYoYiYmKGQ9Yz9nW2hdOmdbaF0uZGF0YSkpe24uaXNBcnJheShiKT9iPWIuY29uY2F0KG4ubWFwKGIsbi5jYW1lbENhc2UpKTpiIGluIGQ/Yj1bYl06KGI9bi5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIuc3BsaXQoIiAiKSksZT1iLmxlbmd0aDt3aGlsZShlLS0pZGVsZXRlIGRbYltlXV07aWYoYz8hUShkKTohbi5pc0VtcHR5T2JqZWN0KGQpKXJldHVybn0oY3x8KGRlbGV0ZSBnW2hdLmRhdGEsUShnW2hdKSkpJiYoZj9uLmNsZWFuRGF0YShbYV0sITApOmwuZGVsZXRlRXhwYW5kb3x8ZyE9Zy53aW5kb3c/ZGVsZXRlIGdbaF06Z1toXT12b2lkIDApfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7bi5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhLGIpfSk6Zj9QKGYsYSxuLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1uLl9kYXRhKGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1uLl9kYXRhKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbi5fZGF0YShhLGMpfHxuLl9kYXRhKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bi5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbi5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW4uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSksZnVuY3Rpb24oKXt2YXIgYTtsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxlO3JldHVybiBjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoYiksInVuZGVmaW5lZCIhPXR5cGVvZiBiLnN0eWxlLnpvb20mJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChlKSxhKTp2b2lkIDB9fSgpO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1QrIikoW2EteiVdKikkIiwiaSIpLFY9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX07ZnVuY3Rpb24gWChhLGIsYyxkKXt2YXIgZSxmPTEsZz0yMCxoPWQ/ZnVuY3Rpb24oKXtyZXR1cm4gZC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbi5jc3MoYSxiLCIiKX0saT1oKCksaj1jJiZjWzNdfHwobi5jc3NOdW1iZXJbYl0/IiI6InB4Iiksaz0obi5jc3NOdW1iZXJbYl18fCJweCIhPT1qJiYraSkmJlUuZXhlYyhuLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixuLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBZPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYylZKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9LFo9L14oPzpjaGVja2JveHxyYWRpbykkL2ksJD0vPChbXHc6LV0rKS8sXz0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksYWE9L15ccysvLGJhPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZGlhbG9nfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1haW58bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHBpY3R1cmV8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRlbXBsYXRlfHRpbWV8dmlkZW8iO2Z1bmN0aW9uIGNhKGEpe3ZhciBiPWJhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ZC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYi5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGEuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYi5hcHBlbmRDaGlsZChhKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYS5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ISFhLmFkZEV2ZW50TGlzdGVuZXIsYVtuLmV4cGFuZG9dPTEsbC5hdHRyaWJ1dGVzPSFhLmdldEF0dHJpYnV0ZShuLmV4cGFuZG8pfSgpO3ZhciBkYT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19O2RhLm9wdGdyb3VwPWRhLm9wdGlvbixkYS50Ym9keT1kYS50Zm9vdD1kYS5jb2xncm91cD1kYS5jYXB0aW9uPWRhLnRoZWFkLGRhLnRoPWRhLnRkO2Z1bmN0aW9uIGVhKGEsYil7dmFyIGMsZCxlPTAsZj0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLGVhKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiBmYShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW4uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG4uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX12YXIgZ2E9Lzx8JiM/XHcrOy8saGE9Lzx0Ym9keS9pO2Z1bmN0aW9uIGlhKGEpe1oudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGphKGEsYixjLGQsZSl7Zm9yKHZhciBmLGcsaCxpLGosayxtLG89YS5sZW5ndGgscD1jYShiKSxxPVtdLHI9MDtvPnI7cisrKWlmKGc9YVtyXSxnfHwwPT09ZylpZigib2JqZWN0Ij09PW4udHlwZShnKSluLm1lcmdlKHEsZy5ub2RlVHlwZT9bZ106Zyk7ZWxzZSBpZihnYS50ZXN0KGcpKXtpPWl8fHAuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaj0oJC5leGVjKGcpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09ZGFbal18fGRhLl9kZWZhdWx0LGkuaW5uZXJIVE1MPW1bMV0rbi5odG1sUHJlZmlsdGVyKGcpK21bMl0sZj1tWzBdO3doaWxlKGYtLSlpPWkubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZhYS50ZXN0KGcpJiZxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShhYS5leGVjKGcpWzBdKSksIWwudGJvZHkpe2c9InRhYmxlIiE9PWp8fGhhLnRlc3QoZyk/Ijx0YWJsZT4iIT09bVsxXXx8aGEudGVzdChnKT8wOmk6aS5maXJzdENoaWxkLGY9ZyYmZy5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShmLS0pbi5ub2RlTmFtZShrPWcuY2hpbGROb2Rlc1tmXSwidGJvZHkiKSYmIWsuY2hpbGROb2Rlcy5sZW5ndGgmJmcucmVtb3ZlQ2hpbGQoayl9bi5tZXJnZShxLGkuY2hpbGROb2RlcyksaS50ZXh0Q29udGVudD0iIjt3aGlsZShpLmZpcnN0Q2hpbGQpaS5yZW1vdmVDaGlsZChpLmZpcnN0Q2hpbGQpO2k9cC5sYXN0Q2hpbGR9ZWxzZSBxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShnKSk7aSYmcC5yZW1vdmVDaGlsZChpKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcChlYShxLCJpbnB1dCIpLGlhKSxyPTA7d2hpbGUoZz1xW3IrK10paWYoZCYmbi5pbkFycmF5KGcsZCk+LTEpZSYmZS5wdXNoKGcpO2Vsc2UgaWYoaD1uLmNvbnRhaW5zKGcub3duZXJEb2N1bWVudCxnKSxpPWVhKHAuYXBwZW5kQ2hpbGQoZyksInNjcmlwdCIpLGgmJmZhKGkpLGMpe2Y9MDt3aGlsZShnPWlbZisrXSlfLnRlc3QoZy50eXBlfHwiIikmJmMucHVzaChnKX1yZXR1cm4gaT1udWxsLHB9IWZ1bmN0aW9uKCl7dmFyIGIsYyxlPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiXT1jIGluIGEpfHwoZS5zZXRBdHRyaWJ1dGUoYywidCIpLGxbYl09ZS5hdHRyaWJ1dGVzW2NdLmV4cGFuZG89PT0hMSk7ZT1udWxsfSgpO3ZhciBrYT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksbGE9L15rZXkvLG1hPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxuYT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sb2E9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHBhKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMX1mdW5jdGlvbiByYSgpe3RyeXtyZXR1cm4gZC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319ZnVuY3Rpb24gc2EoYSxiLGMsZCxlLGYpe3ZhciBnLGg7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXsic3RyaW5nIiE9dHlwZW9mIGMmJihkPWR8fGMsYz12b2lkIDApO2ZvcihoIGluIGIpc2EoYSxoLGMsZCxiW2hdLGYpO3JldHVybiBhfWlmKG51bGw9PWQmJm51bGw9PWU/KGU9YyxkPWM9dm9pZCAwKTpudWxsPT1lJiYoInN0cmluZyI9PXR5cGVvZiBjPyhlPWQsZD12b2lkIDApOihlPWQsZD1jLGM9dm9pZCAwKSksZT09PSExKWU9cWE7ZWxzZSBpZighZSlyZXR1cm4gYTtyZXR1cm4gMT09PWYmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1uLmd1aWQrKykpLGEuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYixlLGQsYyl9KX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygbnx8YSYmbi5ldmVudC50cmlnZ2VyZWQ9PT1hLnR5cGU/dm9pZCAwOm4uZXZlbnQuZGlzcGF0Y2guYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9LGsuZWxlbT1hKSxiPShifHwiIikubWF0Y2goRyl8fFsiIl0saD1iLmxlbmd0aDt3aGlsZShoLS0pZj1vYS5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChtPWdbb10pfHwobT1nW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsbCk6bS5wdXNoKGwpLG4uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9bi5oYXNEYXRhKGEpJiZuLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9b2EuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09a1tvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGk9Zj1tLmxlbmd0aDt3aGlsZShmLS0pZz1tW2ZdLCFlJiZxIT09Zy5vcmlnVHlwZXx8YyYmYy5ndWlkIT09Zy5ndWlkfHxoJiYhaC50ZXN0KGcubmFtZXNwYWNlKXx8ZCYmZCE9PWcuc2VsZWN0b3ImJigiKioiIT09ZHx8IWcuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxnLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGcpKTtpJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGtbb10pfWVsc2UgZm9yKG8gaW4gayluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChrKSYmKGRlbGV0ZSByLmhhbmRsZSxuLl9yZW1vdmVEYXRhKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGUsZil7dmFyIGcsaCxpLGosbCxtLG8scD1bZXx8ZF0scT1rLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ay5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaT1tPWU9ZXx8ZCwzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJiFuYS50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+LTEmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaD1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9Zj8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5ybmFtZXNwYWNlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1lKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxsPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZnx8IWwudHJpZ2dlcnx8bC50cmlnZ2VyLmFwcGx5KGUsYykhPT0hMSkpe2lmKCFmJiYhbC5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZSkpe2ZvcihqPWwuZGVsZWdhdGVUeXBlfHxxLG5hLnRlc3QoaitxKXx8KGk9aS5wYXJlbnROb2RlKTtpO2k9aS5wYXJlbnROb2RlKXAucHVzaChpKSxtPWk7bT09PShlLm93bmVyRG9jdW1lbnR8fGQpJiZwLnB1c2gobS5kZWZhdWx0Vmlld3x8bS5wYXJlbnRXaW5kb3d8fGEpfW89MDt3aGlsZSgoaT1wW28rK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1vPjE/ajpsLmJpbmRUeXBlfHxxLGc9KG4uX2RhdGEoaSwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZuLl9kYXRhKGksImhhbmRsZSIpLGcmJmcuYXBwbHkoaSxjKSxnPWgmJmlbaF0sZyYmZy5hcHBseSYmTShpKSYmKGIucmVzdWx0PWcuYXBwbHkoaSxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1xLCFmJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFsLl9kZWZhdWx0fHxsLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYyk9PT0hMSkmJk0oZSkmJmgmJmVbcV0mJiFuLmlzV2luZG93KGUpKXttPWVbaF0sbSYmKGVbaF09bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cTt0cnl7ZVtxXSgpfWNhdGNoKHMpe31uLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbSYmKGVbaF09bSl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShuLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1uLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1uLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGM9MDt3aGlsZSgoZz1mLmhhbmRsZXJzW2MrK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWEucm5hbWVzcGFjZSYmIWEucm5hbWVzcGFjZS50ZXN0KGcubmFtZXNwYWNlKXx8KGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxkPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1kJiYoYS5yZXN1bHQ9ZCk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8aXNOYU4oYS5idXR0b24pfHxhLmJ1dHRvbjwxKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+LTE6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW24uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxlLGY9YS50eXBlLGc9YSxoPXRoaXMuZml4SG9va3NbZl07aHx8KHRoaXMuZml4SG9va3NbZl09aD1tYS50ZXN0KGYpP3RoaXMubW91c2VIb29rczpsYS50ZXN0KGYpP3RoaXMua2V5SG9va3M6e30pLGU9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZyksYj1lLmxlbmd0aDt3aGlsZShiLS0pYz1lW2JdLGFbY109Z1tjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGQpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBkZXRhaWwgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGc9Yi5idXR0b24saD1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGQsZj1lLmRvY3VtZW50RWxlbWVudCxjPWUuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmgmJihhLnJlbGF0ZWRUYXJnZXQ9aD09PWEudGFyZ2V0P2IudG9FbGVtZW50OmgpLGEud2hpY2h8fHZvaWQgMD09PWd8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09cmEoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1yYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMH0pO24uZXZlbnQudHJpZ2dlcihkLG51bGwsYiksZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1kLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgYVtkXSYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/cGE6cWEpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bi5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6cWEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6cWEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6cWEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGEsYSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wYSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cGEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fG4uY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLGwuc3VibWl0fHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP24ucHJvcChiLCJmb3JtIik6dm9pZCAwO2MmJiFuLl9kYXRhKGMsInN1Ym1pdCIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdEJ1YmJsZT0hMH0pLG4uX2RhdGEoYywic3VibWl0IiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRCdWJibGUmJihkZWxldGUgYS5fc3VibWl0QnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZuLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxsLmNoYW5nZXx8KG4uZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIGthLnRlc3QodGhpcy5ub2RlTmFtZSk/KCJjaGVja2JveCIhPT10aGlzLnR5cGUmJiJyYWRpbyIhPT10aGlzLnR5cGV8fChuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdENoYW5nZWQ9ITApfSksbi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdENoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RDaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7a2EudGVzdChiLm5vZGVOYW1lKSYmIW4uX2RhdGEoYiwiY2hhbmdlIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEpfSksbi5fZGF0YShiLCJjaGFuZ2UiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFrYS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbnx8bi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbi5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW4uX2RhdGEoZCxiKS0xO2U/bi5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gc2EodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBzYSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9cWEpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIHRhPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csdWE9bmV3IFJlZ0V4cCgiPCg/OiIrYmErIilbXFxzLz5dIiwiaSIpLHZhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzotXSspW14+XSopXC8+L2dpLHdhPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLHhhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHlhPS9edHJ1ZVwvKC4qKS8semE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLEFhPWNhKGQpLEJhPUFhLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Z1bmN0aW9uIENhKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBEYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bi5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gRWEoYSl7dmFyIGI9eWEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBGYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZuLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW4uX2RhdGEoYSksZz1uLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyluLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW4uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBHYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWwubm9DbG9uZUV2ZW50JiZiW24uZXhwYW5kb10pe2U9bi5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyluLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobi5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oRGEoYikudGV4dD1hLnRleHQsRWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGwuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFuLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmWi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19ZnVuY3Rpb24gSGEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJnhhLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSxIYShmLGIsYyxkKX0pO2lmKG8mJihrPWphKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZT1rLmZpcnN0Q2hpbGQsMT09PWsuY2hpbGROb2Rlcy5sZW5ndGgmJihrPWUpLGV8fGQpKXtmb3IoaT1uLm1hcChlYShrLCJzY3JpcHQiKSxEYSksaD1pLmxlbmd0aDtvPm07bSsrKWc9ayxtIT09cCYmKGc9bi5jbG9uZShnLCEwLCEwKSxoJiZuLm1lcmdlKGksZWEoZywic2NyaXB0IikpKSxjLmNhbGwoYVttXSxnLG0pO2lmKGgpZm9yKGo9aVtpLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG4ubWFwKGksRWEpLG09MDtoPm07bSsrKWc9aVttXSxfLnRlc3QoZy50eXBlfHwiIikmJiFuLl9kYXRhKGcsImdsb2JhbEV2YWwiKSYmbi5jb250YWlucyhqLGcpJiYoZy5zcmM/bi5fZXZhbFVybCYmbi5fZXZhbFVybChnLnNyYyk6bi5nbG9iYWxFdmFsKChnLnRleHR8fGcudGV4dENvbnRlbnR8fGcuaW5uZXJIVE1MfHwiIikucmVwbGFjZSh6YSwiIikpKTtrPWU9bnVsbH1yZXR1cm4gYX1mdW5jdGlvbiBJYShhLGIsYyl7Zm9yKHZhciBkLGU9Yj9uLmZpbHRlcihiLGEpOmEsZj0wO251bGwhPShkPWVbZl0pO2YrKyljfHwxIT09ZC5ub2RlVHlwZXx8bi5jbGVhbkRhdGEoZWEoZCkpLGQucGFyZW50Tm9kZSYmKGMmJm4uY29udGFpbnMoZC5vd25lckRvY3VtZW50LGQpJiZmYShlYShkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHZhLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihsLmh0bWw1Q2xvbmV8fG4uaXNYTUxEb2MoYSl8fCF1YS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KEJhLmlubmVySFRNTD1hLm91dGVySFRNTCxCYS5yZW1vdmVDaGlsZChmPUJhLmZpcnN0Q2hpbGQpKSwhKGwubm9DbG9uZUV2ZW50JiZsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZD1lYShmKSxoPWVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmR2EoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8ZWEoYSksZD1kfHxlYShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUZhKGUsZFtnXSk7ZWxzZSBGYShhLGYpO3JldHVybiBkPWVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJmZhKGQsIWkmJmVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5hdHRyaWJ1dGVzLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8TShkKSkmJihmPWRbaV0sZz1mJiZqW2ZdKSl7aWYoZy5ldmVudHMpZm9yKGUgaW4gZy5ldmVudHMpbVtlXT9uLmV2ZW50LnJlbW92ZShkLGUpOm4ucmVtb3ZlRXZlbnQoZCxlLGcuaGFuZGxlKTtqW2ZdJiYoZGVsZXRlIGpbZl0sa3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZT9kW2ldPXZvaWQgMDpkLnJlbW92ZUF0dHJpYnV0ZShpKSxjLnB1c2goZikpfX19KSxuLmZuLmV4dGVuZCh7ZG9tTWFuaXA6SGEsZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBJYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIElhKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxkKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEhhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1DYSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUNhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm4uY2xlYW5EYXRhKGVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbi5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UodGEsIiIpOnZvaWQgMDtpZigic3RyaW5nIj09dHlwZW9mIGEmJiF3YS50ZXN0KGEpJiYobC5odG1sU2VyaWFsaXplfHwhdWEudGVzdChhKSkmJihsLmxlYWRpbmdXaGl0ZXNwYWNlfHwhYWEudGVzdChhKSkmJiFkYVsoJC5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1uLmh0bWxQcmVmaWx0ZXIoYSk7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEoZWEoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5wYXJlbnROb2RlO24uaW5BcnJheSh0aGlzLGEpPDAmJihuLmNsZWFuRGF0YShlYSh0aGlzKSksYyYmYy5yZXBsYWNlQ2hpbGQoYix0aGlzKSl9LGEpfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZj1uKGEpLGg9Zi5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihmW2RdKVtiXShjKSxnLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBKYSxLYT17SFRNTDoiYmxvY2siLEJPRFk6ImJsb2NrIn07ZnVuY3Rpb24gTGEoYSxiKXt2YXIgYz1uKGIuY3JlYXRlRWxlbWVudChhKSkuYXBwZW5kVG8oYi5ib2R5KSxkPW4uY3NzKGNbMF0sImRpc3BsYXkiKTtyZXR1cm4gYy5kZXRhY2goKSxkfWZ1bmN0aW9uIE1hKGEpe3ZhciBiPWQsYz1LYVthXTtyZXR1cm4gY3x8KGM9TGEoYSxiKSwibm9uZSIhPT1jJiZjfHwoSmE9KEphfHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPShKYVswXS5jb250ZW50V2luZG93fHxKYVswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1MYShhLGIpLEphLmRldGFjaCgpKSxLYVthXT1jKSxjfXZhciBOYT0vXm1hcmdpbi8sT2E9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxQYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX0sUWE9ZC5kb2N1bWVudEVsZW1lbnQ7IWZ1bmN0aW9uKCl7dmFyIGIsYyxlLGYsZyxoLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxqPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoai5zdHlsZSl7ai5zdHlsZS5jc3NUZXh0PSJmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLGwub3BhY2l0eT0iMC41Ij09PWouc3R5bGUub3BhY2l0eSxsLmNzc0Zsb2F0PSEhai5zdHlsZS5jc3NGbG9hdCxqLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsai5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGwuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1qLnN0eWxlLmJhY2tncm91bmRDbGlwLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixqLmlubmVySFRNTD0iIixpLmFwcGVuZENoaWxkKGopLGwuYm94U2l6aW5nPSIiPT09ai5zdHlsZS5ib3hTaXppbmd8fCIiPT09ai5zdHlsZS5Nb3pCb3hTaXppbmd8fCIiPT09ai5zdHlsZS5XZWJraXRCb3hTaXppbmcsbi5leHRlbmQobCx7cmVsaWFibGVIaWRkZW5PZmZzZXRzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxmfSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZX0scGl4ZWxNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksY30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksYn0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZ30scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxofX0pO2Z1bmN0aW9uIGsoKXt2YXIgayxsLG09ZC5kb2N1bWVudEVsZW1lbnQ7bS5hcHBlbmRDaGlsZChpKSxqLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7dG9wOjElO3dpZHRoOjUwJSIsYj1lPWg9ITEsYz1nPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9YS5nZXRDb21wdXRlZFN0eWxlKGopLGI9IjElIiE9PShsfHx7fSkudG9wLGg9IjJweCI9PT0obHx8e30pLm1hcmdpbkxlZnQsZT0iNHB4Ij09PShsfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxqLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGM9IjRweCI9PT0obHx8e21hcmdpblJpZ2h0OiI0cHgifSkubWFyZ2luUmlnaHQsaz1qLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGsuc3R5bGUuY3NzVGV4dD1qLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsay5zdHlsZS5tYXJnaW5SaWdodD1rLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShrKXx8e30pLm1hcmdpblJpZ2h0KSxqLnJlbW92ZUNoaWxkKGspKSxqLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWouZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsZiYmKGouc3R5bGUuZGlzcGxheT0iIixqLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsai5jaGlsZE5vZGVzWzBdLnN0eWxlLmJvcmRlckNvbGxhcHNlPSJzZXBhcmF0ZSIsaz1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGtbMF0uc3R5bGUuY3NzVGV4dD0ibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZSIsZj0wPT09a1swXS5vZmZzZXRIZWlnaHQsZiYmKGtbMF0uc3R5bGUuZGlzcGxheT0iIixrWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWtbMF0ub2Zmc2V0SGVpZ2h0KSksbS5yZW1vdmVDaGlsZChpKX19fSgpO3ZhciBSYSxTYSxUYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhSYT1mdW5jdGlvbihiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGMmJmMub3BlbmVyfHwoYz1hKSxjLmdldENvbXB1dGVkU3R5bGUoYil9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2MuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXTp2b2lkIDAsIiIhPT1nJiZ2b2lkIDAhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxjJiYhbC5waXhlbE1hcmdpblJpZ2h0KCkmJk9hLnRlc3QoZykmJk5hLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9Ziksdm9pZCAwPT09Zz9nOmcrIiJ9KTpRYS5jdXJyZW50U3R5bGUmJihSYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jdXJyZW50U3R5bGV9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2NbYl06dm9pZCAwLG51bGw9PWcmJmgmJmhbYl0mJihnPWhbYl0pLE9hLnRlc3QoZykmJiFUYS50ZXN0KGIpJiYoZD1oLmxlZnQsZT1hLnJ1bnRpbWVTdHlsZSxmPWUmJmUubGVmdCxmJiYoZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGgubGVmdD0iZm9udFNpemUiPT09Yj8iMWVtIjpnLGc9aC5waXhlbExlZnQrInB4IixoLmxlZnQ9ZCxmJiYoZS5sZWZ0PWYpKSx2b2lkIDA9PT1nP2c6ZysiInx8ImF1dG8ifSk7ZnVuY3Rpb24gVWEoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19dmFyIFZhPS9hbHBoYVwoW14pXSpcKS9pLFdhPS9vcGFjaXR5XHMqPVxzKihbXildKikvaSxYYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sWWE9bmV3IFJlZ0V4cCgiXigiK1QrIikoLiopJCIsImkiKSxaYT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sJGE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LF9hPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sYWI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBiYihhKXtpZihhIGluIGFiKXJldHVybiBhO3ZhciBiPWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPV9hLmxlbmd0aDt3aGlsZShjLS0paWYoYT1fYVtjXStiLGEgaW4gYWIpcmV0dXJuIGF9ZnVuY3Rpb24gY2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlcoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsTWEoZC5ub2RlTmFtZSkpKSk6KGU9VyhkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIGRiKGEsYixjKXt2YXIgZD1ZYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIGViKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVltmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gZmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPVJhKGEpLGc9bC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1TYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLE9hLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYobC5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK2ViKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPVNhKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1iYihoKXx8aCksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWMpcmV0dXJuIGcmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdO2lmKGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1VLmV4ZWMoYykpJiZlWzFdJiYoYz1YKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChuLmNzc051bWJlcltoXT8iIjoicHgiKSksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPWJiKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZj1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1mJiYoZj1TYShhLGIsZCkpLCJub3JtYWwiPT09ZiYmYiBpbiAkYSYmKGY9JGFbYl0pLCIiPT09Y3x8Yz8oZT1wYXJzZUZsb2F0KGYpLGM9PT0hMHx8aXNGaW5pdGUoZSk/ZXx8MDpmKTpmfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP1hhLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/UGEoYSxaYSxmdW5jdGlvbigpe3JldHVybiBmYihhLGIsZCl9KTpmYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJlJhKGEpO3JldHVybiBkYihhLGMsZD9lYihhLGIsZCxsLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbC5vcGFjaXR5fHwobi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gV2EudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW4uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1uLnRyaW0oZi5yZXBsYWNlKFZhLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPVZhLnRlc3QoZik/Zi5yZXBsYWNlKFZhLGUpOmYrIiAiK2UpfX0pLG4uY3NzSG9va3MubWFyZ2luUmlnaHQ9VWEobC5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/UGEoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sU2EsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uY3NzSG9va3MubWFyZ2luTGVmdD1VYShsLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihhLGIpe3JldHVybiBiPyhwYXJzZUZsb2F0KFNhKGEsIm1hcmdpbkxlZnQiKSl8fChuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtUGEoYSx7Cm1hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSk6MCkpKyJweCI6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxOYS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1kYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPVJhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGdiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1nYixnYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fG4uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWdiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpnYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1nYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmdiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGdiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1nYi5wcm90b3R5cGUsZ2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiAxIT09YS5lbGVtLm5vZGVUeXBlfHxudWxsIT1hLmVsZW1bYS5wcm9wXSYmbnVsbD09YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtW2EucHJvcF06KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6MSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbD09YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV0mJiFuLmNzc0hvb2tzW2EucHJvcF0/YS5lbGVtW2EucHJvcF09YS5ub3c6bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCl9fX0sZ2IucHJvcEhvb2tzLnNjcm9sbFRvcD1nYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LG4uZng9Z2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBoYixpYixqYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sa2I9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBsYigpe3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoYj12b2lkIDB9KSxoYj1uLm5vdygpfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VltlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIG5iKGEsYixjKXtmb3IodmFyIGQsZT0ocWIudHdlZW5lcnNbYl18fFtdKS5jb25jYXQocWIudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gb2IoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVyhhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP24uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxNYShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1NYShhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGpiLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP01hKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW4uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP24oYSkuc2hvdygpOm0uZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbS5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bi5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW4uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPW5iKHE/cltkXTowLGQsbSksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBxYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1xYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWhifHxsYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmhifHxsYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihwYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9cWIucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLG5iLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQocWIse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBYKGMuZWxlbSxhLFUuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLHFiLnR3ZWVuZXJzW2NdPXFiLnR3ZWVuZXJzW2NdfHxbXSxxYi50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltvYl0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9xYi5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6cWIucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihXKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9cWIodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8bi5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9bi5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZrYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1uLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobWIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOm1iKCJzaG93Iiksc2xpZGVVcDptYigiaGlkZSIpLHNsaWRlVG9nZ2xlOm1iKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW4udGltZXJzLGM9MDtmb3IoaGI9bi5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxuLmZ4LnN0b3AoKSxoYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpYnx8KGliPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKGliKSxpYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGY9ZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94IiksYy5hcHBlbmRDaGlsZChiKSxhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGwuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWMuY2xhc3NOYW1lLGwuc3R5bGU9L3RvcC8udGVzdChhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksbC5ocmVmTm9ybWFsaXplZD0iL2EiPT09YS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxsLmNoZWNrT249ISFiLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Zi5zZWxlY3RlZCxsLmVuY3R5cGU9ISFkLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGUuZGlzYWJsZWQ9ITAsbC5vcHREaXNhYmxlZD0hZi5kaXNhYmxlZCxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxsLmlucHV0PSIiPT09Yi5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYi52YWx1ZT0idCIsYi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGwucmFkaW9WYWx1ZT0idCI9PT1iLnZhbHVlfSgpO3ZhciByYj0vXHIvZyxzYj0vW1x4MjBcdFxyXG5cZl0rL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKHJiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKS5yZXBsYWNlKHNiLCIgIil9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwoYy5zZWxlY3RlZHx8aT09PWUpJiYobC5vcHREaXNhYmxlZD8hYy5kaXNhYmxlZDpudWxsPT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpJiYoIWMucGFyZW50Tm9kZS5kaXNhYmxlZHx8IW4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG4uaW5BcnJheShuLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+LTEpdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT4tMTp2b2lkIDB9fSxsLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIHRiLHViLHZiPW4uZXhwci5hdHRySGFuZGxlLHdiPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kseGI9bC5nZXRTZXRBdHRyaWJ1dGUseWI9bC5pbnB1dDtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBZKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZigzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxlPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT91Yjp0YikpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/eWImJnhifHwhd2IudGVzdChjKT9hW2RdPSExOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTpuLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh4Yj9jOmQpfX0pLHViPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6eWImJnhifHwhd2IudGVzdChjKT9hLnNldEF0dHJpYnV0ZSgheGImJm4ucHJvcEZpeFtjXXx8YyxjKTphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPXZiW2JdfHxuLmZpbmQuYXR0cjt5YiYmeGJ8fCF3Yi50ZXN0KGIpP3ZiW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj12YltiXSx2YltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsdmJbYl09ZiksZX06dmJbYl09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHliJiZ4Ynx8KG4uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTp0YiYmdGIuc2V0KGEsYixjKX19KSx4Ynx8KHRiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sdmIuaWQ9dmIubmFtZT12Yi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxuLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0OnRiLnNldH0sbi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3RiLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe24uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxsLnN0eWxlfHwobi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksQWI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bi5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTp6Yi50ZXN0KGEubm9kZU5hbWUpfHxBYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGwuZW5jdHlwZXx8KG4ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciBCYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIENiKGEpe3JldHVybiBuLmF0dHIoYSwiY2xhc3MiKXx8IiJ9bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk9MDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsQ2IodGhpcykpKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKWQuaW5kZXhPZigiICIrZisiICIpPDAmJihkKz1mKyIgIik7aD1uLnRyaW0oZCksZSE9PWgmJm4uYXR0cihjLCJjbGFzcyIsaCl9fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLENiKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZisiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitmKyIgIiwiICIpO2g9bi50cmltKGQpLGUhPT1oJiZuLmF0dHIoYywiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6bi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsQ2IodGhpcyksYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixkLGUsZjtpZigic3RyaW5nIj09PWMpe2Q9MCxlPW4odGhpcyksZj1hLm1hdGNoKEcpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlIHZvaWQgMCE9PWEmJiJib29sZWFuIiE9PWN8fChiPUNiKHRoaXMpLGImJm4uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsYiksbi5hdHRyKHRoaXMsImNsYXNzIixifHxhPT09ITE/IiI6bi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPTA7Yj0iICIrYSsiICI7d2hpbGUoYz10aGlzW2QrK10paWYoMT09PWMubm9kZVR5cGUmJigiICIrQ2IoYykrIiAiKS5yZXBsYWNlKEJiLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIERiPWEubG9jYXRpb24sRWI9bi5ub3coKSxGYj0vXD8vLEdiPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bi5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1uLnRyaW0oYisiIik7cmV0dXJuIGUmJiFuLnRyaW0oZS5yZXBsYWNlKEdiLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm4uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBhLkRPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIEhiPS8jLiokLyxJYj0vKFs/Jl0pXz1bXiZdKi8sSmI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxLYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxMYj0vXig/OkdFVHxIRUFEKSQvLE1iPS9eXC9cLy8sTmI9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sT2I9e30sUGI9e30sUWI9IiovIi5jb25jYXQoIioiKSxSYj1EYi5ocmVmLFNiPU5iLmV4ZWMoUmIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIFRiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEcpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gVWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09UGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBWYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gWGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6UmIsdHlwZToiR0VUIixpc0xvY2FsOktiLnRlc3QoU2JbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UWIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bi5wYXJzZUpTT04sInRleHQgeG1sIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9WYihWYihhLG4uYWpheFNldHRpbmdzKSxiKTpWYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpUYihPYiksYWpheFRyYW5zcG9ydDpUYihQYiksYWpheDpmdW5jdGlvbihiLGMpeyJvYmplY3QiPT10eXBlb2YgYiYmKGM9YixiPXZvaWQgMCksYz1jfHx7fTt2YXIgZCxlLGYsZyxoLGksaixrLGw9bi5hamF4U2V0dXAoe30sYyksbT1sLmNvbnRleHR8fGwsbz1sLmNvbnRleHQmJihtLm5vZGVUeXBlfHxtLmpxdWVyeSk/bihtKTpuLmV2ZW50LHA9bi5EZWZlcnJlZCgpLHE9bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHM9e30sdD17fSx1PTAsdj0iY2FuY2VsZWQiLHc9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dSl7aWYoIWspe2s9e307d2hpbGUoYj1KYi5leGVjKGcpKWtbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9a1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT11P2c6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdXx8KGE9dFtjXT10W2NdfHxhLHNbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdXx8KGwubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dSlmb3IoYiBpbiBhKXJbYl09W3JbYl0sYVtiXV07ZWxzZSB3LmFsd2F5cyhhW3cuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHY7cmV0dXJuIGomJmouYWJvcnQoYikseSgwLGIpLHRoaXN9fTtpZihwLnByb21pc2UodykuY29tcGxldGU9cS5hZGQsdy5zdWNjZXNzPXcuZG9uZSx3LmVycm9yPXcuZmFpbCxsLnVybD0oKGJ8fGwudXJsfHxSYikrIiIpLnJlcGxhY2UoSGIsIiIpLnJlcGxhY2UoTWIsU2JbMV0rIi8vIiksbC50eXBlPWMubWV0aG9kfHxjLnR5cGV8fGwubWV0aG9kfHxsLnR5cGUsbC5kYXRhVHlwZXM9bi50cmltKGwuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8WyIiXSxudWxsPT1sLmNyb3NzRG9tYWluJiYoZD1OYi5leGVjKGwudXJsLnRvTG93ZXJDYXNlKCkpLGwuY3Jvc3NEb21haW49ISghZHx8ZFsxXT09PVNiWzFdJiZkWzJdPT09U2JbMl0mJihkWzNdfHwoImh0dHA6Ij09PWRbMV0/IjgwIjoiNDQzIikpPT09KFNiWzNdfHwoImh0dHA6Ij09PVNiWzFdPyI4MCI6IjQ0MyIpKSkpLGwuZGF0YSYmbC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBsLmRhdGEmJihsLmRhdGE9bi5wYXJhbShsLmRhdGEsbC50cmFkaXRpb25hbCkpLFViKE9iLGwsYyx3KSwyPT09dSlyZXR1cm4gdztpPW4uZXZlbnQmJmwuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGwudHlwZT1sLnR5cGUudG9VcHBlckNhc2UoKSxsLmhhc0NvbnRlbnQ9IUxiLnRlc3QobC50eXBlKSxmPWwudXJsLGwuaGFzQ29udGVudHx8KGwuZGF0YSYmKGY9bC51cmwrPShGYi50ZXN0KGYpPyImIjoiPyIpK2wuZGF0YSxkZWxldGUgbC5kYXRhKSxsLmNhY2hlPT09ITEmJihsLnVybD1JYi50ZXN0KGYpP2YucmVwbGFjZShJYiwiJDFfPSIrRWIrKyk6ZisoRmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0ViKyspKSxsLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbi5sYXN0TW9kaWZpZWRbZl0pLG4uZXRhZ1tmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixuLmV0YWdbZl0pKSwobC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJncuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSx3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsbC5kYXRhVHlwZXNbMF0mJmwuYWNjZXB0c1tsLmRhdGFUeXBlc1swXV0/bC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXSsoIioiIT09bC5kYXRhVHlwZXNbMF0/IiwgIitRYisiOyBxPTAuMDEiOiIiKTpsLmFjY2VwdHNbIioiXSk7Zm9yKGUgaW4gbC5oZWFkZXJzKXcuc2V0UmVxdWVzdEhlYWRlcihlLGwuaGVhZGVyc1tlXSk7aWYobC5iZWZvcmVTZW5kJiYobC5iZWZvcmVTZW5kLmNhbGwobSx3LGwpPT09ITF8fDI9PT11KSlyZXR1cm4gdy5hYm9ydCgpO3Y9ImFib3J0Ijtmb3IoZSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl3W2VdKGxbZV0pO2lmKGo9VWIoUGIsbCxjLHcpKXtpZih3LnJlYWR5U3RhdGU9MSxpJiZvLnRyaWdnZXIoImFqYXhTZW5kIixbdyxsXSksMj09PXUpcmV0dXJuIHc7bC5hc3luYyYmbC50aW1lb3V0PjAmJihoPWEuc2V0VGltZW91dChmdW5jdGlvbigpe3cuYWJvcnQoInRpbWVvdXQiKX0sbC50aW1lb3V0KSk7dHJ5e3U9MSxqLnNlbmQocyx5KX1jYXRjaCh4KXtpZighKDI+dSkpdGhyb3cgeDt5KC0xLHgpfX1lbHNlIHkoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHkoYixjLGQsZSl7dmFyIGsscyx0LHYseCx5PWM7MiE9PXUmJih1PTIsaCYmYS5jbGVhclRpbWVvdXQoaCksaj12b2lkIDAsZz1lfHwiIix3LnJlYWR5U3RhdGU9Yj4wPzQ6MCxrPWI+PTIwMCYmMzAwPmJ8fDMwND09PWIsZCYmKHY9V2IobCx3LGQpKSx2PVhiKGwsdix3LGspLGs/KGwuaWZNb2RpZmllZCYmKHg9dy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHgmJihuLmxhc3RNb2RpZmllZFtmXT14KSx4PXcuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx4JiYobi5ldGFnW2ZdPXgpKSwyMDQ9PT1ifHwiSEVBRCI9PT1sLnR5cGU/eT0ibm9jb250ZW50IjozMDQ9PT1iP3k9Im5vdG1vZGlmaWVkIjooeT12LnN0YXRlLHM9di5kYXRhLHQ9di5lcnJvcixrPSF0KSk6KHQ9eSwhYiYmeXx8KHk9ImVycm9yIiwwPmImJihiPTApKSksdy5zdGF0dXM9Yix3LnN0YXR1c1RleHQ9KGN8fHkpKyIiLGs/cC5yZXNvbHZlV2l0aChtLFtzLHksd10pOnAucmVqZWN0V2l0aChtLFt3LHksdF0pLHcuc3RhdHVzQ29kZShyKSxyPXZvaWQgMCxpJiZvLnRyaWdnZXIoaz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt3LGwsaz9zOnRdKSxxLmZpcmVXaXRoKG0sW3cseV0pLGkmJihvLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3csbF0pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB3fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheChuLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sbi5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTtmdW5jdGlvbiBZYihhKXtyZXR1cm4gYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5Iil9ZnVuY3Rpb24gWmIoYSl7aWYoIW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50fHxkLGEpKXJldHVybiEwO3doaWxlKGEmJjE9PT1hLm5vZGVUeXBlKXtpZigibm9uZSI9PT1ZYihhKXx8ImhpZGRlbiI9PT1hLnR5cGUpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9bi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpP2Eub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wJiYhYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDpaYihhKX0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgJGI9LyUyMC9nLF9iPS9cW1xdJC8sYWM9L1xyP1xuL2csYmM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBkYyhhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxfYi50ZXN0KGEpP2QoYSxlKTpkYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpZGMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlkYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSgkYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmY2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIWJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFaLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYWMsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGFjLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWw/aWMoKTpkLmRvY3VtZW50TW9kZT44P2hjKCk6L14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmaGMoKXx8aWMoKX06aGM7dmFyIGVjPTAsZmM9e30sZ2M9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGZjKWZjW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFnYyYmIndpdGhDcmVkZW50aWFscyJpbiBnYyxnYz1sLmFqYXg9ISFnYyxnYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGIpe2lmKCFiLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7dmFyIGYsZz1iLnhocigpLGg9KytlYztpZihnLm9wZW4oYi50eXBlLGIudXJsLGIuYXN5bmMsYi51c2VybmFtZSxiLnBhc3N3b3JkKSxiLnhockZpZWxkcylmb3IoZiBpbiBiLnhockZpZWxkcylnW2ZdPWIueGhyRmllbGRzW2ZdO2IubWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZSYmZy5vdmVycmlkZU1pbWVUeXBlKGIubWltZVR5cGUpLGIuY3Jvc3NEb21haW58fGRbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGRbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZiBpbiBkKXZvaWQgMCE9PWRbZl0mJmcuc2V0UmVxdWVzdEhlYWRlcihmLGRbZl0rIiIpO2cuc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCksYz1mdW5jdGlvbihhLGQpe3ZhciBmLGksajtpZihjJiYoZHx8ND09PWcucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIGZjW2hdLGM9dm9pZCAwLGcub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxkKTQhPT1nLnJlYWR5U3RhdGUmJmcuYWJvcnQoKTtlbHNle2o9e30sZj1nLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGcucmVzcG9uc2VUZXh0JiYoai50ZXh0PWcucmVzcG9uc2VUZXh0KTt0cnl7aT1nLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1mfHwhYi5pc0xvY2FsfHxiLmNyb3NzRG9tYWluPzEyMjM9PT1mJiYoZj0yMDQpOmY9ai50ZXh0PzIwMDo0MDR9aiYmZShmLGksaixnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYi5hc3luYz80PT09Zy5yZWFkeVN0YXRlP2Euc2V0VGltZW91dChjKTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mY1toXT1jOmMoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBoYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBpYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPWQuaGVhZHx8bigiaGVhZCIpWzBdfHxkLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGYpe2I9ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxmKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgamM9W10sa2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9amMucG9wKCl8fG4uZXhwYW5kbysiXyIrRWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGtjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYma2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGtjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShGYi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1mP24oYSkucmVtb3ZlUHJvcChlKTphW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssamMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGQ7dmFyIGU9eC5leGVjKGEpLGY9IWMmJltdO3JldHVybiBlP1tiLmNyZWF0ZUVsZW1lbnQoZVsxXSldOihlPWphKFthXSxiLGYpLGYmJmYubGVuZ3RoJiZuKGYpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9O3ZhciBsYz1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmxjKXJldHVybiBsYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPi0xJiYoZD1uLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG4uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07ZnVuY3Rpb24gbWMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZuLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLG4uZXh0ZW5kKHt9LGgpKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8oInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1tYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxRYX0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO24uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9bWMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bihmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bihmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT1VYShsLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1TYShhLGIpLE9hLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7CnBhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pLG4uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbi5mbi5hbmRTZWxmPW4uZm4uYWRkQmFjaywiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBuYz1hLmpRdWVyeSxvYz1hLiQ7cmV0dXJuIG4ubm9Db25mbGljdD1mdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09biYmKGEuJD1vYyksYiYmYS5qUXVlcnk9PT1uJiYoYS5qUXVlcnk9bmMpLG59LGJ8fChhLmpRdWVyeT1hLiQ9biksbn0pOwo="}]},{"name":"去百度搜索置顶推广 (ECMA6)","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["*www.baidu.com*","*zhidao.baidu.com/search*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["*"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null}},"storage":{"ts":1637743710463,"data":{}},"enabled":true,"position":13,"file_url":"https://greasyfork.org/scripts/10019-%E5%8E%BB%E7%99%BE%E5%BA%A6%E6%90%9C%E7%B4%A2%E7%BD%AE%E9%A1%B6%E6%8E%A8%E5%B9%BF-ecma6/code/%E5%8E%BB%E7%99%BE%E5%BA%A6%E6%90%9C%E7%B4%A2%E7%BD%AE%E9%A1%B6%E6%8E%A8%E5%B9%BF%20(ECMA6).user.js","uuid":"7c887cdd-ad10-4d28-94d3-3875a2bd45ca","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIOWOu+eZvuW6puaQnOe0oue9rumhtuaOqOW5vyAoRUNNQTYpCi8vIEBhdXRob3IgICAgICAgICAgICBheGV0cm95Ci8vIEBjb250cmlidXRvciAgICAgICBheGV0cm95Ci8vIEBkZXNjcmlwdGlvbiAgICAgICDljrvpmaTmj5LlhaXlnKjnmb7luqbmkJzntKLnu5PmnpzlpLTpg6jjgIHlsL7pg6jnmoTmjqjlub/pk77mjqXjgIIKLy8gQHZlcnNpb24gICAgICAgICAgIDIwMTYuNi40Ci8vIEBncmFudCAgICAgICAgICAgICBub25lCi8vIEBpbmNsdWRlICAgICAgICAgICAqd3d3LmJhaWR1LmNvbSoKLy8gQGluY2x1ZGUgICAgICAgICAgICp6aGlkYW8uYmFpZHUuY29tL3NlYXJjaCoKLy8gQGNvbm5lY3QgICAgICAgICAgICoKLy8gQHN1cHBvcnRVUkwgICAgICAgIGh0dHA6Ly93d3cuYnVybmluZ2FsbC5jb20KLy8gQGNvbXBhdGlibGUgICAgICAgIGNocm9tZSAg5a6M576O6L+Q6KGMCi8vIEBjb21wYXRpYmxlICAgICAgICBmaXJlZm94ICDlroznvo7ov5DooYwKLy8gQHJ1bi1hdCAgICAgICAgICAgIGRvY3VtZW50LXN0YXJ0Ci8vIEBjb250cmlidXRpb25VUkwgICB0cm95NDUwNDA5NDA1QGdtYWlsLmNvbXxhbGlwYXkuY29tCi8vIEBuYW1lc3BhY2UgICAgICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3VzZXJzLzM0MDAtYXhldHJveQovLyBAbGljZW5zZSAgICAgICAgICAgVGhlIE1JVCBMaWNlbnNlIChNSVQpOyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi8vID09L1VzZXJTY3JpcHQ9PQoKLyoKCiBHaXRodWLmupDnoIE6aHR0cHM6Ly9naXRodWIuY29tL2F4ZXRyb3kvR01zY3JpcHQKCiAqLwovKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlCi8qKioqKiovIAl2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9OwoKLyoqKioqKi8gCS8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCi8qKioqKiovIAlmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CgovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQovKioqKioqLyAJCWlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKQovKioqKioqLyAJCQlyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0czsKCi8qKioqKiovIAkJLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSkKLyoqKioqKi8gCQl2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7Ci8qKioqKiovIAkJCWV4cG9ydHM6IHt9LAovKioqKioqLyAJCQlpZDogbW9kdWxlSWQsCi8qKioqKiovIAkJCWxvYWRlZDogZmFsc2UKLyoqKioqKi8gCQl9OwoKLyoqKioqKi8gCQkvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb24KLyoqKioqKi8gCQltb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTsKCi8qKioqKiovIAkJLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAovKioqKioqLyAJCW1vZHVsZS5sb2FkZWQgPSB0cnVlOwoKLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQovKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKLyoqKioqKi8gCX0KCgovKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXykKLyoqKioqKi8gCV9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7CgovKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCV9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7CgovKioqKioqLyAJLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KLyoqKioqKi8gCV9fd2VicGFja19yZXF1aXJlX18ucCA9ICIiOwoKLyoqKioqKi8gCS8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0cwovKioqKioqLyAJcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7Ci8qKioqKiovIH0pCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKiovIChbCi8qIDAgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfanFMaXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKCgl2YXIgX2pxTGl0ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qcUxpdGUpOwoKCXZhciBfJGludGVydmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSk7CgoJdmFyIF8kaW50ZXJ2YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfJGludGVydmFsKTsKCgl2YXIgX21haW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2KTsKCgl2YXIgX21haW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbWFpbik7CgoJZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KCgl2YXIgbG9vcCA9ICgwLCBfJGludGVydmFsMi5kZWZhdWx0KShmdW5jdGlvbiAoKSB7CgkgIG5ldyBfbWFpbjIuZGVmYXVsdCgpLmZpbHRlcigpLnR1cm4oKTsKCX0sIDUwKTsKCgkvLyBpbml0CgkoMCwgX2pxTGl0ZTIuZGVmYXVsdCkoZnVuY3Rpb24gKCkgewoJICBuZXcgX21haW4yLmRlZmF1bHQoKS5maWx0ZXIoKS50dXJuKCk7CgkgIF8kaW50ZXJ2YWwyLmRlZmF1bHQuY2FuY2VsKGxvb3ApOwoJICAoMCwgX2pxTGl0ZTIuZGVmYXVsdCkoZG9jdW1lbnQpLm9ic2VydmUoZnVuY3Rpb24gKCkgewoJICAgIHJldHVybiBuZXcgX21haW4yLmRlZmF1bHQoKS5maWx0ZXIoKS50dXJuKCk7CgkgIH0pOwoJICBjb25zb2xlLmluZm8oJ+WOu+W5v+WRiuWQr+WKqC4uLicpOwoJfSk7CgovKioqLyB9LAovKiAxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgkvLyBlczYgQXJyYXkuZnJvbQoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKCSAgdmFsdWU6IHRydWUKCX0pOwoKCXZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsKCgl2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTsKCS8vIGVzNiBPYmplY3QuYXNzaWduCgoKCV9fd2VicGFja19yZXF1aXJlX18oMik7CgoJX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7CgoJZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CgoJdmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKHgpIHsKCSAgcmV0dXJuIHg7Cgl9OwoKCXZhciBqcUxpdGUgPSBmdW5jdGlvbiAoKSB7CgkgIGZ1bmN0aW9uIGpxTGl0ZSgpIHsKCSAgICB2YXIgX3RoaXMgPSB0aGlzOwoKCSAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gJycgOiBhcmd1bWVudHNbMF07CgkgICAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBkb2N1bWVudCA6IGFyZ3VtZW50c1sxXTsKCgkgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIGpxTGl0ZSk7CgoJICAgIHRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOwoJICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CgkgICAgdGhpcy5sZW5ndGggPSAwOwoKCSAgICBzd2l0Y2ggKHR5cGVvZiBzZWxlY3RvcnMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHNlbGVjdG9ycykpIHsKCSAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6CgkgICAgICAgIGJyZWFrOwoJICAgICAgY2FzZSAnc3RyaW5nJzoKCSAgICAgICAgQXJyYXkuZnJvbShjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKSwgZnVuY3Rpb24gKGVsZSwgaSkgewoJICAgICAgICAgIF90aGlzW2ldID0gZWxlOwoJICAgICAgICAgIF90aGlzLmxlbmd0aCsrOwoJICAgICAgICB9LCB0aGlzKTsKCSAgICAgICAgYnJlYWs7CgkgICAgICBjYXNlICdvYmplY3QnOgoJICAgICAgICBpZiAoc2VsZWN0b3JzLmxlbmd0aCkgewoJICAgICAgICAgIEFycmF5LmZyb20oc2VsZWN0b3JzLCBmdW5jdGlvbiAoZWxlLCBpKSB7CgkgICAgICAgICAgICBfdGhpc1tpXSA9IGVsZTsKCSAgICAgICAgICAgIF90aGlzLmxlbmd0aCsrOwoJICAgICAgICAgIH0sIHRoaXMpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHRoaXNbMF0gPSBzZWxlY3RvcnM7CgkgICAgICAgICAgdGhpcy5sZW5ndGggPSAxOwoJICAgICAgICB9CgkgICAgICAgIGJyZWFrOwoJICAgICAgY2FzZSAnZnVuY3Rpb24nOgoJICAgICAgICB0aGlzLnJlYWR5KHNlbGVjdG9ycyk7CgkgICAgICAgIGJyZWFrOwoJICAgICAgZGVmYXVsdDoKCgkgICAgfQoJICB9CgoJICBfY3JlYXRlQ2xhc3MoanFMaXRlLCBbewoJICAgIGtleTogJ2VxJywKCSAgICB2YWx1ZTogZnVuY3Rpb24gZXEoKSB7CgkgICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07CgoJICAgICAgcmV0dXJuIG5ldyBqcUxpdGUodGhpc1tuXSk7CgkgICAgfQoJICB9LCB7CgkgICAga2V5OiAnZmluZCcsCgkgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoc2VsZWN0b3JzKSB7CgkgICAgICByZXR1cm4gbmV3IGpxTGl0ZShzZWxlY3RvcnMsIHRoaXNbMF0pOwoJICAgIH0KCSAgfSwgewoJICAgIGtleTogJ2VhY2gnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiBlYWNoKCkgewoJICAgICAgdmFyIGZuID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gbm9vcCA6IGFyZ3VtZW50c1swXTsKCgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgZm4uY2FsbCh0aGlzLCB0aGlzW2ldLCBpKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiB0aGlzOwoJICAgIH0KCSAgfSwgewoJICAgIGtleTogJ2JpbmQnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiBiaW5kKCkgewoJICAgICAgdmFyIHR5cGVzID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gJycgOiBhcmd1bWVudHNbMF07CgkgICAgICB2YXIgZm4gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBub29wIDogYXJndW1lbnRzWzFdOwoKCSAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgIHR5cGVzLnRyaW0oKS5zcGxpdCgvXHN7MSx9LykuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewoJICAgICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmN0aW9uIChlKSB7CgkgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50OwoJICAgICAgICAgICAgaWYgKGZuLmNhbGwodGFyZ2V0LCBlKSA9PT0gZmFsc2UpIHsKCSAgICAgICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IHRydWU7CgkgICAgICAgICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCSAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCAmJiBlLnByZXZlbnREZWZhdWx0KCk7CgkgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uICYmIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgkgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICB9LCBmYWxzZSk7CgkgICAgICAgIH0pOwoJICAgICAgfSk7CgkgICAgfQoJICB9LCB7CgkgICAga2V5OiAnY2xpY2snLAoJICAgIHZhbHVlOiBmdW5jdGlvbiBjbGljaygpIHsKCSAgICAgIHZhciBmbiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IG5vb3AgOiBhcmd1bWVudHNbMF07CgoJICAgICAgdGhpcy5iaW5kKCdjbGljaycsIGZuKTsKCSAgICAgIHJldHVybiB0aGlzOwoJICAgIH0KCSAgfSwgewoJICAgIGtleTogJ3JlYWR5JywKCSAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZHkoKSB7CgkgICAgICB2YXIgX3RoaXMyID0gdGhpczsKCgkgICAgICB2YXIgZm4gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyBub29wIDogYXJndW1lbnRzWzBdOwoKCSAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKGUpIHsKCSAgICAgICAgZm4uY2FsbChfdGhpczIsIGUpOwoJICAgICAgfSwgZmFsc2UpOwoJICAgIH0KCSAgfSwgewoJICAgIGtleTogJ29ic2VydmUnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiBvYnNlcnZlKCkgewoJICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CgoJICAgICAgdmFyIGZuID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gbm9vcCA6IGFyZ3VtZW50c1swXTsKCSAgICAgIHZhciBjb25maWcgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9IDogYXJndW1lbnRzWzFdOwoKCSAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgIHZhciBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93Lk1vek11dGF0aW9uT2JzZXJ2ZXI7CgkgICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHsKCSAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHsKCSAgICAgICAgICAgIGZuLmNhbGwoX3RoaXMzLCBtdXRhdGlvbi50YXJnZXQsIG11dGF0aW9uLmFkZGVkTm9kZXMsIG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CgkgICAgICAgICAgfSk7CgkgICAgICAgIH0pOwoJICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVsZSwgY29uZmlnKTsKCSAgICAgIH0pOwoJICAgICAgcmV0dXJuIHRoaXM7CgkgICAgfQoJICB9LCB7CgkgICAga2V5OiAnYXR0cicsCgkgICAgdmFsdWU6IGZ1bmN0aW9uIChfYXR0cikgewoJICAgICAgZnVuY3Rpb24gYXR0cihfeCwgX3gyKSB7CgkgICAgICAgIHJldHVybiBfYXR0ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJICAgICAgfQoKCSAgICAgIGF0dHIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiBfYXR0ci50b1N0cmluZygpOwoJICAgICAgfTsKCgkgICAgICByZXR1cm4gYXR0cjsKCSAgICB9KGZ1bmN0aW9uIChhdHRyLCB2YWx1ZSkgewoJICAgICAgLy8gb25lIGFnbQoJICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgLy8gZ2V0IGF0dHIgdmFsdWUKCSAgICAgICAgaWYgKHR5cGVvZiBhdHRyID09PSAnc3RyaW5nJykgewoJICAgICAgICAgIHJldHVybiB0aGlzWzBdLmdldEF0dHJpYnV0ZShhdHRyKTsKCSAgICAgICAgfQoJICAgICAgICAvLyBzZXQgYXR0ciB3aXRoIGEganNvbgoJICAgICAgICBlbHNlIGlmICgodHlwZW9mIGF0dHIgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGF0dHIpKSA9PT0gJ29iamVjdCcpIHsKCSAgICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgICAgICAgIGZvciAodmFyIGF0IGluIGF0dHIpIHsKCSAgICAgICAgICAgICAgICBpZiAoYXR0ci5oYXNPd25Qcm9wZXJ0eShhdCkpIHsKCSAgICAgICAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoYXQsIHZhbHVlKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0pOwoJICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwoJICAgICAgICAgIH0KCSAgICAgIH0KCSAgICAgIC8vIHNldAoJICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewoJICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKGF0dHIsIHZhbHVlKTsKCSAgICAgICAgICB9KTsKCSAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgfQoJICAgIH0pCgkgIH0sIHsKCSAgICBrZXk6ICdyZW1vdmVBdHRyJywKCSAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQXR0cihhdHRyKSB7CgkgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewoJICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsZSkgewoJICAgICAgICAgIGVsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CgkgICAgICAgIH0pOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHRoaXM7CgkgICAgfQoJICB9LCB7CgkgICAga2V5OiAncmVtb3ZlJywKCSAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKCkgewoJICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgZWxlLnJlbW92ZSgpOwoJICAgICAgfSk7CgkgICAgICB0aGlzLmxlbmd0aCA9IDA7CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgoJICAgIC8vIGdldCB0aGUgZWxlbWVudCBzdHlsZQoKCSAgfSwgewoJICAgIGtleTogJ3N0eWxlJywKCSAgICB2YWx1ZTogZnVuY3Rpb24gc3R5bGUoYXR0cikgewoJICAgICAgcmV0dXJuIHRoaXNbMF0uY3VycmVudFN0eWxlID8gdGhpc1swXS5jdXJyZW50U3R5bGVbYXR0cl0gOiBnZXRDb21wdXRlZFN0eWxlKHRoaXNbMF0pW2F0dHJdOwoJICAgIH0KCgkgICAgLy8gKGF0dHIsdmFsdWUpIHx8ICdzdHJpbmcnIHx8IHt9CgoJICB9LCB7CgkgICAga2V5OiAnY3NzJywKCSAgICB2YWx1ZTogZnVuY3Rpb24gY3NzKCkgewoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFnbSA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgewoJICAgICAgICBhZ21bX2tleV0gPSBhcmd1bWVudHNbX2tleV07CgkgICAgICB9CgoJICAgICAgaWYgKGFnbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgLy8gZ2V0IHN0eWxlCgkgICAgICAgIGlmICh0eXBlb2YgYWdtWzBdID09PSAnc3RyaW5nJykgewoJICAgICAgICAgIC8vIHNldCBzdHlsZSBhcyBhIGxvbmcgdGV4dAoJICAgICAgICAgIGlmICgvOi9pZy50ZXN0KGFnbVswXSkpIHsKCSAgICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgICAgICAgIGVsZS5zdHlsZS5jc3NUZXh0ID0gYXR0cjsKCSAgICAgICAgICAgIH0pOwoJICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICByZXR1cm4gdGhpc1swXS5jdXJyZW50U3R5bGUgPyB0aGlzWzBdLmN1cnJlbnRTdHlsZVthZ21bMF1dIDogZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzWzBdKVthZ21bMF1dOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICAvLyBzZXQgc3R5bGUgYXMgYSBvYmplY3QKCSAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsZSkgewoJICAgICAgICAgICAgICBmb3IgKHZhciBfYXR0cjIgaW4gYWdtWzBdKSB7CgkgICAgICAgICAgICAgICAgaWYgKGFnbVswXS5oYXNPd25Qcm9wZXJ0eShfYXR0cjIpKSB7CgkgICAgICAgICAgICAgICAgICBlbGUuc3R5bGVbX2F0dHIyXSA9IGFnbVswXVtfYXR0cjJdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSk7CgkgICAgICAgICAgfQoJICAgICAgfQoJICAgICAgLy8gc2V0IGFzIChrZXksdmFsdWUpCgkgICAgICBlbHNlIGlmIChhZ20ubGVuZ3RoID09PSAyKSB7CgkgICAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgICAgIGVsZS5zdHlsZVthZ21bMF1dID0gYWdtWzFdOwoJICAgICAgICAgIH0pOwoJICAgICAgICB9CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICd3aWR0aCcsCgkgICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKHZhbHVlKSB7CgkgICAgICB2YXIgZWxlbWVudCA9IHRoaXNbMF07CgkgICAgICAvLyB3aW5kb3cgb3IgZG9jdW1lbnQKCSAgICAgIGlmIChlbGVtZW50LndpbmRvdyA9PT0gZWxlbWVudCB8fCBlbGVtZW50LmJvZHkpIHsKCSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGggPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGggPyBkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoIDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoOwoJICAgICAgfQoJICAgICAgLy8gc2V0IHdpZHRoCgkgICAgICBlbHNlIGlmICh2YWx1ZSkgewoJICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgICAgICBlbGUuc3R5bGUud2lkdGggPSB2YWx1ZSArICdweCc7CgkgICAgICAgICAgfSk7CgkgICAgICAgICAgcmV0dXJuIHRoaXM7CgkgICAgICAgIH0KCSAgICAgICAgLy8gZ2V0IHdpZHRoCgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXNbMF0ub2Zmc2V0V2lkdGggfHwgcGFyc2VGbG9hdCh0aGlzLnN0eWxlKCd3aWR0aCcpKTsKCSAgICAgICAgICB9CgkgICAgfQoJICB9LCB7CgkgICAga2V5OiAnaGVpZ2h0JywKCSAgICB2YWx1ZTogZnVuY3Rpb24gaGVpZ2h0KHZhbHVlKSB7CgkgICAgICB2YXIgZWxlID0gdGhpc1swXTsKCSAgICAgIC8vIHdpbmRvdyBvciBkb2N1bWVudAoJICAgICAgaWYgKGVsZS53aW5kb3cgPT09IGVsZSB8fCBlbGUuYm9keSkgewoJICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID8gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0OwoJICAgICAgfQoJICAgICAgLy8gc2V0IGhlaWdodAoJICAgICAgZWxzZSBpZiAodmFsdWUpIHsKCSAgICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsZSkgewoJICAgICAgICAgICAgZWxlLnN0eWxlLmhlaWdodCA9IHZhbHVlICsgJ3B4JzsKCSAgICAgICAgICB9KTsKCSAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgfQoJICAgICAgICAvLyBnZXQgaGVpZ2h0CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXNbMF0ub2Zmc2V0SGVpZ2h0IHx8IHBhcnNlRmxvYXQodGhpcy5zdHlsZSgnaGVpZ2h0JykpOwoJICAgICAgICAgIH0KCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICdodG1sJywKCSAgICB2YWx1ZTogZnVuY3Rpb24gaHRtbCh2YWx1ZSkgewoJICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKCSAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgICBlbGUuaW5uZXJIVE1MID0gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUoZWxlKSA6IHZhbHVlOwoJICAgICAgICB9KTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiB0aGlzWzBdLmlubmVySFRNTDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB0aGlzOwoJICAgIH0KCSAgfSwgewoJICAgIGtleTogJ3RleHQnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiB0ZXh0KHZhbHVlKSB7CgkgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXNbMF0uaW5uZXJUZXh0IHx8IHRoaXNbMF0udGV4dENvbnRlbnQ7CgoJICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgZWxlLmlubmVyVGV4dCA9IGVsZS50ZXh0Q29udGVudCA9IHZhbHVlOwoJICAgICAgfSk7CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICd2YWwnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiB2YWwodmFsdWUpIHsKCSAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpc1swXS52YWx1ZTsKCSAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgIGVsZS52YWx1ZSA9IHZhbHVlOwoJICAgICAgfSk7CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICdzaG93JywKCSAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdygpIHsKCSAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gJyc7CgkgICAgICB9KTsKCSAgICAgIHJldHVybiB0aGlzOwoJICAgIH0KCSAgfSwgewoJICAgIGtleTogJ2hpZGUnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiBoaWRlKCkgewoJICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgZWxlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgkgICAgICB9KTsKCSAgICAgIHJldHVybiB0aGlzOwoJICAgIH0KCgkgICAgLy8gY29udGVudCBzdHIgfHwganFMaXRlIE9iamVjdCB8fCBET00KCSAgICAvLyBoZXJlIGlzIGpxTGl0ZSBPYmplY3QKCgkgIH0sIHsKCSAgICBrZXk6ICdhcHBlbmQnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBlbmQoY29udGVudCkgewoJICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgZWxlLmFwcGVuZENoaWxkKGNvbnRlbnRbMF0pOwoJICAgICAgfSk7CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICdwcmVwZW5kJywKCgoJICAgIC8vIGNvbnRlbnQgc3RyIHx8IGpxTGl0ZSBPYmplY3QgfHwgRE9NCgkgICAgLy8gaGVyZSBpcyBqcUxpdGUgT2JqZWN0CgkgICAgdmFsdWU6IGZ1bmN0aW9uIHByZXBlbmQoY29udGVudCkgewoJICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgZWxlLmluc2VydEJlZm9yZShjb250ZW50WzBdLCBlbGUuY2hpbGRyZW5bMF0pOwoJICAgICAgfSk7CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICdoYXNDbGFzcycsCgkgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0NsYXNzKGNsYXNzTmFtZSkgewoJICAgICAgaWYgKCF0aGlzWzBdKSByZXR1cm4gZmFsc2U7CgkgICAgICByZXR1cm4gdGhpc1swXS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTsKCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICdhZGRDbGFzcycsCgkgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzTmFtZSkgewoJICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbGUpIHsKCSAgICAgICAgZWxlLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTsKCSAgICAgIH0pOwoJICAgICAgcmV0dXJuIHRoaXM7CgkgICAgfQoJICB9LCB7CgkgICAga2V5OiAncmVtb3ZlQ2xhc3MnLAoJICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc05hbWUpIHsKCSAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgIGVsZS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7CgkgICAgICB9KTsKCSAgICAgIHJldHVybiB0aGlzOwoJICAgIH0KCSAgfSwgewoJICAgIGtleTogJ2luZGV4JywKCSAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKCSAgICAgIHZhciBpbmRleCA9IDA7CgkgICAgICB2YXIgYnJvdGhlcnMgPSB0aGlzWzBdLnBhcmVudE5vZGUuY2hpbGRyZW47CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJyb3RoZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIGlmIChicm90aGVyc1tpXSA9PSB0aGlzWzBdKSB7CgkgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgIGJyZWFrOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gaW5kZXg7CgkgICAgfQoJICB9XSwgW3sKCSAgICBrZXk6ICdmbicsCgkgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CgkgICAgICB2YXIgdmlzaWJsZSA9IGZ1bmN0aW9uIHZpc2libGUoZWxlKSB7CgkgICAgICAgIHZhciBwb3MgPSBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CgkgICAgICAgIHZhciB3ID0gdm9pZCAwOwoJICAgICAgICB2YXIgaCA9IHZvaWQgMDsKCSAgICAgICAgdmFyIGluVmlld1BvcnQgPSB2b2lkIDA7CgkgICAgICAgIHZhciBkb2NFbGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CgkgICAgICAgIHZhciBkb2NCb2R5ID0gZG9jdW1lbnQuYm9keTsKCSAgICAgICAgaWYgKGRvY0VsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHsKCSAgICAgICAgICB3ID0gZG9jRWxlLmNsaWVudFdpZHRoIHx8IGRvY0JvZHkuY2xpZW50V2lkdGg7CgkgICAgICAgICAgaCA9IGRvY0VsZS5jbGllbnRIZWlnaHQgfHwgZG9jQm9keS5jbGllbnRIZWlnaHQ7CgkgICAgICAgICAgaW5WaWV3UG9ydCA9IHBvcy50b3AgPiBoIHx8IHBvcy5ib3R0b20gPCAwIHx8IHBvcy5sZWZ0ID4gdyB8fCBwb3MucmlnaHQgPCAwOwoJICAgICAgICAgIHJldHVybiBpblZpZXdQb3J0ID8gZmFsc2UgOiB0cnVlOwoJICAgICAgICB9CgkgICAgICB9OwoJICAgICAgdmFyIG1lcmdlID0gZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgc291cmNlcyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CgkgICAgICAgICAgc291cmNlc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOwoJICAgICAgICB9CgoJICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbi5hcHBseShPYmplY3QsIFt7fV0uY29uY2F0KHNvdXJjZXMpKTsKCSAgICAgIH07CgkgICAgICByZXR1cm4gewoJICAgICAgICB2aXNpYmxlOiB2aXNpYmxlLAoJICAgICAgICBtZXJnZTogbWVyZ2UKCSAgICAgIH07CgkgICAgfQoJICB9XSk7CgoJICByZXR1cm4ganFMaXRlOwoJfSgpOwoKCXZhciAkID0gZnVuY3Rpb24gJCgpIHsKCSAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/ICcnIDogYXJndW1lbnRzWzBdOwoJICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IGRvY3VtZW50IDogYXJndW1lbnRzWzFdOwoKCSAgcmV0dXJuIG5ldyBqcUxpdGUoc2VsZWN0b3JzLCBjb250ZXh0KTsKCX07CgkkLmZuID0ganFMaXRlLmZuOwoKCWV4cG9ydHMuZGVmYXVsdCA9ICQ7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCXZhciBjdHggICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMykKCSAgLCAkZXhwb3J0ICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSkKCSAgLCB0b09iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpCgkgICwgY2FsbCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KQoJICAsIGlzQXJyYXlJdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCkKCSAgLCB0b0xlbmd0aCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpCgkgICwgZ2V0SXRlckZuICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KTsKCSRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIV9fd2VicGFja19yZXF1aXJlX18oMjkpKGZ1bmN0aW9uKGl0ZXIpeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5JywgewoJICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpCgkgIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLyosIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKi8pewoJICAgIHZhciBPICAgICAgID0gdG9PYmplY3QoYXJyYXlMaWtlKQoJICAgICAgLCBDICAgICAgID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheQoJICAgICAgLCAkJCAgICAgID0gYXJndW1lbnRzCgkgICAgICAsICQkbGVuICAgPSAkJC5sZW5ndGgKCSAgICAgICwgbWFwZm4gICA9ICQkbGVuID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkCgkgICAgICAsIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkCgkgICAgICAsIGluZGV4ICAgPSAwCgkgICAgICAsIGl0ZXJGbiAgPSBnZXRJdGVyRm4oTykKCSAgICAgICwgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yOwoJICAgIGlmKG1hcHBpbmcpbWFwZm4gPSBjdHgobWFwZm4sICQkbGVuID4gMiA/ICQkWzJdIDogdW5kZWZpbmVkLCAyKTsKCSAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2UKCSAgICBpZihpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSl7CgkgICAgICBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEM7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKyl7CgkgICAgICAgIHJlc3VsdFtpbmRleF0gPSBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpOwoJICAgICAgZm9yKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXsKCSAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07CgkgICAgICB9CgkgICAgfQoJICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDsKCSAgICByZXR1cm4gcmVzdWx0OwoJICB9Cgl9KTsKCgovKioqLyB9LAovKiAzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCS8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZwoJdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7Cgltb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpewoJICBhRnVuY3Rpb24oZm4pOwoJICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuOwoJICBzd2l0Y2gobGVuZ3RoKXsKCSAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXsKCSAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpOwoJICAgIH07CgkgICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7CgkgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTsKCSAgICB9OwoJICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpewoJICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7CgkgICAgfTsKCSAgfQoJICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7CgkgICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7CgkgIH07Cgl9OwoKLyoqKi8gfSwKLyogNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgltb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXsKCSAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTsKCSAgcmV0dXJuIGl0OwoJfTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJdmFyIGdsb2JhbCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNikKCSAgLCBjb3JlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpCgkgICwgaGlkZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KQoJICAsIHJlZGVmaW5lICA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpCgkgICwgY3R4ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKQoJICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnOwoKCXZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXsKCSAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkYKCSAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkcKCSAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlMKCSAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlAKCSAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkIKCSAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXQoJICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSkKCSAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pCgkgICAgLCBrZXksIG93biwgb3V0LCBleHA7CgkgIGlmKElTX0dMT0JBTClzb3VyY2UgPSBuYW1lOwoJICBmb3Ioa2V5IGluIHNvdXJjZSl7CgkgICAgLy8gY29udGFpbnMgaW4gbmF0aXZlCgkgICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYga2V5IGluIHRhcmdldDsKCSAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZAoJICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07CgkgICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHQKCSAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDsKCSAgICAvLyBleHRlbmQgZ2xvYmFsCgkgICAgaWYodGFyZ2V0ICYmICFvd24pcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCk7CgkgICAgLy8gZXhwb3J0CgkgICAgaWYoZXhwb3J0c1trZXldICE9IG91dCloaWRlKGV4cG9ydHMsIGtleSwgZXhwKTsKCSAgICBpZihJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dClleHBQcm90b1trZXldID0gb3V0OwoJICB9Cgl9OwoJZ2xvYmFsLmNvcmUgPSBjb3JlOwoJLy8gdHlwZSBiaXRtYXAKCSRleHBvcnQuRiA9IDE7ICAvLyBmb3JjZWQKCSRleHBvcnQuRyA9IDI7ICAvLyBnbG9iYWwKCSRleHBvcnQuUyA9IDQ7ICAvLyBzdGF0aWMKCSRleHBvcnQuUCA9IDg7ICAvLyBwcm90bwoJJGV4cG9ydC5CID0gMTY7IC8vIGJpbmQKCSRleHBvcnQuVyA9IDMyOyAvLyB3cmFwCgltb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7CgovKioqLyB9LAovKiA2ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4Cgl2YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGgKCSAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwoJaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJdmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMS4yLjYnfTsKCWlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZgoKLyoqKi8gfSwKLyogOCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgl2YXIgJCAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOSkKCSAgLCBjcmVhdGVEZXNjID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7Cgltb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXsKCSAgcmV0dXJuICQuc2V0RGVzYyhvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpOwoJfSA6IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7CgkgIG9iamVjdFtrZXldID0gdmFsdWU7CgkgIHJldHVybiBvYmplY3Q7Cgl9OwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgl2YXIgJE9iamVjdCA9IE9iamVjdDsKCW1vZHVsZS5leHBvcnRzID0gewoJICBjcmVhdGU6ICAgICAkT2JqZWN0LmNyZWF0ZSwKCSAgZ2V0UHJvdG86ICAgJE9iamVjdC5nZXRQcm90b3R5cGVPZiwKCSAgaXNFbnVtOiAgICAge30ucHJvcGVydHlJc0VudW1lcmFibGUsCgkgIGdldERlc2M6ICAgICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLAoJICBzZXREZXNjOiAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5LAoJICBzZXREZXNjczogICAkT2JqZWN0LmRlZmluZVByb3BlcnRpZXMsCgkgIGdldEtleXM6ICAgICRPYmplY3Qua2V5cywKCSAgZ2V0TmFtZXM6ICAgJE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLAoJICBnZXRTeW1ib2xzOiAkT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scywKCSAgZWFjaDogICAgICAgW10uZm9yRWFjaAoJfTsKCi8qKiovIH0sCi8qIDEwICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCW1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7CgkgIHJldHVybiB7CgkgICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLAoJICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSwKCSAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksCgkgICAgdmFsdWUgICAgICAgOiB2YWx1ZQoJICB9OwoJfTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCS8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHkKCW1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTIpKGZ1bmN0aW9uKCl7CgkgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7Cgl9KTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCW1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7CgkgIHRyeSB7CgkgICAgcmV0dXJuICEhZXhlYygpOwoJICB9IGNhdGNoKGUpewoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9OwoKLyoqKi8gfSwKLyogMTMgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcKCS8vIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZQoJdmFyIGdsb2JhbCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNikKCSAgLCBoaWRlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpCgkgICwgU1JDICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCkoJ3NyYycpCgkgICwgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJwoJICAsICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR10KCSAgLCBUUEwgICAgICAgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7CgoJX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24oaXQpewoJICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpOwoJfTsKCgkobW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7CgkgIGlmKHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJyl7CgkgICAgdmFsLmhhc093blByb3BlcnR5KFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpOwoJICAgIHZhbC5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7CgkgIH0KCSAgaWYoTyA9PT0gZ2xvYmFsKXsKCSAgICBPW2tleV0gPSB2YWw7CgkgIH0gZWxzZSB7CgkgICAgaWYoIXNhZmUpZGVsZXRlIE9ba2V5XTsKCSAgICBoaWRlKE8sIGtleSwgdmFsKTsKCSAgfQoJfSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7CgkgIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTsKCX0pOwoKLyoqKi8gfSwKLyogMTQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJdmFyIGlkID0gMAoJICAsIHB4ID0gTWF0aC5yYW5kb20oKTsKCW1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXsKCSAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTsKCX07CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpCgl2YXIgZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpOwoJbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7CgkgIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpOwoJfTsKCi8qKiovIH0sCi8qIDE2ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpCgltb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXsKCSAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gICIgKyBpdCk7CgkgIHJldHVybiBpdDsKCX07CgovKioqLyB9LAovKiAxNyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yCgl2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KTsKCW1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7CgkgIHRyeSB7CgkgICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTsKCSAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbikKCSAgfSBjYXRjaChlKXsKCSAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddOwoJICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7CgkgICAgdGhyb3cgZTsKCSAgfQoJfTsKCi8qKiovIH0sCi8qIDE4ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCXZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpOwoJbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7CgkgIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpOwoJICByZXR1cm4gaXQ7Cgl9OwoKLyoqKi8gfSwKLyogMTkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7CgkgIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7Cgl9OwoKLyoqKi8gfSwKLyogMjAgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvcgoJdmFyIEl0ZXJhdG9ycyAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKQoJICAsIElURVJBVE9SICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKSgnaXRlcmF0b3InKQoJICAsIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7CgoJbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7CgkgIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7Cgl9OwoKLyoqKi8gfSwKLyogMjEgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJbW9kdWxlLmV4cG9ydHMgPSB7fTsKCi8qKiovIH0sCi8qIDIyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCXZhciBzdG9yZSAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKSgnd2tzJykKCSAgLCB1aWQgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KQoJICAsIFN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNikuU3ltYm9sOwoJbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXsKCSAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9CgkgICAgU3ltYm9sICYmIFN5bWJvbFtuYW1lXSB8fCAoU3ltYm9sIHx8IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpOwoJfTsKCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCXZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpCgkgICwgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXycKCSAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7Cgltb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7CgkgIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pOwoJfTsKCi8qKiovIH0sCi8qIDI0ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCS8vIDcuMS4xNSBUb0xlbmd0aAoJdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpCgkgICwgbWluICAgICAgID0gTWF0aC5taW47Cgltb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXsKCSAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTEKCX07CgovKioqLyB9LAovKiAyNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvLyA3LjEuNCBUb0ludGVnZXIKCXZhciBjZWlsICA9IE1hdGguY2VpbAoJICAsIGZsb29yID0gTWF0aC5mbG9vcjsKCW1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpewoJICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTsKCX07CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgl2YXIgY2xhc3NvZiAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNykKCSAgLCBJVEVSQVRPUiAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKSgnaXRlcmF0b3InKQoJICAsIEl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpOwoJbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpewoJICBpZihpdCAhPSB1bmRlZmluZWQpcmV0dXJuIGl0W0lURVJBVE9SXQoJICAgIHx8IGl0WydAQGl0ZXJhdG9yJ10KCSAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldOwoJfTsKCi8qKiovIH0sCi8qIDI3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCS8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpCgl2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCkKCSAgLCBUQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKSgndG9TdHJpbmdUYWcnKQoJICAvLyBFUzMgd3JvbmcgaGVyZQoJICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnOwoKCW1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpewoJICB2YXIgTywgVCwgQjsKCSAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnCgkgICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlCgkgICAgOiB0eXBlb2YgKFQgPSAoTyA9IE9iamVjdChpdCkpW1RBR10pID09ICdzdHJpbmcnID8gVAoJICAgIC8vIGJ1aWx0aW5UYWcgY2FzZQoJICAgIDogQVJHID8gY29mKE8pCgkgICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFjawoJICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCOwoJfTsKCi8qKiovIH0sCi8qIDI4ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCXZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nOwoKCW1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpewoJICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpOwoJfTsKCi8qKiovIH0sCi8qIDI5ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCXZhciBJVEVSQVRPUiAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKSgnaXRlcmF0b3InKQoJICAsIFNBRkVfQ0xPU0lORyA9IGZhbHNlOwoKCXRyeSB7CgkgIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTsKCSAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24oKXsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTsKCSAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24oKXsgdGhyb3cgMjsgfSk7Cgl9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9CgoJbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7CgkgIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTsKCSAgdmFyIHNhZmUgPSBmYWxzZTsKCSAgdHJ5IHsKCSAgICB2YXIgYXJyICA9IFs3XQoJICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpOwoJICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHNhZmUgPSB0cnVlOyB9OwoJICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTsKCSAgICBleGVjKGFycik7CgkgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH0KCSAgcmV0dXJuIHNhZmU7Cgl9OwoKLyoqKi8gfSwKLyogMzAgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSkKCXZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgkkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHthc3NpZ246IF9fd2VicGFja19yZXF1aXJlX18oMzEpfSk7CgovKioqLyB9LAovKiAzMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkvLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pCgl2YXIgJCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpCgkgICwgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KQoJICAsIElPYmplY3QgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMik7CgoJLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpCgltb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpKGZ1bmN0aW9uKCl7CgkgIHZhciBhID0gT2JqZWN0LmFzc2lnbgoJICAgICwgQSA9IHt9CgkgICAgLCBCID0ge30KCSAgICAsIFMgPSBTeW1ib2woKQoJICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7CgkgIEFbU10gPSA3OwoJICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7CgkgIHJldHVybiBhKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKGEoe30sIEIpKS5qb2luKCcnKSAhPSBLOwoJfSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgkgIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldCkKCSAgICAsICQkICAgID0gYXJndW1lbnRzCgkgICAgLCAkJGxlbiA9ICQkLmxlbmd0aAoJICAgICwgaW5kZXggPSAxCgkgICAgLCBnZXRLZXlzICAgID0gJC5nZXRLZXlzCgkgICAgLCBnZXRTeW1ib2xzID0gJC5nZXRTeW1ib2xzCgkgICAgLCBpc0VudW0gICAgID0gJC5pc0VudW07CgkgIHdoaWxlKCQkbGVuID4gaW5kZXgpewoJICAgIHZhciBTICAgICAgPSBJT2JqZWN0KCQkW2luZGV4KytdKQoJICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpCgkgICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoCgkgICAgICAsIGogICAgICA9IDAKCSAgICAgICwga2V5OwoJICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07CgkgIH0KCSAgcmV0dXJuIFQ7Cgl9IDogT2JqZWN0LmFzc2lnbjsKCi8qKiovIH0sCi8qIDMyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCS8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzCgl2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCk7Cgltb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpewoJICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7Cgl9OwoKLyoqKi8gfSwKLyogMzMgKi8sCi8qIDM0ICovLAovKiAzNSAqLywKLyogMzYgKi8sCi8qIDM3ICovLAovKiAzOCAqLywKLyogMzkgKi8sCi8qIDQwICovLAovKiA0MSAqLywKLyogNDIgKi8sCi8qIDQzICovLAovKiA0NCAqLywKLyogNDUgKi8sCi8qIDQ2ICovLAovKiA0NyAqLywKLyogNDggKi8sCi8qIDQ5ICovLAovKiA1MCAqLywKLyogNTEgKi8sCi8qIDUyICovLAovKiA1MyAqLywKLyogNTQgKi8sCi8qIDU1ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSJ1c2Ugc3RyaWN0IjsKCglPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CgkgIHZhbHVlOiB0cnVlCgl9KTsKCXZhciAkaW50ZXJ2YWwgPSBmdW5jdGlvbiAkaW50ZXJ2YWwoZm4sIGRlbGF5KSB7CgkgIHZhciBpbnRlcnZhbCA9IGZ1bmN0aW9uIGludGVydmFsKCkgewoJICAgIGZuLmNhbGwodW5kZWZpbmVkKTsKCSAgICBpZCA9IHNldFRpbWVvdXQoaW50ZXJ2YWwsIGRlbGF5KTsKCSAgfTsKCgkgIHZhciBpZCA9IHNldFRpbWVvdXQoaW50ZXJ2YWwsIGRlbGF5KTsKCgkgIHJldHVybiBmdW5jdGlvbiAoKSB7CgkgICAgd2luZG93LmNsZWFyVGltZW91dChpZCk7CgkgIH07Cgl9OwoKCSRpbnRlcnZhbC5jYW5jZWwgPSBmdW5jdGlvbiAodGltZXJGdW5jKSB7CgkgIHRpbWVyRnVuYygpOwoJfTsKCglleHBvcnRzLmRlZmF1bHQgPSAkaW50ZXJ2YWw7CgovKioqLyB9LAovKiA1NiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewoJICB2YWx1ZTogdHJ1ZQoJfSk7CgoJdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7CgoJdmFyIF9qcUxpdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwoKCXZhciBfanFMaXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2pxTGl0ZSk7CgoJdmFyIF9jb25maWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KTsKCgl2YXIgX2NvbmZpZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25maWcpOwoKCWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9CgoJZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CgoJdmFyIE1haW4gPSBmdW5jdGlvbiAoKSB7CgkgIGZ1bmN0aW9uIE1haW4oKSB7CgkgICAgdmFyIHJ1bGVzID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gX2NvbmZpZzIuZGVmYXVsdC5ydWxlcyA6IGFyZ3VtZW50c1swXTsKCgkgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1haW4pOwoKCSAgICB0aGlzLmFkcyA9ICgwLCBfanFMaXRlMi5kZWZhdWx0KShydWxlcyk7CgkgICAgdGhpcy5sZW5ndGggPSB0aGlzLmFkcy5sZW5ndGg7CgkgIH0KCgkgIF9jcmVhdGVDbGFzcyhNYWluLCBbewoJICAgIGtleTogJ2ZpbHRlcicsCgkgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbHRlcigpIHsKCSAgICAgIHRoaXMuYWRzLmVhY2goZnVuY3Rpb24gKGVsZSwgaSkgewoJICAgICAgICBlbGUuc3R5bGUuY3NzVGV4dCA9ICdcbiAgICAgICAgICBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgICB2aXNpYmlsaXR5OmhpZGRlbiAhaW1wb3J0YW50O1xuICAgICAgICAgIHdpZHRoOjAgIWltcG9ydGFudDtcbiAgICAgICAgICBoZWlnaHQ6MCAhaW1wb3J0YW50O1xuICAgICAgICAgIG92ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50O1xuICAgICAgICAgIC8vIGJhY2tncm91bmQtY29sb3I6cmVkICFpbXBvcnRhbnQ7XG4gICAgICAgICAgLy8gYm9yZGVyOjFweCBzb2xpZCByZWQ7XG4gICAgICAgICc7CgkgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoJ2ZpbHRlcmVkJywgJycpOwoJICAgICAgfSk7CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgkgIH0sIHsKCSAgICBrZXk6ICd0dXJuJywKCSAgICB2YWx1ZTogZnVuY3Rpb24gdHVybigpIHsKCSAgICAgICgwLCBfanFMaXRlMi5kZWZhdWx0KSgnI2NvbnRlbnRfbGVmdCBpbnB1dFt0eXBlPWNoZWNrYm94XTpub3QoZmlsdGVyZWQpJykuZWFjaChmdW5jdGlvbiAoZWxlKSB7CgkgICAgICAgIGVsZS5jaGVja2VkID0gZmFsc2U7CgkgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoJ2ZpbHRlcmVkJywgJycpOwoJICAgICAgfSk7CgkgICAgICByZXR1cm4gdGhpczsKCSAgICB9CgkgIH1dKTsKCgkgIHJldHVybiBNYWluOwoJfSgpOwoKCWV4cG9ydHMuZGVmYXVsdCA9IE1haW47CgovKioqLyB9LAovKiA1NyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewoJICB2YWx1ZTogdHJ1ZQoJfSk7Cgl2YXIgQ09ORklHID0gewoJICBydWxlczogJ1xuICAgICNjb250ZW50X2xlZnQ+ZGl2XG4gICAgOm5vdChbY2xhc3MqPXJlc3VsdF0pXG4gICAgOm5vdChbY2xhc3MqPWNvbnRhaW5lcl0pXG4gICAgOm5vdCgubGVmdEJsb2NrKVxuICAgIDpub3QoI3JzX3RvcF9uZXcpXG4gICAgOm5vdChbZmlsdGVyZWRdKVxuICAgICxcbiAgICAjY29udGVudF9sZWZ0PnRhYmxlXG4gICAgOm5vdCgucmVzdWx0KVxuICAgIDpub3QoW2ZpbHRlcmVkXSlcbiAgICAsXG4gICAgI2NvbnRlbnRfcmlnaHQ+dGFibGUgdGRcbiAgICBkaXYjZWNfaW1fY29udGFpbmVyXG4gICAgLFxuICAgIGRpdi5zLW5ld3MtbGlzdC13cmFwcGVyPmRpdlxuICAgIDpub3QoW2RhdGEtcmVsYXRld29yZHMqPSIxIl0pXG4gICAgLFxuICAgIGRpdi5saXN0LXdyYXBlciBkbFtkYXRhLW9hZF1cbiAgICA6bm90KFtkYXRhLWZiXSlcbiAgICA6bm90KFtmaWx0ZXJlZF0pXG4gICcudHJpbSgpLnJlcGxhY2UoL1xuL2ltZywgJycpLnJlcGxhY2UoL1xzezEsfShbXmEtekEtWl0pL2csICckMScpCgl9OwoKCWV4cG9ydHMuZGVmYXVsdCA9IENPTkZJRzsKCi8qKiovIH0KLyoqKioqKi8gXSk7"}]}