X0RIXwAAA0oAAAema+SvAI93zoscvTQiWfecPMCKxZOcZw1amV03m63fJzlilDPyqcqqLVojPzFKcqLWlZxQ0TQrBxw+gDi1/BfwphsGhUzkZIO3vmXMpWNZWePLCjiF6LlRfXAdiRikTrVJ0jbZxwX5LqsV+dmXsCt9fpzGGtuFMKdGa/22pEOyLJosLIFiWVoRuUMtdmtSEjQtelWPTgGBZg00bNrqgH1c5s7z6fsIgBl7EZ52sYiZWtAosrO8ZoOD5zJ9+tnXwzhS0cCwPZB4bs6X6mR2ejG1xyc7qbBO0DX2obEibf3M8MBnZom2Wa3rBh0mrgfLxCUskZmvUxlsR45f/ts2MQpBn7C1suEtaOsJqjRUBrrmumnAWuTZhcI5KUR0Ii2xwOs1um79Oq1ISIDfEkhL5g2Eod1tFwoYm/SMBaG6T6+JyItzq/BsGUwhSnMoD+yFhlPA4D71m5JsNrScl7S6as1XkaK0/bY8nVKKu+0pjnU67EqNn6DGRfx2XNMkdoV44ZeXCJAxngnIhFNCLQR/53TSaBpvpznzSJkMYK95zVWRVEAXt/g0Ed9SmLzyVLSIzCSs9qcohQakNEoH42ve7yuz2Vaj6LQ8xjcM/rnLi0sxB7+gWscZcj2GfAbeBtfkqKJRlX+Ca0fai0QxjwAPqgipBfHAmgUVDAumYtLLOrsAztSIwSIV7VAlFQfcvmTckrB7/QNKuzDRa29SROiUqhqlMnZZkkYywM8rCm0T+QDfX3wGb9+MK+oAEYvYCHV0E6YDPe6vluCsVz+3jBjg9aQ89k6+sH/e3iwcIC08+No/Ngufe+jW5/NOGE/Wml17OM4gkl8q4TX6PzqfrnC4ybKlCI0Z1qst9deWx0jEVhgfP6ZYvpLDoBxgz6I2DrGmFfEQTVjImv2eGkJ1KexUGX/+gcgkUNUXnPKGMgsuTYXxcrvlPv5Mhg8ex/ZidGrAUjRl4Sa+4XmKI/YLgG1gfEN9kweiUVw5oAsd7Z+Z61uZVbHBgnwIi6Ag24Ru/bQ20pPzNLPmP4O6W1KLwJsC017z7iKvdGXbQ0POgLfbWlff8WEcxLdkFtg8uPfC8W34cxIGYdDPnyNz7ELfPSTwJg4sSHc8p88QfJ1+PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9ImllPWVkZ2UiPgogICAgPG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wJy8+CgogICAgCjxsaW5rIGhyZWY9Ii9jc3MvY29tbW9uLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KPGxpbmsgaHJlZj0iL2Nzcy9yZWdpcy5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CjxsaW5rIGhyZWY9Ii9jc3MvZGlhbG9nLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KPHNjcmlwdCBzcmM9Ii9qcy9tRGlhbG9nTWluLmpzIj48L3NjcmlwdD4KICAKPC9oZWFkPgo8Ym9keT4KICAgPGRpdiBzdHlsZT0icG9zaXRpb246IGZpeGVkOyB0b3A6IDVweDsgcmlnaHQ6IDVweDsgd2lkdGg6IDEyMHB4OyB6LWluZGV4OiA5OTsgcGFkZGluZzogMTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNik7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGJvcmRlci1yYWRpdXM6IDVweDtkaXNwbGF5Om5vbmU7IiBpZD0icXJjb2RlYm94Ij48ZGl2IGlkPSJxcmNvZGUiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAwIGF1dG87Ij48L2Rpdj7miYvmnLrmiavmj4/kuIvovb08L2Rpdj4KICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgaWQ9IngiIG9uY2xpY2s9IiQoJyNxcmNvZGVib3gnKS5oaWRlKCk7JCh0aGlzKS5oaWRlKCk7IiBzdHlsZT0icG9zaXRpb246IGZpeGVkO3RvcDogMTcwcHg7cmlnaHQ6IDY1cHg7Ym9yZGVyOiAxcHggc29saWQgcmdiKDI1NSwgMjU1LCAyNTUpO2JvcmRlci1yYWRpdXM6IDUwJTtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3dpZHRoOiAyMHB4O2hlaWdodDogMjBweDt0ZXh0LWRlY29yYXRpb246IG5vbmU7Zm9udC1mYW1pbHk6IEFyaWFsO2xpbmUtaGVpZ2h0OiAyMnB4O2ZvbnQtd2VpZ2h0OiBub3JtYWw7Zm9udC1zaXplOiAxMnB4O3RleHQtYWxpZ246IGNlbnRlcjt6LWluZGV4Ojk7ZGlzcGxheTpub25lOyI+WDwvYT4KPGRpdiBjbGFzcz0id2FycCI+CiAgICA8IS0t5a6i5pyNLS0+CiAgICA8YSBpZD0ia2VmdSIgaHJlZj0iaHR0cDovL2x2bXEuZGZkcnBqZy54eXovZGlzdC9jaGF0bGluay5odG1sPyIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgIDxkaXYgc3R5bGU9InBvc2l0aW9uOiBmaXhlZDsgdG9wOiA2MCU7IHJpZ2h0OiA1cHg7IHdpZHRoOiA4MHB4OyB6LWluZGV4OiA5OTk5OyBwYWRkaW5nOiAxMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7ICBjb2xvcjogcmdiKDAsIDAsIDApOyBib3JkZXItcmFkaXVzOiA1cHg7Ij4KICAgICAgICAgICAgPGltZyBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTsiIHNyYz0iL2ltZ3Mva2YucG5nIi8+CiAgICAgICAgPC9kaXY+CiAgICA8L2E+CiAgICA8IS0tIOS4i+i9veWMuiAtLT4KICAgIAogICAgPGRpdiBjbGFzcz0iZm9vdGVyIiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9ImRvd25sb2FkX2J1dHRvbiI+CiAgICAgICAKICAgIDwvZGl2PgogICAgCiAgPGRpdiBpZD0iYW5kcm9pZF9kb3dubG9hZCIgZGF0YS1jbGlwYm9hcmQtdGV4dD0iSEVJSklOOi8vY29tLmFjamQuYW9jaHVhbmdqaW5nZGlhbmxhLmEwMDE/ZXh0PSI+CiAgCQk8ZGl2IGNsYXNzPSJoZWFkZXIiIGlkPSJoZWFkZXItYW5kcm9pZCI+CgkgICAgICAgIDxpbWcgc3JjPSIiPgoJICAgIDwvZGl2PgoJICAgPGRpdiBjbGFzcz0iZm9vdGVyIiBpZD0iZm9vdGVyLWFuZHJvaWQiPgogICAgICAgICAgICAgPCEtLeaOqOW5v+WRmGlkLS0+CiAgICAgICAgICAgIDxkaXYgaWQ9InByb21vdGVyX2lkIiBzdHlsZT0ibWFyZ2luOiAxMHB4IGF1dG87IHdpZHRoOiAxMjBweDsgei1pbmRleDogOTk7IHBhZGRpbmc6IDEwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYmFja2dyb3VuZC1jb2xvcjogI2ZlZTYwNjsgb3BhY2l0eTogMC45OyBjb2xvcjogcmdiKDAsIDAsIDApOyBib3JkZXItcmFkaXVzOiAxMnB4OyBkaXNwbGF5OiBub25lO2ZvbnQtd2VpZ2h0OiA5MDA7Ij4KICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgIOmCgOivt+egge+8mjxzcGFuPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICA8L2Rpdj4KCSAgICAgICAgPGltZyBpZD0iZm9vdGVyIiBzcmM9Ii9pbWdzL3N0eWxlXzEvZm9vdGVyLnBuZyI+CgkgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaW1nZHdQIj4KICAgICAgICAgICAgPGEgY2xhc3M9ImRvbndsb2FkIiBocmVmPSJqYXZhc2NyaXB0OiI+CiAgICAgICAgICAgICAgICA8aW1nIHNyYz0iIj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8aW1nIGlkPSJiZzEiIHNyYz0iL2ltZ3Mvc3R5bGVfMS9iZzEuanBnIj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpbWdkd1AiPgogICAgICAgICAgICA8aW1nIGlkPSJiZzIiIHNyYz0iL2ltZ3Mvc3R5bGVfMS9iZzIuanBnIj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpbWdkd1AiPgogICAgICAgICAgICA8aW1nIGlkPSJiZzMiIHNyYz0iL2ltZ3Mvc3R5bGVfMS9iZzMuanBnIj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0ibm90X2Rvd25fYm9keSI+CgkgICAgPGRpdiBjbGFzcz0ibm90X2Rvd24iPgoJICAgIDwvZGl2PgoJICAgIDxkaXYgY2xhc3M9Im5vdF9kb3duX2ltZyI+CgkgICAgCTxpbWcgc3JjPSIvaW1ncy9ub19kb3duX2NvcHkucG5nIj4KCSAgICA8L2Rpdj4KCTwvZGl2PgoJPGRpdiBpZD0icG9zdGVyX2lvc19ndWlkZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJICAgIDxkaXY+CiAgICAJICAgIDxpbWcgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IHdpZHRoOiAxMDAlIiBzcmM9Ii9pbWdzLzJfMDEuanBnIj4KCSAgICA8L2Rpdj4KCSAgICA8ZGl2IGlkPSJkb253bG9hZF90ZiI+CiAgICAJICAgIDxpbWcgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IHdpZHRoOiAxMDAlIiBzcmM9Ii9pbWdzLzJfMDIuanBnIj4KCSAgICA8L2Rpdj4KCSAgICA8ZGl2IGlkPSJkb253bG9hZF9jb21wIj4KCSAgICAgICAgPGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgd2lkdGg6IDEwMCUiIHNyYz0iL2ltZ3MvMl8wMy5qcGciPgoJICAgIDwvZGl2PgoJICAgIDxkaXY+CgkgICAgICAgIDxpbWcgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IHdpZHRoOiAxMDAlIiBzcmM9Ii9pbWdzLzJfMDQuanBnIj4KCSAgICA8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2hhZG93LWJveCI+Cgk8aW1nIHNyYz0iL2ltZ3MvZ3VpZGVfd2VpeGluLnBuZyI+CjwvZGl2Pgo8ZGl2IGlkPSJpbnN0YWxsSW5mbyI+CiAgICA8aW1nIHNyYz0iIiBhbHQ9IiIgaWQ9ImltZ0luZm8iPgogICAgPGRpdiBpZD0iY2xvc2VCdG4iPueCueWHu+WFs+mXrTwvZGl2Pgo8L2Rpdj4KCgo8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBjbGFzcz0ic29yY2UiPuaVsOaNruW6kzwvZGl2PgoKPGlmcmFtZSBpZD0iaWZyYW1lMSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iIj48L3NjcmlwdD4KPC9pZnJhbWU+CgogICAgPGRpdiBpZD0nY29weV9kaXYnIGNsYXNzPSJvcGFjaXR5Ij4KICAgICAgICA8cD7lpoLmnpzlj7PkuIrop5IuLi7ml6Dms5Xngrnlh7s8L3A+CiAgICAgICAgPHVsPgogICAgICAgICAgICA8bGkgc3R5bGU9Im1hcmdpbjogMCAxNXB4IDQ1cHggMTVweDsiPgogICAgICAgICAgICAgICAgPGltZyBpZD0naWVfaWNvbicgc3JjPSIvaW1ncy9pZS5wbmciIC8+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBzdHlsZT0ibWFyZ2luOiAxNnB4IDA7Ij4KICAgICAgICAgICAgICAgIOivt+WkjeWItumTvuaOpeWIsOa1j+iniOWZqOaJk+W8gAogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgc3R5bGU9Im1hcmdpbjogMTNweCAyM3B4IDAgMDtmbG9hdDpyaWdodCI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iY29weVRleHQobG9jYXRpb24uaHJlZik7Ij7lpI3liLY8L2J1dHRvbj4KICAgICAgICAgICAgPC9saT4KICAgICAgICA8L3VsPgogICAgPC9kaXY+CgogIDxzY3JpcHQgc3JjPSIvYXNzZXRzL2xpYi9qcXVlcnkvanF1ZXJ5LTEuMTEuMy5taW4uanMiIHJlbD0icHJlbG9hZCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly93d3cuZHN5bC53dTM2dS5jYy9zdGF0aWMvanMvZHN5bC5zZGsudi4xLjAuMC5qcyI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSIvanMvcXJjb2RlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICA8c2NyaXB0IHNyYz0iL2pzL2RldmljZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIvanMvcmVnaXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSIvanMvbGF5ZXJfdjMuMS4xL21vYmlsZS9sYXllci5qcyI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICBkb2N1bWVudC53cml0ZSgiPHNjcmlwdCBzcmM9Jy9qcy96bHZpZnouanM/YWN0aW9uPW1vbml0b3ImcmFuZG9tPSIrIE1hdGgucmFuZG9tKCkrIic+PFwvc2NyaXB0PiIpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICB2YXIgcHJvbW90ZXJfaWQgPSAnJzsKICAgICAgaWYgKHByb21vdGVyX2lkKSB7CiAgICAgICAgICAkKCcjcHJvbW90ZXJfaWQnKS5zaG93KCk7CiAgICAgIH0KICAgICAgCiAgICAgIHZhciBvcyA9IDE7IC8vIDEg5a6J5Y2TIDIgaW9zCiAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cKGlbXjtdKzsoIFU7KT8gQ1BVLitNYWMgT1MgWC8pKSB7CiAgICAgICAgICBvcyA9IDI7CiAgICAgIH0KCWZ1bmN0aW9uIGNoZWNrX3NhZmFyaSgpIHsKICAgIAlpZiAoISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cKGlbXjtdKzsoIFU7KT8gQ1BVLitNYWMgT1MgWC8pKSB7CgkJCXZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKCQkgICAgLy/liKTmlq3mmK/kuI3mmK/lnKhpUGhvbmXnmoRTYWZhaXLmtY/op4jlmajmiZPlvIDnmoTmnKzpobXpnaIKCQkgICAgaWYgKHVhLmluZGV4T2YoJ2FwcGxld2Via2l0JykgPiAtMSAmJiB1YS5pbmRleE9mKCdtb2JpbGUnKSA+IC0xICYmIHVhLmluZGV4T2YoJ3NhZmFyaScpID4gLTEgJiYKCQkgICAgICAgIHVhLmluZGV4T2YoJ2xpbnV4JykgPT09IC0xICYmIHVhLmluZGV4T2YoJ2FuZHJvaWQnKSA9PT0gLTEgJiYgdWEuaW5kZXhPZignY2hyb21lJykgPT09IC0xICYmCgkJICAgICAgICB1YS5pbmRleE9mKCdpb3MnKSA9PT0gLTEgJiYgdWEuaW5kZXhPZignYnJvd3NlcicpID09PSAtMSkgewoJCSAgICAgICAgcmV0dXJuIHRydWU7CgkJICAgIH0KCQkgICAgZWxzZSB7CgkJICAgICAgICAvL2FsZXJ0KCLor7fkvb/nlKhpUGhvbmXkuK3nmoRTYWZhcmnmtY/op4jlmajmiZPlvIDmnKzpobXpnaLvvIEiKTsKCQkgICAgICAgIC8vIGFsZXJ0KCLor7fmgqjkvb/nlKhzYWZhcmnmtY/op4jlmajmiZPlvIDmnKznvZHpobV+Iik7CgkgICAgICAgLy8gICAgICQoJy5ub3RfZG93bl9ib2R5Jykuc2hvdygpOwoJCSAgICAgIC8vICByZXR1cm4gZmFsc2U7CgkJICAgICAgcmV0dXJuIHRydWU7CgkJICAgIH0KICAgIAl9Cgl9CiAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKLy8gICAJJCgnI2lmcmFtZTEnKS5sb2FkKAovLyAgIAkJZnVuY3Rpb24oKXsKLy8gICAJCQl3aW5kb3cubG9jYXRpb24uaHJlZj0naHR0cDovL2FjajA4LnRvcC9pbnN0YWxsX2NvbmZpZy5waHAnOwovLyAgIAkJfQovLyAgIAkpOwogIAkKICAJCiAgICAKICB9CiAgCgkkKGZ1bmN0aW9uKCkgey8vIOWIneWni+WMluWGheWuuQogICAgICAgIC8vIOmaj+acuuiOt+WPluWbvueJhwogICAgICAgIC8vIGxldCBtYXggPSAzOwogICAgICAgIC8vIGxldCByYW5kb20gPSBwYXJzZUludChNYXRoLnJhbmRvbSgpKihtYXgrMSksMTApOwogICAgICAgIC8vIGxldCB1cmwgPSAnL2ltZ3Mvc3R5bGVfJyArIHJhbmRvbSArICcvJzsKICAgICAgICAvLyAkKCcjZm9vdGVyJykuYXR0cignc3JjJywgdXJsICsgJ2Zvb3Rlci5wbmcnKTsKICAgICAgICAvLyAkKCcjYmcxJykuYXR0cignc3JjJywgdXJsICsgJ2JnMS5qcGcnKTsKICAgICAgICAvLyAkKCcjYmcyJykuYXR0cignc3JjJywgdXJsICsgJ2JnMi5qcGcnKTsKICAgICAgICAvLyAkKCcjYmczJykuYXR0cignc3JjJywgdXJsICsgJ2JnMy5qcGcnKTsKCQoJICAgIGlmKCIiID09ICIiKXsKCQkkKCIuaGVhZGVyIikuaGlkZSgpOwoJfQoJaWYoIi9pbWdzL3N0eWxlXzEvZm9vdGVyLnBuZyIgPT0gIiIpewoJCSQoIi5mb290ZXIiKS5oaWRlKCk7Cgl9CglpZigiIiA9PSAiIil7CgkJJCgiLmRqMSIpLmhpZGUoKTsKCX0KCWlmKCIvaW1ncy9zdHlsZV8xL2JnMi5qcGciID09ICIiKXsKCQkkKCIuYmcyIikuaGlkZSgpOwoJfQoJaWYoIiIgPT0gIiIpewoJCSQoIi5kajIiKS5oaWRlKCk7Cgl9CglpZigiIiA9PSAiIil7CgkJJCgiLmljb19kb3dubG9hZCIpLmhpZGUoKTsKCX0KCQoJaWYoImh0dHBzOi8va2tmLmFvZHVvYW9jaHVhbmcuY24vZGlzdC9jaGF0bGluay5odG1sIj09IiIpewoJICAgIAkkKCIja2VmdSIpLmhpZGUoKTsKCX1lbHNlewoJICAgICQoIiNrZWZ1IikuYXR0cigiaHJlZiIsJ2h0dHBzOi8va2tmLmFvZHVvYW9jaHVhbmcuY24vZGlzdC9jaGF0bGluay5odG1sJyk7Cgl9CgkKCXZhciB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CglpZigwID09IDEgJiYgdWEubWF0Y2goL01pY3JvTWVzc2VuZ2VyL2kpICE9ICdtaWNyb21lc3NlbmdlcicpewoJCSQoIiNxcmNvZGVib3giKS5zaG93KCk7CgkJJCgiI3giKS5zaG93KCk7Cgl9Cgl2YXIgd2VidXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICB2YXIgcXJjb2RlID0gbmV3IFFSQ29kZSgncXJjb2RlJywgewogICAgICB0ZXh0OiB3ZWJ1cmwsCiAgICAgIHdpZHRoOiAxMjAsCiAgICAgIGhlaWdodDogMTIwLAogICAgICBjb2xvckRhcms6ICcjMDAwMDAwJywKICAgICAgY29sb3JMaWdodDogJyNmZmZmZmYnLAogICAgICBjb3JyZWN0TGV2ZWw6IFFSQ29kZS5Db3JyZWN0TGV2ZWwuSAogICAgfSk7CiAgICB2YXIgcGFja2FnZXRhZyA9ICJjb20uYWNqZC5hb2NodWFuZ2ppbmdkaWFubGEuYTAwMSI7CiAgCXZhciBwcm9tb3Rlcl90cmVlID0gIiI7CiAgCXZhciBwcm9tb3RlciA9ICIiOwogIAl2YXIgc3ByZWFkX3NuaWQgPSAiIjsKICAJdmFyIHNwcmVhZCA9ICIxIjsKICAJdmFyIHdlaXhpbiA9ICIwIjsKICAJCiAgCQogIAkKICAJdHJ5IHsKICAgICAgLy9vcGVuaW5zdGFsbOWIneWni+WMluaXtuWwhuS4jm9wZW5pbnN0YWxs5pyN5Yqh5Zmo5Lqk5LqS77yM5bqU5bC95Y+v6IO95pep55qE6LCD55SoCiAgICAgICAgLy92YXIgZGF0YSA9IE9wZW5JbnN0YWxsLnBhcnNlVXJsUGFyYW1zKCk7Ly9vcGVuaW5zdGFsbC5qc+S4reaPkOS+m+eahOW3peWFt+WHveaVsO+8jOino+aekHVybOS4reeahOaJgOacieafpeivouWPguaVsAogICAgICB2YXIgZGF0YSA9IHsicGFja2FnZVRhZyI6cGFja2FnZXRhZywicHJvbW90ZXJfdHJlZSI6cHJvbW90ZXJfdHJlZSwicHJvbW90ZXIiOnByb21vdGVyLCJzcHJlYWQiOnNwcmVhZCwid2VpeGluIjp3ZWl4aW4sInNwcmVhZF9zbmlkIjpzcHJlYWRfc25pZH07CiAgICAgICAgdmFyIGlzX3N1bGlhbiA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICog56ys5LiA5Liq5Y+C5pWw5piv57uR5a6a55qE5LiL6L295oyJ6ZKu55qEaWTmiJbogIVET00KICAgICAgICAqIOesrOS6jOS4quWPguaVsOaYr1N1TGlua2Vy55qE6YWN572uCiAgICAgICAgKi8KICAgICAgICBjb25zb2xlLmxvZygnb3M9Jytvcyk7CiAgICAgICAgdmFyIHN1bmxpbmtfb2JqID0gJyNkb3dubG9hZF9idXR0b24nOwogICAgICAgIGlmIChvcyA9PSAyKSB7CiAgICAgICAgICAgIHN1bmxpbmtfb2JqID0gJyNkb253bG9hZF90Zic7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBTdUxpbmtlcihzdW5saW5rX29iaix7CiAgICAgICAgICAgIC8vKOW/heWhqykg57O757uf5YiG6YWNYXBwS2V5CiAgICAgICAgICAgIGFwcEtleToiemx2aWZqIiwgCiAgICAgICAgICAgIC8vKOmAieWhqykg6Ieq5a6a5LmJ6ZmE5bim5Y+C5pWwLOS8mumAj+S8oOWIsOWJjeerrwogICAgICAgICAgICBwYXJhbXM6IGRhdGEsCiAgICAgICAgICAgIC8vKOmAieWhqykg6YeN5a6a5ZCR5Y+C5pWw77yMU0RL5Zue6LCD5Lit5Lya6L+U5Zue6K+l5YC8CiAgICAgICAgICAgIHJlZGlyZWN0OiIiICwKICAgICAgICAgICAgLy8o6YCJ5aGrKSDmjqjlub/muKDpgZMs5LiN5aGr55qE6K+d6K6k5Li65piv6buY6K6k5rig6YGTCiAgICAgICAgICAgIGNoYW5uZWw6IiIsCiAgICAgICAgICAgIC8vICjpgInloaspIOWIneWni+WMluWujOavleWbnuiwgwogICAgICAgICAgICBvblJlYWR5OiBmdW5jdGlvbiAoc3VsaW5rZXIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLliJ3lp4vljJbnu5PmnZ8iKTsKICAgICAgICAgICAgICAgIGlzX3N1bGlhbiA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyDliJ3lp4vljJblrozlkI7lj6/ku6XlsJ3or5XllKTphpLkuIDmrKE7CiAgICAgICAgICAgICAgICAvLyBzdWxpbmtlci53YWtldXAoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gKOmAieWhqykg5byA5aeL5ZSk6YaSQXBwCiAgICAgICAgICAgIG9uV2FrZXVwOiBmdW5jdGlvbiAoaXNNYW51YWwpIHsKICAgICAgICAgICAgICAgIC8vIOWPr+S7peW8gOWQr+W8ueeql++8jOW7uuiurjIwMDBtcyzlj6/ku6Xkvb/nlKhpc01hbnVhbOadpeWIpOaWreW9k+WJjeaYr+WQpuaJi+WKqOWUpOmGku+8jOafkOS6m+aDheWGteS4i+aJi+WKqOWUpOmGkuS4jemcgOimgeaYvuekuuW8ueeql+aPkOekugogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuW8gOWni+WUpOmGkuW6lOeUqCIsIuaJi+WKqOWUpOmGkiIsaXNNYW51YWwpOwogICAgICAgICAgICAgICAgRGlhbG9nLmluaXQoJ+ato+WcqOWKoOi9veS4re+8jOivt+eojeWQji4uLicsIDMwMDAwKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gKOmAieWhqykg5byA5aeL5LiL6L29QXBwCiAgICAgICAgICAgIG9uRG93bmxvYWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLlvIDlp4vkuIvovb3lupTnlKgiKTsKICAgICAgICAgICAgICAgIERpYWxvZy5jbG9zZSgpOwogICAgICAgICAgICAgICAgaWYgKG9zID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1woaVteO10rOyggVTspPyBDUFUuK01hYyBPUyBYLykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0d1aWRlKCk7CiAgICAgICAgICAgICAgICAJfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFuZHJvaWRfZG93bmxvYWQiKS5zdHlsZS5kaXNwbGF5PSJub25lIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBvc3Rlcl9pb3NfZ3VpZGUiKS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwogICAgICAgICAgICAgICAgCX0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gKOmAieWhqykg6YGH5Yiw5LiN5pSv5oyB55qE5rWP6KeI5Zmo5Zue6LCDCiAgICAgICAgICAgIG9uQnJvd3Nlck5vdFN1cHBvcnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIOWPr+S7peWFs+mXreW8ueeqlwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuS4jeaUr+aMgeeahOa1j+iniOWZqCIpOwogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIAogICAgICAgICQoJyNkb253bG9hZF9jb21wJykuY2xpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKG9zPT0yKXsKICAgICAgICAgICAgLy92YXIgdXJsID0gJ2l0bXMtc2VydmljZXM6Ly8/YWN0aW9uPWRvd25sb2FkLW1hbmlmZXN0JnVybD1odHRwczovLzIyNi15dWVodWEub3NzLWNuLXNoZW56aGVuLmFsaXl1bmNzLmNvbS9kb3dubG9hZC9kb3duaW9zLnBsaXN0JzsKICAgICAgICAgICAgICAgIGlmKCJodHRwczovL3RxZXB2YWsudnhjY3V4dGR2YWIuY29tL2ltYWdlLzR2bWxjdHoiIT0iIil7CiAgICAgICAgICAgICAgICAgICAgIERpYWxvZy5pbml0KCfmraPlnKjliqDovb3kuK3vvIzor7fnqI3lkI4uLi4nLCAzMDAwKTsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gJ2h0dHBzOi8vdHFlcHZhay52eGNjdXh0ZHZhYi5jb20vaW1hZ2UvNHZtbGN0eic7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBEaWFsb2cuaW5pdCgn5pqC5peg5LyB5Lia562+Li4uJywgMzAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgfSk7CiAgICB9IGNhdGNoKGVycil7CiAgICAgIGNvbnNvbGUubG9nKGVycik7CiAgICB9CiAgICAKICAgICAgICBpZiAob3MgPT0gMikgewogICAgICAgICAgICAvLyAkKCcjZG93bmxvYWRfYnV0dG9uJykuY2xpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnY2xpY2snKQogICAgICAgICAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFuZHJvaWRfZG93bmxvYWQiKS5zdHlsZS5kaXNwbGF5PSJub25lIjsKICAgICAgICAgICAgLy8gICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwb3N0ZXJfaW9zX2d1aWRlIikuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvLyB9KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT7pgJ/pk77mnI3liqHnirbmgIHvvJonK2lzX3N1bGlhbik7CiAgICAgICAgICAgIGlmICghaXNfc3VsaWFuKSB7CiAgICAgICAgICAgICAgICBpZiAob3MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9idXR0b24nKS5jbGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nLmluaXQoJ+ato+WcqOWKoOi9veS4re+8jOivt+eojeWQji4uLicsIDMwMDApOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBkZWZhdWx0VXJsICE9PSAndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkZWZhdWx0VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cKGlbXjtdKzsoIFU7KT8gQ1BVLitNYWMgT1MgWC8pKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBkZWZhdWx0VXJsLmlvczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gZGVmYXVsdFVybC5hbmRyb2lkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sIDUwMDAgKTsKICAgICAgICAKICAgICAgICAKICAgICAgICB2YXIgdSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgdmFyIGlzQW5kcm9pZCA9IHUuaW5kZXhPZignQW5kcm9pZCcpID4gLTEgfHwgdS5pbmRleE9mKCdBZHInKSA+IC0xOyAvL2FuZHJvaWTnu4jnq68KICAgICAgICB2YXIgaXNpT1MgPSAhIXUubWF0Y2goL1woaVteO10rOyggVTspPyBDUFUuK01hYyBPUyBYLyk7IC8vaW9z57uI56uvCiAgICAgICAgaWYoaXNpT1MpewogICAgICAgICAgICAkKCcjaWVfaWNvbicpLmF0dHIoJ3NyYycsJy9pbWdzL3NhZmFyaS5wbmcnKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgLy/lpoLmnpzmmK/lnKhRUeWGhee9rua1j+iniOWZqOaIluW+ruS/oemHjAogICAgICAgIGlmKAogICAgICAgICAgICAvTWljcm9NZXNzZW5nZXIvaS50ZXN0KHUpCiAgICAgICAgICAgIHx8IChpc2lPUyAmJiAvIFFRL2kudGVzdCh1KSkKICAgICAgICAgICAgfHwgKGlzQW5kcm9pZCAmJiAvTVFRQnJvd3Nlci9pLnRlc3QodSkgJiYgL1FRL2kudGVzdCh1LnNwbGl0KCdNUVFCcm93c2VyJykpKQogICAgICAgICAgICAvLyB8fCB0cnVlCiAgICAgICAgICAgICl7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoJy5zaGFkb3ctYm94Jykuc2hvdygpOwogICAgCSAgICAJZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0naGlkZGVuJzsgICAgCgkgICAgCSAgICBkb2N1bWVudC50aXRsZSA9ICfmuKnppqjmj5DnpLonOwogICAgCSAgICAJdmFyIG1vPWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTt9OyAgICAKICAgICAgICAgICAgCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsbW8se3Bhc3NpdmU6ZmFsc2V9KTsvL+emgeatoumhtemdoua7keWKqAogICAgICAgICAgICAJCiAgICAgICAgICAgIAkkKCcjY29weV9kaXYnKS5zaG93KCk7CiAgICAgICAgICAgIAlpZihpc0FuZHJvaWQpewogICAgICAgICAgICAJICAgIGxvY2F0aW9uLmhyZWYgPSAnbXR0YnJvd3NlcjovL3VybD0nK2xvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICAKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgCgkJICAgICQoJyNhbmRyb2lkX2Rvd25sb2FkJykuc2hvdygpOwoJCQljaGVja19zYWZhcmkoKTsKCQkgICAgJCgnLm5vdF9kb3duX2ltZycpLmNsaWNrKGZ1bmN0aW9uKCkgewoJCSAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCSAgICAgICAgY29weVRleHQodXJsKTsKCQkgICAgfSk7CgkJICAgIAogICAgICAgIH0KICAKCX0pOyAKICAKICAgIGZ1bmN0aW9uIGNvcHlUZXh0KHRleHQpIHsKICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5wdXQpOwogICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB0ZXh0KTsKICAgICAgICBpbnB1dC5zZWxlY3QoKTsKICAgICAgICB2YXIgb2xkQ29udGVudEVkaXRhYmxlID0gaW5wdXQuY29udGVudEVkaXRhYmxlOwogICAgICAgIHZhciBvbGRSZWFkT25seSA9IGlucHV0LnJlYWRPbmx5OwogICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgaW5wdXQuY29udGVudEVkaXRhYmxlID0gdHJ1ZTsKICAgICAgICBpbnB1dC5yZWFkT25seSA9IGZhbHNlOwogICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhpbnB1dCk7CiAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgcy5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICBzLmFkZFJhbmdlKHJhbmdlKTsKICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCA5OTk5OTkpOyAvLyBBIGJpZyBudW1iZXIsIHRvIGNvdmVyIGFueXRoaW5nIHRoYXQgY291bGQgYmUgaW5zaWRlIHRoZSBlbGVtZW50LgogICAgICAgIGlucHV0LmNvbnRlbnRFZGl0YWJsZSA9IG9sZENvbnRlbnRFZGl0YWJsZTsKICAgICAgICBpbnB1dC5yZWFkT25seSA9IG9sZFJlYWRPbmx5OwogICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykpOwoJCSAgICBEaWFsb2cuaW5pdCgn5aSN5Yi25oiQ5YqfJywgMjAwMCk7CiAgICAgICAgICAgIC8vICQoJy5ub3RfZG93bl9ib2R5JykuaGlkZSgpOwogICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0KTsKICAgIH0KPC9zY3JpcHQ+CjxkaXYgc3R5bGU9ImRpc3BsYXk6YmxvY2s7Ij48L2Rpdj4KCgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgaWQ9IndpbmRvd0JHIj4KICAgIDwhLS0g5by55Ye65qGGIC0tPgoKICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxkaXYgYWN0aW9uPSIiIGNsYXNzPSJsb2dpbi1mb3JtIiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWljb24iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJ1c2VybmFtZSIgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IuaJi+acuuWPtyIvPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJ1c2VybmFtZSIgc3R5bGU9ImNvbG9yOiByZWQ7ZGlzcGxheTogbm9uZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIHBhc3N3ZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1pY29uIiBzdHlsZT0idGV4dC1hbGlnbjogbGVmdCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9ImNvZGUiIHR5cGU9InRleHQiICBjbGFzcz0iZm9ybS1jb250cm9sIHBsYWNlaG9sZGVyLW5vLWZpeCIgcGxhY2Vob2xkZXI9IumqjOivgeeggSIvPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmFtZT0iYnRuY29kZSIgb25jbGljaz0ic2VuZFZlcmlmeUNvZGUoKSIgdHlwZT0iYnV0dG9uIj7ojrflj5bpqozor4HnoIE8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2RlIiBzdHlsZT0iY29sb3I6IHJlZDtkaXNwbGF5OiBub25lIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1pY29uIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5a+G56CBIi8+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InBhc3N3b3JkIiBzdHlsZT0iY29sb3I6IHJlZDtkaXNwbGF5OiBub25lIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtaWNvbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InJlcGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0i6K+35YaN6L6T5YWl5a+G56CBIi8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtaWNvbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9Imludml0ZXIiIHR5cGU9ImhpZGRlbiIgcmVhZG9ubHkgY2xhc3M9ImZvcm0tY29udHJvbCIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Imludml0ZV9pZCIgIHR5cGU9InRleHQiIHJlYWRvbmx5ICBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0i5o6o6I2Q5Lq6SUTvvJoiLz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iaW52aXRlciIgc3R5bGU9ImNvbG9yOiByZWQ7ZGlzcGxheTogbm9uZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWljb24iPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmFtZT0ic3VibWl0IiAgdHlwZT0ic3VibWl0IiBvbmNsaWNrPSJyZWdpc3RlcigpIiBjbGFzcz0iZm9ybS1jb250cm9sIHN1YiI+5rOo5YaMPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWljb24gZG93bl9hcGsiPgogICAgICAgICAgICAgICAgICAgIDxhIHN0eWxlPSJjb2xvcjogZ3JlZW4iIGlkPSJjbGlja3N1bGlhbiIgIG9uY2xpY2s9J2NsaWNrU3VubGlhbigpJz7lt7LmnInotKblj7fnjqnlrrbor7fngrnlh7vov5nph4wgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgJCgnI2FuZHJvaWRfZG93bmxvYWQnKS5jbGljayhmdW5jdGlvbiAoKXsKICAgICAgICBsYXllci5vcGVuKHsKICAgICAgICAgICAgdHlwZToxLAogICAgICAgICAgICB0aXRsZTon5rOo5YaM6YCBOC04ODgnLAogICAgICAgICAgICBidG46J+WFs+mXrScsCiAgICAgICAgICAgIG1heG1pbjp0cnVlLAogICAgICAgICAgICBjb250ZW50OiQoJyN3aW5kb3dCRycpLmh0bWwoKSwKICAgICAgICB9KQogICAgICAgIGlmKHJlZ2lzLnR5cGU9PSdzJyl7CiAgICAgICAgICAgIGlmKHJlZ2lzLnBhY2thZ2VpZCl7CiAgICAgICAgICAgICAgICAkKCcjaW52aXRlX2lkJykuYXR0cigncGxhY2Vob2xkZXInLCAn5o6o6I2Q5Lq6SUTvvJonICsgcmVnaXMucGFja2FnZWlkKTsKICAgICAgICAgICAgfQogICAgICAgIH1lbHNlewogICAgICAgICAgICBpZihyZWdpcy5pbnZpdGVyKXsKICAgICAgICAgICAgICQoJyNpbnZpdGVfaWQnKS5hdHRyKCdwbGFjZWhvbGRlcicsICfmjqjojZDkurpJRO+8micgKyByZWdpcy5pbnZpdGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgIH0pCiAgICAKICAgIGZ1bmN0aW9uIGNsaWNrU3VubGlhbiAoKSB7CiAgICAgICAgbGF5ZXIuY2xvc2VBbGwoKTsKICAgICAgICBpZiAob3MgPT0gMSkgewogICAgICAgICAgICAkKCcjZG93bmxvYWRfYnV0dG9uJykuY2xpY2soKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjZG9ud2xvYWRfdGYnKS5jbGljaygpOwogICAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYW5kcm9pZF9kb3dubG9hZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicG9zdGVyX2lvc19ndWlkZSIpLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7CiAgICAgICAgICAgIC8vICQoJyNkb3dubG9hZF9idXR0b24nKS5jbGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCdjbGljaycpCiAgICAgICAgICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYW5kcm9pZF9kb3dubG9hZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgICAgICAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBvc3Rlcl9pb3NfZ3VpZGUiKS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIH0pOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIHZhciBkb3dubG9hZF91cmwgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKLy8gICAgICAgIHZhciBzbXNfbGltaXQgPSA2MDsKLy8gICAgICAgIHZhciBpc19jYXB0Y2hhID0gMTsKCiAgICAgICAgdmFyIHUgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgIC8vIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignbWljcm9tZXNzZW5nZXInKSAhPT0gLTEKICAgICAgICAvLyB8fCBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigncXEnKSAhPT0gLTEpCiAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdtaWNyb21lc3NlbmdlcicpICE9PSAtMQogICAgICAgICAgICB8fCBpc1FRQVBQKCkpCiAgICAgICAgewogICAgICAgICAgICAkKCcuc2hhZG93LWJveCcpLnNob3coKTsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0naGlkZGVuJzsKICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSAn5rip6aao5o+Q56S6JzsKICAgICAgICAgICAgdmFyIG1vPWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTt9OwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLG1vLHtwYXNzaXZlOmZhbHNlfSk7Ly/npoHmraLpobXpnaLmu5HliqgKCiAgICAgICAgICAgICQoJyNjb3B5X2RpdicpLnNob3coKTsKICAgICAgICAgICAgaWYoaXNBbmRyb2lkKXsKICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSAnbXR0YnJvd3NlcjovL3VybD0nK2xvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcuY29udGVudCcpLnNob3coKTsKICAgICAgICB9CgogICAgICAgIC8v5Yik5pat5piv5ZCmUVHlhoXnva7mtY/op4jlmajvvIjlkKtJT1PlkoxBbmRyaW9k77yJCiAgICAgICAgZnVuY3Rpb24gaXNRUUFQUCgpewogICAgICAgICAgICB2YXIgaXNJb3NRUSA9ICggLyhpUGhvbmV8aVBhZHxpUG9kfGlPUykvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9cc1FRL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSk7CiAgICAgICAgICAgIHZhciBpc0FuZHJvaWRRUSA9ICggLyhBbmRyb2lkKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL01RUUJyb3dzZXIvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9cc1FRL2kudGVzdCgobmF2aWdhdG9yLnVzZXJBZ2VudCkuc3BsaXQoJ01RUUJyb3dzZXInKSkpOwogICAgICAgICAgICByZXR1cm4gaXNJb3NRUSB8fCBpc0FuZHJvaWRRUTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldFF1ZXJ5VmFyaWFibGUodmFyaWFibGUpCiAgICAgICAgewogICAgICAgICAgICBsZXQgcXVlcnkgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgbGV0IHZhcnMgPSBxdWVyeS5zcGxpdCgiJiIpOwogICAgICAgICAgICBmb3IgKGxldCBpPTA7aTx2YXJzLmxlbmd0aDtpKyspIHsKICAgICAgICAgICAgICAgIGxldCBwYWlyID0gdmFyc1tpXS5zcGxpdCgiPSIpOwogICAgICAgICAgICAgICAgaWYocGFpclswXSA9PSB2YXJpYWJsZSl7cmV0dXJuIHBhaXJbMV07fQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbGV0IGZyb20gPSBnZXRRdWVyeVZhcmlhYmxlKCdmcm9tJyk7CiAgICAgIC8vICB2YXIgcGxhdGZvcm0gPSAxODg7CiAgICAgICAvLyB2YXIgaW52aXRlciA9ICcnOwogICAgICAvLyAgdmFyIHBhY2thZ2VpZCA9ICcnOwogICAgICAgLy8gdmFyIHR5cGUgPSAncyc7CiAgICAgICAgLy8g6K6+572uIOmCgOivt+egge+8iOWFqOawkWlk77yJCiAgICAgICAgcmVnaXMucGxhdGZvcm09MTk2CiAgICAgICAgcmVnaXMuc2V0SW52aXRlcihmcm9tKQoKICAgICAgICAvLyQoJyNkb3dubG9hZF9idXR0b24nKS5hdHRyKCdocmVmJywgZG93bmxvYWRfdXJsICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CgogICAgICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKCl7CiAgICAgICAgICAgIGlmKHJlZ2lzLmludml0ZXI9PScnKXsKICAgICAgICAgICAgICAgIHJlZ2lzLmludml0ZXI9IiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihyZWdpcy5wYWNrYWdlaWQ9PScnKXsKICAgICAgICAgICAgICAgIHJlZ2lzLnBhY2thZ2VpZD0iNDM4NjEiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVnaXMucmVnaXN0ZXIoKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc2VuZFZlcmlmeUNvZGUoKXsKICAgICAgICAgICAgcmVnaXMuaXNGaXJzdCA9IDA7CiAgICAgICAgICAgIHJlZ2lzLmNvdW50ZG93biA9IDYwOwogICAgICAgICAgICByZWdpcy5zZW5kVmVyaWZ5Q29kZSgpOwogICAgICAgIH0KPC9zY3JpcHQ+CjwvYm9keT4KCgo8L2h0bWw+