PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEiPgo8dGl0bGU+RGFkaGJpcnIgRmluYW5jaWFsIOKAlCBkYXNoYm9hcmQ8L3RpdGxlPgo8c3R5bGU+Cjpyb290ey0tb3JhbmdlOiNGMjZEM0M7LS1pbms6I0M5NDcxQTstLWJsYWNrOiMwMDA7LS1zb2Z0OiMyRTJFMkU7LS1zbGF0ZTojNEE0QTRBOwogICAgICAtLWxpbmU6I2U2ZTZlNjstLW5hdnk6IzJBM0I2MTstLW1pc3Q6I2Y0ZjZmOTt9Cip7Ym94LXNpemluZzpib3JkZXItYm94O21hcmdpbjowO3BhZGRpbmc6MH0KYm9keXtmb250LWZhbWlseTpTb3JhLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjp2YXIoLS1zb2Z0KTtwYWRkaW5nOjI4cHggMjZweCA0MHB4fQouYnJhbmR7Zm9udC1mYW1pbHk6T3JiaXRyb24sQXJpYWwgQmxhY2ssQXJpYWw7Zm9udC13ZWlnaHQ6ODAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDZlbTtmb250LXNpemU6MjZweDtjb2xvcjp2YXIoLS1ibGFjayl9Ci5icmFuZCBzcGFue2NvbG9yOnZhcigtLWluayl9Ci5zdWJ7Y29sb3I6dmFyKC0tc2xhdGUpO2ZvbnQtc2l6ZToxM3B4O21hcmdpbi10b3A6NHB4fQoudG9vbGJhcntkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbjoxOHB4IDAgNnB4O2ZsZXgtd3JhcDp3cmFwfQoucGlsbHtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjEyLjVweDtmb250LXdlaWdodDo2MDB9Ci5waWxsLm9re2JhY2tncm91bmQ6dmFyKC0tb3JhbmdlKTtjb2xvcjojMDAwfQoucGlsbC5iYWR7YmFja2dyb3VuZDojZmRlY2VhO2NvbG9yOiNiMzI2MWV9Ci5idG57Ym9yZGVyLXJhZGl1czo5OTlweDtwYWRkaW5nOjhweCAxNnB4O2ZvbnQtc2l6ZToxM3B4O2JvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1ibGFjayk7YmFja2dyb3VuZDojZmZmO2NvbG9yOnZhcigtLWJsYWNrKTtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7Zm9udC1mYW1pbHk6aW5oZXJpdH0KLmJ0bi5wcmltYXJ5e2JhY2tncm91bmQ6dmFyKC0tb3JhbmdlKTtib3JkZXItY29sb3I6dmFyKC0tb3JhbmdlKTtjb2xvcjojMDAwfQouYnRuOmhvdmVye2ZpbHRlcjpicmlnaHRuZXNzKC45Nil9Ci5zZWd7ZGlzcGxheTppbmxpbmUtZmxleDtib3JkZXI6MS41cHggc29saWQgdmFyKC0tYmxhY2spO2JvcmRlci1yYWRpdXM6OTk5cHg7b3ZlcmZsb3c6aGlkZGVufQouc2VnIGJ1dHRvbntib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOiNmZmY7cGFkZGluZzo4cHggMTZweDtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo2MDA7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6dmFyKC0tc2xhdGUpO2ZvbnQtZmFtaWx5OmluaGVyaXR9Ci5zZWcgYnV0dG9uLm9ue2JhY2tncm91bmQ6dmFyKC0tYmxhY2spO2NvbG9yOiNmZmZ9Ci5maWx0ZXJzZWx7Ym9yZGVyOjEuNXB4IHNvbGlkIHZhcigtLWJsYWNrKTtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6OHB4IDE0cHg7Zm9udC1zaXplOjEzcHg7YmFja2dyb3VuZDojZmZmO2N1cnNvcjpwb2ludGVyO2ZvbnQtZmFtaWx5OmluaGVyaXR9Ci5jaGVja2xhe2ZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXNsYXRlKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHh9Ci5ncmlke2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZml0LG1pbm1heCgyMDBweCwxZnIpKTtnYXA6MTRweDttYXJnaW46MTRweCAwfQouY2FyZHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JvcmRlci1yYWRpdXM6MTJweDtwYWRkaW5nOjE2cHh9Ci5jYXJkIC5re2ZvbnQtc2l6ZToxMXB4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDhlbTtjb2xvcjp2YXIoLS1zbGF0ZSk7Zm9udC13ZWlnaHQ6NjAwfQouY2FyZCAudntmb250LWZhbWlseTpPcmJpdHJvbixBcmlhbCBCbGFjayxBcmlhbDtmb250LXNpemU6MjRweDtjb2xvcjp2YXIoLS1ibGFjayk7bWFyZ2luLXRvcDo2cHh9Ci5jYXJkIC52Lm9yYW5nZXtjb2xvcjp2YXIoLS1pbmspfQouY2FyZCAuZHtmb250LXNpemU6MTFweDttYXJnaW4tdG9wOjRweDtmb250LXdlaWdodDo2MDB9Ci5kLnVwe2NvbG9yOiMxYTdmMzd9LmQuZG93bntjb2xvcjojYzAzNzJifQouY2hhcnRncmlke2Rpc3BsYXk6Z3JpZDtnYXA6MTRweDttYXJnaW4tdG9wOjE0cHh9CmFydGdyb3Vwe2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTRweDtwb3NpdGlvbjpyZWxhdGl2ZX0KYXJ0Z3JvdXAgaDN7Zm9udC1zaXplOjE0cHg7Y29sb3I6IzAwMDttYXJnaW4tYm90dG9tOjJweH0KYXJ0Z3JvdXAgLnRpbntmb250LXNpemU6MTEuNXB4O2NvbG9yOnZhcigtLXNsYXRlKTttYXJnaW4tYm90dG9tOjZweH0KLmNvbC04e2dyaWQtY29sdW1uOnNwYW4gOH0gLmNvbC00e2dyaWQtY29sdW1uOnNwYW4gNH0gQG1lZGlhKG1heC13aWR0aDoxMDAwcHspey5jb2wtOCwuY29sLTR7Z3JpZC1jb2x1bW46c3BhbiAxMn19CiN0b29sdGlwe3Bvc2l0aW9uOmZpeGVkO3BvaW50ZXItZXZlbnRzOm5vbmU7YmFja2dyb3VuZDojMDAwO2NvbG9yOiNmZmY7Zm9udC1zaXplOjEycHg7cGFkZGluZzo4cHggMTFweDtib3JkZXItcmFkaXVzOjhweDtvcGFjaXR5OjA7dHJhbnNpdGlvbjoub3A7ei1pbmRleDo5OTttYXgtd2lkdGg6MjQwcHh9CiN0b29sdGlwLnNob3tvcGFjaXR5Oi45NX0KI3Rvb2x0aXAga2Jke2NvbG9yOiNmZmE3YzB9CnRhYmxle3dpZHRoOjEwMDU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZToxM3B4fQp0aHt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6dmFyKC0tc2xhdGUpO2ZvbnQtd2VpZ2h0OjYwMDtib3JkZXItYm90dG9tOjJweCBzb2xpZCB2YXIoLS1vcmFuZ2UpO3BhZGRpbmc6OHB4IDlweDt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXI7dXNlci1zZWxlY3Q6bm9uZX0KdGg6aG92ZXJ7Y29sb3I6IzAwMH0KdGggbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTRweDtjb2xvcjp2YXIoLS1pbmspfQp0ZHtwYWRkaW5nOjhweCA5cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTt3aGl0ZS1zcGFjZTpub3dyYXB9CnRyOmhvdmVye2JhY2tncm91bmQ6I2ZmZjZmMn0KdGQubnVtLHRoLm51bXt0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtc30KLnN0e2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Ci5zdGF0dXNsaW5le2ZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXNsYXRlKTttYXJnaW46MjRweCAwIDZweDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwfQpmb290ZXJ7bWFyZ2luLXRvcDozNHB4O2ZvbnQtc2l6ZToxMnB4O2NvbG9yOnZhcigtLXNsYXRlKTtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO3BhZGRpbmctdG9wOjEycHh9Ci5kZW1vYmFkZ2V7Zm9udC1zaXplOjEwcHg7YmFja2dyb3VuZDojZmZmM2UwO2NvbG9yOiM4YTZiMDA7Ym9yZGVyLXJhZGl1czo5OTlweDtwYWRkaW5nOjNweCA5cHg7bWFyZ2luLWxlZnQ6OHB4fQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGNsYXNzPSJicmFuZCI+REFESJJJUlIgRklOQU5DSUFMPHNwYW4gY2xhc3M9ImRlbW9iYWRnZSIgaWQ9ImRlbW9CYWRnZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+ZGVtbyBkYXRhPC9zcGFuPjwvZGl2Pgo8cCBjbGFzcz0ic3ViIiBpZD0ic3RhbXAiPmxvYWRpbmfigC4uPC9wPgoKPGRpdiBjbGFzcz0idG9vbGJhciI+CiAgPHNwYW4gY2xhc3M9InBpbGwgb2siIGlkPSJjb25uUGlsbCI+4pejIENvbm5lY3RlZDwvc3Bhbj4KICA8YnV0dG9uIGNsYXNzPSJidG4gcHJpbWFyeSIgb25jbGljaz0icmVmcmVzaCgpIj5SZWZyZXNoIG5vdzwvYnV0dG9uPgogIDxzcGFuIGNsYXNzPSJzZWciIGlkPSJyYW5nZVNlZyI+CiAgICA8YnV0dG9uIGRhdGEtci0zIG9uY2xpY2s9InNldFJhbmdlKDMpIj4zTTwvYnV0dG9uPgogICAgPGJ1dHRvbiBkYXRhLXI9NiBjbGFzcz0ib24iIG9uY2xpY2s9InNldFJhbmdlKDYpIj42TTwvYnV0dG9uPgogICAgPGJ1dHRvbiBkYXRhLXI9MTIgb25jbGljaz0ic2V0UmFuZ2UoMTIpIj4xMk08L2J1dHRvbj4KICAgIDxidXR0b24gZGF0YS1yPSI5OTkiIG9uY2xpY2s9InNldFJhbmdlKDk5OSkiPkFsbDwvYnV0dG9uPgogIDwvc3Bhbj4KICA8c2VsZWN0IGlkPSJ0eXBlRmlsdGVyIiBjbGFzcz0iZmlsdGVyc2VsIiBvbmNoYW5nZT0icmVuZGVyQWxsKCkiPgogICAgPG9wdGlvbiB2YWx1ZT0iIj5TYWxlcyArIEJpbGw8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9IkFDQ1JFIj5TYWxlcyBvbmx5PC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJBQ1BBWSI+QmlsbHMgb25seTwvb3B0aW9uPgogIDwvc2VsZWN0PgogIDxzZWxlY3QgaWQ9ImNvbnRhY3RGaWx0ZXIiIGNsYXNzPSJmaWx0ZXJzZWwiIG9uY2hhbmdlPSJyZW5kZXJBbGwoKSI+CiAgICA8b3B0aW9uIHZhbHVlPSIiPkFsbCBjb250YWN0PC9vcHRpb24+CiAgPC9zZWxlY3Q+CiAgPGxhYmVsIGNsYXNzPSJjaGVja2xheSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iaGlkZVBhaWQiIG9uY2hhbmdlPSJyZW5kZXJBbGwoKSI+IEhpZGUgZnVsbHktcGFpZDwvbGFiZWw+CjwvZGl2PgoKPGRpdiBpZD0ia3BpcyIgY2xhc3M9ImdyaWQiPjwvZGl2PgoKPGRpdiBjbGFzcz0iY2hhcnRncmlkIj4KICA8ZGl2IGNsYXNzPSJjb2wtOCI+PGFydGdyb3VwPjxoMz5DYXNoIGZsb3c8L2gzPjxkaXYgY2xhc3M9InRpbiI+TW9uZXkgaW4gdnMgaW52b2ljZWQgcGVyIG1vbnRoIMK3IGhvdmVyIGZvciBkZXRhaWw8L2Rpdj48c3ZnIGlkPSJjZkNocm9uZSIgd2lkdGg9IjEwMCUiIHZpZXdCb3g9IjAgMCA4NjAgMjQwIj48L3N2Zz48L2FydGdyb3VwPjwvZGl2PgogIDxkaXYgY2xhc3M9ImNvbC00Ij48YXJ0Z3JvdXA+PGgzPlJlY2VpdmFibGVzIGFnZWluZzwvaDM+PGRpdiBjbGFzcz0idGluIj5VbnBhaWQgc2FsZXMgaW52b2ljZXMgYnkgYWdlIGJ1Y2tldDwvZGl2PjxzdmcgaWQ9ImFnZUNocm9uZSIgd2lkdGg9IjEwMCUiIHZpZXdCb3g9IjAgMCA0MjAgMjQwIj48L3N2Zz48L2FydGdyb3VwPjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iY2hhcnRncmlkIj4KICA8ZGl2IGNsYXNzPSJjb2wtNCI+PGFydGdyb3VwPjxoMz5SZXZlbnVlIGJ5IGNvbnRhY3Q8L2gzPjxkaXYgY2xhc3M9InRpbiI+VG9wIGVhcm5lcnMgaW4gcmFuZ2U8L2Rpdj48c3ZnIGlkPSJyZXZDaHJvbmUiIHdpZHRoPSIxMDAlIiB2aWV3Qm94PSIwIDAgNDIwIDI0MCI+PC9zdmc+PC9hcnRncm91cD48L2Rpdj4KICA8ZGl2IGNsYXNzPSJjb2wtNCI+PGFydGdyb3VwPjxoMz5FeHBlbnNlIGJ5IGNvbnRhY3Q8L2gzPjxkaXYgY2xhc3M9InRpbiI+VG9wIHN1cHBsaWVycyBpbiByYW5nZTwvZGl2PjxzdmcgaWQ9ImV4cENocm9uZSIgd2lkdGg9IjEwMCUiIHZpZXdCb3g9IjAgMCA0MjAgMjQwIj48L3N2Zz48L2FydGdyb3VwPjwvZGl2PgogIDxkaXYgY2xhc3M9ImNvbC00Ij48YXJ0Z3JvdXA+PGgzPkludm9pY2Ugc3RhdHVzIG1peDwvaDM+PGRpdiBjbGFzcz0idGluIj5Db3VudCBvZiBpbnZvaWNlcyBieSBzdGF0dXM8L2Rpdj48c3ZnIGlkPSJzdENocm9uZSIgd2lkdGg9IjEwMCUiIHZpZXdCb3g9IjAgMCA0MjAgMjQwIj48L3N2Zz48L2FydGdyb3VwPjwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9InN0YXR1c2xpbmUiPjxzcGFuIGlkPSJ0YmxUaXRsZSI+SW52b2ljZXMgJmFtcDsgYmlsbHM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4Ij5zb3J0IHVzZSBjb2x1bW4gaGVhZGVycyB8IGNsaWNrID0gc29ydCwgYWdhaW4gPSByZXZlcnNlPC9zcGFuPjwvZGl2Pgo8dGFibGUgaWQ9ImludjRhYmxlIj48dGhlYWQ+PHRyPgo8dGggZGF0YS1rPSJudW1iZXIiPjxsaT48L2xpPk51bWJlcjwvdGg+PHRoIGRhdGEtaT0idHlwZSI+PGxpPjwvbGk+VHlwZTwvdGg+PHRoIGRhdGEtaz0iY29udGFjdCI+PGxpPjwvbGk+Q29udGFjdDwvdGg+PHRoIGRhdGEtaz0iZGF0ZSI+PGxpPjwvbGk+RGF0ZTwvdGg+PHRoIGNsYXNzPSJudW0iIGRhdGEtaz0idG90YWwiPjxsaT48L2xpPlRvdGFsPC90aD48dGggY2xhc3M9Im51bSIgZGF0YS1rPSJkdWUiPjxsaT48L2xpPkFtb3VudCBkdWU8L3RoPjx0aCBkYXRhLWs9ImFnZSI+PGxpPjwvbGk+QWdlPC90aD48dGggZGF0YS1rPSJzdGF0dXMiPjxsaT48L2xpPlN0YXR1czwvdGg+CjwvdHI+PC90aGVhZD48dGJvZHkgaWQ9ImludkJvZHkiPjwvdGJvZHk+PC90YWJsZT4KCjxkaXYgY2xhc3M9InN0YXR1c2xpbmUiPjxzcGFuPldlZWx5IGJhbmsgZmxvdyB0cmVuZDwvc3Bhbj48L2Rpdj4KPHN2ZyBpZD0iYmZDaHJvbmUiIHdpZHRoPSIxMDAlIiB2aWV3Qm94PSIwIDAgMTI4MCAxNjAiPjwvc3ZnPgoKPGZvb3Rlcj5UYWxoaW5nIEZpbmFuY2lhbCDCtyBpbnRlcm5hbCB1c2Ugb25seSDCtyBkZW1vIGRhdGE8L2Zvb3Rlcj4KPGRpdiBpZD0idG9vbHRpcCI+PC9kaXY+CjxzY3JpcHQ+CmNvbnN0IE9SQ09MPSciRjI2RDNDOyBjb25zdCBJTks9I0M5NDcxQTsiOwpjb25zdCBOQVZZPSciMkEzQjYxOyBjb25zdCBNSVNUOSciZjRmNmY5OyBjb25zdCBTTEFURT0jNEE0QTRBOyBjb25zdCBCTEFDSz0nIzAwMDonOwpjb25zdCBNT05TPScKYXIsIEZlYiwgTWFyLCBBcHIsIE1heSwgSnVuZSwgSnVsLCBBdWcsIFNlcSwgT2N0LCBOb3YsIERlYycuc3BsaXQoJywnKTsKCmZ1bmN0aW9uIGlzbyhkKXtyZXR1cm4gZC50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApO30KZnVuY3Rpb24gbXQodikgY2hhcnRzIHJldHVybiB2PjFlNiA/ICckJysodikvMWU2KS50b0ZpeGVkKDEpKydNJyA6ICckJytNYXRoLnJvdW5kKHYvMWUzKSsnayc7CgpmdW5jdGlvbiBkZW1vRGF0YSgpewogIGNvbnN0IGNvbnRhY3RzID0gW1siVGFsaGluIEhvbGRpbmdzIiwiQUNDUkUiXSxbIktleXN0b25lIEFkZWxhaWRlIiwiQUNDUkUiXSxbIlRJUCBHcm91cCIsIkFDQ1JFI10sCiAgICBbIkNsaW1lIFB0eSBMdGQiLCJBQ0NSRSJdLFsiQWRtaW4gQXV0b3BpbG90IiwiQUNDUkUiXSxbIlNwYXJtYW5payBGYXJtIiwiQUNDUkUiXSwKICAgIFsiQ2hpbGxpIEF2ZW51ZSIsIkFDQ1JFI10sWyJIb3cncyBZYyBUYWNrbGUiLCJBQ0NSRSJdXTsKICBjb25zdCBzdXBwbGllcnMgPSBbWyJBV1MgQXNpYSBQYWNpZmljIiwiQUNDUEFZIl0sWyJNZXJpZGlhbiBMZWdhbCIsIkFDQ1BBWSJdLFsiVGVsc3RyYSIsIkFDQ1BBWSJdLAogICAgWyJPZmZpY2UgV29ya3MiLCJBQ0NQQUkiXSxbIlN1cGVyaW9yIFBheXJvbGwiLCJBQ0NQQUkiXSxbIkFUTyIsIkFDQ1BBWSJdLFsiQWRlbGFpZGUgUG93ZXIiLCJBQ0NQQUkiXV07CiAgbGV0IHNlZWQgPSA0MjsgY29uc3Qgcm5kID0gKCkgPT4gKHNlZWQgPSAoc2VlZCoxMTAzNTE1MjQ1KzEyMzQ1KSAlIDIxNDc0ODM2NDgpIC8gMjE0NzQ4MzY0ODsKICBjb25zdCBpbnZvaWNlcyA9IFtdOyBsZXQgbiA9IDIwMDsKICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogIGZvciAobGV0IG0gPSAxNzsgbSA+PSAwOyBtLS0pIHsKICAgIGNvbnN0IGNudCA9IDYgKyBNYXRoLmZsb29yKHJuZCgpKjc7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CiAgICAgIGNvbnN0IFtjbmFtZSwgY3R5cGVdID0gcm5kKCkgPCAuNTUgPyBjb250YWN0c1tNYXRoLmZsb29yKHJuZCgpKmNvbnRhY3RzLmxlbmd0aCldIDogc3VwcGxpZXJzW01hdGguZmxvb3Iocm5kKCkqc3VwcGxpZXJzLmxlbmd0aCldOwogICAgICBjb25zdCBkYXkgPSAxICsgTWF0aC5mbG9vcihybmQoKSoyNyk7CiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCktbSwgZGF5KTsKICAgICAgY29uc3QgdG90YWwgPSBNYXRoLnJvdW5kKCg0MDAgKyBybmQoKSo0ODAwMCkqMTAwKS8xMDA7CiAgICAgIGNvbnN0IHIgPSBybmQoKTsKICAgICAgbGV0IHN0YXR1cyA9IHIgPCAuNzAgPyAiQVVUSE9SSVpFRCIgOiByIDwgLjgyID8gIlBBSUQiIDogciA8IC45MiA/ICJEUkFGVCIgOiByIDwgLjk3ID8gIlNVQk1JVFRFRCIgOiAiVk9JREVEIjsKICAgICAgbGV0IGR1ZSA9IHN0YXR1cyA9PT0gIlBBSUQiID8gMCA6IChzdGF0dXMgPT09ICJBVVRIT1JJWkVEIiA/IChybmQoKSA8IC4zNSA/IE1hdGgucm91bmQodG90YWwoMStybmQoKSkvMioxMDApLzEwMCA6IHRvdGFsKSA6IHRvdGFsKTsKICAgICAgaW52b2ljZXMucHVzaCh7bnVtYmVyOihjdHlwZT09PSJBQ0NSRSI/IklOVi0iOiJCSUxMLSIpK1N0cmluZyhuKysucGFkU3RhcnQoNCwiMCIpLAogICAgICAgIHR5cGU6Y3R5cGUsIGNvbnRhY3Q6Y25hbWUsIGRhdGU6aXNvKGRhdGUpLCB0b3RhbCwgZHVlLCBzdGF0dXN9KTsKICAgIH0KICB9CiAgY29uc3QgYmFuayA9IFtdOyBsZXQgYm4gPSAxMDAwOwogIGZvciAobGV0IG0gPSAxNzsgbSA+PSAwOyBtLS0pIHsKICAgIGNvbnN0IGNudCA9IDggKyBNYXRoLmZsb29yKHJuZCgpKTg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CiAgICAgIGNvbnN0IGlzSW4gPSBybmQoKSA8IC41NTsKICAgICAgY29uc3QgY29uc3QgY25hbWUgPSBpc0luID8gY29udGFjdHNbTWF0aC5mbG9vcihybmQoKSpjb250YWN0cy5sZW5ndGgpXVswXSA6IHN1cHBsaWVyc1tNYXRoLmZsb29yKHJuZCgpKnN1cHBsaWVycy5sZW5ndGgpXVswXTsKICAgICAgY29uc3QgZGF5ID0gMSArIE1hdGguZmxvb3Iocm5kKCkqMjcpOwogICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLW0sIGRheSk7CiAgICAgIGNvbnN0IHRvdGFsID0gTWF0aC5yb3VuZCgoMzAwICsgcm5kKCkqNDAwMDApKjEwMCkvMTAwOwogICAgICBiYW5rLnB1c2goe251bWJlcjoiQlQtIisoYm4rKyksc3RhdHVzOiJBVVRIT1JJWkVEIixjb250YWN0OmNuYW1lLHR5cGU6aXNJbj8iUkVDRUlWRSI6IlNFTkQiLGRhdGU6aXNvKGRhdGUpLHRvdGFsfSk7CiAgICB9CiAgfQogIHJldHVybiB7aW52b2ljZXMsIGJhbmt9Owp9CgpmdW5jdGlvbiBsb2FkRGVtb0RhdGEoKXsKICBjb25zdCBkID0gZGVtb0RhdGEoKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVtb0JhZGdlIikuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFtcCIpLnRleHRDb250ZW50ID0gIkRlbW8gZGF0YSBsb2FkZWQgIiArIG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoImVuLUFVIiwge2RhdGVTdHlsZToic2hvcnQiLCB0aW1lU3R5bGU6InNob3J0In0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25uUGlsbCIpLmNsYXNzTmFtZSA9ICJwaWxsIG9rIjsKICByZXR1cm4gZDsKfQoKbGV0IERBVEEgPSBudWxsOwoKZnVuY3Rpb24gZmlsdGVyZWQoKXsKICBjb25zdCB0eXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInR5cGVGaWx0ZXIiKS52YWx1ZTsKICBjb25zdCBjb250YWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhY3RGaWx0ZXIiKS52YWx1ZTsKICBjb25zdCBoaWRlUGFpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoaWRlUGFpZCIpLmNoZWNrZWQ7CiAgY29uc3QgcmFuZ2UgPSArZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnNlZyAub24iKS5nZXRBdHRyaWJ1dGUoImRhdGEtcnIpOwogIGNvbnN0IGN1dCA9IG5ldyBEYXRlKCk7IGN1dC5zZXRNb250aChjdXQuZ2V0TW9udGgoKS1yYW5nZSk7CiAgbGV0IHJvdyA9IERBVEEuaW52b2ljZXMuZmlsdGVyKGkgPT4gewogICAgaWYgKHR5cGUgJiYgaS50eXBlICE9PSB0eXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoY29udGFjdCAmJiBpLmNvbnRhY3QgIT09IGNvbnRhY3QpIHJldHVybiBmYWxzZTsKICAgIGlmIChoaWRlUGFpZCAmJiBpLmR1ZSA8PSAwKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gbmV3IERhdGUoaS5kYXRlKSA+PSBjdXQ7CiAgfSk7CiAgcmV0dXJuIHtyb3csIGN1dH07Cn0KCmZ1bmN0aW9uIHJlbmRlckFsbCgpewogIGNvbnN0IHtyb3csIGN1dH0gPSBmaWx0ZXJlZCgpOwogIGNvbnN0IGJhbmsgPSBEQVRBLmJhbmsuZmlsdGVyKGIgPT4gbmV3IERhdGUoYi5kYXRlKSA+PSBjdXQpOwogIGNvbnN0IGFyID0gcm93LnJlZHVjZSgocyxzKT0+cyArIChpLnR5cGU9PT0iQUNDUkUiJiZpLnN0YXR1cz09PSJBVVRIT1JJWkVEIj9pLmR1ZTowKSwgMCk7CiAgY29uc3QgYXAgPSByb3cucmVkdWNlKChzLGkpPT4gcyArIChpLnR5cGU9PT0iQUNDUEFZIiYmaS5zdGF0dXM9PT0iQVVUSE9SSVpFRCI/aS5kdWU6MCksIDApOwogIGNvbnN0IGludm9pY2VkID0gcm93LmZpbHRlcihpPT5pLnR5cGU9PT0iQUNDUkUiJiYoaS5zdGF0dXM9PT0iQVVUSE9SSVpFRCIoaS5zdGF0dXM9PT0iUEFJRCIpKS5yZWR1Y2UoKHMsayk9PnMraS50b3RhbCwwKTsKICBjb25zdCBjb2xsZWN0ZWQgPSBiYW5rLmZpbHRlcihiPT5iLnR5cGU9PT0iUkVDRUlWRSIpLnJlZHVjZSgocyxiKT0+cytiLnRvdGFsLDApOwogIGNvbnN0IGF3YWl0aW5nID0gcm93LmZpbHRlcihpPT5pLnN0YXR1cz09PSJBVVRIT1JJWkVEImkmJi5kdWU+MCkubGVuZ3RoOwogIGNvbnN0IHBhaWQgPSByb3cuZmlsdGVyKGk9Pmkuc3RhdHVzPT09IlBBSUQiKS5sZW5ndGg7CiAgY29uc3QgZHJhZnRzID0gcm93LmZpbHRlcihpPT5pLnN0YXR1cz09PSJEUkFGVCIoaS5zdGF0dXM9PT0iU1VCTUlUVEVEIikubGVuZ3RoOwogIGNvbnN0IGNvbnRhY3RzID0gbmV3IFNldChyb3cubWFwKGk9PmkuY29udGFjdCkpLnNpemU7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImtwaXMiKS5pbm5lckhUTUwgPSBbCiAgICBbIkFjY291bnRzIHJlY2VpdmFibGUiLG1vbmV5KGFyKSwxXSxbIkFjY291bnRzIHBheGFibGUiLG1vbmV5KGFwKSwwXSwKICAgIFsiSW52b2ljZWQiLG1vbmV5KGludm9pY2VkKSwwXSxbIkNvbGxlY3RlZCIsbW9uZXkoY29sbGVjdGVkKSwxXSwKICAgIFsiQXdhaXRpbmcgcGF5bWVudCIsYXdhaXRpbmcsMF0sWyJQYWlkIiwicGFpZCIsMF0sCiAgICBbIkRyYWZ0cy9TdWJtaXR0ZWQiLGRyYWZ0cywwXSxbIkNvbnRhY3RzIixjb250YWN0cywwXV0KICAuY2xhc3NMaXN0KCk7Cn0KCmZ1bmN0aW9uIG1vbmV5KHYpe3JldHVybiAnJCcrTWF0aC5yb3VuZCh2KSA/IE1hdGgucm91bmQodikudG9Mb2NhbGVTdHJpbmcoImVuLUFVIikgOiB2LnRvRml4ZWQoMik7fQoKZnVuY3Rpb24gYnVpbGRDaGFydHMoKXsKICBjb25zdCB7cm93fSA9IGZpbHRlcmVkKCk7CiAgLy8gLS0gY2FzaCBmbG93IGdyb3VwZWQgYmFycyAtLQogIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsgZm9yIChjb25zdCBpIG9mIHJvdykgewogICAgY29uc3QgayA9IGkuZGF0ZS5zbGljZSgwLDcpOyBpZighbWFwLmhhcyhrKSkgbWFwLnNldChrLCB7aW46MCxvdXQ6MH0pOwogICAgbWFwLmdldChrKVtpLnR5cGU9PT0iQUNDUkUiPyJpbiI6Im91dCJdICs9IGkudG90YWw7CiAgfQogIGNvbnN0IG1vbnRocyA9IFsuLi5tYXAua2V5c10uc29ydCgpOwogIGNvbnN0IFdIZWlnaHQ9MjQwLCBIVD0yMDA7CiAgbGV0IHN2ZyA9ICcnOwogIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLm1vbnRocy5tYXAoaz0+TWF0aC5tYXgobWFwLmdldChrKS5pbiwgbWFwLmdldChrKS5vdXQpKSwgMSk7CiAgbW9udGhzLmZvckVhY2goKGsspPT4gewogICAgY29uc3QgYmFzZSA9IEhUOyBjb25zdCB3ID0gODYwL21vbnRocy5sZW5ndGg7CiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgWyJpbiIsIm91dCJdKSB7CiAgICAgIGNvbnN0IHYgPSBtYXAuZ2V0KGspW3BhcnRdOwogICAgICBjb25zdCBoID0gTWF0aC5tYXgoMiwgdi9tYXggKiBIVCk7CiAgICAgIGNvbnN0IHggPSB4ID8gd2lkZSAqIDYgKyA0ICsgcGFydD09PSJpbiI/MDp3aWRlKzYgOiB4KzA7CiAgICAgIHN2ZyArPSBgPHJlY3QgeD0iJHt4fSIgeT0iJHtiYXNlLWh9IiB3aWR0aD0iJHt3aWRlLTF9IiBoZWlnaHQ9IiR7aH0iIGZpbGw9IiR7cGFydD09PSJpbiI/T1JDT0w6TkFWWX0iIG9wYWNpdHk9IjEiLz5gOwogICAgfQogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjZkNocm9uZSIpLmlubmVySFRNTCA9IHN2ZzsKCiAgLy8gYWdpbmcgZG9udXQKICBjb25zdCBidWNrID0gWyJDdXJyZW50IiwiMS0zMGRheXMiLCIzMS02MGRheXMiLCI2MS05MGRheXMiLCI5MCtkYXlzIl07CiAgY29uc3QgYmdyciA9IG5ldyBBcnJheSg1KS5maWxsKDApOwogIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTsKICBmb3IgKGNvbnN0IGkgb2Ygcm93KSB7CiAgICBpZiAoaS50eXBlICE9PSAiQUNDUkUiIHx8IGkuc3RhdHVzICE9PSAiQVVUSE9SSVpFRCIgfHwgaS5kdWUgPD0gMCkgY29udGludWU7CiAgICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcigodG9kYXkgLSBuZXcgRGF0ZShpLmRhdGUpKSAvIDg2NGU1KTsKICAgIGNvbnN0IGJpID0gZGF5cyA8PSAwID8gMCA6IGRheXMgPD0gMzAgPyAxIDogZGF5cyA8PSA2MCA/IDIgOiBkYXlzIDw9IDkwID8gMyA6IDQ7CiAgICBiZ3JzW2JpXSArPSBpLmR1ZTsKICB9CiAgY29uc3QgdG90ID0gYmdycy5yZWR1Y2UoYSxiKT0+YStiLDApOwogIGRvbnV0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZ2VDaHJvbmUiKSwgYmdycywgWy9SQ09MLCIjRDlFOUM3IixJTks7LCIjOEE1QjMiLCJOQVZZXSwgWyJDdXJyZW50IiwiMS0zMGRheXMiLCIzMS02MGRheXMiLCI2MS05MGRheXMiLCI5MCtkYXlzIl0sICJSZWNlaXZhYmxlcyIsIG1vbmV5KGFyKSk7CgogIC8vIHJldmVudWUgYnkgY29udGFjdCAvIHN0YXR1cwogIGNvbnN0IHJldiA9IHt9LCBleHAgPSB7fSwgc3RhdCA9IHt9OwogIGZvciAoY29uc3QgaSBvZiByb3cpewogICAgaWYgKGkudHlwZT09PSJBQ0NSRSIpIHtyZXZbaS5jb250YWN0XT0ocmV2W2kuY29udGFjdF18fDApK2kudG90YWw7fSBlbHNlIHtleHBbaS5jb250YWN0XT0oZXhwW2kuY29udGFjdF18fDApK2kudG90YWw7fQogICAgc3RhdFtpLnN0YXR1c109KHN0YXRbaS5zdGF0dXNdfHwwKSsxOwogIH0KICBiYXJjaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmV2Q2hyb25lIiksIE9iamVjdC5lbnRyaWVzKHJldikuc29ydCgoYSxiKT0+YlsxXS1hWzFdKS5zbGljZSg2KSwgT1JDT0wpOwogIGJhcmNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJleHBDaHJvbmUiKSwgT2JqZWN0LmVudHJpZXMoZXhwKS5zb3J0KChhLGI9PmJbMV0oYVsxXSkuc2xpY2UoNiksIE5BVlkpOwoKICBkb251dChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RDaHJvbmUiKSwgT2JqZWN0LnZhbHVlcyhzdGF0KSwgW19SQ09MLE5BVlkiLCIjOEE1QjMiLCIjRDlFOUM3IiwiIzhiOGI4YiJdLCBPYmplY3Qua2V5cyhzdGF0KSwgIkludm9pY2VzIiwgcm93Lmxlbmd0aCk7Cn0KCmZ1bmN0aW9uIGRvbnV0KHN2ZywgdmFsdWVzLCBjb2xvcnMsIGxhYmVsc0MsIGNlbnRlckxhYmVsKXsKICBpZighdmFsdWVzLmxlbmd0aCkgcmV0dXJuOwogIGNvbnN0IHRvdCA9IHZhbHVlcy5yZWR1Y2UoKGEsYik9P2ErYiwwKSB8fCAxOwogIGNvbnN0IGN4PTIxMCwgY3k9MTA1LCBSPTk1LCByPTU3OwogIGxldCBhMD0tTWF0aC5QSS8yOyBsZXQgb3V0PScnOwogIHZhbHVlcy5mb3JFYWNoKCh2LGkpPT4gewogICAgY29uc3QgYTEgPSBhMCArICh2L3RvdCkgKiAyICogTWF0aC5QSTsKICAgIGNvbnN0IGxhcmdlID0gKGExLWEwKSA+IE1hdGguUEkgPyAxIDogMDsKICAgIGNvbnN0IFt4MiwkeTIsIHgzLHkzXSA9IFtjeCtSKk1hdGguY29zKGEwKSwgY3krUipNYXRoLnNpbihhMCksIGN4K1IqTWF0aC5jb3MoYTEpLCBjeStSKk1hdGguc2luKGExKV07CiAgICBjb25zdCBbeDQseTRdID0gW2N4K3IqTWF0aC5jb3MoYTEpLCBjeStyKk1hdGguc2luKGExKV07CiAgICBvdXQgKz0gYDxwYXRoIGQ9Ik0ke3gyfSwke3kyfSBBICR7Un0sJHtSfSAwICR7bGFyZ2V9IDEgJHt4M30sJHt5M30gTCAke3g0fSwke3k0fSBBICR7cn0sJHtyfSAwICR7bGFyZ2V9IDAgJHt4Mn0sJHt5Mn0gWiIgZmlsbD0iJHtjb2xvcnNbaSU1XX0iPjx0aXRsZT4ke2xhYmVsc0NbaV18fCcnfTogJHtNYXRoLnJvdW5kKHYvdG90KjEwMCklfSAoJHt2LnRvTG9jYWxlU3RyaW5nKCl9KTwvdGl0bGU+PC9wYXRoPmA7CiAgICBhMCA9IGExOwogIH0pOwogIG91dCArPSBgPHRleHQgeD0iJHtjeH0iIHk9IiR7Y3ktNn0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJPcmJpdHJvbixBcmlhbCBCbGFjayIgZm9udC1zaXplPSIxOCIgZmlsbD0iIzAwMCI+JHtjZW50ZXJMYWJlbH08L3RleHQ+YDsKICBvdXQgKz0gYDx0ZXh0IHg9IiR7Y3h9IiB5PSIke2N5KzE0fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzRBNEE0QSI+JHtsYWJlbHNDLmxlbmd0aH0gZ3JvdXBzPC90ZXh0PmA7CiAgLy8gbGVnZW5kCiAgbGF0YWJlbHNDLnNsaWNlKDAsNSkuZm9yRWFjaCgobCxpKT0+ewogICAgb3V0ICs9IGA8cmVjdCB4PSIxNiIgeT0iJHsxOTAsaT8xMn0iIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iJHtjb2xvcnNbaSU1XX0iLz48dGV4dCB4PSIzMiIgeT0iJHsxOTUsK2kqMTJ9IiBmb250LXNpemU9IjEwIiBmaWxsPSIjNEE0QTRBIj4ke2x9PC90ZXh0PmA7CiAgfSk7CiAgc3ZnLmlubmVySFRNTCA9IG91dDsKfQoKZnVuY3Rpb24gYmFyY2hhcnQoc3ZnLCBlbnRyaWVzLCBjb2xvcil7CiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4uZW50cmllcy5tYXAoZT0+ZVsxXSkpIHx8IDE7CiAgbGV0IHkgPSAxNCwgb3V0ID0gJyc7CiAgY29uc3QgaCA9IE1hdGgubWluKDMwLCAoMjIwIC0gZW50cmllcy5sZW5ndGgpIC8gZW50cmllcy5sZW5ndGgpOwogIGZvciAoY29uc3QgW2xhYiwgdl0gb2YgZW50cmllcykgewogICAgY29uc3QgdyA9IE1hdGgubWF4KDQsICh2L21heCkgKiAzMTApOwogICAgb3V0ICs9IGA8cmVjdCB4PSI4IiB5PSIke3l9IiB3aWR0aD0iNDE0IiBoZWlnaHQ9IiR7aH0iIGZpbGw9IiNmNGY2ZjkiIGZpbHRlcj0idXJsKCNub25lKSIgcng9IjYiLz5gOwogICAgb3V0ICs9IGA8cmVjdCB4PSI4IiB5PSIke3l9IiB3aWR0aD0iJHt3Kzh9IiBoZWlnaHQ9IiR7aH0iIGZpbGw9IiR7Y29sb3J9IiByeD0iNiI+PHRpdGxlPiR7bGFifTogJHtNb25leSh2KX08L3RpdGxlPjwvcmVjdD5gOwogICAgb3V0ICs9IGA8dGV4dCB4PSIxNiIgeT0iJHt5K2gvMis0fSIgZm9udC1zaXplPSIxMSIgZmlsbD0id2hpdGUiPjwvdGV4dD5gOwogICAgb3V0ICs9IGA8dGV4dCB4PSIxNCIgeT0iJHt5K2gvMis0fSIgZm9udC1zaXplPSIxMSIgZmlsbD0id2hpdGUiPjx0c3Bhbj4ke2xhYi5sZW5ndGg+MTY/bGFiLnNsaWNlKDAsMTYpK+KApjpsYWJ9PC90c3Bhbj48L3RleHQ+YDsKICAgIG91dCArPSBgPHRleHQgeD0iNDA2IiB5PSIke3kraC8yKzR9IiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNEE0QTRBIj4ke21vbmV5KHYpfTwvdGV4dD5gOwogICAgeSArPSBoICsgNDsKICB9CiAgc3ZnLmlubmVySFRNTCA9IG91dDsKfQoKLy8gLS0tLS0gdGFibGUgLS0tLS0KbGV0IHNvcnRLID0gImRhdGUiLCBzb3J0RGlyID0gLTE7CmZ1bmN0aW9uIHRibCgpewogIGNvbnN0IHtyb3d9ID0gZmlsdGVyZWQoKTsKICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7CiAgbGV0IHJvd3MgPSByb3cubWFwKGk9Pih7Li4uaSwgYWdlOiBNYXRoLm1heCgwLCBNYXRoLmZsb29yKCh0b2RheS0gbmV3IERhdGUoaS5kYXRlKSkgLyA4NjRlNSkpfSk7CiAgcm93cy5zb3J0KChhLGI9PnsKICAgIGNvbnN0IHYxPWFbc29ydEtdLCB2Mj1iW3NvcnRLXTsKICAgIGNvbnN0IHIgPSAodHlwZW9mIHYxID09PSBudW1iZXIgPyB2MS12MiA6IFN0cmluZyh2MSkubG9jYWxlQ29tcGFyZShTdHJpbmcoMikpKSk7CiAgICByZXR1cm4gciAqIHNvcnREaXJsOwogIH0pOwogIGNvbnN0IHRvcCA9IHJvd3Muc2xpY2UoMCwzMCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImludkJvZHkiKS5pbm5lckhUTUwgPSB0b3AubWFwKGk9PmA8dHI+CiAgICA8dGQ+JHtpLm51bWJlcn08L3RkPjx0ZD4ke2kudHlwZT09PSJBQ0NSRSI/U2FsZXMiOiJCaWxsIn08L3RkPjx0ZD4ke2kuY29udGFjdH08L3RkPjx0ZD48ZGF0ZSBzdHlsZT0iY29sb3I6IzRBNEE0QSI+JHtpLmRhdGV9PC9kYXRlPjwvdGQ+CiAgICA8dGQgY2xhc3M9Im51bSI+JHttb25leShpLnRvdGFsKX08L3RkPjx0ZCBjbGFzcz0ibnVtIj4ke21vbmV5KGkuZHVlKX08L3RkPgogICAgPHRkPiR7aS5kdWU+MD9pLmFnZSsnZCc6IuKAln08L3RkPjx0ZCBjbGFzcz0ic3RhdHVzIj4ke2kuc3RhdHVzfTwvdGQ+PC90cj5gKS5qb2luKCIiKTsKICAvLyBoZWFkZXJzCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgidGhlYWQgdGgiKS5mb3JFYWNoKGg9PnsKICAgIGNvbnN0IGsgPSBoLmdldEF0dHJpYnV0ZCgiZGF0YS1rIik7CiAgICBoLm9uY2xpY2sgPSAoKSA9PiB7IGlmIChrPT09c29ydEspIHNvcnREaXJsICo9IC0xOyBlbHNlIHtzb3J0Sz1rOyBzb3J0RGlyPTE7fSB0YmwoKTsgfTsKICAgIGNvbnN0IGxpID0gaC5xdWVyeVNlbGVjdG9yKCJsaSIpOwogICAgaWYgKGxpKSBsaS50ZXh0Q29udGVudCA9IGsgPT09IHNvcnRLID8gKHNvcnREaXJsPjA/IuKAoSI6IuKAgSIpOiAiIjsKICB9KTsKfQoKZnVuY3Rpb24gcmVmcmVzaCgpewogIC8vIHJlLXJlbmRlciBmcm9tIGN1cnJlbnQgREFUQSBpbiBkZW1vIG1vZGU7IGxpdmUgbW9kZSByZWZldGNoZXMgdmlhIC9hcGkvZGF0YQogIGNvbnN0IHN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhlbi1BVSIsIHtkYXRlU3R5bGU6InNob3J0IiwgdGltZVN0eWxlOiJzaG9ydCJ9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhbXAiKS50ZXh0Q29udGVudCA9ICJEZW1vIGRhdGEgcmVmcmVzaGVkICIgKyBzdGFtcDsKICByZW5kZXJBbGwoKTsgdGJsKCk7IGJ1aWxkQ2hhcnRzKCk7CiAgYnVpbGRDb250YWN0RmlsdGVyKCk7Cn0KZnVuY3Rpb24gYnVpbGRDb250YWN0RmlsdGVyKCl7CiAgY29uc3QgY3VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhY3RGaWx0ZXIiKSAKICBjb25zdCBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhY3RGaWx0ZXIiKTsKICBjb25zdCBrZWVwID0gcy52YWx1ZTsKICBzLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSIiPkFsbCBjb250YWN0PC9vcHRpb24+JyArCiAgICAuLi5uZXcgU2V0KERBVEEuaW52b2ljZXMubWFwKGk9PmkuY29udGFjdCkpLnNvcnQoKS5tYXAoYz0+YDxvcHRpb24+JHtjfTwvb3B0aW9uPmApOwogIHMuVmFsdWUgPSBrZWVwOwp9CmZ1bmN0aW9uIHNldFJhbmdlKHIpewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5zZWcgYnV0dG9uIikuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC50b2dnbGUoIm9uIiwgK2IuZ2V0QXR0cmlidXRlKGRhdGEtcik9PT1yKSk7CiAgdGJsKCk7IGJ1aWxkQ2hhcnRzKCk7CiAgY29uc3QgcmFuZ2UgPSByOyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGJsVGl0bGUiKS5pbm5lckhUTUwgPSBgSW52b2ljZXMgJmFtcDsgYmlsbHMg4oCUIDxzdHJvbmc+JHtyb3cubGVuZ3RofTwvc3Ryb25nPiBpbiB2aWV3YDsKfQoKZnVuY3Rpb24gYm9vdCgpewogIERBVEEgPSBsb2FkRGVtb0RhdGEoKTsKICBidWlsZENvbnRhY3RGaWx0ZXIoKTsgcmVuZZXJBbGwoKTsgdGJsKCk7IGJ1aWxkQ2hhcnRzKCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YW1wIikudGV4dENvbnRlbnQgPSAiRGVtbyBkYXRhIC0gIiArIERBVEEuaW52b2ljZXMubGVuZ3RoICsgIiBpbnZvaWNlcywgIiArIERBVEEuYmFuay5sZW5ndGggKyAiIGJhbmsgdHJhbnNhY3Rpb25zIjsKfQpib290KCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K