xiaomianao666

插件名:global_【玩的嗨】VIP工具箱,夸克网盘直链批量获取,全网VIP视频免费破解去广告,一站式音乐搜索下载,获取B站封面,下载B站视频等众多功能聚合长期更新,放心食用

Feb 21st, 2024
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_【玩的嗨】VIP工具箱,夸克网盘直链批量获取,全网VIP视频免费破解去广告,一站式音乐搜索下载,获取B站封面,下载B站视频等众多功能聚合长期更新,放心食用@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgIOOAkOeOqeeahOWXqOOAkVZJUOW3peWFt+eusSzlpLjlhYvnvZHnm5jnm7Tpk77mibnph4/ojrflj5Ys5YWo572RVklQ6KeG6aKR5YWN6LS556C06Kej5Y675bm/5ZGKLOS4gOermeW8j+mfs+S5kOaQnOe0ouS4i+i9vSzojrflj5ZC56uZ5bCB6Z2iLOS4i+i9vULnq5nop4bpopHnrYnkvJflpJrlip/og73ogZrlkIgg6ZW/5pyf5pu05pawLOaUvuW/g+mjn+eUqAovLyBAbmFtZXNwYWNlICAgICAgaHR0cHM6Ly93d3cud2FuZGhpLmNvbS8KLy8gQGRlc2NyaXB0aW9uICAgIPCflKXlip/og73ku4vnu43wn5Sl77ya8J+OiSAx44CBVmlw6KeG6aKR6Kej5p6Q77yb8J+OiSAy44CB5LiA56uZ5byP6Z+z5LmQ5pCc57Si6Kej5Yaz5pa55qGI77yb8J+OiSAz44CBYmlsaWJpbGnop4bpopHlsIHpnaLojrflj5bvvJvwn46JIDTjgIFiaWxpYmlsaeinhumikeS4i+i9vSjlt7LmlK/mjIHliIZQ5LiL6L29Ke+8m/CfjokgNeOAgeWkuOWFi+e9keebmOebtOmTvuaJuemHj+iOt+WPlu+8m/CfjokgNuOAgeWVhuWTgeWOhuWPsuS7t+agvOWxleekuijkuIDmrKHmgKflkYrliKvomZrlgYfpmY3ku7cp77yb8J+OiSA344CB5LyY5oOg5Yi45p+l6K+i77yb8J+OiSA444CBQ1NETumhtemdouOAgeWJquWIh+adv+a4heeQhu+8m/CfjokgOeOAgemhtemdouiHquWKqOWxleW8gCjmm7TlpJrnvZHnq5nljLnphY3kuK0s5qyi6L+O5o+Q5Lqk5oOz6KaB5pSv5oyB55qE572R56uZKSDwn46JIDEw44CBWW91VHViZeinhumikeS4i+i9vfCfjokgMTHjgIHkuK3pl7TpobXoh6rliqjot7PovazvvJvwn46JIDEy44CB5pCc57Si5byV5pOO5b+r6YCf6Lez6L2sCi8vIEBsaWNlbnNlICAgICAgICBNSVQKLy8gQHZlcnNpb24gICAgICAgIDQuOS4yMwovLyBAYXV0aG9yICAgICAgICAgTWF4WmhhbmcKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9zZXR0aW5ncy53YW5kaGkuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9tLnlvdWt1LmNvbS92KgovLyBAaW5jbHVkZSAgICAgICAgKjovL20ueW91a3UuY29tL2EqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vdi55b3VrdS5jb20vdl8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vdi55b3VrdS5jb20vcGFkX3Nob3cqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5pcWl5aS5jb20vdl8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5pcWl5aS5jb20vd18qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5pcWl5aS5jb20vYV8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5pcWl5aS5jb20vYWR2KgovLyBAaW5jbHVkZSAgICAgICAgKi5pcS5jb20vcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5sZS5jb20vcHR2L3ZwbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICp2LnFxLmNvbS94L2NvdmVyLyoKLy8gQGluY2x1ZGUgICAgICAgICp2LnFxLmNvbS94L3BhZ2UvKgovLyBAaW5jbHVkZSAgICAgICAgKnYucXEuY29tLypwbGF5KgovLyBAaW5jbHVkZSAgICAgICAgKnYucXEuY29tL2NvdmVyKgovLyBAaW5jbHVkZSAgICAgICAgKjovLyoudHVkb3UuY29tL2xpc3RwbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLnR1ZG91LmNvbS9hbGJ1bXBsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgKjovLyoudHVkb3UuY29tL3Byb2dyYW1zL3ZpZXcvKgovLyBAaW5jbHVkZSAgICAgICAgKjovLyoudHVkb3UuY29tL3YqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5tZ3R2LmNvbS9iLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9maWxtLnNvaHUuY29tL2FsYnVtLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly90di5zb2h1LmNvbS92LyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLmFjZnVuLmNuL3YvKgovLyBAaW5jbHVkZSAgICAgICAgKjovLyouYmlsaWJpbGkuY29tL3ZpZGVvLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLmJpbGliaWxpLmNvbS9hbmltZS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5iaWxpYmlsaS5jb20vYmFuZ3VtaS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLnBwdHYuY29tL3Nob3cvKgovLyBAaW5jbHVkZSAgICAgICAgKjovLyouYmFvZmVuZy5jb20vcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi53YXN1LmNuL1BsYXkvc2hvdyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly92Lnlpbnl1ZXRhaS5jb20vdmlkZW8vKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3YueWlueXVldGFpLmNvbS9wbGF5bGlzdC8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi53YXN1LmNuL1BsYXkvc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vbXVzaWMudGFpaGUuY29tL3NvbmcqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vbXVzaWMuMTYzLmNvbS9zb25nKgovLyBAaW5jbHVkZSAgICAgICAgKjovL211c2ljLjE2My5jb20vbS9zb25nKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3kucXEuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLmt1Z291LmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKi5rdXdvLmNuLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLnhpYW1pLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vbXVzaWMudGFpaGUuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLjF0aW5nLmNvbS9wbGF5ZXIqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vd3d3LnFpbmd0aW5nLmZtLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly93d3cubGl6aGkuZm0vKgovLyBAaW5jbHVkZSAgICAgICAgKjovL211c2ljLm1pZ3UuY24vKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3d3dy5zaGFuZ3h1ZWJhLmNvbS9hc2svKi5odG1sCi8vIEBpbmNsdWRlICAgICAgICAqOi8vd3d3LnhpbWFsYXlhLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vd3d3LnNoYW5neHVlYmEuY29tL2Fzay8qLmh0bWwKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3MvKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vcy8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS9saW5rKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vc2hhcmUvbGluayoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly93ZW5rdS5iYWlkdS5jb20vdmlldy8qCi8vIEBpbmNsdWRlICAgICAgICAqYmxvZy5jc2RuLm5ldC8qCi8vIEBpbmNsdWRlICAgICAgICAqZG93bmxvYWQuY3Nkbi5uZXQvKgovLyBAaW5jbHVkZSAgICAgICAgKmMucGMucXEuY29tL21pZGRsZW0qCi8vIEBpbmNsdWRlICAgICAgICAqcGFuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vbGluay5jc2RuLm5ldC8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vbGluay56aGlodS5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgKjovL2Jyb3dzZXIuZ3dkYW5nLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAqd3d3LmppYW5zaHUuY29tL2dvLXdpbGQqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vKmdpdGVlLmNvbS9saW5rKgovLyBAaW5jbHVkZSAgICAgICAgKjovLypqdWVqaW4uY24vP3RhcmdldCoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly93d3cuYWxpeXVuZHJpdmUuY29tL2RyaXZlKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3d3dy5hbGlwYW4uY29tL2RyaXZlLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly8qLnlvdXR1YmUuY29tL3dhdGNoP3Y9KgovLyBAaW5jbHVkZSAgICAgICAgKjovL3N1cHBvcnQucXEuY29tL3Byb2R1Y3RzKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3dlaWJvLmNuL3NpbmF1cmwqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vYWZkaWFuLm5ldC9saW5rKgovLyBAaW5jbHVkZSAgICAgICAgKjovLypvc2NoaW5hLm5ldC9hY3Rpb24vR29Ub0xpbmsqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vanVtcDIuYmRpbWcuY29tL3NhZmVjaGVjayoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly93d3cuZG91YmFuLmNvbS9saW5rMi8/dXJsKgovLyBAaW5jbHVkZSAgICAgICAgKjovL2xpbmsuMTcxNzMuY29tKgovLyBAaW5jbHVkZSAgICAgICAgKjovL3NlYXJjaC5zdW5pbmcuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9wYW4ucXVhcmsuY24vKgovLyBAaW5jbHVkZSAgICAgICAgKjovL2RvY3MucXEuY29tL3NjZW5hcmlvL2xpbmsqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vbWFpbC5xcS5jb20vY2dpLWJpbi9yZWFkdGVtcGxhdGUqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vY2xvdWQudGVuY2VudC5jb20vZGV2ZWxvcGVyL3Rvb2xzL2Jsb2ctZW50cnkqCi8vIEBpbmNsdWRlICAgICAgICAqOi8vbGluay51aXNkYy5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgKjovL2l0ZW0udGFvYmFvLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vcy50YW9iYW8uY29tL3NlYXJjaCoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9saXN0LnRtYWxsLmNvbS9zZWFyY2hfcHJvZHVjdC5odG0qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vZGV0YWlsLnRtYWxsLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vY2hhb3NoaS5kZXRhaWwudG1hbGwuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9kZXRhaWwudG1hbGwuaGsvKgovLyBAaW5jbHVkZSAgICAgICAgKjovL2l0ZW0ueWl5YW9qZC5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgKjovL2l0ZW0uamQuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9zZWFyY2guamQuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9pdGVtLmpkLmhrLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9zZWFyY2gua2FvbGEuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9nb29kcy5rYW9sYS5jb20qCi8vIEBpbmNsdWRlICAgICAgICAqOi8vZGV0YWlsLnZpcC5jb20vZGV0YWlsLSoKLy8gQGluY2x1ZGUgICAgICAgICo6Ly9wcm9kdWN0LnN1bmluZy5jb20vKgovLyBAZXhjbHVkZSAgICAgICAgKjovL3R2LndhbmRoaS5jb20vKgovLyBAZXhjbHVkZSAgICAgICAgKjovL3ZpcC53YW5kaGkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICo6Ly9jLnBjLnFxLmNvbS9pb3MqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vd3d3LnYyZXguY29tL3QvKgovLyBAbWF0Y2ggICAgICAgICAgKjovLyoubm9kZXNlZWsuY29tL2p1bXAqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vKi56aGlodS5jb20vcXVlc3Rpb24qCi8vIEBtYXRjaCAgICAgICAgICAqOi8vd3d3LmJhaWR1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAqOi8vd3d3Lmdvb2dsZS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3d3dy5zb2dvdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3d3dy5zby5jb20vcyoKLy8gQG1hdGNoICAgICAgICAgICo6Ly9jbi5iaW5nLmNvbS9zZWFyY2gqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vc3NwYWkuY29tL2xpbmsqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vKi5rZG9jcy5jbi9vZmZpY2UvbGluayoKLy8gQG1hdGNoICAgICAgICAgICo6Ly9pc3BhY2Vzb2Z0LmNvbS8qLmh0bWwKLy8gQG1hdGNoICAgICAgICAgICo6Ly90di53YW5kaGkuY29tL2dvLmh0bWwqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vKi54aWFvaG9uZ3NodS5jb20vZXhwbG9yZSoKLy8gQHJlcXVpcmUgICAgICAgIGh0dHBzOi8vbGliLmJhb21pdHUuY29tL2pxdWVyeS8xLjEyLjQvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgaHR0cHM6Ly9saWIuYmFvbWl0dS5jb20vbGltb250ZS1zd2VldGFsZXJ0Mi8xMS40Ljcvc3dlZXRhbGVydDIuYWxsLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgaHR0cHM6Ly9saWIuYmFvbWl0dS5jb20vZWNoYXJ0cy80LjYuMC9lY2hhcnRzLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgaHR0cHM6Ly9saWIuYmFvbWl0dS5jb20vbGF5ZXIvMi4zL2xheWVyLmpzCi8vIEByZXF1aXJlICAgICAgICBodHRwczovL2xpYi5iYW9taXR1LmNvbS9xcmNvZGUtZ2VuZXJhdG9yLzEuNC40L3FyY29kZS5taW4uanMKLy8gQHJlcXVpcmUgICAgICAgIGh0dHBzOi8vbGliLmJhb21pdHUuY29tL0ZpbGVTYXZlci5qcy8yLjAuNS9GaWxlU2F2ZXIubWluLmpzCi8vIEByZXF1aXJlICAgICAgICBodHRwczovL2xpYi5iYW9taXR1LmNvbS92aWV3ZXJqcy8xLjExLjMvdmlld2VyLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgaHR0cHM6Ly9sZjMtY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL3JlYWN0LzE4LjIuMC91bWQvcmVhY3QucHJvZHVjdGlvbi5taW4uanMKLy8gQHJlcXVpcmUgICAgICAgIGh0dHBzOi8vbGY2LWNkbi10b3MuYnl0ZWNkbnRwLmNvbS9jZG4vZXhwaXJlLTEtTS9yZWFjdC1kb20vMTguMi4wL3VtZC9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKLy8gQHJlcXVpcmUgICAgICAgIGh0dHBzOi8vcmVnaXN0cnkubnBtbWlycm9yLmNvbS9AZG91eWluZmUvc2VtaS11aS8yLjUxLjAvZmlsZXMvZGlzdC91bWQvc2VtaS11aS5taW4uanMKLy8gQGdyYW50ICAgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgICAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgR01faW5mbwovLyBAZ3JhbnQgICAgICAgICAgR01fY29va2llCi8vIEBncmFudCAgICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgICAgR00uYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR00uZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNLnNldFZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTV9ub3RpZmljYXRpb24KLy8gQGdyYW50ICAgICAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgICAgR01fZGVsZXRlVmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICAgIEdNX3VucmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgICAgR01fZG93bmxvYWQKLy8gQGNvbm5lY3QgICAgICAgIGFwaS53YW5kaGkuY29tCi8vIEBjb25uZWN0ICAgICAgICBhcGkuaHVpemhlay5jb20KLy8gQGNvbm5lY3QgICAgICAgIGNkbi5qc2RlbGl2ci5uZXQKLy8gQGNvbm5lY3QgICAgICAgIHRvb2wubWFubWFuYnV5LmNvbQovLyBAY29ubmVjdCAgICAgICAgZ3dkYW5nLmNvbQovLyBAY29ubmVjdCAgICAgICAgc2NyaXB0Y2F0Lm9yZwovLyBAY29ubmVjdCAgICAgICAgcXVhcmsuY24KLy8gQGNvbm5lY3QgICAgICAgIG9wZW5hcGkuYmFpZHUuY29tCi8vIEBjb25uZWN0ICAgICAgICBsb2NhbGhvc3QKLy8gQGNvbm5lY3QgICAgICAgIHBhbi5iYWlkdS5jb20KLy8gQGNvbm5lY3QgICAgICAgIGFwaS5iaWxpYmlsaS5jb20KLy8gQGNvbXBhdGlibGUgICAgIGZpcmVmb3gKLy8gQGNvbXBhdGlibGUgICAgIGNocm9tZQovLyBAY29tcGF0aWJsZSAgICAgb3BlcmEgc2FmYXJpIGVkZ2UKLy8gQGNvbXBhdGlibGUgICAgIHNhZmFyaQovLyBAY29tcGF0aWJsZSAgICAgZWRnZQovLyBAcnVuLWF0ICAgICAgICAgZG9jdW1lbnQtZW5kCi8vIEBhbnRpZmVhdHVyZSAgICByZWZlcnJhbC1saW5rIOatpOaPkOekuuS4ukdyZWFzeUZvcmvku6PnoIHop4TojIPopoHmsYLlkKvmnInmn6XliLjlip/og73nmoTohJrmnKzlv4Xpobvmt7vliqDvvIzlrp7pmYXkvb/nlKjml6Dku7vkvZXlvLrliLbot7PovazvvIzku6PnoIHlj6/mn6XvvIzor7fnn6XmgonjgIIKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oZ2xvYmFsLCBmYWN0b3J5KSB7CiAgICAib2JqZWN0IiA9PSB0eXBlb2YgZXhwb3J0cyAmJiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgbW9kdWxlID8gZmFjdG9yeShyZXF1aXJlKCJyZWFjdC1kb20iKSwgcmVxdWlyZSgic3dlZXRhbGVydDIiKSwgcmVxdWlyZSgiQGRvdXlpbmZlL3NlbWktdWkiKSwgcmVxdWlyZSgidmlld2VyanMiKSkgOiAiZnVuY3Rpb24iID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbICJyZWFjdC1kb20iLCAic3dlZXRhbGVydDIiLCAiQGRvdXlpbmZlL3NlbWktdWkiLCAidmlld2VyanMiIF0sIGZhY3RvcnkpIDogZmFjdG9yeSgoZ2xvYmFsID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIGdsb2JhbFRoaXMgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYpLlJlYWN0RE9NLCBnbG9iYWwuU3dhbCwgZ2xvYmFsLlNlbWlVSSwgZ2xvYmFsLlZpZXdlcik7Cn0pKHRoaXMsIChmdW5jdGlvbihSZWFjdERPTSwgU3dhbCwgc2VtaVVpLCBWaWV3ZXIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBSZWFjdERPTV9fZGVmYXVsdCwgU3dhbF9fZGVmYXVsdCwgVmlld2VyX19kZWZhdWx0LCBleHRlbmRTdGF0aWNzLCB1cGRhdGVfa2V5LCBNaW4sIEhvdXIsIERheSwgV2VlaywgQnJvd2VyVHlwZSwgTG9nZ2VyLCBMb2dMZXZlbCwgVmVyc2lvblJlc3VsdCwgQ29yZSwgVmVyc2lvbkNvbXBhciwgQ29uZmlnLCBBamF4T3B0aW9uLCBIdHRwLCBIdHRwSGVhZGVycywgUm91dGUsIGNzc18yNDh6JGEsIENvbW1vbiwgUGx1Z2luQmFzZSwgU2l0ZUVudW0sIFVwZGF0ZVNlcnZpY2UsIEV2ZW50SGVscGVyLCBSdW50aW1lLCBCYXNlQ291cG9uLCBWcENvdXBvbiwgU3VuaW5nQ291cG9uLCBKZENvdXBvbiwgVGFvQ291cG9uLCBEZWZDb3Vwb24sIExpbmVzT3B0aW9uLCBjc3NfMjQ4eiQ5LCBNc2dJbmZvLCBQcm9tb0luZm8sIEhpc3RvcnlTZXJ2aWNlLCBLYW9sYUNvdXBvbiwgY3NzXzI0OHokOCwgc0FsZXJ0LCBjb21tb25qc0dsb2JhbCwgZmluZ2VycHJpbnQyLCBHd2RTZXJ2aWNlLCBHd2RIZWxwZXIsIGNzc18yNDh6JDcsIFRhb0Jhb1NlcnZpY2UsIGNvbnRhaW5lciwgQ29udGFpbmVyLCBjc3NfMjQ4eiQ2LCBDb25maWdFbnVtLCBUb2FzdCwgQmlsaUltZ1NlcnZpY2UsIE1lbnUkMiwgTW92aWVTZXJ2aWNlLCBKZFNlcnZpY2UsIFVybEhlbHBlciwgTXVzaWNTZXJ2aWNlLCBJdGVtVHlwZSwgVGFvLCBMaXN0U2VydmljZSwgY3NzXzI0OHokNSwgQ3NkbkFkU2VydmljZSwgQWxlcnQsIE1lbnUkMSwgV2VuS3VTZXJ2aWNlLCBMaW5rSnVtcFNlcnZpY2UsIGNzc18yNDh6JDQsIF9Hd2RTZXJ2aWNlLCBBdXRvRXhwYW5kU2VydmljZSwgQklsaVRvb2xzLCBCaWxpTW9iaWxlU2VydmljZSwgQWxpeXVuUGFuVG9rZW4sIGNzc18yNDh6JDMsIGNzc18yNDh6JDIsIE1mYk1lbnUsIE1mYk1vZGVsLCBZb3V0dWJlU2VydmljZSwgU2V0dGluZ1NlcnZpY2UsIENvbnRyb2xNZW51U2VydmljZSwgU2VhcmNoU2VydmljZSwgUXVhcmtGaWxlUmVzcG9uc2UsIE5ldERpc2tEaXJlY3RTZXJ2aWNlLCBBZENsZWFyU2VydmljZSwgY3NzXzI0OHokMSwgSW1nVmlld1NlcnZpY2UsIGNzc18yNDh6LCBaaGlodVNlcnZpY2UsIE1lbnUsIFhoc1NlcnZpY2UsIE9uZUtleVZpcEluamVjdGlvbjsKICAgIGZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdExlZ2FjeShlKSB7CiAgICAgICAgcmV0dXJuIGUgJiYgIm9iamVjdCIgPT0gdHlwZW9mIGUgJiYgImRlZmF1bHQiIGluIGUgPyBlIDogewogICAgICAgICAgICBkZWZhdWx0OiBlCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7CiAgICAgICAgZnVuY3Rpb24gX18oKSB7CiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkOwogICAgICAgIH0KICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpLCBkLnByb3RvdHlwZSA9IG51bGwgPT09IGIgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCAKICAgICAgICBuZXcgX18pOwogICAgfQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvci50aHJvdyh2YWx1ZSkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgewogICAgICAgICAgICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0ocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgICAgICB9KSk7CiAgICB9CiAgICBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7CiAgICAgICAgdmFyIGYsIHksIHQsIGcsIF8gPSB7CiAgICAgICAgICAgIGxhYmVsOiAwLAogICAgICAgICAgICBzZW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICgxICYgdFswXSkgdGhyb3cgdFsxXTsKICAgICAgICAgICAgICAgIHJldHVybiB0WzFdOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0cnlzOiBbXSwKICAgICAgICAgICAgb3BzOiBbXQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGcgPSB7CiAgICAgICAgICAgIG5leHQ6IHZlcmIoMCksCiAgICAgICAgICAgIHRocm93OiB2ZXJiKDEpLAogICAgICAgICAgICByZXR1cm46IHZlcmIoMikKICAgICAgICB9LCAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9KSwgZzsKICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKDtfOyApIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IDIgJiBvcFswXSA/IHkucmV0dXJuIDogb3BbMF0gPyB5LnRocm93IHx8ICgodCA9IHkucmV0dXJuKSAmJiB0LmNhbGwoeSksIAogICAgICAgICAgICAgICAgICAgICAgICAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoeSA9IDAsIHQgJiYgKG9wID0gWyAyICYgb3BbMF0sIHQudmFsdWUgXSksIG9wWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5sYWJlbCsrLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKyssIHkgPSBvcFsxXSwgb3AgPSBbIDAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpLCBfLnRyeXMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsICh0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgfHwgNiAhPT0gb3BbMF0gJiYgMiAhPT0gb3BbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMyA9PT0gb3BbMF0gJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDYgPT09IG9wWzBdICYmIF8ubGFiZWwgPCB0WzFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV0sIHQgPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl0sIF8ub3BzLnB1c2gob3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFsyXSAmJiBfLm9wcy5wb3AoKSwgXy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcCA9IFsgNiwgZSBdLCB5ID0gMDsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICBmID0gdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICg1ICYgb3BbMF0pIHRocm93IG9wWzFdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KFsgbiwgdiBdKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfX3JlYWQobywgbikgewogICAgICAgIHZhciBpLCByLCBhciwgZSwgbSA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgICAgaWYgKCFtKSByZXR1cm4gbzsKICAgICAgICBpID0gbS5jYWxsKG8pLCBhciA9IFtdOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoOyh2b2lkIDAgPT09IG4gfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmU7ICkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBlID0gewogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yCiAgICAgICAgICAgIH07CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHIgJiYgIXIuZG9uZSAmJiAobSA9IGkucmV0dXJuKSAmJiBtLmNhbGwoaSk7CiAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYXI7CiAgICB9CiAgICBmdW5jdGlvbiBfX3NwcmVhZCgpIHsKICAgICAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpOwogICAgICAgIHJldHVybiBhcjsKICAgIH0KICAgIGZ1bmN0aW9uIHN0eWxlSW5qZWN0KGNzcywgcmVmKSB7CiAgICAgICAgdmFyIGluc2VydEF0LCBoZWFkLCBzdHlsZTsKICAgICAgICB2b2lkIDAgPT09IHJlZiAmJiAocmVmID0ge30pLCBpbnNlcnRBdCA9IHJlZi5pbnNlcnRBdCwgY3NzICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBkb2N1bWVudCAmJiAoaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSwgCiAgICAgICAgKHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkudHlwZSA9ICJ0ZXh0L2NzcyIsICJ0b3AiID09PSBpbnNlcnRBdCAmJiBoZWFkLmZpcnN0Q2hpbGQgPyBoZWFkLmluc2VydEJlZm9yZShzdHlsZSwgaGVhZC5maXJzdENoaWxkKSA6IGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpLCAKICAgICAgICBzdHlsZS5zdHlsZVNoZWV0ID8gc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzIDogc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSkpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sIG1vZHVsZSkgewogICAgICAgIHJldHVybiBmbihtb2R1bGUgPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgfSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0czsKICAgIH0KICAgIFJlYWN0RE9NX19kZWZhdWx0ID0gX2ludGVyb3BEZWZhdWx0TGVnYWN5KFJlYWN0RE9NKSwgU3dhbF9fZGVmYXVsdCA9IF9pbnRlcm9wRGVmYXVsdExlZ2FjeShTd2FsKSwgCiAgICBWaWV3ZXJfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHRMZWdhY3koVmlld2VyKSwgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICByZXR1cm4gKGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgewogICAgICAgICAgICBfX3Byb3RvX186IFtdCiAgICAgICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICAgICAgZC5fX3Byb3RvX18gPSBiOwogICAgICAgIH0gfHwgZnVuY3Rpb24oZCwgYikgewogICAgICAgICAgICBmb3IgKHZhciBwIGluIGIpIGIuaGFzT3duUHJvcGVydHkocCkgJiYgKGRbcF0gPSBiW3BdKTsKICAgICAgICB9KShkLCBiKTsKICAgIH0sIHVwZGF0ZV9rZXkgPSAiaXNVcGRhdGUiLCBNaW4gPSA2MCwgSG91ciA9IDYwICogTWluLCBEYXkgPSAyNCAqIEhvdXIsIFdlZWsgPSA3ICogRGF5LCAKICAgIGZ1bmN0aW9uKEJyb3dlclR5cGUpIHsKICAgICAgICBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuRWRnZSA9IDBdID0gIkVkZ2UiLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuRWRnID0gMV0gPSAiRWRnIiwgCiAgICAgICAgQnJvd2VyVHlwZVtCcm93ZXJUeXBlLkNocm9tZSA9IDJdID0gIkNocm9tZSIsIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5GaXJlZm94ID0gM10gPSAiRmlyZWZveCIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5TYWZpcmkgPSA0XSA9ICJTYWZpcmkiLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuU2UzNjAgPSA1XSA9ICJTZTM2MCIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5JZTIzNDUgPSA2XSA9ICJJZTIzNDUiLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuQmFpZHUgPSA3XSA9ICJCYWlkdSIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5MaWViYW8gPSA4XSA9ICJMaWViYW8iLCBCcm93ZXJUeXBlW0Jyb3dlclR5cGUuVUMgPSA5XSA9ICJVQyIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5RUSA9IDEwXSA9ICJRUSIsIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5Tb2dvdSA9IDExXSA9ICJTb2dvdSIsIAogICAgICAgIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5PcGVyYSA9IDEyXSA9ICJPcGVyYSIsIEJyb3dlclR5cGVbQnJvd2VyVHlwZS5NYXh0aG9uID0gMTNdID0gIk1heHRob24iOwogICAgfShCcm93ZXJUeXBlIHx8IChCcm93ZXJUeXBlID0ge30pKSwgTG9nZ2VyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gTG9nZ2VyKCkge30KICAgICAgICByZXR1cm4gTG9nZ2VyLmxvZyA9IGZ1bmN0aW9uKG1zZywgZ3JvdXAsIGxldmVsKSB7fSwgTG9nZ2VyLmRlYnVnID0gZnVuY3Rpb24obXNnLCBncm91cCkgewogICAgICAgICAgICB2b2lkIDAgPT09IGdyb3VwICYmIChncm91cCA9ICJkZWJ1ZyIpLCB0aGlzLmxvZyhtc2csIGdyb3VwLCBMb2dMZXZlbC5kZWJ1Zyk7CiAgICAgICAgfSwgTG9nZ2VyLmluZm8gPSBmdW5jdGlvbihtc2csIGdyb3VwKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gZ3JvdXAgJiYgKGdyb3VwID0gImluZm8iKSwgdGhpcy5sb2cobXNnLCBncm91cCwgTG9nTGV2ZWwuaW5mbyk7CiAgICAgICAgfSwgTG9nZ2VyLndhcm4gPSBmdW5jdGlvbihtc2csIGdyb3VwKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gZ3JvdXAgJiYgKGdyb3VwID0gIndhcm5pbmciKSwgdGhpcy5sb2cobXNnLCBncm91cCwgTG9nTGV2ZWwud2Fybik7CiAgICAgICAgfSwgTG9nZ2VyLmVycm9yID0gZnVuY3Rpb24obXNnLCBncm91cCkgewogICAgICAgICAgICB2b2lkIDAgPT09IGdyb3VwICYmIChncm91cCA9ICJlcnJvciIpLCB0aGlzLmxvZyhtc2csIGdyb3VwLCBMb2dMZXZlbC5lcnJvcik7CiAgICAgICAgfSwgTG9nZ2VyOwogICAgfSgpLCBmdW5jdGlvbihMb2dMZXZlbCkgewogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsLmRlYnVnID0gMF0gPSAiZGVidWciLCBMb2dMZXZlbFtMb2dMZXZlbC5pbmZvID0gMV0gPSAiaW5mbyIsIExvZ0xldmVsW0xvZ0xldmVsLndhcm4gPSAyXSA9ICJ3YXJuIiwgCiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWwuZXJyb3IgPSAzXSA9ICJlcnJvciI7CiAgICB9KExvZ0xldmVsIHx8IChMb2dMZXZlbCA9IHt9KSksIGZ1bmN0aW9uKFZlcnNpb25SZXN1bHQpIHsKICAgICAgICBWZXJzaW9uUmVzdWx0W1ZlcnNpb25SZXN1bHQubGVzcyA9IC0xXSA9ICJsZXNzIiwgVmVyc2lvblJlc3VsdFtWZXJzaW9uUmVzdWx0LmVxdWFsID0gMF0gPSAiZXF1YWwiLCAKICAgICAgICBWZXJzaW9uUmVzdWx0W1ZlcnNpb25SZXN1bHQuZ3JlYXRlciA9IDFdID0gImdyZWF0ZXIiLCBWZXJzaW9uUmVzdWx0W1ZlcnNpb25SZXN1bHQuaW5jb21wYXJhYmxlID0gTmFOXSA9ICJpbmNvbXBhcmFibGUiOwogICAgfShWZXJzaW9uUmVzdWx0IHx8IChWZXJzaW9uUmVzdWx0ID0ge30pKSwgQ29yZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIENvcmUoKSB7CiAgICAgICAgICAgIHRoaXMudXJsID0gQ29yZS5jdXJyZW50VXJsKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBDb3JlLlJlbmRlciA9IGZ1bmN0aW9uKGVsZW1lbnQsIGlkKSB7CiAgICAgICAgICAgIHZhciBzY3JpcHQsIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgICAgICAgY29udGFpbmVyIHx8ICgoc2NyaXB0ID0gdW5zYWZlV2luZG93LndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaWQgPSBpZCwgCiAgICAgICAgICAgIHVuc2FmZVdpbmRvdy53aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmQoc2NyaXB0KSwgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKSwgCiAgICAgICAgICAgIFJlYWN0RE9NX19kZWZhdWx0LmRlZmF1bHQucmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lcik7CiAgICAgICAgfSwgQ29yZS5hcHBlbmRUbyA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBodG1sKSB7CiAgICAgICAgICAgICQoc2VsZWN0b3IpLmFwcGVuZChodG1sKTsKICAgICAgICB9LCBDb3JlLnByZXBlbmQgPSBmdW5jdGlvbihzZWxlY3RvciwgaHRtbCkgewogICAgICAgICAgICAkKHNlbGVjdG9yKS5wcmVwZW5kKGh0bWwpOwogICAgICAgIH0sIENvcmUubGF6eWxvYWQgPSBmdW5jdGlvbihjYWxsYmFjaywgdGltZSkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0aW1lICYmICh0aW1lID0gNSksIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIFByb21pc2UsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCAoZnVuY3Rpb24oX2EpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIDQsIGNhbGxiYWNrKCkgXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hLnNlbnQoKSwgcmVzb2x2ZSgpLCBbIDIgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIDFlMyAqIHRpbWUpOwogICAgICAgICAgICAgICAgICAgIH0pKSBdOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQ29yZS5hdXRvTGF6eWxvYWQgPSBmdW5jdGlvbihpc19vaywgY2FsbGJhY2ssIHRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IDUpLCBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCBQcm9taXNlLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbIDIsIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNfb2soKSA/IFsgMywgMSBdIDogKHNldFRpbWVvdXQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5hdXRvTGF6eWxvYWQoaXNfb2ssIGNhbGxiYWNrLCB0aW1lKS50aGVuKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMWUzICogdGltZSksIFsgMywgMyBdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIDQsIGNhbGxiYWNrKCkgXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKSwgTG9nZ2VyLmRlYnVnKCJcdTgxZWFcdTUyYThcdTVlZjZcdThmZGZcdTU2ZGVcdThjMDNcdTYyNjdcdTg4NGNcdTViOGNcdTZiZDUsXHU1ZWY2XHU2NWY2XHU2NWY2XHU5NWY0OiIgKyB0aW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKSwgX2EubGFiZWwgPSAzOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0pKSBdOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQ29yZS5zbGVlcCA9IGZ1bmN0aW9uKHRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICB9KSwgMWUzICogdGltZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBDb3JlLnJhbmRvbSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IG1heCAtIG1pbiwgcmFuZCA9IE1hdGgucmFuZG9tKCk7CiAgICAgICAgICAgIHJldHVybiBtaW4gKyBNYXRoLnJvdW5kKHJhbmQgKiByYW5nZSk7CiAgICAgICAgfSwgQ29yZS5yYW5kU3RyID0gZnVuY3Rpb24obGVuKSB7CiAgICAgICAgICAgIHZhciAkY2hhcnMsIG1heFBvcywgcHdkLCBpOwogICAgICAgICAgICBmb3IgKHZvaWQgMCA9PT0gbGVuICYmIChsZW4gPSA0KSwgbWF4UG9zID0gKCRjaGFycyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIpLmxlbmd0aCwgCiAgICAgICAgICAgIHB3ZCA9ICIiLCBpID0gMDsgaSA8IGxlbjsgaSsrKSBwd2QgKz0gJGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXhQb3MpKTsKICAgICAgICAgICAgcmV0dXJuIHB3ZDsKICAgICAgICB9LCBDb3JlLmJhY2tncm91bmQgPSBmdW5jdGlvbihjYWxsYmFjaywgdGltZSkgewogICAgICAgICAgICB2b2lkIDAgPT09IHRpbWUgJiYgKHRpbWUgPSA1KSwgc2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSksIDFlMyAqIHRpbWUpOwogICAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb3JlLCAiaGVhZCIsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bnNhZmVXaW5kb3cud2luZG93LmRvY3VtZW50LmhlYWQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgfSksIENvcmUuaXNOdW1iZXIgPSBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIHJldHVybiAhQXJyYXkuaXNBcnJheShhKSAmJiBhIC0gcGFyc2VGbG9hdChhKSA+PSAwOwogICAgICAgIH0sIENvcmUuYWRkVXJsID0gZnVuY3Rpb24oa2V5LCB1cmwpIHsKICAgICAgICAgICAgR01fc2V0VmFsdWUoa2V5LCB1cmwpOwogICAgICAgIH0sIENvcmUub3BlblVybCA9IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICB0aGlzLm9wZW4oR01fZ2V0VmFsdWUoa2V5KSk7CiAgICAgICAgfSwgQ29yZS5nZXRQYXIgPSBmdW5jdGlvbihvcHRpb24sIHVybCkgewogICAgICAgICAgICB2b2lkIDAgPT09IHVybCAmJiAodXJsID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgICAgIHZhciB2ID0gdXJsLm1hdGNoKG5ldyBSZWdFeHAoIls/Jl0iICsgb3B0aW9uICsgIj0oW14mXSspIiwgImkiKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsID09IHYgfHwgdi5sZW5ndGggPCAxID8gIiIgOiB2WzFdOwogICAgICAgIH0sIENvcmUuYXBwZW5kQ3NzID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHZhciBsaW5rQ1NTID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpOwogICAgICAgICAgICBsaW5rQ1NTLnR5cGUgPSAidGV4dC9jc3MiLCBsaW5rQ1NTLnJlbCA9ICJzdHlsZXNoZWV0IiwgbGlua0NTUy5ocmVmID0gdXJsLCBDb3JlLmhlYWQuYXBwZW5kQ2hpbGQobGlua0NTUyk7CiAgICAgICAgfSwgQ29yZS5hcHBlbmRDc3NDb250ZW50ID0gZnVuY3Rpb24oY29udGVudCkgewogICAgICAgICAgICB2YXIgU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgICAgICBTdHlsZS5pbm5lckhUTUwgPSBjb250ZW50LCBDb3JlLmhlYWQuYXBwZW5kQ2hpbGQoU3R5bGUpOwogICAgICAgIH0sIENvcmUucHJvdG90eXBlLmJvZHlBcHBlbmRDc3MgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZCgkKCc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IicgKyB1cmwgKyAnIj4nKSk7CiAgICAgICAgfSwgQ29yZS5ib2R5QXBwZW5kID0gZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICAkKCJib2R5IikuYXBwZW5kKGh0bWwpOwogICAgICAgIH0sIENvcmUuYm9keVByZXBlbmQgPSBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgICQoImJvZHkiKS5wcmVwZW5kKGh0bWwpOwogICAgICAgIH0sIENvcmUuYXBwZW5kSnMgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgdmFyIGxpbmtTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgICAgICAgbGlua1NjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCIsIGxpbmtTY3JpcHQuc3JjID0gdXJsLCB0aGlzLmhlYWQuYXBwZW5kQ2hpbGQobGlua1NjcmlwdCk7CiAgICAgICAgfSwgQ29yZS5wcm90b3R5cGUuYm9keUFwcGVuZEpzID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgICQoImJvZHkiKS5hcHBlbmQoJCgnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyArIHVybCArICciPjxcL3NjcmlwdD4nKSk7CiAgICAgICAgfSwgQ29yZS5jdXJyZW50VXJsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZSwgInVybCIsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW51bWVyYWJsZTogITEsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICB9KSwgQ29yZS5pbklmcmFtZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gISghc2VsZi5mcmFtZUVsZW1lbnQgfHwgIklGUkFNRSIgIT0gc2VsZi5mcmFtZUVsZW1lbnQudGFnTmFtZSkgfHwgKHdpbmRvdy5mcmFtZXMubGVuZ3RoICE9IHBhcmVudC5mcmFtZXMubGVuZ3RoIHx8IHNlbGYgIT0gdG9wKTsKICAgICAgICB9LCBDb3JlLmZvcm1hdCA9IGZ1bmN0aW9uKHRpbWUsIGZtdCkgewogICAgICAgICAgICB2YXIgbywgazsKICAgICAgICAgICAgZm9yIChrIGluIHZvaWQgMCA9PT0gZm10ICYmIChmbXQgPSAieXl5eS1NTS1kZCBoaDptbTpzcyIpLCBvID0gewogICAgICAgICAgICAgICAgIk0rIjogdGltZS5nZXRNb250aCgpICsgMSwKICAgICAgICAgICAgICAgICJkKyI6IHRpbWUuZ2V0RGF0ZSgpLAogICAgICAgICAgICAgICAgImgrIjogdGltZS5nZXRIb3VycygpLAogICAgICAgICAgICAgICAgIm0rIjogdGltZS5nZXRNaW51dGVzKCksCiAgICAgICAgICAgICAgICAicysiOiB0aW1lLmdldFNlY29uZHMoKSwKICAgICAgICAgICAgICAgICJxKyI6IE1hdGguZmxvb3IoKHRpbWUuZ2V0TW9udGgoKSArIDMpIC8gMyksCiAgICAgICAgICAgICAgICBTOiB0aW1lLmdldE1pbGxpc2Vjb25kcygpCiAgICAgICAgICAgIH0sIC8oeSspLy50ZXN0KGZtdCkgJiYgKGZtdCA9IGZtdC5yZXBsYWNlKFJlZ0V4cC4kMSwgKHRpbWUuZ2V0RnVsbFllYXIoKSArICIiKS5zdWJzdHIoNCAtIFJlZ0V4cC4kMS5sZW5ndGgpKSksIAogICAgICAgICAgICBvKSBuZXcgUmVnRXhwKCIoIiArIGsgKyAiKSIpLnRlc3QoZm10KSAmJiAoZm10ID0gZm10LnJlcGxhY2UoUmVnRXhwLiQxLCAxID09IFJlZ0V4cC4kMS5sZW5ndGggPyBvW2tdIDogKCIwMCIgKyBvW2tdKS5zdWJzdHIoKCIiICsgb1trXSkubGVuZ3RoKSkpOwogICAgICAgICAgICByZXR1cm4gZm10OwogICAgICAgIH0sIENvcmUuc2l6ZUZvcm1hdCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHZhciB1bml0LCBpbmRleDsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSArdmFsdWUgPyAodW5pdCA9IFsgIkIiLCAiS0IiLCAiTUIiLCAiR0IiLCAiVEIiLCAiUEIiLCAiRUIiLCAiWkIiLCAiWUIiIF0sIAogICAgICAgICAgICBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5sb2coMTAyNCkpLCAiIiArICh2YWx1ZSAvIE1hdGgucG93KDEwMjQsIGluZGV4KSkudG9GaXhlZCgxKSArIHVuaXRbaW5kZXhdKSA6ICIiOwogICAgICAgIH0sIENvcmUuZW5jb2RlID0gZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuYnRvYShzdHIpOwogICAgICAgIH0sIENvcmUuZGVjb2RlID0gZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuYXRvYihzdHIpOwogICAgICAgIH0sIENvcmUucHJvdG90eXBlLk1zZyA9IGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICByZXR1cm4gbGF5ZXIubXNnKG1zZywgewogICAgICAgICAgICAgICAgaWNvbjogNQogICAgICAgICAgICB9KTsKICAgICAgICB9LCBDb3JlLnByb3RvdHlwZS5zaG93Q29udGVudCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBsYXllci5vcGVuKHsKICAgICAgICAgICAgICAgIHR5cGU6IDEsCiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsCiAgICAgICAgICAgICAgICBzaGFkZTogMCwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgQ29yZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgbGF5ZXIuY2xvc2Uob2JqKTsKICAgICAgICB9LCBDb3JlLnByb3RvdHlwZS5jbG9zZUFsbCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBsYXllci5jbG9zZUFsbCgpOwogICAgICAgIH0sIENvcmUub3BlbiA9IGZ1bmN0aW9uKHVybCwgbG9hZEluQmFja0dyb3VuZCkgewogICAgICAgICAgICBpZiAodm9pZCAwID09PSBsb2FkSW5CYWNrR3JvdW5kICYmIChsb2FkSW5CYWNrR3JvdW5kID0gITEpLCBDb3JlLmdldEJyb3dzZXIoKSA9PSBCcm93ZXJUeXBlLlNhZmlyaSAmJiAidW5kZWZpbmVkIiA9PSB0eXBlb2YgR01fb3BlbkluVGFiKSB7CiAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSAobnVsbCA9PT0gR00gfHwgdm9pZCAwID09PSBHTSA/IHZvaWQgMCA6IEdNLm9wZW5JblRhYikpIHJldHVybiB2b2lkIHdpbmRvdy5vcGVuKHVybCwgIl9ibGFuayIpOwogICAgICAgICAgICAgICAgbnVsbCA9PT0gR00gfHwgdm9pZCAwID09PSBHTSB8fCBHTS5vcGVuSW5UYWIodXJsLCBsb2FkSW5CYWNrR3JvdW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCBsb2FkSW5CYWNrR3JvdW5kKTsKICAgICAgICB9LCBDb3JlLmNsaWNrID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICQoc2VsZWN0b3IpLm9uKCJjbGljayIsIGNhbGxiYWNrKTsKICAgICAgICB9LCBDb3JlLnV1aWQgPSBmdW5jdGlvbihsZW4sIHNwbGl0LCByYWRpeCkgewogICAgICAgICAgICB2YXIgY2hhcnMsIHV1aWQsIGksIHI7CiAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGxlbiAmJiAobGVuID0gMTApLCB2b2lkIDAgPT09IHNwbGl0ICYmIChzcGxpdCA9ICExKSwgdm9pZCAwID09PSByYWRpeCAmJiAocmFkaXggPSAwKSwgCiAgICAgICAgICAgIGNoYXJzID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zcGxpdCgiIiksIAogICAgICAgICAgICB1dWlkID0gW10sIHJhZGl4ID0gMCA9PSByYWRpeCA/IHJhZGl4IHx8IGNoYXJzLmxlbmd0aCA6IHJhZGl4LCBzcGxpdCkgZm9yIChyID0gdm9pZCAwLCAKICAgICAgICAgICAgdXVpZFs4XSA9IHV1aWRbMTNdID0gdXVpZFsxOF0gPSB1dWlkWzIzXSA9ICItIiwgdXVpZFsxNF0gPSAiNCIsIGkgPSAwOyBpIDwgMzY7IGkrKykgdXVpZFtpXSB8fCAociA9IDAgfCAxNiAqIE1hdGgucmFuZG9tKCksIAogICAgICAgICAgICB1dWlkW2ldID0gY2hhcnNbMTkgPT0gaSA/IDMgJiByIHwgOCA6IHJdKTsgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHV1aWRbaV0gPSBjaGFyc1swIHwgTWF0aC5yYW5kb20oKSAqIHJhZGl4XTsKICAgICAgICAgICAgcmV0dXJuIHV1aWQuam9pbigiIik7CiAgICAgICAgfSwgQ29yZS5nZXRCcm93c2VyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBicm93c2VyID0gITEsIHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHJldHVybiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveC8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuRmlyZWZveCA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC9lZGdlLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5FZGdlIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL2VkZy8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuRWRnIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL2JpZHVicm93c2VyLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5CYWlkdSA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC9sYmJyb3dzZXIvKSA/IGJyb3dzZXIgPSBCcm93ZXJUeXBlLkxpZWJhbyA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC91YnJvd3Nlci8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuVUMgOiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvcXFicm93c2UvKSA/IGJyb3dzZXIgPSBCcm93ZXJUeXBlLlFRIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL21ldGFzci8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuU29nb3UgOiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvb3ByLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5PcGVyYSA6IG51bGwgIT0gdXNlckFnZW50Lm1hdGNoKC9tYXh0aG9uLykgPyBicm93c2VyID0gQnJvd2VyVHlwZS5NYXh0aG9uIDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goLzIzNDVleHBsb3Jlci8pID8gYnJvd3NlciA9IEJyb3dlclR5cGUuSWUyMzQ1IDogbnVsbCAhPSB1c2VyQWdlbnQubWF0Y2goL2Nocm9tZS8pID8gYnJvd3NlciA9IG5hdmlnYXRvci5taW1lVHlwZXMubGVuZ3RoID4gMTAgPyBCcm93ZXJUeXBlLlNlMzYwIDogQnJvd2VyVHlwZS5DaHJvbWUgOiBudWxsICE9IHVzZXJBZ2VudC5tYXRjaCgvc2FmYXJpLykgJiYgKGJyb3dzZXIgPSBCcm93ZXJUeXBlLlNhZmlyaSksIAogICAgICAgICAgICBicm93c2VyOwogICAgICAgIH0sIENvcmUuZ2V0UGVyY2VudCA9IGZ1bmN0aW9uKG51bSwgdG90YWwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bSA9IHBhcnNlRmxvYXQoU3RyaW5nKG51bSkpLCB0b3RhbCA9IHBhcnNlRmxvYXQoU3RyaW5nKHRvdGFsKSksIGlzTmFOKG51bSkgfHwgaXNOYU4odG90YWwpID8gMCA6IHRvdGFsIDw9IDAgPyAiMCIgOiBNYXRoLnJvdW5kKG51bSAvIHRvdGFsICogMWU0KSAvIDEwMDsKICAgICAgICB9LCBDb3JlLmdldFJlYWN0ID0gZnVuY3Rpb24oZG9tLCB0cmF2ZXJzZVVwKSB7CiAgICAgICAgICAgIHZhciBkb21GaWJlciwgY29tcEZpYmVyXzEsIGksIEdldENvbXBGaWJlciwgY29tcEZpYmVyOwogICAgICAgICAgICBpZiAodm9pZCAwID09PSB0cmF2ZXJzZVVwICYmICh0cmF2ZXJzZVVwID0gMCksIG51bGwgPT0gKGRvbUZpYmVyID0gZG9tW09iamVjdC5rZXlzKGRvbSkuZmluZCgoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RGaWJlciQiKSB8fCBrZXkuc3RhcnRzV2l0aCgiX19yZWFjdEludGVybmFsSW5zdGFuY2UkIik7CiAgICAgICAgICAgIH0pKV0pKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgaWYgKGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudCkgewogICAgICAgICAgICAgICAgZm9yIChjb21wRmliZXJfMSA9IGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudC5fb3duZXIsIGkgPSAwOyBpIDwgdHJhdmVyc2VVcDsgaSsrKSBjb21wRmliZXJfMSA9IGNvbXBGaWJlcl8xLl9jdXJyZW50RWxlbWVudC5fb3duZXI7CiAgICAgICAgICAgICAgICByZXR1cm4gY29tcEZpYmVyXzEuX2luc3RhbmNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoY29tcEZpYmVyID0gKEdldENvbXBGaWJlciA9IGZ1bmN0aW9uKGZpYmVyKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjsgInN0cmluZyIgPT0gdHlwZW9mIHBhcmVudEZpYmVyLnR5cGU7ICkgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50RmliZXI7CiAgICAgICAgICAgIH0pKGRvbUZpYmVyKSwgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIGNvbXBGaWJlciA9IEdldENvbXBGaWJlcihjb21wRmliZXIpOwogICAgICAgICAgICByZXR1cm4gY29tcEZpYmVyLnN0YXRlTm9kZSB8fCBjb21wRmliZXI7CiAgICAgICAgfSwgQ29yZS5jb3B5VGV4dCA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICAgICAgdmFyIHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsKICAgICAgICAgICAgcmV0dXJuIHRleHRBcmVhLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIiwgdGV4dEFyZWEuc3R5bGUudmlzaWJpbGl0eSA9ICItMTAwMDBweCIsIAogICAgICAgICAgICB0ZXh0QXJlYS52YWx1ZSA9IHRleHQsIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpLCB0ZXh0QXJlYS5mb2N1cygpLCB0ZXh0QXJlYS5zZWxlY3QoKSwgCiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCJjb3B5IikgPyAoZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSksICEwKSA6IChkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRBcmVhKSwgCiAgICAgICAgICAgICExKTsKICAgICAgICB9LCBDb3JlLmdldEdtQ29va2llID0gZnVuY3Rpb24oa2V5LCBkb21haW4pIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZG9tYWluICYmIChkb21haW4gPSAiIiksIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgIGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgR01fY29va2llKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IENvcmUudXJsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBkb21haW4gJiYgKG9iai5kb21haW4gPSBkb21haW4pLCBHTV9jb29raWUubGlzdChvYmosIChmdW5jdGlvbihjb29raWVzLCBlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBjb29raWVzID8gdm9pZCAwIDogY29va2llcy5sZW5ndGgpID4gMCA/IHJlc29sdmUoY29va2llc1swXS52YWx1ZSkgOiAoTG9nZ2VyLndhcm4oImdldCBjb29raWUgWyIgKyBrZXkgKyAiXSBpcyBlcnJvcjoiICsgZXJyb3IpLCAKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgiIikpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0gZWxzZSByZXNvbHZlKCIiKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIENvcmUuZ2V0Q29va2llID0gZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgIHZhciBpLCBsLCB0ZW1wQXJyLCBhcnIgPSBkb2N1bWVudC5jb29raWUucmVwbGFjZSgvXHMvZywgIiIpLnNwbGl0KCI7Iik7CiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbDsgaSsrKSBpZiAoKHRlbXBBcnIgPSBhcnJbaV0uc3BsaXQoIj0iKSlbMF0gPT0ga2V5KSByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHRlbXBBcnJbMV0pOwogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfSwgQ29yZTsKICAgIH0oKSwgVmVyc2lvbkNvbXBhciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIFZlcnNpb25Db21wYXIoZSkgewogICAgICAgICAgICAvXltcZFwuXSskLy50ZXN0KGUpIHx8IExvZ2dlci5lcnJvcigiSW52YWxpZCB2ZXJzaW9uIHN0cmluZyIpLCB0aGlzLnBhcnRzID0gZS5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGUpOwogICAgICAgICAgICB9KSksIHRoaXMudmVyc2lvblN0cmluZyA9IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBWZXJzaW9uQ29tcGFyLnByb3RvdHlwZS5jb21wYXJlVG8gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgdGhpcy5wYXJ0cy5sZW5ndGg7ICsrdCkgewogICAgICAgICAgICAgICAgaWYgKGUucGFydHMubGVuZ3RoID09PSB0KSByZXR1cm4gVmVyc2lvblJlc3VsdC5ncmVhdGVyOwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFydHNbdF0gIT09IGUucGFydHNbdF0pIHJldHVybiB0aGlzLnBhcnRzW3RdID4gZS5wYXJ0c1t0XSA/IFZlcnNpb25SZXN1bHQuZ3JlYXRlciA6IFZlcnNpb25SZXN1bHQubGVzczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJ0cy5sZW5ndGggIT09IGUucGFydHMubGVuZ3RoID8gVmVyc2lvblJlc3VsdC5sZXNzIDogVmVyc2lvblJlc3VsdC5lcXVhbDsKICAgICAgICB9LCBWZXJzaW9uQ29tcGFyLnByb3RvdHlwZS5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVRvKGUpID09PSBWZXJzaW9uUmVzdWx0LmdyZWF0ZXI7CiAgICAgICAgfSwgVmVyc2lvbkNvbXBhci5wcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVUbyhlKSA9PT0gVmVyc2lvblJlc3VsdC5sZXNzOwogICAgICAgIH0sIFZlcnNpb25Db21wYXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVRvKGUpID09PSBWZXJzaW9uUmVzdWx0LmVxdWFsOwogICAgICAgIH0sIFZlcnNpb25Db21wYXI7CiAgICB9KCksIENvbmZpZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIENvbmZpZygpIHt9CiAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25maWcsICJlbnYiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gR01faW5mbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW51bWVyYWJsZTogITEsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICB9KSwgQ29uZmlnLmdldCA9IGZ1bmN0aW9uKGtleSwgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgICAgIHZhciBvYmpTdHIsIG9iajsKICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgPSAiIiksIG9ialN0ciA9IEdNX2dldFZhbHVlKHRoaXMuZW5jb2RlKGtleSksIG51bGwpKSB7CiAgICAgICAgICAgICAgICBpZiAoLTEgPT0gKG9iaiA9IEpTT04ucGFyc2Uob2JqU3RyKSkuZXhwIHx8IG9iai5leHAgPiAobmV3IERhdGUpLmdldFRpbWUoKSkgcmV0dXJuIExvZ2dlci5pbmZvKCJjYWNoZSB0cnVlOiIgKyBrZXkgKyAiLCIgKyBvYmouZXhwKSwgCiAgICAgICAgICAgICAgICBvYmoudmFsdWU7CiAgICAgICAgICAgICAgICBHTV9kZWxldGVWYWx1ZShrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBMb2dnZXIuaW5mbygiY2FjaGUgZmFsc2UiKSwgZGVmYXVsdFZhbHVlOwogICAgICAgIH0sIENvbmZpZy5zZXQgPSBmdW5jdGlvbihrZXksIHYsIGV4cCkgewogICAgICAgICAgICB2b2lkIDAgPT09IGV4cCAmJiAoZXhwID0gLTEpOwogICAgICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgICAgICB2YWx1ZTogdiwKICAgICAgICAgICAgICAgIGV4cDogLTEgPT0gZXhwID8gZXhwIDogKG5ldyBEYXRlKS5nZXRUaW1lKCkgKyAxZTMgKiBleHAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKG9iaiksIEdNX3NldFZhbHVlKHRoaXMuZW5jb2RlKGtleSksIEpTT04uc3RyaW5naWZ5KG9iaikpOwogICAgICAgIH0sIENvbmZpZy5yZW1lbWJlciA9IGZ1bmN0aW9uKGtleSwgZXhwLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc28sIHJlamVjdCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXQoa2V5LCBudWxsKTsKICAgICAgICAgICAgICAgIG51bGwgPT0gdiB8fCAiIiA9PT0gdiA/IGNhbGxiYWNrKCkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2V0KGtleSwgcmVzLCBleHApLCByZXNvKHJlcyk7CiAgICAgICAgICAgICAgICB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICAgICAgICB9KSkgOiAoTG9nZ2VyLmRlYnVnKHYpLCByZXNvKHYpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIENvbmZpZy5jbGVhciA9IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICBHTV9kZWxldGVWYWx1ZShrZXkpOwogICAgICAgIH0sIENvbmZpZy5kZWNvZGUgPSBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIGF0b2Ioc3RyKTsKICAgICAgICB9LCBDb25maWcuZW5jb2RlID0gZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBidG9hKHN0cik7CiAgICAgICAgfSwgQ29uZmlnLmluYyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgdmFyIHYgPSBDb25maWcuZ2V0KHMsIDApOwogICAgICAgICAgICB2KyssIENvbmZpZy5zZXQocywgdik7CiAgICAgICAgfSwgQ29uZmlnOwogICAgfSgpLCBBamF4T3B0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gQWpheE9wdGlvbihfdXJsLCBfbWV0aG9kVHlwZSwgX2RhdGEsIF9zdWNjZXNzLCBfaGVhZGVyLCB0aW1lT3V0KSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gX21ldGhvZFR5cGUgJiYgKF9tZXRob2RUeXBlID0gIkdFVCIpLCB2b2lkIDAgPT09IF9oZWFkZXIgJiYgKF9oZWFkZXIgPSBuZXcgTWFwKSwgCiAgICAgICAgICAgIHZvaWQgMCA9PT0gdGltZU91dCAmJiAodGltZU91dCA9IDYwKSwgdGhpcy51cmwgPSBfdXJsLCB0aGlzLm1ldGhvZFR5cGUgPSBfbWV0aG9kVHlwZSwgCiAgICAgICAgICAgIHRoaXMub25TdWNjZXNzID0gX3N1Y2Nlc3MsIHRoaXMub25FcnJvciA9IF9zdWNjZXNzLCB0aGlzLmRhdGEgPSBfZGF0YSwgdGhpcy5oZWFkZXJzID0gX2hlYWRlciwgCiAgICAgICAgICAgIHRoaXMudGltZU91dCA9IHRpbWVPdXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBBamF4T3B0aW9uLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmZF8xLCBmZCwgaTsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gdGhpcy5kYXRhOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhIGluc3RhbmNlb2YgTWFwKSByZXR1cm4gZmRfMSA9IG5ldyBGb3JtRGF0YSwgdGhpcy5kYXRhLmZvckVhY2goKGZ1bmN0aW9uKHYsIGspIHsKICAgICAgICAgICAgICAgIGZkXzEuYXBwZW5kKGssIHYpOwogICAgICAgICAgICB9KSksIGZkXzE7CiAgICAgICAgICAgIGZvciAoaSBpbiBmZCA9IG5ldyBGb3JtRGF0YSwgdGhpcy5kYXRhKSBmZC5hcHBlbmQoaSwgdGhpcy5kYXRhW2ldKTsKICAgICAgICAgICAgcmV0dXJuIGZkOwogICAgICAgIH0sIEFqYXhPcHRpb247CiAgICB9KCksIEh0dHAgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBIdHRwKCkge30KICAgICAgICByZXR1cm4gSHR0cC5hamF4ID0gZnVuY3Rpb24ob3B0aW9uKSB7CiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBoZWFkOwogICAgICAgICAgICBvcHRpb24uaGVhZGVycy5zZXQoIlVzZXItQWdlbnQiLCBudWxsICE9PSAoX2EgPSB1bnNhZmVXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85Mi4wLjQ1MTUuMTU5IFNhZmFyaS81MzcuMzYiKSwgCiAgICAgICAgICAgIG9wdGlvbi5oZWFkZXJzLnNldCgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL2F0b20reG1sLGFwcGxpY2F0aW9uL3htbCx0ZXh0L3htbCIpLCBoZWFkID0gbmV3IEh0dHBIZWFkZXJzLCAKICAgICAgICAgICAgb3B0aW9uLnVybC5pbmRleE9mKCJ3YW5kaGkiKSA+IDAgJiYgKGhlYWQudmVyc2lvbiA9IENvbmZpZy5lbnYuc2NyaXB0LnZlcnNpb24sIGhlYWQuYXV0aCA9IG51bGwgIT09IChfYiA9IENvbmZpZy5lbnYuc2NyaXB0LmF1dGhvcikgJiYgdm9pZCAwICE9PSBfYiA/IF9iIDogIiIsIAogICAgICAgICAgICBoZWFkLm5hbWVzcGFjZSA9IG51bGwgIT09IChfYyA9IENvbmZpZy5lbnYuc2NyaXB0Lm5hbWVzcGFjZSkgJiYgdm9pZCAwICE9PSBfYyA/IF9jIDogIiIpLCAKICAgICAgICAgICAgb3B0aW9uLmhlYWRlcnMuZm9yRWFjaCgoZnVuY3Rpb24odiwgaykgewogICAgICAgICAgICAgICAgaGVhZFtrXSA9IHY7CiAgICAgICAgICAgIH0pKSwgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgdXJsOiBvcHRpb24udXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiBvcHRpb24ubWV0aG9kVHlwZSwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWQsCiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24uZ2V0RGF0YSgpLAogICAgICAgICAgICAgICAgdGltZW91dDogMWUzICogb3B0aW9uLnRpbWVPdXQsCiAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gKF9hID0gb3B0aW9uLm9uU3VjY2VzcykgfHwgdm9pZCAwID09PSBfYSB8fCBfYS5jYWxsKG9wdGlvbiwgIlBPU1QiID09IG9wdGlvbi5tZXRob2RUeXBlID8gSlNPTi5wYXJzZShyZXMucmVzcG9uc2VUZXh0KSA6IHJlcy5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09IChfYiA9IG9wdGlvbi5vblN1Y2Nlc3MpIHx8IHZvaWQgMCA9PT0gX2IgfHwgX2IuY2FsbChvcHRpb24sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYzsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PT0gKF9hID0gcmVzLmZpbmFsVXJsKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EuaW5kZXhPZigiYWRndWFyZC5vcmciKSkgPiAwIHx8IChudWxsID09PSAoX2IgPSBvcHRpb24udXJsKSB8fCB2b2lkIDAgPT09IF9iID8gdm9pZCAwIDogX2IuaW5kZXhPZigianNkZWxpdnIiKSkgPiAwID8gb3B0aW9uLm9uRXJyb3IobnVsbCkgOiBudWxsID09PSAoX2MgPSBvcHRpb24ub25FcnJvcikgfHwgdm9pZCAwID09PSBfYyB8fCBfYy5jYWxsKG9wdGlvbiwgcmVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgSHR0cC5hamF4TmV3ID0gZnVuY3Rpb24odXJsLCBtZXRob2QsIGRhdGEsIGhlYWRlciwgZGF0YVR5cGUpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgaGVhZCwgX2dldERhdGEsIF9kYXRhOwogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBoZWFkZXIgJiYgKGhlYWRlciA9IG5ldyBNYXApLCB2b2lkIDAgPT09IGRhdGFUeXBlICYmIChkYXRhVHlwZSA9IHZvaWQgMCksIAogICAgICAgICAgICBoZWFkID0gbmV3IEh0dHBIZWFkZXJzLCBoZWFkZXIuc2l6ZSA+IDAgJiYgaGVhZGVyLmZvckVhY2goKGZ1bmN0aW9uKHYsIGspIHsKICAgICAgICAgICAgICAgIGhlYWRba10gPSB2OwogICAgICAgICAgICB9KSksIHVybC5pbmRleE9mKCJ3YW5kaGkiKSA+IDAgJiYgKGhlYWQudmVyc2lvbiA9IENvbmZpZy5lbnYuc2NyaXB0LnZlcnNpb24sIGhlYWQuYXV0aCA9IG51bGwgIT09IChfYSA9IENvbmZpZy5lbnYuc2NyaXB0LmF1dGhvcikgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogIiIsIAogICAgICAgICAgICBoZWFkLm5hbWVzcGFjZSA9IG51bGwgIT09IChfYiA9IENvbmZpZy5lbnYuc2NyaXB0Lm5hbWVzcGFjZSkgJiYgdm9pZCAwICE9PSBfYiA/IF9iIDogIiIpLCAKICAgICAgICAgICAgX2dldERhdGEgPSBmdW5jdGlvbihfZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKF9kYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmRfMSA9IG5ldyBGb3JtRGF0YTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGEuZm9yRWFjaCgoZnVuY3Rpb24odiwgaykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3Y7CiAgICAgICAgICAgICAgICAgICAgICAgIF92ID0gInN0cmluZyIgPT0gdHlwZW9mIHYgPyB2LnRvU3RyaW5nKCkgOiBKU09OLnN0cmluZ2lmeSh2KSwgZmRfMS5hcHBlbmQoaywgX3YpOwogICAgICAgICAgICAgICAgICAgIH0pKSwgZmRfMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShfZGF0YSk7CiAgICAgICAgICAgIH0sIF9kYXRhID0gX2dldERhdGEoZGF0YSksIExvZ2dlci5kZWJ1ZyhfZGF0YSksIG51bGwgIT0gZGF0YVR5cGUgPyAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgIT0gZGF0YVR5cGUgJiYgKGhlYWRbIkNvbnRlbnQtVHlwZSJdID0gZGF0YVR5cGUpIDogZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8IGRhdGEgaW5zdGFuY2VvZiBNYXAgPyBoZWFkWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9dXRmLTgiIDogaGVhZFsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsIAogICAgICAgICAgICBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZCwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBfZGF0YSwKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKHJlcy5yZXNwb25zZVRleHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhlcnJvciksIHJlc29sdmUocmVzLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcoZXJyKSwgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbnRpbWVvdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcoIlx1OGJmN1x1NmM0Mlx1OGQ4NVx1NjVmNjoiICsgdXJsKSwgcmVqZWN0KCJcdThiZjdcdTZjNDJcdThkODVcdTY1ZjYiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEh0dHAuZ2V0RGF0YSA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgJC5nZXRKU09OKHVybCwgKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGQpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgSHR0cC5KcUdldCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2ssIGhlYWQpIHsKICAgICAgICAgICAgdm9pZCAwID09PSBoZWFkICYmIChoZWFkID0gbmV3IE1hcCksIEh0dHAuZ2V0KHVybCwgbmV3IE1hcCwgaGVhZCkudGhlbigoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIdHRwLnBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIHRpbWVPdXQpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGltZU91dCAmJiAodGltZU91dCA9IDEwKSwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIEh0dHAuYWpheChuZXcgQWpheE9wdGlvbih1cmwsICJQT1NUIiwgZGF0YSwgKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpOwogICAgICAgICAgICAgICAgfSksIG5ldyBNYXAsIHRpbWVPdXQpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEh0dHAuZ2V0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBoZWFkLCBsb2FkaW5nLCB0aW1lX291dCkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBkYXRhICYmIChkYXRhID0gbmV3IE1hcCksIHZvaWQgMCA9PT0gaGVhZCAmJiAoaGVhZCA9IG5ldyBNYXApLCAKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lX291dCAmJiAodGltZV9vdXQgPSAxMCksIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgIEh0dHAuYWpheChuZXcgQWpheE9wdGlvbih1cmwsICJHRVQiLCBkYXRhLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBfYSwgcmVzOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IG51bGwgIT09IChfYSA9IEpTT04ucGFyc2UoZGF0YSkpICYmIHZvaWQgMCAhPT0gX2EgPyBfYSA6IGRhdGEsIHJlc29sdmUocmVzKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcoZXJyb3IpLCByZWplY3QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgaGVhZCwgdGltZV9vdXQpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEh0dHAuZ2V0V2l0aEhlYWQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGhlYWQsIHRpbWVfb3V0KSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGRhdGEgJiYgKGRhdGEgPSBuZXcgTWFwKSwgdm9pZCAwID09PSBoZWFkICYmIChoZWFkID0gbmV3IE1hcCksIAogICAgICAgICAgICB2b2lkIDAgPT09IHRpbWVfb3V0ICYmICh0aW1lX291dCA9IDEwKSwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgSHR0cC5hamF4KG5ldyBBamF4T3B0aW9uKHVybCwgIkdFVCIsIGRhdGEsIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCByZXM7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gbnVsbCAhPT0gKF9hID0gSlNPTi5wYXJzZShkYXRhKSkgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogZGF0YSwgcmVzb2x2ZShyZXMpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhlcnJvciksIHJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBoZWFkLCB0aW1lX291dCkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgSHR0cC5wb3N0V2l0aEhlYWQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGhlYWQsIHRpbWVfb3V0KSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGRhdGEgJiYgKGRhdGEgPSBuZXcgTWFwKSwgdm9pZCAwID09PSBoZWFkICYmIChoZWFkID0gbmV3IE1hcCksIAogICAgICAgICAgICB2b2lkIDAgPT09IHRpbWVfb3V0ICYmICh0aW1lX291dCA9IDEwKSwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgSHR0cC5hamF4KG5ldyBBamF4T3B0aW9uKHVybCwgIlBPU1QiLCBkYXRhLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKFsgdXJsLCBlcnJvciBdKSwgcmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIGhlYWQsIHRpbWVfb3V0KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIdHRwLmdldF90ZXh0ID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgSHR0cC5hamF4KG5ldyBBamF4T3B0aW9uKHVybCwgIkdFVCIsIG5ldyBNYXAsIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBIdHRwLmdldDMwMiA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZmluYWxVcmwpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25hYm9ydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoIiIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEh0dHA7CiAgICB9KCksIEh0dHBIZWFkZXJzID0gZnVuY3Rpb24gSHR0cEhlYWRlcnMoKSB7fSwgUm91dGUgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBSb3V0ZSgpIHsKICAgICAgICAgICAgdGhpcy5xdWVyeVRhbyA9ICIiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlLCAiYXBpUm9vdCIsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cHM6Ly9hcGkuaHVpemhlay5jb20vYXBpIjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW51bWVyYWJsZTogITEsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICB9KSwgUm91dGUuYmFzZUFwaSA9IGZ1bmN0aW9uKGFwaSwgZGF0YSwgY2FsbGJhY2ssIHRpbWVPdXQpIHsKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lT3V0ICYmICh0aW1lT3V0ID0gMTApLCBIdHRwLnBvc3QoUm91dGUuYXBpUm9vdCArIGFwaSwgZGF0YSwgdGltZU91dCkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXMpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgUm91dGUucXVlcnlTYnggPSBmdW5jdGlvbihpZCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgIiIgIT09IENvbmZpZy5nZXQodGhpcy5zeGJfa2V5LCAiIikgPyB0aGlzLnF1ZXJ5MzY1KGlkLCBDb25maWcuZ2V0KHRoaXMuc3hiX2tleSksIGNhbGxiYWNrKSA6IHRoaXMucXVlcnlWYWx1ZSgic3hiX2FuaGFvIiwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgX3RoaXMucXVlcnkzNjUoaWQsIHJlcy5kYXRhLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBSb3V0ZS5zYnhGZWVkYmFjayA9IGZ1bmN0aW9uKGlkLCBhbnN3ZXIpIHsKICAgICAgICAgICAgdGhpcy5iYXNlQXBpKCIvdG9vbHMvcmVjb3JkIiwgbmV3IE1hcChbIFsgImlkIiwgaWQgXSwgWyAiZGF0YSIsIGFuc3dlciBdLCBbICJhbmhhbyIsIENvbmZpZy5nZXQodGhpcy5zeGJfa2V5KSBdIF0pLCAoZnVuY3Rpb24oKSB7fSkpOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5MzY1ID0gZnVuY3Rpb24oaWQsIGFuaGFvLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgYXBpID0gQ29uZmlnLmdldCgic3hiX2FwaSIpOwogICAgICAgICAgICBhcGkgPyBIdHRwLnBvc3QoYXBpLCBuZXcgTWFwKFsgWyAiZG9jaW5mbyIsICJodHRwczovL3d3dy5zaGFuZ3h1ZWJhLmNvbS9hc2svIiArIGlkICsgIi5odG1sIiBdLCBbICJhbmhhbyIsIGFuaGFvIF0gXSkpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgY2FsbGJhY2socmVzKTsKICAgICAgICAgICAgfSkpIDogdGhpcy5xdWVyeVZhbHVlKCJzeGJfYXBpIiwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgQ29uZmlnLnNldCgic3hiX2FwaSIsIHJlcy5kYXRhLCA4NjRlNSksIEh0dHAucG9zdChyZXMuZGF0YSwgbmV3IE1hcChbIFsgImRvY2luZm8iLCAiaHR0cHM6Ly93d3cuc2hhbmd4dWViYS5jb20vYXNrLyIgKyBpZCArICIuaHRtbCIgXSwgWyAiYW5oYW8iLCBhbmhhbyBdIF0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5VmFsdWUgPSBmdW5jdGlvbihrZXksIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuYmFzZUFwaShSb3V0ZS5jb25maWcsIG5ldyBNYXAoWyBbICJrZXkiLCBrZXkgXSBdKSwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5SGlzdG9yeSA9IGZ1bmN0aW9uKHVybCwgc2l0ZVR5cGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuYmFzZUFwaSh0aGlzLmhpc3RvcnksIG5ldyBNYXAoWyBbICJ1cmwiLCB1cmwgXSwgWyAidHlwZSIsIHNpdGVUeXBlIF0gXSksIGNhbGxiYWNrKTsKICAgICAgICB9LCBSb3V0ZS5xdWVyeUhpc3RvcnlWNSA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc28sIHJlamUpIHsKICAgICAgICAgICAgICAgIF90aGlzLmJhc2VBcGkoX3RoaXMuaGlzdG9yeXYzLCBuZXcgTWFwKFsgWyAidXJsIiwgdXJsIF0gXSksIChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXMuY29kZSA/IHJlc28ocmVzKSA6IHJlamUocmVzKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5SGlzdG9yeVY0ID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogICAgICAgICAgICBIdHRwLkpxR2V0KHVybCwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5QmlsaUltZyA9IGZ1bmN0aW9uKGFpZCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgSHR0cC5nZXREYXRhKHRoaXMuYmlsaUluZm8gKyAiP2FpZD0iICsgYWlkLCBjYWxsYmFjayk7CiAgICAgICAgfSwgUm91dGUucXVlcnlCaWxpRG93biA9IGZ1bmN0aW9uKGFpZCwgY2lkLCBjYWxsYmFjaykgewogICAgICAgICAgICBIdHRwLmdldCh0aGlzLmJpbGlkb3duICsgIj9jaWQ9IiArIGNpZCArICImYXZpZD0iICsgYWlkICsgIiZxbj0xMTImZm52YWw9NDA0OCZzPXdhbmRoaSIpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgY2FsbGJhY2socmVzKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5QmlsaURvd25XZWIgPSBmdW5jdGlvbihhaWQsIGNpZCkgewogICAgICAgICAgICByZXR1cm4gSHR0cC5nZXQoImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3BsYXllci93YmkvcGxheXVybD9hdmlkPSIgKyBhaWQgKyAiJmNpZD0iICsgY2lkKTsKICAgICAgICB9LCBSb3V0ZS5xdWVyeUNvdXBvbnMgPSBmdW5jdGlvbihpdGVtSWQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuYmFzZUFwaSh0aGlzLmNvdXBvbnMsIG5ldyBNYXAoWyBbICJpZCIsIGl0ZW1JZCBdIF0pLCBjYWxsYmFjayk7CiAgICAgICAgfSwgUm91dGUucXVlcnlKZENvdXBvbnMgPSBmdW5jdGlvbihpdGVtSWQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIFJvdXRlLmJhc2VBcGkoUm91dGUuamRfY291cG9ucywgbmV3IE1hcChbIFsgIml0ZW1faWQiLCBpdGVtSWQgXSBdKSwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5U25Db3Vwb25zID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogICAgICAgICAgICBSb3V0ZS5iYXNlQXBpKFJvdXRlLnNuX2NvdXBvbnMsIG5ldyBNYXAoWyBbICJ1cmwiLCB1cmwgXSBdKSwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5VnBDb3Vwb25zID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogICAgICAgICAgICBSb3V0ZS5iYXNlQXBpKFJvdXRlLnZwX2NvdXBvbnMsIG5ldyBNYXAoWyBbICJ1cmwiLCB1cmwgXSBdKSwgY2FsbGJhY2spOwogICAgICAgIH0sIFJvdXRlLnF1ZXJ5S2xDb3Vwb25zID0gZnVuY3Rpb24oaXRlbUlkKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzbykgewogICAgICAgICAgICAgICAgUm91dGUuYmFzZUFwaShSb3V0ZS5rbF9jb3Vwb25zLCBuZXcgTWFwKFsgWyAiaXRlbUlkIiwgaXRlbUlkIF0gXSksIChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXNvKHJlcyk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBSb3V0ZS5jb3Vwb25RdWVyeSA9IGZ1bmN0aW9uKGl0ZW1JZCwgdHlwZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgUm91dGUuYmFzZUFwaSgiL2NvdXBvbnMvaW5mbyIsIG5ldyBNYXAoWyBbICJpZCIsIGl0ZW1JZCBdLCBbICJ0eXBlIiwgdHlwZSBdIF0pLCBjYWxsYmFjayk7CiAgICAgICAgfSwgUm91dGUuX2dldFN1cmwgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHJlZyA9IC8oPzw9c1wvfHN1cmw9KShbYS16QS1aMC05Xy1dKykvZzsKICAgICAgICAgICAgcmV0dXJuIHJlZy50ZXN0KENvcmUudXJsKSA/IENvcmUudXJsLm1hdGNoKHJlZylbMF0gOiAiIjsKICAgICAgICB9LCBSb3V0ZS5iYWlkdURyaWVjdCA9IGZ1bmN0aW9uKGZpZHMsIGFjY2Vzc1Rva2VuKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCBQcm9taXNlLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsOwogICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwgPSAiaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3Jlc3QvMi4wL3hwYW4vbXVsdGltZWRpYT9tZXRob2Q9ZmlsZW1ldGFzJmRsaW5rPTEmZnNpZHM9IiArIGZpZHMgKyAiJmFjY2Vzc190b2tlbj0iICsgYWNjZXNzVG9rZW4sIAogICAgICAgICAgICAgICAgICAgIFsgMiwgSHR0cC5hamF4TmV3KHVybCwgIkdFVCIsIG51bGwsIG5ldyBNYXAoWyBbICJVc2VyLUFnZW50IiwgInBhbi5iYWlkdS5jb20iIF0gXSkpIF07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBSb3V0ZS5iYWlkdUFjY2Vzc1Rva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBIdHRwLmdldDMwMigiaHR0cHM6Ly9vcGVuYXBpLmJhaWR1LmNvbS9vYXV0aC8yLjAvYXV0aG9yaXplP2NsaWVudF9pZD1JbExxQmJVM0dqUTB0NDZUUndGYXRlVHBySFdsMzl6RiZyZXNwb25zZV90eXBlPXRva2VuJnJlZGlyZWN0X3VyaT1vb2Imc2NvcGU9YmFzaWMsbmV0ZGlzayIpOwogICAgICAgIH0sIFJvdXRlLmJhaWR1QWNjZXNzVG9rZW5BdXRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB1cmwsIGh0bWwsIGRhdGE7CiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9jKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsID0gImh0dHBzOi8vb3BlbmFwaS5iYWlkdS5jb20vb2F1dGgvMi4wL2F1dGhvcml6ZT9jbGllbnRfaWQ9SWxMcUJiVTNHalEwdDQ2VFJ3RmF0ZVRwckhXbDM5ekYmcmVzcG9uc2VfdHlwZT10b2tlbiZyZWRpcmVjdF91cmk9b29iJnNjb3BlPWJhc2ljLG5ldGRpc2siLCAKICAgICAgICAgICAgICAgICAgICAgICAgWyA0LCBIdHRwLmdldF90ZXh0KHVybCkgXTsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sID0gX2Muc2VudCgpLCAoZGF0YSA9IG5ldyBNYXApLnNldCgiZ3JhbnRfcGVybWlzc2lvbnNfYXJyIiwgIm5ldGRpc2siKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0KCJiZHN0b2tlbiIsIG51bGwgPT09IChfYSA9IGh0bWwubWF0Y2goL25hbWU9ImJkc3Rva2VuIlxzK3ZhbHVlPSIoW14iXSspIi8pKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2FbMV0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXQoImNsaWVudF9pZCIsIG51bGwgPT09IChfYiA9IGh0bWwubWF0Y2goL25hbWU9ImNsaWVudF9pZCJccyt2YWx1ZT0iKFteIl0rKSIvKSkgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iWzFdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0KCJyZXNwb25zZV90eXBlIiwgInRva2VuIiksIGRhdGEuc2V0KCJkaXNwbGF5IiwgInBhZ2UiKSwgZGF0YS5zZXQoImdyYW50X3Blcm1pc3Npb25zIiwgImJhc2ljLG5ldGRpc2siKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIFsgMiwgSHR0cC5hamF4TmV3KHVybCwgIlBPU1QiLCBkYXRhLCBuZXcgTWFwLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpIF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgUm91dGUucXVhcmtEcmllY3QgPSBmdW5jdGlvbihmaWRzKSB7CiAgICAgICAgICAgIHJldHVybiBIdHRwLmFqYXhOZXcoImh0dHBzOi8vZHJpdmUucXVhcmsuY24vMS9jbG91ZGRyaXZlL2ZpbGUvZG93bmxvYWQ/cHI9dWNwcm8mZnI9cGMiLCAiUE9TVCIsIHsKICAgICAgICAgICAgICAgIGZpZHM6IGZpZHMKICAgICAgICAgICAgfSwgbmV3IE1hcChbIFsgIlVzZXItQWdlbnQiLCAicXVhcmstY2xvdWQtZHJpdmUiIF0gXSkpOwogICAgICAgIH0sIFJvdXRlLlJvdXRlQ29uZmlnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5nZXQoInNjcmlwdF9jb25maWciLCAhMSk7CiAgICAgICAgICAgICAgICBjb25maWcgPyByZXNvbHZlKGNvbmZpZykgOiBSb3V0ZS5iYXNlQXBpKCIvY29uZmlnL3NjcmlwdCIsIG5ldyBNYXAsIChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gSlNPTi5wYXJzZShDb3JlLmRlY29kZShyZXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgIENvbmZpZy5zZXQoInNjcmlwdF9jb25maWciLCBjb25maWcsIDIgKiBIb3VyKSwgcmVzb2x2ZShjb25maWcpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgUm91dGUuaG9tZV91cmwgPSAiaHR0cHM6Ly93aWtpLndhbmRoaS5jb20iLCBSb3V0ZS5ob21lX3VybF91cGRhdGUgPSAiaHR0cHM6Ly93aWtpLndhbmRoaS5jb20vemgtY24vQ2hhbmdlbG9nLmh0bWwiLCAKICAgICAgICBSb3V0ZS5pbnN0YWxsX3VybF9vbmUgPSAiaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM4NDUzOCIsIFJvdXRlLnN4Yl9hbmhhbyA9ICJodHRwOi8vd3d3LmxlbHVud2VuLmNvbS9lL2FjdGlvbi9MaXN0SW5mby8/Y2xhc3NpZD00NSIsIAogICAgICAgIFJvdXRlLnN4Yl9rZXkgPSAic3hiX2FuaGFvIiwgUm91dGUuY29uZmlnID0gIi9jb25maWcvcXVlcnkiLCBSb3V0ZS5oaXN0b3J5ID0gIi9oaXN0b3J5LyIsIAogICAgICAgIFJvdXRlLmhpc3Rvcnl2MSA9ICIvaGlzdG9yeS92MSIsIFJvdXRlLmhpc3Rvcnl2MiA9ICIvaGlzdG9yeS92MiIsIFJvdXRlLmhpc3Rvcnl2MyA9ICIvaGlzdG9yeS92MyIsIAogICAgICAgIFJvdXRlLmJpbGkgPSAiL3Rvb2xzL2JpbGkiLCBSb3V0ZS5iaWxpSW5mbyA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXciLCAKICAgICAgICBSb3V0ZS5iaWxpZG93biA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvd2JpL3BsYXl1cmwiLCBSb3V0ZS5jb3Vwb25zID0gIi90Yi9pbmZvcy8iLCAKICAgICAgICBSb3V0ZS5saWtlID0gIi90Yi9ndWVzc2xpa2UiLCBSb3V0ZS5qZF9jb3Vwb25zID0gIi9qZC9pbmZvIiwgUm91dGUuc25fY291cG9ucyA9ICIvc24vaW5mbyIsIAogICAgICAgIFJvdXRlLnZwX2NvdXBvbnMgPSAiL3ZwL2luZm8iLCBSb3V0ZS5rbF9jb3Vwb25zID0gIi9rbC9pbmZvIiwgUm91dGU7CiAgICB9KCksIGNzc18yNDh6JGEgPSAnaHRtbCAuYXNpZGUtbmF2IHtcbiAgICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gICAgZm9udC1zaXplOiA2Mi41JVxufVxuXG5ib2R5IC5hc2lkZS1uYXYge1xuICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsICJNaWNyb3NvZnQgWWFIZWkiLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICBtYXJnaW46IDA7XG4gICAgZm9udC1zaXplOiAxLjZyZW07XG4gICAgY29sb3I6ICM0ZTU0NmJcbn1cblxuLmFzaWRlLW5hdiB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAtNDdweDtcbiAgICB3aWR0aDogMjYwcHg7XG4gICAgaGVpZ2h0OiAyNjBweDtcbiAgICAtd2Via2l0LWZpbHRlcjogdXJsKCNnb28pO1xuICAgIGZpbHRlcjogdXJsKCNnb28pO1xuICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgb3BhY2l0eTogLjc1O1xuICAgIHotaW5kZXg6IDk5OTk5XG59XG5cbi5hc2lkZS1uYXYubm8tZmlsdGVyIHtcbiAgICAtd2Via2l0LWZpbHRlcjogbm9uZTtcbiAgICBmaWx0ZXI6IG5vbmVcbn1cblxuLmFzaWRlLW5hdiAuYXNpZGUtbWVudSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiA3MHB4O1xuICAgIGhlaWdodDogNzBweDtcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYmFja2dyb3VuZDogI2YzNDQ0NDtcbiAgICBsZWZ0OiAtOTVweDtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIG1hcmdpbjogYXV0bztcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgbGluZS1oZWlnaHQ6IDcwcHg7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIHotaW5kZXg6IDE7XG4gICAgY3Vyc29yOiBtb3ZlXG59XG5cbi5hc2lkZS1uYXYgLm1lbnUtaXRlbSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiA2MHB4O1xuICAgIGhlaWdodDogNjBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3Njc2O1xuICAgIGxlZnQ6IC05NXB4O1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIGxpbmUtaGVpZ2h0OiA2MHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuNXMsIC13ZWJraXQtdHJhbnNmb3JtIC42cztcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC41cywgLXdlYmtpdC10cmFuc2Zvcm0gLjZzO1xuICAgIC1tb3otdHJhbnNpdGlvbjogdHJhbnNmb3JtIC42cywgYmFja2dyb3VuZCAuNXMsIC1tb3otdHJhbnNmb3JtIC42cztcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjZzLCBiYWNrZ3JvdW5kIC41cztcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjZzLCBiYWNrZ3JvdW5kIC41cywgLXdlYmtpdC10cmFuc2Zvcm0gLjZzLCAtbW96LXRyYW5zZm9ybSAuNnM7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveFxufVxuXG4uYXNpZGUtbmF2IC5tZW51LWl0ZW06aG92ZXIge1xuICAgIGJhY2tncm91bmQ6ICNhOWM3MzRcbn1cblxuLmFzaWRlLW5hdiAubWVudS1saW5lIHtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICBwYWRkaW5nLXRvcDogMTBweFxufVxuXG4uYXNpZGUtbmF2OmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxXG59XG5cbi5hc2lkZS1uYXY6aG92ZXIgLmFzaWRlLW1lbnUge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBqZWxsbyAxcztcbiAgICAtbW96LWFuaW1hdGlvbjogamVsbG8gMXM7XG4gICAgYW5pbWF0aW9uOiBqZWxsbyAxc1xufVxuXG4uYXNpZGUtbmF2OmhvdmVyIC5tZW51LWZpcnN0IHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEzNSUsIDApO1xuICAgIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTM1JSwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTM1JSwgMClcbn1cblxuLmFzaWRlLW5hdjpob3ZlciAubWVudS1zZWNvbmQge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMjAlLCAtNzAlLCAwKTtcbiAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTIwJSwgLTcwJSwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMjAlLCAtNzAlLCAwKVxufVxuXG4uYXNpZGUtbmF2OmhvdmVyIC5tZW51LXRoaXJkIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTIwJSwgNzAlLCAwKTtcbiAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTIwJSwgNzAlLCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEyMCUsIDcwJSwgMClcbn1cblxuLmFzaWRlLW5hdjpob3ZlciAubWVudS1mb3VydGgge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMzUlLCAwKTtcbiAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTM1JSwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMzUlLCAwKVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgamVsbG8ge1xuICAgIGZyb20sIDExLjElLCB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lO1xuICAgICAgICB0cmFuc2Zvcm06IG5vbmVcbiAgICB9XG4gICAgMjIuMiUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtMTIuNWRlZykgc2tld1koLTEyLjVkZWcpXG4gICAgfVxuICAgIDMzLjMlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKDYuMjVkZWcpIHNrZXdZKDYuMjVkZWcpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKDYuMjVkZWcpIHNrZXdZKDYuMjVkZWcpXG4gICAgfVxuICAgIDQ0LjQlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC0zLjEyNWRlZykgc2tld1koLTMuMTI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtMy4xMjVkZWcpIHNrZXdZKC0zLjEyNWRlZylcbiAgICB9XG4gICAgNTUuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKVxuICAgIH1cbiAgICA2Ni42JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKVxuICAgIH1cbiAgICA3Ny43JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKDAuMzkwNjI1ZGVnKSBza2V3WSgwLjM5MDYyNWRlZylcbiAgICB9XG4gICAgODguOCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goLS4xOTUzMTI1ZGVnKSBza2V3WSgtLjE5NTMxMjVkZWcpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKVxuICAgIH1cbn1cblxuQC1tb3ota2V5ZnJhbWVzIGplbGxvIHtcbiAgICBmcm9tLCAxMS4xJSwgdG8ge1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogbm9uZTtcbiAgICAgICAgdHJhbnNmb3JtOiBub25lXG4gICAgfVxuICAgIDIyLjIlIHtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7XG4gICAgICAgIHRyYW5zZm9ybTogc2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKVxuICAgIH1cbiAgICAzMy4zJSB7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKVxuICAgIH1cbiAgICA0NC40JSB7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBza2V3WCgtMy4xMjVkZWcpIHNrZXdZKC0zLjEyNWRlZyk7XG4gICAgICAgIHRyYW5zZm9ybTogc2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpXG4gICAgfVxuICAgIDU1LjUlIHtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgxLjU2MjVkZWcpIHNrZXdZKDEuNTYyNWRlZylcbiAgICB9XG4gICAgNjYuNiUge1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogc2tld1goLS43ODEyNWRlZykgc2tld1koLS43ODEyNWRlZyk7XG4gICAgICAgIHRyYW5zZm9ybTogc2tld1goLS43ODEyNWRlZykgc2tld1koLS43ODEyNWRlZylcbiAgICB9XG4gICAgNzcuNyUge1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogc2tld1goMC4zOTA2MjVkZWcpIHNrZXdZKDAuMzkwNjI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpXG4gICAgfVxuICAgIDg4LjglIHtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtLjE5NTMxMjVkZWcpIHNrZXdZKC0uMTk1MzEyNWRlZylcbiAgICB9XG59XG5cbkBrZXlmcmFtZXMgamVsbG8ge1xuICAgIGZyb20sIDExLjElLCB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lO1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogbm9uZTtcbiAgICAgICAgdHJhbnNmb3JtOiBub25lXG4gICAgfVxuICAgIDIyLjIlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBza2V3WCgtMTIuNWRlZykgc2tld1koLTEyLjVkZWcpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZylcbiAgICB9XG4gICAgMzMuMyUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKVxuICAgIH1cbiAgICA0NC40JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgtMy4xMjVkZWcpIHNrZXdZKC0zLjEyNWRlZyk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBza2V3WCgtMy4xMjVkZWcpIHNrZXdZKC0zLjEyNWRlZyk7XG4gICAgICAgIHRyYW5zZm9ybTogc2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpXG4gICAgfVxuICAgIDU1LjUlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgxLjU2MjVkZWcpIHNrZXdZKDEuNTYyNWRlZylcbiAgICB9XG4gICAgNjYuNiUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goLS43ODEyNWRlZykgc2tld1koLS43ODEyNWRlZyk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKVxuICAgIH1cbiAgICA3Ny43JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpO1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogc2tld1goMC4zOTA2MjVkZWcpIHNrZXdZKDAuMzkwNjI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpXG4gICAgfVxuICAgIDg4LjglIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtLjE5NTMxMjVkZWcpIHNrZXdZKC0uMTk1MzEyNWRlZylcbiAgICB9XG59XG5cbi5hbmltYXRlZCB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDFzO1xuICAgIC1tb3otYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgICBhbmltYXRpb24tZHVyYXRpb246IDFzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICAtbW96LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aFxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5VcCB7XG4gICAgZnJvbSwgNjAlLCA3NSUsIDkwJSwgdG8ge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgLjYxLCAuMzU1LCAxKTtcbiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAuNjEsIC4zNTUsIDEpXG4gICAgfVxuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgODAwcHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDgwMHB4LCAwKVxuICAgIH1cbiAgICA2MCUge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMHB4LCAwKVxuICAgIH1cbiAgICA3NSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMClcbiAgICB9XG4gICAgOTAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApXG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApXG4gICAgfVxufVxuXG5ALW1vei1rZXlmcmFtZXMgYm91bmNlSW5VcCB7XG4gICAgZnJvbSwgNjAlLCA3NSUsIDkwJSwgdG8ge1xuICAgICAgICAtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgLjYxLCAuMzU1LCAxKTtcbiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAuNjEsIC4zNTUsIDEpXG4gICAgfVxuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgODAwcHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDgwMHB4LCAwKVxuICAgIH1cbiAgICA2MCUge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMHB4LCAwKVxuICAgIH1cbiAgICA3NSUge1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMClcbiAgICB9XG4gICAgOTAlIHtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApXG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApXG4gICAgfVxufVxuXG5Aa2V5ZnJhbWVzIGJvdW5jZUluVXAge1xuICAgIGZyb20sIDYwJSwgNzUlLCA5MCUsIHRvIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIC42MSwgLjM1NSwgMSk7XG4gICAgICAgIC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAuNjEsIC4zNTUsIDEpO1xuICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIC42MSwgLjM1NSwgMSlcbiAgICB9XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCA4MDBweCwgMCk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCA4MDBweCwgMCk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgODAwcHgsIDApXG4gICAgfVxuICAgIDYwJSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApXG4gICAgfVxuICAgIDc1JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApXG4gICAgfVxuICAgIDkwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtNXB4LCAwKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApXG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMClcbiAgICB9XG59XG5cbi5ib3VuY2VJblVwIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBib3VuY2VJblVwO1xuICAgIC1tb3otYW5pbWF0aW9uLW5hbWU6IGJvdW5jZUluVXA7XG4gICAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZUluVXA7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDFzO1xuICAgIC1tb3otYW5pbWF0aW9uLWRlbGF5OiAxcztcbiAgICBhbmltYXRpb24tZGVsYXk6IDFzXG59XG4nLCAKICAgIHN0eWxlSW5qZWN0KGNzc18yNDh6JGEpLCBmdW5jdGlvbihDb21tb24pIHsKICAgICAgICB2YXIgTWVudSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmdW5jdGlvbiBNZW51KCkgewogICAgICAgICAgICAgICAgdGhpcy5jb3JlID0gbmV3IENvcmUsIHRoaXMuc2l0ZSA9IC90di53YW5kaGkuY29tL2ksIHRoaXMudXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCwgCiAgICAgICAgICAgICAgICB0aGlzLm1lbnVzQ2xhc3MgPSBbICJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiLCAiZm91cnRoIiwgImZpZnRoIiBdLCB0aGlzLm1lbnVTZWxlY3RvciA9ICIjV2FuZGhpLW5hdiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE1lbnUucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIE1lbnUucHJvdG90eXBlLmdldEJvZHkgPSBmdW5jdGlvbihvcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHN2ZyB3aWR0aD0iMCIgaGVpZ2h0PSIwIj48ZGVmcz48ZmlsdGVyIGlkPSJnb28iPjxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlR3JhcGhpYyIgc3RkRGV2aWF0aW9uPSIxMCIgcmVzdWx0PSJibHVyIj48L2ZlR2F1c3NpYW5CbHVyPjxmZUNvbG9yTWF0cml4IGluPSJibHVyIiBtb2RlPSJtYXRyaXgiIHZhbHVlcz0iMSAwIDAgMCAwICAwIDEgMCAwIDAgIDAgMCAxIDAgMCAgMCAwIDAgMTkgLTkiIHJlc3VsdD0iZ29vIj48L2ZlQ29sb3JNYXRyaXg+PGZlQ29tcG9zaXRlIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImdvbyIgb3BlcmF0b3I9ImF0b3AiPjwvZmVDb21wb3NpdGU+PC9maWx0ZXI+PC9kZWZzPjwvc3ZnPjxkaXYgY2xhc3M9ImFzaWRlLW5hdiBib3VuY2VJblVwIGFuaW1hdGVkIiBpZD0iV2FuZGhpLW5hdiI+PGxhYmVsIGZvcj0iIiBjbGFzcz0iYXNpZGUtbWVudSIgdGl0bGU9Ilx1NjMwOVx1NGY0Zlx1NjJkNlx1NTJhOCI+VklQPC9sYWJlbD4nICsgb3B0aW9uICsgIjwvZGl2PiI7CiAgICAgICAgICAgIH0sIE1lbnUucHJvdG90eXBlLkluaXQgPSBmdW5jdGlvbihtZW51cywgY2FsbGJhY2ssIHNraXBJZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0LCBzdHIsIGRyYWdzLCBhc2lkZU5hdiwgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgdm9pZCAwID09PSBza2lwSWZyYW1lICYmIChza2lwSWZyYW1lID0gITApLCBDb3JlLmluSWZyYW1lKCkgJiYgc2tpcElmcmFtZSB8fCAodGhhdCA9IHRoaXMsIAogICAgICAgICAgICAgICAgdGhpcy5sb2FkZXIoKSwgc3RyID0gIiIsIG1lbnVzLmZvckVhY2goKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICc8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIHRpdGxlPSInICsgZWxlbWVudC50aXRsZSArICciIGRhdGEtY2F0PSInICsgZWxlbWVudC50eXBlICsgJyIgY2xhc3M9Im1lbnUtaXRlbSBtZW51LWxpbmUgbWVudS0nICsgX3RoaXMubWVudXNDbGFzc1tpbmRleF0gKyAnIj4nICsgZWxlbWVudC5zaG93ICsgIjwvYT4iOwogICAgICAgICAgICAgICAgfSkpLCBMb2dnZXIuaW5mbygiXHU4ZmZkXHU1MmEwXHU4M2RjXHU1MzU1IiksIENvcmUuYm9keUFwcGVuZCh0aGlzLmdldEJvZHkoc3RyKSksIAogICAgICAgICAgICAgICAgL1NhZmFyaXxpUGhvbmUvaS50ZXN0KHRoaXMudXNlckFnZW50KSAmJiAvY2hyb21lL2kudGVzdCh0aGlzLnVzZXJBZ2VudCkgJiYgJCgiI1dhbmRoaS1uYXYiKS5hZGRDbGFzcygibm8tZmlsdGVyIiksIAogICAgICAgICAgICAgICAgZHJhZ3MgPSB7CiAgICAgICAgICAgICAgICAgICAgZG93bjogITEsCiAgICAgICAgICAgICAgICAgICAgeDogMCwKICAgICAgICAgICAgICAgICAgICB5OiAwLAogICAgICAgICAgICAgICAgICAgIHdpbldpZDogMCwKICAgICAgICAgICAgICAgICAgICB3aW5IZWk6IDAsCiAgICAgICAgICAgICAgICAgICAgY2xpZW50WDogMCwKICAgICAgICAgICAgICAgICAgICBjbGllbnRZOiAwCiAgICAgICAgICAgICAgICB9LCBhc2lkZU5hdiA9ICQodGhpcy5tZW51U2VsZWN0b3IpWzBdLCAkKCJib2R5Iikub24oIm1vdXNlZG93biIsICIiICsgdGhhdC5tZW51U2VsZWN0b3IsIChmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGdldENzcyA9IGZ1bmN0aW9uKGEsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSAoX2IgPSBudWxsID09PSAoX2EgPSBkb2N1bWVudC5kZWZhdWx0VmlldykgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLmdldENvbXB1dGVkU3R5bGUoYSwgbnVsbClbZV0pICYmIHZvaWQgMCAhPT0gX2IgPyBfYiA6IG51bGwgIT09IChfYyA9IGEuY3VycmVudFN0eWxlKSAmJiB2b2lkIDAgIT09IF9jID8gX2MgOiBhLmN1cnJlbnRTdHlsZVtlXTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGRyYWdzLmRvd24gPSAhMCwgZHJhZ3MuY2xpZW50WCA9IGEuY2xpZW50WCwgZHJhZ3MuY2xpZW50WSA9IGEuY2xpZW50WSwgZHJhZ3MueCA9IHBhcnNlSW50KGdldENzcyh0aGlzLCAibGVmdCIpKSwgCiAgICAgICAgICAgICAgICAgICAgZHJhZ3MueSA9IHBhcnNlSW50KGdldENzcyh0aGlzLCAidG9wIikpLCBkcmFncy53aW5IZWkgPSAkKHdpbmRvdykuaGVpZ2h0KCksIGRyYWdzLndpbldpZCA9ICQod2luZG93KS53aWR0aCgpLCAKICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbigibW91c2Vtb3ZlIiwgKGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhLmNsaWVudFggLSBkcmFncy5jbGllbnRYLCB0ID0gYS5jbGllbnRZIC0gZHJhZ3MuY2xpZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgKGFzaWRlTmF2ID0gYXNpZGVOYXYgfHwgJCgiI1dhbmRoaS1uYXYiKVswXSkuc3R5bGUudG9wID0gZHJhZ3MueSArIHQgKyAicHgiLCBhc2lkZU5hdi5zdHlsZS5sZWZ0ID0gZHJhZ3MueCArIGUgKyAicHgiOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKS5vbigibW91c2V1cCIsICIiICsgdGhhdC5tZW51U2VsZWN0b3IsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBkcmFncy5kb3duID0gITEsICQoZG9jdW1lbnQpLm9mZigibW91c2Vtb3ZlIik7CiAgICAgICAgICAgICAgICB9KSksIE1lbnUuZnVsbFNjcmVlbk1pcnJvcigpLCBjYWxsYmFjay5jYWxsKHRoaXMpKTsKICAgICAgICAgICAgfSwgTWVudS5mdWxsU2NyZWVuTWlycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB1bnNhZmVXaW5kb3cuZG9jdW1lbnQub25mdWxsc2NyZWVuY2hhbmdlID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygiZnVsbEVsZW1lbnQ6IiArIHVuc2FmZVdpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCksIE1lbnUuYXV0b0hpZGUgJiYgKHVuc2FmZVdpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCA/ICQoIiMiICsgTWVudS5tYWluSWQpLmhpZGUoKSA6ICQoIiMiICsgTWVudS5tYWluSWQpLnNob3coKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LCBNZW51LmNsb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBNZW51LmF1dG9IaWRlID0gITEsICQoIiMiICsgTWVudS5tYWluSWQpLmhpZGUoKTsKICAgICAgICAgICAgfSwgTWVudS5tYWluSWQgPSAiV2FuZGhpLW5hdiIsIE1lbnUuYXV0b0hpZGUgPSAhMCwgTWVudTsKICAgICAgICB9KCk7CiAgICAgICAgQ29tbW9uLk1lbnUgPSBNZW51OwogICAgfShDb21tb24gfHwgKENvbW1vbiA9IHt9KSksIFBsdWdpbkJhc2UgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBQbHVnaW5CYXNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLl91bmlxdWUgPSAhMCwgdGhpcy5zZW1pdWkgPSAhMSwgdGhpcy5tZW51ID0gbmV3IENvbW1vbi5NZW51LCB0aGlzLlByb2Nlc3MgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIF90aGlzLnNlbWl1aSAmJiBDb3JlLmFwcGVuZENzcygiaHR0cHM6Ly9yZWdpc3RyeS5ucG1taXJyb3IuY29tL0Bkb3V5aW5mZS9zZW1pLXVpLzIuNTEuMC9maWxlcy9kaXN0L2Nzcy9zZW1pLm1pbi5jc3MiKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5sb2FkZXIoKSwgX3RoaXMucnVuKCk7CiAgICAgICAgICAgIH0sIHRoaXMuX2FwcE5hbWUgPSAiYmFzZSI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQbHVnaW5CYXNlLnByb3RvdHlwZS51bmlxdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VuaXF1ZTsKICAgICAgICB9LCBQbHVnaW5CYXNlLnByb3RvdHlwZS5saW5rVGVzdCA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB2YXIgZmxhZywgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gdXJsIHx8ICh1cmwgPSBDb3JlLmN1cnJlbnRVcmwoKSksIGZsYWcgPSAhMSwgdGhpcy5ydWxlcy5mb3JFYWNoKChmdW5jdGlvbih2LCBrKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXYudGVzdCh1cmwpIHx8IChmbGFnID0gITAsIF90aGlzLnNpdGUgPSBrLCAhMSk7CiAgICAgICAgICAgIH0pKSwgZmxhZzsKICAgICAgICB9LCBQbHVnaW5CYXNlLnByb3RvdHlwZS5hcHBOYW1lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBOYW1lOwogICAgICAgIH0sIFBsdWdpbkJhc2U7CiAgICB9KCksIGZ1bmN0aW9uKFNpdGVFbnVtKSB7CiAgICAgICAgU2l0ZUVudW0uQWxsID0gIkFsbCIsIFNpdGVFbnVtLlNldHRpbmdzID0gIlNldHRpbmdzIiwgU2l0ZUVudW0uU2V0dGluZ3NfSmlleGlfT3B0ID0gIlNldHRpbmdzX0ppZXhpX09wdCIsIAogICAgICAgIFNpdGVFbnVtLlNldHRpbmdzX0F1dG9KdW1wID0gIlNldHRpbmdzX0F1dG9KdW1wIiwgU2l0ZUVudW0uU2V0dGluZ3NfQXV0b0p1bXBfT3B0ID0gIlNldHRpbmdzX0F1dG9KdW1wX09wdCIsIAogICAgICAgIFNpdGVFbnVtLlNldHRpbmdzX0NTRE4gPSAiU2V0dGluZ3NfQ1NETiIsIFNpdGVFbnVtLlNldHRpbmdzX0NTRE5fT3B0ID0gIlNldHRpbmdzX0NTRE5fT3B0IiwgCiAgICAgICAgU2l0ZUVudW0uU2V0dGluZ3NfU2VhcmNoID0gIlNldHRpbmdzX1NlYXJjaCIsIFNpdGVFbnVtLlNldHRpbmdzX1NlYXJjaF9PcHQgPSAiU2V0dGluZ3NfU2VhcmNoX09wdCIsIAogICAgICAgIFNpdGVFbnVtLlNldHRpbmdzX1dhbmdQYW5fT3B0ID0gIlNldHRpbmdzX1dhbmdQYW5fT3B0IiwgU2l0ZUVudW0uU2V0dGluZ3NfQmlsaV9QY19PcHQgPSAiU2V0dGluZ3NfQmlsaV9QY19PcHQiLCAKICAgICAgICBTaXRlRW51bS5UYW9CYW8gPSAiVGFvQmFvIiwgU2l0ZUVudW0uVE1hbGwgPSAiVE1hbGwiLCBTaXRlRW51bS5KaW5nRG9uZyA9ICJKaW5nRG9uZyIsIAogICAgICAgIFNpdGVFbnVtLkppbmdEb25nTGlzdCA9ICJKaW5nRG9uZ0xpc3QiLCBTaXRlRW51bS5JUWlZaSA9ICJJUWlZaSIsIFNpdGVFbnVtLllvdUt1ID0gIllvdUt1IiwgCiAgICAgICAgU2l0ZUVudW0uTGVTaGkgPSAiTGVTaGkiLCBTaXRlRW51bS5UdURvdSA9ICJUdURvdSIsIFNpdGVFbnVtLlRlbmNlbnRfViA9ICJUZW5jZW50X1YiLCAKICAgICAgICBTaXRlRW51bS5NYW5nR3VvID0gIk1hbmdHdW8iLCBTaXRlRW51bS5Tb0h1ID0gIlNvSHUiLCBTaXRlRW51bS5BY2Z1biA9ICJBY2Z1biIsIAogICAgICAgIFNpdGVFbnVtLkJpbGlCaWxpID0gIkJpbGlCaWxpIiwgU2l0ZUVudW0uQmlsaU1vYmlsZSA9ICJCaWxpTW9iaWxlIiwgU2l0ZUVudW0uTTE5MDUgPSAiTTE5MDUiLCAKICAgICAgICBTaXRlRW51bS5QUFRWID0gIlBQVFYiLCBTaXRlRW51bS5ZaW5ZdWVUYWkgPSAiWWluWXVlVGFpIiwgU2l0ZUVudW0uV2FuZ1lpID0gIldhbmdZaSIsIAogICAgICAgIFNpdGVFbnVtLlRlbmNlbnRfTSA9ICJUZW5jZW50X00iLCBTaXRlRW51bS5LdUdvdSA9ICJLdUdvdSIsIFNpdGVFbnVtLkthb0xhID0gIkthb0xhIiwgCiAgICAgICAgU2l0ZUVudW0uS3VXbyA9ICJLdVdvIiwgU2l0ZUVudW0uWGlhTWkgPSAiWGlhTWkiLCBTaXRlRW51bS5UYWlIZSA9ICJUYWlIZSIsIFNpdGVFbnVtLlFpbmdUaW5nID0gIlFpbmdUaW5nIiwgCiAgICAgICAgU2l0ZUVudW0uTGlaaGkgPSAiTGlaaGkiLCBTaXRlRW51bS5NaUd1ID0gIk1pR3UiLCBTaXRlRW51bS5YaU1hTGFZYSA9ICJYaU1hTGFZYSIsIAogICAgICAgIFNpdGVFbnVtLldlbkt1ID0gIldlbkt1IiwgU2l0ZUVudW0uWW91VHVCZSA9ICJZb3VUdUJlIiwgU2l0ZUVudW0uU1hCID0gIlNYQiIsIFNpdGVFbnVtLkJEWSA9ICJCRFkiLCAKICAgICAgICBTaXRlRW51bS5BTFkgPSAiQUxZIiwgU2l0ZUVudW0uQUxZX1AgPSAiQUxZX1AiLCBTaXRlRW51bS5CRFkxID0gIkJEWTEiLCBTaXRlRW51bS5MWlkgPSAiTFpZIiwgCiAgICAgICAgU2l0ZUVudW0uU3VOaW5nID0gIlN1TmluZyIsIFNpdGVFbnVtLlN0ZWFtID0gIlN0ZWFtIiwgU2l0ZUVudW0uVnAgPSAiVnAiLCBTaXRlRW51bS5DU0ROID0gIkNTRE4iLCAKICAgICAgICBTaXRlRW51bS5DU0ROX0Rvd25sb2FkID0gIkNTRE5fRG93bmxvYWQiLCBTaXRlRW51bS5aaGlIdSA9ICJaaGlIdSIsIFNpdGVFbnVtLkppYW5TaHUgPSAiSmlhblNodSIsIAogICAgICAgIFNpdGVFbnVtLkp1ZUppbiA9ICJKdWVKaW4iLCBTaXRlRW51bS5HaXRlZSA9ICJHaXRlZSIsIFNpdGVFbnVtLldlaWJvID0gIldlaWJvIiwgCiAgICAgICAgU2l0ZUVudW0uVHVYaWFvQ2hhbyA9ICJUdVhpYW9DaGFvIiwgU2l0ZUVudW0uT3NDaCA9ICJPc0NoIiwgU2l0ZUVudW0uQWlGYURpYW4gPSAiQWlGYURpYW4iLCAKICAgICAgICBTaXRlRW51bS5CYWlkdSA9ICJCYWlkdSIsIFNpdGVFbnVtLkJhaWR1UGFuTWFpbiA9ICJCYWlkdVBhbk1haW4iLCBTaXRlRW51bS5CYWlkdVBhbkhvbWUgPSAiQmFpZHVQYW5Ib21lIiwgCiAgICAgICAgU2l0ZUVudW0uRG91QmFuID0gIkRvdUJhbiIsIFNpdGVFbnVtLmcxNzE3MyA9ICJnMTcxNzMiLCBTaXRlRW51bS5Hb29nbGUgPSAiR29vZ2xlIiwgCiAgICAgICAgU2l0ZUVudW0uU29Hb3UgPSAiU29Hb3UiLCBTaXRlRW51bS5LdWFLZUhvbWUgPSAiS3VhS2VIb21lIiwgU2l0ZUVudW0uVGVuY2VudERvYyA9ICJUZW5jZW50RG9jIiwgCiAgICAgICAgU2l0ZUVudW0uVGVuY2VudE1haWwgPSAiVGVuY2VudE1haWwiLCBTaXRlRW51bS5UZW5jZW50Q2xvdWRCbG9nID0gIlRlbmNlbnRDbG91ZEJsb2ciLCAKICAgICAgICBTaXRlRW51bS5Tc1BBaSA9ICJTc1BhaSIsIFNpdGVFbnVtLkZlaVNodURvYyA9ICJGZWlTaHVEb2MiLCBTaXRlRW51bS5UZW5jZW50UVEgPSAiVGVuY2VudFFRIiwgCiAgICAgICAgU2l0ZUVudW0uU2h1bWEgPSAiU2h1bWEiLCBTaXRlRW51bS5CRF9ERVRBSUxfT0xEID0gIkJEX0RFVEFJTF9PTEQiLCBTaXRlRW51bS5CRF9ERVRBSUxfTkVXID0gIkJEX0RFVEFJTF9ORVciLCAKICAgICAgICBTaXRlRW51bS5CRF9ERVRBSUxfU2hhcmUgPSAiQkRfREVUQUlMX1NoYXJlIiwgU2l0ZUVudW0uR3dkID0gIkd3ZCIsIFNpdGVFbnVtLlh4cWcgPSAiWHhxZyIsIAogICAgICAgIFNpdGVFbnVtLkp1aGFvd2FuID0gIkp1aGFvd2FuIiwgU2l0ZUVudW0uTWhYaW4gPSAiTWhYaW4iLCBTaXRlRW51bS5WMkVYID0gIlYyRVgiLCAKICAgICAgICBTaXRlRW51bS5HaXRodWIgPSAiR2l0aHViIiwgU2l0ZUVudW0uTm9kZVNlZWsgPSAiTm9kZVNlZWsiLCBTaXRlRW51bS5IaVR2ID0gIkhpVHYiLCAKICAgICAgICBTaXRlRW51bS5YaHMgPSAiWGhzIiwgU2l0ZUVudW0uS2luZ1NvZnREb2MgPSAiS2luZ1NvZnREb2MiLCBTaXRlRW51bS5CaW5nQ24gPSAiQmluZ0NuIiwgCiAgICAgICAgU2l0ZUVudW0uU2lDaHVhbmcgPSAiU2lDaHVhbmciLCBTaXRlRW51bS5VaXNkYyA9ICJVaXNkYyI7CiAgICB9KFNpdGVFbnVtIHx8IChTaXRlRW51bSA9IHt9KSksIFVwZGF0ZVNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBVcGRhdGVTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5BbGwsIC8oLiopL2kgXSBdKSwgX3RoaXMuX3VuaXF1ZSA9ICExLCAKICAgICAgICAgICAgX3RoaXMuX2FwcE5hbWUgPSAidXBkYXRlIiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoVXBkYXRlU2VydmljZSwgX3N1cGVyKSwgVXBkYXRlU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7fSwgCiAgICAgICAgVXBkYXRlU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghQ29uZmlnLmdldCh1cGRhdGVfa2V5LCAhMSkpIHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gbmV3IFZlcnNpb25Db21wYXIoQ29uZmlnLmVudi5zY3JpcHQudmVyc2lvbik7CiAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdENhdChjdXJyZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFVwZGF0ZVNlcnZpY2UucHJvdG90eXBlLnNjcmlwdENhdCA9IGZ1bmN0aW9uKGN1cnJlbnQpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgSHR0cC5nZXQoImh0dHBzOi8vc2NyaXB0Y2F0Lm9yZy9hcGkvdjIvc2NyaXB0cy83MiIsIG5ldyBNYXAsIG5ldyBNYXAsICExKS50aGVuKChmdW5jdGlvbihyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uLCBtc2csIF9hLCBfYiwgX2M7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfZCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24gPSBuZXcgVmVyc2lvbkNvbXBhcihudWxsID09PSAoX2MgPSBudWxsID09PSAoX2IgPSBudWxsID09IHIgPyB2b2lkIDAgOiByLmRhdGEpIHx8IHZvaWQgMCA9PT0gX2IgPyB2b2lkIDAgOiBfYi5zY3JpcHQpIHx8IHZvaWQgMCA9PT0gX2MgPyB2b2lkIDAgOiBfYy52ZXJzaW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcoIlx1NWY1M1x1NTI0ZFx1NzI0OFx1NjcyYzpbIiArIGN1cnJlbnQudmVyc2lvblN0cmluZyArICJdLFx1NjcwMFx1NjViMFx1NzI0OFx1NjcyYzpbIiArIHZlcnNpb24udmVyc2lvblN0cmluZyArICJdIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5jb21wYXJlVG8oY3VycmVudCkgIT09IFZlcnNpb25SZXN1bHQuZ3JlYXRlciA/IFsgMywgMiBdIDogKF9hID0gIlx1NjViMFx1NzI0OFx1NjcyYzxzcGFuPiIgKyB2ZXJzaW9uLnZlcnNpb25TdHJpbmcgKyAnPC9zcGFuPlx1NWRmMlx1NTNkMVx1NWUwMy48YSBjbGFzcz0ibGluayIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyA0LCBSb3V0ZS5Sb3V0ZUNvbmZpZygpIF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBfYSArIF9kLnNlbnQoKS5ob21lX3VybF91cGRhdGUgKyAnIj5cdTY3ZTVcdTc3MGI8L2E+PGJyPjxhIGlkPSJuZXctdmVyc2lvbi1saW5rIiBjbGFzcz0ibGluayIgaHJlZj0iJyArIFVwZGF0ZVNlcnZpY2UuaW5zdGFsbF91cmxfdHdvICsgJyIgdGFyZ2V0PSJfYmxhbmsiPlx1NWI4OVx1ODhjNTwvYT4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2FkZFN0eWxlKCIuc3dhbDItcG9wdXB7Zm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnR9IiksIFN3YWxfX2RlZmF1bHQuZGVmYXVsdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJib3R0b20tbGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogInN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIlx1NGVjYVx1NTkyOVx1NTE3M1x1OTVlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIlx1NmMzOFx1NGU0NVx1NTE3M1x1OTVlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogIlx1NjhjMFx1NjdlNVx1NjZmNFx1NjViMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogbXNnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuaW5mbyhyZXN1bHQpLCByZXN1bHQuaXNDb25maXJtZWQgPyBDb25maWcuc2V0KHVwZGF0ZV9rZXksICEwLCBEYXkpIDogcmVzdWx0LmlzRGlzbWlzc2VkICYmIENvbmZpZy5zZXQodXBkYXRlX2tleSwgITAsIDM2NSAqIERheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIF9kLmxhYmVsID0gMjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbmZpZy5zZXQodXBkYXRlX2tleSwgITAsIEhvdXIpLCBbIDIgXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFVwZGF0ZVNlcnZpY2UuaW5zdGFsbF91cmxfdHdvID0gImh0dHBzOi8vc2NyaXB0Y2F0Lm9yZy9zY3JpcHQtc2hvdy1wYWdlLzcyIiwgCiAgICAgICAgVXBkYXRlU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIEV2ZW50SGVscGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gRXZlbnRIZWxwZXIoKSB7fQogICAgICAgIHJldHVybiBFdmVudEhlbHBlci5iaW5kX2NsaWNrID0gZnVuY3Rpb24ocXVlcnksIGFjdCkgewogICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgIG51bGwgPT09IChfYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocXVlcnkpKSB8fCB2b2lkIDAgPT09IF9hIHx8IF9hLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGFjdCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgRXZlbnRIZWxwZXI7CiAgICB9KCksIFJ1bnRpbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBSdW50aW1lKCkge30KICAgICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFJ1bnRpbWUsICJ1cmwiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgfSksIFJ1bnRpbWU7CiAgICB9KCksIEJhc2VDb3Vwb24gPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBCYXNlQ291cG9uKCkge30KICAgICAgICByZXR1cm4gQmFzZUNvdXBvbi5wcm90b3R5cGUuaW5pdF9xcmNvZGUgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgICAgICB2YXIgcXIgPSBxcmNvZGUoMCwgIkgiKTsKICAgICAgICAgICAgICAgIHFyLmFkZERhdGEodXJsKSwgcXIubWFrZSgpLCAkKCIjdmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtcXJjb2RlLWltZyIpLmh0bWwocXIuY3JlYXRlU3ZnVGFnKDQsIDEpKSwgCiAgICAgICAgICAgICAgICByZXNvbHZlKCEwKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJhc2VDb3Vwb24ucHJvdG90eXBlLmluaXRfY291cG9uX2luZm8gPSBmdW5jdGlvbihhZnRlciwgcHJpY2UsIHRpbWUsIHFfdXJsKSB7CiAgICAgICAgICAgIHZhciBjb3VwX2luZm8sIGFjdCwgdXJsLCBub3c7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gcV91cmwgJiYgKHFfdXJsID0gIiIpLCBjb3VwX2luZm8gPSAiPHA+XHU3OWZiXHU1MmE4XHU3YWVmPHNwYW4+XHU1ZmViXHU2Mzc3PC9zcGFuPlx1OGQyZFx1NGU3MDwvcD4iLCAKICAgICAgICAgICAgYWN0ID0gJzxhIGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1idXR0b24gcXVhbi1ub25lIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiPlx1NjI1M1x1NWYwMFx1NjI0Ylx1NjczYVx1NjI2Ylx1NGUwMFx1NjI2YjwvYT4nLCAKICAgICAgICAgICAgdXJsID0gUnVudGltZS51cmwsIHFfdXJsICYmIChub3cgPSBuZXcgRGF0ZSwgY291cF9pbmZvID0gIjxwPjxzcGFuPiIgKyBwcmljZSArICc8L3NwYW4+IFx1NTE0M1x1NTIzODwvcD48cCBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtZGF0ZSI+XHVmZjA4JyArIENvcmUuZm9ybWF0KG5vdywgInl5eXktTU0tZGQiKSArICIgfiAiICsgdGltZSArICJcdWZmMDk8L3A+IiwgCiAgICAgICAgICAgIGFjdCA9ICc8YSBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYnV0dG9uIHF1YW4tZXhpdHMiPlx1NjI2Ylx1NzgwMVx1OTg4NicgKyBwcmljZSArICJcdTUxNDNcdTRmMThcdTYwZTBcdTUyMzg8L2E+IiwgCiAgICAgICAgICAgIHVybCA9IHFfdXJsKSwgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICQoIi52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy10aXRsZSIpLmh0bWwoY291cF9pbmZvKSwgJCgiLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWFjdGlvbiIpLmh0bWwoYWN0KSwgCiAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0pKS50aGVuKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHFfdXJsICYmIEV2ZW50SGVscGVyLmJpbmRfY2xpY2soIi52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1idXR0b24iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKHVybCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBCYXNlQ291cG9uLnByb3RvdHlwZS5kZWZhdWx0ID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdXJsICYmICh1cmwgPSAiIiksIExvZ2dlci5kZWJ1Zyh1cmwpLCB0aGlzLmluaXRfcXJjb2RlKCIiID09IHVybCA/IFJ1bnRpbWUudXJsIDogdXJsKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgIF90aGlzLmluaXRfY291cG9uX2luZm8oMCwgMCwgIiIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQmFzZUNvdXBvbjsKICAgIH0oKSwgVnBDb3Vwb24gPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBWcENvdXBvbigpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKFZwQ291cG9uLCBfc3VwZXIpLCBWcENvdXBvbi5wcm90b3R5cGUuaW5pdF9odG1sID0gZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIGlmICgkKCIuRlctcHJvZHVjdC5jbGVhcmZpeCIpLmxlbmd0aCkgQ29yZS5hcHBlbmRUbygiLkZXLXByb2R1Y3QuY2xlYXJmaXgiLCBodG1sKSwgCiAgICAgICAgICAgICAgICByZXNvbHZlKCEwKTsgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXRfMSA9IF90aGlzOwogICAgICAgICAgICAgICAgICAgIENvcmUubGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdF8xLmluaXRfaHRtbChodG1sKTsKICAgICAgICAgICAgICAgICAgICB9KSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBWcENvdXBvbi5wcm90b3R5cGUuaW5pdF9jb3Vwb25zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIFJvdXRlLnF1ZXJ5VnBDb3Vwb25zKFJ1bnRpbWUudXJsLCAoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICB2YXIgcSwgZXhwOwogICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKHJlcyksIHJlcy5jb2RlID8gcmVzLmRhdGEuaGFzX2NvdXBvbiA/IChxID0gcmVzLmRhdGEsIGV4cCA9IG5ldyBEYXRlKHEucXVhbl90aW1lKSwgCiAgICAgICAgICAgICAgICBfdGhpcy5pbml0X3FyY29kZShkZWNvZGVVUklDb21wb25lbnQocS5xdWFuX2xpbmspKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxLmFmdGVyX3ByaWNlLCBxLnF1YW5fcHJpY2UsICIiICsgQ29yZS5mb3JtYXQoZXhwLCAieXl5eS1NTS1kZCIpLCBudWxsICE9PSAoX2EgPSBkZWNvZGVVUklDb21wb25lbnQocS5xdWFuX2xpbmspKSAmJiB2b2lkIDAgIT09IF9hID8gX2EgOiBDb3JlLnVybCk7CiAgICAgICAgICAgICAgICB9KSkpIDogcmVzLmRhdGEucXVhbl9saW5rID8gKF90aGlzLmRlZmF1bHQocmVzLmRhdGEucXVhbl9saW5rKSwgRXZlbnRIZWxwZXIuYmluZF9jbGljaygiI3ZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXFyY29kZS1pbWciLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKHJlcy5kYXRhLnF1YW5fbGluayk7CiAgICAgICAgICAgICAgICB9KSkpIDogX3RoaXMuZGVmYXVsdCgpIDogX3RoaXMuZGVmYXVsdCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgVnBDb3Vwb247CiAgICB9KEJhc2VDb3Vwb24pLCBTdW5pbmdDb3Vwb24gPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBTdW5pbmdDb3Vwb24oKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBfc3VwZXIgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhTdW5pbmdDb3Vwb24sIF9zdXBlciksIFN1bmluZ0NvdXBvbi5wcm90b3R5cGUuaW5pdF9odG1sID0gZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIGlmICgkKCIucHJvaW5mby1jb250YWluZXIiKS5sZW5ndGgpIENvcmUuYXBwZW5kVG8oIi5wcm9pbmZvLWNvbnRhaW5lciIsIGh0bWwpLCByZXNvbHZlKCEwKTsgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXRfMSA9IF90aGlzOwogICAgICAgICAgICAgICAgICAgIENvcmUubGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdF8xLmluaXRfaHRtbChodG1sKTsKICAgICAgICAgICAgICAgICAgICB9KSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBTdW5pbmdDb3Vwb24ucHJvdG90eXBlLmluaXRfY291cG9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBSb3V0ZS5xdWVyeVNuQ291cG9ucyhSdW50aW1lLnVybCwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgdmFyIHEsIGV4cDsKICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhyZXMpLCByZXMuY29kZSA/IHJlcy5kYXRhLmhhc19jb3Vwb24gPyAocSA9IHJlcy5kYXRhLCBleHAgPSBuZXcgRGF0ZShxLnF1YW5fdGltZSksIAogICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9xcmNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KHEucXVhbl9saW5rKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxLmFmdGVyX3ByaWNlLCBxLnF1YW5fcHJpY2UsICIiICsgQ29yZS5mb3JtYXQoZXhwLCAieXl5eS1NTS1kZCIpLCBkZWNvZGVVUklDb21wb25lbnQocS5xdWFuX2xpbmspKTsKICAgICAgICAgICAgICAgIH0pKSkgOiByZXMuZGF0YS5xdWFuX2xpbmsgPyAoX3RoaXMuZGVmYXVsdChyZXMuZGF0YS5xdWFuX2xpbmspLCBFdmVudEhlbHBlci5iaW5kX2NsaWNrKCIjdmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtcXJjb2RlLWltZyIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLm9wZW4ocmVzLmRhdGEucXVhbl9saW5rKTsKICAgICAgICAgICAgICAgIH0pKSkgOiBfdGhpcy5kZWZhdWx0KCkgOiBfdGhpcy5kZWZhdWx0KCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBTdW5pbmdDb3Vwb247CiAgICB9KEJhc2VDb3Vwb24pLCBKZENvdXBvbiA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIEpkQ291cG9uKCkgewogICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoSmRDb3Vwb24sIF9zdXBlciksIEpkQ291cG9uLnByb3RvdHlwZS5pbml0X2h0bWwgPSBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgJCgiLnByb2R1Y3QtaW50cm8iKS5sZW5ndGggPyAoQ29yZS5hcHBlbmRUbygiLnByb2R1Y3QtaW50cm8iLCBodG1sKSwgcmVzb2x2ZSghMCkpIDogc2V0VGltZW91dChfdGhpcy5pbml0X2h0bWwsIDJlMyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBKZENvdXBvbi5wcm90b3R5cGUuaW5pdF9jb3Vwb25zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfYSwgX2IsIGtleV8xLCBjb3Vwb24sIHFfMSwgZXhwXzEsIF90aGlzID0gdGhpcywgaXRlbV9pZCA9IG51bGwgPT09IChfYiA9IG51bGwgPT09IChfYSA9IHVuc2FmZVdpbmRvdy5wYWdlQ29uZmlnKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EucHJvZHVjdCkgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLnNrdWlkOwogICAgICAgICAgICBpdGVtX2lkID8gKGtleV8xID0gImpkXyIgKyBpdGVtX2lkLCAoY291cG9uID0gQ29uZmlnLmdldChrZXlfMSkpID8gY291cG9uLmhhc19jb3Vwb24gPyAocV8xID0gY291cG9uLCAKICAgICAgICAgICAgZXhwXzEgPSBuZXcgRGF0ZShxXzEucXVhbl90aW1lKSwgdGhpcy5pbml0X3FyY29kZShkZWNvZGVVUklDb21wb25lbnQocV8xLnF1YW5fbGluaykpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxXzEuYWZ0ZXJfcHJpY2UsIHFfMS5xdWFuX3ByaWNlLCAiIiArIENvcmUuZm9ybWF0KGV4cF8xLCAieXl5eS1NTS1kZCIpLCBkZWNvZGVVUklDb21wb25lbnQocV8xLnF1YW5fbGluaykpOwogICAgICAgICAgICB9KSkpIDogY291cG9uLnF1YW5fbGluayA/IHRoaXMuZGVmYXVsdChjb3Vwb24ucXVhbl9saW5rKSA6IHRoaXMuZGVmYXVsdCgpIDogUm91dGUucXVlcnlKZENvdXBvbnMoaXRlbV9pZCwgKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgdmFyIHFfMiwgZXhwXzI7CiAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcocmVzKSwgcmVzLmNvZGUgPyAoQ29uZmlnLnNldChrZXlfMSwgcmVzLmRhdGEsIDQzMjAwKSwgcmVzLmRhdGEuaGFzX2NvdXBvbiA/IChxXzIgPSByZXMuZGF0YSwgCiAgICAgICAgICAgICAgICBleHBfMiA9IG5ldyBEYXRlKHFfMi5xdWFuX3RpbWUpLCBfdGhpcy5pbml0X3FyY29kZShkZWNvZGVVUklDb21wb25lbnQocV8yLnF1YW5fbGluaykpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRfY291cG9uX2luZm8ocV8yLmFmdGVyX3ByaWNlLCBxXzIucXVhbl9wcmljZSwgIiIgKyBDb3JlLmZvcm1hdChleHBfMiwgInl5eXktTU0tZGQiKSwgZGVjb2RlVVJJQ29tcG9uZW50KHFfMi5xdWFuX2xpbmspKTsKICAgICAgICAgICAgICAgIH0pKSkgOiByZXMuZGF0YS5xdWFuX2xpbmsgPyBfdGhpcy5kZWZhdWx0KHJlcy5kYXRhLnF1YW5fbGluaykgOiBfdGhpcy5kZWZhdWx0KCkpIDogX3RoaXMuZGVmYXVsdCgpOwogICAgICAgICAgICB9KSkpIDogdGhpcy5kZWZhdWx0KCk7CiAgICAgICAgfSwgSmRDb3Vwb247CiAgICB9KEJhc2VDb3Vwb24pLCBUYW9Db3Vwb24gPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBUYW9Db3Vwb24oKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBfc3VwZXIgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhUYW9Db3Vwb24sIF9zdXBlciksIFRhb0NvdXBvbi5wcm90b3R5cGUuaW5pdF9odG1sID0gZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICQoIiNKX0RldGFpbE1ldGEiKS5sZW5ndGggPyBDb3JlLmFwcGVuZFRvKCIjSl9EZXRhaWxNZXRhIiwgaHRtbCkgOiAkKCJbY2xhc3N8PUJhc2ljQ29udGVudC0tcm9vdF0iKS5sZW5ndGggPyAkKCJbY2xhc3N8PUJhc2ljQ29udGVudC0tcm9vdF0iKS5hcHBlbmQoaHRtbCkgOiBDb3JlLmFwcGVuZFRvKCIjZGV0YWlsIiwgaHRtbCArICI8YnIvPiIpLCAKICAgICAgICAgICAgICAgIHJlc29sdmUoITApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgVGFvQ291cG9uLnByb3RvdHlwZS5pbml0X2NvdXBvbnMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcywgaXRlbUlkID0gQ29yZS5nZXRQYXIoImlkIiksIGtleSA9ICJuX2l0ZW1JZF8iICsgaXRlbUlkLCBjb3Vwb24gPSBDb25maWcuZ2V0KGtleSwgITEpOwogICAgICAgICAgICBjb3Vwb24gPyAoTG9nZ2VyLmluZm8oY291cG9uKSwgdGhpcy5yZW5kZXJfY291cG9uKChudWxsID09IGNvdXBvbiA/IHZvaWQgMCA6IGNvdXBvbi5sZW5ndGgpID4gMCAmJiAic3RyaW5nIiAhPSB0eXBlb2YgY291cG9uID8gY291cG9uWzBdIDogdm9pZCAwKSkgOiBSb3V0ZS5xdWVyeUNvdXBvbnMoQ29yZS5nZXRQYXIoImlkIiksIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBxLCBleHA7CiAgICAgICAgICAgICAgICBkYXRhLmNvZGUgPyAoKG51bGwgPT09IChfYSA9IGRhdGEuZGF0YSkgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPiAwID8gKHEgPSBkYXRhLmRhdGFbMF0sIAogICAgICAgICAgICAgICAgZXhwID0gbmV3IERhdGUocS5xdWFuX3RpbWUpLCBfdGhpcy5pbml0X3FyY29kZShkZWNvZGVVUklDb21wb25lbnQocS5xdWFuX2xpbmspKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5pbml0X2NvdXBvbl9pbmZvKHEuYWZ0ZXJfcHJpY2UsIHEucXVhbl9wcmljZSwgIiIgKyBDb3JlLmZvcm1hdChleHAsICJ5eXl5LU1NLWRkIiksIGRlY29kZVVSSUNvbXBvbmVudChxLnF1YW5fbGluaykpOwogICAgICAgICAgICAgICAgfSkpKSA6IF90aGlzLmluaXRfcXJjb2RlKFJ1bnRpbWUudXJsKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5pbml0X2NvdXBvbl9pbmZvKDAsIDAsICIiKTsKICAgICAgICAgICAgICAgIH0pKSwgQ29uZmlnLnNldChrZXksIChudWxsID09PSAoX2IgPSBkYXRhLmRhdGEpIHx8IHZvaWQgMCA9PT0gX2IgPyB2b2lkIDAgOiBfYi5sZW5ndGgpID4gMCA/IGRhdGEuZGF0YSA6IFtdLCA0MzIwMCkpIDogX3RoaXMuaW5pdF9xcmNvZGUoUnVudGltZS51cmwpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRfY291cG9uX2luZm8oMCwgMCwgIiIpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgVGFvQ291cG9uLnByb3RvdHlwZS5yZW5kZXJfY291cG9uID0gZnVuY3Rpb24ocXVhbikgewogICAgICAgICAgICB2YXIgcV8xLCBleHAsIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdm9pZCAwID09PSBxdWFuICYmIChxdWFuID0gdm9pZCAwKSwgbnVsbCA9PSBxdWFuID8gdGhpcy5pbml0X3FyY29kZShSdW50aW1lLnVybCkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5pbml0X2NvdXBvbl9pbmZvKDAsIDAsICIiKTsKICAgICAgICAgICAgfSkpIDogKHFfMSA9IHF1YW4sIGV4cCA9IG5ldyBEYXRlKHFfMS5xdWFuX3RpbWUpLCB0aGlzLmluaXRfcXJjb2RlKGRlY29kZVVSSUNvbXBvbmVudChxXzEucXVhbl9saW5rKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5pbml0X2NvdXBvbl9pbmZvKHFfMS5hZnRlcl9wcmljZSwgcV8xLnF1YW5fcHJpY2UsICIiICsgQ29yZS5mb3JtYXQoZXhwLCAieXl5eS1NTS1kZCIpLCBkZWNvZGVVUklDb21wb25lbnQocV8xLnF1YW5fbGluaykpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0sIFRhb0NvdXBvbjsKICAgIH0oQmFzZUNvdXBvbiksIERlZkNvdXBvbiA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIERlZkNvdXBvbigpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKERlZkNvdXBvbiwgX3N1cGVyKSwgRGVmQ291cG9uLnByb3RvdHlwZS5pbml0X2h0bWwgPSBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgcmVzb2x2ZSghMSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBEZWZDb3Vwb24ucHJvdG90eXBlLmluaXRfY291cG9ucyA9IGZ1bmN0aW9uKCkge30sIERlZkNvdXBvbjsKICAgIH0oQmFzZUNvdXBvbiksIExpbmVzT3B0aW9uID0gZnVuY3Rpb24gTGluZXNPcHRpb24oKSB7fSwgY3NzXzI0OHokOSA9ICIjdmlwLXBsdWdpbi1vdXRzaWRlIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBjbGVhcjogYm90aDtcbiAgICBkaXNwbGF5OiBub25lXG59XG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtdG9vbGJhcntcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA1cHg7XG4gICAgcmlnaHQ6IDEwcHg7XG4gICAgei1pbmRleDogMTAwMDA7XG59XG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyB7XG4gICAgd2lkdGg6IDI0MHB4O1xuICAgIGZsb2F0OiBsZWZ0XG59XG5cbiN2aXAtcGx1Z2luLW91dHNpZGUgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtaW4taGVpZ2h0OiAxNTBweDtcbiAgICBtYXJnaW4tdG9wOiAzMHB4XG59XG5cbiN2aXAtcGx1Z2luLW91dHNpZGUgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUgY2FudmFzLFxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXFyY29kZSBpbWcsXG4jdmlwLXBsdWdpbi1vdXRzaWRlIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtcXJjb2RlIHN2Z1xue1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIGhlaWdodDoxNTBweDtcbiAgICB3aWR0aDogMTUwcHg7XG59XG5cbiN2aXAtcGx1Z2luLW91dHNpZGUgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zIC52aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy10aXRsZSB7XG4gICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICBjb2xvcjogIzAwMDtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXJcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXRpdGxlIHNwYW4ge1xuICAgIGNvbG9yOiAjZmYwMDM2O1xuICAgIGZvbnQtd2VpZ2h0OiA3MDBcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWFjdGlvbiB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXJcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWFjdGlvbiBhIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmVcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWFjdGlvbiAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYnV0dG9uIHtcbiAgICBtaW4td2lkdGg6IDEzNXB4O1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAzNXB4O1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQ6ICNmZjAwMzY7XG4gICAgZm9udC1zaXplOiAxM3B4O1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgbGV0dGVyLXNwYWNpbmc6IDEuNXB4O1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiAxNXB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBjdXJzb3I6IHBvaW50ZXJcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMgLnZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWFjdGlvbiAudmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYnV0dG9uLnF1YW4tbm9uZSB7XG4gICAgY29sb3I6ICMwMDA7XG4gICAgYmFja2dyb3VuZDogI2JlYzVjNVxufVxuXG4udmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtZGF0ZSB7XG4gICAgY29sb3I6ICMyMzNiM2Q7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBmb250LXNpemU6IDEycHg7XG59XG5cbiN2aXAtcGx1Z2luLW91dHNpZGUgLnZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5IC52aXAtcGx1Z2luLW91dHNpZGUtaGlzdG9yeS10aXAge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBtYXJnaW46IDA7XG4gICAgdG9wOiA1MCU7XG4gICAgbGVmdDogNTAlO1xuICAgIGxldHRlci1zcGFjaW5nOiAxcHg7XG4gICAgZm9udC1zaXplOiAxNXB4O1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpXG59XG5cbiN2aXAtcGx1Z2luLW91dHNpZGUgLnZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5LCAjdmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWJvZHkge1xuICAgIGhlaWdodDogMzAwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmVcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZSAudmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnkgLnZpcC1wbHVnaW4tb3V0c2lkZS1jaGFydC1jb250YWluZXIsXG4jdmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lci1saW5lIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCVcbn1cblxuI3ZpcC1wbHVnaW4tb3V0c2lkZS1zaW1pbGFyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIHotaW5kZXg6IDk5OTk5OTk5O1xuICAgIGhlaWdodDogMjY4cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBsZWZ0OiAtMXB4O1xuICAgIHRvcDogMzZweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWRmMWYyIWltcG9ydGFudFxufVxuXG4udmlwLXBsdWdpbi1vdXRzaWRlLXNpbWlsYXItYnV5LWxpc3Qge1xuICAgIHdpZHRoOiAzMDNweDtcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2IoMjM3LCAyNDEsIDI0Mik7XG4gICAgaGVpZ2h0OiAyNzBweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW46IDBweDtcbn1cbi52aXAtcGx1Z2luLW91dHNpZGUtc2ltaWxhci1idXktbGlzdC1saS1zdG9yZXtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIG1hcmdpbjogOHB4IDdweCA0cHggMTRweDtcbiAgICB3aWR0aDogMTZweDtcbiAgICBoZWlnaHQ6IDE2cHhcbn1cbi52aXAtcGx1Z2luLW91dHNpZGUtc2ltaWxhci1idXktbGlzdCBsaSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZGYxZjI7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDMzcHg7XG4gICAgbGluZS1oZWlnaHQ6IDMzcHhcbn1cbi52aXAtcGx1Z2luLW91dHNpZGUtc2ltaWxhci1idXktbGlzdCBsaTpmaXJzdC1jaGlsZCBiIHtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA3MDBcbn1cbi52aXAtcGx1Z2luLW91dHNpZGUtc2ltaWxhci1idXktbGlzdC1saS1maXJzdCB7XG4gICAgdG9wOiAxNXB4O1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIHJpZ2h0OiA1MXB4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBtYXJnaW46IDA7XG4gICAgaGVpZ2h0OiBhdXRvXG59XG4udmlwLXBsdWdpbi1vdXRzaWRlLXNpbWlsYXItYnV5LWxpc3QtbGktdGl0bGUge1xuICAgIGhlaWdodDogMzNweDtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZDogMCAwO1xuICAgIGxpbmUtaGVpZ2h0OiAzM3B4O1xuICAgIG1heC13aWR0aDogMTcwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHdpZHRoOiBhdXRvXG59XG4udmlwLXBsdWdpbi1vdXRzaWRlLXNpbWlsYXItYnV5LWxpc3QtbGktcHJpY2Uge1xuICAgIGNvbG9yOiAjRTQzOTNDO1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgbGluZS1oZWlnaHQ6IDMzcHg7XG4gICAgaGVpZ2h0OiAzM3B4O1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNHB4O1xufVxuIiwgCiAgICBzdHlsZUluamVjdChjc3NfMjQ4eiQ5KSwgTXNnSW5mbyA9IGZ1bmN0aW9uIE1zZ0luZm8oKSB7fSwgUHJvbW9JbmZvID0gZnVuY3Rpb24gUHJvbW9JbmZvKCkgewogICAgICAgIHRoaXMucHJpY2UgPSAwLCB0aGlzLnRpbWUgPSAwOwogICAgfSwgSGlzdG9yeVNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBIaXN0b3J5U2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlRNYWxsLCAvZGV0YWlsLnRtYWxsLmNvbVwvaXRlbS5odG0vaSBdLCBbIFNpdGVFbnVtLlRhb0JhbywgL2l0ZW0udGFvYmFvLmNvbS9pIF0sIFsgU2l0ZUVudW0uSmluZ0RvbmcsIC9pdGVtLmpkLihjb218aGspXC9bMC05XSouaHRtbC9pIF0sIFsgU2l0ZUVudW0uU3VOaW5nLCAvcHJvZHVjdC5zdW5pbmcuY29tL2kgXSwgWyBTaXRlRW51bS5WcCwgL2RldGFpbC52aXAuY29tL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLmZhY3RvcnkgPSBuZXcgRGVmQ291cG9uLCBfdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhIaXN0b3J5U2VydmljZSwgX3N1cGVyKSwgSGlzdG9yeVNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIEhpc3RvcnlTZXJ2aWNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5pbmplY3RIaXN0b3J5KCk7CiAgICAgICAgfSwgSGlzdG9yeVNlcnZpY2UucHJvdG90eXBlLmluamVjdEhpc3RvcnkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgc3dpdGNoIChMb2dnZXIuZGVidWcodGhpcy5zaXRlKSwgdGhpcy5zaXRlKSB7CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5UYW9CYW86CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5UTWFsbDoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBUYW9Db3Vwb247CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5KaW5nRG9uZzoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBKZENvdXBvbjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlN1TmluZzoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBTdW5pbmdDb3Vwb247CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5WcDoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBWcENvdXBvbjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gbmV3IERlZkNvdXBvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZhY3RvcnkuaW5pdF9odG1sKHRoaXMuZ2V0SGlzdG9yeUh0bWwoKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICByZXMgJiYgX3RoaXMuSW5pdFByaWNlSGlzdG9yeSgpLCBfdGhpcy5mYWN0b3J5LmluaXRfY291cG9ucyAmJiBfdGhpcy5mYWN0b3J5LmluaXRfY291cG9ucygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgSGlzdG9yeVNlcnZpY2UucHJvdG90eXBlLkluaXRQcmljZUhpc3RvcnkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgiI3ZpcC1wbHVnaW4tb3V0c2lkZSIpLnNob3coKSwgdGhpcy50aGVtZSgpLCB0aGlzLmNoYXJ0TXNnKCJcdTUzODZcdTUzZjJcdTRlZjdcdTY4M2NcdTY3ZTVcdThiZTJcdTRlMmQiKTsKICAgICAgICB9LCBIaXN0b3J5U2VydmljZS5wcm90b3R5cGUuZ2V0SGlzdG9yeUh0bWwgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICc8ZGl2IGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUiPjxjYW52YXMgaWQ9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXFyY29kZS1pbWciPjwvY2FudmFzPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtdGl0bGUiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNvdXBvbnMtYWN0aW9uIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5IiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnkiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lciI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnktdGlwIj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj4nOwogICAgICAgIH0sIEhpc3RvcnlTZXJ2aWNlLnByb3RvdHlwZS5jaGFydE1zZyA9IGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICAkKCIudmlwLXBsdWdpbi1vdXRzaWRlLWhpc3RvcnktdGlwIikuaHRtbChtc2cpOwogICAgICAgIH0sIEhpc3RvcnlTZXJ2aWNlLnByb3RvdHlwZS5nZXRDaGFydE9wdGlvbiA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgc3RlcCwgbGluZSwgdGV4dCA9ICJcdTUzODZcdTUzZjJcdTRmNGVcdTRlZjdcdWZmMWF7cmVkfFx1ZmZlNSIgKyBkYXRhLm1pbiArICJ9ICgge3JlZHwiICsgZGF0YS5kYXRlICsgIn0gKSBcdTUyMDZcdTY3OTBcdWZmMWEiICsgZGF0YS5tYXJrLCBjaGFydE9wdGlvbiA9IG5ldyBMaW5lc09wdGlvbiwgZGF0YXMgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgbCA9IFtdOwogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEucHJpY2VfZGV0YWlsLmZvckVhY2goKGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdi50aW1lLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWyB2LnRpbWVzdGFtcCwgdi5wcmljZSwgdi5tYXJrIF0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGwucHVzaChwKTsKICAgICAgICAgICAgICAgIH0pKSwgbDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHN0ZXAgPSAxMCwgKGNoYXJ0T3B0aW9uID0gewogICAgICAgICAgICAgICAgdGl0bGU6IHsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgICAgIHN1YnRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICByaWNoOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogInJlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0b29sdGlwOiB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogImF4aXMiLAogICAgICAgICAgICAgICAgICAgIGF4aXNQb2ludGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJjcm9zcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIGRhdGUsIHllYXIsIG1vbnRoLCBkYXksIG1vbnRoU3RyLCBkYXlTdHIsIHByaWNlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zID0gcGFyYW1zWzBdLCB5ZWFyID0gKGRhdGUgPSBuZXcgRGF0ZShwYXJhbXMubmFtZSkpLmdldEZ1bGxZZWFyKCksIAogICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDEsIGRheSA9IGRhdGUuZ2V0RGF0ZSgpLCBtb250aFN0ciA9IG1vbnRoLnRvU3RyaW5nKCksIAogICAgICAgICAgICAgICAgICAgICAgICBkYXlTdHIgPSBkYXkudG9TdHJpbmcoKSwgbW9udGggPCAxMCAmJiAobW9udGhTdHIgPSAiMCIgKyBtb250aCksIGRheSA8IDEwICYmIChkYXlTdHIgPSAiMCIgKyBkYXkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2UgPSBudWxsID09PSAoX2EgPSBwYXJhbXMudmFsdWVbMV0pIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVlNVx1NjcxZlx1ZmYxYSIgKyB5ZWFyICsgIi0iICsgbW9udGhTdHIgKyAiLSIgKyBkYXlTdHIgKyAiPGJyLz5cdTRlZjdcdTY4M2NcdWZmMWFcdWZmZTUiICsgKHByaWNlID0gbnVsbCA9PT0gKF9iID0gcGFyc2VGbG9hdChwcmljZSkpIHx8IHZvaWQgMCA9PT0gX2IgPyB2b2lkIDAgOiBfYi50b0ZpeGVkKDIpKSArICgiIiA9PSBwYXJhbXMudmFsdWVbMl0gPyAiIiA6ICI8YnIvPiIgKyBwYXJhbXMudmFsdWVbMl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBncmlkOiB7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCwKICAgICAgICAgICAgICAgICAgICByaWdodDogMjAsCiAgICAgICAgICAgICAgICAgICAgdG9wOiA1MCwKICAgICAgICAgICAgICAgICAgICBib3R0b206IDEwLAogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5MYWJlbDogITAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB4QXhpczogewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ0aW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHlBeGlzOiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogInZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNlcmllczogWyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICAgICAgICAgIHN0ZXA6ICJlbmQiLAogICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFzKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHNob3dTeW1ib2w6ICExLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMsCiAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2ZmMDAzNiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IF0KICAgICAgICAgICAgfSkueUF4aXMgPSB7CiAgICAgICAgICAgICAgICBtaW46IE1hdGguZmxvb3IoLjkgKiBkYXRhLm1pbiAvIHN0ZXApICogc3RlcCwKICAgICAgICAgICAgICAgIG1heDogTWF0aC5jZWlsKDEuMSAqIGRhdGEubWF4IC8gc3RlcCkgKiBzdGVwCiAgICAgICAgICAgIH0sIChsaW5lID0gbnVsbCA9PT0gKF9hID0gY2hhcnRPcHRpb24uc2VyaWVzKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EucG9wKCkpLm1hcmtQb2ludCA9IHsKICAgICAgICAgICAgICAgIGRhdGE6IFsgewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLm1pbiwKICAgICAgICAgICAgICAgICAgICBjb29yZDogWyBkYXRhLmRhdGUsIGRhdGEubWluIF0sCiAgICAgICAgICAgICAgICAgICAgbmFtZTogIlx1NjcwMFx1NWMwZlx1NTAzYyIsCiAgICAgICAgICAgICAgICAgICAgaXRlbVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiZ3JlZW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLm1heCwKICAgICAgICAgICAgICAgICAgICBjb29yZDogWyBkYXRhLm1heF9kYXRlLCBkYXRhLm1heCBdLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJcdTY3MDBcdTU5MjdcdTUwM2MiLAogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogInJlZCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IF0KICAgICAgICAgICAgfSwgbnVsbCA9PT0gKF9iID0gY2hhcnRPcHRpb24uc2VyaWVzKSB8fCB2b2lkIDAgPT09IF9iIHx8IF9iLnB1c2gobGluZSksIGNoYXJ0T3B0aW9uLmRhdGFab29tID0gWyB7CiAgICAgICAgICAgICAgICB0eXBlOiAic2xpZGVyIiwKICAgICAgICAgICAgICAgIHNob3c6ICEwLAogICAgICAgICAgICAgICAgcmVhbHRpbWU6ICEwLAogICAgICAgICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICAgICAgICBlbmQ6IDEwMAogICAgICAgICAgICB9IF0sIGNoYXJ0T3B0aW9uOwogICAgICAgIH0sIEhpc3RvcnlTZXJ2aWNlLnByb3RvdHlwZS50aGVtZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgY29sb3I6IFsgIiMyZWM3YzkiLCAiI2I2YTJkZSIsICIjNWFiMWVmIiwgIiNmZmI5ODAiLCAiI2Q4N2E4MCIsICIjOGQ5OGIzIiwgIiNlNWNmMGQiLCAiIzk3YjU1MiIsICIjOTU3MDZkIiwgIiNkYzY5YWEiLCAiIzA3YTJhNCIsICIjOWE3ZmQxIiwgIiM1ODhkZDUiLCAiI2Y1OTk0ZSIsICIjYzA1MDUwIiwgIiM1OTY3OGMiLCAiI2M5YWIwMCIsICIjN2ViMDBhIiwgIiM2ZjU1NTMiLCAiI2MxNDA4OSIgXSwKICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgaXRlbUdhcDogOCwKICAgICAgICAgICAgICAgICAgICB0ZXh0U3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogIm5vcm1hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVnZW5kOiB7CiAgICAgICAgICAgICAgICAgICAgaXRlbUdhcDogOAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRhdGFSYW5nZTogewogICAgICAgICAgICAgICAgICAgIGl0ZW1XaWR0aDogMTUsCiAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgIiMyZWM3YzkiLCAiI2I2YTJkZSIgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRvb2xib3g6IHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogWyAiIzFlOTBmZiIsICIjMWU5MGZmIiwgIiMxZTkwZmYiLCAiIzFlOTBmZiIgXSwKICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVDb2xvcjogIiNmZjQ1MDAiLAogICAgICAgICAgICAgICAgICAgIGl0ZW1HYXA6IDgKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0b29sdGlwOiB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAicmdiYSg1MCw1MCw1MCwwLjUpIiwKICAgICAgICAgICAgICAgICAgICBheGlzUG9pbnRlcjogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAibGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1N0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDhhY2QiCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1N0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogInJnYmEoMjAwLDIwMCwyMDAsMC4yKSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkYXRhWm9vbTogewogICAgICAgICAgICAgICAgICAgIGRhdGFCYWNrZ3JvdW5kQ29sb3I6ICIjZWZlZmZmIiwKICAgICAgICAgICAgICAgICAgICBmaWxsZXJDb2xvcjogInJnYmEoMTgyLDE2MiwyMjIsMC4yKSIsCiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdyaWQ6IHsKICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogIiNlZWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY2F0ZWdvcnlBeGlzOiB7CiAgICAgICAgICAgICAgICAgICAgYXhpc0xpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDhhY2QiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNwbGl0TGluZTogewogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBbICIjZWVlIiBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdmFsdWVBeGlzOiB7CiAgICAgICAgICAgICAgICAgICAgYXhpc0xpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDhhY2QiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNwbGl0QXJlYTogewogICAgICAgICAgICAgICAgICAgICAgICBzaG93OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogWyAicmdiYSgyNTAsMjUwLDI1MCwwLjEpIiwgInJnYmEoMjAwLDIwMCwyMDAsMC4xKSIgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogWyAiI2VlZSIgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHBvbGFyOiB7CiAgICAgICAgICAgICAgICAgICAgYXhpc0xpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkZGQiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNwbGl0QXJlYTogewogICAgICAgICAgICAgICAgICAgICAgICBzaG93OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogWyAicmdiYSgyNTAsMjUwLDI1MCwwLjIpIiwgInJnYmEoMjAwLDIwMCwyMDAsMC4yKSIgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkZGQiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGltZWxpbmU6IHsKICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgY29udHJvbFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzeW1ib2w6ICJlbXB0eUNpcmNsZSIsCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogMwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJhcjogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogNQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA1CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGluZTogewogICAgICAgICAgICAgICAgICAgIHN5bWJvbDogImVtcHR5Q2lyY2xlIiwKICAgICAgICAgICAgICAgICAgICBzeW1ib2xTaXplOiAzCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgazogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2Q4N2E4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjA6ICIjMmVjN2M5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2Q4N2E4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IwOiAiIzJlYzdjOSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzY2F0dGVyOiB7CiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiAiY2lyY2xlIiwKICAgICAgICAgICAgICAgICAgICBzeW1ib2xTaXplOiA0CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmFkYXI6IHsKICAgICAgICAgICAgICAgICAgICBzeW1ib2w6ICJlbXB0eUNpcmNsZSIsCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogMwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1hcDogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2RkZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkODdhODAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZmU5OTRlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmdiKDEwMCwwLDApIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmb3JjZTogewogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiAiIzFlOTBmZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjaG9yZDogewogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDQsCiAgICAgICAgICAgICAgICAgICAgaXRlbVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvcmRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvcmRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdhdWdlOiB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZTogMjI1LAogICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlOiAtNDUsCiAgICAgICAgICAgICAgICAgICAgYXhpc0xpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgWyAuMiwgIiMyZWM3YzkiIF0sIFsgLjgsICIjNWFiMWVmIiBdLCBbIDEsICIjZDg3YTgwIiBdIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXhpc1RpY2s6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXROdW1iZXI6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiYXV0byIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXhpc0xhYmVsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJhdXRvIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHBvaW50ZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiYXV0byIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMzMzIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogIlx1NWZhZVx1OGY2Zlx1OTZjNVx1OWVkMSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSwgSGlzdG9yeVNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBLYW9sYUNvdXBvbiA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIEthb2xhQ291cG9uKCkgewogICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoS2FvbGFDb3Vwb24sIF9zdXBlciksIEthb2xhQ291cG9uLnByb3RvdHlwZS5pbml0X2NvdXBvbnMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGtleV8xLCBjb3Vwb24sIHFfMSwgZXhwXzEsIF90aGlzID0gdGhpcywgaXRlbUlkID0gdW5zYWZlV2luZG93Ll9fa2FvbGFHVE1Hb29kc0RhdGEucHJvZHVjdF9ubzsKICAgICAgICAgICAgaXRlbUlkID8gKGtleV8xID0gImtvbC0iICsgaXRlbUlkLCAoY291cG9uID0gQ29uZmlnLmdldChrZXlfMSkpID8gY291cG9uLmhhc19jb3Vwb24gPyAocV8xID0gY291cG9uLCAKICAgICAgICAgICAgZXhwXzEgPSBuZXcgRGF0ZShxXzEucXVhbl90aW1lKSwgdGhpcy5pbml0X3FyY29kZShkZWNvZGVVUklDb21wb25lbnQocV8xLnF1YW5fbGluaykpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxXzEuYWZ0ZXJfcHJpY2UsIHFfMS5xdWFuX3ByaWNlLCAiIiArIENvcmUuZm9ybWF0KGV4cF8xLCAieXl5eS1NTS1kZCIpLCBkZWNvZGVVUklDb21wb25lbnQocV8xLnF1YW5fbGluaykpOwogICAgICAgICAgICB9KSkpIDogY291cG9uLnF1YW5fbGluayA/IHRoaXMuZGVmYXVsdChjb3Vwb24ucXVhbl9saW5rKSA6IHRoaXMuZGVmYXVsdCgpIDogUm91dGUucXVlcnlLbENvdXBvbnMoaXRlbUlkKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgIHZhciBxXzIsIGV4cF8yOwogICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKHJlcyksIChudWxsID09IHJlcyA/IHZvaWQgMCA6IHJlcy5jb2RlKSA/IChDb25maWcuc2V0KGtleV8xLCByZXMuZGF0YSwgNDMyMDApLCAKICAgICAgICAgICAgICAgIHJlcy5kYXRhLmhhc19jb3Vwb24gPyAocV8yID0gcmVzLmRhdGEsIGV4cF8yID0gbmV3IERhdGUocV8yLnF1YW5fdGltZSksIF90aGlzLmluaXRfcXJjb2RlKGRlY29kZVVSSUNvbXBvbmVudChxXzIucXVhbl9saW5rKSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9jb3Vwb25faW5mbyhxXzIuYWZ0ZXJfcHJpY2UsIHFfMi5xdWFuX3ByaWNlLCAiIiArIENvcmUuZm9ybWF0KGV4cF8yLCAieXl5eS1NTS1kZCIpLCBkZWNvZGVVUklDb21wb25lbnQocV8yLnF1YW5fbGluaykpOwogICAgICAgICAgICAgICAgfSkpKSA6IHJlcy5kYXRhLnF1YW5fbGluayA/IF90aGlzLmRlZmF1bHQocmVzLmRhdGEucXVhbl9saW5rKSA6IF90aGlzLmRlZmF1bHQoKSkgOiBfdGhpcy5kZWZhdWx0KCk7CiAgICAgICAgICAgIH0pKSkgOiB0aGlzLmRlZmF1bHQoKTsKICAgICAgICB9LCBLYW9sYUNvdXBvbi5wcm90b3R5cGUuaW5pdF9odG1sID0gZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICQoIiNjb21ib1JlY2JveCIpLmxlbmd0aCA/IChDb3JlLmFwcGVuZFRvKCIjY29tYm9SZWNib3giLCBodG1sKSwgcmVzb2x2ZSghMCkpIDogc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdF9odG1sKGh0bWwpOwogICAgICAgICAgICAgICAgfSksIDJlMyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBLYW9sYUNvdXBvbjsKICAgIH0oQmFzZUNvdXBvbiksIGNzc18yNDh6JDggPSAiLm9uZS1rZXktdmlwLWNvbnRhaW5lciB7IHotaW5kZXg6IDk5OTk5IWltcG9ydGFudCB9XG4ub25lLWtleS12aXAtcG9wdXAgeyBmb250LXNpemU6IDE0cHggIWltcG9ydGFudCB9XG4ub25lLWtleS12aXAtc2V0dGluZy1sYWJlbCB7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47cGFkZGluZy10b3A6IDIwcHg7IH1cbi5vbmUta2V5LXZpcC1zZXR0aW5nLWNoZWNrYm94IHsgd2lkdGg6IDE2cHg7aGVpZ2h0OiAxNnB4OyB9XG4iLCAKICAgIHN0eWxlSW5qZWN0KGNzc18yNDh6JDgpLCBzQWxlcnQgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBzQWxlcnQoKSB7fQogICAgICAgIHJldHVybiBzQWxlcnQudG9hc3QgPSBmdW5jdGlvbihtc2csIGljb24sIHBvc2l0aW9uLCB0aW1lKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gaWNvbiAmJiAoaWNvbiA9ICJzdWNjZXNzIiksIHZvaWQgMCA9PT0gcG9zaXRpb24gJiYgKHBvc2l0aW9uID0gInRvcCIpLCAKICAgICAgICAgICAgdm9pZCAwID09PSB0aW1lICYmICh0aW1lID0gMiksIFN3YWxfX2RlZmF1bHQuZGVmYXVsdC5maXJlKHsKICAgICAgICAgICAgICAgIHRvYXN0OiAhMCwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246ICExLAogICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246ICExLAogICAgICAgICAgICAgICAgdGl0bGU6IG1zZywKICAgICAgICAgICAgICAgIGljb246IGljb24sCiAgICAgICAgICAgICAgICB0aW1lcjogMWUzICogdGltZSwKICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB0aGlzLmN1c3RvbWVDc3MKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgc0FsZXJ0LmVycm9yID0gZnVuY3Rpb24obXNnLCB0aW1lKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IDIpLCB0aGlzLnRvYXN0KG1zZywgImVycm9yIiwgImNlbnRlciIsIHRpbWUpOwogICAgICAgIH0sIHNBbGVydC5pbmZvID0gZnVuY3Rpb24obXNnLCBpY29uLCBwb3NpdGlvbiwgdGltZSkgewogICAgICAgICAgICB2b2lkIDAgPT09IGljb24gJiYgKGljb24gPSAic3VjY2VzcyIpLCB2b2lkIDAgPT09IHBvc2l0aW9uICYmIChwb3NpdGlvbiA9ICJ0b3AiKSwgCiAgICAgICAgICAgIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IDIpLCBTd2FsX19kZWZhdWx0LmRlZmF1bHQuZmlyZSh7CiAgICAgICAgICAgICAgICB0b2FzdDogITAsCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiAhMSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiAhMSwKICAgICAgICAgICAgICAgIHRpdGxlOiBtc2csCiAgICAgICAgICAgICAgICBpY29uOiBpY29uLAogICAgICAgICAgICAgICAgdGltZXI6IDFlMyAqIHRpbWUsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzczogdGhpcy5jdXN0b21lQ3NzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIHNBbGVydC5tc2cgPSBmdW5jdGlvbih0aXRsZSwgaHRtbCwgd2lkdGgpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gd2lkdGggJiYgKHdpZHRoID0gIjMycmVtIiksICJhdXRvIiA9PSB3aWR0aCAmJiAod2lkdGggPSB1bnNhZmVXaW5kb3cud2luZG93Lm91dGVyV2lkdGggPCA5MDAgPyAiOTAlIiA6IDgwMCksIAogICAgICAgICAgICBTd2FsX19kZWZhdWx0LmRlZmF1bHQuZmlyZSh7CiAgICAgICAgICAgICAgICB0aXRsZTogIjxzdHJvbmc+IiArIHRpdGxlICsgIjwvc3Ryb25nPiIsCiAgICAgICAgICAgICAgICBodG1sOiBodG1sLAogICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiAhMCwKICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aAogICAgICAgICAgICB9KTsKICAgICAgICB9LCBzQWxlcnQuaHRtbCA9IGZ1bmN0aW9uKHRpdGxlLCBodG1sLCBjYW5jZWwsIGNhbmNlbFR4dCwgY2FuY2VsQ29sb3IsIHdpZHRoLCBjb25maXJtLCBjb25maXJtVHh0KSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGNhbmNlbCAmJiAoY2FuY2VsID0gITEpLCB2b2lkIDAgPT09IGNhbmNlbFR4dCAmJiAoY2FuY2VsVHh0ID0gIiIpLCAKICAgICAgICAgICAgdm9pZCAwID09PSBjYW5jZWxDb2xvciAmJiAoY2FuY2VsQ29sb3IgPSAiIzMwODVkNiIpLCB2b2lkIDAgPT09IHdpZHRoICYmICh3aWR0aCA9ICIzMnJlbSIpLCAKICAgICAgICAgICAgdm9pZCAwID09PSBjb25maXJtICYmIChjb25maXJtID0gITEpLCB2b2lkIDAgPT09IGNvbmZpcm1UeHQgJiYgKGNvbmZpcm1UeHQgPSAiIiksIAogICAgICAgICAgICAiYXV0byIgPT0gd2lkdGggJiYgKHdpZHRoID0gdW5zYWZlV2luZG93LndpbmRvdy5vdXRlcldpZHRoIDwgOTAwID8gIjkwJSIgOiA4MDApLCAKICAgICAgICAgICAgU3dhbF9fZGVmYXVsdC5kZWZhdWx0LmZpcmUoewogICAgICAgICAgICAgICAgcG9zaXRpb246ICJjZW50ZXIiLAogICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAogICAgICAgICAgICAgICAgaHRtbDogaHRtbCwKICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGNhbmNlbCwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBjb25maXJtLAogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IGNhbmNlbENvbG9yLAogICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogY2FuY2VsVHh0LAogICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1UeHQsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzczogdGhpcy5jdXN0b21lQ3NzLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6ICExLAogICAgICAgICAgICAgICAgYWxsb3dFc2NhcGVLZXk6ICExCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIHNBbGVydC5jb25maXJtID0gZnVuY3Rpb24odGl0bGUsIHRleHQsIGNvbmZpcm1UZXh0LCBjYW5jZWxUZXh0LCBpY29uLCBkZW55VGV4dCkgewogICAgICAgICAgICB2b2lkIDAgPT09IGNvbmZpcm1UZXh0ICYmIChjb25maXJtVGV4dCA9ICJcdTc4NmVcdTViOWEiKSwgdm9pZCAwID09PSBjYW5jZWxUZXh0ICYmIChjYW5jZWxUZXh0ID0gIlx1NTNkNlx1NmQ4OCIpLCAKICAgICAgICAgICAgdm9pZCAwID09PSBpY29uICYmIChpY29uID0gInF1ZXN0aW9uIiksIHZvaWQgMCA9PT0gZGVueVRleHQgJiYgKGRlbnlUZXh0ID0gIiIpOwogICAgICAgICAgICB2YXIgb3B0aW9uID0gewogICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgICAgIGljb246IGljb24sCiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiAhMCwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiAhMSwKICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogIiMzMDg1ZDYiLAogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6ICIjZDMzIiwKICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBjb25maXJtVGV4dCwKICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IGNhbmNlbFRleHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuICIiICE9IGRlbnlUZXh0ICYmIChvcHRpb24uZGVueUJ1dHRvblRleHQgPSBkZW55VGV4dCksIFN3YWxfX2RlZmF1bHQuZGVmYXVsdC5maXJlKG9wdGlvbik7CiAgICAgICAgfSwgc0FsZXJ0LnNob3dJbWcgPSBmdW5jdGlvbihpbWFnZSwgdGl0bGUsIHRleHQsIGFsdCwgYnRuVHh0KSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gYnRuVHh0ICYmIChidG5UeHQgPSAiIik7CiAgICAgICAgICAgIHZhciBvcHQgPSB7CiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsCiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgaW1hZ2VVcmw6IGltYWdlLAogICAgICAgICAgICAgICAgaW1hZ2VBbHQ6IGFsdCwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiAhMQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gbnVsbCAhPSBidG5UeHQgJiYgKG9wdC5zaG93Q29uZmlybUJ1dHRvbiA9ICEwLCBvcHQuY29uZmlybUJ1dHRvblRleHQgPSBidG5UeHQpLCAKICAgICAgICAgICAgU3dhbF9fZGVmYXVsdC5kZWZhdWx0LmZpcmUob3B0KTsKICAgICAgICB9LCBzQWxlcnQubG9hZGluZyA9IGZ1bmN0aW9uKHRpbWUsIHRhcmdldCkgewogICAgICAgICAgICB2b2lkIDAgPT09IHRpbWUgJiYgKHRpbWUgPSAtMSksIHZvaWQgMCA9PT0gdGFyZ2V0ICYmICh0YXJnZXQgPSBudWxsKSwgbnVsbCA9PSB0YXJnZXQgPyBTd2FsX19kZWZhdWx0LmRlZmF1bHQuc2hvd0xvYWRpbmcoKSA6IFN3YWxfX2RlZmF1bHQuZGVmYXVsdC5zaG93TG9hZGluZyh0YXJnZXQpLCAKICAgICAgICAgICAgLTEgIT0gdGltZSAmJiBDb3JlLnNsZWVwKHRpbWUpLnRoZW4oKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgU3dhbF9fZGVmYXVsdC5kZWZhdWx0LmhpZGVMb2FkaW5nKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBzQWxlcnQuY2xvc2VMb2FkaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFN3YWxfX2RlZmF1bHQuZGVmYXVsdC5oaWRlTG9hZGluZygpOwogICAgICAgIH0sIHNBbGVydC5jbG9zZSA9IGZ1bmN0aW9uKHRhcmdldCkgewogICAgICAgICAgICBTd2FsX19kZWZhdWx0LmRlZmF1bHQuY2xvc2UodGFyZ2V0KTsKICAgICAgICB9LCBzQWxlcnQuY3VzdG9tZUNzcyA9IHsKICAgICAgICAgICAgY29udGFpbmVyOiAib25lLWtleS12aXAtY29udGFpbmVyIiwKICAgICAgICAgICAgcG9wdXA6ICJvbmUta2V5LXZpcC1wb3B1cCIsCiAgICAgICAgICAgIGhlYWRlcjogIm9uZS1rZXktdmlwLWhlYWRlciIsCiAgICAgICAgICAgIHRpdGxlOiAib25lLWtleS12aXAtdGl0bGUiLAogICAgICAgICAgICBjbG9zZUJ1dHRvbjogIm9uZS1rZXktdmlwLWNsb3NlIiwKICAgICAgICAgICAgaWNvbjogIm9uZS1rZXktdmlwLWljb24iLAogICAgICAgICAgICBpbWFnZTogIm9uZS1rZXktdmlwLWltYWdlIiwKICAgICAgICAgICAgY29udGVudDogIm9uZS1rZXktdmlwLWNvbnRlbnQiLAogICAgICAgICAgICBodG1sQ29udGFpbmVyOiAib25lLWtleS12aXAtaHRtbCIsCiAgICAgICAgICAgIGlucHV0OiAib25lLWtleS12aXAtaW5wdXQiLAogICAgICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZTogIm9uZS1rZXktdmlwLXZhbGlkYXRpb24iLAogICAgICAgICAgICBhY3Rpb25zOiAib25lLWtleS12aXAtYWN0aW9ucyIsCiAgICAgICAgICAgIGNvbmZpcm1CdXR0b246ICJvbmUta2V5LXZpcC1jb25maXJtIiwKICAgICAgICAgICAgZGVueUJ1dHRvbjogIm9uZS1rZXktdmlwLWRlbnkiLAogICAgICAgICAgICBjYW5jZWxCdXR0b246ICJvbmUta2V5LXZpcC1jYW5jZWwiLAogICAgICAgICAgICBsb2FkZXI6ICJvbmUta2V5LXZpcC1sb2FkZXIiLAogICAgICAgICAgICBmb290ZXI6ICJvbmUta2V5LXZpcC1mb290ZXIiCiAgICAgICAgfSwgc0FsZXJ0OwogICAgfSgpLCBjb21tb25qc0dsb2JhbCA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBnbG9iYWxUaGlzID8gZ2xvYmFsVGhpcyA6ICJ1bmRlZmluZWQiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZ2xvYmFsID8gZ2xvYmFsIDogInVuZGVmaW5lZCIgIT0gdHlwZW9mIHNlbGYgPyBzZWxmIDoge30sIAogICAgZmluZ2VycHJpbnQyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoKGZ1bmN0aW9uKG1vZHVsZSkgewogICAgICAgIHZhciBjb250ZXh0LCBkZWZpbml0aW9uOwogICAgICAgIGNvbnRleHQgPSBjb21tb25qc0dsb2JhbCwgZGVmaW5pdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgeDY0QWRkLCB4NjRNdWx0aXBseSwgeDY0Um90bCwgeDY0TGVmdFNoaWZ0LCB4NjRYb3IsIHg2NEZtaXgsIHg2NGhhc2gxMjgsIGRlZmF1bHRPcHRpb25zLCBlYWNoLCBtYXAsIGV4dGVuZFNvZnQsIGVudW1lcmF0ZURldmljZXNLZXksIGlzRW51bWVyYXRlRGV2aWNlc1N1cHBvcnRlZCwgc2NyZWVuUmVzb2x1dGlvbktleSwgZ2V0U2NyZWVuUmVzb2x1dGlvbiwgYXZhaWxhYmxlU2NyZWVuUmVzb2x1dGlvbktleSwgZ2V0QXZhaWxhYmxlU2NyZWVuUmVzb2x1dGlvbiwgc2Vzc2lvblN0b3JhZ2VLZXksIGxvY2FsU3RvcmFnZUtleSwgaW5kZXhlZERiS2V5LCBjcHVDbGFzc0tleSwgcGxhdGZvcm1LZXksIGRvTm90VHJhY2tLZXksIGNhbnZhc0tleSwgd2ViZ2xLZXksIHdlYmdsVmVuZG9yQW5kUmVuZGVyZXJLZXksIGFkQmxvY2tLZXksIGhhc0xpZWRMYW5ndWFnZXNLZXksIGhhc0xpZWRSZXNvbHV0aW9uS2V5LCBoYXNMaWVkT3NLZXksIGhhc0xpZWRCcm93c2VyS2V5LCBmbGFzaEZvbnRzS2V5LCBwbHVnaW5zQ29tcG9uZW50LCBnZXRSZWd1bGFyUGx1Z2lucywgZ2V0SUVQbHVnaW5zLCBwbHVnaW5zU2hvdWxkQmVTb3J0ZWQsIHRvdWNoU3VwcG9ydEtleSwgaGFyZHdhcmVDb25jdXJyZW5jeUtleSwgaGFzU2Vzc2lvblN0b3JhZ2UsIGhhc0xvY2FsU3RvcmFnZSwgaGFzSW5kZXhlZERCLCBnZXRIYXJkd2FyZUNvbmN1cnJlbmN5LCBnZXROYXZpZ2F0b3JDcHVDbGFzcywgZ2V0TmF2aWdhdG9yUGxhdGZvcm0sIGdldERvTm90VHJhY2ssIGdldFRvdWNoU3VwcG9ydCwgZ2V0Q2FudmFzRnAsIGdldFdlYmdsRnAsIGdldFdlYmdsVmVuZG9yQW5kUmVuZGVyZXIsIGdldEFkQmxvY2ssIGdldEhhc0xpZWRMYW5ndWFnZXMsIGdldEhhc0xpZWRSZXNvbHV0aW9uLCBnZXRIYXNMaWVkT3MsIGdldEhhc0xpZWRCcm93c2VyLCBpc0NhbnZhc1N1cHBvcnRlZCwgaXNXZWJHbFN1cHBvcnRlZCwgaXNJRSwgaXNJRU9yT2xkRWRnZSwgaGFzU3dmT2JqZWN0TG9hZGVkLCBoYXNNaW5GbGFzaEluc3RhbGxlZCwgYWRkRmxhc2hEaXZOb2RlLCBsb2FkU3dmQW5kRGV0ZWN0Rm9udHMsIGdldFdlYmdsQ2FudmFzLCBsb3NlV2ViZ2xDb250ZXh0LCBjb21wb25lbnRzLCBGaW5nZXJwcmludDI7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IEFycmF5LmlzQXJyYXkgJiYgKEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiAiW29iamVjdCBBcnJheV0iID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTsKICAgICAgICAgICAgfSksIHg2NEFkZCA9IGZ1bmN0aW9uIHg2NEFkZChtLCBuKSB7CiAgICAgICAgICAgICAgICBtID0gWyBtWzBdID4+PiAxNiwgNjU1MzUgJiBtWzBdLCBtWzFdID4+PiAxNiwgNjU1MzUgJiBtWzFdIF0sIG4gPSBbIG5bMF0gPj4+IDE2LCA2NTUzNSAmIG5bMF0sIG5bMV0gPj4+IDE2LCA2NTUzNSAmIG5bMV0gXTsKICAgICAgICAgICAgICAgIHZhciBvID0gWyAwLCAwLCAwLCAwIF07CiAgICAgICAgICAgICAgICByZXR1cm4gb1szXSArPSBtWzNdICsgblszXSwgb1syXSArPSBvWzNdID4+PiAxNiwgb1szXSAmPSA2NTUzNSwgb1syXSArPSBtWzJdICsgblsyXSwgCiAgICAgICAgICAgICAgICBvWzFdICs9IG9bMl0gPj4+IDE2LCBvWzJdICY9IDY1NTM1LCBvWzFdICs9IG1bMV0gKyBuWzFdLCBvWzBdICs9IG9bMV0gPj4+IDE2LCBvWzFdICY9IDY1NTM1LCAKICAgICAgICAgICAgICAgIG9bMF0gKz0gbVswXSArIG5bMF0sIG9bMF0gJj0gNjU1MzUsIFsgb1swXSA8PCAxNiB8IG9bMV0sIG9bMl0gPDwgMTYgfCBvWzNdIF07CiAgICAgICAgICAgIH0sIHg2NE11bHRpcGx5ID0gZnVuY3Rpb24geDY0TXVsdGlwbHkobSwgbikgewogICAgICAgICAgICAgICAgbSA9IFsgbVswXSA+Pj4gMTYsIDY1NTM1ICYgbVswXSwgbVsxXSA+Pj4gMTYsIDY1NTM1ICYgbVsxXSBdLCBuID0gWyBuWzBdID4+PiAxNiwgNjU1MzUgJiBuWzBdLCBuWzFdID4+PiAxNiwgNjU1MzUgJiBuWzFdIF07CiAgICAgICAgICAgICAgICB2YXIgbyA9IFsgMCwgMCwgMCwgMCBdOwogICAgICAgICAgICAgICAgcmV0dXJuIG9bM10gKz0gbVszXSAqIG5bM10sIG9bMl0gKz0gb1szXSA+Pj4gMTYsIG9bM10gJj0gNjU1MzUsIG9bMl0gKz0gbVsyXSAqIG5bM10sIAogICAgICAgICAgICAgICAgb1sxXSArPSBvWzJdID4+PiAxNiwgb1syXSAmPSA2NTUzNSwgb1syXSArPSBtWzNdICogblsyXSwgb1sxXSArPSBvWzJdID4+PiAxNiwgb1syXSAmPSA2NTUzNSwgCiAgICAgICAgICAgICAgICBvWzFdICs9IG1bMV0gKiBuWzNdLCBvWzBdICs9IG9bMV0gPj4+IDE2LCBvWzFdICY9IDY1NTM1LCBvWzFdICs9IG1bMl0gKiBuWzJdLCBvWzBdICs9IG9bMV0gPj4+IDE2LCAKICAgICAgICAgICAgICAgIG9bMV0gJj0gNjU1MzUsIG9bMV0gKz0gbVszXSAqIG5bMV0sIG9bMF0gKz0gb1sxXSA+Pj4gMTYsIG9bMV0gJj0gNjU1MzUsIG9bMF0gKz0gbVswXSAqIG5bM10gKyBtWzFdICogblsyXSArIG1bMl0gKiBuWzFdICsgbVszXSAqIG5bMF0sIAogICAgICAgICAgICAgICAgb1swXSAmPSA2NTUzNSwgWyBvWzBdIDw8IDE2IHwgb1sxXSwgb1syXSA8PCAxNiB8IG9bM10gXTsKICAgICAgICAgICAgfSwgeDY0Um90bCA9IGZ1bmN0aW9uIHg2NFJvdGwobSwgbikgewogICAgICAgICAgICAgICAgcmV0dXJuIDMyID09IChuICU9IDY0KSA/IFsgbVsxXSwgbVswXSBdIDogbiA8IDMyID8gWyBtWzBdIDw8IG4gfCBtWzFdID4+PiAzMiAtIG4sIG1bMV0gPDwgbiB8IG1bMF0gPj4+IDMyIC0gbiBdIDogKG4gLT0gMzIsIAogICAgICAgICAgICAgICAgWyBtWzFdIDw8IG4gfCBtWzBdID4+PiAzMiAtIG4sIG1bMF0gPDwgbiB8IG1bMV0gPj4+IDMyIC0gbiBdKTsKICAgICAgICAgICAgfSwgeDY0TGVmdFNoaWZ0ID0gZnVuY3Rpb24geDY0TGVmdFNoaWZ0KG0sIG4pIHsKICAgICAgICAgICAgICAgIHJldHVybiAwID09IChuICU9IDY0KSA/IG0gOiBuIDwgMzIgPyBbIG1bMF0gPDwgbiB8IG1bMV0gPj4+IDMyIC0gbiwgbVsxXSA8PCBuIF0gOiBbIG1bMV0gPDwgbiAtIDMyLCAwIF07CiAgICAgICAgICAgIH0sIHg2NFhvciA9IGZ1bmN0aW9uIHg2NFhvcihtLCBuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gWyBtWzBdIF4gblswXSwgbVsxXSBeIG5bMV0gXTsKICAgICAgICAgICAgfSwgeDY0Rm1peCA9IGZ1bmN0aW9uIHg2NEZtaXgoaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGggPSB4NjRYb3IoaCwgWyAwLCBoWzBdID4+PiAxIF0pLCBoID0geDY0TXVsdGlwbHkoaCwgWyA0MjgzNTQzNTExLCAzOTgxODA2Nzk3IF0pLCAKICAgICAgICAgICAgICAgIGggPSB4NjRYb3IoaCwgWyAwLCBoWzBdID4+PiAxIF0pLCBoID0geDY0TXVsdGlwbHkoaCwgWyAzMzAxODgyMzY2LCA0NDQ5ODQ0MDMgXSksIAogICAgICAgICAgICAgICAgaCA9IHg2NFhvcihoLCBbIDAsIGhbMF0gPj4+IDEgXSk7CiAgICAgICAgICAgIH0sIHg2NGhhc2gxMjggPSBmdW5jdGlvbiB4NjRoYXNoMTI4KGtleSwgc2VlZCkgewogICAgICAgICAgICAgICAgdmFyIHJlbWFpbmRlciwgYnl0ZXMsIGgxLCBoMiwgazEsIGsyLCBjMSwgYzIsIGk7CiAgICAgICAgICAgICAgICBmb3IgKHNlZWQgPSBzZWVkIHx8IDAsIHJlbWFpbmRlciA9IChrZXkgPSBrZXkgfHwgIiIpLmxlbmd0aCAlIDE2LCBieXRlcyA9IGtleS5sZW5ndGggLSByZW1haW5kZXIsIAogICAgICAgICAgICAgICAgaDEgPSBbIDAsIHNlZWQgXSwgaDIgPSBbIDAsIHNlZWQgXSwgazEgPSBbIDAsIDAgXSwgazIgPSBbIDAsIDAgXSwgYzEgPSBbIDIyNzc3MzUzMTMsIDI4OTU1OTUwOSBdLCAKICAgICAgICAgICAgICAgIGMyID0gWyAxMjkxMTY5MDkxLCA2NTg4NzExNjcgXSwgaSA9IDA7IGkgPCBieXRlczsgaSArPSAxNikgazEgPSBbIDI1NSAmIGtleS5jaGFyQ29kZUF0KGkgKyA0KSB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgNSkpIDw8IDggfCAoMjU1ICYga2V5LmNoYXJDb2RlQXQoaSArIDYpKSA8PCAxNiB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgNykpIDw8IDI0LCAyNTUgJiBrZXkuY2hhckNvZGVBdChpKSB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgMSkpIDw8IDggfCAoMjU1ICYga2V5LmNoYXJDb2RlQXQoaSArIDIpKSA8PCAxNiB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgMykpIDw8IDI0IF0sIAogICAgICAgICAgICAgICAgazIgPSBbIDI1NSAmIGtleS5jaGFyQ29kZUF0KGkgKyAxMikgfCAoMjU1ICYga2V5LmNoYXJDb2RlQXQoaSArIDEzKSkgPDwgOCB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgMTQpKSA8PCAxNiB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgMTUpKSA8PCAyNCwgMjU1ICYga2V5LmNoYXJDb2RlQXQoaSArIDgpIHwgKDI1NSAmIGtleS5jaGFyQ29kZUF0KGkgKyA5KSkgPDwgOCB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgMTApKSA8PCAxNiB8ICgyNTUgJiBrZXkuY2hhckNvZGVBdChpICsgMTEpKSA8PCAyNCBdLCAKICAgICAgICAgICAgICAgIGsxID0geDY0TXVsdGlwbHkoazEsIGMxKSwgazEgPSB4NjRSb3RsKGsxLCAzMSksIGsxID0geDY0TXVsdGlwbHkoazEsIGMyKSwgaDEgPSB4NjRYb3IoaDEsIGsxKSwgCiAgICAgICAgICAgICAgICBoMSA9IHg2NFJvdGwoaDEsIDI3KSwgaDEgPSB4NjRBZGQoaDEsIGgyKSwgaDEgPSB4NjRBZGQoeDY0TXVsdGlwbHkoaDEsIFsgMCwgNSBdKSwgWyAwLCAxMzkwMjA4ODA5IF0pLCAKICAgICAgICAgICAgICAgIGsyID0geDY0TXVsdGlwbHkoazIsIGMyKSwgazIgPSB4NjRSb3RsKGsyLCAzMyksIGsyID0geDY0TXVsdGlwbHkoazIsIGMxKSwgaDIgPSB4NjRYb3IoaDIsIGsyKSwgCiAgICAgICAgICAgICAgICBoMiA9IHg2NFJvdGwoaDIsIDMxKSwgaDIgPSB4NjRBZGQoaDIsIGgxKSwgaDIgPSB4NjRBZGQoeDY0TXVsdGlwbHkoaDIsIFsgMCwgNSBdKSwgWyAwLCA5NDQzMzE0NDUgXSk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGsxID0gWyAwLCAwIF0sIGsyID0gWyAwLCAwIF0sIHJlbWFpbmRlcikgewogICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgIGsyID0geDY0WG9yKGsyLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgMTQpIF0sIDQ4KSk7CgogICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGsyID0geDY0WG9yKGsyLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgMTMpIF0sIDQwKSk7CgogICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgIGsyID0geDY0WG9yKGsyLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgMTIpIF0sIDMyKSk7CgogICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgIGsyID0geDY0WG9yKGsyLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgMTEpIF0sIDI0KSk7CgogICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGsyID0geDY0WG9yKGsyLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgMTApIF0sIDE2KSk7CgogICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGsyID0geDY0WG9yKGsyLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgOSkgXSwgOCkpOwoKICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgIGsyID0geDY0WG9yKGsyLCBbIDAsIGtleS5jaGFyQ29kZUF0KGkgKyA4KSBdKSwgazIgPSB4NjRNdWx0aXBseShrMiwgYzIpLCBrMiA9IHg2NFJvdGwoazIsIDMzKSwgCiAgICAgICAgICAgICAgICAgICAgazIgPSB4NjRNdWx0aXBseShrMiwgYzEpLCBoMiA9IHg2NFhvcihoMiwgazIpOwoKICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIGsxID0geDY0WG9yKGsxLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgNykgXSwgNTYpKTsKCiAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBrMSA9IHg2NFhvcihrMSwgeDY0TGVmdFNoaWZ0KFsgMCwga2V5LmNoYXJDb2RlQXQoaSArIDYpIF0sIDQ4KSk7CgogICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgazEgPSB4NjRYb3IoazEsIHg2NExlZnRTaGlmdChbIDAsIGtleS5jaGFyQ29kZUF0KGkgKyA1KSBdLCA0MCkpOwoKICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgIGsxID0geDY0WG9yKGsxLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgNCkgXSwgMzIpKTsKCiAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICBrMSA9IHg2NFhvcihrMSwgeDY0TGVmdFNoaWZ0KFsgMCwga2V5LmNoYXJDb2RlQXQoaSArIDMpIF0sIDI0KSk7CgogICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgazEgPSB4NjRYb3IoazEsIHg2NExlZnRTaGlmdChbIDAsIGtleS5jaGFyQ29kZUF0KGkgKyAyKSBdLCAxNikpOwoKICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIGsxID0geDY0WG9yKGsxLCB4NjRMZWZ0U2hpZnQoWyAwLCBrZXkuY2hhckNvZGVBdChpICsgMSkgXSwgOCkpOwoKICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIGsxID0geDY0WG9yKGsxLCBbIDAsIGtleS5jaGFyQ29kZUF0KGkpIF0pLCBrMSA9IHg2NE11bHRpcGx5KGsxLCBjMSksIGsxID0geDY0Um90bChrMSwgMzEpLCAKICAgICAgICAgICAgICAgICAgICBrMSA9IHg2NE11bHRpcGx5KGsxLCBjMiksIGgxID0geDY0WG9yKGgxLCBrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaDEgPSB4NjRYb3IoaDEsIFsgMCwga2V5Lmxlbmd0aCBdKSwgaDIgPSB4NjRYb3IoaDIsIFsgMCwga2V5Lmxlbmd0aCBdKSwgaDEgPSB4NjRBZGQoaDEsIGgyKSwgCiAgICAgICAgICAgICAgICBoMiA9IHg2NEFkZChoMiwgaDEpLCBoMSA9IHg2NEZtaXgoaDEpLCBoMiA9IHg2NEZtaXgoaDIpLCBoMSA9IHg2NEFkZChoMSwgaDIpLCBoMiA9IHg2NEFkZChoMiwgaDEpLCAKICAgICAgICAgICAgICAgICgiMDAwMDAwMDAiICsgKGgxWzBdID4+PiAwKS50b1N0cmluZygxNikpLnNsaWNlKC04KSArICgiMDAwMDAwMDAiICsgKGgxWzFdID4+PiAwKS50b1N0cmluZygxNikpLnNsaWNlKC04KSArICgiMDAwMDAwMDAiICsgKGgyWzBdID4+PiAwKS50b1N0cmluZygxNikpLnNsaWNlKC04KSArICgiMDAwMDAwMDAiICsgKGgyWzFdID4+PiAwKS50b1N0cmluZygxNikpLnNsaWNlKC04KTsKICAgICAgICAgICAgfSwgZGVmYXVsdE9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICBwcmVwcm9jZXNzb3I6IG51bGwsCiAgICAgICAgICAgICAgICBhdWRpbzogewogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDFlMywKICAgICAgICAgICAgICAgICAgICBleGNsdWRlSU9TMTE6ICEwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZm9udHM6IHsKICAgICAgICAgICAgICAgICAgICBzd2ZDb250YWluZXJJZDogImZpbmdlcnByaW50anMyIiwKICAgICAgICAgICAgICAgICAgICBzd2ZQYXRoOiAiZmxhc2gvY29tcGlsZWQvRm9udExpc3Quc3dmIiwKICAgICAgICAgICAgICAgICAgICB1c2VyRGVmaW5lZEZvbnRzOiBbXSwKICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEpzRm9udHM6ICExCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2NyZWVuOiB7CiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0U2NyZWVuT3JpZW50YXRpb246ICEwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcGx1Z2luczogewogICAgICAgICAgICAgICAgICAgIHNvcnRQbHVnaW5zRm9yOiBbIC9wYWxlbW9vbi9pIF0sCiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZUlFOiAhMQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGV4dHJhQ29tcG9uZW50czogW10sCiAgICAgICAgICAgICAgICBleGNsdWRlczogewogICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZURldmljZXM6ICEwLAogICAgICAgICAgICAgICAgICAgIHBpeGVsUmF0aW86ICEwLAogICAgICAgICAgICAgICAgICAgIGRvTm90VHJhY2s6ICEwLAogICAgICAgICAgICAgICAgICAgIGZvbnRzRmxhc2g6ICEwLAogICAgICAgICAgICAgICAgICAgIGFkQmxvY2s6ICEwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgTk9UX0FWQUlMQUJMRTogIm5vdCBhdmFpbGFibGUiLAogICAgICAgICAgICAgICAgRVJST1I6ICJlcnJvciIsCiAgICAgICAgICAgICAgICBFWENMVURFRDogImV4Y2x1ZGVkIgogICAgICAgICAgICB9LCBlYWNoID0gZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICB2YXIgaSwgbCwga2V5OwogICAgICAgICAgICAgICAgaWYgKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICYmIG9iai5mb3JFYWNoID09PSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkgb2JqLmZvckVhY2goaXRlcmF0b3IpOyBlbHNlIGlmIChvYmoubGVuZ3RoID09PSArb2JqLmxlbmd0aCkgZm9yIChpID0gMCwgCiAgICAgICAgICAgICAgICBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykgaXRlcmF0b3Iob2JqW2ldLCBpLCBvYmopOyBlbHNlIGZvciAoa2V5IGluIG9iaikgb2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgaXRlcmF0b3Iob2JqW2tleV0sIGtleSwgb2JqKTsKICAgICAgICAgICAgfSwgbWFwID0gZnVuY3Rpb24gbWFwKG9iaiwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBvYmogPyByZXN1bHRzIDogQXJyYXkucHJvdG90eXBlLm1hcCAmJiBvYmoubWFwID09PSBBcnJheS5wcm90b3R5cGUubWFwID8gb2JqLm1hcChpdGVyYXRvcikgOiAoZWFjaChvYmosIChmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IodmFsdWUsIGluZGV4LCBsaXN0KSk7CiAgICAgICAgICAgICAgICB9KSksIHJlc3VsdHMpOwogICAgICAgICAgICB9LCBleHRlbmRTb2Z0ID0gZnVuY3Rpb24gZXh0ZW5kU29mdCh0YXJnZXQsIHNvdXJjZSkgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlLCBrZXk7CiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBzb3VyY2UpIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIG51bGwgPT0gKHZhbHVlID0gc291cmNlW2tleV0pIHx8IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkgfHwgKHRhcmdldFtrZXldID0gdmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgICAgfSwgZW51bWVyYXRlRGV2aWNlc0tleSA9IGZ1bmN0aW9uIGVudW1lcmF0ZURldmljZXNLZXkoZG9uZSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgaWYgKCFpc0VudW1lcmF0ZURldmljZXNTdXBwb3J0ZWQoKSkgcmV0dXJuIGRvbmUob3B0aW9ucy5OT1RfQVZBSUxBQkxFKTsKICAgICAgICAgICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKGRldmljZXMpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKGRldmljZXMubWFwKChmdW5jdGlvbihkZXZpY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZD0iICsgZGV2aWNlLmRldmljZUlkICsgIjtnaWQ9IiArIGRldmljZS5ncm91cElkICsgIjsiICsgZGV2aWNlLmtpbmQgKyAiOyIgKyBkZXZpY2UubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIH0pKS5jYXRjaCgoZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKGVycm9yKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSwgaXNFbnVtZXJhdGVEZXZpY2VzU3VwcG9ydGVkID0gZnVuY3Rpb24gaXNFbnVtZXJhdGVEZXZpY2VzU3VwcG9ydGVkKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMgJiYgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzOwogICAgICAgICAgICB9LCBzY3JlZW5SZXNvbHV0aW9uS2V5ID0gZnVuY3Rpb24gc2NyZWVuUmVzb2x1dGlvbktleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBkb25lKGdldFNjcmVlblJlc29sdXRpb24ob3B0aW9ucykpOwogICAgICAgICAgICB9LCBnZXRTY3JlZW5SZXNvbHV0aW9uID0gZnVuY3Rpb24gZ2V0U2NyZWVuUmVzb2x1dGlvbihvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IFsgd2luZG93LnNjcmVlbi53aWR0aCwgd2luZG93LnNjcmVlbi5oZWlnaHQgXTsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNjcmVlbi5kZXRlY3RTY3JlZW5PcmllbnRhdGlvbiAmJiByZXNvbHV0aW9uLnNvcnQoKS5yZXZlcnNlKCksIHJlc29sdXRpb247CiAgICAgICAgICAgIH0sIGF2YWlsYWJsZVNjcmVlblJlc29sdXRpb25LZXkgPSBmdW5jdGlvbiBhdmFpbGFibGVTY3JlZW5SZXNvbHV0aW9uS2V5KGRvbmUsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGRvbmUoZ2V0QXZhaWxhYmxlU2NyZWVuUmVzb2x1dGlvbihvcHRpb25zKSk7CiAgICAgICAgICAgIH0sIGdldEF2YWlsYWJsZVNjcmVlblJlc29sdXRpb24gPSBmdW5jdGlvbiBnZXRBdmFpbGFibGVTY3JlZW5SZXNvbHV0aW9uKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggJiYgd2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBhdmFpbGFibGUgPSBbIHdpbmRvdy5zY3JlZW4uYXZhaWxIZWlnaHQsIHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNjcmVlbi5kZXRlY3RTY3JlZW5PcmllbnRhdGlvbiAmJiBhdmFpbGFibGUuc29ydCgpLnJldmVyc2UoKSwgYXZhaWxhYmxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuTk9UX0FWQUlMQUJMRTsKICAgICAgICAgICAgfSwgc2Vzc2lvblN0b3JhZ2VLZXkgPSBmdW5jdGlvbiBzZXNzaW9uU3RvcmFnZUtleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBkb25lKGhhc1Nlc3Npb25TdG9yYWdlKG9wdGlvbnMpKTsKICAgICAgICAgICAgfSwgbG9jYWxTdG9yYWdlS2V5ID0gZnVuY3Rpb24gbG9jYWxTdG9yYWdlS2V5KGRvbmUsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGRvbmUoaGFzTG9jYWxTdG9yYWdlKG9wdGlvbnMpKTsKICAgICAgICAgICAgfSwgaW5kZXhlZERiS2V5ID0gZnVuY3Rpb24gaW5kZXhlZERiS2V5KGRvbmUsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGRvbmUoaGFzSW5kZXhlZERCKG9wdGlvbnMpKTsKICAgICAgICAgICAgfSwgY3B1Q2xhc3NLZXkgPSBmdW5jdGlvbiBjcHVDbGFzc0tleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBkb25lKGdldE5hdmlnYXRvckNwdUNsYXNzKG9wdGlvbnMpKTsKICAgICAgICAgICAgfSwgcGxhdGZvcm1LZXkgPSBmdW5jdGlvbiBwbGF0Zm9ybUtleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBkb25lKGdldE5hdmlnYXRvclBsYXRmb3JtKG9wdGlvbnMpKTsKICAgICAgICAgICAgfSwgZG9Ob3RUcmFja0tleSA9IGZ1bmN0aW9uIGRvTm90VHJhY2tLZXkoZG9uZSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgZG9uZShnZXREb05vdFRyYWNrKG9wdGlvbnMpKTsKICAgICAgICAgICAgfSwgY2FudmFzS2V5ID0gZnVuY3Rpb24gY2FudmFzS2V5KGRvbmUsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGlzQ2FudmFzU3VwcG9ydGVkKCkgPyBkb25lKGdldENhbnZhc0ZwKG9wdGlvbnMpKSA6IGRvbmUob3B0aW9ucy5OT1RfQVZBSUxBQkxFKTsKICAgICAgICAgICAgfSwgd2ViZ2xLZXkgPSBmdW5jdGlvbiB3ZWJnbEtleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBpc1dlYkdsU3VwcG9ydGVkKCkgPyBkb25lKGdldFdlYmdsRnAoKSkgOiBkb25lKG9wdGlvbnMuTk9UX0FWQUlMQUJMRSk7CiAgICAgICAgICAgIH0sIHdlYmdsVmVuZG9yQW5kUmVuZGVyZXJLZXkgPSBmdW5jdGlvbiB3ZWJnbFZlbmRvckFuZFJlbmRlcmVyS2V5KGRvbmUpIHsKICAgICAgICAgICAgICAgIGlzV2ViR2xTdXBwb3J0ZWQoKSA/IGRvbmUoZ2V0V2ViZ2xWZW5kb3JBbmRSZW5kZXJlcigpKSA6IGRvbmUoKTsKICAgICAgICAgICAgfSwgYWRCbG9ja0tleSA9IGZ1bmN0aW9uIGFkQmxvY2tLZXkoZG9uZSkgewogICAgICAgICAgICAgICAgZG9uZShnZXRBZEJsb2NrKCkpOwogICAgICAgICAgICB9LCBoYXNMaWVkTGFuZ3VhZ2VzS2V5ID0gZnVuY3Rpb24gaGFzTGllZExhbmd1YWdlc0tleShkb25lKSB7CiAgICAgICAgICAgICAgICBkb25lKGdldEhhc0xpZWRMYW5ndWFnZXMoKSk7CiAgICAgICAgICAgIH0sIGhhc0xpZWRSZXNvbHV0aW9uS2V5ID0gZnVuY3Rpb24gaGFzTGllZFJlc29sdXRpb25LZXkoZG9uZSkgewogICAgICAgICAgICAgICAgZG9uZShnZXRIYXNMaWVkUmVzb2x1dGlvbigpKTsKICAgICAgICAgICAgfSwgaGFzTGllZE9zS2V5ID0gZnVuY3Rpb24gaGFzTGllZE9zS2V5KGRvbmUpIHsKICAgICAgICAgICAgICAgIGRvbmUoZ2V0SGFzTGllZE9zKCkpOwogICAgICAgICAgICB9LCBoYXNMaWVkQnJvd3NlcktleSA9IGZ1bmN0aW9uIGhhc0xpZWRCcm93c2VyS2V5KGRvbmUpIHsKICAgICAgICAgICAgICAgIGRvbmUoZ2V0SGFzTGllZEJyb3dzZXIoKSk7CiAgICAgICAgICAgIH0sIGZsYXNoRm9udHNLZXkgPSBmdW5jdGlvbiBmbGFzaEZvbnRzS2V5KGRvbmUsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNTd2ZPYmplY3RMb2FkZWQoKSA/IGhhc01pbkZsYXNoSW5zdGFsbGVkKCkgPyBvcHRpb25zLmZvbnRzLnN3ZlBhdGggPyB2b2lkIGxvYWRTd2ZBbmREZXRlY3RGb250cygoZnVuY3Rpb24oZm9udHMpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKGZvbnRzKTsKICAgICAgICAgICAgICAgIH0pLCBvcHRpb25zKSA6IGRvbmUoIm1pc3Npbmcgb3B0aW9ucy5mb250cy5zd2ZQYXRoIikgOiBkb25lKCJmbGFzaCBub3QgaW5zdGFsbGVkIikgOiBkb25lKCJzd2Ygb2JqZWN0IG5vdCBsb2FkZWQiKTsKICAgICAgICAgICAgfSwgcGx1Z2luc0NvbXBvbmVudCA9IGZ1bmN0aW9uIHBsdWdpbnNDb21wb25lbnQoZG9uZSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgaXNJRSgpID8gb3B0aW9ucy5wbHVnaW5zLmV4Y2x1ZGVJRSA/IGRvbmUob3B0aW9ucy5FWENMVURFRCkgOiBkb25lKGdldElFUGx1Z2lucyhvcHRpb25zKSkgOiBkb25lKGdldFJlZ3VsYXJQbHVnaW5zKG9wdGlvbnMpKTsKICAgICAgICAgICAgfSwgZ2V0UmVndWxhclBsdWdpbnMgPSBmdW5jdGlvbiBnZXRSZWd1bGFyUGx1Z2lucyhvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgcGx1Z2lucywgaSwgbDsKICAgICAgICAgICAgICAgIGlmIChudWxsID09IG5hdmlnYXRvci5wbHVnaW5zKSByZXR1cm4gb3B0aW9ucy5OT1RfQVZBSUxBQkxFOwogICAgICAgICAgICAgICAgZm9yIChwbHVnaW5zID0gW10sIGkgPSAwLCBsID0gbmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSBuYXZpZ2F0b3IucGx1Z2luc1tpXSAmJiBwbHVnaW5zLnB1c2gobmF2aWdhdG9yLnBsdWdpbnNbaV0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbnNTaG91bGRCZVNvcnRlZChvcHRpb25zKSAmJiAocGx1Z2lucyA9IHBsdWdpbnMuc29ydCgoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPiBiLm5hbWUgPyAxIDogYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAwOwogICAgICAgICAgICAgICAgfSkpKSwgbWFwKHBsdWdpbnMsIChmdW5jdGlvbihwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbWVUeXBlcyA9IG1hcChwLCAoZnVuY3Rpb24obXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgbXQudHlwZSwgbXQuc3VmZml4ZXMgXTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgcC5uYW1lLCBwLmRlc2NyaXB0aW9uLCBtaW1lVHlwZXMgXTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSwgZ2V0SUVQbHVnaW5zID0gZnVuY3Rpb24gZ2V0SUVQbHVnaW5zKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAiQWN0aXZlWE9iamVjdCIpIHx8ICJBY3RpdmVYT2JqZWN0IiBpbiB3aW5kb3cgPyByZXN1bHQgPSBtYXAoWyAiQWNyb1BERi5QREYiLCAiQWRvZGIuU3RyZWFtIiwgIkFnQ29udHJvbC5BZ0NvbnRyb2wiLCAiRGV2YWxWUlhDdHJsLkRldmFsVlJYQ3RybC4xIiwgIk1hY3JvbWVkaWFGbGFzaFBhcGVyLk1hY3JvbWVkaWFGbGFzaFBhcGVyIiwgIk1zeG1sMi5ET01Eb2N1bWVudCIsICJNc3htbDIuWE1MSFRUUCIsICJQREYuUGRmQ3RybCIsICJRdWlja1RpbWUuUXVpY2tUaW1lIiwgIlF1aWNrVGltZUNoZWNrT2JqZWN0LlF1aWNrVGltZUNoZWNrLjEiLCAiUmVhbFBsYXllciIsICJSZWFsUGxheWVyLlJlYWxQbGF5ZXIodG0pIEFjdGl2ZVggQ29udHJvbCAoMzItYml0KSIsICJSZWFsVmlkZW8uUmVhbFZpZGVvKHRtKSBBY3RpdmVYIENvbnRyb2wgKDMyLWJpdCkiLCAiU2NyaXB0aW5nLkRpY3Rpb25hcnkiLCAiU1dDdGwuU1dDdGwiLCAiU2hlbGwuVUlIZWxwZXIiLCAiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giLCAiU2t5cGUuRGV0ZWN0aW9uIiwgIlREQ0N0bC5URENDdGwiLCAiV01QbGF5ZXIuT0NYIiwgInJtb2N4LlJlYWxQbGF5ZXIgRzIgQ29udHJvbCIsICJybW9jeC5SZWFsUGxheWVyIEcyIENvbnRyb2wuMSIgXSwgKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KG5hbWUpLCBuYW1lOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuRVJST1I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpIDogcmVzdWx0LnB1c2gob3B0aW9ucy5OT1RfQVZBSUxBQkxFKSwgbmF2aWdhdG9yLnBsdWdpbnMgJiYgKHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZ2V0UmVndWxhclBsdWdpbnMob3B0aW9ucykpKSwgCiAgICAgICAgICAgICAgICByZXN1bHQ7CiAgICAgICAgICAgIH0sIHBsdWdpbnNTaG91bGRCZVNvcnRlZCA9IGZ1bmN0aW9uIHBsdWdpbnNTaG91bGRCZVNvcnRlZChvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgaSwgbCwgcmUsIHNob3VsZCA9ICExOwogICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IG9wdGlvbnMucGx1Z2lucy5zb3J0UGx1Z2luc0Zvci5sZW5ndGg7IGkgPCBsOyBpKyspIGlmIChyZSA9IG9wdGlvbnMucGx1Z2lucy5zb3J0UGx1Z2luc0ZvcltpXSwgCiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHJlKSkgewogICAgICAgICAgICAgICAgICAgIHNob3VsZCA9ICEwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNob3VsZDsKICAgICAgICAgICAgfSwgdG91Y2hTdXBwb3J0S2V5ID0gZnVuY3Rpb24gdG91Y2hTdXBwb3J0S2V5KGRvbmUpIHsKICAgICAgICAgICAgICAgIGRvbmUoZ2V0VG91Y2hTdXBwb3J0KCkpOwogICAgICAgICAgICB9LCBoYXJkd2FyZUNvbmN1cnJlbmN5S2V5ID0gZnVuY3Rpb24gaGFyZHdhcmVDb25jdXJyZW5jeUtleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBkb25lKGdldEhhcmR3YXJlQ29uY3VycmVuY3kob3B0aW9ucykpOwogICAgICAgICAgICB9LCBoYXNTZXNzaW9uU3RvcmFnZSA9IGZ1bmN0aW9uIGhhc1Nlc3Npb25TdG9yYWdlKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhd2luZG93LnNlc3Npb25TdG9yYWdlOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLkVSUk9SOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBoYXNMb2NhbFN0b3JhZ2UgPSBmdW5jdGlvbiBoYXNMb2NhbFN0b3JhZ2Uob3B0aW9ucykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF3aW5kb3cubG9jYWxTdG9yYWdlOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLkVSUk9SOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBoYXNJbmRleGVkREIgPSBmdW5jdGlvbiBoYXNJbmRleGVkREIob3B0aW9ucykgewogICAgICAgICAgICAgICAgaWYgKGlzSUVPck9sZEVkZ2UoKSkgcmV0dXJuIG9wdGlvbnMuRVhDTFVERUQ7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXdpbmRvdy5pbmRleGVkREI7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuRVJST1I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGdldEhhcmR3YXJlQ29uY3VycmVuY3kgPSBmdW5jdGlvbiBnZXRIYXJkd2FyZUNvbmN1cnJlbmN5KG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSA/IG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IDogb3B0aW9ucy5OT1RfQVZBSUxBQkxFOwogICAgICAgICAgICB9LCBnZXROYXZpZ2F0b3JDcHVDbGFzcyA9IGZ1bmN0aW9uIGdldE5hdmlnYXRvckNwdUNsYXNzKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY3B1Q2xhc3MgfHwgb3B0aW9ucy5OT1RfQVZBSUxBQkxFOwogICAgICAgICAgICB9LCBnZXROYXZpZ2F0b3JQbGF0Zm9ybSA9IGZ1bmN0aW9uIGdldE5hdmlnYXRvclBsYXRmb3JtKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IucGxhdGZvcm0gPyBuYXZpZ2F0b3IucGxhdGZvcm0gOiBvcHRpb25zLk5PVF9BVkFJTEFCTEU7CiAgICAgICAgICAgIH0sIGdldERvTm90VHJhY2sgPSBmdW5jdGlvbiBnZXREb05vdFRyYWNrKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IuZG9Ob3RUcmFjayA/IG5hdmlnYXRvci5kb05vdFRyYWNrIDogbmF2aWdhdG9yLm1zRG9Ob3RUcmFjayA/IG5hdmlnYXRvci5tc0RvTm90VHJhY2sgOiB3aW5kb3cuZG9Ob3RUcmFjayA/IHdpbmRvdy5kb05vdFRyYWNrIDogb3B0aW9ucy5OT1RfQVZBSUxBQkxFOwogICAgICAgICAgICB9LCBnZXRUb3VjaFN1cHBvcnQgPSBmdW5jdGlvbiBnZXRUb3VjaFN1cHBvcnQoKSB7CiAgICAgICAgICAgICAgICB2YXIgdG91Y2hFdmVudCwgbWF4VG91Y2hQb2ludHMgPSAwOwogICAgICAgICAgICAgICAgdm9pZCAwICE9PSBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPyBtYXhUb3VjaFBvaW50cyA9IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA6IHZvaWQgMCAhPT0gbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMgJiYgKG1heFRvdWNoUG9pbnRzID0gbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFdmVudCgiVG91Y2hFdmVudCIpLCB0b3VjaEV2ZW50ID0gITA7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChfKSB7CiAgICAgICAgICAgICAgICAgICAgdG91Y2hFdmVudCA9ICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFsgbWF4VG91Y2hQb2ludHMsIHRvdWNoRXZlbnQsICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyBdOwogICAgICAgICAgICB9LCBnZXRDYW52YXNGcCA9IGZ1bmN0aW9uIGdldENhbnZhc0ZwKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHZhciBjdHgsIHJlc3VsdCA9IFtdLCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYW52YXMud2lkdGggPSAyZTMsIGNhbnZhcy5oZWlnaHQgPSAyMDAsIGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZSIsIAogICAgICAgICAgICAgICAgKGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpKS5yZWN0KDAsIDAsIDEwLCAxMCksIGN0eC5yZWN0KDIsIDIsIDYsIDYpLCByZXN1bHQucHVzaCgiY2FudmFzIHdpbmRpbmc6IiArICghMSA9PT0gY3R4LmlzUG9pbnRJblBhdGgoNSwgNSwgImV2ZW5vZGQiKSA/ICJ5ZXMiIDogIm5vIikpLCAKICAgICAgICAgICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAiYWxwaGFiZXRpYyIsIGN0eC5maWxsU3R5bGUgPSAiI2Y2MCIsIGN0eC5maWxsUmVjdCgxMjUsIDEsIDYyLCAyMCksIAogICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMDY5Iiwgb3B0aW9ucy5kb250VXNlRmFrZUZvbnRJbkNhbnZhcyA/IGN0eC5mb250ID0gIjExcHQgQXJpYWwiIDogY3R4LmZvbnQgPSAiMTFwdCBuby1yZWFsLWZvbnQtMTIzIiwgCiAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQoIkN3bSBmam9yZGJhbmsgZ2x5cGhzIHZleHQgcXVpeiwgXHVkODNkXHVkZTAzIiwgMiwgMTUpLCBjdHguZmlsbFN0eWxlID0gInJnYmEoMTAyLCAyMDQsIDAsIDAuMikiLCAKICAgICAgICAgICAgICAgIGN0eC5mb250ID0gIjE4cHQgQXJpYWwiLCBjdHguZmlsbFRleHQoIkN3bSBmam9yZGJhbmsgZ2x5cGhzIHZleHQgcXVpeiwgXHVkODNkXHVkZTAzIiwgNCwgNDUpLCAKICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAibXVsdGlwbHkiLCBjdHguZmlsbFN0eWxlID0gInJnYigyNTUsMCwyNTUpIiwgY3R4LmJlZ2luUGF0aCgpLCAKICAgICAgICAgICAgICAgIGN0eC5hcmMoNTAsIDUwLCA1MCwgMCwgMiAqIE1hdGguUEksICEwKSwgY3R4LmNsb3NlUGF0aCgpLCBjdHguZmlsbCgpLCBjdHguZmlsbFN0eWxlID0gInJnYigwLDI1NSwyNTUpIiwgCiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCksIGN0eC5hcmMoMTAwLCA1MCwgNTAsIDAsIDIgKiBNYXRoLlBJLCAhMCksIGN0eC5jbG9zZVBhdGgoKSwgY3R4LmZpbGwoKSwgCiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYigyNTUsMjU1LDApIiwgY3R4LmJlZ2luUGF0aCgpLCBjdHguYXJjKDc1LCAxMDAsIDUwLCAwLCAyICogTWF0aC5QSSwgITApLCAKICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKSwgY3R4LmZpbGwoKSwgY3R4LmZpbGxTdHlsZSA9ICJyZ2IoMjU1LDAsMjU1KSIsIGN0eC5hcmMoNzUsIDc1LCA3NSwgMCwgMiAqIE1hdGguUEksICEwKSwgCiAgICAgICAgICAgICAgICBjdHguYXJjKDc1LCA3NSwgMjUsIDAsIDIgKiBNYXRoLlBJLCAhMCksIGN0eC5maWxsKCJldmVub2RkIiksIGNhbnZhcy50b0RhdGFVUkwgJiYgcmVzdWx0LnB1c2goImNhbnZhcyBmcDoiICsgY2FudmFzLnRvRGF0YVVSTCgpKSwgCiAgICAgICAgICAgICAgICByZXN1bHQ7CiAgICAgICAgICAgIH0sIGdldFdlYmdsRnAgPSBmdW5jdGlvbiBnZXRXZWJnbEZwKCkgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCwgdlNoYWRlclRlbXBsYXRlLCBmU2hhZGVyVGVtcGxhdGUsIHZlcnRleFBvc0J1ZmZlciwgdmVydGljZXMsIHByb2dyYW0sIHZzaGFkZXIsIGZzaGFkZXIsIGV4dGVuc2lvbkRlYnVnUmVuZGVyZXJJbmZvLCBmYTJzID0gZnVuY3Rpb24gZmEycyhmYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDEpLCBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCksIGdsLmRlcHRoRnVuYyhnbC5MRVFVQUwpLCAKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCksICJbIiArIGZhWzBdICsgIiwgIiArIGZhWzFdICsgIl0iOwogICAgICAgICAgICAgICAgfSwgbWF4QW5pc290cm9weSA9IGZ1bmN0aW9uIG1heEFuaXNvdHJvcHkoZ2wpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYW5pc290cm9weSwgZXh0ID0gZ2wuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKSB8fCBnbC5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKSB8fCBnbC5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0ID8gKDAgPT09IChhbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKGV4dC5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpKSAmJiAoYW5pc290cm9weSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICBhbmlzb3Ryb3B5KSA6IG51bGw7CiAgICAgICAgICAgICAgICB9LCBnbCA9IGdldFdlYmdsQ2FudmFzKCk7CiAgICAgICAgICAgICAgICBpZiAoIWdsKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW10sIHZTaGFkZXJUZW1wbGF0ZSA9ICJhdHRyaWJ1dGUgdmVjMiBhdHRyVmVydGV4O3ZhcnlpbmcgdmVjMiB2YXJ5aW5UZXhDb29yZGluYXRlO3VuaWZvcm0gdmVjMiB1bmlmb3JtT2Zmc2V0O3ZvaWQgbWFpbigpe3ZhcnlpblRleENvb3JkaW5hdGU9YXR0clZlcnRleCt1bmlmb3JtT2Zmc2V0O2dsX1Bvc2l0aW9uPXZlYzQoYXR0clZlcnRleCwwLDEpO30iLCAKICAgICAgICAgICAgICAgICAgICBmU2hhZGVyVGVtcGxhdGUgPSAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZhcnlpblRleENvb3JkaW5hdGU7dm9pZCBtYWluKCkge2dsX0ZyYWdDb2xvcj12ZWM0KHZhcnlpblRleENvb3JkaW5hdGUsMCwxKTt9IiwgCiAgICAgICAgICAgICAgICAgICAgdmVydGV4UG9zQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCksIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhQb3NCdWZmZXIpLCAKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWyAtLjIsIC0uOSwgMCwgLjQsIC0uMjYsIDAsIDAsIC43MzIxMzQ0NDQsIDAgXSksIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcpLCAKICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhQb3NCdWZmZXIuaXRlbVNpemUgPSAzLCB2ZXJ0ZXhQb3NCdWZmZXIubnVtSXRlbXMgPSAzLCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpLCAKICAgICAgICAgICAgICAgICAgICB2c2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpLCBnbC5zaGFkZXJTb3VyY2UodnNoYWRlciwgdlNoYWRlclRlbXBsYXRlKSwgCiAgICAgICAgICAgICAgICAgICAgZ2wuY29tcGlsZVNoYWRlcih2c2hhZGVyKSwgZnNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpLCBnbC5zaGFkZXJTb3VyY2UoZnNoYWRlciwgZlNoYWRlclRlbXBsYXRlKSwgCiAgICAgICAgICAgICAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihmc2hhZGVyKSwgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHZzaGFkZXIpLCBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnNoYWRlciksIAogICAgICAgICAgICAgICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pLCBnbC51c2VQcm9ncmFtKHByb2dyYW0pLCBwcm9ncmFtLnZlcnRleFBvc0F0dHJpYiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhdHRyVmVydGV4IiksIAogICAgICAgICAgICAgICAgICAgIHByb2dyYW0ub2Zmc2V0VW5pZm9ybSA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidW5pZm9ybU9mZnNldCIpLCBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwcm9ncmFtLnZlcnRleFBvc0FycmF5KSwgCiAgICAgICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwcm9ncmFtLnZlcnRleFBvc0F0dHJpYiwgdmVydGV4UG9zQnVmZmVyLml0ZW1TaXplLCBnbC5GTE9BVCwgITEsIDAsIDApLCAKICAgICAgICAgICAgICAgICAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS5vZmZzZXRVbmlmb3JtLCAxLCAxKSwgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgdmVydGV4UG9zQnVmZmVyLm51bUl0ZW1zKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnbC5jYW52YXMudG9EYXRhVVJMKCkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goImV4dGVuc2lvbnM6IiArIChnbC5nZXRTdXBwb3J0ZWRFeHRlbnNpb25zKCkgfHwgW10pLmpvaW4oIjsiKSksIHJlc3VsdC5wdXNoKCJ3ZWJnbCBhbGlhc2VkIGxpbmUgd2lkdGggcmFuZ2U6IiArIGZhMnMoZ2wuZ2V0UGFyYW1ldGVyKGdsLkFMSUFTRURfTElORV9XSURUSF9SQU5HRSkpKSwgCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIndlYmdsIGFsaWFzZWQgcG9pbnQgc2l6ZSByYW5nZToiICsgZmEycyhnbC5nZXRQYXJhbWV0ZXIoZ2wuQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFKSkpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgYWxwaGEgYml0czoiICsgZ2wuZ2V0UGFyYW1ldGVyKGdsLkFMUEhBX0JJVFMpKSwgcmVzdWx0LnB1c2goIndlYmdsIGFudGlhbGlhc2luZzoiICsgKGdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCkuYW50aWFsaWFzID8gInllcyIgOiAibm8iKSksIAogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCJ3ZWJnbCBibHVlIGJpdHM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5CTFVFX0JJVFMpKSwgcmVzdWx0LnB1c2goIndlYmdsIGRlcHRoIGJpdHM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5ERVBUSF9CSVRTKSksIAogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCJ3ZWJnbCBncmVlbiBiaXRzOiIgKyBnbC5nZXRQYXJhbWV0ZXIoZ2wuR1JFRU5fQklUUykpLCByZXN1bHQucHVzaCgid2ViZ2wgbWF4IGFuaXNvdHJvcHk6IiArIG1heEFuaXNvdHJvcHkoZ2wpKSwgCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIndlYmdsIG1heCBjb21iaW5lZCB0ZXh0dXJlIGltYWdlIHVuaXRzOiIgKyBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMpKSwgCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIndlYmdsIG1heCBjdWJlIG1hcCB0ZXh0dXJlIHNpemU6IiArIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFKSksIAogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCJ3ZWJnbCBtYXggZnJhZ21lbnQgdW5pZm9ybSB2ZWN0b3JzOiIgKyBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUykpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgbWF4IHJlbmRlciBidWZmZXIgc2l6ZToiICsgZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9SRU5ERVJCVUZGRVJfU0laRSkpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgbWF4IHRleHR1cmUgaW1hZ2UgdW5pdHM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUykpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgbWF4IHRleHR1cmUgc2l6ZToiICsgZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpKSwgcmVzdWx0LnB1c2goIndlYmdsIG1heCB2YXJ5aW5nIHZlY3RvcnM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVkFSWUlOR19WRUNUT1JTKSksIAogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCJ3ZWJnbCBtYXggdmVydGV4IGF0dHJpYnM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVkVSVEVYX0FUVFJJQlMpKSwgCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goIndlYmdsIG1heCB2ZXJ0ZXggdGV4dHVyZSBpbWFnZSB1bml0czoiICsgZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUykpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgbWF4IHZlcnRleCB1bmlmb3JtIHZlY3RvcnM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUykpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgbWF4IHZpZXdwb3J0IGRpbXM6IiArIGZhMnMoZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9WSUVXUE9SVF9ESU1TKSkpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgcmVkIGJpdHM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5SRURfQklUUykpLCByZXN1bHQucHVzaCgid2ViZ2wgcmVuZGVyZXI6IiArIGdsLmdldFBhcmFtZXRlcihnbC5SRU5ERVJFUikpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgc2hhZGluZyBsYW5ndWFnZSB2ZXJzaW9uOiIgKyBnbC5nZXRQYXJhbWV0ZXIoZ2wuU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OKSksIAogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCJ3ZWJnbCBzdGVuY2lsIGJpdHM6IiArIGdsLmdldFBhcmFtZXRlcihnbC5TVEVOQ0lMX0JJVFMpKSwgcmVzdWx0LnB1c2goIndlYmdsIHZlbmRvcjoiICsgZ2wuZ2V0UGFyYW1ldGVyKGdsLlZFTkRPUikpLCAKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgid2ViZ2wgdmVyc2lvbjoiICsgZ2wuZ2V0UGFyYW1ldGVyKGdsLlZFUlNJT04pKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAoZXh0ZW5zaW9uRGVidWdSZW5kZXJlckluZm8gPSBnbC5nZXRFeHRlbnNpb24oIldFQkdMX2RlYnVnX3JlbmRlcmVyX2luZm8iKSkgJiYgKHJlc3VsdC5wdXNoKCJ3ZWJnbCB1bm1hc2tlZCB2ZW5kb3I6IiArIGdsLmdldFBhcmFtZXRlcihleHRlbnNpb25EZWJ1Z1JlbmRlcmVySW5mby5VTk1BU0tFRF9WRU5ET1JfV0VCR0wpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCJ3ZWJnbCB1bm1hc2tlZCByZW5kZXJlcjoiICsgZ2wuZ2V0UGFyYW1ldGVyKGV4dGVuc2lvbkRlYnVnUmVuZGVyZXJJbmZvLlVOTUFTS0VEX1JFTkRFUkVSX1dFQkdMKSkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA/IChlYWNoKFsgIkZMT0FUIiwgIklOVCIgXSwgKGZ1bmN0aW9uKG51bVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWFjaChbICJWRVJURVgiLCAiRlJBR01FTlQiIF0sIChmdW5jdGlvbihzaGFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2goWyAiSElHSCIsICJNRURJVU0iLCAiTE9XIiBdLCAoZnVuY3Rpb24obnVtU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2goWyAicHJlY2lzaW9uIiwgInJhbmdlTWluIiwgInJhbmdlTWF4IiBdLCAoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5lLCBmb3JtYXQgPSBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoZ2xbc2hhZGVyICsgIl9TSEFERVIiXSwgZ2xbbnVtU2l6ZSArICJfIiArIG51bVR5cGVdKVtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2lzaW9uIiAhPT0ga2V5ICYmIChrZXkgPSAicHJlY2lzaW9uICIgKyBrZXkpLCBsaW5lID0gWyAid2ViZ2wgIiwgc2hhZGVyLnRvTG93ZXJDYXNlKCksICIgc2hhZGVyICIsIG51bVNpemUudG9Mb3dlckNhc2UoKSwgIiAiLCBudW1UeXBlLnRvTG93ZXJDYXNlKCksICIgIiwga2V5LCAiOiIsIGZvcm1hdCBdLmpvaW4oIiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGluZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSkpLCByZXN1bHQpIDogcmVzdWx0OwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBsb3NlV2ViZ2xDb250ZXh0KGdsKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBnZXRXZWJnbFZlbmRvckFuZFJlbmRlcmVyID0gZnVuY3Rpb24gZ2V0V2ViZ2xWZW5kb3JBbmRSZW5kZXJlcigpIHsKICAgICAgICAgICAgICAgIHZhciBnbENvbnRleHQsIGV4dGVuc2lvbkRlYnVnUmVuZGVyZXJJbmZvOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uRGVidWdSZW5kZXJlckluZm8gPSAoZ2xDb250ZXh0ID0gZ2V0V2ViZ2xDYW52YXMoKSkuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZWJ1Z19yZW5kZXJlcl9pbmZvIiksIAogICAgICAgICAgICAgICAgICAgIGdsQ29udGV4dC5nZXRQYXJhbWV0ZXIoZXh0ZW5zaW9uRGVidWdSZW5kZXJlckluZm8uVU5NQVNLRURfVkVORE9SX1dFQkdMKSArICJ+IiArIGdsQ29udGV4dC5nZXRQYXJhbWV0ZXIoZXh0ZW5zaW9uRGVidWdSZW5kZXJlckluZm8uVU5NQVNLRURfUkVOREVSRVJfV0VCR0wpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBsb3NlV2ViZ2xDb250ZXh0KGdsQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgZ2V0QWRCbG9jayA9IGZ1bmN0aW9uIGdldEFkQmxvY2soKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0LCBhZHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIGFkcy5pbm5lckhUTUwgPSAiJm5ic3A7IiwgYWRzLmNsYXNzTmFtZSA9ICJhZHNib3giLCByZXN1bHQgPSAhMTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhZHMpLCByZXN1bHQgPSAwID09PSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJhZHNib3giKVswXS5vZmZzZXRIZWlnaHQsIAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYWRzKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0sIGdldEhhc0xpZWRMYW5ndWFnZXMgPSBmdW5jdGlvbiBnZXRIYXNMaWVkTGFuZ3VhZ2VzKCkgewogICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gbmF2aWdhdG9yLmxhbmd1YWdlcykgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLmxhbmd1YWdlc1swXS5zdWJzdHIoMCwgMikgIT09IG5hdmlnYXRvci5sYW5ndWFnZS5zdWJzdHIoMCwgMikpIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgfSwgZ2V0SGFzTGllZFJlc29sdXRpb24gPSBmdW5jdGlvbiBnZXRIYXNMaWVkUmVzb2x1dGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2NyZWVuLndpZHRoIDwgd2luZG93LnNjcmVlbi5hdmFpbFdpZHRoIHx8IHdpbmRvdy5zY3JlZW4uaGVpZ2h0IDwgd2luZG93LnNjcmVlbi5hdmFpbEhlaWdodDsKICAgICAgICAgICAgfSwgZ2V0SGFzTGllZE9zID0gZnVuY3Rpb24gZ2V0SGFzTGllZE9zKCkgewogICAgICAgICAgICAgICAgdmFyIG9zLCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksIG9zY3B1ID0gbmF2aWdhdG9yLm9zY3B1LCBwbGF0Zm9ybSA9IG5hdmlnYXRvci5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKG9zID0gdXNlckFnZW50LmluZGV4T2YoIndpbmRvd3MgcGhvbmUiKSA+PSAwID8gIldpbmRvd3MgUGhvbmUiIDogdXNlckFnZW50LmluZGV4T2YoIndpbmRvd3MiKSA+PSAwIHx8IHVzZXJBZ2VudC5pbmRleE9mKCJ3aW4xNiIpID49IDAgfHwgdXNlckFnZW50LmluZGV4T2YoIndpbjMyIikgPj0gMCB8fCB1c2VyQWdlbnQuaW5kZXhPZigid2luNjQiKSA+PSAwIHx8IHVzZXJBZ2VudC5pbmRleE9mKCJ3aW45NSIpID49IDAgfHwgdXNlckFnZW50LmluZGV4T2YoIndpbjk4IikgPj0gMCB8fCB1c2VyQWdlbnQuaW5kZXhPZigid2lubnQiKSA+PSAwIHx8IHVzZXJBZ2VudC5pbmRleE9mKCJ3b3c2NCIpID49IDAgPyAiV2luZG93cyIgOiB1c2VyQWdlbnQuaW5kZXhPZigiYW5kcm9pZCIpID49IDAgPyAiQW5kcm9pZCIgOiB1c2VyQWdlbnQuaW5kZXhPZigibGludXgiKSA+PSAwIHx8IHVzZXJBZ2VudC5pbmRleE9mKCJjcm9zIikgPj0gMCB8fCB1c2VyQWdlbnQuaW5kZXhPZigieDExIikgPj0gMCA/ICJMaW51eCIgOiB1c2VyQWdlbnQuaW5kZXhPZigiaXBob25lIikgPj0gMCB8fCB1c2VyQWdlbnQuaW5kZXhPZigiaXBhZCIpID49IDAgfHwgdXNlckFnZW50LmluZGV4T2YoImlwb2QiKSA+PSAwIHx8IHVzZXJBZ2VudC5pbmRleE9mKCJjcmlvcyIpID49IDAgfHwgdXNlckFnZW50LmluZGV4T2YoImZ4aW9zIikgPj0gMCA/ICJpT1MiIDogdXNlckFnZW50LmluZGV4T2YoIm1hY2ludG9zaCIpID49IDAgfHwgdXNlckFnZW50LmluZGV4T2YoIm1hY19wb3dlcnBjKSIpID49IDAgPyAiTWFjIiA6ICJPdGhlciIsIAogICAgICAgICAgICAgICAgKCJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwIHx8IG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCkgJiYgIldpbmRvd3MiICE9PSBvcyAmJiAiV2luZG93cyBQaG9uZSIgIT09IG9zICYmICJBbmRyb2lkIiAhPT0gb3MgJiYgImlPUyIgIT09IG9zICYmICJPdGhlciIgIT09IG9zICYmIC0xID09PSB1c2VyQWdlbnQuaW5kZXhPZigiY3JvcyIpKSByZXR1cm4gITA7CiAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBvc2NwdSkgewogICAgICAgICAgICAgICAgICAgIGlmICgob3NjcHUgPSBvc2NwdS50b0xvd2VyQ2FzZSgpKS5pbmRleE9mKCJ3aW4iKSA+PSAwICYmICJXaW5kb3dzIiAhPT0gb3MgJiYgIldpbmRvd3MgUGhvbmUiICE9PSBvcykgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIGlmIChvc2NwdS5pbmRleE9mKCJsaW51eCIpID49IDAgJiYgIkxpbnV4IiAhPT0gb3MgJiYgIkFuZHJvaWQiICE9PSBvcykgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIGlmIChvc2NwdS5pbmRleE9mKCJtYWMiKSA+PSAwICYmICJNYWMiICE9PSBvcyAmJiAiaU9TIiAhPT0gb3MpIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICBpZiAoKC0xID09PSBvc2NwdS5pbmRleE9mKCJ3aW4iKSAmJiAtMSA9PT0gb3NjcHUuaW5kZXhPZigibGludXgiKSAmJiAtMSA9PT0gb3NjcHUuaW5kZXhPZigibWFjIikpICE9ICgiT3RoZXIiID09PSBvcykpIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwbGF0Zm9ybS5pbmRleE9mKCJ3aW4iKSA+PSAwICYmICJXaW5kb3dzIiAhPT0gb3MgJiYgIldpbmRvd3MgUGhvbmUiICE9PSBvcyB8fCAocGxhdGZvcm0uaW5kZXhPZigibGludXgiKSA+PSAwIHx8IHBsYXRmb3JtLmluZGV4T2YoImFuZHJvaWQiKSA+PSAwIHx8IHBsYXRmb3JtLmluZGV4T2YoInBpa2UiKSA+PSAwKSAmJiAiTGludXgiICE9PSBvcyAmJiAiQW5kcm9pZCIgIT09IG9zIHx8IChwbGF0Zm9ybS5pbmRleE9mKCJtYWMiKSA+PSAwIHx8IHBsYXRmb3JtLmluZGV4T2YoImlwYWQiKSA+PSAwIHx8IHBsYXRmb3JtLmluZGV4T2YoImlwb2QiKSA+PSAwIHx8IHBsYXRmb3JtLmluZGV4T2YoImlwaG9uZSIpID49IDApICYmICJNYWMiICE9PSBvcyAmJiAiaU9TIiAhPT0gb3MgfHwgIShwbGF0Zm9ybS5pbmRleE9mKCJhcm0iKSA+PSAwICYmICJXaW5kb3dzIFBob25lIiA9PT0gb3MpICYmICEocGxhdGZvcm0uaW5kZXhPZigicGlrZSIpID49IDAgJiYgdXNlckFnZW50LmluZGV4T2YoIm9wZXJhIG1pbmkiKSA+PSAwKSAmJiAoKHBsYXRmb3JtLmluZGV4T2YoIndpbiIpIDwgMCAmJiBwbGF0Zm9ybS5pbmRleE9mKCJsaW51eCIpIDwgMCAmJiBwbGF0Zm9ybS5pbmRleE9mKCJtYWMiKSA8IDAgJiYgcGxhdGZvcm0uaW5kZXhPZigiaXBob25lIikgPCAwICYmIHBsYXRmb3JtLmluZGV4T2YoImlwYWQiKSA8IDAgJiYgcGxhdGZvcm0uaW5kZXhPZigiaXBvZCIpIDwgMCkgIT0gKCJPdGhlciIgPT09IG9zKSB8fCB2b2lkIDAgPT09IG5hdmlnYXRvci5wbHVnaW5zICYmICJXaW5kb3dzIiAhPT0gb3MgJiYgIldpbmRvd3MgUGhvbmUiICE9PSBvcyk7CiAgICAgICAgICAgIH0sIGdldEhhc0xpZWRCcm93c2VyID0gZnVuY3Rpb24gZ2V0SGFzTGllZEJyb3dzZXIoKSB7CiAgICAgICAgICAgICAgICB2YXIgYnJvd3NlciwgdGVtcFJlcywgZXJyRmlyZWZveCwgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLCBwcm9kdWN0U3ViID0gbmF2aWdhdG9yLnByb2R1Y3RTdWI7CiAgICAgICAgICAgICAgICBpZiAodXNlckFnZW50LmluZGV4T2YoImVkZ2UvIikgPj0gMCB8fCB1c2VyQWdlbnQuaW5kZXhPZigiaWVtb2JpbGUvIikgPj0gMCkgcmV0dXJuICExOwogICAgICAgICAgICAgICAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKCJvcGVyYSBtaW5pIikgPj0gMCkgcmV0dXJuICExOwogICAgICAgICAgICAgICAgaWYgKCgiQ2hyb21lIiA9PSAoYnJvd3NlciA9IHVzZXJBZ2VudC5pbmRleE9mKCJmaXJlZm94LyIpID49IDAgPyAiRmlyZWZveCIgOiB1c2VyQWdlbnQuaW5kZXhPZigib3BlcmEvIikgPj0gMCB8fCB1c2VyQWdlbnQuaW5kZXhPZigiIG9wci8iKSA+PSAwID8gIk9wZXJhIiA6IHVzZXJBZ2VudC5pbmRleE9mKCJjaHJvbWUvIikgPj0gMCA/ICJDaHJvbWUiIDogdXNlckFnZW50LmluZGV4T2YoInNhZmFyaS8iKSA+PSAwID8gdXNlckFnZW50LmluZGV4T2YoImFuZHJvaWQgMS4iKSA+PSAwIHx8IHVzZXJBZ2VudC5pbmRleE9mKCJhbmRyb2lkIDIuIikgPj0gMCB8fCB1c2VyQWdlbnQuaW5kZXhPZigiYW5kcm9pZCAzLiIpID49IDAgfHwgdXNlckFnZW50LmluZGV4T2YoImFuZHJvaWQgNC4iKSA+PSAwID8gIkFPU1AiIDogIlNhZmFyaSIgOiB1c2VyQWdlbnQuaW5kZXhPZigidHJpZGVudC8iKSA+PSAwID8gIkludGVybmV0IEV4cGxvcmVyIiA6ICJPdGhlciIpIHx8ICJTYWZhcmkiID09PSBicm93c2VyIHx8ICJPcGVyYSIgPT09IGJyb3dzZXIpICYmICIyMDAzMDEwNyIgIT09IHByb2R1Y3RTdWIpIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIGlmICgzNyA9PT0gKHRlbXBSZXMgPSBldmFsLnRvU3RyaW5nKCkubGVuZ3RoKSAmJiAiU2FmYXJpIiAhPT0gYnJvd3NlciAmJiAiRmlyZWZveCIgIT09IGJyb3dzZXIgJiYgIk90aGVyIiAhPT0gYnJvd3NlcikgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgaWYgKDM5ID09PSB0ZW1wUmVzICYmICJJbnRlcm5ldCBFeHBsb3JlciIgIT09IGJyb3dzZXIgJiYgIk90aGVyIiAhPT0gYnJvd3NlcikgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgaWYgKDMzID09PSB0ZW1wUmVzICYmICJDaHJvbWUiICE9PSBicm93c2VyICYmICJBT1NQIiAhPT0gYnJvd3NlciAmJiAiT3BlcmEiICE9PSBicm93c2VyICYmICJPdGhlciIgIT09IGJyb3dzZXIpIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgImEiOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU291cmNlKCksIGVyckZpcmVmb3ggPSAhMDsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJPZkVycikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJGaXJlZm94ID0gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGVyckZpcmVmb3ggJiYgIkZpcmVmb3giICE9PSBicm93c2VyICYmICJPdGhlciIgIT09IGJyb3dzZXI7CiAgICAgICAgICAgIH0sIGlzQ2FudmFzU3VwcG9ydGVkID0gZnVuY3Rpb24gaXNDYW52YXNTdXBwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICAgICAgcmV0dXJuICEoIWVsZW0uZ2V0Q29udGV4dCB8fCAhZWxlbS5nZXRDb250ZXh0KCIyZCIpKTsKICAgICAgICAgICAgfSwgaXNXZWJHbFN1cHBvcnRlZCA9IGZ1bmN0aW9uIGlzV2ViR2xTdXBwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKCkgfHwgIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQpIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIHZhciBnbENvbnRleHQgPSBnZXRXZWJnbENhbnZhcygpOwogICAgICAgICAgICAgICAgaWYgKGdsQ29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvc2VXZWJnbENvbnRleHQoZ2xDb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgfSwgaXNJRSA9IGZ1bmN0aW9uIGlzSUUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIgPT09IG5hdmlnYXRvci5hcHBOYW1lIHx8ICEoIk5ldHNjYXBlIiAhPT0gbmF2aWdhdG9yLmFwcE5hbWUgfHwgIS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKTsKICAgICAgICAgICAgfSwgaXNJRU9yT2xkRWRnZSA9IGZ1bmN0aW9uIGlzSUVPck9sZEVkZ2UoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCJtc1dyaXRlUHJvZmlsZXJNYXJrIiBpbiB3aW5kb3cpICsgKCJtc0xhdW5jaFVyaSIgaW4gbmF2aWdhdG9yKSArICgibXNTYXZlQmxvYiIgaW4gbmF2aWdhdG9yKSA+PSAyOwogICAgICAgICAgICB9LCBoYXNTd2ZPYmplY3RMb2FkZWQgPSBmdW5jdGlvbiBoYXNTd2ZPYmplY3RMb2FkZWQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB3aW5kb3cuc3dmb2JqZWN0OwogICAgICAgICAgICB9LCBoYXNNaW5GbGFzaEluc3RhbGxlZCA9IGZ1bmN0aW9uIGhhc01pbkZsYXNoSW5zdGFsbGVkKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zd2ZvYmplY3QuaGFzRmxhc2hQbGF5ZXJWZXJzaW9uKCI5LjAuMCIpOwogICAgICAgICAgICB9LCBhZGRGbGFzaERpdk5vZGUgPSBmdW5jdGlvbiBhZGRGbGFzaERpdk5vZGUob3B0aW9ucykgewogICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCJpZCIsIG9wdGlvbnMuZm9udHMuc3dmQ29udGFpbmVySWQpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgICB9LCBsb2FkU3dmQW5kRGV0ZWN0Rm9udHMgPSBmdW5jdGlvbiBsb2FkU3dmQW5kRGV0ZWN0Rm9udHMoZG9uZSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgdmFyIGlkLCBmbGFzaHZhcnMsIGZsYXNocGFyYW1zLCBoaWRkZW5DYWxsYmFjayA9ICJfX19mcF9zd2ZfbG9hZGVkIjsKICAgICAgICAgICAgICAgIHdpbmRvd1toaWRkZW5DYWxsYmFja10gPSBmdW5jdGlvbihmb250cykgewogICAgICAgICAgICAgICAgICAgIGRvbmUoZm9udHMpOwogICAgICAgICAgICAgICAgfSwgaWQgPSBvcHRpb25zLmZvbnRzLnN3ZkNvbnRhaW5lcklkLCBhZGRGbGFzaERpdk5vZGUoKSwgZmxhc2h2YXJzID0gewogICAgICAgICAgICAgICAgICAgIG9uUmVhZHk6IGhpZGRlbkNhbGxiYWNrCiAgICAgICAgICAgICAgICB9LCBmbGFzaHBhcmFtcyA9IHsKICAgICAgICAgICAgICAgICAgICBhbGxvd1NjcmlwdEFjY2VzczogImFsd2F5cyIsCiAgICAgICAgICAgICAgICAgICAgbWVudTogImZhbHNlIgogICAgICAgICAgICAgICAgfSwgd2luZG93LnN3Zm9iamVjdC5lbWJlZFNXRihvcHRpb25zLmZvbnRzLnN3ZlBhdGgsIGlkLCAiMSIsICIxIiwgIjkuMC4wIiwgITEsIGZsYXNodmFycywgZmxhc2hwYXJhbXMsIHt9KTsKICAgICAgICAgICAgfSwgZ2V0V2ViZ2xDYW52YXMgPSBmdW5jdGlvbiBnZXRXZWJnbENhbnZhcygpIHsKICAgICAgICAgICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSwgZ2wgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbCIpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgICAgICByZXR1cm4gZ2wgfHwgKGdsID0gbnVsbCksIGdsOwogICAgICAgICAgICB9LCBsb3NlV2ViZ2xDb250ZXh0ID0gZnVuY3Rpb24gbG9zZVdlYmdsQ29udGV4dChjb250ZXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgbG9zZUNvbnRleHRFeHRlbnNpb24gPSBjb250ZXh0LmdldEV4dGVuc2lvbigiV0VCR0xfbG9zZV9jb250ZXh0Iik7CiAgICAgICAgICAgICAgICBudWxsICE9IGxvc2VDb250ZXh0RXh0ZW5zaW9uICYmIGxvc2VDb250ZXh0RXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7CiAgICAgICAgICAgIH0sIGNvbXBvbmVudHMgPSBbIHsKICAgICAgICAgICAgICAgIGtleTogInVzZXJBZ2VudCIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiBVc2VyQWdlbnQoZG9uZSkgewogICAgICAgICAgICAgICAgICAgIGRvbmUobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogIndlYmRyaXZlciIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiB3ZWJkcml2ZXIoZG9uZSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGRvbmUobnVsbCA9PSBuYXZpZ2F0b3Iud2ViZHJpdmVyID8gb3B0aW9ucy5OT1RfQVZBSUxBQkxFIDogbmF2aWdhdG9yLndlYmRyaXZlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImxhbmd1YWdlIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGZ1bmN0aW9uIGxhbmd1YWdlS2V5KGRvbmUsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIHx8IG5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnN5c3RlbUxhbmd1YWdlIHx8IG9wdGlvbnMuTk9UX0FWQUlMQUJMRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNvbG9yRGVwdGgiLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogZnVuY3Rpb24gY29sb3JEZXB0aEtleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSh3aW5kb3cuc2NyZWVuLmNvbG9yRGVwdGggfHwgb3B0aW9ucy5OT1RfQVZBSUxBQkxFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZGV2aWNlTWVtb3J5IiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGZ1bmN0aW9uIGRldmljZU1lbW9yeUtleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZShuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5IHx8IG9wdGlvbnMuTk9UX0FWQUlMQUJMRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInBpeGVsUmF0aW8iLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogZnVuY3Rpb24gcGl4ZWxSYXRpb0tleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCBvcHRpb25zLk5PVF9BVkFJTEFCTEUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJoYXJkd2FyZUNvbmN1cnJlbmN5IiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGhhcmR3YXJlQ29uY3VycmVuY3lLZXkKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAic2NyZWVuUmVzb2x1dGlvbiIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBzY3JlZW5SZXNvbHV0aW9uS2V5CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImF2YWlsYWJsZVNjcmVlblJlc29sdXRpb24iLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogYXZhaWxhYmxlU2NyZWVuUmVzb2x1dGlvbktleQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJ0aW1lem9uZU9mZnNldCIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiB0aW1lem9uZU9mZnNldChkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgobmV3IERhdGUpLmdldFRpbWV6b25lT2Zmc2V0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJ0aW1lem9uZSIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiB0aW1lem9uZShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LkludGwgJiYgd2luZG93LkludGwuRGF0ZVRpbWVGb3JtYXQgPyBkb25lKChuZXcgd2luZG93LkludGwuRGF0ZVRpbWVGb3JtYXQpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8IG9wdGlvbnMuTk9UX0FWQUlMQUJMRSkgOiBkb25lKG9wdGlvbnMuTk9UX0FWQUlMQUJMRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInNlc3Npb25TdG9yYWdlIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IHNlc3Npb25TdG9yYWdlS2V5CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImxvY2FsU3RvcmFnZSIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBsb2NhbFN0b3JhZ2VLZXkKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiaW5kZXhlZERiIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGluZGV4ZWREYktleQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJhZGRCZWhhdmlvciIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiBhZGRCZWhhdmlvcktleShkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSghIXdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuYWRkQmVoYXZpb3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJvcGVuRGF0YWJhc2UiLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogZnVuY3Rpb24gb3BlbkRhdGFiYXNlS2V5KGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCEhd2luZG93Lm9wZW5EYXRhYmFzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImNwdUNsYXNzIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGNwdUNsYXNzS2V5CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInBsYXRmb3JtIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IHBsYXRmb3JtS2V5CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImRvTm90VHJhY2siLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogZG9Ob3RUcmFja0tleQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJwbHVnaW5zIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IHBsdWdpbnNDb21wb25lbnQKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiY2FudmFzIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGNhbnZhc0tleQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJ3ZWJnbCIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiB3ZWJnbEtleQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJ3ZWJnbFZlbmRvckFuZFJlbmRlcmVyIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IHdlYmdsVmVuZG9yQW5kUmVuZGVyZXJLZXkKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiYWRCbG9jayIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBhZEJsb2NrS2V5CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImhhc0xpZWRMYW5ndWFnZXMiLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogaGFzTGllZExhbmd1YWdlc0tleQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJoYXNMaWVkUmVzb2x1dGlvbiIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiBoYXNMaWVkUmVzb2x1dGlvbktleQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJoYXNMaWVkT3MiLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogaGFzTGllZE9zS2V5CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImhhc0xpZWRCcm93c2VyIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGhhc0xpZWRCcm93c2VyS2V5CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogInRvdWNoU3VwcG9ydCIsCiAgICAgICAgICAgICAgICBnZXREYXRhOiB0b3VjaFN1cHBvcnRLZXkKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiZm9udHMiLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogZnVuY3Rpb24ganNGb250c0tleShkb25lLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuZGVkRm9udExpc3QsIHRlc3RTdHJpbmcsIHRlc3RTaXplLCBoLCBiYXNlRm9udHNEaXYsIGZvbnRzRGl2LCBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQsIGNyZWF0ZVNwYW4sIGNyZWF0ZVNwYW5XaXRoRm9udHMsIGluaXRpYWxpemVGb250c1NwYW5zLCBpc0ZvbnRBdmFpbGFibGUsIGJhc2VGb250c1NwYW5zLCBpbmRleCwgbGVuZ3RoLCBmb250c1NwYW5zLCBhdmFpbGFibGUsIGksIGwsIGJhc2VGb250cyA9IFsgIm1vbm9zcGFjZSIsICJzYW5zLXNlcmlmIiwgInNlcmlmIiBdLCBmb250TGlzdCA9IFsgIkFuZGFsZSBNb25vIiwgIkFyaWFsIiwgIkFyaWFsIEJsYWNrIiwgIkFyaWFsIEhlYnJldyIsICJBcmlhbCBNVCIsICJBcmlhbCBOYXJyb3ciLCAiQXJpYWwgUm91bmRlZCBNVCBCb2xkIiwgIkFyaWFsIFVuaWNvZGUgTVMiLCAiQml0c3RyZWFtIFZlcmEgU2FucyBNb25vIiwgIkJvb2sgQW50aXF1YSIsICJCb29rbWFuIE9sZCBTdHlsZSIsICJDYWxpYnJpIiwgIkNhbWJyaWEiLCAiQ2FtYnJpYSBNYXRoIiwgIkNlbnR1cnkiLCAiQ2VudHVyeSBHb3RoaWMiLCAiQ2VudHVyeSBTY2hvb2xib29rIiwgIkNvbWljIFNhbnMiLCAiQ29taWMgU2FucyBNUyIsICJDb25zb2xhcyIsICJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3IiwgIkdlbmV2YSIsICJHZW9yZ2lhIiwgIkhlbHZldGljYSIsICJIZWx2ZXRpY2EgTmV1ZSIsICJJbXBhY3QiLCAiTHVjaWRhIEJyaWdodCIsICJMdWNpZGEgQ2FsbGlncmFwaHkiLCAiTHVjaWRhIENvbnNvbGUiLCAiTHVjaWRhIEZheCIsICJMVUNJREEgR1JBTkRFIiwgIkx1Y2lkYSBIYW5kd3JpdGluZyIsICJMdWNpZGEgU2FucyIsICJMdWNpZGEgU2FucyBUeXBld3JpdGVyIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCAiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAiTW9uYWNvIiwgIk1vbm90eXBlIENvcnNpdmEiLCAiTVMgR290aGljIiwgIk1TIE91dGxvb2siLCAiTVMgUEdvdGhpYyIsICJNUyBSZWZlcmVuY2UgU2FucyBTZXJpZiIsICJNUyBTYW5zIFNlcmlmIiwgIk1TIFNlcmlmIiwgIk1ZUklBRCIsICJNWVJJQUQgUFJPIiwgIlBhbGF0aW5vIiwgIlBhbGF0aW5vIExpbm90eXBlIiwgIlNlZ29lIFByaW50IiwgIlNlZ29lIFNjcmlwdCIsICJTZWdvZSBVSSIsICJTZWdvZSBVSSBMaWdodCIsICJTZWdvZSBVSSBTZW1pYm9sZCIsICJTZWdvZSBVSSBTeW1ib2wiLCAiVGFob21hIiwgIlRpbWVzIiwgIlRpbWVzIE5ldyBSb21hbiIsICJUaW1lcyBOZXcgUm9tYW4gUFMiLCAiVHJlYnVjaGV0IE1TIiwgIlZlcmRhbmEiLCAiV2luZ2RpbmdzIiwgIldpbmdkaW5ncyAyIiwgIldpbmdkaW5ncyAzIiBdOwogICAgICAgICAgICAgICAgICAgIGZvciAob3B0aW9ucy5mb250cy5leHRlbmRlZEpzRm9udHMgJiYgKGV4dGVuZGVkRm9udExpc3QgPSBbICJBYmFkaSBNVCBDb25kZW5zZWQgTGlnaHQiLCAiQWNhZGVteSBFbmdyYXZlZCBMRVQiLCAiQURPQkUgQ0FTTE9OIFBSTyIsICJBZG9iZSBHYXJhbW9uZCIsICJBRE9CRSBHQVJBTU9ORCBQUk8iLCAiQWdlbmN5IEZCIiwgIkFoYXJvbmkiLCAiQWxiZXJ0dXMgRXh0cmEgQm9sZCIsICJBbGJlcnR1cyBNZWRpdW0iLCAiQWxnZXJpYW4iLCAiQW1hem9uZSBCVCIsICJBbWVyaWNhbiBUeXBld3JpdGVyIiwgIkFtZXJpY2FuIFR5cGV3cml0ZXIgQ29uZGVuc2VkIiwgIkFtZXJUeXBlIE1kIEJUIiwgIkFuZGFsdXMiLCAiQW5nc2FuYSBOZXciLCAiQW5nc2FuYVVQQyIsICJBbnRpcXVlIE9saXZlIiwgIkFwYXJhaml0YSIsICJBcHBsZSBDaGFuY2VyeSIsICJBcHBsZSBDb2xvciBFbW9qaSIsICJBcHBsZSBTRCBHb3RoaWMgTmVvIiwgIkFyYWJpYyBUeXBlc2V0dGluZyIsICJBUkNIRVIiLCAiQVJOTyBQUk8iLCAiQXJydXMgQlQiLCAiQXVyb3JhIENuIEJUIiwgIkF2YW50R2FyZGUgQmsgQlQiLCAiQXZhbnRHYXJkZSBNZCBCVCIsICJBVkVOSVIiLCAiQXl1dGhheWEiLCAiQmFuZHkiLCAiQmFuZ2xhIFNhbmdhbSBNTiIsICJCYW5rIEdvdGhpYyIsICJCYW5rR290aGljIE1kIEJUIiwgIkJhc2tlcnZpbGxlIiwgIkJhc2tlcnZpbGxlIE9sZCBGYWNlIiwgIkJhdGFuZyIsICJCYXRhbmdDaGUiLCAiQmF1ZXIgQm9kb25pIiwgIkJhdWhhdXMgOTMiLCAiQmF6b29rYSIsICJCZWxsIE1UIiwgIkJlbWJvIiwgIkJlbmd1aWF0IEJrIEJUIiwgIkJlcmxpbiBTYW5zIEZCIiwgIkJlcmxpbiBTYW5zIEZCIERlbWkiLCAiQmVybmFyZCBNVCBDb25kZW5zZWQiLCAiQmVybmhhcmRGYXNoaW9uIEJUIiwgIkJlcm5oYXJkTW9kIEJUIiwgIkJpZyBDYXNsb24iLCAiQmlubmVyRCIsICJCbGFja2FkZGVyIElUQyIsICJCbGFpck1kSVRDIFRUIiwgIkJvZG9uaSA3MiIsICJCb2RvbmkgNzIgT2xkc3R5bGUiLCAiQm9kb25pIDcyIFNtYWxsY2FwcyIsICJCb2RvbmkgTVQiLCAiQm9kb25pIE1UIEJsYWNrIiwgIkJvZG9uaSBNVCBDb25kZW5zZWQiLCAiQm9kb25pIE1UIFBvc3RlciBDb21wcmVzc2VkIiwgIkJvb2tzaGVsZiBTeW1ib2wgNyIsICJCb3VsZGVyIiwgIkJyYWRsZXkgSGFuZCIsICJCcmFkbGV5IEhhbmQgSVRDIiwgIkJyZW1lbiBCZCBCVCIsICJCcml0YW5uaWMgQm9sZCIsICJCcm9hZHdheSIsICJCcm93YWxsaWEgTmV3IiwgIkJyb3dhbGxpYVVQQyIsICJCcnVzaCBTY3JpcHQgTVQiLCAiQ2FsaWZvcm5pYW4gRkIiLCAiQ2FsaXN0byBNVCIsICJDYWxsaWdyYXBoZXIiLCAiQ2FuZGFyYSIsICJDYXNsb25PcG5mYWNlIEJUIiwgIkNhc3RlbGxhciIsICJDZW50YXVyIiwgIkNlemFubmUiLCAiQ0cgT21lZ2EiLCAiQ0cgVGltZXMiLCAiQ2hhbGtib2FyZCIsICJDaGFsa2JvYXJkIFNFIiwgIkNoYWxrZHVzdGVyIiwgIkNoYXJsZXN3b3J0aCIsICJDaGFydGVyIEJkIEJUIiwgIkNoYXJ0ZXIgQlQiLCAiQ2hhdWNlciIsICJDaGVsdGhtSVRDIEJrIEJUIiwgIkNoaWxsZXIiLCAiQ2xhcmVuZG9uIiwgIkNsYXJlbmRvbiBDb25kZW5zZWQiLCAiQ2xvaXN0ZXJCbGFjayBCVCIsICJDb2NoaW4iLCAiQ29sb25uYSBNVCIsICJDb25zdGFudGlhIiwgIkNvb3BlciBCbGFjayIsICJDb3BwZXJwbGF0ZSIsICJDb3BwZXJwbGF0ZSBHb3RoaWMiLCAiQ29wcGVycGxhdGUgR290aGljIEJvbGQiLCAiQ29wcGVycGxhdGUgR290aGljIExpZ2h0IiwgIkNvcHBlcnBsR290aCBCZCBCVCIsICJDb3JiZWwiLCAiQ29yZGlhIE5ldyIsICJDb3JkaWFVUEMiLCAiQ29ybmVyc3RvbmUiLCAiQ29yb25ldCIsICJDdWNrb28iLCAiQ3VybHogTVQiLCAiRGF1blBlbmgiLCAiRGF1cGhpbiIsICJEYXZpZCIsICJEQiBMQ0QgVGVtcCIsICJERUxJQ0lPVVMiLCAiRGVubWFyayIsICJERkthaS1TQiIsICJEaWRvdCIsICJEaWxsZW5pYVVQQyIsICJESU4iLCAiRG9rQ2hhbXBhIiwgIkRvdHVtIiwgIkRvdHVtQ2hlIiwgIkVicmltYSIsICJFZHdhcmRpYW4gU2NyaXB0IElUQyIsICJFbGVwaGFudCIsICJFbmdsaXNoIDExMSBWaXZhY2UgQlQiLCAiRW5ncmF2ZXJzIE1UIiwgIkVuZ3JhdmVyc0dvdGhpYyBCVCIsICJFcmFzIEJvbGQgSVRDIiwgIkVyYXMgRGVtaSBJVEMiLCAiRXJhcyBMaWdodCBJVEMiLCAiRXJhcyBNZWRpdW0gSVRDIiwgIkV1Y3Jvc2lhVVBDIiwgIkV1cGhlbWlhIiwgIkV1cGhlbWlhIFVDQVMiLCAiRVVST1NUSUxFIiwgIkV4b3RjMzUwIEJkIEJUIiwgIkZhbmdTb25nIiwgIkZlbGl4IFRpdGxpbmciLCAiRml4ZWRzeXMiLCAiRk9OVElOIiwgIkZvb3RsaWdodCBNVCBMaWdodCIsICJGb3J0ZSIsICJGcmFua1J1ZWhsIiwgIkZyYW5zaXNjYW4iLCAiRnJlZWZybTcyMSBCbGsgQlQiLCAiRnJlZXNpYVVQQyIsICJGcmVlc3R5bGUgU2NyaXB0IiwgIkZyZW5jaCBTY3JpcHQgTVQiLCAiRnJua0dvdGhJVEMgQmsgQlQiLCAiRnJ1aXRnZXIiLCAiRlJVVElHRVIiLCAiRnV0dXJhIiwgIkZ1dHVyYSBCayBCVCIsICJGdXR1cmEgTHQgQlQiLCAiRnV0dXJhIE1kIEJUIiwgIkZ1dHVyYSBaQmxrIEJUIiwgIkZ1dHVyYUJsYWNrIEJUIiwgIkdhYnJpb2xhIiwgIkdhbGxpYXJkIEJUIiwgIkdhdXRhbWkiLCAiR2VlemEgUHJvIiwgIkdlb21ldHIyMzEgQlQiLCAiR2VvbWV0cjIzMSBIdiBCVCIsICJHZW9tZXRyMjMxIEx0IEJUIiwgIkdlb1NsYWIgNzAzIEx0IEJUIiwgIkdlb1NsYWIgNzAzIFhCZCBCVCIsICJHaWdpIiwgIkdpbGwgU2FucyIsICJHaWxsIFNhbnMgTVQiLCAiR2lsbCBTYW5zIE1UIENvbmRlbnNlZCIsICJHaWxsIFNhbnMgTVQgRXh0IENvbmRlbnNlZCBCb2xkIiwgIkdpbGwgU2FucyBVbHRyYSBCb2xkIiwgIkdpbGwgU2FucyBVbHRyYSBCb2xkIENvbmRlbnNlZCIsICJHaXNoYSIsICJHbG91Y2VzdGVyIE1UIEV4dHJhIENvbmRlbnNlZCIsICJHT1RIQU0iLCAiR09USEFNIEJPTEQiLCAiR291ZHkgT2xkIFN0eWxlIiwgIkdvdWR5IFN0b3V0IiwgIkdvdWR5SGFuZHRvb2xlZCBCVCIsICJHb3VkeU9MU3QgQlQiLCAiR3VqYXJhdGkgU2FuZ2FtIE1OIiwgIkd1bGltIiwgIkd1bGltQ2hlIiwgIkd1bmdzdWgiLCAiR3VuZ3N1aENoZSIsICJHdXJtdWtoaSBNTiIsICJIYWV0dGVuc2Nod2VpbGVyIiwgIkhhcmxvdyBTb2xpZCBJdGFsaWMiLCAiSGFycmluZ3RvbiIsICJIZWF0aGVyIiwgIkhlaXRpIFNDIiwgIkhlaXRpIFRDIiwgIkhFTFYiLCAiSGVyYWxkIiwgIkhpZ2ggVG93ZXIgVGV4dCIsICJIaXJhZ2lubyBLYWt1IEdvdGhpYyBQcm9OIiwgIkhpcmFnaW5vIE1pbmNobyBQcm9OIiwgIkhvZWZsZXIgVGV4dCIsICJIdW1hbnN0IDUyMSBDbiBCVCIsICJIdW1hbnN0NTIxIEJUIiwgIkh1bWFuc3Q1MjEgTHQgQlQiLCAiSW1wcmludCBNVCBTaGFkb3ciLCAiSW5jaXNlZDkwMSBCZCBCVCIsICJJbmNpc2VkOTAxIEJUIiwgIkluY2lzZWQ5MDEgTHQgQlQiLCAiSU5DT05TT0xBVEEiLCAiSW5mb3JtYWwgUm9tYW4iLCAiSW5mb3JtYWwwMTEgQlQiLCAiSU5URVJTVEFURSIsICJJcmlzVVBDIiwgIklza29vbGEgUG90YSIsICJKYXNtaW5lVVBDIiwgIkphenogTEVUIiwgIkplbnNvbiIsICJKZXN0ZXIiLCAiSm9rZXJtYW4iLCAiSnVpY2UgSVRDIiwgIkthYmVsIEJrIEJUIiwgIkthYmVsIFVsdCBCVCIsICJLYWlsYXNhIiwgIkthaVRpIiwgIkthbGluZ2EiLCAiS2FubmFkYSBTYW5nYW0gTU4iLCAiS2FydGlrYSIsICJLYXVmbWFubiBCZCBCVCIsICJLYXVmbWFubiBCVCIsICJLaG1lciBVSSIsICJLb2RjaGlhbmdVUEMiLCAiS29raWxhIiwgIktvcmlubmEgQlQiLCAiS3Jpc3RlbiBJVEMiLCAiS3J1bmd0aGVwIiwgIkt1bnN0bGVyIFNjcmlwdCIsICJMYW8gVUkiLCAiTGF0aGEiLCAiTGVlbGF3YWRlZSIsICJMZXR0ZXIgR290aGljIiwgIkxldmVuaW0gTVQiLCAiTGlseVVQQyIsICJMaXRob2dyYXBoIiwgIkxpdGhvZ3JhcGggTGlnaHQiLCAiTG9uZyBJc2xhbmQiLCAiTHlkaWFuIEJUIiwgIk1hZ25ldG8iLCAiTWFpYW5kcmEgR0QiLCAiTWFsYXlhbGFtIFNhbmdhbSBNTiIsICJNYWxndW4gR290aGljIiwgIk1hbmdhbCIsICJNYXJpZ29sZCIsICJNYXJpb24iLCAiTWFya2VyIEZlbHQiLCAiTWFya2V0IiwgIk1hcmxldHQiLCAiTWF0aXNzZSBJVEMiLCAiTWF0dXJhIE1UIFNjcmlwdCBDYXBpdGFscyIsICJNZWlyeW8iLCAiTWVpcnlvIFVJIiwgIk1pY3Jvc29mdCBIaW1hbGF5YSIsICJNaWNyb3NvZnQgSmhlbmdIZWkiLCAiTWljcm9zb2Z0IE5ldyBUYWkgTHVlIiwgIk1pY3Jvc29mdCBQaGFnc1BhIiwgIk1pY3Jvc29mdCBUYWkgTGUiLCAiTWljcm9zb2Z0IFVpZ2h1ciIsICJNaWNyb3NvZnQgWWFIZWkiLCAiTWljcm9zb2Z0IFlpIEJhaXRpIiwgIk1pbmdMaVUiLCAiTWluZ0xpVV9IS1NDUyIsICJNaW5nTGlVX0hLU0NTLUV4dEIiLCAiTWluZ0xpVS1FeHRCIiwgIk1pbmlvbiIsICJNaW5pb24gUHJvIiwgIk1pcmlhbSIsICJNaXJpYW0gRml4ZWQiLCAiTWlzdHJhbCIsICJNb2Rlcm4iLCAiTW9kZXJuIE5vLiAyMCIsICJNb25hIExpc2EgU29saWQgSVRDIFRUIiwgIk1vbmdvbGlhbiBCYWl0aSIsICJNT05PIiwgIk1vb2xCb3JhbiIsICJNcnMgRWF2ZXMiLCAiTVMgTGluZURyYXciLCAiTVMgTWluY2hvIiwgIk1TIFBNaW5jaG8iLCAiTVMgUmVmZXJlbmNlIFNwZWNpYWx0eSIsICJNUyBVSSBHb3RoaWMiLCAiTVQgRXh0cmEiLCAiTVVTRU8iLCAiTVYgQm9saSIsICJOYWRlZW0iLCAiTmFya2lzaW0iLCAiTkVWSVMiLCAiTmV3cyBHb3RoaWMiLCAiTmV3cyBHb3RoaWNNVCIsICJOZXdzR290aCBCVCIsICJOaWFnYXJhIEVuZ3JhdmVkIiwgIk5pYWdhcmEgU29saWQiLCAiTm90ZXdvcnRoeSIsICJOU2ltU3VuIiwgIk55YWxhIiwgIk9DUiBBIEV4dGVuZGVkIiwgIk9sZCBDZW50dXJ5IiwgIk9sZCBFbmdsaXNoIFRleHQgTVQiLCAiT255eCIsICJPbnl4IEJUIiwgIk9QVElNQSIsICJPcml5YSBTYW5nYW0gTU4iLCAiT1NBS0EiLCAiT3pIYW5kaWNyYWZ0IEJUIiwgIlBhbGFjZSBTY3JpcHQgTVQiLCAiUGFweXJ1cyIsICJQYXJjaG1lbnQiLCAiUGFydHkgTEVUIiwgIlBlZ2FzdXMiLCAiUGVycGV0dWEiLCAiUGVycGV0dWEgVGl0bGluZyBNVCIsICJQZXRpdGFCb2xkIiwgIlBpY2t3aWNrIiwgIlBsYW50YWdlbmV0IENoZXJva2VlIiwgIlBsYXliaWxsIiwgIlBNaW5nTGlVIiwgIlBNaW5nTGlVLUV4dEIiLCAiUG9vciBSaWNoYXJkIiwgIlBvc3RlciIsICJQb3N0ZXJCb2RvbmkgQlQiLCAiUFJJTkNFVE9XTiBMRVQiLCAiUHJpc3RpbmEiLCAiUFRCYXJudW0gQlQiLCAiUHl0aGFnb3JhcyIsICJSYWF2aSIsICJSYWdlIEl0YWxpYyIsICJSYXZpZSIsICJSaWJib24xMzEgQmQgQlQiLCAiUm9ja3dlbGwiLCAiUm9ja3dlbGwgQ29uZGVuc2VkIiwgIlJvY2t3ZWxsIEV4dHJhIEJvbGQiLCAiUm9kIiwgIlJvbWFuIiwgIlNha2thbCBNYWphbGxhIiwgIlNhbnRhIEZlIExFVCIsICJTYXZveWUgTEVUIiwgIlNjZXB0cmUiLCAiU2NyaXB0IiwgIlNjcmlwdCBNVCBCb2xkIiwgIlNDUklQVElOQSIsICJTZXJpZmEiLCAiU2VyaWZhIEJUIiwgIlNlcmlmYSBUaCBCVCIsICJTaGVsbGV5Vm9sYW50ZSBCVCIsICJTaGVyd29vZCIsICJTaG9uYXIgQmFuZ2xhIiwgIlNob3djYXJkIEdvdGhpYyIsICJTaHJ1dGkiLCAiU2lnbmJvYXJkIiwgIlNJTEtTQ1JFRU4iLCAiU2ltSGVpIiwgIlNpbXBsaWZpZWQgQXJhYmljIiwgIlNpbXBsaWZpZWQgQXJhYmljIEZpeGVkIiwgIlNpbVN1biIsICJTaW1TdW4tRXh0QiIsICJTaW5oYWxhIFNhbmdhbSBNTiIsICJTa2V0Y2ggUm9ja3dlbGwiLCAiU2tpYSIsICJTbWFsbCBGb250cyIsICJTbmFwIElUQyIsICJTbmVsbCBSb3VuZGhhbmQiLCAiU29ja2V0IiwgIlNvdXZlbmlyIEx0IEJUIiwgIlN0YWNjYXRvMjIyIEJUIiwgIlN0ZWFtZXIiLCAiU3RlbmNpbCIsICJTdG9yeWJvb2siLCAiU3R5bGxvIiwgIlN1YndheSIsICJTd2lzNzIxIEJsa0V4IEJUIiwgIlN3aXNzOTExIFhDbSBCVCIsICJTeWxmYWVuIiwgIlN5bmNocm8gTEVUIiwgIlN5c3RlbSIsICJUYW1pbCBTYW5nYW0gTU4iLCAiVGVjaG5pY2FsIiwgIlRlbGV0eXBlIiwgIlRlbHVndSBTYW5nYW0gTU4iLCAiVGVtcHVzIFNhbnMgSVRDIiwgIlRlcm1pbmFsIiwgIlRob25idXJpIiwgIlRyYWRpdGlvbmFsIEFyYWJpYyIsICJUcmFqYW4iLCAiVFJBSkFOIFBSTyIsICJUcmlzdGFuIiwgIlR1YnVsYXIiLCAiVHVuZ2EiLCAiVHcgQ2VuIE1UIiwgIlR3IENlbiBNVCBDb25kZW5zZWQiLCAiVHcgQ2VuIE1UIENvbmRlbnNlZCBFeHRyYSBCb2xkIiwgIlR5cG9VcHJpZ2h0IEJUIiwgIlVuaWNvcm4iLCAiVW5pdmVycyIsICJVbml2ZXJzIENFIDU1IE1lZGl1bSIsICJVbml2ZXJzIENvbmRlbnNlZCIsICJVdHNhYWgiLCAiVmFnYWJvbmQiLCAiVmFuaSIsICJWaWpheWEiLCAiVmluZXIgSGFuZCBJVEMiLCAiVmlzdWFsVUkiLCAiVml2YWxkaSIsICJWbGFkaW1pciBTY3JpcHQiLCAiVnJpbmRhIiwgIldlc3RtaW5zdGVyIiwgIldISVRORVkiLCAiV2lkZSBMYXRpbiIsICJaYXBmRWxsaXB0IEJUIiwgIlphcGZIdW1uc3QgQlQiLCAiWmFwZkh1bW5zdCBEbSBCVCIsICJaYXBmaW5vIiwgIlp1cmljaCBCbGtFeCBCVCIsICJadXJpY2ggRXggQlQiLCAiWldBZG9iZUYiIF0sIAogICAgICAgICAgICAgICAgICAgIGZvbnRMaXN0ID0gZm9udExpc3QuY29uY2F0KGV4dGVuZGVkRm9udExpc3QpKSwgZm9udExpc3QgPSAoZm9udExpc3QgPSBmb250TGlzdC5jb25jYXQob3B0aW9ucy5mb250cy51c2VyRGVmaW5lZEZvbnRzKSkuZmlsdGVyKChmdW5jdGlvbihmb250LCBwb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9udExpc3QuaW5kZXhPZihmb250KSA9PT0gcG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgfSkpLCB0ZXN0U3RyaW5nID0gIm1tbW1tbW1tbW1sbGkiLCB0ZXN0U2l6ZSA9ICI3MnB4IiwgaCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sIAogICAgICAgICAgICAgICAgICAgIGJhc2VGb250c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLCBmb250c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLCAKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0V2lkdGggPSB7fSwgZGVmYXVsdEhlaWdodCA9IHt9LCBjcmVhdGVTcGFuID0gZnVuY3Rpb24gY3JlYXRlU3BhbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIiwgcy5zdHlsZS5sZWZ0ID0gIi05OTk5cHgiLCBzLnN0eWxlLmZvbnRTaXplID0gdGVzdFNpemUsIAogICAgICAgICAgICAgICAgICAgICAgICBzLnN0eWxlLmZvbnRTdHlsZSA9ICJub3JtYWwiLCBzLnN0eWxlLmZvbnRXZWlnaHQgPSAibm9ybWFsIiwgcy5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gIm5vcm1hbCIsIAogICAgICAgICAgICAgICAgICAgICAgICBzLnN0eWxlLmxpbmVCcmVhayA9ICJhdXRvIiwgcy5zdHlsZS5saW5lSGVpZ2h0ID0gIm5vcm1hbCIsIHMuc3R5bGUudGV4dFRyYW5zZm9ybSA9ICJub25lIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHMuc3R5bGUudGV4dEFsaWduID0gImxlZnQiLCBzLnN0eWxlLnRleHREZWNvcmF0aW9uID0gIm5vbmUiLCBzLnN0eWxlLnRleHRTaGFkb3cgPSAibm9uZSIsIAogICAgICAgICAgICAgICAgICAgICAgICBzLnN0eWxlLndoaXRlU3BhY2UgPSAibm9ybWFsIiwgcy5zdHlsZS53b3JkQnJlYWsgPSAibm9ybWFsIiwgcy5zdHlsZS53b3JkU3BhY2luZyA9ICJub3JtYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgcy5pbm5lckhUTUwgPSB0ZXN0U3RyaW5nLCBzOwogICAgICAgICAgICAgICAgICAgIH0sIGNyZWF0ZVNwYW5XaXRoRm9udHMgPSBmdW5jdGlvbiBjcmVhdGVTcGFuV2l0aEZvbnRzKGZvbnRUb0RldGVjdCwgYmFzZUZvbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBjcmVhdGVTcGFuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnN0eWxlLmZvbnRGYW1pbHkgPSAiJyIgKyBmb250VG9EZXRlY3QgKyAiJywiICsgYmFzZUZvbnQsIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgaW5pdGlhbGl6ZUZvbnRzU3BhbnMgPSBmdW5jdGlvbiBpbml0aWFsaXplRm9udHNTcGFucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGwsIGZvbnRTcGFucywgaiwgbnVtRGVmYXVsdEZvbnRzLCBzLCBzcGFucyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gZm9udExpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGZvbnRTcGFucyA9IFtdLCBqID0gMCwgbnVtRGVmYXVsdEZvbnRzID0gYmFzZUZvbnRzLmxlbmd0aDsgaiA8IG51bURlZmF1bHRGb250czsgaisrKSBzID0gY3JlYXRlU3BhbldpdGhGb250cyhmb250TGlzdFtpXSwgYmFzZUZvbnRzW2pdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250c0Rpdi5hcHBlbmRDaGlsZChzKSwgZm9udFNwYW5zLnB1c2gocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuc1tmb250TGlzdFtpXV0gPSBmb250U3BhbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYW5zOwogICAgICAgICAgICAgICAgICAgIH0sIGlzRm9udEF2YWlsYWJsZSA9IGZ1bmN0aW9uIGlzRm9udEF2YWlsYWJsZShmb250U3BhbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGRldGVjdGVkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiYXNlRm9udHMubGVuZ3RoOyBpKyspIGlmIChkZXRlY3RlZCA9IGZvbnRTcGFuc1tpXS5vZmZzZXRXaWR0aCAhPT0gZGVmYXVsdFdpZHRoW2Jhc2VGb250c1tpXV0gfHwgZm9udFNwYW5zW2ldLm9mZnNldEhlaWdodCAhPT0gZGVmYXVsdEhlaWdodFtiYXNlRm9udHNbaV1dKSByZXR1cm4gZGV0ZWN0ZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRlY3RlZDsKICAgICAgICAgICAgICAgICAgICB9LCBiYXNlRm9udHNTcGFucyA9IGZ1bmN0aW9uIGluaXRpYWxpemVCYXNlRm9udHNTcGFucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4LCBsZW5ndGgsIHMsIHNwYW5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBiYXNlRm9udHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgKHMgPSBjcmVhdGVTcGFuKCkpLnN0eWxlLmZvbnRGYW1pbHkgPSBiYXNlRm9udHNbaW5kZXhdLCAKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUZvbnRzRGl2LmFwcGVuZENoaWxkKHMpLCBzcGFucy5wdXNoKHMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhbnM7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBoLmFwcGVuZENoaWxkKGJhc2VGb250c0RpdiksIGluZGV4ID0gMCwgbGVuZ3RoID0gYmFzZUZvbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIGRlZmF1bHRXaWR0aFtiYXNlRm9udHNbaW5kZXhdXSA9IGJhc2VGb250c1NwYW5zW2luZGV4XS5vZmZzZXRXaWR0aCwgCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhlaWdodFtiYXNlRm9udHNbaW5kZXhdXSA9IGJhc2VGb250c1NwYW5zW2luZGV4XS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgZm9yIChmb250c1NwYW5zID0gaW5pdGlhbGl6ZUZvbnRzU3BhbnMoKSwgaC5hcHBlbmRDaGlsZChmb250c0RpdiksIGF2YWlsYWJsZSA9IFtdLCAKICAgICAgICAgICAgICAgICAgICBpID0gMCwgbCA9IGZvbnRMaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgaXNGb250QXZhaWxhYmxlKGZvbnRzU3BhbnNbZm9udExpc3RbaV1dKSAmJiBhdmFpbGFibGUucHVzaChmb250TGlzdFtpXSk7CiAgICAgICAgICAgICAgICAgICAgaC5yZW1vdmVDaGlsZChmb250c0RpdiksIGgucmVtb3ZlQ2hpbGQoYmFzZUZvbnRzRGl2KSwgZG9uZShhdmFpbGFibGUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHBhdXNlQmVmb3JlOiAhMAogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBrZXk6ICJmb250c0ZsYXNoIiwKICAgICAgICAgICAgICAgIGdldERhdGE6IGZsYXNoRm9udHNLZXksCiAgICAgICAgICAgICAgICBwYXVzZUJlZm9yZTogITAKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAga2V5OiAiYXVkaW8iLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogZnVuY3Rpb24gYXVkaW9LZXkoZG9uZSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIHZhciBBdWRpb0NvbnRleHQsIGNvbnRleHQsIG9zY2lsbGF0b3IsIGNvbXByZXNzb3IsIGF1ZGlvVGltZW91dElkLCBhdWRpb09wdGlvbnMgPSBvcHRpb25zLmF1ZGlvOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb09wdGlvbnMuZXhjbHVkZUlPUzExICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09TIDExLitWZXJzaW9uXC8xMS4rU2FmYXJpLykgPyBkb25lKG9wdGlvbnMuRVhDTFVERUQpIDogbnVsbCA9PSAoQXVkaW9Db250ZXh0ID0gd2luZG93Lk9mZmxpbmVBdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdE9mZmxpbmVBdWRpb0NvbnRleHQpID8gZG9uZShvcHRpb25zLk5PVF9BVkFJTEFCTEUpIDogKGNvbnRleHQgPSBuZXcgQXVkaW9Db250ZXh0KDEsIDQ0MTAwLCA0NDEwMCksIAogICAgICAgICAgICAgICAgICAgIChvc2NpbGxhdG9yID0gY29udGV4dC5jcmVhdGVPc2NpbGxhdG9yKCkpLnR5cGUgPSAidHJpYW5nbGUiLCBvc2NpbGxhdG9yLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSgxZTQsIGNvbnRleHQuY3VycmVudFRpbWUpLCAKICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yID0gY29udGV4dC5jcmVhdGVEeW5hbWljc0NvbXByZXNzb3IoKSwgZWFjaChbIFsgInRocmVzaG9sZCIsIC01MCBdLCBbICJrbmVlIiwgNDAgXSwgWyAicmF0aW8iLCAxMiBdLCBbICJyZWR1Y3Rpb24iLCAtMjAgXSwgWyAiYXR0YWNrIiwgMCBdLCBbICJyZWxlYXNlIiwgLjI1IF0gXSwgKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBjb21wcmVzc29yW2l0ZW1bMF1dICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIGNvbXByZXNzb3JbaXRlbVswXV0uc2V0VmFsdWVBdFRpbWUgJiYgY29tcHJlc3NvcltpdGVtWzBdXS5zZXRWYWx1ZUF0VGltZShpdGVtWzFdLCBjb250ZXh0LmN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgICAgICB9KSksIG9zY2lsbGF0b3IuY29ubmVjdChjb21wcmVzc29yKSwgY29tcHJlc3Nvci5jb25uZWN0KGNvbnRleHQuZGVzdGluYXRpb24pLCBvc2NpbGxhdG9yLnN0YXJ0KDApLCAKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnN0YXJ0UmVuZGVyaW5nKCksIGF1ZGlvVGltZW91dElkID0gc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm9uY29tcGxldGUgPSBmdW5jdGlvbigpIHt9LCBjb250ZXh0ID0gbnVsbCwgZG9uZSgiYXVkaW9UaW1lb3V0Iik7CiAgICAgICAgICAgICAgICAgICAgfSksIGF1ZGlvT3B0aW9ucy50aW1lb3V0KSwgdm9pZCAoY29udGV4dC5vbmNvbXBsZXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbmdlcnByaW50OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGF1ZGlvVGltZW91dElkKSwgZmluZ2VycHJpbnQgPSBldmVudC5yZW5kZXJlZEJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKS5zbGljZSg0NTAwLCA1ZTMpLnJlZHVjZSgoZnVuY3Rpb24oYWNjLCB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgTWF0aC5hYnModmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAwKS50b1N0cmluZygpLCBvc2NpbGxhdG9yLmRpc2Nvbm5lY3QoKSwgY29tcHJlc3Nvci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBkb25lKGVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBkb25lKGZpbmdlcnByaW50KTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIGtleTogImVudW1lcmF0ZURldmljZXMiLAogICAgICAgICAgICAgICAgZ2V0RGF0YTogZW51bWVyYXRlRGV2aWNlc0tleQogICAgICAgICAgICB9IF0sIChGaW5nZXJwcmludDIgPSBmdW5jdGlvbiBGaW5nZXJwcmludDIob3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCInbmV3IEZpbmdlcnByaW50KCknIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmluZ2VycHJpbnRqcy9maW5nZXJwcmludGpzI3VwZ3JhZGUtZ3VpZGUtZnJvbS0xODItdG8tMjAwIik7CiAgICAgICAgICAgIH0pLmdldCA9IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICB2YXIga2V5cywgaTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID8gb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KSA6IChjYWxsYmFjayA9IG9wdGlvbnMsIG9wdGlvbnMgPSB7fSksIGV4dGVuZFNvZnQob3B0aW9ucywgZGVmYXVsdE9wdGlvbnMpLCAKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29tcG9uZW50cyA9IG9wdGlvbnMuZXh0cmFDb21wb25lbnRzLmNvbmNhdChjb21wb25lbnRzKSwga2V5cyA9IHsKICAgICAgICAgICAgICAgICAgICBkYXRhOiBbXSwKICAgICAgICAgICAgICAgICAgICBhZGRQcmVwcm9jZXNzZWRDb21wb25lbnQ6IGZ1bmN0aW9uIGFkZFByZXByb2Nlc3NlZENvbXBvbmVudChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiIgPT0gdHlwZW9mIG9wdGlvbnMucHJlcHJvY2Vzc29yICYmICh2YWx1ZSA9IG9wdGlvbnMucHJlcHJvY2Vzc29yKGtleSwgdmFsdWUpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuZGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGkgPSAtMSwgZnVuY3Rpb24gY2hhaW5Db21wb25lbnRzKGFscmVhZHlXYWl0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKGkgKz0gMSkgPj0gb3B0aW9ucy5jb21wb25lbnRzLmxlbmd0aCkgY2FsbGJhY2soa2V5cy5kYXRhKTsgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBvcHRpb25zLmNvbXBvbmVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGVzW2NvbXBvbmVudC5rZXldKSBjaGFpbkNvbXBvbmVudHMoITEpOyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeVdhaXRlZCAmJiBjb21wb25lbnQucGF1c2VCZWZvcmUpIHJldHVybiBpIC09IDEsIHZvaWQgc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5Db21wb25lbnRzKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldERhdGEoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuYWRkUHJlcHJvY2Vzc2VkQ29tcG9uZW50KGNvbXBvbmVudC5rZXksIHZhbHVlKSwgY2hhaW5Db21wb25lbnRzKCExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuYWRkUHJlcHJvY2Vzc2VkQ29tcG9uZW50KGNvbXBvbmVudC5rZXksIFN0cmluZyhlcnJvcikpLCBjaGFpbkNvbXBvbmVudHMoITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSghMSk7CiAgICAgICAgICAgIH0sIEZpbmdlcnByaW50Mi5nZXRQcm9taXNlID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICBGaW5nZXJwcmludDIuZ2V0KG9wdGlvbnMsIHJlc29sdmUpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9LCBGaW5nZXJwcmludDIuZ2V0VjE4ID0gZnVuY3Rpb24ob3B0aW9ucywgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09IGNhbGxiYWNrICYmIChjYWxsYmFjayA9IG9wdGlvbnMsIG9wdGlvbnMgPSB7fSksIEZpbmdlcnByaW50Mi5nZXQob3B0aW9ucywgKGZ1bmN0aW9uKGNvbXBvbmVudHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSwgY29tcG9uZW50LCBtdXJtdXIsIG5ld0NvbXBvbmVudHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgaWYgKChjb21wb25lbnQgPSBjb21wb25lbnRzW2ldKS52YWx1ZSA9PT0gKG9wdGlvbnMuTk9UX0FWQUlMQUJMRSB8fCAibm90IGF2YWlsYWJsZSIpKSBuZXdDb21wb25lbnRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGNvbXBvbmVudC5rZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAidW5rbm93biIKICAgICAgICAgICAgICAgICAgICB9KTsgZWxzZSBpZiAoInBsdWdpbnMiID09PSBjb21wb25lbnQua2V5KSBuZXdDb21wb25lbnRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICJwbHVnaW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hcChjb21wb25lbnQudmFsdWUsIChmdW5jdGlvbihwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWltZVR5cGVzID0gbWFwKHBbMl0sIChmdW5jdGlvbihtdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdC5qb2luID8gbXQuam9pbigifiIpIDogbXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkuam9pbigiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgcFswXSwgcFsxXSwgbWltZVR5cGVzIF0uam9pbigiOjoiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAgICAgfSk7IGVsc2UgaWYgKC0xICE9PSBbICJjYW52YXMiLCAid2ViZ2wiIF0uaW5kZXhPZihjb21wb25lbnQua2V5KSAmJiBBcnJheS5pc0FycmF5KGNvbXBvbmVudC52YWx1ZSkpIG5ld0NvbXBvbmVudHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogY29tcG9uZW50LmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudC52YWx1ZS5qb2luKCJ+IikKICAgICAgICAgICAgICAgICAgICB9KTsgZWxzZSBpZiAoLTEgIT09IFsgInNlc3Npb25TdG9yYWdlIiwgImxvY2FsU3RvcmFnZSIsICJpbmRleGVkRGIiLCAiYWRkQmVoYXZpb3IiLCAib3BlbkRhdGFiYXNlIiBdLmluZGV4T2YoY29tcG9uZW50LmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnQudmFsdWUpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb25lbnRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBjb21wb25lbnQua2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNvbXBvbmVudC52YWx1ZSA/IG5ld0NvbXBvbmVudHMucHVzaChjb21wb25lbnQudmFsdWUuam9pbiA/IHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBjb21wb25lbnQua2V5LAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50LnZhbHVlLmpvaW4oIjsiKQogICAgICAgICAgICAgICAgICAgIH0gOiBjb21wb25lbnQpIDogbmV3Q29tcG9uZW50cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBjb21wb25lbnQua2V5LAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50LnZhbHVlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbXVybXVyID0geDY0aGFzaDEyOChtYXAobmV3Q29tcG9uZW50cywgKGZ1bmN0aW9uKGNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pKS5qb2luKCJ+fn4iKSwgMzEpLCBjYWxsYmFjayhtdXJtdXIsIG5ld0NvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9LCBGaW5nZXJwcmludDIueDY0aGFzaDEyOCA9IHg2NGhhc2gxMjgsIEZpbmdlcnByaW50Mi5WRVJTSU9OID0gIjIuMS41IiwgRmluZ2VycHJpbnQyOwogICAgICAgIH0sIG1vZHVsZS5leHBvcnRzID8gbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKCkgOiBjb250ZXh0LmV4cG9ydHMgPyBjb250ZXh0LmV4cG9ydHMgPSBkZWZpbml0aW9uKCkgOiBjb250ZXh0LkZpbmdlcnByaW50MiA9IGRlZmluaXRpb24oKTsKICAgIH0pKSwgR3dkU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIEd3ZFNlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5UTWFsbCwgL2RldGFpbFwudG1hbGxcLmNvbVwvaXRlbVwuaHRtL2kgXSwgWyBTaXRlRW51bS5UYW9CYW8sIC9pdGVtXC50YW9iYW9cLmNvbVwvL2kgXSwgWyBTaXRlRW51bS5KaW5nRG9uZywgL2l0ZW1cLih5aXlhb2pkfGpkKVwuKGNvbXxoaylcL1swLTldKlwuaHRtbC9pIF0sIFsgU2l0ZUVudW0uU3VOaW5nLCAvcHJvZHVjdFwuc3VuaW5nXC5jb21cLy9pIF0sIFsgU2l0ZUVudW0uVnAsIC9kZXRhaWxcLnZpcFwuY29tXC8vaSBdLCBbIFNpdGVFbnVtLkthb0xhLCAvZ29vZHNcLmthb2xhXC4oY29tXC5oa3xjb20pL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLl9hcHBOYW1lID0gIkd3ZFNlcnZpY2UiLCBfdGhpcy5oaXN0b3J5U2VydmljZSA9IG5ldyBIaXN0b3J5U2VydmljZSwgX3RoaXMuZmFjdG9yeSA9IG5ldyBEZWZDb3Vwb24sIAogICAgICAgICAgICBfdGhpcy5kZnAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZnAgPSBDb25maWcuZ2V0KEd3ZEhlbHBlci5nd2RfZGZwX2tleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZGZwIHx8IChkZnAgPSBDb3JlLnJhbmRTdHIoNjApLCBDb25maWcuc2V0KEd3ZEhlbHBlci5nd2RfZGZwX2tleSwgZGZwLCA3MjAwKSwgCiAgICAgICAgICAgICAgICBkZnApOwogICAgICAgICAgICB9LCBfdGhpcy5mcCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGZwID0gQ29uZmlnLmdldChHd2RIZWxwZXIuZ3dkX2ZwX2tleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZnAgfHwgKGZpbmdlcnByaW50Mi5nZXQoewogICAgICAgICAgICAgICAgICAgIGZvbnRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkSnNGb250czogITEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZURldmljZXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZG9Ob3RUcmFjazogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzRmxhc2g6ICEwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgKGZ1bmN0aW9uKGNvbXBvbmVudHMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gY29tcG9uZW50cy5tYXAoKGZ1bmN0aW9uKGNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pKSwgbXVybXVyID0gZmluZ2VycHJpbnQyLng2NGhhc2gxMjgodmFsdWVzLmpvaW4oIiIpLCAzMSk7CiAgICAgICAgICAgICAgICAgICAgZnAgPSBtdXJtdXIsIENvbmZpZy5zZXQoR3dkSGVscGVyLmd3ZF9mcF9rZXksIGZwLCA3MjAwKTsKICAgICAgICAgICAgICAgIH0pKSwgZnApOwogICAgICAgICAgICB9LCBfdGhpcy5pdGVtVXJsID0gIiIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKEd3ZFNlcnZpY2UsIF9zdXBlciksIEd3ZFNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmRmcCgpLCB0aGlzLmZwKCksIHRoaXMucGFyYVByZSgpOwogICAgICAgIH0sIEd3ZFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmluamVjdEhpc3RvcnkoKTsKICAgICAgICB9LCBHd2RTZXJ2aWNlLnByb3RvdHlwZS5wYXJhUHJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSAiaHR0cHM6Ly9icm93c2VyLmd3ZGFuZy5jb20vYnJ3ZXh0L3Blcm1hbmVudF9pZD92ZXJzaW9uPTImZGVmYXVsdF9zdHlsZT1ib3R0b20mcmVmZXJyZXI9IiArIGVuY29kZVVSSUNvbXBvbmVudCh1bnNhZmVXaW5kb3cud2luZG93LmRvY3VtZW50LnJlZmVycmVyKTsKICAgICAgICAgICAgSHR0cC5KcUdldCh1cmwsIChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgIHJlcyAmJiBMb2dnZXIuZGVidWcocmVzKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEd3ZFNlcnZpY2UucHJvdG90eXBlLmluamVjdEhpc3RvcnkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBzd2l0Y2ggKExvZ2dlci5kZWJ1Zyh0aGlzLnNpdGUpLCB0aGlzLnNpdGUpIHsKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlRhb0JhbzoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlRNYWxsOgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gbmV3IFRhb0NvdXBvbiwgdGhpcy5pdGVtVXJsID0gImh0dHBzOi8vaXRlbS50YW9iYW8uY29tL2l0ZW0uaHRtP2lkPSIgKyBDb3JlLmdldFBhcigiaWQiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLkppbmdEb25nOgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gbmV3IEpkQ291cG9uLCB0aGlzLml0ZW1VcmwgPSAiaHR0cHM6Ly9pdGVtLmpkLmNvbS8iICsgKG51bGwgPT09IChfYiA9IG51bGwgPT09IChfYSA9IHVuc2FmZVdpbmRvdy5wYWdlQ29uZmlnKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EucHJvZHVjdCkgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLnNrdWlkKSArICIuaHRtbCI7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5TdU5pbmc6CiAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgU3VuaW5nQ291cG9uOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uVnA6CiAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgVnBDb3Vwb247CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5LYW9MYToKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IG5ldyBLYW9sYUNvdXBvbiwgdGhpcy5pdGVtVXJsID0gImh0dHBzOi8vZ29vZHMua2FvbGEuY29tL3Byb2R1Y3QvIiArIHVuc2FmZVdpbmRvdy5fX2thb2xhR1RNR29vZHNEYXRhLnByb2R1Y3Rfbm8gKyAiLmh0bWwiOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgRGVmQ291cG9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZmFjdG9yeS5pbml0X2h0bWwodGhpcy5nZXRIaXN0b3J5SHRtbCgpKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgIHJlcyAmJiBfdGhpcy5Jbml0UHJpY2VIaXN0b3J5KCksIF90aGlzLmZhY3RvcnkuaW5pdF9jb3Vwb25zICYmIF90aGlzLmZhY3RvcnkuaW5pdF9jb3Vwb25zKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBHd2RTZXJ2aWNlLnByb3RvdHlwZS5Jbml0UHJpY2VIaXN0b3J5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfYSwgdGhhdCwgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAkKCIjdmlwLXBsdWdpbi1vdXRzaWRlIikuc2hvdygpLCB0aGlzLnRoZW1lKCksIHRoaXMuY2hhcnRNc2coIlx1NTM4Nlx1NTNmMlx1NGVmN1x1NjgzY1x1NjdlNVx1OGJlMlx1NGUyZCIpLCAKICAgICAgICAgICAgdGhhdCA9IHRoaXMsIFJvdXRlLnF1ZXJ5SGlzdG9yeVY1KG51bGwgIT09IChfYSA9IHRoYXQuaXRlbVVybCkgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogQ29yZS51cmwpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKHJlcy5kYXRhKSwgJCgiLnZpcC1wbHVnaW4tb3V0c2lkZS1jaGFydC1jb250YWluZXIiKS5odG1sKCc8ZGl2IGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUtY2hhcnQtY29udGFpbmVyLWxpbmUiPjwvZGl2PicpLCAKICAgICAgICAgICAgICAgIGVjaGFydHMuaW5pdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lci1saW5lIiksIF90aGlzLnRoZW1lKCkpLnNldE9wdGlvbih0aGF0LmdldENoYXJ0T3B0aW9uKHJlcy5kYXRhKSksIAogICAgICAgICAgICAgICAgX3RoaXMuY2hhcnRNc2coIiIpOwogICAgICAgICAgICB9KSkuY2F0Y2goKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgUm91dGUucXVlcnlIaXN0b3J5VjQoR3dkSGVscGVyLmdldCgiaHR0cHM6Ly9icm93c2VyLmd3ZGFuZy5jb20vZXh0ZW5zaW9uL3ByaWNlX3Rvd2FyZHM/dXJsPSIgKyBlbmNvZGVVUklDb21wb25lbnQoQ29yZS51cmwpICsgIiZ2ZXI9MSIpLCAoZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzbENvbnRhaW5lciwgbXNnID0gIiI7CiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKGRhdGEpLCAicHJpY2Vfc3RhdHVzIiBpbiBkYXRhID8gKCQoIi52aXAtcGx1Z2luLW91dHNpZGUtY2hhcnQtY29udGFpbmVyIikuaHRtbCgnPGRpdiBpZD0idmlwLXBsdWdpbi1vdXRzaWRlLWNoYXJ0LWNvbnRhaW5lci1saW5lIj48L2Rpdj4nKSwgCiAgICAgICAgICAgICAgICAgICAgZWNoYXJ0cy5pbml0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aXAtcGx1Z2luLW91dHNpZGUtY2hhcnQtY29udGFpbmVyLWxpbmUiKSwgX3RoaXMudGhlbWUoKSkuc2V0T3B0aW9uKHRoYXQuZ2V0Q2hhcnRPcHRpb25Hd2QoZGF0YSkpLCAKICAgICAgICAgICAgICAgICAgICBfdGhpcy5jaGFydE1zZyhtc2cpKSA6ICgiaXNfYmFuIiBpbiBkYXRhICYmIDEgPT0gZGF0YS5pc19iYW4gJiYgMSAhPSBDb25maWcuZ2V0KCJnd2RfdmVyaWZ5X2Nsb3NlIikgJiYgKHNBbGVydC5jb25maXJtKCJcdTU0Y2VcdTU0ZGZcdTRlMGRcdTk1MTlcdTU0ZTYiLCAiXHU1Mzg2XHU1M2YyXHU0ZWY3XHU2ODNjXHU2N2U1XHU4YmUyXHU1ZjAyXHU1ZTM4LFx1NjYyZlx1NTQyNlx1NjI1M1x1NWYwMFx1OWE4Y1x1OGJjMVx1OTg3NVx1OTc2Mlx1OGZkYlx1ODg0Y1x1OWE4Y1x1OGJjMT8iLCAiXHU5YThjXHU4YmMxXHU4ZDcwXHU4ZDc3IiwgIlx1ODAwMVx1NWI1MFx1NGUwZFx1NzcwYiIsICJpbmZvIiwgIlx1NWM0Zlx1ODUzZFx1NGUwMFx1NTkyOSIpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXMuaXNDb25maXJtZWQgPyBDb3JlLm9wZW4oImh0dHBzOi8vYnJvd3Nlci5nd2RhbmcuY29tL3NsaWRlci92ZXJpZnkuaHRtbD9mcm9tVXJsPSIgKyBlbmNvZGVVUklDb21wb25lbnQoQ29yZS51cmwpKSA6IHJlcy5pc0RlbmllZCAmJiBDb25maWcuc2V0KCJnd2RfdmVyaWZ5X2Nsb3NlIiwgMSwgODY0MDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgc0FsZXJ0LmNsb3NlKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgfSkpLCBzbENvbnRhaW5lciA9ICIuc3dhbDItY29udGFpbmVyIiwgIjk5OTk5OTk5OTk5IiAhPSAkKHNsQ29udGFpbmVyKS5jc3MoInotaW5kZXgiKSAmJiAkKHNsQ29udGFpbmVyKS5jc3MoInotaW5kZXgiLCAiOTk5OTk5OTk5OTkiKSksIAogICAgICAgICAgICAgICAgICAgIHRoYXQuaGlzdG9yeVNlcnZpY2UuUHJvY2VzcygpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEd3ZFNlcnZpY2UucHJvdG90eXBlLmdldEhpc3RvcnlIdG1sID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAnPGRpdiBpZD0idmlwLXBsdWdpbi1vdXRzaWRlIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlwLXBsdWdpbi1vdXRzaWRlLXRvb2xiYXIiPlxuICAgICAgICAgICAgICAgICAgICBbXHU2MjRiXHU1ZGU1XHU2N2U1XHU4YmUyXHVmZjFhPGEgaHJlZj0iaHR0cHM6Ly90b29sLm1hbm1hbmJ1eS5jb20vbS9kaXNTaXRlUHJvLmFzcHg/Y19mcm9tPW0mdXJsPScgKyBDb3JlLnVybCArICciIHRhcmdldD0iX2JsYW5rIj5cdTYzYTVcdTUzZTNcdTRlMDA8L2E+LDxhIGhyZWY9Imh0dHA6Ly93d3cuaGlzcHJpY2UuY24vaGlzLnBocD9oaXN1cmw9JyArIENvcmUudXJsICsgJyIgdGFyZ2V0PSJfYmxhbmsiPlx1NjNhNVx1NTNlM1x1NGU4YzwvYT5dXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucyI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUiIGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUtY291cG9ucy1xcmNvZGUtaW1nIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLXRpdGxlIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jb3Vwb25zLWFjdGlvbiI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJ2aXAtcGx1Z2luLW91dHNpZGUtaGlzdG9yeSIgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5Ij5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1jaGFydC1jb250YWluZXIiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5LXRpcCI+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwvZGl2Pic7CiAgICAgICAgfSwgR3dkU2VydmljZS5wcm90b3R5cGUuY2hhcnRNc2cgPSBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgJCgiLnZpcC1wbHVnaW4tb3V0c2lkZS1oaXN0b3J5LXRpcCIpLmh0bWwobXNnKTsKICAgICAgICB9LCBHd2RTZXJ2aWNlLnByb3RvdHlwZS5nZXRDaGFydE9wdGlvbiA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgdGV4dCwgbWF4RGF0YSwgbWluRGF0YSwgY2hhcnRPcHRpb24sIHN0ZXAsIGxpbmUsIGFuYWx5c2lzVHh0ID0gIlx1NjcwMFx1NGY0ZSI7CiAgICAgICAgICAgIHJldHVybiBkYXRhLmluZm8ubWluLCB0ZXh0ID0gYW5hbHlzaXNUeHQgKyAiXHVmZjFhe3JlZHxcdWZmZTUiICsgZGF0YS5pbmZvLm1pbiArICJ9ICgge3JlZHwiICsgZGF0YS5pbmZvLm1heCArICJ9ICkiLCAKICAgICAgICAgICAgbWF4RGF0YSA9IG5ldyBQcm9tb0luZm8sIChtaW5EYXRhID0gbmV3IFByb21vSW5mbykucHJpY2UgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgCiAgICAgICAgICAgIG1pbkRhdGEuaHVtYW5QcmljZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBtYXhEYXRhLmh1bWFuUHJpY2UgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwgCiAgICAgICAgICAgIGNoYXJ0T3B0aW9uID0gbmV3IExpbmVzT3B0aW9uLCBzdGVwID0gMTAsIChjaGFydE9wdGlvbiA9IHsKICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgc3VidGV4dDogdGV4dCwKICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0U3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmljaDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdG9vbHRpcDogewogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6ICJheGlzIiwKICAgICAgICAgICAgICAgICAgICBheGlzUG9pbnRlcjogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiY3Jvc3MiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXI6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBkYXRlLCB5ZWFyLCBtb250aCwgZGF5LCBtb250aFN0ciwgZGF5U3RyLCBwcmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcyA9IHBhcmFtc1swXSwgeWVhciA9IChkYXRlID0gbmV3IERhdGUocGFyYW1zLmF4aXNWYWx1ZSkpLmdldEZ1bGxZZWFyKCksIAogICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDEsIGRheSA9IGRhdGUuZ2V0RGF0ZSgpLCBtb250aFN0ciA9IG1vbnRoLnRvU3RyaW5nKCksIAogICAgICAgICAgICAgICAgICAgICAgICBkYXlTdHIgPSBkYXkudG9TdHJpbmcoKSwgbW9udGggPCAxMCAmJiAobW9udGhTdHIgPSAiMCIgKyBtb250aCksIGRheSA8IDEwICYmIChkYXlTdHIgPSAiMCIgKyBkYXkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2UgPSBudWxsID09PSAoX2EgPSBwYXJhbXMudmFsdWVbMV0pIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVlNVx1NjcxZlx1ZmYxYSIgKyB5ZWFyICsgIi0iICsgbW9udGhTdHIgKyAiLSIgKyBkYXlTdHIgKyAiPGJyLz5cdTRlZjdcdTY4M2NcdWZmMWFcdWZmZTUiICsgKHByaWNlID0gbnVsbCA9PT0gKF9iID0gcGFyc2VGbG9hdChwcmljZSkpIHx8IHZvaWQgMCA9PT0gX2IgPyB2b2lkIDAgOiBfYi50b0ZpeGVkKDIpKSArICgiIiA9PSBwYXJhbXMudmFsdWVbMl0gPyAiIiA6ICI8YnIvPiIgKyBwYXJhbXMudmFsdWVbMl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBncmlkOiB7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCwKICAgICAgICAgICAgICAgICAgICByaWdodDogMjAsCiAgICAgICAgICAgICAgICAgICAgdG9wOiA1MCwKICAgICAgICAgICAgICAgICAgICBib3R0b206IDEwLAogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5MYWJlbDogITAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB4QXhpczogewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ0aW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHlBeGlzOiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogInZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNlcmllczogWyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICAgICAgICAgIHN0ZXA6ICJlbmQiLAogICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvdXBvbnNNYXAsIG5vd18xLCBsID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmxpc3QubGVuZ3RoID4gMCAmJiAoY291cG9uc01hcCA9IHt9LCBub3dfMSA9IG5ldyBEYXRlKCI5OTk5LTk5LTk5IDAwOjAwOjAwIikuZ2V0TWlsbGlzZWNvbmRzKCksIAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxpc3QuZm9yRWFjaCgoZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnRpbWUgPCBub3dfMSAmJiAobm93XzEgPSB2LnRpbWUpLCB2LnByaWNlID4gbWF4RGF0YS5odW1hblByaWNlICYmIChtYXhEYXRhLmh1bWFuUHJpY2UgPSB2LnByaWNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERhdGEudGltZSA9IHYudGltZSksIHYucHJpY2UgPCBtaW5EYXRhLmh1bWFuUHJpY2UgJiYgKG1pbkRhdGEuaHVtYW5QcmljZSA9IHYucHJpY2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGF0YS50aW1lID0gdi50aW1lKSwgKG5ldyBQcm9tb0luZm8pLm1zZyA9IG5ldyBNc2dJbmZvLCBwID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHYudGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWyB2LmRhdGUsIHYucHJpY2UsICIiIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwucHVzaChwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBMb2dnZXIuZGVidWcoY291cG9uc01hcCkpLCBMb2dnZXIuZGVidWcobWF4RGF0YSksIExvZ2dlci5kZWJ1ZyhtaW5EYXRhKSwgbDsKICAgICAgICAgICAgICAgICAgICB9KGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHNob3dTeW1ib2w6ICExLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMsCiAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2ZmMDAzNiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IF0KICAgICAgICAgICAgfSkueUF4aXMgPSB7CiAgICAgICAgICAgICAgICBtaW46IE1hdGguZmxvb3IoLjkgKiBtaW5EYXRhLmh1bWFuUHJpY2UgLyBzdGVwKSAqIHN0ZXAsCiAgICAgICAgICAgICAgICBtYXg6IE1hdGguY2VpbCgxLjEgKiBtYXhEYXRhLmh1bWFuUHJpY2UgLyBzdGVwKSAqIHN0ZXAKICAgICAgICAgICAgfSwgKGxpbmUgPSBudWxsID09PSAoX2EgPSBjaGFydE9wdGlvbi5zZXJpZXMpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5wb3AoKSkubWFya1BvaW50ID0gewogICAgICAgICAgICAgICAgZGF0YTogWyB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1pbkRhdGEuaHVtYW5QcmljZSwKICAgICAgICAgICAgICAgICAgICBjb29yZDogWyAxZTMgKiBtaW5EYXRhLnRpbWUsIG1pbkRhdGEuaHVtYW5QcmljZSBdLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJcdTY3MDBcdTVjMGZcdTUwM2MiLAogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImdyZWVuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF4RGF0YS5odW1hblByaWNlLAogICAgICAgICAgICAgICAgICAgIGNvb3JkOiBbIDFlMyAqIG1heERhdGEudGltZSwgbWF4RGF0YS5odW1hblByaWNlIF0sCiAgICAgICAgICAgICAgICAgICAgbmFtZTogIlx1NjcwMFx1NTkyN1x1NTAzYyIsCiAgICAgICAgICAgICAgICAgICAgaXRlbVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmVkIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gXQogICAgICAgICAgICB9LCBudWxsID09PSAoX2IgPSBjaGFydE9wdGlvbi5zZXJpZXMpIHx8IHZvaWQgMCA9PT0gX2IgfHwgX2IucHVzaChsaW5lKSwgY2hhcnRPcHRpb24uZGF0YVpvb20gPSBbIHsKICAgICAgICAgICAgICAgIHR5cGU6ICJzbGlkZXIiLAogICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICByZWFsdGltZTogITAsCiAgICAgICAgICAgICAgICBzdGFydDogMCwKICAgICAgICAgICAgICAgIGVuZDogMTAwCiAgICAgICAgICAgIH0gXSwgY2hhcnRPcHRpb247CiAgICAgICAgfSwgR3dkU2VydmljZS5wcm90b3R5cGUuZ2V0TWluUHJpY2UgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgIHZhciBtaW4sIG1pbl8xLCBtaW5EYXRlXzEsIGFuYWx5c2lzVHh0ID0gZGF0YS5hbmFseXNpcy50aXA7CiAgICAgICAgICAgIHJldHVybiBkYXRhLmFuYWx5c2lzLnByb21vX2RheXMubGVuZ3RoID4gMCA/IGFuYWx5c2lzVHh0ID0gYW5hbHlzaXNUeHQgKyAiXHVmZjFhe3JlZHxcdWZmZTUiICsgKG1pbiA9IGRhdGEuYW5hbHlzaXMucHJvbW9fZGF5c1tkYXRhLmFuYWx5c2lzLnByb21vX2RheXMubGVuZ3RoIC0gMV0pLnByaWNlICsgIn0gKCB7cmVkfCIgKyBtaW4uZGF0ZSArICJ9ICkiIDogKG1pbl8xID0gTnVtYmVyLk1JTl9WQUxVRSwgCiAgICAgICAgICAgIG1pbkRhdGVfMSA9IDAsIGRhdGEubm9wdXp6bGVfcHJvbW8uZm9yRWFjaCgoZnVuY3Rpb24oZWwpIHsKICAgICAgICAgICAgICAgIGVsLnByaWNlIDwgbWluXzEgJiYgKG1pbl8xID0gZWwucHJpY2UsIG1pbkRhdGVfMSA9IGVsLnRpbWUpOwogICAgICAgICAgICB9KSksIENvcmUuZm9ybWF0KG5ldyBEYXRlKDFlMyAqIG1pbkRhdGVfMSksICJ5eXl5LU1NLWRkIiksIGFuYWx5c2lzVHh0ID0gYW5hbHlzaXNUeHQgKyAiXHVmZjFhe3JlZHwiICsgbWluXzEgKyAifSAoIHtyZWR8IiArIG1pbkRhdGVfMSArICJ9ICkiKSwgCiAgICAgICAgICAgIGFuYWx5c2lzVHh0OwogICAgICAgIH0sIEd3ZFNlcnZpY2UucHJvdG90eXBlLmdldENoYXJ0T3B0aW9uR3dkID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICB2YXIgX2EsIF9iLCBjaGFydE9wdGlvbiwgc3RlcCwgbGluZSwgdGV4dCA9IHRoaXMuZ2V0TWluUHJpY2UoZGF0YSksIG1heERhdGEgPSBuZXcgUHJvbW9JbmZvLCBtaW5EYXRhID0gbmV3IFByb21vSW5mbzsKICAgICAgICAgICAgcmV0dXJuIG1pbkRhdGEucHJpY2UgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgbWluRGF0YS5odW1hblByaWNlID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIAogICAgICAgICAgICBtYXhEYXRhLmh1bWFuUHJpY2UgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwgY2hhcnRPcHRpb24gPSBuZXcgTGluZXNPcHRpb24sIHN0ZXAgPSAxMCwgCiAgICAgICAgICAgIChjaGFydE9wdGlvbiA9IHsKICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgc3VidGV4dDogdGV4dCwKICAgICAgICAgICAgICAgICAgICBzdWJ0ZXh0U3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmljaDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdG9vbHRpcDogewogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6ICJheGlzIiwKICAgICAgICAgICAgICAgICAgICBheGlzUG9pbnRlcjogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiY3Jvc3MiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXI6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBkYXRlLCB5ZWFyLCBtb250aCwgZGF5LCBtb250aFN0ciwgZGF5U3RyLCBwcmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcyA9IHBhcmFtc1swXSwgeWVhciA9IChkYXRlID0gbmV3IERhdGUocGFyYW1zLm5hbWUpKS5nZXRGdWxsWWVhcigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXkgPSBkYXRlLmdldERhdGUoKSwgbW9udGhTdHIgPSBtb250aC50b1N0cmluZygpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF5U3RyID0gZGF5LnRvU3RyaW5nKCksIG1vbnRoIDwgMTAgJiYgKG1vbnRoU3RyID0gIjAiICsgbW9udGgpLCBkYXkgPCAxMCAmJiAoZGF5U3RyID0gIjAiICsgZGF5KSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlID0gbnVsbCA9PT0gKF9hID0gcGFyYW1zLnZhbHVlWzFdKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICJcdTY1ZTVcdTY3MWZcdWZmMWEiICsgeWVhciArICItIiArIG1vbnRoU3RyICsgIi0iICsgZGF5U3RyICsgIjxici8+XHU0ZWY3XHU2ODNjXHVmZjFhXHVmZmU1IiArIChwcmljZSA9IG51bGwgPT09IChfYiA9IHBhcnNlRmxvYXQocHJpY2UpKSB8fCB2b2lkIDAgPT09IF9iID8gdm9pZCAwIDogX2IudG9GaXhlZCgyKSkgKyAoIiIgPT0gcGFyYW1zLnZhbHVlWzJdID8gIiIgOiAiPGJyLz4iICsgcGFyYW1zLnZhbHVlWzJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ3JpZDogewogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IDIwLAogICAgICAgICAgICAgICAgICAgIHRvcDogNTAsCiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAxMCwKICAgICAgICAgICAgICAgICAgICBjb250YWluTGFiZWw6ICEwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgeEF4aXM6IHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAidGltZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB5QXhpczogewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ2YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzZXJpZXM6IFsgewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJsaW5lIiwKICAgICAgICAgICAgICAgICAgICBzdGVwOiAiZW5kIiwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgc3RvcmVEYXRhLCBjb3Vwb25zTWFwXzEsIG5vd18yLCBkYXlUaW1lXzEsIGwgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuc3RvcmUubGVuZ3RoID4gMCAmJiAoc3RvcmVEYXRhID0gZGF0YS5zdG9yZVswXSwgZGF0YS5zdG9yZS5sZW5ndGggPiAxICYmIChzdG9yZURhdGEgPSBkYXRhLnN0b3JlWzFdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdXBvbnNNYXBfMSA9IHt9LCAobnVsbCA9PT0gKF9hID0gZGF0YS5wcm9tbykgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPiAwICYmIGRhdGEucHJvbW8uZm9yRWFjaCgoZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cG9uc01hcF8xLmhhc093blByb3BlcnR5KDFlMyAqIHYudGltZSkgfHwgKGNvdXBvbnNNYXBfMVsxZTMgKiB2LnRpbWVdID0gdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbm93XzIgPSBzdG9yZURhdGEuYWxsX2xpbmVfYmVnaW5fdGltZSwgZGF5VGltZV8xID0gODY0ZTUsIHN0b3JlRGF0YS5hbGxfbGluZS5mb3JFYWNoKChmdW5jdGlvbih2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW8sIHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID4gbWF4RGF0YS5odW1hblByaWNlICYmIChtYXhEYXRhLmh1bWFuUHJpY2UgPSB2LCBtYXhEYXRhLnRpbWUgPSBub3dfMiAvIDFlMyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA8IG1pbkRhdGEuaHVtYW5QcmljZSAmJiAobWluRGF0YS5odW1hblByaWNlID0gdiwgbWluRGF0YS50aW1lID0gbm93XzIgLyAxZTMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9tbyA9IG5ldyBQcm9tb0luZm8pLm1zZyA9IG5ldyBNc2dJbmZvLCBjb3Vwb25zTWFwXzEuaGFzT3duUHJvcGVydHkobm93XzIpICYmIChMb2dnZXIuZGVidWcoInllcyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vID0gY291cG9uc01hcF8xW25vd18yXSksIHAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbm93XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFsgbm93XzIsIHYsIGNvdXBvbnNNYXBfMS5oYXNPd25Qcm9wZXJ0eShub3dfMikgPyBwcm9tby5tc2cuY291cG9uID8gcHJvbW8ubXNnLnByb21vdGlvbiA6IHByb21vLm1zZy5jb3Vwb24gOiAiIiBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLnB1c2gocCksIG5vd18yICs9IGRheVRpbWVfMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBMb2dnZXIuZGVidWcoY291cG9uc01hcF8xKSksIExvZ2dlci5kZWJ1ZyhtYXhEYXRhKSwgTG9nZ2VyLmRlYnVnKG1pbkRhdGEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgbDsKICAgICAgICAgICAgICAgICAgICB9KGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHNob3dTeW1ib2w6ICExLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMsCiAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2ZmMDAzNiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IF0KICAgICAgICAgICAgfSkueUF4aXMgPSB7CiAgICAgICAgICAgICAgICBtaW46IE1hdGguZmxvb3IoLjkgKiBtaW5EYXRhLmh1bWFuUHJpY2UgLyBzdGVwKSAqIHN0ZXAsCiAgICAgICAgICAgICAgICBtYXg6IE1hdGguY2VpbCgxLjEgKiBtYXhEYXRhLmh1bWFuUHJpY2UgLyBzdGVwKSAqIHN0ZXAKICAgICAgICAgICAgfSwgKGxpbmUgPSBudWxsID09PSAoX2EgPSBjaGFydE9wdGlvbi5zZXJpZXMpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5wb3AoKSkubWFya1BvaW50ID0gewogICAgICAgICAgICAgICAgZGF0YTogWyB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1pbkRhdGEuaHVtYW5QcmljZSwKICAgICAgICAgICAgICAgICAgICBjb29yZDogWyAxZTMgKiBtaW5EYXRhLnRpbWUsIG1pbkRhdGEuaHVtYW5QcmljZSBdLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJcdTY3MDBcdTVjMGZcdTUwM2MiLAogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImdyZWVuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF4RGF0YS5odW1hblByaWNlLAogICAgICAgICAgICAgICAgICAgIGNvb3JkOiBbIDFlMyAqIG1heERhdGEudGltZSwgbWF4RGF0YS5odW1hblByaWNlIF0sCiAgICAgICAgICAgICAgICAgICAgbmFtZTogIlx1NjcwMFx1NTkyN1x1NTAzYyIsCiAgICAgICAgICAgICAgICAgICAgaXRlbVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmVkIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gXQogICAgICAgICAgICB9LCBudWxsID09PSAoX2IgPSBjaGFydE9wdGlvbi5zZXJpZXMpIHx8IHZvaWQgMCA9PT0gX2IgfHwgX2IucHVzaChsaW5lKSwgY2hhcnRPcHRpb24uZGF0YVpvb20gPSBbIHsKICAgICAgICAgICAgICAgIHR5cGU6ICJzbGlkZXIiLAogICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICByZWFsdGltZTogITAsCiAgICAgICAgICAgICAgICBzdGFydDogMCwKICAgICAgICAgICAgICAgIGVuZDogMTAwCiAgICAgICAgICAgIH0gXSwgY2hhcnRPcHRpb247CiAgICAgICAgfSwgR3dkU2VydmljZS5wcm90b3R5cGUudGhlbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNvbG9yOiBbICIjMmVjN2M5IiwgIiNiNmEyZGUiLCAiIzVhYjFlZiIsICIjZmZiOTgwIiwgIiNkODdhODAiLCAiIzhkOThiMyIsICIjZTVjZjBkIiwgIiM5N2I1NTIiLCAiIzk1NzA2ZCIsICIjZGM2OWFhIiwgIiMwN2EyYTQiLCAiIzlhN2ZkMSIsICIjNTg4ZGQ1IiwgIiNmNTk5NGUiLCAiI2MwNTA1MCIsICIjNTk2NzhjIiwgIiNjOWFiMDAiLCAiIzdlYjAwYSIsICIjNmY1NTUzIiwgIiNjMTQwODkiIF0sCiAgICAgICAgICAgICAgICB0aXRsZTogewogICAgICAgICAgICAgICAgICAgIGl0ZW1HYXA6IDgsCiAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICJub3JtYWwiLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiMwMDhhY2QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxlZ2VuZDogewogICAgICAgICAgICAgICAgICAgIGl0ZW1HYXA6IDgKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkYXRhUmFuZ2U6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtV2lkdGg6IDE1LAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiBbICIjMmVjN2M5IiwgIiNiNmEyZGUiIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0b29sYm94OiB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgIiMxZTkwZmYiLCAiIzFlOTBmZiIsICIjMWU5MGZmIiwgIiMxZTkwZmYiIF0sCiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlQ29sb3I6ICIjZmY0NTAwIiwKICAgICAgICAgICAgICAgICAgICBpdGVtR2FwOiA4CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdG9vbHRpcDogewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogInJnYmEoNTAsNTAsNTAsMC41KSIsCiAgICAgICAgICAgICAgICAgICAgYXhpc1BvaW50ZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJyZ2JhKDIwMCwyMDAsMjAwLDAuMikiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGF0YVpvb206IHsKICAgICAgICAgICAgICAgICAgICBkYXRhQmFja2dyb3VuZENvbG9yOiAiI2VmZWZmZiIsCiAgICAgICAgICAgICAgICAgICAgZmlsbGVyQ29sb3I6ICJyZ2JhKDE4MiwxNjIsMjIyLDAuMikiLAogICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBncmlkOiB7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICIjZWVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNhdGVnb3J5QXhpczogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogWyAiI2VlZSIgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHZhbHVlQXhpczogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjMDA4YWNkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdEFyZWE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgInJnYmEoMjUwLDI1MCwyNTAsMC4xKSIsICJyZ2JhKDIwMCwyMDAsMjAwLDAuMSkiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3BsaXRMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgIiNlZWUiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwb2xhcjogewogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZGRkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzcGxpdEFyZWE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFsgInJnYmEoMjUwLDI1MCwyNTAsMC4yKSIsICJyZ2JhKDIwMCwyMDAsMjAwLDAuMikiIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3BsaXRMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZGRkIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2xTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzAwOGFjZCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiAiZW1wdHlDaXJjbGUiLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBiYXI6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogNQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxpbmU6IHsKICAgICAgICAgICAgICAgICAgICBzeW1ib2w6ICJlbXB0eUNpcmNsZSIsCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogMwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGs6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkODdhODAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IwOiAiIzJlYzdjOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkODdhODAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yMDogIiMyZWM3YzkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2NhdHRlcjogewogICAgICAgICAgICAgICAgICAgIHN5bWJvbDogImNpcmNsZSIsCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogNAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJhZGFyOiB7CiAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiAiZW1wdHlDaXJjbGUiLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbFNpemU6IDMKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBtYXA6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIiNkZGQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICIjZDg3YTgwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiI2ZlOTk0ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogInJnYigxMDAsMCwwKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZm9yY2U6IHsKICAgICAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogIiMxZTkwZmYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY2hvcmQ6IHsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA0LAogICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmdiYSgxMjgsIDEyOCwgMTI4LCAwLjUpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob3JkU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmdiYSgxMjgsIDEyOCwgMTI4LCAwLjUpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1waGFzaXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmdiYSgxMjgsIDEyOCwgMTI4LCAwLjUpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob3JkU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAicmdiYSgxMjgsIDEyOCwgMTI4LCAwLjUpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnYXVnZTogewogICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGU6IDIyNSwKICAgICAgICAgICAgICAgICAgICBlbmRBbmdsZTogLTQ1LAogICAgICAgICAgICAgICAgICAgIGF4aXNMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3c6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBbIFsgLjIsICIjMmVjN2M5IiBdLCBbIC44LCAiIzVhYjFlZiIgXSwgWyAxLCAiI2Q4N2E4MCIgXSBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGF4aXNUaWNrOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0TnVtYmVyOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0eWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGF4aXNMYWJlbDogewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiYXV0byIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3BsaXRMaW5lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogMjIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJhdXRvIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBwb2ludGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1LAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogImF1dG8iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0aXRsZTogewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3R5bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAiIzMzMyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICJhdXRvIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICJcdTVmYWVcdThmNmZcdTk2YzVcdTllZDEsIEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sIEd3ZFNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBHd2RIZWxwZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBHd2RIZWxwZXIoKSB7fQogICAgICAgIHJldHVybiBHd2RIZWxwZXIuZ2V0ID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHZhciBmcm9tX3R5cGUgPSAiIiwgRyA9IEd3ZEhlbHBlcjsKICAgICAgICAgICAgcmV0dXJuIEd3ZEhlbHBlci5mcm9tX3R5cGUgJiYgKGZyb21fdHlwZSA9ICImZnJvbV90eXBlPSIgKyBHd2RIZWxwZXIuZnJvbV90eXBlKSwgCiAgICAgICAgICAgICh1cmwgPSBHd2RIZWxwZXIud3JhcCh1cmwpICsgInZlcnNpb249IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpICsgIiZmcm9tX2RldmljZT0iICsgRy5mcm9tX2RldmljZSArIGZyb21fdHlwZSkuaW5jbHVkZXMoInVuaW9uPSIpIHx8ICh1cmwgKz0gIiZ1bmlvbj0iICsgRy51bmlvbiksIAogICAgICAgICAgICBHLmNyYzY0ICYmICh1cmwgKz0gIiZjcmM2ND0xIiksIHVybDsKICAgICAgICB9LCBHd2RIZWxwZXIud3JhcCA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB2YXIgc3RhcnQsIGNhbGxiYWNrLCBmb3JtYXQsIGZwLCBHID0gR3dkSGVscGVyOwogICAgICAgICAgICByZXR1cm4gdXJsID8gKHN0YXJ0ID0gIj8iLCBjYWxsYmFjayA9ICJjYWxsYmFjaz0/JiIsIHVybC5pbmRleE9mKCI/IikgPiAtMSAmJiAoc3RhcnQgPSAiJiIpLCAKICAgICAgICAgICAgZm9ybWF0ID0gImZvcm1hdD1qc29ucCYiLCBjYWxsYmFjayA9ICIiLCBmb3JtYXQgPSAiZm9ybWF0PWpzb24mIiwgZnAgPSAiIiwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oImd3ZGFuZy1mcCIpICYmIChmcCA9ICJmcD0iICsgQ29uZmlnLmdldChHLmd3ZF9mcF9rZXkpICsgIiZkZnA9IiArIENvbmZpZy5nZXQoRy5nd2RfZGZwX2tleSkgKyAiJiIpLCAKICAgICAgICAgICAgIiIgKyB1cmwgKyBzdGFydCArIGNhbGxiYWNrICsgZm9ybWF0ICsgZnApIDogdXJsOwogICAgICAgIH0sIEd3ZEhlbHBlci52ZXJzaW9uID0gIiIsIEd3ZEhlbHBlci5mcm9tX2RldmljZSA9ICJkZWZhdWx0IiwgR3dkSGVscGVyLmZyb21fdHlwZSA9ICIiLCAKICAgICAgICBHd2RIZWxwZXIudW5pb24gPSAidW5pb25fZ3dkYW5nIiwgR3dkSGVscGVyLmNyYzY0ID0gITAsIEd3ZEhlbHBlci5nd2RfZnBfa2V5ID0gImd3ZF9mcF9rZXkiLCAKICAgICAgICBHd2RIZWxwZXIuZ3dkX2RmcF9rZXkgPSAiZ3dkX2RmcF9rZXkiLCBHd2RIZWxwZXI7CiAgICB9KCksIGNzc18yNDh6JDcgPSAiLnRiLXByb3AgLnRiLWltZyBsaSBhIHtcbiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teDogNXB4ICFpbXBvcnRhbnQ7XG59XG5cbi50Yi1wcm9wIC50Yi1pbWcgbGkgc3BhbiB7XG4gICAgdGV4dC1pbmRlbnQ6IDFlbSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogMCA1cHggIWltcG9ydGFudDtcbiAgICBtYXJnaW4tbGVmdDogMzVweDtcbn1cbiIsIAogICAgc3R5bGVJbmplY3QoY3NzXzI0OHokNyksIFRhb0Jhb1NlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBUYW9CYW9TZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBudWxsICE9PSBfc3VwZXIgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9hcHBOYW1lID0gIlRhb0Jhb1NlcnZpY2UiLCBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlRhb0JhbywgL3Rhb2Jhb1wuY29tXC8vaSBdLCBbIFNpdGVFbnVtLlRNYWxsLCAvdG1hbGxcLihjb218aGspXC8vaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMuVXJsVGFnID0gIldhbmRoaV9xTGluayIsIF90aGlzLmhpc3RvcnlTZXJ2aWNlID0gbmV3IEd3ZFNlcnZpY2UsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKFRhb0Jhb1NlcnZpY2UsIF9zdXBlciksIFRhb0Jhb1NlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDb3JlLmFwcGVuZENzcygiLy9jZG4uaHVpemhlay5jb20vc3R5bGUvZXh0ZW5zdGlvbi9odWkuc3R5bGUuY3NzIik7CiAgICAgICAgfSwgVGFvQmFvU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuaW5pdCgpLCB0aGlzLmhpc3RvcnlTZXJ2aWNlLmxpbmtUZXN0KCkgJiYgdGhpcy5oaXN0b3J5U2VydmljZS5Qcm9jZXNzKCk7CiAgICAgICAgfSwgVGFvQmFvU2VydmljZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2EsIGl0ZW1JZCwga2V5LCBkLCBfdGhpcyA9IHRoaXMsIGluaXQgPSAiPGRpdiBpZD0nd2FuZGhpX2Rpdic+PHRhYmxlIGNsYXNzPSd3YW5kaGlfdGFiJyBpZD0nd2FuZGhpX3RhYmxlJz48dGhlYWQ+PHRyPjx0aD48YiBzdHlsZT0nY3Vyc29yOnBvaW50ZXInPlx1NGYxOFx1NjBlMFx1NTIzODwvYj48L3RoPjx0aD5cdTUyMzhcdTU0MGU8L3RoPjx0aD5cdTY3MDkgXHU2NTQ4IFx1NjcxZjwvdGg+PHRoPlx1NjRjZFx1NGY1YzwvdGg+PC90cj48L3RoZWFkPjx0cj48dGQgY29sc3Bhbj0nNCc+XHU2YjYzXHU1NzI4XHU2N2U1XHU4YmUyXHU0ZjE4XHU2MGUwXHU0ZmUxXHU2MDZmXHVmZjBjXHU4YmY3XHU3YTBkXHU1MDE5Li4uPC90ZD48L3RyPjwvdGFibGU+PC9kaXY+IjsKICAgICAgICAgICAgJCgiI0pfTGlua0Jhc2tldCIpLnBhcmVudCgpLnBhcmVudCgpLnByZXBlbmQoaW5pdCksICQoIi5KX0xpbmtBZGQiKS5wYXJlbnQoKS5wYXJlbnQoKS5wcmVwZW5kKGluaXQpLCAKICAgICAgICAgICAgJCgiW2NsYXNzKj1CYXNpY0NvbnRlbnQtLWFjdGlvbnNdIikucHJlcGVuZChpbml0KSwgKG51bGwgPT09IChfYSA9IHRoaXMucnVsZXMuZ2V0KFNpdGVFbnVtLlRhb0JhbykpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS50ZXN0KENvcmUuY3VycmVudFVybCgpKSkgPyAkKCIjd2FuZGhpX3RhYmxlIikuYWRkQ2xhc3MoIndhbmRoaV90YWJfdGFvYmFvIikgOiAkKCIjd2FuZGhpX3RhYmxlIikuYWRkQ2xhc3MoIndhbmRoaV90YWJfdG1hbGwiKSwgCiAgICAgICAgICAgIGl0ZW1JZCA9IENvcmUuZ2V0UGFyKCJpZCIpLCBrZXkgPSAidGRfc18iICsgaXRlbUlkLCAoZCA9IENvbmZpZy5nZXQoa2V5LCAhMSkpID8gdGhpcy5pbml0RWxlbWVudChkKSA6IFJvdXRlLnF1ZXJ5Q291cG9ucyhpdGVtSWQsIChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICBDb25maWcuc2V0KGtleSwgZGF0YSwgNDMyMDApLCBfdGhpcy5pbml0RWxlbWVudChkYXRhKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFRhb0Jhb1NlcnZpY2UucHJvdG90eXBlLmluaXRFbGVtZW50ID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICB2YXIgX2EsIHJvdzsKICAgICAgICAgICAgJCgiI3dhbmRoaV90YWJsZSB0Ym9keSB0ciIpLnJlbW92ZSgpLCByb3cgPSAiIiwgZGF0YS5jb2RlICYmIChudWxsID09PSAoX2EgPSBkYXRhLmRhdGEpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCAmJiAic3RyaW5nIiAhPSB0eXBlb2YgZGF0YS5kYXRhID8gZGF0YS5kYXRhLmZvckVhY2goKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJvdyArPSAiPHRyPjx0ZD4iICsgZS5xdWFuX2NvbnRleHQgKyAiPC90ZD48dGQ+IiArIGUuYWZ0ZXJfcHJpY2UgKyAiPC90ZD48dGQ+IiArIGUucXVhbl90aW1lICsgIjwvdGQ+PHRkPjxiIG9uY2xpY2s9d2luZG93Lm9wZW4oZGVjb2RlVVJJQ29tcG9uZW50KCciICsgZS5xdWFuX2xpbmsgKyAiJykpIHN0eWxlPSdjdXJzb3I6cG9pbnRlcic+XHU5ODg2XHU1M2Q2PC9iPjwvdGQ+PC90cj4iOwogICAgICAgICAgICB9KSkgOiByb3cgPSAiPHRyPjx0ZCBjb2xzcGFuPSc0Jz5cdThmZDlcdTRlMmFcdTU1NDZcdTU0YzFcdTZjYTFcdTY3MDlcdThkODVcdTUwM2NcdTRmMThcdTYwZTBcdTUyMzg8L3RkPjwvdHI+IiwgCiAgICAgICAgICAgICQoIiN3YW5kaGlfdGFibGUgdGJvZHkiKS5hcHBlbmQocm93KTsKICAgICAgICB9LCBUYW9CYW9TZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgY29udGFpbmVyID0gbmV3IE1hcCwgQ29udGFpbmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gQ29udGFpbmVyKCkge30KICAgICAgICByZXR1cm4gQ29udGFpbmVyLlJlZ2lzdGUgPSBmdW5jdGlvbih0eXBlLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLnByb2Nlc3NOYW1lKHR5cGUubmFtZSk7CiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaGFzKGNsYXNzTmFtZSkgPyBjb250YWluZXIuZ2V0KGNsYXNzTmFtZSkgOiBjbGFzc05hbWUgPyAoY29udGFpbmVyLnNldChjbGFzc05hbWUsIHdpbmRvdy5SZWZsZWN0LmNvbnN0cnVjdCh0eXBlLCBhcmdzKSksIAogICAgICAgICAgICBjb250YWluZXIuZ2V0KGNsYXNzTmFtZSkpIDogdm9pZCAwOwogICAgICAgIH0sIENvbnRhaW5lci5wcm9jZXNzTmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICB9LCBDb250YWluZXIuUmVxdWlyZSA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnaXN0ZSh0eXBlLCBbXSk7CiAgICAgICAgfSwgQ29udGFpbmVyOwogICAgfSgpLCBjc3NfMjQ4eiQ2ID0gIi5va3YtYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nOiA2cHggMTZweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBvdXRsaW5lOiAwO1xuICBsaW5lLWhlaWdodDogMS41O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjNWQ5ZTg7XG4gIGJvcmRlci10b3AtY29sb3I6ICNjNWQ5ZTg7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogI2M1ZDllODtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2M1ZDllODtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICNjNWQ5ZTg7XG4gIGJvcmRlci1yYWRpdXM6IDAuN3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycztcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLm9rdi1idG4tcHJpbWFyeSB7XG4gIGJvcmRlci1jb2xvcjogIzYxOTBlODtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzYxOTBlODtcbiAgY29sb3I6ICNmZmY7XG59XG4ub2t2LWJ0bi1wcmltYXJ5OmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzc5YTFlYjtcbiAgYm9yZGVyLWNvbG9yOiAjNzlhMWViO1xufVxuLm9rdi1idG4tcHJpbWFyeTphY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTc4MmQxO1xuICBib3JkZXItY29sb3I6ICM1NzgyZDE7XG59XG4ub2t2LWJ0bi1zdWNjZXNzIHtcbiAgYm9yZGVyLWNvbG9yOiAjMTNjZTY2O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTNjZTY2O1xuICBjb2xvcjogI2ZmZjtcbn1cbi5va3YtYnRuLXN1Y2Nlc3M6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzZkNTdkO1xuICBib3JkZXItY29sb3I6ICMzNmQ1N2Q7XG59XG4ub2t2LWJ0bi1zdWNjZXNzOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxMWI5NWM7XG4gIGJvcmRlci1jb2xvcjogIzExYjk1Yztcbn1cbi5va3YtYnRuLWVycm9yIHtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0OTQ5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY0OTQ5O1xuICBjb2xvcjogI2ZmZjtcbn1cbi5va3YtYnRuLWVycm9yOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjQ2NDtcbiAgYm9yZGVyLWNvbG9yOiAjZmY2NDY0O1xufVxuLm9rdi1idG4tZXJyb3I6YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2NDI0MjtcbiAgYm9yZGVyLWNvbG9yOiAjZTY0MjQyO1xufVxuLm9rdi1iZy1waW5rIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJvcmRlci1jb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZiNzI5OTtcbn1cbi5va3YtYmctcGluazpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYzhiYWI7XG59XG4ub2t2LXRvb2xzLWJpbGkge1xuICBwYWRkaW5nLXRvcDogNXB4O1xufVxuLnZpZGVvLWluZm8tZGV0YWlsIHtcbiAgZmxleC13cmFwOiB3cmFwICFpbXBvcnRhbnQ7XG4gIG92ZXJmbG93OiB1bnNldCAhaW1wb3J0YW50O1xufVxuLnZpZGVvLWluZm8tY29udGFpbmVyIHtcbiAgaGVpZ2h0OiAxMjRweCAhaW1wb3J0YW50O1xufVxuLm9rdi1idG4ge1xuICBwYWRkaW5nOiAycHggMTZweCAhaW1wb3J0YW50O1xufVxuLmJpbGktdG9wLWJ1dHRvbiB7XG4gIG1hcmdpbi1yaWdodDogMC43cmVtO1xufVxuLmJpbGktdGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYmlsaS10YWJsZSB0ZCxcbi5iaWxpLXRhYmxlIHRoIHtcbiAgaGVpZ2h0OiA0MHB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlY2VjZWM7XG59XG4uYmlsaS10YWJsZS1jZWxsIHtcbiAgcGFkZGluZzogMCAxNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VjZWNlYztcbn1cbi5hdC10YWJsZS10Ym9keSA+IHRyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZmFmZTtcbn1cbi5iaWxpLXRhYmxlLXNtYWxsIHtcbiAgZm9udC1zaXplOiAxMXB4O1xufVxuLmJpbGktdGFibGUtaGVhZCB7XG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gIGJvcmRlci1zcGFjaW5nOiAwO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuLmJpbGktdGFibGUtaGVhZCB0ciB0aCB7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4iLCAKICAgIHN0eWxlSW5qZWN0KGNzc18yNDh6JDYpLCBmdW5jdGlvbihDb25maWdFbnVtKSB7CiAgICAgICAgQ29uZmlnRW51bS5XYW5nUGFuX0FyaWFfSG9zdCA9ICJXYW5nUGFuX0FyaWFfSG9zdCIsIENvbmZpZ0VudW0uV2FuZ1Bhbl9BcmlhX1BvcnQgPSAiV2FuZ1Bhbl9BcmlhX1BvcnQiLCAKICAgICAgICBDb25maWdFbnVtLldhbmdQYW5fQXJpYV9Ub2tlbiA9ICJXYW5nUGFuX0FyaWFfVG9rZW4iLCBDb25maWdFbnVtLldhbmdQYW5fQXJpYV9QYXRoID0gIldhbmdQYW5fQXJpYV9QYXRoIiwgCiAgICAgICAgQ29uZmlnRW51bS5XYW5nUGFuX0FyaWFfRGlyID0gIldhbmdQYW5fQXJpYV9EaXIiLCBDb25maWdFbnVtLkppZXhpX0N1c19JbnRlcmZhY2UgPSAiSmlleGlfQ3VzX0ludGVyZmFjZSIsIAogICAgICAgIENvbmZpZ0VudW0uSmlleGlfSW50ZXJmYWNlX0xhc3RfUGxheSA9ICJKaWV4aV9JbnRlcmZhY2VfTGFzdF9QbGF5IiwgQ29uZmlnRW51bS5KaWV4aV9JbnRlcmZhY2VfTGFzdF9QbGF5X1VybCA9ICJKaWV4aV9JbnRlcmZhY2VfTGFzdF9QbGF5X1VybCIsIAogICAgICAgIENvbmZpZ0VudW0uQmlsaVBjX0NvdmVyID0gImJpbGlfcGNfY292ZXIiLCBDb25maWdFbnVtLkJpbGlQY19WaWRlb19Eb3dubG9hZCA9ICJiaWxpX3BjX3ZpZGVvX2Rvd25sb2FkIiwgCiAgICAgICAgQ29uZmlnRW51bS5CaWxpUGNfVHJpcGxlX0NsaWNrID0gImJpbGlfcGNfdHJpcGxlX2NsaWNrIiwgQ29uZmlnRW51bS5BdXRvSnVtcF9aaGlIdSA9ICJBdXRvSnVtcF9aaGlIdSIsIAogICAgICAgIENvbmZpZ0VudW0uQXV0b0p1bXBfQ1NETiA9ICJBdXRvSnVtcF9DU0ROIiwgQ29uZmlnRW51bS5BdXRvSnVtcF9KaWFuU2h1ID0gIkF1dG9KdW1wX0ppYW5TaHUiLCAKICAgICAgICBDb25maWdFbnVtLkF1dG9KdW1wX0dpdGVlID0gIkF1dG9KdW1wX0dpdGVlIiwgQ29uZmlnRW51bS5BdXRvSnVtcF9KdWVKaW4gPSAiQXV0b0p1bXBfSnVlSmluIiwgCiAgICAgICAgQ29uZmlnRW51bS5BdXRvSnVtcF9XZWlibyA9ICJBdXRvSnVtcF9XZWlibyIsIENvbmZpZ0VudW0uQXV0b0p1bXBfVHVYaWFvQ2hhbyA9ICJBdXRvSnVtcF9UdVhpYW9DaGFvIiwgCiAgICAgICAgQ29uZmlnRW51bS5BdXRvSnVtcF9Pc0NoID0gIkF1dG9KdW1wX09zQ2giLCBDb25maWdFbnVtLkF1dG9KdW1wX0FpRmFEaWFuID0gIkF1dG9KdW1wX0FpRmFEaWFuIiwgCiAgICAgICAgQ29uZmlnRW51bS5BdXRvSnVtcF9CYWlkdSA9ICJBdXRvSnVtcF9CYWlkdSIsIENvbmZpZ0VudW0uQXV0b0p1bXBfRG91QmFuID0gIkF1dG9KdW1wX0RvdUJhbiIsIAogICAgICAgIENvbmZpZ0VudW0uQXV0b0p1bXBfZzE3MTczID0gIkF1dG9KdW1wX2cxNzE3MyIsIENvbmZpZ0VudW0uQXV0b0p1bXBfVGVuY2VudERvYyA9ICJBdXRvSnVtcF9UZW5jZW50RG9jIiwgCiAgICAgICAgQ29uZmlnRW51bS5DU0ROX09wSW1nTGluayA9ICJjc2RuX29wX2ltZ19saW5rIiwgQ29uZmlnRW51bS5DU0ROX09wQWRDbGVhbiA9ICJjc2RuX29wX2FkX2NsZWFuIiwgCiAgICAgICAgQ29uZmlnRW51bS5DU0ROX09wQXJ0aWNsZUNsZWFuID0gImNzZG5fb3BfYXJ0aWNsZV9jbGVhbiIsIENvbmZpZ0VudW0uQ1NETl9PcENvbW1lbnRDbGVhbiA9ICJjc2RuX29wX2NvbW1lbnRfY2xlYW4iLCAKICAgICAgICBDb25maWdFbnVtLkNTRE5fT3BDbGlwYm9hcmRDbGVhbiA9ICJjc2RuX29wX2NsaXBib2FyZF9jbGVhbiIsIENvbmZpZ0VudW0uU2VhcmNoX0hlbHBlcl9Td2l0Y2ggPSAic2VhcmNoX2hlbHBlcl9zd2l0Y2giLCAKICAgICAgICBDb25maWdFbnVtLlNlYXJjaF9PcHRNZW51TWV0aG9kID0gInNlYXJjaF9vcHRfbWVudV9tZXRob2QiLCBDb25maWdFbnVtLlNlYXJjaF9PcHRNZW51UG9zID0gInNlYXJjaF9vcHRfbWVudV9wb3MiOwogICAgfShDb25maWdFbnVtIHx8IChDb25maWdFbnVtID0ge30pKSwgVG9hc3QgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBUb2FzdCgpIHt9CiAgICAgICAgcmV0dXJuIFRvYXN0LnN1Y2Nlc3MgPSBmdW5jdGlvbihzdHIsIHRpbWUsIHBvc2l0aW9uKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IDMpLCB2b2lkIDAgPT09IHBvc2l0aW9uICYmIChwb3NpdGlvbiA9ICJ0b3AiKSwgc2VtaVVpLk5vdGlmaWNhdGlvbi5zdWNjZXNzKHsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHN0ciwKICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB0aW1lLAogICAgICAgICAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIFRvYXN0Lndhcm5pbmcgPSBmdW5jdGlvbihzdHIsIHRpbWUsIHBvc2l0aW9uKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IDMpLCB2b2lkIDAgPT09IHBvc2l0aW9uICYmIChwb3NpdGlvbiA9ICJ0b3AiKSwgc2VtaVVpLk5vdGlmaWNhdGlvbi53YXJuaW5nKHsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHN0ciwKICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB0aW1lLAogICAgICAgICAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgICAgICAgICAgekluZGV4OiA5OTk5OTkKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgVG9hc3QuZXJyb3IgPSBmdW5jdGlvbihzdHIsIHRpbWUsIHBvc2l0aW9uKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdGltZSAmJiAodGltZSA9IDMpLCB2b2lkIDAgPT09IHBvc2l0aW9uICYmIChwb3NpdGlvbiA9ICJ0b3AiKSwgc2VtaVVpLk5vdGlmaWNhdGlvbi5lcnJvcih7CiAgICAgICAgICAgICAgICBjb250ZW50OiBzdHIsCiAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGltZSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbgogICAgICAgICAgICB9KTsKICAgICAgICB9LCBUb2FzdDsKICAgIH0oKSwgQmlsaUltZ1NlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBCaWxpSW1nU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uQmlsaUJpbGksIC93d3dcLmJpbGliaWxpXC5jb21cL3ZpZGVvXC9bYXZ8YnZdKi9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fYXBwTmFtZSA9ICJiaWxpYmlsaSIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKEJpbGlJbWdTZXJ2aWNlLCBfc3VwZXIpLCBCaWxpSW1nU2VydmljZS5saXN0SHRtbCA9IGZ1bmN0aW9uKGxpc3QpIHsKICAgICAgICAgICAgdmFyIHJvd3MgPSAiIjsKICAgICAgICAgICAgcmV0dXJuIGxpc3QuZm9yRWFjaCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgcm93cyArPSAnPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPicgKyBlLnBhcnQgKyAnPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj48YnV0dG9uIGNsYXNzPSJva3YtYnRuIG9rdi1idG4tcHJpbWFyeSBiaWxpLWRvd24taXRlbSIgZGF0YS1jaWQ9IicgKyBlLmNpZCArICciIGRhdGEtcGFydC10aXRsZT0iJyArIGUucGFydCArICciPlx1NGUwYlx1OGY3ZDwvYnV0dG9uPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+JzsKICAgICAgICAgICAgfSkpLCAnPGRpdiBzdHlsZT0iaGVpZ2h0OiAzMHJlbSI+PHRhYmxlIGNsYXNzPSJiaWxpLXRhYmxlIGJpbGktdGFibGUtc21hbGwiPlxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3M9ImJpbGktdGFibGUtaGVhZCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1NjgwN1x1OTg5ODwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1NjRjZFx1NGY1YzwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9ImF0LXRhYmxlLXRib2R5Ij4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgJyArIHJvd3MgKyAiXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+ICAgIFxuICAgICAgICAgICAgICAgIDwvdGFibGU+PC9kaXY+IjsKICAgICAgICB9LCBCaWxpSW1nU2VydmljZS5nZXRRdWFsaXR5ID0gZnVuY3Rpb24oaWQpIHsKICAgICAgICAgICAgc3dpdGNoIChpZCkgewogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICByZXR1cm4gIjM2MFAgXHU2ZDQxXHU3NTQ1IjsKCiAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgIHJldHVybiAiNDgwUCBcdTZlMDVcdTY2NzAiOwoKICAgICAgICAgICAgICBjYXNlIDY0OgogICAgICAgICAgICAgICAgcmV0dXJuICI3MjBQIFx1OWFkOFx1NmUwNSI7CgogICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICByZXR1cm4gIjEwODBQIFx1OWFkOFx1NmUwNSI7CgogICAgICAgICAgICAgIGNhc2UgMTEyOgogICAgICAgICAgICAgICAgcmV0dXJuICIxMDgwUCA2MFx1NWUyNyI7CgogICAgICAgICAgICAgIGNhc2UgMzAyODA6CiAgICAgICAgICAgICAgY2FzZSAzMDI2MDoKICAgICAgICAgICAgICAgIHJldHVybiAiMzIwS2JwcyI7CgogICAgICAgICAgICAgIGNhc2UgMzAyNTk6CiAgICAgICAgICAgICAgICByZXR1cm4gIjEyOEticHMiOwoKICAgICAgICAgICAgICBjYXNlIDMwMjU3OgogICAgICAgICAgICAgICAgcmV0dXJuICI2NEticHMiOwoKICAgICAgICAgICAgICBjYXNlIDMwMjU1OgogICAgICAgICAgICAgICAgcmV0dXJuICJBVURJTyI7CgogICAgICAgICAgICAgIGNhc2UgMzAyNTE6CiAgICAgICAgICAgICAgICByZXR1cm4gIkZMQUMiOwoKICAgICAgICAgICAgICBjYXNlIDMwMjUwOgogICAgICAgICAgICAgICAgcmV0dXJuICJBVE1PUyI7CgogICAgICAgICAgICAgIGNhc2UgMzAyMzI6CiAgICAgICAgICAgICAgICByZXR1cm4gIjEyOEticHMiOwoKICAgICAgICAgICAgICBjYXNlIDMwMjE2OgogICAgICAgICAgICAgICAgcmV0dXJuICI2NEticHMiOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICJcdTY3MmFcdTc3ZTUiOwogICAgICAgICAgICB9CiAgICAgICAgfSwgQmlsaUltZ1NlcnZpY2UudmlkZW9MaXN0SHRtbCA9IGZ1bmN0aW9uKHZpZGVvTGlzdCwgYXVkaW9MaXN0LCBkdXJhdGlvbiwgbXA0cykgewogICAgICAgICAgICB2YXIgc2l6ZUZvcm1hdCwgcm93cywgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBtcDRzICYmIChtcDRzID0gW10pLCBzaXplRm9ybWF0ID0gZnVuY3Rpb24oc2l6ZSkgewogICAgICAgICAgICAgICAgdm9pZCAwID09PSBzaXplICYmIChzaXplID0gMCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciB1bml0ID0gWyAiQiIsICJLIiwgIk0iLCAiRyIgXSwgaSA9IHVuaXQubGVuZ3RoIC0gMSwgZGV4ID0gTWF0aC5wb3coMTAyNCwgaSksIHZvciA9IE1hdGgucG93KDFlMywgaSk7IGRleCA+IDE7ICkgewogICAgICAgICAgICAgICAgICAgIGlmIChzaXplID49IHZvcikgewogICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gTnVtYmVyKChzaXplIC8gZGV4KS50b0ZpeGVkKDIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRleCAvPSAxMDI0LCB2b3IgLz0gMWUzLCBpLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZSA/IHNpemUgKyB1bml0W2ldIDogIk4vQSI7CiAgICAgICAgICAgIH0sIHJvd3MgPSAiIiwgdmlkZW9MaXN0LmZvckVhY2goKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJvd3MgKz0gJzx0cj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj5cdTg5YzZcdTk4OTE8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPicgKyBfdGhpcy5nZXRRdWFsaXR5KGUuaWQpICsgJzwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+JyArIHNpemVGb3JtYXQoZS5iYW5kd2lkdGggKiBkdXJhdGlvbiAvIDgpICsgJzwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+JyArIGUuZnJhbWVSYXRlICsgJzwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+JyArIGUuY29kZWNzICsgJzwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+PGJ1dHRvbiBjbGFzcz0ib2t2LWJ0biBva3YtYnRuLXByaW1hcnkgYmlsaS1kb3duLXZpZGVvLWl0ZW0iIGRhdGEtdXJsPSInICsgZS5iYXNlVXJsICsgJyIgZGF0YS10eXBlPSIxIj5cdTRlMGJcdThmN2Q8L2J1dHRvbj48L3RkPlxuICAgICAgICAgICAgPC90cj4nOwogICAgICAgICAgICB9KSksIGF1ZGlvTGlzdC5mb3JFYWNoKChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICByb3dzICs9ICc8dHI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+XHU5N2YzXHU5ODkxPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj4nICsgX3RoaXMuZ2V0UXVhbGl0eShlLmlkKSArICc8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPicgKyBzaXplRm9ybWF0KGUuYmFuZHdpZHRoICogZHVyYXRpb24gLyA4KSArICc8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPicgKyBlLmZyYW1lUmF0ZSArICc8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPicgKyBlLmNvZGVjcyArICc8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPjxidXR0b24gY2xhc3M9Im9rdi1idG4gb2t2LWJ0bi1wcmltYXJ5IGJpbGktZG93bi12aWRlby1pdGVtIiBkYXRhLXVybD0iJyArIGUuYmFzZVVybCArICciIGRhdGEtdHlwZT0iMiI+XHU0ZTBiXHU4ZjdkPC9idXR0b24+PC90ZD5cbiAgICAgICAgICAgIDwvdHI+JzsKICAgICAgICAgICAgfSkpLCBtcDRzLmZvckVhY2goKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJvd3MgPSAnPHRyPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1OTdmM1x1ODljNlx1NWRmMlx1NTQwOFx1NWU3NjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+JyArIF90aGlzLmdldFF1YWxpdHkoZS5xdWFsaXR5KSArICc8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPicgKyBzaXplRm9ybWF0KGUuc2l6ZSkgKyAnPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj5NUDQ8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPk1QNDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+PGJ1dHRvbiBjbGFzcz0ib2t2LWJ0biBva3YtYnRuLXByaW1hcnkgYmlsaS1kb3duLXZpZGVvLWl0ZW0iIGRhdGEtdXJsPSInICsgZS51cmwgKyAnIiBkYXRhLXR5cGU9IjEiPlx1NGUwYlx1OGY3ZDwvYnV0dG9uPjwvdGQ+XG4gICAgICAgICAgICA8L3RyPicgKyByb3dzOwogICAgICAgICAgICB9KSksICdcbjxkaXYgc3R5bGU9ImhlaWdodDogMzByZW0iPlxuICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDIwcHgiPlx1NmNlOFx1NjEwZjpcdTk3ZjNcdTg5YzZcdTk4OTFcdTY2MmY8YiBzdHlsZT0iY29sb3I6cmVkIj5cdTUyMDZcdTVmMDA8L2I+XHU3Njg0LFx1OGJmN1x1NGUwYlx1OGY3ZFx1NTQwZVx1ODFlYVx1ODg0Y1x1NTQwOFx1NWU3NjxhIGhyZWY9Imh0dHBzOi8vd2lraS53YW5kaGkuY29tL3poLWNuL0Rvd25sb2FkLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5cdTcwYjlcdTYyMTFcdTRlMGJcdThmN2RcdTU0MDhcdTVlNzZcdTVkZTVcdTUxNzc8L2E+PC9kaXY+XG4gICAgPHRhYmxlIGNsYXNzPSJiaWxpLXRhYmxlIGJpbGktdGFibGUtc21hbGwiPlxuICAgICAgICA8dGhlYWQgY2xhc3M9ImJpbGktdGFibGUtaGVhZCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1N2M3Ylx1NTc4YjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1NTRjMVx1OGQyODwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1NTkyN1x1NWMwZjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1NzgwMVx1NzM4NzwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1N2YxNlx1NzgwMTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1NjRjZFx1NGY1YzwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9ImF0LXRhYmxlLXRib2R5Ij4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgJyArIHJvd3MgKyAiXG4gICAgICAgIDwvdGJvZHk+ICAgIFxuICAgIDwvdGFibGU+XG48L2Rpdj4iOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCBCaWxpSW1nU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENvcmUuYXV0b0xhenlsb2FkKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgICAgICAgICByZXR1cm4gKChudWxsID09PSAoX2EgPSAkKCIucmVwbHktYm94LXRleHRhcmVhIikpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCB8fCAobnVsbCA9PT0gKF9iID0gJCgiLmNvbW1lbnQtc3VibWl0IikpIHx8IHZvaWQgMCA9PT0gX2IgPyB2b2lkIDAgOiBfYi5sZW5ndGgpID4gMCkgJiYgKCQoIi52aWRlby1pbmZvLWRldGFpbCIpLmFwcGVuZCgnPGRpdiBjbGFzcz0idmlkZW8taW5mby1kZXRhaWwtbGlzdCBva3YtdG9vbHMtYmlsaSI+PC9kaXY+JyksIAogICAgICAgICAgICAgICAgITApOwogICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQ29uZmlnLmdldChDb25maWdFbnVtLkJpbGlQY19Db3ZlciwgITApICYmIEJpbGlJbWdTZXJ2aWNlLmFkZF9pbWdfYnRuKCksIENvbmZpZy5nZXQoQ29uZmlnRW51bS5CaWxpUGNfVmlkZW9fRG93bmxvYWQsICEwKSAmJiBCaWxpSW1nU2VydmljZS5hZGRfZG93bl9idG4oKSwgCiAgICAgICAgICAgICAgICBDb25maWcuZ2V0KENvbmZpZ0VudW0uQmlsaVBjX1RyaXBsZV9DbGljaywgITApICYmIEJpbGlJbWdTZXJ2aWNlLmFkZF90cmlwbGVfYnRuKCk7CiAgICAgICAgICAgIH0pLCAxKTsKICAgICAgICB9LCBCaWxpSW1nU2VydmljZS5hZGRfaW1nX2J0biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgICQodGhpcy5ob29rU2VsZWN0b3IpLmxhc3QoKS5hcHBlbmQoQmlsaUltZ1NlcnZpY2UuY292ZXJCdG4pLCAkKCJib2R5Iikub24oImNsaWNrIiwgIiNmaW5kaW1nIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGFpZCA9IHVuc2FmZVdpbmRvdy5fX0lOSVRJQUxfU1RBVEVfXy52aWRlb0RhdGEuYWlkOwogICAgICAgICAgICAgICAgdGhhdC5nZXRWaWRlb0luZm8oYWlkKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXMgPyBzQWxlcnQuc2hvd0ltZyhyZXMucGljLCAiXHU2NjJmXHU1YzAxXHU5NzYyXHU1NTY2IiwgIlx1NTU0YVx1NTRjOFx1NTRjOFx1NTRjOFx1MzAwMVx1NWMwMVx1OTc2Mlx1Njc2NVx1NTRhZiIsICJcdTY2MmZcdTVjMDFcdTk3NjJcdTkxNzFcdTU1NjY+XHUzMDAyPCIsICJcdTRlMGJcdThmN2QiKS50aGVuKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKHJlcy5waWMpOwogICAgICAgICAgICAgICAgICAgIH0pKSA6IFRvYXN0LmVycm9yKCJcdTU0Y2VcdTU0ZGZcdTZjYTFcdTYyN2VcdTUyMzBcdTVjMDFcdTk3NjJcdTU0ZTZcdWZmMGNcdTg5ODFcdTRlMGRcdThkZGZcdTRmNWNcdTgwMDVcdTYyYTVcdTU0NGFcdTRlMDBcdTRlMGJcdWZmMWYiKTsKICAgICAgICAgICAgICAgIH0pKS5jYXRjaCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgVG9hc3QuZXJyb3IoIlx1NTRjZVx1NTRkZlx1NmNhMVx1NjI3ZVx1NTIzMFx1NWMwMVx1OTc2Mlx1NTRlNlx1ZmYwY1x1ODk4MVx1NGUwZFx1OGRkZlx1NGY1Y1x1ODAwNVx1NjJhNVx1NTQ0YVx1NGUwMFx1NGUwYlx1ZmYxZiIsIDUpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQmlsaUltZ1NlcnZpY2UuYWRkX2Rvd25fYnRuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgJCh0aGlzLmhvb2tTZWxlY3RvcikubGFzdCgpLmFwcGVuZChCaWxpSW1nU2VydmljZS5kb3duQnRuKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICIjZG93bnZpZGVvIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdGhhdC5pbml0RG93bigpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQmlsaUltZ1NlcnZpY2UuaW5pdERvd24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcywgYWlkID0gdW5zYWZlV2luZG93Ll9fSU5JVElBTF9TVEFURV9fLnZpZGVvRGF0YS5haWQ7CiAgICAgICAgICAgIEJpbGlJbWdTZXJ2aWNlLmdldFZpZGVvSW5mbyhhaWQpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgc0FsZXJ0Lmh0bWwocmVzLnRpdGxlLCBfdGhpcy5saXN0SHRtbChyZXMucGFnZXMpLCAhMCwgIlx1NjIxMVx1NTk3ZFx1NGU4NiIsICIjMzA4NWQ2IiwgIjQwJSIpLCAKICAgICAgICAgICAgICAgICQoIi5iaWxpLWRvd24taXRlbSIpLm9uKCJjbGljayIsIChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNpZCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCJkYXRhLWNpZCIpLCB0aXRsZSA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCJkYXRhLXBhcnQtdGl0bGUiKTsKICAgICAgICAgICAgICAgICAgICBCaWxpSW1nU2VydmljZS5kb3duVmlkZW8oYWlkLCBjaWQsIHRpdGxlKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLmRvd25WaWRlbyA9IGZ1bmN0aW9uKGFpZCwgY2lkLCB0aXRsZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzLCBrZXkgPSAiIiArIGFpZCArIGNpZCArICJNREQtTkVXIjsKICAgICAgICAgICAgQ29uZmlnLnJlbWVtYmVyKGtleSwgTWluLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtcDRzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyA0LCBSb3V0ZS5xdWVyeUJpbGlEb3duV2ViKGFpZCwgY2lkKSBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtcDRzID0gX2Euc2VudCgpLCBSb3V0ZS5xdWVyeUJpbGlEb3duKGFpZCwgY2lkLCAoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09PSAoX2MgPSBudWxsID09PSAoX2IgPSBudWxsID09PSAoX2EgPSByZXMuZGF0YSkgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLmRhc2gpIHx8IHZvaWQgMCA9PT0gX2IgPyB2b2lkIDAgOiBfYi52aWRlbykgfHwgdm9pZCAwID09PSBfYyA/IHZvaWQgMCA6IF9jLmxlbmd0aCkgPiAwID8gKHIgPSByZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PT0gKF9lID0gbnVsbCA9PT0gKF9kID0gbXA0cy5kYXRhKSB8fCB2b2lkIDAgPT09IF9kID8gdm9pZCAwIDogX2QuZHVybCkgfHwgdm9pZCAwID09PSBfZSA/IHZvaWQgMCA6IF9lLmxlbmd0aCkgPiAwICYmIChyLmRhdGEuZHVybCA9IG1wNHMuZGF0YS5kdXJsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5kYXRhLmR1cmxbMF0ucXVhbGl0eSA9IG1wNHMuZGF0YS5xdWFsaXR5KSwgcmVzb2x2ZShyKSkgOiByZWplY3QocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIFsgMiBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSkudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICBzQWxlcnQuaHRtbCh0aXRsZSwgX3RoaXMudmlkZW9MaXN0SHRtbChyZXMuZGF0YS5kYXNoLnZpZGVvLCByZXMuZGF0YS5kYXNoLmF1ZGlvLCByZXMuZGF0YS5kYXNoLmR1cmF0aW9uLCByZXMuZGF0YS5kdXJsKSwgITAsICJcdTYyMTFcdTU5N2RcdTRlODYiLCAiIzMwODVkNiIsICI0MCUiKS5maW5hbGx5KChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBCaWxpSW1nU2VydmljZS5pbml0RG93bigpOwogICAgICAgICAgICAgICAgfSkpLCAkKCIuYmlsaS1kb3duLXZpZGVvLWl0ZW0iKS5vbigiY2xpY2siLCAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAkKGUuY3VycmVudFRhcmdldCkuYXR0cigiZGF0YS11cmwiKSwgdHlwZSA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCJkYXRhLXR5cGUiKTsKICAgICAgICAgICAgICAgICAgICBTd2FsX19kZWZhdWx0LmRlZmF1bHQuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU1MWM2XHU1OTA3XHU0ZTBiXHU4ZjdkIiwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogJzxzcGFuIGlkPSJiaWxpLWRvd25sb2FkLXN0ZXAiPlx1NWYwMFx1NTljYlx1NGUwYlx1OGY3ZFx1NTQwZVx1NWY1M1x1NTI0ZFx1OTg3NVx1OTc2Mlx1NWMwNlx1NGUwZFx1NTNlZlx1NjRjZFx1NGY1YyxcdTY2MmZcdTU0MjZcdTVmMDBcdTU5Y2JcdTRlMGJcdThmN2RcdWZmMWY8L3NwYW4+JywKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAiXHU1OTdkXHU3Njg0XHU1ZjAwXHU1OWNiIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIlx1OGZkOFx1NjYyZlx1N2I5N1x1NGU4NiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMb2FkZXJPbkNvbmZpcm06ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBwcmVDb25maXJtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ociwgaikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2Rvd25sb2FkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJcdTMwMTAiICsgKCIxIiA9PSB0eXBlID8gIlx1ODljNlx1OTg5MSIgOiAiXHU5N2YzXHU5ODkxIikgKyAiXHUzMDExIiArIHRpdGxlICsgIi5tcDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVyOiBSdW50aW1lLnVybAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbnByb2dyZXNzOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjYmlsaS1kb3dubG9hZC1zdGVwIikudGV4dCgiXHU1ZjUzXHU1MjRkXHU4ZmRiXHU1ZWE2IiArIENvcmUuZ2V0UGVyY2VudChkYXRhLmRvbmUsIGRhdGEudG90YWwpICsgIiUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRvbmUgPT0gZGF0YS50b3RhbCAmJiByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFTd2FsX19kZWZhdWx0LmRlZmF1bHQuaXNMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KS50aGVuKChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlzQ29uZmlybWVkICYmIHNBbGVydC5pbmZvKCJcdTRlMGJcdThmN2RcdTdlZDNcdTY3NWYiKTsKICAgICAgICAgICAgICAgICAgICB9KSkuZmluYWxseSgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEJpbGlJbWdTZXJ2aWNlLmRvd25WaWRlbyhhaWQsIGNpZCwgdGl0bGUpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpLmNhdGNoKChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBMb2dnZXIuZXJyb3IoZSksIHNBbGVydC5lcnJvcigiXHU1NTY1XHU0ZTVmXHU2Y2ExXHU2N2U1XHU3NzQwLFx1NTE4ZFx1OGJkNVx1NGUwMFx1NGUwYlx1NjIxNlx1ODAwNVx1NWUyNlx1Nzc0MFx1ODljNlx1OTg5MVx1NTczMFx1NTc0MFx1N2VkOVx1NGY1Y1x1ODAwNVx1NjJhNVx1NTQ0YVx1NGUwMFx1NGUwYlx1NTQyN34iKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLmdldFZpZGVvSW5mbyA9IGZ1bmN0aW9uKGFpZCkgewogICAgICAgICAgICByZXR1cm4gQ29uZmlnLnJlbWVtYmVyKCJiaWxpSW5mby0iICsgYWlkLCBXZWVrLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUsIHJlamUpIHsKICAgICAgICAgICAgICAgICAgICBSb3V0ZS5xdWVyeUJpbGlJbWcoYWlkLCAoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHJlcy5jb2RlID8gcmVzb2x2ZShyZXMuZGF0YSkgOiByZWplKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQmlsaUltZ1NlcnZpY2UuYWRkX3RyaXBsZV9idG4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmhvb2tTZWxlY3RvcikubGFzdCgpLmFwcGVuZChCaWxpSW1nU2VydmljZS50cmlwbGVDbGlja0J0biksICQoImJvZHkiKS5vbigiY2xpY2siLCAiI3RyaXBsZUNsaWNrIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgWyAiLnZpZGVvLWxpa2UiLCAiLmNvaW4iLCAiLmNvbGxlY3QiIF0uZm9yRWFjaCgoZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICQoaXRlbSkudHJpZ2dlcigiY2xpY2siKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIEJpbGlJbWdTZXJ2aWNlLmNvdmVyQnRuID0gJzxidXR0b24gY2xhc3M9Im9rdi1idG4gb2t2LWJ0bi1wcmltYXJ5IG9rdi1iZy1waW5rIGJpbGktdG9wLWJ1dHRvbiIgaWQ9ImZpbmRpbWciPlx1ODNiN1x1NTNkNlx1NWMwMVx1OTc2MjwvYnV0dG9uPicsIAogICAgICAgIEJpbGlJbWdTZXJ2aWNlLmRvd25CdG4gPSAnPGJ1dHRvbiBpZD0iZG93bnZpZGVvIiBjbGFzcz0ib2t2LWJ0biBva3YtYnRuLXByaW1hcnkgb2t2LWJnLXBpbmsgYmlsaS10b3AtYnV0dG9uIj5cdTRlMGJcdThmN2RcdTg5YzZcdTk4OTE8L2J1dHRvbj4nLCAKICAgICAgICBCaWxpSW1nU2VydmljZS50cmlwbGVDbGlja0J0biA9ICc8YnV0dG9uIGNsYXNzPSJva3YtYnRuIG9rdi1idG4tcHJpbWFyeSBva3YtYmctcGluayBiaWxpLXRvcC1idXR0b24iIGlkPSJ0cmlwbGVDbGljayI+XHU0ZTAwXHU0ZTBiXHU3MGI5XHU0ZWU4KFx1NzBiOVx1OGQ1ZVx1MzAwMVx1NjI5NVx1NWUwMVx1MzAwMVx1NjUzNlx1ODVjZik8L2J1dHRvbj4nLCAKICAgICAgICBCaWxpSW1nU2VydmljZS5ob29rU2VsZWN0b3IgPSAiLm9rdi10b29scy1iaWxpIiwgQmlsaUltZ1NlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBNZW51JDIgPSBDb21tb24uTWVudSwgTW92aWVTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gTW92aWVTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5IaVR2LCAvdHZcLndhbmRoaVwuY29tXC9nb1wuaHRtbC9pIF0sIFsgU2l0ZUVudW0uWW91S3UsIC95b3VrdVwuY29tL2kgXSwgWyBTaXRlRW51bS5JUWlZaSwgL2lxaXlpfGlxXC5jb20vaSBdLCBbIFNpdGVFbnVtLkxlU2hpLCAvXC5sZVwuY29tL2kgXSwgWyBTaXRlRW51bS5UZW5jZW50X1YsIC92XC5xcS9pIF0sIFsgU2l0ZUVudW0uVHVEb3UsIC90dWRvdVwuY29tL2kgXSwgWyBTaXRlRW51bS5NYW5nR3VvLCAvbWd0dlwuY29tL2kgXSwgWyBTaXRlRW51bS5Tb0h1LCAvc29odVwuY29tL2kgXSwgWyBTaXRlRW51bS5BY2Z1biwgL2FjZnVuXC5jb20vaSBdLCBbIFNpdGVFbnVtLkJpbGlCaWxpLCAvYmlsaWJpbGlcLmNvbS9pIF0sIFsgU2l0ZUVudW0uTTE5MDUsIC8xOTA1XC5jb20vaSBdLCBbIFNpdGVFbnVtLlBQVFYsIC9wcHR2XC5jb20vaSBdLCBbIFNpdGVFbnVtLllpbll1ZVRhaSwgL3lpbnl1ZXRhaVwuY29tLyBdIF0pLCAKICAgICAgICAgICAgX3RoaXMuamtQcmUgPSAiXHU4MWVhXHU1YjlhXHU0ZTQ5XHU2M2E1XHU1M2UzXHVmZjFhIiwgX3RoaXMubWVudSA9IG5ldyBDb21tb24uTWVudSwgCiAgICAgICAgICAgIF90aGlzLl91bmlxdWUgPSAhMSwgX3RoaXMuX2FwcE5hbWUgPSAiTW92aWVTZXJ2aWNlIiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoTW92aWVTZXJ2aWNlLCBfc3VwZXIpLCBNb3ZpZVNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAidW5kZWZpbmVkIiA9PSB0eXBlb2YgJCAmJiBDb3JlLmFwcGVuZEpzKCIvL2xpYi5iYW9taXR1LmNvbS9qcXVlcnkvMS4xMi40L2pxdWVyeS5taW4uanMiKTsKICAgICAgICB9LCBNb3ZpZVNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2l0ZSkgewogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uSGlUdjoKICAgICAgICAgICAgICAgIHRoaXMuY3VzSW50ZXJGYWNlKCksIHRoaXMubGFzdFBsYXkoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhpcy5tZW51LkluaXQoWyB7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICJcdTY3MmNcdTZiMjFcdTUxNzNcdTk1ZWQiLAogICAgICAgICAgICAgICAgICAgIHNob3c6ICJcdTY3MmNcdTZiMjE8YnI+XHU1MTczXHU5NWVkIiwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAic2VhcmNoIgogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU4OWM2XHU5ODkxXHU4OWUzXHU2NzkwIiwKICAgICAgICAgICAgICAgICAgICBzaG93OiAiXHU4OWM2XHU5ODkxPGJyPlx1ODllM1x1Njc5MCIsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogInByb2Nlc3MiCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICJcdTdlZGRcdTRlMTZcdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgICAgIHNob3c6ICJcdTdlZGRcdTRlMTY8YnI+XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAidGIiCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICJcdTRlYWNcdTRlMWNcdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgICAgIHNob3c6ICJcdTRlYWNcdTRlMWM8YnI+XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAiamQiCiAgICAgICAgICAgICAgICB9IF0sIHRoaXMuX29uQ2xpY2spLCB0aGlzLmF1dG9IaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBNb3ZpZVNlcnZpY2UucHJvdG90eXBlLmN1c0ludGVyRmFjZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaF8xLCBfdGhpcyA9IHRoaXMsIHVybHMgPSBDb25maWcuZ2V0KENvbmZpZ0VudW0uSmlleGlfQ3VzX0ludGVyZmFjZSk7CiAgICAgICAgICAgIHVybHMgJiYgKGhfMSA9ICQoIiNqayIpLmh0bWwoKSwgdXJscy5zcGxpdCgiXG4iKS5mb3JFYWNoKChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YXMgPSBlLnNwbGl0KCJ8fCIpOwogICAgICAgICAgICAgICAgImh0dHBzOiIgPT0gdW5zYWZlV2luZG93LmxvY2F0aW9uLnByb3RvY29sID8gaF8xICs9ICc8b3B0aW9uIHZhbHVlPSInICsgZGF0YXNbMF0ucmVwbGFjZSgiaHR0cDoiLCAiaHR0cHM6IikgKyAnIiBzZWxlY3RlZD0iIj4nICsgX3RoaXMuamtQcmUgKyBkYXRhc1sxXSArICI8L29wdGlvbj4iIDogaF8xICs9ICc8b3B0aW9uIHZhbHVlPSInICsgZGF0YXNbMF0gKyAnIiBzZWxlY3RlZD0iIj4nICsgX3RoaXMuamtQcmUgKyBkYXRhc1sxXSArICI8L29wdGlvbj4iOwogICAgICAgICAgICB9KSksICQoIiNqayIpLmh0bWwoaF8xKSksIExvZ2dlci5kZWJ1Zyh1cmxzKTsKICAgICAgICB9LCBNb3ZpZVNlcnZpY2UucHJvdG90eXBlLmxhc3RQbGF5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBsYXN0LCBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICQoIiNiZiIpLm9uKCJjbGljayIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBvcCA9ICQoIiNqayBvcHRpb246c2VsZWN0ZWQiKSwgdXJsID0gb3AudmFsKCksIG5hbWUgPSBvcC50ZXh0KCkucmVwbGFjZShfdGhpcy5qa1ByZSwgIiIpOwogICAgICAgICAgICAgICAgQ29uZmlnLnNldChDb25maWdFbnVtLkppZXhpX0ludGVyZmFjZV9MYXN0X1BsYXksIG5hbWUpLCBDb25maWcuc2V0KENvbmZpZ0VudW0uSmlleGlfSW50ZXJmYWNlX0xhc3RfUGxheV9VcmwsIHVybCk7CiAgICAgICAgICAgIH0pKSwgKGxhc3QgPSBDb25maWcuZ2V0KENvbmZpZ0VudW0uSmlleGlfSW50ZXJmYWNlX0xhc3RfUGxheV9VcmwpKSAmJiAkKCIjamsiKS52YWwobGFzdCk7CiAgICAgICAgfSwgTW92aWVTZXJ2aWNlLnByb3RvdHlwZS5fb25DbGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCJib2R5Iikub24oImNsaWNrIiwgIltkYXRhLWNhdD1wcm9jZXNzXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIENvcmUub3BlbigiaHR0cDovL3R2LndhbmRoaS5jb20vZ28uaHRtbD91cmw9IiArIGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZikpOwogICAgICAgICAgICB9KSksICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXNlYXJjaF0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBNZW51JDIuY2xvc2UoKTsKICAgICAgICAgICAgfSkpLCAkKCJib2R5Iikub24oImNsaWNrIiwgIltkYXRhLWNhdD10Yl0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHA6Ly9zaG9wLmh1aXpoZWsuY29tIik7CiAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9amRdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwOi8vc2hvcC5odWl6aGVrLmNvbSIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTW92aWVTZXJ2aWNlLnByb3RvdHlwZS5hdXRvSGlkZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBMb2dnZXIuaW5mbygiXHU4MWVhXHU1MmE4XHU5NjkwXHU4NWNmIiksIHRoaXMuc2l0ZSA9PSBTaXRlRW51bS5CaWxpQmlsaSAmJiBDb3JlLmJhY2tncm91bmQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF9hLCBtb2RhbDsKICAgICAgICAgICAgICAgICQoIi5icHgtcGxheWVyLWNvbnRhaW5lciIpLmxlbmd0aCA+IDAgJiYgKCJ3ZWIiID09IChtb2RhbCA9IG51bGwgPT09IChfYSA9ICQoIi5icHgtcGxheWVyLWNvbnRhaW5lciIpKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EuYXR0cigiZGF0YS1zY3JlZW4iKSkgfHwgImZ1bGwiID09IG1vZGFsID8gJCgiLmFzaWRlLW5hdiIpLmhpZGUoKSA6ICQoIi5hc2lkZS1uYXYiKS5zaG93KCkpOwogICAgICAgICAgICB9KSwgMSk7CiAgICAgICAgfSwgTW92aWVTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgSmRTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gSmRTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMuX2FwcE5hbWUgPSAiSmRTZXJ2aWNlIiwgX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5KaW5nRG9uZywgL2l0ZW1cLih5aXlhb2pkfGpkKVwuYy9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5oaXN0b3J5U2VydmljZSA9IG5ldyBHd2RTZXJ2aWNlLCBfdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhKZFNlcnZpY2UsIF9zdXBlciksIEpkU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVNlcnZpY2UubGlua1Rlc3QoKSAmJiB0aGlzLmhpc3RvcnlTZXJ2aWNlLlByb2Nlc3MoKTsKICAgICAgICB9LCBKZFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYnRuID0gJzxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9ImJ0bi1zcGVjaWFsMSBidG4tbGcgYnRuLXloaiI+PHNwYW4gY2xhc3M9IiI+XHU2N2U1XHU4YmUyXHU0ZjE4XHU2MGUwXHU1MjM4PC9zcGFuPjwvYT4nLCBrZXl3b3JkcyA9ICQoIi5za3UtbmFtZSIpLnRleHQoKS50cmltKCk7CiAgICAgICAgICAgICQoIiNjaG9vc2UtYnRucyIpLnByZXBlbmQoYnRuKSwgJCgiLmJ0bi15aGoiKS5vbigiY2xpY2siLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHBzOi8vc2hvcC5odWl6aGVrLmNvbS8/cj0vbC9qZGxpc3Qma3c9IiArIGVuY29kZVVSSUNvbXBvbmVudChrZXl3b3JkcykgKyAiJnQ9MjIzIik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBKZFNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBVcmxIZWxwZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBVcmxIZWxwZXIoKSB7fQogICAgICAgIHJldHVybiBVcmxIZWxwZXIuQmluZCA9IGZ1bmN0aW9uKENzc1NlbGVjdG9yLCBtZXRob2QsIGRvYykgewogICAgICAgICAgICAkKENzc1NlbGVjdG9yKS5jbGljaygoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW5VcmwoJCh0aGlzKS5kYXRhKCJrZXkiKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBVcmxIZWxwZXIudXJsRW5jb2RlID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodXJsKTsKICAgICAgICB9LCBVcmxIZWxwZXIudXJsRGVjb2RlID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTsKICAgICAgICB9LCBVcmxIZWxwZXI7CiAgICB9KCksIE11c2ljU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIE11c2ljU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uV2FuZ1lpLCAvMTYzKC4qKXNvbmcvaSBdLCBbIFNpdGVFbnVtLlRlbmNlbnRfTSwgL3lcLlFRKC4qKXNvbmcvaSBdLCBbIFNpdGVFbnVtLkt1R291LCAva3Vnb3VcLmNvbVwvc29uZ1wvKi9pIF0sIFsgU2l0ZUVudW0uS3VXbywgL2t1d28oLiopeWlueXVlL2kgXSwgWyBTaXRlRW51bS5YaWFNaSwgL3hpYW1pL2kgXSwgWyBTaXRlRW51bS5UYWlIZSwgL3RhaWhlXC5jb20vaSBdLCBbIFNpdGVFbnVtLlFpbmdUaW5nLCAvcWluZ3RpbmdcLi9pIF0sIFsgU2l0ZUVudW0uTGlaaGksIC9saXpoaVwuL2kgXSwgWyBTaXRlRW51bS5NaUd1LCAvbWlndVwuL2kgXSwgWyBTaXRlRW51bS5YaU1hTGFZYSwgL3hpbWFsYXlhXC4vaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMubWVudSA9IG5ldyBDb21tb24uTWVudSwgX3RoaXMuX2FwcE5hbWUgPSAiTXVzaWNTZXJ2aWNlIiwgX3RoaXMuX3VuaXF1ZSA9ICExLCAKICAgICAgICAgICAgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoTXVzaWNTZXJ2aWNlLCBfc3VwZXIpLCBNdXNpY1NlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIE11c2ljU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMubWVudS5Jbml0KFsgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTc1MzVcdTVmNzFcdTY0MWNcdTdkMjIiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NzUzNVx1NWY3MTxicj5cdTY0MWNcdTdkMjIiLAogICAgICAgICAgICAgICAgdHlwZTogInNlYXJjaCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTk3ZjNcdTRlNTBcdTRlMGJcdThmN2QiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1OTdmM1x1NGU1MDxicj5cdTRlMGJcdThmN2QiLAogICAgICAgICAgICAgICAgdHlwZTogInByb2Nlc3MiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU3ZWRkXHU0ZTE2XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHNob3c6ICJcdTdlZGRcdTRlMTY8YnI+XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHR5cGU6ICJ0YiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTRlYWNcdTRlMWNcdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NGVhY1x1NGUxYzxicj5cdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgdHlwZTogImpkIgogICAgICAgICAgICB9IF0sIHRoaXMuX09uQ2xpY2ssICExKTsKICAgICAgICB9LCBNdXNpY1NlcnZpY2UucHJvdG90eXBlLl9PbkNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucnVsZXMsICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXByb2Nlc3NdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgaSwgaHRtbDsKICAgICAgICAgICAgICAgIGlmICgveGltYWxheWEvaS50ZXN0KFJ1bnRpbWUudXJsKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1bnNhZmVXaW5kb3cuZG9jdW1lbnQuc2NyaXB0cy5sZW5ndGg7IGkrKykgL3dpbmRvd1wuX19JTklUSUFMX1NUQVRFX18gPS9pLnRlc3QodW5zYWZlV2luZG93LmRvY3VtZW50LnNjcmlwdHNbaV0uaW5uZXJIVE1MKSAmJiAoTG9nZ2VyLmRlYnVnKHVuc2FmZVdpbmRvdy5kb2N1bWVudC5zY3JpcHRzW2ldLmlubmVySFRNTCksIAogICAgICAgICAgICAgICAgICAgIGV2YWwodW5zYWZlV2luZG93LmRvY3VtZW50LnNjcmlwdHNbaV0uaW5uZXJIVE1MLnJlcGxhY2UoIndpbmRvdy5fX0lOSVRJQUxfU1RBVEVfXyIsICJ1bnNhZmVXaW5kb3cuX19JTklUSUFMX1NUQVRFX18iKSkpOwogICAgICAgICAgICAgICAgICAgIF9fSU5JVElBTF9TVEFURV9fICYmIChudWxsID09PSAoX2IgPSBudWxsID09PSAoX2EgPSBfX0lOSVRJQUxfU1RBVEVfXy5zdG9yZSkgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLlNvdW5kRGV0YWlsUGFnZSkgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLnRyYWNrSWQpID8gQ29yZS5vcGVuKCJodHRwOi8vbXVzaWMud2FuZGhpLmNvbS8/aWQ9IiArIF9fSU5JVElBTF9TVEFURV9fLnN0b3JlLlNvdW5kRGV0YWlsUGFnZS50cmFja0lkICsgIiZ0eXBlPXhpbWFsYXlhIikgOiAobGF5ZXIuY2xvc2VBbGwoKSwgCiAgICAgICAgICAgICAgICAgICAgaHRtbCA9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjBweCA1MHB4IDBweCA1MHB4OyI+PHVsIGNsYXNzPSJzb3VuZC1saXN0IGRPaTIiPicsICQuZWFjaChfX0lOSVRJQUxfU1RBVEVfXy5zdG9yZS5BbGJ1bURldGFpbFRyYWNrTGlzdFYyLnRyYWNrc0luZm8udHJhY2tzLCAoZnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGxpIGNsYXNzPSJkMGkyIj48YSBocmVmPSJodHRwOi8vbXVzaWMud2FuZGhpLmNvbS8/aWQ9JyArIGl0ZW0udHJhY2tJZCArICcmdHlwZT14aW1hbGF5YSIgdGFyZ2V0PSJfYmxhbmsiPicgKyBpdGVtLnRpdGxlICsgIjwvYT48L2xpPiI7CiAgICAgICAgICAgICAgICAgICAgfSkpLCBodG1sICs9ICI8L3VsPjwvZGl2PiIsIGxheWVyLm9wZW4oewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBhcmVhOiBbICJhdXRvIiwgIjMwJSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICJcdTRlM2FcdTRmNjBcdTYyN2VcdTUyMzBcdTRlODZcdThmZDlcdTRlOWJcdTY2ZjJcdTc2ZWVcdTg5ZTNcdTY3OTBcdTIwMjZcdTIwMjYiLAogICAgICAgICAgICAgICAgICAgICAgICBzaGFkZTogLjYsCiAgICAgICAgICAgICAgICAgICAgICAgIG1heG1pbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW06IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGh0bWwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgL2t1Z291XC5jb21cL3NvbmcvaS50ZXN0KFJ1bnRpbWUudXJsKSAmJiAkKCIjbXlBdWRpbyIpID8gQ29yZS5vcGVuKCJodHRwOi8vbXVzaWMud2FuZGhpLmNvbS8/dHlwZT1rdWdvdSZpZD0iICsgJCgiI215QXVkaW8iKS5hdHRyKCJkYXRhLWhhc2giKSkgOiAvdGFpaGUuY29tL2kudGVzdChSdW50aW1lLnVybCkgPyBDb3JlLm9wZW4oImh0dHA6Ly9tdXNpYy53YW5kaGkuY29tLz91cmw9IiArIFVybEhlbHBlci51cmxFbmNvZGUoUnVudGltZS51cmwucmVwbGFjZSgidGFpaGUiLCAiYmFpZHUiKSkpIDogQ29yZS5vcGVuKCJodHRwOi8vbXVzaWMud2FuZGhpLmNvbS8/dXJsPSIgKyBVcmxIZWxwZXIudXJsRW5jb2RlKFJ1bnRpbWUudXJsKSk7CiAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9c2VhcmNoXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIENvcmUub3BlbigiaHR0cDovL3R2LndhbmRoaS5jb20vIik7CiAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9dGJdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwczovL3Nob3AuaHVpemhlay5jb20iKTsKICAgICAgICAgICAgfSkpLCAkKCJib2R5Iikub24oImNsaWNrIiwgIltkYXRhLWNhdD1qZF0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHBzOi8vc2hvcC5odWl6aGVrLmNvbSIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTXVzaWNTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgZnVuY3Rpb24oSXRlbVR5cGUpIHsKICAgICAgICBJdGVtVHlwZS5UYW9CYW8gPSAidGIiLCBJdGVtVHlwZS5UTWFsbCA9ICJ0bSIsIEl0ZW1UeXBlLkppbmdEb25nID0gImpkIiwgSXRlbVR5cGUuSmluZ0RvbmdDaGFvc2hpID0gImpkY3MiLCAKICAgICAgICBJdGVtVHlwZS5TdW5pbmcgPSAic24iOwogICAgfShJdGVtVHlwZSB8fCAoSXRlbVR5cGUgPSB7fSkpLCBUYW8gPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBUYW8oKSB7fQogICAgICAgIHJldHVybiBUYW8uaXNWYWlsaWRJdGVtSWQgPSBmdW5jdGlvbihpdGVtSWQpIHsKICAgICAgICAgICAgaWYgKCFpdGVtSWQpIHJldHVybiAhMTsKICAgICAgICAgICAgdmFyIGl0ZW1JZEludCA9IHBhcnNlSW50KGl0ZW1JZCk7CiAgICAgICAgICAgIHJldHVybiBpdGVtSWRJbnQudG9TdHJpbmcoKSA9PSBpdGVtSWQgJiYgaXRlbUlkSW50ID4gMWU0OwogICAgICAgIH0sIFRhby5pc1ZhbGlkVGFvSWQgPSBmdW5jdGlvbihpdGVtSWQpIHsKICAgICAgICAgICAgcmV0dXJuICEhaXRlbUlkICYmICghIUNvcmUuaXNOdW1iZXIoaXRlbUlkKSB8fCAoIShpdGVtSWQuaW5kZXhPZigiaHR0cCIpID49IDApIHx8ICEoIXRoaXMuaXNUYW9CYW9EZXRhaWxQYWdlKGl0ZW1JZCkgJiYgIWl0ZW1JZC5pbmNsdWRlcygiLy9kZXRhaWwuanUudGFvYmFvLmNvbS9ob21lLmh0bSIpKSkpOwogICAgICAgIH0sIFRhby5pc1Rhb0Jhb0RldGFpbFBhZ2UgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgcmV0dXJuIHVybC5pbmNsdWRlcygiLy9pdGVtLnRhb2Jhby5jb20vaXRlbS5odG0iKSB8fCB1cmwuaW5jbHVkZXMoIi8vZGV0YWlsLnRtYWxsLmNvbS9pdGVtLmh0bSIpIHx8IHVybC5pbmNsdWRlcygiLy9jaGFvc2hpLmRldGFpbC50bWFsbC5jb20vaXRlbS5odG0iKSB8fCB1cmwuaW5jbHVkZXMoIi8vZGV0YWlsLnRtYWxsLmhrL2hrL2l0ZW0uaHRtIik7CiAgICAgICAgfSwgVGFvOwogICAgfSgpLCBMaXN0U2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIExpc3RTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5UYW9CYW8sIC9zXC50YW9iYW9cLmNvbVwvc2VhcmNoL2kgXSwgWyBTaXRlRW51bS5UTWFsbCwgL2xpc3RcLnRtYWxsXC5jb21cL3NlYXJjaF9wcm9kdWN0XC5odG0vaSBdLCBbIFNpdGVFbnVtLkthb0xhLCAvc2VhcmNoXC5rYW9sYVwuY29tXC9zZWFyY2hcLmh0bWwvaSBdLCBbIFNpdGVFbnVtLkppbmdEb25nTGlzdCwgL3NlYXJjaFwuamRcLmNvbS9pIF0sIFsgU2l0ZUVudW0uU3VOaW5nLCAvc2VhcmNoXC5zdW5pbmdcLmNvbS9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5zZWxlY3Rvckxpc3QgPSBbXSwgX3RoaXMuc2VsZWN0b3JhID0gW10sIF90aGlzLmF0cmFjayA9IFtdLCBfdGhpcy5rZXkgPSAibGlzdF9zZXJ2aWNlXyIsIAogICAgICAgICAgICBfdGhpcy5fYXBwTmFtZSA9ICJUYW9MaXN0IiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoTGlzdFNlcnZpY2UsIF9zdXBlciksIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCAKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTGlzdFNlcnZpY2UsICJzdHlsZSIsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiICAgIFxuICAgIC5vbmVrZXl2aXAtdGItYm94LWFyZWEge3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDEwcHg7cmlnaHQ6IDVweDt6LWluZGV4OiA5OTk5O31cbiAgICAub25la2V5dmlwLWpkLWJveC1hcmVhIHtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAyNzVweDtyaWdodDogMTBweDt6LWluZGV4OiA5OTk5O30gIFxuICAgIC5vbmVrZXl2aXAtamRjcy1ib3gtYXJlYSB7cG9zaXRpb246IGFic29sdXRlO3RvcDogNXB4O3JpZ2h0OiAwcHg7ei1pbmRleDogOTk5OTt9XG4gICAgLm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudHtvcGFjaXR5OiAuMzM7fVxuICAgIC5vbmVrZXl2aXAtYm94LWluZm8sIC5vbmVrZXl2aXAtYm94LWluZm86aG92ZXIsIC5vbmVrZXl2aXAtYm94LWluZm86dmlzaXRlZCB7dGV4dC1kZWNvcmF0aW9uOiBub25lIWltcG9ydGFudDt9XG4gICAgLm9uZWtleXZpcC1ib3gtd2FpdHtjdXJzb3I6cG9pbnRlcn1cbiAgICAub25la2V5dmlwLWJveC1pbmZvIHt3aWR0aDogYXV0byFpbXBvcnRhbnQ7aGVpZ2h0OiBhdXRvIWltcG9ydGFudDtwYWRkaW5nOiA2cHggOHB4IWltcG9ydGFudDtmb250LXNpemU6IDEycHg7Y29sb3I6ICNmZmYhaW1wb3J0YW50O2JvcmRlci1yYWRpdXM6IDE1cHg7Y3Vyc29yOiBwb2ludGVyO2ZvbnQtd2VpZ2h0OmJvbGR9XG4gICAgLm9uZWtleXZpcC1qZC1ib3gtaW5mby1kZWZhdWx0LCAub25la2V5dmlwLXRiLWJveC1pbmZvLWRlZmF1bHQsIC5vbmVrZXl2aXAtamRjcy1ib3gtaW5mby1kZWZhdWx0e2JhY2tncm91bmQ6ICMzMTg2ZmQhaW1wb3J0YW50O31cbiAgICAub25la2V5dmlwLWJveC1pbmZvLWVtcHR5IHtjb2xvcjogIzAwMCFpbXBvcnRhbnQ7YmFja2dyb3VuZDogI2NjYyFpbXBvcnRhbnQ7fVxuICAgIC5vbmVrZXl2aXAtYm94LWluZm8tZmluZCB7YmFja2dyb3VuZDogI2ZmMDAzNiFpbXBvcnRhbnQ7fVxuICAgIC5vbmVrZXl2aXAtYm94LWRvbmV7cG9zaXRpb246cmVsYXRpdmV9XG4gICAgIjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW51bWVyYWJsZTogITEsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICB9KSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzd2l0Y2ggKExpc3RTZXJ2aWNlLnRoYXQgPSB0aGlzLCB0aGlzLnNpdGUpIHsKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlRhb0JhbzoKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3JMaXN0LnB1c2goIi5pdGVtcyAuaXRlbSIpLCB0aGlzLnNlbGVjdG9yTGlzdC5wdXNoKCdhW2NsYXNzXj0iQ2FyZC0tZG91YmxlQ2FyZFdyYXBwZXIiXScpLCAKICAgICAgICAgICAgICAgIHRoaXMuYXRyYWNrLnB1c2goIi5waWMgYSIsICIudGl0bGUgYSIpLCB0aGlzLml0ZW1UeXBlID0gSXRlbVR5cGUuVGFvQmFvOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uVE1hbGw6CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yTGlzdC5wdXNoKCIucHJvZHVjdCIpLCB0aGlzLmF0cmFjay5wdXNoKCIucHJvZHVjdEltZy13cmFwIGEiLCAiLnByb2R1Y3RUaXRsZSBhIiksIAogICAgICAgICAgICAgICAgdGhpcy5pdGVtVHlwZSA9IEl0ZW1UeXBlLlRhb0JhbzsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLkthb0xhOgogICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5faW5pdFF1ZXJ5KCk7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uSmluZ0RvbmdMaXN0OgogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rvckxpc3QucHVzaCgiLmdsLXdhcnAgLmdsLWl0ZW0iKSwgdGhpcy5hdHJhY2sucHVzaCgiLnAtaW1nIGEiLCAiLnAtbmFtZSBhIiksIAogICAgICAgICAgICAgICAgdGhpcy5pdGVtVHlwZSA9IEl0ZW1UeXBlLkppbmdEb25nOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uU3VOaW5nOgogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rvckxpc3QucHVzaCgiLml0ZW0td3JhcCIpLCB0aGlzLmF0cmFjay5wdXNoKCIuaW1nLWJsb2NrIGEiLCAiLnRpdGxlLXNlbGxpbmctcG9pbnQgYSIpLCAKICAgICAgICAgICAgICAgIHRoaXMuaXRlbVR5cGUgPSBJdGVtVHlwZS5TdW5pbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmluaXRTdHlsZSgpLCBDb3JlLmF1dG9MYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9ICQgJiYgbnVsbCAhPSBqUXVlcnk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuaW5pdFNlYXJjaEV2ZW50KCk7CiAgICAgICAgICAgIH0pLCAzKSwgQ29yZS5iYWNrZ3JvdW5kKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LmluaXRTZWFyY2godGhhdCk7CiAgICAgICAgICAgIH0pLCAzKSwgQ29yZS5iYWNrZ3JvdW5kKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LmluaXRRdWVyeSgpOwogICAgICAgICAgICB9KSwgNCk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLmluaXRTdHlsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDb3JlLmFwcGVuZENzc0NvbnRlbnQoTGlzdFNlcnZpY2Uuc3R5bGUpLCB0aGlzLml0ZW1UeXBlID09IEl0ZW1UeXBlLlN1bmluZyAmJiBDb3JlLmFwcGVuZENzc0NvbnRlbnQoIi5vbmVrZXl2aXAtc24tYm94LWFyZWF7cG9zaXRpb246IHJlbGF0aXZlO30iKTsKICAgICAgICB9LCBMaXN0U2VydmljZS5wcm90b3R5cGUuaW5pdFNlYXJjaEV2ZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIub25la2V5dmlwLSIgKyB0aGF0Lml0ZW1UeXBlICsgIi1ib3gtYXJlYSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLmhhc0NsYXNzKCJvbmVrZXl2aXAtYm94LXdhaXQiKSA/IHRoYXQucXVlcnlJbmZvKHRoaXMpIDogJHRoaXMuaGFzQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpID8gJHRoaXMucmVtb3ZlQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpIDogJHRoaXMuYWRkQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBDb3JlLmJhY2tncm91bmQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoIi5vbmVrZXl2aXAtIiArIHRoYXQuaXRlbVR5cGUgKyAiLWJveC1hcmVhIikuY2xpY2soKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5oYXNDbGFzcygib25la2V5dmlwLWJveC13YWl0IikgPyB0aGF0LnF1ZXJ5SW5mbyh0aGlzKSA6ICR0aGlzLmhhc0NsYXNzKCJvbmVrZXl2aXAtYm94LWluZm8tdHJhbnNsdWNlbnQiKSA/ICR0aGlzLnJlbW92ZUNsYXNzKCJvbmVrZXl2aXAtYm94LWluZm8tdHJhbnNsdWNlbnQiKSA6ICR0aGlzLmFkZENsYXNzKCJvbmVrZXl2aXAtYm94LWluZm8tdHJhbnNsdWNlbnQiKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBMaXN0U2VydmljZS5wcm90b3R5cGUuaW5pdFNlYXJjaCA9IGZ1bmN0aW9uKHRoYXQpIHsKICAgICAgICAgICAgdGhhdC5zZWxlY3Rvckxpc3QuZm9yRWFjaCgoZnVuY3Rpb24oZSwgaSkgewogICAgICAgICAgICAgICAgJChlKS5lYWNoKChmdW5jdGlvbihpbmRleCwgZWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5pbml0U2VhcmNoSXRlbShlbGUpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLmluaXRTZWFyY2hJdGVtID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIFByb21pc2UsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciAkZG9tLCBpdGVtSWQsICRhLCByZXM7CiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9qKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfai5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRkb20gPSAkKHNlbGVjdG9yKSkuaGFzQ2xhc3MoIm9uZWtleXZpcC1ib3gtZG9uZSIpID8gWyAyIF0gOiAoaXRlbUlkID0gbnVsbCAhPT0gKF9jID0gbnVsbCAhPT0gKF9iID0gbnVsbCAhPT0gKF9hID0gJGRvbS5hdHRyKCJkYXRhLWlkIikpICYmIHZvaWQgMCAhPT0gX2EgPyBfYSA6ICRkb20uZGF0YSgic2t1IikpICYmIHZvaWQgMCAhPT0gX2IgPyBfYiA6ICRkb20uYXR0cigiaWQiKSkgJiYgdm9pZCAwICE9PSBfYyA/IF9jIDogIiIsIAogICAgICAgICAgICAgICAgICAgICAgICBUYW8uaXNWYWlsaWRJdGVtSWQoaXRlbUlkKSB8fCAoaXRlbUlkID0gbnVsbCAhPT0gKF9mID0gbnVsbCAhPT0gKF9lID0gbnVsbCAhPT0gKF9kID0gJGRvbS5hdHRyKCJkYXRhLWl0ZW1pZCIpKSAmJiB2b2lkIDAgIT09IF9kID8gX2QgOiAkZG9tLmRhdGEoInNwdSIpKSAmJiB2b2lkIDAgIT09IF9lID8gX2UgOiAkZG9tLmF0dHIoImlkIikpICYmIHZvaWQgMCAhPT0gX2YgPyBfZiA6ICIiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIFRhby5pc1ZhaWxpZEl0ZW1JZChpdGVtSWQpID8gWyAzLCA1IF0gOiAkZG9tLmF0dHIoImhyZWYiKSA/IChpdGVtSWQgPSBsb2NhdGlvbi5wcm90b2NvbCArICRkb20uYXR0cigiaHJlZiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaXRlICE9IFNpdGVFbnVtLlRhb0JhbyAmJiB0aGlzLnNpdGUgIT0gU2l0ZUVudW0uVE1hbGwgPyBbIDMsIDMgXSA6IGl0ZW1JZC5pbmRleE9mKCJjbGljay5zaW1iYS50YW9iYW8uY29tIikgPiAtMSA/IFsgNCwgSHR0cC5nZXQzMDIoaXRlbUlkKSBdIDogWyAzLCAyIF0pIDogWyAzLCA0IF0pOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkID0gX2ouc2VudCgpLCBMb2dnZXIuZGVidWcoIjMwMlx1NTkwNFx1NzQwNlx1NTQwZWl0ZW1JZDoiICsgaXRlbUlkKSwgX2oubGFiZWwgPSAyOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkID0gQ29yZS5nZXRQYXIoImlkIiwgaXRlbUlkKSwgX2oubGFiZWwgPSAzOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMywgNSBdOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoJGEgPSAkZG9tLmZpbmQoImEiKSkubGVuZ3RoKSByZXR1cm4gWyAyIF07CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZCA9IG51bGwgIT09IChfZyA9ICRhLmF0dHIoImRhdGEtbmlkIikpICYmIHZvaWQgMCAhPT0gX2cgPyBfZyA6ICIiLCBUYW8uaXNWYWlsaWRJdGVtSWQoaXRlbUlkKSB8fCAoaXRlbUlkID0gJGEuaGFzQ2xhc3MoImpfUmVjZWl2ZUNvdXBvbiIpICYmICRhLmxlbmd0aCA+IDEgPyBsb2NhdGlvbi5wcm90b2NvbCArICQoJGFbMV0pLmF0dHIoImhyZWYiKSA6IGxvY2F0aW9uLnByb3RvY29sICsgJGEuYXR0cigiaHJlZiIpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIF9qLmxhYmVsID0gNTsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhVGFvLmlzVmFpbGlkSXRlbUlkKGl0ZW1JZCkgJiYgaXRlbUlkLmluZGV4T2YoImh0dHAiKSA+IC0xICYmIChyZXMgPSBudWxsICE9PSAoX2ggPSAvaXRlbS5qZC5jb21cLyguKj8pLmh0bWwvaS5leGVjKGl0ZW1JZCkpICYmIHZvaWQgMCAhPT0gX2ggPyBfaCA6IFtdLCAKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkID0gcmVzLmxlbmd0aCA+IDAgPyByZXNbMV0gOiAiIiksIFRhby5pc1ZhbGlkVGFvSWQoaXRlbUlkKSB8fCBMaXN0U2VydmljZS50aGF0Lml0ZW1UeXBlICE9IEl0ZW1UeXBlLlN1bmluZyB8fCAoaXRlbUlkID0gJGRvbS5hdHRyKCJpZCIpKS5zcGxpdCgiLSIpLmxlbmd0aCA+IDEgJiYgKGl0ZW1JZCA9IGl0ZW1JZC5zcGxpdCgiLSIpWzFdICsgIi0iICsgaXRlbUlkLnNwbGl0KCItIilbMF0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgVGFvLmlzVmFsaWRUYW9JZChpdGVtSWQpID8gKHRoaXMuaW5pdEJveEh0bWwoJGRvbSwgaXRlbUlkKSwgdGhpcy5pbml0VGFnQ2xhc3MoJGRvbSwgaXRlbUlkKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICRkb20uYWRkQ2xhc3MoIm9uZWtleXZpcC1ib3gtZG9uZSIpKSA6IExvZ2dlci5kZWJ1ZygiXHU1NTQ2XHU1NGMxXHU1MjE3XHU4ODY4aWRcdTY1ZTBcdTY1NDg6IiArIGl0ZW1JZCksIAogICAgICAgICAgICAgICAgICAgICAgICBbIDIgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBMaXN0U2VydmljZS5wcm90b3R5cGUuaW5pdFRhZ0NsYXNzID0gZnVuY3Rpb24odGFyZ2V0LCBpdGVtSWQpIHsKICAgICAgICAgICAgdGhpcy5hdHJhY2suZm9yRWFjaCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoZSkuaGFzQ2xhc3MoIm9uZWtleXZpcC1pdGVtLSIgKyBpdGVtSWQpIHx8IHRhcmdldC5maW5kKGUpLmFkZENsYXNzKCJvbmVrZXl2aXAtaXRlbS0iICsgaXRlbUlkKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5pbml0Qm94SHRtbCA9IGZ1bmN0aW9uKHRhcmdldCwgaXRlbUlkKSB7CiAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoJzxkaXYgY2xhc3M9Im9uZWtleXZpcC0nICsgdGhpcy5pdGVtVHlwZSArICctYm94LWFyZWEgb25la2V5dmlwLWJveC13YWl0IiBkYXRhLWl0ZW1pZD0iJyArIGl0ZW1JZCArICciPjxhIGNsYXNzPSJvbmVrZXl2aXAtYm94LWluZm8gb25la2V5dmlwLScgKyB0aGlzLml0ZW1UeXBlICsgJy1ib3gtaW5mby1kZWZhdWx0IiB0aXRsZT0iXHU3MGI5XHU1MWZiXHU2N2U1XHU4YmUyIj5cdTVmODVcdTY3ZTVcdThiZTI8L2E+PC9kaXY+Jyk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLmluaXRRdWVyeSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgICQoIi5vbmVrZXl2aXAtYm94LXdhaXQiKS5lYWNoKChmdW5jdGlvbihpbmRleCwgZWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgcyA9IENvcmUucmFuZG9tKDEsIDUpOwogICAgICAgICAgICAgICAgQ29yZS5zbGVlcChzKS50aGVuKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0LnF1ZXJ5SW5mbyhlbGUpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnF1ZXJ5SW5mbyA9IGZ1bmN0aW9uKHRhcmdldCkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgUHJvbWlzZSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQsICR0aGlzLCBpdGVtSWQsIGssIHJlbmRlciwgY291cG9uSW5mbzsKICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCAoZnVuY3Rpb24oX2EpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0ID0gdGhpcywgKCR0aGlzID0gJCh0YXJnZXQpKS5yZW1vdmVDbGFzcygib25la2V5dmlwLWJveC13YWl0IiksIGl0ZW1JZCA9ICR0aGlzLmRhdGEoIml0ZW1pZCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgayA9IHRoYXQua2V5ICsgIl9BbGwyXyIgKyBMaXN0U2VydmljZS50aGF0Lml0ZW1UeXBlICsgIl8iICsgaXRlbUlkLCByZW5kZXIgPSBmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9IChudWxsID09IHJlcyA/IHZvaWQgMCA6IHJlcy5jb2RlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3Vwb25JbmZvXzEgPSByZXMuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmluaXRDb3Vwb25JbmZvKGl0ZW1JZCwgY291cG9uSW5mb18xLCB0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHRoYXQuc2hvd1F1ZXJ5RW1wdHkoJHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAoY291cG9uSW5mbyA9IENvbmZpZy5nZXQoaykpID8gKHJlbmRlcihjb3Vwb25JbmZvKSwgWyAzLCAzIF0pIDogWyAzLCAxIF07CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyA0LCBSb3V0ZS5jb3Vwb25RdWVyeShpdGVtSWQsIHRoYXQuaXRlbVR5cGUsIChmdW5jdGlvbihjb3Vwb25JbmZvUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXIoY291cG9uSW5mb1Jlc3VsdCksIENvbmZpZy5zZXQoaywgY291cG9uSW5mbywgNDMyMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgXTsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKSwgX2EubGFiZWwgPSAzOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5pbml0Q291cG9uSW5mbyA9IGZ1bmN0aW9uKGl0ZW1JZCwgY291cG9uSW5mbywgdGFyZ2V0KSB7CiAgICAgICAgICAgIHZhciBfYSwgY291cG9uLCAkdGhpcyA9ICQodGFyZ2V0KSwgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIChudWxsID09PSAoX2EgPSBudWxsID09IGNvdXBvbkluZm8gPyB2b2lkIDAgOiBjb3Vwb25JbmZvLmNvdXBvbnMpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCAmJiAwICE9IGNvdXBvbkluZm8uY291cG9uc1swXS5jb3Vwb25fcHJpY2UgJiYgbnVsbCAhPSBjb3Vwb25JbmZvLmNvdXBvbnNbMF0uY291cG9uX3ByaWNlID8gKGNvdXBvbiA9IGNvdXBvbkluZm8uY291cG9uc1swXSwgCiAgICAgICAgICAgIHRoaXMuc2hvd1F1ZXJ5RmluZCgkdGhpcywgY291cG9uLmNvdXBvbl9wcmljZSkpIDogdGhhdC5zaG93UXVlcnlFbXB0eSgkdGhpcyksIHRoaXMuc2hvd0l0ZW1VcmwoaXRlbUlkLCBudWxsID09IGNvdXBvbkluZm8gPyB2b2lkIDAgOiBjb3Vwb25JbmZvLml0ZW1fdXJsLCB0aGF0LnNpdGUgPT0gU2l0ZUVudW0uSmluZ0RvbmcgfHwgdGhhdC5zaXRlID09IFNpdGVFbnVtLlN1TmluZyk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnNob3dJdGVtVXJsID0gZnVuY3Rpb24oaXRlbUlkLCBpdGVtVXJsLCBmbGFnKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gZmxhZyAmJiAoZmxhZyA9ICExKSwgZmxhZyA/ICQoIi5vbmVrZXl2aXAtaXRlbS0iICsgaXRlbUlkKS5lYWNoKChmdW5jdGlvbihpLCBlbGUpIHsKICAgICAgICAgICAgICAgIGVsZS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpdGVtVXJsIHx8IChDb3JlLm9wZW4oaXRlbVVybCksICExKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKSA6ICQoIi5vbmVrZXl2aXAtaXRlbS0iICsgaXRlbUlkKS5lYWNoKChmdW5jdGlvbihpLCBlbGUpIHsKICAgICAgICAgICAgICAgICQoZWxlKS5vbigiY2xpY2siLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvZ2dlci5kZWJ1ZygiXHU3MGI5XHU1MWZiOiIgKyBpdGVtVXJsKSwgIWl0ZW1VcmwgfHwgKENvcmUub3BlbihpdGVtVXJsKSwgCiAgICAgICAgICAgICAgICAgICAgITEpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLl9pbml0UXVlcnkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF9hLCB0aGF0ID0gdGhpczsKICAgICAgICAgICAgbnVsbCA9PT0gKF9hID0gJCgiLmdvb2RzIikpIHx8IHZvaWQgMCA9PT0gX2EgfHwgX2EuZWFjaCgoZnVuY3Rpb24oaSwgZWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IENvcmUucmFuZG9tKDEsIDUpOwogICAgICAgICAgICAgICAgQ29yZS5zbGVlcChtKS50aGVuKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9xdWVyeUNvdXBvbihlbGUpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLl9xdWVyeUNvdXBvbiA9IGZ1bmN0aW9uKHRhcmdldCkgewogICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBocmVmLCBpdGVtSWRzLCB0aGF0LCBpdGVtSWQsIGtleV8xLCBxdWFuXzE7CiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9iKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHJlZiA9IG51bGwgPT09IChfYSA9ICQodGFyZ2V0KS5maW5kKCJhIilbMF0pIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5ocmVmLCAKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkcyA9IC9rYW9sYVwuY29tXC9wcm9kdWN0XC8oLio/KVwuaHRtbC8uZXhlYyhocmVmKSwgdGhhdCA9IHRoaXMsIG51bGwgIT0gaXRlbUlkcyAmJiAobnVsbCA9PSBpdGVtSWRzID8gdm9pZCAwIDogaXRlbUlkcy5sZW5ndGgpID4gMSA/IChpdGVtSWQgPSBpdGVtSWRzWzFdLCAKICAgICAgICAgICAgICAgICAgICAgICAga2V5XzEgPSAia29sLSIgKyBpdGVtSWQsIChxdWFuXzEgPSBDb25maWcuZ2V0KGtleV8xKSkgPyAodGhpcy5fc2hvd0l0ZW1VcmwodGFyZ2V0LCBxdWFuXzEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgWyAzLCAzIF0pIDogWyAzLCAxIF0pIDogWyAzLCAzIF07CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29uZmlnLmNsZWFyKGtleV8xKSwgWyA0LCBSb3V0ZS5xdWVyeUtsQ291cG9ucyhpdGVtSWQpLnRoZW4oKGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gcmVzID8gdm9pZCAwIDogcmVzLmNvZGUpICYmIChDb25maWcuc2V0KGtleV8xLCByZXMuZGF0YSwgODY0MDApLCB0aGF0Ll9zaG93SXRlbVVybCh0YXJnZXQsIHF1YW5fMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgXTsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKSwgX2IubGFiZWwgPSAzOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIExpc3RTZXJ2aWNlLnByb3RvdHlwZS5fc2hvd0l0ZW1VcmwgPSBmdW5jdGlvbih0YXJnZXQsIHF1YW4pIHsKICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICBudWxsID09PSAoX2EgPSAkKHRhcmdldCkuZmluZCgiYSIpKSB8fCB2b2lkIDAgPT09IF9hIHx8IF9hLm9uKCJjbGljayIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBMb2dnZXIuZGVidWcocXVhbiksICFxdWFuLnF1YW5fbGluayB8fCAoQ29yZS5vcGVuKHF1YW4ucXVhbl9saW5rKSwgITEpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnNob3dRdWVyeUZpbmQgPSBmdW5jdGlvbihzZWxlY3RvciwgY291cG9uTW9uZXkpIHsKICAgICAgICAgICAgc2VsZWN0b3IuaHRtbCgnPGEgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJvbmVrZXl2aXAtYm94LWluZm8gb25la2V5dmlwLWJveC1pbmZvLWZpbmQiIHRpdGxlPSJcdTUyMDdcdTYzNjJcdTkwMGZcdTY2MGVcdTVlYTYiPicgKyBjb3Vwb25Nb25leSArICJcdTUxNDNcdTUyMzg8L2E+Iik7CiAgICAgICAgfSwgTGlzdFNlcnZpY2UucHJvdG90eXBlLnNob3dRdWVyeUVtcHR5ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICAgICAgc2VsZWN0b3IuYWRkQ2xhc3MoIm9uZWtleXZpcC1ib3gtaW5mby10cmFuc2x1Y2VudCIpLCBzZWxlY3Rvci5odG1sKCc8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0ib25la2V5dmlwLWJveC1pbmZvIG9uZWtleXZpcC1ib3gtaW5mby1lbXB0eSIgdGl0bGU9Ilx1NTIwN1x1NjM2Mlx1OTAwZlx1NjYwZVx1NWVhNiI+XHU2NjgyXHU2NWUwXHU0ZjE4XHU2MGUwPC9hPicpOwogICAgICAgIH0sIExpc3RTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgY3NzXzI0OHokNSA9ICIjY29udGVudF92aWV3cyBwcmUge1xuICAgIC13ZWJraXQtdG91Y2gtY2FsbG91dDogYXV0byAhaW1wb3J0YW50O1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAta2h0bWwtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgLW1zLXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbn1cblxuI2NvbnRlbnRfdmlld3MgcHJlIGNvZGUge1xuICAgIC13ZWJraXQtdG91Y2gtY2FsbG91dDogYXV0byAhaW1wb3J0YW50O1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAta2h0bWwtdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgLW1zLXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgdXNlci1zZWxlY3Q6IGF1dG8gIWltcG9ydGFudDtcbn1cblxuLnBhc3Nwb3J0LWxvZ2luLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuIiwgCiAgICBzdHlsZUluamVjdChjc3NfMjQ4eiQ1KSwgQ3NkbkFkU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIENzZG5BZFNlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLkNTRE4sIC9ibG9nXC5jc2RuXC5uZXQvaSBdIF0pLCBfdGhpcy5fYXBwTmFtZSA9ICJjc2RuIiwgCiAgICAgICAgICAgIF90aGlzLl91bmlxdWUgPSAhMSwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoQ3NkbkFkU2VydmljZSwgX3N1cGVyKSwgQ3NkbkFkU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7fSwgCiAgICAgICAgQ3NkbkFkU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENvbmZpZy5nZXQoQ29uZmlnRW51bS5DU0ROX09wQWRDbGVhbiwgITApICYmIENvcmUuYmFja2dyb3VuZCh0aGlzLnJlbW92ZUFkcywgMyksIAogICAgICAgICAgICBDb25maWcuZ2V0KENvbmZpZ0VudW0uQ1NETl9PcENsaXBib2FyZENsZWFuLCAhMCkgJiYgdGhpcy5jbGlwYm9hcmRDbGVhbigpLCBDb25maWcuZ2V0KENvbmZpZ0VudW0uQ1NETl9PcENvbW1lbnRDbGVhbiwgITApICYmIHRoaXMuY29tbWVudENsZWFuKCksIAogICAgICAgICAgICBDb25maWcuZ2V0KENvbmZpZ0VudW0uQ1NETl9PcEltZ0xpbmssICEwKSAmJiB0aGlzLmNvbW1lbnRGaWxlKCksIENvbmZpZy5nZXQoQ29uZmlnRW51bS5DU0ROX09wQXJ0aWNsZUNsZWFuLCAhMCkgJiYgdGhpcy5hcnRpY2xlQ2xlYW4oKTsKICAgICAgICB9LCBDc2RuQWRTZXJ2aWNlLnByb3RvdHlwZS5jbGlwYm9hcmRDbGVhbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBMb2dnZXIuaW5mbygiXHU1OTBkXHU1MjM2XHU3Yzk4XHU4ZDM0XHU1MWMwXHU1MzE2IiksIENvcmUuYmFja2dyb3VuZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB1bnNhZmVXaW5kb3cuY3Nkbi5jb3B5cmlnaHQudGV4dERhdGEgPSAiIjsKICAgICAgICAgICAgfSkpLCBDb3JlLmF1dG9MYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJCgiLmhsanMtYnV0dG9uIikubGVuZ3RoID4gMDsKICAgICAgICAgICAgfSksIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfYSwgY29weUJ0biA9ICQoIi5obGpzLWJ1dHRvbiIpOwogICAgICAgICAgICAgICAgY29weUJ0bi5sZW5ndGggPiAwICYmIChjb3B5QnRuLnJlbW92ZUNsYXNzKCJzaWduaW4iKSwgY29weUJ0bi5hdHRyKCJkYXRhLXRpdGxlIiwgIlx1NTkwZFx1NTIzNiIpLCAKICAgICAgICAgICAgICAgIGNvcHlCdG4uYXR0cigib25jbGljayIsICJobGpzLmNvcHlDb2RlKGV2ZW50KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JCgnLmhsanMtYnV0dG9uJykuYXR0cignZGF0YS10aXRsZScsICdcdTU5MGRcdTUyMzYnKTt9LDM1MDApOyIpKSwgCiAgICAgICAgICAgICAgICBudWxsID09PSAoX2EgPSAkKCJjb2RlIikpIHx8IHZvaWQgMCA9PT0gX2EgfHwgX2EuYXR0cigib25jbGljayIsICJtZGNwLmNvcHlDb2RlKGV2ZW50KSIpLCAKICAgICAgICAgICAgICAgICQoImNvZGUiKS5iaW5kKCJjb3B5IiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIHRleHQgPSBudWxsID09PSAoX2EgPSB1bnNhZmVXaW5kb3cuZ2V0U2VsZWN0aW9uKCkpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHRleHQgJiYgKENvcmUuY29weVRleHQodGV4dCkgPyBzQWxlcnQuaW5mbygiXHU1OTBkXHU1MjM2XHU2MjEwXHU1MjlmIikgOiBzQWxlcnQuZXJyb3IoIlx1NTkwZFx1NTIzNlx1NTkzMVx1OGQyNSxcdThiZjdcdTVjMWRcdThiZDVcdTRmN2ZcdTc1MjhcdTYzMDlcdTk0YWVcdTU5MGRcdTUyMzYiKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pLCAzKSwgdW5zYWZlV2luZG93LmpRdWVyeSgiI2NvbnRlbnRfdmlld3MiKS51bmJpbmQoImNvcHkiKTsKICAgICAgICB9LCBDc2RuQWRTZXJ2aWNlLnByb3RvdHlwZS5yZW1vdmVBZHMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ3NkbkFkU2VydmljZS5hZFNlbGVjdG9ycy5mb3JFYWNoKChmdW5jdGlvbihzZWxlY3RvcikgewogICAgICAgICAgICAgICAgJChzZWxlY3RvcikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBDc2RuQWRTZXJ2aWNlLnByb3RvdHlwZS5jb21tZW50Q2xlYW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ29yZS5sYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBMb2dnZXIuaW5mbygiXHU4YmM0XHU4YmJhXHU1MzNhXHU2ZTA1XHU3NDA2IiksICQoIi5jb21tZW50LWxpc3QtYm94IikuY3NzKCJvdmVyZmxvdyIsICIiKS5jc3MoIm1heC1oZWlnaHQiLCAiIiksIAogICAgICAgICAgICAgICAgJCgiI2NvbW1lbnRQYWdlIikucmVtb3ZlQ2xhc3MoImQtbm9uZSIpLCAkKCIjYnRuTW9yZUNvbW1lbnQiKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSksIDMpOwogICAgICAgIH0sIENzZG5BZFNlcnZpY2UucHJvdG90eXBlLmNvbW1lbnRGaWxlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENvcmUubGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgTG9nZ2VyLmluZm8oIlx1NjU4N1x1NGVmNlx1OTRmZVx1NjNhNVx1NTMzYVx1NTIwNiIpLCAkKCIudHlwZV9kb3dubG9hZCIpLmVhY2goKGZ1bmN0aW9uKGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAkKGUpLnByZXBlbmQoJzxpbWcgc3JjPSJodHRwczovL2NzZG5pbWcuY24vcmVsZWFzZS9kb3dubG9hZGNtc2ZlL3B1YmxpYy9pbWcvc291cmNlLmFjNGM3ZTgzLnBuZyIgZGF0YS12LWQyNTI5ZDVhPSIiIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+Jyk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pLCAzKTsKICAgICAgICB9LCBDc2RuQWRTZXJ2aWNlLnByb3RvdHlwZS5hcnRpY2xlQ2xlYW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ29yZS5sYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBMb2dnZXIuaW5mbygiXHU2NTg3XHU3YWUwXHU1MzNhXHU2ZTA1XHU3NDA2IiksICQoIiNhcnRpY2xlX2NvbnRlbnQiKS5yZW1vdmVBdHRyKCJzdHlsZSIpLCAKICAgICAgICAgICAgICAgICQoIi5oaWRlLWFydGljbGUtYm94IikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBDc2RuQWRTZXJ2aWNlLmFkU2VsZWN0b3JzID0gWyAiI2Zvb3RlclJpZ2h0QWRzIiwgIi5zaWRlLXF1ZXN0aW9uLWJveCIsICJkaXZbaWRePSdkbXBfYWQnXSIsICJkaXZbY2xhc3NePSdhZF8nXSIsICJkaXZbaWRePSdmbG9vci1hZF8nXSIsICIuYWRzYnlnb29nbGUiLCAiI3JlY29tbWVuZEFkQm94IiwgIiNhc2lkZU5ld05wcyIsICIuYm94LXNoYWRvdyIgXSwgCiAgICAgICAgQ3NkbkFkU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIEFsZXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gQWxlcnQoKSB7fQogICAgICAgIHJldHVybiBBbGVydC5vcGVuID0gZnVuY3Rpb24odGl0bHMsIGNvbnRlbnQsIGFyZWEsIHNoYWRlLCBvZmZzZXQsIG1heG1pbikgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBhcmVhICYmIChhcmVhID0gWyAiNDAwcHgiLCAiMzAwcHgiIF0pLCB2b2lkIDAgPT09IHNoYWRlICYmIChzaGFkZSA9IDApLCAKICAgICAgICAgICAgdm9pZCAwID09PSBvZmZzZXQgJiYgKG9mZnNldCA9ICJsYiIpLCB2b2lkIDAgPT09IG1heG1pbiAmJiAobWF4bWluID0gITApLCBsYXllci5vcGVuKHsKICAgICAgICAgICAgICAgIHR5cGU6IDEsCiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bHMsCiAgICAgICAgICAgICAgICBhcmVhOiBhcmVhLAogICAgICAgICAgICAgICAgc2hhZGU6IHNoYWRlLAogICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgICAgICAgICBtYXhtaW46IG1heG1pbiwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgQWxlcnQuaW5mbyA9IGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICByZXR1cm4gbGF5ZXIubXNnKG1zZywgewogICAgICAgICAgICAgICAgdGltZTogMmUzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIEFsZXJ0LmVycm9yID0gZnVuY3Rpb24obXNnKSB7CiAgICAgICAgICAgIHJldHVybiBsYXllci5tc2cobXNnLCB7CiAgICAgICAgICAgICAgICBpY29uOiA1LAogICAgICAgICAgICAgICAgdGltZTogMmUzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIEFsZXJ0LmNvbmZpbSA9IGZ1bmN0aW9uKHRpdGxlLCBtc2csIGJ1dHRvbnMsIGNhbGxiYWNrLCBhdXRvX2Nsb3NlKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gYXV0b19jbG9zZSAmJiAoYXV0b19jbG9zZSA9ICExKTsKICAgICAgICAgICAgdmFyIHRpZCA9IGxheWVyLm9wZW4oewogICAgICAgICAgICAgICAgdHlwZTogMSwKICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSB8fCAhMSwKICAgICAgICAgICAgICAgIGNsb3NlQnRuOiAxLAogICAgICAgICAgICAgICAgc2hhZGU6IC44LAogICAgICAgICAgICAgICAgaWQ6ICJMQVlfbGF5dWlwcm8iLAogICAgICAgICAgICAgICAgcmVzaXplOiAhMSwKICAgICAgICAgICAgICAgIGJ0bjogYnV0dG9ucywKICAgICAgICAgICAgICAgIGJ0bkFsaWduOiAiYyIsCiAgICAgICAgICAgICAgICBtb3ZlVHlwZTogMSwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyBsaW5lLWhlaWdodDogMjJweDsgYmFja2dyb3VuZC1jb2xvcjogIzM5M0Q0OTsgY29sb3I6ICNmZmY7IGZvbnQtd2VpZ2h0OiAzMDA7Ij4nICsgbXNnICsgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICB5ZXM6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaW5kZXgpLCBhdXRvX2Nsb3NlICYmIENvcmUubGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsYXllci5jbG9zZSh0aWQpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0aWQ7CiAgICAgICAgfSwgQWxlcnQucHJvbXB0ID0gZnVuY3Rpb24odGl0bGUsIHYsIGNhbGxiYWNrLCBzaXplLCB0eXBlKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdHlwZSAmJiAodHlwZSA9IDApLCBsYXllci5wcm9tcHQoewogICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICAgICAgdmFsdWU6IHYsCiAgICAgICAgICAgICAgICBmb3JtVHlwZTogdHlwZQogICAgICAgICAgICB9LCAoZnVuY3Rpb24odiwgaSwgZWxlKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayh2KSwgbGF5ZXIuY2xvc2UoaSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBBbGVydC5jbG9zZSA9IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgIGxheWVyLmNsb3NlKGluZGV4KTsKICAgICAgICB9LCBBbGVydC5jbG9zZUFsbCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBsYXllci5jbG9zZUFsbCgpOwogICAgICAgIH0sIEFsZXJ0LmxvYWRpbmcgPSBmdW5jdGlvbihzdHlsZSwgX3RpbWUsIF9zaGFkZSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9LCBBbGVydC5sb2FkaW5nUyA9IGZ1bmN0aW9uKG1zZywgdGltZSkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0aW1lICYmICh0aW1lID0gLTEpLCBTd2FsX19kZWZhdWx0LmRlZmF1bHQuZmlyZSh7CiAgICAgICAgICAgICAgICB0aXRsZTogbXNnLAogICAgICAgICAgICAgICAgZGlkT3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgU3dhbF9fZGVmYXVsdC5kZWZhdWx0LnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6ICExLAogICAgICAgICAgICAgICAgYWxsb3dFc2NhcGVLZXk6ICExLAogICAgICAgICAgICAgICAgdGltZXI6IC0xID09IHRpbWUgPyB2b2lkIDAgOiAxZTMgKiB0aW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIEFsZXJ0OwogICAgfSgpLCBNZW51JDEgPSBDb21tb24uTWVudSwgV2VuS3VTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gV2VuS3VTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5XZW5LdSwgL3dlbmt1XC5iYWlkdVwuY29tXC92aWV3L2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLl91bmlxdWUgPSAhMSwgX3RoaXMubWVudSA9IG5ldyBDb21tb24uTWVudSwgX3RoaXMuX2FwcE5hbWUgPSAiV2VuS3UiLCBfdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhXZW5LdVNlcnZpY2UsIF9zdXBlciksIFdlbkt1U2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICJ1bmRlZmluZWQiID09IHR5cGVvZiAkICYmIENvcmUuYXBwZW5kSnMoIi8vbGliLmJhb21pdHUuY29tL2pxdWVyeS8xLjEyLjQvanF1ZXJ5Lm1pbi5qcyIpOwogICAgICAgIH0sIFdlbkt1U2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMubWVudS5Jbml0KFsgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTY3MmNcdTZiMjFcdTUxNzNcdTk1ZWQiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NjcyY1x1NmIyMTxicj5cdTUxNzNcdTk1ZWQiLAogICAgICAgICAgICAgICAgdHlwZTogInNlYXJjaCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTViZmNcdTUxZmFcdTY1ODdcdTY4NjMiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NWJmY1x1NTFmYTxicj5cdTY1ODdcdTY4NjMiLAogICAgICAgICAgICAgICAgdHlwZTogInByb2Nlc3MiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU3ZWRkXHU0ZTE2XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHNob3c6ICJcdTdlZGRcdTRlMTY8YnI+XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHR5cGU6ICJ0YiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTRlYWNcdTRlMWNcdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NGVhY1x1NGUxYzxicj5cdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgdHlwZTogImpkIgogICAgICAgICAgICB9IF0sIHRoaXMuX29uQ2xpY2spOwogICAgICAgIH0sIFdlbkt1U2VydmljZS5wcm90b3R5cGUuX29uQ2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiYm9keSIsICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXByb2Nlc3NdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2cubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ3b3JkIiAhPSAobnVsbCA9PT0gKF9jID0gbnVsbCA9PT0gKF9iID0gbnVsbCA9PT0gKF9hID0gdW5zYWZlV2luZG93LnBhZ2VEYXRhKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2Eudmlld0JpeikgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLmRvY0luZm8pIHx8IHZvaWQgMCA9PT0gX2MgPyB2b2lkIDAgOiBfYy5maWxlVHlwZSkgPyBbIDMsIDQgXSA6IChudWxsID09PSAoX2YgPSBudWxsID09PSAoX2UgPSBudWxsID09PSAoX2QgPSB1bnNhZmVXaW5kb3cucGFnZURhdGEpIHx8IHZvaWQgMCA9PT0gX2QgPyB2b2lkIDAgOiBfZC5taXhWaXBBbmRVc2VySW5mbykgfHwgdm9pZCAwID09PSBfZSA/IHZvaWQgMCA6IF9lLnVzZXJJbmZvKSB8fCB2b2lkIDAgPT09IF9mID8gdm9pZCAwIDogX2YuaXNMb2dpbikgPyAoQWxlcnQubG9hZGluZ1MoIlx1ODllM1x1Njc5MFx1NGUyZFx1OGJmN1x1N2EwZFx1NTQwZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyA0LCBDb3JlLmxhenlsb2FkKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlbkt1U2VydmljZS5sb2FkRnVsbERvYygpLnRoZW4oKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygiXHU4ZjdkXHU1MTY1XHU2NTg3XHU1ZTkzXHU1MTg1XHU1YmI5XHU1YjhjXHU2MjEwIiksIHdpbmRvdy5zY3JvbGxUbygwLCAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2VuS3VTZXJ2aWNlLmV4cG9ydERvYygpLCBTd2FsX19kZWZhdWx0LmRlZmF1bHQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIC41KSBdKSA6IFsgMywgMiBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9nLnNlbnQoKSwgWyAzLCAzIF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQWxlcnQuZXJyb3IoIlx1OGJmN1x1NTE0OFx1NzY3Ylx1NWY1NSIpLCBfZy5sYWJlbCA9IDM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAzLCA1IF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQWxlcnQuZXJyb3IoIlx1NGVjNVx1NjUyZlx1NjMwMXdvcmRcdTY1ODdcdTY4NjNcdTc2ODRcdTViZmNcdTUxZmEiKSwgX2cubGFiZWwgPSA1OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9c2VhcmNoXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgTWVudSQxLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpLCAkKCJib2R5Iikub24oImNsaWNrIiwgIltkYXRhLWNhdD10Yl0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUub3BlbigiaHR0cDovL3Nob3AuaHVpemhlay5jb20iKTsKICAgICAgICAgICAgICAgICAgICB9KSksICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PWpkXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwOi8vc2hvcC5odWl6aGVrLmNvbSIpOwogICAgICAgICAgICAgICAgICAgIH0pKSwgWyAyIF07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBXZW5LdVNlcnZpY2UuZXhwb3J0RG9jID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBkb2NDb250ZW50LCBkb2MgPSAkKCIucmVhZGVyLXdvcmQtbGF5ZXIiKSwgX2RvYyA9ICQoZG9jKS5jbG9uZSgpOwogICAgICAgICAgICBfZG9jLmVhY2goKGZ1bmN0aW9uKGksIGUpIHsKICAgICAgICAgICAgICAgICQoZSkuaXMoIjpoaWRkZW4iKSAmJiAkKGUpLnJlbW92ZSgpOwogICAgICAgICAgICB9KSksIGRvY0NvbnRlbnQgPSAiTWltZS1WZXJzaW9uOiAxLjBcbkNvbnRlbnQtQmFzZTogIiArIFJ1bnRpbWUudXJsICsgJ1xuQ29udGVudC1UeXBlOiBNdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9Ik5FWFQuSVRFTS1CT1VOREFSWSI7dHlwZT0idGV4dC9odG1sIlxuXG4tLU5FWFQuSVRFTS1CT1VOREFSWVxuQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9InV0Zi04IlxuQ29udGVudC1Mb2NhdGlvbjogJyArIFJ1bnRpbWUudXJsICsgJ1xuXG48IURPQ1RZUEUgaHRtbD5cbjxodG1sPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+XG48c3R5bGU+XG5cbjwvc3R5bGU+XG48L2hlYWQ+XG48Ym9keT5cbicgKyBfZG9jLnRleHQoKS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiPHA+IiArIHQgKyAiPC9wPiI7CiAgICAgICAgICAgIH0pKS5qb2luKCIiKSArICJcbjwvYm9keT5cbjwvaHRtbD5cbi0tTkVYVC5JVEVNLUJPVU5EQVJZLS0iLCBzYXZlQXMobmV3IEJsb2IoWyBkb2NDb250ZW50IF0sIHsKICAgICAgICAgICAgICAgIHR5cGU6ICJhcHBsaWNhdGlvbi9tc3dvcmQ7Y2hhcnNldD11dGYtOCIKICAgICAgICAgICAgfSksIHVuc2FmZVdpbmRvdy5wYWdlRGF0YS52aWV3Qml6LmRvY0luZm8udGl0bGUgKyAiLmRvYyIpOwogICAgICAgIH0sIFdlbkt1U2VydmljZS5zY3JvbGxUb0VuZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQ29yZS5hdXRvTGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF9hLCBkb2NFbGUgPSB1bnNhZmVXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBoZWlnaHRUb3RhbCA9IGRvY0VsZS5zY3JvbGxIZWlnaHQsIHNjcm9sbFRvcCA9IG51bGwgIT09IChfYSA9IGRvY0VsZS5zY3JvbGxUb3ApICYmIHZvaWQgMCAhPT0gX2EgPyBfYSA6IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbFRvcCwgY2xpZW50SGVpZ2h0ID0gZG9jRWxlLmNsaWVudEhlaWdodDsKICAgICAgICAgICAgICAgIHJldHVybiBoZWlnaHRUb3RhbCAtIHNjcm9sbFRvcCA8PSAxLjEgKiBjbGllbnRIZWlnaHQgfHwgKHdpbmRvdy5zY3JvbGwoMCwgc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0IC8gNCksIAogICAgICAgICAgICAgICAgITEpOwogICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKCJcdTZlZGFcdTUyYThcdTdlZDNcdTY3NWYiKTsKICAgICAgICAgICAgfSksIC4xKTsKICAgICAgICB9LCBXZW5LdVNlcnZpY2UubG9hZEZ1bGxEb2MgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcywgZnVuZGVkID0gITEsIHRoYXQgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gQ29yZS5hdXRvTGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIF9hLCBidG4gPSBudWxsICE9PSAoX2EgPSB1bnNhZmVXaW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmdvQnRuIikpICYmIHZvaWQgMCAhPT0gX2EgPyBfYSA6IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucmVhZC1hbGwiKTsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5kZWQgPSAhMCwgbnVsbCAhPSBidG4gfHwgZnVuZGVkOwogICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnRuLCBfYTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGJ0biA9IG51bGwgIT09IChfYSA9IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuZ29CdG4iKSkgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogdW5zYWZlV2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yZWFkLWFsbCIpKSAmJiAkKGJ0bikuY2xpY2soKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcoIlx1OGZkYlx1NTE2NVx1NmVkYVx1NTJhOCIpLCBbIDQsIHRoYXQuc2Nyb2xsVG9FbmQoKSBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2Iuc2VudCgpLCBMb2dnZXIuZGVidWcoIlx1N2VkM1x1Njc1Zlx1NmVkYVx1NTJhOCIpLCBbIDIgXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSksIDIpOwogICAgICAgIH0sIFdlbkt1U2VydmljZS5sb2FkZWQgPSAhMSwgV2VuS3VTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgTGlua0p1bXBTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gTGlua0p1bXBTZXJ2aWNlKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5DU0ROLCAvbGlua1wuY3NkblwubmV0L2kgXSwgWyBTaXRlRW51bS5aaGlIdSwgL2xpbmtcLnpoaWh1XC5jb20vaSBdLCBbIFNpdGVFbnVtLkppYW5TaHUsIC93d3dcLmppYW5zaHVcLmNvbVwvZ28td2lsZC9pIF0sIFsgU2l0ZUVudW0uR2l0ZWUsIC9naXRlZVwuY29tXC9saW5rL2kgXSwgWyBTaXRlRW51bS5KdWVKaW4sIC9qdWVqaW5cLmNuXC9cP3RhcmdldC9pIF0sIFsgU2l0ZUVudW0uV2VpYm8sIC93ZWlib1wuY25cL3NpbmF1cmwvaSBdLCBbIFNpdGVFbnVtLlR1WGlhb0NoYW8sIC9zdXBwb3J0XC5xcVwuY29tXC9wcm9kdWN0c1wvLipcL2xpbmstanVtcC9pIF0sIFsgU2l0ZUVudW0uT3NDaCwgL29zY2hpbmFcLm5ldFwvYWN0aW9uXC9Hb1RvTGluay9pIF0sIFsgU2l0ZUVudW0uQWlGYURpYW4sIC9hZmRpYW5cLm5ldFwvbGlua1w/dGFyZ2V0L2kgXSwgWyBTaXRlRW51bS5CYWlkdSwgL2p1bXAoMj8pXC5iZGltZ1wuY29tXC9zYWZlY2hlY2svaSBdLCBbIFNpdGVFbnVtLkRvdUJhbiwgL3d3d1wuZG91YmFuXC5jb21cL2xpbmsyXC8vIF0sIFsgU2l0ZUVudW0uZzE3MTczLCAvbGlua1wuMTcxNzNcLmNvbVwvXD90YXJnZXQvaSBdLCBbIFNpdGVFbnVtLlRlbmNlbnREb2MsIC9kb2NzXC5xcVwuY29tXC9zY2VuYXJpb1wvbGluay9pIF0sIFsgU2l0ZUVudW0uVGVuY2VudE1haWwsIC9tYWlsXC5xcVwuY29tXC9jZ2ktYmluXC9yZWFkdGVtcGxhdGUvaSBdLCBbIFNpdGVFbnVtLlRlbmNlbnRRUSwgL2NcLnBjXC5xcVwuY29tXC8obWlkZGxlbXxpb3MpXC5odG1sL2kgXSwgWyBTaXRlRW51bS5Tc1BBaSwgL3NzcGFpXC5jb21cL2xpbmsvaSBdLCBbIFNpdGVFbnVtLk5vZGVTZWVrLCAvbm9kZXNlZWtcLmNvbVwvanVtcC9pIF0sIFsgU2l0ZUVudW0uS2luZ1NvZnREb2MsIC9wXC5rZG9jc1wuY25cL29mZmljZVwvbGluay9pIF0sIFsgU2l0ZUVudW0uVGVuY2VudENsb3VkQmxvZywgL2Nsb3VkXC50ZW5jZW50XC5jb21cL2RldmVsb3BlclwvdG9vbHNcL2Jsb2ctZW50cnkvaSBdLCBbIFNpdGVFbnVtLlVpc2RjLCAvbGlua1wudWlzZGNcLmNvbVwvXD9yZWRpcmVjdC9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5rZXkgPSAiIiwgX3RoaXMuc2VsZWN0b3IgPSAiIiwgX3RoaXMuX3VuaXF1ZSA9ICExLCBfdGhpcy5fYXBwTmFtZSA9ICJMaW5rSnVtcCIsIAogICAgICAgICAgICBfdGhpcy5zZW1pdWkgPSAhMCwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoTGlua0p1bXBTZXJ2aWNlLCBfc3VwZXIpLCBMaW5rSnVtcFNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIExpbmtKdW1wU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB1cmwsIGtleXMsIGl0ZW0sIGNvbmZpZyA9ICJBdXRvSnVtcF8iICsgdGhpcy5zaXRlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zaXRlKSB7CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5DU0ROOgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uWmhpSHU6CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5HaXRlZToKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLkp1ZUppbjoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLkFpRmFEaWFuOgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uZzE3MTczOgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uU3NQQWk6CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5LaW5nU29mdERvYzoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlRlbmNlbnRDbG91ZEJsb2c6CiAgICAgICAgICAgICAgICB0aGlzLmtleSA9ICJ0YXJnZXQiOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uSmlhblNodToKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLkRvdUJhbjoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLk9zQ2g6CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5UZW5jZW50RG9jOgogICAgICAgICAgICAgICAgdGhpcy5rZXkgPSAidXJsIjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlRlbmNlbnRRUToKICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gInBmdXJsLHVybCI7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5XZWlibzoKICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gInUiOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uVHVYaWFvQ2hhbzoKICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gImp1bXAiOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uQmFpZHU6CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gIi5saW5rIjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlRlbmNlbnRNYWlsOgogICAgICAgICAgICAgICAgdGhpcy5rZXkgPSAiZ291cmwiOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uTm9kZVNlZWs6CiAgICAgICAgICAgICAgICB0aGlzLmtleSA9ICJ0byI7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5VaXNkYzoKICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gInJlZGlyZWN0IjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhpcy5rZXkgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQ29uZmlnLmdldChjb25maWcsICEwKSkgewogICAgICAgICAgICAgICAgaWYgKHVybCA9ICIiLCAiIiAhPSB0aGlzLmtleSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaXRlbSBpbiBrZXlzID0gdGhpcy5rZXkuc3BsaXQoIiwiKSkgaWYgKG51bGwgIT0gKHVybCA9IENvcmUuZ2V0UGFyKGtleXNbaXRlbV0pKSAmJiAiIiAhPSB1cmwpIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlICIiICE9IHRoaXMuc2VsZWN0b3IgJiYgKHVybCA9ICQodGhpcy5zZWxlY3RvcikudGV4dCgpKTsKICAgICAgICAgICAgICAgIG51bGwgIT0gdXJsICYmICIiICE9IHVybCA/ICgodXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybCkpLmVuZHNXaXRoKCIvIikgJiYgKHVybCA9IHVybC5zdWJzdHIoMCwgdXJsLmxlbmd0aCAtIDEpKSwgCiAgICAgICAgICAgICAgICBUb2FzdC5zdWNjZXNzKCJcdTk0ZmVcdTYzYTVcdTVkZjJcdTg5ZTNcdTY3OTAsXHU2YjYzXHU1NzI4XHU4ZGYzXHU4ZjZjfiIpLCB0aGlzLmp1bXAodXJsKSkgOiAoVG9hc3Qud2FybmluZygiXHU2NzJhXHU4MGZkXHU4OWUzXHU2NzkwXHU1MjMwXHU5NGZlXHU2M2E1LFx1OGJmN1x1NjI0Ylx1NTJhOFx1OGRmM1x1OGY2YyIpLCAKICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygiXHU4OWUzXHU2NzkwXHU5NGZlXHU2M2E1OiIgKyB1cmwgKyAiLGtleToiICsgdGhpcy5rZXkpKTsKICAgICAgICAgICAgfSBlbHNlIFRvYXN0Lndhcm5pbmcoIlx1NWRmMlx1NTE3M1x1OTVlZFx1NjcyY1x1N2Y1MVx1N2FkOVx1NzY4NFx1OGRmM1x1OGY2Y1x1NTI5Zlx1ODBmZCIpOwogICAgICAgIH0sIExpbmtKdW1wU2VydmljZS5wcm90b3R5cGUuanVtcCA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB1cmwgJiYgKCh1cmwgPSBkZWNvZGVVUklDb21wb25lbnQodXJsKSkuaW5kZXhPZigiOlxcIikgPCAxICYmICF1cmwuc3RhcnRzV2l0aCgiaHR0cDovLyIpICYmICF1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAmJiAodXJsID0gImh0dHA6Ly8iICsgdXJsKSwgCiAgICAgICAgICAgIExvZ2dlci5kZWJ1Zyh1cmwpLCB1bnNhZmVXaW5kb3cud2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmwpOwogICAgICAgIH0sIExpbmtKdW1wU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIGNzc18yNDh6JDQgPSAiLnNsaWRlciArIGRpdiwgLnNsaWRlciArIGRpdiArIGEsXG4udGV4dHMsXG4uaGVhZGVyX25ldzEsXG4uc2xpZGVyX3RpcHMge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbiIsIAogICAgc3R5bGVJbmplY3QoY3NzXzI0OHokNCksIF9Hd2RTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gX0d3ZFNlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5TdU5pbmcsIC9icm93c2VyXC5nd2RhbmdcLmNvbS9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fYXBwTmFtZSA9ICJzbl9jbGVhciIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKF9Hd2RTZXJ2aWNlLCBfc3VwZXIpLCBfR3dkU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7fSwgCiAgICAgICAgX0d3ZFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge30sIF9Hd2RTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgQXV0b0V4cGFuZFNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBBdXRvRXhwYW5kU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uQ1NETiwgL2Jsb2dcLmNzZG5cLm5ldFwvKi9pIF0sIFsgU2l0ZUVudW0uQ1NETl9Eb3dubG9hZCwgL2Rvd25sb2FkXC5jc2RuXC5uZXRcL2Rvd25sb2FkL2kgXSwgWyBTaXRlRW51bS5TaUNodWFuZywgL2lzcGFjZXNvZnRcLmNvbVwvLio/XC5odG1sL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLmNvbnRlbnRTdHlsZSA9ICJ7aGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7bWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50O30iLCBfdGhpcy5leHBhbmRSdWxlcyA9IFsgewogICAgICAgICAgICAgICAgc2l0ZTogWyBTaXRlRW51bS5DU0ROIF0sCiAgICAgICAgICAgICAgICBzZWxlY3RvcjogWyAiLmd1aWRlLWJveCIsICIud2FwLXNoYWRvd2JveCIsICIucmVhZGFsbF9ib3giLCAiLmJ0bl9vcGVuX2FwcF9wcm9tcHRfZGl2IiBdLAogICAgICAgICAgICAgICAgY29udGVudDogWyAiLmFydGljbGVfY29udGVudCIgXSwKICAgICAgICAgICAgICAgIGNsaWNrZXI6IFsgIi5oaWRlLXByZUNvZGUtYnQiIF0sCiAgICAgICAgICAgICAgICBzdHlsZTogW10sCiAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoIi5jb250YWluZXItZmx1aWQiKS5vbigiY2xpY2siLCAoZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9ICQoZXZlbnQpLmF0dHIoImRhdGEtdXJsIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCAmJiAodW5zYWZlV2luZG93LndpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsLCBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHNpdGU6IFsgU2l0ZUVudW0uQ1NETl9Eb3dubG9hZCBdLAogICAgICAgICAgICAgICAgc2VsZWN0b3I6IFtdLAogICAgICAgICAgICAgICAgc3R5bGU6IFtdLAogICAgICAgICAgICAgICAgY29udGVudDogWyAiLmRldGFpbC5oaWRkZW4ubm8tcHJldmlldyIgXSwKICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24oKSB7fSwKICAgICAgICAgICAgICAgIGNsaWNrZXI6IFsgIiNkb3dubG9hZC1kZXRhaWwgLmZsW3JvbGVdIiBdCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHNpdGU6IFsgU2l0ZUVudW0uU2lDaHVhbmcgXSwKICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBbXSwKICAgICAgICAgICAgICAgIHN0eWxlOiBbXSwKICAgICAgICAgICAgICAgIGNsaWNrZXI6IFsgIi5lbnRyeS1yZWFkbW9yZS1idG4iIF0sCiAgICAgICAgICAgICAgICBjb250ZW50OiBbXSwKICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24oKSB7fQogICAgICAgICAgICB9IF0sIF90aGlzLl9hcHBOYW1lID0gImF1dG9FeHBhbmQiLCBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKEF1dG9FeHBhbmRTZXJ2aWNlLCBfc3VwZXIpLCBBdXRvRXhwYW5kU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7fSwgCiAgICAgICAgQXV0b0V4cGFuZFNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuZXhwYW5kUnVsZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgZS5zaXRlLmluZGV4T2YodGhhdC5zaXRlKSA+IC0xICYmIChlLnNlbGVjdG9yLmxlbmd0aCA+IDAgJiYgZS5zZWxlY3Rvci5mb3JFYWNoKChmdW5jdGlvbihzZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgICQoc2VsZWN0b3IpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfSkpLCBlLmNsaWNrZXIubGVuZ3RoID4gMCAmJiBlLmNsaWNrZXIuZm9yRWFjaCgoZnVuY3Rpb24oY2xpY2tlcikgewogICAgICAgICAgICAgICAgICAgIENvcmUubGF6eWxvYWQoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKGNsaWNrZXIpLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgICAgICAgICAgICAgfSksIDIpLCBMb2dnZXIuaW5mbygiXHU4MWVhXHU1MmE4XHU1YzU1XHU1ZjAwLVx1NzBiOVx1NTFmYjoiICsgY2xpY2tlcik7CiAgICAgICAgICAgICAgICB9KSksIGUuc3R5bGUubGVuZ3RoID4gMCAmJiBlLnN0eWxlLmZvckVhY2goKGZ1bmN0aW9uKHN0eWxlKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5hcHBlbmRDc3NDb250ZW50KHN0eWxlKTsKICAgICAgICAgICAgICAgIH0pKSwgZS5jb250ZW50Lmxlbmd0aCA+IDAgJiYgQ29yZS5hcHBlbmRDc3NDb250ZW50KCIiICsgZS5jb250ZW50LmpvaW4oIiAiKSArIHRoYXQuY29udGVudFN0eWxlKSwgCiAgICAgICAgICAgICAgICBudWxsICE9IGUuc2NyaXB0ICYmIGUuc2NyaXB0LmFwcGx5KFtdKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBBdXRvRXhwYW5kU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIEJJbGlUb29scyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIEJJbGlUb29scygpIHt9CiAgICAgICAgcmV0dXJuIEJJbGlUb29scy5hdjJCdiA9IGZ1bmN0aW9uKGF2Tm8pIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgYXYgPSBhdk5vLnRvU3RyaW5nKCksIG51bSA9IE5hTjsKICAgICAgICAgICAgaWYgKCJbb2JqZWN0IE51bWJlcl0iID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXYpID8gbnVtID0gYXZObyA6ICJbb2JqZWN0IFN0cmluZ10iID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXYpICYmIChudW0gPSBwYXJzZUludChhdi5yZXBsYWNlKC9bXjAtOV0vZ3UsICIiKSkpLCAKICAgICAgICAgICAgaXNOYU4obnVtKSB8fCBudW0gPD0gMCkgcmV0dXJuICIiOwogICAgICAgICAgICBmb3IgKG51bSA9IChudW0gXiB0aGlzLnhvcikgKyB0aGlzLmFkZCwgcmVzdWx0ID0gX19zcHJlYWQoIkJWMSAgNCAxIDcgICIpLCBpID0gMDsgaSA8IDY7ICkgcmVzdWx0W3RoaXMuc1tpXV0gPSB0aGlzLnRhYmxlW01hdGguZmxvb3IobnVtIC8gTWF0aC5wb3coNTgsIGkpKSAlIDU4XSwgCiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKICAgICAgICB9LCBCSWxpVG9vbHMuYnYyQXYgPSBmdW5jdGlvbihidikgewogICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBzdHIgPSAiIjsKICAgICAgICAgICAgaWYgKDEyID09PSBidi5sZW5ndGgpIHN0ciA9IGJ2OyBlbHNlIGlmICgxMCA9PT0gYnYubGVuZ3RoKSBzdHIgPSAiQlYiICsgYnY7IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKDkgIT09IGJ2Lmxlbmd0aCkgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgc3RyID0gIkJWMSIgKyBidjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0ci5tYXRjaCgvW0JiXVtWdl1bZlpvZFI5WFFEU1VtMjF5Q2tyNnpCcWl2ZVlhaDhidDR4c1dwSG5KRTdqTDVWRzNndU1US05QQXdjRl17MTB9L2d1KSkgcmV0dXJuIC0xOwogICAgICAgICAgICBmb3IgKHJlc3VsdCA9IDAsIGkgPSAwOyBpIDwgNjsgKSByZXN1bHQgKz0gdGhpcy50YWJsZS5pbmRleE9mKHN0clt0aGlzLnNbaV1dKSAqIE1hdGgucG93KDU4LCBpKSwgCiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KCJhdiIgKyAocmVzdWx0IC0gdGhpcy5hZGQgXiB0aGlzLnhvcikpOwogICAgICAgIH0sIEJJbGlUb29scy50YWJsZSA9IF9fc3ByZWFkKCJmWm9kUjlYUURTVW0yMXlDa3I2ekJxaXZlWWFoOGJ0NHhzV3BIbkpFN2pMNVZHM2d1TVRLTlBBd2NGIiksIAogICAgICAgIEJJbGlUb29scy5zID0gWyAxMSwgMTAsIDMsIDgsIDQsIDYgXSwgQklsaVRvb2xzLnhvciA9IDE3NzQ1MTgxMiwgQklsaVRvb2xzLmFkZCA9IDg3MjgzNDg2MDgsIAogICAgICAgIEJJbGlUb29sczsKICAgIH0oKSwgQmlsaU1vYmlsZVNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBCaWxpTW9iaWxlU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLkJpbGlNb2JpbGUsIC9tXC5iaWxpYmlsaVwuY29tXC92aWRlb1wvL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLl9hcHBOYW1lID0gIkJpbGlcdTYyNGJcdTY3M2EiLCBfdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhCaWxpTW9iaWxlU2VydmljZSwgX3N1cGVyKSwgQmlsaU1vYmlsZVNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIEJpbGlNb2JpbGVTZXJ2aWNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNhcmRzID0gJCgiLmxhdW5jaC1hcHAtYnRuIik7CiAgICAgICAgICAgIGNhcmRzICYmICQoY2FyZHMpLmVhY2goKGZ1bmN0aW9uKGksIGVsZSkgewogICAgICAgICAgICAgICAgdmFyIGF2ID0gJChlbGUpLmF0dHIoImRhdGEtYWlkIik7CiAgICAgICAgICAgICAgICBhdiAmJiAkKGVsZSkub24oImNsaWNrIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy53aW5kb3cubG9jYXRpb24uaHJlZiA9ICJodHRwczovL20uYmlsaWJpbGkuY29tL3ZpZGVvLyIgKyBCSWxpVG9vbHMuYXYyQnYocGFyc2VJbnQoYXYpKTsKICAgICAgICAgICAgICAgIH0pKSwgJChlbGUpLnJlbW92ZUNsYXNzKCJsYXVuY2gtYXBwLWJ0biIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQmlsaU1vYmlsZVNlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBBbGl5dW5QYW5Ub2tlbiA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIEFsaXl1blBhblRva2VuKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5BTFksIC93d3dcLmFsaXl1bmRyaXZlXC5jb21cL2RyaXZlKi9pIF0sIFsgU2l0ZUVudW0uQUxZX1AsIC93d3dcLmFsaXBhblwuY29tXC9kcml2ZSovaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMuaHRtbCA9ICdcbiAgICA8bGkgY2xhc3M9IiBhbnQtZHJvcGRvd24tbWVudS1pdGVtLWRpdmlkZXIiPjwvbGk+XG4gICAgPGxpIGNsYXNzPSJhbnQtZHJvcGRvd24tbWVudS1pdGVtIGFudC1kcm9wZG93bi1tZW51LWl0ZW0tb25seS1jaGlsZCIgcm9sZT0ibWVudWl0ZW0iPlxuICAgICAgICA8ZGl2IGNsYXNzPSJvdXRlci1tZW51LS1VNXdlSCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSJpdGVtLS0yUmVVMiIgaWQ9Im9uZWtleXZpcC10b2tlbiI+XG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1yb2xlPSJpY29uIiBkYXRhLXJlbmRlci1hcz0ic3ZnIiBkYXRhLWljb24tdHlwZT0iUERTTW9yZUNpcmNsZSIgY2xhc3M9Iml0ZW0taWNvbi0tMXlkb2EgaWNvbi0tZC1lakEgIj48c3ZnIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjx1c2UgeGxpbms6aHJlZj0iI1BEU01vcmVDaXJjbGUiPjwvdXNlPjwvc3ZnPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICBcdTgzYjdcdTUzZDZUb2tlblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbGk+XG4gICAgJywgCiAgICAgICAgICAgIF90aGlzLl91bmlxdWUgPSAhMSwgX3RoaXMuX2FwcE5hbWUgPSAiYWxpeXVucGFuLXRva2VuIiwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoQWxpeXVuUGFuVG9rZW4sIF9zdXBlciksIEFsaXl1blBhblRva2VuLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgiXHU4M2I3XHU1M2Q2VG9rZW4iLCB0aGlzLmdldFRva2VuKTsKICAgICAgICB9LCBBbGl5dW5QYW5Ub2tlbi5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIENvcmUuYXV0b0xhenlsb2FkKChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIGZpbmRlZCA9IG51bGwgIT09IChfYiA9IG51bGwgPT09IChfYSA9ICQoIi5hbnQtZHJvcGRvd24tbWVudSIpKSB8fCB2b2lkIDAgPT09IF9hID8gdm9pZCAwIDogX2EubGVuZ3RoKSAmJiB2b2lkIDAgIT09IF9iID8gX2IgOiAtMTsKICAgICAgICAgICAgICAgIHJldHVybiBMb2dnZXIuZGVidWcoIlx1ODNkY1x1NTM1NVx1NjdlNVx1OGJlMlx1NjBjNVx1NTFiNToiICsgZmluZGVkKSwgZmluZGVkID4gMDsKICAgICAgICAgICAgfSksIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQoIi5hbnQtZHJvcGRvd24tbWVudSIpLmFwcGVuZChfdGhpcy5odG1sKSwgX3RoaXMuaW5pdEV2ZW50KCk7CiAgICAgICAgICAgIH0pLCAuNSk7CiAgICAgICAgfSwgQWxpeXVuUGFuVG9rZW4ucHJvdG90eXBlLmdldFRva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfYSwgdG9rZW5TdHIsIHRva2VuT2JqOwogICAgICAgICAgICBpZiAoJCgiLmFudC1kcm9wZG93biIpLmFkZENsYXNzKCJhbnQtZHJvcGRvd24taGlkZGVuIiksIHRva2VuU3RyID0gbnVsbCAhPT0gKF9hID0gdW5zYWZlV2luZG93LmxvY2FsU3RvcmFnZS50b2tlbikgJiYgdm9pZCAwICE9PSBfYSA/IF9hIDogIiIpIHRyeSB7CiAgICAgICAgICAgICAgICB0b2tlbk9iaiA9IEpTT04ucGFyc2UodG9rZW5TdHIpLCBzQWxlcnQubXNnKCJ0b2tlblx1NGZlMVx1NjA2ZiIsICc8dGV4dGFyZWEgc3R5bGU9IndpZHRoOiAxMDAlIj4nICsgdG9rZW5PYmoucmVmcmVzaF90b2tlbiArICI8L3RleHRhcmVhPiIsICJhdXRvIik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHNBbGVydC5pbmZvKCJUb2tlblx1NWU4Zlx1NTIxN1x1NTMxNlx1OTUxOVx1OGJlZixcdThiZjdcdTU0MTFcdTRmNWNcdTgwMDVcdTUzY2RcdTk5ODgsIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBzQWxlcnQuaW5mbygiXHU2NzJhXHU4MGZkXHU4M2I3XHU1M2Q2XHU1MjMwVG9rZW5cdTRmZTFcdTYwNmYsXHU4YmY3XHU5MWNkXHU2NWIwXHU3NjdiXHU1ZjU1XHU1NDBlXHU1MThkXHU4YmQ1Iik7CiAgICAgICAgfSwgQWxpeXVuUGFuVG9rZW4ucHJvdG90eXBlLmluaXRFdmVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCIjb25la2V5dmlwLXRva2VuIikub24oImNsaWNrIiwgdGhpcy5nZXRUb2tlbik7CiAgICAgICAgfSwgQWxpeXVuUGFuVG9rZW47CiAgICB9KFBsdWdpbkJhc2UpLCBjc3NfMjQ4eiQzID0gJy5tZmItY29tcG9uZW50LS10bCxcbi5tZmItY29tcG9uZW50LS1jbCxcbi5tZmItY29tcG9uZW50LS10cixcbi5tZmItY29tcG9uZW50LS1ibCxcbi5tZmItY29tcG9uZW50LS1iciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1hcmdpbjogMjVweDtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB6LWluZGV4OiAzMDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuLm1mYi1jb21wb25lbnQtLWNsICosXG4ubWZiLWNvbXBvbmVudC0tdGwgKixcbi5tZmItY29tcG9uZW50LS10ciAqLFxuLm1mYi1jb21wb25lbnQtLWJsICosXG4ubWZiLWNvbXBvbmVudC0tYnIgKixcbi5tZmItY29tcG9uZW50LS10bCAqOmJlZm9yZSxcbi5tZmItY29tcG9uZW50LS1jbCAqOmJlZm9yZSxcbi5tZmItY29tcG9uZW50LS10ciAqOmJlZm9yZSxcbi5tZmItY29tcG9uZW50LS1ibCAqOmJlZm9yZSxcbi5tZmItY29tcG9uZW50LS1iciAqOmJlZm9yZSxcbi5tZmItY29tcG9uZW50LS10bCAqOmFmdGVyLFxuLm1mYi1jb21wb25lbnQtLWNsICo6YWZ0ZXIsXG4ubWZiLWNvbXBvbmVudC0tdHIgKjphZnRlcixcbi5tZmItY29tcG9uZW50LS1ibCAqOmFmdGVyLFxuLm1mYi1jb21wb25lbnQtLWJyICo6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBpbmhlcml0O1xufVxuLm1mYi1jb21wb25lbnQtLXRsIHtcbiAgbGVmdDogMDtcbiAgdG9wOiAwO1xufVxuLm1mYi1jb21wb25lbnQtLWNsIHtcbiAgbGVmdDogMDtcbiAgdG9wOiA1MCU7XG59XG4ubWZiLWNvbXBvbmVudC0tdHIge1xuICByaWdodDogMDtcbiAgdG9wOiAwO1xufVxuLm1mYi1jb21wb25lbnQtLWJsIHtcbiAgbGVmdDogMDtcbiAgYm90dG9tOiAwO1xufVxuLm1mYi1jb21wb25lbnQtLWJyIHtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbn1cbi5tZmItY29tcG9uZW50X19idXR0b24tLW1haW4sXG4ubWZiLWNvbXBvbmVudF9fYnV0dG9uLS1jaGlsZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNDBhNWQ7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJveC1zaGFkb3c6IDAgMCA0cHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAtd2Via2l0LXVzZXItZHJhZzogbm9uZTtcbiAgY29sb3I6ICNmMWYxZjE7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbGluZS1oZWlnaHQ6IDU1cHg7XG4gIGZvbnQtc2l6ZTogMjVweDtcbn1cbi5tZmItY29tcG9uZW50X19saXN0IHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuLm1mYi1jb21wb25lbnRfX2xpc3QgPiBsaSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDFweDtcbiAgcGFkZGluZzogMTBweCAwO1xuICBtYXJnaW46IC0xMHB4IDA7XG59XG4ubWZiLWNvbXBvbmVudF9faWNvbixcbi5tZmItY29tcG9uZW50X19tYWluLWljb24tLWFjdGl2ZSxcbi5tZmItY29tcG9uZW50X19tYWluLWljb24tLXJlc3RpbmcsXG4ubWZiLWNvbXBvbmVudF9fY2hpbGQtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZm9udC1zaXplOiAxOHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGxpbmUtaGVpZ2h0OiA1NnB4O1xuICB3aWR0aDogMTAwJTtcbn1cbi5tZmItY29tcG9uZW50X193cmFwIHtcbiAgcGFkZGluZzogMjVweDtcbiAgbWFyZ2luOiAtMjVweDtcbn1cbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19pY29uLFxuW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX21haW4taWNvbi0tYWN0aXZlLFxuW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX21haW4taWNvbi0tcmVzdGluZyxcbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19jaGlsZC1pY29uLFxuW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19pY29uLFxuW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19tYWluLWljb24tLWFjdGl2ZSxcbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbWFpbi1pY29uLS1yZXN0aW5nLFxuW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19jaGlsZC1pY29uIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgwZGVnKTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMGRlZyk7XG59XG4ubWZiLWNvbXBvbmVudF9fYnV0dG9uLS1tYWluIHtcbiAgaGVpZ2h0OiA1NnB4O1xuICB3aWR0aDogNTZweDtcbiAgei1pbmRleDogMjA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbGluZS1oZWlnaHQ6IDU1cHg7XG4gIGZvbnQtc2l6ZTogMjVweDtcbn1cbi5tZmItY29tcG9uZW50X19idXR0b24tLWNoaWxkIHtcbiAgaGVpZ2h0OiA1NnB4O1xuICB3aWR0aDogNTZweDtcbn1cbi5tZmItY29tcG9uZW50X19tYWluLWljb24tLWFjdGl2ZSxcbi5tZmItY29tcG9uZW50X19tYWluLWljb24tLXJlc3Rpbmcge1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDM2MGRlZyk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDM2MGRlZyk7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMSwgMSk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKTtcbn1cbi5tZmItY29tcG9uZW50X19jaGlsZC1pY29uLFxuLm1mYi1jb21wb25lbnRfX2NoaWxkLWljb24ge1xuICBsaW5lLWhlaWdodDogNTZweDtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxuLm1mYi1jb21wb25lbnRfX21haW4taWNvbi0tYWN0aXZlIHtcbiAgb3BhY2l0eTogMDtcbn1cbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19tYWluLWljb24sXG5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX21haW4taWNvbiB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMGRlZyk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDBkZWcpO1xufVxuW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX21haW4taWNvbi0tcmVzdGluZyxcbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbWFpbi1pY29uLS1yZXN0aW5nIHtcbiAgb3BhY2l0eTogMDtcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG59XG5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbWFpbi1pY29uLS1hY3RpdmUsXG5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX21haW4taWNvbi0tYWN0aXZlIHtcbiAgb3BhY2l0eTogMTtcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItc2xpZGVpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSB7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGksXG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXNsaWRlaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSB7XG4gIG9wYWNpdHk6IDE7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMTBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMTBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg1KSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg1KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg1KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgzNTBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzNTBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg0MjBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0MjBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg0OTBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0OTBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg1NjBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg1NjBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSxcbiIubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg2MzBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg2MzBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxMCksXG4iLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluIltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMTApLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1zbGlkZWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEwKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMTApIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNzAwcHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNzAwcHgpO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIC5tZmItY29tcG9uZW50X19saXN0IGxpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1zbGlkZWluIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMTBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMTBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg1KSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg1KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg1KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgzNTBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzNTBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg0MjBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0MjBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg0OTBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0OTBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg1NjBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg1NjBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSxcbiIubWZiLWNvbXBvbmVudC0tY2wubWZiLXNsaWRlaW4iW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg2MzBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg2MzBweCk7XG59XG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxMCksXG4iLm1mYi1jb21wb25lbnQtLWNsLm1mYi1zbGlkZWluIltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMTApLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1zbGlkZWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEwKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMTApIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNzAwcHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNzAwcHgpO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluIC5tZmItY29tcG9uZW50X19saXN0IGxpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgb3BhY2l0eTogMTtcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxKSxcbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQwcHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0MHB4KTtcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIxMHB4KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMTBweCk7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yODBweCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjgwcHgpO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluLXNwcmluZyAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbi1zcHJpbmcgLm1mYi1jb21wb25lbnRfX2xpc3QgbGkge1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjY4LCAtMC41NSwgMC4yNjUsIDEuNTUpO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluLXNwcmluZyAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXNsaWRlaW4tc3ByaW5nIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxKSB7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMDVzO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluLXNwcmluZyAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXNsaWRlaW4tc3ByaW5nIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSB7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMXM7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4tc3ByaW5nIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbi1zcHJpbmcgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpIHtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4tc3ByaW5nIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbi1zcHJpbmcgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpIHtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4ycztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS10bC5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgb3BhY2l0eTogMTtcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxKSB7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMDVzO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg3MHB4KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDcwcHgpO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS10bC5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpIHtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xcztcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTQwcHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTQwcHgpO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10bC5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpIHtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xNXM7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIxMHB4KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIxMHB4KTtcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSB7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMnM7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDI4MHB4KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDI4MHB4KTtcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbi1zcHJpbmcgLm1mYi1jb21wb25lbnRfX2xpc3QgbGksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW4tc3ByaW5nIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC42OCwgLTAuNTUsIDAuMjY1LCAxLjU1KTtcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbi1zcHJpbmcgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZyAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjA1cztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbi1zcHJpbmcgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZyAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjFzO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluLXNwcmluZyAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW4tc3ByaW5nIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSB7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMTVzO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluLXNwcmluZyAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW4tc3ByaW5nIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSB7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMnM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGksXG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSB7XG4gIG9wYWNpdHk6IDE7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjA1cztcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ibC5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItc2xpZGVpbi1zcHJpbmdbZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpIHtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xcztcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0MHB4KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDBweCk7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpLFxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMykge1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjE1cztcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIxMHB4KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMTBweCk7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXNsaWRlaW4tc3ByaW5nW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1zbGlkZWluLXNwcmluZ1tkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjJzO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjgwcHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTI4MHB4KTtcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItem9vbWluIC5tZmItY29tcG9uZW50X19saXN0IGxpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMCk7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg3MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDcwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCkgc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjFzO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjEwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjEwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4wNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwcztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg3MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDcwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjA1cztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMXM7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10bC5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjEwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjEwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjE1cztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMnM7XG59XG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHNjYWxlKDApO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xcztcbn1cbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDBweCkgc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4wNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjEwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIxMHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDBzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTI4MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yODBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAtMC4wNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMzUwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTM1MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IC0wLjFzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDYpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDYpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQyMHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00MjBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAtMC4xNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDkwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ5MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IC0wLjJzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDgpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDgpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTU2MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01NjBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAtMC4yNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNjMwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTYzMHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IC0wLjNzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEwKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxMCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzAwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwMHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IC0wLjM1cztcbn1cbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMDVzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjFzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMTBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjEwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjE1cztcbn1cbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjgwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTI4MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4ycztcbn1cbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDUpLFxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDUpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMzUwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTM1MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4yNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg2KSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDYpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDYpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQyMHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00MjBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuM3M7XG59XG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg3KSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDcpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDcpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ5MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OTBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMzVzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOCksXG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg4KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01NjBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTYwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjRzO1xufVxuLm1mYi1jb21wb25lbnQtLWNsLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOSksXG4ubWZiLWNvbXBvbmVudC0tY2wubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoOSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg5KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC02MzBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNjMwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjQ1cztcbn1cbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEwKSxcbi5tZmItY29tcG9uZW50LS1jbC5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxMCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxMCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMTApIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwMHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03MDBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHNjYWxlKDApO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMXM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjEwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIxMHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMDVzO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTI4MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yODBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwcztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMDVzO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjFzO1xufVxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdOmhvdmVyIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItem9vbWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMTBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjEwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjE1cztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItem9vbWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi16b29taW5bZGF0YS1tZmItc3RhdGU9b3Blbl0gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi16b29taW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLXpvb21pbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjgwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTI4MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4ycztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItZm91bnRhaW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluIC5tZmItY29tcG9uZW50X19saXN0IGxpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHNjYWxlKDApO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMTVzO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDBweCkgc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xcztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItZm91bnRhaW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjEwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIxMHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMDVzO1xufVxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yODBweCkgc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjgwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMHM7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLWZvdW50YWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1mb3VudGFpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1mb3VudGFpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg3MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDcwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjA1cztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDE0MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDE0MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xcztcbn1cbi5tZmItY29tcG9uZW50LS10bC5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS10ci5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIxMHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIxMHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwubWZiLWZvdW50YWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLXRsLm1mYi1mb3VudGFpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tdHIubWZiLWZvdW50YWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLXRyLm1mYi1mb3VudGFpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDAuMnM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLWZvdW50YWluIC5tZmItY29tcG9uZW50X19saXN0IGxpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItZm91bnRhaW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDEpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSg3MHB4KSBzY2FsZSgwKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDcwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLWZvdW50YWluIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgyKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItZm91bnRhaW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTQwcHgpIHNjYWxlKDApO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTQwcHgpIHNjYWxlKDApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xcztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItZm91bnRhaW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDMpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMTBweCkgc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMTBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjA1cztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItZm91bnRhaW4gLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDQpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1mb3VudGFpbiAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyODBweCkgc2NhbGUoMCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwcztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMSksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgxKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4wNXM7XG59XG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLWZvdW50YWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLWJsLm1mYi1mb3VudGFpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMiksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLWZvdW50YWluW2RhdGEtbWZiLXRvZ2dsZT1ob3Zlcl06aG92ZXIgLm1mYi1jb21wb25lbnRfX2xpc3QgbGk6bnRoLWNoaWxkKDIpLFxuLm1mYi1jb21wb25lbnQtLWJyLm1mYi1mb3VudGFpbltkYXRhLW1mYi1zdGF0ZT1vcGVuXSAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0MHB4KSBzY2FsZSgxKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMC4xcztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoMyksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCgzKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMTBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjEwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjE1cztcbn1cbi5tZmItY29tcG9uZW50LS1ibC5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tYmwubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSxcbi5tZmItY29tcG9uZW50LS1ici5tZmItZm91bnRhaW5bZGF0YS1tZmItdG9nZ2xlPWhvdmVyXTpob3ZlciAubWZiLWNvbXBvbmVudF9fbGlzdCBsaTpudGgtY2hpbGQoNCksXG4ubWZiLWNvbXBvbmVudC0tYnIubWZiLWZvdW50YWluW2RhdGEtbWZiLXN0YXRlPW9wZW5dIC5tZmItY29tcG9uZW50X19saXN0IGxpOm50aC1jaGlsZCg0KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yODBweCkgc2NhbGUoMSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjgwcHgpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAwLjJzO1xufVxuW2RhdGEtbWZiLWxhYmVsXTphZnRlciB7XG4gIGNvbnRlbnQ6IGF0dHIoZGF0YS1tZmItbGFiZWwpO1xuICBvcGFjaXR5OiAwO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gIHBhZGRpbmc6IDRweCAxMHB4O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIG1hcmdpbi10b3A6IC0xMXB4O1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbn1cbltkYXRhLW1mYi10b2dnbGU9aG92ZXJdIFtkYXRhLW1mYi1sYWJlbF06aG92ZXI6YWZ0ZXIsXG5bZGF0YS1tZmItc3RhdGU9b3Blbl0gW2RhdGEtbWZiLWxhYmVsXTphZnRlciB7XG4gIGNvbnRlbnQ6IGF0dHIoZGF0YS1tZmItbGFiZWwpO1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2l0aW9uOiBhbGwgMC4zcztcbn1cbi5tZmItY29tcG9uZW50LS1iciBbZGF0YS1tZmItbGFiZWxdOmFmdGVyLFxuLm1mYi1jb21wb25lbnQtLXRyIFtkYXRhLW1mYi1sYWJlbF06YWZ0ZXIge1xuICBjb250ZW50OiBhdHRyKGRhdGEtbWZiLWxhYmVsKTtcbiAgcmlnaHQ6IDcwcHg7XG59XG4ubWZiLWNvbXBvbmVudC0tYnIgLm1mYi1jb21wb25lbnRfX2xpc3QgW2RhdGEtbWZiLWxhYmVsXTphZnRlcixcbi5tZmItY29tcG9uZW50LS10ciAubWZiLWNvbXBvbmVudF9fbGlzdCBbZGF0YS1tZmItbGFiZWxdOmFmdGVyIHtcbiAgY29udGVudDogYXR0cihkYXRhLW1mYi1sYWJlbCk7XG4gIHJpZ2h0OiA3MHB4O1xufVxuLm1mYi1jb21wb25lbnQtLXRsIFtkYXRhLW1mYi1sYWJlbF06YWZ0ZXIsXG4ubWZiLWNvbXBvbmVudC0tY2wgW2RhdGEtbWZiLWxhYmVsXTphZnRlcixcbi5tZmItY29tcG9uZW50LS1ibCBbZGF0YS1tZmItbGFiZWxdOmFmdGVyIHtcbiAgY29udGVudDogYXR0cihkYXRhLW1mYi1sYWJlbCk7XG4gIGxlZnQ6IDcwcHg7XG59XG4ubWZiLWNvbXBvbmVudC0tdGwgLm1mYi1jb21wb25lbnRfX2xpc3QgW2RhdGEtbWZiLWxhYmVsXTphZnRlcixcbi5tZmItY29tcG9uZW50LS1ibCAubWZiLWNvbXBvbmVudF9fbGlzdCBbZGF0YS1tZmItbGFiZWxdOmFmdGVyIHtcbiAgY29udGVudDogYXR0cihkYXRhLW1mYi1sYWJlbCk7XG4gIGxlZnQ6IDcwcHg7XG59XG4ubWZiLWNvbXBvbmVudF9fYnV0dG9uLS1jaGlsZCBpLFxuLm1mYi1jb21wb25lbnRfX2J1dHRvbi0tbWFpbiBpIHtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG4uYW5pbWF0ZWQge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMXM7XG4gIC1tb3otYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAtbW96LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5VcCB7XG4gIGZyb20sXG4gIDYwJSxcbiAgNzUlLFxuICA5MCUsXG4gIHRvIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpO1xuICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpO1xuICB9XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDgwMHB4LCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDgwMHB4LCAwKTtcbiAgfVxuICA2MCUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMHB4LCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMHB4LCAwKTtcbiAgfVxuICA3NSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApO1xuICB9XG4gIDkwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTVweCwgMCk7XG4gIH1cbiAgdG8ge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICB9XG59XG5ALW1vei1rZXlmcmFtZXMgYm91bmNlSW5VcCB7XG4gIGZyb20sXG4gIDYwJSxcbiAgNzUlLFxuICA5MCUsXG4gIHRvIHtcbiAgICAtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpO1xuICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpO1xuICB9XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDgwMHB4LCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDgwMHB4LCAwKTtcbiAgfVxuICA2MCUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMHB4LCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMHB4LCAwKTtcbiAgfVxuICA3NSUge1xuICAgIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApO1xuICB9XG4gIDkwJSB7XG4gICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTVweCwgMCk7XG4gIH1cbiAgdG8ge1xuICAgIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICB9XG59XG5Aa2V5ZnJhbWVzIGJvdW5jZUluVXAge1xuICBmcm9tLFxuICA2MCUsXG4gIDc1JSxcbiAgOTAlLFxuICB0byB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKTtcbiAgICAtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpO1xuICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpO1xuICB9XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDgwMHB4LCAwKTtcbiAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgODAwcHgsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgODAwcHgsIDApO1xuICB9XG4gIDYwJSB7XG4gICAgb3BhY2l0eTogMTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApO1xuICAgIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7XG4gIH1cbiAgNzUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCk7XG4gICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCk7XG4gIH1cbiAgOTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTVweCwgMCk7XG4gICAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTVweCwgMCk7XG4gIH1cbiAgdG8ge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgfVxufVxuLmJvdW5jZUluVXAge1xuICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBib3VuY2VJblVwO1xuICAtbW96LWFuaW1hdGlvbi1uYW1lOiBib3VuY2VJblVwO1xuICBhbmltYXRpb24tbmFtZTogYm91bmNlSW5VcDtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDFzO1xuICAtbW96LWFuaW1hdGlvbi1kZWxheTogMXM7XG4gIGFuaW1hdGlvbi1kZWxheTogMXM7XG59XG4ub25la2V5dmlwIHtcbiAgZm9udC1zaXplOiAyNXB4ICFpbXBvcnRhbnQ7XG59XG4nLCAKICAgIHN0eWxlSW5qZWN0KGNzc18yNDh6JDMpLCBjc3NfMjQ4eiQyID0gJ0Bmb250LWZhY2Uge1xuICAgIGZvbnQtZmFtaWx5OiAib25la2V5dmlwIjsgLyogUHJvamVjdCBpZCAzNDIxMDczICovXG4gICAgc3JjOlxuICAgICAgICAgICAgdXJsKFwnZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUFva0FBc0FBQUFBRWVnQUFBblhBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUhGUUdZQUNFRUFxVk1KRW5BVFlDSkFNb0N4WUFCQ0FGaEhNSGdRZ2JCdytqb29aeVVoaGtmNEZ0dzU0RUV0YUlqV0VCb0p3eWd3K2REVTNERnBEdzRkRHFBQUF3UzhGQTFMY0FTTkFOQUVBKytGNzEwcVJLbHZDSnMzc1EvdHc5d09nQm1EL1gzbElnVG9sQUlTeTg1R2NwTzlsc0FWMHJWS2ZDbzFBb0RORGRPUkQyNURWQXdKZlpxVHFySjluVHpLNERyK09GUGNrY3RNSkJTdTY4ZGc0TEk3aTZId2hrd2hFY1RKYVc4Lzl2cmRXN3c3eFJiZkJHaUI3amlzMytNNXRiTktvMjFXVHRIaUZDS0dwekRkRktreW9XaXVWSUxvU1lzU2pQVEtBcTFNYjRYYzhEQW9BalFaL2drckdaZVJUZlRaRU95aFlLWXo0QjR2YWtHNk1LaWxRY1lCVUpCSnBaYWJvdkE1a0VHWkJHUytjQVRQUS9ucnhCVXBHQUJKbkNDS1R1UjNYMGJQcjluaHBXQUwwSGx4K3VHNysrQkVBR1FBSEVMTXhGcGxWckU5QVF4L2pBcWFZTWJTQTRtSWtoZ0xrMk5YWFR5U3g4UGVEM2U2czFGeUlGOSs4SklKMU15WURVaVRVS1pjdE5aV2pRb2VLWHA4QUFHNFFNcU5VQkV6YUNCSmo4OFl2SUFRVXc5UW9RQUFKeWdBRm1ZUTdJd092K05taStjUUFJZER3UEFUNm9NSUR6KzdoQUNJVG9LSUQxUXpEVjlBa0ZzL1VhbGtJV2pQSFk1Q0NuK0lTUXdOYU03UFRDbHRURWhBaTFSa25RZUg5QnpHaG9uandTcXI4allnVkRMWDFwbk1qU3RrMy95eWhPTG0rb3FWU1c0MVV4eXhnU1hYK3FYOG9UQ1V3bTdUM0pqUlFLTkorZlhVM1NyT3loNEU3Mkl2WmorK203VjFOQjdyMmtqd1lWOUhPcVlsTk9mclYwYlh0Z3FMSWVKbU5xQVhnN0FOR0pDTGhGeU5oN0VCRmp1eUZTMmJWZWdzcE5HbUNoMGV1TzIrS0NBaG1taWlCM1d3eDdGVkRFU2l5L3FTT3dSVDdXWnQvR2J1Tm5jL1FrL3BxMkZvb3lLRGJOUHQwaDdRN3RmcTEycmFhZHZDenU1b204MWEzdGRBVXkzNUNlVlVXV0NtUVdCYXI4SnVmc2FrS2xTYTFRdnRBWW05V0tMSi9Pa2RFTGFNWG05V3pxMXJpMWxOdVVRbXJSVnBsK2lkRXBXbjRmdTh1a1JZNXptV1ZPZGNqWUkvbTA3SHBTdlMxY1NhZ1VGZ0lqTFk5YVpGcG5WOFdwNlg1ZjZUbFFvL3dtUHBSTjZoSkRTOTVEd1cyMkxUTVZtUlI0d0RXVHl6MVhjNXR4a2xyVU8xbXFXTXJoMUpCVms2Mks3aG9adlhrckxDRlZkOUhxeStrbEFoa25CeEZFWEkrRnE5blorUkFSY0pGcDJxcVNrZ3VNckEyY0ZJSDRETUlPSWNMRUNoc0xndU1OeFR5alNsVmVZeUhUTDZEVExadG9mSXFVTDNiRWhNdWF0bXEwdStMbE44bUdlUVdoa3FmSlJSc1lFREdMbk1QcDFzY3NYRW5JcEhCVUJFRXBaSlRLZTJxNWUyeUxnUEg5emFzMDlEZVBaNUdLMEJ0dzVkL0cvNmlRcXQ2T2Jqd1k2aS9tYmJZakkzSlFCazY0enRRMEdKN2szZkZUWUdSVnpLaDUzRm81dmVLaXhGOWhaYnJkYm5SY2hXRUZuMkdqWW42WHZ4TDFIZlJON09waWdjeGxla21GVnRvbUowMDBZQXRWaFJMTk5HbTdFaTFmSUF0UllSV1lIRFdOb2c0azRPYjZCSTVVbWhKVnYvckRXTTdxNTR3aG9JRlZrdW5nYWZ0cWF5aE9xWWJBd3M4aUpXTmdkYTZoeU9zVDFqNkNOclEwNUNpQ3dtdkZGWFlVaG9RajZLSTJCbU1jVForZ0R6R1VtQmRSaGR0aGIwcEpkU0UyY0g3ckcvTjJ3YnpMVjhXbzV2L0NYZThrR1RqSnowSzRPVFVRY1dIVFFFUnlZamgwUFFKSzdBU2g0NkNhWVY1aGtFc3dzSE8wMDc0aGFjaVVHTmdhMlFMajdEQ0l1cDlwbVhKcG9QSlFpczlaeG43NkticVlybTF1QlB0d3Ywdy90MWEwcU9HR2JsSXowdGVRdW9LYWx2UjA4bjh5bXczMFdnd3F1MmFRUHFEMEl5a2o5eUQ3anUxUGRJNTFjb3B6VHRqdlQvRGFrdWdaVlJYTURHWEdoUHBUZmNqRjF2VG0reDdGRkwvUS9TNEpqbkZ4VGduT1kzZE9EWmt2MHJhcDZBcEs4OGo2ZmVsK0I1dUV0NjY5amNMRnZsdkN6ajVZZXVIV0pSMWhVSm1wbzNYQ3JMRDFING8veVhNSFdCRjNkZzU2cjlpemNoNkVsT09xN2ZqMjBDaDYyZHc1VU1kVHg0QXh6WFFzUC9IYjQ5NFZWMVBGMFhWMVMwVm5KdDQwUnpwdmw0UTlpMWEwMWRESXk4VFhxTnVHUzZ0V3lEL2R3S3cydGJEVVR2VlFuU2g0OXZnN1pIcjFVZHczQVUyRFdIQXJJeXJ6OC80ZmNuYnRXRDExU3BWOTFEMjJJSDh2NHAwRGRHYnpIQ0xpZFp2WEo5K0N5Tm4zTDg4NlhURnk0dFJQZHN0b0RNTDdpdXUyYUVQUTZxWDVNKzBQNWYydGJ5MngrMmlEeGtvRCs2ajd6anp3NW1sa2FXc2Y2SUQ2b3V5bzdTNlo1Z2J2TXVTOVJ1bCtuMXNPS1ZWeGVxU1dJNWNIMDhhNDZHUUNUOHlKRUpBUWNOWEh5OGV6ZTZBSTlkVDExRmw1NVZXQlduOUkxSnB2WFFzT1htdGc4L0dNenM5anRrUlFVd3ExbkpydVhGamV4SU9CeXpDcWNVTDlpVkduajNyUG5DYU9oYlkzL0FlVWt4V1BSYTM5UGpobzJLMEEvTDArS1QzYW8ybnp2dklQSEQvalF4TmdWWDlsa3ZHSmxORWhmbUpEaGQvK0EvNVZvTld2eXY4SHF2UmZCKzZPN2oyNE44QXZMZmhFU09DcC9NQ1RKMEtEUUhNRCt0cHpadlovODJIOUpON3NPTk16TnRiWGE1WFVSelBoWlFPYjBLd1ZObi9wWUxGdTBzcUhHWWgxK1dIMDEvMVlka3RyQkJnMFlmbkx2dXdwSFZoUmRiV1hjempGaXhOc2p0MTd0ZStPNzM1UGpYaXAzQi9IaVBVL24yQXQraEFmczJhTDhKM2tHWldkeVdPWWFQOG5mYTgzWko5eXZQZlFZM3dBTlJOL3FheTNjMWliN0owWUdDZWtyZm9QdkkvaFUxMnpXS2hiV2poMEpMeXduNXQ5dGpIQUxUNVpKNVMxa2MxMThvWTJDUDRnd3pFWlBPcGY3N0o2aWs5bEM2dGs2NWNKVmsvd3BYUnhaUlJBRlUwbXZJdjRVbGFzRTFFQ1ZxN2tYNnhCOG15L1ZuV1poOVFWOW44UzdPSW9OcWNNT0RiaEJiNnlWeWVpSjZLL2lDdDlhTjVXT3lJQk5GSFBvREx0MENGQWFERXN2RGptcmpUbVFEWVJCK3N6UjdKUmFseWx0NlZhT0ZlSGlucWJkNXV0OTMvVzhuNC9xOXl3OEZuTWhmK2Jaak5kY1JWalNaSEZTZ0trdUE4QTNhQ2pIbXRCNUhTZ0xoaE5yQWFkUXcwLzZTRmp0RExwSE4xS1U1b01wYmZvRUlCeGJaSTFqUTlSVUFCdGxmUzBDL3h2S3ZnQ3M3d2VMdnkzWmZZOTN6VHhUKzMzT0Y3OXo5dXN4dkRjY0tBeHVYeGpuaEZXbXpWY3lQcVhzWThQNE9TQWJaSFJoNHVzTzJCb3pNMXBBTXRiN3VRM2IzSnV6TGxZVHdreWtxRENCMUhvQ05hemtCZ2tReUFWS2RCUmdEaWlUVFlXY0NhRklJTHBwV0hPZ1FpYzNDSUpkamlJS1JYeWdobEMvaUFaYnY0cENtS0tRQnpsWmRFSmhNV0hCU2dTZEt6dVk2WnhoMWc2ZVFTWXNML0QzRm1ndnFXSXRCeHN0UWpDWTl6QmpYVU4rZnB4Y0VEMHM0TzNRNXVrSkpnSWJ1T3g0UnFCWlhIc1ltTURORmtYa05MdHFxOG4xQTUxR3JmUk1BRW9wSnRaaDZuMmN6TWF6a0dDSkFHbS9iUDI3V0Jjc3dEbHN5aEVWUjg1dkNqWENCNUdMdzFyVktlaGlYNmN5NDh1RnRUVXM0TnEraVJJQk1pa2RUWnNiSWtFV0dZTmg3bjBXZ2Fna2VvRU9sUzV1dFR6bzVHbVVMZFZrMzNEcFgvM1BveGpjaUlSU2hpUmlVSlVvaEdkY0NLZ3RHSDd6S0dSbnQxaTlyRWptdE1hTEU1NW1Lb3czUTg3Q0xDQUgwNDVweGFFZTl5bjFpY21PcjZ0Z3FqMUdIVnFpVzlaTVJrN1FnPT1cJykgZm9ybWF0KFwnd29mZjJcJyksXG4gICAgICAgICAgICB1cmwoXCcvL2F0LmFsaWNkbi5jb20vdC9jL2ZvbnRfMzQyMTA3M182bjR5aXp3dGRidS53b2ZmP3Q9MTY5NTExMTAzMzE3OVwnKSBmb3JtYXQoXCd3b2ZmXCcpLFxuICAgICAgICAgICAgdXJsKFwnLy9hdC5hbGljZG4uY29tL3QvYy9mb250XzM0MjEwNzNfNm40eWl6d3RkYnUudHRmP3Q9MTY5NTExMTAzMzE3OVwnKSBmb3JtYXQoXCd0cnVldHlwZVwnKSxcbiAgICAgICAgICAgIHVybChcJy8vYXQuYWxpY2RuLmNvbS90L2MvZm9udF8zNDIxMDczXzZuNHlpend0ZGJ1LnN2Zz90PTE2OTUxMTEwMzMxNzkjb25la2V5dmlwXCcpIGZvcm1hdChcJ3N2Z1wnKTtcbn1cblxuLm9uZWtleXZpcCB7XG4gICAgZm9udC1mYW1pbHk6ICJvbmVrZXl2aXAiICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xufVxuXG4ub25la2V5dmlwLWJpeWluZzpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICJcXGU2MDkiO1xufVxuXG4ub25la2V5dmlwLWJpbGliaWxpOmJlZm9yZSB7XG4gICAgY29udGVudDogIlxcZTYwMCI7XG59XG5cbi5vbmVrZXl2aXAtMzYwbG9nbzpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICJcXGU2MDIiO1xufVxuXG4ub25la2V5dmlwLWJhaWR1OmJlZm9yZSB7XG4gICAgY29udGVudDogIlxcZTYxMiI7XG59XG5cbi5vbmVrZXl2aXAtemhpaHU6YmVmb3JlIHtcbiAgICBjb250ZW50OiAiXFxlNjQxIjtcbn1cblxuLm9uZWtleXZpcC1nb29nbGU6YmVmb3JlIHtcbiAgICBjb250ZW50OiAiXFxlNjAzIjtcbn1cblxuLm9uZWtleXZpcC1zb3Vnb3U6YmVmb3JlIHtcbiAgICBjb250ZW50OiAiXFxmYWVmIjtcbn1cblxuLm9uZWtleXZpcC1udW1iZXItc2lnbi1mdWxsOmJlZm9yZSB7XG4gICAgY29udGVudDogIlxcZWE3YiI7XG59XG5cbi5vbmVrZXl2aXAtbnVtYmVyLXNpZ246YmVmb3JlIHtcbiAgICBjb250ZW50OiAiXFxlYTdjIjtcbn1cbicsIAogICAgc3R5bGVJbmplY3QoY3NzXzI0OHokMiksIE1mYk1lbnUgPSBmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBNZmJNZW51KHBvcywgbWV0aG9kKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gcG9zICYmIChwb3MgPSAiYmwiKSwgdm9pZCAwID09PSBtZXRob2QgJiYgKG1ldGhvZCA9ICJob3ZlciIpLCB0aGlzLm1ldGhvZCA9ICJob3ZlciIsIAogICAgICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZCwgdGhpcy5wb3MgPSBwb3M7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNZmJNZW51LnByb3RvdHlwZS5nZXRIdG1sID0gZnVuY3Rpb24obW9kZWxzKSB7CiAgICAgICAgICAgIHZhciB0ID0gIiI7CiAgICAgICAgICAgIHJldHVybiBtb2RlbHMuZm9yRWFjaCgoZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgdCArPSAnICAgICAgICAgICAgXG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1mYi1sYWJlbD0iJyArIHYudGl0bGUgKyAnIiBjbGFzcz0ibWZiLWNvbXBvbmVudF9fYnV0dG9uLS1jaGlsZCIgaWQ9Im1mYi1jdXMtJyArIHYudGl0bGUgKyAnIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9IicgKyAodi5pY29uLmluZGV4T2YoIm9uZWtleXZpcCIpID4gLTEgPyAib25la2V5dmlwICIgOiAiZmEgIikgKyB2Lmljb24gKyAnIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT4nOwogICAgICAgICAgICB9KSksICdcbiAgICA8dWwgaWQ9Im1mYi1tZW51IiBjbGFzcz0ibWZiLWNvbXBvbmVudC0tJyArIHRoaXMucG9zICsgJyBtZmItem9vbWluIGJvdW5jZUluVXAgYW5pbWF0ZWQiIGRhdGEtbWZiLXRvZ2dsZT0iJyArIHRoaXMubWV0aG9kICsgJyI+XG4gICAgICAgIDxsaSBjbGFzcz0ibWZiLWNvbXBvbmVudF9fd3JhcCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZmItY29tcG9uZW50X19idXR0b24tLW1haW4iPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS12aW1lbyIgYXJpYS1oaWRkZW49InRydWUiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHVsIGNsYXNzPSJtZmItY29tcG9uZW50X19saXN0Ij5cbiAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tZmItbGFiZWw9Ilx1NjcyY1x1NmIyMVx1NTE3M1x1OTVlZCIgY2xhc3M9Im1mYi1jb21wb25lbnRfX2J1dHRvbi0tY2hpbGQiIGlkPSJtZmItY2xvc2UiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWV5ZSIgYXJpYS1oaWRkZW49InRydWUiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAnICsgdCArICJcbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbGk+XG4gICAgPC91bD4iOwogICAgICAgIH0sIE1mYk1lbnUucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDb3JlLmFwcGVuZENzcygiLy9saWIuYmFvbWl0dS5jb20vZm9udC1hd2Vzb21lLzQuNi4wL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIpOwogICAgICAgIH0sIE1mYk1lbnUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCkge30sIE1mYk1lbnUucHJvdG90eXBlLkluaXQgPSBmdW5jdGlvbihtb2RlbHMpIHsKICAgICAgICAgICAgTWZiTWVudS5zZWxmSWQgPSAiI21mYi1tZW51IiwgQ29yZS5pbklmcmFtZSgpIHx8ICh0aGlzLmxvYWRlcigpLCBDb3JlLmJvZHlBcHBlbmQodGhpcy5nZXRIdG1sKG1vZGVscykpLCAKICAgICAgICAgICAgdGhpcy5tb3VzZU1vdmUoKSwgdGhpcy5iaW5kRXZlbnQobW9kZWxzKSk7CiAgICAgICAgfSwgTWZiTWVudS5wcm90b3R5cGUuYmluZEV2ZW50ID0gZnVuY3Rpb24obW9kZWxzKSB7CiAgICAgICAgICAgICJob3ZlciIgIT0gJChNZmJNZW51LnNlbGZJZCkuZGF0YSgibWZiLXRvZ2dsZSIpICYmICQoTWZiTWVudS5zZWxmSWQpLm9uKCJjbGljayIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRTdGF0ZSA9ICJjbG9zZWQiID09ICQoTWZiTWVudS5zZWxmSWQpLmF0dHIoImRhdGEtbWZiLXN0YXRlIikgPyAib3BlbiIgOiAiY2xvc2VkIjsKICAgICAgICAgICAgICAgICQoTWZiTWVudS5zZWxmSWQpLmF0dHIoImRhdGEtbWZiLXN0YXRlIiwgdGFyZ2V0U3RhdGUpOwogICAgICAgICAgICB9KSksICQoIiNtZmItY2xvc2UiKS5vbigiY2xpY2siLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBMb2dnZXIuaW5mbygiXHU1MTczXHU5NWVkbWZiXHU4M2RjXHU1MzU1IiksICQoTWZiTWVudS5zZWxmSWQpLmhpZGUoKTsKICAgICAgICAgICAgfSkpLCBtb2RlbHMuZm9yRWFjaCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgJCgiI21mYi1jdXMtIiArIGUudGl0bGUpLm9uKCJjbGljayIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBMb2dnZXIuaW5mbygiXHU4M2RjXHU1MzU1IiArIGUudGl0bGUgKyAiXHU4OGFiXHU3MGI5XHU1MWZiIiksIGUuY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIE1mYk1lbnUucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgbWVudSA9IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1mYk1lbnUuc2VsZklkKSwgaVdpZHRoID0gdW5zYWZlV2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgaUhlaWdodCA9IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCBtb3ZlWCA9IDAsIG1vdmVZID0gMCwgbW92ZVRvcCA9IDAsIG1vdmVMZWZ0ID0gMCwgbW92ZWFibGUgPSAhMSwgZG9jTW91c2VNb3ZlRXZlbnQgPSBmdW5jdGlvbigpIHt9LCBkb2NNb3VzZVVwRXZlbnQgPSBmdW5jdGlvbigpIHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFdmVudCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZXZlbnQgfHwgYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIuYXJndW1lbnRzWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1lbnUub25tb3VzZWRvd24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBidXR0b25DaGlsZSwgZXZ0ID0gZ2V0RXZlbnQoKTsKICAgICAgICAgICAgICAgIG1vdmVhYmxlID0gITAsIG1vdmVYID0gZXZ0LmNsaWVudFgsIG1vdmVZID0gZXZ0LmNsaWVudFksIG1vdmVUb3AgPSBwYXJzZUludCgkKE1mYk1lbnUuc2VsZklkKS5jc3MoInRvcCIpKSwgCiAgICAgICAgICAgICAgICBtb3ZlTGVmdCA9IHBhcnNlSW50KCQoTWZiTWVudS5zZWxmSWQpLmNzcygibGVmdCIpKSwgYnV0dG9uQ2hpbGUgPSAkKCIubWZiLWNvbXBvbmVudF9fYnV0dG9uLS1jaGlsZCIpLCAKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5kb2N1bWVudC5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBldnRfMSwgeCwgeSwgd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgbW92ZWFibGUgJiYgKGV2dF8xID0gZ2V0RXZlbnQoKSwgeCA9IG1vdmVMZWZ0ICsgZXZ0XzEuY2xpZW50WCAtIG1vdmVYLCB5ID0gbW92ZVRvcCArIGV2dF8xLmNsaWVudFkgLSBtb3ZlWSwgCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAkKE1mYk1lbnUuc2VsZklkKS5jc3MoIndpZHRoIiksIHggLSBwYXJzZUludCh3aWR0aCkgLyAyIDwgaVdpZHRoIC8gMiA/IChidXR0b25DaGlsZS5yZW1vdmVDbGFzcygicmlnaHQiKSwgCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2hpbGUuYWRkQ2xhc3MoImxlZnQiKSkgOiAoYnV0dG9uQ2hpbGUucmVtb3ZlQ2xhc3MoImxlZnQiKSwgYnV0dG9uQ2hpbGUuYWRkQ2xhc3MoInJpZ2h0IikpLCAKICAgICAgICAgICAgICAgICAgICB4ID4gMCAmJiB4ICsgcGFyc2VJbnQod2lkdGgpIDwgaVdpZHRoICYmIChtZW51LnN0eWxlLmxlZnQgPSB4ICsgInB4IiksIHkgPiAwICYmIHkgKyBwYXJzZUludCgkKE1mYk1lbnUuc2VsZklkKS5jc3MoImhlaWdodCIpKSA8IGlIZWlnaHQgJiYgKG1lbnUuc3R5bGUudG9wID0geSArICJweCIpKTsKICAgICAgICAgICAgICAgIH0sIHVuc2FmZVdpbmRvdy5kb2N1bWVudC5vbm1vdXNldXAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBtb3ZlYWJsZSAmJiAodW5zYWZlV2luZG93LmRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZG9jTW91c2VNb3ZlRXZlbnQsIHVuc2FmZVdpbmRvdy5kb2N1bWVudC5vbm1vdXNldXAgPSBkb2NNb3VzZVVwRXZlbnQsIAogICAgICAgICAgICAgICAgICAgIG1vdmVhYmxlID0gITEsIG1vdmVYID0gMCwgbW92ZVkgPSAwLCBtb3ZlVG9wID0gMCwgbW92ZUxlZnQgPSAwKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwgTWZiTWVudTsKICAgIH0oKSwgTWZiTW9kZWwgPSBmdW5jdGlvbiBNZmJNb2RlbCh0aXRsZSwgaWNvbiwgY2FsbGJhY2spIHsKICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGUsIHRoaXMuaWNvbiA9IGljb24sIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIH0sIFlvdXR1YmVTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gWW91dHViZVNlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5Zb3VUdUJlLCAvKHd3d3xtKVwueW91dHViZVwuY29tXC93YXRjaFw/dj0oLio/KS9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzLl9hcHBOYW1lID0gIllvdVR1QmUiLCBfdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZXh0ZW5kcyhZb3V0dWJlU2VydmljZSwgX3N1cGVyKSwgWW91dHViZVNlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLm1mYk1lbnUgPSBuZXcgTWZiTWVudTsKICAgICAgICB9LCBZb3V0dWJlU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBtZW51cyA9IFsgbmV3IE1mYk1vZGVsKCJcdTRlMGJcdThmN2QiLCAiZmEtZG93bmxvYWQiLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHA6Ly95dHYud2FuZGhpLmNvbS8/dXJsPSIgKyBlbmNvZGVVUklDb21wb25lbnQoUnVudGltZS51cmwpKTsKICAgICAgICAgICAgfSkpIF07CiAgICAgICAgICAgIHRoaXMubWZiTWVudS5Jbml0KG1lbnVzKTsKICAgICAgICB9LCBZb3V0dWJlU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIFNldHRpbmdTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gU2V0dGluZ1NlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5TZXR0aW5ncywgL3NldHRpbmdzXC53YW5kaGlcLmNvbVwvaW5kZXhcL2luZGV4XC9wYWdlL2kgXSwgWyBTaXRlRW51bS5TZXR0aW5nc19BdXRvSnVtcCwgL3NldHRpbmdzXC53YW5kaGlcLmNvbVwvdG9vbHNcL2F1dG9qdW1wXC9wYWdlL2kgXSwgWyBTaXRlRW51bS5TZXR0aW5nc19BdXRvSnVtcF9PcHQsIC9zZXR0aW5nc1wud2FuZGhpXC5jb21cL3Rvb2xzXC9hdXRvanVtcC1vcFwvcGFnZS9pIF0sIFsgU2l0ZUVudW0uU2V0dGluZ3NfQ1NETiwgL3NldHRpbmdzXC53YW5kaGlcLmNvbVwvdG9vbHNcL2NzZG5cL3BhZ2UvaSBdLCBbIFNpdGVFbnVtLlNldHRpbmdzX0NTRE5fT3B0LCAvc2V0dGluZ3NcLndhbmRoaVwuY29tXC90b29sc1wvY3Nkbi1vcFwvcGFnZS9pIF0sIFsgU2l0ZUVudW0uU2V0dGluZ3NfU2VhcmNoLCAvc2V0dGluZ3NcLndhbmRoaVwuY29tXC90b29sc1wvc2VhcmNoLWhlbHBlclwvcGFnZS9pIF0sIFsgU2l0ZUVudW0uU2V0dGluZ3NfU2VhcmNoX09wdCwgL3NldHRpbmdzXC53YW5kaGlcLmNvbVwvdG9vbHNcL3NlYXJjaC1oZWxwZXItb3BcL3BhZ2UvaSBdLCBbIFNpdGVFbnVtLlNldHRpbmdzX0JpbGlfUGNfT3B0LCAvc2V0dGluZ3NcLndhbmRoaVwuY29tXC90b29sc1wvYmlsaWJpbGktcGMtb3BcL3BhZ2UvaSBdLCBbIFNpdGVFbnVtLlNldHRpbmdzX0ppZXhpX09wdCwgL3NldHRpbmdzXC53YW5kaGlcLmNvbVwvdG9vbHNcL2ppZXhpXC9wYWdlL2kgXSwgWyBTaXRlRW51bS5TZXR0aW5nc19XYW5nUGFuX09wdCwgL3NldHRpbmdzXC53YW5kaGlcLmNvbVwvdG9vbHNcL3dhbmdwYW5cL3BhZ2UvaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMuX3VuaXF1ZSA9ICExLCBfdGhpcy5fYXBwTmFtZSA9ICJcdTYzYTdcdTUyMzZcdTk3NjJcdTY3N2YiLCBfdGhpcy5zZW1pdWkgPSAhMCwgCiAgICAgICAgICAgIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKFNldHRpbmdTZXJ2aWNlLCBfc3VwZXIpLCBTZXR0aW5nU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxlcnQoKTsKICAgICAgICB9LCBTZXR0aW5nU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zaXRlKSB7CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5TZXR0aW5nczoKICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZlcigpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uU2V0dGluZ3NfQXV0b0p1bXBfT3B0OgogICAgICAgICAgICAgICAgdGhpcy5hdXRvSnVtcE9wdCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uU2V0dGluZ3NfQ1NETl9PcHQ6CiAgICAgICAgICAgICAgICB0aGlzLmNzZG5PcHQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLlNldHRpbmdzX1NlYXJjaF9PcHQ6CiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEhlbHBlck9wdCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uU2V0dGluZ3NfQmlsaV9QY19PcHQ6CiAgICAgICAgICAgICAgICB0aGlzLmJpbGlQY09wdCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uU2V0dGluZ3NfSmlleGlfT3B0OgogICAgICAgICAgICAgICAgdGhpcy5KaWV4aU9wdCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgU2l0ZUVudW0uU2V0dGluZ3NfV2FuZ1Bhbl9PcHQ6CiAgICAgICAgICAgICAgICB0aGlzLldhbmdQYW5PcHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFNldHRpbmdTZXJ2aWNlLnByb3RvdHlwZS5XYW5nUGFuT3B0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gbmV3IE1hcChbIFsgQ29uZmlnRW51bS5XYW5nUGFuX0FyaWFfSG9zdCwgZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgcmV0dXJuICEhL14oaHR0cHxodHRwcyk6XC9cL1x3Ky8udGVzdCh2KSB8fCAoVG9hc3Qud2FybmluZygiQXJpYTJcdTU3MzBcdTU3NDBcdTY4M2NcdTVmMGZcdTk1MTlcdThiZWYiKSwgCiAgICAgICAgICAgICAgICAhMSk7CiAgICAgICAgICAgIH0gXSwgWyBDb25maWdFbnVtLldhbmdQYW5fQXJpYV9Qb3J0LCBmdW5jdGlvbih2KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gISEvXlxkKyQvLnRlc3QodikgfHwgKFRvYXN0Lndhcm5pbmcoIkFyaWEyXHU3YWVmXHU1M2UzXHU2ODNjXHU1ZjBmXHU5NTE5XHU4YmVmIiksIAogICAgICAgICAgICAgICAgITEpOwogICAgICAgICAgICB9IF0sIFsgQ29uZmlnRW51bS5XYW5nUGFuX0FyaWFfVG9rZW4sIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgfSBdLCBbIENvbmZpZ0VudW0uV2FuZ1Bhbl9BcmlhX1BhdGgsIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgfSBdLCBbIENvbmZpZ0VudW0uV2FuZ1Bhbl9BcmlhX0RpciwgZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICB9IF0gXSk7CiAgICAgICAgICAgIHRoaXMuSW5wdXRJbml0KGtleXMsICJ0ZXh0Iik7CiAgICAgICAgfSwgU2V0dGluZ1NlcnZpY2UucHJvdG90eXBlLkppZXhpT3B0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gbmV3IE1hcChbIFsgQ29uZmlnRW51bS5KaWV4aV9DdXNfSW50ZXJmYWNlLCBmdW5jdGlvbih2KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHYuc3BsaXQoIlxuIikuZm9yRWFjaCgoZnVuY3Rpb24oZSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMiAhPSBlLnNwbGl0KCJ8fCIpLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9hc3QuZXJyb3IoIlx1ODFlYVx1NWI5YVx1NGU0OVx1NjNhNVx1NTNlM1x1NjgzY1x1NWYwZlx1OTUxOVx1OGJlZiIpLCAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgfSBdIF0pOwogICAgICAgICAgICB0aGlzLlRleHRBcmVhSW5pdChrZXlzKTsKICAgICAgICB9LCBTZXR0aW5nU2VydmljZS5wcm90b3R5cGUuYmlsaVBjT3B0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gWyBDb25maWdFbnVtLkJpbGlQY19Db3ZlciwgQ29uZmlnRW51bS5CaWxpUGNfVmlkZW9fRG93bmxvYWQsIENvbmZpZ0VudW0uQmlsaVBjX1RyaXBsZV9DbGljayBdOwogICAgICAgICAgICB0aGlzLmNoZWNrQm94SW5pdChrZXlzKTsKICAgICAgICB9LCBTZXR0aW5nU2VydmljZS5wcm90b3R5cGUuc2VhcmNoSGVscGVyT3B0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gWyBDb25maWdFbnVtLlNlYXJjaF9IZWxwZXJfU3dpdGNoIF07CiAgICAgICAgICAgIHRoaXMuY2hlY2tCb3hJbml0KGtleXMpOwogICAgICAgIH0sIFNldHRpbmdTZXJ2aWNlLnByb3RvdHlwZS5hdXRvSnVtcE9wdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hlY2tib3hlcyA9ICQoImlucHV0W3R5cGU9Y2hlY2tib3hdIik7CiAgICAgICAgICAgIGNoZWNrYm94ZXMucmVtb3ZlUHJvcCgiZGlzYWJsZWQiKSwgWyBDb25maWdFbnVtLkF1dG9KdW1wX1poaUh1LCBDb25maWdFbnVtLkF1dG9KdW1wX0NTRE4sIENvbmZpZ0VudW0uQXV0b0p1bXBfSmlhblNodSwgQ29uZmlnRW51bS5BdXRvSnVtcF9HaXRlZSwgQ29uZmlnRW51bS5BdXRvSnVtcF9KdWVKaW4sIENvbmZpZ0VudW0uQXV0b0p1bXBfV2VpYm8sIENvbmZpZ0VudW0uQXV0b0p1bXBfVHVYaWFvQ2hhbywgQ29uZmlnRW51bS5BdXRvSnVtcF9Pc0NoLCBDb25maWdFbnVtLkF1dG9KdW1wX0FpRmFEaWFuLCBDb25maWdFbnVtLkF1dG9KdW1wX0JhaWR1LCBDb25maWdFbnVtLkF1dG9KdW1wX0RvdUJhbiwgQ29uZmlnRW51bS5BdXRvSnVtcF9nMTcxNzMsIENvbmZpZ0VudW0uQXV0b0p1bXBfVGVuY2VudERvYyBdLmZvckVhY2goKGZ1bmN0aW9uKGUsIGkpIHsKICAgICAgICAgICAgICAgICQoIiMiICsgZS50b1N0cmluZygpKS5wcm9wKCJjaGVja2VkIiwgQ29uZmlnLmdldChlLnRvU3RyaW5nKCksICEwKSk7CiAgICAgICAgICAgIH0pKSwgY2hlY2tib3hlcy5vbigiY2hhbmdlIiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHZhciBlbCA9IGUudGFyZ2V0OwogICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKCJcdTkxNGRcdTdmNmVbIiArIGUudGFyZ2V0LmlkICsgIl1cdTUzZDFcdTc1MWZcdTUzZDhcdTY2ZjQsXHU2NzAwXHU3ZWM4XHU1MDNjOlsiICsgJChlLnRhcmdldCkucHJvcCgiY2hlY2tlZCIpICsgIl0iKSwgCiAgICAgICAgICAgICAgICBDb25maWcuc2V0KGVsLmlkLCAkKGVsKS5wcm9wKCJjaGVja2VkIikpLCBUb2FzdC5zdWNjZXNzKCJcdTRmZGRcdTViNThcdTYyMTBcdTUyOWYiKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIFNldHRpbmdTZXJ2aWNlLnByb3RvdHlwZS5jc2RuT3B0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gWyBDb25maWdFbnVtLkNTRE5fT3BBZENsZWFuLCBDb25maWdFbnVtLkNTRE5fT3BJbWdMaW5rLCBDb25maWdFbnVtLkNTRE5fT3BDb21tZW50Q2xlYW4sIENvbmZpZ0VudW0uQ1NETl9PcEFydGljbGVDbGVhbiwgQ29uZmlnRW51bS5DU0ROX09wQ2xpcGJvYXJkQ2xlYW4gXTsKICAgICAgICAgICAgdGhpcy5jaGVja0JveEluaXQoa2V5cyk7CiAgICAgICAgfSwgU2V0dGluZ1NlcnZpY2UucHJvdG90eXBlLmNoZWNrQm94SW5pdCA9IGZ1bmN0aW9uKGtleXMpIHsKICAgICAgICAgICAgdmFyIF9rZXlzID0gbmV3IE1hcChrZXlzLm1hcCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFsgZSwgZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0gXTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5JbnB1dEluaXQoX2tleXMsICJjaGVja2JveCIpOwogICAgICAgIH0sIFNldHRpbmdTZXJ2aWNlLnByb3RvdHlwZS5JbnB1dEluaXQgPSBmdW5jdGlvbihrZXlzLCB0eXBlKSB7CiAgICAgICAgICAgIHZvaWQgMCA9PT0gdHlwZSAmJiAodHlwZSA9ICJjaGVja2JveCIpOwogICAgICAgICAgICB2YXIgZWxlID0gJCgiaW5wdXRbdHlwZT0iICsgdHlwZSArICJdIik7CiAgICAgICAgICAgIGVsZS5yZW1vdmVQcm9wKCJkaXNhYmxlZCIpLCBrZXlzLmZvckVhY2goKGZ1bmN0aW9uKGYsIGUpIHsKICAgICAgICAgICAgICAgIGlmICgidGV4dCIgPT0gdHlwZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gQ29uZmlnLmdldChlLnRvU3RyaW5nKCksICIiKTsKICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcoIlx1OTE0ZFx1N2Y2ZVsiICsgZS50b1N0cmluZygpICsgIl1cdTUyMWRcdTU5Y2JcdTUzMTYsXHU1MDNjOlsiICsgdiArICJdIiksIAogICAgICAgICAgICAgICAgICAgICQoIiMiICsgZS50b1N0cmluZygpKS52YWwodik7CiAgICAgICAgICAgICAgICB9IGVsc2UgImNoZWNrYm94IiA9PSB0eXBlICYmICQoIiMiICsgZS50b1N0cmluZygpKS5wcm9wKCJjaGVja2VkIiwgQ29uZmlnLmdldChlLnRvU3RyaW5nKCksICEwKSk7CiAgICAgICAgICAgIH0pKSwgZWxlLm9uKCJjaGFuZ2UiLCAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgdmFyIGVsID0gZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAidGV4dCIgPT0gdHlwZSA/IChMb2dnZXIuZGVidWcoIlx1OTE0ZFx1N2Y2ZVsiICsgZS50YXJnZXQuaWQgKyAiXVx1NTNkMVx1NzUxZlx1NTNkOFx1NjZmNCxcdTY3MDBcdTdlYzhcdTUwM2M6WyIgKyAkKGUudGFyZ2V0KS52YWwoKSArICJdIiksIAogICAgICAgICAgICAgICAga2V5cy5nZXQoZWwuaWQpLmFwcGx5KGVsLCBbICQoZWwpLnZhbCgpIF0pICYmIChDb25maWcuc2V0KGVsLmlkLCAkKGVsKS52YWwoKSksIFRvYXN0LnN1Y2Nlc3MoIlx1NGZkZFx1NWI1OFx1NjIxMFx1NTI5ZiIpKSkgOiAiY2hlY2tib3giID09IHR5cGUgJiYgKExvZ2dlci5kZWJ1ZygiXHU5MTRkXHU3ZjZlWyIgKyBlLnRhcmdldC5pZCArICJdXHU1M2QxXHU3NTFmXHU1M2Q4XHU2NmY0LFx1NjcwMFx1N2VjOFx1NTAzYzpbIiArICQoZS50YXJnZXQpLnByb3AoImNoZWNrZWQiKSArICJdIiksIAogICAgICAgICAgICAgICAgQ29uZmlnLnNldChlbC5pZCwgJChlbCkucHJvcCgiY2hlY2tlZCIpKSwgVG9hc3Quc3VjY2VzcygiXHU0ZmRkXHU1YjU4XHU2MjEwXHU1MjlmIikpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgU2V0dGluZ1NlcnZpY2UucHJvdG90eXBlLlRleHRBcmVhSW5pdCA9IGZ1bmN0aW9uKGtleXMpIHsKICAgICAgICAgICAgJCgidGV4dGFyZWEiKS5yZW1vdmVQcm9wKCJkaXNhYmxlZCIpLCBrZXlzLmZvckVhY2goKGZ1bmN0aW9uKGYsIGUpIHsKICAgICAgICAgICAgICAgICQoIiMiICsgZS50b1N0cmluZygpKS52YWwoQ29uZmlnLmdldChlLnRvU3RyaW5nKCksICIiKSksICQoIiMiICsgZS50b1N0cmluZygpKS5vbigiY2hhbmdlIiwgKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKCJcdTkxNGRcdTdmNmVbIiArIGVsLnRhcmdldC5pZCArICJdXHU1M2QxXHU3NTFmXHU1M2Q4XHU2NmY0LFx1NjcwMFx1N2VjOFx1NTAzYzpbIiArICQoZWwudGFyZ2V0KS52YWwoKSArICJdIiksIAogICAgICAgICAgICAgICAgICAgIGYuYXBwbHkoZWwsIFsgJChlbC50YXJnZXQpLnZhbCgpIF0pICYmIChDb25maWcuc2V0KGVsLnRhcmdldC5pZCwgJChlbC50YXJnZXQpLnZhbCgpKSwgCiAgICAgICAgICAgICAgICAgICAgVG9hc3Quc3VjY2VzcygiXHU0ZmRkXHU1YjU4XHU2MjEwXHU1MjlmIikpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgU2V0dGluZ1NlcnZpY2UucHJvdG90eXBlLmluaXRWZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgiI2N1cnJlbnRWZXIiKS50ZXh0KENvbmZpZy5lbnYuc2NyaXB0LnZlcnNpb24pOwogICAgICAgIH0sIFNldHRpbmdTZXJ2aWNlLnByb3RvdHlwZS5yZW1vdmVBbGVydCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCIuYWxlcnQtZGFuZ2VyIikucmVtb3ZlKCk7CiAgICAgICAgfSwgU2V0dGluZ1NlcnZpY2UucHJvdG90eXBlLmluamVjdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB1bnNhZmVXaW5kb3cud2luZG93LnNjcmlwdEluZm8gPSBDb25maWcuZW52LCB1bnNhZmVXaW5kb3cud2luZG93LmdtX1NldCA9IENvbmZpZy5zZXQsIAogICAgICAgICAgICB1bnNhZmVXaW5kb3cud2luZG93LmdtX0dldCA9IENvbmZpZy5nZXQ7CiAgICAgICAgfSwgU2V0dGluZ1NlcnZpY2U7CiAgICB9KFBsdWdpbkJhc2UpLCBDb250cm9sTWVudVNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBDb250cm9sTWVudVNlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5BbGwsIC8uKi9pIF0gXSksIF90aGlzLl9hcHBOYW1lID0gIlx1NjNhN1x1NTIzNlx1ODNkY1x1NTM1NSIsIAogICAgICAgICAgICBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKENvbnRyb2xNZW51U2VydmljZSwgX3N1cGVyKSwgQ29udHJvbE1lbnVTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCAKICAgICAgICBDb250cm9sTWVudVNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCJcdTYzYTdcdTUyMzZcdTRlMmRcdTVmYzMiLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHBzOi8vc2V0dGluZ3Mud2FuZGhpLmNvbSIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgQ29udHJvbE1lbnVTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgU2VhcmNoU2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIFNlYXJjaFNlcnZpY2UoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IG51bGwgIT09IF9zdXBlciAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICByZXR1cm4gX3RoaXMucnVsZXMgPSBuZXcgTWFwKFsgWyBTaXRlRW51bS5CYWlkdSwgL3d3d1wuYmFpZHVcLmNvbVwvKGJhaWR1fHMpXD8vaSBdLCBbIFNpdGVFbnVtLkdvb2dsZSwgL3d3d1wuZ29vZ2xlXC5jb21cL3NlYXJjaFw/L2kgXSwgWyBTaXRlRW51bS5Tb0dvdSwgL3d3d1wuc29nb3VcLmNvbVwvd2ViL2kgXSwgWyBTaXRlRW51bS5Tb0dvdSwgL3d3d1wuc29cLmNvbVwvc1w/L2kgXSwgWyBTaXRlRW51bS5CaW5nQ24sIC9jblwuYmluZ1wuY29tXC9zZWFyY2gvaSBdIF0pLCAKICAgICAgICAgICAgX3RoaXMuX2FwcE5hbWUgPSAiXHU0ZmJmXHU2Mzc3XHU2NDFjXHU3ZDIyIiwgX3RoaXMuX3VuaXF1ZSA9ICExLCBfdGhpcy5zaXRlQ29uZmlnID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uQmFpZHUsICIja3ciIF0sIFsgU2l0ZUVudW0uR29vZ2xlLCAiaW5wdXRbbmFtZT1xXSIgXSwgWyBTaXRlRW51bS5Tb0dvdSwgIiN1cHF1ZXJ5IiBdLCBbIFNpdGVFbnVtLkJpbmdDbiwgIiNxIiBdIF0pLCAKICAgICAgICAgICAgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoU2VhcmNoU2VydmljZSwgX3N1cGVyKSwgU2VhcmNoU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFNlYXJjaFNlcnZpY2UuY3VycmVudFNpdGUgPSB0aGlzLnNpdGUsIHRoaXMuc2l0ZUNvbmZpZy5oYXModGhpcy5zaXRlKSAmJiAoU2VhcmNoU2VydmljZS5rZXlTZWxlY3RvciA9IHRoaXMuc2l0ZUNvbmZpZy5nZXQodGhpcy5zaXRlKSk7CiAgICAgICAgfSwgU2VhcmNoU2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChDb25maWcuZ2V0KENvbmZpZ0VudW0uU2VhcmNoX0hlbHBlcl9Td2l0Y2gsICEwKSkgewogICAgICAgICAgICAgICAgdmFyIG1lbnVzID0gWyBuZXcgTWZiTW9kZWwoIlx1NzY3ZVx1NWVhNiIsICJvbmVrZXl2aXAtYmFpZHUiLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwczovL3d3dy5iYWlkdS5jb20vcz93ZD0iICsgJChTZWFyY2hTZXJ2aWNlLmtleVNlbGVjdG9yKS52YWwoKSk7CiAgICAgICAgICAgICAgICB9KSksIG5ldyBNZmJNb2RlbCgiXHU2NDFjXHU3MmQ3IiwgIm9uZWtleXZpcC1zb3Vnb3UiLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwczovL3d3dy5zb2dvdS5jb20vd2ViP3F1ZXJ5PSIgKyAkKFNlYXJjaFNlcnZpY2Uua2V5U2VsZWN0b3IpLnZhbCgpICsgIiZpZT11dGY4Iik7CiAgICAgICAgICAgICAgICB9KSksIG5ldyBNZmJNb2RlbCgiXHU4YzM3XHU2YjRjIiwgIm9uZWtleXZpcC1nb29nbGUiLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPSIgKyAkKFNlYXJjaFNlcnZpY2Uua2V5U2VsZWN0b3IpLnZhbCgpKTsKICAgICAgICAgICAgICAgIH0pKSwgbmV3IE1mYk1vZGVsKCIzNjAiLCAib25la2V5dmlwLTM2MGxvZ28iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwczovL3d3dy5zby5jb20vcz9xPSIgKyAkKFNlYXJjaFNlcnZpY2Uua2V5U2VsZWN0b3IpLnZhbCgpKTsKICAgICAgICAgICAgICAgIH0pKSwgbmV3IE1mYk1vZGVsKCJCaW5nIiwgIm9uZWtleXZpcC1iaXlpbmciLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwczovL2NuLmJpbmcuY29tL3NlYXJjaD9xPSIgKyAkKFNlYXJjaFNlcnZpY2Uua2V5U2VsZWN0b3IpLnZhbCgpKTsKICAgICAgICAgICAgICAgIH0pKSBdOwogICAgICAgICAgICAgICAgbmV3IE1mYk1lbnUoQ29uZmlnLmdldChDb25maWdFbnVtLlNlYXJjaF9PcHRNZW51UG9zLCAiY2wiKSwgQ29uZmlnLmdldChDb25maWdFbnVtLlNlYXJjaF9PcHRNZW51TWV0aG9kLCAiaG92ZXIiKSkuSW5pdChtZW51cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBTZWFyY2hTZXJ2aWNlLmtleVNlbGVjdG9yID0gIiNub25lIiwgU2VhcmNoU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIFF1YXJrRmlsZVJlc3BvbnNlID0gZnVuY3Rpb24gUXVhcmtGaWxlUmVzcG9uc2UoKSB7fSwgTmV0RGlza0RpcmVjdFNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBOZXREaXNrRGlyZWN0U2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJ1bGVzID0gbmV3IE1hcChbIFsgU2l0ZUVudW0uS3VhS2VIb21lLCAvcGFuXC5xdWFya1wuY25cL2xpc3QvIF0sIFsgU2l0ZUVudW0uQmFpZHVQYW5NYWluLCAvcGFuXC5iYWlkdVwuY29tXC9kaXNrXC9tYWluL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLl9hcHBOYW1lID0gIk5ldERpc2tEaXJlY3QiLCBfdGhpcy5zZW1pdWkgPSAhMCwgX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfX2V4dGVuZHMoTmV0RGlza0RpcmVjdFNlcnZpY2UsIF9zdXBlciksIE5ldERpc2tEaXJlY3RTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCAKICAgICAgICBOZXREaXNrRGlyZWN0U2VydmljZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIE5ldERpc2tEaXJlY3RTZXJ2aWNlLl9zaXRlID0gdGhpcy5zaXRlLCB0aGlzLnNpdGUgPT0gU2l0ZUVudW0uS3VhS2VIb21lID8gKE5ldERpc2tEaXJlY3RTZXJ2aWNlLmJ0blNlbGVjb3RyID0gIi5idG4tb3BlcmF0ZSIsIAogICAgICAgICAgICBOZXREaXNrRGlyZWN0U2VydmljZS5idG4gPSAnPGRpdiBjbGFzcz0ib3ZrLW1haW4iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHg7Ij5cbiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImFudC1idG4gYnRuLWZpbGUgb2t2LWJ0bi1kaXJlY3QiPlxuICAgICAgICA8aW1nIHNyYz0iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpJaUlHaGxhV2RvZEQwaU1qSWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXlNaklpSUhOMGNtOXJaUzEzYVdSMGFEMGlNaUkrUEhCaGRHZ2djM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWlCemRISnZhMlV0YkdsdVpXcHZhVzQ5SW5KdmRXNWtJaUJrUFNKTk9TQXhNbXd5SURJZ01pMHllaUl2UGp4d1lYUm9JR1E5SWsweE5DQTRhREV1TlRVell5NDROU0F3SURFdU1UWXVNRGt6SURFdU5EY3VNalkzTGpNeE1TNHhOelF1TlRVMkxqUXpMamN5TWk0M05UWXVNVFkyTGpNeU5pNHlOVFV1TmpVdU1qVTFJREV1TlRSMk5DNDROek5qTUNBdU9Ea3lMUzR3T0RrZ01TNHlNVFV0TGpJMU5TQXhMalUwTFM0eE5qWXVNekkzTFM0ME1TNDFPRE10TGpjeU1pNDNOVGN0TGpNeExqRTNOQzB1TmpJdU1qWTNMVEV1TkRjdU1qWTNTRFl1TkRRM1l5MHVPRFVnTUMweExqRTJMUzR3T1RNdE1TNDBOeTB1TWpZM1lURXVOemM0SURFdU56YzRJREFnTURFdExqY3lNaTB1TnpVMll5MHVNVFkyTFM0ek1qWXRMakkxTlMwdU5qVXRMakkxTlMweExqVTBkaTAwTGpnM00yTXdMUzQ0T1RJdU1EZzVMVEV1TWpFMUxqSTFOUzB4TGpVMExqRTJOaTB1TXpJM0xqUXhMUzQxT0RNdU56SXlMUzQzTlRjdU16RXRMakUzTkM0Mk1pMHVNalkzSURFdU5EY3RMakkyTjBneE1TSXZQanh3WVhSb0lITjBjbTlyWlMxc2FXNWxZMkZ3UFNKeWIzVnVaQ0lnYzNSeWIydGxMV3hwYm1WcWIybHVQU0p5YjNWdVpDSWdaRDBpVFRFeElETjJNVEFpTHo0OEwyYytQQzl6ZG1jKyIgY2xhc3M9ImJ0bi1pY29uIiBhbHQ9IiIgc3R5bGU9IndpZHRoOiAyMHB4O2hlaWdodDogMjBweCI+XG4gICAgICAgIDxzcGFuPlx1ODNiN1x1NTNkNlx1NzZmNFx1OTRmZTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbjwvZGl2PicsIAogICAgICAgICAgICBOZXREaXNrRGlyZWN0U2VydmljZS5nZXRTZWxlY29yID0gTmV0RGlza0RpcmVjdFNlcnZpY2UuZ2V0UXVhcmtTZWxlY3RlZEZpbGUsIE5ldERpc2tEaXJlY3RTZXJ2aWNlLnF1YXJrTGlzdGVuZXIoKSwgCiAgICAgICAgICAgIENvcmUuYXBwZW5kQ3NzQ29udGVudCgiLmJ0bi1vcGVyYXRlIHtqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQgIWltcG9ydGFudDt9IikpIDogdGhpcy5zaXRlID09IFNpdGVFbnVtLkJhaWR1UGFuTWFpbiAmJiAoTmV0RGlza0RpcmVjdFNlcnZpY2UuYnRuU2VsZWNvdHIgPSAiLndwLXMtYWdpbGUtdG9vbC1iYXJfX2hlYWRlciIsIAogICAgICAgICAgICBOZXREaXNrRGlyZWN0U2VydmljZS5idG4gPSAnPGRpdiBjbGFzcz0ib3ZrLW1haW4iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHg7Ij5cbiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InUtYnV0dG9uIG5kLWZpbGUtbGlzdC10b29sYmFyLWFjdGlvbi1pdGVtIHUtYnV0dG9uLS1wcmltYXJ5IHUtYnV0dG9uLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiBva3YtYnRuLWRpcmVjdCIgc3R5bGU9ImJhY2tncm91bmQ6ICMwOUFBRkY7Ym9yZGVyLWNvbG9yOiAjMDlBQUZGO2ZvbnQtc2l6ZTogMTRweDtwYWRkaW5nOiA3cHggMTZweDtib3JkZXI6IG5vbmU7XG59Ij5cbiAgICAgICAgPGkgY2xhc3M9InUtaWNvbiB1LWljb24tZG93bmxvYWQiPjwvaT5cbiAgICAgICAgPHNwYW4+XHU4M2I3XHU1M2Q2XHU3NmY0XHU5NGZlPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+JywgCiAgICAgICAgICAgIE5ldERpc2tEaXJlY3RTZXJ2aWNlLmluaXRCdXR0b24oKSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuYmFpZHVFdmVudCgpLCBOZXREaXNrRGlyZWN0U2VydmljZS5jb21tb25FdmVudCgpKTsKICAgICAgICB9LCBOZXREaXNrRGlyZWN0U2VydmljZS5xdWFya0xpc3RlbmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIChmdW5jdGlvbihfYSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJodHRwczovL3Bhbi5xdWFyay5jbi9saXN0Iy8iLCAiaHR0cHM6Ly9wYW4ucXVhcmsuY24vbGlzdCMvbGlzdC9hbGwiLCAiaHR0cHM6Ly9wYW4ucXVhcmsuY24vbGlzdCMvIiA9PT0gZS5vbGRVUkwgJiYgImh0dHBzOi8vcGFuLnF1YXJrLmNuL2xpc3QjL2xpc3QvYWxsIiA9PT0gZS5uZXdVUkwgPyBbIDIgXSA6IFsgNCwgQ29yZS5zbGVlcCguMTUpIF07CgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYS5zZW50KCksICQoIi5xdWFyay1idXR0b24iKS5sZW5ndGggPiAwID8gWyAyIF0gOiAoTmV0RGlza0RpcmVjdFNlcnZpY2UuaW5pdEJ1dHRvbigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMiBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpLCBOZXREaXNrRGlyZWN0U2VydmljZS5pbml0QnV0dG9uKCksIE5ldERpc2tEaXJlY3RTZXJ2aWNlLnF1YXJrRXZlbnQoKSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuY29tbW9uRXZlbnQoKTsKICAgICAgICB9LCBOZXREaXNrRGlyZWN0U2VydmljZS5iYWlkdVNlbGVjdGVkTGlzdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpLmluc3RhbmNlRm9yU3lzdGVtLmxpc3QuZ2V0U2VsZWN0ZWQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuc2FmZVdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIud3Atcy1jb3JlLXBhbiIpLl9fdnVlX18uc2VsZWN0ZWRMaXN0OwogICAgICAgICAgICB9CiAgICAgICAgfSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuZ2V0TG9naWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKENvcmUuZ2V0Q29va2llKCJCQUlEVUlEIikpOwogICAgICAgIH0sIE5ldERpc2tEaXJlY3RTZXJ2aWNlLmdldFRva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfYTsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGssIHRva2VuLCByZXM7CiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9iKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gayA9ICJiYWlkdV9hY2Nlc3NfVG9rZW4iLCAodG9rZW4gPSBDb25maWcuZ2V0KGspICYmIENvbmZpZy5nZXQoaykubGVuZ3RoID4gMCAmJiBDb25maWcuZ2V0KGspKSA/IFsgMiwgdG9rZW4gXSA6IFsgNCwgUm91dGUuYmFpZHVBY2Nlc3NUb2tlbigpIF07CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IChyZXMgPSBfYi5zZW50KCkpLmluZGV4T2YoImFjY2Vzc190b2tlbiIpID8gWyAzLCA0IF0gOiBbIDQsIFJvdXRlLmJhaWR1QWNjZXNzVG9rZW5BdXRoKCkgXTsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYi5zZW50KCksIFsgNCwgUm91dGUuYmFpZHVBY2Nlc3NUb2tlbigpIF07CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT09IChyZXMgPSBfYi5zZW50KCkpLmluZGV4T2YoImFjY2Vzc190b2tlbiIpKSByZXR1cm4gVG9hc3QuZXJyb3IoIlx1NjNkMFx1NzkzYVx1ZmYxYVx1ODNiN1x1NTNkNnRva2VuXHU1OTMxXHU4ZDI1XHVmZjAxIiksIAogICAgICAgICAgICAgICAgICAgICAgICBbIDIsICExIF07CiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNDsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG9rZW4gPSBudWxsID09PSAoX2EgPSByZXMubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXSspLykpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYVsxXSkgJiYgQ29uZmlnLnNldChrLCB0b2tlbiwgMjE2MDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgWyAyLCB0b2tlbiBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIE5ldERpc2tEaXJlY3RTZXJ2aWNlLnNlbmRMaW5rVG9SUEMgPSBmdW5jdGlvbihmaWxlbmFtZSwgbGluaywgdWEsIGNvb2tpZSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsLCBycGNEYXRhLCBlXzE7CiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgKGZ1bmN0aW9uKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBDb25maWcuZ2V0KENvbmZpZ0VudW0uV2FuZ1Bhbl9BcmlhX0hvc3QsICJodHRwOi8vbG9jYWxob3N0IikgKyAiOiIgKyBDb25maWcuZ2V0KENvbmZpZ0VudW0uV2FuZ1Bhbl9BcmlhX1BvcnQsIDY4MDApICsgQ29uZmlnLmdldChDb25maWdFbnVtLldhbmdQYW5fQXJpYV9QYXRoLCAiL2pzb25ycGMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJwY0RhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogKG5ldyBEYXRlKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29ucnBjOiAiMi4wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogImFyaWEyLmFkZFVyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFsgInRva2VuOiIgKyBDb25maWcuZ2V0KENvbmZpZ0VudW0uV2FuZ1Bhbl9BcmlhX1Rva2VuLCAiIiksIFsgbGluayBdLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiBDb25maWcuZ2V0KENvbmZpZ0VudW0uV2FuZ1Bhbl9BcmlhX0RpciwgIkQ6XFwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcjogWyAiVXNlci1BZ2VudDogIiArIHVhLCAiQ29va2llOiAiICsgY29va2llIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXQogICAgICAgICAgICAgICAgICAgICAgICB9LCBfYS5sYWJlbCA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2EudHJ5cy5wdXNoKFsgMSwgMywgLCA0IF0pLCBbIDQsIEh0dHAuYWpheE5ldyh1cmwsICJQT1NUIiwgcnBjRGF0YSwgbmV3IE1hcChbIFsgIlVzZXItQWdlbnQiLCB1YSBdIF0pKSBdOwoKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMiwgISFfYS5zZW50KCkgXTsKCiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlXzEgPSBfYS5zZW50KCksIExvZ2dlci5lcnJvcihlXzEpLCBbIDIsICExIF07CgogICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAyIF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuYmFpZHVFdmVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiLm9rdi1idG4tZGlyZWN0IiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHZhciBmaWRzU3RyLCBzZWxlY3RMaXN0ID0gTmV0RGlza0RpcmVjdFNlcnZpY2UuYmFpZHVTZWxlY3RlZExpc3QoKTsKICAgICAgICAgICAgICAgIDAgIT09IHNlbGVjdExpc3QubGVuZ3RoID8gMiAhPT0gKGZpZHNTdHIgPSAiWyIgKyBzZWxlY3RMaXN0Lm1hcCgoZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmZzX2lkOwogICAgICAgICAgICAgICAgfSkpLmpvaW4oIiwiKSArICJdIikubGVuZ3RoID8gX3RoaXMuZ2V0VG9rZW4oKS50aGVuKChmdW5jdGlvbih0b2tlbikgewogICAgICAgICAgICAgICAgICAgIFJvdXRlLmJhaWR1RHJpZWN0KGZpZHNTdHIsIHRva2VuKS50aGVuKChmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBja18xLCBfYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCAoZnVuY3Rpb24oX2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMb2dnZXIuZGVidWcocmVzKSwgMCAhPT0gcmVzLmVycm5vID8gWyAzLCAyIF0gOiAoX2EgPSAiQkRVU1M9IiwgWyA0LCBDb3JlLmdldEdtQ29va2llKCJCRFVTUyIpIF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNrXzEgPSBfYSArIF9iLnNlbnQoKSArICI7Iiwgc0FsZXJ0Lmh0bWwoIlx1NzZmNFx1OTRmZVx1NGZlMVx1NjA2ZiIsIE5ldERpc2tEaXJlY3RTZXJ2aWNlLmdlbmVyYXRlRG9tKHJlcy5saXN0Lm1hcCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IG5ldyBRdWFya0ZpbGVSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouZmlkID0gZS5mc19pZC50b1N0cmluZygpLCBvYmouZmlsZV9uYW1lID0gZS5maWxlbmFtZSwgb2JqLmRvd25sb2FkX3VybCA9IGUuZGxpbmssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNpemUgPSBlLnNpemUsIG9iai51YSA9ICJwYW4uYmFpZHUuY29tIiwgb2JqLmNvb2tpZSA9IGNrXzEsIG9iajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwgITAsICJcdTYyMTFcdTU5N2RcdTRlODYiLCAiIzMwODVkNiIsICJhdXRvIiksIFsgMywgMyBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyID09PSByZXMuZXJybm8gPyBUb2FzdC5lcnJvcigiXHU2M2QwXHU3OTNhXHVmZjFhXHU5ODc1XHU5NzYyXHU4ZmM3XHU2NzFmXHVmZjBjXHU4YmY3XHU1MjM3XHU2NWIwXHU5MWNkXHU4YmQ1XHVmZjAxIikgOiBUb2FzdC5lcnJvcigiXHU2M2QwXHU3OTNhXHVmZjFhXHU4M2I3XHU1M2Q2XHU0ZTBiXHU4ZjdkXHU5NGZlXHU2M2E1XHU1OTMxXHU4ZDI1XHVmZjAxXHU4YmY3XHU1MjM3XHU2NWIwXHU3ZjUxXHU5ODc1XHU1NDBlXHU5MWNkXHU4YmQ1XHVmZjAxIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAyIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpIDogVG9hc3QuZXJyb3IoIlx1NjNkMFx1NzkzYVx1ZmYxYVx1OGJmN1x1NjI1M1x1NWYwMFx1NjU4N1x1NGVmNlx1NTkzOVx1NTQwZVx1NTJmZVx1OTAwOVx1NjU4N1x1NGVmNlx1ZmYwMSIpIDogVG9hc3QuZXJyb3IoIlx1NjNkMFx1NzkzYVx1ZmYxYVx1OGJmN1x1NTE0OFx1NTJmZVx1OTAwOVx1ODk4MVx1NGUwYlx1OGY3ZFx1NzY4NFx1NjU4N1x1NGVmNlx1ZmYwMSIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTmV0RGlza0RpcmVjdFNlcnZpY2UucXVhcmtFdmVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiLm9rdi1idG4tZGlyZWN0IiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHZhciBmaWRzLCBzZWxlY3RMaXN0ID0gTmV0RGlza0RpcmVjdFNlcnZpY2UuZ2V0UXVhcmtTZWxlY3RlZEZpbGUoKTsKICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygiXHU1OTM4XHU1MTRiLVx1OTAwOVx1NjJlOVx1NjU4N1x1NGVmNiIgKyBzZWxlY3RMaXN0KSwgMCAhPT0gc2VsZWN0TGlzdC5sZW5ndGggPyBzZWxlY3RMaXN0LmZpbHRlcigoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhZS5maWxlOwogICAgICAgICAgICAgICAgfSkpLmxlbmd0aCAhPSBzZWxlY3RMaXN0Lmxlbmd0aCA/IChmaWRzID0gc2VsZWN0TGlzdC5maWx0ZXIoKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5maWxlOwogICAgICAgICAgICAgICAgfSkpLm1hcCgoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmZpZDsKICAgICAgICAgICAgICAgIH0pKSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuX3NpdGUgPT0gU2l0ZUVudW0uS3VhS2VIb21lID8gUm91dGUucXVhcmtEcmllY3QoZmlkcykudGhlbigoZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dlci5kZWJ1ZyhyZXMpLCAzMTAwMSAhPSByZXMuY29kZSkgaWYgKDAgPT0gcmVzLmNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSByZXMuZGF0YS5tYXAoKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvb2tpZSA9IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5jb29raWUsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgc0FsZXJ0Lmh0bWwoIlx1NzZmNFx1OTRmZVx1NGZlMVx1NjA2ZiIsIE5ldERpc2tEaXJlY3RTZXJ2aWNlLmdlbmVyYXRlRG9tKGRhdGEpLCAhMCwgIlx1NjIxMVx1NTk3ZFx1NGU4NiIsICIjMzA4NWQ2IiwgImF1dG8iKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgVG9hc3QuZXJyb3IoIlx1OTRmZVx1NjNhNVx1ODNiN1x1NTNkNlx1NTkzMVx1OGQyNSxcdThiZjdcdTdhMGRcdTU0MGVcdTUxOGRcdThiZDUoIiArIHJlcy5jb2RlICsgIikiKTsgZWxzZSBUb2FzdC5lcnJvcigiXHU4YmY3XHU1MTQ4XHU3NjdiXHU1ZjU1XHU3ZjUxXHU3NmQ4Iik7CiAgICAgICAgICAgICAgICB9KSkgOiBzQWxlcnQuZXJyb3IoIlx1OGJmN1x1NTE0OFx1NWMwNlx1NjU4N1x1NGVmNlx1NGZkZFx1NWI1OFx1NTIzMFx1ODFlYVx1NWRmMVx1NzY4NFx1N2Y1MVx1NzZkOCIpKSA6IFRvYXN0LmVycm9yKCJcdTY2ODJcdTRlMGRcdTY1MmZcdTYzMDFcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMGJcdThmN2QiKSA6IFRvYXN0LmVycm9yKCJcdThiZjdcdTUxNDhcdTUyZmVcdTkwMDlcdTg5ODFcdTRlMGJcdThmN2RcdTc2ODRcdTY1ODdcdTRlZjYiKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIE5ldERpc2tEaXJlY3RTZXJ2aWNlLmNvbW1vbkV2ZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIucXVhcmstZG93bi1pdGVtIiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIENvcmUub3BlbihlLnRhcmdldC5kYXRhc2V0LnVybCwgITApOwogICAgICAgICAgICB9KSksICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIucXVhcmstY29weS1pdGVtIiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChlLnRhcmdldC5kYXRhc2V0LnVybCksIGUudGFyZ2V0LmlubmVyVGV4dCA9ICJcdTU5MGRcdTUyMzZcdTYyMTBcdTUyOWYiOwogICAgICAgICAgICB9KSksICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIucXVhcmstc2VuZC1pdGVtIiwgKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybCwgZmlsZW5hbWUsIHVhLCBjaywgcmVzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCAoZnVuY3Rpb24oX2EpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwgPSBlLnRhcmdldC5kYXRhc2V0LnVybCwgZmlsZW5hbWUgPSBlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCB1YSA9IGUudGFyZ2V0LmRhdGFzZXQudWEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJEVVNTPTsiID09IChjayA9IGUudGFyZ2V0LmRhdGFzZXQuY2spICYmIFRvYXN0Lndhcm5pbmcoImNvb2tpZVx1ODNiN1x1NTNkNlx1NWYwMlx1NWUzOCxcdTRlMGJcdThmN2RcdTUzZWZcdTgwZmRcdTRmMWFcdTU5MzFcdThkMjUsXHU1M2VmXHU1YzFkXHU4YmQ1XHU0ZjdmXHU3NTI4XHU4MTFhXHU2NzJjXHU3MzJiXHU5MDdmXHU1MTRkXHU4YmU1XHU5NWVlXHU5ODk4IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyA0LCBOZXREaXNrRGlyZWN0U2VydmljZS5zZW5kTGlua1RvUlBDKGZpbGVuYW1lLCB1cmwsIHVhLCBjaykgXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyA9IF9hLnNlbnQoKSwgZS50YXJnZXQuaW5uZXJUZXh0ID0gcmVzID8gIlx1NTNkMVx1OTAwMVx1NjIxMFx1NTI5ZiIgOiAiXHU1M2QxXHU5MDAxXHU1OTMxXHU4ZDI1KFx1OGJmN1x1NjhjMFx1NjdlNVx1OTE0ZFx1N2Y2ZSkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMiBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuZ2VuZXJhdGVEb20gPSBmdW5jdGlvbihsaXN0KSB7CiAgICAgICAgICAgIHZhciByb3dzID0gIiI7CiAgICAgICAgICAgIHJldHVybiBsaXN0LmZvckVhY2goKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJvd3MgKz0gJzx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj4nICsgZS5maWxlX25hbWUgKyAnPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj4nICsgQ29yZS5zaXplRm9ybWF0KGUuc2l6ZSkgKyAnPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im9rdi1idG4gb2t2LWJ0bi1wcmltYXJ5IG9rdi1idG4tc3VjY2VzcyBxdWFyay1zZW5kLWl0ZW0iIGRhdGEtdXJsPSInICsgZS5kb3dubG9hZF91cmwgKyAnIiBkYXRhLWZpbGVuYW1lPSInICsgZS5maWxlX25hbWUgKyAnIiBkYXRhLXVhPSInICsgZS51YSArICciIGRhdGEtY2s9IicgKyBlLmNvb2tpZSArICciPlx1NTNkMVx1OTAwMUFyaWE8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im9rdi1idG4gb2t2LWJ0bi1wcmltYXJ5IHF1YXJrLWNvcHktaXRlbSIgZGF0YS11cmw9IicgKyBlLmRvd25sb2FkX3VybCArICciPlx1NTkwZFx1NTIzNlx1OTRmZVx1NjNhNTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ib2t2LWJ0biBva3YtYnRuLXByaW1hcnkgcXVhcmstZG93bi1pdGVtIiBkYXRhLXVybD0iJyArIGUuZG93bmxvYWRfdXJsICsgJyI+XHU0ZTBiXHU4ZjdkPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPic7CiAgICAgICAgICAgIH0pKSwgJzxkaXYgc3R5bGU9ImhlaWdodDogMzByZW0iPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nLWJvdHRvbTogMjVweDsiPlx1NTk4Mlx1Njc5Y1x1NTFmYVx1NzNiMDQwM1x1OGJmN1x1NWMxZFx1OGJkNTxhIHN0eWxlPSJjb2xvcjogcmVkIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly9zZXR0aW5ncy53YW5kaGkuY29tL3Rvb2xzL3dhbmdwYW4vcGFnZS5odG1sIj5cdTY4YzBcdTY3ZTVcdTkxNGRcdTdmNmU8L2E+XHU2MjE2XHU1MzQ3XHU3ZWE3PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2lraS53YW5kaGkuY29tL3poLWNuL0NoYW5nZWxvZy5odG1sIj5cdTY3MDBcdTY1YjBcdTcyNDhcdTY3MmM8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxwPlx1NzZmNFx1OTRmZTxiIHN0eWxlPSJjb2xvcjogcmVkIj5cdTVlNzZcdTRlMGRcdTgwZmQ8L2I+IFx1NGVlM1x1NjZmZlx1N2Y1MVx1NzZkOFZJUFx1NTI5Zlx1ODBmZFx1ZmYwY1x1NGUwZFx1NGYxYVx1NGY3Zlx1NzUyOFx1OGJmN1x1NTE0OFx1NjdlNVx1NzcwYjxhIGhyZWY9Imh0dHBzOi8vd2lraS53YW5kaGkuY29tIiBzdHlsZT0iY29sb3I6IGJsdWUiIHRhcmdldD0iX2JsYW5rIj5XaWtpPC9hPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHA+XHU3NmY0XHU5NGZlXHU1MjlmXHU4MGZkXHU2NDJkXHU5MTRkVklQXHU0ZjFhXHU1NDU4XHU2MjRkXHU4MGZkXHU4M2I3XHU1M2Q2XHU1MjMwXHU1MmEwXHU5MDFmXHU5NGZlXHU2M2E1PGI+KDxhIGhyZWY9IicgKyBOZXREaXNrRGlyZWN0U2VydmljZS5iZFZpcDEgKyAnIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImNvbG9yOiByZWQiPlx1ODNiN1x1NTNkNlx1NGUzNFx1NjVmNlZJUFx1MjQ2MDwvYT5cdWZmMGM8YSBocmVmPSInICsgTmV0RGlza0RpcmVjdFNlcnZpY2UuYmRWaXAyICsgJyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJjb2xvcjogcmVkIj5cdTgzYjdcdTUzZDZcdTRlMzRcdTY1ZjZWSVBcdTI0NjE8L2E+KTwvYj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDxwPjxiIHN0eWxlPSJjb2xvcjogcmVkIj5cdTU5MjdcdTY1ODdcdTRlZjY8L2I+XHU4YmY3XHU0ZjE4XHU1MTQ4XHU0ZjdmXHU3NTI4QXJpYVx1NGU0Ylx1N2M3Ylx1NzY4NFx1NGUwYlx1OGY3ZFx1NWRlNVx1NTE3NyxcdTc2ZjRcdTYzYTVcdTcwYjlcdTUxZmJcdTRlMGJcdThmN2RcdTU5MjdcdTY5ODJcdTczODdcdTRmMWFcdTZjYTFcdTY3NDNcdTk2NTA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImJpbGktdGFibGUgYmlsaS10YWJsZS1zbWFsbCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3M9ImJpbGktdGFibGUtaGVhZCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImJpbGktdGFibGUtY2VsbCI+XHU2ODA3XHU5ODk4PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJiaWxpLXRhYmxlLWNlbGwiPlx1NTkyN1x1NWMwZjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iYmlsaS10YWJsZS1jZWxsIj5cdTY0Y2RcdTRmNWM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzPSJhdC10YWJsZS10Ym9keSI+ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICsgcm93cyArICJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+ICAgIFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgIDwvZGl2PiI7CiAgICAgICAgfSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuaW5pdEJ1dHRvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDb3JlLmF1dG9MYXp5bG9hZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJChOZXREaXNrRGlyZWN0U2VydmljZS5idG5TZWxlY290cikubGVuZ3RoID4gMDsKICAgICAgICAgICAgfSksIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIENvcmUucHJlcGVuZChOZXREaXNrRGlyZWN0U2VydmljZS5idG5TZWxlY290ciwgTmV0RGlza0RpcmVjdFNlcnZpY2UuYnRuKTsKICAgICAgICAgICAgfSksIC41KTsKICAgICAgICB9LCBOZXREaXNrRGlyZWN0U2VydmljZS5nZXRRdWFya1NlbGVjdGVkRmlsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcmVhY3REb20sIHByb3BzLCBmaWxlTGlzdCwgc2VsZWN0ZWRLZXlzXzEsIHNlbGVjdGVkTGlzdCA9IFtdOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWN0RG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZmlsZS1saXN0IilbMF0sIChwcm9wcyA9IENvcmUuZ2V0UmVhY3QocmVhY3REb20pLnByb3BzKSAmJiAoZmlsZUxpc3QgPSBwcm9wcy5saXN0IHx8IFtdLCAKICAgICAgICAgICAgICAgIHNlbGVjdGVkS2V5c18xID0gcHJvcHMuc2VsZWN0ZWRSb3dLZXlzIHx8IFtdLCBmaWxlTGlzdC5mb3JFYWNoKChmdW5jdGlvbih2YWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEtleXNfMS5pbmNsdWRlcyh2YWwuZmlkKSAmJiBzZWxlY3RlZExpc3QucHVzaCh2YWwpOwogICAgICAgICAgICAgICAgfSkpKSwgc2VsZWN0ZWRMaXN0OwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMaXN0OwogICAgICAgICAgICB9CiAgICAgICAgfSwgTmV0RGlza0RpcmVjdFNlcnZpY2UuYnRuU2VsZWNvdHIgPSAiIiwgTmV0RGlza0RpcmVjdFNlcnZpY2UuYnRuID0gIiIsIE5ldERpc2tEaXJlY3RTZXJ2aWNlLmJkVmlwMiA9ICJodHRwOi8vZmsuaXF1YW55aS5jYyIsIAogICAgICAgIE5ldERpc2tEaXJlY3RTZXJ2aWNlLmJkVmlwMSA9ICJodHRwOi8va2suY2xvdWRucy5jaCIsIE5ldERpc2tEaXJlY3RTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgQWRDbGVhclNlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBBZENsZWFyU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLkJhaWR1LCAvYmFpZHUuY29tXC9zXD93ZC9pIF0sIFsgU2l0ZUVudW0uWW91VHVCZSwgL3lvdXR1YmUuY29tXC93YXRjaC9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzLl9hcHBOYW1lID0gIlx1NWU3Zlx1NTQ0YVx1NmUwNVx1NzQwNiIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKEFkQ2xlYXJTZXJ2aWNlLCBfc3VwZXIpLCBBZENsZWFyU2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7fSwgCiAgICAgICAgQWRDbGVhclNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLllvdXR1YmVNb2JpbGUoKTsKICAgICAgICB9LCBBZENsZWFyU2VydmljZS5wcm90b3R5cGUuWW91dHViZU1vYmlsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY3NzID0gWyAieXRtLWl0ZW0tc2VjdGlvbi1yZW5kZXJlcjpoYXMoYVtocmVmKj0nZ29vZ2xlYWRzJ10pIiwgIiNtYXN0aGVhZC1hZCIsICJ5dGQtcmljaC1pdGVtLXJlbmRlcmVyLnN0eWxlLXNjb3BlLnl0ZC1yaWNoLWdyaWQtcm93ICNjb250ZW50OmhhcygueXRkLWRpc3BsYXktYWQtcmVuZGVyZXIpIiwgInl0ZC1yaWNoLXNlY3Rpb24tcmVuZGVyZXIgI2Rpc21pc3NpYmxlIiwgIi52aWRlby1hZHMueXRwLWFkLW1vZHVsZSIsICJ0cC15dC1wYXBlci1kaWFsb2c6aGFzKHl0LW1lYWxiYXItcHJvbW8tcmVuZGVyZXIpIiwgIiNyZWxhdGVkICNwbGF5ZXItYWRzIiwgIiNyZWxhdGVkIHl0ZC1hZC1zbG90LXJlbmRlcmVyIiwgInl0ZC1hZC1zbG90LXJlbmRlcmVyIiwgInl0LW1lYWxiYXItcHJvbW8tcmVuZGVyZXIiIF0sIGNzc1RleHQgPSBjc3Muam9pbigiLCIpICsgIntkaXNwbGF5Om5vbmUhaW1wb3J0YW50O30iOwogICAgICAgICAgICBDb3JlLmFwcGVuZENzc0NvbnRlbnQoY3NzVGV4dCksIExvZ2dlci5pbmZvKCJZb3V0dWJlTW9iaWxlIEFkQ2xlYXJTZXJ2aWNlIGxvYWRlZCIpOwogICAgICAgIH0sIEFkQ2xlYXJTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgY3NzXzI0OHokMSA9ICcudmlld2VyLWNsb3NlOmJlZm9yZSwudmlld2VyLWZsaXAtaG9yaXpvbnRhbDpiZWZvcmUsLnZpZXdlci1mbGlwLXZlcnRpY2FsOmJlZm9yZSwudmlld2VyLWZ1bGxzY3JlZW4tZXhpdDpiZWZvcmUsLnZpZXdlci1mdWxsc2NyZWVuOmJlZm9yZSwudmlld2VyLW5leHQ6YmVmb3JlLC52aWV3ZXItb25lLXRvLW9uZTpiZWZvcmUsLnZpZXdlci1wbGF5OmJlZm9yZSwudmlld2VyLXByZXY6YmVmb3JlLC52aWV3ZXItcmVzZXQ6YmVmb3JlLC52aWV3ZXItcm90YXRlLWxlZnQ6YmVmb3JlLC52aWV3ZXItcm90YXRlLXJpZ2h0OmJlZm9yZSwudmlld2VyLXpvb20taW46YmVmb3JlLC52aWV3ZXItem9vbS1vdXQ6YmVmb3Jle2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVJnQUFBQVVDQVlBQUFCV095SkRBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFZ0FBQ3hJQjB0MSsvQUFBQUJ4MFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1JtbHlaWGR2Y210eklFTlROdWk4c293QUFBUVBTVVJCVkhpYzdacy9pRnhWRk1hLzBVMlVhSkdrc1VnbklWaFl4VmhwakRiWkNCbUxkQVlFQ3hzUkZCVFVhbWNYVWlTTm5jZ0tRYlN4c3hIOGd6QVAzRlUyalkwa0tLSk5paWlJZ2hGbGNjblA0cDNuUENkdjNwOTc3OHZzTE9jSEIyYmZ2ZWViNzk1NWMzanZ2TmtCSU1keG5ENjRhOTRHSE1mWnUzaUJjUnluTjd6QU9JN1RHMTVnSENlZU5Va3I4emF4RzJsYllEWXNkZ01ia3RCc1AwM2pkUXdsalNYZHRCaExPbXRqb3dDOU1nOUwra25TbGNEOFROS3BTQTlsQnBLMkpGMlZkRFNSNW41SjY0bTBxbGkzOTloTkZNVWxwc2hRaWk1amJYVGJIR3ZpQjBuTE5lTkRTZDlWTzRBMlVkQjJmcCt4MGVDbmFYeFdYR0EyWDBhdS8zSGdOOVA0TEZDaklBTk9KZHJMcjB6elorQkVwTllEd0ticG5RTWVBdzRtOEhqUXRNNlo5cWE5MTd6UFF3RnIzTTVLZ0E2SjVyVEpDZEZaSmo5L2x5dkdoc0R2d0ZOVnVWMk1oaGpySzZiOWJGaUUrajFyODdlQmw0SER3Q0Y3L1UvaytvZkFYNWIvRVhCdjVKb0xNdUlMemYzQXA2WjNFemdkcUhNQ3VGN2hjUWY0SERnZW9IbmNjbmNxZEsvVHZTRFdmZkZYSS9leElDWS94WnlxYzZYTFdGMVVGWm5hNGdKN3E4QnNSdmdkMi94WHBvNlArRDlkZlQ3UHBFQ3RBM2NuV1BNMEdYR0ZaaC93Z1dsdEErY0ROQzdYK0FQNEd6alpRZStrNWRSeHVZUGVpdVhVN2UxcXdMcER6N2RGalhLUmFTd3VNTHZBbEc4elpsRytZbWlLMUhvRnFUN3dQMnorNFE0NVRmRUdjTXQwMXhMb05aRUJUd1JxRDRCTHBuTUxlQzFBNDFVbVZ4c1hnWGVCYXlWL1d4MjBycFR5cnBuV1JmdDdwNk8vRmRxekdyRHVrUE50a2FNb01vM0ZCZEJTUU1PbllCQ1JleWYwNXMxMjZmVTl5dGZYOTgrbVk1NEt4bnA3UzlLM2tqNlU5S1lkRzBoNlVkTGJraDdwb0ZYTWZVblNPeVZ2TDBoNlZ0SVhIYlM2bk9QK3MvWm05bXZ5WFcxdXVDOW9oWjcyRTl1RG1YV0xKT0IxR3hzSCtEeFBmdHNCOEI2d2xHRE4wMlRBa3hHNis0RDNUV3NiZUM1Q1M4Q0RGY2UrQVc1MDBMaGhPVzIwMjBUUmpLM2IyMUhFbWd0aTltMFJvbnhiZE1aZVZ6VisvNHRGM2NCcFA3RTltS0hOTDVxOGg1ZzBlWXNDTVF6MGVwcThnUXJ3TVhBZ2NzMEZHWEdGUmNCOXdDZW1GOVBrYllxTS9CYXM3ZnhMd05lSlBkVGRwbzRpdFF0aThsUE1xVHBYdW96VlJWWFBwYkhJM0trTlRCMU5ma0w4MWoybXZoRHA5MUhnVjlNS3VSSXFyeWtqM1dQcTRySHlMK2F4ajgvcUdQbVRxaTZGOVlEbEhPdkpVNm9ZY1RzaC9UWVN6V21URTZKVDE5Q3RMVEp0MzJENkNtSGUwZVFuMU84ejVBWGdUNHN4NFZjdTAvRVFlY015ZEI4ejBoVVdrVGQydDRDcndORWVQcU1CY0FSNG1yQmJ3eVhMUFdKYTh6clhtbUxFaE5CbWZwa3VZMjEwMnh4cmloK3BiK2llQWI2dkdodUE5N1VjSjVLUjhnWjc3Sys5OXh4ZVlCekg2UTMvWjBmSGNYckRDNHpqT0wzaEJjWnhuTjc0Rit6bHZYRldYRjlQQUFBQUFFbEZUa1N1UW1DQyIpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6MjgwcHg7Y29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTpibG9jaztmb250LXNpemU6MDtoZWlnaHQ6MjBweDtsaW5lLWhlaWdodDowO3dpZHRoOjIwcHh9LnZpZXdlci16b29tLWluOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMDtjb250ZW50OiJab29tIEluIn0udmlld2VyLXpvb20tb3V0OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMHB4IDA7Y29udGVudDoiWm9vbSBPdXQifS52aWV3ZXItb25lLXRvLW9uZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNDBweCAwO2NvbnRlbnQ6Ik9uZSB0byBPbmUifS52aWV3ZXItcmVzZXQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTYwcHggMDtjb250ZW50OiJSZXNldCJ9LnZpZXdlci1wcmV2OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IDA7Y29udGVudDoiUHJldmlvdXMifS52aWV3ZXItcGxheTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTAwcHggMDtjb250ZW50OiJQbGF5In0udmlld2VyLW5leHQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEyMHB4IDA7Y29udGVudDoiTmV4dCJ9LnZpZXdlci1yb3RhdGUtbGVmdDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQwcHggMDtjb250ZW50OiJSb3RhdGUgTGVmdCJ9LnZpZXdlci1yb3RhdGUtcmlnaHQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IDA7Y29udGVudDoiUm90YXRlIFJpZ2h0In0udmlld2VyLWZsaXAtaG9yaXpvbnRhbDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTgwcHggMDtjb250ZW50OiJGbGlwIEhvcml6b250YWwifS52aWV3ZXItZmxpcC12ZXJ0aWNhbDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMjAwcHggMDtjb250ZW50OiJGbGlwIFZlcnRpY2FsIn0udmlld2VyLWZ1bGxzY3JlZW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTIyMHB4IDA7Y29udGVudDoiRW50ZXIgRnVsbCBTY3JlZW4ifS52aWV3ZXItZnVsbHNjcmVlbi1leGl0OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAwO2NvbnRlbnQ6IkV4aXQgRnVsbCBTY3JlZW4ifS52aWV3ZXItY2xvc2U6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTI2MHB4IDA7Y29udGVudDoiQ2xvc2UifS52aWV3ZXItY29udGFpbmVyey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZTtib3R0b206MDtkaXJlY3Rpb246bHRyO2ZvbnQtc2l6ZTowO2xlZnQ6MDtsaW5lLWhlaWdodDowO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowOy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnZpZXdlci1jb250YWluZXIgOjotbW96LXNlbGVjdGlvbiwudmlld2VyLWNvbnRhaW5lcjo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0udmlld2VyLWNvbnRhaW5lciA6OnNlbGVjdGlvbiwudmlld2VyLWNvbnRhaW5lcjo6c2VsZWN0aW9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnZpZXdlci1jb250YWluZXI6Zm9jdXN7b3V0bGluZTowfS52aWV3ZXItY29udGFpbmVyIGltZ3tkaXNwbGF5OmJsb2NrO2hlaWdodDphdXRvO21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21pbi1oZWlnaHQ6MCFpbXBvcnRhbnQ7bWluLXdpZHRoOjAhaW1wb3J0YW50O3dpZHRoOjEwMCV9LnZpZXdlci1jYW52YXN7Ym90dG9tOjA7bGVmdDowO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowfS52aWV3ZXItY2FudmFzPmltZ3toZWlnaHQ6YXV0bzttYXJnaW46MTVweCBhdXRvO21heC13aWR0aDo5MCUhaW1wb3J0YW50O3dpZHRoOmF1dG99LnZpZXdlci1mb290ZXJ7Ym90dG9tOjA7bGVmdDowO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RleHQtYWxpZ246Y2VudGVyfS52aWV3ZXItbmF2YmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNSk7b3ZlcmZsb3c6aGlkZGVufS52aWV3ZXItbGlzdHtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2hlaWdodDo1MHB4O21hcmdpbjowO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjFweCAwfS52aWV3ZXItbGlzdD5saXtjb2xvcjp0cmFuc3BhcmVudDtjdXJzb3I6cG9pbnRlcjtmbG9hdDpsZWZ0O2ZvbnQtc2l6ZTowO2hlaWdodDo1MHB4O2xpbmUtaGVpZ2h0OjA7b3BhY2l0eTouNTtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjpvcGFjaXR5IC4xNXM7d2lkdGg6MzBweH0udmlld2VyLWxpc3Q+bGk6Zm9jdXMsLnZpZXdlci1saXN0PmxpOmhvdmVye29wYWNpdHk6Ljc1fS52aWV3ZXItbGlzdD5saTpmb2N1c3tvdXRsaW5lOjB9LnZpZXdlci1saXN0PmxpK2xpe21hcmdpbi1sZWZ0OjFweH0udmlld2VyLWxpc3Q+LnZpZXdlci1sb2FkaW5ne3Bvc2l0aW9uOnJlbGF0aXZlfS52aWV3ZXItbGlzdD4udmlld2VyLWxvYWRpbmc6YWZ0ZXJ7Ym9yZGVyLXdpZHRoOjJweDtoZWlnaHQ6MjBweDttYXJnaW4tbGVmdDotMTBweDttYXJnaW4tdG9wOi0xMHB4O3dpZHRoOjIwcHh9LnZpZXdlci1saXN0Pi52aWV3ZXItYWN0aXZlLC52aWV3ZXItbGlzdD4udmlld2VyLWFjdGl2ZTpmb2N1cywudmlld2VyLWxpc3Q+LnZpZXdlci1hY3RpdmU6aG92ZXJ7b3BhY2l0eToxfS52aWV3ZXItcGxheWVye2JhY2tncm91bmQtY29sb3I6IzAwMDtib3R0b206MDtjdXJzb3I6bm9uZTtkaXNwbGF5Om5vbmU7cmlnaHQ6MDt6LWluZGV4OjF9LnZpZXdlci1wbGF5ZXIsLnZpZXdlci1wbGF5ZXI+aW1ne2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MH0udmlld2VyLXRvb2xiYXI+dWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgYXV0byA1cHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6NnB4IDNweH0udmlld2VyLXRvb2xiYXI+dWw+bGl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC41KTtib3JkZXItcmFkaXVzOjUwJTtjdXJzb3I6cG9pbnRlcjtmbG9hdDpsZWZ0O2hlaWdodDoyNHB4O292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE1czt3aWR0aDoyNHB4fS52aWV3ZXItdG9vbGJhcj51bD5saTpmb2N1cywudmlld2VyLXRvb2xiYXI+dWw+bGk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44KX0udmlld2VyLXRvb2xiYXI+dWw+bGk6Zm9jdXN7Ym94LXNoYWRvdzowIDAgM3B4ICNmZmY7b3V0bGluZTowO3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MX0udmlld2VyLXRvb2xiYXI+dWw+bGk6YmVmb3Jle21hcmdpbjoycHh9LnZpZXdlci10b29sYmFyPnVsPmxpK2xpe21hcmdpbi1sZWZ0OjFweH0udmlld2VyLXRvb2xiYXI+dWw+LnZpZXdlci1zbWFsbHtoZWlnaHQ6MThweDttYXJnaW4tYm90dG9tOjNweDttYXJnaW4tdG9wOjNweDt3aWR0aDoxOHB4fS52aWV3ZXItdG9vbGJhcj51bD4udmlld2VyLXNtYWxsOmJlZm9yZXttYXJnaW46LTFweH0udmlld2VyLXRvb2xiYXI+dWw+LnZpZXdlci1sYXJnZXtoZWlnaHQ6MzBweDttYXJnaW4tYm90dG9tOi0zcHg7bWFyZ2luLXRvcDotM3B4O3dpZHRoOjMwcHh9LnZpZXdlci10b29sYmFyPnVsPi52aWV3ZXItbGFyZ2U6YmVmb3Jle21hcmdpbjo1cHh9LnZpZXdlci10b29sdGlwe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuOCk7Ym9yZGVyLXJhZGl1czoxMHB4O2NvbG9yOiNmZmY7ZGlzcGxheTpub25lO2ZvbnQtc2l6ZToxMnB4O2hlaWdodDoyMHB4O2xlZnQ6NTAlO2xpbmUtaGVpZ2h0OjIwcHg7bWFyZ2luLWxlZnQ6LTI1cHg7bWFyZ2luLXRvcDotMTBweDtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjt0b3A6NTAlO3dpZHRoOjUwcHh9LnZpZXdlci10aXRsZXtjb2xvcjojY2NjO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuMjttYXJnaW46NXB4IDUlO21heC13aWR0aDo5MCU7bWluLWhlaWdodDoxNHB4O29wYWNpdHk6Ljg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7dHJhbnNpdGlvbjpvcGFjaXR5IC4xNXM7d2hpdGUtc3BhY2U6bm93cmFwfS52aWV3ZXItdGl0bGU6aG92ZXJ7b3BhY2l0eToxfS52aWV3ZXItYnV0dG9uey13ZWJraXQtYXBwLXJlZ2lvbjpuby1kcmFnO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNSk7Ym9yZGVyLXJhZGl1czo1MCU7Y3Vyc29yOnBvaW50ZXI7aGVpZ2h0OjgwcHg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi00MHB4O3RvcDotNDBweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE1czt3aWR0aDo4MHB4fS52aWV3ZXItYnV0dG9uOmZvY3VzLC52aWV3ZXItYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuOCl9LnZpZXdlci1idXR0b246Zm9jdXN7Ym94LXNoYWRvdzowIDAgM3B4ICNmZmY7b3V0bGluZTowfS52aWV3ZXItYnV0dG9uOmJlZm9yZXtib3R0b206MTVweDtsZWZ0OjE1cHg7cG9zaXRpb246YWJzb2x1dGV9LnZpZXdlci1maXhlZHtwb3NpdGlvbjpmaXhlZH0udmlld2VyLW9wZW57b3ZlcmZsb3c6aGlkZGVufS52aWV3ZXItc2hvd3tkaXNwbGF5OmJsb2NrfS52aWV3ZXItaGlkZXtkaXNwbGF5Om5vbmV9LnZpZXdlci1iYWNrZHJvcHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjUpfS52aWV3ZXItaW52aXNpYmxle3Zpc2liaWxpdHk6aGlkZGVufS52aWV3ZXItbW92ZXtjdXJzb3I6bW92ZTtjdXJzb3I6Z3JhYn0udmlld2VyLWZhZGV7b3BhY2l0eTowfS52aWV3ZXItaW57b3BhY2l0eToxfS52aWV3ZXItdHJhbnNpdGlvbnt0cmFuc2l0aW9uOmFsbCAuM3N9QGtleWZyYW1lcyB2aWV3ZXItc3Bpbm5lcnswJXt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfXRve3RyYW5zZm9ybTpyb3RhdGUoMXR1cm4pfX0udmlld2VyLWxvYWRpbmc6YWZ0ZXJ7YW5pbWF0aW9uOnZpZXdlci1zcGlubmVyIDFzIGxpbmVhciBpbmZpbml0ZTtib3JkZXI6NHB4IHNvbGlkIGhzbGEoMCwwJSwxMDAlLC4xKTtib3JkZXItbGVmdC1jb2xvcjpoc2xhKDAsMCUsMTAwJSwuNSk7Ym9yZGVyLXJhZGl1czo1MCU7Y29udGVudDoiIjtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6NDBweDtsZWZ0OjUwJTttYXJnaW4tbGVmdDotMjBweDttYXJnaW4tdG9wOi0yMHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7d2lkdGg6NDBweDt6LWluZGV4OjF9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey52aWV3ZXItaGlkZS14cy1kb3due2Rpc3BsYXk6bm9uZX19QG1lZGlhIChtYXgtd2lkdGg6OTkxcHgpey52aWV3ZXItaGlkZS1zbS1kb3due2Rpc3BsYXk6bm9uZX19QG1lZGlhIChtYXgtd2lkdGg6MTE5OXB4KXsudmlld2VyLWhpZGUtbWQtZG93bntkaXNwbGF5Om5vbmV9fVxuJywgCiAgICBzdHlsZUluamVjdChjc3NfMjQ4eiQxKSwgSW1nVmlld1NlcnZpY2UgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgICBmdW5jdGlvbiBJbWdWaWV3U2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlYyRVgsIC92MmV4XC5jb21cL3QvaSBdLCBbIFNpdGVFbnVtLkdpdGh1YiwgL2dpdGh1YlwuY29tL2kgXSBdKSwgCiAgICAgICAgICAgIF90aGlzLl91bmlxdWUgPSAhMSwgX3RoaXMuX2FwcE5hbWUgPSAiSW1nVmlldyIsIF90aGlzLmltZ1NlbGVjdG9yID0gW10sIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKEltZ1ZpZXdTZXJ2aWNlLCBfc3VwZXIpLCBJbWdWaWV3U2VydmljZS5wcm90b3R5cGUubG9hZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zaXRlKSB7CiAgICAgICAgICAgICAgY2FzZSBTaXRlRW51bS5WMkVYOgogICAgICAgICAgICAgICAgdGhpcy5pbWdTZWxlY3Rvci5wdXNoKCIucmVwbHlfY29udGVudCIsICIudG9waWNfY29udGVudCIpLCB0aGlzLmJlZm9yZUFjdCA9IEltZ1ZpZXdTZXJ2aWNlLmNsZWFyUGFyZW50QTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIFNpdGVFbnVtLkdpdGh1YjoKICAgICAgICAgICAgICAgIHRoaXMuaW1nU2VsZWN0b3IucHVzaCgiLm1hcmtkb3duLWJvZHkiKSwgSW1nVmlld1NlcnZpY2UuRWxlQUZpbGVydEhhc0F0dHIuc2V0KCJyZWwiLCAibm9vcGVuZXIiKSwgCiAgICAgICAgICAgICAgICB0aGlzLmJlZm9yZUFjdCA9IEltZ1ZpZXdTZXJ2aWNlLmNsZWFyUGFyZW50QTsKICAgICAgICAgICAgfQogICAgICAgIH0sIEltZ1ZpZXdTZXJ2aWNlLmNsZWFyUGFyZW50QSA9IGZ1bmN0aW9uKGVsZSkgewogICAgICAgICAgICB2YXIgciA9ICExOwogICAgICAgICAgICByZXR1cm4gJChlbGUpLmZpbmQoImltZyIpLmVhY2goKGZ1bmN0aW9uKGluZGV4LCBlbGVtZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBpc0ZpbHRlcl8xLCBpc0ZpbHRlcl8yLCBhID0gJChlbGVtZW50KS5wYXJlbnQoImEiKTsKICAgICAgICAgICAgICAgIChudWxsID09PSAoX2EgPSBJbWdWaWV3U2VydmljZS5FbGVBRmlsZXJ0SGFzQ2xhc3MpIHx8IHZvaWQgMCA9PT0gX2EgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCAmJiAoaXNGaWx0ZXJfMSA9ICExLCAKICAgICAgICAgICAgICAgIEltZ1ZpZXdTZXJ2aWNlLkVsZUFGaWxlcnRIYXNDbGFzcy5mb3JFYWNoKChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgYS5oYXNDbGFzcyhpdGVtKSAmJiAoaXNGaWx0ZXJfMSA9ICEwKTsKICAgICAgICAgICAgICAgIH0pKSwgIWlzRmlsdGVyXzEpIHx8IChudWxsID09PSAoX2IgPSBJbWdWaWV3U2VydmljZS5FbGVBRmlsZXJ0SGFzQXR0cikgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLnNpemUpID4gMCAmJiAoaXNGaWx0ZXJfMiA9ICExLCAKICAgICAgICAgICAgICAgIEltZ1ZpZXdTZXJ2aWNlLkVsZUFGaWxlcnRIYXNBdHRyLmZvckVhY2goKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICAgICAgICAgICAgICBhLmF0dHIoa2V5KSAmJiBhLmF0dHIoa2V5KS5pbmRleE9mKHZhbHVlKSA+IC0xICYmIChpc0ZpbHRlcl8yID0gITApOwogICAgICAgICAgICAgICAgfSkpLCAhaXNGaWx0ZXJfMikgfHwgKGEuYXR0cigiaHJlZiIsICJqYXZhc2NyaXB0OnZvaWQoMCkiKS5yZW1vdmVBdHRyKCJ0YXJnZXQiKSwgCiAgICAgICAgICAgICAgICByID0gITApOwogICAgICAgICAgICB9KSksIHI7CiAgICAgICAgfSwgSW1nVmlld1NlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBMb2dnZXIuZGVidWcoIkltZ1ZpZXdTZXJ2aWNlIHJ1bix0aGUgc2VsZWN0b3IgaXMgIiArIHRoaXMuaW1nU2VsZWN0b3IpLCB0aGlzLmltZ1NlbGVjdG9yLmZvckVhY2goKGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAkKHNlbGVjdG9yKS5lYWNoKChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5iZWZvcmVBY3QoZWxlbWVudCkpIHZhciB2aWV3ZXJfMSA9IG5ldyBWaWV3ZXJfX2RlZmF1bHQuZGVmYXVsdChlbGVtZW50LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXJfMS56b29tVG8oLjUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9LCBJbWdWaWV3U2VydmljZS5FbGVBRmlsZXJ0SGFzQ2xhc3MgPSBbXSwgSW1nVmlld1NlcnZpY2UuRWxlQUZpbGVydEhhc0F0dHIgPSBuZXcgTWFwLCAKICAgICAgICBJbWdWaWV3U2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIGNzc18yNDh6ID0gIi5va3YtemhpaHUtdGl0bGUtdGltZSB7XG4gIGNvbG9yOiAjODU5MGE2O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiA1cHggMHB4O1xufVxuIiwgCiAgICBzdHlsZUluamVjdChjc3NfMjQ4eiksIFpoaWh1U2VydmljZSA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICAgIGZ1bmN0aW9uIFpoaWh1U2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlpoaUh1LCAvaHR0cHM6XC9cL3d3d1wuemhpaHVcLmNvbVwvcXVlc3Rpb25cLy9pIF0gXSksIAogICAgICAgICAgICBfdGhpcy5fdW5pcXVlID0gITEsIF90aGlzLl9hcHBOYW1lID0gIlx1NzdlNVx1NGU0ZSIsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKFpoaWh1U2VydmljZSwgX3N1cGVyKSwgWmhpaHVTZXJ2aWNlLnByb3RvdHlwZS5sb2FkZXIgPSBmdW5jdGlvbigpIHt9LCAKICAgICAgICBaaGlodVNlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIENvcmUuYmFja2dyb3VuZCgoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB0aGF0LnF1ZXN0aW9uRGF0ZSgpOwogICAgICAgICAgICB9KSwgMik7CiAgICAgICAgfSwgWmhpaHVTZXJ2aWNlLnByb3RvdHlwZS5xdWVzdGlvbkRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgiLkFuc3dlckl0ZW06bm90KC5va3YtdGltZS1pbml0KSIpLmVhY2goKGZ1bmN0aW9uKGluZGV4LCBlbGUpIHsKICAgICAgICAgICAgICAgIHZhciBjcmVhdGVUaW1lID0gJChlbGUpLmZpbmQoIltpdGVtcHJvcH49ZGF0ZUNyZWF0ZWRdW2NvbnRlbnRdIikuYXR0cigiY29udGVudCIpLCBlZGl0VGltZSA9ICQoZWxlKS5maW5kKCJbaXRlbXByb3B+PWRhdGVNb2RpZmllZF1bY29udGVudF0iKS5hdHRyKCJjb250ZW50IiksIGF1dGhvckl0ZW0gPSAkKGVsZSkuZmluZCgiLkNvbnRlbnRJdGVtLW1ldGEiKSwgaCA9ICc8ZGl2IGNsYXNzPSJva3YtemhpaHUtdGl0bGUtdGltZSI+XHU1MjFiXHU1ZWZhOicgKyBDb3JlLmZvcm1hdChuZXcgRGF0ZShjcmVhdGVUaW1lKSkgKyAiICAgICAgIFx1N2YxNlx1OGY5MToiICsgQ29yZS5mb3JtYXQobmV3IERhdGUoZWRpdFRpbWUpKSArICI8L2Rpdj4iOwogICAgICAgICAgICAgICAgJChhdXRob3JJdGVtKS5hcHBlbmQoaCksICQoZWxlKS5hZGRDbGFzcygib2t2LXRpbWUtaW5pdCIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgWmhpaHVTZXJ2aWNlOwogICAgfShQbHVnaW5CYXNlKSwgTWVudSA9IENvbW1vbi5NZW51LCBYaHNTZXJ2aWNlID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgICAgZnVuY3Rpb24gWGhzU2VydmljZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gbnVsbCAhPT0gX3N1cGVyICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5ydWxlcyA9IG5ldyBNYXAoWyBbIFNpdGVFbnVtLlhocywgL3d3d1wueGlhb2hvbmdzaHVcLmNvbVwvZXhwbG9yZS8gXSBdKSwgCiAgICAgICAgICAgIF90aGlzLl9hcHBOYW1lID0gInhocyIsIF90aGlzLl91bmlxdWUgPSAhMSwgX3RoaXMuc2VtaXVpID0gITAsIF90aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX19leHRlbmRzKFhoc1NlcnZpY2UsIF9zdXBlciksIFhoc1NlcnZpY2UucHJvdG90eXBlLmxvYWRlciA9IGZ1bmN0aW9uKCkge30sIAogICAgICAgIFhoc1NlcnZpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBMb2dnZXIuZGVidWcoInhocyBzZXJ2aWNlIik7CiAgICAgICAgICAgIHRoaXMubWVudS5Jbml0KFsgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTY3MmNcdTZiMjFcdTUxNzNcdTk1ZWQiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NjcyY1x1NmIyMTxicj5cdTUxNzNcdTk1ZWQiLAogICAgICAgICAgICAgICAgdHlwZTogInNlYXJjaCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTZjMzRcdTUzNzBcdTg5ZTNcdTY3OTAiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NmMzNFx1NTM3MDxicj5cdTg5ZTNcdTY3OTAiLAogICAgICAgICAgICAgICAgdHlwZTogInByb2Nlc3MiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAiXHU3ZWRkXHU0ZTE2XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHNob3c6ICJcdTdlZGRcdTRlMTY8YnI+XHU1OTdkXHU1MjM4IiwKICAgICAgICAgICAgICAgIHR5cGU6ICJ0YiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdGl0bGU6ICJcdTRlYWNcdTRlMWNcdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgc2hvdzogIlx1NGVhY1x1NGUxYzxicj5cdTU5N2RcdTUyMzgiLAogICAgICAgICAgICAgICAgdHlwZTogImpkIgogICAgICAgICAgICB9IF0sIHRoaXMuX29uQ2xpY2spOwogICAgICAgIH0sIFhoc1NlcnZpY2UucHJvdG90eXBlLl9vbkNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoImJvZHkiKS5vbigiY2xpY2siLCAiW2RhdGEtY2F0PXByb2Nlc3NdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgWGhzU2VydmljZS54aHNQb3JjZXNzKCk7CiAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9c2VhcmNoXSIsIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIE1lbnUuY2xvc2UoKTsKICAgICAgICAgICAgfSkpLCAkKCJib2R5Iikub24oImNsaWNrIiwgIltkYXRhLWNhdD10Yl0iLCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHA6Ly9zaG9wLmh1aXpoZWsuY29tIik7CiAgICAgICAgICAgIH0pKSwgJCgiYm9keSIpLm9uKCJjbGljayIsICJbZGF0YS1jYXQ9amRdIiwgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQ29yZS5vcGVuKCJodHRwOi8vc2hvcC5odWl6aGVrLmNvbSIpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgWGhzU2VydmljZS54aHNQb3JjZXNzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgaW5mbywgbm90ZUlkLCBub3RlLCBzZWxlY3ROdW0sIG4sIG51bSwgY29kZSwgdXJsID0gQ29yZS51cmwsIHJlcyA9IC9odHRwczpcL1wvd3d3XC54aWFvaG9uZ3NodVwuY29tXC9leHBsb3JlXC9bYS16QS1aMC05X1wtXXs1LDIyfS9pLnRlc3QodXJsKTsKICAgICAgICAgICAgaWYgKHJlcykgaWYgKENvcmUuZ2V0Q29va2llKCJnaWQiKSkgewogICAgICAgICAgICAgICAgaWYgKG5vdGVJZCA9IG51bGwgPT09IChfYSA9IG51bGwgPT0gKGluZm8gPSB1bnNhZmVXaW5kb3cud2luZG93Ll9fSU5JVElBTF9TVEFURV9fKSA/IHZvaWQgMCA6IGluZm8ubm90ZSkgfHwgdm9pZCAwID09PSBfYSA/IHZvaWQgMCA6IF9hLmZpcnN0Tm90ZUlkLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEobm90ZSA9IG51bGwgPT09IChfYyA9IG51bGwgPT09IChfYiA9IG51bGwgPT0gaW5mbyA/IHZvaWQgMCA6IGluZm8ubm90ZSkgfHwgdm9pZCAwID09PSBfYiA/IHZvaWQgMCA6IF9iLm5vdGVEZXRhaWxNYXBbbm90ZUlkXSkgfHwgdm9pZCAwID09PSBfYyA/IHZvaWQgMCA6IF9jLm5vdGUpKSByZXR1cm4gdm9pZCBUb2FzdC5lcnJvcigiXHU1MTg1XHU1YmI5XHU0ZmUxXHU2MDZmXHU4M2I3XHU1M2Q2XHU1OTMxXHU4ZDI1Iik7CiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKG5vdGUpLCAidmlkZW8iID09IChudWxsID09IG5vdGUgPyB2b2lkIDAgOiBub3RlLnR5cGUpID8gVG9hc3Qud2FybmluZygiXHU2NjgyXHU0ZTBkXHU2NTJmXHU2MzAxXHU4OWM2XHU5ODkxXHU4OWUzXHU2NzkwIikgOiAibm9ybWFsIiA9PSAobnVsbCA9PSBub3RlID8gdm9pZCAwIDogbm90ZS50eXBlKSA/IChzZWxlY3ROdW0gPSAkKCIuZnJhY3Rpb24iKS50ZXh0KCksIAogICAgICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZyhzZWxlY3ROdW0pLCBudW0gPSAwLCBudWxsID09IChuID0gc2VsZWN0TnVtLm1hdGNoKC9cZCsvKSkgfHwgbi5sZW5ndGggPCAxIHx8IChudW0gPSBOdW1iZXIucGFyc2VJbnQoblswXSkpLCAKICAgICAgICAgICAgICAgICAgICBjb2RlID0gbnVsbCA9PT0gKF9kID0gbnVsbCA9PSBub3RlID8gdm9pZCAwIDogbm90ZS5pbWFnZUxpc3RbbnVtID4gMCA/IG51bSAtIDEgOiBudW1dKSB8fCB2b2lkIDAgPT09IF9kID8gdm9pZCAwIDogX2QuaW5mb0xpc3RbMV0udXJsLCAKICAgICAgICAgICAgICAgICAgICBDb3JlLm9wZW4oImh0dHBzOi8vangud2FuZGhpLmNvbT91PSIgKyB3aW5kb3cuYnRvYShjb2RlKSArICImdD14aHNpbWciKSkgOiBUb2FzdC5lcnJvcigiXHU5NTE5XHU4YmVmXHU3Njg0XHU2NTcwXHU2MzZlXHU3YzdiXHU1NzhiLFx1OGJmN1x1NTQxMVx1NGY1Y1x1ODAwNVx1NTNjZFx1OTk4OCgiICsgKG51bGwgPT0gbm90ZSA/IHZvaWQgMCA6IG5vdGUudHlwZSkgKyAiKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgVG9hc3Qud2FybmluZygiXHU4YmY3XHU1MTQ4XHU3NjdiXHU1ZjU1XHU1YzBmXHU3ZWEyXHU0ZTY2Iik7IGVsc2UgVG9hc3Qud2FybmluZygiXHU4YmY3XHU1MTQ4XHU5MDA5XHU2MmU5XHU0ZTAwXHU3YmM3XHU1MTg1XHU1YmI5Iik7CiAgICAgICAgfSwgWGhzU2VydmljZTsKICAgIH0oUGx1Z2luQmFzZSksIE9uZUtleVZpcEluamVjdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIE9uZUtleVZpcEluamVjdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3IEFycmF5LCB0aGlzLnBsdWdpbnMgPSBbIENvbnRhaW5lci5SZXF1aXJlKEFkQ2xlYXJTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoQ29udHJvbE1lbnVTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoSW1nVmlld1NlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShTZXR0aW5nU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKEF1dG9FeHBhbmRTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoQWxpeXVuUGFuVG9rZW4pLCBDb250YWluZXIuUmVxdWlyZShVcGRhdGVTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoQmlsaUltZ1NlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShCaWxpTW9iaWxlU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKE1vdmllU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKExpc3RTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoVGFvQmFvU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKEpkU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKE11c2ljU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKFhoc1NlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShHd2RTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoQ3NkbkFkU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKFdlbkt1U2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKExpbmtKdW1wU2VydmljZSksIENvbnRhaW5lci5SZXF1aXJlKFlvdXR1YmVTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoX0d3ZFNlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShTZWFyY2hTZXJ2aWNlKSwgQ29udGFpbmVyLlJlcXVpcmUoTmV0RGlza0RpcmVjdFNlcnZpY2UpLCBDb250YWluZXIuUmVxdWlyZShaaGlodVNlcnZpY2UpIF0sIAogICAgICAgICAgICBMb2dnZXIuaW5mbygiY29udGFpbmVyIGxvYWRlZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT25lS2V5VmlwSW5qZWN0aW9uLnByb3RvdHlwZS5Jbml0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5ldmVyeSgoZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQubGlua1Rlc3QoKSA/IChuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoMSk7CiAgICAgICAgICAgICAgICB9KSkudGhlbihlbGVtZW50LlByb2Nlc3MpLCBMb2dnZXIuZGVidWcoImVsZW1lbnQgWyIgKyBlbGVtZW50LmFwcE5hbWUoKSArICJdO3VuaXF1ZTpbIiArIGVsZW1lbnQudW5pcXVlKCkgKyAiXSIpLCAKICAgICAgICAgICAgICAgICFlbGVtZW50LnVuaXF1ZSgpKSA6IChMb2dnZXIuZGVidWcoImVsZW1lbnQgWyIgKyBlbGVtZW50LmFwcE5hbWUoKSArICJdO25vdCBwYXNzIiksIAogICAgICAgICAgICAgICAgITApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgT25lS2V5VmlwSW5qZWN0aW9uOwogICAgfSgpLCBMb2dnZXIubGV2ZWwgPSBMb2dMZXZlbC5pbmZvLCBDb250YWluZXIuUmVxdWlyZShPbmVLZXlWaXBJbmplY3Rpb24pLkluaXQoKTsKfSkpOwo=
Add Comment
Please, Sign In to add comment