儿童游戏合集:植物大战僵尸、井字棋、俄罗斯方块

给小朋友们整理的四款网页小游戏,全部免下载、免安装,不用跳转,在本页就能直接玩。每款游戏下方都附了链接,点开可以在新窗口全屏畅玩。建议用电脑或平板浏览器体验最佳。

🌻 植物大战僵尸(单机网页版)

经典塔防玩法:收集阳光,种下向日葵、豌豆射手、坚果墙、寒冰射手和樱桃炸弹,挡住一波又一波僵尸的进攻,坚持撑过最后一波就是胜利!

特别适合小朋友的两个贴心开关:♾️ 无限阳光(阳光随便用,专心练布阵)和 🧲 自动拾取(阳光自动入账,不用手忙脚乱去点),还支持暂停和音效开关。

手机竖屏可能显示不全,建议在电脑上玩;也可以在新窗口打开。

⭕ 井字棋 · 儿童版

专为小朋友设计的井字棋:暖色调大按钮,开局电脑先手让孩子后发制人;支持 3×3、4×4、5×5 三种棋盘(大棋盘要四子连线,玩法更有新鲜感),难度分简单/普通/困难,下错了可以悔一步,赢了输了都有战绩记分板。

也可以在新窗口打开。

❌ 井字棋 · 经典版

进阶版井字棋:可以和电脑对战(简单/困难两档 AI),也能两个孩子双人对战;拿不准下哪儿时点 💡 提示 让电脑支一招,比分自动统计,随时可以清零重来。

也可以在新窗口打开。

🧱 俄罗斯方块

永远不过时的经典:消行得分、升级加速,支持暂存方块、暂停和音效,自动记录最高分;底部有一排触屏方向按钮,手机上也能轻松操作。

也可以在新窗口打开。

PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9InpoLUNOIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPuakjeeJqeWkp+aImOWDteWwuCDCtyDljZXmnLrnvZHpobXniYg8L3RpdGxlPgo8c3R5bGU+CiAgKntib3gtc2l6aW5nOmJvcmRlci1ib3h9CiAgYm9keXttYXJnaW46MDtiYWNrZ3JvdW5kOiMyNjMzMWE7Zm9udC1mYW1pbHk6Ik1pY3Jvc29mdCBZYUhlaSIsIlBpbmdGYW5nIFNDIixzYW5zLXNlcmlmOwogICAgICAgZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7bWluLWhlaWdodDoxMDB2aDt1c2VyLXNlbGVjdDpub25lfQogICN0b3BiYXJ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O2JhY2tncm91bmQ6IzRjM2ExZTtib3JkZXI6MnB4IHNvbGlkICM2YjUzMjY7CiAgICAgICAgICBib3JkZXItcmFkaXVzOjEycHg7cGFkZGluZzo2cHggMTBweDttYXJnaW4tdG9wOjEwcHg7ZmxleC13cmFwOndyYXA7anVzdGlmeS1jb250ZW50OmNlbnRlcn0KICAjc3VuYm94e2JhY2tncm91bmQ6I2Y3ZWRjNztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjJweCAxMnB4IDJweCA2cHg7Zm9udC13ZWlnaHQ6OTAwO2ZvbnQtc2l6ZToyMnB4OwogICAgICAgICAgY29sb3I6IzRhM2ExMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo0cHg7bWluLXdpZHRoOjk2cHg7anVzdGlmeS1jb250ZW50OmNlbnRlcn0KICAjc2VlZGJhcntkaXNwbGF5OmZsZXg7Z2FwOjZweH0KICAuY2FyZHt3aWR0aDo2MnB4O2hlaWdodDo4MnB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KCNmM2U2YjgsI2RjYzk4Zik7Ym9yZGVyOjJweCBzb2xpZCAjOGE3YTRhOwogICAgICAgIGJvcmRlci1yYWRpdXM6OHB4O3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6Y2VudGVyO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMDhzfQogIC5jYXJkOmhvdmVye3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0ycHgpfQogIC5jYXJkIGNhbnZhc3ttYXJnaW4tdG9wOjFweH0KICAuY2FyZCAuY29zdHtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo5MDA7Y29sb3I6IzMzM30KICAuY2FyZCAuY2R7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JvdHRvbTowO3dpZHRoOjEwMCU7aGVpZ2h0OjA7YmFja2dyb3VuZDpyZ2JhKDIwLDIwLDIwLC42Mik7cG9pbnRlci1ldmVudHM6bm9uZX0KICAuY2FyZC5vZmZ7ZmlsdGVyOmdyYXlzY2FsZSguODUpIGJyaWdodG5lc3MoLjc1KX0KICAuY2FyZC5zZWx7b3V0bGluZTozcHggc29saWQgI2ZmZTE0ZDtib3gtc2hhZG93OjAgMCAxNHB4ICNmZmUxNGR9CiAgLmNhcmQuc2hha2V7YW5pbWF0aW9uOnNoayAuM3N9CiAgQGtleWZyYW1lcyBzaGt7MCUsMTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0yNSV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTRweCl9NzUle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDRweCl9fQogIC50YnRue2ZvbnQtc2l6ZToxN3B4O2xpbmUtaGVpZ2h0OjE7cGFkZGluZzo4cHggMTBweDtib3JkZXItcmFkaXVzOjhweDtib3JkZXI6MnB4IHNvbGlkICM2YjUzMjY7CiAgICAgICAgYmFja2dyb3VuZDojZjNlNmI4O2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0YTNhMTA7Zm9udC13ZWlnaHQ6OTAwfQogIC50YnRuOmhvdmVye2JhY2tncm91bmQ6I2ZmZjNjZn0KICAudGJ0bi5vbntiYWNrZ3JvdW5kOiNmZmQ1NGQ7Ym94LXNoYWRvdzowIDAgMTBweCAjZmZkNTRkfQogICNwcm9ncmVzc1dyYXB7d2lkdGg6MTcwcHg7aGVpZ2h0OjE4cHg7YmFja2dyb3VuZDojMmEyYTJhO2JvcmRlcjoxcHggc29saWQgIzAwMDtib3JkZXItcmFkaXVzOjlweDsKICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW59CiAgI3Byb2dyZXNzRmlsbHtoZWlnaHQ6MTAwJTt3aWR0aDowO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCM3YWM3NGYsI2ZmZTE0ZCk7dHJhbnNpdGlvbjp3aWR0aCAuNHN9CiAgI3dhdmVMYWJlbHtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjkwMDtjb2xvcjojZmZmOwogICAgICAgICAgICAgdGV4dC1zaGFkb3c6MCAxcHggMnB4ICMwMDA7bGluZS1oZWlnaHQ6MTdweH0KICAjc3RhZ2V7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLXRvcDoxMHB4fQogICNnYW1le2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOjRweCBzb2xpZCAjMzMyNzBmO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kOiMzZjZiMjg7Y3Vyc29yOnBvaW50ZXJ9CiAgI2Jhbm5lcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzglO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKSBzY2FsZSgwKTtmb250LXNpemU6NDZweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OjkwMDtjb2xvcjojZmYzYjMwO3RleHQtc2hhZG93OjAgMnB4IDhweCAjMDAwLDAgMCAyNHB4ICNmZmIzMDA7CiAgICAgICAgICB0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMjVzIGVhc2U7cG9pbnRlci1ldmVudHM6bm9uZTt3aGl0ZS1zcGFjZTpub3dyYXA7bGV0dGVyLXNwYWNpbmc6MnB4fQogICNiYW5uZXIuc2hvd3t0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSkgc2NhbGUoMSl9CiAgI292ZXJsYXl7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMTAsMTQsNSwuNzIpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7CiAgICAgICAgICAganVzdGlmeS1jb250ZW50OmNlbnRlcjtib3JkZXItcmFkaXVzOjEwcHg7ei1pbmRleDo1fQogICNvdmVybGF5LmhpZGRlbntkaXNwbGF5Om5vbmV9CiAgI292Qm94e2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KCNmOWVlYzYsI2U4ZDQ5Yik7cGFkZGluZzoyOHB4IDQ0cHg7Ym9yZGVyLXJhZGl1czoxNnB4O3RleHQtYWxpZ246Y2VudGVyOwogICAgICAgICBtYXgtd2lkdGg6NTYwcHg7Ym94LXNoYWRvdzowIDEwcHggNDBweCByZ2JhKDAsMCwwLC42KX0KICAjb3ZUaXRsZXttYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjM0cHg7Y29sb3I6IzNkNmIxZjt0ZXh0LXNoYWRvdzowIDJweCAwICNmZmZ9CiAgI292VGV4dHttYXJnaW46MCAwIDE4cHg7Zm9udC1zaXplOjE1cHg7Y29sb3I6IzRhM2ExMDtsaW5lLWhlaWdodDoxLjg7dGV4dC1hbGlnbjpsZWZ0fQogICNvdkJ0bntmb250LXNpemU6MjJweDtmb250LXdlaWdodDo5MDA7cGFkZGluZzoxMHB4IDQ2cHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JvcmRlcjozcHggc29saWQgIzNkNmIxZjsKICAgICAgICAgYmFja2dyb3VuZDojN2FjNzRmO2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7dGV4dC1zaGFkb3c6MCAxcHggMnB4ICMwMDB9CiAgI292QnRuOmhvdmVye2JhY2tncm91bmQ6IzhlZGU1Zjt0cmFuc2Zvcm06c2NhbGUoMS4wNCl9CiAgI2hpbnR7Y29sb3I6I2NmZTNiMDtmb250LXNpemU6MTNweDttYXJnaW46OHB4IDAgMTZweDtvcGFjaXR5Oi44NX0KPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICA8ZGl2IGlkPSJ0b3BiYXIiPgogICAgPGRpdiBpZD0ic3VuYm94Ij48Y2FudmFzIGlkPSJzdW5JY29uIiB3aWR0aD0iMzQiIGhlaWdodD0iMzQiPjwvY2FudmFzPjxzcGFuIGlkPSJzdW5Db3VudCI+NzU8L3NwYW4+PC9kaXY+CiAgICA8ZGl2IGlkPSJzZWVkYmFyIj48L2Rpdj4KICAgIDxidXR0b24gY2xhc3M9InRidG4iIGlkPSJzaG92ZWxCdG4iIHRpdGxlPSLpk7LlrZDvvJrngrnlh7vlkI7np7vpmaTmpI3nianvvIjkuI3ov5Tov5jpmLPlhYnvvIkiPgogICAgICA8c3ZnIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgICAgICA8bGluZSB4MT0iNSIgeTE9IjE5IiB4Mj0iMTIuNSIgeTI9IjExLjUiIHN0cm9rZT0iIzhhNWEyYiIgc3Ryb2tlLXdpZHRoPSIzLjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogICAgICAgIDxwYXRoIGQ9Ik0xMS41IDEwLjUgQzE0LjUgNy41IDE3LjggNi4yIDIxIDYuMiBDMjEgOS42IDE5LjggMTIuOCAxNi44IDE1LjggTDEzLjUgMTIuNSBaIgogICAgICAgICAgICAgIGZpbGw9IiNiN2JlYzQiIHN0cm9rZT0iIzc4ODI4YSIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KICAgICAgPC9zdmc+CiAgICA8L2J1dHRvbj4KICAgIDxidXR0b24gY2xhc3M9InRidG4iIGlkPSJhdXRvQnRuIiB0aXRsZT0i6Ieq5Yqo5ou+5Y+W77ya5paw6Ziz5YWJ5Ye6546w5ZCO6Ieq5Yqo6aOe5YWl6LSm5oi3Ij7wn6eyIOiHquWKqOaLvuWPljwvYnV0dG9uPgogICAgPGJ1dHRvbiBjbGFzcz0idGJ0biIgaWQ9ImluZmluaXRlQnRuIiB0aXRsZT0i5peg6ZmQ6Ziz5YWJ77ya56eN5qSN5LiN5raI6ICX6Ziz5YWJIj7imb7vuI8g5peg6ZmQ6Ziz5YWJPC9idXR0b24+CiAgICA8YnV0dG9uIGNsYXNzPSJ0YnRuIiBpZD0ibXV0ZUJ0biIgdGl0bGU9Iumfs+aViOW8gOWFsyI+8J+UijwvYnV0dG9uPgogICAgPGJ1dHRvbiBjbGFzcz0idGJ0biIgaWQ9InBhdXNlQnRuIiB0aXRsZT0i5pqC5YGcIC8g57un57utIChQKSI+4o+4PC9idXR0b24+CiAgICA8ZGl2IGlkPSJwcm9ncmVzc1dyYXAiPjxkaXYgaWQ9InByb2dyZXNzRmlsbCI+PC9kaXY+PGRpdiBpZD0id2F2ZUxhYmVsIj7lh4blpIfkuK3igKY8L2Rpdj48L2Rpdj4KICA8L2Rpdj4KCiAgPGRpdiBpZD0ic3RhZ2UiPgogICAgPGNhbnZhcyBpZD0iZ2FtZSIgd2lkdGg9IjEwNjAiIGhlaWdodD0iNjQwIj48L2NhbnZhcz4KICAgIDxkaXYgaWQ9ImJhbm5lciI+PC9kaXY+CiAgICA8ZGl2IGlkPSJvdmVybGF5Ij4KICAgICAgPGRpdiBpZD0ib3ZCb3giPgogICAgICAgIDxoMSBpZD0ib3ZUaXRsZSI+8J+MuyDmpI3nianlpKfmiJjlg7XlsLgg8J+nnzwvaDE+CiAgICAgICAgPHAgaWQ9Im92VGV4dCI+CiAgICAgICAgICA8Yj7njqnms5Xor7TmmI48L2I+PGJyPgogICAgICAgICAgwrcg54K55Ye75Y2h54mH6YCJ5oup5qSN54mp77yM5YaN54K55Ye76I2J5Zyw56eN5qSN77yI5pWw5a2X6ZSuIDF+NiDlv6vpgJ/pgInmi6nvvIk8YnI+CiAgICAgICAgICDCtyDngrnlh7vmjonokL0gLyDnlJ/kuqfnmoQ8Yj7pmLPlhYk8L2I+5pS26ZuG6LWE5rqQPGJyPgogICAgICAgICAgwrcg56eN5ZCR5pel6JG15pSS57uP5rWO77yM6LGM6LGG5bCE5omL6Ziy5b6h77yM5Z2a5p6c5aKZ6Zi75oyh77yM5qix5qGD54K45by55pWR5oClPGJyPgogICAgICAgICAgwrcg5YO15bC456qB56C05LiA6KGM5pe277yM5bCP5o6o6L2m5Lya6Ieq5Yqo5riF5Zy677yI5q+P6KGM5LuF5LiA5qyh77yB77yJPGJyPgogICAgICAgICAgwrcg5Y+z6ZSuIC8gRXNjIOWPlua2iOmAieaLqe+8jOmTsuWtkOWPr+enu+mZpOakjeeJqe+8jFAg6ZSu5pqC5YGcPGJyPgogICAgICAgICAgwrcg5Z2a5oyB5L2PIDxiPjEwIOazojwvYj7lg7XlsLjov5vmlLvljbPlj6/ojrfog5zvvIE8YnI+CiAgICAgICAgICDCtyDpobbmoI8gPGI+8J+nsiDoh6rliqjmi77lj5Y8L2I+77yI6Ziz5YWJ6Ieq5Yqo6aOe5YWl6LSm5oi377yJ5LiOIDxiPuKZvu+4jyDml6DpmZDpmLPlhYk8L2I+77yI56eN5qSN5LiN5raI6ICX77yJ6ZqP5pe25byA5YWzCiAgICAgICAgPC9wPgogICAgICAgIDxidXR0b24gaWQ9Im92QnRuIj7lvIDlp4vmuLjmiI88L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KICA8ZGl2IGlkPSJoaW50Ij7ngrnlh7vljaHniYcg4oaSIOeCueWHu+iNieWcsOenjeakjSB8IOeCueWHu+mYs+WFieaUtumbhiB8IOWPs+mUri9Fc2Mg5Y+W5raIIHwgUCDmmoLlgZw8L2Rpdj4KCjxzY3JpcHQ+Cid1c2Ugc3RyaWN0JzsKLy8gPT09PT09PT09PT09PT09PT09PT09IOW4uOmHjyA9PT09PT09PT09PT09PT09PT09PT0KY29uc3QgVEFVID0gTWF0aC5QSSoyOwpjb25zdCBDT0xTPTksIFJPV1M9NSwgQ0VMTD0xMDAsIEdSSURfWD0xMDAsIEdSSURfWT03MDsKY29uc3QgQ1ZfVz0xMDYwLCBDVl9IPTY0MDsKCmNvbnN0IFBMQU5UUz17CiAgc3VuZmxvd2VyIDp7bmFtZTon5ZCR5pel6JG1JywgICBjb3N0OjUwLCAgaHA6MzAwLCAgY2Q6NywgIGRlc2M6J+Wumuacn+S6p+WHuumYs+WFiSd9LAogIHBlYXNob290ZXI6e25hbWU6J+ixjOixhuWwhOaJiycsIGNvc3Q6MTAwLCBocDozMDAsICBjZDo3LCAgZGVzYzon5ZCR5YmN5pa55Y+R5bCE6LGM6LGGJ30sCiAgc25vd3BlYSAgIDp7bmFtZTon5a+S5Yaw5bCE5omLJywgY29zdDoxNzUsIGhwOjMwMCwgIGNkOjcsICBkZXNjOiflhrDlvLnlh4/pgJ/lg7XlsLgnfSwKICByZXBlYXRlciAgOntuYW1lOiflj4zlj5HlsITmiYsnLCBjb3N0OjIwMCwgaHA6MzAwLCAgY2Q6NywgIGRlc2M6J+S4gOasoeWPkeWwhOS4pOmil+ixjOixhid9LAogIHdhbGxudXQgICA6e25hbWU6J+WdmuaenOWimScsICAgY29zdDo1MCwgIGhwOjMwMDAsIGNkOjIwLCBkZXNjOifpq5jooYDph4/pmLvmjKHlg7XlsLgnfSwKICBjaGVycnkgICAgOntuYW1lOifmqLHmoYPngrjlvLknLCBjb3N0OjE1MCwgaHA6OTk5OSwgY2Q6MjUsIGRlc2M6JzPDlzMg6IyD5Zu054iG54K4J30sCn07CmNvbnN0IFpUWVBFUz17CiAgbm9ybWFsOntocDoyMDAsIHNwZWVkOjE2LCBkbWc6MzV9LAogIGNvbmUgIDp7aHA6NjQwLCBzcGVlZDoxNiwgZG1nOjM1fSwKICBidWNrZXQ6e2hwOjEzMDAsc3BlZWQ6MTUsIGRtZzozNX0sCiAgcnVuICAgOntocDoxNTAsIHNwZWVkOjQ0LCBkbWc6MzV9LAp9Owpjb25zdCBXQVZFUz1bCiAgWydub3JtYWwnLCdub3JtYWwnXSwKICBbJ25vcm1hbCcsJ25vcm1hbCcsJ25vcm1hbCddLAogIFsnbm9ybWFsJywnY29uZScsJ25vcm1hbCcsJ25vcm1hbCddLAogIFsnbm9ybWFsJywnY29uZScsJ2NvbmUnLCdub3JtYWwnLCdub3JtYWwnLCdydW4nXSwKICBbJ25vcm1hbCcsJ25vcm1hbCcsJ2NvbmUnLCdjb25lJywnYnVja2V0Jywnbm9ybWFsJywnbm9ybWFsJywnY29uZScsJ25vcm1hbCddLCAgICAgICAgICAgIC8vIOWkp+azogogIFsnbm9ybWFsJywnY29uZScsJ2NvbmUnLCdidWNrZXQnLCdub3JtYWwnLCdydW4nLCdub3JtYWwnLCdjb25lJ10sCiAgWydjb25lJywnY29uZScsJ2J1Y2tldCcsJ25vcm1hbCcsJ25vcm1hbCcsJ3J1bicsJ3J1bicsJ25vcm1hbCcsJ2NvbmUnLCdub3JtYWwnXSwKICBbJ2J1Y2tldCcsJ2NvbmUnLCdjb25lJywnbm9ybWFsJywncnVuJywncnVuJywnYnVja2V0Jywnbm9ybWFsJywnY29uZScsJ25vcm1hbCcsJ2NvbmUnXSwKICBbJ2NvbmUnLCdidWNrZXQnLCdidWNrZXQnLCdydW4nLCdydW4nLCdjb25lJywnbm9ybWFsJywnbm9ybWFsJywnY29uZScsJ2NvbmUnLCdydW4nLCdub3JtYWwnXSwKICBbJ25vcm1hbCcsJ25vcm1hbCcsJ2NvbmUnLCdjb25lJywnYnVja2V0JywnYnVja2V0JywncnVuJywncnVuJywnY29uZScsJ25vcm1hbCcsJ2J1Y2tldCcsCiAgICdjb25lJywncnVuJywnY29uZScsJ25vcm1hbCcsJ2J1Y2tldCddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pyA57uI5aSn5rOiCl07CmNvbnN0IFRPVEFMPVdBVkVTLmxlbmd0aDsKCi8vID09PT09PT09PT09PT09PT09PT09PSBET00gPT09PT09PT09PT09PT09PT09PT09CmNvbnN0IGN2cz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2FtZScpLCBjdHg9Y3ZzLmdldENvbnRleHQoJzJkJyk7CmNvbnN0IHN1bkNvdW50RWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bkNvdW50Jyk7CmNvbnN0IHNlZWRiYXI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlZWRiYXInKTsKY29uc3Qgc2hvdmVsQnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaG92ZWxCdG4nKTsKY29uc3QgbXV0ZUJ0bj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXV0ZUJ0bicpOwpjb25zdCBwYXVzZUJ0bj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF1c2VCdG4nKTsKY29uc3QgYXV0b0J0bj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0b0J0bicpOwpjb25zdCBpbmZpbml0ZUJ0bj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5maW5pdGVCdG4nKTsKY29uc3QgcHJvZ3Jlc3NGaWxsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9ncmVzc0ZpbGwnKTsKY29uc3Qgd2F2ZUxhYmVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3YXZlTGFiZWwnKTsKY29uc3QgYmFubmVyRWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jhbm5lcicpOwpjb25zdCBvdmVybGF5PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdmVybGF5Jyk7CmNvbnN0IG92VGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ292VGl0bGUnKTsKY29uc3Qgb3ZUZXh0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdlRleHQnKTsKY29uc3Qgb3ZCdG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ292QnRuJyk7CgovLyA9PT09PT09PT09PT09PT09PT09PT0g6Z+z5pWIID09PT09PT09PT09PT09PT09PT09PQpsZXQgQUM9bnVsbCwgbXV0ZWQ9ZmFsc2U7CmZ1bmN0aW9uIHNmeChmLGQsdHlwZSx2LGYyKXsKICBpZihtdXRlZCkgcmV0dXJuOwogIHRyeXsKICAgIEFDPUFDfHxuZXcgKHdpbmRvdy5BdWRpb0NvbnRleHR8fHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKCk7CiAgICBjb25zdCBvPUFDLmNyZWF0ZU9zY2lsbGF0b3IoKSwgZz1BQy5jcmVhdGVHYWluKCksIHQwPUFDLmN1cnJlbnRUaW1lOwogICAgby50eXBlPXR5cGV8fCdzaW5lJzsgby5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUoZix0MCk7CiAgICBpZihmMikgby5mcmVxdWVuY3kuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZShmMix0MCtkKTsKICAgIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2fHwwLjE1LHQwKTsKICAgIGcuZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMDAxLHQwK2QpOwogICAgby5jb25uZWN0KGcpOyBnLmNvbm5lY3QoQUMuZGVzdGluYXRpb24pOwogICAgby5zdGFydCh0MCk7IG8uc3RvcCh0MCtkKTsKICB9Y2F0Y2goZSl7fQp9CmZ1bmN0aW9uIGppbmdsZShub3RlcyxzdGVwLHR5cGUpewogIG5vdGVzLmZvckVhY2goKGYsaSk9PnNldFRpbWVvdXQoKCk9PnNmeChmLHN0ZXAqMS43LHR5cGV8fCd0cmlhbmdsZScsMC4xNiksaSpzdGVwKjEwMDApKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09IOeKtuaAgSA9PT09PT09PT09PT09PT09PT09PT0KbGV0IFM9bnVsbDsKbGV0IGF1dG9QaWNrPWZhbHNlLCBpbmZpbml0ZVN1bj1mYWxzZTsKZnVuY3Rpb24gbmV3R2FtZSgpewogIFM9ewogICAgc3VuOjc1LAogICAgZ3JpZDpBcnJheS5mcm9tKHtsZW5ndGg6Uk9XU30sKCk9PkFycmF5KENPTFMpLmZpbGwobnVsbCkpLAogICAgem9tYmllczpbXSwgcGVhczpbXSwgc3VuczpbXSwgcGFydHM6W10sIGJvb21zOltdLAogICAgbW93ZXJzOkFycmF5LmZyb20oe2xlbmd0aDpST1dTfSwoXyxyKT0+KHtyb3c6cix4OjUyLG9uOmZhbHNlLHVzZWQ6ZmFsc2V9KSksCiAgICB3YXZlOjAsIHF1ZXVlOltdLCBpbldhdmU6ZmFsc2UsIHdhdmVDbGVhclQ6OSwgc3Bhd25UOjAsCiAgICBzcGF3bmVkSW5XYXZlOjAsIGtpbGxlZEluV2F2ZTowLAogICAgc2t5VDo1LCBzZWxlY3RlZDpudWxsLCBzaG92ZWw6ZmFsc2UsIGhvdmVyOm51bGwsCiAgICB0aW1lOjAsIHBhdXNlZDpmYWxzZSwgb3ZlcjpmYWxzZSwgc3RhcnRlZDpmYWxzZSwKICAgIHNoYWtlOjAsIGNvb2xkb3duczp7fSwKICB9OwogIGZvcihjb25zdCBrIGluIFBMQU5UUykgUy5jb29sZG93bnNba109MDsKICBzZXRDYXJkc1NlbCgpOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT0g5bel5YW3ID09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBycihnLHgseSx3LGgscil7CiAgZy5iZWdpblBhdGgoKTsKICBnLm1vdmVUbyh4K3IseSk7CiAgZy5hcmNUbyh4K3cseSx4K3cseStoLHIpOwogIGcuYXJjVG8oeCt3LHkraCx4LHkraCxyKTsKICBnLmFyY1RvKHgseStoLHgseSxyKTsKICBnLmFyY1RvKHgseSx4K3cseSxyKTsKICBnLmNsb3NlUGF0aCgpOwp9CmZ1bmN0aW9uIHNodWZmbGUoYSl7CiAgZm9yKGxldCBpPWEubGVuZ3RoLTE7aT4wO2ktLSl7Y29uc3Qgaj0oTWF0aC5yYW5kb20oKSooaSsxKSl8MDtbYVtpXSxhW2pdXT1bYVtqXSxhW2ldXTt9CiAgcmV0dXJuIGE7Cn0KZnVuY3Rpb24gcHVmZih4LHksY29sb3IsbixzcGQpewogIGZvcihsZXQgaT0wO2k8KG58fDgpO2krKyl7CiAgICBjb25zdCBhPU1hdGgucmFuZG9tKCkqVEFVLCBzPShzcGR8fDgwKSooMC40K01hdGgucmFuZG9tKCkqMC44KTsKICAgIFMucGFydHMucHVzaCh7eCx5LHZ4Ok1hdGguY29zKGEpKnMsdnk6TWF0aC5zaW4oYSkqcy00MCxsaWZlOjAuNCtNYXRoLnJhbmRvbSgpKjAuMzUsCiAgICAgICAgICAgICAgICAgIHI6MitNYXRoLnJhbmRvbSgpKjMuNSxjb2xvcn0pOwogIH0KfQpmdW5jdGlvbiBjZWxsQXQoZSl7CiAgY29uc3Qgcj1jdnMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgY29uc3QgeD0oZS5jbGllbnRYLXIubGVmdCkqQ1ZfVy9yLndpZHRoLCB5PShlLmNsaWVudFktci50b3ApKkNWX0gvci5oZWlnaHQ7CiAgY29uc3QgY29sPU1hdGguZmxvb3IoKHgtR1JJRF9YKS9DRUxMKSwgcm93PU1hdGguZmxvb3IoKHktR1JJRF9ZKS9DRUxMKTsKICByZXR1cm4ge3gseSxjb2w6KGNvbD49MCYmY29sPENPTFMpP2NvbDpudWxsLHJvdzoocm93Pj0wJiZyb3c8Uk9XUyk/cm93Om51bGx9Owp9CmZ1bmN0aW9uIHNob3dCYW5uZXIodGV4dCxtcyl7CiAgYmFubmVyRWwudGV4dENvbnRlbnQ9dGV4dDsKICBiYW5uZXJFbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgY2xlYXJUaW1lb3V0KHNob3dCYW5uZXIuX3QpOwogIHNob3dCYW5uZXIuX3Q9c2V0VGltZW91dCgoKT0+YmFubmVyRWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpLG1zfHwyNjAwKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09IOWNoeeJhyA9PT09PT09PT09PT09PT09PT09PT0KY29uc3QgY2FyZHM9e307CmZ1bmN0aW9uIGJ1aWxkQ2FyZHMoKXsKICBzZWVkYmFyLmlubmVySFRNTD0nJzsKICBjb25zdCBrZXlzPU9iamVjdC5rZXlzKFBMQU5UUyk7CiAga2V5cy5mb3JFYWNoKChrZXksaSk9PnsKICAgIGNvbnN0IHA9UExBTlRTW2tleV07CiAgICBjb25zdCBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZC5jbGFzc05hbWU9J2NhcmQnOwogICAgZC50aXRsZT1wLm5hbWUrJ++8iCcrcC5jb3N0Kycg6Ziz5YWJ77yJJytwLmRlc2MrJyAgW+W/q+aNt+mUriAnKyhpKzEpKyddJzsKICAgIGNvbnN0IGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGMud2lkdGg9NTI7IGMuaGVpZ2h0PTU0OwogICAgY29uc3QgY29zdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgY29zdC5jbGFzc05hbWU9J2Nvc3QnOyBjb3N0LnRleHRDb250ZW50PXAuY29zdDsKICAgIGNvbnN0IGNkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBjZC5jbGFzc05hbWU9J2NkJzsKICAgIGQuYXBwZW5kQ2hpbGQoYyk7IGQuYXBwZW5kQ2hpbGQoY29zdCk7IGQuYXBwZW5kQ2hpbGQoY2QpOwogICAgZC5vbmNsaWNrPSgpPT57CiAgICAgIGlmKCFTLnN0YXJ0ZWR8fFMub3ZlcikgcmV0dXJuOwogICAgICBTLnNob3ZlbD1mYWxzZTsgc2hvdmVsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ29uJyk7CiAgICAgIGlmKFMuc2VsZWN0ZWQ9PT1rZXkpeyBTLnNlbGVjdGVkPW51bGw7IHNldENhcmRzU2VsKCk7IHJldHVybjsgfQogICAgICBpZigoaW5maW5pdGVTdW58fFMuc3VuPj1wLmNvc3QpICYmIFMuY29vbGRvd25zW2tleV08PTApewogICAgICAgIFMuc2VsZWN0ZWQ9a2V5OyBzZngoNjIwLC4wNiwnc2luZScsLjA4KTsgc2V0Q2FyZHNTZWwoKTsKICAgICAgfWVsc2V7CiAgICAgICAgZC5jbGFzc0xpc3QuYWRkKCdzaGFrZScpOyBzZXRUaW1lb3V0KCgpPT5kLmNsYXNzTGlzdC5yZW1vdmUoJ3NoYWtlJyksMzIwKTsKICAgICAgICBzZngoMTYwLC4xLCdzcXVhcmUnLC4wNik7CiAgICAgIH0KICAgIH07CiAgICBzZWVkYmFyLmFwcGVuZENoaWxkKGQpOwogICAgY29uc3QgZz1jLmdldENvbnRleHQoJzJkJyk7CiAgICBnLnNhdmUoKTsgZy50cmFuc2xhdGUoMjYsNDApOyBnLnNjYWxlKDAuNTUsMC41NSk7CiAgICBkcmF3UGxhbnQoZyx7a2luZDprZXksaHA6MSxtYXhIcDoxLGJvcm46MCxyZWNvaWw6MCxmdXNlOjksaHVydFQ6MH0sMC42KTsKICAgIGcucmVzdG9yZSgpOwogICAgY2FyZHNba2V5XT17ZWw6ZCxjZH07CiAgfSk7Cn0KZnVuY3Rpb24gc2V0Q2FyZHNTZWwoKXsKICBmb3IoY29uc3QgayBpbiBjYXJkcykgY2FyZHNba10uZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc2VsJyxTLnNlbGVjdGVkPT09ayk7Cn0KZnVuY3Rpb24gcmVmcmVzaENhcmRzKCl7CiAgc3VuQ291bnRFbC50ZXh0Q29udGVudD1pbmZpbml0ZVN1bj8n4oieJzpTLnN1bjsKICBmb3IoY29uc3QgayBpbiBjYXJkcyl7CiAgICBjb25zdCBwPVBMQU5UU1trXTsKICAgIGNhcmRzW2tdLmNkLnN0eWxlLmhlaWdodD0oUy5jb29sZG93bnNba10vcC5jZCoxMDApKyclJzsKICAgIGNhcmRzW2tdLmVsLmNsYXNzTGlzdC50b2dnbGUoJ29mZicsKCFpbmZpbml0ZVN1biYmUy5zdW48cC5jb3N0KXx8Uy5jb29sZG93bnNba10+MCk7CiAgfQp9CgovLyA9PT09PT09PT09PT09PT09PT09PT0g56eN5qSNIC8g6ZOy6ZmkID09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiB0cnlQbGFudChrZXksY29sLHJvdyl7CiAgY29uc3QgcD1QTEFOVFNba2V5XTsKICBpZihTLmdyaWRbcm93XVtjb2xdfHwoIWluZmluaXRlU3VuJiZTLnN1bjxwLmNvc3QpfHxTLmNvb2xkb3duc1trZXldPjApIHJldHVybjsKICBpZighaW5maW5pdGVTdW4pIFMuc3VuLT1wLmNvc3Q7CiAgUy5jb29sZG93bnNba2V5XT1wLmNkOwogIFMuZ3JpZFtyb3ddW2NvbF09ewogICAga2luZDprZXksaHA6cC5ocCxtYXhIcDpwLmhwLHNob290VDowLjUscHJvZFQ6NCtNYXRoLnJhbmRvbSgpKjMsCiAgICByZWNvaWw6MCxodXJ0VDowLGJvcm46Uy50aW1lLGZ1c2U6MS4xNSwKICB9OwogIHB1ZmYoR1JJRF9YK2NvbCpDRUxMKzUwLEdSSURfWStyb3cqQ0VMTCs3MCwnIzZhYmY0MycsNyw3MCk7CiAgc2Z4KDE5MCwuMTIsJ3NpbmUnLC4xNiwxMjApOwogIFMuc2VsZWN0ZWQ9bnVsbDsgc2V0Q2FyZHNTZWwoKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09IOS8pOWusyAvIOeIhueCuCA9PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gZGFtYWdlWm9tYmllKHosZCl7CiAgaWYoei5kZWFkKSByZXR1cm47CiAgei5ocC09ZDsgei5oaXRUPTAuMTsKICBpZih6LmhwPD0wKXsKICAgIHouZGVhZD10cnVlOyB6LmRlYXRoVD0wOyBTLmtpbGxlZEluV2F2ZSsrOwogICAgcHVmZih6LngsR1JJRF9ZK3oucm93KkNFTEwrNDUsJyM3YThhNWEnLDYsOTApOwogIH0KfQpmdW5jdGlvbiBleHBsb2RlKHJvdyxjb2wpewogIGNvbnN0IHg9R1JJRF9YK2NvbCpDRUxMKzUwLCB5PUdSSURfWStyb3cqQ0VMTCs1MDsKICBTLmJvb21zLnB1c2goe3gseSx0OjB9KTsKICBTLnNoYWtlPTAuNDsKICBwdWZmKHgseSwnI2ZmOGMwMCcsMTgsMjIwKTsgcHVmZih4LHksJyM1NTU1NTUnLDEwLDEyMCk7CiAgc2Z4KDcwLC41LCdzYXd0b290aCcsLjMsMzYpOwogIGZvcihjb25zdCB6IG9mIFMuem9tYmllcyl7CiAgICBpZighei5kZWFkICYmIE1hdGguYWJzKHoueC14KTwxNjAgJiYgTWF0aC5hYnMoR1JJRF9ZK3oucm93KkNFTEwrNTAteSk8MTYwKSBkYW1hZ2Vab21iaWUoeiwxODAwKTsKICB9Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PSDpmLPlhYkgPT09PT09PT09PT09PT09PT09PT09CmZ1bmN0aW9uIHNwYXduU2t5U3VuKCl7CiAgUy5zdW5zLnB1c2goe3g6R1JJRF9YKzMwK01hdGgucmFuZG9tKCkqODQwLHk6LTMwLHR5OkdSSURfWSs0MCtNYXRoLnJhbmRvbSgpKjQzMCwKICAgICAgICAgICAgICAgc3RhdGU6J2ZhbGwnLGFnZTowLHZhbHVlOjI1LHZ4OjAsdnk6MH0pOwp9CmZ1bmN0aW9uIHNwYXduRmxvd2VyU3VuKHJvdyxjb2wpewogIGNvbnN0IHB4PUdSSURfWCtjb2wqQ0VMTCs1MCwgcHk9R1JJRF9ZK3JvdypDRUxMKzYyOwogIFMuc3Vucy5wdXNoKHt4OnB4LHk6cHktNDYsdHk6cHktNCx2eDooTWF0aC5yYW5kb20oKS0wLjUpKjUwLHZ5Oi03MCwKICAgICAgICAgICAgICAgc3RhdGU6J2hvcCcsYWdlOjAsdmFsdWU6MjV9KTsKfQpmdW5jdGlvbiBjb2xsZWN0U3VuKHMpeyBzLnN0YXRlPSdmbHknOyB9CgovLyA9PT09PT09PT09PT09PT09PT09PT0g5YO15bC4IC8g5rOi5qyhID09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBzcGF3blpvbWJpZSh0eXBlKXsKICBjb25zdCBkPVpUWVBFU1t0eXBlXTsKICBTLnpvbWJpZXMucHVzaCh7CiAgICB0eXBlLHJvdzooTWF0aC5yYW5kb20oKSpST1dTKXwwLHg6Q1ZfVyszMCtNYXRoLnJhbmRvbSgpKjYwLAogICAgaHA6ZC5ocCxtYXhIcDpkLmhwLHNwZWVkOmQuc3BlZWQqKDAuOStNYXRoLnJhbmRvbSgpKjAuMjUpLGRtZzpkLmRtZywKICAgIGFuaW06TWF0aC5yYW5kb20oKSoxMCxlYXRUOjAsc2xvd1Q6MCxoaXRUOjAsZGVhZDpmYWxzZSxkZWF0aFQ6MCxlYXRpbmc6ZmFsc2UsCiAgfSk7CiAgaWYoTWF0aC5yYW5kb20oKTwwLjM1KSBzZngoNzUsLjM1LCdzYXd0b290aCcsLjA1LDU1KTsKfQpmdW5jdGlvbiBzdGFydFdhdmUoKXsKICBTLndhdmUrKzsKICBTLmluV2F2ZT10cnVlOyBTLnNwYXduZWRJbldhdmU9MDsgUy5raWxsZWRJbldhdmU9MDsKICBTLnF1ZXVlPXNodWZmbGUoV0FWRVNbUy53YXZlLTFdLnNsaWNlKCkpOwogIGNvbnN0IGJpZz0oUy53YXZlPT09NXx8Uy53YXZlPT09VE9UQUwpOwogIHNob3dCYW5uZXIoYmlnPyfkuIDlpKfms6Llg7XlsLjmraPlnKjmjqXov5HvvIEnOifnrKwgJytTLndhdmUrJyDms6InKTsKICBpZihiaWcpeyBzZngoNTUsLjksJ3Nhd3Rvb3RoJywuMjgsNDApOyBTLnNwYXduVD0xLjY7IH0gZWxzZSBTLnNwYXduVD0yLjY7Cn0KZnVuY3Rpb24gdXBkYXRlV2F2ZXMoZHQpewogIGlmKCFTLmluV2F2ZSl7CiAgICBTLndhdmVDbGVhclQtPWR0OwogICAgaWYoUy53YXZlQ2xlYXJUPD0wKSBzdGFydFdhdmUoKTsKICB9ZWxzZXsKICAgIGlmKFMucXVldWUubGVuZ3RoKXsKICAgICAgUy5zcGF3blQtPWR0OwogICAgICBpZihTLnNwYXduVDw9MCl7CiAgICAgICAgc3Bhd25ab21iaWUoUy5xdWV1ZS5wb3AoKSk7CiAgICAgICAgUy5zcGF3bmVkSW5XYXZlKys7CiAgICAgICAgY29uc3QgYmlnPShTLndhdmU9PT01fHxTLndhdmU9PT1UT1RBTCk7CiAgICAgICAgUy5zcGF3blQ9YmlnPygwLjQrTWF0aC5yYW5kb20oKSowLjgpOigxLjArTWF0aC5yYW5kb20oKSoxLjYpOwogICAgICB9CiAgICB9ZWxzZSBpZihTLnpvbWJpZXMubGVuZ3RoPT09MCl7CiAgICAgIFMuaW5XYXZlPWZhbHNlOwogICAgICBpZihTLndhdmU+PVRPVEFMKXsgd2luKCk7IHJldHVybjsgfQogICAgICBTLndhdmVDbGVhclQ9NC41OwogICAgICBzaG93QmFubmVyKCfnrKwgJytTLndhdmUrJyDms6Llt7LmuIXpmaTvvIEnLDE4MDApOwogICAgfQogIH0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT09IOiDnOi0nyA9PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gd2luKCl7CiAgaWYoUy5vdmVyKSByZXR1cm47CiAgUy5vdmVyPXRydWU7CiAgb3ZUaXRsZS50ZXh0Q29udGVudD0n8J+OiSDog5zliKnvvIEnOwogIG92VGV4dC5pbm5lckhUTUw9J+S9oOWuiOS9j+S6humZouWtkO+8jOaIkOWKn+aKteW+oeS6huWFqOmDqCA8Yj4nK1RPVEFMKyc8L2I+IOazouWDteWwuOi/m+aUu++8gTxicj7mlLbojrfpmLPlhYnvvJonK1Muc3VuKycgwrcg5Ymp5L2Z5bCP5o6o6L2m77yaJytTLm1vd2Vycy5maWx0ZXIobT0+IW0udXNlZCkubGVuZ3RoOwogIG92QnRuLnRleHRDb250ZW50PSflho3njqnkuIDmrKEnOwogIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7CiAgamluZ2xlKFs1MjMsNjU5LDc4NCwxMDQ2LDc4NCwxMDQ2XSk7Cn0KZnVuY3Rpb24gbG9zZSgpewogIGlmKFMub3ZlcikgcmV0dXJuOwogIFMub3Zlcj10cnVlOwogIG92VGl0bGUudGV4dENvbnRlbnQ9J/CfkoAg5ri45oiP57uT5p2fJzsKICBvdlRleHQuaW5uZXJIVE1MPSc8Yj7lg7XlsLjlkIPmjonkuobkvaDnmoTohJHlrZDvvIE8L2I+PGJyPuWdmuaMgeWIsOS6huesrCAnK1Mud2F2ZSsnIOazou+8jOWGjeaOpeWGjeWOie+8gSc7CiAgb3ZCdG4udGV4dENvbnRlbnQ9J+mHjeaWsOW8gOWniyc7CiAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKICBqaW5nbGUoWzM5MiwzMzAsMjYyLDE5NiwxMzFdLCcwLjE2Jywnc2F3dG9vdGgnKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09IOabtOaWsCA9PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gdXBkYXRlKGR0KXsKICAvLyDlhrfljbQgJiDlpKnpmY3pmLPlhYkKICBmb3IoY29uc3QgayBpbiBTLmNvb2xkb3ducykgUy5jb29sZG93bnNba109TWF0aC5tYXgoMCxTLmNvb2xkb3duc1trXS1kdCk7CiAgUy5za3lULT1kdDsKICBpZihTLnNreVQ8PTApeyBzcGF3blNreVN1bigpOyBTLnNreVQ9NytNYXRoLnJhbmRvbSgpKjQ7IH0KCiAgdXBkYXRlV2F2ZXMoZHQpOwogIHVwZGF0ZVBsYW50cyhkdCk7CiAgdXBkYXRlUGVhcyhkdCk7CiAgdXBkYXRlWm9tYmllcyhkdCk7CiAgdXBkYXRlTW93ZXJzKGR0KTsKICB1cGRhdGVTdW5zKGR0KTsKCiAgZm9yKGNvbnN0IGIgb2YgUy5ib29tcykgYi50Kz1kdDsKICBTLmJvb21zPVMuYm9vbXMuZmlsdGVyKGI9PmIudDwwLjU1KTsKICBmb3IoY29uc3QgcCBvZiBTLnBhcnRzKXsgcC54Kz1wLnZ4KmR0OyBwLnkrPXAudnkqZHQ7IHAudnkrPTIyMCpkdDsgcC5saWZlLT1kdDsgfQogIFMucGFydHM9Uy5wYXJ0cy5maWx0ZXIocD0+cC5saWZlPjApOwogIFMuc2hha2U9TWF0aC5tYXgoMCxTLnNoYWtlLWR0KTsKfQoKZnVuY3Rpb24gdXBkYXRlUGxhbnRzKGR0KXsKICBmb3IobGV0IHI9MDtyPFJPV1M7cisrKWZvcihsZXQgYz0wO2M8Q09MUztjKyspewogICAgY29uc3QgcD1TLmdyaWRbcl1bY107IGlmKCFwKSBjb250aW51ZTsKICAgIHAuaHVydFQ9TWF0aC5tYXgoMCxwLmh1cnRULWR0KTsKICAgIGlmKHAua2luZD09PSdzdW5mbG93ZXInKXsKICAgICAgcC5wcm9kVC09ZHQ7CiAgICAgIGlmKHAucHJvZFQ8PTApeyBwLnByb2RUPTkrTWF0aC5yYW5kb20oKSoyOyBzcGF3bkZsb3dlclN1bihyLGMpOyB9CiAgICB9ZWxzZSBpZihwLmtpbmQ9PT0nY2hlcnJ5Jyl7CiAgICAgIHAuZnVzZS09ZHQ7CiAgICAgIGlmKHAuZnVzZTw9MCl7IFMuZ3JpZFtyXVtjXT1udWxsOyBleHBsb2RlKHIsYyk7IH0KICAgIH1lbHNlIGlmKHAua2luZD09PSdwZWFzaG9vdGVyJ3x8cC5raW5kPT09J3Nub3dwZWEnfHxwLmtpbmQ9PT0ncmVwZWF0ZXInKXsKICAgICAgcC5yZWNvaWw9TWF0aC5tYXgoMCxwLnJlY29pbC1kdCk7CiAgICAgIHAuc2hvb3RULT1kdDsKICAgICAgY29uc3QgcHg9R1JJRF9YK2MqQ0VMTCs1MDsKICAgICAgY29uc3QgaGFzPVMuem9tYmllcy5zb21lKHo9PiF6LmRlYWQmJnoucm93PT09ciYmei54PnB4LTMwJiZ6Lng8Q1ZfVys0MCk7CiAgICAgIGlmKGhhcyYmcC5zaG9vdFQ8PTApewogICAgICAgIHAuc2hvb3RUPTEuNDsgcC5yZWNvaWw9MC4xNTsKICAgICAgICBjb25zdCBweT1HUklEX1krcipDRUxMKzQyOwogICAgICAgIFMucGVhcy5wdXNoKHt4OnB4KzI4LHk6cHkscm93OnIsc25vdzpwLmtpbmQ9PT0nc25vd3BlYScsZGVsYXk6MCxnb25lOmZhbHNlfSk7CiAgICAgICAgaWYocC5raW5kPT09J3JlcGVhdGVyJykgUy5wZWFzLnB1c2goe3g6cHgrMjgseTpweSxyb3c6cixzbm93OmZhbHNlLGRlbGF5OjAuMTgsZ29uZTpmYWxzZX0pOwogICAgICAgIHNmeCg1MjAsLjA1LCdzcXVhcmUnLC4wNDUsMzgwKTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gdXBkYXRlUGVhcyhkdCl7CiAgZm9yKGNvbnN0IHAgb2YgUy5wZWFzKXsKICAgIGlmKHAuZGVsYXk+MCl7IHAuZGVsYXktPWR0OyBjb250aW51ZTsgfQogICAgcC54Kz0zODAqZHQ7CiAgICBsZXQgaGl0PW51bGw7CiAgICBmb3IoY29uc3QgeiBvZiBTLnpvbWJpZXMpewogICAgICBpZighei5kZWFkJiZ6LnJvdz09PXAucm93JiZNYXRoLmFicyh6LngtcC54KTwzMCl7IGlmKCFoaXR8fHoueDxoaXQueCkgaGl0PXo7IH0KICAgIH0KICAgIGlmKGhpdCl7CiAgICAgIGRhbWFnZVpvbWJpZShoaXQsMjApOwogICAgICBpZihwLnNub3cpIGhpdC5zbG93VD00OwogICAgICBwdWZmKHAueCxwLnkscC5zbm93PycjYWVlOGZmJzonIzlhZGY0ZicsNSw2MCk7CiAgICAgIHAuZ29uZT10cnVlOwogICAgICBzZngoMjEwLC4wNCwnc3F1YXJlJywuMDUsMTUwKTsKICAgIH0KICAgIGlmKHAueD5DVl9XKzMwKSBwLmdvbmU9dHJ1ZTsKICB9CiAgUy5wZWFzPVMucGVhcy5maWx0ZXIocD0+IXAuZ29uZSk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVpvbWJpZXMoZHQpewogIGZvcihjb25zdCB6IG9mIFMuem9tYmllcyl7CiAgICBpZih6LmRlYWQpeyB6LmRlYXRoVCs9ZHQ7IGNvbnRpbnVlOyB9CiAgICB6LmhpdFQ9TWF0aC5tYXgoMCx6LmhpdFQtZHQpOwogICAgaWYoei5zbG93VD4wKSB6LnNsb3dULT1kdDsKICAgIGNvbnN0IHNmPXouc2xvd1Q+MD8wLjQ1OjE7CiAgICB6LmVhdGluZz1mYWxzZTsKICAgIGNvbnN0IGZyb250PXoueC0yNjsKICAgIGNvbnN0IGNvbD1NYXRoLmZsb29yKChmcm9udC1HUklEX1gpL0NFTEwpOwogICAgbGV0IHBsYW50PW51bGw7CiAgICBpZihjb2w+PTAmJmNvbDxDT0xTKSBwbGFudD1TLmdyaWRbei5yb3ddW2NvbF07CiAgICBpZihwbGFudCYmZnJvbnQ8PUdSSURfWCtjb2wqQ0VMTCtDRUxMKjAuNzUpewogICAgICB6LmVhdGluZz10cnVlOyB6LmFuaW0rPWR0KjAuNjsKICAgICAgei5lYXRULT1kdDsKICAgICAgaWYoei5lYXRUPD0wKXsKICAgICAgICB6LmVhdFQ9MC42OyBwbGFudC5ocC09ei5kbWc7IHBsYW50Lmh1cnRUPTAuMTU7CiAgICAgICAgc2Z4KDE0MCwuMDgsJ3NxdWFyZScsLjA2LDkwKTsKICAgICAgICBpZihwbGFudC5ocDw9MCl7CiAgICAgICAgICBTLmdyaWRbei5yb3ddW2NvbF09bnVsbDsKICAgICAgICAgIHB1ZmYoR1JJRF9YK2NvbCpDRUxMKzUwLEdSSURfWSt6LnJvdypDRUxMKzYwLCcjNGE4ZjJmJywxMCwxMjApOwogICAgICAgIH0KICAgICAgfQogICAgfWVsc2V7CiAgICAgIHouYW5pbSs9ZHQqc2Y7CiAgICAgIHoueC09ei5zcGVlZCpzZipkdDsKICAgIH0KICAgIGlmKHoueDxHUklEX1gtNCl7CiAgICAgIGNvbnN0IG09Uy5tb3dlcnNbei5yb3ddOwogICAgICBpZighbS51c2VkKXsgbS51c2VkPXRydWU7IG0ub249dHJ1ZTsgc2Z4KDExMCwuNTUsJ3Nhd3Rvb3RoJywuMiw2MCk7IH0KICAgICAgZWxzZSBpZih6Lng8R1JJRF9YLTcwKXsgbG9zZSgpOyB9CiAgICB9CiAgfQogIFMuem9tYmllcz1TLnpvbWJpZXMuZmlsdGVyKHo9PiF6LmRlYWR8fHouZGVhdGhUPDAuOSk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZU1vd2VycyhkdCl7CiAgZm9yKGNvbnN0IG0gb2YgUy5tb3dlcnMpewogICAgaWYoIW0ub24pIGNvbnRpbnVlOwogICAgbS54Kz0zNDAqZHQ7CiAgICBmb3IoY29uc3QgeiBvZiBTLnpvbWJpZXMpewogICAgICBpZighei5kZWFkJiZ6LnJvdz09PW0ucm93JiZ6Lng8bS54KzUwKSBkYW1hZ2Vab21iaWUoeiw5OTk5OSk7CiAgICB9CiAgICBpZihtLng+Q1ZfVys4MCkgbS5vbj1mYWxzZTsKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVN1bnMoZHQpewogIGZvcihjb25zdCBzIG9mIFMuc3Vucyl7CiAgICBzLmFnZSs9ZHQ7CiAgICBpZihhdXRvUGljayYmcy5zdGF0ZSE9PSdmbHknJiZzLmFnZT4wLjkpIHMuc3RhdGU9J2ZseSc7CiAgICBpZihzLnN0YXRlPT09J2ZhbGwnKXsKICAgICAgcy55Kz0zOCpkdDsgcy54Kz1NYXRoLnNpbihzLmFnZSoyKSo4KmR0OwogICAgICBpZihzLnk+PXMudHkpIHMuc3RhdGU9J3N0aWxsJzsKICAgIH1lbHNlIGlmKHMuc3RhdGU9PT0naG9wJyl7CiAgICAgIHMudnkrPTM0MCpkdDsgcy54Kz1zLnZ4KmR0OyBzLnkrPXMudnkqZHQ7CiAgICAgIGlmKHMudnk+MCYmcy55Pj1zLnR5KSBzLnN0YXRlPSdzdGlsbCc7CiAgICB9ZWxzZSBpZihzLnN0YXRlPT09J3N0aWxsJyl7CiAgICAgIGlmKHMuYWdlPjEwKSBzLmdvbmU9dHJ1ZTsKICAgIH1lbHNlIGlmKHMuc3RhdGU9PT0nZmx5Jyl7CiAgICAgIGNvbnN0IHR4PTU2LHR5PTE2LGR4PXR4LXMueCxkeT10eS1zLnksZD1NYXRoLmh5cG90KGR4LGR5KSxzcD0xMTAwKmR0OwogICAgICBpZihkPHNwKzYpewogICAgICAgIFMuc3VuKz1zLnZhbHVlOyBzLmdvbmU9dHJ1ZTsKICAgICAgICBzZngoODgwLC4xMiwnc2luZScsLjE1LDE1MDApOwogICAgICB9ZWxzZXsgcy54Kz1keC9kKnNwOyBzLnkrPWR5L2Qqc3A7IH0KICAgIH0KICAgIGlmKHMuYWdlPjE2JiZzLnN0YXRlIT09J2ZseScpIHMuZ29uZT10cnVlOwogIH0KICBTLnN1bnM9Uy5zdW5zLmZpbHRlcihzPT4hcy5nb25lKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09IOe7mOWItiA9PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gZHJhd0xhd24oKXsKICBjdHguZmlsbFN0eWxlPScjM2Y2YjI4JzsgY3R4LmZpbGxSZWN0KDAsMCxDVl9XLENWX0gpOwogIGZvcihsZXQgcj0wO3I8Uk9XUztyKyspZm9yKGxldCBjPTA7YzxDT0xTO2MrKyl7CiAgICBjdHguZmlsbFN0eWxlPShyK2MpJTI/JyM3OWJmNGUnOicjODZjZDU4JzsKICAgIGN0eC5maWxsUmVjdChHUklEX1grYypDRUxMLEdSSURfWStyKkNFTEwsQ0VMTCxDRUxMKTsKICB9CiAgY3R4LmZpbGxTdHlsZT0nIzhhNmEzYyc7IGN0eC5maWxsUmVjdCgwLEdSSURfWSxHUklEX1gsUk9XUypDRUxMKTsKICBjdHguZmlsbFN0eWxlPScjNzU1NzJmJzsgY3R4LmZpbGxSZWN0KEdSSURfWC04LEdSSURfWSw4LFJPV1MqQ0VMTCk7CiAgY3R4LmZpbGxTdHlsZT0ncmdiYSgwLDAsMCwuMTQpJzsgY3R4LmZpbGxSZWN0KDAsR1JJRF9ZK1JPV1MqQ0VMTCxDVl9XLENWX0gtR1JJRF9ZLVJPV1MqQ0VMTCk7Cn0KCmZ1bmN0aW9uIGRyYXdQbGFudChnLHAsdCl7CiAgY29uc3Qgc3dheT1NYXRoLnNpbih0KjIrcC5ib3JuKSowLjA2OwogIGlmKHAua2luZD09PSdzdW5mbG93ZXInKXsKICAgIGcuc2F2ZSgpOyBnLnJvdGF0ZShzd2F5KjAuNSk7CiAgICBnLnN0cm9rZVN0eWxlPScjM2U4ZTJmJzsgZy5saW5lV2lkdGg9NjsgZy5saW5lQ2FwPSdyb3VuZCc7CiAgICBnLmJlZ2luUGF0aCgpOyBnLm1vdmVUbygwLC00KTsgZy5xdWFkcmF0aWNDdXJ2ZVRvKDQsLTIyLDAsLTM2KTsgZy5zdHJva2UoKTsKICAgIGcuZmlsbFN0eWxlPScjNGRhMzM0JzsKICAgIGcuYmVnaW5QYXRoKCk7IGcuZWxsaXBzZSgtMTIsLTEyLDEwLDQuNSwtMC41LDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmVsbGlwc2UoMTIsLTksMTAsNC41LDAuNSwwLFRBVSk7IGcuZmlsbCgpOwogICAgZy50cmFuc2xhdGUoMCwtNTApOyBnLnJvdGF0ZShzd2F5KTsKICAgIGcuZmlsbFN0eWxlPScjZmZkMjNlJzsKICAgIGZvcihsZXQgaT0wO2k8MTI7aSsrKXsKICAgICAgZy5zYXZlKCk7IGcucm90YXRlKGkqVEFVLzEyK3QqMC4yNSk7CiAgICAgIGcuYmVnaW5QYXRoKCk7IGcuZWxsaXBzZSgwLC0yMCw2LjUsMTIuNSwwLDAsVEFVKTsgZy5maWxsKCk7IGcucmVzdG9yZSgpOwogICAgfQogICAgZy5maWxsU3R5bGU9JyM5YzZiMzAnOyBnLmJlZ2luUGF0aCgpOyBnLmFyYygwLDAsMTMsMCxUQVUpOyBnLmZpbGwoKTsKICAgIGcuZmlsbFN0eWxlPScjN2E0ZDFlJzsgZy5iZWdpblBhdGgoKTsgZy5hcmMoMCwxLDEwLDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT0nI2ZmZic7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYygtNCwtMywyLjQsMCxUQVUpOyBnLmFyYyg0LC0zLDIuNCwwLFRBVSk7IGcuZmlsbCgpOwogICAgZy5maWxsU3R5bGU9JyMyMjInOwogICAgZy5iZWdpblBhdGgoKTsgZy5hcmMoLTQsLTMsMS4yLDAsVEFVKTsgZy5hcmMoNCwtMywxLjIsMCxUQVUpOyBnLmZpbGwoKTsKICAgIGcuc3Ryb2tlU3R5bGU9JyMyMjInOyBnLmxpbmVXaWR0aD0xLjQ7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYygwLDIsNC41LDAuMTUqTWF0aC5QSSwwLjg1Kk1hdGguUEkpOyBnLnN0cm9rZSgpOwogICAgZy5yZXN0b3JlKCk7CiAgfQogIGVsc2UgaWYocC5raW5kPT09J3BlYXNob290ZXInfHxwLmtpbmQ9PT0nc25vd3BlYSd8fHAua2luZD09PSdyZXBlYXRlcicpewogICAgY29uc3QgbWFpbj1wLmtpbmQ9PT0nc25vd3BlYSc/JyM1OWMxZTgnOicjNjdjMzNmJzsKICAgIGNvbnN0IGRhcms9cC5raW5kPT09J3Nub3dwZWEnPycjMmY5M2I4JzonIzRhOWEyNCc7CiAgICBnLnNhdmUoKTsgZy5yb3RhdGUoc3dheSowLjQpOwogICAgZy5zdHJva2VTdHlsZT0nIzNlOGUyZic7IGcubGluZVdpZHRoPTY7IGcubGluZUNhcD0ncm91bmQnOwogICAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oMCwtMik7IGcucXVhZHJhdGljQ3VydmVUbygtMywtMTgsMCwtMzApOyBnLnN0cm9rZSgpOwogICAgZy5maWxsU3R5bGU9JyM0ZGEzMzQnOyBnLmJlZ2luUGF0aCgpOyBnLmVsbGlwc2UoMTAsLTgsMTAsNC41LDAuNiwwLFRBVSk7IGcuZmlsbCgpOwogICAgZy50cmFuc2xhdGUoLXAucmVjb2lsKjMwLC00NCk7CiAgICBpZihwLmtpbmQ9PT0ncmVwZWF0ZXInKXsKICAgICAgZy5maWxsU3R5bGU9ZGFyazsgcnIoZywyLC0xNCwyNCwxMSw1KTsgZy5maWxsKCk7CiAgICAgIGcuZmlsbFN0eWxlPScjMWUzZDEwJzsgZy5iZWdpblBhdGgoKTsgZy5hcmMoMjUsLTguNSw0LDAsVEFVKTsgZy5maWxsKCk7CiAgICB9CiAgICBnLmZpbGxTdHlsZT1tYWluOyBnLmJlZ2luUGF0aCgpOyBnLmFyYygwLDAsMTYsMCxUQVUpOyBnLmZpbGwoKTsKICAgIGcuZmlsbFN0eWxlPW1haW47IHJyKGcsOCwtOCwyOCwxNiw3KTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT1kYXJrOyBnLmJlZ2luUGF0aCgpOyBnLmVsbGlwc2UoMzQsMCw0LjUsNi41LDAsMCxUQVUpOyBnLmZpbGwoKTsKICAgIGcuZmlsbFN0eWxlPScjZmZmJzsgZy5iZWdpblBhdGgoKTsgZy5hcmMoMiwtNiw0LDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT0nIzIyMic7IGcuYmVnaW5QYXRoKCk7IGcuYXJjKDMuNSwtNiwyLDAsVEFVKTsgZy5maWxsKCk7CiAgICBpZihwLmtpbmQ9PT0nc25vd3BlYScpewogICAgICBnLmZpbGxTdHlsZT0nI2U4ZmJmZic7CiAgICAgIGZvcihsZXQgaT0wO2k8NDtpKyspewogICAgICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKC04KygoaSo1KSUxNiksLTE0LSgoaSozKSU0KSwyLjIsMCxUQVUpOyBnLmZpbGwoKTsKICAgICAgfQogICAgfQogICAgZy5yZXN0b3JlKCk7CiAgfQogIGVsc2UgaWYocC5raW5kPT09J3dhbGxudXQnKXsKICAgIGcuc2F2ZSgpOyBnLnRyYW5zbGF0ZSgwLC0zMCk7IGcucm90YXRlKHN3YXkqMC41KyhwLmh1cnRUPjA/KE1hdGgucmFuZG9tKCktMC41KSowLjA2OjApKTsKICAgIGNvbnN0IGZyYWM9cC5ocC9wLm1heEhwOwogICAgZy5maWxsU3R5bGU9JyM5YzZiMzAnOwogICAgZy5iZWdpblBhdGgoKTsgZy5lbGxpcHNlKDAsMCwyNCwzMCwwLDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT0nI2I5ODM0OCc7IGcuYmVnaW5QYXRoKCk7IGcuZWxsaXBzZSgtNCwtNiwxOCwyMiwwLDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLnN0cm9rZVN0eWxlPScjNmU0NTE3JzsgZy5saW5lV2lkdGg9Mi41OwogICAgZy5iZWdpblBhdGgoKTsgZy5lbGxpcHNlKDAsMCwyNCwzMCwwLDAsVEFVKTsgZy5zdHJva2UoKTsKICAgIGcuZmlsbFN0eWxlPScjZmZmJzsKICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKC03LC00LDQuNSwwLFRBVSk7IGcuYXJjKDgsLTQsNC41LDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT0nIzIyMic7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYygtNiwtMywyLjIsMCxUQVUpOyBnLmFyYyg5LC0zLDIuMiwwLFRBVSk7IGcuZmlsbCgpOwogICAgZy5zdHJva2VTdHlsZT0nIzVhM2ExNCc7IGcubGluZVdpZHRoPTI7CiAgICBpZihmcmFjPjAuNSl7IGcuYmVnaW5QYXRoKCk7IGcuYXJjKDAsOCw2LDAuMTUqTWF0aC5QSSwwLjg1Kk1hdGguUEkpOyBnLnN0cm9rZSgpOyB9CiAgICBlbHNleyBnLmJlZ2luUGF0aCgpOyBnLm1vdmVUbygtNiwxMik7IGcubGluZVRvKDAsOSk7IGcubGluZVRvKDYsMTIpOyBnLnN0cm9rZSgpOyB9CiAgICBpZihmcmFjPDAuNjYpewogICAgICBnLnN0cm9rZVN0eWxlPScjNWEzYTE0JzsgZy5saW5lV2lkdGg9MjsKICAgICAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oMTQsLTI2KTsgZy5saW5lVG8oMTAsLTE2KTsgZy5saW5lVG8oMTYsLTgpOyBnLnN0cm9rZSgpOwogICAgfQogICAgaWYoZnJhYzwwLjMzKXsKICAgICAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oLTE4LC0yMCk7IGcubGluZVRvKC0xMiwtMTApOyBnLmxpbmVUbygtMTksLTIpOyBnLnN0cm9rZSgpOwogICAgICBnLmJlZ2luUGF0aCgpOyBnLm1vdmVUbygwLDI4KTsgZy5saW5lVG8oNCwyMCk7IGcuc3Ryb2tlKCk7CiAgICB9CiAgICBnLnJlc3RvcmUoKTsKICB9CiAgZWxzZSBpZihwLmtpbmQ9PT0nY2hlcnJ5Jyl7CiAgICBnLnNhdmUoKTsKICAgIGNvbnN0IHB1PXAuZnVzZSE9PXVuZGVmaW5lZD9NYXRoLm1heCgwLDAuNi1wLmZ1c2UpOjA7CiAgICBnLnNjYWxlKDErcHUqMC41LDErcHUqMC41KTsKICAgIGcucm90YXRlKHN3YXkpOwogICAgZy5zdHJva2VTdHlsZT0nIzNlOGUyZic7IGcubGluZVdpZHRoPTQ7IGcubGluZUNhcD0ncm91bmQnOwogICAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oLTEwLC0zMik7IGcucXVhZHJhdGljQ3VydmVUbygtNCwtNTIsMiwtNTYpOyBnLnN0cm9rZSgpOwogICAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oMTIsLTI4KTsgZy5xdWFkcmF0aWNDdXJ2ZVRvKDgsLTQ4LDIsLTU2KTsgZy5zdHJva2UoKTsKICAgIGcuZmlsbFN0eWxlPScjZDQyYTFlJzsKICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKC0xMCwtMTgsMTUsMCxUQVUpOyBnLmZpbGwoKTsKICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKDEzLC0xNCwxNCwwLFRBVSk7IGcuZmlsbCgpOwogICAgZy5maWxsU3R5bGU9JyNmZjZmNWEnOwogICAgZy5iZWdpblBhdGgoKTsgZy5hcmMoLTE0LC0yMyw1LDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYyg5LC0xOSw0LjQsMCxUQVUpOyBnLmZpbGwoKTsKICAgIGcuZmlsbFN0eWxlPScjZmZmJzsKICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKC0xMywtMjAsMywwLFRBVSk7IGcuYXJjKC02LC0yMCwzLDAsVEFVKTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT0nIzIyMic7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYygtMTIsLTE5LDEuNSwwLFRBVSk7IGcuYXJjKC03LC0xOSwxLjUsMCxUQVUpOyBnLmZpbGwoKTsKICAgIGcuc3Ryb2tlU3R5bGU9JyM3YTE0MDgnOyBnLmxpbmVXaWR0aD0yOwogICAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oLTE3LC0yNSk7IGcubGluZVRvKC05LC0yMyk7IGcuc3Ryb2tlKCk7CiAgICBpZihwLmZ1c2UhPT11bmRlZmluZWQmJnAuZnVzZTwwLjM1KXsKICAgICAgZy5maWxsU3R5bGU9J3JnYmEoMjU1LDI1NSwyMjAsJysoMC4zNS1wLmZ1c2UpKjIuNSsnKSc7CiAgICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKDIsLTE4LDI2LDAsVEFVKTsgZy5maWxsKCk7CiAgICB9CiAgICBnLnJlc3RvcmUoKTsKICB9Cn0KCmZ1bmN0aW9uIGRyYXdab21iaWUoZyx6KXsKICBjb25zdCBiYXNlWT1HUklEX1krei5yb3cqQ0VMTCtDRUxMLTE0OwogIGcuc2F2ZSgpOwogIGcudHJhbnNsYXRlKHoueCxiYXNlWSk7CiAgaWYoei5kZWFkKXsKICAgIGNvbnN0IGs9TWF0aC5taW4oMSx6LmRlYXRoVC8wLjkpOwogICAgZy5nbG9iYWxBbHBoYT0xLWs7CiAgICBnLnJvdGF0ZSgtayoxLjQ1KTsKICB9CiAgY29uc3Qgdz1NYXRoLnNpbih6LmFuaW0qNyk7CiAgY29uc3Qgc3VpdD16LnR5cGU9PT0ncnVuJz8nIzdhM2IzYic6JyM0YTRhNWUnOwogIC8vIOiFvwogIGcuc3Ryb2tlU3R5bGU9JyMzZDNkNGEnOyBnLmxpbmVXaWR0aD05OyBnLmxpbmVDYXA9J3JvdW5kJzsKICBnLmJlZ2luUGF0aCgpOyBnLm1vdmVUbygtNCwtMzIpOyBnLmxpbmVUbygtNC0oei5lYXRpbmc/Mjp3KjcpLDApOyBnLnN0cm9rZSgpOwogIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKDYsLTMyKTsgZy5saW5lVG8oNisoei5lYXRpbmc/Mjp3KjcpLDApOyBnLnN0cm9rZSgpOwogIC8vIOi6r+W5siArIOmihuW4pgogIGcuZmlsbFN0eWxlPXN1aXQ7IHJyKGcsLTE2LC02NiwzMCwzOCw2KTsgZy5maWxsKCk7CiAgZy5maWxsU3R5bGU9JyNjMDM5MmInOyBnLmZpbGxSZWN0KC01LC02NCw2LDE2KTsKICAvLyDlkI7oh4IKICBnLnN0cm9rZVN0eWxlPXN1aXQ7IGcubGluZVdpZHRoPTg7CiAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oLTEwLC01OCk7IGcubGluZVRvKC0yOCwtNTIrdyozKTsgZy5zdHJva2UoKTsKICBnLmZpbGxTdHlsZT0nIzlmYWU3Nic7IGcuYmVnaW5QYXRoKCk7IGcuYXJjKC0zMCwtNTIrdyozLDUsMCxUQVUpOyBnLmZpbGwoKTsKICAvLyDlpLQKICBnLmZpbGxTdHlsZT0nIzlmYWU3Nic7IGcuYmVnaW5QYXRoKCk7IGcuYXJjKC0yLC03NiwxNCwwLFRBVSk7IGcuZmlsbCgpOwogIGlmKHouZWF0aW5nKXsKICAgIGcuZmlsbFN0eWxlPScjNmQ3YTUyJzsKICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKC05LC02OCw0K01hdGguYWJzKHcpKjIuNSwwLFRBVSk7IGcuZmlsbCgpOwogIH0KICBnLmZpbGxTdHlsZT0nI2ZmZic7CiAgZy5iZWdpblBhdGgoKTsgZy5hcmMoLTksLTc5LDMuNCwwLFRBVSk7IGcuYXJjKC0xLC04MCwzLjQsMCxUQVUpOyBnLmZpbGwoKTsKICBnLmZpbGxTdHlsZT0nIzIyMic7CiAgZy5iZWdpblBhdGgoKTsgZy5hcmMoLTExLC03OSwxLjYsMCxUQVUpOyBnLmFyYygtMywtODAsMS42LDAsVEFVKTsgZy5maWxsKCk7CiAgLy8g5aS06aWwCiAgaWYoei50eXBlPT09J2NvbmUnKXsKICAgIGcuZmlsbFN0eWxlPScjZTY3ZTIyJzsKICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKC0yLC0xMDQpOyBnLmxpbmVUbygtMTUsLTcyKTsgZy5saW5lVG8oMTEsLTcyKTsgZy5jbG9zZVBhdGgoKTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT0nI2YzOWM1Mic7IGcuZmlsbFJlY3QoLTksLTg0LDE1LDUpOwogIH1lbHNlIGlmKHoudHlwZT09PSdidWNrZXQnKXsKICAgIGcuZmlsbFN0eWxlPScjOTVhNWE2JzsgcnIoZywtMTUsLTEwMCwyNiwyOCwzKTsgZy5maWxsKCk7CiAgICBnLmZpbGxTdHlsZT0nI2IzYmNiZSc7IGcuZmlsbFJlY3QoLTE1LC0xMDAsMjYsNik7CiAgICBnLnN0cm9rZVN0eWxlPScjNmQ3YTdjJzsgZy5saW5lV2lkdGg9MjsgcnIoZywtMTUsLTEwMCwyNiwyOCwzKTsgZy5zdHJva2UoKTsKICB9ZWxzZSBpZih6LnR5cGU9PT0ncnVuJyl7CiAgICBnLmZpbGxTdHlsZT0nI2U3NGMzYyc7IHJyKGcsLTE3LC05MCwzMCw3LDMpOyBnLmZpbGwoKTsKICB9CiAgLy8g5YmN6IeC77yI5Ly45ZCR5YmN5pa577yJCiAgZy5zdHJva2VTdHlsZT1zdWl0OyBnLmxpbmVXaWR0aD04OwogIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKC0xMiwtNTYpOyBnLmxpbmVUbygtMzQsLTU4LXcqNCk7IGcuc3Ryb2tlKCk7CiAgZy5maWxsU3R5bGU9JyM5ZmFlNzYnOyBnLmJlZ2luUGF0aCgpOyBnLmFyYygtMzYsLTU4LXcqNCw1LDAsVEFVKTsgZy5maWxsKCk7CiAgLy8g5Y+X5Ye7IC8g5YeP6YCfCiAgaWYoei5oaXRUPjApeyBnLmZpbGxTdHlsZT0ncmdiYSgyNTUsMjU1LDI1NSwuNDUpJzsgZy5iZWdpblBhdGgoKTsgZy5hcmMoLTIsLTYyLDM2LDAsVEFVKTsgZy5maWxsKCk7IH0KICBpZih6LnNsb3dUPjApeyBnLmZpbGxTdHlsZT0ncmdiYSg4MCwxNjAsMjU1LC4zKSc7IGcuYmVnaW5QYXRoKCk7IGcuYXJjKC0yLC02MiwzNiwwLFRBVSk7IGcuZmlsbCgpOyB9CiAgZy5yZXN0b3JlKCk7Cn0KCmZ1bmN0aW9uIGRyYXdNb3dlcihnLG0pewogIGlmKG0udXNlZCYmIW0ub24pIHJldHVybjsKICBjb25zdCB5PUdSSURfWSttLnJvdypDRUxMK0NFTEwtMjA7CiAgZy5zYXZlKCk7IGcudHJhbnNsYXRlKG0ueCx5KTsKICBnLnN0cm9rZVN0eWxlPScjNTU1JzsgZy5saW5lV2lkdGg9NDsgZy5saW5lQ2FwPSdyb3VuZCc7CiAgZy5iZWdpblBhdGgoKTsgZy5tb3ZlVG8oLTgsLTgpOyBnLmxpbmVUbygtMjQsLTI4KTsgZy5zdHJva2UoKTsKICBnLmZpbGxTdHlsZT0nI2MwMzkyYic7IHJyKGcsLTE4LC0xOCwzNiwxNyw0KTsgZy5maWxsKCk7CiAgZy5maWxsU3R5bGU9JyNlNzRjM2MnOyBycihnLC0xMywtMjQsMjIsOSwzKTsgZy5maWxsKCk7CiAgZy5maWxsU3R5bGU9JyMyMjInOwogIGcuYmVnaW5QYXRoKCk7IGcuYXJjKC0xMCwyLDcsMCxUQVUpOyBnLmFyYygxMCwyLDcsMCxUQVUpOyBnLmZpbGwoKTsKICBnLmZpbGxTdHlsZT0nIzg4OCc7CiAgZy5iZWdpblBhdGgoKTsgZy5hcmMoLTEwLDIsMywwLFRBVSk7IGcuYXJjKDEwLDIsMywwLFRBVSk7IGcuZmlsbCgpOwogIGcucmVzdG9yZSgpOwp9CgpmdW5jdGlvbiBkcmF3U3VuU3ByaXRlKGcseCx5LHIsdCxhbHBoYSl7CiAgZy5zYXZlKCk7IGcudHJhbnNsYXRlKHgseSk7IGcuZ2xvYmFsQWxwaGE9YWxwaGE9PW51bGw/MTphbHBoYTsKICBnLmZpbGxTdHlsZT0ncmdiYSgyNTUsMjIwLDYwLC4yMiknOwogIGcuYmVnaW5QYXRoKCk7IGcuYXJjKDAsMCxyKjEuOSwwLFRBVSk7IGcuZmlsbCgpOwogIGcuZmlsbFN0eWxlPScjZmZkZjRkJzsKICBmb3IobGV0IGk9MDtpPDg7aSsrKXsKICAgIGcuc2F2ZSgpOyBnLnJvdGF0ZSh0KjAuOStpKlRBVS84KTsKICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKHIqMC41NSwtciowLjI4KTsgZy5saW5lVG8ocioxLjQ1LDApOyBnLmxpbmVUbyhyKjAuNTUsciowLjI4KTsKICAgIGcuY2xvc2VQYXRoKCk7IGcuZmlsbCgpOyBnLnJlc3RvcmUoKTsKICB9CiAgZy5maWxsU3R5bGU9JyNmZmQ3MDAnOyBnLmJlZ2luUGF0aCgpOyBnLmFyYygwLDAsciwwLFRBVSk7IGcuZmlsbCgpOwogIGcuZmlsbFN0eWxlPScjZmZmM2EwJzsgZy5iZWdpblBhdGgoKTsgZy5hcmMoMCwwLHIqMC41NSwwLFRBVSk7IGcuZmlsbCgpOwogIGcucmVzdG9yZSgpOwp9CgpmdW5jdGlvbiByZW5kZXIoKXsKICBjdHguc2F2ZSgpOwogIGlmKFMuc2hha2U+MCkgY3R4LnRyYW5zbGF0ZSgoTWF0aC5yYW5kb20oKS0wLjUpKjEwKlMuc2hha2UsKE1hdGgucmFuZG9tKCktMC41KSoxMCpTLnNoYWtlKTsKICBkcmF3TGF3bigpOwogIGZvcihjb25zdCBtIG9mIFMubW93ZXJzKSBkcmF3TW93ZXIoY3R4LG0pOwoKICBmb3IobGV0IHI9MDtyPFJPV1M7cisrKXsKICAgIGZvcihsZXQgYz0wO2M8Q09MUztjKyspewogICAgICBjb25zdCBwPVMuZ3JpZFtyXVtjXTsKICAgICAgaWYocCl7CiAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICBjdHgudHJhbnNsYXRlKEdSSURfWCtjKkNFTEwrNTAsR1JJRF9ZK3IqQ0VMTCtDRUxMLTE2KTsKICAgICAgICBkcmF3UGxhbnQoY3R4LHAsUy50aW1lKTsKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICB9CiAgICB9CiAgICBjb25zdCB6cz1TLnpvbWJpZXMuZmlsdGVyKHo9Pnoucm93PT09cikuc29ydCgoYSxiKT0+YS54LWIueCk7CiAgICBmb3IoY29uc3QgeiBvZiB6cykgZHJhd1pvbWJpZShjdHgseik7CiAgfQoKICBmb3IoY29uc3QgcCBvZiBTLnBlYXMpewogICAgaWYocC5kZWxheT4wKSBjb250aW51ZTsKICAgIGN0eC5maWxsU3R5bGU9cC5zbm93PydyZ2JhKDEyNywyMTIsMjQyLC40KSc6J3JnYmEoMTExLDIwNiw1OCwuNCknOwogICAgY3R4LmJlZ2luUGF0aCgpOyBjdHguYXJjKHAueC0xMSxwLnksNC41LDAsVEFVKTsgY3R4LmZpbGwoKTsKICAgIGN0eC5maWxsU3R5bGU9cC5zbm93PycjN2ZkNGYyJzonIzZmY2UzYSc7CiAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMocC54LHAueSw3LDAsVEFVKTsgY3R4LmZpbGwoKTsKICAgIGN0eC5maWxsU3R5bGU9cC5zbm93PycjZDlmNGZmJzonI2I4ZjA5YSc7CiAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMocC54LTIscC55LTIsMi42LDAsVEFVKTsgY3R4LmZpbGwoKTsKICB9CgogIGZvcihjb25zdCBiIG9mIFMuYm9vbXMpewogICAgY29uc3Qgaz1iLnQvMC41NTsKICAgIGN0eC5nbG9iYWxBbHBoYT0xLWs7CiAgICBjdHguZmlsbFN0eWxlPScjZmY4YzAwJzsKICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyhiLngsYi55LDQwK2sqMTQwLDAsVEFVKTsgY3R4LmZpbGwoKTsKICAgIGN0eC5maWxsU3R5bGU9JyNmZmUxNGQnOwogICAgY3R4LmJlZ2luUGF0aCgpOyBjdHguYXJjKGIueCxiLnksMjArayo5MCwwLFRBVSk7IGN0eC5maWxsKCk7CiAgICBjdHguZ2xvYmFsQWxwaGE9MTsKICB9CgogIGZvcihjb25zdCBwIG9mIFMucGFydHMpewogICAgY3R4Lmdsb2JhbEFscGhhPU1hdGgubWF4KDAscC5saWZlKjIpOwogICAgY3R4LmZpbGxTdHlsZT1wLmNvbG9yOwogICAgY3R4LmJlZ2luUGF0aCgpOyBjdHguYXJjKHAueCxwLnkscC5yLDAsVEFVKTsgY3R4LmZpbGwoKTsKICB9CiAgY3R4Lmdsb2JhbEFscGhhPTE7CgogIGZvcihjb25zdCBzIG9mIFMuc3Vucyl7CiAgICBjb25zdCBhPXMuc3RhdGU9PT0nc3RpbGwnJiZzLmFnZT44P01hdGgubWF4KDAsMS0ocy5hZ2UtOCkvMik6KHMuc3RhdGU9PT0nZmx5Jz8xOjEpOwogICAgZHJhd1N1blNwcml0ZShjdHgscy54LHMueSwxNixTLnRpbWUrcy5hZ2UsYSk7CiAgfQoKICAvLyDmgqzlgZzpq5jkuq4gKyDnp43mpI3pooTop4gKICBpZihTLmhvdmVyJiZTLmhvdmVyLmNvbCE9bnVsbCYmUy5ob3Zlci5yb3chPW51bGwmJlMuc3RhcnRlZCYmIVMub3ZlciYmIVMucGF1c2VkKXsKICAgIGNvbnN0IHtjb2wscm93fT1TLmhvdmVyOwogICAgY29uc3Qgb2NjdXBpZWQ9ISFTLmdyaWRbcm93XVtjb2xdOwogICAgaWYoUy5zZWxlY3RlZCl7CiAgICAgIGN0eC5maWxsU3R5bGU9b2NjdXBpZWQ/J3JnYmEoMjU1LDYwLDQwLC4yNSknOidyZ2JhKDI1NSwyNTUsMjU1LC4xOCknOwogICAgICBjdHguZmlsbFJlY3QoR1JJRF9YK2NvbCpDRUxMLEdSSURfWStyb3cqQ0VMTCxDRUxMLENFTEwpOwogICAgICBpZighb2NjdXBpZWQpewogICAgICAgIGN0eC5nbG9iYWxBbHBoYT0wLjU1OwogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgY3R4LnRyYW5zbGF0ZShHUklEX1grY29sKkNFTEwrNTAsR1JJRF9ZK3JvdypDRUxMK0NFTEwtMTYpOwogICAgICAgIGRyYXdQbGFudChjdHgse2tpbmQ6Uy5zZWxlY3RlZCxocDoxLG1heEhwOjEsYm9ybjowLHJlY29pbDowLGZ1c2U6OSxodXJ0VDowfSxTLnRpbWUpOwogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgY3R4Lmdsb2JhbEFscGhhPTE7CiAgICAgIH0KICAgIH1lbHNlIGlmKFMuc2hvdmVsJiZvY2N1cGllZCl7CiAgICAgIGN0eC5maWxsU3R5bGU9J3JnYmEoMjU1LDYwLDQwLC4zKSc7CiAgICAgIGN0eC5maWxsUmVjdChHUklEX1grY29sKkNFTEwsR1JJRF9ZK3JvdypDRUxMLENFTEwsQ0VMTCk7CiAgICB9CiAgfQogIGN0eC5yZXN0b3JlKCk7CgogIGlmKFMucGF1c2VkJiYhUy5vdmVyKXsKICAgIGN0eC5maWxsU3R5bGU9J3JnYmEoMCwwLDAsLjUpJzsgY3R4LmZpbGxSZWN0KDAsMCxDVl9XLENWX0gpOwogICAgY3R4LmZpbGxTdHlsZT0nI2ZmZic7IGN0eC5mb250PSc5MDAgNDJweCAiTWljcm9zb2Z0IFlhSGVpIixzYW5zLXNlcmlmJzsKICAgIGN0eC50ZXh0QWxpZ249J2NlbnRlcic7IGN0eC50ZXh0QmFzZWxpbmU9J21pZGRsZSc7CiAgICBjdHguZmlsbFRleHQoJ+W3suaaguWBnCcsQ1ZfVy8yLENWX0gvMi0yMCk7CiAgICBjdHguZm9udD0nMjJweCAiTWljcm9zb2Z0IFlhSGVpIixzYW5zLXNlcmlmJzsKICAgIGN0eC5maWxsVGV4dCgn5oyJIFAg5oiWIOKPuCDmjInpkq7nu6fnu60nLENWX1cvMixDVl9ILzIrMzApOwogIH0KICByZWZyZXNoQ2FyZHMoKTsKICBjb25zdCBmcmFjPU1hdGgubWluKDEsKChTLndhdmUtMSkrKFMuaW5XYXZlP1Mua2lsbGVkSW5XYXZlL01hdGgubWF4KDEsUy5zcGF3bmVkSW5XYXZlKTowKSkvVE9UQUwpOwogIHByb2dyZXNzRmlsbC5zdHlsZS53aWR0aD0oZnJhYyoxMDApKyclJzsKICB3YXZlTGFiZWwudGV4dENvbnRlbnQ9Uy5zdGFydGVkPygn56ysICcrTWF0aC5taW4oUy53YXZlLFRPVEFMKSsnIC8gJytUT1RBTCsnIOazoicpOiflh4blpIfkuK3igKYnOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT0g5Li75b6q546vID09PT09PT09PT09PT09PT09PT09PQpsZXQgbGFzdD0wOwpmdW5jdGlvbiBsb29wKHRzKXsKICBjb25zdCBkdD1NYXRoLm1pbigwLjA1LCh0cy1sYXN0KS8xMDAwfHwwKTsKICBsYXN0PXRzOwogIFMudGltZSs9ZHQ7CiAgaWYoUy5zdGFydGVkJiYhUy5wYXVzZWQmJiFTLm92ZXIpIHVwZGF0ZShkdCk7CiAgcmVuZGVyKCk7CiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT0g5Lqk5LqSID09PT09PT09PT09PT09PT09PT09PQpjdnMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxlPT57IFMuaG92ZXI9Y2VsbEF0KGUpOyB9KTsKY3ZzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCgpPT57IFMuaG92ZXI9bnVsbDsgfSk7CmN2cy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsZT0+ewogIGUucHJldmVudERlZmF1bHQoKTsKICBTLnNlbGVjdGVkPW51bGw7IFMuc2hvdmVsPWZhbHNlOyBzaG92ZWxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnb24nKTsgc2V0Q2FyZHNTZWwoKTsKfSk7CmN2cy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGU9PnsKICBpZihlLmJ1dHRvbiE9PTB8fCFTLnN0YXJ0ZWR8fFMub3Zlcnx8Uy5wYXVzZWQpIHJldHVybjsKICBjb25zdCBwb3M9Y2VsbEF0KGUpOwogIGZvcihjb25zdCBzIG9mIFMuc3Vucyl7CiAgICBpZihzLnN0YXRlIT09J2ZseScmJk1hdGguaHlwb3Qocy54LXBvcy54LHMueS1wb3MueSk8NDApeyBjb2xsZWN0U3VuKHMpOyByZXR1cm47IH0KICB9CiAgaWYocG9zLmNvbD09bnVsbHx8cG9zLnJvdz09bnVsbCkgcmV0dXJuOwogIGlmKFMuc2hvdmVsKXsKICAgIGNvbnN0IHA9Uy5ncmlkW3Bvcy5yb3ddW3Bvcy5jb2xdOwogICAgaWYocCl7CiAgICAgIFMuZ3JpZFtwb3Mucm93XVtwb3MuY29sXT1udWxsOwogICAgICBwdWZmKEdSSURfWCtwb3MuY29sKkNFTEwrNTAsR1JJRF9ZK3Bvcy5yb3cqQ0VMTCs1MCwnIzhhNmEzYycsOSwxMTApOwogICAgICBzZngoMjYwLC4xLCdzaW5lJywuMTIsMTQwKTsKICAgICAgUy5zaG92ZWw9ZmFsc2U7IHNob3ZlbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdvbicpOwogICAgfQogICAgcmV0dXJuOwogIH0KICBpZihTLnNlbGVjdGVkKSB0cnlQbGFudChTLnNlbGVjdGVkLHBvcy5jb2wscG9zLnJvdyk7Cn0pOwoKc2hvdmVsQnRuLm9uY2xpY2s9KCk9PnsKICBpZighUy5zdGFydGVkfHxTLm92ZXIpIHJldHVybjsKICBTLnNlbGVjdGVkPW51bGw7IHNldENhcmRzU2VsKCk7CiAgUy5zaG92ZWw9IVMuc2hvdmVsOwogIHNob3ZlbEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdvbicsUy5zaG92ZWwpOwogIHNmeCgzMDAsLjA2LCdzaW5lJywuMDgpOwp9OwptdXRlQnRuLm9uY2xpY2s9KCk9PnsgbXV0ZWQ9IW11dGVkOyBtdXRlQnRuLnRleHRDb250ZW50PW11dGVkPyfwn5SHJzon8J+Uiic7IH07CmZ1bmN0aW9uIHRvZ2dsZVBhdXNlKCl7CiAgaWYoIVMuc3RhcnRlZHx8Uy5vdmVyKSByZXR1cm47CiAgUy5wYXVzZWQ9IVMucGF1c2VkOwogIHBhdXNlQnRuLnRleHRDb250ZW50PVMucGF1c2VkPyfilrYnOifij7gnOwp9CnBhdXNlQnRuLm9uY2xpY2s9dG9nZ2xlUGF1c2U7CmF1dG9CdG4ub25jbGljaz0oKT0+ewogIGF1dG9QaWNrPSFhdXRvUGljazsKICBhdXRvQnRuLmNsYXNzTGlzdC50b2dnbGUoJ29uJyxhdXRvUGljayk7CiAgc2Z4KDU2MCwuMDYsJ3NpbmUnLC4wOCk7Cn07CmluZmluaXRlQnRuLm9uY2xpY2s9KCk9PnsKICBpbmZpbml0ZVN1bj0haW5maW5pdGVTdW47CiAgaW5maW5pdGVCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnb24nLGluZmluaXRlU3VuKTsKICBzZngoNTYwLC4wNiwnc2luZScsLjA4KTsKfTsKCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxlPT57CiAgaWYoZS5rZXk9PT0nRXNjYXBlJyl7IFMuc2VsZWN0ZWQ9bnVsbDsgUy5zaG92ZWw9ZmFsc2U7IHNob3ZlbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdvbicpOyBzZXRDYXJkc1NlbCgpOyB9CiAgZWxzZSBpZihlLmtleT09PSdwJ3x8ZS5rZXk9PT0nUCcpIHRvZ2dsZVBhdXNlKCk7CiAgZWxzZXsKICAgIGNvbnN0IGk9cGFyc2VJbnQoZS5rZXksMTApOwogICAgY29uc3Qga2V5cz1PYmplY3Qua2V5cyhQTEFOVFMpOwogICAgaWYoaT49MSYmaTw9a2V5cy5sZW5ndGgmJlMuc3RhcnRlZCYmIVMub3Zlcil7CiAgICAgIGNvbnN0IGs9a2V5c1tpLTFdOwogICAgICBpZihTLnNlbGVjdGVkPT09ayl7IFMuc2VsZWN0ZWQ9bnVsbDsgfQogICAgICBlbHNlIGlmKChpbmZpbml0ZVN1bnx8Uy5zdW4+PVBMQU5UU1trXS5jb3N0KSYmUy5jb29sZG93bnNba108PTApeyBTLnNlbGVjdGVkPWs7IFMuc2hvdmVsPWZhbHNlOyBzaG92ZWxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnb24nKTsgfQogICAgICBzZXRDYXJkc1NlbCgpOwogICAgfQogIH0KfSk7CgpvdkJ0bi5vbmNsaWNrPSgpPT57CiAgaWYoUy5vdmVyKXsgbmV3R2FtZSgpOyB9CiAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTsKICBTLnN0YXJ0ZWQ9dHJ1ZTsKICBzZngoNjYwLC4xLCdzaW5lJywuMSw4ODApOwp9OwoKLy8gPT09PT09PT09PT09PT09PT09PT09IOWQr+WKqCA9PT09PT09PT09PT09PT09PT09PT0KbmV3R2FtZSgpOwpidWlsZENhcmRzKCk7CihmdW5jdGlvbigpewogIGNvbnN0IGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bkljb24nKS5nZXRDb250ZXh0KCcyZCcpOwogIGRyYXdTdW5TcHJpdGUoZywxNywxNyw5LDAuOCwxKTsKfSkoKTsKcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==

PCFET0NUWVBFIGh0bWw+CjxodG1sIGRhdGEtcGFnZS1ub2RlLWlkPSI2YlRFVWJzN3NKbzRScm82RlU4NHBBIiBsYW5nPSJ6aC1DTiI+CjxoZWFkIGRhdGEtcGFnZS1ub2RlLWlkPSJ2T2lPTHNjVExPTkpqUFlRMXFkbXlVIj4KCjxtZXRhIGRhdGEtcGFnZS1ub2RlLWlkPSJsdjFCVmtSRlpYb1E2dGlFcjBhY0FmIiBjaGFyc2V0PSJVVEYtOCI+CjxtZXRhIGRhdGEtcGFnZS1ub2RlLWlkPSJvVkFNUW1iVHVySzlTbWxHa0FXdzlBIiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgbmFtZT0idmlld3BvcnQiPgo8dGl0bGUgZGF0YS1wYWdlLW5vZGUtaWQ9ImhOdFE3bTdBRWlEZVV3MXZVd1BwaW0iIGRhdGEtcG5pZC1jaGlsZHJlbj0iZVVZY2pVbmNieHpBaWFocFJ4dG5JSSI+5LqV5a2X5qOLIMK3IOWEv+erpeeJiDwvdGl0bGU+CjxzdHlsZSBkYXRhLXBhZ2Utbm9kZS1pZD0iaVJwZjl3RE56b1dId29FRWkwNUZlWSIgZGF0YS1wbmlkLWNoaWxkcmVuPSJGblI5a0N4VHV4cGVKWFY5d1ViVkxzIj4KICA6cm9vdHsKICAgIC0tYmc6I2Y3ZjVlZjsKICAgIC0tcGFuZWw6I2ZmZmZmZjsKICAgIC0taW5rOiMyZjJhMjY7CiAgICAtLWluay1zb2Z0OiM3YTZmNjY7CiAgICAtLWxpbmU6I2U2ZGZkNDsKICAgIC0tYWNjZW50OiNjODY2M2Y7CiAgICAtLWFjY2VudC1zb2Z0OiNmM2UyZDg7CiAgICAtLWJsdWU6IzNmNmY4ZjsKICAgIC0tYmx1ZS1zb2Z0OiNkZmVhZjI7CiAgICAtLWdvbGQ6I2M5YTIyNzsKICAgIC0tZ29sZC1zb2Z0OiNmYWYwZDQ7CiAgICAtLXNoYWRvdzowIDJweCA4cHggcmdiYSg4MCw2MCw0MCwuMDcpLCAwIDEycHggMzJweCByZ2JhKDgwLDYwLDQwLC4wNik7CiAgICAtLXJhZGl1czoxOHB4OwogIH0KICAqe2JveC1zaXppbmc6Ym9yZGVyLWJveDsgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O30KICBodG1sLGJvZHl7bWFyZ2luOjA7cGFkZGluZzowO30KICBib2R5ewogICAgYmFja2dyb3VuZDp2YXIoLS1iZyk7CiAgICBjb2xvcjp2YXIoLS1pbmspOwogICAgZm9udC1mYW1pbHk6IlBpbmdGYW5nIFNDIiwiTWljcm9zb2Z0IFlhSGVpIiwiSGlyYWdpbm8gU2FucyBHQiIsc3lzdGVtLXVpLHNhbnMtc2VyaWY7CiAgICBtaW4taGVpZ2h0OjEwMHZoOwogICAgZGlzcGxheTpmbGV4OwogICAganVzdGlmeS1jb250ZW50OmNlbnRlcjsKICAgIHBhZGRpbmc6MTZweCAxMnB4IDQwcHg7CiAgfQogIC53cmFwe3dpZHRoOjEwMCU7bWF4LXdpZHRoOjU2MHB4O30KCiAgaGVhZGVye3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjo4cHggMCAxOHB4O30KICBoMXsKICAgIG1hcmdpbjowO2ZvbnQtc2l6ZToyNnB4O2xldHRlci1zcGFjaW5nOjJweDtmb250LXdlaWdodDo4MDA7CiAgfQogIGgxIC5kb3R7Y29sb3I6dmFyKC0tYWNjZW50KTt9CiAgLnN1YnttYXJnaW46NnB4IDAgMDtmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS1pbmstc29mdCk7fQoKICAuY2FyZHsKICAgIGJhY2tncm91bmQ6dmFyKC0tcGFuZWwpOwogICAgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgIGJvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKTsKICAgIGJveC1zaGFkb3c6dmFyKC0tc2hhZG93KTsKICAgIHBhZGRpbmc6MTZweDsKICAgIG1hcmdpbi1ib3R0b206MTRweDsKICB9CiAgLmxhYmVsewogICAgZm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0taW5rLXNvZnQpO2ZvbnQtd2VpZ2h0OjcwMDsKICAgIGxldHRlci1zcGFjaW5nOjFweDttYXJnaW4tYm90dG9tOjhweDsKICB9CgogIC8qIC0tLS0tLS0tLS0g54q25oCB5qCPIC0tLS0tLS0tLS0gKi8KICAuc3RhdHVzewogICAgZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDsKICB9CiAgLnR1cm4tbWFya3sKICAgIHdpZHRoOjQ0cHg7aGVpZ2h0OjQ0cHg7ZmxleDowIDAgNDRweDsKICAgIGJvcmRlci1yYWRpdXM6MTJweDsKICAgIGRpc3BsYXk6Z3JpZDtwbGFjZS1pdGVtczpjZW50ZXI7CiAgICBmb250LXNpemU6MjZweDtmb250LXdlaWdodDo4MDA7CiAgICBiYWNrZ3JvdW5kOnZhcigtLWFjY2VudC1zb2Z0KTtjb2xvcjp2YXIoLS1hY2NlbnQpOwogICAgdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4yNXMsIGNvbG9yIC4yNXM7CiAgfQogIC50dXJuLW1hcmsuYWl7YmFja2dyb3VuZDp2YXIoLS1ibHVlLXNvZnQpO2NvbG9yOnZhcigtLWJsdWUpO30KICAuc3RhdHVzLXRleHR7ZmxleDoxO21pbi13aWR0aDowO30KICAuc3RhdHVzLW1haW57Zm9udC1zaXplOjE3cHg7Zm9udC13ZWlnaHQ6NzAwO30KICAuc3RhdHVzLXN1Yntmb250LXNpemU6MTIuNXB4O2NvbG9yOnZhcigtLWluay1zb2Z0KTttYXJnaW4tdG9wOjNweDt9CiAgLmNsb2NrewogICAgZm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zOwogICAgZm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLWluay1zb2Z0KTsKICAgIGJhY2tncm91bmQ6I2YzZjBlOTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzo2cHggMTBweDsKICB9CgogIC8qIC0tLS0tLS0tLS0g5qOL55uYIC0tLS0tLS0tLS0gKi8KICAuYm9hcmQtYm94e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6NnB4IDAgMnB4O30KICAuYm9hcmR7CiAgICBkaXNwbGF5OmdyaWQ7CiAgICBnYXA6NnB4OwogICAgYmFja2dyb3VuZDp2YXIoLS1saW5lKTsKICAgIHBhZGRpbmc6NnB4OwogICAgYm9yZGVyLXJhZGl1czoxNHB4OwogICAgdG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjsKICB9CiAgLmNlbGx7CiAgICBiYWNrZ3JvdW5kOiNmZmZkZjg7CiAgICBib3JkZXItcmFkaXVzOjlweDsKICAgIGRpc3BsYXk6Z3JpZDtwbGFjZS1pdGVtczpjZW50ZXI7CiAgICBmb250LXdlaWdodDo4MDA7CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIHBvc2l0aW9uOnJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xNXMsIHRyYW5zZm9ybSAuMTJzOwogICAgdXNlci1zZWxlY3Q6bm9uZTsKICB9CiAgLmNlbGw6aG92ZXJ7YmFja2dyb3VuZDojZmRmNmVhO30KICAuY2VsbDphY3RpdmV7dHJhbnNmb3JtOnNjYWxlKC45NCk7fQogIC5jZWxsIC5tYXJrewogICAgb3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguNCk7CiAgICB0cmFuc2l0aW9uOm9wYWNpdHkgLjE4cywgdHJhbnNmb3JtIC4xOHM7CiAgICBsaW5lLWhlaWdodDoxOwogIH0KICAuY2VsbC54IC5tYXJre29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGUoMSk7Y29sb3I6dmFyKC0tYWNjZW50KTt9CiAgLmNlbGwubyAubWFya3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpO2NvbG9yOnZhcigtLWJsdWUpO30KICAuY2VsbC5sYXN0OjphZnRlcnsKICAgIGNvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDsKICAgIGJvcmRlcjoycHggc29saWQgdmFyKC0tZ29sZCk7Ym9yZGVyLXJhZGl1czo5cHg7CiAgICBwb2ludGVyLWV2ZW50czpub25lOwogIH0KICAuY2VsbC5oaW50ewogICAgYmFja2dyb3VuZDp2YXIoLS1nb2xkLXNvZnQpOwogICAgYW5pbWF0aW9uOmhpbnRQdWxzZSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgY3Vyc29yOmRlZmF1bHQ7CiAgfQogIC5jZWxsLmhpbnQgLmhpbnQtZG90ewogICAgb3BhY2l0eToxOwogICAgcG9zaXRpb246YWJzb2x1dGU7CiAgICBmb250LXNpemU6LjM0ZW07CiAgICBjb2xvcjp2YXIoLS1nb2xkKTsKICAgIHRyYW5zZm9ybTpzY2FsZSgxKTsKICAgIGZvbnQtd2VpZ2h0OjkwMDsKICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7CiAgfQogIEBrZXlmcmFtZXMgaGludFB1bHNlewogICAgMCUsMTAwJXsgYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMjAxLDE2MiwzOSwuNTUpOyB9CiAgICA1MCV7IGJveC1zaGFkb3c6MCAwIDAgOXB4IHJnYmEoMjAxLDE2MiwzOSwwKTsgfQogIH0KICAuY2VsbC53aW57YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQtc29mdCk7fQogIC5jZWxsLndpbiAubWFya3thbmltYXRpb246cG9wIC40cyBlYXNlO30KICBAa2V5ZnJhbWVzIHBvcHswJXt0cmFuc2Zvcm06c2NhbGUoLjYpfTYwJXt0cmFuc2Zvcm06c2NhbGUoMS4yNSl9MTAwJXt0cmFuc2Zvcm06c2NhbGUoMSl9fQoKICAvKiAtLS0tLS0tLS0tIOaOp+WItiAtLS0tLS0tLS0tICovCiAgLnJvd3tkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDt9CiAgYnV0dG9uewogICAgZm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo3MDA7CiAgICBib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JhY2tncm91bmQ6I2ZmZmRmODtjb2xvcjp2YXIoLS1pbmspOwogICAgYm9yZGVyLXJhZGl1czoxMXB4O3BhZGRpbmc6OXB4IDE0cHg7Y3Vyc29yOnBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMXMsIGJhY2tncm91bmQgLjE1cywgYm9yZGVyLWNvbG9yIC4xNXM7CiAgfQogIGJ1dHRvbjphY3RpdmV7dHJhbnNmb3JtOnNjYWxlKC45NSk7fQogIGJ1dHRvbjpkaXNhYmxlZHtvcGFjaXR5Oi40MjtjdXJzb3I6bm90LWFsbG93ZWQ7fQogIGJ1dHRvbi5wcmltYXJ5e2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTtib3JkZXItY29sb3I6dmFyKC0tYWNjZW50KTtjb2xvcjojZmZmO30KICBidXR0b24ucHJpbWFyeTpob3Zlcjpub3QoOmRpc2FibGVkKXtiYWNrZ3JvdW5kOiNiODVhMzU7fQogIC5zZWd7ZGlzcGxheTpmbGV4O2JhY2tncm91bmQ6I2YzZjBlOTtib3JkZXItcmFkaXVzOjEycHg7cGFkZGluZzo0cHg7Z2FwOjRweDtmbGV4OjE7bWluLXdpZHRoOjA7fQogIC5zZWcgYnV0dG9uewogICAgZmxleDoxO2JvcmRlcjpub25lO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6dmFyKC0taW5rLXNvZnQpOwogICAgYm9yZGVyLXJhZGl1czo5cHg7cGFkZGluZzo4cHggNHB4O2ZvbnQtc2l6ZToxMy41cHg7CiAgfQogIC5zZWcgYnV0dG9uLm9ue2JhY2tncm91bmQ6dmFyKC0tcGFuZWwpO2NvbG9yOnZhcigtLWluayk7Ym94LXNoYWRvdzowIDFweCA0cHggcmdiYSgwLDAsMCwuMDkpO30KCiAgLnNjb3Jlc3tkaXNwbGF5OmZsZXg7Z2FwOjhweDt9CiAgLnNjb3JlewogICAgZmxleDoxO2JhY2tncm91bmQ6I2ZhZjdmMTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgYm9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTBweDt0ZXh0LWFsaWduOmNlbnRlcjsKICB9CiAgLnNjb3JlIC5udW17Zm9udC1zaXplOjIycHg7Zm9udC13ZWlnaHQ6ODAwO2xpbmUtaGVpZ2h0OjEuMjt9CiAgLnNjb3JlIC5jYXB7Zm9udC1zaXplOjExLjVweDtjb2xvcjp2YXIoLS1pbmstc29mdCk7bWFyZ2luLXRvcDoycHg7fQoKICAudGlwe2ZvbnQtc2l6ZToxMi41cHg7Y29sb3I6dmFyKC0taW5rLXNvZnQpO2xpbmUtaGVpZ2h0OjEuNzt9CiAgLnRpcCBie2NvbG9yOnZhcigtLWluayk7fQogIGtiZHsKICAgIGJhY2tncm91bmQ6I2YzZjBlOTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JvcmRlci1ib3R0b20td2lkdGg6MnB4OwogICAgYm9yZGVyLXJhZGl1czo1cHg7cGFkZGluZzoxcHggNnB4O2ZvbnQtc2l6ZToxMS41cHg7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDo3MDA7CiAgfQogIC5iYW5uZXJ7CiAgICBkaXNwbGF5Om5vbmU7CiAgICBib3JkZXItcmFkaXVzOjEycHg7cGFkZGluZzoxMnB4IDE0cHg7bWFyZ2luLWJvdHRvbToxNHB4OwogICAgZm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxNXB4O3RleHQtYWxpZ246Y2VudGVyOwogIH0KICAuYmFubmVyLnNob3d7ZGlzcGxheTpibG9jazthbmltYXRpb246cG9wIC4zNXMgZWFzZTt9CiAgLmJhbm5lci53aW57YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQtc29mdCk7Y29sb3I6dmFyKC0tYWNjZW50KTt9CiAgLmJhbm5lci5sb3Nle2JhY2tncm91bmQ6dmFyKC0tYmx1ZS1zb2Z0KTtjb2xvcjp2YXIoLS1ibHVlKTt9CiAgLmJhbm5lci5kcmF3e2JhY2tncm91bmQ6I2YzZjBlOTtjb2xvcjp2YXIoLS1pbmstc29mdCk7fQogIC5oaW50LWNhcmR7YmFja2dyb3VuZDp2YXIoLS1nb2xkLXNvZnQpO2JvcmRlci1jb2xvcjojZWNkOWEwO30KICAuaGludC1jYXJkIC5sYWJlbHtjb2xvcjojOWE3YjEyO30KICAuaGludC10ZXh0e2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNzU7Y29sb3I6IzZiNTQwNztmb250LXdlaWdodDo2MDA7fQogIC5oaW50LXRleHQgLnNwb3R7CiAgICBkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjEuNXB4IHNvbGlkIHZhcigtLWdvbGQpOwogICAgYm9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzowIDdweDttYXJnaW46MCAycHg7Zm9udC13ZWlnaHQ6ODAwO2NvbG9yOiM4YTZkMGY7CiAgfQogIGZvb3Rlcnt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTEuNXB4O2NvbG9yOiNhODljOTA7bWFyZ2luLXRvcDoxOHB4O2xpbmUtaGVpZ2h0OjEuODt9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHkgZGF0YS1wYWdlLW5vZGUtaWQ9IktsREJWRVlJZkJqcFZWSDlCSWhYa0wiPgo8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJhbFVFeG5CM3NyYmdpaUpnVUY3SmJaIiBjbGFzcz0id3JhcCI+CgogIDxoZWFkZXIgZGF0YS1wYWdlLW5vZGUtaWQ9Im04N29JeFNueVJTYW1lMW9rNU5lQmgiPgogICAgPGgxIGRhdGEtcGFnZS1ub2RlLWlkPSJiOEVFT0JHNGwyQWRoeVlCaGY4b0FMIj48IS0tcG5pZDpJYTRYdTBEQVpYckdqRXlFMnZJRWM1LS0+5LqV5a2X5qOLPHNwYW4gZGF0YS1wYWdlLW5vZGUtaWQ9IlhibjZPZTN3eGRMOGoyMFZESE1LVzciIGNsYXNzPSJkb3QiPjwhLS1wbmlkOjdEcktRdVNLZUNueGlOVmhCRk1xY3ItLT7Ctzwvc3Bhbj48IS0tcG5pZDpiNWJyWDZYYzJjUlZCT3R3NFRkeTJaLS0+5YS/56ul54mIPC9oMT4KICAgIDxwIGRhdGEtcGFnZS1ub2RlLWlkPSJJdmRlWlBId0oyQTczdVlxRVYyS09rIiBjbGFzcz0ic3ViIj48IS0tcG5pZDp5Z0VvZHVPNU1Wd2I2ajFyZVRBN1JOLS0+5qiq56uW5pac5YWI6L+e5oiQ5LiJ5Liq5L2g5bCx6LWi5ZWmPC9wPgogIDwvaGVhZGVyPgoKICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJkZUFSUmszUmphUnozcUtLc2xNNlZtIiBjbGFzcz0iYmFubmVyIiBpZD0iYmFubmVyIj48L2Rpdj4KCiAgPCEtLXBuaWQ6N0dOTWc1WlpDdDNQYjQ1bmxDdmNBMi0tPjwhLS0g54q25oCBIC0tPgogIDxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9Ikk2YnV6WGhrZUJaTFB4UzVHRUNSNWkiIGNsYXNzPSJjYXJkIj4KICAgIDxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9InkzdVJKQzM2SGNhdkJseUlLazNkbHAiIGNsYXNzPSJzdGF0dXMiPgogICAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJtYVlqMm9YMDJiMnZNeVdTNDhoUm0xIiBjbGFzcz0idHVybi1tYXJrIiBpZD0idHVybk1hcmsiPjwhLS1wbmlkOnZQaUxUV2R6TXhxbDZrSUt4b01ubTAtLT5YPC9kaXY+CiAgICAgIDxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9InNsU3UweFA1MnNZTjUzWDdwSzBDNFEiIGNsYXNzPSJzdGF0dXMtdGV4dCI+CiAgICAgICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0idnloTlgzT1lidVVaQWlxNERZVkc0ZCIgY2xhc3M9InN0YXR1cy1tYWluIiBpZD0ic3RhdHVzTWFpbiI+PCEtLXBuaWQ6ekg2NGQwcVpld3V2RjVUdW9ZVm44by0tPui9ruWIsOS9oOi1sDwvZGl2PgogICAgICAgIDxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9Ik95Ylh3UFFTbjN1eW1uR1EzR1I4eEwiIGNsYXNzPSJzdGF0dXMtc3ViIiBpZD0ic3RhdHVzU3ViIj48IS0tcG5pZDpQMmdLOVZLeGpHanN3bkRkdHVpcVpiLS0+54K55LiA5Liq5qC85a2Q5pS+5LiLIFg8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9ImRuUzU2ckdjNFN5VkxNbGJSajh0bGwiIGNsYXNzPSJjbG9jayIgaWQ9ImNsb2NrIj48IS0tcG5pZDpEZDVJWTNONGRHb2tJak0xeTBteFlGLS0+MDA6MDA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8IS0tcG5pZDpWcEhEZ2tyeW5EWEJPY3RibFVhVENyLS0+PCEtLSDmo4vnm5ggLS0+CiAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iMElBUEpWaFZWQXVSYW10aTRBRkhXWSIgY2xhc3M9ImNhcmQiPgogICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iWWxxQlBNOEtDbGRWdVpsdXpLcnczNSIgY2xhc3M9ImJvYXJkLWJveCI+PGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0ib0J5ckdkV2dWaFJjWVgydkFtdml2aSIgY2xhc3M9ImJvYXJkIiBpZD0iYm9hcmQiPjwvZGl2PjwvZGl2PgogIDwvZGl2PgoKICA8IS0tcG5pZDp5YVR3WDdJcXlFb29WM2Z2dmV0NlNWLS0+PCEtLSDmk43kvZwgLS0+CiAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iN1pHUzJiclpobldzc0hqWGhhWmlXaiIgY2xhc3M9ImNhcmQiPgogICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0icXNZaHVIS0Y2VEV4dXlWdUI3T09DOSIgY2xhc3M9ImxhYmVsIj48IS0tcG5pZDptaWhXR29STnVya2NpdFF0WDVkT0dhLS0+5pON5L2cPC9kaXY+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJnYVVoVUlkSWRJUGNDYllzcTJLSmoxIiBjbGFzcz0icm93Ij4KICAgICAgPGJ1dHRvbiBkYXRhLXBhZ2Utbm9kZS1pZD0idld6SGhEc3JCZXpxZnVuRVlJVzJ1OCIgY2xhc3M9InByaW1hcnkiIGlkPSJidG5OZXciIHN0eWxlPSJmbGV4OjEiPjwhLS1wbmlkOnNvdktQdTdPV3FWWjRxZ2ZsQTJIYUEtLT7mlrDnmoTkuIDlsYA8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBkYXRhLXBhZ2Utbm9kZS1pZD0iY1dHZjlzREZjdVQwTEJ5NG1uTXNnMyIgaWQ9ImJ0bkhpbnQiIHN0eWxlPSJmbGV4OjEiPjwhLS1wbmlkOmpLSE44ZXpJZmt5VWFVOFMwWmVHVW4tLT7wn5KhIOaPkOekujwvYnV0dG9uPgogICAgPC9kaXY+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJla0JZS0kyRFh5OE9PWE1QNVBKVnR1IiBjbGFzcz0icm93IiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPgogICAgICA8YnV0dG9uIGRhdGEtcGFnZS1ub2RlLWlkPSJ2UUtZb3NES1lVT2lSdGxQQWluYjJZIiBpZD0iYnRuVW5kbyIgc3R5bGU9ImZsZXg6MSI+PCEtLXBuaWQ6aVlpU3RuR1htcFNrTlE5cEZ3UTJMeC0tPuaClOS4gOatpTwvYnV0dG9uPgogICAgICA8YnV0dG9uIGRhdGEtcGFnZS1ub2RlLWlkPSI1d3dUdlBYOGVjNGt1YUpmYjJxVmN4IiBpZD0iYnRuU3dhcCIgc3R5bGU9ImZsZXg6MSI+PCEtLXBuaWQ6d2o4Y1JLVFhsVmQxYkVpN1dTTFBEVS0tPuaNouWFiOaJizwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9kaXY+CgogIDwhLS1wbmlkOmdYTHQ2VTJSaVN1QWtMT0FYWVpuelQtLT48IS0tIOaPkOekuuivtOaYjiAtLT4KICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJrYmRSTTI0aGR6eXJXTkhobWdiTTA2IiBjbGFzcz0iY2FyZCBoaW50LWNhcmQiIGlkPSJoaW50Q2FyZCI+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJ3Q25JeEJZbGw5YVpoMmVGWnVJUU1xIiBjbGFzcz0ibGFiZWwiPjwhLS1wbmlkOjB1eEN4RnV4Z3VOeWJrS3VTUGZzZEYtLT7wn5KhIOaPkOekujwvZGl2PgogICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iVEpZRldTS3FSTEYyN2VscWFvTHBaNyIgY2xhc3M9ImhpbnQtdGV4dCIgaWQ9ImhpbnRUZXh0Ij48IS0tcG5pZDpRRExzT05TRDgxb1QxdFlwdGtYbW5lLS0+54K544CM5o+Q56S644CN77yM5oiR5Lya5ZGK6K+J5L2g6K+l5LiL5Zyo5ZOq6YeM44CCPC9kaXY+CiAgPC9kaXY+CgogIDwhLS1wbmlkOk9LeDlXRURJWktBUVY2M3F3UWZBZlEtLT48IS0tIOiuvue9riAtLT4KICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJIa3pKZkV3d3NPZEtYbU5FWlhlOFlxIiBjbGFzcz0iY2FyZCI+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJoSEQ1WUp2QnpZNnZPRUdlU1lsa1RSIiBjbGFzcz0ibGFiZWwiPjwhLS1wbmlkOjVjdXpFb2lTM2pXeVBPd2hWWUVxeFEtLT7mo4vnm5jlpKflsI88L2Rpdj4KICAgIDxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9IlczcUxiNHJGRTZ6OVpzakRiV0ZNQk4iIGNsYXNzPSJzZWciIGlkPSJzZWdTaXplIj4KICAgICAgPGJ1dHRvbiBkYXRhLXBhZ2Utbm9kZS1pZD0iWjAwWGRpMmp6dU5rSDZZR2VtQTlOSCIgY2xhc3M9Im9uIiBkYXRhLXNpemU9IjMiPjwhLS1wbmlkOnl5NFNzWThmU2dRNnJkRVBaNU1HOUgtLT4zw5czIMK3IOS4ieWtkDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGRhdGEtcGFnZS1ub2RlLWlkPSJ6bTVwZFVpQkdpUDBrcUtCY2I4QXFjIiBkYXRhLXNpemU9IjQiPjwhLS1wbmlkOmliTElReUJZcHpLcGpCVlFsZmd6eEItLT40w5c0IMK3IOWbm+WtkDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGRhdGEtcGFnZS1ub2RlLWlkPSJyQkhFd0UzUWJ5d1Q0dDZWd3doMGUzIiBkYXRhLXNpemU9IjUiPjwhLS1wbmlkOnNLOFVNbE5WZDZrbmE4TUFSaHl0dDYtLT41w5c1IMK3IOWbm+i/njwvYnV0dG9uPgogICAgPC9kaXY+CgogICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0ia3Z0VElpcmRPdkMwSEJEbWtnOTlQRyIgY2xhc3M9ImxhYmVsIiBzdHlsZT0ibWFyZ2luLXRvcDoxNnB4Ij48IS0tcG5pZDpRT1ZrN1VZQVRUbVNLRkYyWm1xN0R5LS0+55S16ISR6Zq+5bqmPC9kaXY+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSI4TlZvTWlNZUdrYmlRcFBCeVZIY1lQIiBjbGFzcz0ic2VnIiBpZD0ic2VnTGV2ZWwiPgogICAgICA8YnV0dG9uIGRhdGEtcGFnZS1ub2RlLWlkPSJpTThLSUpCdURHOHFhbzFzeVBPY255IiBkYXRhLWxldmVsPSJlYXN5Ij48IS0tcG5pZDoxNHV0NGtLWW13QlRydmRZaEtJbk11LS0+566A5Y2VPC9idXR0b24+CiAgICAgIDxidXR0b24gZGF0YS1wYWdlLW5vZGUtaWQ9Im9kb0JubU9LUXhpZllzU1pFbTBrcEUiIGNsYXNzPSJvbiIgZGF0YS1sZXZlbD0ibm9ybWFsIj48IS0tcG5pZDpmbDNCUE1iMW04NURtMnpzSjYwNzJ4LS0+5pmu6YCaPC9idXR0b24+CiAgICAgIDxidXR0b24gZGF0YS1wYWdlLW5vZGUtaWQ9InpIcTVmbkpUWERBV3ZBQ1JnNFg5ZFgiIGRhdGEtbGV2ZWw9ImhhcmQiPjwhLS1wbmlkOmZhRHFXd0VHNXBkbVFVaEtyZ0doemwtLT7lm7Dpmr48L2J1dHRvbj4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8IS0tcG5pZDpDcGk5bFBjTnN2NWxEa21DblhlNWV6LS0+PCEtLSDmiJjnu6kgLS0+CiAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iTGpIeVU5WVBLS0Q1bDVIbEVhTEhodyIgY2xhc3M9ImNhcmQiPgogICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0idzR4NGJpSmxJMnR2MFJSdEZoUXU4QSIgY2xhc3M9ImxhYmVsIj48IS0tcG5pZDpIc1ZJMkJkNWJVTjJzQnp2YUZ0S0hCLS0+5oiY57up77yI5pys5py65L+d5a2Y77yJPC9kaXY+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJsRVZpMkpjU25BeDM1RkVOZGZvVXNLIiBjbGFzcz0ic2NvcmVzIj4KICAgICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iTVJhc2xPQ1ZheVRseFFnZUxjWGdWQiIgY2xhc3M9InNjb3JlIj48ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJqVkRBeWhYNUJGQkdKbGFPbTZRUUt4IiBjbGFzcz0ibnVtIiBpZD0ic1dpbiIgc3R5bGU9ImNvbG9yOnZhcigtLWFjY2VudCkiPjwhLS1wbmlkOjNBQnpkc3BrN0lIWjFMN0oxQzB2QTQtLT4wPC9kaXY+PGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iY3pRdzZ3aldPc1ZVRTQ0VU1QbVFqYSIgY2xhc3M9ImNhcCI+PCEtLXBuaWQ6MUZ3TXZxSmROS214SlMwV2RjaVhtbS0tPuS9oOi1ojwvZGl2PjwvZGl2PgogICAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSI3anpSSUludXZYRUdRZ0t5WlRGYjd1IiBjbGFzcz0ic2NvcmUiPjxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9IkVaRVpsbXo2UzFEQ1RFSGdnTlpCM2EiIGNsYXNzPSJudW0iIGlkPSJzTG9zZSIgc3R5bGU9ImNvbG9yOnZhcigtLWJsdWUpIj48IS0tcG5pZDpyMEFyOU9yZWthQUZBSUYyaWlvOUtiLS0+MDwvZGl2PjxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9IlZQcHZLb0pNdjVoVW5KQldXalRKZVciIGNsYXNzPSJjYXAiPjwhLS1wbmlkOmRHQVZyTUIzZmNvaFVyeUJvU1BGNlktLT7nlLXohJHotaI8L2Rpdj48L2Rpdj4KICAgICAgPGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iaDBjVUh1NGFsSVNHQ3ptcXEwMFBPbiIgY2xhc3M9InNjb3JlIj48ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJ6SmtOc3F0eHF3WTlMY2IxMEdCUzhHIiBjbGFzcz0ibnVtIiBpZD0ic0RyYXciPjwhLS1wbmlkOlkycGp3TE5ZUjk5bmJqU0ExdGwxZEotLT4wPC9kaXY+PGRpdiBkYXRhLXBhZ2Utbm9kZS1pZD0iUVcxVDFyWHpFSUx6VEdnOGcxcmxpQyIgY2xhc3M9ImNhcCI+PCEtLXBuaWQ6dmFkMFNtOFZ3R01KV0wycGZJRENOTS0tPuW5s+WxgDwvZGl2PjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJTQ1lHVlozUWtNOHdtNjRSTW8zdk1XIiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4Ij48YnV0dG9uIGRhdGEtcGFnZS1ub2RlLWlkPSJEdElyZXJiUWxQOXFTNkNFRjRjdk9NIiBpZD0iYnRuUmVzZXQiIHN0eWxlPSJ3aWR0aDoxMDAlIj48IS0tcG5pZDpIYTZISzlsV2xCaldxbW5RaVN6TnJxLS0+5riF56m65oiY57upPC9idXR0b24+PC9kaXY+CiAgPC9kaXY+CgogIDwhLS1wbmlkOlRXZnVFM3pDV1B3cElSNnFLdHQxN3AtLT48IS0tIOeOqeazlSAtLT4KICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJtTEpLd0dIT1hVVFlEdmNFYk1IWlJvIiBjbGFzcz0iY2FyZCI+CiAgICA8ZGl2IGRhdGEtcGFnZS1ub2RlLWlkPSJGV29MSkg2Rm9lU1cyUmRGdEFiN3hsIiBjbGFzcz0ibGFiZWwiPjwhLS1wbmlkOlJvWGlBZGNqQ3lYMWxxZXhyQTlDSEctLT7mgI7kuYjnjqk8L2Rpdj4KICAgIDxkaXYgZGF0YS1wYWdlLW5vZGUtaWQ9IkU5S0U5SW0zbmJwd3U1OWZpVFZOTm0iIGNsYXNzPSJ0aXAiPjwhLS1wbmlkOnh4eUhyQ2gzeGljcDFPV2xZeDlTaWctLT4KICAgICAg5L2g5omnIDxiIGRhdGEtcGFnZS1ub2RlLWlkPSJ1d3p2ZFczNGgwd2M1MzB4cXFVb1hmIj48IS0tcG5pZDptVUdCRDlLak5nRGdNY1FVT3hBaVRQLS0+WDwvYj48IS0tcG5pZDpydWVOZ0ZJRTV5djhnWG9WZ2RWUEx4LS0+77yM55S16ISR5omnIDxiIGRhdGEtcGFnZS1ub2RlLWlkPSJHNHd6QlV0U2ZrT2N3Y2pwaG4zYTVWIj48IS0tcG5pZDpCazA4ZVBYcWF2UFYwT0FWNm8xRVJOLS0+TzwvYj48IS0tcG5pZDp3bWh0U2M3a09SdDk0WnVqMXJoUWd6LS0+77yM6L2u5rWB6JC95a2Q44CCPGJyIGRhdGEtcGFnZS1ub2RlLWlkPSI4Szk1UDNmMVdON2x2MkZoWUg0cnE3Ij48IS0tcG5pZDpEQjhIRVhuYkZQWmtRMVVKQXBJb3lILS0+CiAgICAgIOWFiOaKiiA8YiBkYXRhLXBhZ2Utbm9kZS1pZD0iZTZmNU1Rb3Q1SEs5NTlxaUtUS05QNCI+PCEtLXBuaWQ6bWFmQmNxdkthMzZveEQzd0hHSkF4cS0tPuaoquOAgeerluaIluaWnOe6vzwvYj48IS0tcG5pZDpkUHdvdHdGNUsxZXVKQlJaSVJqSW1xLS0+IOi/nuaIkOS4gOaVtOadoeWwsei1ouKAlOKAlDPDlzMg6L+eIDMg5Liq77yMNMOXNCDlkowgNcOXNSDov54gNCDkuKrjgII8YnIgZGF0YS1wYWdlLW5vZGUtaWQ9IjJsTlNOcFZQN2NxU08xWWZPWlM3UFUiPjwhLS1wbmlkOkZDc01hMjVRMjVnVW5xMmdGSkp3RkQtLT4KICAgICAg5qOL55uY5LiL5ruh5LqG6L+Y5rKh5Lq66L+e5oiQ57q/77yM5bCx5piv5bmz5bGA44CCPGJyIGRhdGEtcGFnZS1ub2RlLWlkPSJjTUl3UmdpekUydGpjdnhZeFVtUXJCIj48IS0tcG5pZDpESksydXRpdUFySm9SYk00OVE0WHl1LS0+CiAgICAgIOS4jeefpemBk+ivpeS4i+WTqu+8n+eCuSA8YiBkYXRhLXBhZ2Utbm9kZS1pZD0ieGRCM1MwblFUd0Z3cWFUeUxtRGF2SSI+PCEtLXBuaWQ6cjdZTWJWNW16anBsWTdmOG9Ed3k1Si0tPvCfkqEg5o+Q56S6PC9iPjwhLS1wbmlkOkFTS0hhenFQb2NwY0tZM1FwOTBXYkUtLT7vvIzkvJrlkYror4nkvaDkuIvlnKjlk6rph4zjgIHkuLrku4DkuYjov5nkuYjkuIvjgII8YnIgZGF0YS1wYWdlLW5vZGUtaWQ9Ind4ZVdJd0ZSVlRyem00M1JKTXNDRWsiPjwhLS1wbmlkOlFDUnh1RFh3V3l4cTdVOHd3SmVpa1ktLT4KICAgICAg5o+Q56S677ya55S16ISR5ZyoPGIgZGF0YS1wYWdlLW5vZGUtaWQ9InM2ZHVMaThwWlRJMjh5R0R5SDRESjMiPjwhLS1wbmlkOmV5ZEhHRGgzMFREcXBwWnFUNGl2eWUtLT7lm7Dpmr48L2I+PCEtLXBuaWQ6eGJVWjBPVkUweFgxRWVoNEVxTUVsdy0tPumavuW6puS4i+S8mueul+acgOS9s+i1sOazle+8jOWHoOS5jui1ouS4jeS6hu+8mzxiIGRhdGEtcGFnZS1ub2RlLWlkPSJmclVzN3JQWldJc1lMWDVvV1pwWkhwIj48IS0tcG5pZDpUZ3VOM1Jxd3RMVHNGd2pVMDRuekJVLS0+566A5Y2VPC9iPjwhLS1wbmlkOk5ZMndxM0hvYW12dnFSZEpEZDlpQ00tLT7pmr7luqbpgILlkIjliJrlrabop4TliJnnmoTlsI/mnIvlj4vjgIIKICAgIDwvZGl2PgogIDwvZGl2PgoKICA8Zm9vdGVyIGRhdGEtcGFnZS1ub2RlLWlkPSJZek1QU0JjQ2RUZ0tKd2w0Sm1RTFQ5Ij48IS0tcG5pZDpnamNxN3dpR2NJZUd0cHFiV0VnY0hqLS0+57qv5YmN56uv5Y2V5paH5Lu2572R6aG1IMK3IOaXoOmcgOiBlOe9kSDCtyDmiJjnu6nlj6rlrZjlnKjov5nlj7Dorr7lpIc8YnIgZGF0YS1wYWdlLW5vZGUtaWQ9IkJwZnFIRlNHSW9vNmFibWpUQlVBSjYiPjwhLS1wbmlkOjVSQ29CZWRaWjFPUVppUHRVek5KUkotLT7lu7rorq7lnKjlrrbplb/pmarkvLTkuIvkvb/nlKjvvIzmr4/mrKHnjqkgMTXigJMyMCDliIbpkp/vvIzorrDlvpfov5znnLrkvJHmga/nnLznnZs8L2Zvb3Rlcj4KPC9kaXY+Cgo8c2NyaXB0IGRhdGEtcGFnZS1ub2RlLWlkPSJxT1ZpTzNEVjRLdGJYWnlYS3ZZb1pUIiBkYXRhLXBuaWQtY2hpbGRyZW49IkZ2TnFGbHZKcElsUW4zZG84SVVKdFEiPgooKCkgPT4gewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gPT09PT09PT09PT09IOmFjee9riA9PT09PT09PT09PT0KICBjb25zdCBTSVpFUyA9IHsgMzp7azozLGNlbGw6ODh9LCA0OntrOjQsY2VsbDo2NH0sIDU6e2s6NCxjZWxsOjUyfSB9OwogIGxldCBzaXplID0gMzsKICBsZXQgbGV2ZWwgPSAnbm9ybWFsJzsKICBsZXQgaHVtYW5Jc1ggPSB0cnVlOwoKICBsZXQgYm9hcmQgPSBbXTsgICAgICAgIC8vIDDnqbogMT1YKOeOqeWutikgMj1PKOeUteiEkSkg4oCUIOWni+e7iOaMieatpOagh+iusO+8jGh1bWFuSXNYIOWGs+WumuiwgeaYr+S6ugogIGxldCBrID0gMzsKICBsZXQgaGlzdG9yeSA9IFtdOwogIGxldCBsYXN0TW92ZSA9IC0xOwogIGxldCB3aW5DZWxscyA9IFtdOwogIGxldCBvdmVyID0gZmFsc2U7CiAgbGV0IHRoaW5raW5nID0gZmFsc2U7CiAgbGV0IHN0YXJ0VGltZSA9IDAsIGVsYXBzZWQgPSAwLCB0aWNrVGltZXIgPSBudWxsOwogIGxldCBoaW50Q2VsbCA9IC0xOyAgICAgIC8vIOiiq+aPkOekuumrmOS6rueahOagvOWtkO+8jC0xIOihqOekuuaXoAogIGxldCBoaW50VGV4dCA9ICcnOyAgICAgIC8vIOaPkOekuuaWh+WtlwoKICBjb25zdCAkID0gaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogIGNvbnN0IGJvYXJkRWwgPSAkKCdib2FyZCcpOwoKICAvLyA9PT09PT09PT09PT0g5oiY57up5a2Y5qGjID09PT09PT09PT09PQogIGNvbnN0IEtFWSA9ICd0dHRfa2lkc19zY29yZV92MSc7CiAgbGV0IHNjb3JlID0ge3dpbjowLCBsb3NlOjAsIGRyYXc6MH07CiAgdHJ5ewogICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oS0VZKTsKICAgIGlmKHJhdykgc2NvcmUgPSBPYmplY3QuYXNzaWduKHNjb3JlLCBKU09OLnBhcnNlKHJhdykpOwogIH1jYXRjaChlKXt9CiAgZnVuY3Rpb24gc2F2ZVNjb3JlKCl7CiAgICB0cnl7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoc2NvcmUpKTsgfWNhdGNoKGUpe30KICB9CiAgZnVuY3Rpb24gcGFpbnRTY29yZSgpewogICAgJCgnc1dpbicpLnRleHRDb250ZW50ID0gc2NvcmUud2luOwogICAgJCgnc0xvc2UnKS50ZXh0Q29udGVudCA9IHNjb3JlLmxvc2U7CiAgICAkKCdzRHJhdycpLnRleHRDb250ZW50ID0gc2NvcmUuZHJhdzsKICB9CgogIC8vID09PT09PT09PT09PSDpn7PmlYggPT09PT09PT09PT09CiAgbGV0IGFjdHggPSBudWxsOwogIGZ1bmN0aW9uIGJlZXAoZnJlcSwgZHVyLCB0eXBlKXsKICAgIHRyeXsKICAgICAgaWYoIWFjdHgpIGFjdHggPSBuZXcgKHdpbmRvdy5BdWRpb0NvbnRleHR8fHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKCk7CiAgICAgIGlmKGFjdHguc3RhdGUgPT09ICdzdXNwZW5kZWQnKSBhY3R4LnJlc3VtZSgpOwogICAgICBjb25zdCBvID0gYWN0eC5jcmVhdGVPc2NpbGxhdG9yKCksIGcgPSBhY3R4LmNyZWF0ZUdhaW4oKTsKICAgICAgby50eXBlID0gdHlwZSB8fCAnc2luZSc7CiAgICAgIG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcTsKICAgICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgYWN0eC5jdXJyZW50VGltZSk7CiAgICAgIGcuZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMTQsIGFjdHguY3VycmVudFRpbWUgKyAwLjAxMik7CiAgICAgIGcuZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMDAwMSwgYWN0eC5jdXJyZW50VGltZSArIGR1cik7CiAgICAgIG8uY29ubmVjdChnKTsgZy5jb25uZWN0KGFjdHguZGVzdGluYXRpb24pOwogICAgICBvLnN0YXJ0KCk7IG8uc3RvcChhY3R4LmN1cnJlbnRUaW1lICsgZHVyICsgMC4wMik7CiAgICB9Y2F0Y2goZSl7fQogIH0KICBjb25zdCBzUGxhY2UgPSAoKSA9PiBiZWVwKDUyMCwgMC4wNywgJ3RyaWFuZ2xlJyk7CiAgY29uc3Qgc1dpbiAgID0gKCkgPT4geyBbNTIzLDY1OSw3ODQsMTA0Nl0uZm9yRWFjaCgoZixpKT0+c2V0VGltZW91dCgoKT0+YmVlcChmLDAuMTQsJ3NpbmUnKSwgaSo5NSkpOyB9OwogIGNvbnN0IHNMb3NlICA9ICgpID0+IHsgWzM5MiwzMzAsMjYyXS5mb3JFYWNoKChmLGkpPT5zZXRUaW1lb3V0KCgpPT5iZWVwKGYsMC4xOSwndHJpYW5nbGUnKSwgaSoxMTUpKTsgfTsKICBjb25zdCBzRHJhdyAgPSAoKSA9PiB7IFs0NDAsNDQwXS5mb3JFYWNoKChmLGkpPT5zZXRUaW1lb3V0KCgpPT5iZWVwKGYsMC4xMywnc2luZScpLCBpKjExMCkpOyB9OwoKICAvLyA9PT09PT09PT09PT0g6IOc6LSf5Yik5a6aID09PT09PT09PT09PQogIGZ1bmN0aW9uIGxpbmVzKCl7CiAgICBjb25zdCByZXMgPSBbXTsKICAgIGNvbnN0IG4gPSBzaXplOwogICAgLy8g5qiq44CB56uWCiAgICBmb3IobGV0IHI9MDtyPG47cisrKXsKICAgICAgZm9yKGxldCBjPTA7YzxuO2MrKyl7CiAgICAgICAgaWYoYytrPD1uKXsgY29uc3QgYT1bXTsgZm9yKGxldCBpPTA7aTxrO2krKykgYS5wdXNoKHIqbitjK2kpOyByZXMucHVzaChhKTsgfQogICAgICAgIGlmKHIrazw9bil7IGNvbnN0IGE9W107IGZvcihsZXQgaT0wO2k8aztpKyspIGEucHVzaCgocitpKSpuK2MpOyByZXMucHVzaChhKTsgfQogICAgICB9CiAgICB9CiAgICAvLyDmlpzlkJHvvJrlt6bkuIrihpLlj7PkuIsg5LiOIOWPs+S4iuKGkuW3puS4iwogICAgZm9yKGxldCByPTA7cjxuO3IrKykgZm9yKGxldCBjPTA7YzxuO2MrKyl7CiAgICAgIGlmKHIrazw9biAmJiBjK2s8PW4peyBjb25zdCBhPVtdOyBmb3IobGV0IGk9MDtpPGs7aSsrKSBhLnB1c2goKHIraSkqbitjK2kpOyByZXMucHVzaChhKTsgfQogICAgICBpZihyK2s8PW4gJiYgYy0oay0xKT49MCl7IGNvbnN0IGE9W107IGZvcihsZXQgaT0wO2k8aztpKyspIGEucHVzaCgocitpKSpuK2MtaSk7IHJlcy5wdXNoKGEpOyB9CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KICBsZXQgQUxMX0xJTkVTID0gW107CiAgZnVuY3Rpb24gZmluZFdpbihiKXsKICAgIGZvcihjb25zdCBMIG9mIEFMTF9MSU5FUyl7CiAgICAgIGNvbnN0IHYgPSBiW0xbMF1dOwogICAgICBpZih2ID09PSAwKSBjb250aW51ZTsKICAgICAgbGV0IG9rID0gdHJ1ZTsKICAgICAgZm9yKGxldCBpPTE7aTxMLmxlbmd0aDtpKyspIGlmKGJbTFtpXV0gIT09IHYpeyBvayA9IGZhbHNlOyBicmVhazsgfQogICAgICBpZihvaykgcmV0dXJuIEwuc2xpY2UoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBmdW5jdGlvbiBpc0Z1bGwoYil7IHJldHVybiBiLmV2ZXJ5KHYgPT4gdiAhPT0gMCk7IH0KCiAgLy8gPT09PT09PT09PT09IEFJ77yaTWluaW1heCArIEFscGhhLUJldGEgPT09PT09PT09PT09CiAgZnVuY3Rpb24gZXZhbHVhdGUoYiwgYWksIGh1KXsKICAgIGNvbnN0IEwgPSBmaW5kV2luKGIpOwogICAgaWYoTCkgcmV0dXJuIGJbTFswXV0gPT09IGFpID8gMSA6IC0xOwogICAgaWYoaXNGdWxsKGIpKSByZXR1cm4gMDsKICAgIGxldCBzID0gMDsKICAgIGZvcihjb25zdCBsaW5lIG9mIEFMTF9MSU5FUyl7CiAgICAgIGxldCBhYyA9IDAsIGhjID0gMDsKICAgICAgZm9yKGNvbnN0IGlkeCBvZiBsaW5lKXsKICAgICAgICBpZihiW2lkeF0gPT09IGFpKSBhYysrOwogICAgICAgIGVsc2UgaWYoYltpZHhdID09PSBodSkgaGMrKzsKICAgICAgfQogICAgICBpZihhYyAmJiBoYykgY29udGludWU7ICAgLy8g6K+l57q/5bey6KKr5Y+M5pa55Y2g5o2u77yM5aiB6IOB5oq15raICiAgICAgIGlmKGFjKSBzICs9IFswLCAyLCAxMiwgNjAsIDIwMF1bYWNdIHx8IDIwMDsKICAgICAgaWYoaGMpIHMgLT0gWzAsIDIsIDEyLCA2MCwgMjAwXVtoY10gfHwgMjAwOwogICAgfQogICAgLy8g6ZmQ5Yi25ZyoIMKxNDAwIOWGhe+8jOawuOi/nOWwj+S6jiBXSU5fQkFTRSgxMDAwKe+8jOmBv+WFjeS4juiDnOi0n+WIhuWAvOa3t+a3hgogICAgcmV0dXJuIE1hdGgubWF4KC00MDAsIE1hdGgubWluKDQwMCwgcykpOwogIH0KICBmdW5jdGlvbiBlbXB0eUNlbGxzKGIpewogICAgY29uc3QgYSA9IFtdOwogICAgZm9yKGxldCBpPTA7aTxiLmxlbmd0aDtpKyspIGlmKGJbaV0gPT09IDApIGEucHVzaChpKTsKICAgIHJldHVybiBhOwogIH0KICAvLyDotbDms5XmjpLluo/vvJrkvJjlhYjljaDkuK3lv4PjgIHlho3ljaDlt7LmnInlrZDml4HovrkKICBmdW5jdGlvbiBvcmRlck1vdmVzKGIsIGFpKXsKICAgIGNvbnN0IG4gPSBzaXplLCBtaWQgPSAobi0xKS8yOwogICAgcmV0dXJuIGVtcHR5Q2VsbHMoYikuc29ydCgocCxxKSA9PiBzY29yZShiLHAsYWkpIC0gc2NvcmUoYixxLGFpKSk7CiAgICBmdW5jdGlvbiBzY29yZShiLCBpZHgsIGFpKXsKICAgICAgY29uc3QgciA9IE1hdGguZmxvb3IoaWR4L24pLCBjID0gaWR4JW47CiAgICAgIGxldCBzID0gMTAgLSAoTWF0aC5hYnMoci1taWQpICsgTWF0aC5hYnMoYy1taWQpKSAqIDI7CiAgICAgIGNvbnN0IGRpcnMgPSBbWzEsMF0sWzAsMV0sWzEsMV0sWzEsLTFdXTsKICAgICAgZm9yKGNvbnN0IFtkcixkY10gb2YgZGlycyl7CiAgICAgICAgZm9yKGxldCBkPTE7ZDxrO2QrKyl7CiAgICAgICAgICBjb25zdCByMj1yK2RyKmQsIGMyPWMrZGMqZDsKICAgICAgICAgIGlmKHIyPDB8fHIyPj1ufHxjMjwwfHxjMj49bikgY29udGludWU7CiAgICAgICAgICBjb25zdCB2ID0gYltyMipuK2MyXTsKICAgICAgICAgIGlmKHYgPT09IGFpKSBzICs9IDY7CiAgICAgICAgICBlbHNlIGlmKHYgPT09IDApIHMgKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHM7CiAgICB9CiAgfQoKICAvLyDog5zotJ/liIblgLzlv4Xpobvov5zlpKfkuo4gZXZhbHVhdGUg55qE5ZCv5Y+R5byP5YiG5YC85Yy66Ze077yMCiAgLy8g5ZCm5YiZ5rex5bqm5oiq5pat5pe25ZCv5Y+R5byP5YiG5pWw5Lya55uW6L+HIuW3sue7j+i+k+WumuS6hiLnmoTkuovlrp7vvIzlr7zoh7QgQUkg5Li75Yqo6YCB5q2744CCCiAgLy8gV0lOX0JBU0Ug5Y+WIDEwMDDvvIxldmFsdWF0ZSDnmoTov5Tlm57lgLzooqvpmZDliLblnKggwrE0MDAg5Lul5YaF77yM5Lik6ICF5LiN5Lya5re35reG44CCCiAgY29uc3QgV0lOX0JBU0UgPSAxMDAwOwoKICAvLyDotJ/lkJHmnoHlpKfvvIhuZWdhbWF477yJ77ya5Y+q57u05oqkIuW9k+WJjeivpei1sOi/meS4gOaWuSLnmoTop4bop5LvvIzpgJLlvZLml7blj5botJ/lj7fjgIIKICAvLyDnm7jmr5QibWF4Rm9yL3RvTW92ZSDlj4zlj4LmlbAi77yMbmVnYW1heCDlj6rmnInkuIDkuKrop4bop5LvvIwKICAvLyDkuI3lj6/og73lh7rnjrAgbWluL21heCDliIbmlK/liKTmlq3lhpnlj43lr7zoh7Tlh63nqbrpgKDlh7rog5zlsYDnmoTpl67popjjgIIKICAvLyBwbHkg5LuOIDAg5byA5aeL6K6h77yM55So5LqO5aWW5Yqx6YCf6IOc77ya6LaK5pep5Y+W6IOc5YiG5YC86LaK6auY44CCCiAgLy8KICAvLyDms6jmhI/vvJrov5nph4zliLvmhI/kuI3kvb/nlKjnva7mjaLooagoVFQp44CC5bimIFRUIOeahCBBbHBoYS1CZXRhIOWtmOWcqOS4gOS4qumakOiUvemXrumimOKAlOKAlAogIC8vIOiDnOi0n+WIhuWAvOS4jiBwbHkg57uR5a6a77yIV0lOX0JBU0UgLSBwbHnvvInvvIzlkIzkuIDkuKrlsYDpnaLlnKjkuI3lkIwgcGx5IOS4i+WIhuWAvOS4jeWQjO+8mwogIC8vIOiAjCBBbHBoYS1CZXRhIOWJquaeneWPiOS8muaPkOWJjemAgOWHuu+8jOWvvOiHtOe8k+WtmOS4i+adpeeahOWAvOWPquaYryLovrnnlYwi6ICM6Z2e57K+56Gu5YC844CCCiAgLy8g5Lik6ICF5Y+g5Yqg5Lya6K6pIEFJIOWBtuWwlOmAieWIsOasoeS8mOeUmuiHs+mAgeWRveeahOi1sOazle+8iOWunua1iyAyMDAwIOWxgOmHjOi+kyAxMCDlsYDvvIwKICAvLyDnpoHnlKggVFQg5ZCO5Li6IDAg5bGA77yJ44CC5Y675o6JIFRUIOWQjuWNleatpee6piAxMG1z77yM5a6M5YWo5aSf55So77yM5q2j56Gu5oCn5LyY5YWI44CCCiAgZnVuY3Rpb24gbmVnYW1heChiLCBkZXB0aCwgYWxwaGEsIGJldGEsIHNpZGUsIHBseSl7CiAgICBjb25zdCBMID0gZmluZFdpbihiKTsKICAgIGlmKEwpIHJldHVybiBiW0xbMF1dID09PSBzaWRlID8gKFdJTl9CQVNFIC0gcGx5KSA6IC0oV0lOX0JBU0UgLSBwbHkpOwogICAgaWYoaXNGdWxsKGIpKSByZXR1cm4gMDsKICAgIGlmKGRlcHRoID09PSAwKSByZXR1cm4gZXZhbHVhdGUoYiwgc2lkZSwgMyAtIHNpZGUpOwoKICAgIGNvbnN0IG1vdmVzID0gb3JkZXJNb3ZlcyhiLCBzaWRlKTsKICAgIGxldCBiZXN0ID0gLUluZmluaXR5OwogICAgZm9yKGNvbnN0IG0gb2YgbW92ZXMpewogICAgICBiW21dID0gc2lkZTsKICAgICAgY29uc3QgdmFsID0gLW5lZ2FtYXgoYiwgZGVwdGgtMSwgLWJldGEsIC1hbHBoYSwgMyAtIHNpZGUsIHBseSArIDEpOwogICAgICBiW21dID0gMDsKICAgICAgaWYodmFsID4gYmVzdCkgYmVzdCA9IHZhbDsKICAgICAgaWYoYmVzdCA+IGFscGhhKSBhbHBoYSA9IGJlc3Q7CiAgICAgIGlmKGFscGhhID49IGJldGEpIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvLyBiZXRhIOWJquaenQogICAgfQogICAgcmV0dXJuIGJlc3Q7CiAgfQoKICAvLyDmkJzntKLmt7Hluqbpmo/mo4vnm5jlpKflsI/osIPmlbTvvJoKICAvLyAzeDMg5oC75YWx5pyA5aSaIDgg5omL77yMZGVwdGggOSDljbPkuLrlrozmlbTmkJzntKIg4oaSIOWbsOmavumavuW6pue7neaXoOa8j+a0ngogIC8vIDR4NCAvIDV4NSDlrozmlbTmkJzntKLnu4TlkIjmlbDov4flpKfvvIznlKjmnInpmZDmt7HluqYgKyBBbHBoYS1CZXRhIOWJquaenSArIOi1sOazleaOkuW6jyArIOe9ruaNouihqAogIC8vIOa3seW6pue7j+i/h+Wunua1i+agoeWHhu+8muS/neivgeWNleatpeacgOWdj+iAl+aXtiA8IDMwMG1z77yM6YG/5YWN55WM6Z2i5Y2h6aG/CiAgZnVuY3Rpb24gZGVwdGhGb3IoKXsKICAgIGlmKHNpemUgPT09IDMpIHJldHVybiA5OyAgIC8vIOWujOaVtOaQnOe0ou+8jOWunua1i+e6piA2bXMv5q2lCiAgICBpZihzaXplID09PSA0KSByZXR1cm4gNDsgICAvLyDlrp7mtYvmnIDlnY/nuqYgMTIwbXMKICAgIHJldHVybiAzOyAgICAgICAgICAgICAgICAgLy8g5a6e5rWL5pyA5Z2P57qmIDE1MG1zCiAgfQoKICBmdW5jdGlvbiBhaU1vdmUoKXsKICAgIGNvbnN0IGFpID0gaHVtYW5Jc1ggPyAyIDogMTsKICAgIGNvbnN0IGh1ID0gMyAtIGFpOwogICAgY29uc3QgZW1wdGllcyA9IGVtcHR5Q2VsbHMoYm9hcmQpOwogICAgaWYoIWVtcHRpZXMubGVuZ3RoKSByZXR1cm47CgogICAgbGV0IHBpY2s7CgogICAgaWYobGV2ZWwgPT09ICdlYXN5Jyl7CiAgICAgIC8vIOeugOWNle+8mjYwJSDpmo/mnLrotbDvvIw0MCUg5oyh5LiA5omLCiAgICAgIGlmKE1hdGgucmFuZG9tKCkgPCAwLjYpewogICAgICAgIHBpY2sgPSBlbXB0aWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplbXB0aWVzLmxlbmd0aCldOwogICAgICB9ZWxzZXsKICAgICAgICBjb25zdCBibG9ja2VyID0gZmluZFdpbm5pbmdNb3ZlKGJvYXJkLCBodSk7CiAgICAgICAgcGljayA9IGJsb2NrZXIgIT09IC0xID8gYmxvY2tlciA6IGVtcHRpZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmVtcHRpZXMubGVuZ3RoKV07CiAgICAgIH0KICAgIH1lbHNlewogICAgICBjb25zdCBkZXB0aCA9IGxldmVsID09PSAnbm9ybWFsJyA/IDIgOiBkZXB0aEZvcigpOwogICAgICBjb25zdCBjYXAgPSBsZXZlbCA9PT0gJ25vcm1hbCcgPyAxMCA6IHNpemUqc2l6ZTsKICAgICAgY29uc3QgY2FuZCA9IG9yZGVyTW92ZXMoYm9hcmQsIGFpKS5zbGljZSgwLCBjYXApOwogICAgICBsZXQgYmVzdFNjb3JlID0gLUluZmluaXR5OwogICAgICBjb25zdCBzY29yZWQgPSBbXTsKICAgICAgZm9yKGNvbnN0IG0gb2YgY2FuZCl7CiAgICAgICAgYm9hcmRbbV0gPSBhaTsKICAgICAgICAvLyBuZWdhbWF4IOinhuinku+8muWni+e7iOS7pSBBSSDoh6rlt7HkuLogc2lkZe+8jHBseSDooajnpLrlt7LotbDmraXmlbAKICAgICAgICBjb25zdCBzID0gLW5lZ2FtYXgoYm9hcmQsIGRlcHRoLTEsIC1JbmZpbml0eSwgSW5maW5pdHksIGh1LCAxKTsKICAgICAgICBib2FyZFttXSA9IDA7CiAgICAgICAgc2NvcmVkLnB1c2goW20sIHNdKTsKICAgICAgICBpZihzID4gYmVzdFNjb3JlKSBiZXN0U2NvcmUgPSBzOwogICAgICB9CiAgICAgIC8vIOWcqOacgOS8mOWIhumHjOmaj+acuuaMkeS4gOS4qu+8jOWinuWKoOWPmOWMlgogICAgICBjb25zdCB0b3AgPSBzY29yZWQuZmlsdGVyKHggPT4geFsxXSA9PT0gYmVzdFNjb3JlKTsKICAgICAgcGljayA9IHRvcFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdG9wLmxlbmd0aCldWzBdOwoKICAgICAgLy8g5pmu6YCa6Zq+5bqm55WZ5LiA54K5IuWkseivr+aEnyLvvJo4JSDmpoLnjofotbDmrKHkvJjvvIzorqnmlrDmiYvmnInmnLrkvJrotaIKICAgICAgaWYobGV2ZWwgPT09ICdub3JtYWwnICYmIE1hdGgucmFuZG9tKCkgPCAwLjA4ICYmIHNjb3JlZC5sZW5ndGggPiAxKXsKICAgICAgICBwaWNrID0gc2NvcmVkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpNYXRoLm1pbig0LCBzY29yZWQubGVuZ3RoKSldWzBdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGljazsKICB9CgogIGZ1bmN0aW9uIGZpbmRXaW5uaW5nTW92ZShiLCBwbGF5ZXIpewogICAgZm9yKGNvbnN0IEwgb2YgQUxMX0xJTkVTKXsKICAgICAgbGV0IGNudCA9IDAsIGVtcHR5ID0gLTEsIGJsb2NrZWQgPSBmYWxzZTsKICAgICAgZm9yKGNvbnN0IGlkeCBvZiBMKXsKICAgICAgICBpZihiW2lkeF0gPT09IHBsYXllcikgY250Kys7CiAgICAgICAgZWxzZSBpZihiW2lkeF0gPT09IDApIGVtcHR5ID0gaWR4OwogICAgICAgIGVsc2UgYmxvY2tlZCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYoY250ID09PSBrLTEgJiYgIWJsb2NrZWQgJiYgZW1wdHkgIT09IC0xKSByZXR1cm4gZW1wdHk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICAvLyA9PT09PT09PT09PT0g5o+Q56S6ID09PT09PT09PT09PQogIC8vIOWIhue6p+aPkOekuu+8muiDveebtOaOpeivtOaYjuWOn+WboO+8jOiAjOS4jeWPquaYr+e7meWHuuWdkOagh+OAggogIC8vICAgMSkg6Ieq5bex6IO96L+e5oiQ57q/IOKGkiDmj5DnpLrnm7TmjqXmjIflh7oi5LiL6L+Z6YeM5bCx6LWiIgogIC8vICAgMikg5a+55omL5LiL5LiA5omL6IO96LWiIOKGkiDmj5DnpLrljrvloLUKICAvLyAgIDMpIOiHquW3seiDvemAoOWHuuWPjOmHjeWogeiDge+8iGZvcmvvvInihpIg5o+Q56S66L+Z5piv6L+b5pS75py65LyaCiAgLy8gICA0KSDku6XkuIrpg73msqHmnIkg4oaSIOeUqOW9k+WJjemavuW6puWBmuS4gOatpeacgOS8mOaQnOe0ou+8jOaPkOekuiLmnIDkvbPkuIDmiYsiCiAgLy8g5o+Q56S65by65bqm6Lef6ZqP6Zq+5bqm77ya566A5Y2V5Y+q6K+0Iuivleivlei/memHjCLvvIzlm7Dpmr7kvJrpmYTluKbmiJjmnK/op6Pph4rjgIIKICBmdW5jdGlvbiBzaG93SGludCgpewogICAgaWYob3ZlciB8fCB0aGlua2luZyl7CiAgICAgIGhpbnRDZWxsID0gLTE7CiAgICAgIGhpbnRUZXh0ID0gb3ZlciA/ICfov5nlsYDlt7Lnu4/nu5PmnZ/llabvvIzngrnjgIzmlrDnmoTkuIDlsYDjgI3lho3mnaXkuIDmrKHlkKfjgIInIDogJ+eUteiEkeato+WcqOaDs++8jOetieS4gOS4i+S4i+OAgic7CiAgICAgIHBhaW50SGludCgpOyBwYWludCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihodW1hbklzWCA9PT0gZmFsc2UgJiYgIWJvYXJkLnNvbWUodiA9PiB2ID09PSAwKSl7IC8qIOWFnOW6lSAqLyB9CgogICAgY29uc3QgbWUgICA9IGh1bWFuSXNYID8gMSA6IDI7CiAgICBjb25zdCBmb2UgID0gMyAtIG1lOwogICAgY29uc3QgZW1wdCA9IGVtcHR5Q2VsbHMoYm9hcmQpOwogICAgaWYoIWVtcHQubGVuZ3RoKXsKICAgICAgaGludENlbGwgPSAtMTsKICAgICAgaGludFRleHQgPSAn5qOL55uY5bey57uP5ruh5LqG77yM5rKh5pyJ5Y+v5Lul5LiL55qE5Zyw5pa55LqG44CCJzsKICAgICAgcGFpbnRIaW50KCk7IHBhaW50KCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCBteU1hcmsgID0gaHVtYW5Jc1ggPyAn4pyVJyA6ICfil68nOwogICAgY29uc3QgZm9lTWFyayA9IGh1bWFuSXNYID8gJ+KXrycgOiAn4pyVJzsKICAgIGNvbnN0IHBvc1RleHQgPSBpID0+IGDnrKwgJHtNYXRoLmZsb29yKGkgLyBzaXplKSArIDF9IOihjOesrCAkeyhpICUgc2l6ZSkgKyAxfSDliJdgOwoKICAgIC8vIDEpIOaIkeiDveS4gOatpei/nuaIkOe6vwogICAgY29uc3Qgd2luQXQgPSBmaW5kV2lubmluZ01vdmUoYm9hcmQsIG1lKTsKICAgIGlmKHdpbkF0ICE9PSAtMSl7CiAgICAgIGhpbnRDZWxsID0gd2luQXQ7CiAgICAgIGhpbnRUZXh0ID0gYOS4i+i/memHjOWwseiDvei/nuaIkCAke2t9IOS4qu+8jDxiPuebtOaOpei1ojwvYj7vvIHkvY3nva7vvJoke3Bvc1RleHQod2luQXQpfeOAgmA7CiAgICAgIHBhaW50SGludCgpOyBwYWludCgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gMikg5a+55omL6IO95LiA5q2l6L+e5oiQ57q/IOKGkiDlv4XpobvloLUKICAgIGNvbnN0IGJsb2NrQXQgPSBmaW5kV2lubmluZ01vdmUoYm9hcmQsIGZvZSk7CiAgICBpZihibG9ja0F0ICE9PSAtMSl7CiAgICAgIGhpbnRDZWxsID0gYmxvY2tBdDsKICAgICAgaGludFRleHQgPSBgPGI+5bCP5b+D77yBPC9iPueUteiEkeS4i+S4gOatpeWwseimgeWcqCR7cG9zVGV4dChibG9ja0F0KX3ov57miJAgJHtrfSDkuKrkuobvvIxgICsKICAgICAgICAgICAgICAgICBg6LW257Sn5Y676YKj6YeM5aC15L2P5a6D44CCYDsKICAgICAgcGFpbnRIaW50KCk7IHBhaW50KCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyAzKSDog73pgKDlh7rlj4zph43lqIHog4HvvIjkuKTkuKrmoLzlrZDlkIzml7bmiJDnur/vvIznlLXohJHmjKHkuI3kvY/vvIkKICAgIGNvbnN0IGZvcmtzID0gW107CiAgICBmb3IoY29uc3QgbSBvZiBlbXB0KXsKICAgICAgYm9hcmRbbV0gPSBtZTsKICAgICAgY29uc3QgYSA9IGZpbmRXaW5uaW5nTW92ZShib2FyZCwgbWUpOwogICAgICBpZihhICE9PSAtMSl7CiAgICAgICAgLy8g6K+l54K55oiQ57q/5ZCO77yM55yL5piv5ZCm6L+Y5pyJ5Y+m5LiA5aSE6IO95oiQ57q/CiAgICAgICAgYm9hcmRbbV0gPSAwOwogICAgICAgIGJvYXJkW2FdID0gbWU7CiAgICAgICAgY29uc3QgYiA9IGZpbmRXaW5uaW5nTW92ZShib2FyZCwgbWUpOwogICAgICAgIGJvYXJkW2FdID0gMDsKICAgICAgICBpZihiICE9PSAtMSAmJiBiICE9PSBtKSBmb3Jrcy5wdXNoKG0pOwogICAgICB9CiAgICAgIGJvYXJkW21dID0gMDsKICAgIH0KICAgIGlmKGZvcmtzLmxlbmd0aCl7CiAgICAgIGhpbnRDZWxsID0gZm9ya3NbMF07CiAgICAgIGhpbnRUZXh0ID0gbGV2ZWwgPT09ICdoYXJkJwogICAgICAgID8gYOi/memHjOiDveWQjOaXtuWogeiDgTxiPuS4pOS4qjwvYj7kvY3nva7vvIznlLXohJHloLXkuI3ov4fmnaXvvIzov5vmlLvnmoTmnLrkvJrvvIHkvY3nva7vvJoke3Bvc1RleHQoZm9ya3NbMF0pfeOAgmAKICAgICAgICA6IGDor5Xor5Xov5nph4zvvIzog73orqnnlLXohJHlvojkuLrpmr7jgILkvY3nva7vvJoke3Bvc1RleHQoZm9ya3NbMF0pfeOAgmA7CiAgICAgIHBhaW50SGludCgpOyBwYWludCgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gNCkg55So5b2T5YmN6Zq+5bqm566X5LiA5q2l5pyA5LyYCiAgICBjb25zdCBkZXB0aCA9IGxldmVsID09PSAnZWFzeScgPyAxIDogKGxldmVsID09PSAnbm9ybWFsJyA/IDMgOiBkZXB0aEZvcigpKTsKICAgIGxldCBiZXN0ID0gLUluZmluaXR5LCBiZXN0TW92ZXMgPSBbXTsKICAgIGZvcihjb25zdCBtIG9mIGVtcHQpewogICAgICBib2FyZFttXSA9IG1lOwogICAgICBjb25zdCB2ID0gLW5lZ2FtYXgoYm9hcmQsIGRlcHRoLTEsIC1JbmZpbml0eSwgSW5maW5pdHksIGZvZSwgMSk7CiAgICAgIGJvYXJkW21dID0gMDsKICAgICAgaWYodiA+IGJlc3QpeyBiZXN0ID0gdjsgYmVzdE1vdmVzID0gW21dOyB9CiAgICAgIGVsc2UgaWYodiA9PT0gYmVzdCkgYmVzdE1vdmVzLnB1c2gobSk7CiAgICB9CiAgICBpZighYmVzdE1vdmVzLmxlbmd0aCkgYmVzdE1vdmVzID0gZW1wdDsKICAgIGNvbnN0IHBpY2sgPSBiZXN0TW92ZXNbMF07CiAgICBoaW50Q2VsbCA9IHBpY2s7CgogICAgY29uc3QgcyA9IGJlc3QgPiA0MDAgPyAn6L+Z5LiA5omL5b6I56iz77yM6IO95oqK5bGA6Z2i5o+h5Zyo6Ieq5bex5omL6YeM44CCJwogICAgICAgICAgICA6IGJlc3QgPiAwICAgPyAn6L+Z5LiA5omL5LiN6ZSZ77yM6IO95Y2g5L2P5Li75Yqo44CCJwogICAgICAgICAgICA6IGJlc3QgPCAtNDAwID8gJ+WxgOmdouacieeCueiiq+WKqO+8jOWFiOeos+S9j+WIq+aApeOAgicKICAgICAgICAgICAgOiAn6L+Z5LiA5omL5q+U6L6D5a6J5YWo77yM6LWw5LiL5Y6755yL55yL44CCJzsKICAgIGhpbnRUZXh0ID0gYOivleivlSA8Yj4ke3Bvc1RleHQocGljayl9PC9iPuOAgiR7bGV2ZWwgPT09ICdoYXJkJyA/IHMgOiAnJ31gOwogICAgcGFpbnRIaW50KCk7IHBhaW50KCk7CiAgfQoKICBmdW5jdGlvbiBjbGVhckhpbnQoKXsKICAgIGlmKGhpbnRDZWxsID09PSAtMSAmJiAhaGludFRleHQpIHJldHVybjsKICAgIGhpbnRDZWxsID0gLTE7CiAgICBoaW50VGV4dCA9ICcnOwogICAgcGFpbnRIaW50KCk7CiAgfQoKICBmdW5jdGlvbiBwYWludEhpbnQoKXsKICAgIGNvbnN0IGVsID0gJCgnaGludFRleHQnKTsKICAgIGlmKCFlbCkgcmV0dXJuOwogICAgZWwuaW5uZXJIVE1MID0gaGludFRleHQgfHwgJ+eCueOAjOaPkOekuuOAje+8jOaIkeS8muWRiuivieS9oOivpeS4i+WcqOWTqumHjOOAgic7CiAgfQoKICAvLyA9PT09PT09PT09PT0g5riy5p+TID09PT09PT09PT09PQogIGZ1bmN0aW9uIHBhaW50KCl7CiAgICBib2FyZEVsLmlubmVySFRNTCA9ICcnOwogICAgYm9hcmRFbC5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gYHJlcGVhdCgke3NpemV9LCAxZnIpYDsKICAgIGNvbnN0IG1heFB4ID0gTWF0aC5taW4oMzQwLCB3aW5kb3cuaW5uZXJXaWR0aCAtIDkwKTsKICAgIGNvbnN0IGNlbGxQeCA9IE1hdGguZmxvb3IoTWF0aC5taW4oU0laRVNbc2l6ZV0uY2VsbCwgbWF4UHggLyBzaXplKSk7CiAgICBib2FyZEVsLnN0eWxlLndpZHRoID0gKGNlbGxQeCAqIHNpemUgKyA2ICogc2l6ZSArIDEyKSArICdweCc7CgogICAgYm9hcmQuZm9yRWFjaCgodiwgaSkgPT4gewogICAgICBjb25zdCBpc0hpbnQgPSAoaSA9PT0gaGludENlbGwgJiYgdiA9PT0gMCAmJiAhb3Zlcik7CiAgICAgIGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZC5jbGFzc05hbWUgPSAnY2VsbCcgKyAodiA9PT0gMSA/ICcgeCcgOiB2ID09PSAyID8gJyBvJyA6ICcnKQogICAgICAgICAgICAgICAgICArIChpID09PSBsYXN0TW92ZSA/ICcgbGFzdCcgOiAnJykKICAgICAgICAgICAgICAgICAgKyAoaXNIaW50ID8gJyBoaW50JyA6ICcnKQogICAgICAgICAgICAgICAgICArICh3aW5DZWxscy5pbmNsdWRlcyhpKSA/ICcgd2luJyA6ICcnKTsKICAgICAgZC5zdHlsZS53aWR0aCA9IGNlbGxQeCArICdweCc7CiAgICAgIGQuc3R5bGUuaGVpZ2h0ID0gY2VsbFB4ICsgJ3B4JzsKICAgICAgZC5zdHlsZS5mb250U2l6ZSA9IE1hdGgucm91bmQoY2VsbFB4ICogMC41OCkgKyAncHgnOwogICAgICBkLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz0ibWFyayI+JHt2ID09PSAxID8gJ+KclScgOiB2ID09PSAyID8gJ+KXrycgOiAnJ308L3NwYW4+YDsKICAgICAgaWYoaXNIaW50KSBkLmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImhpbnQtZG90Ij7ilrw8L3NwYW4+JzsKICAgICAgaWYoIW92ZXIgJiYgIXRoaW5raW5nKSBkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gaHVtYW5QbGF5KGkpKTsKICAgICAgYm9hcmRFbC5hcHBlbmRDaGlsZChkKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2V0U3RhdHVzKG1haW4sIHN1YiwgbWFyaywgaXNBaSl7CiAgICAkKCdzdGF0dXNNYWluJykudGV4dENvbnRlbnQgPSBtYWluOwogICAgJCgnc3RhdHVzU3ViJykudGV4dENvbnRlbnQgPSBzdWI7CiAgICBjb25zdCB0bSA9ICQoJ3R1cm5NYXJrJyk7CiAgICB0bS50ZXh0Q29udGVudCA9IG1hcms7CiAgICB0bS5jbGFzc0xpc3QudG9nZ2xlKCdhaScsICEhaXNBaSk7CiAgfQoKICBmdW5jdGlvbiByZWZyZXNoU3RhdHVzKCl7CiAgICBpZihvdmVyKXsKICAgICAgaWYod2luQ2VsbHMubGVuZ3RoKXsKICAgICAgICBjb25zdCB3aW5uZXIgPSBib2FyZFt3aW5DZWxsc1swXV07CiAgICAgICAgY29uc3QgaHVtYW5Xb24gPSAod2lubmVyID09PSAxKSA9PT0gaHVtYW5Jc1g7CiAgICAgICAgc2V0U3RhdHVzKGh1bWFuV29uID8gJ+S9oOi1ouWVpu+8gfCfjoknIDogJ+eUteiEkei1ouS6hiDwn5i/JywKICAgICAgICAgICAgICAgICAgaHVtYW5Xb24gPyAn6L+Z5q2l6LWw5b6X55yf5ryC5LquJyA6ICflho3mnaXkuIDlsYDvvIzov5nmrKHkuIDlrprog73otaInLAogICAgICAgICAgICAgICAgICB3aW5uZXIgPT09IDEgPyAn4pyVJyA6ICfil68nLCAhKHdpbm5lciA9PT0gMSkpOwogICAgICB9ZWxzZXsKICAgICAgICBzZXRTdGF0dXMoJ+W5s+WxgCDwn6SdJywn5qOL55uY5ruh5LqG77yM6LCB5Lmf5rKh6L+e5oiQ57q/Jywn4oCUJywgZmFsc2UpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGh1bWFuVHVybiA9ICF0aGlua2luZzsKICAgIHNldFN0YXR1cyhodW1hblR1cm4gPyAn6L2u5Yiw5L2g6LWwJyA6ICfnlLXohJHmgJ3ogIPkuK3igKYnLAogICAgICAgICAgICAgIGh1bWFuVHVybiA/IGDngrnkuIDkuKrmoLzlrZDmlL7kuIsgJHtodW1hbklzWCA/ICfinJUnIDogJ+KXryd9YCA6ICfnqI3nrYnkuIDkuIvkuIvigKYnLAogICAgICAgICAgICAgIGh1bWFuVHVybiA/IChodW1hbklzWCA/ICfinJUnIDogJ+KXrycpIDogKGh1bWFuSXNYID8gJ+KXrycgOiAn4pyVJyksCiAgICAgICAgICAgICAgIWh1bWFuVHVybik7CiAgICAkKCdidG5VbmRvJykuZGlzYWJsZWQgPSBoaXN0b3J5Lmxlbmd0aCA9PT0gMDsKICB9CgogIGZ1bmN0aW9uIHNob3dCYW5uZXIodHlwZSwgdGV4dCl7CiAgICBjb25zdCBiID0gJCgnYmFubmVyJyk7CiAgICBiLmNsYXNzTmFtZSA9ICdiYW5uZXIgc2hvdyAnICsgdHlwZTsKICAgIGIudGV4dENvbnRlbnQgPSB0ZXh0OwogIH0KICBmdW5jdGlvbiBoaWRlQmFubmVyKCl7ICQoJ2Jhbm5lcicpLmNsYXNzTmFtZSA9ICdiYW5uZXInOyB9CgogIC8vID09PT09PT09PT09PSDorqHml7YgPT09PT09PT09PT09CiAgZnVuY3Rpb24gZm10KG1zKXsKICAgIGNvbnN0IHQgPSBNYXRoLmZsb29yKG1zLzEwMDApOwogICAgcmV0dXJuIFN0cmluZyhNYXRoLmZsb29yKHQvNjApKS5wYWRTdGFydCgyLCcwJykgKyAnOicgKyBTdHJpbmcodCU2MCkucGFkU3RhcnQoMiwnMCcpOwogIH0KICBmdW5jdGlvbiBzdGFydENsb2NrKCl7CiAgICBzdG9wQ2xvY2soKTsKICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCkgLSBlbGFwc2VkOwogICAgdGlja1RpbWVyID0gc2V0SW50ZXJ2YWwoKCk9PnsKICAgICAgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7CiAgICAgICQoJ2Nsb2NrJykudGV4dENvbnRlbnQgPSBmbXQoZWxhcHNlZCk7CiAgICB9LCAyMDApOwogIH0KICBmdW5jdGlvbiBzdG9wQ2xvY2soKXsKICAgIGlmKHRpY2tUaW1lcil7IGNsZWFySW50ZXJ2YWwodGlja1RpbWVyKTsgdGlja1RpbWVyID0gbnVsbDsgfQogIH0KCiAgLy8gPT09PT09PT09PT09IOa1geeoiyA9PT09PT09PT09PT0KICBmdW5jdGlvbiByZXNldCgpewogICAgc3RvcENsb2NrKCk7IGVsYXBzZWQgPSAwOyAkKCdjbG9jaycpLnRleHRDb250ZW50ID0gJzAwOjAwJzsKICAgIGsgPSBTSVpFU1tzaXplXS5rOwogICAgQUxMX0xJTkVTID0gbGluZXMoKTsKICAgIGJvYXJkID0gbmV3IEFycmF5KHNpemUqc2l6ZSkuZmlsbCgwKTsKICAgIGhpc3RvcnkgPSBbXTsKICAgIGxhc3RNb3ZlID0gLTE7IHdpbkNlbGxzID0gW107IG92ZXIgPSBmYWxzZTsgdGhpbmtpbmcgPSBmYWxzZTsKICAgIGhpbnRDZWxsID0gLTE7IGhpbnRUZXh0ID0gJyc7CiAgICBoaWRlQmFubmVyKCk7CiAgICBwYWludCgpOwogICAgcmVmcmVzaFN0YXR1cygpOwogICAgJCgnYnRuVW5kbycpLmRpc2FibGVkID0gdHJ1ZTsKICAgICQoJ2J0bkhpbnQnKS5kaXNhYmxlZCA9IGZhbHNlOwogICAgcGFpbnRIaW50KCk7CiAgICBzdGFydENsb2NrKCk7ICAgLy8g5LuO5byA5bGA5bCx6K6h5pe277yM6YG/5YWN6aaW5q2l5Y2z6IOc5pe2IHN0YXJ0VGltZSDkuLogMAogIH0KCiAgZnVuY3Rpb24gaHVtYW5QbGF5KGkpewogICAgaWYob3ZlciB8fCB0aGlua2luZyB8fCBib2FyZFtpXSAhPT0gMCkgcmV0dXJuOwogICAgY29uc3QgaHVtYW4gPSBodW1hbklzWCA/IDEgOiAyOwogICAgLy8g6JC95a2Q5ZCO5LiK5LiA6L2u55qE5o+Q56S65bey5aSx5pWI77yM5YWI5riF5o6J5YaN6YeN57uYCiAgICBoaW50Q2VsbCA9IC0xOyBoaW50VGV4dCA9ICcnOwogICAgcGFpbnRIaW50KCk7CiAgICBib2FyZFtpXSA9IGh1bWFuOwogICAgbGFzdE1vdmUgPSBpOwogICAgaGlzdG9yeS5wdXNoKHsgaSwgcGxheWVyOiBodW1hbiB9KTsKICAgIHNQbGFjZSgpOwogICAgcGFpbnQoKTsKICAgIGlmKGFmdGVyTW92ZSgpKSByZXR1cm47CiAgICBhaVR1cm4oKTsKICB9CgogIGZ1bmN0aW9uIGFpVHVybigpewogICAgdGhpbmtpbmcgPSB0cnVlOwogICAgcmVmcmVzaFN0YXR1cygpOwogICAgcGFpbnQoKTsKICAgIGNvbnN0IHdhaXQgPSBsZXZlbCA9PT0gJ2hhcmQnID8gMjYwIDogMzQwOwogICAgc2V0VGltZW91dCgoKT0+ewogICAgICBjb25zdCBwaWNrID0gYWlNb3ZlKCk7CiAgICAgIGlmKHBpY2sgPT09IHVuZGVmaW5lZCB8fCBwaWNrID09PSAtMSl7IHRoaW5raW5nID0gZmFsc2U7IGFmdGVyTW92ZSgpOyByZXR1cm47IH0KICAgICAgY29uc3QgYWkgPSBodW1hbklzWCA/IDIgOiAxOwogICAgICBib2FyZFtwaWNrXSA9IGFpOwogICAgICBsYXN0TW92ZSA9IHBpY2s7CiAgICAgIGhpc3RvcnkucHVzaCh7IGk6IHBpY2ssIHBsYXllcjogYWkgfSk7CiAgICAgIHNQbGFjZSgpOwogICAgICB0aGlua2luZyA9IGZhbHNlOwogICAgICBwYWludCgpOwogICAgICBpZighYWZ0ZXJNb3ZlKCkpIHJlZnJlc2hTdGF0dXMoKTsKICAgIH0sIHdhaXQpOwogIH0KCiAgZnVuY3Rpb24gYWZ0ZXJNb3ZlKCl7CiAgICBjb25zdCBMID0gZmluZFdpbihib2FyZCk7CiAgICBpZihMKXsKICAgICAgd2luQ2VsbHMgPSBMOyBvdmVyID0gdHJ1ZTsKICAgICAgc3RvcENsb2NrKCk7IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lOyAkKCdjbG9jaycpLnRleHRDb250ZW50ID0gZm10KGVsYXBzZWQpOwogICAgICBjb25zdCB3aW5uZXIgPSBib2FyZFtMWzBdXTsKICAgICAgY29uc3QgaHVtYW5Xb24gPSAod2lubmVyID09PSAxKSA9PT0gaHVtYW5Jc1g7CiAgICAgIGlmKGh1bWFuV29uKXsgc2NvcmUud2luKys7IHNXaW4oKTsgc2hvd0Jhbm5lcignd2luJywn5oGt5Zac77yB5L2g6LWi5LqGIPCfjoknKTsgfQogICAgICBlbHNlIHsgc2NvcmUubG9zZSsrOyBzTG9zZSgpOyBzaG93QmFubmVyKCdsb3NlJywn55S16ISR6LWi5LqG77yM5YaN5p2l5LiA5bGA5ZCn77yBJyk7IH0KICAgICAgc2F2ZVNjb3JlKCk7IHBhaW50U2NvcmUoKTsgcGFpbnQoKTsgcmVmcmVzaFN0YXR1cygpOwogICAgICAkKCdidG5VbmRvJykuZGlzYWJsZWQgPSB0cnVlOwogICAgICBoaW50Q2VsbCA9IC0xOyAkKCdidG5IaW50JykuZGlzYWJsZWQgPSB0cnVlOyBwYWludEhpbnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZihpc0Z1bGwoYm9hcmQpKXsKICAgICAgb3ZlciA9IHRydWU7CiAgICAgIHN0b3BDbG9jaygpOwogICAgICBzY29yZS5kcmF3Kys7IHNEcmF3KCk7CiAgICAgIHNob3dCYW5uZXIoJ2RyYXcnLCflubPlsYDvvIzmo4vnm5jmu6HllaYnKTsKICAgICAgc2F2ZVNjb3JlKCk7IHBhaW50U2NvcmUoKTsgcGFpbnQoKTsgcmVmcmVzaFN0YXR1cygpOwogICAgICAkKCdidG5VbmRvJykuZGlzYWJsZWQgPSB0cnVlOwogICAgICBoaW50Q2VsbCA9IC0xOyAkKCdidG5IaW50JykuZGlzYWJsZWQgPSB0cnVlOyBwYWludEhpbnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZighc3RhcnRUaW1lKSBzdGFydENsb2NrKCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiB1bmRvKCl7CiAgICBpZighaGlzdG9yeS5sZW5ndGggfHwgdGhpbmtpbmcpIHJldHVybjsKICAgIGNvbnN0IG1vdmVzID0gKGhpc3RvcnkubGVuZ3RoID49IDIpID8gMiA6IDE7CiAgICBmb3IobGV0IGk9MDtpPG1vdmVzO2krKyl7CiAgICAgIGNvbnN0IG0gPSBoaXN0b3J5LnBvcCgpOwogICAgICBib2FyZFttLmldID0gMDsKICAgICAgbGFzdE1vdmUgPSBoaXN0b3J5Lmxlbmd0aCA/IGhpc3RvcnlbaGlzdG9yeS5sZW5ndGgtMV0uaSA6IC0xOwogICAgfQogICAgb3ZlciA9IGZhbHNlOyB3aW5DZWxscyA9IFtdOyBoaWRlQmFubmVyKCk7CiAgICBoaW50Q2VsbCA9IC0xOyBoaW50VGV4dCA9ICcnOwogICAgJCgnYnRuSGludCcpLmRpc2FibGVkID0gZmFsc2U7CiAgICBwYWludEhpbnQoKTsKICAgIHBhaW50KCk7IHJlZnJlc2hTdGF0dXMoKTsKICB9CgogIC8vID09PT09PT09PT09PSDkuovku7YgPT09PT09PT09PT09CiAgJCgnYnRuTmV3JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldCk7CiAgJCgnYnRuVW5kbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdW5kbyk7CiAgJCgnYnRuSGludCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd0hpbnQpOwogICQoJ2J0blN3YXAnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgICBodW1hbklzWCA9ICFodW1hbklzWDsKICAgICQoJ2J0blN3YXAnKS50ZXh0Q29udGVudCA9IGh1bWFuSXNYID8gJ+aNouWFiOaJiycgOiAn5YaN5o2i5Zue5p2lJzsKICAgIHJlc2V0KCk7CiAgfSk7CiAgJCgnYnRuUmVzZXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgICBzY29yZSA9IHt3aW46MCwgbG9zZTowLCBkcmF3OjB9OwogICAgc2F2ZVNjb3JlKCk7IHBhaW50U2NvcmUoKTsKICB9KTsKCiAgJCgnc2VnU2l6ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZT0+ewogICAgY29uc3QgYiA9IGUudGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbicpOyBpZighYikgcmV0dXJuOwogICAgWy4uLiQoJ3NlZ1NpemUnKS5jaGlsZHJlbl0uZm9yRWFjaCh4PT54LmNsYXNzTGlzdC5yZW1vdmUoJ29uJykpOwogICAgYi5jbGFzc0xpc3QuYWRkKCdvbicpOwogICAgc2l6ZSA9ICtiLmRhdGFzZXQuc2l6ZTsKICAgIHJlc2V0KCk7CiAgfSk7CiAgJCgnc2VnTGV2ZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGU9PnsKICAgIGNvbnN0IGIgPSBlLnRhcmdldC5jbG9zZXN0KCdidXR0b24nKTsgaWYoIWIpIHJldHVybjsKICAgIFsuLi4kKCdzZWdMZXZlbCcpLmNoaWxkcmVuXS5mb3JFYWNoKHg9PnguY2xhc3NMaXN0LnJlbW92ZSgnb24nKSk7CiAgICBiLmNsYXNzTGlzdC5hZGQoJ29uJyk7CiAgICBsZXZlbCA9IGIuZGF0YXNldC5sZXZlbDsKICB9KTsKCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpPT57IHBhaW50KCk7IH0pOwoKICAvLyA9PT09PT09PT09PT0g5ZCv5YqoID09PT09PT09PT09PQogIHBhaW50U2NvcmUoKTsKICByZXNldCgpOwogIC8vIOmmluWxgOiHquWKqOiQveWtkO+8mueUteiEkeaJp+WFiAogIGlmKCFodW1hbklzWCkgYWlUdXJuKCk7Cn0pKCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4=

PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9InpoLUNOIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiIC8+Cjx0aXRsZT7kupXlrZfmo4sgwrcgVGljLVRhYy1Ub2U8L3RpdGxlPgo8c3R5bGU+CiAgKiB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsgfQogIDpyb290IHsKICAgIC0tcGFuZWw6IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjA2KTsKICAgIC0tbGluZTogcmdiYSgyNTUsIDI1NSwgMjU1LCAuMTQpOwogICAgLS10ZXh0OiAjZWVmMGZmOwogICAgLS1tdXRlZDogIzlhYTBjMzsKICAgIC0teDogIzRjYzlmMDsKICAgIC0tbzogI2Y3MjU4NTsKICAgIC0td2luOiAjZmZkMTY2OwogIH0KICBib2R5IHsKICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDE1cHg7IHBhZGRpbmc6IDIwcHggMTZweDsKICAgIGZvbnQtZmFtaWx5OiAiU2Vnb2UgVUkiLCAiUGluZ0ZhbmcgU0MiLCAiTWljcm9zb2Z0IFlhSGVpIiwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KDEyMDBweCA4MDBweCBhdCAxNSUgMCUsICMyMzFhNWUgMCUsICMwZjEyMjYgNDUlLCAjMGIwZDFmIDEwMCUpOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgfQogIGgxIHsgZm9udC1zaXplOiAyN3B4OyBsZXR0ZXItc3BhY2luZzogOHB4OyBmb250LXdlaWdodDogNzAwOyB9CiAgaDEgYiB7IGNvbG9yOiB2YXIoLS13aW4pOyB9CiAgLnN1YnRpdGxlIHsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAxM3B4OyBtYXJnaW4tdG9wOiAtMTRweDsgbGV0dGVyLXNwYWNpbmc6IDFweDsgfQoKICAubW9kZXMgeyBkaXNwbGF5OiBmbGV4OyBiYWNrZ3JvdW5kOiB2YXIoLS1wYW5lbCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiA5OTlweDsgcGFkZGluZzogNHB4OyBnYXA6IDRweDsgfQogIC5tb2RlcyBidXR0b24gewogICAgYm9yZGVyOiAwOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLW11dGVkKTsgcGFkZGluZzogN3B4IDE2cHg7IGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZm9udC1zaXplOiAxNHB4OyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zaXRpb246IC4yczsgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgfQogIC5tb2RlcyBidXR0b24uYWN0aXZlIHsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzQzNjFlZSwgIzcyMDliNyk7IGNvbG9yOiAjZmZmOyBib3gtc2hhZG93OiAwIDRweCAxNHB4IHJnYmEoNjcsIDk3LCAyMzgsIC4zNSk7IH0KCiAgLnNjb3JlcyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTRweDsgfQogIC5zY29yZSB7CiAgICBtaW4td2lkdGg6IDkycHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYmFja2dyb3VuZDogdmFyKC0tcGFuZWwpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHg7IHBhZGRpbmc6IDhweCAxMnB4OwogIH0KICAuc2NvcmUgLm51bSB7IGZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IDcwMDsgfQogIC5zY29yZSAubGFiZWwgeyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDsgfQogIC5zY29yZS54IC5udW0geyBjb2xvcjogdmFyKC0teCk7IH0KICAuc2NvcmUubyAubnVtIHsgY29sb3I6IHZhcigtLW8pOyB9CiAgLnNjb3JlLmQgLm51bSB7IGNvbG9yOiB2YXIoLS13aW4pOyB9CgogIC5ib2FyZCB7CiAgICBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCA5NnB4KTsgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQoMywgOTZweCk7CiAgICBnYXA6IDlweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tcGFuZWwpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgIGJvcmRlci1yYWRpdXM6IDIycHg7IGJveC1zaGFkb3c6IDAgMjBweCA1MHB4IHJnYmEoMCwgMCwgMCwgLjQ1KTsKICB9CiAgLmNlbGwgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAuMDQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBjdXJzb3I6IHBvaW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7IHRyYW5zaXRpb246IGJhY2tncm91bmQgLjE1cywgdHJhbnNmb3JtIC4xczsKICB9CiAgLmNlbGw6aG92ZXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIC4wOSk7IH0KICAuY2VsbDphY3RpdmUgeyB0cmFuc2Zvcm06IHNjYWxlKC45Nik7IH0KICAuY2VsbC5maWxsZWQgeyBjdXJzb3I6IGRlZmF1bHQ7IH0KICAuY2VsbC53aW4gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIwOSwgMTAyLCAuMTIpOyBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyMDksIDEwMiwgLjYpOwogICAgYm94LXNoYWRvdzogMCAwIDE4cHggcmdiYSgyNTUsIDIwOSwgMTAyLCAuMjUpIGluc2V0LCAwIDAgMjJweCByZ2JhKDI1NSwgMjA5LCAxMDIsIC4yKTsKICB9CiAgLmNlbGwuaGludCB7IGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDIwOSwgMTAyLCAuNzUpOyBhbmltYXRpb246IGhpbnRQdWxzZSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlOyB9CiAgLmNlbGwuaGludDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICLimIUiOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNnB4OyByaWdodDogOXB4OyBmb250LXNpemU6IDE1cHg7CiAgICBjb2xvcjogdmFyKC0td2luKTsgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgfQogIEBrZXlmcmFtZXMgaGludFB1bHNlIHsKICAgIDAlLCAxMDAlIHsgYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgyNTUsIDIwOSwgMTAyLCAuMTIpLCBpbnNldCAwIDAgMTBweCByZ2JhKDI1NSwgMjA5LCAxMDIsIC4xMik7IH0KICAgIDUwJSB7IGJveC1zaGFkb3c6IDAgMCAyMnB4IHJnYmEoMjU1LCAyMDksIDEwMiwgLjQ1KSwgaW5zZXQgMCAwIDE0cHggcmdiYSgyNTUsIDIwOSwgMTAyLCAuMyk7IH0KICB9CiAgLmNlbGwgc3ZnIHsgd2lkdGg6IDY0JTsgaGVpZ2h0OiA2NCU7IH0KICAuY2VsbCBzdmcgbGluZSwgLmNlbGwgc3ZnIGNpcmNsZSB7IGZpbGw6IG5vbmU7IHN0cm9rZS13aWR0aDogMTA7IHN0cm9rZS1saW5lY2FwOiByb3VuZDsgfQogIC5jZWxsLnggc3ZnIGxpbmUgeyBzdHJva2U6IHZhcigtLXgpOyB9CiAgLmNlbGwubyBzdmcgY2lyY2xlIHsgc3Ryb2tlOiB2YXIoLS1vKTsgfQogIC5jZWxsIHN2ZyAuc3Ryb2tlIHsgc3Ryb2tlLWRhc2hhcnJheTogMjAwOyBzdHJva2UtZGFzaG9mZnNldDogMjAwOyBhbmltYXRpb246IGRyYXcgLjI4cyBlYXNlLW91dCBmb3J3YXJkczsgfQogIEBrZXlmcmFtZXMgZHJhdyB7IHRvIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7IH0gfQoKICAuYm9hcmQudHVybi14IC5jZWxsOm5vdCguZmlsbGVkKTpob3Zlcjo6YWZ0ZXIsCiAgLmJvYXJkLnR1cm4tbyAuY2VsbDpub3QoLmZpbGxlZCk6aG92ZXI6OmFmdGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgZm9udC1zaXplOiA1MHB4OyBmb250LXdlaWdodDogODAwOyBvcGFjaXR5OiAuMjU7IHBvaW50ZXItZXZlbnRzOiBub25lOwogIH0KICAuYm9hcmQudHVybi14IC5jZWxsOm5vdCguZmlsbGVkKTpob3Zlcjo6YWZ0ZXIgeyBjb250ZW50OiAi4pyVIjsgY29sb3I6IHZhcigtLXgpOyB9CiAgLmJvYXJkLnR1cm4tbyAuY2VsbDpub3QoLmZpbGxlZCk6aG92ZXI6OmFmdGVyIHsgY29udGVudDogIuKXryI7IGNvbG9yOiB2YXIoLS1vKTsgfQoKICAuc3RhdHVzIHsgbWluLWhlaWdodDogMjhweDsgZm9udC1zaXplOiAxN3B4OyBsZXR0ZXItc3BhY2luZzogMXB4OyB9CiAgLnN0YXR1cyAuc3ggeyBjb2xvcjogdmFyKC0teCk7IGZvbnQtd2VpZ2h0OiA3MDA7IH0KICAuc3RhdHVzIC5zbyB7IGNvbG9yOiB2YXIoLS1vKTsgZm9udC13ZWlnaHQ6IDcwMDsgfQoKICAuYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgfQogIC5idG4gewogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7IGJhY2tncm91bmQ6IHZhcigtLXBhbmVsKTsgY29sb3I6IHZhcigtLXRleHQpOwogICAgcGFkZGluZzogOHB4IDIycHg7IGJvcmRlci1yYWRpdXM6IDEycHg7IGZvbnQtc2l6ZTogMTRweDsgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogLjJzOyBmb250LWZhbWlseTogaW5oZXJpdDsKICB9CiAgLmJ0bjpob3ZlciB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjEyKTsgfQogIC5idG46ZGlzYWJsZWQgeyBvcGFjaXR5OiAuNDsgY3Vyc29yOiBub3QtYWxsb3dlZDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0KICAuYnRuLnByaW1hcnkgeyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNDM2MWVlLCAjNzIwOWI3KTsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsgfQogIC5idG4ucHJpbWFyeTpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcygxLjE1KTsgfQoKICBAbWVkaWEgKG1heC13aWR0aDogNDMwcHgpIHsKICAgIC5ib2FyZCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIDkycHgpOyBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCA5MnB4KTsgfQogICAgaDEgeyBmb250LXNpemU6IDI0cHg7IGxldHRlci1zcGFjaW5nOiA1cHg7IH0KICB9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgPGgxPuS6leWtl+ajiyA8Yj7inJUg4pevPC9iPjwvaDE+CiAgPHAgY2xhc3M9InN1YnRpdGxlIj7kuInlrZDov57nj6DljbPojrfog5wgwrcg5Lq65py65qih5byP5L2g5omnIOKclSDlhYjmiYs8L3A+CgogIDxkaXYgY2xhc3M9Im1vZGVzIiBpZD0ibW9kZXMiPgogICAgPGJ1dHRvbiBkYXRhLW1vZGU9InB2cCIgY2xhc3M9ImFjdGl2ZSI+5Y+M5Lq65a+55oiYPC9idXR0b24+CiAgICA8YnV0dG9uIGRhdGEtbW9kZT0iZWFzeSI+5Lq65py6IMK3IOeugOWNlTwvYnV0dG9uPgogICAgPGJ1dHRvbiBkYXRhLW1vZGU9ImhhcmQiPuS6uuacuiDCtyDlm7Dpmr48L2J1dHRvbj4KICA8L2Rpdj4KCiAgPGRpdiBjbGFzcz0ic2NvcmVzIj4KICAgIDxkaXYgY2xhc3M9InNjb3JlIHgiPjxkaXYgY2xhc3M9Im51bSIgaWQ9InNjb3JlWCI+MDwvZGl2PjxkaXYgY2xhc3M9ImxhYmVsIiBpZD0ibGFiZWxYIj7njqnlrrYg4pyVPC9kaXY+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJzY29yZSBkIj48ZGl2IGNsYXNzPSJudW0iIGlkPSJzY29yZUQiPjA8L2Rpdj48ZGl2IGNsYXNzPSJsYWJlbCI+5bmz5bGAPC9kaXY+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJzY29yZSBvIj48ZGl2IGNsYXNzPSJudW0iIGlkPSJzY29yZU8iPjA8L2Rpdj48ZGl2IGNsYXNzPSJsYWJlbCIgaWQ9ImxhYmVsTyI+546p5a62IOKXrzwvZGl2PjwvZGl2PgogIDwvZGl2PgoKICA8ZGl2IGNsYXNzPSJib2FyZCB0dXJuLXgiIGlkPSJib2FyZCI+PC9kaXY+CgogIDxkaXYgY2xhc3M9InN0YXR1cyIgaWQ9InN0YXR1cyI+PC9kaXY+CgogIDxkaXYgY2xhc3M9ImFjdGlvbnMiPgogICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHByaW1hcnkiIGlkPSJyZXN0YXJ0Ij7lho3mnaXkuIDlsYA8L2J1dHRvbj4KICAgIDxidXR0b24gY2xhc3M9ImJ0biIgaWQ9ImhpbnQiPvCfkqEg5o+Q56S6PC9idXR0b24+CiAgICA8YnV0dG9uIGNsYXNzPSJidG4iIGlkPSJjbGVhciI+5q+U5YiG5riF6Zu2PC9idXR0b24+CiAgPC9kaXY+Cgo8c2NyaXB0PgogIGNvbnN0IGJvYXJkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm9hcmQnKTsKICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKTsKICBjb25zdCBoaW50QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpbnQnKTsKICBjb25zdCBMSU5FUyA9IFtbMCwxLDJdLFszLDQsNV0sWzYsNyw4XSxbMCwzLDZdLFsxLDQsN10sWzIsNSw4XSxbMCw0LDhdLFsyLDQsNl1dOwogIGNvbnN0IFhfU1ZHID0gJzxzdmcgdmlld0JveD0iMCAwIDEwMCAxMDAiPjxsaW5lIGNsYXNzPSJzdHJva2UiIHgxPSIyNCIgeTE9IjI0IiB4Mj0iNzYiIHkyPSI3NiIvPjxsaW5lIGNsYXNzPSJzdHJva2UiIHgxPSI3NiIgeTE9IjI0IiB4Mj0iMjQiIHkyPSI3NiIgc3R5bGU9ImFuaW1hdGlvbi1kZWxheTouMTVzIi8+PC9zdmc+JzsKICBjb25zdCBPX1NWRyA9ICc8c3ZnIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48Y2lyY2xlIGNsYXNzPSJzdHJva2UiIGN4PSI1MCIgY3k9IjUwIiByPSIyNyIvPjwvc3ZnPic7CgogIGxldCBtb2RlID0gJ3B2cCc7CiAgbGV0IGJvYXJkID0gQXJyYXkoOSkuZmlsbChudWxsKTsKICBsZXQgY3VycmVudCA9ICdYJzsKICBsZXQgb3ZlciA9IGZhbHNlOwogIGxldCBjZWxscyA9IFtdOwogIGxldCBoaW50SW5kZXggPSBudWxsOwogIC8vIOavj+enjeaooeW8j+eLrOeri+iusOWIhgogIGxldCBzY29yZXMgPSB7IHB2cDoge1g6MCwgTzowLCBEOjB9LCBlYXN5OiB7WDowLCBPOjAsIEQ6MH0sIGhhcmQ6IHtYOjAsIE86MCwgRDowfSB9OwogIHRyeSB7CiAgICBjb25zdCBzYXZlZCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RpY3RhY3RvZS1zY29yZXMtdjEnKSk7CiAgICBpZiAoc2F2ZWQgJiYgc2F2ZWQucHZwICYmIHNhdmVkLmVhc3kgJiYgc2F2ZWQuaGFyZCkgc2NvcmVzID0gc2F2ZWQ7CiAgfSBjYXRjaCAoZSkge30KCiAgZnVuY3Rpb24gc2F2ZVNjb3JlcygpIHsKICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0aWN0YWN0b2Utc2NvcmVzLXYxJywgSlNPTi5zdHJpbmdpZnkoc2NvcmVzKSk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICAvLyAtLS0tLS0tLS0tIOaji+ebmCAtLS0tLS0tLS0tCiAgZnVuY3Rpb24gY3JlYXRlQm9hcmQoKSB7CiAgICBib2FyZEVsLmlubmVySFRNTCA9ICcnOwogICAgY2VsbHMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgOTsgaSsrKSB7CiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgYy5jbGFzc05hbWUgPSAnY2VsbCc7CiAgICAgIGMuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ+agvOWtkCAnICsgKGkgKyAxKSk7CiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBvbkNlbGwoaSkpOwogICAgICBib2FyZEVsLmFwcGVuZENoaWxkKGMpOwogICAgICBjZWxscy5wdXNoKGMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyU2NvcmVzKCkgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njb3JlWCcpLnRleHRDb250ZW50ID0gc2NvcmVzW21vZGVdLlg7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NvcmVPJykudGV4dENvbnRlbnQgPSBzY29yZXNbbW9kZV0uTzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY29yZUQnKS50ZXh0Q29udGVudCA9IHNjb3Jlc1ttb2RlXS5EOwogICAgY29uc3QgdnNBSSA9IG1vZGUgIT09ICdwdnAnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYmVsWCcpLnRleHRDb250ZW50ID0gdnNBSSA/ICfkvaAgKOKclSknIDogJ+eOqeWutiDinJUnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYmVsTycpLnRleHRDb250ZW50ID0gdnNBSSA/ICfnlLXohJEgKOKXryknIDogJ+eOqeWutiDil68nOwogIH0KCiAgZnVuY3Rpb24gc2V0U3RhdHVzKGh0bWwpIHsgc3RhdHVzRWwuaW5uZXJIVE1MID0gaHRtbDsgfQoKICBmdW5jdGlvbiBtYXJrKHN5bSkgewogICAgcmV0dXJuIHN5bSA9PT0gJ1gnID8gJzxzcGFuIGNsYXNzPSJzeCI+4pyVPC9zcGFuPicgOiAnPHNwYW4gY2xhc3M9InNvIj7il688L3NwYW4+JzsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1cyh0aGlua2luZykgewogICAgYm9hcmRFbC5jbGFzc0xpc3QucmVtb3ZlKCd0dXJuLXgnLCAndHVybi1vJyk7CiAgICBoaW50QnRuLmRpc2FibGVkID0gb3ZlciB8fCB0aGlua2luZyB8fCAobW9kZSAhPT0gJ3B2cCcgJiYgY3VycmVudCA9PT0gJ08nKTsKICAgIGlmIChvdmVyKSByZXR1cm47CiAgICBib2FyZEVsLmNsYXNzTGlzdC5hZGQoY3VycmVudCA9PT0gJ1gnID8gJ3R1cm4teCcgOiAndHVybi1vJyk7CiAgICBpZiAodGhpbmtpbmcpIHsgc2V0U3RhdHVzKCfnlLXohJHmgJ3ogIPkuK3igKYnKTsgcmV0dXJuOyB9CiAgICBpZiAobW9kZSA9PT0gJ3B2cCcpIHNldFN0YXR1cygn6L2u5YiwICcgKyBtYXJrKGN1cnJlbnQpKTsKICAgIGVsc2Ugc2V0U3RhdHVzKGN1cnJlbnQgPT09ICdYJyA/ICfova7liLDkvaDkuoYgJyArIG1hcmsoJ1gnKSA6ICfnlLXohJHlm57lkIjigKYnKTsKICB9CgogIC8vIC0tLS0tLS0tLS0g5a+55bGAIC0tLS0tLS0tLS0KICBmdW5jdGlvbiBvbkNlbGwoaSkgewogICAgaWYgKG92ZXIgfHwgYm9hcmRbaV0pIHJldHVybjsKICAgIGlmIChtb2RlICE9PSAncHZwJyAmJiBjdXJyZW50ID09PSAnTycpIHJldHVybjsgLy8g55S16ISR5Zue5ZCI56aB5q2i6JC95a2QCiAgICBwbGF5KGkpOwogIH0KCiAgZnVuY3Rpb24gcGxheShpKSB7CiAgICBjbGVhckhpbnQoKTsKICAgIGJvYXJkW2ldID0gY3VycmVudDsKICAgIGNvbnN0IGMgPSBjZWxsc1tpXTsKICAgIGMuY2xhc3NMaXN0LmFkZCgnZmlsbGVkJywgY3VycmVudCA9PT0gJ1gnID8gJ3gnIDogJ28nKTsKICAgIGMuaW5uZXJIVE1MID0gY3VycmVudCA9PT0gJ1gnID8gWF9TVkcgOiBPX1NWRzsKCiAgICBjb25zdCB3ID0gZ2V0V2lubmVyKGJvYXJkKTsKICAgIGlmICh3KSByZXR1cm4gZmluaXNoKHsgcGxheWVyOiB3LnBsYXllciwgbGluZTogdy5saW5lIH0pOwogICAgaWYgKGJvYXJkLmV2ZXJ5KEJvb2xlYW4pKSByZXR1cm4gZmluaXNoKHsgZHJhdzogdHJ1ZSB9KTsKCiAgICBjdXJyZW50ID0gY3VycmVudCA9PT0gJ1gnID8gJ08nIDogJ1gnOwogICAgaWYgKG1vZGUgIT09ICdwdnAnICYmIGN1cnJlbnQgPT09ICdPJykgewogICAgICB1cGRhdGVTdGF0dXModHJ1ZSk7CiAgICAgIHNldFRpbWVvdXQoYWlNb3ZlLCAzODApOwogICAgfSBlbHNlIHsKICAgICAgdXBkYXRlU3RhdHVzKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRXaW5uZXIoYikgewogICAgZm9yIChjb25zdCBsaW5lIG9mIExJTkVTKSB7CiAgICAgIGNvbnN0IFthLCBjLCBkXSA9IGxpbmU7CiAgICAgIGlmIChiW2FdICYmIGJbYV0gPT09IGJbY10gJiYgYlthXSA9PT0gYltkXSkgcmV0dXJuIHsgcGxheWVyOiBiW2FdLCBsaW5lIH07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGZpbmlzaChyZXMpIHsKICAgIG92ZXIgPSB0cnVlOwogICAgYm9hcmRFbC5jbGFzc0xpc3QucmVtb3ZlKCd0dXJuLXgnLCAndHVybi1vJyk7CiAgICBoaW50QnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgIGlmIChyZXMubGluZSkgewogICAgICByZXMubGluZS5mb3JFYWNoKGkgPT4gY2VsbHNbaV0uY2xhc3NMaXN0LmFkZCgnd2luJykpOwogICAgICBzY29yZXNbbW9kZV1bcmVzLnBsYXllcl0rKzsKICAgICAgaWYgKG1vZGUgPT09ICdwdnAnKSBzZXRTdGF0dXMobWFyayhyZXMucGxheWVyKSArICcg6I636IOc77yB8J+OiScpOwogICAgICBlbHNlIHNldFN0YXR1cyhyZXMucGxheWVyID09PSAnWCcgPyAn5L2g6LWi5LqG77yB8J+OiScgOiAn55S16ISR6I636IOcIPCfpJYnKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjb3Jlc1ttb2RlXS5EKys7CiAgICAgIHNldFN0YXR1cygn5bmz5bGA77yB8J+knScpOwogICAgfQogICAgc2F2ZVNjb3JlcygpOwogICAgcmVuZGVyU2NvcmVzKCk7CiAgfQoKICBmdW5jdGlvbiByZXNldCgpIHsKICAgIGJvYXJkID0gQXJyYXkoOSkuZmlsbChudWxsKTsKICAgIGN1cnJlbnQgPSAnWCc7CiAgICBvdmVyID0gZmFsc2U7CiAgICBjbGVhckhpbnQoKTsKICAgIGNyZWF0ZUJvYXJkKCk7CiAgICB1cGRhdGVTdGF0dXMoKTsKICB9CgogIC8vIC0tLS0tLS0tLS0g55S16ISRIEFJIC0tLS0tLS0tLS0KICBmdW5jdGlvbiBhaU1vdmUoKSB7CiAgICBpZiAob3ZlcikgcmV0dXJuOwogICAgY29uc3QgZW1wdGllcyA9IGJvYXJkLm1hcCgodiwgaSkgPT4gdiA/IG51bGwgOiBpKS5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTsKICAgIGlmICghZW1wdGllcy5sZW5ndGgpIHJldHVybjsKICAgIGNvbnN0IGNhbmRzID0gbW9kZSA9PT0gJ2hhcmQnID8gYmVzdE1vdmVzRm9yKCdPJykgOiBlbXB0aWVzOwogICAgcGxheShjYW5kc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW5kcy5sZW5ndGgpXSk7CiAgfQoKICAvLyDmnoHlpKfmnoHlsI/mkJzntKLvvJrov5Tlm54gYWkg5LiA5pa555qE5omA5pyJ5pyA5LyY6JC954K5CiAgZnVuY3Rpb24gYmVzdE1vdmVzRm9yKGFpKSB7CiAgICBsZXQgYmVzdCA9IC1JbmZpbml0eSwgY2FuZGlkYXRlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgaWYgKGJvYXJkW2ldKSBjb250aW51ZTsKICAgICAgYm9hcmRbaV0gPSBhaTsKICAgICAgY29uc3QgcyA9IG1pbmltYXgoYm9hcmQsIDAsIGZhbHNlLCBhaSk7CiAgICAgIGJvYXJkW2ldID0gbnVsbDsKICAgICAgaWYgKHMgPiBiZXN0KSB7IGJlc3QgPSBzOyBjYW5kaWRhdGVzID0gW2ldOyB9CiAgICAgIGVsc2UgaWYgKHMgPT09IGJlc3QpIGNhbmRpZGF0ZXMucHVzaChpKTsKICAgIH0KICAgIHJldHVybiBjYW5kaWRhdGVzOwogIH0KCiAgZnVuY3Rpb24gbWluaW1heChiLCBkZXB0aCwgbWF4aW1pemluZywgYWkpIHsKICAgIGNvbnN0IHcgPSBnZXRXaW5uZXIoYik7CiAgICBpZiAodykgcmV0dXJuIHcucGxheWVyID09PSBhaSA/IDEwIC0gZGVwdGggOiBkZXB0aCAtIDEwOwogICAgaWYgKGIuZXZlcnkoQm9vbGVhbikpIHJldHVybiAwOwogICAgY29uc3QgaHVtYW4gPSBhaSA9PT0gJ1gnID8gJ08nIDogJ1gnOwogICAgbGV0IGJlc3QgPSBtYXhpbWl6aW5nID8gLUluZmluaXR5IDogSW5maW5pdHk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykgewogICAgICBpZiAoYltpXSkgY29udGludWU7CiAgICAgIGJbaV0gPSBtYXhpbWl6aW5nID8gYWkgOiBodW1hbjsKICAgICAgY29uc3QgcyA9IG1pbmltYXgoYiwgZGVwdGggKyAxLCAhbWF4aW1pemluZywgYWkpOwogICAgICBiW2ldID0gbnVsbDsKICAgICAgYmVzdCA9IG1heGltaXppbmcgPyBNYXRoLm1heChiZXN0LCBzKSA6IE1hdGgubWluKGJlc3QsIHMpOwogICAgfQogICAgcmV0dXJuIGJlc3Q7CiAgfQoKICAvLyAtLS0tLS0tLS0tIOaPkOekuiAtLS0tLS0tLS0tCiAgZnVuY3Rpb24gY2xlYXJIaW50KCkgewogICAgaWYgKGhpbnRJbmRleCAhPT0gbnVsbCAmJiBjZWxsc1toaW50SW5kZXhdKSB7CiAgICAgIGNlbGxzW2hpbnRJbmRleF0uY2xhc3NMaXN0LnJlbW92ZSgnaGludCcpOwogICAgfQogICAgaGludEluZGV4ID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHNob3dIaW50KCkgewogICAgaWYgKG92ZXIgfHwgKG1vZGUgIT09ICdwdnAnICYmIGN1cnJlbnQgPT09ICdPJykpIHJldHVybjsKICAgIGNsZWFySGludCgpOwogICAgY29uc3QgY2FuZHMgPSBiZXN0TW92ZXNGb3IoY3VycmVudCk7CiAgICBpZiAoIWNhbmRzLmxlbmd0aCkgcmV0dXJuOwogICAgaGludEluZGV4ID0gY2FuZHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FuZHMubGVuZ3RoKV07CiAgICBjZWxsc1toaW50SW5kZXhdLmNsYXNzTGlzdC5hZGQoJ2hpbnQnKTsKICAgIHNldFN0YXR1cygn8J+SoSDlu7rorq4gJyArIG1hcmsoY3VycmVudCkgKyAnIOiQveWcqOmrmOS6ruagvOWtkCcpOwogIH0KCiAgLy8gLS0tLS0tLS0tLSDkuovku7YgLS0tLS0tLS0tLQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7CiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCdidXR0b25bZGF0YS1tb2RlXScpOwogICAgaWYgKCFidG4pIHJldHVybjsKICAgIG1vZGUgPSBidG4uZGF0YXNldC5tb2RlOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI21vZGVzIGJ1dHRvbicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGIgPT09IGJ0bikpOwogICAgcmVuZGVyU2NvcmVzKCk7CiAgICByZXNldCgpOwogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN0YXJ0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dIaW50KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgIHNjb3Jlc1ttb2RlXSA9IHsgWDogMCwgTzogMCwgRDogMCB9OwogICAgc2F2ZVNjb3JlcygpOwogICAgcmVuZGVyU2NvcmVzKCk7CiAgfSk7CgogIGNyZWF0ZUJvYXJkKCk7CiAgcmVuZGVyU2NvcmVzKCk7CiAgdXBkYXRlU3RhdHVzKCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K

PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9InpoLUNOIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MSwgdXNlci1zY2FsYWJsZT1ubyIgLz4KPGxpbmsgcmVsPSJpY29uIiBocmVmPSJkYXRhOiwiIC8+Cjx0aXRsZT7kv4TnvZfmlq/mlrnlnZcgwrcgVGV0cmlzPC90aXRsZT4KPHN0eWxlPgogIDpyb290IHsKICAgIC0tYmcxOiAjMGIwZTFhOyAtLWJnMjogIzEzMWEzMzsKICAgIC0tcGFuZWw6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7CiAgICAtLWJvcmRlcjogcmdiYSgyNTUsMjU1LDI1NSwwLjA5KTsKICAgIC0tdGV4dDogI2U4ZWNmODsgLS1tdXRlZDogIzhiOTNiNTsKICAgIC0tYWNjZW50OiAjNmM1Y2U3OwogIH0KICAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB9CiAgaHRtbCwgYm9keSB7IGhlaWdodDogMTAwJTsgfQogIGJvZHkgewogICAgZm9udC1mYW1pbHk6ICJTZWdvZSBVSSIsICJQaW5nRmFuZyBTQyIsICJNaWNyb3NvZnQgWWFIZWkiLCBzYW5zLXNlcmlmOwogICAgYmFja2dyb3VuZDoKICAgICAgcmFkaWFsLWdyYWRpZW50KDExMDBweCA3MDBweCBhdCAxNSUgLTEwJSwgIzFiMjQ1MCAwJSwgdHJhbnNwYXJlbnQgNjAlKSwKICAgICAgcmFkaWFsLWdyYWRpZW50KDkwMHB4IDYwMHB4IGF0IDExMCUgMTEwJSwgIzI0MWE0ZCAwJSwgdHJhbnNwYXJlbnQgNTUlKSwKICAgICAgbGluZWFyLWdyYWRpZW50KDE2MGRlZywgdmFyKC0tYmcyKSwgdmFyKC0tYmcxKSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi1oZWlnaHQ6IDEwMHZoOyBwYWRkaW5nOiAxNHB4OyBnYXA6IDEycHg7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICB9CgogIC5oZWFkZXIgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDE0cHg7IH0KICAuaGVhZGVyIGgxIHsKICAgIGZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IDhweDsgdGV4dC1pbmRlbnQ6IDhweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzdkZDNmYywgI2MwODRmYyk7CiAgICAtd2Via2l0LWJhY2tncm91bmQtY2xpcDogdGV4dDsgYmFja2dyb3VuZC1jbGlwOiB0ZXh0OyBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgfQogIC5pY29uLWJ0biB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYW5lbCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICB3aWR0aDogMzhweDsgaGVpZ2h0OiAzMnB4OyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS10ZXh0KTsgZm9udC1zaXplOiAxNXB4OwogIH0KICAuaWNvbi1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LC4xKTsgfQoKICAuZ2FtZSB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTRweDsgYWxpZ24taXRlbXM6IHN0cmV0Y2g7IH0KICAuc2lkZSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDsgd2lkdGg6IDEzMnB4OyB9CiAgLnBhbmVsIHsgYmFja2dyb3VuZDogdmFyKC0tcGFuZWwpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiAxNHB4OyBwYWRkaW5nOiAxMnB4OyB9CiAgLnBhbmVsIGgyIHsgZm9udC1zaXplOiAxMXB4OyBsZXR0ZXItc3BhY2luZzogM3B4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDhweDsgZm9udC13ZWlnaHQ6IDYwMDsgfQogIC5wYW5lbCBjYW52YXMgeyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAwIGF1dG87IH0KCiAgLnN0YXRzIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA5cHg7IH0KICAuc3RhdCB7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGJhc2VsaW5lOyB9CiAgLnN0YXQgc3BhbiB7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMTJweDsgfQogIC5zdGF0IGIgeyBmb250LXNpemU6IDE2cHg7IGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7IH0KCiAgLmJvYXJkLXdyYXAgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH0KICAjYm9hcmQgewogICAgZGlzcGxheTogYmxvY2s7IGJvcmRlci1yYWRpdXM6IDEycHg7IGJhY2tncm91bmQ6ICMwZDEyMjY7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggdmFyKC0tYm9yZGVyKSwgMCAxMnB4IDQ0cHggcmdiYSgwLDAsMCwuNTUpLCAwIDAgNzBweCByZ2JhKDEwOCw5MiwyMzEsLjE0KTsKICB9CgogIC5vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgaW5zZXQ6IDA7IHotaW5kZXg6IDU7CiAgICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IHJnYmEoOCwxMCwyMiwuNzQpOyBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNXB4KTsgYm9yZGVyLXJhZGl1czogMTJweDsKICB9CiAgLm92ZXJsYXkuaGlkZGVuIHsgZGlzcGxheTogbm9uZTsgfQogIC5vdmVybGF5LWNhcmQgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDI0cHg7IGFuaW1hdGlvbjogcG9wIC4yNXMgZWFzZTsgfQogIC5vdmVybGF5LWNhcmQgaDEgeyBmb250LXNpemU6IDI2cHg7IGxldHRlci1zcGFjaW5nOiA1cHg7IG1hcmdpbi1ib3R0b206IDEycHg7IH0KICAub3ZlcmxheS1jYXJkIHAgeyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjk7IG1hcmdpbi1ib3R0b206IDIwcHg7IH0KICBAa2V5ZnJhbWVzIHBvcCB7IGZyb20geyB0cmFuc2Zvcm06IHNjYWxlKC45Mik7IG9wYWNpdHk6IDA7IH0gdG8geyB0cmFuc2Zvcm06IHNjYWxlKDEpOyBvcGFjaXR5OiAxOyB9IH0KCiAgLmJ0biB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1hY2NlbnQpLCAjYTg1NWY3KTsgY29sb3I6ICNmZmY7CiAgICBib3JkZXI6IDA7IHBhZGRpbmc6IDExcHggMzRweDsgYm9yZGVyLXJhZGl1czogMTBweDsgZm9udC1zaXplOiAxNXB4OyBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3gtc2hhZG93OiAwIDZweCAyMHB4IHJnYmEoMTA4LDkyLDIzMSwuNDUpOyBmb250LWZhbWlseTogaW5oZXJpdDsgbGV0dGVyLXNwYWNpbmc6IDJweDsKICB9CiAgLmJ0bjpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcygxLjE1KTsgfQogIC5idG46YWN0aXZlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7IH0KCiAgLmxlZ2VuZCB7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMTJweDsgZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweCAxNnB4OyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWF4LXdpZHRoOiA2NjBweDsgfQogIC5sZWdlbmQgc3BhbiB7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0KICBrYmQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwuMDcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItYm90dG9tLXdpZHRoOiAycHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDFweCA2cHg7IGZvbnQtZmFtaWx5OiBpbmhlcml0OyBmb250LXNpemU6IDExcHg7IG1hcmdpbjogMCAycHg7CiAgfQoKICAudG91Y2gtY29udHJvbHMgeyBkaXNwbGF5OiBub25lOyB9CiAgQG1lZGlhIChwb2ludGVyOiBjb2Fyc2UpIHsKICAgIC50b3VjaC1jb250cm9scyB7CiAgICAgIGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIDFmcik7IGdhcDogOHB4OwogICAgICB3aWR0aDogbWluKDk2dncsIDUwMHB4KTsKICAgIH0KICAgIC50b3VjaC1jb250cm9scyBidXR0b24gewogICAgICBoZWlnaHQ6IDUycHg7IGZvbnQtc2l6ZTogMjBweDsgY29sb3I6IHZhcigtLXRleHQpOwogICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYW5lbCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgIHRvdWNoLWFjdGlvbjogbm9uZTsgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsgY3Vyc29yOiBwb2ludGVyOwogICAgfQogICAgLnRvdWNoLWNvbnRyb2xzIGJ1dHRvbjphY3RpdmUgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LC4xNCk7IH0KICAgIC5sZWdlbmQgeyBkaXNwbGF5OiBub25lOyB9CiAgfQoKICBAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHsKICAgIC5nYW1lIHsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgfQogICAgLnNpZGUgeyBmbGV4LWRpcmVjdGlvbjogcm93OyB3aWR0aDogMTAwJTsgbWF4LXdpZHRoOiAzNjBweDsgfQogICAgLnNpZGUgLnBhbmVsIHsgZmxleDogMTsgfQogICAgLnN0YXRzIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDZweCAxNnB4OyBhbGlnbi1jb250ZW50OiBjZW50ZXI7IH0KICAgIC5zaWRlLmxlZnQgeyBvcmRlcjogMTsgfSAuYm9hcmQtd3JhcCB7IG9yZGVyOiAyOyB9IC5zaWRlLnJpZ2h0IHsgb3JkZXI6IDM7IH0KICB9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CgogIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICA8aDE+5L+E572X5pav5pa55Z2XPC9oMT4KICAgIDxidXR0b24gaWQ9Im11dGVCdG4iIGNsYXNzPSJpY29uLWJ0biIgdGl0bGU9Iumfs+aViOW8gOWFsyI+8J+UijwvYnV0dG9uPgogIDwvZGl2PgoKICA8ZGl2IGNsYXNzPSJnYW1lIj4KICAgIDxhc2lkZSBjbGFzcz0ic2lkZSBsZWZ0Ij4KICAgICAgPGRpdiBjbGFzcz0icGFuZWwiPgogICAgICAgIDxoMj7mmoLlrZg8L2gyPgogICAgICAgIDxjYW52YXMgaWQ9ImhvbGQiPjwvY2FudmFzPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0icGFuZWwgc3RhdHMiPgogICAgICAgIDxkaXYgY2xhc3M9InN0YXQiPjxzcGFuPuWIhuaVsDwvc3Bhbj48YiBpZD0ic2NvcmUiPjA8L2I+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RhdCI+PHNwYW4+5pyA6auY5YiGPC9zcGFuPjxiIGlkPSJiZXN0Ij4wPC9iPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN0YXQiPjxzcGFuPuetiee6pzwvc3Bhbj48YiBpZD0ibGV2ZWwiPjE8L2I+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RhdCI+PHNwYW4+6KGM5pWwPC9zcGFuPjxiIGlkPSJsaW5lcyI+MDwvYj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2FzaWRlPgoKICAgIDxkaXYgY2xhc3M9ImJvYXJkLXdyYXAiPgogICAgICA8Y2FudmFzIGlkPSJib2FyZCI+PC9jYW52YXM+CiAgICAgIDxkaXYgaWQ9Im92ZXJsYXkiIGNsYXNzPSJvdmVybGF5Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJvdmVybGF5LWNhcmQiPgogICAgICAgICAgPGgxIGlkPSJvdlRpdGxlIj7kv4TnvZfmlq/mlrnlnZc8L2gxPgogICAgICAgICAgPHAgaWQ9Im92VGV4dCI+PC9wPgogICAgICAgICAgPGJ1dHRvbiBpZD0ib3ZCdG4iIGNsYXNzPSJidG4iPuW8gOWni+a4uOaIjzwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxhc2lkZSBjbGFzcz0ic2lkZSByaWdodCI+CiAgICAgIDxkaXYgY2xhc3M9InBhbmVsIj4KICAgICAgICA8aDI+5LiL5LiA5LiqPC9oMj4KICAgICAgICA8Y2FudmFzIGlkPSJuZXh0Ij48L2NhbnZhcz4KICAgICAgPC9kaXY+CiAgICA8L2FzaWRlPgogIDwvZGl2PgoKICA8ZGl2IGNsYXNzPSJsZWdlbmQiPgogICAgPHNwYW4+PGtiZD7ihpA8L2tiZD48a2JkPuKGkjwva2JkPiDnp7vliqg8L3NwYW4+CiAgICA8c3Bhbj48a2JkPuKGkzwva2JkPiDova/pmY08L3NwYW4+CiAgICA8c3Bhbj48a2JkPuKGkTwva2JkPi88a2JkPlg8L2tiZD4g5peL6L2sIMK3IDxrYmQ+Wjwva2JkPiDlj43ovaw8L3NwYW4+CiAgICA8c3Bhbj48a2JkPuepuuagvDwva2JkPiDnoazpmY08L3NwYW4+CiAgICA8c3Bhbj48a2JkPkM8L2tiZD4g5pqC5a2YPC9zcGFuPgogICAgPHNwYW4+PGtiZD5QPC9rYmQ+IOaaguWBnDwvc3Bhbj4KICAgIDxzcGFuPjxrYmQ+Ujwva2JkPiDph43lvIA8L3NwYW4+CiAgPC9kaXY+CgogIDxkaXYgY2xhc3M9InRvdWNoLWNvbnRyb2xzIj4KICAgIDxidXR0b24gZGF0YS1hY3Q9ImhvbGQiPuaaguWtmDwvYnV0dG9uPgogICAgPGJ1dHRvbiBkYXRhLWFjdD0iY2N3Ij7in7I8L2J1dHRvbj4KICAgIDxidXR0b24gZGF0YS1hY3Q9ImN3Ij7in7M8L2J1dHRvbj4KICAgIDxidXR0b24gZGF0YS1hY3Q9ImxlZnQiPuKXgDwvYnV0dG9uPgogICAgPGJ1dHRvbiBkYXRhLWFjdD0iZG93biI+4pa8PC9idXR0b24+CiAgICA8YnV0dG9uIGRhdGEtYWN0PSJyaWdodCI+4pa2PC9idXR0b24+CiAgICA8YnV0dG9uIGRhdGEtYWN0PSJkcm9wIj7ipJM8L2J1dHRvbj4KICA8L2Rpdj4KCjxzY3JpcHQ+CigoKSA9PiB7Cid1c2Ugc3RyaWN0JzsKCi8vIC0tLS0tLS0tLS0g5bi46YePIC0tLS0tLS0tLS0KY29uc3QgQ09MUyA9IDEwLCBST1dTID0gMjA7CmNvbnN0IExPQ0tfREVMQVkgPSA1MDAsIE1BWF9MT0NLX1JFU0VUUyA9IDE1Owpjb25zdCBDTEVBUl9USU1FID0gMjgwOwpjb25zdCBEQVMgPSAxNjAsIEFSUiA9IDQ1LCBTT0ZUX0FSUiA9IDQwOwpjb25zdCBMSU5FX1NDT1JFUyA9IFswLCAxMDAsIDMwMCwgNTAwLCA4MDBdOwoKY29uc3QgU0hBUEVTID0gewogIEk6IFtbMCwwLDAsMF0sWzEsMSwxLDFdLFswLDAsMCwwXSxbMCwwLDAsMF1dLAogIE86IFtbMSwxXSxbMSwxXV0sCiAgVDogW1swLDEsMF0sWzEsMSwxXSxbMCwwLDBdXSwKICBTOiBbWzAsMSwxXSxbMSwxLDBdLFswLDAsMF1dLAogIFo6IFtbMSwxLDBdLFswLDEsMV0sWzAsMCwwXV0sCiAgSjogW1sxLDAsMF0sWzEsMSwxXSxbMCwwLDBdXSwKICBMOiBbWzAsMCwxXSxbMSwxLDFdLFswLDAsMF1dLAp9Owpjb25zdCBDT0xPUlMgPSB7IEk6JyMwMGU1ZmYnLCBPOicjZmFjYzE1JywgVDonI2MwODRmYycsIFM6JyM0YWRlODAnLCBaOicjZmY1ZDZjJywgSjonIzYwYTVmYScsIEw6JyNmYjkyM2MnIH07CgovLyAtLS0tLS0tLS0tIOeKtuaAgSAtLS0tLS0tLS0tCmxldCBib2FyZCwgYmFnID0gW10sIHF1ZXVlID0gW10sIGN1ciA9IG51bGwsIGhvbGRUeXBlID0gbnVsbCwgY2FuSG9sZCA9IHRydWU7CmxldCBzY29yZSA9IDAsIGxpbmVzID0gMCwgbGV2ZWwgPSAxLCBiZXN0ID0gMDsKbGV0IHN0YXRlID0gJ3JlYWR5JzsgLy8gcmVhZHkgfCBwbGF5aW5nIHwgcGF1c2VkIHwgb3ZlcgpsZXQgZHJvcFRpbWVyID0gMCwgbG9ja1RpbWVyID0gMCwgbG9ja1Jlc2V0cyA9IDA7CmxldCByb3dzVG9DbGVhciA9IFtdLCBjbGVhcmluZ1RpbWVyID0gMDsKbGV0IGRhc0RpciA9IDAsIGRhc1RpbWVyID0gMCwgYXJyVGltZXIgPSAwLCBzb2Z0VGltZXIgPSAwOwpjb25zdCBpbnB1dCA9IHsgbGVmdDogZmFsc2UsIHJpZ2h0OiBmYWxzZSwgZG93bjogZmFsc2UgfTsKCnRyeSB7IGJlc3QgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGV0cmlzLmJlc3QnKSwgMTApIHx8IDA7IH0gY2F0Y2ggKGUpIHt9CgovLyAtLS0tLS0tLS0tIERPTSAtLS0tLS0tLS0tCmNvbnN0ICQgPSBpZCA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CmNvbnN0IGJvYXJkQ2FudmFzID0gJCgnYm9hcmQnKSwgbmV4dENhbnZhcyA9ICQoJ25leHQnKSwgaG9sZENhbnZhcyA9ICQoJ2hvbGQnKTsKY29uc3Qgb3ZlcmxheSA9ICQoJ292ZXJsYXknKSwgb3ZUaXRsZSA9ICQoJ292VGl0bGUnKSwgb3ZUZXh0ID0gJCgnb3ZUZXh0JyksIG92QnRuID0gJCgnb3ZCdG4nKTsKY29uc3Qgc2NvcmVFbCA9ICQoJ3Njb3JlJyksIGJlc3RFbCA9ICQoJ2Jlc3QnKSwgbGV2ZWxFbCA9ICQoJ2xldmVsJyksIGxpbmVzRWwgPSAkKCdsaW5lcycpOwpjb25zdCBtdXRlQnRuID0gJCgnbXV0ZUJ0bicpOwoKbGV0IGN0eEJvYXJkLCBjdHhOZXh0LCBjdHhIb2xkLCBDRUxMID0gMzAsIG5leHRIb3Jpem9udGFsID0gZmFsc2U7CmNvbnN0IFBDID0gMTg7IC8vIOmihOiniOagvOWwuuWvuAoKLy8gLS0tLS0tLS0tLSDlt6XlhbcgLS0tLS0tLS0tLQpmdW5jdGlvbiBzaHVmZmxlKGEpIHsKICBmb3IgKGxldCBpID0gYS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7CiAgICBjb25zdCBqID0gKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKSB8IDA7CiAgICBbYVtpXSwgYVtqXV0gPSBbYVtqXSwgYVtpXV07CiAgfQogIHJldHVybiBhOwp9CmZ1bmN0aW9uIGNsb25lTWF0cml4KG0pIHsgcmV0dXJuIG0ubWFwKHIgPT4gci5zbGljZSgpKTsgfQpmdW5jdGlvbiBycihjdHgsIHgsIHksIHcsIGgsIHIpIHsKICByID0gTWF0aC5taW4ociwgdyAvIDIsIGggLyAyKTsKICBjdHguYmVnaW5QYXRoKCk7CiAgY3R4Lm1vdmVUbyh4ICsgciwgeSk7CiAgY3R4LmFyY1RvKHggKyB3LCB5LCB4ICsgdywgeSArIGgsIHIpOwogIGN0eC5hcmNUbyh4ICsgdywgeSArIGgsIHgsIHkgKyBoLCByKTsKICBjdHguYXJjVG8oeCwgeSArIGgsIHgsIHksIHIpOwogIGN0eC5hcmNUbyh4LCB5LCB4ICsgdywgeSwgcik7CiAgY3R4LmNsb3NlUGF0aCgpOwp9CmZ1bmN0aW9uIHNldHVwQ2FudmFzKGNhbnZhcywgdywgaCkgewogIGNvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7CiAgY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh3ICogZHByKTsKICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoICogZHByKTsKICBjYW52YXMuc3R5bGUud2lkdGggPSB3ICsgJ3B4JzsKICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7CiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgY3R4LnNldFRyYW5zZm9ybShkcHIsIDAsIDAsIGRwciwgMCwgMCk7CiAgcmV0dXJuIGN0eDsKfQoKLy8gLS0tLS0tLS0tLSDpn7PmlYggLS0tLS0tLS0tLQpsZXQgYXVkaW9DdHggPSBudWxsLCBtdXRlZCA9IGZhbHNlOwpmdW5jdGlvbiBpbml0QXVkaW8oKSB7CiAgaWYgKCFhdWRpb0N0eCkgewogICAgdHJ5IHsgYXVkaW9DdHggPSBuZXcgKHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkoKTsgfSBjYXRjaCAoZSkge30KICB9CiAgaWYgKGF1ZGlvQ3R4ICYmIGF1ZGlvQ3R4LnN0YXRlID09PSAnc3VzcGVuZGVkJykgYXVkaW9DdHgucmVzdW1lKCk7Cn0KZnVuY3Rpb24gYmVlcChmcmVxLCBkdXIgPSAwLjA2LCB0eXBlID0gJ3NxdWFyZScsIGdhaW4gPSAwLjAzLCB3aGVuID0gMCkgewogIGlmICghYXVkaW9DdHggfHwgbXV0ZWQpIHJldHVybjsKICBjb25zdCB0ID0gYXVkaW9DdHguY3VycmVudFRpbWUgKyB3aGVuOwogIGNvbnN0IG8gPSBhdWRpb0N0eC5jcmVhdGVPc2NpbGxhdG9yKCksIGcgPSBhdWRpb0N0eC5jcmVhdGVHYWluKCk7CiAgby50eXBlID0gdHlwZTsgby5mcmVxdWVuY3kudmFsdWUgPSBmcmVxOwogIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZShnYWluLCB0KTsKICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogIG8uY29ubmVjdChnKTsgZy5jb25uZWN0KGF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTsKICBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDIpOwp9CmNvbnN0IFNGWCA9IHsKICBtb3ZlOiAgICgpID0+IGJlZXAoMjIwLCAwLjAzLCAnc3F1YXJlJywgMC4wMTUpLAogIHJvdGF0ZTogKCkgPT4gYmVlcCgzMzAsIDAuMDUsICdzcXVhcmUnLCAwLjAyKSwKICBsb2NrOiAgICgpID0+IGJlZXAoMTUwLCAwLjA4LCAndHJpYW5nbGUnLCAwLjAzKSwKICBob2xkOiAgICgpID0+IGJlZXAoNDQwLCAwLjA1LCAnc2luZScsIDAuMDIpLAogIGNsZWFyOiAgKCkgPT4gWzQ0MCwgNTU0LCA2NTldLmZvckVhY2goKGYsIGkpID0+IGJlZXAoZiwgMC4wOSwgJ3NxdWFyZScsIDAuMDI1LCBpICogMC4wNykpLAogIHRldHJpczogKCkgPT4gWzUyMywgNjU5LCA3ODQsIDEwNDZdLmZvckVhY2goKGYsIGkpID0+IGJlZXAoZiwgMC4xMiwgJ3NxdWFyZScsIDAuMDMsIGkgKiAwLjA4KSksCiAgbGV2ZWw6ICAoKSA9PiBbNTIzLCA3ODRdLmZvckVhY2goKGYsIGkpID0+IGJlZXAoZiwgMC4xLCAnc2luZScsIDAuMDMsIGkgKiAwLjEpKSwKICBvdmVyOiAgICgpID0+IFszOTIsIDMzMCwgMjYyLCAxOTZdLmZvckVhY2goKGYsIGkpID0+IGJlZXAoZiwgMC4xOCwgJ3Nhd3Rvb3RoJywgMC4wMjgsIGkgKiAwLjE1KSksCn07CmZ1bmN0aW9uIHBsYXlTb3VuZChuYW1lKSB7IGlmIChTRlhbbmFtZV0pIFNGWFtuYW1lXSgpOyB9CgovLyAtLS0tLS0tLS0tIOaguOW/gyAtLS0tLS0tLS0tCmZ1bmN0aW9uIGJhZ05leHQoKSB7CiAgaWYgKCFiYWcubGVuZ3RoKSBiYWcgPSBzaHVmZmxlKFsnSScsJ08nLCdUJywnUycsJ1onLCdKJywnTCddKTsKICByZXR1cm4gYmFnLnBvcCgpOwp9CgpmdW5jdGlvbiBjb2xsaWRlcyhtYXRyaXgsIHB4LCBweSkgewogIGZvciAobGV0IHIgPSAwOyByIDwgbWF0cml4Lmxlbmd0aDsgcisrKSB7CiAgICBmb3IgKGxldCBjID0gMDsgYyA8IG1hdHJpeFtyXS5sZW5ndGg7IGMrKykgewogICAgICBpZiAoIW1hdHJpeFtyXVtjXSkgY29udGludWU7CiAgICAgIGNvbnN0IHggPSBweCArIGMsIHkgPSBweSArIHI7CiAgICAgIGlmICh4IDwgMCB8fCB4ID49IENPTFMgfHwgeSA+PSBST1dTKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHkgPj0gMCAmJiBib2FyZFt5XVt4XSkgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gc3Bhd25QaWVjZSh0eXBlKSB7CiAgY29uc3Qgc2hhcGUgPSBTSEFQRVNbdHlwZV07CiAgY3VyID0geyB0eXBlLCBtYXRyaXg6IGNsb25lTWF0cml4KHNoYXBlKSwgeDogTWF0aC5mbG9vcigoQ09MUyAtIHNoYXBlLmxlbmd0aCkgLyAyKSwgeTogMCB9OwogIGRyb3BUaW1lciA9IDA7IGxvY2tUaW1lciA9IDA7IGxvY2tSZXNldHMgPSAwOwogIGlmIChjb2xsaWRlcyhjdXIubWF0cml4LCBjdXIueCwgY3VyLnkpKSBnYW1lT3ZlcigpOwp9CgpmdW5jdGlvbiBzcGF3bkZyb21RdWV1ZSgpIHsKICBjb25zdCB0eXBlID0gcXVldWUuc2hpZnQoKTsKICBxdWV1ZS5wdXNoKGJhZ05leHQoKSk7CiAgY2FuSG9sZCA9IHRydWU7CiAgc3Bhd25QaWVjZSh0eXBlKTsKfQoKZnVuY3Rpb24gcmVzZXRMb2NrKCkgewogIGlmIChsb2NrUmVzZXRzIDwgTUFYX0xPQ0tfUkVTRVRTKSB7IGxvY2tUaW1lciA9IDA7IGxvY2tSZXNldHMrKzsgfQp9CgpmdW5jdGlvbiBtb3ZlSChkaXIsIHNpbGVudCkgewogIGlmICghY3VyIHx8IHN0YXRlICE9PSAncGxheWluZycgfHwgY2xlYXJpbmdUaW1lciA+IDApIHJldHVybiBmYWxzZTsKICBpZiAoIWNvbGxpZGVzKGN1ci5tYXRyaXgsIGN1ci54ICsgZGlyLCBjdXIueSkpIHsKICAgIGN1ci54ICs9IGRpcjsKICAgIGlmICghc2lsZW50KSBwbGF5U291bmQoJ21vdmUnKTsKICAgIGlmIChjb2xsaWRlcyhjdXIubWF0cml4LCBjdXIueCwgY3VyLnkgKyAxKSkgcmVzZXRMb2NrKCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiByb3RhdGVNYXRyaXgobSwgZGlyKSB7CiAgY29uc3QgbiA9IG0ubGVuZ3RoLCByZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sICgpID0+IEFycmF5KG4pLmZpbGwoMCkpOwogIGZvciAobGV0IHIgPSAwOyByIDwgbjsgcisrKQogICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuOyBjKyspIHsKICAgICAgaWYgKGRpciA+IDApIHJlc1tjXVtuIC0gMSAtIHJdID0gbVtyXVtjXTsKICAgICAgZWxzZSByZXNbbiAtIDEgLSBjXVtyXSA9IG1bcl1bY107CiAgICB9CiAgcmV0dXJuIHJlczsKfQoKZnVuY3Rpb24gcm90YXRlKGRpcikgewogIGlmICghY3VyIHx8IHN0YXRlICE9PSAncGxheWluZycgfHwgY2xlYXJpbmdUaW1lciA+IDApIHJldHVybjsKICBpZiAoY3VyLnR5cGUgPT09ICdPJykgeyBwbGF5U291bmQoJ3JvdGF0ZScpOyByZXR1cm47IH0KICBjb25zdCBtID0gcm90YXRlTWF0cml4KGN1ci5tYXRyaXgsIGRpcik7CiAgY29uc3Qga2lja3MgPSBbMCwgLTEsIDEsIC0yLCAyXTsKICBmb3IgKGNvbnN0IGR4IG9mIGtpY2tzKSB7CiAgICBpZiAoIWNvbGxpZGVzKG0sIGN1ci54ICsgZHgsIGN1ci55KSkgeyBjdXIubWF0cml4ID0gbTsgY3VyLnggKz0gZHg7IHBsYXlTb3VuZCgncm90YXRlJyk7IHJlc2V0TG9jaygpOyByZXR1cm47IH0KICB9CiAgZm9yIChjb25zdCBkeCBvZiBraWNrcykgeyAvLyDokL3lnLDml7blkJHkuIrouKLkuIDmoLwKICAgIGlmICghY29sbGlkZXMobSwgY3VyLnggKyBkeCwgY3VyLnkgLSAxKSkgeyBjdXIubWF0cml4ID0gbTsgY3VyLnggKz0gZHg7IGN1ci55IC09IDE7IHBsYXlTb3VuZCgncm90YXRlJyk7IHJlc2V0TG9jaygpOyByZXR1cm47IH0KICB9Cn0KCmZ1bmN0aW9uIHNvZnRTdGVwKCkgewogIGlmICghY3VyIHx8IHN0YXRlICE9PSAncGxheWluZycgfHwgY2xlYXJpbmdUaW1lciA+IDApIHJldHVybiBmYWxzZTsKICBpZiAoIWNvbGxpZGVzKGN1ci5tYXRyaXgsIGN1ci54LCBjdXIueSArIDEpKSB7CiAgICBjdXIueSsrOyBzY29yZSsrOyBkcm9wVGltZXIgPSAwOyBsb2NrUmVzZXRzID0gMDsKICAgIHVwZGF0ZUhVRCgpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gaGFyZERyb3AoKSB7CiAgaWYgKCFjdXIgfHwgc3RhdGUgIT09ICdwbGF5aW5nJyB8fCBjbGVhcmluZ1RpbWVyID4gMCkgcmV0dXJuOwogIGxldCBkaXN0ID0gMDsKICB3aGlsZSAoIWNvbGxpZGVzKGN1ci5tYXRyaXgsIGN1ci54LCBjdXIueSArIDEpKSB7IGN1ci55Kys7IGRpc3QrKzsgfQogIHNjb3JlICs9IGRpc3QgKiAyOwogIHVwZGF0ZUhVRCgpOwogIGxvY2tQaWVjZSgpOwp9CgpmdW5jdGlvbiBob2xkU3dhcCgpIHsKICBpZiAoIWN1ciB8fCAhY2FuSG9sZCB8fCBzdGF0ZSAhPT0gJ3BsYXlpbmcnIHx8IGNsZWFyaW5nVGltZXIgPiAwKSByZXR1cm47CiAgY29uc3QgdCA9IGN1ci50eXBlOwogIGlmIChob2xkVHlwZSkgeyBjb25zdCBoID0gaG9sZFR5cGU7IGhvbGRUeXBlID0gdDsgc3Bhd25QaWVjZShoKTsgfQogIGVsc2UgeyBob2xkVHlwZSA9IHQ7IHNwYXduRnJvbVF1ZXVlKCk7IH0KICBjYW5Ib2xkID0gZmFsc2U7CiAgcGxheVNvdW5kKCdob2xkJyk7Cn0KCmZ1bmN0aW9uIGxvY2tQaWVjZSgpIHsKICBsZXQgdG9wT3V0ID0gZmFsc2U7CiAgZm9yIChsZXQgciA9IDA7IHIgPCBjdXIubWF0cml4Lmxlbmd0aDsgcisrKSB7CiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGN1ci5tYXRyaXhbcl0ubGVuZ3RoOyBjKyspIHsKICAgICAgaWYgKCFjdXIubWF0cml4W3JdW2NdKSBjb250aW51ZTsKICAgICAgY29uc3QgeSA9IGN1ci55ICsgciwgeCA9IGN1ci54ICsgYzsKICAgICAgaWYgKHkgPCAwKSB7IHRvcE91dCA9IHRydWU7IGNvbnRpbnVlOyB9CiAgICAgIGJvYXJkW3ldW3hdID0gY3VyLnR5cGU7CiAgICB9CiAgfQogIGN1ciA9IG51bGw7CiAgaWYgKHRvcE91dCkgeyBnYW1lT3ZlcigpOyByZXR1cm47IH0KCiAgcm93c1RvQ2xlYXIgPSBbXTsKICBmb3IgKGxldCByID0gMDsgciA8IFJPV1M7IHIrKykgaWYgKGJvYXJkW3JdLmV2ZXJ5KHYgPT4gdikpIHJvd3NUb0NsZWFyLnB1c2gocik7CgogIGlmIChyb3dzVG9DbGVhci5sZW5ndGgpIHsKICAgIGNsZWFyaW5nVGltZXIgPSBDTEVBUl9USU1FOwogICAgcGxheVNvdW5kKHJvd3NUb0NsZWFyLmxlbmd0aCA9PT0gNCA/ICd0ZXRyaXMnIDogJ2NsZWFyJyk7CiAgfSBlbHNlIHsKICAgIHBsYXlTb3VuZCgnbG9jaycpOwogICAgc3Bhd25Gcm9tUXVldWUoKTsKICB9Cn0KCmZ1bmN0aW9uIGZpbmlzaENsZWFyKCkgewogIGNvbnN0IG4gPSByb3dzVG9DbGVhci5sZW5ndGg7CiAgcm93c1RvQ2xlYXIuZm9yRWFjaChyID0+IHsKICAgIGJvYXJkLnNwbGljZShyLCAxKTsKICAgIGJvYXJkLnVuc2hpZnQoQXJyYXkoQ09MUykuZmlsbCgwKSk7CiAgfSk7CiAgcm93c1RvQ2xlYXIgPSBbXTsKICBzY29yZSArPSBMSU5FX1NDT1JFU1tuXSAqIGxldmVsOwogIGxpbmVzICs9IG47CiAgY29uc3QgbmV3TGV2ZWwgPSBNYXRoLmZsb29yKGxpbmVzIC8gMTApICsgMTsKICBpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeyBsZXZlbCA9IG5ld0xldmVsOyBwbGF5U291bmQoJ2xldmVsJyk7IH0KICB1cGRhdGVIVUQoKTsKICBzcGF3bkZyb21RdWV1ZSgpOwp9CgpmdW5jdGlvbiBkcm9wSW50ZXJ2YWwoKSB7CiAgcmV0dXJuIE1hdGgubWF4KDcwLCAxMDAwICogTWF0aC5wb3coMC44MiwgbGV2ZWwgLSAxKSk7Cn0KCmZ1bmN0aW9uIGdhbWVPdmVyKCkgewogIHN0YXRlID0gJ292ZXInOyBjdXIgPSBudWxsOwogIGlmIChzY29yZSA+IGJlc3QpIHsKICAgIGJlc3QgPSBzY29yZTsKICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0ZXRyaXMuYmVzdCcsIFN0cmluZyhiZXN0KSk7IH0gY2F0Y2ggKGUpIHt9CiAgfQogIHVwZGF0ZUhVRCgpOwogIGNvbnN0IHJlY29yZCA9IHNjb3JlID4gMCAmJiBzY29yZSA+PSBiZXN0ID8gJyDCtyDmlrDnuqrlvZXvvIEnIDogJyc7CiAgc2hvd092ZXJsYXkoJ+a4uOaIj+e7k+adnycsIGDlvpfliIYgJHtzY29yZX0gwrcg5raI6ZmkICR7bGluZXN9IOihjCR7cmVjb3JkfWAsICflho3mnaXkuIDlsYAnKTsKICBwbGF5U291bmQoJ292ZXInKTsKfQoKZnVuY3Rpb24gcmVzZXRHYW1lKCkgewogIGJvYXJkID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogUk9XUyB9LCAoKSA9PiBBcnJheShDT0xTKS5maWxsKDApKTsKICBiYWcgPSBbXTsgcXVldWUgPSBbXTsKICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykgcXVldWUucHVzaChiYWdOZXh0KCkpOwogIHNjb3JlID0gMDsgbGluZXMgPSAwOyBsZXZlbCA9IDE7CiAgaG9sZFR5cGUgPSBudWxsOyBjYW5Ib2xkID0gdHJ1ZTsKICByb3dzVG9DbGVhciA9IFtdOyBjbGVhcmluZ1RpbWVyID0gMDsKICBkYXNEaXIgPSAwOyBkYXNUaW1lciA9IDA7IGFyclRpbWVyID0gMDsgc29mdFRpbWVyID0gMDsKICBpbnB1dC5sZWZ0ID0gaW5wdXQucmlnaHQgPSBpbnB1dC5kb3duID0gZmFsc2U7CiAgc3Bhd25Gcm9tUXVldWUoKTsKICB1cGRhdGVIVUQoKTsKfQoKLy8gLS0tLS0tLS0tLSDnlYzpnaIgLS0tLS0tLS0tLQpmdW5jdGlvbiB1cGRhdGVIVUQoKSB7CiAgc2NvcmVFbC50ZXh0Q29udGVudCA9IHNjb3JlOwogIGJlc3RFbC50ZXh0Q29udGVudCA9IGJlc3Q7CiAgbGV2ZWxFbC50ZXh0Q29udGVudCA9IGxldmVsOwogIGxpbmVzRWwudGV4dENvbnRlbnQgPSBsaW5lczsKfQoKZnVuY3Rpb24gc2hvd092ZXJsYXkodGl0bGUsIHRleHQsIGJ0bikgewogIG92VGl0bGUudGV4dENvbnRlbnQgPSB0aXRsZTsKICBvdlRleHQuaW5uZXJIVE1MID0gdGV4dDsKICBvdkJ0bi50ZXh0Q29udGVudCA9IGJ0bjsKICBvdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOwp9CmZ1bmN0aW9uIGhpZGVPdmVybGF5KCkgeyBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpOyB9CgpmdW5jdGlvbiBzdGFydCgpIHsKICBpZiAoc3RhdGUgIT09ICdyZWFkeScpIHJldHVybjsKICBpbml0QXVkaW8oKTsgc3RhdGUgPSAncGxheWluZyc7IGhpZGVPdmVybGF5KCk7IG92QnRuLmJsdXIoKTsKfQpmdW5jdGlvbiByZXN0YXJ0KCkgewogIGluaXRBdWRpbygpOyByZXNldEdhbWUoKTsgc3RhdGUgPSAncGxheWluZyc7IGhpZGVPdmVybGF5KCk7IG92QnRuLmJsdXIoKTsKfQpmdW5jdGlvbiBwYXVzZSgpIHsgc3RhdGUgPSAncGF1c2VkJzsgc2hvd092ZXJsYXkoJ+W3suaaguWBnCcsICfmjIkgUCDmiJYgRW50ZXIg57un57utJywgJ+e7p+e7rScpOyB9CmZ1bmN0aW9uIHJlc3VtZSgpIHsgc3RhdGUgPSAncGxheWluZyc7IGhpZGVPdmVybGF5KCk7IG92QnRuLmJsdXIoKTsgfQpmdW5jdGlvbiBwYXVzZVRvZ2dsZSgpIHsKICBpZiAoc3RhdGUgPT09ICdwbGF5aW5nJykgcGF1c2UoKTsKICBlbHNlIGlmIChzdGF0ZSA9PT0gJ3BhdXNlZCcpIHJlc3VtZSgpOwp9CgpmdW5jdGlvbiBkcmF3Q2VsbChjdHgsIHgsIHksIHNpemUsIGNvbG9yKSB7CiAgY29uc3QgciA9IE1hdGgubWF4KDIsIHNpemUgKiAwLjE2KTsKICBjdHguZmlsbFN0eWxlID0gY29sb3I7CiAgcnIoY3R4LCB4ICsgMC41LCB5ICsgMC41LCBzaXplIC0gMSwgc2l6ZSAtIDEsIHIpOyBjdHguZmlsbCgpOwogIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsMjU1LDI1NSwwLjI2KSc7CiAgcnIoY3R4LCB4ICsgMi41LCB5ICsgMi41LCBzaXplIC0gNSwgKHNpemUgLSAyKSAqIDAuMywgciAqIDAuNTUpOyBjdHguZmlsbCgpOwogIGN0eC5zdHJva2VTdHlsZSA9ICdyZ2JhKDAsMCwwLDAuMzUpJzsgY3R4LmxpbmVXaWR0aCA9IDE7CiAgcnIoY3R4LCB4ICsgMS41LCB5ICsgMS41LCBzaXplIC0gMywgc2l6ZSAtIDMsIHIgKiAwLjgpOyBjdHguc3Ryb2tlKCk7Cn0KCmZ1bmN0aW9uIGRyYXdNYXRyaXgobSwgcHgsIHB5LCBnaG9zdCwgY29sb3IpIHsKICBmb3IgKGxldCByID0gMDsgciA8IG0ubGVuZ3RoOyByKyspIHsKICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbVtyXS5sZW5ndGg7IGMrKykgewogICAgICBpZiAoIW1bcl1bY10pIGNvbnRpbnVlOwogICAgICBjb25zdCB5ID0gcHkgKyByOwogICAgICBpZiAoeSA8IDApIGNvbnRpbnVlOwogICAgICBjb25zdCB4ID0gKHB4ICsgYykgKiBDRUxMLCB5eSA9IHkgKiBDRUxMOwogICAgICBpZiAoZ2hvc3QpIHsKICAgICAgICBjdHhCb2FyZC5maWxsU3R5bGUgPSBjb2xvciArICcxNic7CiAgICAgICAgcnIoY3R4Qm9hcmQsIHggKyAxLCB5eSArIDEsIENFTEwgLSAyLCBDRUxMIC0gMiwgQ0VMTCAqIDAuMTYpOyBjdHhCb2FyZC5maWxsKCk7CiAgICAgICAgY3R4Qm9hcmQuc3Ryb2tlU3R5bGUgPSBjb2xvciArICc1OSc7IGN0eEJvYXJkLmxpbmVXaWR0aCA9IDEuNTsKICAgICAgICBycihjdHhCb2FyZCwgeCArIDEuNSwgeXkgKyAxLjUsIENFTEwgLSAzLCBDRUxMIC0gMywgQ0VMTCAqIDAuMTYpOyBjdHhCb2FyZC5zdHJva2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkcmF3Q2VsbChjdHhCb2FyZCwgeCwgeXksIENFTEwsIGNvbG9yKTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gZHJhd1ByZXZpZXcoY3R4LCB0eXBlLCB4LCB5LCB3LCBoLCBhbHBoYSkgewogIGNvbnN0IG0gPSBTSEFQRVNbdHlwZV07CiAgbGV0IG1pblIgPSBJbmZpbml0eSwgbWF4UiA9IC1JbmZpbml0eSwgbWluQyA9IEluZmluaXR5LCBtYXhDID0gLUluZmluaXR5OwogIGZvciAobGV0IHIgPSAwOyByIDwgbS5sZW5ndGg7IHIrKykKICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbVtyXS5sZW5ndGg7IGMrKykKICAgICAgaWYgKG1bcl1bY10pIHsKICAgICAgICBtaW5SID0gTWF0aC5taW4obWluUiwgcik7IG1heFIgPSBNYXRoLm1heChtYXhSLCByKTsKICAgICAgICBtaW5DID0gTWF0aC5taW4obWluQywgYyk7IG1heEMgPSBNYXRoLm1heChtYXhDLCBjKTsKICAgICAgfQogIGNvbnN0IGJ3ID0gKG1heEMgLSBtaW5DICsgMSkgKiBQQywgYmggPSAobWF4UiAtIG1pblIgKyAxKSAqIFBDOwogIGNvbnN0IG94ID0geCArICh3IC0gYncpIC8gMiAtIG1pbkMgKiBQQywgb3kgPSB5ICsgKGggLSBiaCkgLyAyIC0gbWluUiAqIFBDOwogIGN0eC5zYXZlKCk7CiAgY3R4Lmdsb2JhbEFscGhhID0gYWxwaGE7CiAgZm9yIChsZXQgciA9IDA7IHIgPCBtLmxlbmd0aDsgcisrKQogICAgZm9yIChsZXQgYyA9IDA7IGMgPCBtW3JdLmxlbmd0aDsgYysrKQogICAgICBpZiAobVtyXVtjXSkgZHJhd0NlbGwoY3R4LCBveCArIGMgKiBQQywgb3kgKyByICogUEMsIFBDLCBDT0xPUlNbdHlwZV0pOwogIGN0eC5yZXN0b3JlKCk7Cn0KCmZ1bmN0aW9uIGRyYXdQcmV2aWV3cygpIHsKICBjb25zdCBodyA9IDEwNCwgaGggPSA3MjsKICBjdHhIb2xkLmNsZWFyUmVjdCgwLCAwLCBodywgaGgpOwogIGlmIChob2xkVHlwZSkgZHJhd1ByZXZpZXcoY3R4SG9sZCwgaG9sZFR5cGUsIDAsIDAsIGh3LCBoaCwgY2FuSG9sZCA/IDEgOiAwLjM1KTsKCiAgaWYgKG5leHRIb3Jpem9udGFsKSB7CiAgICBjb25zdCBzbG90ID0gNTY7CiAgICBjdHhOZXh0LmNsZWFyUmVjdCgwLCAwLCA1ICogc2xvdCwgc2xvdCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKDUsIHF1ZXVlLmxlbmd0aCk7IGkrKykKICAgICAgZHJhd1ByZXZpZXcoY3R4TmV4dCwgcXVldWVbaV0sIGkgKiBzbG90LCAwLCBzbG90LCBzbG90LCAxKTsKICB9IGVsc2UgewogICAgY29uc3Qgc2xvdCA9IDUyOwogICAgY3R4TmV4dC5jbGVhclJlY3QoMCwgMCwgMTA0LCA1ICogc2xvdCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKDUsIHF1ZXVlLmxlbmd0aCk7IGkrKykKICAgICAgZHJhd1ByZXZpZXcoY3R4TmV4dCwgcXVldWVbaV0sIDAsIGkgKiBzbG90LCAxMDQsIHNsb3QsIDEpOwogIH0KfQoKZnVuY3Rpb24gZHJhdygpIHsKICBjb25zdCB3ID0gQ09MUyAqIENFTEwsIGggPSBST1dTICogQ0VMTDsKICBjdHhCb2FyZC5jbGVhclJlY3QoMCwgMCwgdywgaCk7CgogIGNvbnN0IGcgPSBjdHhCb2FyZC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAwLCBoKTsKICBnLmFkZENvbG9yU3RvcCgwLCAnIzBlMTMzMCcpOyBnLmFkZENvbG9yU3RvcCgxLCAnIzBhMGQxZScpOwogIGN0eEJvYXJkLmZpbGxTdHlsZSA9IGc7IGN0eEJvYXJkLmZpbGxSZWN0KDAsIDAsIHcsIGgpOwoKICBjdHhCb2FyZC5zdHJva2VTdHlsZSA9ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMDQ1KSc7CiAgY3R4Qm9hcmQubGluZVdpZHRoID0gMTsKICBjdHhCb2FyZC5iZWdpblBhdGgoKTsKICBmb3IgKGxldCBjID0gMTsgYyA8IENPTFM7IGMrKykgeyBjdHhCb2FyZC5tb3ZlVG8oYyAqIENFTEwgKyAuNSwgMCk7IGN0eEJvYXJkLmxpbmVUbyhjICogQ0VMTCArIC41LCBoKTsgfQogIGZvciAobGV0IHIgPSAxOyByIDwgUk9XUzsgcisrKSB7IGN0eEJvYXJkLm1vdmVUbygwLCByICogQ0VMTCArIC41KTsgY3R4Qm9hcmQubGluZVRvKHcsIHIgKiBDRUxMICsgLjUpOyB9CiAgY3R4Qm9hcmQuc3Ryb2tlKCk7CgogIGZvciAobGV0IHIgPSAwOyByIDwgUk9XUzsgcisrKQogICAgZm9yIChsZXQgYyA9IDA7IGMgPCBDT0xTOyBjKyspIHsKICAgICAgY29uc3QgdCA9IGJvYXJkW3JdW2NdOwogICAgICBpZiAoIXQgfHwgcm93c1RvQ2xlYXIuaW5jbHVkZXMocikpIGNvbnRpbnVlOwogICAgICBkcmF3Q2VsbChjdHhCb2FyZCwgYyAqIENFTEwsIHIgKiBDRUxMLCBDRUxMLCBDT0xPUlNbdF0pOwogICAgfQoKICBpZiAoY2xlYXJpbmdUaW1lciA+IDApIHsKICAgIGNvbnN0IHAgPSBjbGVhcmluZ1RpbWVyIC8gQ0xFQVJfVElNRTsKICAgIGNvbnN0IGFscGhhID0gMC4yNSArIDAuNTUgKiBNYXRoLmFicyhNYXRoLnNpbihwICogTWF0aC5QSSAqIDIuNSkpOwogICAgY3R4Qm9hcmQuZmlsbFN0eWxlID0gYHJnYmEoMjU1LDI1NSwyNTUsJHthbHBoYX0pYDsKICAgIGZvciAoY29uc3QgciBvZiByb3dzVG9DbGVhcikgY3R4Qm9hcmQuZmlsbFJlY3QoMCwgciAqIENFTEwsIHcsIENFTEwpOwogIH0KCiAgaWYgKGN1cikgewogICAgY29uc3QgY29sb3IgPSBDT0xPUlNbY3VyLnR5cGVdOwogICAgbGV0IGd5ID0gY3VyLnk7CiAgICB3aGlsZSAoIWNvbGxpZGVzKGN1ci5tYXRyaXgsIGN1ci54LCBneSArIDEpKSBneSsrOwogICAgaWYgKGd5ICE9PSBjdXIueSkgZHJhd01hdHJpeChjdXIubWF0cml4LCBjdXIueCwgZ3ksIHRydWUsIGNvbG9yKTsKICAgIGRyYXdNYXRyaXgoY3VyLm1hdHJpeCwgY3VyLngsIGN1ci55LCBmYWxzZSwgY29sb3IpOwogIH0KCiAgZHJhd1ByZXZpZXdzKCk7Cn0KCi8vIC0tLS0tLS0tLS0g6L6T5YWlIC0tLS0tLS0tLS0KZnVuY3Rpb24gc2V0RGlyKGRpcikgewogIGRhc0RpciA9IGRpcjsgZGFzVGltZXIgPSAwOyBhcnJUaW1lciA9IDA7CiAgaWYgKGRpciAhPT0gMCkgbW92ZUgoZGlyKTsKfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7CiAgaWYgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHwgZS5hbHRLZXkpIHJldHVybjsKICBzd2l0Y2ggKGUuY29kZSkgewogICAgY2FzZSAnQXJyb3dMZWZ0JzoKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBpZiAoIWUucmVwZWF0ICYmICFpbnB1dC5sZWZ0KSB7IGlucHV0LmxlZnQgPSB0cnVlOyBzZXREaXIoLTEpOyB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKCFlLnJlcGVhdCAmJiAhaW5wdXQucmlnaHQpIHsgaW5wdXQucmlnaHQgPSB0cnVlOyBzZXREaXIoMSk7IH0KICAgICAgYnJlYWs7CiAgICBjYXNlICdBcnJvd0Rvd24nOgogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICghZS5yZXBlYXQpIHsgaW5wdXQuZG93biA9IHRydWU7IHNvZnRUaW1lciA9IDA7IHNvZnRTdGVwKCk7IH0KICAgICAgYnJlYWs7CiAgICBjYXNlICdBcnJvd1VwJzogY2FzZSAnS2V5WCc6CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKCFlLnJlcGVhdCkgcm90YXRlKDEpOwogICAgICBicmVhazsKICAgIGNhc2UgJ0tleVonOgogICAgICBpZiAoIWUucmVwZWF0KSByb3RhdGUoLTEpOwogICAgICBicmVhazsKICAgIGNhc2UgJ1NwYWNlJzoKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBpZiAoZS5yZXBlYXQpIGJyZWFrOwogICAgICBpZiAoc3RhdGUgPT09ICdyZWFkeScpIHN0YXJ0KCk7CiAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAnb3ZlcicpIHJlc3RhcnQoKTsKICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdwbGF5aW5nJykgaGFyZERyb3AoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdFbnRlcic6CiAgICAgIGlmIChlLnJlcGVhdCkgYnJlYWs7CiAgICAgIGlmIChzdGF0ZSA9PT0gJ3JlYWR5Jykgc3RhcnQoKTsKICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdvdmVyJykgcmVzdGFydCgpOwogICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gJ3BhdXNlZCcpIHJlc3VtZSgpOwogICAgICBicmVhazsKICAgIGNhc2UgJ0tleUMnOiBjYXNlICdTaGlmdExlZnQnOiBjYXNlICdTaGlmdFJpZ2h0JzoKICAgICAgaWYgKCFlLnJlcGVhdCkgaG9sZFN3YXAoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdLZXlQJzogY2FzZSAnRXNjYXBlJzoKICAgICAgaWYgKCFlLnJlcGVhdCkgcGF1c2VUb2dnbGUoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdLZXlSJzoKICAgICAgaWYgKCFlLnJlcGVhdCkgcmVzdGFydCgpOwogICAgICBicmVhazsKICB9Cn0pOwoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZSkgPT4gewogIHN3aXRjaCAoZS5jb2RlKSB7CiAgICBjYXNlICdBcnJvd0xlZnQnOiAgaW5wdXQubGVmdCA9IGZhbHNlOyAgaWYgKGRhc0RpciA9PT0gLTEpIHNldERpcihpbnB1dC5yaWdodCA/IDEgOiAwKTsgYnJlYWs7CiAgICBjYXNlICdBcnJvd1JpZ2h0JzogaW5wdXQucmlnaHQgPSBmYWxzZTsgaWYgKGRhc0RpciA9PT0gMSkgIHNldERpcihpbnB1dC5sZWZ0ID8gLTEgOiAwKTsgYnJlYWs7CiAgICBjYXNlICdBcnJvd0Rvd24nOiAgaW5wdXQuZG93biA9IGZhbHNlOyBicmVhazsKICB9Cn0pOwoKLy8g6Kem5o6n5oyJ6ZKu77yI6ZW/5oyJ5bem5Y+zL+i9r+mZjei/nue7reWKqOS9nO+8iQpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG91Y2gtY29udHJvbHMgYnV0dG9uJykuZm9yRWFjaChidG4gPT4gewogIGNvbnN0IGFjdCA9IGJ0bi5kYXRhc2V0LmFjdDsKICBsZXQgaXYgPSBudWxsOwogIGNvbnN0IGZpcmUgPSAoKSA9PiB7CiAgICBzd2l0Y2ggKGFjdCkgewogICAgICBjYXNlICdsZWZ0JzogIG1vdmVIKC0xKTsgYnJlYWs7CiAgICAgIGNhc2UgJ3JpZ2h0JzogbW92ZUgoMSk7IGJyZWFrOwogICAgICBjYXNlICdkb3duJzogIHNvZnRTdGVwKCk7IGJyZWFrOwogICAgICBjYXNlICdjdyc6ICAgIHJvdGF0ZSgxKTsgYnJlYWs7CiAgICAgIGNhc2UgJ2Njdyc6ICAgcm90YXRlKC0xKTsgYnJlYWs7CiAgICAgIGNhc2UgJ2Ryb3AnOiAgaGFyZERyb3AoKTsgYnJlYWs7CiAgICAgIGNhc2UgJ2hvbGQnOiAgaG9sZFN3YXAoKTsgYnJlYWs7CiAgICB9CiAgfTsKICBidG4uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBlID0+IHsKICAgIGUucHJldmVudERlZmF1bHQoKTsgaW5pdEF1ZGlvKCk7CiAgICBpZiAoc3RhdGUgPT09ICdyZWFkeScpIHsgc3RhcnQoKTsgcmV0dXJuOyB9CiAgICBmaXJlKCk7CiAgICBpZiAoWydsZWZ0JywgJ3JpZ2h0JywgJ2Rvd24nXS5pbmNsdWRlcyhhY3QpKSBpdiA9IHNldEludGVydmFsKGZpcmUsIDExMCk7CiAgfSk7CiAgWydwb2ludGVydXAnLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVybGVhdmUnXS5mb3JFYWNoKGV2ID0+CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcihldiwgKCkgPT4geyBjbGVhckludGVydmFsKGl2KTsgaXYgPSBudWxsOyB9KSk7Cn0pOwoKb3ZCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgaWYgKHN0YXRlID09PSAncmVhZHknKSBzdGFydCgpOwogIGVsc2UgaWYgKHN0YXRlID09PSAncGF1c2VkJykgcmVzdW1lKCk7CiAgZWxzZSBpZiAoc3RhdGUgPT09ICdvdmVyJykgcmVzdGFydCgpOwp9KTsKCm11dGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgaW5pdEF1ZGlvKCk7CiAgbXV0ZWQgPSAhbXV0ZWQ7CiAgbXV0ZUJ0bi50ZXh0Q29udGVudCA9IG11dGVkID8gJ/CflIcnIDogJ/CflIonOwp9KTsKCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7CiAgaWYgKGRvY3VtZW50LmhpZGRlbiAmJiBzdGF0ZSA9PT0gJ3BsYXlpbmcnKSBwYXVzZSgpOwp9KTsKCi8vIC0tLS0tLS0tLS0g5Li75b6q546vIC0tLS0tLS0tLS0KZnVuY3Rpb24gdXBkYXRlKGR0KSB7CiAgaWYgKGNsZWFyaW5nVGltZXIgPiAwKSB7CiAgICBjbGVhcmluZ1RpbWVyIC09IGR0OwogICAgaWYgKGNsZWFyaW5nVGltZXIgPD0gMCkgeyBjbGVhcmluZ1RpbWVyID0gMDsgZmluaXNoQ2xlYXIoKTsgfQogICAgcmV0dXJuOwogIH0KICBpZiAoIWN1cikgcmV0dXJuOwoKICBpZiAoZGFzRGlyICE9PSAwKSB7CiAgICBkYXNUaW1lciArPSBkdDsKICAgIGlmIChkYXNUaW1lciA+PSBEQVMpIHsKICAgICAgYXJyVGltZXIgKz0gZHQ7CiAgICAgIHdoaWxlIChhcnJUaW1lciA+PSBBUlIpIHsgYXJyVGltZXIgLT0gQVJSOyBpZiAoIW1vdmVIKGRhc0RpciwgdHJ1ZSkpIGJyZWFrOyB9CiAgICB9CiAgfQoKICBpZiAoaW5wdXQuZG93bikgewogICAgc29mdFRpbWVyICs9IGR0OwogICAgd2hpbGUgKHNvZnRUaW1lciA+PSBTT0ZUX0FSUikgeyBzb2Z0VGltZXIgLT0gU09GVF9BUlI7IGlmICghc29mdFN0ZXAoKSkgYnJlYWs7IH0KICB9IGVsc2UgewogICAgc29mdFRpbWVyID0gMDsKICB9CgogIGlmICghY3VyKSByZXR1cm47CgogIGlmIChjb2xsaWRlcyhjdXIubWF0cml4LCBjdXIueCwgY3VyLnkgKyAxKSkgewogICAgbG9ja1RpbWVyICs9IGR0OwogICAgaWYgKGxvY2tUaW1lciA+PSBMT0NLX0RFTEFZKSBsb2NrUGllY2UoKTsKICB9IGVsc2UgewogICAgZHJvcFRpbWVyICs9IGR0OwogICAgaWYgKGRyb3BUaW1lciA+PSBkcm9wSW50ZXJ2YWwoKSkgeyBkcm9wVGltZXIgPSAwOyBjdXIueSsrOyBsb2NrUmVzZXRzID0gMDsgfQogIH0KfQoKbGV0IGxhc3QgPSBwZXJmb3JtYW5jZS5ub3coKSwgbGFzdFJhZlRpY2sgPSAwOwpmdW5jdGlvbiBmcmFtZShub3cpIHsKICBjb25zdCBkdCA9IE1hdGgubWluKDEwMCwgbm93IC0gbGFzdCk7CiAgbGFzdCA9IG5vdzsKICBpZiAoc3RhdGUgPT09ICdwbGF5aW5nJykgdXBkYXRlKGR0KTsKICBkcmF3KCk7Cn0KCi8vIC0tLS0tLS0tLS0g5bC65a+4IC0tLS0tLS0tLS0KZnVuY3Rpb24gcmVzaXplQm9hcmQoKSB7CiAgY29uc3QgYXZhaWxIID0gd2luZG93LmlubmVySGVpZ2h0IC0gMTcwOwogIGNvbnN0IGF2YWlsVyA9IHdpbmRvdy5pbm5lcldpZHRoIC0gNDA7CiAgQ0VMTCA9IE1hdGgubWF4KDE4LCBNYXRoLm1pbigzMCwgTWF0aC5mbG9vcihhdmFpbEggLyBST1dTKSwgTWF0aC5mbG9vcihhdmFpbFcgLyBDT0xTKSkpOwogIGN0eEJvYXJkID0gc2V0dXBDYW52YXMoYm9hcmRDYW52YXMsIENPTFMgKiBDRUxMLCBST1dTICogQ0VMTCk7Cn0KZnVuY3Rpb24gcmVzaXplUHJldmlld3MoKSB7CiAgbmV4dEhvcml6b250YWwgPSB3aW5kb3cuaW5uZXJXaWR0aCA8PSA3MjA7CiAgY3R4TmV4dCA9IG5leHRIb3Jpem9udGFsID8gc2V0dXBDYW52YXMobmV4dENhbnZhcywgNSAqIDU2LCA1NikgOiBzZXR1cENhbnZhcyhuZXh0Q2FudmFzLCAxMDQsIDUgKiA1Mik7CiAgY3R4SG9sZCA9IHNldHVwQ2FudmFzKGhvbGRDYW52YXMsIDEwNCwgNzIpOwp9CmZ1bmN0aW9uIHJlc2l6ZUFsbCgpIHsgcmVzaXplQm9hcmQoKTsgcmVzaXplUHJldmlld3MoKTsgfQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplQWxsKTsKCi8vIC0tLS0tLS0tLS0g5ZCv5YqoIC0tLS0tLS0tLS0KcmVzaXplQWxsKCk7CnJlc2V0R2FtZSgpOwp1cGRhdGVIVUQoKTsKc2hvd092ZXJsYXkoJ+S/hOe9l+aWr+aWueWdlycsCiAgJ+KGkCDihpIg56e75Yqo44CA4oaRIOaXi+i9rOOAgOKGkyDova/pmY3jgIDnqbrmoLwg56Gs6ZmNPGJyPkMg5pqC5a2Y44CAUCDmmoLlgZzjgIBSIOmHjeW8gDxicj7mr48gMTAg6KGM5Y2H5LiA57qn77yM6YCf5bqm6LaK5p2l6LaK5b+r77yBJywKICAn5byA5aeL5ri45oiPJyk7Ci8vIOmDqOWIhuWGheW1jOeOr+Wig+S8muaMgui1tyByQUbvvIznlKjlrprml7blmajlhZzlupXpqbHliqjkuLvlvqrnjq8KcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIHJhZihub3cpIHsKICBsYXN0UmFmVGljayA9IHBlcmZvcm1hbmNlLm5vdygpOwogIGZyYW1lKG5vdyk7CiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJhZik7Cn0pOwpzZXRJbnRlcnZhbCgoKSA9PiB7CiAgaWYgKHBlcmZvcm1hbmNlLm5vdygpIC0gbGFzdFJhZlRpY2sgPiAyMDApIGZyYW1lKHBlcmZvcm1hbmNlLm5vdygpKTsKfSwgMTYpOwoKfSkoKTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=

返回首页